https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MooseMeshUtils.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12#include "libmesh/replicated_mesh.h"
13#include "libmesh/boundary_info.h"
14
15#include "MooseUtils.h"
16#include "MooseTypes.h"
17#include "FaceInfo.h"
18#include "MeshGenerator.h"
19
20// Utilities for MeshBase
21// Many of these utilities could live in libMesh, and in fact, before adding a new one here
22// you should also check mesh_tools.h in libMesh to see if it does not exist there already.
23
25{
26
27// Used to temporarily store information about which lower-dimensional
28// sides to add and what subdomain id to use for the added sides.
30{
31 ElemSidePair(Elem * elem_in, unsigned short int side_in) : elem(elem_in), side(side_in) {}
32
33 Elem * elem;
34 unsigned short int side;
35};
36
42void mergeBoundaryIDsWithSameName(MeshBase & mesh);
43
52void changeBoundaryId(MeshBase & mesh,
53 const libMesh::boundary_id_type old_id,
54 const libMesh::boundary_id_type new_id,
55 bool delete_prev);
56
64void
65changeSubdomainId(MeshBase & mesh, const subdomain_id_type old_id, const subdomain_id_type new_id);
66
80std::vector<BoundaryID> getBoundaryIDs(const libMesh::MeshBase & mesh,
81 const std::vector<BoundaryName> & boundary_name,
82 bool generate_unknown,
83 const std::set<BoundaryID> & mesh_boundary_ids);
84
98std::vector<BoundaryID> getBoundaryIDs(const libMesh::MeshBase & mesh,
99 const std::vector<BoundaryName> & boundary_name,
100 bool generate_unknown);
101
116std::set<BoundaryID> getBoundaryIDSet(const libMesh::MeshBase & mesh,
117 const std::vector<BoundaryName> & boundary_name,
118 bool generate_unknown);
119
126BoundaryID getBoundaryID(const BoundaryName & boundary_name, const MeshBase & mesh);
127
133std::set<std::pair<BoundaryName, BoundaryID>>
135
142SubdomainID getSubdomainID(const SubdomainName & subdomain_name, const MeshBase & mesh);
143
151std::vector<subdomain_id_type> getSubdomainIDs(const libMesh::MeshBase & mesh,
152 const std::vector<SubdomainName> & subdomain_name);
153std::set<subdomain_id_type> getSubdomainIDs(const libMesh::MeshBase & mesh,
154 const std::set<SubdomainName> & subdomain_name);
155
161std::set<std::pair<SubdomainName, SubdomainID>>
163
169Point meshCentroidCalculator(const MeshBase & mesh);
170
177Point boundaryCentroidCalculator(const BoundaryName & boundary, MeshBase & mesh);
178
185RealVectorValue boundaryWeightedNormal(const BoundaryName & boundary, MeshBase & mesh);
186
197template <typename P, typename C>
198void
200 C & factor,
201 const Moose::CoordinateSystemType coord_type,
202 const unsigned int rz_radial_coord = libMesh::invalid_uint)
203{
204 switch (coord_type)
205 {
206 case Moose::COORD_XYZ:
207 factor = 1.0;
208 break;
209 case Moose::COORD_RZ:
210 {
211 mooseAssert(rz_radial_coord != libMesh::invalid_uint,
212 "Must pass in a valid rz radial coordinate");
213 factor = 2 * M_PI * point(rz_radial_coord);
214 break;
215 }
217 factor = 4 * M_PI * point(0) * point(0);
218 break;
219 default:
220 mooseError("Unknown coordinate system");
221 }
222}
223
231template <typename P, typename C>
232C
233computeDistanceToAxis(const P & point, const Point & origin, const RealVectorValue & direction)
234{
235 return (point - origin).cross(direction).norm();
236}
237
245Real computeMaxDistanceToAxis(const MeshBase & mesh,
246 const Point & origin,
247 const RealVectorValue & direction);
248
257template <typename P, typename C>
258void
260 const std::pair<Point, RealVectorValue> & axis,
261 C & factor)
262{
263 factor = 2 * M_PI * computeDistanceToAxis<P, C>(point, axis.first, axis.second);
264}
265
266inline void
268 const Moose::CoordinateSystemType coord_type,
269 const unsigned int rz_radial_coord = libMesh::invalid_uint)
270{
271 coordTransformFactor(fi.faceCentroid(), fi.faceCoord(), coord_type, rz_radial_coord);
272}
273
288std::unordered_map<dof_id_type, dof_id_type>
289getExtraIDUniqueCombinationMap(const MeshBase & mesh,
290 const std::set<SubdomainID> & block_ids,
291 std::vector<ExtraElementIDName> extra_ids);
292
301bool isCoPlanar(const std::vector<Point> & vec_pts, const Point plane_nvec, const Point fixed_pt);
302
309bool isCoPlanar(const std::vector<Point> & vec_pts, const Point plane_nvec);
310
316bool isCoPlanar(const std::vector<Point> & vec_pts);
317
323SubdomainID getNextFreeSubdomainID(MeshBase & input_mesh);
324
330BoundaryID getNextFreeBoundaryID(MeshBase & input_mesh);
331
337bool hasSubdomainID(const MeshBase & input_mesh, const SubdomainID & id);
338
344bool hasSubdomainName(const MeshBase & input_mesh, const SubdomainName & name);
345
351bool hasBoundaryID(const MeshBase & input_mesh, const BoundaryID id);
352
361bool hasBoundaryName(const MeshBase & mesh, const BoundaryName & name);
362
371bool hasBoundaryNameOrID(const MeshBase & mesh, const BoundaryName & name_or_id);
372
383void makeOrderedNodeList(std::vector<std::pair<dof_id_type, dof_id_type>> & node_assm,
384 std::vector<dof_id_type> & elem_id_list,
385 std::vector<dof_id_type> & midpoint_node_list,
386 std::vector<dof_id_type> & ordered_node_list,
387 std::vector<dof_id_type> & ordered_elem_id_list);
388
397void makeOrderedNodeList(std::vector<std::pair<dof_id_type, dof_id_type>> & node_assm,
398 std::vector<dof_id_type> & elem_id_list,
399 std::vector<dof_id_type> & ordered_node_list,
400 std::vector<dof_id_type> & ordered_elem_id_list);
401
409template <typename T, typename Q>
410Q
411getIDFromName(const T & name)
412{
413 if (!MooseUtils::isDigits(name))
415 "'name' ", name, " should only contain digits that can be converted to a numerical type.");
416 long long id = std::stoll(name);
417 Q id_Q = Q(id);
418 if (id < std::numeric_limits<Q>::min() || id > std::numeric_limits<Q>::max())
419 mooseError(MooseUtils::prettyCppType<T>(&name),
420 " ",
421 name,
422 " is not within the numeric limits of the expected ID type ",
423 MooseUtils::prettyCppType<Q>(&id_Q),
424 ".");
425
426 return id_Q;
427}
428
435void swapNodesInElem(Elem & elem, const unsigned int nd1, const unsigned int nd2);
436
446template <typename T>
447void
448idSwapParametersProcessor(const std::string & class_name,
449 const std::string & id_name,
450 const std::vector<std::vector<T>> & id_swaps,
451 std::vector<std::unordered_map<T, T>> & id_swap_pairs,
452 const unsigned int row_index_shift = 0)
453{
454 id_swap_pairs.resize(id_swaps.size());
455 for (const auto i : index_range(id_swaps))
456 {
457 const auto & swaps = id_swaps[i];
458 auto & swap_pairs = id_swap_pairs[i];
459
460 if (swaps.size() % 2)
461 throw MooseException("Row ",
462 row_index_shift + i + 1,
463 " of ",
464 id_name,
465 " in ",
466 class_name,
467 " does not contain an even number of entries! Num entries: ",
468 swaps.size());
469
470 swap_pairs.reserve(swaps.size() / 2);
471 for (unsigned int j = 0; j < swaps.size(); j += 2)
472 swap_pairs[swaps[j]] = swaps[j + 1];
473 }
474}
475
485 const std::string & class_name,
486 const unsigned int num_sections,
487 const unsigned int num_integers,
488 const std::vector<std::vector<std::vector<dof_id_type>>> & elem_integers_swaps,
489 std::vector<std::unordered_map<dof_id_type, dof_id_type>> & elem_integers_swap_pairs);
490
500std::unique_ptr<ReplicatedMesh> buildBoundaryMesh(const MeshBase & input_mesh,
501 const boundary_id_type boundary_id);
502
511std::unique_ptr<ReplicatedMesh> buildLoopBoundaryOf2DMesh(const MeshBase & input_mesh,
512 const boundary_id_type boundary_id);
513
520std::unordered_map<dof_id_type, std::unordered_set<dof_id_type>>
521buildBoundaryNodeToElemMap(const MeshBase & input_mesh, const boundary_id_type boundary_id);
522
530std::set<dof_id_type> getBoundaryNodes(const MeshBase & mesh, const BoundaryID boundary_id);
531
541void createSubdomainFromSidesets(MeshBase & mesh,
542 std::vector<BoundaryName> boundary_names,
543 const SubdomainID new_subdomain_id,
544 const SubdomainName & new_subdomain_name);
545
552void convertBlockToMesh(MeshBase & source_mesh,
553 MeshBase & target_mesh,
554 const std::vector<SubdomainName> & target_blocks);
555
568 UnstructuredMesh & destination,
569 const UnstructuredMesh & source,
570 const bool avoid_merging_subdomains,
571 const bool avoid_merging_boundaries,
572 const Parallel::Communicator & communicator);
573
586void buildPolyLineMesh(MeshBase & mesh,
587 const std::vector<Point> & points,
588 const bool loop,
589 const BoundaryName & start_boundary,
590 const BoundaryName & end_boundary,
591 const std::vector<unsigned int> & nums_edges_between_points);
592
610void buildPolyLineMesh(MeshBase & mesh,
611 const std::vector<Point> & points,
612 const std::vector<Point> & mid_points,
613 const bool loop,
614 const BoundaryName & start_boundary,
615 const BoundaryName & end_boundary,
616 const std::vector<unsigned int> & nums_edges_between_points);
617
631void buildPolyLineMesh(MeshBase & mesh,
632 const std::vector<Point> & points,
633 const bool loop,
634 const BoundaryName & start_boundary,
635 const BoundaryName & end_boundary,
636 const Real max_elem_size);
637
645void addExternalBoundary(MeshBase & mesh, const BoundaryID extern_bid, bool & has_external_bid);
646
657std::vector<unsigned int> nodalQuadraturePointToNodeMap(const Elem & elem,
658 const std::vector<Point> & q_points);
659}
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
This data structure is used to store geometric and variable related metadata about each cell face in ...
Definition FaceInfo.h:38
Real & faceCoord()
Sets/gets the coordinate transformation factor (for e.g.
Definition FaceInfo.h:68
const Point & faceCentroid() const
Returns the coordinates of the face centroid.
Definition FaceInfo.h:75
MeshGenerators are objects that can modify or add to an existing mesh.
Provides a way for users to bail out of the current solve.
void copyIntoMesh(MeshGenerator &mg, UnstructuredMesh &destination, const UnstructuredMesh &source, const bool avoid_merging_subdomains, const bool avoid_merging_boundaries, const Parallel::Communicator &communicator)
Helper function for copying one mesh into another.
std::set< std::pair< BoundaryName, BoundaryID > > getAllBoundaryNamesAndIDs(const libMesh::MeshBase &mesh)
Get all boundary names and IDs from a mesh.
bool hasBoundaryID(const MeshBase &input_mesh, const BoundaryID id)
Whether a particular boundary ID exists in the mesh.
Point boundaryCentroidCalculator(const BoundaryName &boundary, MeshBase &mesh)
Calculates the centroid of a boundary on a mesh.
bool hasBoundaryName(const MeshBase &mesh, const BoundaryName &name)
Whether a particular boundary name exists in the mesh.
void computeFiniteVolumeCoords(FaceInfo &fi, const Moose::CoordinateSystemType coord_type, const unsigned int rz_radial_coord=libMesh::invalid_uint)
void coordTransformFactorRZGeneral(const P &point, const std::pair< Point, RealVectorValue > &axis, C &factor)
Computes a coordinate transformation factor for a general axisymmetric axis.
void extraElemIntegerSwapParametersProcessor(const std::string &class_name, const unsigned int num_sections, const unsigned int num_integers, const std::vector< std::vector< std::vector< dof_id_type > > > &elem_integers_swaps, std::vector< std::unordered_map< dof_id_type, dof_id_type > > &elem_integers_swap_pairs)
Reprocess the elem_integers_swaps into maps so they are easier to use.
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
std::set< std::pair< SubdomainName, SubdomainID > > getAllSubdomainNamesAndIDs(const libMesh::MeshBase &mesh)
Get all subdomain names and ids from a mesh.
void buildPolyLineMesh(MeshBase &mesh, const std::vector< Point > &points, const bool loop, const BoundaryName &start_boundary, const BoundaryName &end_boundary, const std::vector< unsigned int > &nums_edges_between_points)
Generates meshes from edges connecting a list of points.
void changeBoundaryId(MeshBase &mesh, const libMesh::boundary_id_type old_id, const libMesh::boundary_id_type new_id, bool delete_prev)
Changes the old boundary ID to a new ID in the mesh.
bool hasSubdomainID(const MeshBase &input_mesh, const SubdomainID &id)
Whether a particular subdomain ID exists in the mesh.
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.
Q getIDFromName(const T &name)
Converts a given name (BoundaryName or SubdomainName) that is known to only contain digits into a cor...
std::unique_ptr< ReplicatedMesh > buildBoundaryMesh(const MeshBase &input_mesh, const boundary_id_type boundary_id)
Build a lower-dimensional mesh from a boundary of an input mesh Note: The lower-dimensional mesh will...
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::unordered_map< dof_id_type, std::unordered_set< dof_id_type > > buildBoundaryNodeToElemMap(const MeshBase &input_mesh, const boundary_id_type boundary_id)
Build a map from the node ids to all element ids they are part of for the nodes on a particular nodes...
void changeSubdomainId(MeshBase &mesh, const subdomain_id_type old_id, const subdomain_id_type new_id)
Changes the old subdomain ID to a new ID in the mesh.
std::vector< unsigned int > nodalQuadraturePointToNodeMap(const Elem &elem, const std::vector< Point > &q_points)
Match the points of a nodal quadrature rule (e.g.
void createSubdomainFromSidesets(MeshBase &mesh, std::vector< BoundaryName > boundary_names, const SubdomainID new_subdomain_id, const SubdomainName &new_subdomain_name)
Create a new subdomain by generating new side elements from a list of sidesets in a given mesh.
std::set< dof_id_type > getBoundaryNodes(const MeshBase &mesh, const BoundaryID boundary_id)
Get all the nodes on that particular boundary, whether a nodeset or a sideset.
BoundaryID getNextFreeBoundaryID(MeshBase &input_mesh)
Checks input mesh and returns the largest boundary ID in the mesh plus one, which is a boundary ID in...
void addExternalBoundary(MeshBase &mesh, const BoundaryID extern_bid, bool &has_external_bid)
Adds a sideset for the external boundary of the mesh (e.g.
void swapNodesInElem(Elem &elem, const unsigned int nd1, const unsigned int nd2)
Swap two nodes within an element.
void convertBlockToMesh(MeshBase &source_mesh, MeshBase &target_mesh, const std::vector< SubdomainName > &target_blocks)
Convert a list of blocks in a given mesh to a standalone new mesh.
std::set< BoundaryID > getBoundaryIDSet(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown)
Gets the boundary IDs into a set with their names.
std::unordered_map< dof_id_type, dof_id_type > getExtraIDUniqueCombinationMap(const MeshBase &mesh, const std::set< SubdomainID > &block_ids, std::vector< ExtraElementIDName > extra_ids)
Create a new set of element-wise IDs by finding unique combinations of existing extra ID values.
void idSwapParametersProcessor(const std::string &class_name, const std::string &id_name, const std::vector< std::vector< T > > &id_swaps, std::vector< std::unordered_map< T, T > > &id_swap_pairs, const unsigned int row_index_shift=0)
Reprocess the swap related input parameters to make pairs out of them to ease further processing.
void mergeBoundaryIDsWithSameName(MeshBase &mesh)
Merges the boundary IDs of boundaries that have the same names but different IDs.
C computeDistanceToAxis(const P &point, const Point &origin, const RealVectorValue &direction)
Computes the distance to a general axis.
SubdomainID getNextFreeSubdomainID(MeshBase &input_mesh)
Checks input mesh and returns max(block ID) + 1, which represents a block ID that is not currently in...
BoundaryID getBoundaryID(const BoundaryName &boundary_name, const MeshBase &mesh)
Gets the boundary ID associated with the given BoundaryName.
bool isCoPlanar(const std::vector< Point > &vec_pts, const Point plane_nvec, const Point fixed_pt)
Decides whether all the Points of a vector of Points are in a plane that is defined by a normal vecto...
void coordTransformFactor(const P &point, C &factor, const Moose::CoordinateSystemType coord_type, const unsigned int rz_radial_coord=libMesh::invalid_uint)
Compute a coordinate transformation volume integration factor.
std::unique_ptr< ReplicatedMesh > buildLoopBoundaryOf2DMesh(const MeshBase &input_mesh, const boundary_id_type boundary_id)
Build a loop mesh of edges from the contiguous 2D boundary of 2D input mesh Note: The lower-dimension...
RealVectorValue boundaryWeightedNormal(const BoundaryName &boundary, MeshBase &mesh)
Calculates the side-volume weighted (side-vertex) average normal of a boundary on a mesh.
void makeOrderedNodeList(std::vector< std::pair< dof_id_type, dof_id_type > > &node_assm, std::vector< dof_id_type > &elem_id_list, std::vector< dof_id_type > &midpoint_node_list, std::vector< dof_id_type > &ordered_node_list, std::vector< dof_id_type > &ordered_elem_id_list)
Convert a list of sides in the form of a vector of pairs of node ids into a list of ordered nodes bas...
SubdomainID getSubdomainID(const SubdomainName &subdomain_name, const MeshBase &mesh)
Gets the subdomain ID associated with the given SubdomainName.
Point meshCentroidCalculator(const MeshBase &mesh)
Calculates the centroid of a MeshBase.
bool hasBoundaryNameOrID(const MeshBase &mesh, const BoundaryName &name_or_id)
Whether a particular boundary name or ID exists in the mesh.
Real computeMaxDistanceToAxis(const MeshBase &mesh, const Point &origin, const RealVectorValue &direction)
Computes the maximum distance from all nodes of a mesh to a general axis.
CoordinateSystemType
Definition MooseTypes.h:868
@ COORD_RZ
Definition MooseTypes.h:870
@ COORD_RSPHERICAL
Definition MooseTypes.h:871
@ COORD_XYZ
Definition MooseTypes.h:869
int8_t boundary_id_type
const unsigned int invalid_uint
ElemSidePair(Elem *elem_in, unsigned short int side_in)