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 
18 template <>
19 InputParameters
21 {
22  InputParameters params = validParams<SmoothCircleBaseIC>();
23  params.addClassDescription("Random distribution of smooth circles with given minimum spacing");
24  params.addRequiredParam<unsigned int>("numbub", "The number of bubbles to place");
25  params.addRequiredParam<Real>("bubspac",
26  "minimum spacing of bubbles, measured from center to center");
27  params.addParam<unsigned int>("numtries", 1000, "The number of tries");
28  params.addRequiredParam<Real>("radius", "Mean radius value for the circles");
29  params.addParam<Real>("radius_variation",
30  0.0,
31  "Plus or minus fraction of random variation in "
32  "the bubble radius for uniform, standard "
33  "deviation for normal");
34  MooseEnum rand_options("uniform normal none", "none");
35  params.addParam<MooseEnum>("radius_variation_type",
36  rand_options,
37  "Type of distribution that random circle radii will follow");
38  return params;
39 }
40 
41 MultiSmoothCircleIC::MultiSmoothCircleIC(const InputParameters & parameters)
42  : SmoothCircleBaseIC(parameters),
43  _numbub(getParam<unsigned int>("numbub")),
44  _bubspac(getParam<Real>("bubspac")),
45  _max_num_tries(getParam<unsigned int>("numtries")),
46  _radius(getParam<Real>("radius")),
47  _radius_variation(getParam<Real>("radius_variation")),
48  _radius_variation_type(getParam<MooseEnum>("radius_variation_type"))
49 {
50 }
51 
52 void
54 {
55  // Set up domain bounds with mesh tools
56  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
57  {
58  _bottom_left(i) = _mesh.getMinInDimension(i);
59  _top_right(i) = _mesh.getMaxInDimension(i);
60  }
62 
63  // a variation is provided, but the type is set to 'none'
64  if (_radius_variation > 0.0 && _radius_variation_type == 2)
65  mooseError("If radius_variation > 0.0, you must pass in a radius_variation_type in "
66  "MultiSmoothCircleIC");
67 
69 }
70 
71 void
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 }
94 
95 void
97 {
98  _centers.resize(_numbub);
99  for (unsigned int i = 0; i < _numbub; ++i)
100  {
101  // Vary circle center positions
102  unsigned int num_tries = 0;
103  while (num_tries < _max_num_tries)
104  {
105  num_tries++;
106 
107  RealTensorValue ran;
108  ran(0, 0) = _random.rand(_tid);
109  ran(1, 1) = _random.rand(_tid);
110  ran(2, 2) = _random.rand(_tid);
111 
112  _centers[i] = _bottom_left + ran * _range;
113 
114  for (unsigned int j = 0; j < i; ++j)
115  if (_mesh.minPeriodicDistance(_var.number(), _centers[j], _centers[i]) < _bubspac)
116  goto fail;
117 
118  // accept the position of the new center
119  goto accept;
120 
121  // retry a new position until tries are exhausted
122  fail:
123  continue;
124  }
125 
126  if (num_tries == _max_num_tries)
127  mooseError("Too many tries in MultiSmoothCircleIC");
128 
129  accept:
130  continue;
131  }
132 }
SmoothCircleBaseIC::_random
MooseRandom _random
Definition: SmoothCircleBaseIC.h:63
SmoothCircleBaseIC::_centers
std::vector< Point > _centers
Definition: SmoothCircleBaseIC.h:54
validParams< SmoothCircleBaseIC >
InputParameters validParams< SmoothCircleBaseIC >()
Definition: SmoothCircleBaseIC.C:18
MultiSmoothCircleIC::computeCircleCenters
virtual void computeCircleCenters() override
Definition: MultiSmoothCircleIC.C:96
SmoothCircleBaseIC
SmoothcircleBaseIC is the base class for all initial conditions that create circles.
Definition: SmoothCircleBaseIC.h:26
MultiSmoothCircleIC::_max_num_tries
const unsigned int _max_num_tries
Definition: MultiSmoothCircleIC.h:41
MultiSmoothCircleIC::_bottom_left
Point _bottom_left
Definition: MultiSmoothCircleIC.h:47
validParams< MultiSmoothCircleIC >
InputParameters validParams< MultiSmoothCircleIC >()
Definition: MultiSmoothCircleIC.C:20
registerMooseObject
registerMooseObject("PhaseFieldApp", MultiSmoothCircleIC)
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
MultiSmoothCircleIC::_top_right
Point _top_right
Definition: MultiSmoothCircleIC.h:48
SmoothCircleBaseIC::_mesh
MooseMesh & _mesh
Definition: SmoothCircleBaseIC.h:44
MultiSmoothCircleIC
MultismoothCircleIC creates multiple SmoothCircles (number = numbub) that are randomly positioned aro...
Definition: MultiSmoothCircleIC.h:27
MultiSmoothCircleIC::_numbub
const unsigned int _numbub
Definition: MultiSmoothCircleIC.h:38
MultiSmoothCircleIC.h
MultiSmoothCircleIC::_radius
const Real _radius
Definition: MultiSmoothCircleIC.h:43
SmoothCircleBaseIC::initialSetup
virtual void initialSetup()
Definition: SmoothCircleBaseIC.C:57
MultiSmoothCircleIC::_range
Point _range
Definition: MultiSmoothCircleIC.h:49
MultiSmoothCircleIC::computeCircleRadii
virtual void computeCircleRadii() override
Definition: MultiSmoothCircleIC.C:72
MultiSmoothCircleIC::_radius_variation
const Real _radius_variation
Definition: MultiSmoothCircleIC.h:44
MultiSmoothCircleIC::_bubspac
const Real _bubspac
Definition: MultiSmoothCircleIC.h:39
MultiSmoothCircleIC::initialSetup
virtual void initialSetup() override
Definition: MultiSmoothCircleIC.C:53