1 #ifndef DUNE_STARCD_READER_HH
2 #define DUNE_STARCD_READER_HH
4 #include <dune/common/exceptions.hh>
5 #include <dune/geometry/type.hh>
45 template <
class Gr
idType>
55 static GridType*
read(
const std::string& fileName,
bool verbose =
true)
58 const int dim = GridType::dimension;
62 DUNE_THROW(Dune::NotImplemented,
63 "Reading Star-CD format is not implemented for dimension " << dim);
69 std::string vertexFileName = fileName +
".vrt";
72 std::ifstream vertexFile(vertexFileName.c_str());
74 DUNE_THROW(Dune::IOError,
"Could not open " << vertexFileName);
78 int numberOfVertices = 0;
79 while (vertexFile >> dummyIdx) {
82 Dune::FieldVector<double,dim> position;
84 for (
int k = 0; k < dim; k++)
85 vertexFile >> position[k];
90 std::cout << numberOfVertices <<
" vertices read." << std::endl;
93 std::string elementFileName = fileName +
".cel";
96 std::ifstream elementFile(elementFileName.c_str());
98 DUNE_THROW(Dune::IOError,
"Could not open " << elementFileName);
101 int numberOfElements = 0;
102 int numberOfSimplices = 0;
103 int numberOfPyramids = 0;
104 int numberOfPrisms = 0;
105 int numberOfCubes = 0;;
106 int maxNumberOfVertices = (int)pow(2, dim);
108 while (elementFile >> dummyIdx) {
109 std::vector<unsigned int> vertices(maxNumberOfVertices);
110 for (
int k = 0; k < maxNumberOfVertices; k++)
111 elementFile >> vertices[k];
114 elementFile >> boundaryId;
116 int volumeOrSurface[2];
117 elementFile >> volumeOrSurface[0] >> volumeOrSurface[1];
119 if (volumeOrSurface[0] == isVolume) {
122 if (vertices[2] == vertices[3]) {
123 if (vertices[4] == vertices[5]) {
125 std::vector<unsigned int> simplexVertices(4);
126 for (
int k = 0; k < 3; k++)
127 simplexVertices[k] = vertices[k] - 1;
128 simplexVertices[3] = vertices[4] - 1;
133 std::vector<unsigned int> prismVertices(6);
134 for (
int k = 0; k < 3; k++)
135 prismVertices[k] = vertices[k] - 1;
136 for (
int k = 3; k < 6; k++)
137 prismVertices[k] = vertices[k+1] - 1;
142 if (vertices[4] == vertices[5]) {
144 std::vector<unsigned int> pyramidVertices(5);
145 for (
int k = 0; k < 5; k++)
146 pyramidVertices[k] = vertices[k] - 1;
151 std::vector<unsigned int> cubeVertices(8);
152 for (
int k = 0; k < 8; k++)
153 cubeVertices[k] = vertices[k] - 1;
154 std::swap(cubeVertices[2], cubeVertices[3]);
155 std::swap(cubeVertices[6], cubeVertices[7]);
162 std::cout << numberOfElements <<
" elements read: "
163 << numberOfSimplices <<
" simplices, " << numberOfPyramids <<
" pyramids, "
164 << numberOfPrisms <<
" prisms, " << numberOfCubes <<
" cubes." << std::endl;
168 std::cout <<
"Starting createGrid() ... " << std::flush;