11 #include <dune/common/classname.hh>
12 #include <dune/common/parallel/collectivecommunication.hh>
13 #include <dune/common/exceptions.hh>
14 #include <dune/common/parallel/mpihelper.hh>
15 #include <dune/common/deprecated.hh>
21 #if HAVE_UG || DOXYGEN
24 #include <dune/common/parallel/mpicollectivecommunication.hh>
46 #include "uggrid/ugincludes.hh"
51 #include "uggrid/ugwrapper.hh"
56 #include "uggrid/ug_undefs.hh"
76 #include "uggrid/ugincludes.hh"
81 #include "uggrid/ugwrapper.hh"
85 #include "uggrid/ug_undefs.hh"
91 #include "uggrid/uggridgeometry.hh"
92 #include "uggrid/uggridlocalgeometry.hh"
93 #include "uggrid/uggridentity.hh"
94 #include "uggrid/uggridentitypointer.hh"
95 #include "uggrid/uggridentityseed.hh"
96 #include "uggrid/uggridintersections.hh"
97 #include "uggrid/uggridintersectioniterators.hh"
98 #include "uggrid/uggridleveliterator.hh"
99 #include "uggrid/uggridleafiterator.hh"
100 #include "uggrid/uggridhieriterator.hh"
101 #include "uggrid/uggridindexsets.hh"
102 #include <dune/grid/uggrid/uggridviews.hh>
104 #include "uggrid/ugmessagebuffer.hh"
105 #include "uggrid/uglbgatherscatter.hh"
112 template <
class DataHandle,
int Gr
idDim,
int codim>
113 DataHandle *Dune::UGMessageBufferBase<DataHandle,GridDim,codim>::duneDataHandle_ = 0;
115 template <
class DataHandle,
int Gr
idDim,
int codim>
116 int Dune::UGMessageBufferBase<DataHandle,GridDim,codim>::level = -1;
123 class CollectiveCommunication<Dune::UGGrid<dim> > :
124 public CollectiveCommunication< Dune::MPIHelper::MPICommunicator >
126 typedef CollectiveCommunication< Dune::MPIHelper::MPICommunicator > ParentType;
128 CollectiveCommunication()
129 : ParentType(MPIHelper::getCommunicator())
142 UGGridLeafIntersection,
143 UGGridLevelIntersection,
144 UGGridLeafIntersectionIterator,
145 UGGridLevelIntersectionIterator,
146 UGGridHierarchicIterator,
148 UGGridLevelIndexSet< const UGGrid<dim> >,
149 UGGridLeafIndexSet< const UGGrid<dim> >,
150 UGGridIdSet< const UGGrid<dim> >,
151 typename UG_NS<dim>::UG_ID_TYPE,
152 UGGridIdSet< const UGGrid<dim> >,
153 typename UG_NS<dim>::UG_ID_TYPE,
154 CollectiveCommunication<Dune::UGGrid<dim> >,
155 UGGridLevelGridViewTraits,
156 UGGridLeafGridViewTraits,
211 friend class UGGridGeometry<0,dim,const
UGGrid<dim> >;
212 friend class UGGridGeometry<dim,dim,const
UGGrid<dim> >;
213 friend class UGGridGeometry<1,2,const
UGGrid<dim> >;
214 friend class UGGridGeometry<2,3,const
UGGrid<dim> >;
216 friend class UGGridEntity <0,dim,const
UGGrid<dim> >;
217 friend class UGGridEntity <dim,dim,const
UGGrid<dim> >;
218 friend class UGGridHierarchicIterator<const
UGGrid<dim> >;
219 friend class UGGridLeafIntersection<const
UGGrid<dim> >;
220 friend class UGGridLevelIntersection<const
UGGrid<dim> >;
221 friend class UGGridLeafIntersectionIterator<const
UGGrid<dim> >;
222 friend class UGGridLevelIntersectionIterator<const
UGGrid<dim> >;
224 friend class UGGridLevelIndexSet<const
UGGrid<dim> >;
225 friend class UGGridLeafIndexSet<const
UGGrid<dim> >;
226 friend class UGGridIdSet<const
UGGrid<dim> >;
227 template <
class Gr
idImp_, PartitionIteratorType PiType_>
229 template <
class Gr
idImp_, PartitionIteratorType PiType_>
235 friend class UGLBGatherScatter;
238 template <
int codim_, PartitionIteratorType PiType_,
class Gr
idImp_>
240 template <
int codim_, PartitionIteratorType PiType_,
class Gr
idImp_>
242 template <
int codim_,
class Gr
idImp_>
246 static_assert(dim==2 || dim==3,
"Use UGGrid only for 2d and 3d!");
289 template<
int codim, PartitionIteratorType PiType>
293 template<
int codim, PartitionIteratorType PiType>
305 return UGGridLeafIterator<codim,All_Partition, const UGGrid<dim> >();
309 template<
int codim, PartitionIteratorType PiType>
315 template<
int codim, PartitionIteratorType PiType>
317 return UGGridLeafIterator<codim,PiType, const UGGrid<dim> >();
321 template <
typename Seed>
322 DUNE_DEPRECATED_MSG(
"entityPointer() is deprecated and will be removed after the release of dune-grid 2.4. Use entity() instead to directly obtain an Entity object.")
323 typename Traits::template Codim<Seed::codimension>::
EntityPointer
326 enum {codim = Seed::codimension};
331 template <
typename Seed>
332 typename Traits::template Codim<Seed::codimension>::Entity
335 const int codim = Seed::codimension;
341 int size (
int level,
int codim)
const;
365 return numBoundarySegments_;
384 DUNE_THROW(
GridError,
"levelIndexSet of nonexisting level " << level <<
" requested!");
385 return *levelIndexSets_[level];
391 return leafIndexSet_;
409 bool mark(
int refCount,
const typename Traits::template Codim<0>::Entity & e );
467 bool mark(
const typename Traits::template Codim<0>::Entity & e,
468 typename UG_NS<dim>::RefinementRule rule,
472 int getMark(
const typename Traits::template Codim<0>::Entity& e)
const;
492 return (codim==0) ? 1 : 0;
502 return (codim==0) ? 1 : 0;
512 template<
class DataHandle>
520 UGLBGatherScatter::template gather<dim>(this->
leafGridView(), dataHandle);
532 UGLBGatherScatter::template scatter<dim>(this->
leafGridView(), dataHandle);
576 bool loadBalance(
const std::vector<unsigned int>& targetProcessors,
unsigned int fromLevel);
587 template<
class DataHandle>
588 bool loadBalance (
const std::vector<unsigned int>& targetProcessors,
unsigned int fromLevel, DataHandle& dataHandle)
595 UGLBGatherScatter::template gather<dim>(this->
leafGridView(), dataHandle);
607 UGLBGatherScatter::template scatter<dim>(this->
leafGridView(), dataHandle);
624 template<
class DataHandle>
630 for (
int curCodim = 0; curCodim <= dim; ++curCodim) {
631 if (!dataHandle.contains(dim, curCodim))
635 communicateUG_<LevelGridView, DataHandle, 0>(this->
levelGridView(level), level, dataHandle, iftype, dir);
636 else if (curCodim == dim)
637 communicateUG_<LevelGridView, DataHandle, dim>(this->
levelGridView(level), level, dataHandle, iftype, dir);
638 else if (curCodim == dim - 1)
640 else if (curCodim == 1)
641 communicateUG_<LevelGridView, DataHandle, 1>(this->
levelGridView(level), level, dataHandle, iftype, dir);
643 DUNE_THROW(NotImplemented,
644 className(*
this) <<
"::communicate(): Not "
645 "supported for dim " << dim <<
" and codim " << curCodim);
659 template<
class DataHandle>
665 for (
int curCodim = 0; curCodim <= dim; ++curCodim) {
666 if (!dataHandle.contains(dim, curCodim))
670 communicateUG_<LeafGridView, DataHandle, 0>(this->
leafGridView(), level, dataHandle, iftype, dir);
671 else if (curCodim == dim)
672 communicateUG_<LeafGridView, DataHandle, dim>(this->
leafGridView(), level, dataHandle, iftype, dir);
673 else if (curCodim == dim - 1)
675 else if (curCodim == 1)
676 communicateUG_<LeafGridView, DataHandle, 1>(this->
leafGridView(), level, dataHandle, iftype, dir);
678 DUNE_THROW(NotImplemented,
679 className(*
this) <<
"::communicate(): Not "
680 "supported for dim " << dim <<
" and codim " << curCodim);
693 template <
class Gr
idView,
class DataHandle,
int codim>
694 void communicateUG_(
const GridView& gv,
int level,
695 DataHandle &dataHandle,
699 typename UG_NS<dim>::DDD_IF_DIR ugIfDir;
702 ugIfDir = UG_NS<dim>::IF_FORWARD();
704 ugIfDir = UG_NS<dim>::IF_BACKWARD();
706 typedef UGMessageBuffer<DataHandle,dim,codim> UGMsgBuf;
707 UGMsgBuf::duneDataHandle_ = &dataHandle;
709 UGMsgBuf::level = level;
711 std::vector<typename UG_NS<dim>::DDD_IF> ugIfs;
712 findDDDInterfaces_(ugIfs, iftype, codim);
714 unsigned bufSize = UGMsgBuf::ugBufferSize_(gv);
717 for (
unsigned i=0; i < ugIfs.size(); ++i)
718 UG_NS<dim>::DDD_IFOneway(ugIfs[i],
721 &UGMsgBuf::ugGather_,
722 &UGMsgBuf::ugScatter_);
725 void findDDDInterfaces_(std::vector<
typename UG_NS<dim>::DDD_IF > &dddIfaces,
741 dddIfaces.push_back(UG_NS<dim>::ElementVHIF());
748 dddIfaces.push_back(UG_NS<dim>::ElementSymmVHIF());
751 DUNE_THROW(GridError,
752 "Element communication not supported for "
753 "interfaces of type "
757 else if (codim == dim)
762 dddIfaces.push_back(UG_NS<dim>::BorderNodeSymmIF());
765 dddIfaces.push_back(UG_NS<dim>::BorderNodeSymmIF());
766 dddIfaces.push_back(UG_NS<dim>::NodeIF());
769 dddIfaces.push_back(UG_NS<dim>::NodeAllIF());
772 DUNE_THROW(GridError,
773 "Node communication not supported for "
774 "interfaces of type "
778 else if (codim == dim-1)
783 dddIfaces.push_back(UG_NS<dim>::BorderEdgeSymmIF());
786 dddIfaces.push_back(UG_NS<dim>::BorderEdgeSymmIF());
791 dddIfaces.push_back(UG_NS<dim>::EdgeSymmVHIF());
794 DUNE_THROW(GridError,
795 "Edge communication not supported for "
796 "interfaces of type "
806 dddIfaces.push_back(UG_NS<dim>::BorderVectorSymmIF());
809 DUNE_THROW(GridError,
810 "Face communication not supported for "
811 "interfaces of type "
817 DUNE_THROW(GridError,
818 "Communication for codim "
820 <<
" entities is not yet supported "
821 <<
" by the DUNE UGGrid interface!");
847 std::vector<
typename Traits::template Codim<0>::EntityPointer>& childElements,
848 std::vector<unsigned char>& childElementSides)
const;
854 template<
typename T >
855 DUNE_DEPRECATED_MSG(
"This version of getChildrenOfSubface() uses EntityPointer and is deprecated. It will be removed after the release of Dune 2.4. Please use the new version with entities instead.")
856 typename
std::enable_if<
859 typename
UGGrid<dim>::Traits::template Codim<0>::EntityPointer
865 std::vector<typename Traits::template Codim<0>::EntityPointer>& childElements,
866 std::vector<
unsigned char>& childElementSides) const;
880 std::vector<
typename Traits::template Codim<0>::Entity>& childElements,
881 std::vector<unsigned char>& childElementSides)
const;
901 refinementType_ = type;
929 void setPosition(
const typename Traits::template Codim<dim>::EntityPointer& e,
930 const FieldVector<double, dim>& pos);
936 template<
typename T >
937 DUNE_DEPRECATED_MSG(
"This version of setPosition() uses EntityPointer and is deprecated. It will be removed after the release of Dune 2.4. Please use the new version with entities instead.")
938 typename
std::enable_if<
945 const FieldVector<
double, dim>& pos);
952 void setPosition(
const typename Traits::template Codim<dim>::Entity& e,
953 const FieldVector<double, dim>& pos);
965 void saveState(
const std::string& filename)
const;
971 void loadState(
const std::string& filename);
975 typename UG_NS<dim>::MultiGrid* multigrid_;
978 CollectiveCommunication<UGGrid> ccobj_;
985 void setIndices(
bool setLevelZero,
986 std::vector<unsigned int>* nodePermutation);
993 std::vector<shared_ptr<UGGridLevelIndexSet<const UGGrid<dim> > > > levelIndexSets_;
995 UGGridLeafIndexSet<const UGGrid<dim> > leafIndexSet_;
999 UGGridIdSet<const UGGrid<dim> > idSet_;
1014 static int numOfUGGrids;
1021 bool someElementHasBeenMarkedForRefinement_;
1028 bool someElementHasBeenMarkedForCoarsening_;
1034 static unsigned int heapSize_;
1037 std::vector<shared_ptr<BoundarySegment<dim> > > boundarySegments_;
1044 unsigned int numBoundarySegments_;
1048 namespace Capabilities
1068 static const bool v =
true;
1077 static const bool v =
true;
1084 struct DUNE_DEPRECATED_MSG("Capabilities::
isParallel will be removed after dune-grid-2.4.")
isParallel< UGGrid<dim> >
1087 static const bool DUNE_DEPRECATED_MSG(
"Capabilities::isParallel will be removed after dune-grid-2.4.") v =
true;
1089 static const bool DUNE_DEPRECATED_MSG(
"Capabilities::isParallel will be removed after dune-grid-2.4.") v = false;
1099 static const bool v =
true;
1108 static const bool v =
false;
1115 #endif // HAVE_UG || DOXYGEN
1116 #endif // DUNE_UGGRID_HH
Traits::template Partition< pitype >::LevelGridView levelGridView(int level) const
View for a grid level.
Definition: common/grid.hh:1105
Traits::template Codim< codim >::template Partition< PiType >::LeafIterator leafend() const
one past the end of the sequence of leaf entities
Definition: uggrid.hh:316
UGGridFamily< dim >::Traits Traits
Definition: uggrid.hh:261
friend class UGGridLevelGridView
Definition: uggrid.hh:230
Wrapper class for pointers to entities.
Definition: common/entitypointer.hh:112
Definition: common/geometry.hh:24
send interior and border, receive all entities
Definition: gridenums.hh:86
A Traits struct that collects all associated types of one implementation.
Definition: common/grid.hh:437
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
void saveState(const std::string &filename) const
Save entire grid hierarchy to disk.
static void setDefaultHeapSize(unsigned size)
Sets the default heap size.
Definition: uggrid.hh:915
UG::DOUBLE ctype
The type used to store coordinates.
Definition: uggrid.hh:264
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
int size(int level, GeometryType type) const
number of entities per level and geometry type in this process
Definition: uggrid.hh:350
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
void setPosition(const typename Traits::template Codim< dim >::EntityPointer &e, const FieldVector< double, dim > &pos)
Sets a vertex to a new position.
const Traits::LevelIndexSet & levelIndexSet(int level) const
Access to the LevelIndexSets.
Definition: uggrid.hh:381
GridFamily::Traits::template Codim< cd >::Entity Entity
A type that is a model of a Dune::Entity.
Definition: common/grid.hh:446
Include standard header files.
Definition: agrid.hh:59
int size(int codim) const
number of leaf entities per codim in this process
Definition: uggrid.hh:344
communicate as given in InterfaceType
Definition: gridenums.hh:169
bool preAdapt()
returns true, if some elements might be coarsend during grid adaption, here always returns true ...
UGGridFamily< dim > GridFamily
type of the used GridFamily for this grid
Definition: uggrid.hh:258
void communicate(DataHandle &dataHandle, InterfaceType iftype, CommunicationDirection dir) const
The communication interface for all codims on the leaf level.
Definition: uggrid.hh:660
GridFamily::Traits::template Codim< cd >::EntityPointer EntityPointer
A type that is a model of Dune::EntityPointer.
Definition: common/grid.hh:449
send/receive interior and border entities
Definition: gridenums.hh:85
const Traits::LeafIndexSet & leafIndexSet() const
Access to the LeafIndexSet.
Definition: uggrid.hh:389
void loadState(const std::string &filename)
Read entire grid hierarchy from disk.
send all and receive all entities
Definition: gridenums.hh:89
Provide a generic factory class for unstructured grids.
Definition: common/gridfactory.hh:263
void setClosureType(ClosureType type)
Sets the type of grid refinement closure.
Definition: uggrid.hh:905
Traits::template Codim< codim >::LevelIterator lend(int level) const
one past the end on this level
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Mark element for refinement.
friend class UGGridLeafIterator
Definition: uggrid.hh:239
unsigned int overlapSize(int level, int codim) const
Size of the overlap on a given level.
Definition: uggrid.hh:496
friend class UGGridEntityPointer
Definition: uggrid.hh:243
bool loadBalance(const std::vector< unsigned int > &targetProcessors, unsigned int fromLevel, DataHandle &dataHandle)
Distributes the grid over the processes of a parallel machine, and sends data along with it...
Definition: uggrid.hh:588
ClosureType
Decide whether to add a green closure to locally refined grid sections or not.
Definition: uggrid.hh:892
int size(GeometryType type) const
number of leaf entities per geometry type in this process
Definition: uggrid.hh:356
Specialize with 'true' for all codims that a grid implements entities for. (default=false) ...
Definition: common/capabilities.hh:57
void postAdapt()
Clean up refinement markers.
void communicate(DataHandle &dataHandle, InterfaceType iftype, CommunicationDirection dir, int level) const
The communication interface for all codims on a given level.
Definition: uggrid.hh:625
int size(int level, int codim) const
Number of grid entities per level and codim.
Different resources needed by all grid implementations.
Standard red/green refinement.
Definition: uggrid.hh:894
static std::conditional< std::is_reference< InterfaceType >::value, typename std::add_lvalue_reference< typename ReturnImplementationType< typename std::remove_reference< InterfaceType >::type >::ImplementationType >::type, typename std::remove_const< typename ReturnImplementationType< typename std::remove_reference< InterfaceType >::type >::ImplementationType >::type >::type getRealImplementation(InterfaceType &&i)
return real implementation of interface class
Definition: common/grid.hh:1305
unsigned int overlapSize(int codim) const
Size of the overlap on the leaf level.
Definition: uggrid.hh:486
bool loadBalance(DataHandle &dataHandle)
Distributes the grid and some data over the available nodes in a distributed machine.
Definition: uggrid.hh:513
Traits::template Codim< Seed::codimension >::Entity entity(const Seed &seed) const
Create an Entity from an EntitySeed.
Definition: uggrid.hh:333
Traits::template Codim< codim >::LeafIterator leafbegin() const
Iterator to first leaf entity of given codim.
Definition: uggrid.hh:298
Traits::template Codim< Seed::codimension >::EntityPointer entityPointer(const Seed &seed) const
Create an EntityPointer from an EntitySeed.
Definition: uggrid.hh:324
unsigned int ghostSize(int level, int codim) const
Size of the ghost cell layer on a given level.
Definition: uggrid.hh:501
const CollectiveCommunication< UGGrid > & comm() const
Definition: uggrid.hh:686
void setRefinementType(RefinementType type)
Sets the type of grid refinement.
Definition: uggrid.hh:900
New level consists of the refined elements and the unrefined ones, too.
Definition: uggrid.hh:888
The specialization of the generic GridFactory for UGGrid.
unsigned int ghostSize(int codim) const
Size of the ghost cell layer on the leaf level.
Definition: uggrid.hh:491
Id Set Interface.
Definition: common/grid.hh:362
friend class UGGridLevelIterator
Definition: uggrid.hh:241
Specialize with 'true' if implementation guarantees conforming level grids. (default=false) ...
Definition: common/capabilities.hh:98
bool adapt()
Triggers the grid refinement process.
Index Set Interface base class.
Definition: common/grid.hh:361
Grid view abstract base class.
Definition: common/gridview.hh:58
const Traits::GlobalIdSet & globalIdSet() const
Access to the GlobalIdSet.
Definition: uggrid.hh:369
size_t numBoundarySegments() const
Return the number of boundary segments.
Definition: uggrid.hh:362
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:16
GridFamily::Traits::CollectiveCommunication CollectiveCommunication
A type that is a model of Dune::CollectiveCommunication. It provides a portable way for collective co...
Definition: common/grid.hh:545
Definition: uggrid.hh:135
Partition< All_Partition >::LevelGridView LevelGridView
View types for All_Partition.
Definition: common/grid.hh:428
Specialize with 'true' if implementation guarantees a conforming leaf grid. (default=false) ...
Definition: common/capabilities.hh:107
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
Query whether element is marked for refinement.
friend class UGGridLeafGridView
Definition: uggrid.hh:228
UGGrid()
Default constructor.
static const bool v
Definition: common/capabilities.hh:59
Traits::template Partition< pitype >::LeafGridView leafGridView() const
View for the leaf grid.
Definition: common/grid.hh:1115
GridTraits< dim, dim, Dune::UGGrid< dim >, UGGridGeometry, UGGridEntity, UGGridEntityPointer, UGGridLevelIterator, UGGridLeafIntersection, UGGridLevelIntersection, UGGridLeafIntersectionIterator, UGGridLevelIntersectionIterator, UGGridHierarchicIterator, UGGridLeafIterator, UGGridLevelIndexSet< const UGGrid< dim > >, UGGridLeafIndexSet< const UGGrid< dim > >, UGGridIdSet< const UGGrid< dim > >, typename UG_NS< dim >::UG_ID_TYPE, UGGridIdSet< const UGGrid< dim > >, typename UG_NS< dim >::UG_ID_TYPE, CollectiveCommunication< Dune::UGGrid< dim > >, UGGridLevelGridViewTraits, UGGridLeafGridViewTraits, UGGridEntitySeed, UGGridLocalGeometry > Traits
Definition: uggrid.hh:159
const Traits::LocalIdSet & localIdSet() const
Access to the LocalIdSet.
Definition: uggrid.hh:375
Types for GridView.
Definition: common/grid.hh:420
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:168
Specialize with 'true' if implementation supports parallelism. (default=false)
Definition: common/capabilities.hh:68
void getChildrenOfSubface(const typename Traits::template Codim< 0 >::EntityPointer &e, int elementSide, int maxl, std::vector< typename Traits::template Codim< 0 >::EntityPointer > &childElements, std::vector< unsigned char > &childElementSides) const
Rudimentary substitute for a hierarchic iterator on faces.
Traits::template Codim< codim >::template Partition< PiType >::LeafIterator leafbegin() const
Iterator to first leaf entity of given codim.
Definition: uggrid.hh:310
Partition< All_Partition >::LeafGridView LeafGridView
Definition: common/grid.hh:429
Traits::template Codim< codim >::LeafIterator leafend() const
one past the end of the sequence of leaf entities
Definition: uggrid.hh:304
A traits struct that collects all associated types of one grid model.
Definition: common/grid.hh:1343
Base class for grid boundary segments of arbitrary geometry.
Front-end for the grid manager of the finite element toolbox UG.
Definition: uggrid.hh:207
A set of traits classes to store static information about grid implementation.
bool loadBalance()
default implementation of load balance does nothing and returns false
Definition: common/grid.hh:1220
IndexType size(GeometryType type) const
Return total number of entities of given geometry type in entity set .
Definition: indexidset.hh:232
RefinementType
The different forms of grid refinement that UG supports.
Definition: uggrid.hh:884
No closure, results in nonconforming meshes.
Definition: uggrid.hh:896
New level consists only of the refined elements and the closure.
Definition: uggrid.hh:886
void globalRefine(int n)
Does uniform refinement.