13 #include "MooseVariable.h"
14 #include "NonlinearSystem.h"
22 InputParameters params = validParams<Kernel>();
23 params.addClassDescription(
"Gradient energy Allen-Cahn Kernel with cross terms");
24 params.addRequiredCoupledVar(
"etas",
"All eta_i order parameters of the multiphase problem");
25 params.addRequiredParam<std::vector<MaterialPropertyName>>(
"kappa_names",
26 "The kappa used with the kernel");
27 params.addParam<MaterialPropertyName>(
"mob_name",
"L",
"The mobility used with the kernel");
33 _num_etas(coupledComponents(
"etas")),
36 _eta_vars(_fe_problem.getNonlinearSystemBase().nVariables(), -1),
37 _kappa_names(getParam<std::vector<MaterialPropertyName>>(
"kappa_names")),
39 _L(getMaterialProperty<Real>(
"mob_name"))
42 paramError(
"kappa_names",
"Supply the same number of etas and kappa_names.");
44 unsigned int nvariables = _fe_problem.getNonlinearSystemBase().nVariables();
47 for (
unsigned int i = 0; i <
_num_etas; ++i)
50 _eta[i] = &coupledValue(
"etas", i);
51 _grad_eta[i] = &coupledGradient(
"etas", i);
54 unsigned int var = coupled(
"etas", i);
59 if (coupled(
"etas", i) == _var.number())
68 "etas",
"Kernel variable must be listed in etas for ACMultiInterface kernel ",
name());
76 const VariableValue & _eta_a = _u;
77 const VariableGradient & _grad_eta_a = _grad_u;
80 for (
unsigned int b = 0; b <
_num_etas; ++b)
89 2.0 * _test[_i][_qp] *
90 (_eta_a[_qp] * (*
_grad_eta[b])[_qp] - (*
_eta[b])[_qp] * _grad_eta_a[_qp]) *
93 + (-(_eta_a[_qp] * (*
_eta[b])[_qp] * _grad_test[_i][_qp] +
94 _test[_i][_qp] * (*
_eta[b])[_qp] * _grad_eta_a[_qp] +
95 _test[_i][_qp] * _eta_a[_qp] * (*
_grad_eta[b])[_qp]) *
97 (-((*
_eta[b])[_qp] * (*
_eta[b])[_qp] * _grad_test[_i][_qp] +
98 2.0 * _test[_i][_qp] * (*
_eta[b])[_qp] * (*
_grad_eta[b])[_qp]) *
102 return _L[_qp] * sum;
109 for (
unsigned int b = 0; b <
_num_etas; ++b)
115 sum += (*
_kappa[b])[_qp] *
116 (2.0 * _test[_i][_qp] *
117 ((_phi[_j][_qp] * (*
_grad_eta[b])[_qp] - (*
_eta[b])[_qp] * _grad_phi[_j][_qp]) *
119 (-(_phi[_j][_qp] * (*
_eta[b])[_qp] * _grad_test[_i][_qp] +
120 _test[_i][_qp] * (*
_eta[b])[_qp] * _grad_phi[_j][_qp] +
121 _test[_i][_qp] * _phi[_j][_qp] * (*
_grad_eta[b])[_qp]) *
123 (-((*
_eta[b])[_qp] * (*
_eta[b])[_qp] * _grad_test[_i][_qp] +
124 2.0 * _test[_i][_qp] * (*
_eta[b])[_qp] * (*
_grad_eta[b])[_qp]) *
125 _grad_phi[_j][_qp]));
128 return _L[_qp] * sum;
134 const VariableValue & _eta_a = _u;
135 const VariableGradient & _grad_eta_a = _grad_u;
141 return _L[_qp] * (*
_kappa[b])[_qp] *
142 (2.0 * _test[_i][_qp] *
143 ((_eta_a[_qp] * _grad_phi[_j][_qp] - _phi[_j][_qp] * _grad_eta_a[_qp]) *
145 (_eta_a[_qp] * (*
_grad_eta[b])[_qp] - (*
_eta[b])[_qp] * _grad_eta_a[_qp]) *
146 _grad_phi[_j][_qp]) +
147 (-(_eta_a[_qp] * _phi[_j][_qp] * _grad_test[_i][_qp] +
148 _test[_i][_qp] * _phi[_j][_qp] * _grad_eta_a[_qp] +
149 _test[_i][_qp] * _eta_a[_qp] * _grad_phi[_j][_qp]) *
151 (_eta_a[_qp] * (*
_eta[b])[_qp] * _grad_test[_i][_qp] +
152 _test[_i][_qp] * (*
_eta[b])[_qp] * _grad_eta_a[_qp] +
153 _test[_i][_qp] * _eta_a[_qp] * (*
_grad_eta[b])[_qp]) *
154 _grad_phi[_j][_qp]) -
155 (-(2.0 * (*
_eta[b])[_qp] * _phi[_j][_qp] * _grad_test[_i][_qp] +
156 2.0 * _test[_i][_qp] *
157 (_phi[_j][_qp] * (*
_grad_eta[b])[_qp] + (*
_eta[b])[_qp] * _grad_phi[_j][_qp])) *