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(
static_cast<UnstructuredMesh &
>(*
mesh),
171 MeshTools::Generation::build_square(
static_cast<UnstructuredMesh &
>(*
mesh),
182 MeshTools::Generation::build_cube(
static_cast<UnstructuredMesh &
>(*
mesh),
199 auto & bids = getParam<std::vector<SubdomainID>>(
"subdomain_ids");
200 if (bids.size() !=
_nx *
_ny *
_nz && bids.size() != 1)
202 "Size must equal to the product of number of elements in all directions, or one.");
203 for (
auto & elem :
mesh->element_ptr_range())
205 const Point p = elem->vertex_average();
209 unsigned int i = iz *
_nx *
_ny + iy *
_nx + ix;
210 if (bids.size() == 1)
211 elem->subdomain_id() = bids[0];
213 elem->subdomain_id() = bids[i];
219 const auto & subdomain_name = getParam<SubdomainName>(
"subdomain_name");
222 const auto & bids = getParam<std::vector<SubdomainID>>(
"subdomain_ids");
226 "Specifying a subdomain_name is only supported for a single entry in subdomain_ids");
228 mesh->set_subdomain_name(bids[0], subdomain_name,
true);
231 mesh->set_subdomain_name(0, subdomain_name,
true);
235 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
238 const auto mesh_boundary_ids = boundary_info.get_global_boundary_ids();
239 for (
auto rit = mesh_boundary_ids.rbegin(); rit != mesh_boundary_ids.rend(); ++rit)
241 const std::string old_sideset_name = boundary_info.sideset_name(*rit);
242 const std::string old_nodeset_name = boundary_info.nodeset_name(*rit);
254 mesh->unset_has_boundary_id_sets();
259 const auto MIN = std::numeric_limits<Real>::max();
262 std::array<Real, LIBMESH_DIM> bias = {
266 std::array<Real, LIBMESH_DIM> width = {
273 std::array<unsigned int, LIBMESH_DIM> nelem = {{
_nx,
_dim > 1 ?
_ny : 1,
_dim > 2 ?
_nz : 1}};
277 std::array<std::vector<Real>, LIBMESH_DIM> pows;
278 for (
unsigned int dir = 0; dir < LIBMESH_DIM; ++dir)
280 pows[dir].resize(nelem[dir] + 1);
282 for (
unsigned int i = 1; i < pows[dir].size(); ++i)
283 pows[dir][i] = pows[dir][i - 1] * bias[dir];
287 for (
auto & node_ptr :
mesh->node_ptr_range())
289 Node & node = *node_ptr;
291 for (
unsigned int dir = 0; dir < LIBMESH_DIM; ++dir)
293 if (width[dir] != 0. && bias[dir] != 1.)
298 Real float_index = (node(dir) - mins[dir]) * nelem[dir] / width[dir];
300 Real integer_part = 0;
301 Real fractional_part = std::modf(float_index, &integer_part);
304 if (std::abs(fractional_part) < TOLERANCE || std::abs(fractional_part - 1.0) < TOLERANCE)
313 int index = round(float_index);
315 mooseAssert(index >=
static_cast<int>(0) && index <
static_cast<int>(pows[dir].size()),
316 "Scaled \"index\" out of range");
320 mins[dir] + width[dir] * (1. - pows[dir][index]) / (1. - pows[dir][nelem[dir]]);
322 else if (std::abs(fractional_part - 0.5) < TOLERANCE)
333 node(dir) = mins[dir] +
335 (1. - 0.5 * (pows[dir][integer_part] + pows[dir][integer_part + 1])) /
336 (1. - pows[dir][nelem[dir]]);
341 mooseError(
"Unable to bias node at node(", dir,
")=", node(dir));
348 mesh->unset_is_prepared();
349 return dynamic_pointer_cast<MeshBase>(
mesh);