14 #include "libmesh/mesh_generation.h"
15 #include "libmesh/unstructured_mesh.h"
16 #include "libmesh/replicated_mesh.h"
17 #include "libmesh/point.h"
18 #include "libmesh/elem.h"
19 #include "libmesh/node.h"
32 params.
addRequiredParam<std::vector<Real>>(
"dx",
"Intervals in the X direction");
33 params.
addParam<std::vector<unsigned int>>(
34 "ix",
"Number of grids in all intervals in the X direction (default to all one)");
36 "dy",
"Intervals in the Y direction (required when dim>1 otherwise ignored)");
37 params.
addParam<std::vector<unsigned int>>(
38 "iy",
"Number of grids in all intervals in the Y direction (default to all one)");
40 "dz",
"Intervals in the Z direction (required when dim>2 otherwise ignored)");
41 params.
addParam<std::vector<unsigned int>>(
42 "iz",
"Number of grids in all intervals in the Z direction (default to all one)");
43 params.
addParam<std::vector<unsigned int>>(
"subdomain_id",
"Block IDs (default to all zero)");
45 params.
addClassDescription(
"This CartesianMeshGenerator creates a non-uniform Cartesian mesh.");
52 _dx(getParam<
std::vector<Real>>(
"dx"))
57 _ix = getParam<std::vector<unsigned int>>(
"ix");
58 if (
_ix.size() !=
_dx.size())
59 mooseError(
"ix must be in the same size of dx");
60 for (
unsigned int i = 0; i <
_ix.size(); ++i)
65 _ix = std::vector<unsigned int>(
_dx.size(), 1);
67 for (
unsigned int i = 0; i <
_dx.size(); ++i)
73 _dy = getParam<std::vector<Real>>(
"dy");
74 for (
unsigned int i = 0; i <
_dy.size(); ++i)
81 _iy = getParam<std::vector<unsigned int>>(
"iy");
82 if (
_iy.size() !=
_dy.size())
83 mooseError(
"iy must be in the same size of dy");
84 for (
unsigned int i = 0; i <
_iy.size(); ++i)
89 _iy = std::vector<unsigned int>(
_dy.size(), 1);
93 _dz = getParam<std::vector<Real>>(
"dz");
94 for (
unsigned int i = 0; i <
_dz.size(); ++i)
101 _iz = getParam<std::vector<unsigned int>>(
"iz");
102 if (
_iz.size() !=
_dz.size())
103 mooseError(
"iz must be in the same size of dz");
104 for (
unsigned int i = 0; i <
_iz.size(); ++i)
109 _iz = std::vector<unsigned int>(
_dz.size(), 1);
113 _subdomain_id = getParam<std::vector<unsigned int>>(
"subdomain_id");
117 mooseError(
"subdomain_id must be in the size of product of sizes of dx, dy and dz");
122 mooseError(
"subdomain_id must be in the size of product of sizes of dx and dy");
127 mooseError(
"subdomain_id must be in the size of product of sizes of dx");
146 for (
unsigned int i = 0; i <
_dx.size(); ++i)
151 std::vector<unsigned int> new_id;
152 for (
unsigned int i = 0; i <
_dx.size(); ++i)
153 for (
unsigned int ii = 0; ii <
_ix[i]; ++ii)
171 for (
unsigned int i = 0; i <
_dx.size(); ++i)
174 for (
unsigned int i = 0; i <
_dy.size(); ++i)
178 std::vector<unsigned int> new_id;
179 for (
unsigned int j = 0; j <
_dy.size(); ++j)
180 for (
unsigned int jj = 0; jj <
_iy[j]; ++jj)
181 for (
unsigned int i = 0; i <
_dx.size(); ++i)
182 for (
unsigned int ii = 0; ii <
_ix[i]; ++ii)
198 for (
unsigned int i = 0; i <
_dx.size(); ++i)
201 for (
unsigned int i = 0; i <
_dy.size(); ++i)
204 for (
unsigned int i = 0; i <
_dz.size(); ++i)
207 std::vector<unsigned int> new_id;
208 for (
unsigned int k = 0; k <
_dz.size(); ++k)
209 for (
unsigned int kk = 0; kk <
_iz[k]; ++kk)
210 for (
unsigned int j = 0; j <
_dy.size(); ++j)
211 for (
unsigned int jj = 0; jj <
_iy[j]; ++jj)
212 for (
unsigned int i = 0; i <
_dx.size(); ++i)
213 for (
unsigned int ii = 0; ii <
_ix[i]; ++ii)
227 std::unique_ptr<MeshBase>
230 std::unique_ptr<ReplicatedMesh> mesh = libmesh_make_unique<ReplicatedMesh>(
comm(), 2);
237 MeshTools::Generation::build_line(static_cast<UnstructuredMesh &>(*mesh),
_nx, 0,
_nx, EDGE2);
240 MeshTools::Generation::build_square(
241 static_cast<UnstructuredMesh &>(*mesh),
_nx,
_ny, 0,
_nx, 0,
_ny, QUAD4);
245 static_cast<UnstructuredMesh &>(*mesh),
_nx,
_ny,
_nz, 0,
_nx, 0,
_ny, 0,
_nz, HEX8);
250 MeshBase::element_iterator el = mesh->active_elements_begin();
251 MeshBase::element_iterator el_end = mesh->active_elements_end();
252 for (; el != el_end; ++el)
254 const Point p = (*el)->centroid();
255 unsigned int ix = std::floor(p(0));
256 unsigned int iy = std::floor(p(1));
257 unsigned int iz = std::floor(p(2));
258 unsigned int i = iz *
_nx *
_ny + iy *
_nx + ix;
269 std::vector<Real> mapx;
272 mapx.push_back(base);
273 for (
unsigned int i = 0; i <
_dx.size(); ++i)
275 for (
unsigned int j = 1; j <=
_ix[i]; ++j)
276 mapx.push_back(base +
_dx[i] /
_ix[i] * j);
280 MeshBase::node_iterator node = mesh->active_nodes_begin();
281 MeshBase::node_iterator node_end = mesh->active_nodes_end();
282 for (; node != node_end; ++node)
284 unsigned int i = (*(*node))(0) + 0.5;
285 (*(*node))(0) = mapx.at(i);
293 std::vector<Real> mapx;
295 mapx.push_back(base);
296 for (
unsigned int i = 0; i <
_dx.size(); ++i)
298 for (
unsigned int j = 1; j <=
_ix[i]; ++j)
299 mapx.push_back(base +
_dx[i] /
_ix[i] * j);
303 std::vector<Real> mapy;
305 mapy.push_back(base);
306 for (
unsigned int i = 0; i <
_dy.size(); ++i)
308 for (
unsigned int j = 1; j <=
_iy[i]; ++j)
309 mapy.push_back(base +
_dy[i] /
_iy[i] * j);
313 MeshBase::node_iterator node = mesh->active_nodes_begin();
314 MeshBase::node_iterator node_end = mesh->active_nodes_end();
315 for (; node != node_end; ++node)
317 unsigned int i = (*(*node))(0) + 0.5;
318 (*(*node))(0) = mapx.at(i);
319 unsigned int j = (*(*node))(1) + 0.5;
320 (*(*node))(1) = mapy.at(j);
328 std::vector<Real> mapx;
330 mapx.push_back(base);
331 for (
unsigned int i = 0; i <
_dx.size(); ++i)
333 for (
unsigned int j = 1; j <=
_ix[i]; ++j)
334 mapx.push_back(base +
_dx[i] /
_ix[i] * j);
338 std::vector<Real> mapy;
340 mapy.push_back(base);
341 for (
unsigned int i = 0; i <
_dy.size(); ++i)
343 for (
unsigned int j = 1; j <=
_iy[i]; ++j)
344 mapy.push_back(base +
_dy[i] /
_iy[i] * j);
348 std::vector<Real> mapz;
350 mapz.push_back(base);
351 for (
unsigned int i = 0; i <
_dz.size(); ++i)
353 for (
unsigned int j = 1; j <=
_iz[i]; ++j)
354 mapz.push_back(base +
_dz[i] /
_iz[i] * j);
358 MeshBase::node_iterator node = mesh->active_nodes_begin();
359 MeshBase::node_iterator node_end = mesh->active_nodes_end();
360 for (; node != node_end; ++node)
362 unsigned int i = (*(*node))(0) + 0.5;
363 (*(*node))(0) = mapx.at(i);
364 unsigned int j = (*(*node))(1) + 0.5;
365 (*(*node))(1) = mapy.at(j);
366 unsigned int k = (*(*node))(2) + 0.5;
367 (*(*node))(2) = mapz.at(k);
373 return dynamic_pointer_cast<MeshBase>(mesh);