Dune Core Modules (2.9.0)

grid.hh
1 #ifndef DUNE_SPGRID_GRID_HH
2 #define DUNE_SPGRID_GRID_HH
3 
4 #include <cstddef>
5 
6 #include <array>
7 #include <memory>
8 #include <utility>
9 
11 
13 #include <dune/grid/common/grid.hh>
15 
17 #include <dune/grid/spgrid/direction.hh>
19 #include <dune/grid/spgrid/gridview.hh>
20 #include <dune/grid/spgrid/hierarchiciterator.hh>
21 #include <dune/grid/spgrid/idset.hh>
22 #include <dune/grid/spgrid/indexset.hh>
23 #include <dune/grid/spgrid/hindexset.hh>
24 #include <dune/grid/spgrid/fileio.hh>
25 
26 namespace Dune
27 {
28 
29  // External Forward Declarations
30  // -----------------------------
31 
32  template< class Grid >
33  struct BackupRestoreFacility;
34 
35  namespace __SPGrid
36  {
37 
38  template< class, class >
39  class TreeIterator;
40 
41  } // namespace __SPGrid
42 
43 
44 
45  // Internal Forward Declarations
46  // -----------------------------
47 
48 #if HAVE_MPI
49  template< class ct, int dim, template< int > class Ref = SPIsotropicRefinement, class Comm = MPI_Comm >
50  class SPGrid;
51 #else
52  template< class ct, int dim, template< int > class Ref = SPIsotropicRefinement, class Comm = No_Comm >
53  class SPGrid;
54 #endif // #if !HAVE_MPI
55 
56 
57 
58  // SPGridFamily
59  // ------------
60 
61  template< class ct, int dim, template< int > class Ref, class Comm >
62  struct SPGridFamily
63  {
64  struct Traits
65  {
66  typedef SPGrid< ct, dim, Ref, Comm > Grid;
67 
68  typedef SPReferenceCubeContainer< ct, dim > ReferenceCubeContainer;
69  typedef typename ReferenceCubeContainer::ReferenceCube ReferenceCube;
70  typedef SPDomain< ct, dim > Domain;
71  typedef SPMesh< dim > Mesh;
72  typedef Ref< dim > Refinement;
73  typedef typename Refinement::Policy RefinementPolicy;
74 
75  typedef typename SPCommunicationTraits< Comm >::Communication Communication;
76  typedef Communication CollectiveCommunication;
77 
79  typedef LevelIntersection LeafIntersection;
80 
81  typedef Dune::IntersectionIterator< const Grid, SPIntersectionIterator< const Grid >, SPIntersection< const Grid > > LevelIntersectionIterator;
82  typedef LevelIntersectionIterator LeafIntersectionIterator;
83 
85 
86  typedef SPIndexSet< const Grid > LevelIndexSet;
87  typedef LevelIndexSet LeafIndexSet;
88 
89  typedef SPGlobalIdSet< const Grid > GlobalIdSet;
90  typedef SPLocalIdSet< const Grid > LocalIdSet;
91  typedef unsigned long GlobalIdType;
92  typedef unsigned long LocalIdType;
93 
94  template< int codim >
95  struct Codim
96  {
97  typedef typename ReferenceCubeContainer::template Codim< codim >::ReferenceCube ReferenceCube;
98 
100 
102 
103  typedef SPLocalGeometry< dim - codim, dim, const Grid > LocalGeometryImpl;
104 
105  typedef Dune::Geometry< dim - codim, dim, const Grid, SPGeometry > Geometry;
106  typedef Dune::Geometry< dim - codim, dim, const Grid, LocalGeometryReference > LocalGeometry;
107 
108  template< PartitionIteratorType pitype >
109  struct Partition
110  {
113  };
114 
115  typedef typename Partition< All_Partition >::LevelIterator LevelIterator;
116  typedef typename Partition< All_Partition >::LeafIterator LeafIterator;
117  };
118 
119  typedef Dune::GridView< SPGridViewTraits< const Grid > > LevelGridView;
120  typedef Dune::GridView< SPGridViewTraits< const Grid > > LeafGridView;
121  };
122  };
123 
124 
125 
134  template< class ct, int dim, template< int > class Ref, class Comm >
135  class SPGrid
136  : public GridDefaultImplementation< dim, dim, ct, SPGridFamily< ct, dim, Ref, Comm > >
137  {
140 
141  friend struct BackupRestoreFacility< This >;
142  friend class SPIntersection< const This >;
143  friend class SPGridLevel< This >;
144 
145  template< class, class > friend class __SPGrid::TreeIterator;
146 
147  public:
148  typedef SPGridFamily< ct, dim, Ref, Comm > GridFamily;
149 
150  typedef typename GridFamily::Traits Traits;
151 
152  typedef typename Traits::ReferenceCubeContainer ReferenceCubeContainer;
153  typedef typename Traits::ReferenceCube ReferenceCube;
154  typedef typename Traits::Domain Domain;
155  typedef typename Traits::Mesh Mesh;
156  typedef typename Traits::Refinement Refinement;
157  typedef typename Traits::RefinementPolicy RefinementPolicy;
158 
159  typedef typename ReferenceCube::ctype ctype;
160 
161  static const int dimension = ReferenceCube::dimension;
162  static const int dimensionworld = ReferenceCube::dimension;
163 
164  typedef typename ReferenceCube::GlobalVector GlobalVector;
165 
166  typedef typename Traits::GlobalIdSet GlobalIdSet;
167  typedef typename Traits::LocalIdSet LocalIdSet;
168 
169  typedef typename Traits::Communication Communication;
171 
172  template< int codim >
173  struct Codim
174  : Base::template Codim< codim >
175  {
176  typedef typename Traits::template Codim< codim >::ReferenceCube ReferenceCube;
177 
178  typedef typename Traits::template Codim< codim >::LocalGeometryImpl LocalGeometryImpl;
179  };
180 
181  typedef typename Base::LevelGridView LevelGridView;
182  typedef typename Base::LeafGridView LeafGridView;
183 
184  typedef typename LevelGridView::IndexSet LevelIndexSet;
185  typedef typename LeafGridView::IndexSet LeafIndexSet;
186 
187  typedef SPHierarchyIndexSet< const This > HierarchicIndexSet;
188 
189  typedef SPGridLevel< This > GridLevel;
190 
191  typedef typename GridLevel::MultiIndex MultiIndex;
192  static const int numDirections = GridLevel::numDirections;
193 
194  private:
195  typedef typename GridLevel::PartitionList PartitionList;
196 
197  typedef typename LevelGridView::Traits::GridViewImp LevelGridViewImpl;
198  typedef typename LeafGridView::Traits::GridViewImp LeafGridViewImpl;
199 
200  public:
201  SPGrid ( const Domain &domain, const MultiIndex &cells,
202  const Communication &comm = SPCommunicationTraits< Comm >::defaultComm() );
203 
204  SPGrid ( const Domain &domain, const MultiIndex &cells, const MultiIndex &overlap,
205  const Communication &comm = SPCommunicationTraits< Comm >::defaultComm() );
206 
207  SPGrid ( const GlobalVector &a, const GlobalVector &b, const MultiIndex &cells,
208  const Communication &comm = SPCommunicationTraits< Comm >::defaultComm() );
209 
210  SPGrid ( const GlobalVector &a, const GlobalVector &b, const MultiIndex &cells,
211  const MultiIndex &overlap,
212  const Communication &comm = SPCommunicationTraits< Comm >::defaultComm() );
213 
214  SPGrid ( const This & ) = delete;
215  SPGrid ( This &&other );
216 
217  const ReferenceCube &referenceCube () const
218  {
219  return refCubes_.get();
220  }
221 
222  template< int codim >
223  const typename Codim< codim >::ReferenceCube &referenceCube () const
224  {
225  return refCubes_.template get< codim >();
226  }
227 
228  const Domain &domain () const { return domain_; }
229 
230  const MultiIndex &overlap () const { return overlap_; }
231 
232  int maxLevel () const
233  {
234  return leafLevel().level();
235  }
236 
237  int size ( const int level, const int codim ) const
238  {
239  return levelGridView( level ).size( codim );
240  }
241 
242  int size ( const int codim ) const
243  {
244  return leafGridView().size( codim );
245  }
246 
247  int size ( const int level, const GeometryType &type ) const
248  {
249  return levelGridView( level ).size( type );
250  }
251 
252  int size ( const GeometryType &type ) const
253  {
254  return leafGridView().size( type );
255  }
256 
257  LevelGridView levelGridView ( int level ) const
258  {
259  assert( (level >= 0) && (level <= maxLevel()) );
260  return levelGridViews_[ level ];
261  }
262 
263  LeafGridView leafGridView () const { return leafGridView_; }
264 
265  template< int codim, PartitionIteratorType pitype >
266  typename Traits::template Codim< codim >::template Partition< pitype >::LevelIterator
267  lbegin ( const int level, const unsigned int sweepDir = 0 ) const
268  {
269  const LevelGridView &view = levelGridView( level );
270  return view.impl().template begin< codim, pitype >( sweepDir );
271  }
272 
273  template< int codim, PartitionIteratorType pitype >
274  typename Traits::template Codim< codim >::template Partition< pitype >::LevelIterator
275  lend ( const int level, const unsigned int sweepDir = 0 ) const
276  {
277  const LevelGridView &view = levelGridView( level );
278  return view.impl().template end< codim, pitype >( sweepDir );
279  }
280 
281  template< int codim >
282  typename Traits::template Codim< codim >::LevelIterator
283  lbegin ( const int level, const unsigned int sweepDir = 0 ) const
284  {
285  const LevelGridView &view = levelGridView( level );
286  return view.impl().template begin< codim >( sweepDir );
287  }
288 
289  template< int codim >
290  typename Traits::template Codim< codim >::LevelIterator
291  lend ( const int level, const unsigned int sweepDir = 0 ) const
292  {
293  const LevelGridView &view = levelGridView( level );
294  return view.impl().template end< codim >( sweepDir );
295  }
296 
297  template< int codim, PartitionIteratorType pitype >
298  typename Traits::template Codim< codim >::template Partition< pitype >::LeafIterator
299  leafbegin ( const unsigned int sweepDir = 0 ) const
300  {
301  const LeafGridView &view = leafGridView();
302  return view.impl().template begin< codim, pitype >( sweepDir );
303  }
304 
305  template< int codim, PartitionIteratorType pitype >
306  typename Traits::template Codim< codim >::template Partition< pitype >::LeafIterator
307  leafend ( const unsigned int sweepDir = 0 ) const
308  {
309  const LeafGridView &view = leafGridView();
310  return view.impl().template end< codim, pitype >( sweepDir );
311  }
312 
313  template< int codim >
314  typename Traits::template Codim< codim >::LeafIterator
315  leafbegin ( const unsigned int sweepDir = 0 ) const
316  {
317  const LeafGridView &view = leafGridView();
318  return view.impl().template begin< codim >( sweepDir );
319  }
320 
321  template< int codim >
322  typename Traits::template Codim< codim >::LeafIterator
323  leafend ( const unsigned int sweepDir = 0 ) const
324  {
325  const LeafGridView &view = leafGridView();
326  return view.impl().template end< codim >( sweepDir );
327  }
328 
329  const GlobalIdSet &globalIdSet () const
330  {
331  return globalIdSet_;
332  }
333 
334  const LocalIdSet &localIdSet () const
335  {
336  return localIdSet_;
337  }
338 
339  const LevelIndexSet &levelIndexSet ( const int level ) const
340  {
341  return levelGridView( level ).indexSet();
342  }
343 
344  const LeafIndexSet &leafIndexSet () const
345  {
346  return leafGridView().indexSet();
347  }
348 
349  const HierarchicIndexSet &hierarchicIndexSet () const
350  {
351  return hierarchicIndexSet_;
352  }
353 
354  bool mark ( const int refCount, const typename Codim< 0 >::Entity &e );
355  int getMark ( const typename Codim< 0 >::Entity &e ) const;
356 
357  bool preAdapt ();
358 
359  bool adapt ();
360 
361  template< class DataHandle >
362  bool adapt ( AdaptDataHandleInterface< This, DataHandle > &handle );
363 
364  void postAdapt ();
365 
366  void globalRefine ( const int refCount,
367  const RefinementPolicy &policy = RefinementPolicy() );
368 
369  template< class DataHandle >
370  void globalRefine ( const int refCount,
372  const RefinementPolicy &policy = RefinementPolicy() );
373 
374  int overlapSize ( const int level, const int codim ) const
375  {
376  return levelGridView( level ).overlapSize( codim );
377  }
378 
379  int overlapSize ( const int codim ) const
380  {
381  return leafGridView().overlapSize( codim );
382  }
383 
384  int ghostSize ( const int level, const int codim ) const
385  {
386  return levelGridView( level ).ghostSize( codim );
387  }
388 
389  int ghostSize ( const int codim ) const
390  {
391  return leafGridView().ghostSize( codim );
392  }
393 
394  template< class DataHandle, class Data >
395  SPCommunication< This, CommDataHandleIF< DataHandle, Data > >
396  communicate ( CommDataHandleIF< DataHandle, Data > &data,
397  InterfaceType interface, CommunicationDirection dir,
398  int level ) const
399  {
400  LevelGridView view = levelGridView( level );
401  return view.impl().communicate( data, interface, dir );
402  }
403 
404  template< class DataHandle, class Data >
405  SPCommunication< This, CommDataHandleIF< DataHandle, Data > >
406  communicate ( CommDataHandleIF< DataHandle, Data > &data,
407  InterfaceType interface, CommunicationDirection dir ) const
408  {
409  LeafGridView view = leafGridView();
410  return view.impl().communicate( data, interface, dir );
411  }
412 
413  const Communication &comm () const;
414 
415  template< class Seed >
416  typename Traits::template Codim< Seed::codimension >::Entity entity ( const Seed &seed ) const
417  {
418  typedef typename Traits::template Codim< Seed::codimension >::Entity Entity;
419  typedef SPEntity< Seed::codimension, dimension, const This > EntityImpl;
420  typename EntityImpl::EntityInfo entityInfo( gridLevel( seed.impl().level() ), seed.impl().id(), seed.impl().partitionNumber() );
421  return Entity( EntityImpl( std::move( entityInfo ) ) );
422  }
423 
424  template< int codim >
425  bool hasFather ( const Dune::Entity< codim, dimension, const This, SPEntity > &entity ) const
426  {
427  return ((entity.level() > 0) && entity.impl().entityInfo().hasFather());
428  }
429 
430  bool hasFather ( const Dune::Intersection< const This, SPIntersection< const This > > &intersection ) const
431  {
432  return ((intersection.impl().gridLevel().level() > 0) && intersection.impl().entityInfo().hasFather());
433  }
434 
435  template< int codim >
437  father ( const Dune::Entity< codim, dimension, const This, SPEntity > &entity ) const
438  {
439  assert( hasFather( entity ) );
441  father.impl().entityInfo().up();
442  return std::move( father );
443  }
444 
446  father ( const Dune::Intersection< const This, SPIntersection< const This > > &intersection ) const
447  {
448  typedef SPIntersection< const This > IntersectionImpl;
450 
451  assert( hasFather( intersection ) );
452  typename IntersectionImpl::EntityInfo fatherInfo( intersection.impl().entityInfo() );
453  fatherInfo.up();
454  return Intersection( IntersectionImpl( std::move( fatherInfo ), intersection.indexInInside() ) );
455  }
456 
457  const GridLevel &gridLevel ( const int level ) const;
458  const GridLevel &leafLevel () const;
459 
460  std::size_t numBoundarySegments () const;
461 
462  private:
463  // note: this method ignores the last bit of the macroId
464  std::size_t boundaryIndex ( const MultiIndex &macroId,
465  const unsigned int partitionNumber,
466  const int face ) const;
467 
468  typename Codim< 1 >::LocalGeometry localFaceGeometry ( int face ) const
469  {
470  assert( (face >= 0) && (face < ReferenceCube::numFaces) );
471  return typename Codim< 1 >::LocalGeometry( *localFaceGeometry_[ face ] );
472  }
473 
474  void createLocalGeometries ();
475  void setupMacroGrid ();
476  void setupBoundaryIndices ();
477 
478  static Communication defaultCommunication ();
479 
480  Domain domain_;
481  Mesh globalMesh_;
482  MultiIndex overlap_;
483  ReferenceCubeContainer refCubes_;
484  std::vector< std::unique_ptr< GridLevel > > gridLevels_;
485  std::vector< LevelGridView > levelGridViews_;
486  LeafGridView leafGridView_;
487  HierarchicIndexSet hierarchicIndexSet_;
488  GlobalIdSet globalIdSet_;
489  LocalIdSet localIdSet_;
490  Communication comm_;
491  std::size_t boundarySize_;
492  std::vector< std::array< std::size_t, 2*dimension > > boundaryOffset_;
493  std::array< std::unique_ptr< const typename Codim< 1 >::LocalGeometryImpl >, ReferenceCube::numFaces > localFaceGeometry_;
494  };
495 
496 
497 
498  // Implementation of SPGrid
499  // ------------------------
500 
501  template< class ct, int dim, template< int > class Ref, class Comm >
503  ::SPGrid ( const Domain &domain, const MultiIndex &cells,
504  const Communication &comm )
505  : domain_( domain ),
506  globalMesh_( cells ),
507  overlap_( MultiIndex::zero() ),
508  leafGridView_( LeafGridViewImpl() ),
509  hierarchicIndexSet_( *this ),
510  comm_( comm )
511  {
512  createLocalGeometries();
513  setupMacroGrid();
514  }
515 
516 
517  template< class ct, int dim, template< int > class Ref, class Comm >
518  inline SPGrid< ct, dim, Ref, Comm >
519  ::SPGrid ( const Domain &domain, const MultiIndex &cells, const MultiIndex &overlap,
520  const Communication &comm )
521  : domain_( domain ),
522  globalMesh_( cells ),
523  overlap_( overlap ),
524  leafGridView_( LeafGridViewImpl() ),
525  hierarchicIndexSet_( *this ),
526  comm_( comm )
527  {
528  createLocalGeometries();
529  setupMacroGrid();
530  }
531 
532 
533  template< class ct, int dim, template< int > class Ref, class Comm >
534  inline SPGrid< ct, dim, Ref, Comm >
535  ::SPGrid ( const GlobalVector &a, const GlobalVector &b, const MultiIndex &cells,
536  const Communication &comm )
537  : domain_( a, b ),
538  globalMesh_( cells ),
539  overlap_( MultiIndex::zero() ),
540  leafGridView_( LeafGridViewImpl() ),
541  hierarchicIndexSet_( *this ),
542  comm_( comm )
543  {
544  createLocalGeometries();
545  setupMacroGrid();
546  }
547 
548 
549  template< class ct, int dim, template< int > class Ref, class Comm >
550  inline SPGrid< ct, dim, Ref, Comm >
551  ::SPGrid ( const GlobalVector &a, const GlobalVector &b, const MultiIndex &cells,
552  const MultiIndex &overlap, const Communication &comm )
553  : domain_( a, b ),
554  globalMesh_( cells ),
555  overlap_( overlap ),
556  leafGridView_( LeafGridViewImpl() ),
557  hierarchicIndexSet_( *this ),
558  comm_( comm )
559  {
560  createLocalGeometries();
561  setupMacroGrid();
562  }
563 
564 
565  template< class ct, int dim, template< int > class Ref, class Comm >
566  inline SPGrid< ct, dim, Ref, Comm >::SPGrid ( This &&other )
567  : domain_( std::move( other.domain_ ) ),
568  globalMesh_( std::move( other.globalMesh_ ) ),
569  overlap_( std::move( other.overlap_ ) ),
570  leafGridView_( LeafGridViewImpl() ),
571  hierarchicIndexSet_( *this ),
572  comm_( std::move( other.comm_ ) )
573  {
574  createLocalGeometries();
575  setupMacroGrid();
576  }
577 
578 
579  template< class ct, int dim, template< int > class Ref, class Comm >
580  inline bool SPGrid< ct, dim, Ref, Comm >
581  ::mark ( const int refCount, const typename Codim< 0 >::Entity &e )
582  {
583  return false;
584  }
585 
586 
587  template< class ct, int dim, template< int > class Ref, class Comm >
588  inline int SPGrid< ct, dim, Ref, Comm >
589  ::getMark ( const typename Codim< 0 >::Entity &e ) const
590  {
591  return 0;
592  }
593 
594 
595  template< class ct, int dim, template< int > class Ref, class Comm >
596  inline bool SPGrid< ct, dim, Ref, Comm >::preAdapt ()
597  {
598  return false;
599  }
600 
601 
602  template< class ct, int dim, template< int > class Ref, class Comm >
603  inline bool SPGrid< ct, dim, Ref, Comm >::adapt ()
604  {
605  return false;
606  }
607 
608 
609  template< class ct, int dim, template< int > class Ref, class Comm >
610  template< class DataHandle >
611  inline bool SPGrid< ct, dim, Ref, Comm >
612  ::adapt ( AdaptDataHandleInterface< This, DataHandle > &handle )
613  {
614  return false;
615  }
616 
617 
618  template< class ct, int dim, template< int > class Ref, class Comm >
619  inline void SPGrid< ct, dim, Ref, Comm >::postAdapt ()
620  {}
621 
622 
623  template< class ct, int dim, template< int > class Ref, class Comm >
624  inline void SPGrid< ct, dim, Ref, Comm >
625  ::globalRefine ( const int refCount, const RefinementPolicy &policy )
626  {
627  for( int i = 0; i < refCount; ++i )
628  {
629  gridLevels_.emplace_back( new GridLevel( leafLevel(), policy ) );
630  levelGridViews_.push_back( LevelGridViewImpl( leafLevel() ) );
631  }
632  leafGridView_.impl().update( leafLevel() );
633  hierarchicIndexSet_.update();
634  }
635 
636 
637  template< class ct, int dim, template< int > class Ref, class Comm >
638  template< class DataHandle >
639  inline void SPGrid< ct, dim, Ref, Comm >
640  ::globalRefine ( const int refCount,
641  AdaptDataHandleInterface< This, DataHandle > &handle,
642  const RefinementPolicy &policy )
643  {
644  for( int i = 0; i < refCount; ++i )
645  {
646  const LevelGridView fatherView = levelGridView( maxLevel() );
647 
648  gridLevels_.emplace_back( new GridLevel( leafLevel(), policy ) );
649  levelGridViews_.push_back( LevelGridViewImpl( leafLevel() ) );
650 
651  hierarchicIndexSet_.update();
652  leafGridView_.impl().update( leafLevel() );
653 
654  handle.preAdapt( leafLevel().size() );
655  typedef typename Codim< 0 >::LevelIterator LevelIterator;
656  const LevelIterator end = fatherView.template end< 0 >();
657  for( LevelIterator it = fatherView.template begin< 0 >(); it != end; ++it )
658  handle.postRefinement( *it );
659  handle.postAdapt();
660  }
661  }
662 
663 
664  template< class ct, int dim, template< int > class Ref, class Comm >
665  inline const typename SPGrid< ct, dim, Ref, Comm >::Communication &
666  SPGrid< ct, dim, Ref, Comm >::comm () const
667  {
668  return comm_;
669  }
670 
671 
672  template< class ct, int dim, template< int > class Ref, class Comm >
673  inline const typename SPGrid< ct, dim, Ref, Comm >::GridLevel &
674  SPGrid< ct, dim, Ref, Comm >::gridLevel ( const int level ) const
675  {
676  assert( (level >= 0) && (level < int( gridLevels_.size() )) );
677  return *gridLevels_[ level ];
678  }
679 
680 
681  template< class ct, int dim, template< int > class Ref, class Comm >
682  inline const typename SPGrid< ct, dim, Ref, Comm >::GridLevel &
683  SPGrid< ct, dim, Ref, Comm >::leafLevel () const
684  {
685  assert( !gridLevels_.empty() );
686  return *gridLevels_.back();
687  }
688 
689 
690  template< class ct, int dim, template< int > class Ref, class Comm >
691  inline std::size_t SPGrid< ct, dim, Ref, Comm >::numBoundarySegments () const
692  {
693  return boundarySize_;
694  }
695 
696 
697  // note: this method ignores the last bit of the macroId
698  template< class ct, int dim, template< int > class Ref, class Comm >
699  inline std::size_t SPGrid< ct, dim, Ref, Comm >
700  ::boundaryIndex ( const MultiIndex &macroId,
701  const unsigned int partitionNumber,
702  const int face ) const
703  {
704  assert( (face >= 0) && (face < 2*dimension) );
705 
706  const LevelGridView &macroView = levelGridView( 0 );
707  const GridLevel &gridLevel = macroView.impl().gridLevel();
708  const PartitionList &partitions = gridLevel.template partition< OverlapFront_Partition >();
709  const typename PartitionList::Partition &partition = partitions.partition( partitionNumber );
710 
711  std::size_t index = 0;
712  std::size_t factor = 1;
713  for( int i = 0; i < dimension; ++i )
714  {
715  if( i == face/2 )
716  continue;
717  // note: the OverlapFront_Partition is closed, i.e.,
718  // begin()[ i ] & 1 == end()[ i ] & 1 == 0.
719  const int k = (macroId[ i ] - partition.begin()[ i ]) >> 1;
720  const int w = (partition.end()[ i ] - partition.begin()[ i ]) >> 1;
721  assert( (k >= 0) && (k < w) );
722  index += std::size_t( k ) * factor;
723  factor *= std::size_t( w );
724  }
725  return index + boundaryOffset_[ partitionNumber - partitions.minNumber() ][ face ];
726  }
727 
728 
729  template< class ct, int dim, template< int > class Ref, class Comm >
730  inline void SPGrid< ct, dim, Ref, Comm >::createLocalGeometries ()
731  {
732  typedef typename Codim< 1 >::LocalGeometryImpl LocalGeometryImpl;
733 
734  const GlobalVector unitH( ctype( 1 ) );
735  for( int face = 0; face < ReferenceCube::numFaces; ++face )
736  {
737  MultiIndex id;
738  for( int i = 0; i < dimension; ++i )
739  id[ i ] = 1;
740  id += referenceCube().subId( 1, face );
741  const SPDirection< dimension > direction( id );
742  //const unsigned int direction = ((1 << dimension) - 1) ^ (1 << (face/2));
743  GlobalVector origin( ctype( 0 ) );
744  origin[ face/2 ] = ctype( face & 1 );
745  const SPGeometryCache< ctype, dimension, 1 > cache( unitH, direction );
746  localFaceGeometry_[ face ].reset( new LocalGeometryImpl( cache, origin ) );
747  }
748  }
749 
750 
751  template< class ct, int dim, template< int > class Ref, class Comm >
752  inline void SPGrid< ct, dim, Ref, Comm >::setupMacroGrid ()
753  {
754  SPDecomposition< dimension > decomposition( globalMesh_, comm().size() );
755 
756  GridLevel *leafLevel = new GridLevel( *this, decomposition );
757  gridLevels_.emplace_back( leafLevel );
758  levelGridViews_.push_back( LevelGridViewImpl( *leafLevel ) );
759  leafGridView_.impl().update( *leafLevel );
760  hierarchicIndexSet_.update();
761  setupBoundaryIndices();
762  }
763 
764 
765  template< class ct, int dim, template< int > class Ref, class Comm >
766  inline void SPGrid< ct, dim, Ref, Comm >::setupBoundaryIndices ()
767  {
768  const LevelGridView &macroView = levelGridView( 0 );
769  const GridLevel &gridLevel = macroView.impl().gridLevel();
770  const PartitionList &partitions = gridLevel.template partition< OverlapFront_Partition >();
771 
772  boundarySize_ = 0;
773  boundaryOffset_.resize( partitions.maxNumber() - partitions.minNumber() + 1 );
774  for( typename PartitionList::Iterator it = partitions.begin(); it; ++it )
775  {
776  const int partitionIndex = it->number() - partitions.minNumber();
777  for( int i = 0; i < dimension; ++i )
778  {
779  // note: the OverlapFront_Partition is closed, i.e.,
780  // begin()[ i ] & 1 == end()[ i ] & 1 == 0.
781  std::size_t size = 1;
782  for( int j = 0; j < dimension; ++j )
783  size *= (i == j ? 1 : std::size_t( (it->end()[ j ] - it->begin()[ j ]) >> 1 ));
784 
785  // offset for lower boundary
786  boundaryOffset_[ partitionIndex ][ 2*i ] = boundarySize_;
787  boundarySize_ += (it->boundary( 2*i ) ? size : 0);
788 
789  // offset for upper boundary
790  boundaryOffset_[ partitionIndex ][ 2*i+1 ] = boundarySize_;
791  boundarySize_ += (it->boundary( 2*i+1 ) ? size : 0);
792  }
793  }
794  }
795 
796 } // namespace Dune
797 
798 #endif // #ifndef DUNE_SPGRID_GRID_HH
interfaces and wrappers needed for the callback adaptation provided by AlbertaGrid and dune-ALUGrid
Interface class for the Grid's adapt method where the parameter is a AdaptDataHandleInterface.
Definition: adaptcallback.hh:33
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:78
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
interface class for an iterator over grid entities
Definition: entityiterator.hh:32
Store a reference to an entity with a minimal memory footprint.
Definition: entityseed.hh:26
Implementation & impl()
access to the underlying implementation
Definition: entity.hh:80
int level() const
The level of this entity.
Definition: entity.hh:124
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
Wrapper class for geometries.
Definition: geometry.hh:71
Definition: grid.hh:862
Grid view abstract base class.
Definition: gridview.hh:66
GridFamily::Traits::LocalIdSet LocalIdSet
A type that is a model of Dune::IdSet which provides a unique and persistent numbering for all entiti...
Definition: grid.hh:509
GridFamily::Traits::LevelGridView LevelGridView
type of view for level grid
Definition: grid.hh:402
GridFamily::Traits::GlobalIdSet GlobalIdSet
A type that is a model of Dune::IdSet which provides a unique and persistent numbering for all entiti...
Definition: grid.hh:502
detected_or_fallback_t< DeprecatedCollectiveCommunication_t, Communication_t, typename GridFamily::Traits > Communication
A type that is a model of Dune::Communication. It provides a portable way for communication on the se...
Definition: grid.hh:525
GridFamily::Traits::LeafIndexSet LeafIndexSet
A type that is a model of Dune::IndexSet which provides a consecutive, but non persistent,...
Definition: grid.hh:494
GridFamily::Traits::LeafGridView LeafGridView
type of view for leaf grid
Definition: grid.hh:400
ct ctype
Define type used for coordinates in grid module.
Definition: grid.hh:532
Mesh entities of codimension 0 ("elements") allow to visit all intersections with "neighboring" eleme...
Definition: intersectioniterator.hh:83
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: intersection.hh:164
description of the computational domain
Definition: domain.hh:27
structured, parallel DUNE grid
Definition: grid.hh:137
Definition: intersection.hh:37
Different resources needed by all grid implementations.
capabilities for SPGrid
entity seed for SPGrid
Wrapper and interface classes for element geometries.
Grid< dim, dimworld, ct, GridFamily >::LevelGridView levelGridView(const Grid< dim, dimworld, ct, GridFamily > &grid, int level)
level grid view for the given grid and level.
Definition: grid.hh:802
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:170
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:86
Implements an utility class that provides MPI's collective communication methods.
Dune namespace.
Definition: alignedallocator.hh:13
Communication< T > CollectiveCommunication
Definition: communication.hh:541
facility for writing and reading grids
Definition: backuprestore.hh:43
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 5, 22:29, 2024)