https://mooseframework.inl.gov
ACBarrierFunction.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 "ACBarrierFunction.h"
11 #include "libmesh/utility.h"
12 
13 registerMooseObject("PhaseFieldApp", ACBarrierFunction);
15 
16 template <bool is_ad>
19 {
21  params.addRequiredParam<MaterialPropertyName>(
22  "gamma", "The interface profile coefficient to use with the kernel");
23  params.addClassDescription("Allen-Cahn kernel used when 'mu' is a function of variables");
24  return params;
25 }
26 
27 template <bool is_ad>
29  : ACBarrierFunctionBase<is_ad>(parameters),
30  _uname(this->template getParam<NonlinearVariableName>("variable")),
31  _gamma_name(this->template getParam<MaterialPropertyName>("gamma")),
32  _gamma(this->template getGenericMaterialProperty<Real, is_ad>(_gamma_name)),
33  _dmudvar(this->template getGenericMaterialProperty<Real, is_ad>(
34  this->derivativePropertyNameFirst("mu", _uname)))
35 {
36 }
37 
39  : ACBarrierFunctionTempl<false>(parameters),
40  _n_eta(_vals.size()),
41  _d2mudvar2(getMaterialPropertyDerivative<Real>("mu", _uname, _uname)),
42  _vname(getParam<std::vector<VariableName>>("v")),
43  _d2mudvardeta(_n_eta),
44  _vmap(getParameterJvarMap("v"))
45 {
46  for (unsigned int i = 0; i < _n_eta; ++i)
47  _d2mudvardeta[i] = &getMaterialPropertyDerivative<Real>("mu", _uname, _vname[i]);
48 }
49 
50 Real
51 ACBarrierFunction::computeDFDOP(PFFunctionType type)
52 {
53  switch (type)
54  {
55  case Residual:
56  return _dmudvar[_qp] * calculateF0();
57 
58  case Jacobian:
59  {
60  Real df0dvar = 0.0;
61  for (unsigned int i = 0; i < _n_eta; ++i)
62  df0dvar += (*_vals[i])[_qp] * (*_vals[i])[_qp];
63 
64  df0dvar *= 2.0 * _gamma[_qp] * _u[_qp];
65  df0dvar += _u[_qp] * _u[_qp] * _u[_qp] - _u[_qp];
66 
67  return (_d2mudvar2[_qp] * calculateF0() + _dmudvar[_qp] * df0dvar) * _phi[_j][_qp];
68  }
69 
70  default:
71  mooseError("Invalid type passed in");
72  }
73 }
74 
75 ADReal
77 {
78  ADReal f0 = 0.25 + 0.25 * _u[_qp] * _u[_qp] * _u[_qp] * _u[_qp] - 0.5 * _u[_qp] * _u[_qp];
79  ADReal sum_etaj = _u[_qp] * _u[_qp];
80 
81  for (unsigned int i = 0; i < _op_num; ++i)
82  {
83  for (unsigned int j = i + 1; j < _op_num; ++j)
84  sum_etaj += (*_vals[j])[_qp] * (*_vals[j])[_qp];
85 
86  f0 += 0.25 * Utility::pow<4>((*_vals[i])[_qp]) - 0.5 * Utility::pow<2>((*_vals[i])[_qp]);
87  f0 += sum_etaj * Utility::pow<2>((*_vals[i])[_qp]) * _gamma[_qp];
88  }
89  return _dmudvar[_qp] * f0;
90 }
91 
92 Real
94 {
95  const unsigned int j = mapJvarToCvar(jvar);
96  Real sum_etai2 = 0.0;
97  Real df0deta_base = 0.0;
98  Real df0deta = 0.0;
99 
100  for (unsigned int i = 0; i < _n_eta; ++i)
101  if (i != j)
102  sum_etai2 += (*_vals[i])[_qp] * (*_vals[i])[_qp];
103 
104  auto etavar = mapJvarToCvar(jvar, _vmap);
105  if (etavar >= 0)
106  {
107  df0deta_base = (*_vals[etavar])[_qp] * (*_vals[etavar])[_qp] - 1.0 +
108  2.0 * _gamma[_qp] * (_u[_qp] * _u[_qp] + sum_etai2);
109  df0deta = (*_vals[etavar])[_qp] * df0deta_base;
110 
111  return ((*_d2mudvardeta[etavar])[_qp] * calculateF0() + _dmudvar[_qp] * df0deta) *
112  _phi[_j][_qp] * _test[_i][_qp] * _L[_qp];
113  }
114  return 0.0;
115 }
116 
117 Real
119 {
120  Real var_phase = 0.25 * _u[_qp] * _u[_qp] * _u[_qp] * _u[_qp] - 0.5 * _u[_qp] * _u[_qp];
121  Real eta_phase = 0.0;
122  Real eta_interface = 0.0;
123  Real sum_eta_j2;
124 
125  for (unsigned int i = 0; i < _n_eta; ++i)
126  {
127  sum_eta_j2 = 0.0;
128  for (unsigned int j = i + 1; j < _n_eta; ++j)
129  sum_eta_j2 += (*_vals[j])[_qp] * (*_vals[j])[_qp];
130  // eta_phase += 0.25 * (*_vals[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp]
131  // -
132  // 0.5 * (*_vals[i])[_qp] * (*_vals[i])[_qp];
133  eta_phase += 0.25 * Utility::pow<4>((*_vals[i])[_qp]) - 0.5 * Utility::pow<2>((*_vals[i])[_qp]);
134  eta_interface +=
135  (_u[_qp] * _u[_qp] + sum_eta_j2) * (*_vals[i])[_qp] * (*_vals[i])[_qp] * _gamma[_qp];
136  }
137  return 0.25 + var_phase + eta_phase + eta_interface;
138 }
139 
140 template class ACBarrierFunctionTempl<false>;
141 template class ACBarrierFunctionTempl<true>;
ACBarrierFunctionTempl(const InputParameters &parameters)
const std::vector< VariableName > _vname
registerMooseObject("PhaseFieldApp", ACBarrierFunction)
void mooseError(Args &&... args)
const NonlinearVariableName _uname
virtual ADReal computeDFDOP()
typename std::conditional< is_ad, ADGrainGrowthBase, ACGrGrBase >::type ACBarrierFunctionBase
Several kernels use a material property called mu.
DualNumber< Real, DNDerivativeType, true > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
static InputParameters validParams()
virtual Real computeDFDOP(PFFunctionType type)
ACBarrierFunction(const InputParameters &parameters)
InputParameters validParams()
const GenericMaterialProperty< Real, is_ad > & _gamma
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
const JvarMap & _vmap
std::vector< const MaterialProperty< Real > * > _d2mudvardeta
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const MaterialProperty< Real > & _d2mudvar2
const GenericMaterialProperty< Real, is_ad > & _dmudvar