Dune Core Modules (unstable)
Specialization of the generic GridFactory for UGGrid. More...
#include <dune/grid/uggrid/uggridfactory.hh>
Public Member Functions  
GridFactory ()  
Default constructor.  
GridFactory (UGGrid< dimworld > *grid)  
Constructor for a given grid object. More...  
~GridFactory ()  
Destructor.  
virtual void  insertVertex (const FieldVector< ctype, dimworld > &pos) 
Insert a vertex into the coarse grid.  
virtual void  insertElement (const GeometryType &type, const std::vector< unsigned int > &vertices) 
Insert an element into the coarse grid. More...  
void  insertBoundarySegment (const std::vector< unsigned int > &vertices) 
Method to insert a boundary segment into a coarse grid. More...  
void  insertBoundarySegment (const std::vector< unsigned int > &vertices, const std::shared_ptr< BoundarySegment< dimworld > > &boundarySegment) 
Method to insert an arbitrarily shaped boundary segment into a coarse grid. More...  
virtual std::unique_ptr< UGGrid< dimworld > >  createGrid () 
Finalize grid creation and hand over the grid. More...  
virtual unsigned int  insertionIndex (const typename Codim< 0 >::Entity &entity) const 
Return the number of the element in the order of insertion into the factory. More...  
virtual unsigned int  insertionIndex (const typename Codim< dimension >::Entity &entity) const 
Return the number of the vertex in the order of insertion into the factory. More...  
virtual unsigned int  insertionIndex (const typename UGGrid< dimworld >::LeafIntersection &intersection) const 
Return the number of the intersection in the order of insertion into the factory. More...  
virtual bool  wasInserted (const typename UGGrid< dimworld >::LeafIntersection &intersection) const 
Return true if the intersection has been explicitly inserted into the factory.  
Communication  comm () const 
Return the Communication used by the grid factory. More...  
virtual void  insertVertex (const FieldVector< ctype, dimworld > &pos)=0 
Insert a vertex into the coarse grid.  
virtual void  insertElement (const GeometryType &type, const std::vector< unsigned int > &vertices, std::function< FieldVector< ctype, dimworld >(FieldVector< ctype, dimension >)> elementParametrization) 
Insert a parametrized element into the coarse grid. More...  
virtual void  insertBoundarySegment ([[maybe_unused]] const std::vector< unsigned int > &vertices,[[maybe_unused]] const std::shared_ptr< BoundarySegment< dimension, dimworld > > &boundarySegment) 
insert an arbitrarily shaped boundary segment More...  
virtual unsigned int  insertionIndex ([[maybe_unused]] const typename Codim< 0 >::Entity &entity) const 
obtain an element's insertion index More...  
virtual unsigned int  insertionIndex ([[maybe_unused]] const typename Codim< dimension >::Entity &entity) const 
obtain a vertex' insertion index More...  
virtual unsigned int  insertionIndex ([[maybe_unused]] const typename GridType::LeafIntersection &intersection) const 
obtain a boundary's insertion index More...  
virtual bool  wasInserted ([[maybe_unused]] const typename GridType::LeafIntersection &intersection) const 
determine whether an intersection was inserted More...  
Static Protected Attributes  
constexpr static int  dimworld 
The grid world dimension.  
Detailed Description
template<int dimworld>
class Dune::GridFactory< UGGrid< dimworld > >
Specialization of the generic GridFactory for UGGrid.
If you want to write a routine that reads a grid from some file into a Dune UGGrid object you have to know how to use the UGGrid grid factory. In the following we assume that you have a grid in some file format and an empty UGGrid object, created by one of its constructors. Hence, your file reader method signature may look like this:
UGGrid<3>* readMyFileFormat(const std::string& filename)
Now, in order to create a valid UGGrid object do the following steps:
1) Create a GridFactory Object
Get a new GridFactory object by calling
GridFactory<UGGrid<dim> > factory;
2) Enter the Vertices
Insert the grid vertices by calling
factory.insertVertex(const FieldVector<double,dimworld>& position);
for each vertex. The order of insertion determines the level and leaf indices of your level 0 vertices.
3) Enter the elements
For each element call
factory.insertElement(Dune::GeometryType type, const std::vector<int>& vertices);
The parameters are
 type  The element type. UG supports the types simplex and cube in 2d, and simplex, cube, prism, and pyramid in 3d.
 vertices  The Ids of the vertices of this element.
The numbering of the vertices of each element is expected to follow the DUNE conventions. Refer to the page on reference elements for the details.
4) Parametrized Domains
UGGrid supports parametrized domains. That means that you can provide a smooth description of your grid boundary. The actual grid will always be piecewise linear; however, as you refine, the grid will approach your prescribed boundary. You don't have to do this. If your coarse grid boundary describes your domain well read on at Section 5.
In order to create curved boundary segments, for each segment you have to write a class which implements the correct geometry. These classes are then handed over to the UGGrid object. Boundary segment implementations must be derived from
template <int dimworld> Dune::BoundarySegment
This is an abstract base class which requires you to overload the method
virtual FieldVector< double, dimworld > operator() (const FieldVector< double, dimworld1 > &local)
This methods must compute the world coordinates from the local ones on the boundary segment. Give these classes to your grid factory by calling
factory.insertBoundarySegment(const std::vector<int>& vertices, const BoundarySegment<dimworld> *boundarySegment);
Control over the allocated objects is taken from you, and the grid object will take care of their destruction.
5) Finish construction
To finish off the construction of the UGGrid object call
std::unique_ptr<UGGrid<dim> > grid = factory.createGrid();
This time it is you who gets full responsibility for the allocated object.
Loading a Grid on a Parallel Machine
If you're working on a parallel machine, and you want to set up a parallel grid, proceed as described only on the rank0 process. On the other processes just create a GridFactory and call createGrid() to obtain the grid object. This will create the grid on the master process and set up UG correctly on all other process. Call loadBalance()
to actually distribute the grid.
 Warning
 To use a parametrized boundary on a parallel machine you need to hand over the boundary segments to the grid factory on all processes. This behavior violates the Dune grid interface specification and will be corrected in the future.
Constructor & Destructor Documentation
◆ GridFactory()
Dune::GridFactory< UGGrid< dimworld > >::GridFactory  (  UGGrid< dimworld > *  grid  ) 
Constructor for a given grid object.
If you already have your grid object constructed you can hand it over using this constructor.
If you construct your factory class using this constructor the pointer handed over to you by the method createGrid() is the one you supplied here.
Member Function Documentation
◆ comm()

inline 
Return the Communication used by the grid factory.
Use the Communication available from the grid.
◆ createGrid()

virtual 
Finalize grid creation and hand over the grid.
The receiver takes responsibility of the memory allocated for the grid
Implements Dune::GridFactoryInterface< UGGrid< dimworld > >.
◆ insertBoundarySegment() [1/3]

inlinevirtualinherited 
insert an arbitrarily shaped boundary segment
This method inserts a boundary segment into the coarse grid.
 Parameters

[in] vertices the indices of the vertices of the segment [in] boundarySegment user defined implementation of the boundary segment's geometry
◆ insertBoundarySegment() [2/3]

virtual 
Method to insert a boundary segment into a coarse grid.
Using this method is optional. It only influences the ordering of the segments
 Parameters

vertices The indices of the vertices of the segment
Implements Dune::GridFactoryInterface< UGGrid< dimworld > >.
◆ insertBoundarySegment() [3/3]
void Dune::GridFactory< UGGrid< dimworld > >::insertBoundarySegment  (  const std::vector< unsigned int > &  vertices, 
const std::shared_ptr< BoundarySegment< dimworld > > &  boundarySegment  
) 
Method to insert an arbitrarily shaped boundary segment into a coarse grid.
 Parameters

vertices The indices of the vertices of the segment boundarySegment Class implementing the geometry of the boundary segment.
◆ insertElement() [1/2]

virtual 
Insert an element into the coarse grid.
 Parameters

type The GeometryType of the new element vertices The vertices of the new element, using the DUNE numbering
Implements Dune::GridFactoryInterface< UGGrid< dimworld > >.
◆ insertElement() [2/2]

inlinevirtualinherited 
Insert a parametrized element into the coarse grid.
 Parameters

type The GeometryType of the new element vertices The vertices of the new element, using the DUNE numbering elementParametrization A function prescribing the shape of this element
Make sure the inserted element is not inverted (this holds even for simplices). There are grids that can't handle inverted elements.
◆ insertionIndex() [1/6]

inlinevirtualinherited 
obtain an element's insertion index
Data can be associated to the created macro grid using the insertion index of each entity that has been inserted during the grid creation process.
Between grid construction (createGrid) and the first grid modification, this method allows to obtain this insertion index from the grid factory. This way, data can be stored using the index maps provided by the grid.
 Parameters

[in] entity entity whose insertion index is requested
 Returns
 insertion index of the entity
◆ insertionIndex() [2/6]

inlinevirtualinherited 
obtain a vertex' insertion index
Data can be associated to the created macro grid using the insertion index of each entity that has been inserted during the grid creation process.
Between grid construction (createGrid) and the first grid modification, this method allows to obtain this insertion index from the grid factory. This way, data can be stored using the index maps provided by the grid.
 Parameters

[in] entity entity whose insertion index is requested
 Returns
 insertion index of the entity
◆ insertionIndex() [3/6]

inlinevirtualinherited 
obtain a boundary's insertion index
Data can be associated to the created macro grid using the insertion index of each entity that has been inserted during the grid creation process.
Between grid construction (createGrid) and the first grid modification, this method allows to obtain this insertion index from the grid factory. This way, data can be stored using the index maps provided by the grid.
 Parameters

[in] intersection intersection whose insertion index is requested
 Returns
 insertion index of the intersection
 Note
 The insertion index can only be obtained for boundary intersections that were actually inserted (see also wasInserted).
◆ insertionIndex() [4/6]

inlinevirtual 
Return the number of the element in the order of insertion into the factory.
For UGGrid elements this number is the same as the element level index
◆ insertionIndex() [5/6]

inlinevirtual 
Return the number of the vertex in the order of insertion into the factory.
For UGGrid vertices this number is the same as the vertex level index
◆ insertionIndex() [6/6]

inlinevirtual 
Return the number of the intersection in the order of insertion into the factory.
For UGGrid intersections this number is the same as the boundary segment index
◆ wasInserted()

inlinevirtualinherited 
determine whether an intersection was inserted
This method allows checking whether an intersection was actually inserted into the grid factory.
 Note
 Not all boundary segments need to be inserted into the grid factory.
 This method returns false for all interior intersections
 Parameters

[in] intersection intersection in question
 Returns
 true, if the intersection was inserted
The documentation for this class was generated from the following file:
 dune/grid/uggrid/uggridfactory.hh