www.mooseframework.org
NSViscStressTensorDerivs.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #pragma once
11 
20 template <class T>
22 {
23 public:
25 
32  Real dtau(unsigned k, unsigned ell, unsigned m);
33 
34 private:
35  T & _data;
36 };
37 
38 template <class T>
40 {
41 }
42 
43 template <class T>
44 Real
45 NSViscStressTensorDerivs<T>::dtau(unsigned k, unsigned ell, unsigned m)
46 {
47  // Try to access underlying data. Since this class is a friend, we can
48  // directly access _qp and other protected data. This only works if the
49  // individual variables have the **same names** in all types T which may
50  // be used to construct this class.
51 
52  //
53  // Some error checking on input indices...
54  //
55 
56  // 0 <= k,ell <= 2
57  if (k > 2 || ell > 2)
58  mooseError("Error, 0 <= k,ell <= 2 violated!");
59 
60  // 0 <= m <= 4
61  if (m >= 5)
62  mooseError("Error, m <= 4 violated!");
63 
64  //
65  // Convenience variables
66  //
67 
68  const Real rho = _data._rho[_data._qp];
69  const Real rho2 = rho * rho;
70  const Real phij = _data._phi[_data._j][_data._qp];
71 
72  const Real mu = _data._dynamic_viscosity[_data._qp];
73  const Real nu = mu / rho;
74 
75  const RealVectorValue U(
76  _data._rho_u[_data._qp], _data._rho_v[_data._qp], _data._rho_w[_data._qp]);
77 
78  const Real divU = _data._grad_rho_u[_data._qp](0) + _data._grad_rho_v[_data._qp](1) +
79  _data._grad_rho_w[_data._qp](2);
80 
81  // This makes a copy...but the resulting code is cleaner
82  std::vector<RealVectorValue> gradU(3);
83  gradU[0] = _data._grad_rho_u[_data._qp];
84  gradU[1] = _data._grad_rho_v[_data._qp];
85  gradU[2] = _data._grad_rho_w[_data._qp];
86 
87  // So we can refer to gradients without repeated indexing.
88  const RealVectorValue & grad_phij = _data._grad_phi[_data._j][_data._qp];
89  const RealVectorValue & grad_rho = _data._grad_rho[_data._qp];
90 
91  switch (m)
92  {
93  case 0: // density
94  {
95  const Real term1 = 2.0 / rho2 * (U(k) * grad_rho(ell) + U(ell) * grad_rho(k)) * phij;
96  const Real term2 = -1.0 / rho * ((gradU[k](ell) + gradU[ell](k)) * phij +
97  (U(k) * grad_phij(ell) + U(ell) * grad_phij(k)));
98 
99  // Kronecker delta terms
100  Real term3 = 0.0;
101  Real term4 = 0.0;
102  if (k == ell)
103  {
104  term3 = -4.0 / 3.0 / rho2 * (U * grad_rho) * phij;
105  term4 = 2.0 / 3.0 / rho * (U * grad_phij + divU * phij);
106  }
107 
108  // Sum up result and return
109  return nu * (term1 + term2 + term3 + term4);
110  }
111 
112  // momentums
113  case 1:
114  case 2:
115  case 3:
116  {
117  // note: when comparing m to k or ell, or indexing into Points,
118  // must map m -> 0, 1, 2 by subtracting 1.
119  const unsigned m_local = m - 1;
120 
121  // Kronecker delta terms
122  const Real delta_km = (k == m_local ? 1.0 : 0.0);
123  const Real delta_ellm = (ell == m_local ? 1.0 : 0.0);
124  const Real delta_kell = (k == ell ? 1.0 : 0.0);
125 
126  return nu *
127  (
128  /* */ delta_km * (grad_phij(ell) - (phij / rho) * grad_rho(ell)) +
129  /* */ delta_ellm * (grad_phij(k) - (phij / rho) * grad_rho(k)) -
130  (2. / 3.) * delta_kell * (grad_phij(m_local) - (phij / rho) * grad_rho(m_local)));
131  } // end case 1,2,3
132 
133  case 4:
134  // Derivative wrt to energy variable is zero.
135  return 0.;
136 
137  default:
138  mooseError("Invalid variable requested.");
139  break;
140  }
141 
142  return 0.;
143 }
144 
NSViscStressTensorDerivs::dtau
Real dtau(unsigned k, unsigned ell, unsigned m)
The primary interface for computing viscous stress tensor derivatives.
Definition: NSViscStressTensorDerivs.h:45
NSViscStressTensorDerivs::_data
T & _data
Definition: NSViscStressTensorDerivs.h:35
NSViscStressTensorDerivs
Class outside the Moose hierarchy that contains common functionality for computing derivatives of the...
Definition: NSViscStressTensorDerivs.h:21
NSViscStressTensorDerivs::NSViscStressTensorDerivs
NSViscStressTensorDerivs(T &x)
Definition: NSViscStressTensorDerivs.h:39