dune-grid  2.3.1
common/grid.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_GRID_HH
4 #define DUNE_GRID_HH
5 
9 // system includes
10 #include <iostream>
11 #include <string>
12 
13 // dune-common includes
14 #include <dune/common/fvector.hh>
15 #include <dune/common/typetraits.hh>
16 
17 // dune-geometry includes
18 #include <dune/geometry/type.hh>
19 
20 // local includes
28 
29 // include this file after all other, because other files might undef the
30 // macros that are defined in that file
31 #include <dune/common/bartonnackmanifcheck.hh>
32 
33 namespace Dune {
34 
345  // Forward Declarations
346  // --------------------
347 
348  template<int mydim, int cdim, class GridImp,template<int,int,class> class GeometryImp> class Geometry;
349  template< int mydim, int cdim, class GridImp > class GlobalGeometryReference;
350  template< int mydim, int cdim, class GridImp > class LocalGeometryReference;
351  // dim is necessary because Entity will be specialized for codim==0 _and_ codim==dim
352  // EntityImp gets GridImp as 3rd template parameter to distinguish between const and mutable grid
353  template<int codim, int dim, class GridImp,template<int,int,class> class EntityImp> class Entity;
354  template<class GridImp, class EntityPointerImp> class EntityPointer;
355  template< int codim, class Grid, class IteratorImp > class EntityIterator;
356  template<class GridImp, class EntitySeedImp> class EntitySeed;
357  template< class GridImp, class IntersectionImp > class Intersection;
358  template< class GridImp, class IntersectionIteratorImp, class IntersectionImp > class IntersectionIterator;
359  template<class GridImp, class IndexSetImp, class IndexTypeImp=unsigned int> class IndexSet;
360  template<class GridImp, class IdSetImp, class IdTypeImp> class IdSet;
361 
362 
363  //************************************************************************
364  // G R I D
365  //************************************************************************
366 
385  template< int dim, int dimworld, class ct, class GridFamily>
386  class Grid {
387  typedef typename GridFamily::Traits::Grid GridImp;
389  public:
390 
391  //===========================================================
395  //===========================================================
396 
398  enum {
401  };
402 
404  enum {
406  dimensionworld=dimworld
407  };
409 
410  //===========================================================
414  //===========================================================
415 
417  template <PartitionIteratorType pitype>
418  struct Partition
419  {
420  typedef typename GridFamily::Traits::template Partition<pitype>::LevelGridView
422  typedef typename GridFamily::Traits::template Partition<pitype>::LeafGridView
424  };
426  typedef typename Partition< All_Partition > :: LevelGridView LevelGridView;
427  typedef typename Partition< All_Partition > :: LeafGridView LeafGridView;
428 
429 
434  template <int cd>
435  struct Codim
436  {
438  typedef typename GridFamily::Traits::template Codim<cd>::Geometry Geometry;
439 
441  typedef typename GridFamily::Traits::template Codim<cd>::LocalGeometry LocalGeometry;
442 
444  typedef typename GridFamily::Traits::template Codim<cd>::Entity Entity;
445 
447  typedef typename GridFamily::Traits::template Codim<cd>::EntityPointer EntityPointer;
448 
450  typedef typename GridFamily::Traits::template Codim<cd>::EntitySeed EntitySeed;
451 
453  template <PartitionIteratorType pitype>
454  struct Partition
455  {
462  typedef typename GridFamily::Traits::template Codim<cd>::template Partition<pitype>::LevelIterator LevelIterator;
469  typedef typename GridFamily::Traits::template Codim<cd>::template Partition<pitype>::LeafIterator LeafIterator;
470  };
471 
474  typedef typename GridFamily::Traits::template Codim<cd>::LevelIterator LevelIterator;
475 
478  typedef typename GridFamily::Traits::template Codim<cd>::LeafIterator LeafIterator;
479  };
480 
484  typedef typename GridFamily::Traits::LeafIntersection LeafIntersection;
485 
489  typedef typename GridFamily::Traits::LevelIntersection LevelIntersection;
490 
496  typedef typename GridFamily::Traits::LeafIntersectionIterator LeafIntersectionIterator;
497 
503  typedef typename GridFamily::Traits::LevelIntersectionIterator LevelIntersectionIterator;
504 
510  typedef typename GridFamily::Traits::HierarchicIterator HierarchicIterator;
511 
516  typedef typename GridFamily::Traits::LevelIndexSet LevelIndexSet;
517 
522  typedef typename GridFamily::Traits::LeafIndexSet LeafIndexSet;
523 
530  typedef typename GridFamily::Traits::GlobalIdSet GlobalIdSet;
531 
537  typedef typename GridFamily::Traits::LocalIdSet LocalIdSet;
538 
543  typedef typename GridFamily::Traits::CollectiveCommunication CollectiveCommunication;
544 
546  typedef ct ctype;
548 
549 
550  //===========================================================
554  //===========================================================
555 
559  int maxLevel() const
560  {
561  CHECK_INTERFACE_IMPLEMENTATION(asImp().maxLevel());
562  return asImp().maxLevel();
563  }
564 
566  int size (int level, int codim) const
567  {
568  CHECK_INTERFACE_IMPLEMENTATION(asImp().size(level,codim));
569  return asImp().size(level,codim);
570  }
571 
573  int size (int codim) const
574  {
575  CHECK_INTERFACE_IMPLEMENTATION(asImp().size(codim));
576  return asImp().size(codim);
577  }
578 
580  int size (int level, GeometryType type) const
581  {
582  CHECK_INTERFACE_IMPLEMENTATION(asImp().size(level,type));
583  return asImp().size(level,type);
584  }
585 
587  int size (GeometryType type) const
588  {
589  CHECK_INTERFACE_IMPLEMENTATION(asImp().size(type));
590  return asImp().size(type);
591  }
593 
594 
599  size_t numBoundarySegments () const
600  {
601  CHECK_INTERFACE_IMPLEMENTATION( asImp().numBoundarySegments());
602  return asImp().numBoundarySegments();
603  }
604 
605  //===========================================================
609  //===========================================================
610 
612  template<PartitionIteratorType pitype>
613  typename Partition<pitype>::LevelGridView DUNE_DEPRECATED_MSG("The method levelView has been renamed to levelGridView.") levelView(int level) const {
614  CHECK_INTERFACE_IMPLEMENTATION((asImp().template levelView<pitype>(level)));
615  return asImp().template levelView<pitype>(level);
616  }
617 
619  template<PartitionIteratorType pitype>
620  typename Partition<pitype>::LeafGridView DUNE_DEPRECATED_MSG("The method levelView has been renamed to leafGridView.") leafView() const {
621  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafView<pitype>()));
622  return asImp().template leafView<pitype>();
623  }
624 
626  LevelGridView levelView(int level) const DUNE_DEPRECATED_MSG("The method levelView has been renamed to levelGridView.") {
627  CHECK_INTERFACE_IMPLEMENTATION((asImp().levelView(level)));
628  return asImp().levelView(level);
629  }
630 
632  LeafGridView leafView() const DUNE_DEPRECATED_MSG("The method leafView has been renamed to leafGridView.") {
633  CHECK_INTERFACE_IMPLEMENTATION((asImp().leafView()));
634  return asImp().leafView();
635  }
636 
638  template<PartitionIteratorType pitype>
639  typename Partition<pitype>::LevelGridView levelGridView(int level) const {
640  CHECK_INTERFACE_IMPLEMENTATION((asImp().template levelGridView<pitype>(level)));
641  return asImp().template levelGridView<pitype>(level);
642  }
643 
645  template<PartitionIteratorType pitype>
646  typename Partition<pitype>::LeafGridView leafGridView() const {
647  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafGridView<pitype>()));
648  return asImp().template leafGridView<pitype>();
649  }
650 
652  LevelGridView levelGridView(int level) const {
653  CHECK_INTERFACE_IMPLEMENTATION((asImp().levelGridView(level)));
654  return asImp().levelGridView(level);
655  }
656 
659  CHECK_INTERFACE_IMPLEMENTATION((asImp().leafGridView()));
660  return asImp().leafGridView();
661  }
662 
664 
665 
666  //===========================================================
670  //===========================================================
671 
673  template<int cd, PartitionIteratorType pitype>
674  typename Codim<cd>::template Partition<pitype>::LevelIterator lbegin (int level) const
675  {
676  CHECK_INTERFACE_IMPLEMENTATION((asImp().template lbegin<cd,pitype>(level)));
677  return asImp().template lbegin<cd,pitype>(level);
678  }
679 
681  template<int cd, PartitionIteratorType pitype>
682  typename Codim<cd>::template Partition<pitype>::LevelIterator lend (int level) const
683  {
684  CHECK_INTERFACE_IMPLEMENTATION((asImp().template lend<cd,pitype>(level)));
685  return asImp().template lend<cd,pitype>(level);
686  }
687 
689  template<int cd>
690  typename Codim<cd>::template Partition<All_Partition>::LevelIterator lbegin (int level) const
691  {
692  CHECK_INTERFACE_IMPLEMENTATION((asImp().template lbegin<cd>(level)));
693  return asImp().template lbegin<cd>(level);
694  }
695 
697  template<int cd>
698  typename Codim<cd>::template Partition<All_Partition>::LevelIterator lend (int level) const
699  {
700  CHECK_INTERFACE_IMPLEMENTATION((asImp().template lend<cd>(level)));
701  return asImp().template lend<cd>(level);
702  }
703 
705  template<int cd, PartitionIteratorType pitype>
706  typename Codim<cd>::template Partition<pitype>::LeafIterator leafbegin () const
707  {
708  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafbegin<cd,pitype>()));
709  return asImp().template leafbegin<cd,pitype>();
710  }
711 
713  template<int cd, PartitionIteratorType pitype>
714  typename Codim<cd>::template Partition<pitype>::LeafIterator leafend () const
715  {
716  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafend<cd,pitype>()));
717  return asImp().template leafend<cd,pitype>();
718  }
719 
721  template<int cd>
722  typename Codim<cd>::template Partition<All_Partition>::LeafIterator leafbegin () const
723  {
724  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafbegin<cd,All_Partition>()));
725  return asImp().template leafbegin<cd,All_Partition>();
726  }
727 
729  template<int cd>
730  typename Codim<cd>::template Partition<All_Partition>::LeafIterator leafend () const
731  {
732  CHECK_INTERFACE_IMPLEMENTATION((asImp().template leafend<cd,All_Partition>()));
733  return asImp().template leafend<cd,All_Partition>();
734  }
736 
737 
738  //===========================================================
742  //===========================================================
743 
745  const GlobalIdSet &globalIdSet () const
746  {
747  CHECK_INTERFACE_IMPLEMENTATION(asImp().globalIdSet());
748  return asImp().globalIdSet();
749  }
750 
752  const LocalIdSet &localIdSet () const
753  {
754  CHECK_INTERFACE_IMPLEMENTATION(asImp().localIdSet());
755  return asImp().localIdSet();
756  }
757 
759  const LevelIndexSet &levelIndexSet ( int level ) const
760  {
761  CHECK_INTERFACE_IMPLEMENTATION(asImp().levelIndexSet(level));
762  return asImp().levelIndexSet(level);
763  }
764 
766  const LeafIndexSet &leafIndexSet () const
767  {
768  CHECK_INTERFACE_IMPLEMENTATION(asImp().leafIndexSet());
769  return asImp().leafIndexSet();
770  }
772 
773 
774  //===========================================================
778  //===========================================================
779 
785  void globalRefine (int refCount)
786  {
787  CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(asImp().globalRefine(refCount));
788  return;
789  }
790 
798  bool mark( int refCount, const typename Codim<0>::Entity & e )
799  {
800  return asImp().mark(refCount,e);
801  }
802 
809  int getMark(const typename Codim<0>::Entity & e) const
810  {
811  return asImp().getMark(e);
812  }
813 
820  bool preAdapt ()
821  {
822  return asImp().preAdapt();
823  }
824 
839  bool adapt ()
840  {
841  return asImp().adapt();
842  }
843 
848  void postAdapt()
849  {
850  return asImp().postAdapt();
851  }
853 
854 
855  //===========================================================
859  //===========================================================
860 
862  int overlapSize (int level, int codim) const
863  {
864  CHECK_INTERFACE_IMPLEMENTATION(asImp().overlapSize(level,codim));
865  return asImp().overlapSize(level,codim);
866  }
867 
869  int overlapSize (int codim) const
870  {
871  CHECK_INTERFACE_IMPLEMENTATION(asImp().overlapSize(codim));
872  return asImp().overlapSize(codim);
873  }
874 
876  int ghostSize (int level, int codim) const
877  {
878  CHECK_INTERFACE_IMPLEMENTATION(asImp().ghostSize(level,codim));
879  return asImp().ghostSize(level,codim);
880  }
881 
883  int ghostSize (int codim) const
884  {
885  CHECK_INTERFACE_IMPLEMENTATION(asImp().ghostSize(codim));
886  return asImp().ghostSize(codim);
887  }
888 
900  template<class DataHandleImp, class DataTypeImp>
902  {
903  CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().template communicate<DataHandleImp,DataTypeImp>(data,iftype,dir,level)));
904  return;
905  }
906 
917  template<class DataHandleImp, class DataTypeImp>
919  {
920  CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().template communicate<DataHandleImp,DataTypeImp>(data,iftype,dir)));
921  return;
922  }
923 
926  {
927  CHECK_INTERFACE_IMPLEMENTATION(asImp().comm());
928  return asImp().comm();
929  }
931 
935  bool loadBalance()
936  {
937  CHECK_INTERFACE_IMPLEMENTATION(asImp().loadBalance());
938  return asImp().loadBalance();
939  }
940 
948  template<class DataHandle>
949  bool loadBalance (DataHandle& data)
950  {
951  CHECK_INTERFACE_IMPLEMENTATION(asImp().loadBalance(data));
952  return asImp().loadBalance(data);
953  }
954 
956  template < class EntitySeed >
957  typename Codim< EntitySeed :: codimension > :: EntityPointer
958  entityPointer( const EntitySeed& seed ) const
959  {
960  CHECK_INTERFACE_IMPLEMENTATION( asImp().entityPointer( seed ) );
961  return asImp().entityPointer( seed );
962  }
963  protected:
965  GridImp& asImp () {return static_cast<GridImp &> (*this);}
967  const GridImp& asImp () const {return static_cast<const GridImp &>(*this);}
968  };
969 
970 #undef CHECK_INTERFACE_IMPLEMENTATION
971 #undef CHECK_AND_CALL_INTERFACE_IMPLEMENTATION
972 
973 
1012  template<int dim,
1013  int dimworld,
1014  class ct,
1015  class GridFamily>
1016  class GridDefaultImplementation : public Grid <dim,dimworld,ct,GridFamily>
1017  {
1018  typedef typename GridFamily::Traits::Grid GridImp;
1019 
1020  public:
1026  typedef typename GridFamily::Traits Traits;
1027 
1029  template<PartitionIteratorType pitype>
1030  typename Traits::template Partition<pitype>::LevelGridView DUNE_DEPRECATED_MSG("The method levelView has been renamed to levelGridView.")
1031  levelView(int level) const {
1032  typedef typename Traits::template Partition<pitype>::LevelGridView View;
1033  typedef typename View::GridViewImp ViewImp;
1034  return View(ViewImp(asImp(),level));
1035  }
1036 
1038  template<PartitionIteratorType pitype>
1039  typename Traits::template Partition<pitype>::LeafGridView DUNE_DEPRECATED_MSG("The method levelView has been renamed to leafGridView.") leafView() const {
1040  typedef typename Traits::template Partition<pitype>::LeafGridView View;
1041  typedef typename View::GridViewImp ViewImp;
1042  return View(ViewImp(asImp()));
1043  }
1044 
1046  typename Traits::template Partition<All_Partition>::LevelGridView
1047  levelView(int level) const DUNE_DEPRECATED_MSG("The method levelView has been renamed to levelGridView.") {
1048  typedef typename Traits::template Partition<All_Partition>::LevelGridView View;
1049  typedef typename View::GridViewImp ViewImp;
1050  return View(ViewImp(asImp(),level));
1051  }
1052 
1054  typename Traits::template Partition<All_Partition>::LeafGridView
1055  leafView() const DUNE_DEPRECATED_MSG("The method leafView has been renamed to leafGridView.") {
1056  typedef typename Traits::template Partition<All_Partition>::LeafGridView View;
1057  typedef typename View::GridViewImp ViewImp;
1058  return View(ViewImp(asImp()));
1059  }
1060 
1062  template<PartitionIteratorType pitype>
1063  typename Traits::template Partition<pitype>::LevelGridView
1064  levelGridView(int level) const {
1065  typedef typename Traits::template Partition<pitype>::LevelGridView View;
1066  typedef typename View::GridViewImp ViewImp;
1067  return View(ViewImp(asImp(),level));
1068  }
1069 
1071  template<PartitionIteratorType pitype>
1072  typename Traits::template Partition<pitype>::LeafGridView
1073  leafGridView() const {
1074  typedef typename Traits::template Partition<pitype>::LeafGridView View;
1075  typedef typename View::GridViewImp ViewImp;
1076  return View(ViewImp(asImp()));
1077  }
1078 
1080  typename Traits::template Partition<All_Partition>::LevelGridView
1081  levelGridView(int level) const {
1082  typedef typename Traits::template Partition<All_Partition>::LevelGridView View;
1083  typedef typename View::GridViewImp ViewImp;
1084  return View(ViewImp(asImp(),level));
1085  }
1086 
1088  typename Traits::template Partition<All_Partition>::LeafGridView
1089  leafGridView() const {
1090  typedef typename Traits::template Partition<All_Partition>::LeafGridView View;
1091  typedef typename View::GridViewImp ViewImp;
1092  return View(ViewImp(asImp()));
1093  }
1094 
1095  //***************************************************************
1096  // Interface for Adaptation
1097  //***************************************************************
1098 
1121  bool mark( int refCount, const typename Traits :: template Codim<0>::Entity & e )
1122  {
1123  return false;
1124  }
1125 
1133  int getMark ( const typename Traits::template Codim< 0 >::Entity &e ) const
1134  {
1135  return 0;
1136  }
1137 
1145  bool adapt () { return false; }
1146 
1148  bool preAdapt () { return false; }
1149 
1151  void postAdapt() {}
1152 
1154  int ghostSize (int level, int codim) const { return 0; }
1155 
1157  int overlapSize (int level, int codim) const { return 0; }
1158 
1160  int ghostSize (int codim) const { return 0; }
1161 
1163  int overlapSize (int codim) const { return 0; }
1164 
1166  template<class DataHandleImp, class DataTypeImp>
1168  InterfaceType iftype, CommunicationDirection dir, int level) const
1169  {}
1170 
1172  template<class DataHandleImp, class DataTypeImp>
1174  InterfaceType iftype, CommunicationDirection dir) const
1175  {}
1176 
1179  {
1180  return false;
1181  }
1182 
1184  template<class DataHandle>
1185  bool loadBalance (DataHandle& data)
1186  {
1187  return false;
1188  }
1189 
1190  protected:
1197  template<class T>
1199  : public T // implement friendship via subclassing
1200  {
1201  public:
1203  typedef typename T::Implementation ImplementationType;
1204  private:
1205  // constructor in only need to compile
1206  ReturnImplementationType(const T& t) : T(t) {}
1207  };
1208 
1209  template<class T>
1211  : public T // implement friendship via subclassing
1212  {
1213  public:
1214  typedef const typename T::Implementation ImplementationType;
1215  private:
1216  // constructor in only need to compile
1217  ReturnImplementationType(const T& t) : T(t) {}
1218  };
1219 
1221  template <class InterfaceType>
1222  static typename ReturnImplementationType<InterfaceType>::ImplementationType &
1223  getRealImplementation (InterfaceType &i) { return i.impl(); }
1224 
1225  protected:
1227  };
1228 
1242  template <int dim, int dimw, class GridImp,
1243  template<int,int,class> class GeometryImp,
1244  template<int,int,class> class EntityImp,
1245  template<int,class> class EntityPointerImp,
1246  template<int,PartitionIteratorType,class> class LevelIteratorImp,
1247  template<class> class LeafIntersectionImp,
1248  template<class> class LevelIntersectionImp,
1249  template<class> class LeafIntersectionIteratorImp,
1250  template<class> class LevelIntersectionIteratorImp,
1251  template<class> class HierarchicIteratorImp,
1252  template<int,PartitionIteratorType,class> class LeafIteratorImp,
1253  class LevelIndexSetImp, class LeafIndexSetImp,
1254  class GlobalIdSetImp, class GIDType, class LocalIdSetImp, class LIDType, class CCType,
1255  template<class,PartitionIteratorType> class LevelGridViewTraits,
1256  template<class,PartitionIteratorType> class LeafGridViewTraits,
1257  template<int,class> class EntitySeedImp,
1258  template<int,int,class> class LocalGeometryImp = GeometryImp
1259  >
1260  struct GridTraits
1261  {
1263  typedef GridImp Grid;
1264 
1273 
1276 
1281  template <int cd>
1282  struct Codim
1283  {
1284  public:
1285  typedef GeometryImp<dim-cd, dimw, const GridImp> GeometryImpl;
1286  typedef LocalGeometryImp<dim-cd, dim, const GridImp> LocalGeometryImpl;
1288 
1289  typedef Dune::Geometry<dim-cd, dimw, const GridImp, GeometryImp> Geometry;
1291  typedef Dune::Geometry<dim-cd, dim, const GridImp, LocalGeometryImp> LocalGeometry;
1293  // we could - if needed - introduce another struct for dimglobal of Geometry
1295 
1298 
1301 
1306  template <PartitionIteratorType pitype>
1307  struct Partition
1308  {
1313  };
1314 
1317 
1320 
1321  private:
1322  friend class Dune::Entity<cd, dim, const GridImp, EntityImp>;
1323  typedef EntityPointerImp<cd,const GridImp> EntityPointerImpl;
1324  };
1325 
1330  template <PartitionIteratorType pitype>
1331  struct Partition
1332  {
1336 
1340  };
1341 
1350 
1352  typedef CCType CollectiveCommunication;
1353  };
1354 
1355  // Definition of capabilities for the interface class
1356  namespace Capabilities
1357  {
1358  // capabilities for the interface class depend on the implementation
1359  template< int dim, int dimworld, typename ct, class GridFamily , int cdim >
1360  struct hasEntity< GridDefaultImplementation<dim,dimworld,ct,GridFamily>, cdim >
1361  {
1363  typedef typename GridType::Traits::Grid GridImp;
1364  static const bool v = hasEntity<GridImp,cdim>::v;
1365  };
1366 
1367  } // end namespace Capabilities
1368 
1374  template <class InterfaceType>
1376  {
1377  typedef typename InterfaceType::Implementation ImplementationType;
1379  explicit MakeableInterfaceObject ( const ImplementationType &realImp )
1380  : InterfaceType( realImp )
1381  {}
1382  };
1383 }
1384 
1385 #include "geometry.hh"
1386 #include "entity.hh"
1387 #include "entitypointer.hh"
1388 #include "intersection.hh"
1389 #include "intersectioniterator.hh"
1390 #include "entityiterator.hh"
1391 #include "indexidset.hh"
1392 
1393 #endif // #ifndef DUNE_GRID_HH