11 #include "RankTwoTensor.h"
12 #include "RankThreeTensor.h"
20 InputParameters params = validParams<Kernel>();
21 params.addClassDescription(
"Interface stress driving force Allen-Cahn Kernel");
22 params.addParam<MaterialPropertyName>(
"mob_name",
"L",
"The mobility used with the kernel");
23 params.addParam<std::string>(
"base_name",
"Material property base name");
24 params.addRequiredParam<Real>(
"stress",
"Planar stress");
25 params.addRangeCheckedParam<Real>(
"op_range",
28 "Range over which order parameters change across an "
29 "interface. By default order parameters are assumed to "
36 _L(getMaterialProperty<Real>(
"mob_name")),
37 _base_name(isParamValid(
"base_name") ? getParam<std::string>(
"base_name") +
"_" :
""),
38 _strain(getMaterialPropertyByName<
RankTwoTensor>(_base_name +
"elastic_strain")),
39 _stress(getParam<Real>(
"stress") / getParam<Real>(
"op_range"))
47 const Real grad_norm_sq = _grad_u[_qp].norm_sq();
48 if (grad_norm_sq < libMesh::TOLERANCE)
51 const Real grad_norm = std::sqrt(grad_norm_sq);
53 const Real nx = _grad_u[_qp](0);
54 const Real ny = _grad_u[_qp](1);
55 const Real nz = _grad_u[_qp](2);
57 const Real s =
_stress / grad_norm;
58 const Real ds = -
_stress / (grad_norm * grad_norm_sq);
59 const Real dsx = ds * nx;
60 const Real dsy = ds * ny;
61 const Real dsz = ds * nz;
64 _dS(0, 0, 0) = (ny * ny + nz * nz) * dsx;
65 _dS(0, 1, 0) =
_dS(0, 0, 1) = -ny * s - nx * ny * dsx;
66 _dS(0, 1, 1) = 2.0 * nx * s + (nx * nx + nz * nz) * dsx;
67 _dS(0, 2, 0) =
_dS(0, 0, 2) = -nz * s - nx * nz * dsx;
68 _dS(0, 2, 1) =
_dS(0, 1, 2) = -ny * nz * dsx;
69 _dS(0, 2, 2) = 2.0 * nx * s + (nx * nx + ny * ny) * dsx;
72 _dS(1, 0, 0) = 2.0 * ny * s + (ny * ny + nz * nz) * dsy;
73 _dS(1, 1, 0) =
_dS(1, 0, 1) = -nx * s - nx * ny * dsy;
74 _dS(1, 1, 1) = (nx * nx + nz * nz) * dsy;
75 _dS(1, 2, 0) =
_dS(1, 0, 2) = -nx * nz * dsy;
76 _dS(1, 2, 1) =
_dS(1, 1, 2) = -nz * s - ny * nz * dsy;
77 _dS(1, 2, 2) = 2.0 * ny * s + (nx * nx + ny * ny) * dsy;
80 _dS(2, 0, 0) = 2.0 * nz * s + (ny * ny + nz * nz) * dsz;
81 _dS(2, 1, 0) =
_dS(2, 0, 1) = -nx * ny * dsz;
82 _dS(2, 1, 1) = 2.0 * nz * s + (nx * nx + nz * nz) * dsz;
83 _dS(2, 2, 0) =
_dS(2, 0, 2) = -nx * s - nx * nz * dsz;
84 _dS(2, 2, 1) =
_dS(2, 1, 2) = -ny * s - ny * nz * dsz;
85 _dS(2, 2, 2) = (nx * nx + ny * ny) * dsz;
87 return _L[_qp] * 0.5 *
_dS.doubleContraction(
_strain[_qp]) * _grad_test[_i][_qp];
94 const Real grad_norm_sq = _grad_u[_qp].norm_sq();
95 if (grad_norm_sq < libMesh::TOLERANCE)
98 const Real grad_norm = std::sqrt(grad_norm_sq);
100 const Real nx = _grad_u[_qp](0);
101 const Real ny = _grad_u[_qp](1);
102 const Real nz = _grad_u[_qp](2);
104 const Real px = _grad_phi[_j][_qp](0);
105 const Real py = _grad_phi[_j][_qp](1);
106 const Real pz = _grad_phi[_j][_qp](2);
108 const Real s =
_stress / grad_norm;
109 const Real ds = -
_stress / (grad_norm * grad_norm_sq);
110 const Real dsx = ds * nx;
111 const Real dsy = ds * ny;
112 const Real dsz = ds * nz;
114 const Real dus = ds * (nx * px + ny * py + pz * nz);
116 const Real b = -3.0 * nx * px - 3.0 * ny * py - 3.0 * nz * pz;
117 const Real dudsx = ds * nx / grad_norm_sq * b + ds * px;
118 const Real dudsy = ds * ny / grad_norm_sq * b + ds * py;
119 const Real dudsz = ds * nz / grad_norm_sq * b + ds * pz;
122 _ddS(0, 0, 0) = (2.0 * ny * py + 2.0 * nz * pz) * dsx + (ny * ny + nz * nz) * dudsx;
124 -py * s - ny * dus - px * ny * dsx - nx * py * dsx - nx * ny * dudsx;
125 _ddS(0, 1, 1) = 2.0 * px * s + 2.0 * nx * dus + (2.0 * nx * px + 2.0 * nz * pz) * dsx +
126 (nx * nx + nz * nz) * dudsx;
128 -pz * s - nz * dus - px * nz * dsx - nx * pz * dsx - nx * nz * dudsx;
129 _ddS(0, 2, 1) =
_ddS(0, 1, 2) = -py * nz * dsx - ny * pz * dsx - ny * nz * dudsx;
130 _ddS(0, 2, 2) = 2.0 * px * s + 2.0 * nx * dus + (2.0 * nx * px + 2.0 * ny * py) * dsx +
131 (nx * nx + ny * ny) * dudsx;
134 _ddS(1, 0, 0) = 2.0 * py * s + 2.0 * ny * dus + (2.0 * ny * py + 2.0 * nz * pz) * dsy +
135 (ny * ny + nz * nz) * dudsy;
137 -px * s - nx * dus - px * ny * dsy - nx * py * dsy - nx * ny * dudsy;
138 _ddS(1, 1, 1) = (2.0 * nx * px + 2.0 * nz * pz) * dsy + (nx * nx + nz * nz) * dudsy;
139 _ddS(1, 2, 0) =
_ddS(1, 0, 2) = -px * nz * dsy - nx * pz * dsy - nx * nz * dudsy;
141 -pz * s - nz * dus - py * nz * dsy - ny * pz * dsy - ny * nz * dudsy;
142 _ddS(1, 2, 2) = 2.0 * py * s + 2.0 * ny * dus + (2.0 * nx * px + 2.0 * ny * py) * dsy +
143 (nx * nx + ny * ny) * dudsy;
146 _ddS(2, 0, 0) = 2.0 * pz * s + 2.0 * nz * dus + (2.0 * ny * py + 2.0 * nz * pz) * dsz +
147 (ny * ny + nz * nz) * dudsz;
148 _ddS(2, 1, 0) =
_ddS(2, 0, 1) = -px * ny * dsz - nx * py * dsz - nx * ny * dudsz;
149 _ddS(2, 1, 1) = 2.0 * pz * s + 2.0 * nz * dus + (2.0 * nx * px + 2.0 * nz * pz) * dsz +
150 (nx * nx + nz * nz) * dudsz;
152 -px * s - nx * dus - px * nz * dsz - nx * pz * dsz - nx * nz * dudsz;
154 -py * s - ny * dus - py * nz * dsz - ny * pz * dsz - ny * nz * dudsz;
155 _ddS(2, 2, 2) = (2.0 * nx * px + 2.0 * ny * py) * dsz + (nx * nx + ny * ny) * dudsz;
157 return _L[_qp] * 0.5 *
_ddS.doubleContraction(
_strain[_qp]) * _grad_test[_i][_qp];