17 #include "mesh_reader_h1d_xml.h"
27 MeshReaderH1DXML::MeshReaderH1DXML()
31 MeshReaderH1DXML::~MeshReaderH1DXML()
35 bool MeshReaderH1DXML::load(
const char *filename,
Mesh *mesh)
43 parsing_flags = xml_schema::flags::dont_validate;
45 std::auto_ptr<XMLMesh1D::mesh> parsed_xml_mesh(
XMLMesh1D::mesh_(filename, parsing_flags));
48 unsigned int variables_count = parsed_xml_mesh->variables().present() ? parsed_xml_mesh->variables()->var().size() : 0;
49 std::map<std::string, double> variables;
50 for (
unsigned int variables_i = 0; variables_i < variables_count; variables_i++)
52 variables.insert(std::make_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()));
54 variables.insert(std::make_pair<std::string, double>((
std::string)parsed_xml_mesh->variables()->var().at(variables_i).name(), parsed_xml_mesh->variables()->var().at(variables_i).value()));
58 int vertices_count = parsed_xml_mesh->v().size();
61 int size = HashTable::H2D_DEFAULT_HASH_SIZE;
62 while (size < 8 * vertices_count)
66 double a = std::numeric_limits<double>::infinity();
67 double b = -std::numeric_limits<double>::infinity();
70 for (
int vertices_i = 0; vertices_i < 2 * vertices_count; vertices_i++)
73 assert(node->
id == vertices_i);
74 node->
ref = TOP_LEVEL_REF;
75 node->
type = HERMES_TYPE_VERTEX;
77 node->p1 = node->
p2 = -1;
81 std::string x = parsed_xml_mesh->v().at(vertices_i % vertices_count).x();
86 if(variables.find(x) != variables.end())
88 x_value = variables.find(x)->second;
94 if(std::strtod(x.c_str(), NULL) != 0.0)
95 x_value = std::strtod(x.c_str(), NULL);
99 int dot_position = strchr(x.c_str(),
'.') == NULL ? -1 : strchr(x.c_str(),
'.') - x.c_str();
100 for(
int i = 0; i < dot_position; i++)
101 if(strncmp(x.c_str() + i,
"0", 1) != 0)
102 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertices_i % vertices_count + 1);
103 for(
int i = dot_position + 1; i < x.length(); i++)
104 if(strncmp(x.c_str() + i,
"0", 1) != 0)
105 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertices_i % vertices_count + 1);
106 x_value = std::strtod(x.c_str(), NULL);
116 if(vertices_i < vertices_count)
121 mesh->ntopvert = 2 * vertices_count;
124 for_all_nodes(node, mesh)
128 node->
y = (b-a) / 100;
131 mesh->nbase = mesh->nactive = mesh->ninitial = vertices_count - 1;
134 for (
int element_i = 0; element_i < vertices_count - 1; element_i++)
136 mesh->element_markers_conversion.insert_marker(mesh->element_markers_conversion.min_marker_unused,
"H1DMarker");
139 if(parsed_xml_mesh->v().at(element_i % vertices_count).m().present())
141 mesh->element_markers_conversion.insert_marker(mesh->element_markers_conversion.min_marker_unused, parsed_xml_mesh->v().at(element_i % vertices_count).m().get());
142 element_marker = mesh->element_markers_conversion.get_internal_marker(parsed_xml_mesh->v().at(element_i % vertices_count).m().get()).marker;
145 element_marker = mesh->element_markers_conversion.get_internal_marker(
"H1DMarker").marker;
147 e = mesh->create_quad(element_marker,
148 &mesh->
nodes[element_i],
149 &mesh->
nodes[element_i + 1],
150 &mesh->
nodes[element_i + vertices_count + 1],
151 &mesh->
nodes[element_i + vertices_count],
154 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused,
"Unused");
158 node->
marker = mesh->boundary_markers_conversion.get_internal_marker(
"Unused").marker;
159 mesh->
nodes[element_i].bnd = 1;
160 mesh->
nodes[element_i + 1].bnd = 1;
162 node = mesh->
peek_edge_node(vertices_count + element_i, vertices_count + element_i + 1);
164 node->
marker = mesh->boundary_markers_conversion.get_internal_marker(
"Unused").marker;
165 mesh->
nodes[vertices_count + element_i].bnd = 1;
166 mesh->
nodes[vertices_count + element_i + 1].bnd = 1;
172 int v2_1 = vertices_count;
173 int v1_2 = vertices_count - 1;
174 int v2_2 = 2 * vertices_count - 1;
179 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused,
"Left");
180 int marker = mesh->boundary_markers_conversion.get_internal_marker(
"Left").marker;
187 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused,
"Right");
188 marker = mesh->boundary_markers_conversion.get_internal_marker(
"Right").marker;
192 mesh->
nodes[v1_1].bnd = 1;
193 mesh->
nodes[v2_1].bnd = 1;
195 mesh->
nodes[v1_2].bnd = 1;
196 mesh->
nodes[v2_2].bnd = 1;
200 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
204 bool MeshReaderH1DXML::save(
const char *filename,
Mesh *mesh)