14 #include "JvarMapInterface.h"
15 #include "DerivativeKernelInterface.h"
23 class CHInterfaceBase :
public DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>
35 const MaterialProperty<Real> &
_kappa;
39 const MaterialProperty<T> &
_M;
40 const MaterialProperty<T> &
_dMdc;
56 std::vector<const MaterialProperty<T> *>
_dMdarg;
58 std::vector<std::vector<const MaterialProperty<T> *>>
_d2Mdargdarg;
67 : DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>(parameters),
68 _kappa(getMaterialProperty<Real>(
"kappa_name")),
69 _M(getMaterialProperty<T>(
"mob_name")),
70 _dMdc(getMaterialPropertyDerivative<T>(
"mob_name", _var.
name())),
71 _d2Mdc2(getMaterialPropertyDerivative<T>(
"mob_name", _var.
name(), _var.
name())),
73 _second_test(secondTest()),
74 _second_phi(secondPhi()),
75 _nvar(_coupled_moose_vars.size()),
79 _coupled_grad_vars(_nvar)
82 for (
unsigned int i = 0; i <
_nvar; ++i)
85 _dMdarg[i] = &getMaterialPropertyDerivative<T>(
"mob_name", _coupled_moose_vars[i]->
name());
87 &getMaterialPropertyDerivative<T>(
"mob_name", _var.name(), _coupled_moose_vars[i]->name());
89 for (
unsigned int j = 0; j <
_nvar; ++j)
91 "mob_name", _coupled_moose_vars[i]->
name(), _coupled_moose_vars[j]->
name());
102 InputParameters params = ::validParams<Kernel>();
103 params.addClassDescription(
"Gradient energy Cahn-Hilliard base Kernel");
104 params.addRequiredParam<MaterialPropertyName>(
"kappa_name",
"The kappa used with the kernel");
105 params.addRequiredParam<MaterialPropertyName>(
"mob_name",
"The mobility used with the kernel");
106 params.addCoupledVar(
"args",
"Vector of arguments of the mobility");
110 template <
typename T>
115 for (
unsigned int i = 0; i < _nvar; ++i)
116 grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
118 return _kappa[_qp] * _second_u[_qp].tr() *
119 ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]);
122 template <
typename T>
130 _d2Mdc2[_qp] * _phi[_j][_qp] * _grad_u[_qp] + _dMdc[_qp] * _grad_phi[_j][_qp];
132 for (
unsigned int i = 0; i < _nvar; ++i)
134 grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
135 dgrad_Mdc += (*_d2Mdcdarg[i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[i])[_qp];
139 Real value = _kappa[_qp] * _second_phi[_j][_qp].tr() *
140 ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]) +
141 _kappa[_qp] * _second_u[_qp].tr() *
142 ((_dMdc[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
143 dgrad_Mdc * _grad_test[_i][_qp]);
148 template <
typename T>
153 const unsigned int cvar = mapJvarToCvar(jvar);
156 RealGradient dgrad_Mdarg = (*_d2Mdcdarg[cvar])[_qp] * _phi[_j][_qp] * _grad_u[_qp] +
157 (*_dMdarg[cvar])[_qp] * _grad_phi[_j][_qp];
159 for (
unsigned int i = 0; i < _nvar; ++i)
160 dgrad_Mdarg += (*_d2Mdargdarg[cvar][i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[cvar])[_qp];
163 Real value = _kappa[_qp] * _second_u[_qp].tr() *
164 (((*_dMdarg[cvar])[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
165 dgrad_Mdarg * _grad_test[_i][_qp]);