LCOV - code coverage report
Current view: top level - src/ics - LatticeSmoothCircleIC.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 81 91 89.0 %
Date: 2025-09-04 07:55:36 Functions: 5 5 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14