17 params.addClassDescription(
18 "Material that implements the a function of one variable and its first derivative.");
19 MooseEnum functionEnum(
"F1 F2 F3");
20 params.addRequiredParam<MooseEnum>(
"function",
22 "F1 = 2 op[0]^2 (1 - op[0])^2 - 0.2 op[0]; "
23 "F2 = 0.1 op[0]^2 + op[1]^2; "
24 "F3 = op[0] * op[1]");
25 params.addParam<MaterialPropertyName>(
"f_name",
"F",
"function property name");
26 params.addRequiredCoupledVar(
"op",
"Order parameter variables"););
28 template <ComputeStage compute_stage>
30 const InputParameters & parameters)
31 : ADMaterial<compute_stage>(parameters),
32 _function(getParam<MooseEnum>(
"function").template getEnum<
FunctionEnum>()),
33 _op(coupledComponents(
"op")),
34 _f_name(getParam<MaterialPropertyName>(
"f_name")),
35 _prop_F(declareADProperty<Real>(_f_name)),
36 _prop_dFdop(coupledComponents(
"op"))
38 for (std::size_t i = 0; i <
_op.size(); ++i)
40 _op[i] = &adCoupledValue(
"op", i);
42 derivativePropertyNameFirst(
_f_name, this->getVar(
"op", i)->
name()));
46 paramError(
"op",
"Specify exactly one variable to an F1 type function.");
48 paramError(
"op",
"Specify exactly two variables to an F2 type function.");
50 paramError(
"op",
"Specify exactly two variables to an F3 type function.");
53 template <ComputeStage compute_stage>
57 const ADReal & a = (*_op[0])[_qp];
61 case FunctionEnum::F1:
62 _prop_F[_qp] = 2.0 * a * a * (1.0 - a) * (1.0 - a) - 0.2 * a;
63 (*_prop_dFdop[0])[_qp] = 4.0 * a * a * (a - 1.0) + 4.0 * a * (1.0 - a) * (1.0 - a) - 0.2;
66 case FunctionEnum::F2:
68 const ADReal & b = (*_op[1])[_qp];
69 _prop_F[_qp] = 0.1 * a * a + b * b;
70 (*_prop_dFdop[0])[_qp] = 0.2 * a;
71 (*_prop_dFdop[1])[_qp] = 2.0 * b;
75 case FunctionEnum::F3:
77 const ADReal & b = (*_op[1])[_qp];
79 (*_prop_dFdop[0])[_qp] = b;
80 (*_prop_dFdop[1])[_qp] = a;
85 mooseError(
"Invalid function enum value");