20 #include "libmesh/tetgen_io.h" 22 #include "libmesh/cell_tet4.h" 23 #include "libmesh/cell_tet10.h" 24 #include "libmesh/mesh_base.h" 25 #include "libmesh/utility.h" 43 std::string name_node, name_ele, dummy;
49 libmesh_error_msg(
"Cannot open dimension 3 mesh file when configured without 3D support.");
59 std::size_t position = dummy.rfind(
".node");
60 name_ele = dummy.replace(position, 5,
".ele");
66 std::size_t position = dummy.rfind(
".ele");
67 name_node = dummy.replace(position, 4,
".node");
70 libmesh_error_msg(
"ERROR: Unrecognized file name: " <<
name);
75 std::ifstream node_stream (name_node.c_str());
76 std::ifstream ele_stream (name_ele.c_str());
78 libmesh_error_msg_if(!node_stream.good() || !ele_stream.good(),
79 "Error while opening either " 84 libMesh::out<<
"TetGenIO found the tetgen files to read " <<std::endl;
92 libMesh::out<<
"TetGenIO read in nodes and elements " <<std::endl;
98 std::istream & ele_stream)
123 unsigned int dimension=0, nAttributes=0, BoundaryMarkers=0;
131 unsigned int node_lab=0;
136 for (
unsigned i=0; i<nAttributes; ++i)
145 std::array<Real, 3> xyz;
147 node_stream >> node_lab
153 for (
unsigned int j=0; j<nAttributes; j++)
158 if (BoundaryMarkers == 1)
159 node_stream >> dummy;
169 libmesh_assert_equal_to(xyz[1], 0);
174 libmesh_assert_equal_to(xyz[2], 0);
195 unsigned int element_lab=0,
n_nodes=0, region_attribute=0;
208 libmesh_error_msg_if(region_attribute > 1,
209 "Invalid region_attribute " << region_attribute <<
" specified in .ele file.");
213 static const unsigned int assign_elm_nodes[] = {0, 1, 2, 3, 9, 7, 4, 5, 8, 6};
220 Elem * elem =
nullptr;
229 libmesh_error_msg(
"Elements with " <<
n_nodes <<
230 " nodes are not supported in the LibMesh tetgen module.");
233 libmesh_assert_equal_to (elem->n_nodes(),
n_nodes);
239 ele_stream >> element_lab;
245 ele_stream >> node_label;
248 elem->set_node(assign_elm_nodes[j],
253 if (region_attribute)
256 ele_stream >> region;
260 elem->subdomain_id() = cast_int<subdomain_id_type>(region);
276 "ERROR: Unrecognized file name: " << fname);
279 std::ofstream out_stream (fname.c_str());
282 if (!out_stream.good())
283 libmesh_file_error(fname.c_str());
291 out_stream <<
"# poly file output generated by libmesh\n" 296 out_stream << v <<
" " 304 out_stream <<
"# Facets:\n" 307 for (
const auto & elem :
mesh.active_element_ptr_range())
308 out_stream <<
"1\n3 " 310 << elem->node_id(0) <<
" " 311 << elem->node_id(1) <<
" " 312 << elem->node_id(2) <<
"\n";
317 out_stream <<
"\n\n# end of file\n";
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
dof_id_type _num_elements
total number of elements.
std::map< dof_id_type, dof_id_type > _assign_nodes
stores new positions of nodes.
virtual void read(const std::string &) override
This method implements reading a mesh from a specified file in TetGen format.
This is the base class from which all geometric element types are derived.
This class defines an abstract interface for Mesh output.
The libMesh namespace provides an interface to certain functionality in the library.
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
Add a new Node at Point p to the end of the vertex array, with processor_id procid.
This is the MeshBase class.
const dof_id_type n_nodes
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
bool contains(std::string_view superstring, std::string_view substring)
Look for a substring within a string.
dof_id_type _num_nodes
total number of nodes.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static std::unique_ptr< Elem > build_with_id(const ElemType type, dof_id_type id)
Calls the build() method above with a nullptr parent, and additionally sets the newly-created Elem's ...
void read_nodes_and_elem(std::istream &node_stream, std::istream &ele_stream)
Reads a mesh (nodes & elements) from the file provided through node_stream and ele_stream.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
virtual void write(const std::string &) override
This method implements writing a mesh to a specified ".poly" file.
virtual const Point & point(const dof_id_type i) const =0
void node_in(std::istream &node_stream)
Method reads nodes from node_stream and stores them in vector<Node *> nodes in the order they come in...
void element_in(std::istream &ele_stream)
Method reads elements and stores them in vector<Elem *> elements in the same order as they come in...
virtual dof_id_type n_elem() const =0
virtual const Node * node_ptr(const dof_id_type i) const =0
std::vector< std::vector< Real > > node_attributes
Data structure to hold node attributes read in from file.
A Point defines a location in LIBMESH_DIM dimensional Real space.
virtual dof_id_type n_nodes() const =0