19 params.addClassDescription(
20 "Kernel for Allen-Cahn equation that adds derivatives of switching functions and energies");
21 params.addRequiredParam<std::vector<MaterialPropertyName>>(
22 "Fj_names",
"List of free energies for each phase. Place in same order as hj_names!");
23 params.addRequiredParam<std::vector<MaterialPropertyName>>(
24 "hj_names",
"Switching Function Materials that provide h. Place in same order as Fj_names!");
28 ACSwitching::ACSwitching(
const InputParameters & parameters)
29 :
ACBulk<Real>(parameters),
30 _nvar(_coupled_moose_vars.size()),
31 _etai_name(_var.
name()),
32 _Fj_names(getParam<std::vector<MaterialPropertyName>>(
"Fj_names")),
33 _num_j(_Fj_names.size()),
35 _prop_dFjdarg(_num_j),
36 _hj_names(getParam<std::vector<MaterialPropertyName>>(
"hj_names")),
37 _prop_dhjdetai(_num_j),
38 _prop_d2hjdetai2(_num_j),
39 _prop_d2hjdetaidarg(_num_j)
42 if (_num_j != _hj_names.size())
43 paramError(
"hj_names",
"Need to pass in as many hj_names as Fj_names");
46 for (
unsigned int n = 0; n < _num_j; ++n)
49 _prop_Fj[n] = &getMaterialPropertyByName<Real>(_Fj_names[n]);
50 _prop_dFjdarg[n].resize(_nvar);
53 _prop_dhjdetai[n] = &getMaterialPropertyDerivative<Real>(_hj_names[n], _etai_name);
55 &getMaterialPropertyDerivative<Real>(_hj_names[n], _etai_name, _etai_name);
56 _prop_d2hjdetaidarg[n].resize(_nvar);
58 for (
unsigned int i = 0; i < _nvar; ++i)
60 MooseVariableFEBase * cvar = _coupled_moose_vars[i];
62 _prop_dFjdarg[n][i] = &getMaterialPropertyDerivative<Real>(_Fj_names[n], cvar->name());
65 _prop_d2hjdetaidarg[n][i] =
66 &getMaterialPropertyDerivative<Real>(_hj_names[n], _etai_name, cvar->name());
72 ACSwitching::initialSetup()
76 for (
unsigned int n = 0; n < _num_j; ++n)
78 validateNonlinearCoupling<Real>(_Fj_names[n]);
79 validateNonlinearCoupling<Real>(_hj_names[n]);
84 ACSwitching::computeDFDOP(PFFunctionType type)
91 for (
unsigned int n = 0; n < _num_j; ++n)
92 sum += (*_prop_dhjdetai[n])[_qp] * (*_prop_Fj[n])[_qp];
97 for (
unsigned int n = 0; n < _num_j; ++n)
98 sum += (*_prop_d2hjdetai2[n])[_qp] * (*_prop_Fj[n])[_qp];
100 return _phi[_j][_qp] * sum;
103 mooseError(
"Invalid type passed in to ACSwitching::computeDFDOP");
107 ACSwitching::computeQpOffDiagJacobian(
unsigned int jvar)
110 const unsigned int cvar = mapJvarToCvar(jvar);
118 for (
unsigned int n = 0; n < _num_j; ++n)
119 sum += (*_prop_d2hjdetaidarg[n][cvar])[_qp] * (*_prop_Fj[n])[_qp] +
120 (*_prop_dhjdetai[n])[_qp] * (*_prop_dFjdarg[n][cvar])[_qp];
122 res += _L[_qp] * sum * _phi[_j][_qp] * _test[_i][_qp];