17 #include "mesh_reader_h1d_xml.h"
25 MeshReaderH1DXML::MeshReaderH1DXML()
29 MeshReaderH1DXML::~MeshReaderH1DXML()
33 void MeshReaderH1DXML::load(
const char *filename, MeshSharedPtr mesh)
41 parsing_flags = xml_schema::flags::dont_validate;
43 std::auto_ptr<XMLMesh1D::mesh> parsed_xml_mesh(
XMLMesh1D::mesh_(filename, parsing_flags));
46 unsigned int variables_count = parsed_xml_mesh->variables().present() ? parsed_xml_mesh->variables()->var().size() : 0;
47 std::map<std::string, double> variables;
48 for (
unsigned int variables_i = 0; variables_i < variables_count; variables_i++)
50 variables.insert(std::pair<std::string, double>((
std::string)parsed_xml_mesh->variables()->var().at(variables_i).name(), (
double&&)parsed_xml_mesh->variables()->var().at(variables_i).value()));
52 variables.insert(std::pair<std::string, double>((
std::string)parsed_xml_mesh->variables()->var().at(variables_i).name(), parsed_xml_mesh->variables()->var().at(variables_i).value()));
56 int vertices_count = parsed_xml_mesh->v().size();
59 int size = HashTable::H2D_DEFAULT_HASH_SIZE;
60 while (size < 8 * vertices_count)
64 double a = std::numeric_limits<double>::infinity();
65 double b = -std::numeric_limits<double>::infinity();
68 for (
int vertices_i = 0; vertices_i < 2 * vertices_count; vertices_i++)
70 Node* node = mesh->nodes.add();
71 assert(node->
id == vertices_i);
72 node->
ref = TOP_LEVEL_REF;
73 node->
type = HERMES_TYPE_VERTEX;
75 node->
p1 = node->p2 = -1;
79 std::string x = parsed_xml_mesh->v().at(vertices_i % vertices_count).x();
84 if (variables.find(x) != variables.end())
86 x_value = variables.find(x)->second;
92 if (std::strtod(x.c_str(),
nullptr) != 0.0)
93 x_value = std::strtod(x.c_str(),
nullptr);
97 int dot_position = strchr(x.c_str(),
'.') ==
nullptr ? -1 : strchr(x.c_str(),
'.') - x.c_str();
98 for (
int i = 0; i < dot_position; i++)
99 if (strncmp(x.c_str() + i,
"0", 1) != 0)
100 this->warn(
"Probably wrong syntax in the x coordinate of vertex no. %i.", vertices_i % vertices_count + 1);
101 for (
int i = dot_position + 1; i < x.length(); i++)
102 if (strncmp(x.c_str() + i,
"0", 1) != 0)
103 this->warn(
"Probably wrong syntax in the x coordinate of vertex no. %i.", vertices_i % vertices_count + 1);
104 x_value = std::strtod(x.c_str(),
nullptr);
114 if (vertices_i < vertices_count)
119 mesh->ntopvert = 2 * vertices_count;
122 for_all_nodes(node, mesh)
126 node->y = (b - a) / 100;
129 mesh->nbase = mesh->nactive = mesh->ninitial = vertices_count - 1;
132 for (
int element_i = 0; element_i < vertices_count - 1; element_i++)
134 mesh->element_markers_conversion.insert_marker(
"H1DMarker");
137 if (parsed_xml_mesh->v().at(element_i % vertices_count).m().present())
139 mesh->element_markers_conversion.insert_marker(parsed_xml_mesh->v().at(element_i % vertices_count).m().get());
140 element_marker = mesh->element_markers_conversion.get_internal_marker(parsed_xml_mesh->v().at(element_i % vertices_count).m().get()).marker;
143 element_marker = mesh->element_markers_conversion.get_internal_marker(
"H1DMarker").
marker;
145 e = mesh->create_quad(element_marker,
146 &mesh->nodes[element_i],
147 &mesh->nodes[element_i + 1],
148 &mesh->nodes[element_i + vertices_count + 1],
149 &mesh->nodes[element_i + vertices_count],
152 mesh->boundary_markers_conversion.insert_marker(
"Unused");
154 node = mesh->peek_edge_node(element_i, element_i + 1);
156 node->
marker = mesh->boundary_markers_conversion.get_internal_marker(
"Unused").marker;
157 mesh->nodes[element_i].bnd = 1;
158 mesh->nodes[element_i + 1].bnd = 1;
160 node = mesh->peek_edge_node(vertices_count + element_i, vertices_count + element_i + 1);
162 node->
marker = mesh->boundary_markers_conversion.get_internal_marker(
"Unused").marker;
163 mesh->nodes[vertices_count + element_i].bnd = 1;
164 mesh->nodes[vertices_count + element_i + 1].bnd = 1;
170 int v2_1 = vertices_count;
171 int v1_2 = vertices_count - 1;
172 int v2_2 = 2 * vertices_count - 1;
174 en = mesh->peek_edge_node(v1_1, v2_1);
177 mesh->boundary_markers_conversion.insert_marker(
"Left");
178 int marker = mesh->boundary_markers_conversion.get_internal_marker(
"Left").
marker;
182 en = mesh->peek_edge_node(v1_2, v2_2);
185 mesh->boundary_markers_conversion.insert_marker(
"Right");
186 marker = mesh->boundary_markers_conversion.get_internal_marker(
"Right").
marker;
190 mesh->nodes[v1_1].bnd = 1;
191 mesh->nodes[v2_1].bnd = 1;
193 mesh->nodes[v1_2].bnd = 1;
194 mesh->nodes[v2_2].bnd = 1;
198 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
202 void MeshReaderH1DXML::save(
const char *filename, MeshSharedPtr mesh)
double x
vertex node coordinates
unsigned type
0 = vertex node; 1 = edge node
Node * next_hash
next node in hash synonym list
::xsd::cxx::tree::flags flags
Parsing and serialization flags.
Stores one element of a mesh.
::xsd::cxx::tree::exception< char > exception
Root of the C++/Tree exception hierarchy.
Stores one node of a mesh.
::std::auto_ptr< ::XMLMesh1D::mesh > mesh_(const ::std::string &uri,::xml_schema::flags f=0, const ::xml_schema::properties &p=::xml_schema::properties())
Parse a URI or a local file.
unsigned bnd
1 = boundary node; 0 = inner node
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
unsigned ref
the number of elements using the node