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