18 #include "mesh_reader_h2d_xml.h"
27 MeshReaderH2DXML::MeshReaderH2DXML()
31 MeshReaderH2DXML::~MeshReaderH2DXML()
35 bool MeshReaderH2DXML::load(
const char *filename,
Mesh *mesh)
39 std::map<unsigned int, unsigned int> vertex_is;
45 parsing_flags = xml_schema::flags::dont_validate;
47 std::auto_ptr<XMLMesh::mesh> parsed_xml_mesh(
XMLMesh::mesh_(filename, parsing_flags));
49 if(!load(parsed_xml_mesh, mesh, vertex_is))
53 if(parsed_xml_mesh->refinements().present() && parsed_xml_mesh->refinements()->ref().size() > 0)
56 for (
unsigned int i = 0; i < parsed_xml_mesh->refinements()->ref().size(); i++)
58 int element_id = parsed_xml_mesh->refinements()->ref().at(i).element_id();
59 int refinement_type = parsed_xml_mesh->refinements()->ref().at(i).refinement_type();
60 if(refinement_type == -1)
66 mesh->initial_single_check();
70 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
74 bool MeshReaderH2DXML::save(
const char *filename,
Mesh *mesh)
81 for (
int i = 0; i < mesh->ntopvert; i++)
83 std::ostringstream x_stream;
84 x_stream << mesh->
nodes[i].x;
86 std::ostringstream y_stream;
87 y_stream << mesh->
nodes[i].y;
89 vertices.
v().push_back(std::auto_ptr<XMLMesh::v>(
new XMLMesh::v(x_stream.str(), y_stream.str(), i)));
99 elements.
el().push_back(
XMLMesh::t_t(e->
vn[0]->
id, e->
vn[1]->
id, e->
vn[2]->
id, mesh->get_element_markers_conversion().get_user_marker(e->
marker).marker.c_str()));
101 elements.
el().push_back(
XMLMesh::q_t(e->
vn[0]->
id, e->
vn[1]->
id, e->
vn[2]->
id, mesh->get_element_markers_conversion().get_user_marker(e->
marker).marker.c_str(), e->
vn[3]->
id));
105 for_all_base_elements(e, mesh)
106 for (
unsigned i = 0; i < e->get_nvert(); i++)
107 if(mesh->get_base_edge_node(e, i)->
marker)
108 edges.
ed().push_back(
XMLMesh::ed(e->
vn[i]->
id, e->
vn[e->
next_vert(i)]->
id, mesh->boundary_markers_conversion.get_user_marker(mesh->get_base_edge_node(e, i)->
marker).marker.c_str()));
112 for_all_base_elements(e, mesh)
114 for (
unsigned i = 0; i < e->get_nvert(); i++)
115 if(e->
cm->nurbs[i] != NULL && !is_twin_nurbs(e, i))
116 if(e->
cm->nurbs[i]->
arc)
123 for(
unsigned int refinement_i = 0; refinement_i < mesh->
refinements.size(); refinement_i++)
127 xmlmesh.
curves().set(curves);
131 mesh_schema_location.append(
"/mesh_h2d_xml.xsd");
137 std::ofstream out(filename);
139 XMLMesh::mesh_(out, xmlmesh, namespace_info_map,
"UTF-8", parsing_flags);
145 bool MeshReaderH2DXML::load(
const char *filename, Hermes::vector<Mesh *> meshes)
147 for(
unsigned int meshes_i = 0; meshes_i < meshes.size(); meshes_i++)
149 meshes.at(meshes_i)->free();
158 parsing_flags = xml_schema::flags::dont_validate;
162 int* vertex_is =
new int[H2D_MAX_NODE_ID];
163 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
166 int* element_is =
new int[H2D_MAX_NODE_ID];
167 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
170 int* edge_is =
new int[H2D_MAX_NODE_ID];
171 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
174 if(!load(parsed_xml_domain, &global_mesh, vertex_is, element_is, edge_is))
177 int max_vertex_i = -1;
178 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
179 if(vertex_is[i] > max_vertex_i)
180 max_vertex_i = vertex_is[i];
181 int max_element_i = -1;
182 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
183 if(element_is[i] > max_element_i)
184 max_element_i = element_is[i];
186 for(
int i = 0; i < H2D_MAX_NODE_ID; i++)
187 if(edge_is[i] > max_edge_i)
188 max_edge_i = edge_is[i];
191 unsigned int subdomains_count = parsed_xml_domain->subdomains().subdomain().size();
192 if(subdomains_count != meshes.size())
193 throw Hermes::Exceptions::MeshLoadFailureException(
"Number of subdomains( = %u) does not equal the number of provided meshes in the vector( = %u).", subdomains_count, meshes.size());
195 for(
unsigned int subdomains_i = 0; subdomains_i < subdomains_count; subdomains_i++)
197 for (
int element_i = 0; element_i < parsed_xml_domain->elements().el().size(); element_i++)
202 unsigned int begin = element->
m().find_first_not_of(
" \t\n");
203 unsigned int end = element->
m().find_last_not_of(
" \t\n");
204 element->
m().erase(end + 1, element->
m().length());
205 element->
m().erase(0, begin);
207 meshes[subdomains_i]->element_markers_conversion.insert_marker(meshes[subdomains_i]->element_markers_conversion.min_marker_unused, element->
m());
209 for(
unsigned int edge_i = 0; edge_i < parsed_xml_domain->edges().ed().size(); edge_i++)
214 unsigned int begin = edge->
m().find_first_not_of(
" \t\n");
215 unsigned int end = edge->
m().find_last_not_of(
" \t\n");
216 edge->
m().erase(end + 1, edge->
m().length());
217 edge->
m().erase(0, begin);
219 meshes[subdomains_i]->boundary_markers_conversion.insert_marker(meshes[subdomains_i]->boundary_markers_conversion.min_marker_unused, edge->
m());
223 for(
unsigned int subdomains_i = 0; subdomains_i < subdomains_count; subdomains_i++)
225 unsigned int vertex_number_count = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).vertices().present() ? parsed_xml_domain->subdomains().subdomain().at(subdomains_i).vertices()->i().size() : 0;
226 unsigned int element_number_count = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).elements().present() ? parsed_xml_domain->subdomains().subdomain().at(subdomains_i).elements()->i().size() : 0;
227 unsigned int boundary_edge_number_count = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).boundary_edges().present() ? parsed_xml_domain->subdomains().subdomain().at(subdomains_i).boundary_edges()->i().size() : 0;
228 unsigned int inner_edge_number_count = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).inner_edges().present() ? parsed_xml_domain->subdomains().subdomain().at(subdomains_i).inner_edges()->i().size() : 0;
231 if(element_number_count == 0 || element_number_count == parsed_xml_domain->elements().el().size())
233 meshes[subdomains_i]->copy(&global_mesh);
235 if(parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements().present() && parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().size() > 0)
238 for (
unsigned int i = 0; i < parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().size(); i++)
240 int element_id = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().at(i).element_id();
241 int refinement_type = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().at(i).refinement_type();
242 if(refinement_type == -1)
243 meshes[subdomains_i]->unrefine_element_id(element_id);
245 meshes[subdomains_i]->refine_element_id(element_id, refinement_type);
252 unsigned int variables_count = parsed_xml_domain->variables().present() ? parsed_xml_domain->variables()->var().size() : 0;
254 std::map<std::string, double> variables;
255 for (
unsigned int variables_i = 0; variables_i < variables_count; variables_i++)
257 variables.insert(std::make_pair<std::string, double>((
std::string)parsed_xml_domain->variables()->var().at(variables_i).name(), (
double&&)parsed_xml_domain->variables()->var().at(variables_i).value()));
259 variables.insert(std::make_pair<std::string, double>((
std::string)parsed_xml_domain->variables()->var().at(variables_i).name(), parsed_xml_domain->variables()->var().at(variables_i).value()));
263 std::map<unsigned int, unsigned int> vertex_vertex_numbers;
266 int size = HashTable::H2D_DEFAULT_HASH_SIZE;
267 while (size < 8 * vertex_number_count)
269 meshes[subdomains_i]->init(size);
272 if(vertex_number_count == 0)
273 vertex_number_count = parsed_xml_domain->vertices().v().size();
274 for (
unsigned int vertex_numbers_i = 0; vertex_numbers_i < vertex_number_count; vertex_numbers_i++)
276 unsigned int vertex_number;
277 if(vertex_number_count == parsed_xml_domain->vertices().v().size())
278 vertex_number = vertex_is[vertex_numbers_i];
281 vertex_number = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).vertices()->i().at(vertex_numbers_i);
282 if(vertex_number > max_vertex_i)
283 throw Exceptions::MeshLoadFailureException(
"Wrong vertex number:%u in subdomain %u.", vertex_number, subdomains_i);
286 vertex_vertex_numbers.insert(std::pair<unsigned int, unsigned int>(vertex_number, vertex_numbers_i));
287 Node* node = meshes[subdomains_i]->nodes.add();
288 assert(node->
id == vertex_numbers_i);
289 node->
ref = TOP_LEVEL_REF;
290 node->
type = HERMES_TYPE_VERTEX;
292 node->p1 = node->
p2 = -1;
296 std::string x = parsed_xml_domain->vertices().v().at(vertex_number).x();
297 std::string y = parsed_xml_domain->vertices().v().at(vertex_number).y();
302 bool x_found =
false;
303 bool y_found =
false;
304 if(variables.find(x) != variables.end())
306 x_value = variables.find(x)->second;
309 if(variables.find(y) != variables.end())
311 y_value = variables.find(y)->second;
317 if(std::strtod(x.c_str(), NULL) != 0.0)
318 x_value = std::strtod(x.c_str(), NULL);
322 int dot_position = strchr(x.c_str(),
'.') == NULL ? -1 : strchr(x.c_str(),
'.') - x.c_str();
323 for(
int i = 0; i < dot_position; i++)
324 if(strncmp(x.c_str() + i,
"0", 1) != 0)
325 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_number + 1);
326 for(
int i = dot_position + 1; i < x.length(); i++)
327 if(strncmp(x.c_str() + i,
"0", 1) != 0)
328 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_number + 1);
329 x_value = std::strtod(x.c_str(), NULL);
333 if(std::strtod(y.c_str(), NULL) != 0.0)
334 y_value = std::strtod(y.c_str(), NULL);
338 int dot_position = strchr(y.c_str(),
'.') == NULL ? -1 : strchr(y.c_str(),
'.') - y.c_str();
339 for(
int i = 0; i < dot_position; i++)
340 if(strncmp(y.c_str() + i,
"0", 1) != 0)
341 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_number + 1);
342 for(
int i = dot_position + 1; i < y.length(); i++)
343 if(strncmp(y.c_str() + i,
"0", 1) != 0)
344 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_number + 1);
345 y_value = std::strtod(y.c_str(), NULL);
352 meshes[subdomains_i]->ntopvert = vertex_number_count;
355 unsigned int element_count = parsed_xml_domain->elements().el().size();
356 meshes[subdomains_i]->nbase = element_count;
357 meshes[subdomains_i]->nactive = meshes[subdomains_i]->ninitial = element_number_count;
360 int* elements_existing =
new int[element_count];
361 for(
int i = 0; i < element_count; i++)
362 elements_existing[i] = -1;
363 for (
int element_number_i = 0; element_number_i < element_number_count; element_number_i++)
365 int elementI = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).elements()->i().at(element_number_i);
366 if(elementI > max_element_i)
367 throw Exceptions::MeshLoadFailureException(
"Wrong element number:%i in subdomain %u.", elementI, subdomains_i);
369 elements_existing[element_is[parsed_xml_domain->subdomains().subdomain().at(subdomains_i).elements()->i().at(element_number_i)]] = elementI;
371 for (
int element_i = 0; element_i < element_count; element_i++)
374 if(element_number_count == 0)
377 found = elements_existing[element_i] != -1;
381 meshes[subdomains_i]->elements.skip_slot();
386 for(
int searched_element_i = 0; searched_element_i < element_count; searched_element_i++)
388 element = &parsed_xml_domain->elements().el().at(searched_element_i);
389 if(element->
i() == elements_existing[element_i])
395 throw Exceptions::MeshLoadFailureException(
"Element number wrong in the mesh file.");
400 e = meshes[subdomains_i]->create_quad(meshes[subdomains_i]->element_markers_conversion.get_internal_marker(element->
m()).marker,
401 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_q->
v1())->second],
402 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_q->
v2())->second],
403 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_q->
v3())->second],
404 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_q->
v4())->second],
407 e = meshes[subdomains_i]->create_triangle(meshes[subdomains_i]->element_markers_conversion.get_internal_marker(element->
m()).marker,
408 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_t->
v1())->second],
409 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_t->
v2())->second],
410 &meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(el_t->
v3())->second],
415 if(boundary_edge_number_count == 0)
416 boundary_edge_number_count = parsed_xml_domain->edges().ed().size();
418 for (
int boundary_edge_number_i = 0; boundary_edge_number_i < boundary_edge_number_count; boundary_edge_number_i++)
421 for(
unsigned int to_find_i = 0; to_find_i < parsed_xml_domain->edges().ed().size(); to_find_i++)
423 if(boundary_edge_number_count != parsed_xml_domain->edges().ed().size())
425 if(parsed_xml_domain->edges().ed().at(to_find_i).i() == parsed_xml_domain->subdomains().subdomain().at(subdomains_i).boundary_edges()->i().at(boundary_edge_number_i))
427 edge = &parsed_xml_domain->edges().
ed().at(to_find_i);
433 if(parsed_xml_domain->edges().ed().at(to_find_i).i() == edge_is[boundary_edge_number_i])
435 edge = &parsed_xml_domain->edges().
ed().at(to_find_i);
442 throw Exceptions::MeshLoadFailureException(
"Wrong boundary-edge number:%i in subdomain %u.", parsed_xml_domain->subdomains().subdomain().at(subdomains_i).boundary_edges()->i().at(boundary_edge_number_i), subdomains_i);
444 Node* en = meshes[subdomains_i]->peek_edge_node(vertex_vertex_numbers.find(edge->
v1())->second, vertex_vertex_numbers.find(edge->
v2())->second);
446 throw Hermes::Exceptions::MeshLoadFailureException(
"Boundary data error (edge %i does not exist).", boundary_edge_number_i);
448 en->marker = meshes[subdomains_i]->boundary_markers_conversion.get_internal_marker(edge->
m()).marker;
450 meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(edge->
v1())->second].bnd = 1;
451 meshes[subdomains_i]->nodes[vertex_vertex_numbers.find(edge->
v2())->second].bnd = 1;
456 for (
int inner_edge_number_i = 0; inner_edge_number_i < inner_edge_number_count; inner_edge_number_i++)
460 for(
unsigned int to_find_i = 0; to_find_i < parsed_xml_domain->edges().ed().size(); to_find_i++)
462 if(parsed_xml_domain->edges().ed().at(to_find_i).i() == parsed_xml_domain->subdomains().subdomain().at(subdomains_i).inner_edges()->i().at(inner_edge_number_i))
464 edge = &parsed_xml_domain->edges().
ed().at(to_find_i);
470 throw Exceptions::MeshLoadFailureException(
"Wrong inner-edge number:%i in subdomain %u.", parsed_xml_domain->subdomains().subdomain().at(subdomains_i).boundary_edges()->i().at(inner_edge_number_i), subdomains_i);
472 Node* en = meshes[subdomains_i]->peek_edge_node(vertex_vertex_numbers.find(edge->
v1())->second, vertex_vertex_numbers.find(edge->
v2())->second);
474 throw Hermes::Exceptions::MeshLoadFailureException(
"Inner data error (edge %i does not exist).", inner_edge_number_i);
476 en->marker = meshes[subdomains_i]->boundary_markers_conversion.get_internal_marker(edge->
m()).marker;
482 unsigned int arc_count = parsed_xml_domain->curves().present() ? parsed_xml_domain->curves()->arc().size() : 0;
483 unsigned int nurbs_count = parsed_xml_domain->curves().present() ? parsed_xml_domain->curves()->NURBS().size() : 0;
485 for (
unsigned int curves_i = 0; curves_i < arc_count + nurbs_count; curves_i++)
493 if(curves_i < arc_count)
495 if(vertex_vertex_numbers.find(parsed_xml_domain->curves()->arc().at(curves_i).v1()) == vertex_vertex_numbers.end() ||
496 vertex_vertex_numbers.find(parsed_xml_domain->curves()->arc().at(curves_i).v2()) == vertex_vertex_numbers.end())
501 p1 = vertex_vertex_numbers.find(parsed_xml_domain->curves()->arc().at(curves_i).v1())->second;
502 p2 = vertex_vertex_numbers.find(parsed_xml_domain->curves()->arc().at(curves_i).v2())->second;
504 nurbs = load_arc(meshes[subdomains_i], parsed_xml_domain, curves_i, &en, p1, p2,
true);
511 if(vertex_vertex_numbers.find(parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v1()) == vertex_vertex_numbers.end() ||
512 vertex_vertex_numbers.find(parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v2()) == vertex_vertex_numbers.end())
517 p1 = vertex_vertex_numbers.find(parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v1())->second;
518 p2 = vertex_vertex_numbers.find(parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v2())->second;
520 nurbs = load_nurbs(meshes[subdomains_i], parsed_xml_domain, curves_i - arc_count, &en, p1, p2,
true);
527 for (
unsigned int node_i = 0; node_i < 2; node_i++)
530 if(e == NULL)
continue;
541 for (
unsigned j = 0; j < e->get_nvert(); j++)
542 if(e->
en[j] == en) { idx = j;
break; }
545 if(e->
vn[idx]->
id == p1)
547 e->
cm->nurbs[idx] = nurbs;
552 Nurbs* nurbs_rev = meshes[subdomains_i]->reverse_nurbs(nurbs);
553 e->
cm->nurbs[idx] = nurbs_rev;
557 if(!nurbs->
ref)
delete nurbs;
561 for_all_elements(e, meshes[subdomains_i])
563 e->
cm->update_refmap_coeffs(e);
566 if(parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements().present() && parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().size() > 0)
569 for (
unsigned int i = 0; i < parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().size(); i++)
571 int element_id = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().at(i).element_id();
572 int refinement_type = parsed_xml_domain->subdomains().subdomain().at(subdomains_i).refinements()->ref().at(i).refinement_type();
573 if(refinement_type == -1)
574 meshes[subdomains_i]->unrefine_element_id(element_id);
576 meshes[subdomains_i]->refine_element_id(element_id, refinement_type);
580 delete [] elements_existing;
582 meshes[subdomains_i]->seq = g_mesh_seq++;
583 meshes[subdomains_i]->initial_single_check();
588 delete [] element_is;
596 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
600 bool MeshReaderH2DXML::save(
const char *filename, Hermes::vector<Mesh *> meshes)
603 std::map<std::pair<double, double>,
unsigned int> points_to_vertices;
605 std::map<std::pair<unsigned int, unsigned int>,
unsigned int> vertices_to_boundaries;
607 std::map<std::pair<unsigned int, unsigned int>,
bool> vertices_to_curves;
618 bool* baseElementsSaved =
new bool[meshes[0]->get_num_base_elements()];
619 memset(baseElementsSaved, 0,
sizeof(
bool) * meshes[0]->get_num_base_elements());
624 for(
unsigned int meshes_i = 0; meshes_i < meshes.size(); meshes_i++)
626 bool hasAllElements = (meshes[meshes_i]->get_num_used_base_elements() == meshes[meshes_i]->get_num_base_elements());
635 std::map<unsigned int, unsigned int> vertices_to_vertices;
642 for (
int i = 0; i < meshes[meshes_i]->ntopvert; i++)
647 std::map<std::pair<double, double>,
unsigned int>::iterator it = points_to_vertices.find(std::pair<double, double>(meshes[meshes_i]->nodes[i].x, meshes[meshes_i]->nodes[i].y));
648 if(it != points_to_vertices.end())
649 vertices_to_vertices.insert(std::pair<unsigned int, unsigned int>(i, it->second));
652 int new_i = points_to_vertices.size();
653 vertices_to_vertices.insert(std::pair<unsigned int, unsigned int>(i, new_i));
654 points_to_vertices.insert(std::pair<std::pair<double, double>,
unsigned int>(std::pair<double, double>(meshes[meshes_i]->nodes[i].x, meshes[meshes_i]->nodes[i].y), points_to_vertices.size()));
655 std::ostringstream x_stream;
656 x_stream << meshes[meshes_i]->nodes[i].x;
658 std::ostringstream y_stream;
659 y_stream << meshes[meshes_i]->nodes[i].y;
661 vertices.
v().push_back(std::auto_ptr<XMLMesh::v>(
new XMLMesh::v(x_stream.str(), y_stream.str(), new_i)));
664 subdomain.
vertices()->i().push_back(vertices_to_vertices.find(i)->second);
669 for (
int i = 0; i < meshes[meshes_i]->get_num_base_elements(); i++)
671 e = &(meshes[meshes_i]->elements[i]);
674 if(!baseElementsSaved[e->
id])
678 elements.
el().push_back(
XMLSubdomains::t_t(vertices_to_vertices.find(e->
vn[0]->
id)->second, vertices_to_vertices.find(e->
vn[1]->
id)->second, vertices_to_vertices.find(e->
vn[2]->
id)->second, meshes[meshes_i]->get_element_markers_conversion().get_user_marker(e->
marker).marker.c_str(), e->
id));
682 elements.
el().push_back(
XMLSubdomains::q_t(vertices_to_vertices.find(e->
vn[0]->
id)->second, vertices_to_vertices.find(e->
vn[1]->
id)->second, vertices_to_vertices.find(e->
vn[2]->
id)->second, meshes[meshes_i]->get_element_markers_conversion().get_user_marker(e->
marker).marker.c_str(), e->
id, vertices_to_vertices.find(e->
vn[3]->
id)->second));
684 baseElementsSaved[e->
id] =
true;
693 bool has_inner_edges =
false;
694 for_all_base_elements(e, meshes[meshes_i])
696 for (
unsigned i = 0; i < e->get_nvert(); i++)
698 if(meshes[meshes_i]->get_base_edge_node(e, i)->bnd)
700 if(vertices_to_boundaries.find(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second))) == vertices_to_boundaries.end())
702 unsigned int edge_i = edges.
ed().size();
703 vertices_to_boundaries.insert(std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second)), edge_i));
704 edges.
ed().push_back(
XMLSubdomains::ed(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second, meshes[meshes_i]->boundary_markers_conversion.get_user_marker(meshes[meshes_i]->get_base_edge_node(e, i)->marker).marker.c_str(), edge_i));
707 subdomain.
boundary_edges()->i().push_back(vertices_to_boundaries.find(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second)))->second);
710 has_inner_edges =
true;
717 for_all_base_elements(e, meshes[meshes_i])
718 for (
unsigned i = 0; i < e->get_nvert(); i++)
720 if(!meshes[meshes_i]->get_base_edge_node(e, i)->bnd)
722 if(vertices_to_boundaries.find(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second))) == vertices_to_boundaries.end())
724 unsigned int edge_i = edges.
ed().size();
725 vertices_to_boundaries.insert(std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second)), edge_i));
726 edges.
ed().push_back(
XMLSubdomains::ed(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second, meshes[meshes_i]->boundary_markers_conversion.get_user_marker(meshes[meshes_i]->get_base_edge_node(e, i)->marker).marker.c_str(), edge_i));
729 subdomain.
inner_edges()->i().push_back(vertices_to_boundaries.find(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second)))->second);
735 for_all_base_elements(e, meshes[meshes_i])
737 for (
unsigned i = 0; i < e->get_nvert(); i++)
738 if(e->
cm->nurbs[i] != NULL && !is_twin_nurbs(e, i))
739 if(vertices_to_curves.find(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second))) == vertices_to_curves.end())
741 if(e->
cm->nurbs[i]->
arc)
742 save_arc(meshes[meshes_i], vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second, e->
cm->nurbs[i], curves);
744 save_nurbs(meshes[meshes_i], vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second, e->
cm->nurbs[i], curves);
745 vertices_to_curves.insert(std::pair<std::pair<unsigned int, unsigned int>,
bool>(std::pair<unsigned int, unsigned int>(std::min(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second), std::max(vertices_to_vertices.find(e->
vn[i]->
id)->second, vertices_to_vertices.find(e->
vn[e->
next_vert(i)]->
id)->second)),
true));
749 for(
unsigned int refinement_i = 0; refinement_i < meshes[meshes_i]->refinements.size(); refinement_i++)
750 refinements.
ref().push_back(
XMLMesh::ref(meshes[meshes_i]->refinements[refinement_i].first, meshes[meshes_i]->refinements[refinement_i].second));
753 subdomains.
subdomain().push_back(subdomain);
756 delete [] baseElementsSaved;
759 xmldomain.
curves().set(curves);
762 mesh_schema_location.append(
"/mesh_h2d_xml.xsd");
766 domain_schema_location.append(
"/subdomains_h2d_xml.xsd");
773 std::ofstream out(filename);
781 bool MeshReaderH2DXML::load(std::auto_ptr<XMLMesh::mesh> & parsed_xml_mesh,
Mesh *mesh, std::map<unsigned int, unsigned int>& vertex_is)
786 unsigned int variables_count = parsed_xml_mesh->variables().present() ? parsed_xml_mesh->variables()->var().size() : 0;
787 std::map<std::string, double> variables;
788 for (
unsigned int variables_i = 0; variables_i < variables_count; variables_i++)
790 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()));
792 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()));
796 int vertices_count = parsed_xml_mesh->vertices().v().size();
799 int size = HashTable::H2D_DEFAULT_HASH_SIZE;
800 while (size < 8 * vertices_count)
805 for (
int vertex_i = 0; vertex_i < vertices_count; vertex_i++)
808 assert(node->
id == vertex_i);
809 node->
ref = TOP_LEVEL_REF;
810 node->
type = HERMES_TYPE_VERTEX;
812 node->p1 = node->
p2 = -1;
816 std::string x = parsed_xml_mesh->vertices().v().at(vertex_i).x();
817 std::string y = parsed_xml_mesh->vertices().v().at(vertex_i).y();
820 vertex_is.insert(std::pair<unsigned int, unsigned int>(parsed_xml_mesh->vertices().v().at(vertex_i).i(), vertex_i));
826 bool x_found =
false;
827 bool y_found =
false;
828 if(variables.find(x) != variables.end())
830 x_value = variables.find(x)->second;
833 if(variables.find(y) != variables.end())
835 y_value = variables.find(y)->second;
841 if(std::strtod(x.c_str(), NULL) != 0.0)
842 x_value = std::strtod(x.c_str(), NULL);
846 int dot_position = strchr(x.c_str(),
'.') == NULL ? -1 : strchr(x.c_str(),
'.') - x.c_str();
847 for(
int i = 0; i < dot_position; i++)
848 if(strncmp(x.c_str() + i,
"0", 1) != 0)
849 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_i + 1);
850 for(
int i = dot_position + 1; i < x.length(); i++)
851 if(strncmp(x.c_str() + i,
"0", 1) != 0)
852 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_i + 1);
853 x_value = std::strtod(x.c_str(), NULL);
857 if(std::strtod(y.c_str(), NULL) != 0.0)
858 y_value = std::strtod(y.c_str(), NULL);
862 int dot_position = strchr(y.c_str(),
'.') == NULL ? -1 : strchr(y.c_str(),
'.') - y.c_str();
863 for(
int i = 0; i < dot_position; i++)
864 if(strncmp(y.c_str() + i,
"0", 1) != 0)
865 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_i + 1);
866 for(
int i = dot_position + 1; i < y.length(); i++)
867 if(strncmp(y.c_str() + i,
"0", 1) != 0)
868 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_i + 1);
869 y_value = std::strtod(y.c_str(), NULL);
876 mesh->ntopvert = vertices_count;
879 unsigned int element_count = parsed_xml_mesh->elements().el().size();
880 mesh->nbase = mesh->nactive = mesh->ninitial = element_count;
883 for (
int element_i = 0; element_i < element_count; element_i++)
888 unsigned int begin = element->
m().find_first_not_of(
" \t\n");
889 unsigned int end = element->
m().find_last_not_of(
" \t\n");
890 element->
m().erase(end + 1, element->
m().length());
891 element->
m().erase(0, begin);
893 mesh->element_markers_conversion.insert_marker(mesh->element_markers_conversion.min_marker_unused, element->
m());
898 e = mesh->create_quad(mesh->element_markers_conversion.get_internal_marker(element->
m()).marker,
899 &mesh->
nodes[vertex_is.find(el_q->
v1())->second],
900 &mesh->
nodes[vertex_is.find(el_q->
v2())->second],
901 &mesh->
nodes[vertex_is.find(el_q->
v3())->second],
902 &mesh->
nodes[vertex_is.find(el_q->
v4())->second],
905 e = mesh->create_triangle(mesh->element_markers_conversion.get_internal_marker(element->
m()).marker,
906 &mesh->
nodes[vertex_is.find(el_t->
v1())->second],
907 &mesh->
nodes[vertex_is.find(el_t->
v2())->second],
908 &mesh->
nodes[vertex_is.find(el_t->
v3())->second],
913 unsigned int edges_count = parsed_xml_mesh->edges().ed().size();
916 for (
unsigned int edge_i = 0; edge_i < edges_count; edge_i++)
918 int v1 = vertex_is.find(parsed_xml_mesh->edges().ed().at(edge_i).v1())->second;
919 int v2 = vertex_is.find(parsed_xml_mesh->edges().ed().at(edge_i).v2())->second;
923 throw Hermes::Exceptions::MeshLoadFailureException(
"Boundary data #%d: edge %d-%d does not exist.", edge_i, v1, v2);
925 std::string edge_marker = parsed_xml_mesh->edges().ed().at(edge_i).m();
928 unsigned int begin = edge_marker.find_first_not_of(
" \t\n");
929 unsigned int end = edge_marker.find_last_not_of(
" \t\n");
930 edge_marker.erase(end + 1, edge_marker.length());
931 edge_marker.erase(0, begin);
935 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused, edge_marker);
936 int marker = mesh->boundary_markers_conversion.get_internal_marker(edge_marker).marker;
944 mesh->
nodes[v1].bnd = 1;
945 mesh->
nodes[v2].bnd = 1;
951 for_all_edge_nodes(en, mesh)
953 this->warn(
"Boundary edge node does not have a boundary marker.");
957 unsigned int arc_count = parsed_xml_mesh->curves().present() ? parsed_xml_mesh->curves()->arc().size() : 0;
958 unsigned int nurbs_count = parsed_xml_mesh->curves().present() ? parsed_xml_mesh->curves()->NURBS().size() : 0;
960 for (
unsigned int curves_i = 0; curves_i < arc_count + nurbs_count; curves_i++)
968 if(curves_i < arc_count)
971 p1 = vertex_is.find(parsed_xml_mesh->curves()->arc().at(curves_i).v1())->second;
972 p2 = vertex_is.find(parsed_xml_mesh->curves()->arc().at(curves_i).v2())->second;
974 nurbs = load_arc(mesh, parsed_xml_mesh, curves_i, &en, p1, p2);
979 p1 = vertex_is.find(parsed_xml_mesh->curves()->NURBS().at(curves_i - arc_count).v1())->second;
980 p2 = vertex_is.find(parsed_xml_mesh->curves()->NURBS().at(curves_i - arc_count).v2())->second;
981 nurbs = load_nurbs(mesh, parsed_xml_mesh, curves_i - arc_count, &en, p1, p2);
985 for (
unsigned int node_i = 0; node_i < 2; node_i++)
988 if(e == NULL)
continue;
999 for (
unsigned j = 0; j < e->get_nvert(); j++)
1000 if(e->
en[j] == en) { idx = j;
break; }
1003 if(e->
vn[idx]->
id == p1)
1005 e->
cm->nurbs[idx] = nurbs;
1010 Nurbs* nurbs_rev = mesh->reverse_nurbs(nurbs);
1011 e->
cm->nurbs[idx] = nurbs_rev;
1015 if(!nurbs->
ref)
delete nurbs;
1019 for_all_elements(e, mesh)
1021 e->
cm->update_refmap_coeffs(e);
1025 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
1031 bool MeshReaderH2DXML::load(std::auto_ptr<XMLSubdomains::domain> & parsed_xml_domain,
Mesh *mesh,
int* vertex_is,
int* element_is,
int* edge_is)
1036 unsigned int variables_count = parsed_xml_domain->variables().present() ? parsed_xml_domain->variables()->var().size() : 0;
1037 std::map<std::string, double> variables;
1038 for (
unsigned int variables_i = 0; variables_i < variables_count; variables_i++)
1040 variables.insert(std::make_pair<std::string, double>((
std::string)parsed_xml_domain->variables()->var().at(variables_i).name(), (
double&&)parsed_xml_domain->variables()->var().at(variables_i).value()));
1042 variables.insert(std::make_pair<std::string, double>((
std::string)parsed_xml_domain->variables()->var().at(variables_i).name(), parsed_xml_domain->variables()->var().at(variables_i).value()));
1047 int vertices_count = parsed_xml_domain->vertices().v().size();
1050 int size = HashTable::H2D_DEFAULT_HASH_SIZE;
1051 while (size < 8 * vertices_count)
1056 for (
int vertex_i = 0; vertex_i < vertices_count; vertex_i++)
1059 assert(node->
id == vertex_i);
1060 node->
ref = TOP_LEVEL_REF;
1061 node->
type = HERMES_TYPE_VERTEX;
1063 node->p1 = node->
p2 = -1;
1067 std::string x = parsed_xml_domain->vertices().v().at(vertex_i).x();
1068 std::string y = parsed_xml_domain->vertices().v().at(vertex_i).y();
1070 if(parsed_xml_domain->vertices().v().at(vertex_i).i() > H2D_MAX_NODE_ID - 1)
1071 throw Exceptions::MeshLoadFailureException(
"The index 'i' of vertex in the mesh file must be lower than %i.", H2D_MAX_NODE_ID);
1074 vertex_is[parsed_xml_domain->vertices().v().at(vertex_i).i()] = vertex_i;
1080 bool x_found =
false;
1081 bool y_found =
false;
1082 if(variables.find(x) != variables.end())
1084 x_value = variables.find(x)->second;
1087 if(variables.find(y) != variables.end())
1089 y_value = variables.find(y)->second;
1095 if(std::strtod(x.c_str(), NULL) != 0.0)
1096 x_value = std::strtod(x.c_str(), NULL);
1100 int dot_position = strchr(x.c_str(),
'.') == NULL ? -1 : strchr(x.c_str(),
'.') - x.c_str();
1101 for(
int i = 0; i < dot_position; i++)
1102 if(strncmp(x.c_str() + i,
"0", 1) != 0)
1103 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_i + 1);
1104 for(
int i = dot_position + 1; i < x.length(); i++)
1105 if(strncmp(x.c_str() + i,
"0", 1) != 0)
1106 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the x coordinate of vertex no. %i.", vertex_i + 1);
1107 x_value = std::strtod(x.c_str(), NULL);
1111 if(std::strtod(y.c_str(), NULL) != 0.0)
1112 y_value = std::strtod(y.c_str(), NULL);
1116 int dot_position = strchr(y.c_str(),
'.') == NULL ? -1 : strchr(y.c_str(),
'.') - y.c_str();
1117 for(
int i = 0; i < dot_position; i++)
1118 if(strncmp(y.c_str() + i,
"0", 1) != 0)
1119 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_i + 1);
1120 for(
int i = dot_position + 1; i < y.length(); i++)
1121 if(strncmp(y.c_str() + i,
"0", 1) != 0)
1122 throw Hermes::Exceptions::MeshLoadFailureException(
"Wrong syntax in the y coordinate of vertex no. %i.", vertex_i + 1);
1123 y_value = std::strtod(y.c_str(), NULL);
1130 mesh->ntopvert = vertices_count;
1133 unsigned int element_count = parsed_xml_domain->elements().el().size();
1134 mesh->nbase = mesh->nactive = mesh->ninitial = element_count;
1137 for (
int element_i = 0; element_i < element_count; element_i++)
1142 if(parsed_xml_domain->elements().el().at(element_i).i() > H2D_MAX_NODE_ID - 1)
1143 throw Exceptions::MeshLoadFailureException(
"The index 'i' of element in the mesh file must be lower than %i.", H2D_MAX_NODE_ID);
1145 element_is[parsed_xml_domain->elements().el().at(element_i).i()] = element_i;
1148 unsigned int begin = element->
m().find_first_not_of(
" \t\n");
1149 unsigned int end = element->
m().find_last_not_of(
" \t\n");
1150 element->
m().erase(end + 1, element->
m().length());
1151 element->
m().erase(0, begin);
1153 mesh->element_markers_conversion.insert_marker(mesh->element_markers_conversion.min_marker_unused, element->
m());
1158 e = mesh->create_quad(mesh->element_markers_conversion.get_internal_marker(element->
m()).marker,
1165 e = mesh->create_triangle(mesh->element_markers_conversion.get_internal_marker(element->
m()).marker,
1173 unsigned int edges_count = parsed_xml_domain->edges().ed().size();
1176 for (
unsigned int edge_i = 0; edge_i < edges_count; edge_i++)
1178 int v1 = parsed_xml_domain->edges().ed().at(edge_i).v1();
1179 int v2 = parsed_xml_domain->edges().ed().at(edge_i).v2();
1182 if(parsed_xml_domain->edges().ed().at(edge_i).i() > H2D_MAX_NODE_ID - 1)
1183 throw Exceptions::MeshLoadFailureException(
"The index 'i' of edge in the mesh file must be lower than %i.", H2D_MAX_NODE_ID);
1185 edge_is[edge_i] = parsed_xml_domain->edges().ed().at(edge_i).i();
1189 throw Hermes::Exceptions::MeshLoadFailureException(
"Boundary data #%d: edge %d-%d does not exist.", edge_i, v1, v2);
1191 std::string edge_marker = parsed_xml_domain->edges().ed().at(edge_i).m();
1194 unsigned int begin = edge_marker.find_first_not_of(
" \t\n");
1195 unsigned int end = edge_marker.find_last_not_of(
" \t\n");
1196 edge_marker.erase(end + 1, edge_marker.length());
1197 edge_marker.erase(0, begin);
1201 mesh->boundary_markers_conversion.insert_marker(mesh->boundary_markers_conversion.min_marker_unused, edge_marker);
1202 int marker = mesh->boundary_markers_conversion.get_internal_marker(edge_marker).marker;
1210 mesh->
nodes[v1].bnd = 1;
1211 mesh->
nodes[v2].bnd = 1;
1217 for_all_edge_nodes(en, mesh)
1219 this->warn(
"Boundary edge node does not have a boundary marker.");
1223 unsigned int arc_count = parsed_xml_domain->curves().present() ? parsed_xml_domain->curves()->arc().size() : 0;
1224 unsigned int nurbs_count = parsed_xml_domain->curves().present() ? parsed_xml_domain->curves()->NURBS().size() : 0;
1226 for (
unsigned int curves_i = 0; curves_i < arc_count + nurbs_count; curves_i++)
1234 if(curves_i < arc_count)
1237 p1 = parsed_xml_domain->curves()->
arc().at(curves_i).v1();
1238 p2 = parsed_xml_domain->curves()->arc().at(curves_i).v2();
1240 nurbs = load_arc(mesh, parsed_xml_domain, curves_i, &en, p1, p2);
1245 p1 = parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v1();
1246 p2 = parsed_xml_domain->curves()->NURBS().at(curves_i - arc_count).v2();
1247 nurbs = load_nurbs(mesh, parsed_xml_domain, curves_i - arc_count, &en, p1, p2);
1251 for (
unsigned int node_i = 0; node_i < 2; node_i++)
1254 if(e == NULL)
continue;
1260 e->
cm->toplevel = 1;
1265 for (
unsigned j = 0; j < e->get_nvert(); j++)
1266 if(e->
en[j] == en) { idx = j;
break; }
1269 if(e->
vn[idx]->
id == p1)
1271 e->
cm->nurbs[idx] = nurbs;
1276 Nurbs* nurbs_rev = mesh->reverse_nurbs(nurbs);
1277 e->
cm->nurbs[idx] = nurbs_rev;
1281 if(!nurbs->
ref)
delete nurbs;
1285 for_all_elements(e, mesh)
1287 e->
cm->update_refmap_coeffs(e);
1291 throw Hermes::Exceptions::MeshLoadFailureException(e.what());
1297 template<
typename T>
1298 Nurbs* MeshReaderH2DXML::load_arc(
Mesh *mesh, std::auto_ptr<T>& parsed_xml_entity,
int id,
Node** en,
int p1,
int p2,
bool skip_check)
1305 parsed_xml_entity.get();
1310 throw Hermes::Exceptions::MeshLoadFailureException(
"Curve #%d: edge %d-%d does not exist.",
id, p1, p2);
1321 nurbs->
kv =
new double[nurbs->
nk];
1323 for (
int i = 0; i < 3; i++)
1326 for (
int i = 3; i < nurbs->
nk; i++)
1330 nurbs->
pt =
new double3[3];
1331 nurbs->
pt[0][0] = mesh->
nodes[p1].x;
1332 nurbs->
pt[0][1] = mesh->
nodes[p1].y;
1333 nurbs->
pt[0][2] = 1.0;
1334 nurbs->
pt[2][0] = mesh->
nodes[p2].x;
1335 nurbs->
pt[2][1] = mesh->
nodes[p2].y;
1336 nurbs->
pt[2][2] = 1.0;
1339 nurbs->
angle = parsed_xml_entity->curves()->arc().at(
id).angle();
1340 double a = (180.0 - nurbs->
angle) / 180.0 * M_PI;
1343 double x = 1.0 / std::tan(a * 0.5);
1344 nurbs->
pt[1][0] = 0.5*((nurbs->
pt[2][0] + nurbs->
pt[0][0]) + (nurbs->
pt[2][1] - nurbs->
pt[0][1]) * x);
1345 nurbs->
pt[1][1] = 0.5*((nurbs->
pt[2][1] + nurbs->
pt[0][1]) - (nurbs->
pt[2][0] - nurbs->
pt[0][0]) * x);
1346 nurbs->
pt[1][2] = Hermes::cos((M_PI - a) * 0.5);
1353 template<
typename T>
1354 Nurbs* MeshReaderH2DXML::load_nurbs(
Mesh *mesh, std::auto_ptr<T> & parsed_xml_entity,
int id,
Node** en,
int p1,
int p2,
bool skip_check)
1364 throw Hermes::Exceptions::MeshLoadFailureException(
"Curve #%d: edge %d-%d does not exist.",
id, p1, p2);
1370 nurbs->
degree = parsed_xml_entity->curves()->NURBS().at(
id).deg();
1373 int inner = parsed_xml_entity->curves()->NURBS().at(
id).inner_point().size();
1375 nurbs->
np = inner + 2;
1378 nurbs->
pt =
new double3[nurbs->
np];
1379 nurbs->
pt[0][0] = mesh->
nodes[p1].x;
1380 nurbs->
pt[0][1] = mesh->
nodes[p1].y;
1381 nurbs->
pt[0][2] = 1.0;
1382 nurbs->
pt[inner + 1][0] = mesh->
nodes[p2].x;
1383 nurbs->
pt[inner + 1][1] = mesh->
nodes[p2].y;
1384 nurbs->
pt[inner + 1][2] = 1.0;
1387 for (
int i = 0; i < inner; i++)
1389 nurbs->
pt[i + 1][0] = parsed_xml_entity->curves()->NURBS().at(
id).inner_point().at(i).x();
1390 nurbs->
pt[i + 1][1] = parsed_xml_entity->curves()->NURBS().at(
id).inner_point().at(i).y();
1391 nurbs->
pt[i + 1][2] = parsed_xml_entity->curves()->NURBS().at(
id).inner_point().at(i).weight();
1395 inner = parsed_xml_entity->curves()->NURBS().at(
id).knot().size();
1397 int outer = nurbs->
nk - inner;
1398 if((outer & 1) == 1)
1399 throw Hermes::Exceptions::MeshLoadFailureException(
"Curve #%d: incorrect number of knot points.",
id);
1402 nurbs->
kv =
new double[nurbs->
nk];
1404 for (
int i = 0; i < outer/2; i++)
1408 for (
int i = outer/2; i < inner + outer/2; i++)
1409 nurbs->
kv[i] = parsed_xml_entity->curves()->NURBS().at(
id).knot().at(i - (outer/2)).value();
1411 for (
int i = outer/2 + inner; i < nurbs->
nk; i++)
1428 int inner = nurbs->
np - 2;
1429 int outer = nurbs->
nk - inner;
1431 for (
int i = 1; i < nurbs->
np-1; i++)
1434 int max = nurbs->
nk - (nurbs->
degree + 1);
1435 for (
int i = nurbs->
degree + 1; i < max; i++)