Finite Element Domain Decomposition Library
FEDDLib
Loading...
Searching...
No Matches
MeshFileReader.hpp
1#ifndef MeshFileReader_hpp
2#define MeshFileReader_hpp
11
12namespace FEDD {
13
14void meshReadSize ( std::string mesh_filename, int &numNode, int &dim, int &numElement, int &orderElement, int &numSurface, int &orderSurface, int &numEdges, int& orderEdges );
15
16template <typename T>
17int NextEntry(std::string text, std::string delimiter, int fromPos, int &value, T&random){
18
19 int pos = text.find(delimiter,fromPos);
20 value = std::stoi(text.substr(fromPos,pos));
21
22 return pos+1;
23}
24
25template <typename T>
26int NextEntry(std::string text, std::string delimiter, int fromPos, double &value, T&random){
27
28 int pos = text.find(delimiter,fromPos);
29 value = stod(text.substr(fromPos,pos));
30
31 return pos+1;
32}
33
34template <typename T>
35void readEntity( std::ifstream& file, std::string& text, std::vector<T>& entity, std::vector<int>& entityFlags, const int& numEntity, const int& orderEntity, const std::string& delimiter, bool isNode = false, int dim = 3 ){
36
37 T random; // we use this so NextEntry can deduce the type T
38 double dblValue;
39 int intValue;
40 int flag;
41 int pos;
42 int lineLength = text.length();
43 text.erase(0,lineLength);
44 getline ( file, text );
45 lineLength = text.length();
46 text.erase(0,lineLength);
47 if (isNode) {
48 for (int i=0; i<numEntity; i++) {
49 pos = 0;
50 getline ( file, text );
51 lineLength = text.length();
52 for (int j=0; j<orderEntity; j++) {
53 pos = NextEntry(text,delimiter,pos,dblValue,random);
54 if (j<dim)
55 entity[dim*i+j] = dblValue;
56
57 }
58 NextEntry(text,"\n",pos,flag,random);
59 entityFlags[i] = flag;
60 text.erase(0,lineLength);
61 }
62 }
63 else{
64 for (int i=0; i<numEntity; i++) {
65 pos = 0;
66 getline ( file, text );
67 lineLength = text.length();
68 for (int j=0; j<orderEntity; j++) {
69 pos = NextEntry(text,delimiter,pos,intValue,random);
70 entity[orderEntity*i+j] = intValue;
71 }
72 NextEntry(text,"\n",pos,flag,random);
73 entityFlags[i] = flag;
74 text.erase(0,lineLength);
75 }
76 }
77}
78
79template <typename T>
80void meshReadData ( const std::string& mesh_filename, const std::string& type, const std::string& delimiter, const int &dim, const int& numEntity, const int& orderEntity, std::vector<T>& entity, std::vector<int>& entityFlag ){
81
82 std::ifstream file;
83 int lineLength;
84 int pos;
85 std::string text;
86 file.open ( mesh_filename.c_str ( ) );
87 for ( ; ; )
88 {
89 getline ( file, text );
90 lineLength = text.length();
91
92 if (lineLength>6) {
93 if ( !text.compare(0,8,"Vertices") && type == "node" ) {
94 readEntity( file, text, entity, entityFlag, numEntity, orderEntity, delimiter, true, dim);
95 return;
96 }
97 }
98 if (lineLength>4) {
99 if ( !text.compare(0,5,"Edges") &&
100 ( (dim == 2 && type == "surface") || (dim == 3 && type == "line") ) ) {
101 readEntity( file, text, entity, entityFlag, numEntity, orderEntity, delimiter );
102 return;
103 }
104 }
105 if (lineLength>7) {
106 if (!text.compare(0,9,"Triangles") &&
107 ( (dim == 2 && type == "element") || (dim == 3 && type == "surface") ) ) {
108 readEntity( file, text, entity, entityFlag, numEntity, orderEntity, delimiter );
109 return;
110 }
111 }
112 if (lineLength>9) {
113 if (!text.compare(0,10,"Tetrahedra") &&
114 ( dim == 3 && type == "element" ) ) {
115 readEntity( file, text, entity, entityFlag, numEntity, orderEntity, delimiter );
116 return;
117 }
118 }
119 text.erase(0,lineLength);
120 if ( file.eof ( ) )
121 break;
122 }
123
124 file.close ( );
125 return;
126}
127
128}
129#endif
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5