3 #ifndef DUNE_STRUCTURED_GRID_FACTORY_HH
4 #define DUNE_STRUCTURED_GRID_FACTORY_HH
16 #include <dune/common/classname.hh>
17 #include <dune/common/exceptions.hh>
18 #include <dune/common/fvector.hh>
27 template <
class Gr
idType>
30 typedef typename GridType::ctype ctype;
32 static const int dim = GridType::dimension;
34 static const int dimworld = GridType::dimensionworld;
38 const FieldVector<ctype,dimworld>& lowerLeft,
39 const FieldVector<ctype,dimworld>& upperRight,
40 const std::array<unsigned int,dim>& vertices)
45 int numVertices = index.
cycle();
48 for (
int i=0; i<numVertices; i++, ++index) {
51 FieldVector<double,dimworld> pos(0);
52 for (
int j=0; j<dim; j++)
53 pos[j] = lowerLeft[j] + index[j] * (upperRight[j]-lowerLeft[j])/(vertices[j]-1);
54 for (
int j=dim; j<dimworld; j++)
55 pos[j] = lowerLeft[j];
65 static std::array<unsigned int, dim> computeUnitOffsets(
const std::array<unsigned int,dim>& vertices)
67 std::array<unsigned int, dim> unitOffsets;
71 for (
int i=1; i<dim; i++)
72 unitOffsets[i] = unitOffsets[i-1] * vertices[i-1];
91 const FieldVector<ctype,dimworld>& lowerLeft,
92 const FieldVector<ctype,dimworld>& upperRight,
93 const std::array<unsigned int,dim>& elements)
95 if (factory.
comm().rank() == 0)
98 std::array<unsigned int,dim> vertices = elements;
99 for(
size_t i = 0; i < vertices.size(); ++i )
103 insertVertices(factory, lowerLeft, upperRight, vertices);
107 std::array<unsigned int, dim> unitOffsets =
108 computeUnitOffsets(vertices);
112 unsigned int nCorners = 1<<dim;
114 std::vector<unsigned int> cornersTemplate(nCorners,0);
116 for (
size_t i=0; i<nCorners; i++)
117 for (
int j=0; j<dim; j++)
119 cornersTemplate[i] += unitOffsets[j];
125 int numElements = index.
cycle();
127 for (
int i=0; i<numElements; i++, ++index) {
130 unsigned int base = 0;
131 for (
int j=0; j<dim; j++)
132 base += index[j] * unitOffsets[j];
135 std::vector<unsigned int> corners = cornersTemplate;
136 for (
size_t j=0; j<corners.size(); j++)
156 const FieldVector<ctype,dimworld>& lowerLeft,
157 const FieldVector<ctype,dimworld>& upperRight,
158 const std::array<unsigned int,dim>& elements)
162 return std::unique_ptr<GridType>(factory.
createGrid());
181 const FieldVector<ctype,dimworld>& lowerLeft,
182 const FieldVector<ctype,dimworld>& upperRight,
183 const std::array<unsigned int,dim>& elements)
185 if(factory.
comm().rank() == 0)
188 std::array<unsigned int,dim> vertices = elements;
189 for (std::size_t i=0; i<vertices.size(); i++)
192 insertVertices(factory, lowerLeft, upperRight, vertices);
196 std::array<unsigned int, dim> unitOffsets =
197 computeUnitOffsets(vertices);
202 size_t cycle = elementsIndex.
cycle();
204 for (
size_t i=0; i<cycle; ++elementsIndex, i++) {
207 unsigned int base = 0;
208 for (
int j=0; j<dim; j++)
209 base += elementsIndex[j] * unitOffsets[j];
212 std::vector<unsigned int> permutation(dim);
213 for (
int j=0; j<dim; j++)
219 std::vector<unsigned int> corners(dim+1);
222 for (
int j=0; j<dim; j++)
224 corners[j] + unitOffsets[permutation[j]];
228 }
while (std::next_permutation(permutation.begin(),
250 const FieldVector<ctype,dimworld>& lowerLeft,
251 const FieldVector<ctype,dimworld>& upperRight,
252 const std::array<unsigned int,dim>& elements)
256 return std::unique_ptr<GridType>(factory.
createGrid());
Implements a multiindex with arbitrary dimension and fixed index ranges This is used by various facto...
Include standard header files.
Definition: agrid.hh:59
Communication comm() const
Return the Communication used by the grid factory.
Definition: common/gridfactory.hh:252
Provide a generic factory class for unstructured grids.
Definition: common/gridfactory.hh:269
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
Insert an element into the coarse grid.
Definition: common/gridfactory.hh:301
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)
Insert a vertex into the coarse grid.
Definition: common/gridfactory.hh:290
virtual ToUniquePtr< GridType > createGrid()
Finalize grid creation and hand over the grid.
Definition: common/gridfactory.hh:327
Definition: multiindex.hh:17
size_t cycle() const
Compute how many times you can call operator++ before getting to (0,...,0) again.
Definition: multiindex.hh:46
Construct structured cube and simplex grids in unstructured grid managers.
Definition: structuredgridfactory.hh:29
static std::unique_ptr< GridType > createSimplexGrid(const FieldVector< ctype, dimworld > &lowerLeft, const FieldVector< ctype, dimworld > &upperRight, const std::array< unsigned int, dim > &elements)
Create a structured simplex grid.
Definition: structuredgridfactory.hh:249
static std::unique_ptr< GridType > createCubeGrid(const FieldVector< ctype, dimworld > &lowerLeft, const FieldVector< ctype, dimworld > &upperRight, const std::array< unsigned int, dim > &elements)
Create a structured cube grid.
Definition: structuredgridfactory.hh:155
static void createSimplexGrid(GridFactory< GridType > &factory, const FieldVector< ctype, dimworld > &lowerLeft, const FieldVector< ctype, dimworld > &upperRight, const std::array< unsigned int, dim > &elements)
insert structured simplex grid into grid factory
Definition: structuredgridfactory.hh:179
static void createCubeGrid(GridFactory< GridType > &factory, const FieldVector< ctype, dimworld > &lowerLeft, const FieldVector< ctype, dimworld > &upperRight, const std::array< unsigned int, dim > &elements)
insert structured cube grid into grid factory
Definition: structuredgridfactory.hh:89
Provide a generic factory class for unstructured grids.