36 if (!(in >> index >> material_id) ||
37 material_id >
static_cast<unsigned>(std::numeric_limits<int>::max()))
41 return std::numeric_limits<int>::max();
44 return static_cast<int>(material_id);
48 const std::vector<MeshLib::Node*>& nodes)
50 std::string elem_type_str;
55 if (!(in >> elem_type_str))
62 auto* idx =
new unsigned[8];
69 for (
int i = 0; i < 2; ++i)
78 for (
unsigned k(0); k < 2; ++k)
80 edge_nodes[k] = nodes[idx[k]];
87 for (
int i = 0; i < 3; ++i)
95 for (
unsigned k(0); k < 3; ++k)
97 tri_nodes[k] = nodes[idx[k]];
104 for (
int i = 0; i < 4; ++i)
112 for (
unsigned k(0); k < 4; ++k)
114 quad_nodes[k] = nodes[idx[k]];
121 for (
int i = 0; i < 4; ++i)
129 for (
unsigned k(0); k < 4; ++k)
131 tet_nodes[k] = nodes[idx[k]];
138 for (
int i = 0; i < 8; ++i)
146 for (
unsigned k(0); k < 8; ++k)
148 hex_nodes[k] = nodes[idx[k]];
155 for (
int i = 0; i < 5; ++i)
163 for (
unsigned k(0); k < 5; ++k)
165 pyramid_nodes[k] = nodes[idx[k]];
172 for (
int i = 0; i < 6; ++i)
180 for (
unsigned k(0); k < 6; ++k)
182 prism_nodes[k] = nodes[idx[k]];
234 const std::size_t ele_vector_size(ele_vec.size());
236 out << ele_vector_size <<
"\n";
237 for (std::size_t i(0); i < ele_vector_size; ++i)
239 auto const& element = *ele_vec[i];
240 if (element.getNumberOfBaseNodes() != element.getNumberOfNodes())
243 "Found high order element in the mesh that is not required by "
244 "OGS 5 input. High order elements are generated in OGS 5 on "
255 out << (*material_ids)[i] <<
" ";
258 unsigned nElemNodes(element.getNumberOfBaseNodes());
259 for (std::size_t j = 0; j < nElemNodes; ++j)
261 out << element.getNode(j)->getID() <<
" ";
279 INFO(
"Reading OGS legacy mesh ... ");
281 std::ifstream in(file_name.c_str(), std::ios::in);
284 WARN(
"MeshIO::loadMeshFromFile() - Could not open file {:s}.",
289 std::string line_string;
290 std::getline(in, line_string);
292 if (line_string.find(
"#FEM_MSH") != std::string::npos)
294 std::vector<MeshLib::Node*> nodes;
295 std::vector<MeshLib::Element*> elements;
296 std::vector<int> materials;
300 std::getline(in, line_string);
303 if (line_string.find(
"#STOP") != std::string::npos)
307 if (line_string.find(
"$NODES") != std::string::npos)
309 std::getline(in, line_string);
311 unsigned nNodes = atoi(line_string.c_str());
312 for (
unsigned i = 0; i < nNodes; ++i)
314 std::getline(in, line_string);
315 std::stringstream iss(line_string);
320 iss >> idx >> x >> y >> z;
322 nodes.push_back(node);
325 if (s.find(
"$AREA") != std::string::npos)
332 else if (line_string.find(
"$ELEMENTS") != std::string::npos)
334 std::getline(in, line_string);
336 unsigned nElements = atoi(line_string.c_str());
337 for (
unsigned i = 0; i < nElements; ++i)
339 std::getline(in, line_string);
340 std::stringstream ss(line_string);
341 materials.push_back(readMaterialID(ss));
345 ERR(
"Reading mesh element {:d} from file '{:s}' "
349 std::for_each(elements.begin(), elements.end(),
350 std::default_delete<MeshLib::Element>());
352 std::for_each(nodes.begin(), nodes.end(),
353 std::default_delete<MeshLib::Node>());
356 elements.push_back(elem);
361 if (elements.empty())
363 ERR(
"MeshIO::loadMeshFromFile() - File did not contain element "
365 for (
auto& node : nodes)
376 auto*
const material_ids =
381 WARN(
"Could not create PropertyVector for MaterialIDs in Mesh.");
385 material_ids->insert(material_ids->end(), materials.cbegin(),
388 INFO(
"\t... finished.");
389 INFO(
"Nr. Nodes: {:d}.", nodes.size());
390 INFO(
"Nr. Elements: {:d}.", elements.size());
404 WARN(
"MeshIO::write(): Cannot write: no mesh object specified.");
414 out << n_nodes <<
"\n";
415 for (std::size_t i(0); i < n_nodes; ++i)
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition of the MeshIO class.
Definition of the Node class.
std::ostringstream out
The stream to write to.
bool write() override
Write mesh to stream.
MeshLib::Mesh * loadMeshFromFile(const std::string &file_name)
Read mesh from file.
const MeshLib::Mesh * _mesh
void setMesh(const MeshLib::Mesh *mesh)
Set mesh for writing.
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
const Node * getNode(std::size_t idx) const
Get the node with the given index.
Properties & getProperties()
std::size_t getNumberOfNodes() const
Get the number of nodes.
bool existsPropertyVector(std::string_view name) const
PropertyVector< T > * createNewPropertyVector(std::string_view name, MeshItemType mesh_item_type, std::size_t n_components=1)
PropertyVector< T > const * getPropertyVector(std::string_view name) const
void trim(std::string &str, char ch)
std::string extractBaseNameWithoutExtension(std::string const &pathname)
MeshElemType String2MeshElemType(const std::string &s)
Given a string of the shortened name of the element type, this returns the corresponding MeshElemType...
TemplateElement< MeshLib::TetRule4 > Tet
TemplateElement< MeshLib::LineRule2 > Line
TemplateElement< MeshLib::QuadRule4 > Quad
TemplateElement< MeshLib::TriRule3 > Tri
TemplateElement< MeshLib::PyramidRule5 > Pyramid
TemplateElement< MeshLib::PrismRule6 > Prism
MeshElemType
Types of mesh elements supported by OpenGeoSys. Values are from VTKCellType enum.
TemplateElement< MeshLib::HexRule8 > Hex
MeshLib::Element * readElement(std::istream &in, const std::vector< MeshLib::Node * > &nodes)
std::string ElemType2StringOutput(const MeshLib::MeshElemType t)
void writeElements(std::vector< MeshLib::Element * > const &ele_vec, MeshLib::PropertyVector< int > const *const material_ids, std::ostream &out)
int readMaterialID(std::istream &in)