Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://mooseframework.inl.gov
3 : //*
4 : //* All rights reserved, see COPYRIGHT for full restrictions
5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 : //*
7 : //* Licensed under LGPL 2.1, please see LICENSE for details
8 : //* https://www.gnu.org/licenses/lgpl-2.1.html
9 :
10 : // Navier-Stokes includes
11 : #include "PorousMixedVarMaterial.h"
12 : #include "NS.h"
13 : #include "NavierStokesMethods.h"
14 :
15 : // FluidProperties includes
16 : #include "SinglePhaseFluidProperties.h"
17 :
18 : registerMooseObject("NavierStokesApp", PorousMixedVarMaterial);
19 :
20 : InputParameters
21 590 : PorousMixedVarMaterial::validParams()
22 : {
23 590 : auto params = Material::validParams();
24 590 : params.addRequiredParam<UserObjectName>(NS::fluid, "fluid userobject");
25 590 : params.addRequiredCoupledVar(NS::pressure, "The pressure");
26 590 : params.addRequiredCoupledVar(NS::T_fluid, "The fluid temperature");
27 590 : params.addRequiredCoupledVar(NS::superficial_momentum_x, "The x-momentum times the porosity");
28 590 : params.addCoupledVar(NS::superficial_momentum_y, "The y-momentum times the porosity");
29 590 : params.addCoupledVar(NS::superficial_momentum_z, "The z-momentum times the porosity");
30 590 : params.addClassDescription("Provides access to variables for a primitive variable set "
31 : "of pressure, temperature, and superficial velocity");
32 590 : params.addRequiredParam<MaterialPropertyName>(NS::porosity, "the porosity");
33 590 : return params;
34 0 : }
35 :
36 447 : PorousMixedVarMaterial::PorousMixedVarMaterial(const InputParameters & params)
37 : : Material(params),
38 894 : _fluid(UserObjectInterface::getUserObject<SinglePhaseFluidProperties>(NS::fluid)),
39 : // mixed variables
40 447 : _var_pressure(adCoupledValue(NS::pressure)),
41 447 : _grad_var_pressure(adCoupledGradient(NS::pressure)),
42 447 : _pressure_dot(_is_transient ? adCoupledDot(NS::pressure) : _ad_zero),
43 447 : _var_T_fluid(adCoupledValue(NS::T_fluid)),
44 447 : _grad_var_T_fluid(adCoupledGradient(NS::T_fluid)),
45 447 : _T_fluid_dot(_is_transient ? adCoupledDot(NS::T_fluid) : _ad_zero),
46 447 : _var_sup_mom_x(adCoupledValue(NS::superficial_momentum_x)),
47 447 : _grad_var_sup_mom_x(adCoupledGradient(NS::superficial_momentum_x)),
48 447 : _var_sup_mom_y(isCoupled(NS::superficial_momentum_y)
49 447 : ? adCoupledValue(NS::superficial_momentum_y)
50 : : _ad_zero),
51 447 : _grad_var_sup_mom_y(isCoupled(NS::superficial_momentum_y)
52 447 : ? adCoupledGradient(NS::superficial_momentum_y)
53 : : _ad_grad_zero),
54 447 : _var_sup_mom_z(isCoupled(NS::superficial_momentum_z)
55 447 : ? adCoupledValue(NS::superficial_momentum_z)
56 : : _ad_zero),
57 447 : _grad_var_sup_mom_z(isCoupled(NS::superficial_momentum_z)
58 447 : ? adCoupledGradient(NS::superficial_momentum_z)
59 : : _ad_grad_zero),
60 447 : _var_sup_mom_x_dot(_is_transient ? adCoupledDot(NS::superficial_momentum_x) : _ad_zero),
61 549 : _var_sup_mom_y_dot((isCoupled(NS::superficial_momentum_y) && _is_transient)
62 549 : ? adCoupledDot(NS::superficial_momentum_y)
63 : : _ad_zero),
64 894 : _var_sup_mom_z_dot((isCoupled(NS::superficial_momentum_z) && _is_transient)
65 447 : ? adCoupledDot(NS::superficial_momentum_z)
66 : : _ad_zero),
67 : // porosity
68 447 : _epsilon(getMaterialProperty<Real>(NS::porosity)),
69 : // properties: primitives
70 447 : _pressure(declareADProperty<Real>(NS::pressure)),
71 447 : _grad_pressure(declareADProperty<RealVectorValue>(NS::grad(NS::pressure))),
72 447 : _T_fluid(declareADProperty<Real>(NS::T_fluid)),
73 447 : _grad_T_fluid(declareADProperty<RealVectorValue>(NS::grad(NS::T_fluid))),
74 447 : _sup_vel(declareADProperty<RealVectorValue>(NS::superficial_velocity)),
75 447 : _sup_vel_x(declareADProperty<Real>(NS::superficial_velocity_x)),
76 447 : _grad_sup_vel_x(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_x))),
77 447 : _sup_vel_y(declareADProperty<Real>(NS::superficial_velocity_y)),
78 447 : _grad_sup_vel_y(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_y))),
79 447 : _sup_vel_z(declareADProperty<Real>(NS::superficial_velocity_z)),
80 447 : _grad_sup_vel_z(declareADProperty<RealVectorValue>(NS::grad(NS::superficial_velocity_z))),
81 : // properties: for viz
82 447 : _rho(declareADProperty<Real>(NS::density)),
83 447 : _sup_rho_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_density))),
84 447 : _velocity(declareADProperty<RealVectorValue>(NS::velocity)),
85 447 : _vel_x(declareADProperty<Real>(NS::velocity_x)),
86 447 : _vel_y(declareADProperty<Real>(NS::velocity_y)),
87 447 : _vel_z(declareADProperty<Real>(NS::velocity_z)),
88 447 : _sup_mom_x(declareADProperty<Real>(NS::superficial_momentum_x)),
89 447 : _sup_mom_y(declareADProperty<Real>(NS::superficial_momentum_y)),
90 447 : _sup_mom_z(declareADProperty<Real>(NS::superficial_momentum_z)),
91 447 : _sup_mom_x_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_x))),
92 447 : _sup_mom_y_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_y))),
93 447 : _sup_mom_z_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_momentum_z))),
94 447 : _sup_rho_et_dot(declareADProperty<Real>(NS::time_deriv(NS::superficial_total_energy_density))),
95 447 : _mom(declareADProperty<RealVectorValue>(NS::momentum)),
96 447 : _mom_x(declareADProperty<Real>(NS::momentum_x)),
97 447 : _mom_y(declareADProperty<Real>(NS::momentum_y)),
98 447 : _mom_z(declareADProperty<Real>(NS::momentum_z)),
99 447 : _speed(declareADProperty<Real>(NS::speed)),
100 447 : _rho_et(declareADProperty<Real>(NS::total_energy_density)),
101 447 : _e(declareADProperty<Real>(NS::specific_internal_energy)),
102 894 : _ht(declareADProperty<Real>(NS::specific_total_enthalpy))
103 : {
104 447 : if (_mesh.dimension() >= 2 && !isCoupled(NS::superficial_momentum_y))
105 0 : mooseError("You must couple in a superficial y-momentum when solving 2D or 3D problems.");
106 :
107 447 : if (_mesh.dimension() >= 3 && !isCoupled(NS::superficial_momentum_z))
108 0 : mooseError("You must couple in a superficial z-momentum when solving 3D problems.");
109 447 : }
110 :
111 : void
112 3840300 : PorousMixedVarMaterial::computeQpProperties()
113 : {
114 : // Our primitive variable set
115 3840300 : _pressure[_qp] = _var_pressure[_qp];
116 3840300 : _grad_pressure[_qp] = _grad_var_pressure[_qp];
117 3840300 : _T_fluid[_qp] = _var_T_fluid[_qp];
118 3840300 : _grad_T_fluid[_qp] = _grad_var_T_fluid[_qp];
119 : const VectorValue<ADReal> superficial_momentum = {
120 3840300 : _var_sup_mom_x[_qp], _var_sup_mom_y[_qp], _var_sup_mom_z[_qp]};
121 3840300 : _sup_mom_x[_qp] = superficial_momentum(0);
122 3840300 : _sup_mom_y[_qp] = superficial_momentum(1);
123 3840300 : _sup_mom_z[_qp] = superficial_momentum(2);
124 3840300 : _sup_mom_x_dot[_qp] = _var_sup_mom_x_dot[_qp];
125 3840300 : _sup_mom_y_dot[_qp] = _var_sup_mom_y_dot[_qp];
126 3840300 : _sup_mom_z_dot[_qp] = _var_sup_mom_z_dot[_qp];
127 :
128 : ADReal drho_dp, drho_dT;
129 3840300 : _fluid.rho_from_p_T(_pressure[_qp], _T_fluid[_qp], _rho[_qp], drho_dp, drho_dT);
130 7680600 : const auto rho_dot = drho_dp * _pressure_dot[_qp] + drho_dT * _T_fluid_dot[_qp];
131 3840300 : const auto grad_rho = drho_dp * _grad_pressure[_qp] + drho_dT * _grad_T_fluid[_qp];
132 7680600 : _sup_rho_dot[_qp] = _epsilon[_qp] * rho_dot;
133 :
134 7680600 : _sup_vel[_qp] = superficial_momentum / _rho[_qp];
135 3840300 : _sup_vel_x[_qp] = _sup_vel[_qp](0);
136 3840300 : _sup_vel_y[_qp] = _sup_vel[_qp](1);
137 3840300 : _sup_vel_z[_qp] = _sup_vel[_qp](2);
138 7680600 : _grad_sup_vel_x[_qp] = _grad_var_sup_mom_x[_qp] / _rho[_qp] -
139 3840300 : superficial_momentum(0) / (_rho[_qp] * _rho[_qp]) * grad_rho;
140 7680600 : _grad_sup_vel_y[_qp] = _grad_var_sup_mom_y[_qp] / _rho[_qp] -
141 3840300 : superficial_momentum(1) / (_rho[_qp] * _rho[_qp]) * grad_rho;
142 7680600 : _grad_sup_vel_z[_qp] = _grad_var_sup_mom_z[_qp] / _rho[_qp] -
143 3840300 : superficial_momentum(2) / (_rho[_qp] * _rho[_qp]) * grad_rho;
144 3840300 : const auto sup_vel_x_dot = _var_sup_mom_x_dot[_qp] / _rho[_qp] -
145 3840300 : superficial_momentum(0) / (_rho[_qp] * _rho[_qp]) * rho_dot;
146 3840300 : const auto sup_vel_y_dot = _var_sup_mom_y_dot[_qp] / _rho[_qp] -
147 3840300 : superficial_momentum(1) / (_rho[_qp] * _rho[_qp]) * rho_dot;
148 3840300 : const auto sup_vel_z_dot = _var_sup_mom_z_dot[_qp] / _rho[_qp] -
149 3840300 : superficial_momentum(2) / (_rho[_qp] * _rho[_qp]) * rho_dot;
150 :
151 7680600 : _velocity[_qp] = _sup_vel[_qp] / _epsilon[_qp];
152 3840300 : _vel_x[_qp] = _velocity[_qp](0);
153 3840300 : _vel_y[_qp] = _velocity[_qp](1);
154 3840300 : _vel_z[_qp] = _velocity[_qp](2);
155 :
156 3840300 : const auto v = 1. / _rho[_qp];
157 11520900 : const auto v_dot = -rho_dot / (_rho[_qp] * _rho[_qp]);
158 : ADReal de_dT, de_dv;
159 3840300 : _fluid.e_from_T_v(_T_fluid[_qp], v, _e[_qp], de_dT, de_dv);
160 3840300 : const auto e_dot = de_dT * _T_fluid_dot[_qp] + de_dv * v_dot;
161 7680600 : const auto et = _e[_qp] + _velocity[_qp] * _velocity[_qp] / 2.;
162 : const auto velocity_dot =
163 3840300 : VectorValue<ADReal>(sup_vel_x_dot, sup_vel_y_dot, sup_vel_z_dot) / _epsilon[_qp];
164 3840300 : const auto et_dot = e_dot + _velocity[_qp] * velocity_dot;
165 11520900 : _sup_rho_et_dot[_qp] = _epsilon[_qp] * (rho_dot * et + et_dot * _rho[_qp]);
166 :
167 7680600 : _mom_x[_qp] = _sup_mom_x[_qp] / _epsilon[_qp];
168 7680600 : _mom_y[_qp] = _sup_mom_y[_qp] / _epsilon[_qp];
169 7680600 : _mom_z[_qp] = _sup_mom_z[_qp] / _epsilon[_qp];
170 3840300 : _mom[_qp] = {_mom_x[_qp], _mom_y[_qp], _mom_z[_qp]};
171 :
172 3840300 : _speed[_qp] = NS::computeSpeed<ADReal>(_velocity[_qp]);
173 :
174 7680600 : _rho_et[_qp] = _rho[_qp] * et;
175 7680600 : _ht[_qp] = et + _pressure[_qp] / _rho[_qp];
176 3840300 : }
|