16 #include "MooseMesh.h"
17 #include "MooseUtils.h"
18 #include "MooseVariable.h"
27 params.addClassDescription(
"Random distribution of smooth ellipse with given minimum spacing");
28 params.addRequiredParam<std::vector<unsigned int>>(
"numbub",
29 "Vector of the number of bubbles to place");
30 params.addRequiredParam<std::vector<Real>>(
32 "Vector of the minimum spacing of bubbles of one type, measured from center to center");
33 params.addParam<
unsigned int>(
"max_num_tries", 1000,
"The number of tries");
34 params.addRequiredParam<std::vector<Real>>(
35 "semiaxis_a",
"Vector of mean semiaxis values in the x direction for the ellipse");
36 params.addRequiredParam<std::vector<Real>>(
37 "semiaxis_b",
"Vector of mean semiaxis values in the y direction for the ellipse");
38 params.addRequiredParam<std::vector<Real>>(
"semiaxis_c",
39 "Vector of mean semiaxis values in the z direction "
40 "for the ellipse, must be greater than 0 even if 2D.");
41 params.addParam<std::vector<Real>>(
44 "Vector of exponents for each superellipsoid, n=2 is a normal ellipse");
45 params.addParam<std::vector<Real>>(
"semiaxis_a_variation",
47 "Vector of plus or minus fractions of random variation in the "
48 "bubble semiaxis in the x direction for uniform, standard "
49 "deviation for normal");
50 params.addParam<std::vector<Real>>(
"semiaxis_b_variation",
52 "Vector of plus or minus fractions of random variation in the "
53 "bubble semiaxis in the y direction for uniform, standard "
54 "deviation for normal");
55 params.addParam<std::vector<Real>>(
"semiaxis_c_variation",
57 "Vector of plus or minus fractions of random variation in the "
58 "bubble semiaxis in the z direction for uniform, standard "
59 "deviation for normal. Must be set to 0 if 2D.");
60 params.addParam<
bool>(
"check_extremes",
62 "Check all Superellipsoid extremes (center +- "
63 "each semiaxis) for overlap, must have "
64 "prevent_overlap set to True.");
65 params.addParam<
bool>(
"prevent_overlap",
67 "Check all Superellipsoid centers for overlap with other superellipsoids.");
68 params.addParam<
bool>(
"vary_axes_independently",
70 "If true the length of each semiaxis is randomly chosen "
71 "within the provided parameters, if false then one random "
72 "number is generated and applied to all semiaxes.");
73 MooseEnum rand_options(
"uniform normal none",
"none");
74 params.addParam<MooseEnum>(
75 "semiaxis_variation_type",
77 "Type of distribution that random superellipsoid semiaxes will follow");
83 _max_num_tries(getParam<unsigned int>(
"max_num_tries")),
84 _semiaxis_variation_type(getParam<MooseEnum>(
"semiaxis_variation_type")),
85 _prevent_overlap(getParam<bool>(
"prevent_overlap")),
86 _check_extremes(getParam<bool>(
"check_extremes")),
87 _vary_axes_independently(getParam<bool>(
"vary_axes_independently")),
88 _numbub(parameters.get<std::vector<unsigned int>>(
"numbub")),
89 _bubspac(parameters.get<std::vector<Real>>(
"bubspac")),
90 _exponent(parameters.get<std::vector<Real>>(
"exponent")),
91 _semiaxis_a(parameters.get<std::vector<Real>>(
"semiaxis_a")),
92 _semiaxis_b(parameters.get<std::vector<Real>>(
"semiaxis_b")),
93 _semiaxis_c(parameters.get<std::vector<Real>>(
"semiaxis_c")),
94 _semiaxis_a_variation(parameters.get<std::vector<Real>>(
"semiaxis_a_variation")),
95 _semiaxis_b_variation(parameters.get<std::vector<Real>>(
"semiaxis_b_variation")),
96 _semiaxis_c_variation(parameters.get<std::vector<Real>>(
"semiaxis_c_variation"))
103 unsigned int nv =
_numbub.size();
107 mooseError(
"Vectors for numbub, bubspac, exponent, semiaxis_a, semiaxis_b, and semiaxis_c must "
108 "be the same size.");
113 mooseError(
"Vectors for numbub, semiaxis_a_variation, semiaxis_b_variation, and "
114 "semiaxis_c_variation must be the same size.");
120 "Values were provided for semiaxis_a/b/c_variation but semiaxis_variation_type is set "
121 "to 'none' in 'MultiSmoothSuperellipsoidIC'.");
126 for (
unsigned int i = 0; i < LIBMESH_DIM; i++)
141 unsigned int start =
_as.size();
146 for (
unsigned int i = start; i <
_as.size(); i++)
162 randnum =
_random.randNormal(_tid, 0, 1);
187 unsigned int start =
_centers.size();
190 for (
unsigned int i = start; i <
_centers.size(); i++)
193 unsigned int num_tries = 0;
199 ran(0, 0) =
_random.rand(_tid);
200 ran(1, 1) =
_random.rand(_tid);
201 ran(2, 2) =
_random.rand(_tid);
205 for (
unsigned int j = 0; j < i; ++j)
219 mooseError(
"max_num_tries reached in 'MultiSmoothSuperellipsoidIC'.");
229 unsigned int start =
_ns.size();
232 for (
unsigned int i = start; i <
_ns.size(); ++i)
241 const Real dist = dist_vec.norm();
244 if (MooseUtils::absoluteFuzzyEqual(dist, 0.0))
282 for (
unsigned int pc = 0; pc < 6; pc++)
299 const Point dist_vec =
_mesh.minPeriodicVector(_var.number(),
_centers[i], tmp_p);
300 const Real dist = dist_vec.norm();
303 if (MooseUtils::absoluteFuzzyEqual(dist, 0.0))
307 Real rmn = (
std::pow(std::abs(dist_vec(0) / dist /
_as[i]),
_ns[i]) +