DUNE-FEM (unstable)

adaptiveleafindexset.hh
1 #ifndef DUNE_FEM_ADAPTIVELEAFINDEXSET_HH
2 #define DUNE_FEM_ADAPTIVELEAFINDEXSET_HH
3 
4 #include <cassert>
5 #include <cstddef>
6 
7 #include <algorithm>
8 #include <string>
9 #include <vector>
10 #include <memory>
11 #include <type_traits>
12 
13 #include <dune/fem/common/forloop.hh>
14 
15 #include <dune/fem/gridpart/codimindexset.hh>
16 #include <dune/fem/gridpart/common/gridpart.hh>
17 #include <dune/fem/gridpart/common/persistentindexset.hh>
18 #include <dune/fem/io/file/iointerface.hh>
19 #include <dune/fem/version.hh>
20 
21 namespace Dune
22 {
23 
24  namespace Fem
25  {
26 
27  // Internal forward declations
28  // ---------------------------
29 
30  template < class GridPartImp >
31  class AdaptiveLeafIndexSet;
32  template < class GridPartImp >
33  class IntersectionAdaptiveLeafIndexSet;
34  template < class GridPartImp >
35  class DGAdaptiveLeafIndexSet;
36 
37 
38 
39 
41  //
42  // --AdaptiveIndexSetBaseTraits
43  //
45 
46  template< class GridPart, class IndexSet >
47  class AdaptiveIndexSetBaseTraits
48  {
49  public:
50  // index set type derived from AdaptiveIndexSetBase
51  typedef IndexSet IndexSetType;
52 
53  // grid part type
54  typedef GridPart GridPartType;
55  // grid type
56  typedef typename GridPartType :: GridType GridType;
57 
58  // grid (part) dimension
59  static const int dimension = GridPartType :: dimension;
60 
61  template< int codim >
62  struct Codim
63  {
64  // entity type
65  typedef typename GridPartType :: template Codim< codim > :: EntityType Entity;
66  };
67 
68  // type of codim index set
69  typedef CodimIndexSet< GridType > CodimIndexSetType;
70  // index type used
71  typedef typename CodimIndexSetType :: IndexType IndexType;
72 
73  // container of geometry types
74  typedef std::vector< GeometryType > Types;
75  };
76 
77 
78 
80  //
81  // --AdaptiveIndexSetBase
82  //
84 
96  template <class TraitsImp >
98  : public PersistentAdaptiveIndexSet< TraitsImp >
99  {
101  typedef PersistentAdaptiveIndexSet< TraitsImp > BaseType;
102 
103  protected:
104  typedef typename TraitsImp :: GridPartType GridPartType;
105  typedef typename GridPartType :: GridType GridType;
106 
107  typedef typename TraitsImp :: CodimIndexSetType CodimIndexSetType ;
108 
109  typedef typename GridType::template Codim< 0 >::Entity GridElementType;
110 
111  public:
113  static const int dimension = BaseType::dimension;
114 
116  static const int numCodimensions = TraitsImp :: numCodimensions ;
117 
119  static const int intersectionCodimension = TraitsImp :: intersectionCodimension ;
120 
123 
125  typedef typename BaseType :: IndexType IndexType;
126 
128  typedef typename BaseType :: Types Types;
129 
131  typedef typename BaseType :: template Codim< 0 > :: Entity ElementType;
132 
134  typedef typename GridPartType :: IntersectionIteratorType IntersectionIteratorType;
135 
137  typedef typename GridPartType :: IntersectionType IntersectionType;
138 
139 
140  private:
141 
142  template< int codim , bool gridHasCodim >
143  struct CountElementsBase
144  {
145  static void apply ( const ThisType &indexSet, const GeometryType &type, IndexType& count )
146  {
147  if( type.dim() == dimension - codim )
148  count = indexSet.template countElements< codim >( type, std::integral_constant<bool,true>() );
149  }
150  };
151 
152  template< int codim >
153  struct CountElementsBase< codim, false >
154  {
155  static void apply ( const ThisType &indexSet, const GeometryType &type, IndexType& count )
156  {
157  if( type.dim() == dimension - codim )
158  count = indexSet.template countElements< codim >( type, std::integral_constant<bool,false>() );
159  }
160  };
161 
162  template< int codim >
163  struct CountElements // TODO: hasEntity should be replaced by hasEntityIterator here
164  : public CountElementsBase< codim, Dune::Fem::GridPartCapabilities::hasEntity< GridPartType, codim > :: v >
165  {
166  };
167 
168 
169  template< int codim >
170  struct InsertSubEntities
171  {
172  static void apply ( const ThisType &indexSet, const GridElementType &element )
173  {
174  // if codimension is not available return
175  if( ! indexSet.codimAvailable( codim ) ) return ;
176 
177  // if codimension is not used return
178  if( !indexSet.codimUsed( codim ) ) return;
179 
180  CodimIndexSetType &codimSet = indexSet.codimLeafSet( codim );
181 
182  const int count = element.subEntities( codim );
183  for( int i = 0; i < count; ++i )
184  {
185  codimSet.insertSubEntity( element, i );
186  }
187  }
188  };
189 
190  template< int codim , bool gridHasCodim >
191  struct InsertGhostSubEntitiesBase
192  {
193  static void apply ( ThisType &indexSet, const GridElementType &element,
194  const bool skipGhosts )
195  {
196  // if codimension is not available return
197  if( ! indexSet.codimAvailable( codim ) ) return ;
198 
199  // if codimension is not used return
200  if( !indexSet.codimUsed( codim ) ) return;
201 
202  CodimIndexSetType &codimSet = indexSet.codimLeafSet( codim );
203 
204  for( unsigned int i = 0; i < element.subEntities( codim ); ++i )
205  {
206  if( !skipGhosts || (element.partitionType() != GhostEntity) )
207  codimSet.insertGhost( element.template subEntity< codim >( i ) );
208  }
209  }
210  };
211 
212  template< int codim >
213  struct InsertGhostSubEntitiesBase< codim, false >
214  {
215  static void apply ( ThisType &indexSet, const GridElementType &element,
216  const bool skipGhosts )
217  {}
218  };
219 
220  template< int codim >
221  struct InsertGhostSubEntities
222  : public InsertGhostSubEntitiesBase< codim, Dune::Capabilities::hasEntity < GridType, codim > :: v >
223  {
224  };
225 
226  template< int codim , bool gridHasCodim >
227  struct CallSetUpCodimSetBase
228  {
229  static void apply ( const int cd, const ThisType &indexSet )
230  {
231  // if codimension is not available return
232  if( ! indexSet.codimAvailable( codim ) ) return ;
233 
234  if( cd == codim && ! indexSet.codimUsed( cd ) )
235  indexSet.template setupCodimSet< codim >(std::integral_constant<bool,true>());
236  }
237  };
238 
239  template< int codim >
240  struct CallSetUpCodimSetBase< codim, false >
241  {
242  static void apply ( const int cd, const ThisType &indexSet )
243  {
244  if( cd == codim && ! indexSet.codimUsed( cd ) )
245  indexSet.template setupCodimSet< codim >(std::integral_constant<bool,false>());
246  }
247  };
248 
249  template< int codim >
250  struct CallSetUpCodimSet
251  : public CallSetUpCodimSetBase< codim, Dune::Capabilities::hasEntity < GridType, codim > :: v >
252  {
253  };
254 
255 
257  // subentity extractor
259 
260  template < int codim, bool gridHasCodim >
261  struct GetSubEntityBase
262  {
263  typedef typename GridPartType :: template Codim< codim > :: EntityType Entity;
264  static Entity subEntity( const ElementType& element, const int subEn )
265  {
266  return element.template subEntity< codim > ( subEn );
267  }
268  };
269 
270  template < int codim >
271  struct GetSubEntityBase< codim, false >
272  {
273  typedef typename GridPartType :: template Codim< 0 > :: EntityType Entity;
274  static Entity subEntity( const ElementType& element, const int subEn )
275  {
276  DUNE_THROW(NotImplemented,"stupid grid without entities of codim 1 used");
277  }
278  };
279 
280  struct GetFaceEntity
281  : public GetSubEntityBase< 1, Dune::Capabilities::hasEntity < GridType, 1 > :: v >
282  {
283  };
284 
286  typedef typename GetFaceEntity :: Entity FaceType;
287 
289  enum { CartesianNonAdaptiveGrid = Dune::Capabilities::isCartesian<GridType>::v &&
290  ! Capabilities::isLocallyAdaptive<GridType>::v };
291 
292  // my type, to be revised
293  enum { myType = ( numCodimensions == 1 ) ? ( (CartesianNonAdaptiveGrid) ? -1 : 665 ) : 6 };
294 
295  // max num of codimension (to avoid compiler warnings)
296  enum { maxNumCodimension = ((dimension + 1) > numCodimensions) ? dimension + 2 : numCodimensions+1 };
297 
299  static const PartitionIteratorType pitype = GridPartType :: indexSetPartitionType ;
300 
301  // grid part (for iterator access, no index set)
302  const GridPartType& gridPart_;
303 
304  // pointer storage in case index set is created by passing a grid
305  std::unique_ptr< const GridPartType > gridPartPtr_;
306 
307  // Codimension leaf index sets
308  mutable std::unique_ptr< CodimIndexSetType > codimLeafSet_[ numCodimensions ];
309 
310  // vector holding geometry types
311  std::vector< std::vector< GeometryType > > geomTypes_;
312 
313  // actual sequence number
314  int sequence_;
315 
317  mutable bool compressed_;
318 
319  protected:
320  using BaseType::grid_;
321  using BaseType::dofManager_;
322 
323  // return true if codim is supported
324  bool codimAvailable( const int codim ) const
325  {
326  return (codim < numCodimensions && codim >= 0);
327  }
328 
329  // return true if indices for this codim exist
330  bool codimUsed( const int codim ) const
331  {
332  return codimAvailable( codim ) && codimLeafSet_[ codim ] ;
333  }
334 
335  CodimIndexSetType& codimLeafSet( const int codim ) const
336  {
337  assert( codimUsed( codim ) );
338  return *codimLeafSet_[ codim ];
339  }
340 
341  public:
342  void requestCodimensions ( const std::vector< int >& codimensions ) const
343  {
344  // enable requested codimensions and rebuild index set
345  for( const auto& codim : codimensions )
346  {
347  // start loop from 1 since codim 0 is always created
348  Fem::ForLoop< CallSetUpCodimSet, 1, dimension >::apply( codim, *this );
349  }
350  }
351 
353  AdaptiveIndexSetBase ( const GridType* grid )
354  : AdaptiveIndexSetBase( *(new GridPartType( const_cast< GridType& > (*grid), typename GridPartType::NoIndexSetType() )) )
355  {
356  // store pointer to avoid memory leaks
357  gridPartPtr_.reset( &gridPart_ );
358  }
359 
361  AdaptiveIndexSetBase ( const GridPartType& gridPart )
362  : BaseType( gridPart.grid() )
363  , gridPart_( gridPart )
364  , sequence_( dofManager_.sequence() )
365  , compressed_(true) // at start the set is compressed
366  {
367  // codim 0 is used by default
368  codimLeafSet_[ 0 ].reset( new CodimIndexSetType( grid_, 0 ) );
369 
370  // set the codim of each Codim Set.
371  for(int codim = 0; codim < numCodimensions; ++codim )
372  {
373  if( codim == intersectionCodimension )
374  codimLeafSet_[ codim ].reset( new CodimIndexSetType( grid_, 1 ) );
375  }
376 
377  {
378  // get level-0 view, this is already used in GridPtr (DFG parser)
379  auto macroView = grid_.levelGridView( 0 );
380  setupGeomTypes( macroView.indexSet() );
381  }
382 
383  // build index set
384  setupIndexSet();
385  }
386 
387  protected:
388  template <class MacroIndexSet>
389  void setupGeomTypes(const MacroIndexSet& indexSet)
390  {
392  // resize vector of geometry types
393  geomTypes_.resize( dimension+1 );
394  for(int codim=0; codim <= dimension; ++codim )
395  {
396  const int size = indexSet.types( codim ).size();
397  // copy geometry types
398  geomTypes_[ codim ].resize( size );
399  std::copy_n( indexSet.types( codim ).begin(), size, geomTypes_[ codim ].begin() );
400  }
401  }
402 
403  public:
405  int type () const
406  {
407  return myType;
408  }
409 
411  virtual std::string name () const
412  {
413  return "AdaptiveIndexSetBase";
414  }
415 
416  //****************************************************************
417  //
418  // INTERFACE METHODS for DUNE INDEX SETS
419  // --size
420  //
421  //****************************************************************
424  {
425  const int codim = dimension - type.dim();
426 
427  // true if only one geometry type is present
428  const bool onlySingleGeometryType = hasSingleGeometryType || ( geomTypes( codim ).size() == 1 ) ;
429  // use size of codim index set if possible
430  if( codimAvailable( codim ) && onlySingleGeometryType )
431  {
432  if( codimUsed( codim ) )
433  return type == geomTypes( codim )[ 0 ] ? codimLeafSet( codim ).size() : 0;
434  }
435 
436  // count entities for given geometry type
437  IndexType count = 0 ;
438  Fem::ForLoop< CountElements, 0, dimension > :: apply( *this, type, count );
439  return count;
440  }
441 
443  IndexType size ( int codim ) const
444  {
445  assert( codim < numCodimensions );
447  {
448  return codimLeafSet( codim ).size();
449  }
450 
451  // count size for all geometry types
452  IndexType count = 0 ;
453  const size_t types = geomTypes( codim ).size();
454  for( size_t i=0; i<types; ++i )
455  {
456  count += size( geomTypes( codim )[ i ] );
457  }
458  return count ;
459  }
460 
462  const std::vector <GeometryType> & geomTypes (const int codim) const
463  {
464  assert( codim >= 0 && codim < int(geomTypes_.size()) );
465  return geomTypes_[ codim ];
466  }
467 
469  Types types( const int codim ) const
470  {
471  return geomTypes( codim );
472  }
473 
475  template <class EntityType>
476  bool contains (const EntityType & en) const
477  {
478  enum { codim = EntityType::codimension };
479  if( codimAvailable( codim ) )
480  {
481  assert( codimUsed( codim ) );
482  return codimLeafSet( codim ).exists( gridEntity( en ) );
483  }
484  else
485  return false;
486  }
487 
488  //****************************************************************
489  //
490  // METHODS for Adaptation with DofManger
491  //
492  //****************************************************************
493 
495  void insertEntity( const GridElementType &entity )
496  {
497  // here we have to add the support of higher codims
498  resizeVectors();
499  insertIndex( entity );
500  }
501 
503  void removeEntity( const GridElementType &entity )
504  {
505  removeIndex( entity );
506  }
507 
509  void resizeVectors ();
510 
512  void resize ()
513  {
514  resizeVectors();
515 
516  #if HAVE_MPI
517  if( CartesianNonAdaptiveGrid &&
518  grid_.comm().size() > 1 )
519  {
520  // only done for structured grids
521  clear();
522 
523  // this should only be the case of YaspGrid
524  markAllBelowOld<Interior_Partition>();
525  if( pitype > Interior_Partition )
526  {
527  markAllBelowOld< pitype >();
528  }
529  compressed_ = true;
530  }
531  else
532  #endif
533  {
534  // use a hierarchic walk to mark new elements
535  markAllBelowOld< pitype > ();
536 
537  #if HAVE_MPI
538  // only if ghost are really supported
539  if( pitype == All_Partition )
540  {
541  if( grid_.comm().size() > 1 )
542  {
543  // make sure that also ghosts have indices
544  markAllUsed<Ghost_Partition>();
545  }
546  }
547  #endif
548  }
549  }
550 
552  bool compress ();
553 
554  public:
556  // index methods
557  // --index
560  template< class Entity >
561  IndexType index ( const Entity &entity ) const
562  {
563  return index< Entity :: codimension >( entity );
564  }
565 
567  template< int codim >
568  IndexType
569  index ( const typename GridPartType::template Codim< codim >::EntityType &entity ) const
570  {
571  if( codimAvailable( codim ) )
572  {
573  if( (codim != 0) && ! codimUsed( codim ) )
574  setupCodimSet< codim >(std::integral_constant<bool,Dune::Capabilities::hasEntity < GridType, codim > :: v>());
575 
576  return codimLeafSet( codim ).index( gridEntity( entity ) );
577  }
578  else
579  {
580  DUNE_THROW( NotImplemented, (name() + " does not support indices for codim = ") << codim );
581  return -1;
582  }
583  }
584 
585  /* \brief return index for intersection */
586  IndexType index ( const IntersectionType &intersection ) const
587  {
588  enum { codim = intersectionCodimension };
589  if( codimAvailable( codim ) )
590  {
591  // this in only done on first call
592  setupIntersections();
593 
594  // get corresponding face entity pointer
595  FaceType face = getIntersectionFace( intersection );
596 
597  return codimLeafSet( codim ).index( gridEntity( face ) );
598  }
599  else
600  {
601  DUNE_THROW( NotImplemented, (name() + " does not support indices for intersections, intersectionCodim = ") << codim );
602  return -1;
603  }
604  }
605 
606  /* \brief return index for sub entity of given intersection and subEntityNumber */
607  IndexType
608  subIndex ( const IntersectionType &intersection,
609  int subNumber, unsigned int codim ) const
610  {
611  DUNE_THROW( NotImplemented, (name() + " does not support subIndices for intersections, intersectionCodim = ") << codim );
612  return -1;
613  }
614 
616  template< class Entity >
617  IndexType subIndex ( const Entity &entity, int subNumber, unsigned int codim ) const
618  {
619  return subIndex< Entity::codimension >( entity, subNumber, codim );
620  }
621 
623  template< int cd >
624  IndexType subIndex ( const typename GridPartType::template Codim< cd >::EntityType &entity,
625  int subNumber, unsigned int codim ) const
626  {
627  assert( (int( codim ) >= cd) && (int( codim ) <= dimension) );
628  if( !codimAvailable( codim ) )
629  DUNE_THROW( NotImplemented, (name() + " does not support indices for codim = ") << codim );
630 
631  if( (codim != 0) && ! codimUsed( codim ) )
632  {
633  Fem::ForLoop< CallSetUpCodimSet, 1, dimension >::apply( codim, *this );
634  }
635 
636  const CodimIndexSetType &codimSet = codimLeafSet( codim );
637  const IndexType idx = codimSet.subIndex( gridEntity( entity ), subNumber );
638  assert( (idx >= 0) && (idx < IndexType( codimSet.size() )) );
639  return idx;
640  }
641 
643  //
644  // DoF adjustment methods, needed by AdaptiveDofMapper interface
645  //
647 
650  {
651  const int codim = dimension - type.dim();
652  // this index set works only with single geometry types adaptively
653  assert( hasSingleGeometryType || geomTypes( codim ).size() == 1 );
654 
655  // if mapper is asking for types that are
656  // not in the index set then 0 should be returned
657  if( geomTypes( codim )[ 0 ] != type )
658  {
659  return 0;
660  }
661 
662  return numberOfHoles( codim );
663  }
664 
666  IndexType numberOfHoles ( const int codim ) const
667  {
668  if( codimAvailable( codim ) && codimUsed( codim ) )
669  {
670  return codimLeafSet( codim ).numberOfHoles();
671  }
672  else
673  return 0;
674  }
675 
678  {
679  const int codim = dimension - type.dim();
680  assert( hasSingleGeometryType || geomTypes( codim ).size() == 1 );
681  return oldIndex( hole, codim );
682  }
683 
685  IndexType oldIndex (const IndexType hole, const int codim ) const
686  {
687  if( codimAvailable( codim ) )
688  {
689  assert( codimUsed( codim ) );
690  return codimLeafSet( codim ).oldIndex( hole );
691  }
692  else
693  {
694  DUNE_THROW( NotImplemented, (name() + " does not support indices for codim = ") << codim );
695  return IndexType(-1);
696  }
697  }
698 
701  {
702  const int codim = dimension - type.dim();
703  assert( hasSingleGeometryType || geomTypes( codim ).size() == 1 );
704  return newIndex( hole, codim );
705  }
706 
708  IndexType newIndex (const IndexType hole , const int codim ) const
709  {
710  if( codimAvailable( codim ) )
711  {
712  assert( codimUsed( codim ) );
713  return codimLeafSet( codim ).newIndex( hole );
714  }
715  else
716  {
717  DUNE_THROW( NotImplemented, (name() + " does not support indices for codim = ") << codim );
718  return IndexType(-1);
719  }
720  }
721 
722  protected:
723  // Note: The following methods forward to Dune::Fem::CodimIndexSet, which
724  // expects a Dune::Grid as template argument; all arguments passed to
725  // members of Dune::Fem::CodimIndexSet must be compatible with the
726  // template grid type. If entities returned by the grid and the grid part
727  // respectively differ in type, Dune::Fem::AdaptiveLeafIndexSetBase will
728  // call the necessary operations from grid part entities to grid entites.
729 
730  // memorise index
731  void insertIndex ( const GridElementType &entity );
732 
733  // memorise indices for all intersections
734  void insertIntersections ( const GridElementType &entity ) const;
735 
736  // insert index temporarily
737  void insertTemporary ( const GridElementType &entity );
738 
739  // set indices to unsed so that they are cleaned on compress
740  void removeIndex ( const GridElementType &entity );
741 
742  // check whether entity can be inserted or not
743  void checkHierarchy ( const GridElementType &entity, bool wasNew );
744 
745  // mark indices that are still used (and give new indices to new elements)
746  template <PartitionIteratorType pt>
747  void markAllUsed ();
748 
750  void clear();
751 
753  void setupIndexSet ();
754 
755  // give all entities that lie below the old entities new numbers
756  // here we need the hierarchic iterator because for example for some
757  // grid more the one level of new elements can be created during adaption
758  // there for we start to give new number for all elements below the old
759  // element
760  template <PartitionIteratorType pt>
761  void markAllBelowOld ();
762 
763  // mark indices that are still used (and give new indices to new elements)
764  template< int codim >
765  void setupCodimSet (const std::integral_constant<bool,true> &hasEntities) const;
766  template< int codim >
767  void setupCodimSet (const std::integral_constant<bool,false> &hasEntities) const;
768 
769  // mark indices that are still used (and give new indices to new intersections)
770  void setupIntersections () const;
771 
772  // count elements by iterating over grid and compare
773  // entities of given codim with given type
774  template< int codim >
775  inline IndexType countElements ( GeometryType type, const std::integral_constant<bool,true> &hasEntities ) const;
776  template< int codim >
777  inline IndexType countElements ( GeometryType type, const std::integral_constant<bool,false> &hasEntities ) const;
778 
779  public:
781  template< class StreamTraits >
783 
785  template< class StreamTraits >
787 
788  protected:
789  FaceType getIntersectionFace( const IntersectionType& intersection ) const
790  {
791  ElementType inside = intersection.inside();
792  return getIntersectionFace( intersection, inside );
793  }
794 
795  FaceType getIntersectionFace( const IntersectionType& intersection,
796  const ElementType& inside ) const
797  {
798  if( ! intersection.conforming() && intersection.neighbor() )
799  {
800  ElementType outside = intersection.outside();
801  // only if outside is more refined then inside
802  if( inside.level() < outside.level() )
803  return GetFaceEntity :: subEntity( outside, intersection.indexInOutside() );
804  }
805 
806  // default: get subentity of inside
807  return GetFaceEntity :: subEntity( inside, intersection.indexInInside() );
808  }
809  };
810 
811  template< class TraitsImp >
812  inline void
814  {
815  codimLeafSet( 0 ).resize();
816 
817  // if more than one codimension is supported
818  if( numCodimensions > 1 )
819  {
820  for( int codim = 1; codim < numCodimensions; ++codim )
821  {
822  if( codimUsed( codim ) )
823  codimLeafSet( codim ).resize();
824  }
825  }
826  }
827 
828 
829  // --compress
830  template< class TraitsImp >
831  inline bool
833  {
834  // reset list of holes in any case
835  for( int codim = 0; codim < numCodimensions; ++codim )
836  {
837  if( codimUsed( codim ) )
838  codimLeafSet( codim ).clearHoles();
839  }
840 
841  if( compressed_ )
842  {
843  // if set already compress, do noting for serial runs
844  // in parallel runs check sequence number of dof manager
845  if( (grid_.comm().size() == 1) || (sequence_ == dofManager_.sequence()) )
846  return false;
847  }
848 
849  // prepare index sets for setup
850  for( int codim = 0; codim < numCodimensions; ++codim )
851  {
852  if( codimUsed( codim ) )
853  codimLeafSet( codim ).prepareCompress();
854  }
855 
856  // mark all indices still needed
857  setupIndexSet();
858 
859  // true if a least one index is moved
860  bool haveToCopy = codimLeafSet( 0 ).compress();
861  for( int codim = 1; codim < numCodimensions; ++codim )
862  {
863  if( codimUsed( codim ) )
864  haveToCopy |= codimLeafSet( codim ).compress();
865  }
866 
867  // now status is compressed
868  compressed_ = true;
869  // update sequence number
870  sequence_ = dofManager_.sequence();
871 
872  return haveToCopy;
873  }
874 
875 
876  template< class TraitsImp >
877  inline void
878  AdaptiveIndexSetBase< TraitsImp >::insertIndex ( const GridElementType &entity )
879  {
880 #if HAVE_MPI
881  // we need special treatment for ghosts
882  // ghosts should not be inlcuded in holes list
883  if( entity.partitionType() == GhostEntity )
884  {
885  codimLeafSet( 0 ).insertGhost( entity );
886  const bool skipGhosts = (pitype != All_Partition);
887  // only for index sets upporting more than one codim
888  if( numCodimensions > 1 )
889  Fem::ForLoop< InsertGhostSubEntities, 1, dimension >::apply( *this, entity, skipGhosts );
890  }
891  else
892 #endif // HAVE_MPI
893  {
894  codimLeafSet( 0 ).insert( entity );
895  // only for index sets supporting more than one codim
896  if( numCodimensions > 1 )
897  Fem::ForLoop< InsertSubEntities, 1, dimension >::apply( *this, entity );
898 
899  }
900 
901  assert( codimLeafSet( 0 ).exists( entity ) );
902 
903  // insert intersections if this is enabled
904  if( intersectionCodimension > 0 )
905  {
906  insertIntersections( entity );
907  }
908 
909  // now consecutivity is no longer guaranteed
910  compressed_ = false;
911  }
912 
913  template< class TraitsImp >
914  inline void
915  AdaptiveIndexSetBase< TraitsImp >::insertIntersections ( const GridElementType &gridElement ) const
916  {
917  codimLeafSet( intersectionCodimension ).resize();
918 
919  const ElementType &element = gridPart_.convert( gridElement );
920  const IntersectionIteratorType endiit = gridPart_.iend( element );
921  for( IntersectionIteratorType iit = gridPart_.ibegin( element );
922  iit != endiit ; ++ iit )
923  {
924  // get intersection
925  const IntersectionType& intersection = *iit ;
926 
927  // get correct face pointer
928  FaceType face = getIntersectionFace( intersection, element );
929 
930  // insert face into index set
931  codimLeafSet( intersectionCodimension ).insert( gridEntity( face ) );
932  }
933  }
934 
935  template< class TraitsImp >
936  inline void
937  AdaptiveIndexSetBase< TraitsImp >::insertTemporary( const GridElementType &entity )
938  {
939  insertIndex( entity );
940  codimLeafSet( 0 ).markForRemoval( entity );
941  }
942 
943  template< class TraitsImp >
944  inline void
945  AdaptiveIndexSetBase< TraitsImp >::removeIndex( const GridElementType &entity )
946  {
947  // remove entities (only mark them as unused)
948  codimLeafSet( 0 ).markForRemoval( entity );
949 
950  // don't remove higher codim indices (will be done on compression
951 
952  // now consecutivity is no longer guaranteed
953  compressed_ = false;
954  }
955 
956 
957  template< class TraitsImp >
958  inline void
959  AdaptiveIndexSetBase< TraitsImp >
960  ::checkHierarchy ( const GridElementType &entity, bool wasNew )
961  {
962  // for leaf entities, just insert the index
963  // this certainly the case for grids without hierarchy
964  if( entity.isLeaf() )
965  {
966  insertIndex( entity );
967  return;
968  }
969 
970  bool isNew = wasNew ;
971  typedef typename GridType::HierarchicIterator HierarchicIterator;
972 
973  if( isNew )
974  {
975  // this is a new entity, so insert it,
976  // but only temporarily because it's not a leaf entity
977  insertTemporary( entity );
978  }
979  else
980  {
981  // if we were a leaf entity, all children are new
982  isNew = codimLeafSet( 0 ).validIndex( entity );
983  }
984 
985  // entity has children and we need to go deeper
986  const int childLevel = entity.level() + 1;
987  const HierarchicIterator end = entity.hend( childLevel );
988  for( HierarchicIterator it = entity.hbegin( childLevel ); it != end; ++it )
989  checkHierarchy( *it, isNew );
990  }
991 
992 
993  template< class TraitsImp >
994  template< PartitionIteratorType pt >
995  inline void
996  AdaptiveIndexSetBase< TraitsImp >::markAllUsed ()
997  {
998  // make correct size of vectors
999  resizeVectors();
1000 
1001  // mark all indices as unused
1002  for( int codim = 0; codim < numCodimensions; ++codim )
1003  {
1004  if( codimUsed( codim ) )
1005  codimLeafSet( codim ).resetUsed();
1006  }
1007 
1008  typedef typename GridPartType
1009  ::template Codim< 0 > :: template Partition< pt > :: IteratorType Iterator;
1010 
1011  const Iterator end = gridPart_.template end< 0, pt >();
1012  for( Iterator it = gridPart_.template begin< 0, pt >(); it != end; ++it )
1013  insertIndex( gridEntity( *it ) );
1014  }
1015 
1016  template< class TraitsImp >
1017  inline void
1019  {
1020  // for structured grids clear all information
1021  // this in only done when setting up grids or after
1022  // read of parallel data on serial grids
1023  if( CartesianNonAdaptiveGrid )
1024  {
1025  // mark all indices as unused
1026  for( int codim = 0; codim < numCodimensions; ++codim )
1027  {
1028  if( codimUsed( codim ) )
1029  {
1030  // clear all information
1031  codimLeafSet( codim ).clear();
1032  }
1033  }
1034  }
1035  }
1036 
1037  template< class TraitsImp >
1038  inline void
1040  {
1041  // only done for structured grids
1042  clear();
1043 
1044 #if HAVE_MPI
1045  // for YaspGrid we need all interior indices first
1046  if( CartesianNonAdaptiveGrid &&
1047  grid_.comm().size() > 1 )
1048  {
1049  // we should only get here for YaspGrid
1050  markAllUsed<Interior_Partition> ();
1051  if( pitype > Interior_Partition )
1052  markAllUsed< pitype >();
1053  }
1054  else
1055 #endif
1056  {
1057  // give all entities that lie on the leaf level new numbers
1058  markAllUsed< pitype > ();
1059  }
1060  }
1061 
1062  template< class TraitsImp >
1063  template< PartitionIteratorType pt >
1064  inline void
1066  {
1067  // mark all indices as unused
1068  for( int codim = 0; codim < numCodimensions; ++codim )
1069  {
1070  if( codimUsed( codim ) )
1071  codimLeafSet( codim ).resetUsed();
1072  }
1073 
1074  // get macro iterator
1075  auto macroView = grid_.levelGridView( 0 );
1076 
1077  const auto macroend = macroView.template end< 0, pt >();
1078  for( auto macroit = macroView.template begin< 0, pt >();
1079  macroit != macroend; ++macroit )
1080  {
1081  checkHierarchy( *macroit, false );
1082  }
1083  }
1084 
1085 
1086  template< class TraitsImp >
1087  template< int codim >
1088  inline void
1089  AdaptiveIndexSetBase< TraitsImp >::setupCodimSet (const std::integral_constant<bool,true>&) const
1090  {
1091  // if codim is not available do nothing
1092  if( ! codimAvailable( codim ) ) return ;
1093 
1094  // create codimLeafSet if not existing
1095  if( ! codimLeafSet_[ codim ] )
1096  {
1097  codimLeafSet_[ codim ].reset( new CodimIndexSetType( grid_, codim ) );
1098  }
1099 
1100  // resize if necessary
1101  codimLeafSet( codim ).resize();
1102 
1103  // walk over grid parts entity set and insert entities
1104  typedef typename GridPartType
1105  ::template Codim< codim >::template Partition< pitype > :: IteratorType Iterator;
1106 
1107  const Iterator end = gridPart_.template end< codim, pitype >();
1108  for( Iterator it = gridPart_.template begin< codim, pitype >(); it != end; ++it )
1109  codimLeafSet( codim ).insert( gridEntity( *it ) );
1110  }
1111 
1112  template< class TraitsImp >
1113  template< int codim >
1114  inline void
1115  AdaptiveIndexSetBase< TraitsImp >::setupCodimSet (const std::integral_constant<bool,false>&) const
1116  {
1117  // if codim is not available do nothing
1118  if( ! codimAvailable( codim ) ) return ;
1119 
1120  // create codimLeafSet if not existing
1121  if( ! codimLeafSet_[ codim ] )
1122  {
1123  codimLeafSet_[ codim ].reset( new CodimIndexSetType( grid_, codim ) );
1124  }
1125 
1126  // resize if necessary
1127  codimLeafSet( codim ).resize();
1128 
1129  typedef typename GridPartType
1130  ::template Codim< 0 >::template Partition< pitype > :: IteratorType Iterator;
1131 
1132  const Iterator end = gridPart_.template end< 0, pitype >();
1133  for( Iterator it = gridPart_.template begin< 0, pitype >(); it != end; ++it )
1134  {
1135  const ElementType& element = *it ;
1136  const GridElementType &gridElement = gridEntity( element );
1137  InsertSubEntities< codim >::apply( *this, gridElement );
1138  }
1139  }
1140 
1141 
1142  template< class TraitsImp >
1143  inline void
1144  AdaptiveIndexSetBase< TraitsImp >::setupIntersections() const
1145  {
1146  // if intersectionCodimension < 0 then this feature is disabled
1147  if( intersectionCodimension < 0 ) return ;
1148 
1149  // do nothing if insections are already available
1150  if( codimUsed( intersectionCodimension ) ) return ;
1151 
1152  // resize if necessary
1153  codimLeafSet( intersectionCodimension ).resize();
1154 
1155  // walk over grid parts entity set and insert entities
1156  typedef typename GridPartType
1157  ::template Codim< 0 >::template Partition< pitype > :: IteratorType Iterator;
1158 
1159  const Iterator end = gridPart_.template end< 0, pitype >();
1160  for( Iterator it = gridPart_.template begin< 0, pitype >(); it != end; ++it )
1161  {
1162  // insert all intersections of this entity
1163  insertIntersections( gridEntity( *it ) );
1164  }
1165  }
1166 
1167  template< class TraitsImp >
1168  template< int codim >
1170  AdaptiveIndexSetBase< TraitsImp >::countElements ( GeometryType type, const std::integral_constant<bool,true>& ) const
1171  {
1172  typedef typename GridPartType
1173  ::template Codim< codim > :: template Partition< pitype > :: IteratorType Iterator;
1174 
1175  const Iterator begin = gridPart_.template begin< codim, pitype >();
1176  const Iterator end = gridPart_.template end< codim, pitype >();
1177  IndexType count = 0;
1178  for( Iterator it = begin; it != end; ++it )
1179  {
1180  if( it->type() == type )
1181  {
1182  ++count;
1183  }
1184  }
1185  return count;
1186  }
1187 
1188  template< class TraitsImp >
1189  template< int codim >
1191  AdaptiveIndexSetBase< TraitsImp >::countElements ( GeometryType type, const std::integral_constant<bool,false>& ) const
1192  {
1193  if( ! codimLeafSet_[ codim ] )
1194  return 0;
1195 
1196  // make sure codimension is enabled
1197  assert( codimAvailable( codim ) );
1198 
1199  // resize if necessary
1200  codimLeafSet( codim ).resize();
1201 
1202  typedef typename GridPartType
1203  ::template Codim< 0 >::template Partition< pitype > :: IteratorType Iterator;
1204 
1205  typedef typename GridPartType::ctype ctype;
1206 
1207  const Iterator end = gridPart_.template end< 0, pitype >();
1208  IndexType count = 0;
1209  for( Iterator it = gridPart_.template begin< 0, pitype >(); it != end; ++it )
1210  {
1211  const ElementType& element = *it ;
1212  const GridElementType &gridElement = gridEntity( element );
1213  const int subEntities = gridElement.subEntities( codim );
1214  for (int i=0; i < subEntities; ++i)
1215  {
1216  if (! codimLeafSet( codim ).exists( gridElement, i) )
1217  {
1218  codimLeafSet( codim ).insertSubEntity( gridElement,i );
1220  general( gridElement.type() ).type( i, codim ) == type )
1221  {
1222  ++count;
1223  }
1224  }
1225  }
1226  }
1227 
1228  return count;
1229  }
1230 
1231 
1232  template< class TraitsImp >
1233  template< class StreamTraits >
1236  {
1237  // write name for identification
1238  const std::string myname( name() );
1239  out << myname;
1240 
1241  // write number of codimensions
1242  out << numCodimensions ;
1243 
1244  // write whether codim is used
1245  for( int i = 0; i < numCodimensions; ++i )
1246  out << codimUsed( i );
1247 
1248  // write all sets
1249  for( int i = 0; i < numCodimensions; ++i )
1250  {
1251  if( codimUsed( i ) )
1252  codimLeafSet( i ).write( out );
1253  }
1254 
1255  // if we got until here writing was sucessful
1256  return true;
1257  }
1258 
1259 
1260  template< class TraitsImp >
1261  template< class StreamTraits >
1264  {
1265  {
1266  // read name and check compatibility
1267  std::string storedName;
1268  in >> storedName;
1269 
1270  std::string myname( name() );
1271 
1272  if( myname != storedName )
1273  {
1274  size_t length = std::min( myname.size(), storedName.size() );
1275  // only print the first character of whatever storedName is
1276  std::string found = storedName.substr(0, length-1 );
1278  "AdaptiveIndexSetBase::read: got " << found
1279  << " (expected " << myname << ")." );
1280  }
1281  }
1282 
1283  // read number of codimensions
1284  int numCodim;
1285  in >> numCodim;
1286 
1287  // make sure everything is correct
1288  // assert( numCodim == numCodimensions );
1289  if( numCodim != numCodimensions )
1290  DUNE_THROW(InvalidStateException,"AdaptiveIndexSetBase::read: got wrong number of codimensions" << numCodim << " instead of " << numCodimensions);
1291 
1292  // read codim used
1293  for( int i = 0; i < numCodimensions; ++i )
1294  {
1295  bool codimInUse = false ;
1296  in >> codimInUse;
1297  if( codimInUse && ! codimLeafSet_[ i ] )
1298  {
1299  codimLeafSet_[ i ].reset( new CodimIndexSetType( grid_, (i == intersectionCodimension ) ? 1 : i ) );
1300  }
1301  }
1302 
1303  for( int i = 0; i < numCodimensions; ++i )
1304  {
1305  if( codimUsed( i ) )
1306  codimLeafSet( i ).read( in );
1307  }
1308 
1309  // in parallel runs we have to compress here
1310  if( grid_.comm().size() > 1 )
1311  compressed_ = false;
1312 
1313  // if we got until here reading was sucessful
1314  return true;
1315  }
1316 
1317 
1318 
1320  //
1321  // --AdaptiveLeafIndexSet
1322  //
1324 
1325  template< class GridPartImp >
1326  struct AdaptiveLeafIndexSetTraits
1327  : public AdaptiveIndexSetBaseTraits< GridPartImp, AdaptiveLeafIndexSet< GridPartImp > >
1328  {
1329  // number of codimensions
1330  enum { numCodimensions = GridPartImp :: dimension + 1 };
1331  // first comdimension that is supported (not yet supported)
1332  enum { startingCodimension = 0 };
1333  // intersection codimensions (this is usually dimension + 1 )
1334  enum { intersectionCodimension = -1 };
1335  };
1336 
1348  template < class GridPartImp >
1350  : public AdaptiveIndexSetBase< AdaptiveLeafIndexSetTraits< GridPartImp > >
1351  {
1353  typedef AdaptiveLeafIndexSetTraits< GridPartImp > Traits;
1354 
1355  public:
1356  typedef typename BaseType :: GridType GridType;
1357  typedef typename BaseType :: GridPartType GridPartType;
1358 
1360  AdaptiveLeafIndexSet (const GridType* grid)
1361  : BaseType(grid)
1362  {}
1363 
1365  AdaptiveLeafIndexSet (const GridPartType& gridPart)
1366  : BaseType(gridPart)
1367  {}
1368 
1370  virtual std::string name () const
1371  {
1372  return "AdaptiveLeafIndexSet";
1373  }
1374 
1375  bool compress ()
1376  {
1377  const bool compressed = BaseType::compress();
1378 
1379 #ifndef NDEBUG
1380  if( this->grid_.comm().size() == 1 )
1381  {
1382  for( int codim = Traits::startingCodimension; codim < Traits::numCodimensions; ++codim )
1383  assert( this->codimUsed( codim ) ?
1384  size_t(this->size( codim )) == size_t(this->grid_.size( codim )) : true );
1385  }
1386 #endif // #ifndef NDEBUG
1387 
1388  return compressed;
1389  }
1390  };
1391 
1392 
1394  //
1395  // --IntersectionAdaptiveLeafIndexSet
1396  //
1398 
1399  template< class GridPartImp >
1400  struct IntersectionAdaptiveLeafIndexSetTraits
1401  : public AdaptiveIndexSetBaseTraits< GridPartImp, IntersectionAdaptiveLeafIndexSet< GridPartImp > >
1402  {
1403  // number of codimensions
1404  enum { numCodimensions = GridPartImp :: dimension + 2 };
1405  // intersection codimensions (this is usually dimension + 1 )
1406  enum { intersectionCodimension = numCodimensions - 1 };
1407  // first comdimension that is supported (not yet supported)
1408  enum { startingCodimension = 0 };
1409  };
1410 
1422  template < class GridPartImp >
1423  class IntersectionAdaptiveLeafIndexSet
1424  : public AdaptiveIndexSetBase< IntersectionAdaptiveLeafIndexSetTraits< GridPartImp > >
1425  {
1426  typedef AdaptiveIndexSetBase< IntersectionAdaptiveLeafIndexSetTraits< GridPartImp > > BaseType;
1427  typedef IntersectionAdaptiveLeafIndexSetTraits< GridPartImp > Traits;
1428 
1429  public:
1430  typedef typename BaseType :: GridType GridType;
1431  typedef typename BaseType :: GridPartType GridPartType;
1433  IntersectionAdaptiveLeafIndexSet (const GridType* grid)
1434  : BaseType(grid)
1435  {}
1436 
1438  IntersectionAdaptiveLeafIndexSet (const GridPartType& gridPart)
1439  : BaseType(gridPart)
1440  {}
1441 
1443  virtual std::string name () const
1444  {
1445  return "IntersectionAdaptiveLeafIndexSet";
1446  }
1447 
1448  bool compress ()
1449  {
1450  const bool compressed = BaseType::compress();
1451 
1452 #ifndef NDEBUG
1453  if( this->grid_.comm().size() == 1 )
1454  {
1455  for( int codim = Traits::startingCodimension; codim < Traits::numCodimensions; ++codim )
1456  if( codim != Traits::intersectionCodimension )
1457  assert( size_t(this->size( codim )) == size_t(this->grid_.size( codim )) );
1458  }
1459 #endif // #ifndef NDEBUG
1460 
1461  return compressed;
1462  }
1463  };
1464 
1466  //
1467  // --DGAdaptiveLeafIndexSet
1468  //
1470 
1471  template< class GridPartImp >
1472  struct DGAdaptiveLeafIndexSetTraits
1473  : public AdaptiveIndexSetBaseTraits< GridPartImp, DGAdaptiveLeafIndexSet< GridPartImp > >
1474  {
1475  // this index set only supports one codimension, codim zero
1476  enum { numCodimensions = 1 };
1477  // first comdimension that is supported (not yet supported)
1478  enum { startingCodimension = 0 };
1479  // intersection codimensions (this is usually dimension + 1 )
1480  enum { intersectionCodimension = -1 };
1481  };
1482 
1493  template < class GridPartImp >
1495  : public AdaptiveIndexSetBase< DGAdaptiveLeafIndexSetTraits< GridPartImp > >
1496  {
1498  typedef DGAdaptiveLeafIndexSetTraits< GridPartImp > Traits;
1499 
1500  public:
1501  typedef typename BaseType :: GridType GridType;
1502  typedef typename BaseType :: GridPartType GridPartType;
1504  DGAdaptiveLeafIndexSet (const GridType* grid)
1505  : BaseType(grid)
1506  {}
1507 
1508  DGAdaptiveLeafIndexSet (const GridPartType& gridPart)
1509  : BaseType(gridPart)
1510  {}
1511 
1513  virtual std::string name () const
1514  {
1515  return "DGAdaptiveLeafIndexSet";
1516  }
1517 
1518  bool compress ()
1519  {
1520  const bool compressed = BaseType::compress();
1521 
1522 #ifndef NDEBUG
1523  if( this->grid_.comm().size() == 1 )
1524  assert( size_t(this->size( 0 )) == size_t(this->grid_.size( 0 )) );
1525 #endif // #ifndef NDEBUG
1526 
1527  return compressed;
1528  }
1529  };
1530 
1531  } // namespace Fem
1532 
1533 } // namespace Dune
1534 
1535 #endif // #ifndef DUNE_FEM_ADAPTIVELEAFINDEXSET_HH
Wrapper class for entities.
Definition: entity.hh:66
consecutive, persistent index set for the leaf level based on the grid's hierarchy index set
Definition: adaptiveleafindexset.hh:99
BaseType ::Types Types
geometry type range type *‍/
Definition: adaptiveleafindexset.hh:128
IndexType subIndex(const typename GridPartType::template Codim< cd >::EntityType &entity, int subNumber, unsigned int codim) const
return index for given subentity *‍/
Definition: adaptiveleafindexset.hh:624
IndexType numberOfHoles(GeometryType type) const
return number of holes for given type *‍/
Definition: adaptiveleafindexset.hh:649
AdaptiveIndexSetBase(const GridPartType &gridPart)
Constructor.
Definition: adaptiveleafindexset.hh:361
virtual std::string name() const
return name of index set
Definition: adaptiveleafindexset.hh:411
void insertEntity(const GridElementType &entity)
please doc me *‍/
Definition: adaptiveleafindexset.hh:495
IndexType index(const Entity &entity) const
return number of entities of given type *‍/
Definition: adaptiveleafindexset.hh:561
bool read(InStreamInterface< StreamTraits > &in)
please doc me *‍/
Definition: adaptiveleafindexset.hh:1263
GridPartType ::IntersectionIteratorType IntersectionIteratorType
type of intersection iterator
Definition: adaptiveleafindexset.hh:134
IndexType subIndex(const Entity &entity, int subNumber, unsigned int codim) const
return index for given subentity *‍/
Definition: adaptiveleafindexset.hh:617
IndexType index(const typename GridPartType::template Codim< codim >::EntityType &entity) const
return number of entities of given type *‍/
Definition: adaptiveleafindexset.hh:569
void setupIndexSet()
mark all indices of interest
Definition: adaptiveleafindexset.hh:1039
void resize()
please doc me *‍/
Definition: adaptiveleafindexset.hh:512
IndexType numberOfHoles(const int codim) const
return number of holes of the sets indices
Definition: adaptiveleafindexset.hh:666
const std::vector< GeometryType > & geomTypes(const int codim) const
*‍/
Definition: adaptiveleafindexset.hh:462
Types types(const int codim) const
return range of geometry types *‍/
Definition: adaptiveleafindexset.hh:469
AdaptiveIndexSetBase(const GridType *grid)
Constructor.
Definition: adaptiveleafindexset.hh:353
void removeEntity(const GridElementType &entity)
please doc me *‍/
Definition: adaptiveleafindexset.hh:503
static const int intersectionCodimension
intersection codimension (numCodim-1 if enabled, otherwise -1)
Definition: adaptiveleafindexset.hh:119
IndexType oldIndex(const IndexType hole, const int codim) const
return old index, for dof manager only
Definition: adaptiveleafindexset.hh:685
IndexType newIndex(IndexType hole, GeometryType type) const
return new index for given hole and type *‍/
Definition: adaptiveleafindexset.hh:700
IndexType newIndex(const IndexType hole, const int codim) const
return new index, for dof manager only returns index
Definition: adaptiveleafindexset.hh:708
void resizeVectors()
reallocate the vector for new size
Definition: adaptiveleafindexset.hh:813
IndexType oldIndex(IndexType hole, GeometryType type) const
return old index for given hole and type *‍/
Definition: adaptiveleafindexset.hh:677
static const int dimension
grid dimension *‍/
Definition: adaptiveleafindexset.hh:113
BaseType ::IndexType IndexType
index type *‍/
Definition: adaptiveleafindexset.hh:125
BaseType ::template Codim< 0 >::Entity ElementType
type of codimension 0 Entity
Definition: adaptiveleafindexset.hh:131
bool contains(const EntityType &en) const
return true if entity has index *‍/
Definition: adaptiveleafindexset.hh:476
bool write(OutStreamInterface< StreamTraits > &out) const
please doc me *‍/
Definition: adaptiveleafindexset.hh:1235
GridPartType ::IntersectionType IntersectionType
type of intersections
Definition: adaptiveleafindexset.hh:137
void clear()
clear index set (only for structured grids)
Definition: adaptiveleafindexset.hh:1018
static const int numCodimensions
number of supported codimensions
Definition: adaptiveleafindexset.hh:116
IndexType size(int codim) const
return number of entities of given type *‍/
Definition: adaptiveleafindexset.hh:443
void setupGeomTypes(const MacroIndexSet &indexSet)
Definition: adaptiveleafindexset.hh:389
IndexType size(GeometryType type) const
return number of entities of given type *‍/
Definition: adaptiveleafindexset.hh:423
bool compress()
please doc me *‍/
Definition: adaptiveleafindexset.hh:832
int type() const
return type of index set, for GrapeDataIO
Definition: adaptiveleafindexset.hh:405
static const bool hasSingleGeometryType
true if only one geometry type is available
Definition: adaptiveleafindexset.hh:122
consecutive, persistent index set for the leaf level based on the grid's hierarchy index set
Definition: adaptiveleafindexset.hh:1351
virtual std::string name() const
return name of index set
Definition: adaptiveleafindexset.hh:1370
AdaptiveLeafIndexSet(const GridType *grid)
Constructor.
Definition: adaptiveleafindexset.hh:1360
AdaptiveLeafIndexSet(const GridPartType &gridPart)
Constructor.
Definition: adaptiveleafindexset.hh:1365
consecutive, persistent index set for the leaf level based on the grid's hierarchy index set
Definition: adaptiveleafindexset.hh:1496
DGAdaptiveLeafIndexSet(const GridType *grid)
Constructor.
Definition: adaptiveleafindexset.hh:1504
virtual std::string name() const
return name of index set
Definition: adaptiveleafindexset.hh:1513
abstract interface for an input stream
Definition: streams.hh:190
Traits::IndexType IndexType
index type
Definition: indexset.hh:136
abstract interface for an output stream
Definition: streams.hh:48
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
Default exception for dummy implementations.
Definition: exceptions.hh:263
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
PartitionIteratorType
Parameter to be used for the parallel level- and leaf iterators.
Definition: gridenums.hh:136
@ All_Partition
all entities
Definition: gridenums.hh:141
@ Interior_Partition
only interior entities
Definition: gridenums.hh:137
@ GhostEntity
ghost entities
Definition: gridenums.hh:35
concept Entity
Model of a grid entity.
Definition: entity.hh:107
concept IndexSet
Model of an index set.
Definition: indexidset.hh:44
constexpr auto min
Function object that returns the smaller of the given values.
Definition: hybridutilities.hh:506
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
Specialize with 'true' for all codims that a grid implements entities for. (default=false)
Definition: capabilities.hh:58
Specialize with 'true' for if the codimension 0 entity of the grid has only one possible geometry typ...
Definition: capabilities.hh:27
Specialize with 'true' if the grid is a Cartesian grid. Cartesian grids satisfy the following propert...
Definition: capabilities.hh:48
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:128
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)