13 #include "libmesh/quadrature.h"
21 InputParameters params = validParams<DerivativeFunctionMaterialBase>();
22 params.addClassDescription(
"Free energy contribution for nucleating discrete particles");
23 params.addRequiredCoupledVar(
"op_names",
24 "List of variables to force to a target concentration value");
25 params.addRequiredParam<UserObjectName>(
"map",
"DiscreteNucleationMap user object");
26 params.addRequiredParam<std::vector<Real>>(
"op_values",
"List of target concentration values");
27 params.addParam<Real>(
"penalty", 20.0,
"Penalty factor for enforcing the target concentrations");
28 MooseEnum penalty_mode(
"MATCH MIN MAX",
"MATCH");
29 params.addParam<MooseEnum>(
32 "Match the target concentration or take it as a minimum or maximum concentration target");
37 : DerivativeFunctionMaterialBase(params),
38 _nvar(coupledComponents(
"op_names")),
40 _op_values(getParam<std::vector<Real>>(
"op_values")),
41 _penalty(getParam<Real>(
"penalty")),
42 _penalty_mode(getParam<MooseEnum>(
"penalty_mode")),
47 mooseError(
"The op_names and op_values parameter vectors must have the same number of entries");
48 if (
_nvar != _args.size())
49 mooseError(
"Internal error.");
52 for (
unsigned int i = 0; i <
_nvar; ++i)
53 _op_index[i] = argIndex(coupled(
"op_names", i));
60 const std::vector<Real> & nucleus =
_map.
nuclei(_current_elem);
63 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
67 (*_prop_F)[_qp] = 0.0;
69 for (
unsigned int i = 0; i <
_nvar; ++i)
74 const Real penalty =
_penalty * nucleus[_qp];
85 (*_prop_F)[_qp] += dc * dc * penalty;
89 (*_prop_dF[ii])[_qp] = 2.0 * dc * penalty;
92 for (
unsigned int jj = ii; jj <
_nvar; ++jj)
94 if (_prop_d2F[ii][jj])
95 (*_prop_d2F[ii][jj])[_qp] = 2.0 * penalty;
98 if (_third_derivatives)
99 for (
unsigned int kk = jj; kk <
_nvar; ++kk)
100 if (_prop_d3F[ii][jj][kk])
101 (*_prop_d3F[ii][jj][kk])[_qp] = 0.0;