https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15
16template <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
27template <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
50Real
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
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
92Real
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
117Real
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
140template class ACBarrierFunctionTempl<false>;
141template class ACBarrierFunctionTempl<true>;
registerMooseObject("PhaseFieldApp", ACBarrierFunction)
typename std::conditional< is_ad, ADGrainGrowthBase, ACGrGrBase >::type ACBarrierFunctionBase
Several kernels use a material property called mu.
DualNumber< Real, DNDerivativeType, true > ADReal
void mooseError(Args &&... args)
const GenericMaterialProperty< Real, is_ad > & _dmudvar
static InputParameters validParams()
const NonlinearVariableName _uname
ACBarrierFunctionTempl(const InputParameters &parameters)
const GenericMaterialProperty< Real, is_ad > & _gamma
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
const MaterialProperty< Real > & _d2mudvar2
const JvarMap & _vmap
ACBarrierFunction(const InputParameters &parameters)
std::vector< const MaterialProperty< Real > * > _d2mudvardeta
const std::vector< VariableName > _vname
virtual Real computeDFDOP(PFFunctionType type)
virtual ADReal computeDFDOP()
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)