www.mooseframework.org
Classes | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | List of all members
PolycrystalVoronoiVoidIC Class Reference

PolycrystalVoronoiVoidIC initializes either grain or void values for a voronoi tesselation with voids distributed along the grain boundaries. More...

#include <PolycrystalVoronoiVoidIC.h>

Inheritance diagram for PolycrystalVoronoiVoidIC:
[legend]

Classes

struct  DistancePoint
 Type for distance and point. More...
 
struct  DistancePointComparator
 Sorts the temp_centerpoints into order of magnitude. More...
 

Public Member Functions

 PolycrystalVoronoiVoidIC (const InputParameters &parameters)
 
virtual void initialSetup () override
 

Static Public Member Functions

static InputParameters actionParameters ()
 

Protected Types

enum  ProfileType { ProfileType::COS, ProfileType::TANH }
 

Protected Member Functions

virtual void computeCircleCenters () override
 
virtual Real value (const Point &p) override
 
virtual RealGradient gradient (const Point &p) override
 
virtual void computeCircleRadii () override
 
virtual Real computeCircleValue (const Point &p, const Point &center, const Real &radius)
 
virtual RealGradient computeCircleGradient (const Point &p, const Point &center, const Real &radius)
 

Protected Attributes

const MooseEnum _structure_type
 
const unsigned int _op_num
 
const unsigned int _op_index
 
const bool _columnar_3D
 
const PolycrystalVoronoi_poly_ic_uo
 
const FileName _file_name
 
unsigned int _grain_num
 
std::vector< Point > _centerpoints
 
struct PolycrystalVoronoiVoidIC::DistancePointComparator _customLess
 
const unsigned int _numbub
 
const Real _bubspac
 
const unsigned int _max_num_tries
 
const Real _radius
 
const Real _radius_variation
 
const MooseEnum _radius_variation_type
 
Point _bottom_left
 
Point _top_right
 
Point _range
 
MooseMesh & _mesh
 
Real _invalue
 
Real _outvalue
 
Real _int_width
 
bool _3D_spheres
 
bool _zero_gradient
 
unsigned int _num_dim
 
std::vector< Point > _centers
 
std::vector< Real > _radii
 
enum SmoothCircleBaseIC::ProfileType _profile
 
MooseRandom _random
 

Detailed Description

PolycrystalVoronoiVoidIC initializes either grain or void values for a voronoi tesselation with voids distributed along the grain boundaries.

Definition at line 28 of file PolycrystalVoronoiVoidIC.h.

Member Enumeration Documentation

◆ ProfileType

enum SmoothCircleBaseIC::ProfileType
strongprotectedinherited
Enumerator
COS 
TANH 

Definition at line 57 of file SmoothCircleBaseIC.h.

58  {
59  COS,
60  TANH
61  } _profile;

Constructor & Destructor Documentation

◆ PolycrystalVoronoiVoidIC()

PolycrystalVoronoiVoidIC::PolycrystalVoronoiVoidIC ( const InputParameters &  parameters)

Definition at line 58 of file PolycrystalVoronoiVoidIC.C.

59  : MultiSmoothCircleIC(parameters),
60  _structure_type(getParam<MooseEnum>("structure_type")),
61  _op_num(getParam<unsigned int>("op_num")),
62  _op_index(getParam<unsigned int>("op_index")),
63  _columnar_3D(getParam<bool>("columnar_3D")),
64  _poly_ic_uo(getUserObject<PolycrystalVoronoi>("polycrystal_ic_uo")),
65  _file_name(getParam<FileName>("file_name"))
66 {
67  if (_invalue < _outvalue)
68  mooseError("PolycrystalVoronoiVoidIC requires that the voids be "
69  "represented with invalue > outvalue");
70  if (_numbub == 0)
71  mooseError("PolycrystalVoronoiVoidIC requires numbub > 0. If you want no voids to "
72  "be "
73  "represented, use invalue = outvalue. In general, you should use "
74  "PolycrystalVoronoi to represent Voronoi grain structures without "
75  "voids.");
76 }

Member Function Documentation

◆ actionParameters()

InputParameters PolycrystalVoronoiVoidIC::actionParameters ( )
static

Definition at line 20 of file PolycrystalVoronoiVoidIC.C.

21 {
22  InputParameters params = ::validParams<MultiSmoothCircleIC>();
23 
24  params.addRequiredParam<unsigned int>("op_num", "Number of order parameters");
25 
26  params.addParam<bool>(
27  "columnar_3D", false, "3D microstructure will be columnar in the z-direction?");
28 
29  return params;
30 }

Referenced by validParams< PolycrystalVoronoiVoidIC >(), and validParams< PolycrystalVoronoiVoidICAction >().

◆ computeCircleCenters()

void PolycrystalVoronoiVoidIC::computeCircleCenters ( )
overrideprotectedvirtual

Reimplemented from MultiSmoothCircleIC.

Definition at line 94 of file PolycrystalVoronoiVoidIC.C.

95 {
96  _centers.resize(_numbub);
97 
98  // This Code will place void center points on grain boundaries
99  for (unsigned int vp = 0; vp < _numbub; ++vp)
100  {
101  bool try_again;
102  unsigned int num_tries = 0;
103 
104  do
105  {
106  try_again = false;
107  num_tries++;
108 
109  if (num_tries > _max_num_tries)
110  mooseError("Too many tries of assigning void centers in "
111  "PolycrystalVoronoiVoidIC");
112 
113  Point rand_point;
114 
115  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
116  rand_point(i) = _bottom_left(i) + _range(i) * _random.rand(_tid);
117 
118  // Allow the vectors to be sorted based on their distance from the
119  // rand_point
120  std::vector<PolycrystalVoronoiVoidIC::DistancePoint> diff(_grain_num);
121 
122  for (unsigned int gr = 0; gr < _grain_num; ++gr)
123  {
124  diff[gr].d = _mesh.minPeriodicDistance(_var.number(), rand_point, _centerpoints[gr]);
125  diff[gr].gr = gr;
126  }
127 
128  std::sort(diff.begin(), diff.end(), _customLess);
129 
130  Point closest_point = _centerpoints[diff[0].gr];
131  Point next_closest_point = _centerpoints[diff[1].gr];
132 
133  // Find Slope of Line in the plane orthogonal to the diff_centerpoint
134  // vector
135  Point diff_centerpoints =
136  _mesh.minPeriodicVector(_var.number(), closest_point, next_closest_point);
137  Point diff_rand_center = _mesh.minPeriodicVector(_var.number(), closest_point, rand_point);
138  Point normal_vector = diff_centerpoints.cross(diff_rand_center);
139  Point slope = normal_vector.cross(diff_centerpoints);
140 
141  // Midpoint position vector between two center points
142  Point midpoint = closest_point + (0.5 * diff_centerpoints);
143 
144  // Solve for the scalar multiplier solution on the line
145  Real lambda = 0;
146  Point mid_rand_vector = _mesh.minPeriodicVector(_var.number(), midpoint, rand_point);
147 
148  Real slope_dot = slope * slope;
149  mooseAssert(slope_dot > 0, "The dot product of slope with itself is zero");
150  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
151  lambda += (mid_rand_vector(i) * slope(i)) / slope_dot;
152 
153  // Assigning points to vector
154  _centers[vp] = slope * lambda + midpoint;
155 
156  // Checking to see if points are in the domain ONLY WORKS FOR PERIODIC
157  for (unsigned int i = 0; i < LIBMESH_DIM; i++)
158  if ((_centers[vp](i) > _top_right(i)) || (_centers[vp](i) < _bottom_left(i)))
159  try_again = true;
160 
161  for (unsigned int i = 0; i < vp; ++i)
162  {
163  Real dist = _mesh.minPeriodicDistance(_var.number(), _centers[vp], _centers[i]);
164 
165  if (dist < _bubspac)
166  try_again = true;
167  }
168 
169  // Two algorithms are available for screening bubbles falling in grain
170  // interior. They produce
171  // nearly identical results.
172  // Here only one is listed. The other one is available upon request.
173 
174  // Use circle center for checking whether voids are at GBs
175  if (try_again == false)
176  {
177  Real min_rij_1, min_rij_2, rij, rij_diff_tol;
178 
179  min_rij_1 = _range.norm();
180  min_rij_2 = _range.norm();
181 
182  rij_diff_tol = 0.1 * _radius;
183 
184  for (unsigned int gr = 0; gr < _grain_num; ++gr)
185  {
186  rij = _mesh.minPeriodicDistance(_var.number(), _centers[vp], _centerpoints[gr]);
187 
188  if (rij < min_rij_1)
189  {
190  min_rij_2 = min_rij_1;
191  min_rij_1 = rij;
192  }
193  else if (rij < min_rij_2)
194  min_rij_2 = rij;
195  }
196 
197  if (std::abs(min_rij_1 - min_rij_2) > rij_diff_tol)
198  try_again = true;
199  }
200 
201  } while (try_again == true);
202  }
203 }

◆ computeCircleGradient()

RealGradient SmoothCircleBaseIC::computeCircleGradient ( const Point &  p,
const Point &  center,
const Real &  radius 
)
protectedvirtualinherited

Definition at line 149 of file SmoothCircleBaseIC.C.

152 {
153  Point l_center = center;
154  Point l_p = p;
155  if (!_3D_spheres) // Create 3D cylinders instead of spheres
156  {
157  l_p(2) = 0.0;
158  l_center(2) = 0.0;
159  }
160  // Compute the distance between the current point and the center
161  Real dist = _mesh.minPeriodicDistance(_var.number(), l_p, l_center);
162 
163  // early return if we are probing the center of the circle
164  if (dist == 0.0)
165  return 0.0;
166 
167  Real DvalueDr = 0.0;
168  switch (_profile)
169  {
170  case ProfileType::COS:
171  if (dist < radius + _int_width / 2.0 && dist > radius - _int_width / 2.0)
172  {
173  const Real int_pos = (dist - radius + _int_width / 2.0) / _int_width;
174  const Real Dint_posDr = 1.0 / _int_width;
175  DvalueDr = Dint_posDr * (_invalue - _outvalue) *
176  (-std::sin(int_pos * libMesh::pi) * libMesh::pi) / 2.0;
177  }
178  break;
179 
180  case ProfileType::TANH:
181  DvalueDr = -(_invalue - _outvalue) * 0.5 / _int_width * libMesh::pi *
182  (1.0 - Utility::pow<2>(std::tanh(4.0 * (radius - dist) / _int_width)));
183  break;
184 
185  default:
186  mooseError("Internal error.");
187  }
188 
189  return _mesh.minPeriodicVector(_var.number(), center, p) * (DvalueDr / dist);
190 }

Referenced by SmoothCircleBaseIC::gradient().

◆ computeCircleRadii()

void MultiSmoothCircleIC::computeCircleRadii ( )
overrideprotectedvirtualinherited

Implements SmoothCircleBaseIC.

Definition at line 72 of file MultiSmoothCircleIC.C.

73 {
74  _radii.resize(_numbub);
75 
76  for (unsigned int i = 0; i < _numbub; i++)
77  {
78  // Vary bubble radius
79  switch (_radius_variation_type)
80  {
81  case 0: // Uniform distribution
82  _radii[i] = _radius * (1.0 + (1.0 - 2.0 * _random.rand(_tid)) * _radius_variation);
83  break;
84  case 1: // Normal distribution
85  _radii[i] = _random.randNormal(_tid, _radius, _radius_variation);
86  break;
87  case 2: // No variation
88  _radii[i] = _radius;
89  }
90 
91  _radii[i] = std::max(_radii[i], 0.0);
92  }
93 }

◆ computeCircleValue()

Real SmoothCircleBaseIC::computeCircleValue ( const Point &  p,
const Point &  center,
const Real &  radius 
)
protectedvirtualinherited

Reimplemented in RndSmoothCircleIC.

Definition at line 110 of file SmoothCircleBaseIC.C.

111 {
112  Point l_center = center;
113  Point l_p = p;
114  if (!_3D_spheres) // Create 3D cylinders instead of spheres
115  {
116  l_p(2) = 0.0;
117  l_center(2) = 0.0;
118  }
119  // Compute the distance between the current point and the center
120  Real dist = _mesh.minPeriodicDistance(_var.number(), l_p, l_center);
121 
122  switch (_profile)
123  {
124  case ProfileType::COS:
125  {
126  // Return value
127  Real value = _outvalue; // Outside circle
128 
129  if (dist <= radius - _int_width / 2.0) // Inside circle
130  value = _invalue;
131  else if (dist < radius + _int_width / 2.0) // Smooth interface
132  {
133  Real int_pos = (dist - radius + _int_width / 2.0) / _int_width;
134  value = _outvalue + (_invalue - _outvalue) * (1.0 + std::cos(int_pos * libMesh::pi)) / 2.0;
135  }
136  return value;
137  }
138 
139  case ProfileType::TANH:
140  return (_invalue - _outvalue) * 0.5 * (std::tanh(2.0 * (radius - dist) / _int_width) + 1.0) +
141  _outvalue;
142 
143  default:
144  mooseError("Internal error.");
145  }
146 }

Referenced by SmoothCircleBaseIC::gradient(), and SmoothCircleBaseIC::value().

◆ gradient()

RealGradient PolycrystalVoronoiVoidIC::gradient ( const Point &  p)
overrideprotectedvirtual

Reimplemented from SmoothCircleBaseIC.

Definition at line 239 of file PolycrystalVoronoiVoidIC.C.

240 {
242  RealGradient void_gradient = MultiSmoothCircleIC::gradient(p);
243 
244  // Order parameter assignment assumes zero gradient (sharp interface)
245  switch (_structure_type)
246  {
247  case 1: // assigning gradient for voids
248  gradient = void_gradient;
249  break;
250  }
251 
252  return gradient;
253 }

◆ initialSetup()

void PolycrystalVoronoiVoidIC::initialSetup ( )
overridevirtual

Reimplemented from MultiSmoothCircleIC.

Definition at line 79 of file PolycrystalVoronoiVoidIC.C.

80 {
81  if (_op_num <= _op_index)
82  mooseError("op_index is too large in CircleGrainVoidIC");
83 
84  // Obtain total number and centerpoints of the grains
87 
88  // Call initial setup from MultiSmoothCircleIC to create _centers and _radii
89  // for voids
91 }

◆ value()

Real PolycrystalVoronoiVoidIC::value ( const Point &  p)
overrideprotectedvirtual

Reimplemented from SmoothCircleBaseIC.

Definition at line 206 of file PolycrystalVoronoiVoidIC.C.

207 {
208  Real value = 0.0;
209 
210  // Determine value for voids
211  Real void_value = MultiSmoothCircleIC::value(p);
212 
213  // Determine value for grains
214  Real grain_value = _poly_ic_uo.getVariableValue(_op_index, p);
215 
216  switch (_structure_type)
217  {
218  case 0: // assigning values for grains (order parameters)
219  if (grain_value == 0) // Not in this grain
220  value = grain_value;
221  else // in this grain, but might be in a void
222  if (void_value == _outvalue) // Not in a void
223  value = grain_value;
224  else if (void_value > _outvalue && void_value < _invalue) // On void interface
225  value = grain_value * (_invalue - void_value) / (_invalue - _outvalue);
226  else if (void_value == _invalue) // In a void, so op = 0
227  value = 0.0;
228  break;
229 
230  case 1: // assigning values for voids (concentration)
231  value = void_value;
232  break;
233  }
234 
235  return value;
236 }

Member Data Documentation

◆ _3D_spheres

bool SmoothCircleBaseIC::_3D_spheres
protectedinherited

◆ _bottom_left

Point MultiSmoothCircleIC::_bottom_left
protectedinherited

◆ _bubspac

const Real MultiSmoothCircleIC::_bubspac
protectedinherited

◆ _centerpoints

std::vector<Point> PolycrystalVoronoiVoidIC::_centerpoints
protected

Definition at line 55 of file PolycrystalVoronoiVoidIC.h.

Referenced by computeCircleCenters(), and initialSetup().

◆ _centers

std::vector<Point> SmoothCircleBaseIC::_centers
protectedinherited

◆ _columnar_3D

const bool PolycrystalVoronoiVoidIC::_columnar_3D
protected

Definition at line 43 of file PolycrystalVoronoiVoidIC.h.

◆ _customLess

struct PolycrystalVoronoiVoidIC::DistancePointComparator PolycrystalVoronoiVoidIC::_customLess
protected

Referenced by computeCircleCenters().

◆ _file_name

const FileName PolycrystalVoronoiVoidIC::_file_name
protected

Definition at line 47 of file PolycrystalVoronoiVoidIC.h.

◆ _grain_num

unsigned int PolycrystalVoronoiVoidIC::_grain_num
protected

Definition at line 54 of file PolycrystalVoronoiVoidIC.h.

Referenced by computeCircleCenters(), and initialSetup().

◆ _int_width

Real SmoothCircleBaseIC::_int_width
protectedinherited

◆ _invalue

Real SmoothCircleBaseIC::_invalue
protectedinherited

◆ _max_num_tries

const unsigned int MultiSmoothCircleIC::_max_num_tries
protectedinherited

◆ _mesh

MooseMesh& SmoothCircleBaseIC::_mesh
protectedinherited

◆ _num_dim

unsigned int SmoothCircleBaseIC::_num_dim
protectedinherited

Definition at line 52 of file SmoothCircleBaseIC.h.

◆ _numbub

const unsigned int MultiSmoothCircleIC::_numbub
protectedinherited

◆ _op_index

const unsigned int PolycrystalVoronoiVoidIC::_op_index
protected

Definition at line 41 of file PolycrystalVoronoiVoidIC.h.

Referenced by initialSetup(), and value().

◆ _op_num

const unsigned int PolycrystalVoronoiVoidIC::_op_num
protected

Definition at line 40 of file PolycrystalVoronoiVoidIC.h.

Referenced by initialSetup().

◆ _outvalue

Real SmoothCircleBaseIC::_outvalue
protectedinherited

◆ _poly_ic_uo

const PolycrystalVoronoi& PolycrystalVoronoiVoidIC::_poly_ic_uo
protected

Definition at line 45 of file PolycrystalVoronoiVoidIC.h.

Referenced by initialSetup(), and value().

◆ _profile

enum SmoothCircleBaseIC::ProfileType SmoothCircleBaseIC::_profile
protectedinherited

◆ _radii

std::vector<Real> SmoothCircleBaseIC::_radii
protectedinherited

◆ _radius

const Real MultiSmoothCircleIC::_radius
protectedinherited

◆ _radius_variation

const Real MultiSmoothCircleIC::_radius_variation
protectedinherited

◆ _radius_variation_type

const MooseEnum MultiSmoothCircleIC::_radius_variation_type
protectedinherited

◆ _random

MooseRandom SmoothCircleBaseIC::_random
protectedinherited

◆ _range

Point MultiSmoothCircleIC::_range
protectedinherited

◆ _structure_type

const MooseEnum PolycrystalVoronoiVoidIC::_structure_type
protected

Definition at line 38 of file PolycrystalVoronoiVoidIC.h.

Referenced by gradient(), and value().

◆ _top_right

Point MultiSmoothCircleIC::_top_right
protectedinherited

◆ _zero_gradient

bool SmoothCircleBaseIC::_zero_gradient
protectedinherited

Definition at line 50 of file SmoothCircleBaseIC.h.

Referenced by SmoothCircleBaseIC::gradient().


The documentation for this class was generated from the following files:
SmoothCircleBaseIC::_random
MooseRandom _random
Definition: SmoothCircleBaseIC.h:63
SmoothCircleBaseIC::_centers
std::vector< Point > _centers
Definition: SmoothCircleBaseIC.h:54
PolycrystalVoronoi::getNumGrains
virtual unsigned int getNumGrains() const override
Must be overridden by the deriving class to provide the number of grains in the polycrystal structure...
Definition: PolycrystalVoronoi.h:30
SmoothCircleBaseIC::ProfileType::COS
SmoothCircleBaseIC::value
virtual Real value(const Point &p)
Definition: SmoothCircleBaseIC.C:71
PolycrystalVoronoi::getVariableValue
virtual Real getVariableValue(unsigned int op_index, const Point &p) const override
Returns the variable value for a given op_index and mesh point.
Definition: PolycrystalVoronoi.C:94
PolycrystalVoronoiVoidIC::gradient
virtual RealGradient gradient(const Point &p) override
Definition: PolycrystalVoronoiVoidIC.C:239
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
MultiSmoothCircleIC::_max_num_tries
const unsigned int _max_num_tries
Definition: MultiSmoothCircleIC.h:41
MultiSmoothCircleIC::_bottom_left
Point _bottom_left
Definition: MultiSmoothCircleIC.h:47
PolycrystalVoronoiVoidIC::value
virtual Real value(const Point &p) override
Definition: PolycrystalVoronoiVoidIC.C:206
SmoothCircleBaseIC::_profile
enum SmoothCircleBaseIC::ProfileType _profile
PolycrystalVoronoiVoidIC::_op_num
const unsigned int _op_num
Definition: PolycrystalVoronoiVoidIC.h:40
MultiSmoothCircleIC::_radius_variation_type
const MooseEnum _radius_variation_type
Definition: MultiSmoothCircleIC.h:45
SmoothCircleBaseIC::_radii
std::vector< Real > _radii
Definition: SmoothCircleBaseIC.h:55
MultiSmoothCircleIC::MultiSmoothCircleIC
MultiSmoothCircleIC(const InputParameters &parameters)
Definition: MultiSmoothCircleIC.C:41
SmoothCircleBaseIC::ProfileType::TANH
PolycrystalVoronoiVoidIC::_centerpoints
std::vector< Point > _centerpoints
Definition: PolycrystalVoronoiVoidIC.h:55
SmoothCircleBaseIC::_invalue
Real _invalue
Definition: SmoothCircleBaseIC.h:46
PolycrystalVoronoiVoidIC::_poly_ic_uo
const PolycrystalVoronoi & _poly_ic_uo
Definition: PolycrystalVoronoiVoidIC.h:45
MultiSmoothCircleIC::_top_right
Point _top_right
Definition: MultiSmoothCircleIC.h:48
PolycrystalVoronoiVoidIC::_op_index
const unsigned int _op_index
Definition: PolycrystalVoronoiVoidIC.h:41
SmoothCircleBaseIC::_mesh
MooseMesh & _mesh
Definition: SmoothCircleBaseIC.h:44
SmoothCircleBaseIC::_outvalue
Real _outvalue
Definition: SmoothCircleBaseIC.h:47
PolycrystalVoronoiVoidIC::_structure_type
const MooseEnum _structure_type
Definition: PolycrystalVoronoiVoidIC.h:38
MultiSmoothCircleIC::_numbub
const unsigned int _numbub
Definition: MultiSmoothCircleIC.h:38
validParams< MultiSmoothCircleIC >
InputParameters validParams< MultiSmoothCircleIC >()
Definition: MultiSmoothCircleIC.C:20
PolycrystalVoronoiVoidIC::_customLess
struct PolycrystalVoronoiVoidIC::DistancePointComparator _customLess
SmoothCircleBaseIC::_int_width
Real _int_width
Definition: SmoothCircleBaseIC.h:48
PolycrystalVoronoiVoidIC::_file_name
const FileName _file_name
Definition: PolycrystalVoronoiVoidIC.h:47
SmoothCircleBaseIC::gradient
virtual RealGradient gradient(const Point &p)
Definition: SmoothCircleBaseIC.C:87
PolycrystalVoronoi::getGrainCenters
virtual std::vector< Point > getGrainCenters() const
Definition: PolycrystalVoronoi.h:31
SmoothCircleBaseIC::_3D_spheres
bool _3D_spheres
Definition: SmoothCircleBaseIC.h:49
MultiSmoothCircleIC::_radius
const Real _radius
Definition: MultiSmoothCircleIC.h:43
PolycrystalVoronoiVoidIC::_columnar_3D
const bool _columnar_3D
Definition: PolycrystalVoronoiVoidIC.h:43
MultiSmoothCircleIC::_range
Point _range
Definition: MultiSmoothCircleIC.h:49
MultiSmoothCircleIC::_radius_variation
const Real _radius_variation
Definition: MultiSmoothCircleIC.h:44
PolycrystalVoronoiVoidIC::_grain_num
unsigned int _grain_num
Definition: PolycrystalVoronoiVoidIC.h:54
MultiSmoothCircleIC::_bubspac
const Real _bubspac
Definition: MultiSmoothCircleIC.h:39
MultiSmoothCircleIC::initialSetup
virtual void initialSetup() override
Definition: MultiSmoothCircleIC.C:53