65 static std::unique_ptr<GridType>
read(
const std::string& fileName,
bool verbose =
true)
68 const int dim = GridType::dimension;
72 DUNE_THROW(Dune::NotImplemented,
73 "Reading Star-CD format is not implemented for dimension " << dim);
79 std::string vertexFileName = fileName +
".vrt";
82 std::ifstream vertexFile(vertexFileName.c_str());
84 DUNE_THROW(Dune::IOError,
"Could not open " << vertexFileName);
88 int numberOfVertices = 0;
89 while (vertexFile >> dummyIdx) {
92 Dune::FieldVector<double,dim> position;
94 for (
int k = 0; k < dim; k++)
95 vertexFile >> position[k];
100 std::cout << numberOfVertices <<
" vertices read." << std::endl;
103 std::string elementFileName = fileName +
".cel";
106 std::ifstream elementFile(elementFileName.c_str());
108 DUNE_THROW(Dune::IOError,
"Could not open " << elementFileName);
111 int numberOfElements = 0;
112 int numberOfSimplices = 0;
113 int numberOfPyramids = 0;
114 int numberOfPrisms = 0;
115 int numberOfCubes = 0;;
116 int maxNumberOfVertices = (int)pow(2, dim);
118 while (elementFile >> dummyIdx) {
119 std::vector<unsigned int> vertices(maxNumberOfVertices);
120 for (
int k = 0; k < maxNumberOfVertices; k++)
121 elementFile >> vertices[k];
124 elementFile >> boundaryId;
126 int volumeOrSurface[2];
127 elementFile >> volumeOrSurface[0] >> volumeOrSurface[1];
129 if (volumeOrSurface[0] == isVolume) {
132 if (vertices[2] == vertices[3]) {
133 if (vertices[4] == vertices[5]) {
135 std::vector<unsigned int> simplexVertices(4);
136 for (
int k = 0; k < 3; k++)
137 simplexVertices[k] = vertices[k] - 1;
138 simplexVertices[3] = vertices[4] - 1;
139 factory.
insertElement(Dune::GeometryTypes::tetrahedron, simplexVertices);
143 std::vector<unsigned int> prismVertices(6);
144 for (
int k = 0; k < 3; k++)
145 prismVertices[k] = vertices[k] - 1;
146 for (
int k = 3; k < 6; k++)
147 prismVertices[k] = vertices[k+1] - 1;
148 factory.
insertElement(Dune::GeometryTypes::prism, prismVertices);
152 if (vertices[4] == vertices[5]) {
154 std::vector<unsigned int> pyramidVertices(5);
155 for (
int k = 0; k < 5; k++)
156 pyramidVertices[k] = vertices[k] - 1;
157 factory.
insertElement(Dune::GeometryTypes::pyramid, pyramidVertices);
161 std::vector<unsigned int> cubeVertices(8);
162 for (
int k = 0; k < 8; k++)
163 cubeVertices[k] = vertices[k] - 1;
164 std::swap(cubeVertices[2], cubeVertices[3]);
165 std::swap(cubeVertices[6], cubeVertices[7]);
166 factory.
insertElement(Dune::GeometryTypes::hexahedron, cubeVertices);
172 std::cout << numberOfElements <<
" elements read: "
173 << numberOfSimplices <<
" simplices, " << numberOfPyramids <<
" pyramids, "
174 << numberOfPrisms <<
" prisms, " << numberOfCubes <<
" cubes." << std::endl;
178 std::cout <<
"Starting createGrid() ... " << std::flush;