13 #include "MooseMesh.h"
14 #include "MooseVariable.h"
20 InputParameters params = validParams<InitialCondition>();
21 params.addRequiredParam<Real>(
"invalue",
"The variable value inside the superellipsoid");
22 params.addRequiredParam<Real>(
"outvalue",
"The variable value outside the superellipsoid");
23 params.addParam<Real>(
25 "The variable value for nested particles inside the superellipsoid in inverse configuration");
26 params.addParam<Real>(
27 "int_width", 0.0,
"The interfacial width of the void surface. Defaults to sharp interface");
28 params.addParam<
bool>(
"zero_gradient",
30 "Set the gradient DOFs to zero. This can avoid "
31 "numerical problems with higher order shape "
33 params.addParam<
unsigned int>(
"rand_seed", 12345,
"Seed value for the random number generator");
38 : InitialCondition(parameters),
39 _mesh(_fe_problem.mesh()),
40 _invalue(parameters.get<Real>(
"invalue")),
41 _outvalue(parameters.get<Real>(
"outvalue")),
42 _nestedvalue(isParamValid(
"nestedvalue") ? parameters.get<Real>(
"nestedvalue")
43 : parameters.get<Real>(
"outvalue")),
44 _int_width(parameters.get<Real>(
"int_width")),
45 _zero_gradient(parameters.get<bool>(
"zero_gradient"))
47 _random.seed(_tid, getParam<unsigned int>(
"rand_seed"));
59 mooseError(
"_center and semiaxis _as vectors are not the same size in the Superellipsoid IC");
61 mooseError(
"_center and semiaxis _bs vectors are not the same size in the Superellipsoid IC");
63 mooseError(
"_center and semiaxis _cs vectors are not the same size in the Superellipsoid IC");
65 mooseError(
"_center and exponent _ns vectors are not the same size in the Superellipsoid IC");
68 mooseError(
"_centers, _as, _bs, _cs, and _ns were not initialized in the Superellipsoid IC");
98 for (
unsigned int ellip = 0; ellip <
_centers.size(); ++ellip)
115 const Point & p,
const Point & center, Real a, Real b, Real c, Real n)
117 Point l_center = center;
120 Real dist =
_mesh.minPeriodicDistance(_var.number(), l_p, l_center);
131 Point dist_vec =
_mesh.minPeriodicVector(_var.number(), center, p);
134 Real rmn = (
std::pow(std::abs(dist_vec(0) / dist / a), n) +
135 std::pow(std::abs(dist_vec(1) / dist / b), n) +
136 std::pow(std::abs(dist_vec(2) / dist / c), n));
156 const Point & p,
const Point & center, Real a, Real b, Real c, Real n)
158 Point l_center = center;
161 Real dist =
_mesh.minPeriodicDistance(_var.number(), l_p, l_center);
172 Point dist_vec =
_mesh.minPeriodicVector(_var.number(), center, p);
175 Real rmn = (
std::pow(std::abs(dist_vec(0) / dist / a), n) +
176 std::pow(std::abs(dist_vec(1) / dist / b), n) +
177 std::pow(std::abs(dist_vec(2) / dist / c), n));
196 const Point & p,
const Point & center, Real a, Real b, Real c, Real n)
198 Point l_center = center;
201 Real dist =
_mesh.minPeriodicDistance(_var.number(), l_p, l_center);
212 Point dist_vec =
_mesh.minPeriodicVector(_var.number(), center, p);
214 Real rmn = (
std::pow(std::abs(dist_vec(0) / dist / a), n) +
215 std::pow(std::abs(dist_vec(1) / dist / b), n) +
216 std::pow(std::abs(dist_vec(2) / dist / c), n));
222 if (dist < r + _int_width / 2.0 && dist > r -
_int_width / 2.0)
227 (-std::sin(int_pos * libMesh::pi) * libMesh::pi) / 2.0;
230 return dist_vec * (DvalueDr / dist);