www.mooseframework.org
DiscreteNucleationMap.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 "DiscreteNucleationMap.h"
11 #include "MooseMesh.h"
12 
13 #include "libmesh/quadrature.h"
14 
16 
17 template <>
18 InputParameters
20 {
21  InputParameters params = validParams<ElementUserObject>();
22  params.addClassDescription("Generates a spatial smoothed map of all nucleation sites with the "
23  "data of the DiscreteNucleationInserter for use by the "
24  "DiscreteNucleation material.");
25  params.addParam<Real>("radius", 0.0, "Radius for the inserted nuclei");
26  params.addParam<Real>("int_width", 0.0, "Nucleus interface width for smooth nuclei");
27  params.addRequiredParam<UserObjectName>("inserter", "DiscreteNucleationInserter user object");
28  params.addCoupledVar("periodic",
29  "Use the periodicity settings of this variable to populate the grain map");
30  // the mapping needs to run at timestep begin, which is after the adaptivity
31  // run of the previous timestep.
32  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN;
33  return params;
34 }
35 
36 DiscreteNucleationMap::DiscreteNucleationMap(const InputParameters & parameters)
37  : ElementUserObject(parameters),
38  _mesh_changed(false),
39  _inserter(getUserObject<DiscreteNucleationInserterBase>("inserter")),
40  _periodic(isCoupled("periodic") ? coupled("periodic") : -1),
41  _radius(getParam<Real>("radius")),
42  _int_width(getParam<Real>("int_width")),
43  _nucleus_list(_inserter.getNucleusList())
44 {
45  _zero_map.assign(_fe_problem.getMaxQps(), 0.0);
46 }
47 
48 void
50 {
52  {
53  _rebuild_map = true;
54  _nucleus_map.clear();
55  }
56  else
57  _rebuild_map = false;
58 
59  _mesh_changed = false;
60 }
61 
62 void
64 {
65  if (_rebuild_map)
66  {
67  // reserve space for each quadrature point in the element
68  _elem_map.assign(_qrule->n_points(), 0);
69 
70  // store a random number for each quadrature point
71  unsigned int active_nuclei = 0;
72  for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
73  {
74  Real r, rmin = std::numeric_limits<Real>::max();
75 
76  // find the distance to the closest nucleus
77  for (unsigned i = 0; i < _nucleus_list.size(); ++i)
78  {
79  // use a non-periodic or periodic distance
80  r = _periodic < 0
81  ? (_q_point[qp] - _nucleus_list[i].second).norm()
82  : _mesh.minPeriodicDistance(_periodic, _q_point[qp], _nucleus_list[i].second);
83  if (r < rmin)
84  rmin = r;
85  }
86 
87  // compute intensity value with smooth interface
88  Real value = 0.0;
89  if (rmin <= _radius - _int_width / 2.0) // Inside circle
90  {
91  active_nuclei++;
92  value = 1.0;
93  }
94  else if (rmin < _radius + _int_width / 2.0) // Smooth interface
95  {
96  Real int_pos = (rmin - _radius + _int_width / 2.0) / _int_width;
97  active_nuclei++;
98  value = (1.0 + std::cos(int_pos * libMesh::pi)) / 2.0;
99  }
100  _elem_map[qp] = value;
101  }
102 
103  // if the map is not empty insert it
104  if (active_nuclei > 0)
105  _nucleus_map.insert(
106  std::pair<dof_id_type, std::vector<Real>>(_current_elem->id(), _elem_map));
107  }
108 }
109 
110 void
112 {
113  // if the map needs to be updated we merge the maps from all threads
114  if (_rebuild_map)
115  {
116  const DiscreteNucleationMap & uo = static_cast<const DiscreteNucleationMap &>(y);
117  _nucleus_map.insert(uo._nucleus_map.begin(), uo._nucleus_map.end());
118  }
119 }
120 
121 void
123 {
124  _mesh_changed = true;
125 }
126 
127 const std::vector<Real> &
128 DiscreteNucleationMap::nuclei(const Elem * elem) const
129 {
130  NucleusMap::const_iterator i = _nucleus_map.find(elem->id());
131 
132  // if no entry in the map was found the element contains no nucleus
133  if (i == _nucleus_map.end())
134  return _zero_map;
135 
136  return i->second;
137 }
DiscreteNucleationMap::_mesh_changed
bool _mesh_changed
Did the mesh change since the last execution of this PP?
Definition: DiscreteNucleationMap.h:45
DiscreteNucleationMap
This UserObject maintains a per QP map that indicates if a nucleus is present or not.
Definition: DiscreteNucleationMap.h:25
DiscreteNucleationMap::_elem_map
std::vector< Real > _elem_map
Buffer for building the per QP map.
Definition: DiscreteNucleationMap.h:51
registerMooseObject
registerMooseObject("PhaseFieldApp", DiscreteNucleationMap)
DiscreteNucleationMap::_nucleus_map
NucleusMap _nucleus_map
Definition: DiscreteNucleationMap.h:73
DiscreteNucleationMap::_zero_map
std::vector< Real > _zero_map
Dummy map for elements without nuclei.
Definition: DiscreteNucleationMap.h:54
DiscreteNucleationInserterBase
This UserObject manages the insertion and expiration of nuclei in the simulation domain it manages a ...
Definition: DiscreteNucleationInserterBase.h:25
DiscreteNucleationMap::initialize
virtual void initialize()
Definition: DiscreteNucleationMap.C:49
DiscreteNucleationMap.h
DiscreteNucleationMap::DiscreteNucleationMap
DiscreteNucleationMap(const InputParameters &parameters)
Definition: DiscreteNucleationMap.C:36
DiscreteNucleationMap::threadJoin
virtual void threadJoin(const UserObject &y)
Definition: DiscreteNucleationMap.C:111
DiscreteNucleationMap::_nucleus_list
const DiscreteNucleationInserterBase::NucleusList & _nucleus_list
list of nuclei maintained bu the inserter object
Definition: DiscreteNucleationMap.h:69
validParams< DiscreteNucleationMap >
InputParameters validParams< DiscreteNucleationMap >()
Definition: DiscreteNucleationMap.C:19
DiscreteNucleationMap::meshChanged
virtual void meshChanged()
Definition: DiscreteNucleationMap.C:122
DiscreteNucleationInserterBase::isMapUpdateRequired
virtual bool isMapUpdateRequired() const
Definition: DiscreteNucleationInserterBase.h:39
DiscreteNucleationMap::_periodic
int _periodic
variable number to use for minPeriodicDistance calls (i.e. use the periodicity of this variable)
Definition: DiscreteNucleationMap.h:60
DiscreteNucleationMap::_int_width
const Real _int_width
Nucleus interface width.
Definition: DiscreteNucleationMap.h:66
DiscreteNucleationMap::nuclei
const std::vector< Real > & nuclei(const Elem *) const
Definition: DiscreteNucleationMap.C:128
DiscreteNucleationMap::_inserter
const DiscreteNucleationInserterBase & _inserter
UserObject that manages nucleus insertin and deletion.
Definition: DiscreteNucleationMap.h:57
DiscreteNucleationMap::_rebuild_map
bool _rebuild_map
Do we need to rebuild the map during this timestep?
Definition: DiscreteNucleationMap.h:48
DiscreteNucleationMap::execute
virtual void execute()
Definition: DiscreteNucleationMap.C:63
DiscreteNucleationMap::_radius
const Real _radius
Nucleus radius.
Definition: DiscreteNucleationMap.h:63