GRINS-0.6.0
inc_navier_stokes_stab_helper.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------bl-
2 //--------------------------------------------------------------------------
3 //
4 // GRINS - General Reacting Incompressible Navier-Stokes
5 //
6 // Copyright (C) 2014-2015 Paul T. Bauman, Roy H. Stogner
7 // Copyright (C) 2010-2013 The PECOS Development Team
8 //
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the Version 2.1 GNU Lesser General
11 // Public License as published by the Free Software Foundation.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc. 51 Franklin Street, Fifth Floor,
21 // Boston, MA 02110-1301 USA
22 //
23 //-----------------------------------------------------------------------el-
24 
25 
26 // This class
28 
29 //libMesh
30 #include "libmesh/getpot.h"
31 #include "libmesh/mesh.h"
32 #include "libmesh/fem_system.h"
33 
34 namespace GRINS
35 {
36 
38  (const std::string & helper_name,
39  const GetPot& input)
40  : StabilizationHelper(helper_name),
41  _C(1),
42  _tau_factor(0.5),
43  _flow_vars(input)
44  {
45  if (input.have_variable("Stabilization/tau_constant_vel"))
46  this->set_parameter
47  (_C, input, "Stabilization/tau_constant_vel", _C );
48  else
49  this->set_parameter
50  (_C, input, "Stabilization/tau_constant", _C );
51 
52  if (input.have_variable("Stabilization/tau_factor_vel"))
53  this->set_parameter
54  (_tau_factor, input, "Stabilization/tau_factor_vel", _tau_factor );
55  else
56  this->set_parameter
57  (_tau_factor, input, "Stabilization/tau_factor", _tau_factor );
58 
59  return;
60  }
61 
63  {
64  return;
65  }
66 
67  void IncompressibleNavierStokesStabilizationHelper::init( libMesh::FEMSystem& system )
68  {
69  _flow_vars.init(&system);
70 
71  return;
72  }
73 
74  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::UdotGradU( libMesh::Gradient& U,
75  libMesh::Gradient& grad_u,
76  libMesh::Gradient& grad_v ) const
77  {
78  return libMesh::RealGradient( U*grad_u, U*grad_v );
79  }
80 
81  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::UdotGradU( libMesh::Gradient& U,
82  libMesh::Gradient& grad_u,
83  libMesh::Gradient& grad_v,
84  libMesh::Gradient& grad_w ) const
85  {
86  return libMesh::RealGradient( U*grad_u, U*grad_v, U*grad_w );
87  }
88 
89  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_GradU( libMesh::RealTensor& hess_u,
90  libMesh::RealTensor& hess_v ) const
91  {
92  return libMesh::RealGradient( hess_u(0,0) + hess_u(1,1),
93  hess_v(0,0) + hess_v(1,1) );
94  }
95 
96  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_GradU( libMesh::RealTensor& hess_u,
97  libMesh::RealTensor& hess_v,
98  libMesh::RealTensor& hess_w ) const
99  {
100  return libMesh::RealGradient( hess_u(0,0) + hess_u(1,1) + hess_u(2,2),
101  hess_v(0,0) + hess_v(1,1) + hess_v(2,2),
102  hess_w(0,0) + hess_w(1,1) + hess_w(2,2) );
103  }
104 
105  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_GradU_T( libMesh::RealTensor& hess_u,
106  libMesh::RealTensor& hess_v ) const
107  {
108  return libMesh::RealGradient( hess_u(0,0) + hess_v(0,1),
109  hess_u(1,0) + hess_v(1,1) );
110  }
111 
112  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_GradU_T( libMesh::RealTensor& hess_u,
113  libMesh::RealTensor& hess_v,
114  libMesh::RealTensor& hess_w ) const
115  {
116  return libMesh::RealGradient( hess_u(0,0) + hess_v(0,1) + hess_w(0,2),
117  hess_u(1,0) + hess_v(1,1) + hess_w(1,2),
118  hess_u(2,0) + hess_v(2,1) + hess_w(2,2) );
119  }
120 
121  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_divU_I( libMesh::RealTensor& hess_u,
122  libMesh::RealTensor& hess_v ) const
123  {
124  return libMesh::RealGradient( hess_u(0,0) + hess_v(1,0),
125  hess_u(0,1) + hess_v(1,1) );
126  }
127 
128  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::div_divU_I( libMesh::RealTensor& hess_u,
129  libMesh::RealTensor& hess_v,
130  libMesh::RealTensor& hess_w) const
131  {
132  return libMesh::RealGradient( hess_u(0,0) + hess_v(1,0) + hess_w(2,0),
133  hess_u(0,1) + hess_v(1,1) + hess_w(2,1),
134  hess_u(0,2) + hess_v(1,2) + hess_w(2,2) );
135  }
136 
138  unsigned int qp ) const
139  {
140  libMesh::RealGradient grad_u, grad_v;
141 
142  grad_u = context.fixed_interior_gradient(this->_flow_vars.u_var(), qp);
143  grad_v = context.fixed_interior_gradient(this->_flow_vars.v_var(), qp);
144 
145  libMesh::Real divU = grad_u(0) + grad_v(1);
146 
147  if( context.get_system().get_mesh().mesh_dimension() == 3 )
148  {
149  divU += (context.fixed_interior_gradient(this->_flow_vars.w_var(), qp))(2);
150  }
151 
152  return divU;
153  }
154 
156  ( AssemblyContext& context,
157  unsigned int qp,
158  libMesh::Real &res_C,
159  libMesh::Tensor &d_res_C_dgradU
160  ) const
161  {
162  libMesh::RealGradient grad_u, grad_v;
163 
164  grad_u = context.fixed_interior_gradient(this->_flow_vars.u_var(), qp);
165  grad_v = context.fixed_interior_gradient(this->_flow_vars.v_var(), qp);
166 
167  libMesh::Real divU = grad_u(0) + grad_v(1);
168  d_res_C_dgradU = 0;
169  d_res_C_dgradU(0,0) = 1;
170  d_res_C_dgradU(1,1) = 1;
171 
172  if( context.get_system().get_mesh().mesh_dimension() == 3 )
173  {
174  divU += (context.fixed_interior_gradient(this->_flow_vars.w_var(), qp))(2);
175  d_res_C_dgradU(2,2) = 1;
176  }
177 
178  res_C = divU;
179  }
180 
182  unsigned int qp, const libMesh::Real rho, const libMesh::Real mu ) const
183  {
184  libMesh::RealGradient U( context.fixed_interior_value(this->_flow_vars.u_var(), qp),
185  context.fixed_interior_value(this->_flow_vars.v_var(), qp) );
186  if(context.get_system().get_mesh().mesh_dimension() == 3)
187  U(2) = context.fixed_interior_value(this->_flow_vars.w_var(), qp);
188 
189  libMesh::RealGradient grad_p = context.fixed_interior_gradient(this->_flow_vars.p_var(), qp);
190 
191  libMesh::RealGradient grad_u = context.fixed_interior_gradient(this->_flow_vars.u_var(), qp);
192  libMesh::RealGradient grad_v = context.fixed_interior_gradient(this->_flow_vars.v_var(), qp);
193 
194  libMesh::RealTensor hess_u = context.fixed_interior_hessian(this->_flow_vars.u_var(), qp);
195  libMesh::RealTensor hess_v = context.fixed_interior_hessian(this->_flow_vars.v_var(), qp);
196 
197  libMesh::RealGradient rhoUdotGradU;
198  libMesh::RealGradient divGradU;
199 
200  if( context.get_system().get_mesh().mesh_dimension() < 3 )
201  {
202  rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v );
203  divGradU = this->div_GradU( hess_u, hess_v );
204  }
205  else
206  {
207  libMesh::RealGradient grad_w = context.fixed_interior_gradient(this->_flow_vars.w_var(), qp);
208  libMesh::RealTensor hess_w = context.fixed_interior_hessian(this->_flow_vars.w_var(), qp);
209 
210  rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v, grad_w );
211 
212  divGradU = this->div_GradU( hess_u, hess_v, hess_w );
213  }
214 
215  return rhoUdotGradU + grad_p - mu*divGradU;
216  }
217 
219  ( AssemblyContext& context,
220  unsigned int qp, const libMesh::Real rho, const libMesh::Real mu,
221  libMesh::Gradient &res_M,
222  libMesh::Tensor &d_res_M_dgradp,
223  libMesh::Tensor &d_res_M_dU,
224  libMesh::Gradient &d_res_Muvw_dgraduvw,
225  libMesh::Tensor &d_res_Muvw_dhessuvw
226  ) const
227  {
228  libMesh::RealGradient U( context.fixed_interior_value(this->_flow_vars.u_var(), qp),
229  context.fixed_interior_value(this->_flow_vars.v_var(), qp) );
230  if(context.get_system().get_mesh().mesh_dimension() == 3)
231  U(2) = context.fixed_interior_value(this->_flow_vars.w_var(), qp);
232 
233  libMesh::RealGradient grad_p = context.fixed_interior_gradient(this->_flow_vars.p_var(), qp);
234 
235  libMesh::RealGradient grad_u = context.fixed_interior_gradient(this->_flow_vars.u_var(), qp);
236  libMesh::RealGradient grad_v = context.fixed_interior_gradient(this->_flow_vars.v_var(), qp);
237 
238  libMesh::RealTensor hess_u = context.fixed_interior_hessian(this->_flow_vars.u_var(), qp);
239  libMesh::RealTensor hess_v = context.fixed_interior_hessian(this->_flow_vars.v_var(), qp);
240 
241  libMesh::RealGradient rhoUdotGradU;
242  libMesh::RealGradient divGradU;
243 
244  if( context.get_system().get_mesh().mesh_dimension() < 3 )
245  {
246  rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v );
247  divGradU = this->div_GradU( hess_u, hess_v );
248  }
249  else
250  {
251  libMesh::RealGradient grad_w = context.fixed_interior_gradient(this->_flow_vars.w_var(), qp);
252  libMesh::RealTensor hess_w = context.fixed_interior_hessian(this->_flow_vars.w_var(), qp);
253 
254  rhoUdotGradU = rho*this->UdotGradU( U, grad_u, grad_v, grad_w );
255 
256  divGradU = this->div_GradU( hess_u, hess_v, hess_w );
257 
258  d_res_M_dU(0,2) = rho * grad_u(2);
259  d_res_M_dU(1,2) = rho * grad_v(2);
260 
261  d_res_Muvw_dgraduvw(2) = rho * U(2);
262  d_res_M_dgradp(2,2) = 1;
263  d_res_Muvw_dhessuvw(2,2) = mu;
264 
265  d_res_M_dU(2,0) = rho * grad_w(0);
266  d_res_M_dU(2,1) = rho * grad_w(1);
267  d_res_M_dU(2,2) = rho * grad_w(2);
268  }
269 
270  res_M = rhoUdotGradU + grad_p - mu*divGradU;
271 
272  d_res_M_dU(0,0) = rho * grad_u(0);
273  d_res_M_dU(0,1) = rho * grad_u(1);
274  d_res_M_dU(1,0) = rho * grad_v(0);
275  d_res_M_dU(1,1) = rho * grad_v(1);
276 
277  d_res_Muvw_dgraduvw(0) = rho * U(0);
278  d_res_Muvw_dgraduvw(1) = rho * U(1);
279 
280  d_res_M_dgradp(0,0) = 1;
281  d_res_M_dgradp(1,1) = 1;
282 
283  d_res_Muvw_dhessuvw(0,0) = mu;
284  d_res_Muvw_dhessuvw(1,1) = mu;
285  }
286 
287 
288  libMesh::RealGradient IncompressibleNavierStokesStabilizationHelper::compute_res_momentum_transient( AssemblyContext& context, unsigned int qp, const libMesh::Real rho ) const
289  {
290  libMesh::RealGradient u_dot;
291  context.interior_rate(this->_flow_vars.u_var(), qp, u_dot(0));
292  context.interior_rate(this->_flow_vars.v_var(), qp, u_dot(1));
293  if(context.get_system().get_mesh().mesh_dimension() == 3)
294  context.interior_rate(this->_flow_vars.w_var(), qp, u_dot(2));
295 
296  return rho*u_dot;
297  }
298 
299 
301  ( AssemblyContext& context,
302  unsigned int qp,
303  const libMesh::Real rho,
304  libMesh::RealGradient &res_M,
305  libMesh::Real &d_res_Muvw_duvw
306  ) const
307  {
308  libMesh::RealGradient u_dot;
309  context.interior_rate(this->_flow_vars.u_var(), qp, u_dot(0));
310  context.interior_rate(this->_flow_vars.v_var(), qp, u_dot(1));
311  if(context.get_system().get_mesh().mesh_dimension() == 3)
312  context.interior_rate(this->_flow_vars.w_var(), qp, u_dot(2));
313 
314  res_M = rho*u_dot;
315  d_res_Muvw_duvw = rho;
316  }
317 
318 } // namespace GRINS
libMesh::RealGradient div_divU_I(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
libMesh::RealGradient compute_res_momentum_steady(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, const libMesh::Real mu) const
libMesh::RealGradient compute_res_momentum_transient(AssemblyContext &context, unsigned int qp, const libMesh::Real rho) const
libMesh::RealGradient div_GradU(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
GRINS namespace.
virtual void init(libMesh::FEMSystem *system)
libMesh::RealGradient UdotGradU(libMesh::Gradient &U, libMesh::Gradient &grad_u, libMesh::Gradient &grad_v) const
libMesh::RealGradient div_GradU_T(libMesh::RealTensor &hess_u, libMesh::RealTensor &hess_v) const
void compute_res_momentum_steady_and_derivs(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, const libMesh::Real mu, libMesh::Gradient &res_M, libMesh::Tensor &d_res_M_dgradp, libMesh::Tensor &d_res_M_dU, libMesh::Gradient &d_res_Muvw_dgraduvw, libMesh::Tensor &d_res_Muvw_dhessuvw) const
void compute_res_momentum_transient_and_derivs(AssemblyContext &context, unsigned int qp, const libMesh::Real rho, libMesh::RealGradient &res_M, libMesh::Real &d_res_Muvw_duvw) const
void compute_res_continuity_and_derivs(AssemblyContext &context, unsigned int qp, libMesh::Real &res_C, libMesh::Tensor &d_res_C_dgradU) const
IncompressibleNavierStokesStabilizationHelper(const std::string &helper_name, const GetPot &input)
libMesh::Real compute_res_continuity(AssemblyContext &context, unsigned int qp) const

Generated on Mon Jun 22 2015 21:32:20 for GRINS-0.6.0 by  doxygen 1.8.9.1