32 #include "libmesh/bounding_box.h" 33 #include "libmesh/boundary_info.h" 34 #include "libmesh/mesh_tools.h" 35 #include "libmesh/parallel.h" 36 #include "libmesh/mesh_communication.h" 37 #include "libmesh/periodic_boundary_base.h" 38 #include "libmesh/fe_base.h" 39 #include "libmesh/fe_interface.h" 40 #include "libmesh/mesh_communication.h" 41 #include "libmesh/mesh_tools.h" 42 #include "libmesh/parallel.h" 43 #include "libmesh/parallel_elem.h" 44 #include "libmesh/parallel_node.h" 45 #include "libmesh/parallel_ghost_sync.h" 46 #include "libmesh/utility.h" 47 #include "libmesh/remote_elem.h" 48 #include "libmesh/linear_partitioner.h" 49 #include "libmesh/centroid_partitioner.h" 50 #include "libmesh/parmetis_partitioner.h" 51 #include "libmesh/hilbert_sfc_partitioner.h" 52 #include "libmesh/morton_sfc_partitioner.h" 53 #include "libmesh/edge_edge2.h" 54 #include "libmesh/mesh_refinement.h" 55 #include "libmesh/quadrature.h" 56 #include "libmesh/boundary_info.h" 57 #include "libmesh/periodic_boundaries.h" 58 #include "libmesh/quadrature_gauss.h" 59 #include "libmesh/point_locator_base.h" 60 #include "libmesh/default_coupling.h" 61 #include "libmesh/ghost_point_neighbors.h" 62 #include "libmesh/fe_type.h" 63 #include "libmesh/enum_to_string.h" 64 #include "libmesh/elem_side_builder.h" 69 #if NANOFLANN_VERSION < 0x150 74 template <
typename T,
typename U>
86 MooseEnum parallel_type(
"DEFAULT REPLICATED DISTRIBUTED",
"DEFAULT");
89 "DEFAULT: Use libMesh::ReplicatedMesh unless --distributed-mesh is " 90 "specified on the command line " 91 "REPLICATED: Always use libMesh::ReplicatedMesh " 92 "DISTRIBUTED: Always use libMesh::DistributedMesh");
97 "If allow_renumbering=false, node and element numbers are kept fixed until deletion");
102 "Specifies a mesh partitioner to use when splitting the mesh for a parallel computation.");
106 "Specifies the sort direction if using the centroid partitioner. " 107 "Available options: x, y, z, radial");
109 MooseEnum patch_update_strategy(
"never always auto iteration",
"never");
111 "patch_update_strategy",
112 patch_update_strategy,
113 "How often to update the geometric search 'patch'. The default is to " 114 "never update it (which is the most efficient but could be a problem " 115 "with lots of relative motion). 'always' will update the patch for all " 116 "secondary nodes at the beginning of every timestep which might be time " 117 "consuming. 'auto' will attempt to determine at the start of which " 118 "timesteps the patch for all secondary nodes needs to be updated automatically." 119 "'iteration' updates the patch at every nonlinear iteration for a " 120 "subset of secondary nodes for which penetration is not detected. If there " 121 "can be substantial relative motion between the primary and secondary surfaces " 122 "during the nonlinear iterations within a timestep, it is advisable to use " 123 "'iteration' option to ensure accurate contact detection.");
127 "construct_node_list_from_side_list",
129 "Whether or not to generate nodesets from the sidesets (currently often required).");
131 "displace_node_list_by_side_list",
133 "Whether to renumber existing nodesets with ids matching sidesets that " 134 "lack names matching sidesets, when constructing nodesets from sidesets via the default " 135 "'construct_node_list_from_side_list' option, rather than to merge them with the sideset.");
137 "patch_size", 40,
"The number of nodes to consider in the NearestNode neighborhood.");
138 params.
addParam<
unsigned int>(
"ghosting_patch_size",
139 "The number of nearest neighbors considered " 140 "for ghosting purposes when 'iteration' " 141 "patch update strategy is used. Default is " 143 params.
addParam<
unsigned int>(
"max_leaf_size",
145 "The maximum number of points in each leaf of the KDTree used in " 146 "the nearest neighbor search. As the leaf size becomes larger," 147 "KDTree construction becomes faster but the nearest neighbor search" 150 params.
addParam<
bool>(
"build_all_side_lowerd_mesh",
152 "True to build the lower-dimensional mesh for all sides.");
154 params.
addParam<
bool>(
"skip_refine_when_use_split",
156 "True to skip uniform refinements when using a pre-split mesh.");
158 params.
addParam<std::vector<SubdomainID>>(
160 "The listed subdomain ids will be assumed valid for the mesh. This permits setting up " 161 "subdomain restrictions for subdomains initially containing no elements, which can occur, " 162 "for example, in additive manufacturing simulations which dynamically add and remove " 163 "elements. Names for this subdomains may be provided using add_subdomain_names. In this case " 164 "this list and add_subdomain_names must contain the same number of items.");
165 params.
addParam<std::vector<SubdomainName>>(
166 "add_subdomain_names",
167 "The listed subdomain names will be assumed valid for the mesh. This permits setting up " 168 "subdomain restrictions for subdomains initially containing no elements, which can occur, " 169 "for example, in additive manufacturing simulations which dynamically add and remove " 170 "elements. IDs for this subdomains may be provided using add_subdomain_ids. Otherwise IDs " 171 "are automatically assigned. In case add_subdomain_ids is set too, both lists must contain " 172 "the same number of items.");
174 params.
addParam<std::vector<BoundaryID>>(
176 "The listed sideset ids will be assumed valid for the mesh. This permits setting up boundary " 177 "restrictions for sidesets initially containing no sides. Names for this sidesets may be " 178 "provided using add_sideset_names. In this case this list and add_sideset_names must contain " 179 "the same number of items.");
180 params.
addParam<std::vector<BoundaryName>>(
182 "The listed sideset names will be assumed valid for the mesh. This permits setting up " 183 "boundary restrictions for sidesets initially containing no sides. Ids for this sidesets may " 184 "be provided using add_sideset_ids. In this case this list and add_sideset_ids must contain " 185 "the same number of items.");
187 params.
addParam<std::vector<BoundaryID>>(
189 "The listed nodeset ids will be assumed valid for the mesh. This permits setting up boundary " 190 "restrictions for node initially containing no sides. Names for this nodesets may be " 191 "provided using add_nodeset_names. In this case this list and add_nodeset_names must contain " 192 "the same number of items.");
193 params.
addParam<std::vector<BoundaryName>>(
195 "The listed nodeset names will be assumed valid for the mesh. This permits setting up " 196 "boundary restrictions for nodesets initially containing no sides. Ids for this nodesets may " 197 "be provided using add_nodesets_ids. In this case this list and add_nodesets_ids must " 198 "contain the same number of items.");
204 params.addPrivateParam<
bool>(
"_mesh_generator_mesh",
false);
207 params.addPrivateParam<
bool>(
"_is_split",
false);
209 params.registerBase(
"MooseMesh");
212 params.addParamNamesToGroup(
"patch_update_strategy patch_size max_leaf_size",
"Geometric search");
213 params.addParamNamesToGroup(
"add_subdomain_ids add_subdomain_names add_sideset_ids " 214 "add_sideset_names add_nodeset_ids add_nodeset_names",
215 "Pre-declaration of future mesh sub-entities");
216 params.addParamNamesToGroup(
"construct_node_list_from_side_list build_all_side_lowerd_mesh " 217 "displace_node_list_by_side_list",
218 "Automatic definition of mesh element sides entities");
219 params.addParamNamesToGroup(
"partitioner centroid_partitioner_direction",
"Partitioning");
229 _use_distributed_mesh(false),
230 _distribution_overridden(false),
231 _parallel_type_overridden(false),
233 _partitioner_name(getParam<
MooseEnum>(
"partitioner")),
234 _partitioner_overridden(false),
235 _custom_partitioner_requested(false),
236 _uniform_refine_level(0),
237 _skip_refine_when_use_split(getParam<bool>(
"skip_refine_when_use_split")),
238 _skip_deletion_repartition_after_refine(false),
240 _node_to_elem_map_built(false),
241 _node_to_active_semilocal_elem_map_built(false),
242 _patch_size(getParam<unsigned
int>(
"patch_size")),
243 _ghosting_patch_size(isParamValid(
"ghosting_patch_size")
244 ? getParam<unsigned
int>(
"ghosting_patch_size")
246 _max_leaf_size(getParam<unsigned
int>(
"max_leaf_size")),
247 _patch_update_strategy(
249 _regular_orthogonal_mesh(false),
250 _is_split(getParam<bool>(
"_is_split")),
251 _allow_recovery(true),
252 _construct_node_list_from_side_list(getParam<bool>(
"construct_node_list_from_side_list")),
253 _displace_node_list_by_side_list(getParam<bool>(
"displace_node_list_by_side_list")),
255 _allow_remote_element_removal(true),
256 _need_ghost_ghosted_boundaries(true),
257 _is_displaced(false),
260 _rz_coord_axis(getParam<
MooseEnum>(
"rz_coord_axis")),
261 _coord_system_set(false),
262 _doing_p_refinement(false)
265 mooseError(
"Ghosting patch size parameter has to be set in the mesh block " 266 "only when 'iteration' patch update strategy is used.");
272 "You set both 'Mesh/block' and 'Mesh/coord_block'. The value of " 273 "'Mesh/coord_block' will be used.");
280 if (getParam<bool>(
"build_all_side_lowerd_mesh"))
286 #ifdef MOOSE_KOKKOS_ENABLED 288 _kokkos_mesh = std::make_unique<Moose::Kokkos::Mesh>(*
this);
296 _built_from_other_mesh(true),
297 _parallel_type(other_mesh._parallel_type),
298 _use_distributed_mesh(other_mesh._use_distributed_mesh),
299 _distribution_overridden(other_mesh._distribution_overridden),
300 _parallel_type_overridden(other_mesh._parallel_type_overridden),
301 _mesh(other_mesh.getMesh().clone()),
302 _partitioner_name(other_mesh._partitioner_name),
303 _partitioner_overridden(other_mesh._partitioner_overridden),
304 _custom_partitioner_requested(other_mesh._custom_partitioner_requested),
305 _uniform_refine_level(other_mesh.uniformRefineLevel()),
306 _skip_refine_when_use_split(other_mesh._skip_refine_when_use_split),
307 _skip_deletion_repartition_after_refine(other_mesh._skip_deletion_repartition_after_refine),
308 _is_nemesis(other_mesh._is_nemesis),
309 _node_to_elem_map_built(false),
310 _node_to_active_semilocal_elem_map_built(false),
311 _patch_size(other_mesh._patch_size),
312 _ghosting_patch_size(other_mesh._ghosting_patch_size),
313 _max_leaf_size(other_mesh._max_leaf_size),
314 _patch_update_strategy(other_mesh._patch_update_strategy),
315 _regular_orthogonal_mesh(false),
316 _is_split(other_mesh._is_split),
317 _lower_d_interior_blocks(other_mesh._lower_d_interior_blocks),
318 _lower_d_boundary_blocks(other_mesh._lower_d_boundary_blocks),
319 _allow_recovery(other_mesh._allow_recovery),
320 _construct_node_list_from_side_list(other_mesh._construct_node_list_from_side_list),
321 _displace_node_list_by_side_list(other_mesh._displace_node_list_by_side_list),
322 _need_delete(other_mesh._need_delete),
323 _allow_remote_element_removal(other_mesh._allow_remote_element_removal),
324 _need_ghost_ghosted_boundaries(other_mesh._need_ghost_ghosted_boundaries),
325 _coord_sys(other_mesh._coord_sys),
326 _rz_coord_axis(other_mesh._rz_coord_axis),
327 _subdomain_id_to_rz_coord_axis(other_mesh._subdomain_id_to_rz_coord_axis),
328 _coord_system_set(other_mesh._coord_system_set),
329 _provided_coord_blocks(other_mesh._provided_coord_blocks),
330 _doing_p_refinement(other_mesh._doing_p_refinement)
333 for (std::size_t i = 0; i <
_bounds.size(); ++i)
336 for (std::size_t j = 0; j <
_bounds[i].size(); ++j)
342 #ifdef MOOSE_KOKKOS_ENABLED 344 _kokkos_mesh = std::make_unique<Moose::Kokkos::Mesh>(*
this);
391 TIME_SECTION(
"prepare", 2,
"Preparing Mesh",
true);
393 bool libmesh_mesh_prepared =
false;
395 mooseAssert(
_mesh,
"The MeshBase has not been constructed");
404 "The mesh we wish to clone from must already be prepared");
408 else if (!
_mesh->is_prepared())
410 _mesh->complete_preparation();
412 libmesh_mesh_prepared =
true;
416 return libmesh_mesh_prepared;
420 for (
const auto &
elem :
getMesh().element_ptr_range())
427 const auto & add_subdomain_id = getParam<std::vector<SubdomainID>>(
"add_subdomain_ids");
432 const auto add_subdomain =
433 getParam<SubdomainID, SubdomainName>(
"add_subdomain_ids",
"add_subdomain_names");
434 for (
const auto & [sub_id, sub_name] : add_subdomain)
445 const auto & add_subdomain_names = getParam<std::vector<SubdomainName>>(
"add_subdomain_names");
453 for (
const SubdomainName & sub_name : add_subdomain_names)
458 const auto sub_id = ++offset;
473 const std::set<BoundaryID> & local_node_bids =
477 const std::set<BoundaryID> & local_side_bids =
483 auto add_sets = [
this](
const bool sidesets,
auto & set_ids)
485 const std::string
type = sidesets ?
"sideset" :
"nodeset";
486 const std::string id_param =
"add_" +
type +
"_ids";
491 const auto & add_ids = getParam<std::vector<BoundaryID>>(id_param);
493 set_ids.insert(add_ids.begin(), add_ids.end());
496 const auto & add_names = getParam<std::vector<BoundaryName>>(
name_param);
497 mooseAssert(add_names.size() == add_ids.size(),
498 "Id and name sets must be the same size when adding.");
506 const auto & add_names = getParam<std::vector<BoundaryName>>(
name_param);
512 if (!mesh_ids.empty())
513 offset = *mesh_ids.rbegin();
518 for (
const auto &
name : add_names)
523 const auto id = ++offset;
551 "Trying to set coordinate system type information based on the user input file, but " 552 "the coordinate system type information has already been set programmatically! " 553 "Either remove your coordinate system type information from the input file, or contact " 554 "your application developer");
561 const auto rz_coord_blocks = getParam<std::vector<SubdomainName>>(
"rz_coord_blocks");
562 const auto rz_coord_origins = getParam<std::vector<Point>>(
"rz_coord_origins");
563 const auto rz_coord_directions = getParam<std::vector<RealVectorValue>>(
"rz_coord_directions");
564 if (rz_coord_origins.size() == rz_coord_blocks.size() &&
565 rz_coord_directions.size() == rz_coord_blocks.size())
567 std::vector<std::pair<Point, RealVectorValue>> rz_coord_axes;
568 for (
unsigned int i = 0; i < rz_coord_origins.size(); ++i)
569 rz_coord_axes.push_back(std::make_pair(rz_coord_origins[i], rz_coord_directions[i]));
574 mooseError(
"The parameter 'rz_coord_axis' may not be provided if 'rz_coord_blocks', " 575 "'rz_coord_origins', and 'rz_coord_directions' are provided.");
578 mooseError(
"The parameters 'rz_coord_blocks', 'rz_coord_origins', and " 579 "'rz_coord_directions' must all have the same size.");
583 mooseError(
"If any of the parameters 'rz_coord_blocks', 'rz_coord_origins', and " 584 "'rz_coord_directions' are provided, then all must be provided.");
595 return libmesh_mesh_prepared;
601 TIME_SECTION(
"update", 3,
"Updating Mesh",
true);
619 for (
const auto &
elem :
getMesh().active_local_element_ptr_range())
634 #ifdef MOOSE_KOKKOS_ENABLED 664 "Hybrid finite element method must use replicated mesh.\nCurrently lower-dimensional mesh " 665 "does not support mesh re-partitioning and a debug assertion being hit related with " 666 "neighbors of lower-dimensional element, with distributed mesh.");
673 unsigned int max_n_sides = 0;
676 std::set<Elem *> deleteable_elems;
677 for (
auto &
elem :
mesh.element_ptr_range())
680 deleteable_elems.insert(
elem);
684 for (
auto &
elem : deleteable_elems)
695 deleteable_elems.clear();
698 std::set<int> interior_side_types;
699 std::set<int> boundary_side_types;
700 for (
const auto &
elem :
mesh.active_element_ptr_range())
706 interior_side_types.insert(side_elem->type());
708 boundary_side_types.insert(side_elem->type());
714 std::map<ElemType, SubdomainID> interior_block_ids;
715 std::map<ElemType, SubdomainID> boundary_block_ids;
718 for (
const auto & tpid : interior_side_types)
722 interior_block_ids[
type] = id;
725 mooseError(
"Trying to add a mesh block with id ",
id,
" that has existed in the mesh");
729 for (
const auto & tpid : boundary_side_types)
733 boundary_block_ids[
type] = id;
736 mooseError(
"Trying to add a mesh block with id ",
id,
" that has existed in the mesh");
744 std::vector<Elem *> side_elems;
746 for (
const auto &
elem :
mesh.active_element_ptr_range())
756 bool build_side =
false;
761 mooseAssert(!neig->
is_remote(),
"We error if the mesh is not serial");
777 side_elem->subdomain_id() = interior_block_ids.at(side_elem->type());
779 side_elem->subdomain_id() = boundary_block_ids.at(side_elem->type());
782 side_elem->set_id(max_elem_id +
elem->
id() * max_n_sides + side);
783 side_elem->set_unique_id(max_unique_id +
elem->
id() * max_n_sides + side);
788 side_elem->set_interior_parent(
elem);
790 side_elems.push_back(side_elem.release());
793 auto pair = std::make_pair(
elem, side);
794 auto link = std::make_pair(pair, side_elems.back());
795 auto ilink = std::make_pair(side_elems.back(), side);
806 for (
auto &
elem : side_elems)
822 mooseDeprecated(
"MooseMesh::node() is deprecated, please use MooseMesh::nodeRef() instead");
829 mooseDeprecated(
"MooseMesh::node() is deprecated, please use MooseMesh::nodeRef() instead");
837 mooseAssert(node_ptr,
"Missing node");
862 if (i >
getMesh().max_node_id())
867 auto & node_ptr = it->second;
868 mooseAssert(node_ptr,
"Uninitialized quadrature node");
884 TIME_SECTION(
"meshChanged", 3,
"Updating Because Mesh Changed");
915 TIME_SECTION(
"cacheChangedLists", 5,
"Caching Changed Lists");
919 Threads::parallel_reduce(elem_range, cclt);
942 const std::vector<const Elem *> &
947 return elem_to_child_pair->second;
953 TIME_SECTION(
"updateActiveSemiLocalNodeRange", 5,
"Updating ActiveSemiLocalNode Range");
959 for (
const auto &
elem : *active_local_elems)
975 for (
const auto & ghost_elem_id : ghosted_elems)
1027 TIME_SECTION(
"buildNodeList", 5,
"Building Node List");
1033 int n = bc_tuples.size();
1036 for (
const auto & t : bc_tuples)
1038 auto node_id = std::get<0>(t);
1039 auto bc_id = std::get<1>(t);
1072 for (
unsigned int side = 0; side <
elem->
n_sides(); ++side)
1095 for (
const auto &
elem :
getMesh().active_local_element_ptr_range())
1096 for (
unsigned int i = 0; i < n; ++i)
1104 for (
unsigned int j = 0; j < n; ++j)
1112 for (
unsigned int i = 0; i < n; ++i)
1122 std::unordered_map<dof_id_type, std::set<dof_id_type>>
1127 if (!mesh_base.has_elem_integer(from_id_name))
1128 mooseError(
"Mesh does not have the element integer name '", from_id_name,
"'");
1129 if (!mesh_base.has_elem_integer(to_id_name))
1130 mooseError(
"Mesh does not have the element integer name '", to_id_name,
"'");
1132 const auto id1 = mesh_base.get_elem_integer_index(from_id_name);
1133 const auto id2 = mesh_base.get_elem_integer_index(to_id_name);
1135 std::unordered_map<dof_id_type, std::set<dof_id_type>> id_map;
1137 id_map[id] = std::set<dof_id_type>();
1139 for (
const auto &
elem : mesh_base.active_local_element_ptr_range())
1142 for (
auto & [
id, ids] : id_map)
1151 std::set<dof_id_type>
1154 std::set<dof_id_type> unique_ids;
1156 for (
auto &
id : pair.second)
1157 unique_ids.insert(
id);
1161 std::set<dof_id_type>
1164 std::set<dof_id_type> unique_ids;
1165 for (
auto & blk : blks)
1169 mooseError(
"Block ", blk,
" is not available on the mesh");
1171 for (
auto & mid : it->second)
1172 unique_ids.insert(mid);
1180 TIME_SECTION(
"buildBndElemList", 5,
"Building Boundary Elements List");
1186 int n = bc_tuples.size();
1189 for (
const auto & t : bc_tuples)
1191 auto elem_id = std::get<0>(t);
1192 auto side_id = std::get<1>(t);
1193 auto bc_id = std::get<2>(t);
1200 const std::map<dof_id_type, std::vector<dof_id_type>> &
1205 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1214 Threads::in_threads =
false;
1215 TIME_SECTION(
"nodeToElemMap", 5,
"Building Node To Elem Map");
1218 for (
const auto &
elem :
getMesh().active_element_ptr_range())
1219 for (
unsigned int n = 0; n <
elem->
n_nodes(); n++)
1228 const std::map<dof_id_type, std::vector<dof_id_type>> &
1233 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
1240 Threads::in_threads =
false;
1241 TIME_SECTION(
"nodeToActiveSemilocalElemMap", 5,
"Building SemiLocalElemMap");
1246 for (
const auto &
elem :
1249 for (
unsigned int n = 0; n <
elem->
n_nodes(); n++)
1265 TIME_SECTION(
"getActiveLocalElementRange", 5);
1268 getMesh().active_local_elements_begin(),
getMesh().active_local_elements_end());
1279 TIME_SECTION(
"getActiveNodeRange", 5);
1282 std::make_unique<NodeRange>(
getMesh().active_nodes_begin(),
getMesh().active_nodes_end());
1292 "_active_semilocal_node_range has not been created yet!");
1302 TIME_SECTION(
"getLocalNodeRange", 5);
1316 TIME_SECTION(
"getBoundaryNodeRange", 5);
1329 TIME_SECTION(
"getBoundaryElementRange", 5);
1337 const std::unordered_map<boundary_id_type, std::unordered_set<dof_id_type>> &
1341 "use MooseMesh::getBoundariesToActiveSemiLocalElemIds");
1345 const std::unordered_map<boundary_id_type, std::unordered_set<dof_id_type>> &
1351 std::unordered_set<dof_id_type>
1358 return std::unordered_set<dof_id_type>{};
1362 std::unordered_set<dof_id_type>
1366 std::unordered_set<dof_id_type> neighbor_elems;
1369 const auto & [elem_ptr, elem_side, elem_bid] = *bnd_elem;
1370 if (elem_bid == bid)
1372 const auto * neighbor = elem_ptr->neighbor_ptr(elem_side);
1377 if (neighbor->active())
1378 neighbor_elems.insert(neighbor->id());
1381 std::vector<const Elem *> family;
1382 neighbor->active_family_tree_by_neighbor(family, elem_ptr);
1383 for (
const auto & child_neighbor : family)
1384 neighbor_elems.insert(child_neighbor->id());
1390 return neighbor_elems;
1395 const std::set<SubdomainID> & blk_group)
const 1397 mooseAssert(
_bnd_elem_range,
"Boundary element range is not initialized");
1402 const auto & [elem_ptr, elem_side, elem_bid] = *bnd_elem;
1403 if (elem_bid == bid)
1406 if (blk_group.find(elem_ptr->subdomain_id()) != blk_group.end())
1408 const auto *
const neighbor = elem_ptr->neighbor_ptr(elem_side);
1412 mooseError(
"Insufficient level of geometrical ghosting to determine " 1413 "if a boundary is internal to the mesh");
1419 if (blk_group.find(neighbor->subdomain_id()) != blk_group.end())
1430 TIME_SECTION(
"cacheInfo", 3);
1443 for (
const auto &
elem :
mesh.element_ptr_range())
1454 auto pair = std::make_pair(ip_elem, ip_side);
1456 std::pair<std::pair<const Elem *, unsigned short int>,
const Elem *>(pair,
elem));
1458 std::pair<const Elem *, unsigned short int>(
elem, ip_side));
1463 if (
mesh.
subdomain_name(
id).find(
"INTERNAL_SIDE_LOWERD_SUBDOMAIN_") != std::string::npos)
1468 if (
mesh.
subdomain_name(
id).find(
"BOUNDARY_SIDE_LOWERD_SUBDOMAIN_") != std::string::npos)
1474 for (
unsigned int nd = 0; nd <
elem->
n_nodes(); ++nd)
1484 for (
const auto &
elem :
mesh.active_local_element_ptr_range())
1489 for (
unsigned int side = 0; side <
elem->
n_sides(); side++)
1491 const auto & boundary_ids = elem_boundary_ids[side];
1492 sub_data.boundary_ids.insert(boundary_ids.begin(), boundary_ids.end());
1498 boundary_ids.end());
1500 if (neighbor_subdomain_id != subdomain_id)
1501 sub_data.neighbor_subs.insert(neighbor_subdomain_id);
1515 const std::set<SubdomainID> &
1603 for (
const auto &
node :
getMesh().node_ptr_range())
1608 for (
unsigned int i = 0; i <
_node_map.size(); ++i)
1616 if (
node ==
nullptr)
1622 mooseAssert(
node !=
nullptr,
"Node is NULL");
1628 const unsigned short int side,
1629 const unsigned int qp,
1648 if (new_id <=
getMesh().max_node_id())
1649 mooseError(
"Quadrature node id collides with existing node id!");
1683 const unsigned short int side,
1684 const unsigned int qp)
1688 "Elem has no quadrature nodes!");
1691 "Side has no quadrature nodes!");
1694 "qp not found on side!");
1716 if (boundary_name ==
"ANY_BOUNDARY_ID")
1717 mooseError(
"Please use getBoundaryIDs() when passing \"ANY_BOUNDARY_ID\"");
1744 std::vector<BoundaryID>
1746 bool generate_unknown)
const 1758 std::vector<SubdomainID>
1764 std::set<SubdomainID>
1773 mooseAssert(
name !=
"ANY_BLOCK_ID",
"Cannot set subdomain name to 'ANY_BLOCK_ID'");
1780 mooseAssert(
name !=
"ANY_BLOCK_ID",
"Cannot set subdomain name to 'ANY_BLOCK_ID'");
1790 std::vector<SubdomainName>
1793 std::vector<SubdomainName> names(subdomain_ids.size());
1795 for (
unsigned int i = 0; i < subdomain_ids.size(); i++)
1829 return name.size() ?
name : std::to_string(boundary_id);
1834 inline const Point &
1838 return *(item.first);
1843 unsigned int var_number,
1846 TIME_SECTION(
"buildPeriodicNodeMap", 5);
1849 periodic_node_map.clear();
1852 std::vector<PeriodicNodeInfo> periodic_nodes;
1853 for (
const auto & t :
getMesh().get_boundary_info().build_node_list())
1856 auto node =
_mesh->node_ptr(std::get<0>(t));
1857 mooseAssert(
node !=
nullptr,
1858 "libMesh::BoundaryInfo::build_node_list() returned an ID for a non-existing node");
1859 auto bc_id = std::get<1>(t);
1860 periodic_nodes.emplace_back(
node, bc_id);
1864 std::sort(periodic_nodes.begin(),
1865 periodic_nodes.end(),
1867 {
return a.second > b.second; });
1870 using KDTreeType = nanoflann::KDTreeSingleIndexAdaptor<
1871 nanoflann::L2_Simple_Adaptor<Real, PointListAdaptor<PeriodicNodeInfo>,
Real, std::size_t>,
1875 const unsigned int max_leaf_size = 20;
1878 auto kd_tree = std::make_unique<KDTreeType>(
1879 LIBMESH_DIM, point_list, nanoflann::KDTreeSingleIndexAdaptorParams(max_leaf_size));
1880 mooseAssert(kd_tree !=
nullptr,
"KDTree was not properly initialized.");
1881 kd_tree->buildIndex();
1885 std::vector<nanoflann::ResultItem<std::size_t, Real>> ret_matches;
1889 BoundaryID current_bc_id = BoundaryInfo::invalid_id;
1890 for (
auto & pair : periodic_nodes)
1893 if (pair.second != current_bc_id)
1895 current_bc_id = pair.second;
1896 periodic = pbs->
boundary(current_bc_id);
1906 ret_matches.clear();
1909 const auto id = pair.first->id();
1915 kd_tree->radiusSearch(&(search_point)(0),
libMesh::TOLERANCE, ret_matches, search_params);
1916 for (
auto & match_pair : ret_matches)
1918 const auto & match = periodic_nodes[match_pair.first];
1921 periodic_node_map.emplace(
id, match.first->id());
1928 unsigned int var_number,
1931 TIME_SECTION(
"buildPeriodicNodeSets", 5);
1933 periodic_node_sets.clear();
1936 for (
const auto & t :
getMesh().get_boundary_info().build_node_list())
1938 auto node_id = std::get<0>(t);
1939 auto bc_id = std::get<1>(t);
1942 if (periodic_node_sets.find(bc_id) != periodic_node_sets.end())
1943 periodic_node_sets[bc_id].insert(node_id);
1948 periodic_node_sets[bc_id].insert(node_id);
1956 TIME_SECTION(
"detectOrthogonalDimRanges", 5);
1966 for (
const auto &
node :
getMesh().node_ptr_range())
1972 min[i] = (*node)(i);
1974 max[i] = (*node)(i);
1982 std::vector<bool> extreme_matches(8,
false);
1983 std::vector<unsigned int> comp_map(3);
1984 for (
const auto &
node :
getMesh().node_ptr_range())
1987 unsigned int coord_match = 0;
2003 if (coord_match == LIBMESH_DIM)
2006 extreme_matches[comp_map[
X] * 4 + comp_map[
Y] * 2 + comp_map[
Z]] =
true;
2011 this->
comm().
max(extreme_matches);
2012 if (std::count(extreme_matches.begin(), extreme_matches.end(),
true) == (1 <<
dim))
2030 TIME_SECTION(
"detectPairedSidesets", 5);
2047 static constexpr std::array<std::size_t, 3> unit_dims{0, 1, 2};
2049 static const std::array<std::string, 3> unit_dim_names{
"x",
"y",
"z"};
2055 std::array<std::array<std::array<std::set<BoundaryID>, 2>, 3>, 3> ids{};
2058 std::array<std::unique_ptr<FEBase>, 3> fe_faces{};
2059 std::array<std::unique_ptr<libMesh::QGauss>, 3> qfaces{};
2060 for (
const auto side_dim :
make_range(mesh_dim))
2068 fe_faces[side_dim]->attach_quadrature_rule(qfaces[side_dim].
get());
2069 fe_faces[side_dim]->get_normals();
2075 std::vector<boundary_id_type> face_ids;
2078 std::set<unsigned int> side_dims;
2088 const auto side_dim =
elem->
dim() - 1;
2089 side_dims.insert(side_dim);
2096 fe_faces[side_dim]->reinit(
elem, s);
2097 const auto & normal = fe_faces[side_dim]->get_normals()[0];
2103 boundary_info.boundary_ids(
elem, s, face_ids);
2106 for (
const auto unit_dim : unit_dims)
2110 nonzero_dims[unit_dim] =
true;
2112 for (
const auto plus : {
false,
true})
2116 ids[side_dim][unit_dim][plus].insert(face_ids.begin(), face_ids.end());
2136 std::vector<std::tuple<unsigned int, unsigned int, unsigned char, boundary_id_type>> id_data;
2137 for (
const auto side_dim : side_dims)
2138 for (
const auto unit_dim : unit_dims)
2139 for (
const auto plus : {
false,
true})
2140 for (
const auto bd : ids[side_dim][unit_dim][plus])
2141 id_data.emplace_back(side_dim, unit_dim, plus, bd);
2143 for (
const auto & [side_dim, unit_dim, plus_char, bd] : id_data)
2144 ids[side_dim][unit_dim][bool(plus_char)].insert(bd);
2147 for (
auto & entry : nonzero_dims)
2155 std::ostringstream oss_found, oss_missing;
2156 for (
const auto side_dim : side_dims)
2158 for (
const auto unit_dim : unit_dims)
2159 if (nonzero_dims[unit_dim])
2161 const auto & unit_name = unit_dim_names[unit_dim];
2162 const auto & minus = ids[side_dim][unit_dim][
false];
2163 const auto & plus = ids[side_dim][unit_dim][
true];
2165 if (minus.size() == 1 && plus.size() == 1)
2167 const auto get_boundary_name = [
this](
const auto id)
2170 return name.size() ?
name : std::to_string(
id);
2173 oss_found <<
"\n " << side_dim + 1 <<
"D " << unit_name
2174 <<
"-direction: " << get_boundary_name(*minus.begin()) <<
" <-> " 2175 << get_boundary_name(*plus.begin());
2176 _paired_boundary->emplace_back(std::make_pair(*minus.begin(), *plus.begin()));
2179 oss_missing <<
"\n " << side_dim + 1 <<
"D -" << unit_name <<
"/+" << unit_name
2180 <<
": Found " << minus.size() <<
" -" << unit_name <<
" boundaries and " 2181 << plus.size() <<
" +" << unit_name <<
" boundaries";
2185 std::ostringstream oss;
2186 const auto found = oss_found.str();
2187 const auto missing = oss_missing.str();
2189 oss <<
"The following paired boundaries were automatically detected for periodicity:\n" 2195 oss <<
"Paired boundaries were not automatically detected for the following:\n" 2197 <<
"\n\nAutomatic detection requires that exactly one boundary is found in each unit " 2213 mooseAssert(
_mesh,
"The MeshBase has not been constructed");
2214 mooseAssert(component <
_bounds.size(),
"Requested dimension out of bounds");
2222 mooseAssert(
_mesh,
"The MeshBase has not been constructed");
2223 mooseAssert(component <
_bounds.size(),
"Requested dimension out of bounds");
2230 const unsigned int var_num,
2237 const auto key = std::make_pair(sys_num, var_num);
2242 bool component_found =
false;
2247 if (boundary_ids && ((boundary_ids->first == primary && boundary_ids->second == secondary) ||
2248 (boundary_ids->first == secondary && boundary_ids->second == primary)))
2250 entry[component] =
true;
2251 component_found =
true;
2255 if (!component_found)
2256 mooseWarning(
"Could not find a match between boundary '",
2260 "' to set periodic boundary conditions for variable (index:",
2262 ") in either the X, Y or Z direction. The periodic dimension of the mesh for this " 2263 "variable will not be stored.");
2266 const std::array<bool, 3> &
2269 const auto key = std::make_pair(sys_num, var_num);
2275 const std::array<bool, 3> &
2283 const unsigned int var_num,
2284 const unsigned int component)
const 2286 mooseAssert(component <
dimension(),
"Requested dimension out of bounds");
2300 "MooseMesh::isTranslatedPeriodic(const unsigned int, const unsigned int) is deprecated. Use " 2301 "the method that additionally takes the system number or the MooseVariableBase instead."));
2307 const unsigned int var_num,
2316 if (periodic_dims[i])
2344 mooseDoOnce(
mooseDeprecated(
"MooseMesh::minPeriodicVector(const unsigned int, const Point &, " 2345 "const Point &) is deprecated. Use the method that additionally " 2346 "takes the system number or the MooseVariableBase instead."));
2352 const unsigned int var_num,
2354 const Point & q)
const 2362 const Point & q)
const 2370 mooseDoOnce(
mooseDeprecated(
"MooseMesh::minPeriodicDistance(const unsigned int, const Point &, " 2371 "const Point &) is deprecated. Use the method that additionally " 2372 "takes the system number or the MooseVariableBase instead."));
2376 const std::pair<BoundaryID, BoundaryID> *
2380 mooseError(
"Trying to retrieve automatic paired mapping for a mesh that is not regular and " 2383 mooseAssert(component <
dimension(),
"Requested dimension out of bounds");
2386 mooseError(
"MooseMesh::getPairedBoundaryMapping(): Paired boundaries not built; must call " 2387 "detectPairedSidesets() first");
2389 if (component < _paired_boundary->size())
2390 return &(*_paired_boundary)[component];
2398 std::map<ElemType, Elem *> canonical_elems;
2402 for (
const auto &
elem :
getMesh().element_ptr_range())
2406 if (canonical_elems.find(
type) ==
2407 canonical_elems.end())
2411 Elem * stored = canonical_elems[
type];
2418 for (
const auto & can_it : canonical_elems)
2436 for (
unsigned int side = 0; side <
elem->
n_sides(); side++)
2444 for (
unsigned int child = 0; child <
elem->
n_children(); ++child)
2445 for (
unsigned int side = 0; side <
elem->
n_sides();
2460 std::map<ElemType, std::pair<Elem *, unsigned int>> elems_and_max_p_level;
2462 for (
const auto &
elem :
getMesh().active_element_ptr_range())
2465 auto & [picked_elem, max_p_level] = elems_and_max_p_level[
type];
2473 std::vector<Point> volume_ref_points_coarse, volume_ref_points_fine, face_ref_points_coarse,
2474 face_ref_points_fine;
2475 std::vector<unsigned int> p_levels;
2477 for (
auto & [elem_type, elem_p_level_pair] : elems_and_max_p_level)
2479 auto & [moose_elem, max_p_level] = elem_p_level_pair;
2480 const auto dim = moose_elem->dim();
2483 assembly->
reinit(moose_elem);
2484 assembly->
reinit(moose_elem, 0);
2491 for (
const auto & nd : moose_elem->node_ref_range())
2500 const auto & face_phys_points = fe_face->get_xyz();
2501 fe_face->attach_quadrature_rule(qrule_face);
2504 volume_ref_points_coarse = qrule->get_points();
2505 fe_face->reinit(
elem, (
unsigned int)0);
2508 p_levels.resize(max_p_level + 1);
2509 std::iota(p_levels.begin(), p_levels.end(), 0);
2512 for (
const auto p_level : p_levels)
2514 mesh_refinement.uniformly_p_refine(1);
2516 volume_ref_points_fine = qrule->get_points();
2517 fe_face->reinit(
elem, (
unsigned int)0);
2520 const auto map_key = std::make_pair(elem_type, p_level);
2526 auto fill_maps = [
this](
const auto & coarse_ref_points,
2527 const auto & fine_ref_points,
2531 mapPoints(fine_ref_points, coarse_ref_points, refine_map);
2532 mapPoints(coarse_ref_points, fine_ref_points, coarsen_map);
2536 volume_ref_points_coarse, volume_ref_points_fine, volume_coarsen_map, volume_refine_map);
2537 fill_maps(face_ref_points_coarse, face_ref_points_fine, face_coarsen_map, face_refine_map);
2540 volume_ref_points_fine.swap(volume_ref_points_coarse);
2541 face_ref_points_fine.swap(face_ref_points_coarse);
2549 TIME_SECTION(
"buildRefinementAndCoarseningMaps", 5,
"Building Refinement And Coarsening Maps");
2564 TIME_SECTION(
"buildRefinementMap", 5,
"Building Refinement Map");
2568 mooseAssert(parent_side == child_side,
2569 "Parent side must match child_side if not passing a specific child!");
2571 std::pair<int, ElemType> the_pair(parent_side,
elem.
type());
2574 mooseError(
"Already built a qp refinement map!");
2576 std::vector<std::pair<unsigned int, QpMap>> coarsen_map;
2579 &
elem, qrule, qrule_face, refinement_map, coarsen_map, parent_side, child, child_side);
2583 std::pair<int, int> child_pair(child, child_side);
2589 mooseError(
"Already built a qp refinement map!");
2591 std::vector<std::pair<unsigned int, QpMap>> coarsen_map;
2592 std::vector<std::vector<QpMap>> & refinement_map =
2595 &
elem, qrule, qrule_face, refinement_map, coarsen_map, parent_side, child, child_side);
2599 const std::vector<std::vector<QpMap>> &
2604 mooseAssert(parent_side == child_side,
2605 "Parent side must match child_side if not passing a specific child!");
2607 std::pair<int, ElemType> the_pair(parent_side,
elem.
type());
2610 mooseError(
"Could not find a suitable qp refinement map!");
2616 std::pair<int, int> child_pair(child, child_side);
2622 mooseError(
"Could not find a suitable qp refinement map!");
2638 TIME_SECTION(
"buildCoarseningMap", 5,
"Building Coarsening Map");
2640 std::pair<int, ElemType> the_pair(input_side,
elem.
type());
2643 mooseError(
"Already built a qp coarsening map!");
2645 std::vector<std::vector<QpMap>> refinement_map;
2646 std::vector<std::pair<unsigned int, QpMap>> & coarsen_map =
2653 &
elem, qrule, qrule_face, refinement_map, coarsen_map, input_side, -1, input_side);
2663 const std::vector<std::pair<unsigned int, QpMap>> &
2666 std::pair<int, ElemType> the_pair(input_side,
elem.
type());
2669 mooseError(
"Could not find a suitable qp refinement map!");
2676 const std::vector<Point> & to,
2677 std::vector<QpMap> & qp_map)
2679 unsigned int n_from = from.size();
2680 unsigned int n_to = to.size();
2682 qp_map.resize(n_from);
2684 for (
unsigned int i = 0; i < n_from; ++i)
2686 const Point & from_point = from[i];
2688 QpMap & current_map = qp_map[i];
2690 for (
unsigned int j = 0; j < n_to; ++j)
2692 const Point & to_point = to[j];
2698 current_map.
_from = i;
2699 current_map.
_to = j;
2709 std::vector<std::vector<QpMap>> & refinement_map,
2710 std::vector<std::pair<unsigned int, QpMap>> & coarsen_map,
2715 TIME_SECTION(
"findAdaptivityQpMaps", 5);
2720 unsigned int dim = template_elem->
dim();
2723 for (
unsigned int i = 0; i < template_elem->
n_nodes(); ++i)
2728 for (
unsigned int i = 0; i < template_elem->
n_nodes(); ++i)
2733 const std::vector<Point> & q_points_volume = fe->get_xyz();
2737 const std::vector<Point> & q_points_face = fe_face->get_xyz();
2739 fe->attach_quadrature_rule(&qrule);
2740 fe_face->attach_quadrature_rule(&qrule_face);
2743 const std::vector<Point> * q_points;
2745 if (parent_side != -1)
2747 fe_face->reinit(
elem, parent_side);
2748 q_points = &q_points_face;
2753 q_points = &q_points_volume;
2756 std::vector<Point> parent_ref_points;
2760 mesh_refinement.uniformly_refine(1);
2765 std::map<unsigned int, std::vector<Point>> child_to_ref_points;
2769 refinement_map.resize(n_children);
2771 std::vector<unsigned int> children;
2774 children.push_back(child);
2777 children.resize(n_children);
2778 for (
unsigned int child = 0; child < n_children; ++child)
2779 children[child] = child;
2782 for (
unsigned int i = 0; i < children.size(); ++i)
2784 unsigned int child = children[i];
2791 if (child_side != -1)
2793 fe_face->reinit(child_elem, child_side);
2794 q_points = &q_points_face;
2798 fe->reinit(child_elem);
2799 q_points = &q_points_volume;
2802 std::vector<Point> child_ref_points;
2805 child_to_ref_points[child] = child_ref_points;
2807 std::vector<QpMap> & qp_map = refinement_map[child];
2810 mapPoints(child_ref_points, parent_ref_points, qp_map);
2813 coarsen_map.resize(parent_ref_points.size());
2816 for (
unsigned int child = 0; child < n_children; child++)
2821 std::vector<Point> & child_ref_points = child_to_ref_points[child];
2823 std::vector<QpMap> qp_map;
2826 mapPoints(parent_ref_points, child_ref_points, qp_map);
2829 for (
unsigned int parent_qp = 0; parent_qp < parent_ref_points.size(); ++parent_qp)
2831 std::pair<unsigned int, QpMap> & child_and_map = coarsen_map[parent_qp];
2832 unsigned int & closest_child = child_and_map.first;
2833 QpMap & closest_map = child_and_map.second;
2835 QpMap & current_map = qp_map[parent_qp];
2839 closest_child = child;
2840 closest_map = current_map;
2851 TIME_SECTION(
"changeBoundaryId", 6);
2865 std::vector<boundary_id_type> old_ids;
2871 for (
unsigned int s = 0; s != n_sides; ++s)
2874 if (
std::find(old_ids.begin(), old_ids.end(), old_id) != old_ids.end())
2876 std::vector<boundary_id_type> new_ids(old_ids);
2877 std::replace(new_ids.begin(), new_ids.end(), old_id, new_id);
2912 mooseError(
"MooseMesh::clone() is no longer supported, use MooseMesh::safeClone() instead.");
2943 std::unique_ptr<MeshBase>
2946 std::unique_ptr<MeshBase>
mesh;
2948 mesh = buildTypedMesh<DistributedMesh>(
dim);
2950 mesh = buildTypedMesh<ReplicatedMesh>(
dim);
2958 _mesh = std::move(mesh_base);
2975 mooseError(
"You cannot use the mesh splitter capability with DistributedMesh!");
2977 TIME_SECTION(
"init", 2);
2992 TIME_SECTION(
"readRecoveredMesh", 2);
3006 if (getParam<bool>(
"build_all_side_lowerd_mesh"))
3020 const Real abs_zero = 1e-12;
3024 for (
unsigned int dim = LIBMESH_DIM;
dim >= 1; --
dim)
3039 return *elem_dims.begin();
3041 unsigned short dim = 0;
3043 const std::set<SubdomainID> subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end());
3052 std::vector<BoundaryID>
3055 std::vector<BoundaryID> ids;
3060 std::vector<std::vector<BoundaryID>>
3063 std::vector<std::vector<BoundaryID>> ids;
3068 const std::set<BoundaryID> &
3093 if (!node_bcids.empty())
3094 next_bcid =
std::max(next_bcid, cast_int<boundary_id_type>(*node_bcids.rbegin() + 1));
3095 if (!side_bcids.empty())
3096 next_bcid =
std::max(next_bcid, cast_int<boundary_id_type>(*side_bcids.rbegin() + 1));
3106 if (next_bcid > 1000 || next_bcid <= 0)
3112 for (
auto bcid : side_bcids)
3113 if (node_bcids.count(bcid) &&
3120 }
while (node_bcids.count(next_bcid) || side_bcids.count(next_bcid));
3135 std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>>
3141 std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>>
3156 return getMesh().local_nodes_begin();
3162 return getMesh().local_nodes_end();
3165 MeshBase::const_node_iterator
3168 return getMesh().local_nodes_begin();
3171 MeshBase::const_node_iterator
3174 return getMesh().local_nodes_end();
3177 MeshBase::element_iterator
3180 return getMesh().active_local_elements_begin();
3183 const MeshBase::element_iterator
3186 return getMesh().active_local_elements_end();
3189 MeshBase::const_element_iterator
3192 return getMesh().active_local_elements_begin();
3195 const MeshBase::const_element_iterator
3198 return getMesh().active_local_elements_end();
3228 mooseDeprecated(
"MooseMesh::elem() is deprecated, please use MooseMesh::elemPtr() instead");
3235 mooseDeprecated(
"MooseMesh::elem() is deprecated, please use MooseMesh::elemPtr() instead");
3273 mooseError(
"We don't have any right to tell the libmesh mesh that it *is* prepared. Only a " 3274 "call to prepare_for_use should tell us that");
3279 _mesh->unset_is_prepared();
3297 const std::set<SubdomainID> &
3303 const std::set<BoundaryID> &
3309 const std::set<BoundaryID> &
3315 const std::set<BoundaryID> &
3329 std::unique_ptr<std::map<BoundaryID, RealVectorValue>> boundary_map)
3337 mooseDeprecated(
"setBoundaryToNormalMap(std::map<BoundaryID, RealVectorValue> * boundary_map) is " 3338 "deprecated, use the unique_ptr version instead");
3367 const std::set<unsigned int> &
3373 const std::vector<Real> &
3387 template <
typename T>
3388 struct extra_ghost_elem_inserter
3390 using iterator_category = std::output_iterator_tag;
3391 using value_type = T;
3395 void operator=(
const Elem * e) {
mesh.add_extra_ghost_elem(const_cast<Elem *>(e)); }
3401 extra_ghost_elem_inserter &
operator++() {
return *
this; }
3403 extra_ghost_elem_inserter
operator++(
int) {
return extra_ghost_elem_inserter(*
this); }
3409 extra_ghost_elem_inserter &
operator*() {
return *
this; }
3425 struct CompareElemsByLevel
3427 bool operator()(
const Elem * a,
const Elem * b)
const 3431 const unsigned int al = a->
level(), bl = b->
level();
3434 return (al == bl) ? aid < bid : al < bl;
3450 TIME_SECTION(
"GhostGhostedBoundaries", 3);
3452 parallel_object_only();
3462 std::set<const Elem *, CompareElemsByLevel> boundary_elems_to_ghost;
3463 std::set<Node *> connected_nodes_to_ghost;
3469 auto elem_id = std::get<0>(t);
3470 auto bc_id = std::get<2>(t);
3476 #ifdef LIBMESH_ENABLE_AMR 3482 parent = parent->
parent();
3490 boundary_elems_to_ghost.insert(felem);
3498 for (
unsigned int n = 0; n < felem->n_nodes(); ++n)
3499 connected_nodes_to_ghost.insert(const_cast<Node *>(felem->node_ptr(n)));
3505 const auto prior_ghost_elems =
mesh.extra_ghost_elems();
3508 connected_nodes_to_ghost.begin(),
3509 connected_nodes_to_ghost.end(),
3510 extra_ghost_elem_inserter<Node>(
mesh));
3513 boundary_elems_to_ghost.begin(),
3514 boundary_elems_to_ghost.end(),
3515 extra_ghost_elem_inserter<Elem>(
mesh));
3517 const auto & current_ghost_elems =
mesh.extra_ghost_elems();
3519 std::set_difference(current_ghost_elems.begin(),
3520 current_ghost_elems.end(),
3521 prior_ghost_elems.begin(),
3522 prior_ghost_elems.end(),
3555 Real inflation_amount = inflation_multiplier * (bbox.
max() - bbox.
min()).
norm();
3556 Point inflation(inflation_amount, inflation_amount, inflation_amount);
3558 bbox.first -= inflation;
3559 bbox.second += inflation;
3577 mooseAssert(
_mesh,
"Mesh hasn't been created");
3584 mooseAssert(
_mesh,
"Mesh hasn't been created");
3596 const std::vector<dof_id_type> &
3599 std::map<boundary_id_type, std::vector<dof_id_type>>::const_iterator it =
3609 static const std::vector<dof_id_type> empty_vec;
3616 mooseError(
"Unable to nodeset ID: ", nodeset_id,
'.');
3623 const std::set<BoundaryID> &
3629 mooseError(
"Unable to find subdomain ID: ", subdomain_id,
'.');
3631 return it->second.boundary_ids;
3634 std::set<BoundaryID>
3638 std::set<BoundaryID> boundary_ids(bnd_ids.begin(), bnd_ids.end());
3639 std::unordered_map<SubdomainID, std::set<BoundaryID>>::const_iterator it =
3642 boundary_ids.insert(it->second.begin(), it->second.end());
3644 return boundary_ids;
3647 std::set<SubdomainID>
3650 std::set<SubdomainID> subdomain_ids;
3652 if (data.boundary_ids.find(bid) != data.boundary_ids.end())
3653 subdomain_ids.insert(sub_id);
3655 return subdomain_ids;
3658 std::set<SubdomainID>
3661 std::set<SubdomainID> subdomain_ids;
3663 if (it.second.find(bid) != it.second.end())
3664 subdomain_ids.insert(it.first);
3666 return subdomain_ids;
3669 std::set<SubdomainID>
3674 if (it.second.find(bid) != it.second.end())
3675 subdomain_ids.insert(it.first);
3677 return subdomain_ids;
3680 const std::set<SubdomainID> &
3686 mooseError(
"Unable to find subdomain ID: ", subdomain_id,
'.');
3688 return it->second.neighbor_subs;
3694 bool found_node =
false;
3697 if (it.second.find(node_id) != it.second.end())
3709 bool found_node =
false;
3710 std::map<boundary_id_type, std::set<dof_id_type>>::const_iterator it =
_bnd_node_ids.find(bnd_id);
3712 if (it->second.find(node_id) != it->second.end())
3720 bool found_elem =
false;
3723 if (it.second.find(elem_id) != it.second.end())
3735 bool found_elem =
false;
3738 if (it->second.find(elem_id) != it->second.end())
3749 " with DistributedMesh!\n",
3750 "Consider specifying parallel_type = 'replicated' in your input file\n",
3751 "to prevent it from being run with DistributedMesh.");
3769 bool use_distributed_mesh,
3774 switch (partitioner)
3778 if (use_distributed_mesh)
3779 partitioner =
"parmetis";
3781 partitioner =
"metis";
3795 if (!params.
isParamValid(
"centroid_partitioner_direction"))
3797 "centroid_partitioner_direction",
3798 "If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
3802 if (direction ==
"x")
3805 else if (direction ==
"y")
3808 else if (direction ==
"z")
3811 else if (direction ==
"radial")
3844 bool mesh_has_second_order_elements =
false;
3846 if ((*it)->default_order() ==
SECOND)
3848 mesh_has_second_order_elements =
true;
3853 comm().
max(mesh_has_second_order_elements);
3854 return mesh_has_second_order_elements;
3863 std::unique_ptr<libMesh::PointLocatorBase>
3872 mooseAssert(!Threads::in_threads,
3873 "This routine has not been implemented for threads. Please query this routine before " 3874 "a threaded region or contact a MOOSE developer to discuss.");
3877 using Keytype = std::pair<const Elem *, unsigned short int>;
3880 std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> side_list =
3882 std::map<Keytype, std::set<boundary_id_type>> side_map;
3883 for (
auto & [elem_id, side, bc_id] : side_list)
3886 Keytype key(
elem, side);
3887 auto & bc_set = side_map[key];
3888 bc_set.insert(bc_id);
3902 auto begin =
getMesh().active_elements_begin();
3903 auto end =
getMesh().active_elements_end();
3908 unsigned int num_sides = 0;
3923 for (
unsigned int side = 0; side <
elem->
n_sides(); ++side)
3934 "If the neighbor is coarser than the element, we expect that the neighbor must " 3938 mooseAssert(
elem->
default_order() < 4,
"Did not expect such high element orders in FV");
3946 std::set<boundary_id_type> & boundary_ids = fi.boundaryIDs();
3947 boundary_ids.clear();
3953 fi.computeBoundaryCoefficients();
3957 auto lit = side_map.find(Keytype(&fi.elem(), fi.elemSideID()));
3958 if (lit != side_map.end())
3959 boundary_ids.insert(lit->second.begin(), lit->second.end());
3961 if (fi.neighborPtr())
3963 auto rit = side_map.find(Keytype(fi.neighborPtr(), fi.neighborSideID()));
3964 if (rit != side_map.end())
3965 boundary_ids.insert(rit->second.begin(), rit->second.end());
3979 const Elem *
const elem = &fi.elem();
3980 const auto side = fi.elemSideID();
3986 mooseAssert(pair_it.second,
"We should be adding unique FaceInfo objects.");
3990 if (fi.elem().processor_id() == this->
processor_id() ||
3991 (fi.neighborPtr() && (fi.neighborPtr()->processor_id() == this->
processor_id())))
3997 if (ei.second.elem()->processor_id() == this->
processor_id())
4010 mooseAssert(it->second,
4011 "For some reason, the FaceInfo object is NULL! Try calling " 4012 "`buildFiniteVolumeInfo()` before using this accessor!");
4027 mooseError(
"Trying to compute face- and elem-info coords when the information is dirty");
4032 const SubdomainID elem_subdomain_id = fi.elemSubdomainID();
4033 const SubdomainID neighbor_subdomain_id = fi.neighborSubdomainID();
4036 *
this, elem_subdomain_id, fi.faceCentroid(), fi.faceCoord(), neighbor_subdomain_id);
4041 *
this, ei.second.subdomain_id(), ei.second.centroid(), ei.second.coordFactor());
4048 "default=-3 metis=-2 parmetis=-1 linear=0 centroid hilbert_sfc morton_sfc custom",
"default");
4056 "EDGE EDGE2 EDGE3 EDGE4 QUAD QUAD4 QUAD8 QUAD9 TRI3 TRI6 HEX HEX8 HEX20 HEX27 TET4 TET10 " 4057 "PRISM6 PRISM15 PRISM18 PYRAMID5 PYRAMID13 PYRAMID14");
4066 _mesh->allow_remote_element_removal(allow_remote_element_removal);
4068 if (!allow_remote_element_removal)
4080 mooseError(
"Cannot delete remote elements because we have not yet attached a MeshBase");
4082 _mesh->allow_remote_element_removal(
true);
4084 _mesh->delete_remote_elements();
4091 !Threads::in_threads,
4092 "Performing writes to faceInfo variable association maps. This must be done unthreaded!");
4096 auto face_lambda = [
this](
const SubdomainID elem_subdomain_id,
4099 std::vector<std::vector<FaceInfo::VarFaceNeighbors>> & face_type_vector)
4102 const auto & variables = sys.getVariables(0);
4104 for (
const auto & var : variables)
4106 const unsigned int var_num = var->
number();
4107 const unsigned int sys_num = var->
sys().
number();
4108 std::set<SubdomainID> var_subdomains = var->
blockIDs();
4118 bool var_defined_elem = var_subdomains.find(elem_subdomain_id) != var_subdomains.end();
4119 bool var_defined_neighbor =
4120 var_subdomains.find(neighbor_subdomain_id) != var_subdomains.end();
4121 if (var_defined_elem && var_defined_neighbor)
4123 else if (!var_defined_elem && !var_defined_neighbor)
4128 if (var_defined_elem)
4130 else if (var_defined_neighbor)
4142 const SubdomainID elem_subdomain_id = face.elemSubdomainID();
4143 const SubdomainID neighbor_subdomain_id = face.neighborSubdomainID();
4145 auto & face_type_vector = face.faceType();
4147 face_type_vector.clear();
4148 face_type_vector.resize(num_eqs);
4152 face_lambda(elem_subdomain_id,
4153 neighbor_subdomain_id,
4158 face_lambda(elem_subdomain_id,
4159 neighbor_subdomain_id,
4168 mooseAssert(!Threads::in_threads,
4169 "Performing writes to elemInfo dof indices. This must be done unthreaded!");
4171 auto elem_lambda = [](
const ElemInfo & elem_info,
4173 std::vector<std::vector<dof_id_type>> & dof_vector)
4175 if (sys.nFVVariables())
4178 const auto & variables = sys.getVariables(0);
4180 for (
const auto & var : variables)
4183 const auto & var_subdomains = var->
blockIDs();
4186 if (var_subdomains.find(elem_info.
subdomain_id()) != var_subdomains.end())
4188 std::vector<dof_id_type> indices;
4190 mooseAssert(indices.size() == 1,
"We expect to have only one dof per element!");
4191 dof_vector[sys.number()][var->
number()] = indices[0];
4203 auto & elem_info = ei_pair.second;
4207 dof_vector.resize(num_eqs);
4231 TIME_SECTION(
"setCoordSystem", 5,
"Setting Coordinate System");
4234 const std::string param_name =
isParamValid(
"coord_block") ?
"coord_block" :
"block";
4235 mooseWarning(
"Supplied blocks in the 'setCoordSystem' method do not match the value of the " 4238 "' parameter. Did you provide different parameter values for 'Mesh/",
4240 "' and 'Problem/block'?. We will honor the parameter value from 'Mesh/",
4244 "If we are arriving here due to a bad specification in the Problem block, then we " 4245 "should have already set our coordinate system subdomains from the Mesh block");
4249 mooseError(
"Supplied coordinate systems in the 'setCoordSystem' method do not match the value " 4250 "of the 'Mesh/coord_type' parameter. Did you provide different parameter values for " 4251 "'coord_type' to 'Mesh' and 'Problem'?");
4258 if (coord_sys.
size() > 1)
4259 mooseError(
"If you specify ANY_BLOCK_ID as the only block, you must also specify a single " 4260 "coordinate system for it.");
4261 if (!
_mesh->is_prepared())
4263 "You cannot set the coordinate system for ANY_BLOCK_ID before the mesh is prepared. " 4264 "Please call this method after the mesh is prepared.");
4265 const auto coord_type = coord_sys.
size() == 0
4267 : Moose::stringToEnum<Moose::CoordinateSystemType>(coord_sys[0]);
4275 mooseError(
"You cannot specify ANY_BLOCK_ID together with other blocks in the " 4276 "setCoordSystem() method. If you want to set the same coordinate system for all " 4277 "blocks, use ANY_BLOCK_ID as the only block.");
4282 for (
const auto & sub_name :
blocks)
4285 subdomains.insert(sub_id);
4288 if (coord_sys.
size() <= 1)
4291 const auto coord_type = coord_sys.
size() == 0
4293 : Moose::stringToEnum<Moose::CoordinateSystemType>(coord_sys[0]);
4294 for (
const auto sid : subdomains)
4300 mooseError(
"Number of blocks and coordinate systems does not match.");
4306 Moose::stringToEnum<Moose::CoordinateSystemType>(coord_sys[i]);
4310 for (
const auto & sid : subdomains)
4313 "' does not have a coordinate system specified.");
4326 return (*it).second;
4328 mooseError(
"Requested subdomain ", sid,
" does not exist.");
4336 bool result = std::all_of(
4340 typename std::unordered_map<SubdomainID, Moose::CoordinateSystemType>::const_reference
4341 item) {
return (item.second == unique_system); });
4343 mooseError(
"The unique coordinate system of the mesh was requested by the mesh contains " 4344 "multiple blocks with different coordinate systems");
4347 mooseError(
"General axisymmetric coordinate axes are being used, and it is currently " 4348 "conservatively assumed that in this case there is no unique coordinate system.");
4350 return unique_system;
4353 const std::map<SubdomainID, Moose::CoordinateSystemType> &
4369 const std::vector<SubdomainName> &
blocks,
4370 const std::vector<std::pair<Point, RealVectorValue>> & axes)
4373 mooseAssert(
blocks.size() == axes.size(),
"Blocks and axes vectors must be the same length.");
4377 const auto it =
_coord_sys.find(subdomain_id);
4381 "' has not set a coordinate system. Make sure to call setCoordSystem() before " 4382 "setGeneralAxisymmetricCoordAxes().");
4387 const auto direction = axes[i].second;
4388 if (direction.is_zero())
4389 mooseError(
"Only nonzero vectors may be supplied for RZ directions.");
4392 std::make_pair(axes[i].first, direction.unit());
4397 "' was provided in setGeneralAxisymmetricCoordAxes(), but the coordinate system " 4398 "for this block is not 'RZ'.");
4404 for (
const auto subdomain_id : all_subdomain_ids)
4409 "' was specified to use the 'RZ' coordinate system but was not given in " 4410 "setGeneralAxisymmetricCoordAxes().");
4415 const std::pair<Point, RealVectorValue> &
4420 return (*it).second;
4422 mooseError(
"Requested subdomain ", subdomain_id,
" does not exist.");
4444 mooseError(
"getAxisymmetricRadialCoord() should not be called if " 4445 "setGeneralAxisymmetricCoordAxes() has been called.");
4456 for (
const auto &
elem :
getMesh().element_ptr_range())
4461 " which contains 3D elements.");
4463 mooseError(
"An RSPHERICAL coordinate system was requested for subdomain " +
4486 std::map<SubdomainName, SubdomainID> subdomain;
4490 if (!sub_name.empty() && subdomain.count(sub_name) > 0)
4493 " is used for both subdomain with ID=",
4494 subdomain[sub_name],
4497 ", Please rename one of them!");
4499 subdomain[sub_name] = sbd_id;
4503 const std::vector<QpMap> &
4506 const std::map<std::pair<ElemType, unsigned int>, std::vector<QpMap>> & map)
const 4510 return libmesh_map_find(map,
4514 const std::vector<QpMap> &
4517 const std::map<std::pair<ElemType, unsigned int>, std::vector<QpMap>> & map)
const 4520 "These are the conditions that should be met for requesting a coarsening map");
4524 const std::vector<QpMap> &
4530 const std::vector<QpMap> &
4536 const std::vector<QpMap> &
4542 const std::vector<QpMap> &
4551 return _mesh->skip_noncritical_partitioning();
ParallelType _parallel_type
Can be set to DISTRIBUTED, REPLICATED, or DEFAULT.
bool hasDetectedPairedSidesets() const
Whether or not detectedPairedSidesets() has been called.
static InputParameters validParams()
Typical "Moose-style" constructor and copy constructor.
virtual bnd_node_iterator bndNodesEnd()
virtual bnd_elem_iterator bndElemsEnd()
std::vector< std::vector< Real > > _bounds
The bounds in each dimension of the mesh for regular orthogonal meshes.
std::set< Node * > _semilocal_node_list
Used for generating the semilocal node range.
void remove_id(boundary_id_type id, bool global=false)
std::map< dof_id_type, Node * > _quadrature_nodes
const std::vector< QpMap > & getPCoarseningSideMap(const Elem &elem) const
Get the map describing for each side quadrature point (qp) on the coarse level which qp on the previo...
virtual Real getMaxInDimension(unsigned int component) const
static const std::string & checkpointSuffix()
The file suffix for the checkpoint mesh.
bool _node_to_elem_map_built
std::unique_ptr< libMesh::NodeRange > _active_node_range
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
std::vector< Node * > _extreme_nodes
A vector containing the nodes at the corners of a regular orthogonal mesh.
RealVectorValue minPeriodicVector(const unsigned int sys_num, const unsigned int var_num, Point p, Point q) const
Returns the minimum vector between two points on the mesh taking into account periodicity for the giv...
Node * addQuadratureNode(const Elem *elem, const unsigned short int side, const unsigned int qp, BoundaryID bid, const Point &point)
Adds a fictitious "QuadratureNode".
std::vector< std::tuple< dof_id_type, unsigned short int, boundary_id_type > > buildSideList()
Calls BoundaryInfo::build_side_list(), returns a std::vector of (elem-id, side-id, bc-id) tuples.
void computeMaxPerElemAndSide()
Compute the maximum numbers per element and side.
const std::set< BoundaryID > & meshNodesetIds() const
Returns a read-only reference to the set of nodesets currently present in the Mesh.
void buildElemIDInfo()
Build extra data for faster access to the information of extra element integers.
std::vector< FaceInfo > _all_face_info
FaceInfo object storing information for face based loops.
std::unique_ptr< FEGenericBase< Real > > build(const unsigned int dim, const FEType &fet)
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
std::vector< const FaceInfo * > _face_info
Holds only those FaceInfo objects that have processor_id equal to this process's id, e.g.
bool allowRemoteElementRemoval() const
Whether we are allow remote element removal.
virtual Real getMinInDimension(unsigned int component) const
Returns the min or max of the requested dimension respectively.
bool elemHasFaceInfo(const Elem &elem, const Elem *const neighbor)
This function infers based on elements if the faceinfo between them belongs to the element or not...
libMesh::ConstElemRange * getActiveLocalElementRange()
Return pointers to range objects for various types of ranges (local nodes, boundary elems...
virtual void onMeshChanged()
Declares a callback function that is executed at the conclusion of meshChanged(). ...
bool prepared() const
Setter/getter for whether the mesh is prepared.
void needsPrepareForUse()
If this method is called, we will call libMesh's prepare_for_use method when we call Moose's prepare ...
const std::set< boundary_id_type > & get_side_boundary_ids() const
const std::set< BoundaryID > & getBoundaryIDs() const
Returns a const reference to a set of all user-specified boundary IDs.
bool _is_nemesis
True if a Nemesis Mesh was read in.
static const std::string name_param
The name of the parameter that contains the object name.
std::vector< SubdomainName > _provided_coord_blocks
Set for holding user-provided coordinate system type block names.
virtual MooseMesh & clone() const
Clone method.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
const Elem * parent() const
const std::vector< QpMap > & getPCoarseningMapHelper(const Elem &elem, const std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap >> &) const
bool isCustomPartitionerRequested() const
Setter and getter for _custom_partitioner_requested.
bool _need_ghost_ghosted_boundaries
A parallel mesh generator such as DistributedRectilinearMeshGenerator already make everything ready...
A class for creating restricted objects.
bool isUltimateMaster() const
Whether or not this app is the ultimate master app.
std::vector< BCTuple > build_active_side_list() const
unsigned int _uniform_refine_level
The level of uniform refinement requested (set to zero if AMR is disabled)
virtual Node *& set_node(const unsigned int i)
const std::vector< QpMap > & getPRefinementMapHelper(const Elem &elem, const std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap >> &) const
unsigned int n_systems() const
std::vector< dof_id_type > _min_ids
Minimum integer ID for each extra element integer.
Helper class for sorting Boundary Nodes so that we always get the same order of application for bound...
const InputParameters & _pars
The object's parameters.
libMesh::QBase *const & writeableQRule()
Returns the reference to the current quadrature being used.
virtual unique_id_type parallel_max_unique_id() const=0
std::unordered_set< dof_id_type > getBoundaryActiveSemiLocalElemIds(BoundaryID bid) const
Return all ids of elements which have a side which is part of a sideset.
std::string & nodeset_name(boundary_id_type id)
const MooseUnits & lengthUnit() const
void checkDuplicateSubdomainNames()
Loop through all subdomain IDs and check if there is name duplication used for the subdomains with sa...
const unsigned int invalid_uint
const std::set< BoundaryID > & getSubdomainBoundaryIds(const SubdomainID subdomain_id) const
Get the list of boundary ids associated with the given subdomain id.
std::unique_ptr< PointLocatorBase > sub_point_locator() const
RealVectorValue _half_range
A convenience vector used to hold values in each dimension representing half of the range...
Keeps track of stuff related to assembling.
std::map< libMesh::ElemType, std::map< std::pair< int, int >, std::vector< std::vector< QpMap > > > > _elem_type_to_child_side_refinement_map
Holds mappings for "internal" child sides to parent volume. The second key is (child, child_side).
void setCoordData(const MooseMesh &other_mesh)
Set the coordinate system data to that of other_mesh.
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false, bool skip_detect_interior_parents=false)=0
const Elem * interior_parent() const
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
bool _finite_volume_info_dirty
virtual Elem * elemPtr(const dof_id_type i)
void allow_renumbering(bool allow)
The definition of the bnd_elem_iterator struct.
std::map< SubdomainID, Moose::CoordinateSystemType > & _coord_sys
Type of coordinate system per subdomain.
bool isBoundaryNode(dof_id_type node_id) const
Returns true if the requested node is in the list of boundary nodes, false otherwise.
face_info_iterator ownedFaceInfoBegin()
Iterators to owned faceInfo objects.
const std::map< dof_id_type, std::vector< dof_id_type > > & nodeToActiveSemilocalElemMap()
If not already created, creates a map from every node to all active semilocal elements to which they ...
std::vector< std::tuple< dof_id_type, unsigned short int, boundary_id_type > > buildActiveSideList() const
Calls BoundaryInfo::build_active_side_list.
IntRange< unsigned short > side_index_range() const
static void setPartitioner(MeshBase &mesh_base, MooseEnum &partitioner, bool use_distributed_mesh, const InputParameters ¶ms, MooseObject &context_obj)
Method for setting the partitioner on the passed in mesh_base object.
void skip_partitioning(bool skip)
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
void buildLowerDMesh()
Build lower-d mesh for all sides.
const std::set< BoundaryID > & meshSidesetIds() const
Returns a read-only reference to the set of sidesets currently present in the Mesh.
void side_boundary_ids(const Elem *const elem, std::vector< std::vector< boundary_id_type >> &vec_to_fill) const
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i)=0
unsigned int number() const
Get variable number coming from libMesh.
std::unordered_map< const Elem *, unsigned short int > _lower_d_elem_to_higher_d_elem_side
const BoundaryID INVALID_BOUNDARY_ID
void cacheFVElementalDoFs() const
Cache the DoF indices for FV variables on each element.
static constexpr Real TOLERANCE
void cacheFaceInfoVariableOwnership() const
Cache if variables live on the elements connected by the FaceInfo objects.
bool _custom_partitioner_requested
unsigned int _max_nodes_per_side
The maximum number of nodes per side.
const std::unordered_map< boundary_id_type, std::unordered_set< dof_id_type > > & getBoundariesToElems() const
Returns a map of boundaries to ids of elements on the boundary.
Moose::CoordinateSystemType getUniqueCoordSystem() const
Get the coordinate system from the mesh, it must be the same in all subdomains otherwise this will er...
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
std::map< dof_id_type, std::vector< dof_id_type > > _node_to_elem_map
A map of all of the current nodes to the elements that they are connected to.
unsigned int _max_sides_per_elem
The maximum number of sides per element.
bool isSemiLocal(Node *const node) const
Returns true if the node is semi-local.
const libMesh::DofMap & dofMap() const
The DofMap associated with the system this variable is in.
unsigned int which_side_am_i(const Elem *e) const
KOKKOS_SCALAR_FUNCTION auto operator*(const T &left, const Scalar< U > &right) -> decltype(left *static_cast< const U &>(right))
virtual bool is_child_on_side(const unsigned int c, const unsigned int s) const=0
const Elem * getLowerDElem(const Elem *, unsigned short int) const
Returns a const pointer to a lower dimensional element that corresponds to a side of a higher dimensi...
std::unique_ptr< libMesh::StoredRange< MooseMesh::const_bnd_elem_iterator, const BndElement * > > _bnd_elem_range
const std::vector< std::pair< unsigned int, QpMap > > & getCoarseningMap(const Elem &elem, int input_side)
Get the coarsening map for a given element type.
std::unordered_map< boundary_id_type, std::unordered_set< dof_id_type > > _bnd_elem_ids
Map of set of elem IDs connected to each boundary.
void prepare_for_use(const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors)
RefinementState p_refinement_flag() const
bool _doing_p_refinement
Whether we have p-refinement (whether exclusively p- or hp-refinement)
const Elem * elem() const
void build_node_list_from_side_list(const std::set< boundary_id_type > &sideset_list={})
void determineUseDistributedMesh()
Determine whether to use a distributed mesh.
const std::vector< std::vector< QpMap > > & getRefinementMap(const Elem &elem, int parent_side, int child, int child_side)
Get the refinement map for a given element type.
const boundary_id_type side_id
void cacheChangedLists()
Cache information about what elements were refined and coarsened in the previous step.
void coordTransformFactor(const SubProblem &s, SubdomainID sub_id, const P &point, C &factor, SubdomainID neighbor_sub_id=libMesh::Elem::invalid_subdomain_id)
Computes a conversion multiplier for use when computing integraals for the current coordinate system ...
virtual void find_neighbors(const bool reset_remote_elements=false, const bool reset_current_list=true, const bool assert_valid=true)=0
const Point & getPoint(const PointObject &item) const
get a Point reference from the PointData object at index idx in the list
const std::map< boundary_id_type, std::string > & get_sideset_name_map() const
void family_tree(std::vector< const Elem * > &family, bool reset=true) const
unsigned int side_with_boundary_id(const Elem *const elem, const boundary_id_type boundary_id) const
The definition of the bnd_node_iterator struct.
const std::string & getBoundaryName(const BoundaryID boundary_id) const
Return the name of the boundary given the id.
unsigned int n_elem_integers() const
std::vector< const ElemInfo * > _elem_info
Holds only those ElemInfo objects that have processor_id equal to this process's id, e.g.
void buildHRefinementAndCoarseningMaps(Assembly *assembly)
boundary_id_type pairedboundary
PeriodicBoundaryBase * boundary(boundary_id_type id)
bool usingGeneralAxisymmetricCoordAxes() const
Returns true if general axisymmetric coordinate axes are being used.
std::map< std::pair< int, libMesh::ElemType >, std::vector< std::vector< QpMap > > > _elem_type_to_refinement_map
Holds mappings for volume to volume and parent side to child side Map key:
const std::set< SubdomainID > & getBlockConnectedBlocks(const SubdomainID subdomain_id) const
Get the list of subdomains neighboring a given subdomain.
virtual const Node * queryNodePtr(const dof_id_type i) const
virtual std::unique_ptr< Partitioner > & partitioner()
void addPeriodicVariable(const unsigned int sys_num, const unsigned int var_num, const BoundaryID primary, const BoundaryID secondary)
For "regular orthogonal" meshes, determine if variable var_num is periodic with respect to the primar...
std::unordered_map< std::pair< const Elem *, unsigned short int >, const Elem * > _higher_d_elem_side_to_lower_d_elem
Holds a map from a high-order element side to its corresponding lower-d element.
Helper object for holding qp mapping info.
unsigned int size() const
Return the number of active items in the MultiMooseEnum.
void mooseInfoRepeated(Args &&... args)
Emit an informational message with the given stringified, concatenated args.
const std::vector< Real > & getGhostedBoundaryInflation() const
Return a writable reference to the _ghosted_boundaries_inflation vector.
std::unique_ptr< ConstElemPointerRange > _refined_elements
The elements that were just refined.
std::vector< std::vector< bool > > _id_identical_flag
Flags to indicate whether or not any two extra element integers are the same.
virtual dof_id_type maxElemId() const
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
const Parallel::Communicator & comm() const
virtual bnd_elem_iterator bndElemsBegin()
Return iterators to the beginning/end of the boundary elements list.
void setUniformRefineLevel(unsigned int, bool deletion=true)
Set uniform refinement level.
virtual unsigned int n_children() const=0
unsigned int p_level() const
void allgather_packed_range(Context *context, Iter range_begin, const Iter range_end, OutputIter out, std::size_t approx_buffer_size=1000000) const
MooseEnum _partitioner_name
The partitioner used on this mesh.
std::unique_ptr< libMesh::ConstElemRange > _active_local_elem_range
A range for use with threading.
std::map< dof_id_type, std::set< SubdomainID > > _block_node_list
list of nodes that belongs to a specified block (domain)
bool _node_to_active_semilocal_elem_map_built
std::map< boundary_id_type, std::set< dof_id_type > > _bnd_node_ids
Map of sets of node IDs in each boundary.
virtual void init()
Initialize the Mesh object.
ConstElemPointerRange * refinedElementRange() const
Return a range that is suitable for threaded execution over elements that were just refined...
void boundary_ids(const Node *node, std::vector< boundary_id_type > &vec_to_fill) const
unsigned int getHigherDSide(const Elem *elem) const
Returns the local side ID of the interior parent aligned with the lower dimensional element...
std::unordered_map< std::pair< const Elem *, unsigned int >, FaceInfo * > _elem_side_to_face_info
Map from elem-side pair to FaceInfo.
void detectPairedSidesets()
This routine detects paired sidesets of a regular orthogonal mesh (.i.e.
const std::set< SubdomainID > & getNodeBlockIds(const Node &node) const
Return list of blocks to which the given node belongs.
virtual std::unique_ptr< Partitioner > clone() const=0
const Parallel::Communicator & _communicator
std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap > > _elem_type_to_p_coarsening_side_map
virtual const std::set< SubdomainID > & blockIDs() const
Return the block subdomain ids for this object Note, if this is not block restricted, this function returns all mesh subdomain ids.
void setMeshBoundaryIDs(std::set< BoundaryID > boundary_IDs)
Sets the set of BoundaryIDs Is called by AddAllSideSetsByNormals.
std::map< boundary_id_type, std::vector< dof_id_type > > _node_set_nodes
list of nodes that belongs to a specified nodeset: indexing [nodeset_id] -> [array of node ids] ...
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
Get the associated subdomainIDs for the subdomain names that are passed in.
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
std::set< SubdomainID > _lower_d_boundary_blocks
Mesh blocks for boundary lower-d elements in different types.
std::basic_ostream< charT, traits > * os
void changeBoundaryId(const boundary_id_type old_id, const boundary_id_type new_id, bool delete_prev)
Change all the boundary IDs for a given side from old_id to new_id.
Base class for a system (of equations)
const BoundaryInfo & get_boundary_info() const
std::set< Elem * > _ghost_elems_from_ghost_boundaries
Set of elements ghosted by ghostGhostedBoundaries.
virtual void buildMesh()=0
Must be overridden by child classes.
void setPartitionerHelper(MeshBase *mesh=nullptr)
void deleteRemoteElements()
Delete remote elements.
bool isSplitMesh() const
Whether or not this is a split mesh operation.
unsigned int _to
The qp to map to.
BoundaryID _bnd_id
boundary id for the node
std::vector< BCTuple > build_side_list(BCTupleSortBy sort_by=BCTupleSortBy::ELEM_ID) const
libMesh::ConstNodeRange * getLocalNodeRange()
virtual std::unique_ptr< MeshBase > clone() const=0
Real distance(const Point &p)
virtual const Node & nodeRef(const dof_id_type i) const
bool _allow_recovery
Whether or not this Mesh is allowed to read a recovery file.
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)=0
std::vector< SubdomainID > getSubdomainIDs(const std::vector< SubdomainName > &subdomain_names) const
Get the associated subdomainIDs for the subdomain names that are passed in.
bool operator()(const BndNode *const &lhs, const BndNode *const &rhs)
void buildNodeListFromSideList()
Calls BoundaryInfo::build_node_list_from_side_list().
FEProblemBase & feProblem() const
const std::string & getSubdomainName(SubdomainID subdomain_id) const
Return the name of a block given an id.
void setPatchUpdateStrategy(Moose::PatchUpdateType patch_update_strategy)
Set the patch size update strategy.
void buildFiniteVolumeInfo() const
Builds the face and elem info vectors that store meta-data needed for looping over and doing calculat...
std::unordered_map< SubdomainID, std::set< BoundaryID > > _neighbor_subdomain_boundary_ids
Holds a map from neighbor subomdain ids to the boundary ids that are attached to it.
const std::pair< Point, RealVectorValue > & getGeneralAxisymmetricCoordAxis(SubdomainID subdomain_id) const
Gets the general axisymmetric coordinate axis for a block.
void reinit(const Elem *elem)
Reinitialize objects (JxW, q_points, ...) for an elements.
SubdomainID getSubdomainID(const SubdomainName &subdomain_name, const MeshBase &mesh)
Gets the subdomain ID associated with the given SubdomainName.
auto max(const L &left, const R &right)
const std::set< BoundaryID > & meshBoundaryIds() const
Returns a read-only reference to the set of boundary IDs currently present in the Mesh...
std::set< SubdomainID > _lower_d_interior_blocks
Mesh blocks for interior lower-d elements in different types.
virtual Elem * queryElemPtr(const dof_id_type i)
elem_info_iterator ownedElemInfoBegin()
Iterators to owned faceInfo objects.
void setIsCustomPartitionerRequested(bool cpr)
const std::set< boundary_id_type > & get_node_boundary_ids() const
unsigned int _max_h_level
Maximum h-refinement level of all elements.
virtual bnd_node_iterator bndNodesBegin()
Return iterators to the beginning/end of the boundary nodes list.
void mapPoints(const std::vector< Point > &from, const std::vector< Point > &to, std::vector< QpMap > &qp_map)
Find the closest points that map "from" to "to" and fill up "qp_map".
BoundaryID getBoundaryID(const BoundaryName &boundary_name, const MeshBase &mesh)
Gets the boundary ID associated with the given BoundaryName.
virtual Point get_corresponding_pos(const Point &pt) const=0
void errorIfDistributedMesh(std::string name) const
Generate a unified error message if the underlying libMesh mesh is a DistributedMesh.
const MeshBase * getMeshPtr() const
void mooseWarning(Args &&... args) const
bool getDistributedMeshOnCommandLine() const
Returns true if the user specified –distributed-mesh (or –parallel-mesh, for backwards compatibilit...
This data structure is used to store geometric and variable related metadata about each cell face in ...
const std::vector< const FaceInfo * > & faceInfo() const
Accessor for local FaceInfo objects.
void updateCoordTransform()
Update the coordinate transformation object based on our coordinate system data.
bool _use_distributed_mesh
False by default.
virtual bool is_serial() const
void libmesh_ignore(const Args &...)
std::unique_ptr< std::map< BoundaryID, RealVectorValue > > _boundary_to_normal_map
The boundary to normal map - valid only when AddAllSideSetsByNormals is active.
const dof_id_type n_nodes
const std::string & name() const
Get the name of the class.
static const std::array< bool, 3 > periodic_dim_default
Default value for the automatically detected paired boundaries for each unit dimension, in which the value for each unit dimension is false (not detected).
bool _built_from_other_mesh
Whether or not this mesh was built from another mesh.
bool _allow_remote_element_removal
Whether to allow removal of remote elements.
std::unique_ptr< Moose::Kokkos::Mesh > _kokkos_mesh
Pointer to Kokkos mesh object.
virtual bool skipNoncriticalPartitioning() const
SemiLocalNodeRange * getActiveSemiLocalNodeRange() const
std::unordered_set< dof_id_type > getBoundaryActiveNeighborElemIds(BoundaryID bid) const
Return all ids of neighbors of elements which have a side which is part of a sideset.
void setSubdomainName(SubdomainID subdomain_id, const SubdomainName &name)
This method sets the name for subdomain_id to name.
virtual void delete_elem(Elem *e)=0
void clearQuadratureNodes()
Clear out any existing quadrature nodes.
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
void min(const T &r, T &o, Request &req) const
const std::map< SubdomainID, Moose::CoordinateSystemType > & getCoordSystem() const
Get the map from subdomain ID to coordinate system type, e.g.
static constexpr dof_id_type invalid_id
std::vector< BndNode * > _bnd_nodes
array of boundary nodes
virtual unsigned int n_nodes() const=0
Every object that can be built by the factory should be derived from this class.
virtual unsigned int dimension() const
Returns MeshBase::mesh_dimension(), (not MeshBase::spatial_dimension()!) of the underlying libMesh me...
unsigned int _from
The qp to map from.
std::pair< const Node *, BoundaryID > PeriodicNodeInfo
Helper type for building periodic node maps.
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
Method to construct a libMesh::MeshBase object that is normally set and used by the MooseMesh object ...
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
const Point & min() const
virtual Elem * add_elem(Elem *e)=0
const std::set< unsigned int > & getGhostedBoundaries() const
Return a writable reference to the set of ghosted boundary IDs.
bool _construct_node_list_from_side_list
Whether or not to allow generation of nodesets from sidesets.
boundary_id_type BoundaryID
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
const std::array< bool, 3 > & queryPeriodicDimensions(const unsigned int sys_num, const unsigned int var_num) const
Query the translated periodic dimension flags for the given variable on the given system...
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
unsigned int sideWithBoundaryID(const Elem *const elem, const BoundaryID boundary_id) const
Calls BoundaryInfo::side_with_boundary_id().
const std::vector< dof_id_type > & getNodeList(boundary_id_type nodeset_id) const
Return a writable reference to a vector of node IDs that belong to nodeset_id.
std::map< std::pair< unsigned int, unsigned int >, std::array< bool, 3 > > _periodic_dim
A map from (system number, vector number) to which dimensions are periodic in a regular orthogonal me...
virtual const Node * nodePtr(const dof_id_type i) const
virtual const Node * query_node_ptr(const dof_id_type i) const=0
virtual libMesh::EquationSystems & es() override
std::vector< dof_id_type > _max_ids
Maximum integer ID for each extra element integer.
virtual dof_id_type max_elem_id() const=0
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
void family_tree(T elem, std::vector< T > &family, bool reset=true)
void update()
Calls buildNodeListFromSideList(), buildNodeList(), and buildBndElemList().
void mooseDeprecated(Args &&... args) const
const std::string & type() const
Get the type of this class.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
bool isKokkosAvailable() const
Get whether Kokkos is available.
std::set< BoundaryID > _mesh_nodeset_ids
virtual bool is_remote() const
std::unique_ptr< MooseAppCoordTransform > _coord_transform
A coordinate transformation object that describes how to transform this problem's coordinate system i...
std::set< SubdomainID > getBoundaryConnectedBlocks(const BoundaryID bid) const
Get the list of subdomains associated with the given boundary.
void checkCoordinateSystems()
Performs a sanity check for every element in the mesh.
std::vector< BoundaryID > getBoundaryIDs(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown, const std::set< BoundaryID > &mesh_boundary_ids)
Gets the boundary IDs with their names.
std::string & subdomain_name(subdomain_id_type id)
std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap > > _elem_type_to_p_refinement_side_map
const std::set< unsigned char > & elem_dimensions() const
std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap > > _elem_type_to_p_coarsening_map
const bool _is_split
Whether or not we are using a (pre-)split mesh (automatically DistributedMesh)
void setCoordSystem(const std::vector< SubdomainName > &blocks, const MultiMooseEnum &coord_sys)
Set the coordinate system for the provided blocks to coord_sys.
std::unique_ptr< ConstElemPointerRange > _coarsened_elements
The elements that were just coarsened.
void allow_find_neighbors(bool allow)
void set_mesh_dimension(unsigned char d)
std::set< dof_id_type > getAllElemIDs(unsigned int elem_id_index) const
Return all the unique element IDs for an extra element integer with its index.
std::set< BoundaryID > _mesh_boundary_ids
A set of boundary IDs currently present in the mesh.
const Node * addUniqueNode(const Point &p, Real tol=1e-6)
Add a new node to the mesh.
std::vector< BndNode > _extra_bnd_nodes
MooseApp & _app
The MOOSE application this is associated with.
unsigned int number() const
Gets the number of this system.
bool _moose_mesh_prepared
True if prepare has been called on the mesh.
void buildRefinementMap(const Elem &elem, libMesh::QBase &qrule, libMesh::QBase &qrule_face, int parent_side, int child, int child_side)
Build the refinement map for a given element type.
The definition of the face_info_iterator struct.
unsigned int uniformRefineLevel() const
Returns the level of uniform refinement requested (zero if AMR is disabled).
std::vector< BndElement * > _bnd_elems
array of boundary elems
std::string stringify(const T &t)
conversion to string
bool _coord_system_set
Whether the coordinate system has been set.
std::vector< SubdomainName > getSubdomainNames(const std::vector< SubdomainID > &subdomain_ids) const
Get the associated subdomainNames for the subdomain ids that are passed in.
const std::vector< QpMap > & getPRefinementMap(const Elem &elem) const
Get the map describing for each volumetric quadrature point (qp) on the refined level which qp on the...
virtual dof_id_type nActiveLocalElem() const
AuxiliarySystem & getAuxiliarySystem()
const std::pair< BoundaryID, BoundaryID > * getPairedBoundaryMapping(unsigned int component) const
This function attempts to return the paired boundary ids for the given component. ...
bool hasSecondOrderElements()
check if the mesh has SECOND order elements
unsigned int getPatchSize() const
Getter for the patch_size parameter.
void buildRefinementAndCoarseningMaps(Assembly *assembly)
Create the refinement and coarsening maps necessary for projection of stateful material properties wh...
std::string getBoundaryString(const BoundaryID boundary_id) const
Return the name of the boundary given the id, if it exists.
bool _parallel_type_overridden
const std::string & get_nodeset_name(boundary_id_type id) const
Interface for objects interacting with the PerfGraph.
MeshBase::element_iterator activeLocalElementsBegin()
Calls active_local_nodes_begin/end() on the underlying libMesh mesh object.
std::vector< Node * > _node_map
Vector of all the Nodes in the mesh for determining when to add a new point.
std::map< dof_id_type, std::map< unsigned int, std::map< dof_id_type, Node * > > > _elem_to_side_to_qp_to_quadrature_nodes
Executioner * getExecutioner() const
Retrieve the Executioner for this App.
const std::vector< QpMap > & getPRefinementSideMap(const Elem &elem) const
Get the map describing for each side quadrature point (qp) on the refined level which qp on the previ...
bool _displace_node_list_by_side_list
Whether or not to displace unrelated nodesets by nodesets constructed from sidesets.
std::unordered_map< dof_id_type, ElemInfo > _elem_to_elem_info
Map connecting elems with their corresponding ElemInfo, we use the element ID as the key...
libMesh::Node * _node
pointer to the node
Node * getQuadratureNode(const Elem *elem, const unsigned short int side, const unsigned int qp)
Get a specified quadrature node.
void printInfo(std::ostream &os=libMesh::out, const unsigned int verbosity=0) const
Calls print_info() on the underlying Mesh.
std::string & sideset_name(boundary_id_type id)
virtual dof_id_type nNodes() const
Calls n_nodes/elem() on the underlying libMesh mesh object.
void renumber_node_id(boundary_id_type old_id, boundary_id_type new_id)
std::pair< T, U > ResultItem
static MooseEnum partitioning()
returns MooseMesh partitioning options so other classes can use it
const std::set< boundary_id_type > & get_boundary_ids() const
const std::vector< std::vector< dof_id_type > > & dofIndices() const
virtual Node * add_node(Node *n)=0
virtual const Elem * elem_ptr(const dof_id_type i) const=0
void buildCoarseningMap(const Elem &elem, libMesh::QBase &qrule, libMesh::QBase &qrule_face, int input_side)
Build the coarsening map for a given element type.
virtual unsigned int n_sides() const=0
const std::vector< const Elem * > & coarsenedElementChildren(const Elem *elem) const
Get the newly removed children element ids for an element that was just coarsened.
std::unordered_map< dof_id_type, std::set< dof_id_type > > getElemIDMapping(const std::string &from_id_name, const std::string &to_id_name) const
std::map< std::pair< int, libMesh::ElemType >, std::vector< std::pair< unsigned int, QpMap > > > _elem_type_to_coarsening_map
Holds mappings for volume to volume and parent side to child side Map key:
void setBoundaryName(BoundaryID boundary_id, BoundaryName name)
This method sets the boundary name of the boundary based on the id parameter.
const Elem * neighbor_ptr(unsigned int i) const
void remove_side(const Elem *elem, const unsigned short int side)
Moose::PatchUpdateType _patch_update_strategy
The patch update strategy.
infix_ostream_iterator< T, charT, traits > & operator=(T const &item)
Physical unit management class with runtime unit string parsing, unit checking, unit conversion...
bool absolute_fuzzy_equals(const T &var1, const T2 &var2, const Real tol=TOLERANCE *TOLERANCE)
unsigned int level() const
void setCurrentSubdomainID(SubdomainID i)
set the current subdomain ID
std::set< BoundaryID > _mesh_sideset_ids
void setGeneralAxisymmetricCoordAxes(const std::vector< SubdomainName > &blocks, const std::vector< std::pair< Point, RealVectorValue >> &axes)
Sets the general coordinate axes for axisymmetric blocks.
void setBoundaryToNormalMap(std::unique_ptr< std::map< BoundaryID, RealVectorValue >> boundary_map)
Sets the mapping between BoundaryID and normal vector Is called by AddAllSideSetsByNormals.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool _partitioner_overridden
bool detectOrthogonalDimRanges(Real tol=1e-6)
This routine determines whether the Mesh is a regular orthogonal mesh (i.e.
virtual std::unique_ptr< Elem > side_ptr(unsigned int i)=0
virtual const Elem * query_elem_ptr(const dof_id_type i) const=0
void updateActiveSemiLocalNodeRange(std::set< dof_id_type > &ghosted_elems)
Clears the "semi-local" node list and rebuilds it.
subdomain_id_type subdomain_id() const
std::map< const Elem *, std::vector< const Elem * > > _coarsened_element_children
Map of Parent elements to children elements for elements that were just coarsened.
std::set< dof_id_type > getElemIDsOnBlocks(unsigned int elem_id_index, const std::set< SubdomainID > &blks) const
Return all the unique element IDs for an extra element integer with its index on a set of subdomains...
unsigned int getBlocksMaxDimension(const std::vector< SubdomainName > &blocks) const
Returns the maximum element dimension on the given blocks.
std::unique_ptr< libMesh::MeshBase > _mesh
Pointer to underlying libMesh mesh object.
void max(const T &r, T &o, Request &req) const
libMesh::NodeRange * getActiveNodeRange()
virtual unsigned short dim() const=0
const Node * node_ptr(const unsigned int i) const
void setGhostedBoundaryInflation(const std::vector< Real > &inflation)
This sets the inflation amount for the bounding box for each partition for use in ghosting boundaries...
bool isTranslatedPeriodic(const unsigned int sys_num, const unsigned int var_num, const unsigned int component) const
Returns whether this generated mesh is periodic in the given dimension for the given variable on the ...
The definition of the elem_info_iterator struct.
Real dimensionWidth(unsigned int component) const
Returns the width of the requested dimension.
PatchUpdateType
Type of patch update strategy for modeling node-face constraints or contact.
bool is_my_variable(unsigned int var_num) const
bool _skip_deletion_repartition_after_refine
Whether or not skip remote deletion and repartition after uniform refinements.
std::set< SubdomainID > getBoundaryConnectedSecondaryBlocks(const BoundaryID bid) const
Get the list of subdomains associated with the given boundary of its secondary side.
void add_side(const dof_id_type elem, const unsigned short int side, const boundary_id_type id)
unsigned int _max_nodes_per_elem
The maximum number of nodes per element.
bool _need_delete
Whether we need to delete remote elements after init'ing the EquationSystems.
const std::string & get_sideset_name(boundary_id_type id) const
std::map< std::pair< libMesh::ElemType, unsigned int >, std::vector< QpMap > > _elem_type_to_p_refinement_map
void setAxisymmetricCoordAxis(const MooseEnum &rz_coord_axis)
For axisymmetric simulations, set the symmetry coordinate axis.
std::optional< std::vector< std::pair< BoundaryID, BoundaryID > > > _paired_boundary
A vector holding the paired boundaries for a regular orthogonal mesh.
std::set< BoundaryID > getSubdomainInterfaceBoundaryIds(const SubdomainID subdomain_id) const
Get the list of boundaries that contact the given subdomain.
std::vector< const Elem * > _refined_elements
The elements that were just refined.
IntRange< T > make_range(T beg, T end)
virtual const Node & node(const dof_id_type i) const
Various accessors (pointers/references) for Node "i".
infix_ostream_iterator< T, charT, traits > & operator++()
libMesh::BoundingBox getInflatedProcessorBoundingBox(Real inflation_multiplier=0.01) const
Get a (slightly inflated) processor bounding box.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
unsigned int mesh_dimension() const
void setMeshBase(std::unique_ptr< MeshBase > mesh_base)
Method to set the mesh_base object.
std::set< SubdomainID > getInterfaceConnectedBlocks(const BoundaryID bid) const
Get the list of subdomains contacting the given boundary.
Real minPeriodicDistance(const unsigned int sys_num, const unsigned int var_num, const Point &p, const Point &q) const
Returns the distance between two points on the mesh taking into account periodicity for the given var...
SolverSystem & getSolverSystem(unsigned int sys_num)
Get non-constant reference to a solver system.
void unset_has_boundary_id_sets()
std::vector< Real > _ghosted_boundaries_inflation
virtual SimpleRange< element_iterator > active_subdomain_set_elements_ptr_range(std::set< subdomain_id_type > ss)=0
std::vector< std::unordered_map< SubdomainID, std::set< dof_id_type > > > _block_id_mapping
Unique element integer IDs for each subdomain and each extra element integers.
IntRange< unsigned short > node_index_range() const
void findAdaptivityQpMaps(const Elem *template_elem, libMesh::QBase &qrule, libMesh::QBase &qrule_face, std::vector< std::vector< QpMap >> &refinement_map, std::vector< std::pair< unsigned int, QpMap >> &coarsen_map, int parent_side, int child, int child_side)
Given an elem type, get maps that tell us what qp's are closest to each other between a parent and it...
unsigned int _patch_size
The number of nodes to consider in the NearestNode neighborhood.
elem_info_iterator ownedElemInfoEnd()
void buildPeriodicNodeSets(std::map< BoundaryID, std::set< dof_id_type >> &periodic_node_sets, unsigned int var_number, libMesh::PeriodicBoundaries *pbs) const
This routine builds a datastructure of node ids organized by periodic boundary ids.
virtual std::unique_ptr< libMesh::PointLocatorBase > getPointLocator() const
Proxy function to get a (sub)PointLocator from either the underlying libMesh mesh (default)...
void addGhostedBoundary(BoundaryID boundary_id)
This will add the boundary ids to be ghosted to this processor.
virtual dof_id_type maxNodeId() const
Calls max_node/elem_id() on the underlying libMesh mesh object.
std::vector< NodeBCTuple > build_node_list(NodeBCTupleSortBy sort_by=NodeBCTupleSortBy::NODE_ID) const
virtual Elem * elem(const dof_id_type i)
Various accessors (pointers/references) for Elem "i".
libMesh::StoredRange< MooseMesh::const_bnd_elem_iterator, const BndElement * > * getBoundaryElementRange()
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
bool hasKokkosObjects() const
face_info_iterator ownedFaceInfoEnd()
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
std::unordered_map< SubdomainID, std::pair< Point, RealVectorValue > > _subdomain_id_to_rz_coord_axis
Map of subdomain ID to general axisymmetric axis.
void paramWarning(const std::string ¶m, Args... args) const
Class used for caching additional information for elements such as the volume and centroid...
MeshBase::node_iterator localNodesEnd()
const RealVectorValue & getNormalByBoundaryID(BoundaryID id) const
Returns the normal vector associated with a given BoundaryID.
std::set< SubdomainID > _mesh_subdomains
A set of subdomain IDs currently present in the mesh.
ConstElemPointerRange * coarsenedElementRange() const
Return a range that is suitable for threaded execution over elements that were just coarsened...
static InputParameters validParams()
const Moose::PatchUpdateType & getPatchUpdateStrategy() const
Get the current patch update strategy.
bool doingPRefinement() const
Query whether the kind of adaptivity we're doing includes p-refinement.
const Point & max() const
void ghostGhostedBoundaries()
Actually do the ghosting of boundaries that need to be ghosted to this processor. ...
std::set< unsigned int > _ghosted_boundaries
MeshBase::node_iterator localNodesBegin()
Calls local_nodes_begin/end() on the underlying libMesh mesh object.
unsigned int _rz_coord_axis
Storage for RZ axis selection.
void computeFiniteVolumeCoords() const
Compute the face coordinate value for all FaceInfo and ElemInfo objects.
void buildNodeList()
Calls BoundaryInfo::build_node_list()/build_side_list() and makes separate copies of Nodes/Elems in t...
virtual dof_id_type max_node_id() const=0
std::unordered_map< SubdomainID, SubdomainData > _sub_to_data
Holds a map from subdomain ids to associated data.
std::unique_ptr< libMesh::Partitioner > _custom_partitioner
The custom partitioner.
bool isBoundaryElem(dof_id_type elem_id) const
Returns true if the requested element is in the list of boundary elements, false otherwise.
virtual dof_id_type n_elem() const=0
virtual const Node * node_ptr(const dof_id_type i) const=0
std::map< const Elem *, std::vector< const Elem * > > _coarsened_element_children
Map of Parent elements to child elements for elements that were just coarsened.
processor_id_type processor_id() const
static constexpr subdomain_id_type invalid_subdomain_id
virtual Order default_order() const=0
const std::vector< QpMap > & getPCoarseningMap(const Elem &elem) const
Get the map describing for each volumetric quadrature point (qp) on the coarse level which qp on the ...
bool isRecovering() const
Whether or not this is a "recover" calculation.
SystemBase & sys()
Get the system this variable is part of.
auto min(const L &left, const R &right)
virtual std::size_t numSolverSystems() const override
SearchParams SearchParameters
std::vector< const Elem * > _coarsened_elements
The elements that were just coarsened.
void buildPeriodicNodeMap(std::multimap< dof_id_type, dof_id_type > &periodic_node_map, unsigned int var_number, libMesh::PeriodicBoundaries *pbs) const
This routine builds a multimap of boundary ids to matching boundary ids across all periodic boundarie...
processor_id_type processor_id() const
std::string getRestartRecoverFileBase() const
The file_base for the recovery file.
virtual ElemType type() const=0
bool isParamSetByUser(const std::string &name) const
Test if the supplied parameter is set by a user, as opposed to not set or set to default.
dof_id_type node_id(const unsigned int i) const
const Point & point(const unsigned int i) const
const std::unordered_map< boundary_id_type, std::unordered_set< dof_id_type > > & getBoundariesToActiveSemiLocalElemIds() const
Returns a map of boundaries to ids of elements on the boundary.
const MeshBase::element_iterator activeLocalElementsEnd()
bool relative_fuzzy_equals(const TypeVector< Real > &rhs, Real tol=TOLERANCE) const
std::unique_ptr< libMesh::ConstNodeRange > _local_node_range
libMesh::StoredRange< MooseMesh::const_bnd_node_iterator, const BndNode * > * getBoundaryNodeRange()
void ErrorVector unsigned int
auto index_range(const T &sizable)
bool _regular_orthogonal_mesh
Boolean indicating whether this mesh was detected to be regular and orthogonal.
std::map< dof_id_type, std::vector< dof_id_type > > _node_to_active_semilocal_elem_map
A map of all of the current nodes to the active elements that they are connected to.
virtual dof_id_type n_nodes() const=0
bool prepare(const MeshBase *mesh_to_clone)
Calls prepare_for_use() if the underlying MeshBase object isn't prepared, then communicates various b...
const ElemInfo & elemInfo(const dof_id_type id) const
Accessor for the elemInfo object for a given element ID.
void setCustomPartitioner(libMesh::Partitioner *partitioner)
Setter for custom partitioner.
Real _distance
The distance between them.
SubdomainID subdomain_id() const
We return the subdomain ID of the corresponding libmesh element.
dof_id_type get_extra_integer(const unsigned int index) const
const Elem * child_ptr(unsigned int i) const
static MooseEnum elemTypes()
returns MooseMesh element type options
void meshChanged()
Declares that the MooseMesh has changed, invalidates cached data and rebuilds caches.
void buildPRefinementAndCoarseningMaps(Assembly *assembly)
BoundaryID getBoundaryID(const BoundaryName &boundary_name) const
Get the associated BoundaryID for the boundary name.
std::unique_ptr< libMesh::StoredRange< MooseMesh::const_bnd_node_iterator, const BndNode * > > _bnd_node_range
virtual dof_id_type nElem() const
const std::map< dof_id_type, std::vector< dof_id_type > > & nodeToElemMap()
If not already created, creates a map from every node to all elements to which they are connected...
libMesh::QBase *const & writeableQRuleFace()
Returns the reference to the current quadrature being used on a current face.
bool isBoundaryFullyExternalToSubdomains(BoundaryID bid, const std::set< SubdomainID > &blk_group) const
Returns whether a boundary (given by its id) is not crossing through a group of blocks, by which we mean that elements on both sides of the boundary are in those blocks.
std::unique_ptr< SemiLocalNodeRange > _active_semilocal_node_range
const std::set< SubdomainID > & meshSubdomains() const
Returns a read-only reference to the set of subdomains currently present in the Mesh.
SubdomainID getSubdomainID(const SubdomainName &subdomain_name) const
Get the associated subdomain ID for the subdomain name.
unsigned int _max_p_level
Maximum p-refinement level of all elements.
void setupFiniteVolumeMeshData() const
Sets up the additional data needed for finite volume computations.
void set_union(T &data, const unsigned int root_id) const
const RemoteElem * remote_elem
virtual unsigned int effectiveSpatialDimension() const
Returns the effective spatial dimension determined by the coordinates actually used by the mesh...