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());