41 #include <boost/tokenizer.hpp>
42 #include "boost/lexical_cast.hpp"
43 #include <boost/make_shared.hpp>
67 namespace IT = Input::Type;
71 =
IT::Record(
"Mesh",
"Record with mesh related data." )
73 "Input file with mesh description.")
75 "List of additional region definitions not contained in the mesh.")
77 "List of region set definitions. There are three region sets implicitly defined:\n"
78 "ALL (all regions of the mesh), BOUNDARY (all boundary regions), and BULK (all bulk regions)")
99 : in_record_(in_record),
132 for(
int i=0; i < 3; i++) {
134 for(
int j=0; j < i+2; j++)
138 for (
unsigned int sid=0; sid<RefElement<1>::n_sides; sid++)
139 for (
unsigned int nid=0; nid<RefElement<1>::n_nodes_per_side; nid++)
142 for (
unsigned int sid=0; sid<RefElement<2>::n_sides; sid++)
143 for (
unsigned int nid=0; nid<RefElement<2>::n_nodes_per_side; nid++)
146 for (
unsigned int sid=0; sid<RefElement<3>::n_sides; sid++)
147 for (
unsigned int nid=0; nid<RefElement<3>::n_nodes_per_side; nid++)
176 switch (elm->dim()) {
237 if (ele->quality_measure_smooth() < 0.001)
xprintf(
Warn,
"Bad quality (<0.001) of the element %u.\n", ele.id());
271 for (
unsigned int n=0; n<e->n_nodes(); n++)
275 stable_sort(n->begin(), n->end());
281 if (nodes_list.size() == 0) {
282 intersection_element_list.clear();
283 }
else if (nodes_list.size() == 1) {
288 intersection_element_list.resize(
node_elements[*it1].size() );
290 it1=set_intersection(
293 intersection_element_list.begin());
294 intersection_element_list.resize(it1-intersection_element_list.begin());
296 for(;it2<nodes_list.end();++it2) {
297 it1=set_intersection(
298 intersection_element_list.begin(), intersection_element_list.end(),
300 intersection_element_list.begin());
301 intersection_element_list.resize(it1-intersection_element_list.begin());
308 unsigned int dim,
unsigned int &element_idx) {
309 bool is_neighbour =
false;
313 if (elements[*ele].dim() == dim) {
316 }
else if (elements[*ele].dim() == dim-1) {
317 if (is_neighbour)
xprintf(
UsrErr,
"Too matching elements id: %d and id: %d in the same mesh.\n",
318 elements(*ele).id(), elements(element_idx).id() );
323 element_list.resize( e_dest - element_list.begin());
331 && find(side_nodes.begin(), side_nodes.end(),
node_vector.
index( si->
node(ni) ) ) != side_nodes.end() ) ni++;
332 return ( ni == si->
n_nodes() );
348 unsigned int ngh_element_idx, last_edge_idx;
361 side_nodes.resize(bc_ele->n_nodes());
362 for (
unsigned n=0; n<bc_ele->n_nodes(); n++) side_nodes[n] =
node_vector.
index(bc_ele->node[n]);
366 xprintf(
UsrErr,
"Boundary element (id: %d) match a regular element (id: %d) of lower dimension.\n",
367 bc_ele.id(),
element(ngh_element_idx).id());
369 if (intersection_list.size() == 0) {
371 xprintf(
Warn,
"Lonely boundary element, id: %d, region: %d, dimension %d.\n", bc_ele.id(), bc_ele->region().id(), bc_ele->dim());
374 last_edge_idx=
edges.size();
375 edges.resize(last_edge_idx+1);
376 edg = &(
edges.back() );
378 edg->
side_ =
new struct SideIter[ intersection_list.size() ];
392 for (
unsigned int ecs=0; ecs<elem->
n_sides(); ecs++) {
414 for (
unsigned int s=0; s<e->n_sides(); s++)
417 if (e->edge_idx_[s] != Mesh::undef_idx)
continue;
421 side_nodes.resize(e->side(s)->n_nodes());
422 for (
unsigned n=0; n<e->side(s)->n_nodes(); n++) side_nodes[n] =
node_vector.
index(e->side(s)->node(n));
431 last_edge_idx=
edges.size();
432 edges.resize(last_edge_idx+1);
433 edg = &(
edges.back() );
435 edg->
side_ =
new struct SideIter[ intersection_list.size() ];
439 if (intersection_list.size() == 1) {
441 edg->
side_[0] = e->side(s);
442 e->edge_idx_[s] = last_edge_idx;
444 if (e->boundary_idx_ == NULL) {
445 e->boundary_idx_ =
new unsigned int [ e->n_sides() ];
446 std::fill( e->boundary_idx_, e->boundary_idx_ + e->n_sides(),
Mesh::undef_idx);
452 e->boundary_idx_[s] = bdr_idx;
457 for(
unsigned int ni = 0; ni< side_nodes.size(); ni++) bc_ele->node[ni] = &(
node_vector[side_nodes[ni]] );
471 for (
unsigned int ecs=0; ecs<elem->
n_sides(); ecs++) {
472 if (elem->
edge_idx_[ecs] != Mesh::undef_idx)
continue;
477 last_edge_idx=
edges.size();
478 edges.resize(last_edge_idx+1);
479 edg = &(
edges.back() );
497 ASSERT( is_neighbour || ( (
unsigned int) edg->
n_sides ) == intersection_list.size(),
"Some connected sides were not found.\n");
511 edg->side(0)->element()->permutation_idx_[edg->side(0)->el_idx()] = 0;
513 if (edg->n_sides > 1)
516 unsigned int permutation[edg->side(0)->n_nodes()];
518 for (
unsigned int i=0; i<edg->side(0)->n_nodes(); i++)
519 node_numbers[edg->side(0)->node(i)] = i;
521 for (
int sid=1; sid<edg->n_sides; sid++)
523 for (
unsigned int i=0; i<edg->side(0)->n_nodes(); i++)
524 permutation[node_numbers[edg->side(sid)->node(i)]] = i;
526 switch (edg->side(0)->dim())
545 unsigned int permutation[nb->element()->n_nodes()];
549 for (
unsigned int i=0; i<nb->element()->n_nodes(); i++)
550 node_numbers[nb->element()->node[i]] = i;
552 for (
unsigned int i=0; i<nb->side()->n_nodes(); i++)
553 permutation[node_numbers[nb->side()->node(i)]] = i;
555 switch (nb->side()->dim())
674 if( ele->n_neighs_vb > 0 ) {
675 ele->neigh_vb =
new struct Neighbour* [ele->n_neighs_vb];
682 ele = ngh->element();
709 for(
unsigned int i_ele=0; i_ele<
n_elements(); i_ele++) {
712 if (ele.
dim() == 1) {
716 for(
unsigned int i_elm=0; i_elm<
n_elements(); i_elm++) {
718 if (elm->dim() == 2) {
754 for(
int idx=0; idx <
element.
size(); idx++, ++map_it) {
756 if (last_id >=
id)
xprintf(
UsrErr,
"Element IDs in non-increasing order, ID: %d\n",
id);
757 last_id=*map_it = id;
769 if (
id < 0) last_id=*map_it=-1;
771 if (last_id >=
id)
xprintf(
UsrErr,
"Element IDs in non-increasing order, ID: %d\n",
id);
772 last_id=*map_it = id;