11 #include "MooseMesh.h"
12 #include "MathUtils.h"
20 InputParameters params = validParams<Material>();
21 params.addClassDescription(
22 "This Material accounts for the the orientation dependence "
23 "of interfacial energy for multi-phase multi-order parameter phase-field model.");
24 params.addRequiredParam<MaterialPropertyName>(
"kappa_name",
25 "Name of the kappa for the given phase");
26 params.addRequiredParam<MaterialPropertyName>(
27 "dkappadgrad_etaa_name",
"Name of the derivative of kappa w.r.t. the gradient of eta");
28 params.addRequiredParam<MaterialPropertyName>(
29 "d2kappadgrad_etaa_name",
30 "Name of the second derivative of kappa w.r.t. the gradient of eta");
31 params.addParam<Real>(
32 "anisotropy_strength", 0.04,
"Strength of the anisotropy (typically < 0.05)");
33 params.addParam<
unsigned int>(
"mode_number", 4,
"Mode number for anisotropy");
34 params.addParam<Real>(
35 "reference_angle", 90,
"Reference angle for defining anisotropy in degrees");
36 params.addParam<Real>(
"kappa_bar", 0.1125,
"Average value of the interface parameter kappa");
37 params.addRequiredCoupledVar(
"etaa",
"Order parameter for the current phase alpha");
38 params.addRequiredCoupledVar(
"etab",
"Order parameter for the neighboring phase beta");
43 const InputParameters & parameters)
44 : Material(parameters),
45 _kappa_name(getParam<MaterialPropertyName>(
"kappa_name")),
46 _dkappadgrad_etaa_name(getParam<MaterialPropertyName>(
"dkappadgrad_etaa_name")),
47 _d2kappadgrad_etaa_name(getParam<MaterialPropertyName>(
"d2kappadgrad_etaa_name")),
48 _delta(getParam<Real>(
"anisotropy_strength")),
49 _j(getParam<unsigned int>(
"mode_number")),
50 _theta0(getParam<Real>(
"reference_angle")),
51 _kappa_bar(getParam<Real>(
"kappa_bar")),
52 _kappa(declareProperty<Real>(_kappa_name)),
53 _dkappadgrad_etaa(declareProperty<
RealGradient>(_dkappadgrad_etaa_name)),
54 _d2kappadgrad_etaa(declareProperty<RealTensorValue>(_d2kappadgrad_etaa_name)),
55 _etaa(coupledValue(
"etaa")),
56 _grad_etaa(coupledGradient(
"etaa")),
57 _etab(coupledValue(
"etab")),
58 _grad_etab(coupledGradient(
"etab"))
61 if (_mesh.dimension() != 2)
62 mooseError(
"InterfaceOrientationMultiphaseMaterial requires a two-dimensional mesh.");
68 const Real
tol = 1e-9;
69 const Real cutoff = 1.0 -
tol;
74 const Real nx = nd(0);
75 const Real ny = nd(1);
76 const Real n2x = nd(0) * nd(0);
77 const Real n2y = nd(1) * nd(1);
78 const Real nsq = nd.norm_sq();
79 const Real n2sq = nsq * nsq;
81 n = nx / std::sqrt(nsq);
90 const Real angle = std::acos(n) * MathUtils::sign(ny);
93 const Real dangledn = -MathUtils::sign(ny) / std::sqrt(1.0 - n * n);
94 const Real d2angledn2 = -MathUtils::sign(ny) * n / (1.0 - n * n) / std::sqrt(1.0 - n * n);
100 dndgrad_etaa(0) = ny * ny;
101 dndgrad_etaa(1) = -nx * ny;
102 dndgrad_etaa /= nsq * std::sqrt(nsq);
106 RealTensorValue dndgrad_etaa_sq;
109 dndgrad_etaa_sq(0, 0) = n2y * n2y;
110 dndgrad_etaa_sq(0, 1) = -nx * ny * n2y;
111 dndgrad_etaa_sq(1, 0) = -nx * ny * n2y;
112 dndgrad_etaa_sq(1, 1) = n2x * n2y;
113 dndgrad_etaa_sq /= n2sq * nsq;
117 RealTensorValue d2ndgrad_etaa2;
120 d2ndgrad_etaa2(0, 0) = -3.0 * nx * n2y;
121 d2ndgrad_etaa2(0, 1) = -ny * n2y + 2.0 * ny * n2x;
122 d2ndgrad_etaa2(1, 0) = -ny * n2y + 2.0 * ny * n2x;
123 d2ndgrad_etaa2(1, 1) = -nx * n2x + 2.0 * nx * n2y;
124 d2ndgrad_etaa2 /= n2sq * std::sqrt(nsq);
128 Real anglediff =
_j * (angle -
_theta0 * libMesh::pi / 180.0);
141 dkappadangle * d2angledn2 * dndgrad_etaa_sq +
142 dkappadangle * dangledn * d2ndgrad_etaa2;