61 params.addClassDescription(
"Cahn-Hilliard Kernel that uses a DerivativeMaterial Free Energy");
62 params.addRequiredParam<MaterialPropertyName>(
63 "f_name",
"Base name of the free energy function F defined in a DerivativeParsedMaterial");
64 params.addCoupledVar(
"displacement_gradients",
65 "Vector of displacement gradient variables (see "
66 "Modules/PhaseField/DisplacementGradients "
74 _nvar(_coupled_moose_vars.size()),
75 _second_derivatives(_nvar + 1),
76 _third_derivatives(_nvar + 1),
77 _third_cross_derivatives(_nvar),
82 &this->
template getMaterialPropertyDerivative<Real>(
"f_name", _var.name(), _var.name());
84 "f_name", _var.name(), _var.name(), _var.name());
88 for (
unsigned int i = 0; i <
_nvar; ++i)
90 const VariableName iname = _coupled_moose_vars[i]->name();
91 if (iname == _var.name())
93 "args",
"The kernel variable should not be specified in the coupled `args` parameter.");
96 &this->
template getMaterialPropertyDerivative<Real>(
"f_name", _var.name(), iname);
98 "f_name", _var.name(), _var.name(), iname);
101 for (
unsigned int j = 0; j <
_nvar; ++j)
103 VariableName jname = _coupled_moose_vars[j]->name();
105 &this->
template getMaterialPropertyDerivative<Real>(
"f_name", _var.name(), iname, jname);
108 _grad_vars[i + 1] = &_subproblem.getStandardVariable(_tid, iname).gradSln();
112 template <
typename T>
121 this->
template validateCoupling<Real>(
"f_name", _var.name());
122 this->
template validateDerivativeMaterialPropertyBase<Real>(
"f_name");
125 template <
typename T>
134 for (
unsigned int i = 0; i <= _nvar; ++i)
135 res += (*_grad_vars[i])[_qp] * (*_second_derivatives[i])[_qp];
139 res = _grad_phi[_j][_qp] * (*_second_derivatives[0])[_qp];
140 for (
unsigned int i = 0; i <= _nvar; ++i)
141 res += _phi[_j][_qp] * (*_grad_vars[i])[_qp] * (*_third_derivatives[i])[_qp];
145 mooseError(
"Internal error");
148 template <
typename T>
153 const unsigned int cvar = this->mapJvarToCvar(jvar);
155 RealGradient J = _grad_u[_qp] * _phi[_j][_qp] * (*_third_derivatives[cvar + 1])[_qp] +
156 _grad_phi[_j][_qp] * (*_second_derivatives[cvar + 1])[_qp];
158 for (
unsigned int i = 0; i < _nvar; ++i)
159 J += _phi[_j][_qp] * (*_grad_vars[i + 1])[_qp] * (*_third_cross_derivatives[i][cvar])[_qp];