www.mooseframework.org
ACGrGrMulti.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 "ACGrGrMulti.h"
11 
12 registerMooseObject("PhaseFieldApp", ACGrGrMulti);
13 registerMooseObject("PhaseFieldApp", ADACGrGrMulti);
14 
15 template <bool is_ad>
18 {
20  params.addClassDescription("Multi-phase poly-crystalline Allen-Cahn Kernel");
21  params.addRequiredParam<std::vector<MaterialPropertyName>>(
22  "gamma_names",
23  "List of gamma material property names for each other order parameter. Place "
24  "in same order as order parameters (v)!");
25  return params;
26 }
27 
28 template <bool is_ad>
30  : ACGrGrMultiBase<is_ad>(parameters),
31  _gamma_names(this->template getParam<std::vector<MaterialPropertyName>>("gamma_names")),
32  _num_j(_gamma_names.size()),
33  _prop_gammas(_num_j)
34 {
35  // check passed in parameter vectors
36  if (_num_j != this->coupledComponents("v"))
37  this->paramError(
38  "gamma_names",
39  "Need to pass in as many gamma_names as coupled variables in v in ACGrGrMulti");
40 
41  for (unsigned int n = 0; n < _num_j; ++n)
42  _prop_gammas[n] = &this->template getGenericMaterialProperty<Real, is_ad>(_gamma_names[n]);
43 }
44 
46  : ACGrGrMultiTempl<false>(parameters),
47  _uname(this->template getParam<NonlinearVariableName>("variable")),
48  _dmudu(this->template getMaterialPropertyDerivative<Real>("mu", _uname)),
49  _vname(this->template getParam<std::vector<VariableName>>("v")),
50  _dmudEtaj(_num_j)
51 {
52  for (unsigned int n = 0; n < _num_j; ++n)
53  _dmudEtaj[n] = &this->template getMaterialPropertyDerivative<Real>("mu", _vname[n]);
54 }
55 
56 Real
57 ACGrGrMulti::computeDFDOP(PFFunctionType type)
58 {
59  // Sum all other order parameters
60  Real SumGammaEtaj = 0.0;
61  for (const auto i : make_range(_op_num))
62  SumGammaEtaj += (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp];
63 
64  // Calculate either the residual or Jacobian of the grain growth free energy
65  switch (type)
66  {
67  case Residual:
68  {
69  return _mu[_qp] * computedF0du();
70  }
71 
72  case Jacobian:
73  {
74  Real d2f0du2 = 3.0 * _u[_qp] * _u[_qp] - 1.0 + 2.0 * SumGammaEtaj;
75  return _phi[_j][_qp] * (_mu[_qp] * d2f0du2 + _dmudu[_qp] * computedF0du());
76  }
77 
78  default:
79  mooseError("Invalid type passed in");
80  }
81 }
82 
83 ADReal
85 {
86  // Sum all other order parameters
87  ADReal SumGammaEtaj = 0.0;
88  for (const auto i : make_range(_op_num))
89  SumGammaEtaj += (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp];
90 
91  return _mu[_qp] * computedF0du();
92 }
93 
94 Real
96 {
97  for (unsigned int i = 0; i < _op_num; ++i)
98  if (jvar == _vals_var[i])
99  {
100  // Derivative of SumGammaEtaj
101  const Real dSumGammaEtaj = 2.0 * (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp];
102  const Real dDFDOP = _mu[_qp] * 2.0 * _u[_qp] * dSumGammaEtaj;
103 
104  return _L[_qp] * _test[_i][_qp] * _phi[_j][_qp] *
105  (dDFDOP + (*_dmudEtaj[i])[_qp] * computedF0du());
106  }
107 
108  return 0.0;
109 }
110 
111 template <bool is_ad>
114 {
115  GenericReal<is_ad> SumGammaEtaj = 0.0;
116  for (const auto i : make_range(_op_num))
117  SumGammaEtaj += (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp];
118 
119  return _u[_qp] * _u[_qp] * _u[_qp] - _u[_qp] + 2.0 * _u[_qp] * SumGammaEtaj;
120 }
121 
122 template class ACGrGrMultiTempl<false>;
123 template class ACGrGrMultiTempl<true>;
registerMooseObject("PhaseFieldApp", ACGrGrMulti)
static InputParameters validParams()
Definition: ACGrGrMulti.C:17
const std::vector< VariableName > _vname
Definition: ACGrGrMulti.h:60
virtual Real computeDFDOP(PFFunctionType type) override
Definition: ACGrGrMulti.C:57
void mooseError(Args &&... args)
std::vector< MaterialPropertyName > _gamma_names
Names of gammas for each order parameter.
Definition: ACGrGrMulti.h:34
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: ACGrGrMulti.C:95
unsigned int _num_j
Definition: ACGrGrMulti.h:35
GenericReal< is_ad > computedF0du()
Definition: ACGrGrMulti.C:113
std::vector< const MaterialProperty< Real > * > _dmudEtaj
Definition: ACGrGrMulti.h:61
typename std::conditional< is_ad, ADGrainGrowthBase, ACGrGrBase >::type ACGrGrMultiBase
This kernel calculates the residual for grain growth for a multi-phase, poly-crystal system...
Definition: ACGrGrMulti.h:22
void addRequiredParam(const std::string &name, const std::string &doc_string)
std::vector< const GenericMaterialProperty< Real, is_ad > * > _prop_gammas
Values of gammas for each order parameter.
Definition: ACGrGrMulti.h:38
InputParameters validParams()
ACGrGrMultiTempl(const InputParameters &parameters)
Definition: ACGrGrMulti.C:29
DualReal ADReal
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
ACGrGrMulti(const InputParameters &parameters)
Definition: ACGrGrMulti.C:45
IntRange< T > make_range(T beg, T end)
void addClassDescription(const std::string &doc_string)
typename Moose::GenericType< Real, is_ad > GenericReal
const MaterialProperty< Real > & _dmudu
Definition: ACGrGrMulti.h:59
virtual ADReal computeDFDOP() override
Definition: ACGrGrMulti.C:84