34 #include "libmesh/quadrature.h"
50 #ifdef GRINS_USE_GRVY_TIMERS
51 this->_timer->BeginTimer(
"IncompressibleNavierStokesAdjointStabilization::element_time_derivative");
55 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
56 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
59 const std::vector<libMesh::Real> &JxW =
60 context.get_element_fe(this->_flow_vars.u())->get_JxW();
62 const std::vector<std::vector<libMesh::RealGradient> >& p_gradphi =
63 context.get_element_fe(this->_press_var.p())->get_dphi();
65 const std::vector<std::vector<libMesh::Real> >& u_phi =
66 context.get_element_fe(this->_flow_vars.u())->get_phi();
68 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
69 context.get_element_fe(this->_flow_vars.u())->get_dphi();
71 const std::vector<std::vector<libMesh::RealTensor> >& u_hessphi =
72 context.get_element_fe(this->_flow_vars.u())->get_d2phi();
74 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_flow_vars.u());
75 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_flow_vars.v());
76 libMesh::DenseSubMatrix<libMesh::Number> &Kup =
77 context.get_elem_jacobian(this->_flow_vars.u(), this->_press_var.p());
78 libMesh::DenseSubMatrix<libMesh::Number> &Kuu =
79 context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.u());
80 libMesh::DenseSubMatrix<libMesh::Number> &Kuv =
81 context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.v());
82 libMesh::DenseSubMatrix<libMesh::Number> &Kvp =
83 context.get_elem_jacobian(this->_flow_vars.v(), this->_press_var.p());
84 libMesh::DenseSubMatrix<libMesh::Number> &Kvu =
85 context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.u());
86 libMesh::DenseSubMatrix<libMesh::Number> &Kvv =
87 context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.v());
89 libMesh::DenseSubVector<libMesh::Number> *Fw = NULL;
90 libMesh::DenseSubMatrix<libMesh::Number> *Kuw = NULL;
91 libMesh::DenseSubMatrix<libMesh::Number> *Kvw = NULL;
92 libMesh::DenseSubMatrix<libMesh::Number> *Kwp = NULL;
93 libMesh::DenseSubMatrix<libMesh::Number> *Kwu = NULL;
94 libMesh::DenseSubMatrix<libMesh::Number> *Kwv = NULL;
95 libMesh::DenseSubMatrix<libMesh::Number> *Kww = NULL;
99 Fw = &context.get_elem_residual(this->_flow_vars.w());
100 Kuw = &context.get_elem_jacobian
101 (this->_flow_vars.u(), this->_flow_vars.w());
102 Kvw = &context.get_elem_jacobian
103 (this->_flow_vars.v(), this->_flow_vars.w());
104 Kwp = &context.get_elem_jacobian
105 (this->_flow_vars.w(), this->_press_var.p());
106 Kwu = &context.get_elem_jacobian
107 (this->_flow_vars.w(), this->_flow_vars.u());
108 Kwv = &context.get_elem_jacobian
109 (this->_flow_vars.w(), this->_flow_vars.v());
110 Kww = &context.get_elem_jacobian
111 (this->_flow_vars.w(), this->_flow_vars.w());
114 unsigned int n_qpoints = context.get_element_qrule().n_points();
116 libMesh::FEBase* fe = context.get_element_fe(this->_flow_vars.u());
118 for (
unsigned int qp=0; qp != n_qpoints; qp++)
120 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
121 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
123 libMesh::RealGradient U( context.interior_value( this->_flow_vars.u(), qp ),
124 context.interior_value( this->_flow_vars.v(), qp ) );
125 if( this->_dim == 3 )
127 U(2) = context.interior_value( this->_flow_vars.w(), qp );
138 libMesh::Real tau_M, tau_C;
139 libMesh::Real d_tau_M_d_rho, d_tau_C_d_rho;
140 libMesh::Gradient d_tau_M_dU, d_tau_C_dU;
141 libMesh::Gradient RM_s, d_RM_s_uvw_dgraduvw;
143 libMesh::Tensor d_RC_dgradU,
144 d_RM_s_dgradp, d_RM_s_dU, d_RM_s_uvw_dhessuvw;
147 libMesh::Real _mu_qp = this->_mu(context, qp);
149 if (compute_jacobian)
151 this->_stab_helper.compute_tau_momentum_and_derivs
152 ( context, qp, g, G, this->_rho, U, _mu_qp,
153 tau_M, d_tau_M_d_rho, d_tau_M_dU,
155 this->_stab_helper.compute_tau_continuity_and_derivs
156 ( tau_M, d_tau_M_d_rho, d_tau_M_dU,
158 tau_C, d_tau_C_d_rho, d_tau_C_dU );
159 this->_stab_helper.compute_res_momentum_steady_and_derivs
160 ( context, qp, this->_rho, _mu_qp,
161 RM_s, d_RM_s_dgradp, d_RM_s_dU, d_RM_s_uvw_dgraduvw,
162 d_RM_s_uvw_dhessuvw);
163 this->_stab_helper.compute_res_continuity_and_derivs
164 ( context, qp, RC, d_RC_dgradU );
168 tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, this->_rho, U, _mu_qp, this->_is_steady );
169 tau_C = this->_stab_helper.compute_tau_continuity( tau_M, g );
170 RM_s = this->_stab_helper.compute_res_momentum_steady( context, qp, this->_rho, _mu_qp );
171 RC = this->_stab_helper.compute_res_continuity( context, qp );
174 for (
unsigned int i=0; i != n_u_dofs; i++)
176 libMesh::Real test_func = this->_rho*U*u_gradphi[i][qp] +
177 _mu_qp*( u_hessphi[i][qp](0,0) + u_hessphi[i][qp](1,1) + u_hessphi[i][qp](2,2) );
178 libMesh::Gradient d_test_func_dU = this->_rho*u_gradphi[i][qp];
182 Fu(i) += ( -tau_M*RM_s(0)*test_func - tau_C*RC*u_gradphi[i][qp](0) )*JxW[qp];
184 Fv(i) += ( -tau_M*RM_s(1)*test_func - tau_C*RC*u_gradphi[i][qp](1) )*JxW[qp];
188 (*Fw)(i) += ( -tau_M*RM_s(2)*test_func - tau_C*RC*u_gradphi[i][qp](2) )*JxW[qp];
191 if (compute_jacobian)
193 const libMesh::Real fixed_deriv =
194 context.get_fixed_solution_derivative();
195 for (
unsigned int j=0; j != n_p_dofs; j++)
197 Kup(i,j) += ( -tau_M*
198 ( d_RM_s_dgradp(0,0) *
199 p_gradphi[j][qp](0) +
201 p_gradphi[j][qp](1) +
204 )*test_func)*fixed_deriv*JxW[qp];
205 Kvp(i,j) += ( -tau_M*
206 ( d_RM_s_dgradp(1,0) *
207 p_gradphi[j][qp](0) +
209 p_gradphi[j][qp](1) +
212 )*test_func)*fixed_deriv*JxW[qp];
214 for (
unsigned int j=0; j != n_u_dofs; j++)
216 Kuu(i,j) += ( -d_tau_M_dU(0)*RM_s(0)*test_func
217 -tau_M*d_RM_s_dU(0,0)*test_func
218 - d_tau_C_dU(0)*RC*u_gradphi[i][qp](0)
219 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
220 Kuu(i,j) += ( -tau_M*RM_s(0)*d_test_func_dU(0)
221 )*u_phi[j][qp]*JxW[qp];
222 Kuu(i,j) += ( - tau_C*
224 d_RC_dgradU(0,0)*u_gradphi[j][qp](0) +
225 d_RC_dgradU(0,1)*u_gradphi[j][qp](1) +
226 d_RC_dgradU(0,2)*u_gradphi[j][qp](2)
228 *fixed_deriv*u_gradphi[i][qp](0)
230 Kuu(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dgraduvw*u_gradphi[j][qp])
231 )*fixed_deriv*JxW[qp];
232 Kuu(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dhessuvw.contract(u_hessphi[j][qp]))
233 )*fixed_deriv*JxW[qp];
234 Kuv(i,j) += ( -d_tau_M_dU(1)*RM_s(0)*test_func
235 -tau_M*d_RM_s_dU(0,1)*test_func
236 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
237 Kuv(i,j) += ( -tau_M*RM_s(0)*d_test_func_dU(1)
238 )*u_phi[j][qp]*JxW[qp];
239 Kuv(i,j) += ( - tau_C*
241 d_RC_dgradU(1,0)*u_gradphi[j][qp](0) +
242 d_RC_dgradU(1,1)*u_gradphi[j][qp](1) +
243 d_RC_dgradU(1,2)*u_gradphi[j][qp](2)
245 *fixed_deriv*u_gradphi[i][qp](0)
247 Kvu(i,j) += ( -d_tau_M_dU(0)*RM_s(1)*test_func
248 -tau_M*d_RM_s_dU(1,0)*test_func
249 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
250 Kvu(i,j) += ( -tau_M*RM_s(1)*d_test_func_dU(0)
251 )*u_phi[j][qp]*JxW[qp];
252 Kvu(i,j) += ( - tau_C*
254 d_RC_dgradU(0,0)*u_gradphi[j][qp](0) +
255 d_RC_dgradU(0,1)*u_gradphi[j][qp](1) +
256 d_RC_dgradU(0,2)*u_gradphi[j][qp](2)
258 *fixed_deriv*u_gradphi[i][qp](1)
260 Kvv(i,j) += ( -d_tau_M_dU(1)*RM_s(1)*test_func
261 -tau_M*d_RM_s_dU(1,1)*test_func
262 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
263 Kvv(i,j) += ( -tau_M*RM_s(1)*d_test_func_dU(1)
264 )*u_phi[j][qp]*JxW[qp];
265 Kvv(i,j) += ( - tau_C*
267 d_RC_dgradU(1,0)*u_gradphi[j][qp](0) +
268 d_RC_dgradU(1,1)*u_gradphi[j][qp](1) +
269 d_RC_dgradU(1,2)*u_gradphi[j][qp](2)
271 *fixed_deriv*u_gradphi[i][qp](1)
273 Kvv(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dgraduvw*u_gradphi[j][qp])
274 )*fixed_deriv*JxW[qp];
275 Kvv(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dhessuvw.contract(u_hessphi[j][qp]))
276 )*fixed_deriv*JxW[qp];
280 for (
unsigned int j=0; j != n_p_dofs; j++)
282 (*Kwp)(i,j) += ( -tau_M*
283 ( d_RM_s_dgradp(2,0) *
284 p_gradphi[j][qp](0) +
286 p_gradphi[j][qp](1) +
289 )*test_func)*fixed_deriv*JxW[qp];
291 for (
unsigned int j=0; j != n_u_dofs; j++)
293 (*Kuw)(i,j) += ( -d_tau_M_dU(2)*RM_s(0)*test_func
294 -tau_M*d_RM_s_dU(0,2)*test_func
295 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
296 (*Kuw)(i,j) += ( -tau_M*RM_s(0)*d_test_func_dU(2)
297 )*u_phi[j][qp]*JxW[qp];
298 (*Kuw)(i,j) += ( - tau_C*
300 d_RC_dgradU(2,0)*u_gradphi[j][qp](0) +
301 d_RC_dgradU(2,1)*u_gradphi[j][qp](1) +
302 d_RC_dgradU(2,2)*u_gradphi[j][qp](2)
304 *fixed_deriv* u_gradphi[i][qp](0)
306 (*Kvw)(i,j) += ( -d_tau_M_dU(2)*RM_s(1)*test_func
307 -tau_M*d_RM_s_dU(1,2)*test_func
308 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
309 (*Kvw)(i,j) += ( -tau_M*RM_s(1)*d_test_func_dU(2)
310 )*u_phi[j][qp]*JxW[qp];
311 (*Kvw)(i,j) += ( - tau_C*
313 d_RC_dgradU(2,0)*u_gradphi[j][qp](0) +
314 d_RC_dgradU(2,1)*u_gradphi[j][qp](1) +
315 d_RC_dgradU(2,2)*u_gradphi[j][qp](2)
317 *fixed_deriv* u_gradphi[i][qp](1)
319 (*Kwu)(i,j) += ( -d_tau_M_dU(0)*RM_s(2)*test_func
320 -tau_M*d_RM_s_dU(2,0)*test_func
321 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
322 (*Kwu)(i,j) += ( -tau_M*RM_s(2)*d_test_func_dU(0)
323 )*u_phi[j][qp]*JxW[qp];
324 (*Kwu)(i,j) += ( - tau_C*
326 d_RC_dgradU(0,0)*u_gradphi[j][qp](0) +
327 d_RC_dgradU(0,1)*u_gradphi[j][qp](1) +
328 d_RC_dgradU(0,2)*u_gradphi[j][qp](2)
330 *fixed_deriv* u_gradphi[i][qp](2)
332 (*Kwv)(i,j) += ( -d_tau_M_dU(1)*RM_s(2)*test_func
333 -tau_M*d_RM_s_dU(2,1)*test_func
334 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
335 (*Kwv)(i,j) += ( -tau_M*RM_s(2)*d_test_func_dU(1)
336 )*u_phi[j][qp]*JxW[qp];
337 (*Kwv)(i,j) += ( - tau_C*
339 d_RC_dgradU(1,0)*u_gradphi[j][qp](0) +
340 d_RC_dgradU(1,1)*u_gradphi[j][qp](1) +
341 d_RC_dgradU(1,2)*u_gradphi[j][qp](2)
343 *fixed_deriv* u_gradphi[i][qp](2)
345 (*Kww)(i,j) += ( -d_tau_M_dU(2)*RM_s(2)*test_func
346 -tau_M*d_RM_s_dU(2,2)*test_func
347 )*fixed_deriv*u_phi[j][qp]*JxW[qp];
348 (*Kww)(i,j) += ( -tau_M*RM_s(2)*d_test_func_dU(2)
349 )*u_phi[j][qp]*JxW[qp];
350 (*Kww)(i,j) += ( - tau_C*
352 d_RC_dgradU(2,0)*u_gradphi[j][qp](0) +
353 d_RC_dgradU(2,1)*u_gradphi[j][qp](1) +
354 d_RC_dgradU(2,2)*u_gradphi[j][qp](2)
356 *fixed_deriv* u_gradphi[i][qp](2)
358 (*Kww)(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dgraduvw*u_gradphi[j][qp])
359 )*fixed_deriv*JxW[qp];
360 (*Kww)(i,j) += ( -tau_M*test_func*(d_RM_s_uvw_dhessuvw.contract(u_hessphi[j][qp]))
361 )*fixed_deriv*JxW[qp];
369 #ifdef GRINS_USE_GRVY_TIMERS
370 this->_timer->EndTimer(
"IncompressibleNavierStokesAdjointStabilization::element_time_derivative");
380 #ifdef GRINS_USE_GRVY_TIMERS
381 this->_timer->BeginTimer(
"IncompressibleNavierStokesAdjointStabilization::element_constraint");
385 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
386 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
389 const std::vector<libMesh::Real> &JxW =
390 context.get_element_fe(this->_flow_vars.u())->get_JxW();
393 const std::vector<std::vector<libMesh::RealGradient> >& p_dphi =
394 context.get_element_fe(this->_press_var.p())->get_dphi();
397 const std::vector<std::vector<libMesh::Real> >& u_phi =
398 context.get_element_fe(this->_flow_vars.u())->get_phi();
400 const std::vector<std::vector<libMesh::RealGradient> >& u_dphi =
401 context.get_element_fe(this->_flow_vars.u())->get_dphi();
403 const std::vector<std::vector<libMesh::RealTensor> >& u_d2phi =
404 context.get_element_fe(this->_flow_vars.u())->get_d2phi();
406 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_press_var.p());
408 libMesh::DenseSubMatrix<libMesh::Number> &Kpp =
409 context.get_elem_jacobian(this->_press_var.p(), this->_press_var.p());
410 libMesh::DenseSubMatrix<libMesh::Number> &Kpu =
411 context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.u());
412 libMesh::DenseSubMatrix<libMesh::Number> &Kpv =
413 context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.v());
414 libMesh::DenseSubMatrix<libMesh::Number> *Kpw = NULL;
418 Kpw = &context.get_elem_jacobian
419 (this->_press_var.p(), this->_flow_vars.w());
422 unsigned int n_qpoints = context.get_element_qrule().n_points();
424 libMesh::FEBase* fe = context.get_element_fe(this->_flow_vars.u());
426 for (
unsigned int qp=0; qp != n_qpoints; qp++)
428 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
429 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
431 libMesh::RealGradient U( context.interior_value( this->_flow_vars.u(), qp ),
432 context.interior_value( this->_flow_vars.v(), qp ) );
433 if( this->_dim == 3 )
435 U(2) = context.interior_value( this->_flow_vars.w(), qp );
439 libMesh::Real d_tau_M_d_rho;
440 libMesh::Gradient d_tau_M_dU;
441 libMesh::Gradient RM_s, d_RM_s_uvw_dgraduvw;
442 libMesh::Tensor d_RM_s_dgradp, d_RM_s_dU, d_RM_s_uvw_dhessuvw;
445 libMesh::Real _mu_qp = this->_mu(context, qp);
447 if (compute_jacobian)
449 this->_stab_helper.compute_tau_momentum_and_derivs
450 ( context, qp, g, G, this->_rho, U, _mu_qp,
451 tau_M, d_tau_M_d_rho, d_tau_M_dU,
453 this->_stab_helper.compute_res_momentum_steady_and_derivs
454 ( context, qp, this->_rho, _mu_qp,
455 RM_s, d_RM_s_dgradp, d_RM_s_dU, d_RM_s_uvw_dgraduvw,
456 d_RM_s_uvw_dhessuvw);
460 tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, this->_rho, U, _mu_qp, this->_is_steady );
461 RM_s = this->_stab_helper.compute_res_momentum_steady( context, qp, this->_rho, _mu_qp );
466 for (
unsigned int i=0; i != n_p_dofs; i++)
468 Fp(i) += tau_M*(RM_s*p_dphi[i][qp])*JxW[qp];
470 if (compute_jacobian)
472 const libMesh::Real fixed_deriv =
473 context.get_fixed_solution_derivative();
475 const libMesh::TypeVector<libMesh::Number>
476 p_dphiiT_d_RM_s_dgradp =
477 d_RM_s_dgradp.transpose() * p_dphi[i][qp];
479 for (
unsigned int j=0; j != n_p_dofs; j++)
481 Kpp(i,j) += tau_M*(p_dphiiT_d_RM_s_dgradp*p_dphi[j][qp])*JxW[qp];
484 for (
unsigned int j=0; j != n_u_dofs; j++)
487 d_tau_M_dU(0)*u_phi[j][qp]*(RM_s*p_dphi[i][qp])
490 d_RM_s_dU(0,0)*u_phi[j][qp]*p_dphi[i][qp](0) +
491 d_RM_s_dU(1,0)*u_phi[j][qp]*p_dphi[i][qp](1) +
492 d_RM_s_dU(2,0)*u_phi[j][qp]*p_dphi[i][qp](2) +
493 d_RM_s_uvw_dgraduvw*u_dphi[j][qp]*p_dphi[i][qp](0) +
494 d_RM_s_uvw_dhessuvw.contract(u_d2phi[j][qp])*p_dphi[i][qp](0)
498 d_tau_M_dU(1)*u_phi[j][qp]*(RM_s*p_dphi[i][qp])
501 d_RM_s_dU(0,1)*u_phi[j][qp]*p_dphi[i][qp](0) +
502 d_RM_s_dU(1,1)*u_phi[j][qp]*p_dphi[i][qp](1) +
503 d_RM_s_dU(2,1)*u_phi[j][qp]*p_dphi[i][qp](2) +
504 d_RM_s_uvw_dgraduvw*u_dphi[j][qp]*p_dphi[i][qp](1) +
505 d_RM_s_uvw_dhessuvw.contract(u_d2phi[j][qp])*p_dphi[i][qp](0)
512 for (
unsigned int j=0; j != n_u_dofs; j++)
515 d_tau_M_dU(2)*u_phi[j][qp]*(RM_s*p_dphi[i][qp])
518 d_RM_s_dU(0,2)*u_phi[j][qp]*p_dphi[i][qp](0) +
519 d_RM_s_dU(1,2)*u_phi[j][qp]*p_dphi[i][qp](1) +
520 d_RM_s_dU(2,2)*u_phi[j][qp]*p_dphi[i][qp](2) +
521 d_RM_s_uvw_dgraduvw*u_dphi[j][qp]*p_dphi[i][qp](2) +
522 d_RM_s_uvw_dhessuvw.contract(u_d2phi[j][qp])*p_dphi[i][qp](0)
531 #ifdef GRINS_USE_GRVY_TIMERS
532 this->_timer->EndTimer(
"IncompressibleNavierStokesAdjointStabilization::element_constraint");
543 #ifdef GRINS_USE_GRVY_TIMERS
544 this->_timer->BeginTimer(
"IncompressibleNavierStokesAdjointStabilization::mass_residual");
548 const unsigned int n_p_dofs = context.get_dof_indices(this->_press_var.p()).size();
549 const unsigned int n_u_dofs = context.get_dof_indices(this->_flow_vars.u()).size();
552 const std::vector<libMesh::Real> &JxW =
553 context.get_element_fe(this->_flow_vars.u())->get_JxW();
556 const std::vector<std::vector<libMesh::RealGradient> >& p_dphi =
557 context.get_element_fe(this->_press_var.p())->get_dphi();
559 const std::vector<std::vector<libMesh::Real> >& u_phi =
560 context.get_element_fe(this->_flow_vars.u())->get_phi();
562 const std::vector<std::vector<libMesh::RealGradient> >& u_gradphi =
563 context.get_element_fe(this->_flow_vars.u())->get_dphi();
565 const std::vector<std::vector<libMesh::RealTensor> >& u_hessphi =
566 context.get_element_fe(this->_flow_vars.u())->get_d2phi();
568 libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_flow_vars.u());
569 libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_flow_vars.v());
570 libMesh::DenseSubVector<libMesh::Number> *Fw = NULL;
572 libMesh::DenseSubVector<libMesh::Number> &Fp = context.get_elem_residual(this->_press_var.p());
574 libMesh::DenseSubMatrix<libMesh::Number> &Kuu =
575 context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.u());
576 libMesh::DenseSubMatrix<libMesh::Number> &Kuv =
577 context.get_elem_jacobian(this->_flow_vars.u(), this->_flow_vars.v());
578 libMesh::DenseSubMatrix<libMesh::Number> &Kvu =
579 context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.u());
580 libMesh::DenseSubMatrix<libMesh::Number> &Kvv =
581 context.get_elem_jacobian(this->_flow_vars.v(), this->_flow_vars.v());
583 libMesh::DenseSubMatrix<libMesh::Number> *Kuw = NULL;
584 libMesh::DenseSubMatrix<libMesh::Number> *Kvw = NULL;
585 libMesh::DenseSubMatrix<libMesh::Number> *Kwu = NULL;
586 libMesh::DenseSubMatrix<libMesh::Number> *Kwv = NULL;
587 libMesh::DenseSubMatrix<libMesh::Number> *Kww = NULL;
589 libMesh::DenseSubMatrix<libMesh::Number> &Kpu =
590 context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.u());
591 libMesh::DenseSubMatrix<libMesh::Number> &Kpv =
592 context.get_elem_jacobian(this->_press_var.p(), this->_flow_vars.v());
593 libMesh::DenseSubMatrix<libMesh::Number> *Kpw = NULL;
597 Fw = &context.get_elem_residual(this->_flow_vars.w());
599 Kuw = &context.get_elem_jacobian
600 (this->_flow_vars.u(), this->_flow_vars.w());
601 Kvw = &context.get_elem_jacobian
602 (this->_flow_vars.v(), this->_flow_vars.w());
603 Kwu = &context.get_elem_jacobian
604 (this->_flow_vars.w(), this->_flow_vars.u());
605 Kwv = &context.get_elem_jacobian
606 (this->_flow_vars.w(), this->_flow_vars.v());
607 Kww = &context.get_elem_jacobian
608 (this->_flow_vars.w(), this->_flow_vars.w());
610 Kpw = &context.get_elem_jacobian
611 (this->_press_var.p(), this->_flow_vars.w());
614 unsigned int n_qpoints = context.get_element_qrule().n_points();
616 for (
unsigned int qp=0; qp != n_qpoints; qp++)
618 libMesh::FEBase* fe = context.get_element_fe(this->_flow_vars.u());
620 libMesh::RealGradient g = this->_stab_helper.compute_g( fe, context, qp );
621 libMesh::RealTensor G = this->_stab_helper.compute_G( fe, context, qp );
623 libMesh::RealGradient U( context.fixed_interior_value( this->_flow_vars.u(), qp ),
624 context.fixed_interior_value( this->_flow_vars.v(), qp ) );
625 if( this->_dim == 3 )
627 U(2) = context.fixed_interior_value( this->_flow_vars.w(), qp );
640 libMesh::Real d_tau_M_d_rho;
642 libMesh::Gradient d_tau_M_dU;
644 libMesh::RealGradient RM_t;
646 libMesh::Real d_RM_t_uvw_duvw;
649 libMesh::Real _mu_qp = this->_mu(context, qp);
651 if (compute_jacobian)
653 this->_stab_helper.compute_tau_momentum_and_derivs
654 ( context, qp, g, G, this->_rho, U, _mu_qp,
655 tau_M, d_tau_M_d_rho, d_tau_M_dU,
657 this->_stab_helper.compute_res_momentum_transient_and_derivs
658 ( context, qp, this->_rho,
659 RM_t, d_RM_t_uvw_duvw );
663 tau_M = this->_stab_helper.compute_tau_momentum( context, qp, g, G, this->_rho, U, _mu_qp,
false );
664 RM_t = this->_stab_helper.compute_res_momentum_transient( context, qp, this->_rho );
670 for (
unsigned int i=0; i != n_p_dofs; i++)
672 Fp(i) -= tau_M*RM_t*p_dphi[i][qp]*JxW[qp];
674 if (compute_jacobian)
676 const libMesh::Real fixed_deriv =
677 context.get_fixed_solution_derivative();
679 for (
unsigned int j=0; j != n_u_dofs; j++)
681 Kpu(i,j) -= d_tau_M_dU(0)*u_phi[j][qp]*RM_t*p_dphi[i][qp]*fixed_deriv*JxW[qp];
682 Kpu(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*p_dphi[i][qp](0)*fixed_deriv*JxW[qp];
684 Kpv(i,j) -= d_tau_M_dU(1)*u_phi[j][qp]*RM_t*p_dphi[i][qp]*fixed_deriv*JxW[qp];
685 Kpv(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*p_dphi[i][qp](1)*fixed_deriv*JxW[qp];
690 for (
unsigned int j=0; j != n_u_dofs; j++)
692 (*Kpw)(i,j) -= d_tau_M_dU(2)*u_phi[j][qp]*RM_t*p_dphi[i][qp]*fixed_deriv*JxW[qp];
693 (*Kpw)(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*p_dphi[i][qp](2)*fixed_deriv*JxW[qp];
699 for (
unsigned int i=0; i != n_u_dofs; i++)
701 libMesh::Real test_func = this->_rho*U*u_gradphi[i][qp] +
702 _mu_qp*( u_hessphi[i][qp](0,0) + u_hessphi[i][qp](1,1) + u_hessphi[i][qp](2,2) );
703 libMesh::Gradient d_test_func_dU = this->_rho*u_gradphi[i][qp];
707 Fu(i) -= tau_M*RM_t(0)*test_func*JxW[qp];
709 Fv(i) -= tau_M*RM_t(1)*test_func*JxW[qp];
713 (*Fw)(i) -= tau_M*RM_t(2)*test_func*JxW[qp];
716 if (compute_jacobian)
718 const libMesh::Real fixed_deriv =
719 context.get_fixed_solution_derivative();
721 for (
unsigned int j=0; j != n_u_dofs; j++)
723 Kuu(i,j) -= d_tau_M_dU(0)*u_phi[j][qp]*RM_t(0)*test_func*fixed_deriv*JxW[qp];
724 Kuu(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*test_func*fixed_deriv*JxW[qp];
725 Kuu(i,j) -= tau_M*RM_t(0)*d_test_func_dU(0)*u_phi[j][qp]*fixed_deriv*JxW[qp];
727 Kuv(i,j) -= d_tau_M_dU(1)*u_phi[j][qp]*RM_t(0)*test_func*fixed_deriv*JxW[qp];
728 Kuv(i,j) -= tau_M*RM_t(0)*d_test_func_dU(1)*u_phi[j][qp]*fixed_deriv*JxW[qp];
730 Kvu(i,j) -= d_tau_M_dU(0)*u_phi[j][qp]*RM_t(1)*test_func*fixed_deriv*JxW[qp];
731 Kvu(i,j) -= tau_M*RM_t(1)*d_test_func_dU(0)*u_phi[j][qp]*fixed_deriv*JxW[qp];
733 Kvv(i,j) -= d_tau_M_dU(1)*u_phi[j][qp]*RM_t(1)*test_func*fixed_deriv*JxW[qp];
734 Kvv(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*test_func*fixed_deriv*JxW[qp];
735 Kvv(i,j) -= tau_M*RM_t(1)*d_test_func_dU(1)*u_phi[j][qp]*fixed_deriv*JxW[qp];
739 for (
unsigned int j=0; j != n_u_dofs; j++)
741 (*Kuw)(i,j) -= d_tau_M_dU(2)*u_phi[j][qp]*RM_t(0)*test_func*fixed_deriv*JxW[qp];
742 (*Kuw)(i,j) -= tau_M*RM_t(0)*d_test_func_dU(2)*u_phi[j][qp]*fixed_deriv*JxW[qp];
744 (*Kvw)(i,j) -= d_tau_M_dU(2)*u_phi[j][qp]*RM_t(1)*test_func*fixed_deriv*JxW[qp];
745 (*Kvw)(i,j) -= tau_M*RM_t(1)*d_test_func_dU(2)*u_phi[j][qp]*fixed_deriv*JxW[qp];
747 (*Kwu)(i,j) -= d_tau_M_dU(0)*u_phi[j][qp]*RM_t(2)*test_func*fixed_deriv*JxW[qp];
748 (*Kwu)(i,j) -= tau_M*RM_t(2)*d_test_func_dU(0)*u_phi[j][qp]*fixed_deriv*JxW[qp];
750 (*Kwv)(i,j) -= d_tau_M_dU(1)*u_phi[j][qp]*RM_t(2)*test_func*fixed_deriv*JxW[qp];
751 (*Kwv)(i,j) -= tau_M*RM_t(2)*d_test_func_dU(1)*u_phi[j][qp]*fixed_deriv*JxW[qp];
753 (*Kww)(i,j) -= d_tau_M_dU(2)*u_phi[j][qp]*RM_t(2)*test_func*fixed_deriv*JxW[qp];
754 (*Kww)(i,j) -= tau_M*d_RM_t_uvw_duvw*u_phi[j][qp]*test_func*fixed_deriv*JxW[qp];
755 (*Kww)(i,j) -= tau_M*RM_t(2)*d_test_func_dU(2)*u_phi[j][qp]*fixed_deriv*JxW[qp];
763 #ifdef GRINS_USE_GRVY_TIMERS
764 this->_timer->EndTimer(
"IncompressibleNavierStokesAdjointStabilization::mass_residual");
virtual void element_time_derivative(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Time dependent part(s) of physics for element interiors.
virtual void mass_residual(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Mass matrix part(s) for element interiors. All boundary terms lie within the time_derivative part...
virtual void element_constraint(bool compute_jacobian, AssemblyContext &context, CachedValues &cache)
Constraint part(s) of physics for element interiors.
INSTANTIATE_INC_NS_SUBCLASS(IncompressibleNavierStokesAdjointStabilization)
IncompressibleNavierStokesAdjointStabilization()