www.mooseframework.org
MultiSmoothCircleIC.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 "MultiSmoothCircleIC.h"
11 
12 // MOOSE includes
13 #include "MooseMesh.h"
14 #include "MooseVariable.h"
15 
17 
20 {
22  params.addClassDescription("Random distribution of smooth circles with given minimum spacing");
23  params.addRequiredParam<unsigned int>("numbub", "The number of bubbles to place");
24  params.addRequiredParam<Real>("bubspac",
25  "minimum spacing of bubbles, measured from center to center");
26  params.addParam<unsigned int>("numtries", 1000, "The number of tries");
27  params.addRequiredParam<Real>("radius", "Mean radius value for the circles");
28  params.addParam<Real>("radius_variation",
29  0.0,
30  "Plus or minus fraction of random variation in "
31  "the bubble radius for uniform, standard "
32  "deviation for normal");
33  MooseEnum rand_options("uniform normal none", "none");
34  params.addParam<MooseEnum>("radius_variation_type",
35  rand_options,
36  "Type of distribution that random circle radii will follow");
37  return params;
38 }
39 
41  : SmoothCircleBaseIC(parameters),
42  _numbub(getParam<unsigned int>("numbub")),
43  _bubspac(getParam<Real>("bubspac")),
44  _max_num_tries(getParam<unsigned int>("numtries")),
45  _radius(getParam<Real>("radius")),
46  _radius_variation(getParam<Real>("radius_variation")),
47  _radius_variation_type(getParam<MooseEnum>("radius_variation_type"))
48 {
49 }
50 
51 void
53 {
54  // Set up domain bounds with mesh tools
55  for (const auto i : make_range(Moose::dim))
56  {
59  }
61 
62  // a variation is provided, but the type is set to 'none'
63  if (_radius_variation > 0.0 && _radius_variation_type == 2)
64  mooseError("If radius_variation > 0.0, you must pass in a radius_variation_type in "
65  "MultiSmoothCircleIC");
66 
68 }
69 
70 void
72 {
73  _radii.resize(_numbub);
74 
75  for (unsigned int i = 0; i < _numbub; i++)
76  {
77  // Vary bubble radius
78  switch (_radius_variation_type)
79  {
80  case 0: // Uniform distribution
81  _radii[i] = _radius * (1.0 + (1.0 - 2.0 * _random.rand(_tid)) * _radius_variation);
82  break;
83  case 1: // Normal distribution
85  break;
86  case 2: // No variation
87  _radii[i] = _radius;
88  }
89 
90  _radii[i] = std::max(_radii[i], 0.0);
91  }
92 }
93 
94 void
96 {
97  _centers.resize(_numbub);
98  for (unsigned int i = 0; i < _numbub; ++i)
99  {
100  // Vary circle center positions
101  unsigned int num_tries = 0;
102  while (num_tries < _max_num_tries)
103  {
104  num_tries++;
105 
106  RealTensorValue ran;
107  ran(0, 0) = _random.rand(_tid);
108  ran(1, 1) = _random.rand(_tid);
109  ran(2, 2) = _random.rand(_tid);
110 
111  _centers[i] = _bottom_left + ran * _range;
112 
113  for (unsigned int j = 0; j < i; ++j)
115  goto fail;
116 
117  // accept the position of the new center
118  goto accept;
119 
120  // retry a new position until tries are exhausted
121  fail:
122  continue;
123  }
124 
125  if (num_tries == _max_num_tries)
126  mooseError("Too many tries in MultiSmoothCircleIC");
127 
128  accept:
129  continue;
130  }
131 }
static InputParameters validParams()
virtual Real getMaxInDimension(unsigned int component) const
virtual Real getMinInDimension(unsigned int component) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int number() const
std::vector< Real > _radii
const MooseEnum _radius_variation_type
std::vector< Point > _centers
const unsigned int _max_num_tries
registerMooseObject("PhaseFieldApp", MultiSmoothCircleIC)
static constexpr std::size_t dim
MooseVariableField< T > & _var
void addRequiredParam(const std::string &name, const std::string &doc_string)
Real randNormal(std::size_t i, Real mean, Real sigma)
virtual void computeCircleCenters() override
SmoothcircleBaseIC is the base class for all initial conditions that create circles.
TensorValue< Real > RealTensorValue
virtual void initialSetup()
const unsigned int _numbub
MultiSmoothCircleIC(const InputParameters &parameters)
Real minPeriodicDistance(unsigned int nonlinear_var_num, Point p, Point q) const
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void computeCircleRadii() override
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
virtual void initialSetup() override
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Real rand(std::size_t i)
void ErrorVector unsigned int
MultismoothCircleIC creates multiple SmoothCircles (number = numbub) that are randomly positioned aro...