18 InputParameters params = validParams<Material>();
19 params.addParam<std::string>(
"function_name",
"g",
"actual name for g(eta_i)");
20 params.addRequiredCoupledVar(
"etas",
"eta_i order parameters, one for each h");
21 params.addClassDescription(
22 "Free Energy contribution that penalizes more than two order parameters being non-zero");
27 : DerivativeMaterialInterface<Material>(parameters),
28 _function_name(getParam<std::string>(
"function_name")),
29 _num_eta(coupledComponents(
"etas")),
31 _prop_g(declareProperty<Real>(_function_name)),
35 std::vector<std::string> eta_name(
_num_eta);
36 for (
unsigned int i = 0; i <
_num_eta; ++i)
40 eta_name[i] = getVar(
"etas", i)->name();
42 for (
unsigned int i = 0; i <
_num_eta; ++i)
45 _eta[i] = &coupledValue(
"etas", i);
46 for (
unsigned int j = i; j <
_num_eta; ++j)
49 &declarePropertyDerivative<Real>(
_function_name, eta_name[i], eta_name[j]);
59 for (
unsigned int i = 0; i <
_num_eta; ++i)
62 for (
unsigned int j = i; j <
_num_eta; ++j)
67 for (
unsigned int i = 0; i <
_num_eta; ++i)
68 for (
unsigned int j = 0; j < i; ++j)
69 for (
unsigned int k = 0; k < j; ++k)
71 const Real ni = (*
_eta[i])[_qp];
72 const Real nj = (*
_eta[j])[_qp];
73 const Real nk = (*
_eta[k])[_qp];
75 _prop_g[_qp] += ni * ni * nj * nj * nk * nk;
76 (*
_prop_dg[i])[_qp] += 2 * ni * nj * nj * nk * nk;
77 (*
_prop_dg[j])[_qp] += 2 * ni * ni * nj * nk * nk;
78 (*
_prop_dg[k])[_qp] += 2 * ni * ni * nj * nj * nk;
79 (*
_prop_d2g[i][i])[_qp] += 2 * nj * nj * nk * nk;
80 (*
_prop_d2g[j][j])[_qp] += 2 * ni * ni * nk * nk;
81 (*
_prop_d2g[k][k])[_qp] += 2 * ni * ni * nj * nj;
82 (*
_prop_d2g[i][j])[_qp] += 4 * ni * nj * nk * nk;
83 (*
_prop_d2g[i][k])[_qp] += 4 * ni * nj * nj * nk;
84 (*
_prop_d2g[k][j])[_qp] += 4 * ni * ni * nj * nk;