11 #include "MathUtils.h"
19 InputParameters params = validParams<Kernel>();
20 params.addClassDescription(
21 "Cahn-Hilliard residual for the RFF form of the phase field crystal model");
22 params.addRequiredCoupledVar(
"v",
"Array of names of the real parts of the L variables");
23 MooseEnum log_options(
"tolerance cancelation expansion nothing");
24 params.addRequiredParam<MooseEnum>(
25 "log_approach", log_options,
"Which approach will be used to handle the natural log");
26 params.addParam<Real>(
"tol", 1.0e-9,
"Tolerance used when the tolerance approach is chosen");
27 params.addParam<Real>(
28 "n_exp_terms", 4,
"Number of terms used in the Taylor expansion of the natural log term");
29 params.addParam<MaterialPropertyName>(
"mob_name",
"M",
"The mobility used with the kernel");
30 params.addParam<MaterialPropertyName>(
"Dmob_name",
"DM",
"The D mobility used with the kernel");
31 params.addParam<
bool>(
"has_MJac",
false,
"Jacobian information for the mobility is defined");
32 params.addParam<Real>(
"a", 1.0,
"Constants on Taylor Series");
33 params.addParam<Real>(
"b", 1.0,
"Constants on Taylor Series");
34 params.addParam<Real>(
"c", 1.0,
"Constants on Taylor Series");
40 _M(getMaterialProperty<Real>(
"mob_name")),
41 _has_MJac(getParam<bool>(
"has_MJac")),
42 _DM(_has_MJac ? &getMaterialProperty<Real>(
"Dmob_name") : NULL),
43 _log_approach(getParam<MooseEnum>(
"log_approach")),
44 _tol(getParam<Real>(
"tol")),
45 _num_L(coupledComponents(
"v")),
48 _n_exp_terms(getParam<Real>(
"n_exp_terms")),
49 _a(getParam<Real>(
"a")),
50 _b(getParam<Real>(
"b")),
51 _c(getParam<Real>(
"c"))
54 for (
unsigned int i = 0; i <
_num_L; ++i)
68 for (
unsigned int i = 0; i <
_num_L; ++i)
72 Real ln_expansion = 0.0;
80 frac = 1.0 / (1.0 + c);
97 ln_expansion += temp_coeff *
std::pow(-1.0, Real(i)) *
std::pow(_u[_qp], Real(i) - 2.0);
107 GradDFDCons = grad_c * frac - sum_grad_L;
111 GradDFDCons = grad_c - (1.0 + c) * sum_grad_L;
115 GradDFDCons = ln_expansion * grad_c - sum_grad_L;
119 GradDFDCons = grad_c / (1.0 + c) - sum_grad_L;
123 Real residual =
_M[_qp] * GradDFDCons * _grad_test[_i][_qp];
134 for (
unsigned int i = 0; i <
_num_L; ++i)
139 Real ln_expansion = 0.0;
151 frac = 1.0 / (1.0 + c);
152 dfrac = -1.0 / ((1.0 + c) * (1.0 + c));
170 ln_expansion += temp_coeff *
std::pow(-1.0, Real(i)) *
std::pow(_u[_qp], Real(i) - 2.0);
176 Real Dln_expansion = 0.0;
181 dGradDFDConsdC = _grad_phi[_j][_qp] * frac + _phi[_j][_qp] * grad_c * dfrac;
185 dGradDFDConsdC = _grad_phi[_j][_qp] - _phi[_j][_qp] * sum_grad_L;
201 Dln_expansion += temp_coeff *
std::pow(static_cast<Real>(-1.0), static_cast<Real>(i)) *
202 (static_cast<Real>(i) - 2.0) *
203 std::pow(_u[_qp], static_cast<Real>(i) - 3.0);
206 dGradDFDConsdC = ln_expansion * _grad_phi[_j][_qp] + _phi[_j][_qp] * Dln_expansion * grad_c;
211 _grad_phi[_j][_qp] / (1.0 + c) - grad_c / ((1.0 + c) * (1.0 + c)) * _phi[_j][_qp];
215 return _M[_qp] * dGradDFDConsdC * _grad_test[_i][_qp];
223 for (
unsigned int i = 0; i <
_num_L; ++i)
232 dGradDFDConsdL = -dsum_grad_L;
236 dGradDFDConsdL = -(1.0 + c) * dsum_grad_L;
240 dGradDFDConsdL = -dsum_grad_L;
244 dGradDFDConsdL = -dsum_grad_L;
248 return _M[_qp] * dGradDFDConsdL * _grad_test[_i][_qp];