95 _nx(declareMeshProperty(
"num_elements_x", getParam<unsigned
int>(
"nx"))),
96 _ny(declareMeshProperty(
"num_elements_y", getParam<unsigned
int>(
"ny"))),
97 _nz(declareMeshProperty(
"num_elements_z", getParam<unsigned
int>(
"nz"))),
98 _xmin(declareMeshProperty(
"xmin", getParam<Real>(
"xmin"))),
99 _xmax(declareMeshProperty(
"xmax", getParam<Real>(
"xmax"))),
100 _ymin(declareMeshProperty(
"ymin", getParam<Real>(
"ymin"))),
101 _ymax(declareMeshProperty(
"ymax", getParam<Real>(
"ymax"))),
102 _zmin(declareMeshProperty(
"zmin", getParam<Real>(
"zmin"))),
103 _zmax(declareMeshProperty(
"zmax", getParam<Real>(
"zmax"))),
104 _has_subdomain_ids(isParamValid(
"subdomain_ids")),
105 _gauss_lobatto_grid(getParam<bool>(
"gauss_lobatto_grid")),
106 _bias_x(getParam<Real>(
"bias_x")),
107 _bias_y(getParam<Real>(
"bias_y")),
108 _bias_z(getParam<Real>(
"bias_z")),
109 _boundary_name_prefix(isParamValid(
"boundary_name_prefix")
110 ? getParam<
std::string>(
"boundary_name_prefix") +
"_"
112 _boundary_id_offset(getParam<boundary_id_type>(
"boundary_id_offset"))
115 mooseError(
"Cannot apply both Gauss-Lobatto mesh grading and biasing at the same time.");
117 paramError(
"xmax",
"xmax must be larger than xmin.");
119 paramError(
"ymax",
"ymax must be larger than ymin.");
121 paramError(
"zmax",
"zmax must be larger than zmin.");
132 for (
auto &
name : getParam<std::vector<ExtraElementIDName>>(
"extra_element_integers"))
136 MooseEnum elem_type_enum = getParam<MooseEnum>(
"elem_type");
144 elem_type_enum =
"EDGE2";
147 elem_type_enum =
"QUAD4";
150 elem_type_enum =
"HEX8";
155 ElemType elem_type = Utility::string_to_enum<ElemType>(elem_type_enum);
163 MeshTools::Generation::build_line(
167 MeshTools::Generation::build_square(cast_ref<UnstructuredMesh &>(*
mesh),
178 MeshTools::Generation::build_cube(cast_ref<UnstructuredMesh &>(*
mesh),
195 auto & bids = getParam<std::vector<SubdomainID>>(
"subdomain_ids");
196 if (bids.size() !=
_nx *
_ny *
_nz && bids.size() != 1)
198 "Size must equal to the product of number of elements in all directions, or one.");
199 for (
auto & elem :
mesh->element_ptr_range())
201 const Point p = elem->vertex_average();
205 unsigned int i = iz *
_nx *
_ny + iy *
_nx + ix;
206 if (bids.size() == 1)
207 elem->subdomain_id() = bids[0];
209 elem->subdomain_id() = bids[i];
215 const auto & subdomain_name = getParam<SubdomainName>(
"subdomain_name");
218 const auto & bids = getParam<std::vector<SubdomainID>>(
"subdomain_ids");
222 "Specifying a subdomain_name is only supported for a single entry in subdomain_ids");
224 mesh->set_subdomain_name(bids[0], subdomain_name,
true);
227 mesh->set_subdomain_name(0, subdomain_name,
true);
231 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
234 const auto mesh_boundary_ids = boundary_info.get_global_boundary_ids();
235 for (
auto rit = mesh_boundary_ids.rbegin(); rit != mesh_boundary_ids.rend(); ++rit)
237 const std::string old_sideset_name = boundary_info.sideset_name(*rit);
238 const std::string old_nodeset_name = boundary_info.nodeset_name(*rit);
250 mesh->unset_has_boundary_id_sets();
255 const auto MIN = std::numeric_limits<Real>::max();
258 std::array<Real, LIBMESH_DIM> bias = {
262 std::array<Real, LIBMESH_DIM> width = {
269 std::array<unsigned int, LIBMESH_DIM> nelem = {{
_nx,
_dim > 1 ?
_ny : 1,
_dim > 2 ?
_nz : 1}};
273 std::array<std::vector<Real>, LIBMESH_DIM> pows;
274 for (
unsigned int dir = 0; dir < LIBMESH_DIM; ++dir)
276 pows[dir].resize(nelem[dir] + 1);
278 for (
unsigned int i = 1; i < pows[dir].size(); ++i)
279 pows[dir][i] = pows[dir][i - 1] * bias[dir];
283 for (
auto & node_ptr :
mesh->node_ptr_range())
285 Node & node = *node_ptr;
287 for (
unsigned int dir = 0; dir < LIBMESH_DIM; ++dir)
289 if (width[dir] != 0. && bias[dir] != 1.)
294 Real float_index = (node(dir) - mins[dir]) * nelem[dir] / width[dir];
296 Real integer_part = 0;
297 Real fractional_part = std::modf(float_index, &integer_part);
300 if (std::abs(fractional_part) < TOLERANCE || std::abs(fractional_part - 1.0) < TOLERANCE)
309 int index = round(float_index);
311 mooseAssert(index >=
static_cast<int>(0) && index <
static_cast<int>(pows[dir].size()),
312 "Scaled \"index\" out of range");
316 mins[dir] + width[dir] * (1. - pows[dir][index]) / (1. - pows[dir][nelem[dir]]);
318 else if (std::abs(fractional_part - 0.5) < TOLERANCE)
329 node(dir) = mins[dir] +
331 (1. - 0.5 * (pows[dir][integer_part] + pows[dir][integer_part + 1])) /
332 (1. - pows[dir][nelem[dir]]);
337 mooseError(
"Unable to bias node at node(", dir,
")=", node(dir));
344 mesh->unset_is_prepared();
345 return dynamic_pointer_cast<MeshBase>(
mesh);