Skip to content
Snippets Groups Projects
Commit b507753f authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Begin rework of Gmsh reader [ci-skip]

- use PEGTL to parse file structure
- improve reading performance (mmap+std::from_chars)
- better error handling

* multiple references per entity still buggy
* remains to add 4.1 format support
parent f133ada4
No related branches found
No related tags found
No related merge requests found
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <language/utils/CheckpointResumeRepository.hpp> #include <language/utils/CheckpointResumeRepository.hpp>
#include <language/utils/TypeDescriptor.hpp> #include <language/utils/TypeDescriptor.hpp>
#include <mesh/Connectivity.hpp> #include <mesh/Connectivity.hpp>
#include <mesh/GmshReader.hpp>
#include <mesh/ItemArrayVariant.hpp> #include <mesh/ItemArrayVariant.hpp>
#include <mesh/ItemValueVariant.hpp> #include <mesh/ItemValueVariant.hpp>
#include <mesh/Mesh.hpp> #include <mesh/Mesh.hpp>
......
This diff is collapsed.
...@@ -6,10 +6,7 @@ ...@@ -6,10 +6,7 @@
#include <mesh/RefId.hpp> #include <mesh/RefId.hpp>
#include <utils/Array.hpp> #include <utils/Array.hpp>
#include <array>
#include <fstream>
#include <map> #include <map>
#include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -70,52 +67,62 @@ class GmshReader : public MeshBuilderBase ...@@ -70,52 +67,62 @@ class GmshReader : public MeshBuilderBase
struct GmshData struct GmshData
{ {
struct Format
{
double version = 0;
bool binary = false;
int size_of_int = 0;
bool littleendian = false; //
};
Format format;
/** /**
* Gmsh format provides a numbered, none ordrered and none dense * Gmsh format provides a numbered, none ordrered and none dense
* vertices list, this stores the number of read vertices. * vertices list, this stores the number of read vertices.
*/ */
std::vector<int> __verticesNumbers; Array<int> __verticesNumbers;
Array<R3> __vertices; Array<R3> __vertices;
using Point = unsigned int; using Point = unsigned int;
Array<Point> __points; Array<Point> __points;
std::vector<int> __points_ref; std::vector<std::vector<int>> __points_ref;
std::vector<int> __points_number; std::vector<int> __points_number;
using Edge = TinyVector<2, unsigned int>; using Edge = TinyVector<2, unsigned int>;
Array<Edge> __edges; Array<Edge> __edges;
std::vector<int> __edges_ref; std::vector<std::vector<int>> __edges_ref;
std::vector<int> __edges_number; std::vector<int> __edges_number;
using Triangle = TinyVector<3, unsigned int>; using Triangle = TinyVector<3, unsigned int>;
Array<Triangle> __triangles; Array<Triangle> __triangles;
std::vector<int> __triangles_ref; std::vector<std::vector<int>> __triangles_ref;
std::vector<int> __triangles_number; std::vector<int> __triangles_number;
using Quadrangle = TinyVector<4, unsigned int>; using Quadrangle = TinyVector<4, unsigned int>;
Array<Quadrangle> __quadrangles; Array<Quadrangle> __quadrangles;
std::vector<int> __quadrangles_ref; std::vector<std::vector<int>> __quadrangles_ref;
std::vector<int> __quadrangles_number; std::vector<int> __quadrangles_number;
using Tetrahedron = TinyVector<4, unsigned int>; using Tetrahedron = TinyVector<4, unsigned int>;
Array<Tetrahedron> __tetrahedra; Array<Tetrahedron> __tetrahedra;
std::vector<int> __tetrahedra_ref; std::vector<std::vector<int>> __tetrahedra_ref;
std::vector<int> __tetrahedra_number; std::vector<int> __tetrahedra_number;
using Pyramid = TinyVector<5, unsigned int>; using Pyramid = TinyVector<5, unsigned int>;
Array<Pyramid> __pyramids; Array<Pyramid> __pyramids;
std::vector<int> __pyramids_ref; std::vector<std::vector<int>> __pyramids_ref;
std::vector<int> __pyramids_number; std::vector<int> __pyramids_number;
using Prism = TinyVector<6, unsigned int>; using Prism = TinyVector<6, unsigned int>;
Array<Prism> __prisms; Array<Prism> __prisms;
std::vector<int> __prisms_ref; std::vector<std::vector<int>> __prisms_ref;
std::vector<int> __prisms_number; std::vector<int> __prisms_number;
using Hexahedron = TinyVector<8, unsigned int>; using Hexahedron = TinyVector<8, unsigned int>;
Array<Hexahedron> __hexahedra; Array<Hexahedron> __hexahedra;
std::vector<int> __hexahedra_ref; std::vector<std::vector<int>> __hexahedra_ref;
std::vector<int> __hexahedra_number; std::vector<int> __hexahedra_number;
/** /**
...@@ -137,7 +144,7 @@ class GmshReader : public MeshBuilderBase ...@@ -137,7 +144,7 @@ class GmshReader : public MeshBuilderBase
/** /**
* References * References
*/ */
std::vector<int> __references; std::vector<std::vector<int>> __references;
/** /**
* References * References
...@@ -148,138 +155,16 @@ class GmshReader : public MeshBuilderBase ...@@ -148,138 +155,16 @@ class GmshReader : public MeshBuilderBase
}; };
private: private:
std::ifstream m_fin;
const std::string m_filename; const std::string m_filename;
GmshData m_mesh_data; GmshData m_mesh_data;
/**
* Stores the number of nodes associated to each primitive
*
*/
std::vector<int> __numberOfPrimitiveNodes;
/**
* Array of boolean describing gmsh supported primitives by ff3d
*
*/
std::array<bool, 15> __supportedPrimitives;
/**
* Primitives names according to there number
*
*/
std::map<int, std::string> __primitivesNames;
int
_getInteger()
{
int i;
m_fin >> i;
return i;
}
double
_getReal()
{
double d;
m_fin >> d;
return d;
}
/** /**
* Adapts gmsh data to ff3d's structures * Adapts gmsh data to ff3d's structures
* *
*/ */
void __proceedData(); void __proceedData();
/**
* Reads data in format 2.2
*
*/
void __readGmshFormat2_2();
/**
* List of allowed keyword in mesh file
*
*/
enum KeywordType
{
// gmsh 2.2
MESHFORMAT,
ENDMESHFORMAT,
NODES,
ENDNODES,
ELEMENTS,
ENDELEMENTS,
PHYSICALNAMES,
ENDPHYSICALNAMES,
PERIODIC,
ENDPERIODIC,
Unknown,
EndOfFile
};
/**
* List of known keywords
*
*/
using KeywordList = std::map<std::string, int>;
KeywordList __keywordList; /**< The keyword list */
/**
* Type for keyword
*
*/
using Keyword = std::pair<std::string, int>;
/**
* Skips next comments if exists
*
*/
void __skipComments();
/**
* Reads the next keyword and returns its token
*
* @return KeywordToken
*/
Keyword __nextKeyword();
/**
* get list of vertices
*
*/
void __getVertices();
/**
* Read list of vertices
*
*/
void __readVertices();
/**
* Read all elements in format 2.0
*
*/
void __readElements2_2();
/**
* Reads physical names
*
*/
void __readPhysicalNames2_2();
/**
* Reads periodic
*
*/
void __readPeriodic2_2();
public: public:
GmshReader(const std::string& filename); GmshReader(const std::string& filename);
~GmshReader() = default; ~GmshReader() = default;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment