www.mooseframework.org
LatticeSmoothCircleIC.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "LatticeSmoothCircleIC.h"
11 #include "MooseMesh.h"
12 
14 
15 template <>
16 InputParameters
18 {
19  InputParameters params = validParams<SmoothCircleBaseIC>();
20  params.addClassDescription("Perturbed square lattice of smooth circles");
21  params.addDeprecatedParam<Real>("Rnd_variation",
22  "Variation from central lattice position",
23  "use the new parameter name pos_variation");
24  params.addParam<Real>("pos_variation", 0.0, "Variation from central lattice position");
25  params.addRequiredParam<std::vector<unsigned int>>(
26  "circles_per_side", "Vector containing the number of bubbles along each side");
27  params.addParam<unsigned int>("rand_seed", 2000, "random seed");
28  params.addRequiredParam<Real>("radius", "Mean radius value for the circles");
29  params.addParam<Real>(
30  "radius_variation", 0.0, "Plus or minus fraction of random variation in the bubble radius");
31  MooseEnum rand_options("uniform normal none", "none");
32  params.addParam<MooseEnum>("radius_variation_type",
33  rand_options,
34  "Type of distribution that random circle radii will follow");
35  params.addParam<bool>(
36  "avoid_bounds", true, "Don't place any bubbles on the simulation cell boundaries");
37  return params;
38 }
39 
40 LatticeSmoothCircleIC::LatticeSmoothCircleIC(const InputParameters & parameters)
41  : SmoothCircleBaseIC(parameters),
42  _lattice_variation(isParamValid("Rnd_variation") ? getParam<Real>("Rnd_variation")
43  : getParam<Real>("pos_variation")),
44  _circles_per_side(getParam<std::vector<unsigned int>>("circles_per_side")),
45  _radius(getParam<Real>("radius")),
46  _radius_variation(getParam<Real>("radius_variation")),
47  _radius_variation_type(getParam<MooseEnum>("radius_variation_type")),
48  _avoid_bounds(getParam<bool>("avoid_bounds"))
49 {
50 }
51 
52 void
54 {
55  // pad circles per side vector to size 3 (with 0)
56  _circles_per_side.resize(3);
57 
58  // Set up domain bounds with mesh tools
59  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
60  {
61  _bottom_left(i) = _mesh.getMinInDimension(i);
62  _top_right(i) = _mesh.getMaxInDimension(i);
63  }
65 
66  // Error checks
67  if (_range(0) != 0.0 && _range(1) != 0.0 && _circles_per_side[1] == 0)
68  mooseError("If domain is > 1D, circles_per_side must have more than one value");
69 
70  if (_range(2) != 0.0 && _circles_per_side[2] == 0)
71  mooseError("If domain is 3D, circles_per_side must have three values");
72 
73  if (_range(1) == 0.0 && _range(2) == 0.0)
74  {
75  _circles_per_side[1] = 0;
76  _circles_per_side[2] = 0;
77  }
78 
79  // Set _numbub
80  if (_range(2) == 0.0)
81  {
82  _circles_per_side[2] = 0;
84  }
85  else
87 
88  switch (_radius_variation_type)
89  {
90  case 2: // No variation
91  if (_radius_variation > 0.0)
92  mooseError("If radius_variation > 0.0, you must pass in a radius_variation_type in "
93  "LatticeSmoothCircleIC");
94  break;
95  }
97 }
98 
99 void
101 {
102  _radii.resize(_numbub);
103 
104  for (unsigned int i = 0; i < _numbub; i++)
105  {
106  // Vary bubble radius
107  switch (_radius_variation_type)
108  {
109  case 0: // Uniform distrubtion
110  _radii[i] = _radius * (1.0 + (1.0 - 2.0 * _random.rand(_tid)) * _radius_variation);
111  break;
112  case 1: // Normal distribution
113  _radii[i] = _random.randNormal(_tid, _radius, _radius_variation);
114  break;
115  case 2: // No variation
116  _radii[i] = _radius;
117  }
118 
119  if (_radii[i] < 0.0)
120  _radii[i] = 0.0;
121  }
122 }
123 
124 void
126 {
127  _centers.resize(_numbub);
128 
129  Real x_sep = _range(0) / _circles_per_side[0];
130  Real y_sep = _range(1) / _circles_per_side[1];
131 
132  Real z_sep = 0.0;
133  unsigned int z_num = 1.0;
134 
135  if (_range(2) > 0.0)
136  {
137  z_sep = _range(2) / _circles_per_side[2];
138  z_num = _circles_per_side[2];
139  }
140 
141  unsigned int cnt = 0;
142  for (unsigned int i = 0; i < _circles_per_side[0]; ++i)
143  for (unsigned int j = 0; j < _circles_per_side[1]; ++j)
144  for (unsigned int k = 0; k < z_num; ++k)
145  {
146  Real xx = x_sep / 2.0 + i * x_sep;
147  Real yy = y_sep / 2.0 + j * y_sep;
148  Real zz = z_sep / 2.0 + k * z_sep;
149 
150  // Vary circle position
151  xx = xx + (1.0 - 2.0 * _random.rand(_tid)) * _lattice_variation;
152  yy = yy + (1.0 - 2.0 * _random.rand(_tid)) * _lattice_variation;
153 
154  if (_range(2) != 0.0)
155  zz = zz + (1.0 - 2.0 * _random.rand(_tid)) * _lattice_variation;
156 
157  // Verify not out of bounds
158  if (_avoid_bounds && xx < _radii[cnt] + _int_width)
159  xx = _radii[cnt] + _int_width;
160  if (_avoid_bounds && xx > _range(0) - (_radii[cnt] + _int_width))
161  xx = _range(0) - (_radii[cnt] + _int_width);
162  if (_avoid_bounds && yy < _radii[cnt] + _int_width)
163  yy = _radii[cnt] + _int_width;
164  if (_avoid_bounds && yy > _range(1) - (_radii[cnt] + _int_width))
165  yy = _range(1) - (_radii[cnt] + _int_width);
166  if (_range(2) != 0.0)
167  {
168  if (_avoid_bounds && zz < _radii[cnt] + _int_width)
169  zz = _radii[cnt] + _int_width;
170  if (_avoid_bounds && zz > _range(2) - (_radii[cnt] + _int_width))
171  zz = _range(2) - (_radii[cnt] + _int_width);
172  }
173 
174  _centers[cnt](0) = xx;
175  _centers[cnt](1) = yy;
176  _centers[cnt](2) = zz;
177 
178  cnt++;
179  }
180 }
LatticeSmoothCircleIC::_range
Point _range
Definition: LatticeSmoothCircleIC.h:47
SmoothCircleBaseIC::_random
MooseRandom _random
Definition: SmoothCircleBaseIC.h:63
LatticeSmoothCircleIC::_numbub
unsigned int _numbub
Definition: LatticeSmoothCircleIC.h:37
SmoothCircleBaseIC::_centers
std::vector< Point > _centers
Definition: SmoothCircleBaseIC.h:54
validParams< SmoothCircleBaseIC >
InputParameters validParams< SmoothCircleBaseIC >()
Definition: SmoothCircleBaseIC.C:18
LatticeSmoothCircleIC::_radius
Real _radius
Definition: LatticeSmoothCircleIC.h:39
LatticeSmoothCircleIC::_bottom_left
Point _bottom_left
Definition: LatticeSmoothCircleIC.h:45
validParams< LatticeSmoothCircleIC >
InputParameters validParams< LatticeSmoothCircleIC >()
Definition: LatticeSmoothCircleIC.C:17
LatticeSmoothCircleIC::computeCircleCenters
virtual void computeCircleCenters()
Definition: LatticeSmoothCircleIC.C:125
SmoothCircleBaseIC
SmoothcircleBaseIC is the base class for all initial conditions that create circles.
Definition: SmoothCircleBaseIC.h:26
LatticeSmoothCircleIC::_radius_variation_type
MooseEnum _radius_variation_type
Definition: LatticeSmoothCircleIC.h:41
LatticeSmoothCircleIC::computeCircleRadii
virtual void computeCircleRadii()
Definition: LatticeSmoothCircleIC.C:100
LatticeSmoothCircleIC::initialSetup
virtual void initialSetup()
Definition: LatticeSmoothCircleIC.C:53
LatticeSmoothCircleIC::_avoid_bounds
bool _avoid_bounds
Definition: LatticeSmoothCircleIC.h:43
SmoothCircleBaseIC::_radii
std::vector< Real > _radii
Definition: SmoothCircleBaseIC.h:55
LatticeSmoothCircleIC::_lattice_variation
Real _lattice_variation
Definition: LatticeSmoothCircleIC.h:35
LatticeSmoothCircleIC::_circles_per_side
std::vector< unsigned int > _circles_per_side
Definition: LatticeSmoothCircleIC.h:36
SmoothCircleBaseIC::_mesh
MooseMesh & _mesh
Definition: SmoothCircleBaseIC.h:44
SmoothCircleBaseIC::_int_width
Real _int_width
Definition: SmoothCircleBaseIC.h:48
LatticeSmoothCircleIC::_top_right
Point _top_right
Definition: LatticeSmoothCircleIC.h:46
SmoothCircleBaseIC::initialSetup
virtual void initialSetup()
Definition: SmoothCircleBaseIC.C:57
LatticeSmoothCircleIC::_radius_variation
Real _radius_variation
Definition: LatticeSmoothCircleIC.h:40
LatticeSmoothCircleIC::LatticeSmoothCircleIC
LatticeSmoothCircleIC(const InputParameters &parameters)
Definition: LatticeSmoothCircleIC.C:40
LatticeSmoothCircleIC
LatticeSmoothcircleIC creates a lattice of smoothcircles as an initial condition.
Definition: LatticeSmoothCircleIC.h:24
LatticeSmoothCircleIC.h
registerMooseObject
registerMooseObject("PhaseFieldApp", LatticeSmoothCircleIC)