36 UnstructuredMesh (comm_in,d), _is_serial(true),
37 _n_nodes(0), _n_elem(0), _max_node_id(0), _max_elem_id(0),
42 #ifdef LIBMESH_ENABLE_UNIQUE_ID
46 #ifdef LIBMESH_ENABLE_UNIQUE_ID
55 #ifndef LIBMESH_DISABLE_COMMWORLD
59 UnstructuredMesh (d), _is_serial(true),
60 _n_nodes(0), _n_elem(0), _max_node_id(0), _max_elem_id(0),
65 #ifdef LIBMESH_ENABLE_UNIQUE_ID
69 #ifdef LIBMESH_ENABLE_UNIQUE_ID
74 _partitioner = UniquePtr<Partitioner>(
new ParmetisPartitioner());
79 ParallelMesh::~ParallelMesh ()
90 _n_nodes(0), _n_elem(0), _max_node_id(0), _max_elem_id(0),
109 #ifdef LIBMESH_ENABLE_UNIQUE_ID
128 _n_nodes(0), _n_elem(0), _max_node_id(0), _max_elem_id(0),
137 #ifdef LIBMESH_ENABLE_UNIQUE_ID
151 parallel_object_only();
176 #ifdef LIBMESH_ENABLE_UNIQUE_ID
193 parallel_object_only();
206 parallel_object_only();
219 for (; rit != rend; ++rit)
222 libmesh_assert_equal_to(rit->second->id(), rit->first);
223 max_local = rit->first + 1;
233 #ifdef LIBMESH_ENABLE_UNIQUE_ID
237 parallel_object_only();
251 parallel_object_only();
264 parallel_object_only();
277 for (; rit != rend; ++rit)
280 libmesh_assert_equal_to(rit->second->id(), rit->first);
281 max_local = rit->first + 1;
294 libmesh_assert_equal_to (
_nodes[i]->
id(), i);
306 libmesh_assert_equal_to (
_nodes[i]->
id(), i);
318 libmesh_assert_equal_to (
_nodes[i]->
id(), i);
328 libmesh_assert_equal_to (
_nodes[i]->
id(), i);
339 libmesh_assert_equal_to (
_nodes[i]->
id(), i);
349 std::map<dof_id_type, Node *>::const_iterator it =
_nodes.find(i);
350 if (it !=
_nodes.end().it)
352 const Node * n = it->second;
365 std::map<dof_id_type, Node *>::const_iterator it =
_nodes.find(i);
366 if (it !=
_nodes.end().it)
368 Node * n = it->second;
382 libmesh_assert_equal_to (
_elements[i]->
id(), i);
393 libmesh_assert_equal_to (
_elements[i]->
id(), i);
403 std::map<dof_id_type, Elem *>::const_iterator it =
_elements.find(i);
406 const Elem * e = it->second;
419 std::map<dof_id_type, Elem *>::const_iterator it =
_elements.find(i);
466 static_cast<dof_id_type>(e->
id()+1));
496 #ifdef LIBMESH_ENABLE_UNIQUE_ID
535 #ifdef LIBMESH_ENABLE_UNIQUE_ID
597 libmesh_assert_equal_to (el->
id(), old_id);
615 libmesh_assert_equal_to (n->
id(), id);
618 n->processor_id() = proc_id;
664 static_cast<dof_id_type>(n->
id()+1));
694 #ifdef LIBMESH_ENABLE_UNIQUE_ID
770 libmesh_assert_equal_to (nd->
id(), old_id);
782 #ifdef LIBMESH_ENABLE_NODE_CONSTRAINTS
814 for (; it !=
end; ++it)
828 for (; it !=
end; ++it)
890 template <
typename T>
894 parallel_object_only();
902 T * obj = objects[i];
913 const dof_id_type procid = obj && obj->valid_processor_id() ?
935 #ifdef LIBMESH_ENABLE_UNIQUE_ID
956 parallel_object_only();
976 #ifdef LIBMESH_ENABLE_AMR
978 parallel_object_only();
986 unsigned int refinement_flag = el ?
988 unsigned int p_refinement_flag = el ?
997 #endif // LIBMESH_ENABLE_AMR
1002 template <
typename T>
1007 parallel_object_only();
1015 std::vector<dof_id_type>
1018 object_iterator it = objects.
begin();
1019 object_iterator
end = objects.
end();
1028 objects.
erase(it++);
1033 unpartitioned_objects++;
1035 ghost_objects_from_proc[obj_procid]++;
1040 std::vector<dof_id_type> objects_on_proc(this->
n_processors(), 0);
1047 libmesh_assert_less_equal (ghost_objects_from_proc[p], objects_on_proc[p]);
1051 std::vector<dof_id_type> first_object_on_proc(this->
n_processors());
1053 first_object_on_proc[i] = first_object_on_proc[i-1] +
1054 objects_on_proc[i-1];
1059 unpartitioned_objects;
1065 std::vector<std::vector<dof_id_type> >
1068 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1069 std::vector<std::vector<unique_id_type> >
1078 requested_ids[p].reserve(ghost_objects_from_proc[p]);
1079 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1080 requested_unique_ids[p].reserve(ghost_objects_from_proc[p]);
1084 end = objects.
end();
1085 for (it = objects.
begin(); it !=
end; ++it)
1089 obj->set_id(next_id++);
1092 requested_ids[obj->processor_id()].push_back(obj->id());
1093 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1112 std::vector<dof_id_type> request_to_fill;
1114 procdown, request_to_fill);
1116 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1117 std::vector<unique_id_type> unique_request_to_fill;
1119 procdown, unique_request_to_fill);
1120 std::vector<unique_id_type> new_unique_ids(unique_request_to_fill.size());
1124 std::vector<dof_id_type> new_ids(request_to_fill.size());
1125 for (std::size_t i=0; i != request_to_fill.size(); ++i)
1127 T * obj = objects[request_to_fill[i]];
1129 libmesh_assert_equal_to (obj->processor_id(), this->
processor_id());
1130 new_ids[i] = obj->id();
1131 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1135 libmesh_assert_greater_equal (new_ids[i],
1137 libmesh_assert_less (new_ids[i],
1143 std::vector<dof_id_type> filled_request;
1145 procup, filled_request);
1147 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1148 std::vector<unique_id_type> unique_filled_request;
1150 procup, unique_filled_request);
1154 for (std::size_t i=0; i != filled_request.size(); ++i)
1156 T * obj = objects[requested_ids[procup][i]];
1158 libmesh_assert_equal_to (obj->processor_id(), procup);
1159 libmesh_assert_greater_equal (filled_request[i],
1160 first_object_on_proc[procup]);
1161 libmesh_assert_less (filled_request[i],
1162 first_object_on_proc[procup] +
1163 objects_on_proc[procup]);
1164 obj->set_id(filled_request[i]);
1166 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1168 obj->set_unique_id() = unique_filled_request[i];
1177 next_id += objects_on_proc[i];
1178 for (it = objects.
begin(); it !=
end; ++it)
1182 obj->set_id(next_id++);
1187 end = objects.
end();
1188 for (it = objects.
begin(); it !=
end;)
1193 T *
next = objects[obj->id()];
1207 libmesh_assert_not_equal_to (next->id(), obj->id());
1208 objects[obj->id()] = obj;
1210 next = objects[obj->id()];
1212 objects[obj->id()] = obj;
1218 objects.
erase(it++);
1223 return first_free_id;
1229 parallel_object_only();
1238 START_LOG(
"renumber_nodes_and_elements()",
"ParallelMesh");
1240 std::set<dof_id_type> used_nodes;
1247 for (; it !=
end; ++it)
1251 for (
unsigned int n=0; n != el->
n_nodes(); ++n)
1252 used_nodes.insert(el->
node(n));
1267 else if (!used_nodes.count(nd->
id()))
1286 STOP_LOG(
"renumber_nodes_and_elements()",
"ParallelMesh");
1307 libmesh_assert_equal_to (this->
max_node_id(), pmax_node_id);
1308 libmesh_assert_equal_to (this->
max_elem_id(), pmax_elem_id);
1320 STOP_LOG(
"renumber_nodes_and_elements()",
"ParallelMesh");
1338 for (; it !=
end; ++it)
1340 it->second->set_id() = it->first;
1349 for (; it !=
end; ++it)
1351 it->second->set_id() = it->first;
1359 parallel_object_only();
1365 this->
comm().
sum(active_elements);
1373 return active_elements;
1395 libmesh_assert_equal_to (this->
max_node_id(), pmax_node_id);
1396 libmesh_assert_equal_to (this->
max_elem_id(), pmax_elem_id);
1408 for (; e_it != e_end;)
1416 for (; n_it != n_end;)
1470 libmesh_assert_equal_to (this->
max_node_id(), pmax_node_id);
1471 libmesh_assert_equal_to (this->
max_elem_id(), pmax_elem_id);
virtual const Point & point(const dof_id_type i) const libmesh_override
virtual void update_post_partitioning() libmesh_override
std::map< index_t, Val > maptype
std::set< Elem * > _extra_ghost_elems
const BoundaryInfo & get_boundary_info() const
unique_id_type & set_unique_id()
virtual const Node * node_ptr(const dof_id_type i) const libmesh_override
bool _skip_renumber_nodes_and_elements
mapvector< Node *, dof_id_type > _nodes
virtual unique_id_type parallel_max_unique_id() const =0
dof_id_type parallel_max_node_id() const
const unsigned int invalid_uint
virtual void allgather() libmesh_override
libmesh_assert(remote_elem)
virtual void copy_nodes_and_elements(const UnstructuredMesh &other_mesh, const bool skip_find_neighbors=false)
STOP_LOG("std::sqrt()","ExactErrorEstimator")
unsigned int p_level() const
dof_id_type n_local_nodes() const
dof_id_type _next_free_unpartitioned_elem_id
virtual void renumber_nodes_and_elements() libmesh_override
virtual const Node & node(const dof_id_type i) const libmesh_override
void remove(const Node *node)
dof_id_type n_unpartitioned_elem() const
mapvector< Elem *, dof_id_type > _elements
processor_id_type n_processors() const
uint8_t processor_id_type
virtual element_iterator active_local_elements_end() libmesh_override
const class libmesh_nullptr_t libmesh_nullptr
static UniquePtr< Node > build(const Node &n)
void libmesh_assert_valid_parallel_object_ids(const mapvector< T *, dof_id_type > &) const
ParallelMesh(const Parallel::Communicator &comm_in, unsigned char dim=1)
virtual void update_parallel_id_counts() libmesh_override
virtual Node * add_node(Node *n) libmesh_override
virtual bool is_serial() const libmesh_override
virtual void libmesh_assert_valid_parallel_ids() const libmesh_override
dof_id_type parallel_max_elem_id() const
virtual dof_id_type max_elem_id() const libmesh_override
void redistribute(ParallelMesh &) const
virtual void fix_broken_node_and_element_numbering() libmesh_override
virtual void renumber_node(dof_id_type old_id, dof_id_type new_id) libmesh_override
long double max(long double a, double b)
virtual void find_neighbors(const bool reset_remote_elements=false, const bool reset_current_list=true) libmesh_override
virtual const Node * query_node_ptr(const dof_id_type i) const libmesh_override
virtual void clear() libmesh_override
bool valid_unique_id() const
std::unique_ptr< T > UniquePtr
virtual const Elem * query_elem(const dof_id_type i) const libmesh_override
dof_id_type _next_free_local_elem_id
unique_id_type _next_unique_id
virtual element_iterator active_pid_elements_begin(processor_id_type proc_id) libmesh_override
virtual Elem * add_elem(Elem *e) libmesh_override
dof_id_type renumber_dof_objects(mapvector< T *, dof_id_type > &)
virtual dof_id_type n_nodes() const libmesh_override
virtual void delete_elem(Elem *e) libmesh_override
virtual dof_id_type n_elem() const libmesh_override
virtual unsigned int n_nodes() const =0
static const unique_id_type invalid_unique_id
static const processor_id_type invalid_processor_id
void libmesh_assert_valid_parallel_p_levels() const
void delete_remote_elements(ParallelMesh &, const std::set< Elem * > &) const
virtual void delete_node(Node *n) libmesh_override
virtual void delete_remote_elements() libmesh_override
static const dof_id_type invalid_id
dof_id_type n_unpartitioned_nodes() const
RefinementState p_refinement_flag() const
void libmesh_assert_valid_parallel_flags() const
virtual Node * insert_node(Node *n) libmesh_override
dof_id_type node(const unsigned int i) const
dof_id_type _next_free_local_node_id
virtual element_iterator elements_begin() libmesh_override
virtual void renumber_elem(dof_id_type old_id, dof_id_type new_id) libmesh_override
void allgather(ParallelMesh &mesh) const
virtual void redistribute() libmesh_override
virtual Elem * insert_elem(Elem *e) libmesh_override
virtual element_iterator active_local_elements_begin() libmesh_override
dof_id_type n_local_elem() const
void allgather(T send, std::vector< T > &recv) const
bool verify(const T &r, const Communicator &comm=Communicator_World)
virtual dof_id_type parallel_n_nodes() const libmesh_override
const Parallel::Communicator & comm() const
dof_id_type _next_free_unpartitioned_node_id
virtual void add_extra_ghost_elem(Elem *e)
virtual dof_id_type parallel_n_elem() const libmesh_override
virtual unique_id_type parallel_max_unique_id() const libmesh_override
virtual dof_id_type n_active_elem() const libmesh_override
RefinementState refinement_flag() const
void send_receive(const unsigned int dest_processor_id, T1 &send, const unsigned int source_processor_id, T2 &recv, const MessageTag &send_tag=no_tag, const MessageTag &recv_tag=any_tag) const
virtual const Elem * elem(const dof_id_type i) const libmesh_override
virtual dof_id_type max_node_id() const libmesh_override
virtual element_iterator elements_end() libmesh_override
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id) libmesh_override
processor_id_type processor_id()
virtual element_iterator active_pid_elements_end(processor_id_type proc_id) libmesh_override
ParallelMesh::ParallelMesh(const Parallel::Communicator &comm_in, unsigned char d) _partitioner
unique_id_type _next_unpartitioned_unique_id
processor_id_type processor_id() const
processor_id_type processor_id() const
START_LOG("std::sqrt()","ExactErrorEstimator")
processor_id_type n_processors()