This file is indexed.

/usr/include/deal.II/meshworker/vector_selector.h is in libdeal.ii-dev 8.1.0-6ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
// ---------------------------------------------------------------------
// $Id: vector_selector.h 30036 2013-07-18 16:55:32Z maier $
//
// Copyright (C) 2009 - 2013 by the deal.II authors
//
// This file is part of the deal.II library.
//
// The deal.II library is free software; you can use it, redistribute
// it, and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// The full text of the license can be found in the file LICENSE at
// the top level of the deal.II distribution.
//
// ---------------------------------------------------------------------

#ifndef __deal2__mesh_worker_vector_selector_h
#define __deal2__mesh_worker_vector_selector_h

#include <deal.II/base/named_data.h>
#include <deal.II/base/tensor.h>
#include <deal.II/base/smartpointer.h>
#include <deal.II/base/mg_level_object.h>

DEAL_II_NAMESPACE_OPEN

template<int,int> class FEValuesBase;

namespace MeshWorker
{

  /**
   * A class that selects vectors from a list of named vectors.
   *
   * Since the number of vectors in a NamedData object may grow with every
   * nesting of applications or loops, it is important to be able to
   * select those, which are actually used in computing residuals etc.
   * This class organizes the selection.
   *
   * It is used for instance in IntegrationWorker to
   * determine which values, derivatives or second derivatives are
   * actually computed.
   *
   * @ingroup MeshWorker
   * @author Guido Kanschat 2009
   */
  class VectorSelector :
    public Subscriptor
  {
  public:
    /**
     * Add a vector to the
     * selection of finite element
     * functions. The arguments are
     * the name of the vector and
     * indicators, which
     * information is to be
     * extracted from the
     * vector. The name refers to
     * an entry in a NamedData
     * object, which will be
     * identified by initialize().
     * The three bool parameters
     * indicate, whether values,
     * greadients and Hessians of
     * the finite element function
     * are to be computed on each
     * cell or face.
     */
    void add(const std::string &name,
             const bool values = true,
             const bool gradients = false,
             const bool hessians = false);

    /**
     * Does the same as the function
     * above but it is possible to
     * select a block of the global
     * vector.
     */
//      void add(const std::string& name,
//               const unsigned int selected_block,
//             bool values = true,
//             bool gradients = false,
//             bool hessians = false);

    /**
     * Initialize the selection
     * field with a data
     * vector. While add() only
     * enters the names of vectors,
     * which will be used in the integration
     * loop over cells and faces,
     * this function links the
     * names to actual vectos in a
     * NamedData object.
     *
     * @note This function caches
     * the index associated with a
     * name. Therefore, it must be
     * called every time after the
     * NamedData object has changed.
     */
    template <class DATA>
    void initialize(const NamedData<DATA> &);

    /**
     * Check whether any vector is selected.
     */
    bool empty () const;

    /**
     * Returns true if values are
     * selected for any vector.
     */
    bool has_values () const;

    /**
     * Returns true if gradients are
     * selected for any vector.
     */
    bool has_gradients () const;

    /**
     * Returns true if hessians are
     * selected for any vector.
     */
    bool has_hessians () const;

    /**
     * Number of vectors for values
     */
    unsigned int n_values () const;

    /**
     * Number of vectors for gradients
     */
    unsigned int n_gradients () const;

    /**
     * Number of vectors for Hessians
     */
    unsigned int n_hessians () const;

    /**
     * The vector index for the ith value
     */
    unsigned int value_index (const unsigned int i) const;

    /**
     * The vector index for the ith gradient
     */
    unsigned int gradient_index (const unsigned int i) const;

    /**
     * The vector index for the ith Hessian
     */
    unsigned int hessian_index (const unsigned int i) const;

    /**
     * Print the contents of the
     * selection to the stream.
     */
    template <class STREAM, typename DATA>
    void print (STREAM &s, const NamedData<DATA> &v) const;

    /**
     * Print the number of selections to the stream.
     */
    template <class STREAM>
    void print (STREAM &s) const;

    /**
     * The memory used by this object.
     */
    std::size_t memory_consumption () const;

  protected:
    /**
     * Selection of the vectors
     * used to compute values.
     */
    NamedSelection value_selection;

    /**
     * Selection of the vectors
     * used to compute gradients.
     */
    NamedSelection gradient_selection;

    /**
     * Selection of the vectors
     * used to compute hessians.
     */
    NamedSelection hessian_selection;
  };

  /**
   * Based on VectorSelector, this is the class used by IntegrationInfo
   * to compute values of source vectors in quadrature points.
   *
   * @ingroup MeshWorker
   * @author Guido Kanschat, 2009
   */
  template <int dim, int spacedim = dim>
  class VectorDataBase :
    public VectorSelector
  {
  public:
    /**
     * Constructor
     */
    VectorDataBase();

    /**
     * Constructor from a base
     * class object
     */
    VectorDataBase(const VectorSelector &);

    /**
     * Virtual, but empty
     * destructor.
     */
    virtual ~VectorDataBase();
    /**
     * The only function added to
     * VectorSelector is an
     * abstract virtual function
     * implemented in the derived
     * class template and called by
     * IntegrationInfo.
     *
     * Depending on the selections
     * made in our base class, this
     * fills the first three
     * arguments with the local
     * data of the finite element
     * functions. It is usually
     * called either for the whole
     * FESystem, or for each base
     * element separately.
     *
     * @param values is the vector
     * filled with the values of
     * the finite element function
     * in the quadrature points.
     *
     * @param gradients is the vector
     * filled with the derivatives of
     * the finite element function
     * in the quadrature points.
     *
     * @param hessians is the
     * vector filled with the
     * second derivatives of the
     * finite element function in
     * the quadrature points.
     *
     * @param fe is the
     * FEValuesBase object which is
     * used to compute the function
     * values. Its UpdateFlags must
     * have been set appropriately.
     *
     * @param index is the local
     * index vector. If @p fe
     * refers to base elements of
     * the system, this vector
     * should be sorted by block
     * and the arguments @p start
     * and @p size below specify
     * the subset of @p indices
     * used.
     *
     * @param component is the first
     * index in @p values, @p
     * gradients and @p hessians
     * entered in this function.
     *
     * @param n_comp is the number
     * of components to be filled.
     *
     * @param start is the first
     * index of this block in @p
     * indices, or zero if
     * no base elements are used.
     *
     * @param size is the number of
     * dofs per cell of the current
     * element or base element.
     */
    virtual void fill(
      std::vector<std::vector<std::vector<double> > > &values,
      std::vector<std::vector<std::vector<Tensor<1,dim> > > > &gradients,
      std::vector<std::vector<std::vector<Tensor<2,dim> > > > &hessians,
      const FEValuesBase<dim,spacedim> &fe,
      const std::vector<types::global_dof_index> &index,
      const unsigned int component,
      const unsigned int n_comp,
      const unsigned int start,
      const unsigned int size) const;

    /**
     * Fill the local data vector
     * from level vectors. Performs
     * exactly what the other
     * fill() does, but uses the
     * cell level to access a
     * single level out of a
     * hierarchy of level vectors,
     * instead of a global data
     * vector on the active cells.
     */
    virtual void mg_fill(
      std::vector<std::vector<std::vector<double> > > &values,
      std::vector<std::vector<std::vector<Tensor<1,dim> > > > &gradients,
      std::vector<std::vector<std::vector<Tensor<2,dim> > > > &hessians,
      const FEValuesBase<dim,spacedim> &fe,
      const unsigned int level,
      const std::vector<types::global_dof_index> &index,
      const unsigned int component,
      const unsigned int n_comp,
      const unsigned int start,
      const unsigned int size) const;

    /**
     * The memory used by this object.
     */
    std::size_t memory_consumption () const;
  };


  /**
   * Based on VectorSelector, this is the class that implements the
   * function VectorDataBase::fill() for a certain type of vector, using
   * NamedData to identify vectors by name.
   *
   * @ingroup MeshWorker
   * @author Guido Kanschat, 2009
   */
  template <class VECTOR, int dim, int spacedim = dim>
  class VectorData :
    public VectorDataBase<dim, spacedim>
  {
  public:
    /**
     * Constructor.
     */
    VectorData();
    /**
     * Constructor using a
     * prefilled VectorSelector
     */
    VectorData(const VectorSelector &);

    /**
     * Initialize with a NamedData
     * object and cache the indices
     * in the VectorSelector base
     * class.
     *
     * @note Make sure the
     * VectorSelector base class
     * was filled with reasonable
     * data before calling this
     * function.
     */
    void initialize(const NamedData<VECTOR *> &);

    /**
     * Initialize with a single
     * vector and cache the indices
     * in the VectorSelector base
     * class.
     *
     * @note Make sure the
     * VectorSelector base class
     * was filled with reasonable
     * data before calling this
     * function.
     */
    void initialize(const VECTOR *, const std::string &name);

    virtual void fill(
      std::vector<std::vector<std::vector<double> > > &values,
      std::vector<std::vector<std::vector<Tensor<1,dim> > > > &gradients,
      std::vector<std::vector<std::vector<Tensor<2,dim> > > > &hessians,
      const FEValuesBase<dim,spacedim> &fe,
      const std::vector<types::global_dof_index> &index,
      const unsigned int component,
      const unsigned int n_comp,
      const unsigned int start,
      const unsigned int size) const;

    /**
     * The memory used by this object.
     */
    std::size_t memory_consumption () const;

  private:
    NamedData<SmartPointer<const VECTOR,VectorData<VECTOR,dim,spacedim> > > data;
  };


  /**
   * Based on VectorSelector, this is the class that implements the
   * function VectorDataBase::fill() for a certain type of multilevel vectors, using
   * NamedData to identify vectors by name.
   *
   * @ingroup MeshWorker
   * @author Guido Kanschat, 2010
   */
  template <class VECTOR, int dim, int spacedim = dim>
  class MGVectorData :
    public VectorDataBase<dim, spacedim>
  {
  public:
    /**
     * Constructor.
     */
    MGVectorData();
    /**
     * Constructor using a
     * prefilled VectorSelector
     */
    MGVectorData(const VectorSelector &);

    /**
     * Initialize with a NamedData
     * object and cache the indices
     * in the VectorSelector base
     * class.
     *
     * @note Make sure the
     * VectorSelector base class
     * was filled with reasonable
     * data before calling this
     * function.
     */
    void initialize(const NamedData<MGLevelObject<VECTOR>*> &);

    /**
     * Initialize with a single
     * vector and cache the indices
     * in the VectorSelector base
     * class.
     *
     * @note Make sure the
     * VectorSelector base class
     * was filled with reasonable
     * data before calling this
     * function.
     */
    void initialize(const MGLevelObject<VECTOR> *, const std::string &name);

    virtual void mg_fill(
      std::vector<std::vector<std::vector<double> > > &values,
      std::vector<std::vector<std::vector<Tensor<1,dim> > > > &gradients,
      std::vector<std::vector<std::vector<Tensor<2,dim> > > > &hessians,
      const FEValuesBase<dim,spacedim> &fe,
      const unsigned int level,
      const std::vector<types::global_dof_index> &index,
      const unsigned int component,
      const unsigned int n_comp,
      const unsigned int start,
      const unsigned int size) const;

    /**
     * The memory used by this object.
     */
    std::size_t memory_consumption () const;

  private:
    NamedData<SmartPointer<const MGLevelObject<VECTOR>,MGVectorData<VECTOR,dim,spacedim> > > data;
  };


//----------------------------------------------------------------------//

  inline void
  VectorSelector::add(const std::string &name,
                      const bool values,
                      const bool gradients,
                      const bool hessians)
  {
    if (values)
      value_selection.add(name);
    if (gradients)
      gradient_selection.add(name);
    if (hessians)
      hessian_selection.add(name);
  }


  //inline void
  //VectorSelector::add(const std::string& name,
  //   const unsigned int block,
  //   bool values, bool gradients, bool hessians)
  //{
  //  if (values) value_selection.add(name, block);
  //  if (gradients) gradient_selection.add(name, block);
  //  if (hessians) hessian_selection.add(name, block);
  //}


  template <typename DATA>
  inline void
  VectorSelector::initialize(const NamedData<DATA> &src)
  {
    value_selection.initialize(src);
    gradient_selection.initialize(src);
    hessian_selection.initialize(src);
  }

  inline bool
  VectorSelector::empty() const
  {
    return (value_selection.size() == 0 &&
            gradient_selection.size() == 0 &&
            hessian_selection.size() == 0);
  }


  inline bool
  VectorSelector::has_values() const
  {
    return value_selection.size() != 0;
  }


  inline bool
  VectorSelector::has_gradients() const
  {
    return gradient_selection.size() != 0;
  }


  inline bool
  VectorSelector::has_hessians() const
  {
    return hessian_selection.size() != 0;
  }


  inline unsigned int
  VectorSelector::n_values() const
  {
    return value_selection.size();
  }


  inline unsigned int
  VectorSelector::n_gradients() const
  {
    return gradient_selection.size();
  }


  inline unsigned int
  VectorSelector::n_hessians() const
  {
    return hessian_selection.size();
  }


  inline unsigned int
  VectorSelector::value_index(const unsigned int i) const
  {
    return value_selection(i);
  }


  inline unsigned int
  VectorSelector::gradient_index(const unsigned int i) const
  {
    return gradient_selection(i);
  }


  inline unsigned int
  VectorSelector::hessian_index(const unsigned int i) const
  {
    return hessian_selection(i);
  }


  template <class STREAM>
  inline void
  VectorSelector::print(STREAM &s) const
  {
    s << "values: " << n_values()
      << " gradients: " << n_gradients()
      << " hessians: " << n_hessians()
      << std::endl;
  }


  template <class STREAM, typename DATA>
  inline void
  VectorSelector::print(STREAM &s, const NamedData<DATA> &v) const
  {
    s << "values:   ";
    for (unsigned int i=0; i<n_values(); ++i)
      s << " '" << v.name(value_selection(i)) << '\'';
    s << std::endl << "gradients:";
    for (unsigned int i=0; i<n_gradients(); ++i)
      s << " '" << v.name(gradient_selection(i)) << '\'';
    s << std::endl << "hessians: ";
    for (unsigned int i=0; i<n_hessians(); ++i)
      s << " '" << v.name(hessian_selection(i)) << '\'';
    s << std::endl;
  }


  inline
  std::size_t
  VectorSelector::memory_consumption () const
  {
    return sizeof(*this);
  }
}


DEAL_II_NAMESPACE_CLOSE

#endif