11 #include "MooseMesh.h"
19 InputParameters params = validParams<Kernel>();
21 params.addClassDescription(
"This class computes the 'Chorin' Predictor equation in "
22 "fully-discrete (both time and space) form.");
24 params.addRequiredCoupledVar(
"u",
"x-velocity");
25 params.addCoupledVar(
"v",
"y-velocity");
26 params.addCoupledVar(
"w",
"z-velocity");
29 params.addRequiredCoupledVar(
"u_star",
"star x-velocity");
30 params.addCoupledVar(
"v_star",
"star y-velocity");
31 params.addCoupledVar(
"w_star",
"star z-velocity");
34 params.addRequiredRangeCheckedParam<
unsigned>(
36 "component>=0 & component<=2",
37 "0,1,2 depending on if we are solving the x,y,z component of the Predictor equation");
38 MooseEnum predictor_type(
"OLD NEW STAR");
39 params.addRequiredParam<MooseEnum>(
42 "One of: OLD, NEW, STAR. Indicates which velocity to use in the predictor.");
45 params.addParam<MaterialPropertyName>(
"mu_name",
"mu",
"The name of the dynamic viscosity");
46 params.addParam<MaterialPropertyName>(
"rho_name",
"rho",
"The name of the density");
55 _u_vel(coupledValue(
"u")),
56 _v_vel(_mesh.dimension() >= 2 ? coupledValue(
"v") : _zero),
57 _w_vel(_mesh.dimension() == 3 ? coupledValue(
"w") : _zero),
60 _u_vel_old(coupledValueOld(
"u")),
61 _v_vel_old(_mesh.dimension() >= 2 ? coupledValueOld(
"v") : _zero),
62 _w_vel_old(_mesh.dimension() == 3 ? coupledValueOld(
"w") : _zero),
65 _u_vel_star(coupledValue(
"u_star")),
66 _v_vel_star(_mesh.dimension() >= 2 ? coupledValue(
"v_star") : _zero),
67 _w_vel_star(_mesh.dimension() == 3 ? coupledValue(
"w_star") : _zero),
70 _grad_u_vel(coupledGradient(
"u")),
71 _grad_v_vel(_mesh.dimension() >= 2 ? coupledGradient(
"v") : _grad_zero),
72 _grad_w_vel(_mesh.dimension() == 3 ? coupledGradient(
"w") : _grad_zero),
75 _grad_u_vel_old(coupledGradientOld(
"u")),
76 _grad_v_vel_old(_mesh.dimension() >= 2 ? coupledGradientOld(
"v") : _grad_zero),
77 _grad_w_vel_old(_mesh.dimension() == 3 ? coupledGradientOld(
"w") : _grad_zero),
80 _grad_u_vel_star(coupledGradient(
"u_star")),
81 _grad_v_vel_star(_mesh.dimension() >= 2 ? coupledGradient(
"v_star") : _grad_zero),
82 _grad_w_vel_star(_mesh.dimension() == 3 ? coupledGradient(
"w_star") : _grad_zero),
85 _u_vel_var_number(coupled(
"u")),
86 _v_vel_var_number(_mesh.dimension() >= 2 ? coupled(
"v") :
libMesh::invalid_uint),
87 _w_vel_var_number(_mesh.dimension() == 3 ? coupled(
"w") :
libMesh::invalid_uint),
90 _u_vel_star_var_number(coupled(
"u_star")),
91 _v_vel_star_var_number(_mesh.dimension() >= 2 ? coupled(
"v_star") :
libMesh::invalid_uint),
92 _w_vel_star_var_number(_mesh.dimension() == 3 ? coupled(
"w_star") :
libMesh::invalid_uint),
95 _component(getParam<unsigned>(
"component")),
96 _predictor_enum(getParam<MooseEnum>(
"predictor_type")),
99 _mu(getMaterialProperty<Real>(
"mu_name")),
100 _rho(getMaterialProperty<Real>(
"rho_name"))
108 RealVectorValue test;
112 RealTensorValue grad_test;
113 for (
unsigned k = 0; k < 3; ++k)
114 grad_test(
_component, k) = _grad_test[_i][_qp](k);
118 RealTensorValue grad_U;
143 mooseError(
"Unrecognized Chorin predictor type requested.");
152 Real symmetric_part = (_u[_qp] - U_old(
_component)) * _test[_i][_qp];
155 Real convective_part = _dt * (grad_U * U) * test;
159 Real viscous_part = _dt * (
_mu[_qp] /
_rho[_qp]) * grad_U.contract(grad_test);
161 return symmetric_part + convective_part + viscous_part;
168 Real mass_part = _phi[_j][_qp] * _test[_i][_qp];
172 Real other_part = 0.;
181 Real convective_part =
182 _dt * ((U_star * _grad_phi[_j][_qp]) + _phi[_j][_qp] * _grad_u[_qp](
_component)) *
185 _dt * ((
_mu[_qp] /
_rho[_qp]) * (_grad_phi[_j][_qp] * _grad_test[_i][_qp]));
186 other_part = convective_part + viscous_part;
190 mooseError(
"Unrecognized Chorin predictor type requested.");
193 return mass_part + other_part;
211 RealTensorValue dgrad_U;
214 unsigned vel_index = 99;
227 for (
unsigned k = 0; k < 3; ++k)
228 dgrad_U(vel_index, k) = _grad_phi[_j][_qp](k);
231 RealVectorValue test;
238 RealTensorValue grad_test;
239 for (
unsigned k = 0; k < 3; ++k)
240 grad_test(
_component, k) = _grad_test[_i][_qp](k);
243 RealVectorValue convective_jac =
244 _phi[_j][_qp] * RealVectorValue(
_grad_u_vel[_qp](vel_index),
249 convective_jac(vel_index) += U * _grad_phi[_j][_qp];
252 Real convective_part = _dt * (convective_jac * test);
256 Real viscous_part = _dt * (
_mu[_qp] /
_rho[_qp]) * dgrad_U.contract(grad_test);
259 return convective_part + viscous_part;
269 return _dt * _phi[_j][_qp] * _grad_u[_qp](0) * _test[_i][_qp];
274 return _dt * _phi[_j][_qp] * _grad_u[_qp](1) * _test[_i][_qp];
279 return _dt * _phi[_j][_qp] * _grad_u[_qp](2) * _test[_i][_qp];
287 mooseError(
"Unrecognized Chorin predictor type requested.");