https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MultiSmoothCircleIC.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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
51void
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'
64 mooseError("If radius_variation > 0.0, you must pass in a radius_variation_type in "
65 "MultiSmoothCircleIC");
66
68}
69
70void
72{
73 _radii.resize(_numbub);
74
75 for (unsigned int i = 0; i < _numbub; i++)
76 {
77 // Vary bubble radius
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
94void
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}
registerMooseObject("PhaseFieldApp", MultiSmoothCircleIC)
void ErrorVector unsigned int
MooseVariableField< T > & _var
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
Real minPeriodicDistance(const unsigned int sys_num, const unsigned int var_num, const Point &p, const Point &q) const
virtual Real getMaxInDimension(unsigned int component) const
virtual Real getMinInDimension(unsigned int component) const
Real rand(std::size_t i)
Real randNormal(std::size_t i, Real mean, Real sigma)
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
virtual void computeCircleCenters() override
MultiSmoothCircleIC(const InputParameters &parameters)
static InputParameters validParams()
virtual void computeCircleRadii() override
const MooseEnum _radius_variation_type
SmoothcircleBaseIC is the base class for all initial conditions that create circles.
static InputParameters validParams()
std::vector< Real > _radii
std::vector< Point > _centers
virtual void initialSetup()
static constexpr std::size_t dim