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 : #include "NavierStokesLHDGKernel.h"
11 : #include "MooseVariableFE.h"
12 : #include "MooseVariableScalar.h"
13 : #include "FEProblemBase.h"
14 :
15 : registerMooseObject("NavierStokesApp", NavierStokesLHDGKernel);
16 :
17 : InputParameters
18 1112 : NavierStokesLHDGKernel::validParams()
19 : {
20 1112 : auto params = HDGKernel::validParams();
21 1112 : params += NavierStokesLHDGAssemblyHelper::validParams();
22 2224 : params.addParam<MooseFunctorName>(
23 2224 : "body_force_x", 0, "Body force for the momentum equation in the x-direction");
24 2224 : params.addParam<MooseFunctorName>(
25 2224 : "body_force_y", 0, "Body force for the momentum equation in the y-direction");
26 2224 : params.addParam<MooseFunctorName>(
27 2224 : "body_force_z", 0, "Body force for the momentum equation in the z-direction");
28 2224 : params.addParam<MooseFunctorName>(
29 : "pressure_mms_forcing_function",
30 2224 : 0,
31 : "A forcing function for the pressure (mass) equation for conducting MMS studies");
32 1112 : params.addClassDescription("Implements the steady incompressible Navier-Stokes equations for a "
33 : "hybridized discretization");
34 2224 : params.renameParam("variable", "u", "The x-component of velocity");
35 1112 : return params;
36 0 : }
37 :
38 556 : NavierStokesLHDGKernel::NavierStokesLHDGKernel(const InputParameters & parameters)
39 : : HDGKernel(parameters),
40 556 : NavierStokesLHDGAssemblyHelper(this, this, this, this, _fe_problem, _sys, _mesh, _tid),
41 : // body forces
42 556 : _body_force_x(getFunctor<Real>("body_force_x")),
43 1112 : _body_force_y(getFunctor<Real>("body_force_y")),
44 1112 : _body_force_z(getFunctor<Real>("body_force_z")),
45 1112 : _pressure_mms_forcing_function(getFunctor<Real>("pressure_mms_forcing_function")),
46 556 : _qrule_face(_assembly.qRuleFace()),
47 556 : _q_point_face(_assembly.qPointsFace()),
48 556 : _JxW_face(_assembly.JxWFace()),
49 556 : _normals(_assembly.normals()),
50 556 : _current_side(_assembly.side())
51 : {
52 556 : if (_mesh.dimension() > 2)
53 0 : mooseError("This class only supports 2D simulations at this time");
54 :
55 556 : _body_forces.push_back(&_body_force_x);
56 556 : _body_forces.push_back(&_body_force_y);
57 556 : _body_forces.push_back(&_body_force_z);
58 556 : }
59 :
60 : void
61 2893008 : NavierStokesLHDGKernel::computeResidual()
62 : {
63 2893008 : _grad_u_vel_re.resize(_qu_dof_indices.size());
64 2893008 : _grad_v_vel_re.resize(_qv_dof_indices.size());
65 2893008 : _u_vel_re.resize(_u_dof_indices.size());
66 2893008 : _v_vel_re.resize(_v_dof_indices.size());
67 2893008 : _p_re.resize(_p_dof_indices.size());
68 2893008 : _global_lm_re.resize(_global_lm_dof_indices ? _global_lm_dof_indices->size() : 0);
69 :
70 : // qu and u
71 2893008 : vectorVolumeResidual(_qu_sol, _u_sol, _JxW, *_qrule, _grad_u_vel_re);
72 2893008 : scalarVolumeResidual(
73 2893008 : _qu_sol, 0, _body_force_x, _JxW, *_qrule, _current_elem, _q_point, _u_vel_re);
74 :
75 : // qv and v
76 2893008 : vectorVolumeResidual(_qv_sol, _v_sol, _JxW, *_qrule, _grad_v_vel_re);
77 2893008 : scalarVolumeResidual(
78 2893008 : _qv_sol, 1, _body_force_y, _JxW, *_qrule, _current_elem, _q_point, _v_vel_re);
79 :
80 : // p
81 2893008 : pressureVolumeResidual(
82 2893008 : _pressure_mms_forcing_function, _JxW, *_qrule, _current_elem, _q_point, _p_re, _global_lm_re);
83 :
84 2893008 : addResiduals(_assembly, _grad_u_vel_re, _qu_dof_indices, _grad_u_var.scalingFactor());
85 2893008 : addResiduals(_assembly, _grad_v_vel_re, _qv_dof_indices, _grad_v_var.scalingFactor());
86 2893008 : addResiduals(_assembly, _u_vel_re, _u_dof_indices, _u_var.scalingFactor());
87 2893008 : addResiduals(_assembly, _v_vel_re, _v_dof_indices, _v_var.scalingFactor());
88 2893008 : addResiduals(_assembly, _p_re, _p_dof_indices, _pressure_var.scalingFactor());
89 2893008 : if (_global_lm_dof_indices)
90 1389808 : addResiduals(
91 1389808 : _assembly, _global_lm_re, *_global_lm_dof_indices, _enclosure_lm_var->scalingFactor());
92 2893008 : }
93 :
94 : void
95 825920 : NavierStokesLHDGKernel::computeJacobian()
96 : {
97 825920 : _grad_u_grad_u_jac.resize(_qu_dof_indices.size(), _qu_dof_indices.size());
98 825920 : _grad_v_grad_v_jac.resize(_qv_dof_indices.size(), _qv_dof_indices.size());
99 825920 : _grad_u_u_jac.resize(_qu_dof_indices.size(), _u_dof_indices.size());
100 825920 : _grad_v_v_jac.resize(_qv_dof_indices.size(), _v_dof_indices.size());
101 825920 : _u_grad_u_jac.resize(_u_dof_indices.size(), _qu_dof_indices.size());
102 825920 : _v_grad_v_jac.resize(_v_dof_indices.size(), _qv_dof_indices.size());
103 825920 : _u_u_jac.resize(_u_dof_indices.size(), _u_dof_indices.size());
104 825920 : _u_v_jac.resize(_u_dof_indices.size(), _v_dof_indices.size());
105 825920 : _v_u_jac.resize(_v_dof_indices.size(), _u_dof_indices.size());
106 825920 : _v_v_jac.resize(_v_dof_indices.size(), _v_dof_indices.size());
107 825920 : _u_p_jac.resize(_u_dof_indices.size(), _p_dof_indices.size());
108 825920 : _v_p_jac.resize(_v_dof_indices.size(), _p_dof_indices.size());
109 825920 : _p_u_jac.resize(_p_dof_indices.size(), _u_dof_indices.size());
110 825920 : _p_v_jac.resize(_p_dof_indices.size(), _v_dof_indices.size());
111 825920 : _p_global_lm_jac.resize(_p_dof_indices.size(),
112 825920 : _global_lm_dof_indices ? _global_lm_dof_indices->size() : 0);
113 825920 : _global_lm_p_jac.resize(_global_lm_dof_indices ? _global_lm_dof_indices->size() : 0,
114 825920 : _p_dof_indices.size());
115 :
116 : // qu and u
117 825920 : vectorVolumeJacobian(_JxW, *_qrule, _grad_u_grad_u_jac, _grad_u_u_jac);
118 825920 : scalarVolumeJacobian(0, _JxW, *_qrule, _u_grad_u_jac, _u_u_jac, _u_v_jac, _u_p_jac);
119 :
120 : // qv and v
121 825920 : vectorVolumeJacobian(_JxW, *_qrule, _grad_v_grad_v_jac, _grad_v_v_jac);
122 825920 : scalarVolumeJacobian(1, _JxW, *_qrule, _v_grad_v_jac, _v_u_jac, _v_v_jac, _v_p_jac);
123 :
124 : // p
125 825920 : pressureVolumeJacobian(_JxW, *_qrule, _p_u_jac, _p_v_jac, _p_global_lm_jac, _global_lm_p_jac);
126 :
127 825920 : addJacobian(
128 825920 : _assembly, _grad_u_grad_u_jac, _qu_dof_indices, _qu_dof_indices, _grad_u_var.scalingFactor());
129 825920 : addJacobian(
130 825920 : _assembly, _grad_v_grad_v_jac, _qv_dof_indices, _qv_dof_indices, _grad_v_var.scalingFactor());
131 825920 : addJacobian(
132 825920 : _assembly, _grad_u_u_jac, _qu_dof_indices, _u_dof_indices, _grad_u_var.scalingFactor());
133 825920 : addJacobian(
134 825920 : _assembly, _grad_v_v_jac, _qv_dof_indices, _v_dof_indices, _grad_v_var.scalingFactor());
135 825920 : addJacobian(_assembly, _u_grad_u_jac, _u_dof_indices, _qu_dof_indices, _u_var.scalingFactor());
136 825920 : addJacobian(_assembly, _v_grad_v_jac, _v_dof_indices, _qv_dof_indices, _v_var.scalingFactor());
137 825920 : addJacobian(_assembly, _u_u_jac, _u_dof_indices, _u_dof_indices, _u_var.scalingFactor());
138 825920 : addJacobian(_assembly, _u_v_jac, _u_dof_indices, _v_dof_indices, _u_var.scalingFactor());
139 825920 : addJacobian(_assembly, _v_u_jac, _v_dof_indices, _u_dof_indices, _v_var.scalingFactor());
140 825920 : addJacobian(_assembly, _v_v_jac, _v_dof_indices, _v_dof_indices, _v_var.scalingFactor());
141 825920 : addJacobian(_assembly, _u_p_jac, _u_dof_indices, _p_dof_indices, _u_var.scalingFactor());
142 825920 : addJacobian(_assembly, _v_p_jac, _v_dof_indices, _p_dof_indices, _v_var.scalingFactor());
143 825920 : addJacobian(_assembly, _p_u_jac, _p_dof_indices, _u_dof_indices, _pressure_var.scalingFactor());
144 825920 : addJacobian(_assembly, _p_v_jac, _p_dof_indices, _v_dof_indices, _pressure_var.scalingFactor());
145 825920 : if (_global_lm_dof_indices)
146 : {
147 365120 : addJacobian(_assembly,
148 : _p_global_lm_jac,
149 : _p_dof_indices,
150 : *_global_lm_dof_indices,
151 365120 : _pressure_var.scalingFactor());
152 365120 : addJacobian(_assembly,
153 : _global_lm_p_jac,
154 365120 : *_global_lm_dof_indices,
155 : _p_dof_indices,
156 365120 : _enclosure_lm_var->scalingFactor());
157 : }
158 825920 : }
159 :
160 : void
161 8525968 : NavierStokesLHDGKernel::computeResidualOnSide()
162 : {
163 8525968 : const Elem * const neigh = _current_elem->neighbor_ptr(_current_side);
164 :
165 8525968 : _grad_u_vel_re.resize(_qu_dof_indices.size());
166 8525968 : _u_vel_re.resize(_u_dof_indices.size());
167 8525968 : _lm_u_vel_re.resize(_lm_u_dof_indices.size());
168 8525968 : _grad_v_vel_re.resize(_qv_dof_indices.size());
169 8525968 : _v_vel_re.resize(_v_dof_indices.size());
170 8525968 : _lm_v_vel_re.resize(_lm_v_dof_indices.size());
171 8525968 : _p_re.resize(_p_dof_indices.size());
172 :
173 : // qu, u, lm_u
174 8525968 : vectorFaceResidual(_lm_u_sol, _JxW_face, *_qrule_face, _normals, _grad_u_vel_re);
175 8525968 : scalarFaceResidual(_qu_sol, _u_sol, _lm_u_sol, 0, _JxW_face, *_qrule_face, _normals, _u_vel_re);
176 8525968 : lmFaceResidual(
177 8525968 : _qu_sol, _u_sol, _lm_u_sol, 0, _JxW_face, *_qrule_face, _normals, neigh, _lm_u_vel_re);
178 :
179 : // qv, v, lm_v
180 8525968 : vectorFaceResidual(_lm_v_sol, _JxW_face, *_qrule_face, _normals, _grad_v_vel_re);
181 8525968 : scalarFaceResidual(_qv_sol, _v_sol, _lm_v_sol, 1, _JxW_face, *_qrule_face, _normals, _v_vel_re);
182 8525968 : lmFaceResidual(
183 8525968 : _qv_sol, _v_sol, _lm_v_sol, 1, _JxW_face, *_qrule_face, _normals, neigh, _lm_v_vel_re);
184 :
185 : // p
186 8525968 : pressureFaceResidual(_JxW_face, *_qrule_face, _normals, _p_re);
187 :
188 8525968 : addResiduals(_assembly, _grad_u_vel_re, _qu_dof_indices, _grad_u_var.scalingFactor());
189 8525968 : addResiduals(_assembly, _u_vel_re, _u_dof_indices, _u_var.scalingFactor());
190 8525968 : addResiduals(_assembly, _lm_u_vel_re, _lm_u_dof_indices, _u_face_var.scalingFactor());
191 8525968 : addResiduals(_assembly, _grad_v_vel_re, _qv_dof_indices, _grad_v_var.scalingFactor());
192 8525968 : addResiduals(_assembly, _v_vel_re, _v_dof_indices, _v_var.scalingFactor());
193 8525968 : addResiduals(_assembly, _lm_v_vel_re, _lm_v_dof_indices, _v_face_var.scalingFactor());
194 8525968 : addResiduals(_assembly, _p_re, _p_dof_indices, _pressure_var.scalingFactor());
195 8525968 : }
196 :
197 : void
198 2433440 : NavierStokesLHDGKernel::computeJacobianOnSide()
199 : {
200 2433440 : const Elem * const neigh = _current_elem->neighbor_ptr(_current_side);
201 :
202 2433440 : _grad_u_lm_u_jac.resize(_qu_dof_indices.size(), _lm_u_dof_indices.size());
203 2433440 : _u_grad_u_jac.resize(_u_dof_indices.size(), _qu_dof_indices.size());
204 2433440 : _u_u_jac.resize(_u_dof_indices.size(), _u_dof_indices.size());
205 2433440 : _u_lm_u_jac.resize(_u_dof_indices.size(), _lm_u_dof_indices.size());
206 2433440 : _u_lm_v_jac.resize(_u_dof_indices.size(), _lm_v_dof_indices.size());
207 2433440 : _u_p_jac.resize(_u_dof_indices.size(), _p_dof_indices.size());
208 2433440 : _lm_u_grad_u_jac.resize(_lm_u_dof_indices.size(), _qu_dof_indices.size());
209 2433440 : _lm_u_u_jac.resize(_lm_u_dof_indices.size(), _u_dof_indices.size());
210 2433440 : _lm_u_lm_u_jac.resize(_lm_u_dof_indices.size(), _lm_u_dof_indices.size());
211 2433440 : _lm_u_lm_v_jac.resize(_lm_u_dof_indices.size(), _lm_v_dof_indices.size());
212 2433440 : _lm_u_p_jac.resize(_lm_u_dof_indices.size(), _p_dof_indices.size());
213 2433440 : _grad_v_lm_v_jac.resize(_qv_dof_indices.size(), _lm_v_dof_indices.size());
214 2433440 : _v_grad_v_jac.resize(_v_dof_indices.size(), _qv_dof_indices.size());
215 2433440 : _v_v_jac.resize(_v_dof_indices.size(), _v_dof_indices.size());
216 2433440 : _v_lm_u_jac.resize(_v_dof_indices.size(), _lm_u_dof_indices.size());
217 2433440 : _v_lm_v_jac.resize(_v_dof_indices.size(), _lm_v_dof_indices.size());
218 2433440 : _v_p_jac.resize(_v_dof_indices.size(), _p_dof_indices.size());
219 2433440 : _lm_v_grad_v_jac.resize(_lm_v_dof_indices.size(), _qv_dof_indices.size());
220 2433440 : _lm_v_v_jac.resize(_lm_v_dof_indices.size(), _v_dof_indices.size());
221 2433440 : _lm_v_lm_u_jac.resize(_lm_v_dof_indices.size(), _lm_u_dof_indices.size());
222 2433440 : _lm_v_lm_v_jac.resize(_lm_v_dof_indices.size(), _lm_v_dof_indices.size());
223 2433440 : _lm_v_p_jac.resize(_lm_v_dof_indices.size(), _p_dof_indices.size());
224 2433440 : _p_lm_u_jac.resize(_p_dof_indices.size(), _lm_u_dof_indices.size());
225 2433440 : _p_lm_v_jac.resize(_p_dof_indices.size(), _lm_v_dof_indices.size());
226 :
227 : // qu, u, lm_u
228 2433440 : vectorFaceJacobian(_JxW_face, *_qrule_face, _normals, _grad_u_lm_u_jac);
229 2433440 : scalarFaceJacobian(0,
230 : _JxW_face,
231 2433440 : *_qrule_face,
232 : _normals,
233 : _u_grad_u_jac,
234 : _u_u_jac,
235 : _u_lm_u_jac,
236 : _u_p_jac,
237 : _u_lm_u_jac,
238 : _u_lm_v_jac);
239 2433440 : lmFaceJacobian(0,
240 : _JxW_face,
241 2433440 : *_qrule_face,
242 : _normals,
243 : neigh,
244 : _lm_u_grad_u_jac,
245 : _lm_u_u_jac,
246 : _lm_u_lm_u_jac,
247 : _lm_u_p_jac,
248 : _lm_u_lm_u_jac,
249 : _lm_u_lm_v_jac);
250 :
251 : // qv, v, lm_v
252 2433440 : vectorFaceJacobian(_JxW_face, *_qrule_face, _normals, _grad_v_lm_v_jac);
253 2433440 : scalarFaceJacobian(1,
254 : _JxW_face,
255 2433440 : *_qrule_face,
256 : _normals,
257 : _v_grad_v_jac,
258 : _v_v_jac,
259 : _v_lm_v_jac,
260 : _v_p_jac,
261 : _v_lm_u_jac,
262 : _v_lm_v_jac);
263 2433440 : lmFaceJacobian(1,
264 : _JxW_face,
265 2433440 : *_qrule_face,
266 : _normals,
267 : neigh,
268 : _lm_v_grad_v_jac,
269 : _lm_v_v_jac,
270 : _lm_v_lm_v_jac,
271 : _lm_v_p_jac,
272 : _lm_v_lm_u_jac,
273 : _lm_v_lm_v_jac);
274 :
275 : // p
276 2433440 : pressureFaceJacobian(_JxW_face, *_qrule_face, _normals, _p_lm_u_jac, _p_lm_v_jac);
277 :
278 2433440 : addJacobian(
279 2433440 : _assembly, _grad_u_lm_u_jac, _qu_dof_indices, _lm_u_dof_indices, _grad_u_var.scalingFactor());
280 2433440 : addJacobian(_assembly, _u_grad_u_jac, _u_dof_indices, _qu_dof_indices, _u_var.scalingFactor());
281 2433440 : addJacobian(_assembly, _u_u_jac, _u_dof_indices, _u_dof_indices, _u_var.scalingFactor());
282 2433440 : addJacobian(_assembly, _u_lm_u_jac, _u_dof_indices, _lm_u_dof_indices, _u_var.scalingFactor());
283 2433440 : addJacobian(_assembly, _u_lm_v_jac, _u_dof_indices, _lm_v_dof_indices, _u_var.scalingFactor());
284 2433440 : addJacobian(_assembly, _u_p_jac, _u_dof_indices, _p_dof_indices, _u_var.scalingFactor());
285 2433440 : addJacobian(
286 2433440 : _assembly, _lm_u_grad_u_jac, _lm_u_dof_indices, _qu_dof_indices, _u_face_var.scalingFactor());
287 2433440 : addJacobian(
288 2433440 : _assembly, _lm_u_u_jac, _lm_u_dof_indices, _u_dof_indices, _u_face_var.scalingFactor());
289 2433440 : addJacobian(
290 2433440 : _assembly, _lm_u_lm_u_jac, _lm_u_dof_indices, _lm_u_dof_indices, _u_face_var.scalingFactor());
291 2433440 : addJacobian(
292 2433440 : _assembly, _lm_u_lm_v_jac, _lm_u_dof_indices, _lm_v_dof_indices, _u_face_var.scalingFactor());
293 2433440 : addJacobian(
294 2433440 : _assembly, _lm_u_p_jac, _lm_u_dof_indices, _p_dof_indices, _u_face_var.scalingFactor());
295 2433440 : addJacobian(
296 2433440 : _assembly, _grad_v_lm_v_jac, _qv_dof_indices, _lm_v_dof_indices, _grad_v_var.scalingFactor());
297 2433440 : addJacobian(_assembly, _v_grad_v_jac, _v_dof_indices, _qv_dof_indices, _v_var.scalingFactor());
298 2433440 : addJacobian(_assembly, _v_v_jac, _v_dof_indices, _v_dof_indices, _v_var.scalingFactor());
299 2433440 : addJacobian(_assembly, _v_lm_u_jac, _v_dof_indices, _lm_u_dof_indices, _v_var.scalingFactor());
300 2433440 : addJacobian(_assembly, _v_lm_v_jac, _v_dof_indices, _lm_v_dof_indices, _v_var.scalingFactor());
301 2433440 : addJacobian(_assembly, _v_p_jac, _v_dof_indices, _p_dof_indices, _v_var.scalingFactor());
302 2433440 : addJacobian(
303 2433440 : _assembly, _lm_v_grad_v_jac, _lm_v_dof_indices, _qv_dof_indices, _v_face_var.scalingFactor());
304 2433440 : addJacobian(
305 2433440 : _assembly, _lm_v_v_jac, _lm_v_dof_indices, _v_dof_indices, _v_face_var.scalingFactor());
306 2433440 : addJacobian(
307 2433440 : _assembly, _lm_v_lm_u_jac, _lm_v_dof_indices, _lm_u_dof_indices, _v_face_var.scalingFactor());
308 2433440 : addJacobian(
309 2433440 : _assembly, _lm_v_lm_v_jac, _lm_v_dof_indices, _lm_v_dof_indices, _v_face_var.scalingFactor());
310 2433440 : addJacobian(
311 2433440 : _assembly, _lm_v_p_jac, _lm_v_dof_indices, _p_dof_indices, _v_face_var.scalingFactor());
312 2433440 : addJacobian(
313 2433440 : _assembly, _p_lm_u_jac, _p_dof_indices, _lm_u_dof_indices, _pressure_var.scalingFactor());
314 2433440 : addJacobian(
315 2433440 : _assembly, _p_lm_v_jac, _p_dof_indices, _lm_v_dof_indices, _pressure_var.scalingFactor());
316 2433440 : }
317 :
318 : void
319 556 : NavierStokesLHDGKernel::initialSetup()
320 : {
321 : // This check must occur after FEProblemBase::init()
322 556 : checkCoupling();
323 556 : }
324 :
325 : void
326 1988 : NavierStokesLHDGKernel::jacobianSetup()
327 : {
328 1988 : _cached_elem = nullptr;
329 1988 : }
330 :
331 : void
332 5781440 : NavierStokesLHDGKernel::computeOffDiagJacobian(const unsigned int)
333 : {
334 5781440 : if (_cached_elem != _current_elem)
335 : {
336 825920 : computeJacobian();
337 825920 : _cached_elem = _current_elem;
338 : }
339 5781440 : }
340 :
341 : std::set<std::string>
342 556 : NavierStokesLHDGKernel::additionalROVariables()
343 : {
344 556 : std::set<std::string> covered_vars = {_grad_u_var.name(),
345 556 : _u_face_var.name(),
346 556 : _v_var.name(),
347 556 : _grad_v_var.name(),
348 556 : _v_face_var.name(),
349 3892 : _pressure_var.name()};
350 556 : if (_enclosure_lm_var)
351 278 : covered_vars.insert(_enclosure_lm_var->name());
352 556 : return covered_vars;
353 556 : }
|