LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
Loading...
Searching...
No Matches
gmsh_file_v4.cc
1
9#include "gmsh_file_v4.h"
10
11namespace lf::io {
12
14std::ostream& operator<<(std::ostream& stream, GMshFileV4::ElementType et) {
15 switch (et) {
16 default:
17 break;
19 stream << "EDGE2";
20 break;
22 stream << "TRIA3";
23 break;
25 stream << "QUAD4";
26 break;
28 stream << "TET4";
29 break;
31 stream << "HEX8";
32 break;
34 stream << "PRISM6";
35 break;
37 stream << "PYRAMID5";
38 break;
40 stream << "EDGE3";
41 break;
43 stream << "TRIA6";
44 break;
46 stream << "QUAD9";
47 break;
49 stream << "TET10";
50 break;
52 stream << "HEX27";
53 break;
55 stream << "PRISM18";
56 break;
58 stream << "PYRAMID14";
59 break;
61 stream << "POINT";
62 break;
64 stream << "QUAD8";
65 break;
67 stream << "HEX20";
68 break;
70 stream << "PRISM15";
71 break;
73 stream << "PYRAMID13";
74 break;
76 stream << "TRIA9";
77 break;
79 stream << "TRIA10";
80 break;
82 stream << "TRIA12";
83 break;
85 stream << "TRIA15";
86 break;
88 stream << "TRIA15_5";
89 break;
91 stream << "TRIA21";
92 break;
94 stream << "EDGE4";
95 break;
97 stream << "EDGE5";
98 break;
100 stream << "EDGE6";
101 break;
103 stream << "TET20";
104 break;
106 stream << "TET35";
107 break;
109 stream << "TET56";
110 break;
112 stream << "HEX64";
113 break;
115 stream << "HEX125";
116 break;
117 }
118 return stream;
119}
120
123 switch (et) {
124 default:
125 break;
127 return 2;
129 return 3;
132 return 4;
134 return 8;
136 return 6;
138 return 5;
140 return 3;
142 return 6;
144 return 9;
146 return 10;
148 return 27;
150 return 18;
152 return 14;
154 return 1;
156 return 8;
158 return 20;
160 return 15;
162 return 13;
164 return 9;
166 return 10;
168 return 12;
171 return 15;
173 return 21;
175 return 4;
177 return 5;
179 return 6;
181 return 20;
183 return 35;
185 return 56;
187 return 64;
189 return 125;
190 }
191 LF_VERIFY_MSG(false, "unknown Gmsh element type");
192 // Make compiler happy:
193 return 0;
194}
195
197 switch (et) {
199 return base::RefEl::kPoint();
200
206 return base::RefEl::kSegment();
207
216 return base::RefEl::kTria();
217
221 return base::RefEl::kQuad();
222
239 default:
240 LF_VERIFY_MSG(
241 false, "Reference element not supported for GmshElement type " << et);
242 }
243}
244
247 switch (et) {
249 return 0;
255 return 1;
267 return 2;
284 return 3;
285 default:
286 LF_VERIFY_MSG(false, "Unknown GmshElement Type.");
287 }
288 // Make compiler happy:
289 return -1;
290}
291
292namespace detail {
293
294// defined in gmsh_file_v4_text.cc
295bool ParseGmshFileV4Text(std::string::const_iterator begin,
296 std::string::const_iterator end, GMshFileV4* result);
297
298bool ParseGmshFileV4Binary(std::string::const_iterator begin,
299 std::string::const_iterator end, int one,
300 GMshFileV4* result);
301
302} // namespace detail
303
304GMshFileV4 ReadGmshFileV4(std::string::const_iterator begin,
305 std::string::const_iterator end,
306 const std::string& version, bool is_binary,
307 int size_t_size, int one,
308 const std::string& filename) {
309 LF_VERIFY_MSG(version == "4.1", "Only version 4.1 is supported so far");
310 LF_VERIFY_MSG(size_t_size == sizeof(std::size_t),
311 "size of size_t must be " << sizeof(std::size_t));
312
313 GMshFileV4 result;
314 result.version_number = version;
315 result.is_binary = is_binary;
316 result.size_t_size = size_t_size;
317
318 bool succesful = false;
319 if (!is_binary) {
320 succesful = detail::ParseGmshFileV4Text(begin, end, &result);
321 } else {
322 succesful = detail::ParseGmshFileV4Binary(begin, end, one, &result);
323 }
324
325 LF_VERIFY_MSG(succesful, "Could not parse file " << filename);
326 // LF_VERIFY_MSG(iter == end, "Could not parse all of file " << filename);
327
328 // transpose all periodic matrices because they are read in column-first mode
329 // but gmsh writes them in row-first mode
330 for (auto& p : result.periodic_links) {
331 if (p.affine_transform) {
332 p.affine_transform->transposeInPlace();
333 }
334 }
335
336 return result;
337}
338
339} // namespace lf::io
Represents a reference element with all its properties.
Definition ref_el.h:109
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
Definition ref_el.h:153
static constexpr RefEl kPoint()
Returns the (0-dimensional) reference point.
Definition ref_el.h:144
static constexpr RefEl kTria()
Returns the reference triangle.
Definition ref_el.h:161
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
Definition ref_el.h:169
Mesh input (from file) and output (in various formats) facilities.
GMshFileV4 ReadGmshFileV4(std::string::const_iterator begin, std::string::const_iterator end, const std::string &version, bool is_binary, int size_t_size, int one, const std::string &filename)
Read a GmshFile with format 4 and return it as an in-memory struct.
int DimOf(GMshFileV2::ElementType et)
Dimension of the GmshElement type.
base::RefEl RefElOf(GMshFileV2::ElementType et)
Reference element type of a GmshElementType.
std::ostream & operator<<(std::ostream &stream, GMshFileV2::ElementType et)
Output the element type onto the console:
size_type NumNodes(GMshFileV2::ElementType et)
Number of nodes that this element type has.
A representation of a .msh file (V4) in a c++ data structure.
std::vector< PeriodicLink > periodic_links
ElementType
All possible element types (see GMSH documentation)
std::string version_number
The version of GMSH of the msh file, equals usually 4.1.
int size_t_size
how many bytes is a size_t?
bool is_binary
Is it a binary file?