24 params.
addRequiredParam<
unsigned int>(
"op_num",
"Number of order parameters");
27 "columnar_3D",
false,
"3D microstructure will be columnar in the z-direction?");
38 MooseEnum structure_options(
"grains voids");
41 "Which structure type is being initialized, grains or voids");
42 params.
addParam<
unsigned int>(
"op_index",
44 "The index for the current order parameter, "
45 "not needed if structure_type = voids");
47 "polycrystal_ic_uo",
"UserObject for obtaining the polycrystal grain structure.");
48 params.
addParam<FileName>(
"file_name",
50 "File containing grain centroids, if file_name is provided, "
51 "the centroids from the file will be used.");
57 _structure_type(getParam<
MooseEnum>(
"structure_type")),
58 _op_num(getParam<unsigned
int>(
"op_num")),
59 _op_index(getParam<unsigned
int>(
"op_index")),
60 _columnar_3D(getParam<bool>(
"columnar_3D")),
62 _file_name(getParam<FileName>(
"file_name"))
65 mooseWarning(
"Detected invalue < outvalue in PolycrystalVoronoiVoidIC. Please make sure that's "
66 "the intended usage for representing voids.");
68 mooseError(
"PolycrystalVoronoiVoidIC requires numbub > 0. If you want no voids to "
69 "be represented, use invalue = outvalue. In general, you should use "
70 "PolycrystalVoronoi to represent Voronoi grain structures without "
78 mooseError(
"op_index is too large in CircleGrainVoidIC");
95 for (
unsigned int vp = 0; vp <
_numbub; ++vp)
98 unsigned int num_tries = 0;
106 mooseError(
"Too many tries of assigning void centers in "
107 "PolycrystalVoronoiVoidIC");
116 std::vector<PolycrystalVoronoiVoidIC::DistancePoint> diff(
_grain_num);
118 for (
unsigned int gr = 0; gr <
_grain_num; ++gr)
133 Point diff_centerpoints = pb - pa;
136 Point normal_vector = diff_centerpoints.cross(diff_rand_center);
137 Point slope = normal_vector.cross(diff_centerpoints);
140 Point midpoint = closest_point + (0.5 * diff_centerpoints);
146 Real slope_dot = slope * slope;
147 mooseAssert(slope_dot > 0,
"The dot product of slope with itself is zero");
149 lambda += (mid_rand_vector(i) * slope(i)) / slope_dot;
152 _centers[vp] = slope * lambda + midpoint;
159 for (
unsigned int i = 0; i < vp; ++i)
173 if (try_again ==
false)
175 Real min_rij_1, min_rij_2, rij, rij_diff_tol;
177 min_rij_1 =
_range.norm();
178 min_rij_2 =
_range.norm();
182 for (
unsigned int gr = 0; gr <
_grain_num; ++gr)
188 min_rij_2 = min_rij_1;
191 else if (rij < min_rij_2)
195 if (std::abs(min_rij_1 - min_rij_2) > rij_diff_tol)
199 }
while (try_again ==
true);
217 if (grain_value == 0)
registerMooseObject("PhaseFieldApp", PolycrystalVoronoiVoidIC)
void ErrorVector unsigned int
virtual GradientType gradient(const Point &)
virtual T value(const Point &p)=0
MooseVariableField< T > & _var
void mooseError(Args &&... args) const
void mooseWarning(Args &&... args) const
RealVectorValue minPeriodicVector(const unsigned int sys_num, const unsigned int var_num, Point p, Point q) const
Real minPeriodicDistance(const unsigned int sys_num, const unsigned int var_num, const Point &p, const Point &q) const
MultismoothCircleIC creates multiple SmoothCircles (number = numbub) that are randomly positioned aro...
const unsigned int _numbub
virtual void initialSetup() override
const unsigned int _max_num_tries
static InputParameters validParams()
PolycrystalVoronoiVoidIC initializes either grain or void values for a voronoi tesselation with voids...
struct PolycrystalVoronoiVoidIC::DistancePointComparator _customLess
virtual void initialSetup() override
const unsigned int _op_num
std::vector< Point > _centerpoints
static InputParameters validParams()
virtual void computeCircleCenters() override
const unsigned int _op_index
virtual RealGradient gradient(const Point &p) override
PolycrystalVoronoiVoidIC(const InputParameters ¶meters)
const MooseEnum _structure_type
virtual Real value(const Point &p) override
static InputParameters actionParameters()
const PolycrystalVoronoi & _poly_ic_uo
virtual std::vector< Point > getGrainCenters() const
virtual unsigned int getNumGrains() const override
Must be overridden by the deriving class to provide the number of grains in the polycrystal structure...
virtual Real getVariableValue(unsigned int op_index, const Point &p) const override
Returns the variable value for a given op_index and mesh point.
std::vector< Point > _centers
static constexpr std::size_t dim