Flow123d
release_3.0.0-968-gc87a28e79
|
Go to the documentation of this file.
68 "Use BIH for finding initial candidates, then continue by prolongation.")
70 "Use BIH for finding all candidates.")
72 "Use bounding boxes for finding initial candidates, then continue by prolongation.")
77 return IT::Record(
"Mesh",
"Record with mesh related data." )
80 "Input file with mesh description.")
82 "List of additional region and region set definitions not contained in the mesh. "
83 "There are three region sets implicitly defined:\n\n"
84 "- ALL (all regions of the mesh)\n"
85 "- .BOUNDARY (all boundary regions)\n"
86 "- BULK (all bulk regions)")
90 IT::Default(
"\"BIHsearch\""),
"Search algorithm for element intersections.")
92 "Maximal snapping distance from Mesh in various search operations. In particular is used "
93 "in ObservePoint to find closest mesh element and in FieldFormula to find closest surface "
94 "element in plan view (Z projection).")
96 "Output file with neighboring data from mesh.")
107 node_4_loc_(nullptr),
115 : in_record_(in_record),
121 node_4_loc_(nullptr),
127 istringstream is(
"{mesh_file=\"\"}");
141 MessageOut() <<
"Opening raw ngh output: " << raw_output_file_path <<
"\n";
182 for(
int i=0; i < 3; i++) {
184 for(
int j=0; j < i+2; j++)
188 for (
unsigned int sid=0; sid<RefElement<1>::n_sides; sid++)
189 for (
unsigned int nid=0; nid<RefElement<1>::n_nodes_per_side; nid++)
192 for (
unsigned int sid=0; sid<RefElement<2>::n_sides; sid++)
193 for (
unsigned int nid=0; nid<RefElement<2>::n_nodes_per_side; nid++)
196 for (
unsigned int sid=0; sid<RefElement<3>::n_sides; sid++)
197 for (
unsigned int nid=0; nid<RefElement<3>::n_nodes_per_side; nid++)
204 if (edg.side_)
delete[] edg.side_;
206 for (
unsigned int idx=0; idx <
bulk_size_; idx++) {
242 unsigned int li, count = 0;
244 for (li=0; li<ele->n_nodes(); li++) {
266 switch (elm->dim()) {
285 std::string reg_name =
"UndefinedRegion";
288 dim_to_check = ele.
dim();
292 for (
auto elem_to_region :
map) {
295 if( ele.
dim() != dim_to_check){
296 xprintf(
UsrErr,
"User defined region '%s' (id %d) by 'From_Elements' cannot have elements of different dimensions.\n"
297 "Thrown due to: dim %d neq dim %d (ele id %d).\n"
298 "Split elements by dim, create separate regions and then possibly use Union.\n",
299 reg_name.c_str(), elem_to_region.second, dim_to_check, ele.
dim(), elem_to_region.first);
314 double quality = ele.quality_measure_smooth(ele.side(0));
316 WarningOut().fmt(
"Bad quality (<0.001) of the element {}.\n", ele.idx());
319 for (
uint ele_node=0; ele_node<ele->n_nodes(); ele_node++) {
320 uint inode = ele->node_idx(ele_node);
321 nodes_new_idx[inode] = inode;
327 for(
uint inode = 0; inode < nodes_new_idx.size(); inode++) {
329 WarningOut().fmt(
"A node {} does not belong to any element "
330 " and will be removed.",
335 nodes_new_idx[inode] = inode_new;
345 uint n_nodes_new = inode_new;
348 if(n_nodes_new < nodes_new_idx.size()){
350 DebugOut() <<
"Updating node-element numbering due to unused nodes: "
359 for (
uint ele_node=0; ele_node<ele->n_nodes(); ele_node++) {
360 uint inode_orig = ele->node_idx(ele_node);
361 uint inode = nodes_new_idx[inode_orig];
363 const_cast<Element*
>(ele.element())->nodes_[ele_node] = inode;
388 id_4_old[i++] = ele.idx();
419 for (
unsigned int n=0; n<ele->n_nodes(); n++)
423 stable_sort(n->begin(), n->end());
433 if (nodes_list.size() == 0) {
434 intersection_element_list.clear();
435 }
else if (nodes_list.size() == 1) {
442 it1=set_intersection(
445 intersection_element_list.begin());
446 intersection_element_list.resize(it1-intersection_element_list.begin());
448 for(;it2<nodes_list.end();++it2) {
449 it1=set_intersection(
450 intersection_element_list.begin(), intersection_element_list.end(),
452 intersection_element_list.begin());
453 intersection_element_list.resize(it1-intersection_element_list.begin());
460 bool is_neighbour =
false;
468 if (is_neighbour)
xprintf(
UsrErr,
"Too matching elements id: %d and id: %d in the same mesh.\n",
475 element_list.resize( e_dest - element_list.begin());
484 return ( ni == si->
n_nodes() );
499 .error(
"Temporary structure of boundary element data is not empty. Did you call create_boundary_elements?");
503 unsigned int ngh_element_idx, last_edge_idx;
505 neighbour.
mesh_ =
this;
524 xprintf(
UsrErr,
"Boundary element (id: %d) match a regular element (id: %d) of lower dimension.\n",
525 bc_ele.
idx(), this->elem_index(ngh_element_idx));
527 if (intersection_list.size() == 0) {
529 WarningOut().fmt(
"Lonely boundary element, id: {}, region: {}, dimension {}.\n",
533 last_edge_idx=
edges.size();
534 edges.resize(last_edge_idx+1);
535 edg = &(
edges.back() );
537 edg->
side_ =
new struct SideIter[ intersection_list.size() ];
551 for (
unsigned int ecs=0; ecs<elem->
n_sides(); ecs++) {
557 int new_bc_ele_idx=i;
558 THROW( ExcDuplicateBoundary()
559 << EI_ElemLast(this->
elem_index(last_bc_ele_idx))
561 << EI_ElemNew(this->
elem_index(new_bc_ele_idx))
584 for (
unsigned int s=0; s<e->n_sides(); s++)
592 for (
unsigned n=0; n<e.side(s)->
n_nodes(); n++)
side_nodes[n] = e.side(s)->node(n).idx();
601 last_edge_idx=
edges.size();
602 edges.resize(last_edge_idx+1);
603 edg = &(
edges.back() );
605 edg->
side_ =
new struct SideIter[ intersection_list.size() ];
609 if (intersection_list.size() == 1) {
612 edg->
side_[0] = e.side(s);
615 if (e->boundary_idx_ == NULL) {
644 for (
unsigned int ecs=0; ecs<elem->
n_sides(); ecs++) {
650 last_edge_idx=
edges.size();
651 edges.resize(last_edge_idx+1);
652 edg = &(
edges.back() );
670 OLD_ASSERT( is_neighbour || ( (
unsigned int) edg->
n_sides ) == intersection_list.size(),
"Some connected sides were not found.\n");
684 edg->side(0)->element()->permutation_idx_[edg->side(0)->side_idx()] = 0;
686 if (edg->n_sides > 1)
689 unsigned int permutation[edg->side(0)->n_nodes()];
691 for (
unsigned int i=0; i<edg->side(0)->
n_nodes(); i++)
692 node_numbers[edg->side(0)->node(i).idx()] = i;
695 for (
int sid=1; sid<edg->n_sides; sid++)
697 for (
unsigned int i=0; i<edg->side(0)->
n_nodes(); i++)
698 permutation[node_numbers[edg->side(sid)->node(i).idx()]] = i;
701 switch (edg->side(0)->dim())
720 unsigned int permutation[nb->element()->n_nodes()];
724 for (
unsigned int i=0; i<nb->element()->
n_nodes(); i++)
725 node_numbers[nb->element().node(i)] = i;
727 for (
unsigned int i=0; i<nb->side()->
n_nodes(); i++)
728 permutation[node_numbers[nb->side()->node(i).node()]] = i;
730 switch (nb->side()->dim())
758 ele->n_neighs_vb_ =0;
761 for (
auto & ngh : this->
vb_neighbours_) ngh.element()->n_neighs_vb_++;
765 if( ele->n_neighs_vb() > 0 ) {
766 ele->neigh_vb =
new struct Neighbour* [ele->n_neighs_vb()];
772 for (
auto & ngh : this->vb_neighbours_) {
794 intersections = std::make_shared<MixedMeshIntersections>(
this);
816 if (bulk_elements_id.size() ==0) {
821 map_it = bulk_elements_id.begin();
823 for(
unsigned int idx=0; idx <
n_elements(); idx++, ++map_it) {
825 if (last_id >=
id)
xprintf(
UsrErr,
"Element IDs in non-increasing order, ID: %d\n",
id);
826 last_id=*map_it = id;
829 boundary_elements_id.resize(
n_elements(
true));
830 map_it = boundary_elements_id.begin();
837 if (
id < 0) last_id=*map_it=-1;
839 if (last_id >=
id)
xprintf(
UsrErr,
"Element IDs in non-increasing order, ID: %d\n",
id);
840 last_id=*map_it = id;
848 static const double point_tolerance = 1E-10;
849 return fabs(p1[0]-p2[0]) < point_tolerance
850 && fabs(p1[1]-p2[1]) < point_tolerance
851 && fabs(p1[2]-p2[2]) < point_tolerance;
868 unsigned int i_node, i_elm_node;
872 node_ids.resize( this->
n_nodes() );
876 int found_i_node = -1;
877 bih_tree.
find_point(point, searched_elements);
881 for (i_node=0; i_node<ele->
n_nodes(); i_node++)
885 if (found_i_node == -1) found_i_node = i_elm_node;
886 else if (found_i_node != i_elm_node) {
894 if (found_i_node == -1) {
899 node_ids[i] = (
unsigned int)found_i_node;
900 searched_elements.clear();
909 bulk_elements_id.clear();
915 for (
unsigned int j=0; j<elm->n_nodes(); j++) {
916 node_list.push_back( node_ids[ elm->node_idx(j) ] );
919 for (
auto i_elm : candidate_list) {
920 if ( mesh.
element_accessor(i_elm)->
dim() == elm.dim() ) result_list.push_back( elm.index() );
922 if (result_list.size() != 1) {
927 bulk_elements_id[i] = (
LongIdx)result_list[0];
939 boundary_elements_id.clear();
940 boundary_elements_id.resize(bc_mesh->n_elements());
944 for (
auto elm : bc_mesh->elements_range()) {
945 for (
unsigned int j=0; j<elm->n_nodes(); j++) {
946 node_list.push_back( node_ids[ elm->node_idx(j) ] );
949 for (
auto i_elm : candidate_list) {
952 if (result_list.size() != 1) {
957 boundary_elements_id[i] = (
LongIdx)result_list[0];
970 it != region_list.
end();
1009 bih_tree_ = std::make_shared<BIHTree>();
1028 node.
point() = coords;
1033 void Mesh::add_element(
unsigned int elm_id,
unsigned int dim,
unsigned int region_id,
unsigned int partition_id,
1045 WarningOut().fmt(
"Bulk elements of zero size(dim=0) are not supported. Element ID: {}.\n", elm_id);
1049 this->
init_element(ele, elm_id, dim, region_idx, partition_id, node_ids);
1057 ele->
init(dim, region_idx);
1058 ele->
pid_ = partition_id;
1060 for (
unsigned int ni=0; ni<ele->
n_nodes(); ni++) {
1069 WarningOut().fmt(
"Tetrahedron element with id {} has wrong numbering or is degenerated (Jacobian = {}).",elm_id,jac);
1103 ASSERT_DBG(
id<0)(id).error(
"Add boundary element from mesh file trough temporary structure!");
1143 raw_ngh_output_file <<
"// fields:\n//ele_id n_sides ns_side_neighbors[n] neighbors[n*ns] n_vb_neighbors vb_neighbors[n_vb]\n";
1149 unsigned int undefined_ele_id = -1;
1152 if(ele->n_neighs_vb() > 0){
1153 for (
unsigned int i = 0; i < ele->n_neighs_vb(); i++){
1156 auto search = neigh_vb_map.find(higher_ele.
idx());
1157 if(search != neigh_vb_map.end()){
1159 search->second[ele->neigh_vb[i]->side()->side_idx()] = ele.idx();
1164 higher_ele_side_ngh[ele->neigh_vb[i]->side()->side_idx()] = ele.idx();
1165 neigh_vb_map[higher_ele.
idx()] = higher_ele_side_ngh;
1175 auto search_neigh = neigh_vb_map.end();
1176 for (
unsigned int i = 0; i < ele->n_sides(); i++) {
1177 unsigned int n_side_neighs = ele.side(i)->edge()->n_sides-1;
1179 if(n_side_neighs == 0){
1181 if(search_neigh == neigh_vb_map.end())
1182 search_neigh = neigh_vb_map.find(ele.idx());
1184 if(search_neigh != neigh_vb_map.end())
1185 if(search_neigh->second[i] != undefined_ele_id)
1191 for (
unsigned int i = 0; i < ele->n_sides(); i++) {
1193 if(ele.side(i)->edge()->n_sides > 1){
1200 else if(search_neigh != neigh_vb_map.end()
1201 && search_neigh->second[i] != undefined_ele_id){
1208 for (
unsigned int i = 0; i < ele->n_neighs_vb(); i++)
1219 unsigned int i, pos;
1240 std::array<unsigned int, 4> tmp_nodes;
1244 for(
unsigned int i=0; i<elem.
n_nodes(); i++)
1246 tmp_nodes[i] = elem.
nodes_[permutation_vec[i]];
1257 std::array<unsigned int, 4> tmp_nodes;
1261 for(
unsigned int i=0; i<elem.
n_nodes(); i++)
1263 tmp_nodes[i] = elem.
nodes_[permutation_vec[i]];
1276 ASSERT_PTR(
el_4_loc).error(
"Array 'el_4_loc' is not initialized. Did you call Partitioning::id_maps?\n");
1278 unsigned int i_proc, i_node, i_ghost_node, elm_node;
1279 unsigned int my_proc =
el_ds->
myp();
1285 unsigned int n_own_nodes=0, n_ghost_nodes=0;
1287 i_proc = elm.proc();
1288 for (elm_node=0; elm_node<elm->n_nodes(); elm_node++) {
1289 i_node = elm->node_idx(elm_node);
1290 if ( (min_node_proc[i_node]==
Mesh::undef_idx) || (min_node_proc[i_node]>i_proc) ) {
1291 if (i_proc==my_proc) n_own_nodes++;
1292 else if (min_node_proc[i_node]==my_proc) { n_own_nodes--; n_ghost_nodes++; ghost_node_flag[i_node] =
true; }
1293 min_node_proc[i_node] = i_proc;
1294 }
else if ( !ghost_node_flag[i_node] && (i_proc==my_proc) && (min_node_proc[i_node]!=my_proc) ) {
1296 ghost_node_flag[i_node] =
true;
1304 i_ghost_node = n_own_nodes;
1305 for (
unsigned int i=0; i<this->
n_nodes(); ++i) {
1306 if (min_node_proc[i]==my_proc)
node_4_loc_[i_node++] = i;
1307 if (ghost_node_flag[i])
node_4_loc_[i_ghost_node++] = i;
void permute_triangle(unsigned int elm_idx, std::vector< unsigned int > permutation_vec)
Permute nodes of 2D elements of given elm_idx.
static unsigned int permutation_index(unsigned int p[n_nodes_per_side])
Class RefElement defines numbering of vertices, sides, calculation of normal vectors etc.
Mesh * mesh_
Pointer to Mesh to which belonged.
void permute_tetrahedron(unsigned int elm_idx, std::vector< unsigned int > permutation_vec)
Permute nodes of 3D elements of given elm_idx.
vector< Boundary > boundary_
std::string label() const
Returns label of the region (using RegionDB)
static const Input::Type::Selection & get_input_intersection_variant()
The definition of input record for selection of variant of file format.
std::vector< BoundingBox > get_element_boxes()
Compute bounding boxes of elements contained in mesh.
unsigned int edge_idx_
Index of Edge in Mesh.
double tetrahedron_jacobian() const
LongIdx * node_4_loc_
Index set assigning to local node index its global index.
void init_element_vector(unsigned int size)
Initialize element_vec_, set size and reset counters of boundary and bulk elements.
static const unsigned int undef_idx
void create_boundary_elements()
Create boundary elements from data of temporary structure, this method MUST be call after read mesh f...
unsigned int elem_idx_
Index of element in Mesh::element_vec_.
void init_element(Element *ele, unsigned int elm_id, unsigned int dim, RegionIdx region_idx, unsigned int partition_id, std::vector< unsigned int > node_ids)
Initialize element.
unsigned int myp() const
get my processor
static Input::Type::Abstract & get_input_type()
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
virtual Range< ElementAccessor< 3 > > elements_range() const
Returns range of bulk elements.
unsigned int n_sides() const
void reinit(Input::Record in_record)
Support classes for parallel programing.
Main class for computation of intersection of meshes of combined dimensions.
bool compare_points(const arma::vec3 &p1, const arma::vec3 &p2)
unsigned int boundary_loaded_size_
Count of boundary elements loaded from mesh file.
vector< Element > element_vec_
int pid_
Id # of mesh partition.
Dedicated class for storing path to input and output files.
bool is_valid() const
Returns false if the region has undefined/invalid value.
void mark_used_region(unsigned int idx)
static const Input::Type::Record & get_input_type()
Class for O(log N) lookup for intersections with a set of bounding boxes.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
friend class RegionSetBase
unsigned int max_edge_sides_[3]
Maximal number of sides per one edge in the actual mesh (set in make_neighbours_and_edges()).
const Edge * edge() const
Class for the mesh partitioning. This should provide:
void make_edge_permutations()
#define ASSERT_EQ_DBG(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Region get_region(unsigned int id, unsigned int dim)
const Node * node(unsigned int ni) const
Range< NodeAccessor< 3 > > node_range() const
Returns range of nodes.
const LongIdx * get_loc_part() const
unsigned int idx() const
Returns a global index of the region.
unsigned int n_local_nodes_
Hold number of local nodes (own + ghost), value is equal with size of node_4_loc array.
std::string format(CStringRef format_str, ArgList args)
const Element * element() const
void open_stream(Stream &stream) const
void read_regions_from_input(Input::Array region_list)
std::string create_label_from_id(unsigned int id) const
MapElementIDToRegionID el_to_reg_map_
IntersectionSearch get_intersection_search()
Getter for input type selection for intersection search algorithm.
unsigned int n_vb_neighbours() const
Distribution * el_ds
Parallel distribution of elements.
unsigned int id() const
Returns id of the region (using RegionDB)
void intersect_element_lists(vector< unsigned int > const &nodes_list, vector< unsigned int > &intersection_element_list)
void reinit(unsigned int init_size=0)
Reset data of map, allow reserve size.
static const unsigned int undefined_dim
void output_internal_ngh_data()
Output of neighboring data into raw output.
virtual const LongIdx * get_local_part()
BidirectionalMap< int > node_ids_
Maps node ids to indexes into vector node_vec_.
BoundingBox bounding_box() const
void check_mesh_on_read()
void find_point(const Space< 3 >::Point &point, std::vector< unsigned int > &result_list, bool full_list=false) const
bool find_lower_dim_element(vector< unsigned int > &element_list, unsigned int dim, unsigned int &element_idx)
void count_element_types()
const BIHTree & get_bih_tree()
Getter for BIH. Creates and compute BIH at first call.
void distribute_nodes()
Fill array node_4_loc_ and create object node_ds_ according to element distribution.
SideIter side(const unsigned int i) const
BCMesh * get_bc_mesh()
Create boundary mesh if doesn't exist and return it.
bool is_boundary() const
Returns true if it is a Boundary region and false if it is a Bulk region.
LongIdx * el_4_loc
Index set assigning to local element index its global index.
void elements_id_maps(vector< LongIdx > &bulk_elements_id, vector< LongIdx > &boundary_elements_id) const
unsigned int n_neighs_vb_
vector< vector< vector< unsigned int > > > side_nodes
const unsigned int * get_lsizes_array()
get local sizes array
ElementAccessor< 3 > element()
IntersectionSearch
Types of search algorithm for finding intersection candidates.
void resize(unsigned int new_size)
Reset data of map, reserve space for given size.
int find_elem_id(unsigned int pos) const
Return element id (in GMSH file) of element of given position in element vector.
void init(unsigned int dim, RegionIdx reg)
Region find_id(unsigned int id, unsigned int dim) const
ElementAccessor< 3 > element() const
std::shared_ptr< BIHTree > bih_tree_
Distribution * node_ds_
Parallel distribution of nodes. Depends on elements distribution.
virtual bool check_compatible_mesh(Mesh &mesh, vector< LongIdx > &bulk_elements_id, vector< LongIdx > &boundary_elements_id)
unsigned int n_nodes() const
bool same_sides(const SideIter &si, vector< unsigned int > &side_nodes)
void element_to_neigh_vb()
ElementAccessor< 3 > element_accessor(unsigned int idx) const override
Overwrite Mesh::element_accessor()
unsigned int node_idx(unsigned int ni) const
Return index (in Mesh::node_vec) of ni-th node.
void check_element_size(unsigned int elem_idx) const
Check if given index is in element_vec_.
void add_element(unsigned int elm_id, unsigned int dim, unsigned int region_id, unsigned int partition_id, std::vector< unsigned int > node_ids)
Add new element of given id to mesh.
unsigned int side_idx() const
static const Input::Type::Record & get_input_type()
Region implicit_boundary_region()
virtual ~Mesh()
Destructor.
std::array< unsigned int, 4 > nodes_
indices to element's nodes
void create_node_element_lists()
std::vector< Edge > edges
Vector of MH edges, this should not be part of the geometrical mesh.
NodeAccessor< 3 > node_accessor(unsigned int ni) const
unsigned int edge_idx(unsigned int edg_idx) const
Return edge_idx of given index.
void modify_element_ids(const RegionDB::MapElementIDToRegionID &map)
unsigned int n_sides() const
int elem_index(int elem_id) const
For element of given elem_id returns index in element_vec_ or (-1) if element doesn't exist.
void make_neighbours_and_edges()
void init_node_vector(unsigned int size)
Initialize node_vec_, set size.
#define WarningOut()
Macro defining 'warning' record of log.
int node_index(int node_id) const
For node of given node_id returns index in element_vec_ or (-1) if node doesn't exist.
Class represents boundary part of mesh.
vector< vector< unsigned int > > node_elements_
For each node the vector contains a list of elements that use this node.
#define ASSERT_LT_DBG(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.
BidirectionalMap< int > element_ids_
Maps element ids to indexes into vector element_vec_.
void set_item(T val, unsigned int pos)
void add_node(unsigned int node_id, arma::vec3 coords)
Add new node of given id and coordinates to mesh.
vector< ElementTmpData > bc_element_tmp_
Hold data of boundary elements during reading mesh (allow to preserve correct order during reading of...
NodeAccessor< 3 > node_accessor(unsigned int idx) const
Create and return NodeAccessor to node of given idx.
unsigned int idx() const
Return local idx of element in boundary / bulk part of element vector.
Region add_region(unsigned int id, const std::string &label, unsigned int dim, const std::string &address="implicit")
std::shared_ptr< Partitioning > part_
unsigned int bulk_size_
Count of bulk elements.
unsigned int add_item(T val)
Add new item at the end position of map.
void print_region_table(std::ostream &stream) const
LongIdx * row_4_el
Index set assigning to global element index the local index used in parallel vectors.
Element * add_element_to_vector(int id, bool boundary=false)
Adds element to mesh data structures (element_vec_, element_ids_), returns pointer to this element.
const vector< vector< unsigned int > > & node_elements()
double global_snap_radius() const
Maximal distance of observe point from Mesh relative to its size.
virtual unsigned int n_elements(bool boundary=false) const
Returns count of boundary or bulk elements.
virtual Partitioning * get_part()
NodeAccessor< 3 > node(unsigned int i) const
BCMesh * bc_mesh_
Boundary mesh, object is created only if it's necessary.
MixedMeshIntersections & mixed_intersections()
#define DebugOut()
Macro defining 'debug' record of log.
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
SideIter side(const unsigned int loc_index)
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
virtual unsigned int n_nodes() const
#define START_TIMER(tag)
Starts a timer with specified tag.
ofstream raw_ngh_output_file
int find_node_id(unsigned int pos) const
Return node id (in GMSH file) of node of given position in node vector.
unsigned int * boundary_idx_
void add_physical_name(unsigned int dim, unsigned int id, std::string name)
Add new node of given id and coordinates to mesh.
vector< Neighbour > vb_neighbours_
unsigned int n_nodes() const
Implementation of range helper class.
#define MessageOut()
Macro defining 'message' record of log.
std::shared_ptr< MixedMeshIntersections > intersections