www.mooseframework.org
DiscreteNucleation.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 "DiscreteNucleation.h"
11 #include "DiscreteNucleationMap.h"
12 
13 #include "libmesh/quadrature.h"
14 
15 registerMooseObject("PhaseFieldApp", DiscreteNucleation);
16 
17 template <>
18 InputParameters
20 {
21  InputParameters params = validParams<DerivativeFunctionMaterialBase>();
22  params.addClassDescription("Free energy contribution for nucleating discrete particles");
23  params.addRequiredCoupledVar("op_names",
24  "List of variables to force to a target concentration value");
25  params.addRequiredParam<UserObjectName>("map", "DiscreteNucleationMap user object");
26  params.addRequiredParam<std::vector<Real>>("op_values", "List of target concentration values");
27  params.addParam<Real>("penalty", 20.0, "Penalty factor for enforcing the target concentrations");
28  MooseEnum penalty_mode("MATCH MIN MAX", "MATCH");
29  params.addParam<MooseEnum>(
30  "penalty_mode",
31  penalty_mode,
32  "Match the target concentration or take it as a minimum or maximum concentration target");
33  return params;
34 }
35 
36 DiscreteNucleation::DiscreteNucleation(const InputParameters & params)
37  : DerivativeFunctionMaterialBase(params),
38  _nvar(coupledComponents("op_names")),
39  _op_index(_nvar),
40  _op_values(getParam<std::vector<Real>>("op_values")),
41  _penalty(getParam<Real>("penalty")),
42  _penalty_mode(getParam<MooseEnum>("penalty_mode")),
43  _map(getUserObject<DiscreteNucleationMap>("map"))
44 {
45  // check inputs
46  if (_nvar != _op_values.size())
47  mooseError("The op_names and op_values parameter vectors must have the same number of entries");
48  if (_nvar != _args.size())
49  mooseError("Internal error.");
50 
51  // get libMesh variable numbers
52  for (unsigned int i = 0; i < _nvar; ++i)
53  _op_index[i] = argIndex(coupled("op_names", i));
54 }
55 
56 void
58 {
59  // check if a nucleation event list is available for the current element
60  const std::vector<Real> & nucleus = _map.nuclei(_current_elem);
61 
62  // calculate penalty
63  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
64  {
65  // clear penalty value
66  if (_prop_F)
67  (*_prop_F)[_qp] = 0.0;
68 
69  for (unsigned int i = 0; i < _nvar; ++i)
70  {
71  const unsigned ii = _op_index[i];
72 
73  // modify the penalty magnitude with the nucleus mask
74  const Real penalty = _penalty * nucleus[_qp];
75 
76  // deviation from the target concentration
77  Real dc = (*_args[ii])[_qp] - _op_values[i];
78 
79  // ignore above/below target values for min/max modes respectively
80  if ((_penalty_mode == 1 && dc > 0.0) || (_penalty_mode == 2 && dc < 0.0))
81  dc = 0.0;
82 
83  // build free energy correction
84  if (_prop_F)
85  (*_prop_F)[_qp] += dc * dc * penalty;
86 
87  // first derivative
88  if (_prop_dF[ii])
89  (*_prop_dF[ii])[_qp] = 2.0 * dc * penalty;
90 
91  // second derivatives
92  for (unsigned int jj = ii; jj < _nvar; ++jj)
93  {
94  if (_prop_d2F[ii][jj])
95  (*_prop_d2F[ii][jj])[_qp] = 2.0 * penalty;
96 
97  // third derivatives
98  if (_third_derivatives)
99  for (unsigned int kk = jj; kk < _nvar; ++kk)
100  if (_prop_d3F[ii][jj][kk])
101  (*_prop_d3F[ii][jj][kk])[_qp] = 0.0;
102  }
103  }
104  }
105 }
DiscreteNucleation.h
registerMooseObject
registerMooseObject("PhaseFieldApp", DiscreteNucleation)
DiscreteNucleation::computeProperties
virtual void computeProperties()
Definition: DiscreteNucleation.C:57
DiscreteNucleation::DiscreteNucleation
DiscreteNucleation(const InputParameters &params)
Definition: DiscreteNucleation.C:36
DiscreteNucleationMap
This UserObject maintains a per QP map that indicates if a nucleus is present or not.
Definition: DiscreteNucleationMap.h:25
DiscreteNucleation::_op_index
std::vector< unsigned int > _op_index
map op_names indices to _args indices
Definition: DiscreteNucleation.h:35
DiscreteNucleation::_penalty
const Real _penalty
Nucleation free energy prefactor.
Definition: DiscreteNucleation.h:41
DiscreteNucleation::_map
const DiscreteNucleationMap & _map
UserObject providing a map of currently active nuclei.
Definition: DiscreteNucleation.h:47
DiscreteNucleationMap.h
DiscreteNucleation::_op_values
const std::vector< Real > _op_values
Target concentration values.
Definition: DiscreteNucleation.h:38
DiscreteNucleation::_nvar
unsigned int _nvar
Definition: DiscreteNucleation.h:32
validParams< DiscreteNucleation >
InputParameters validParams< DiscreteNucleation >()
Definition: DiscreteNucleation.C:19
DiscreteNucleationMap::nuclei
const std::vector< Real > & nuclei(const Elem *) const
Definition: DiscreteNucleationMap.C:128
DiscreteNucleation
Free energy penalty contribution to force the nucleation of subresolution particles.
Definition: DiscreteNucleation.h:24
DiscreteNucleation::_penalty_mode
const unsigned int _penalty_mode
Match concentration exactly or use the target as a minumum or maximum value.
Definition: DiscreteNucleation.h:44