www.mooseframework.org
Public Member Functions | Private Attributes | List of all members
NSViscStressTensorDerivs< T > Class Template Reference

Class outside the Moose hierarchy that contains common functionality for computing derivatives of the viscous stress tensor. More...

#include <NSViscStressTensorDerivs.h>

Public Member Functions

 NSViscStressTensorDerivs (T &x)
 
Real dtau (unsigned k, unsigned ell, unsigned m)
 The primary interface for computing viscous stress tensor derivatives. More...
 

Private Attributes

T & _data
 

Detailed Description

template<class T>
class NSViscStressTensorDerivs< T >

Class outside the Moose hierarchy that contains common functionality for computing derivatives of the viscous stress tensor.

This class is templated so that it can be used by either a Kernel object or a BC object.

Definition at line 22 of file NSViscStressTensorDerivs.h.

Constructor & Destructor Documentation

◆ NSViscStressTensorDerivs()

template<class T>
NSViscStressTensorDerivs< T >::NSViscStressTensorDerivs ( T &  x)

Definition at line 40 of file NSViscStressTensorDerivs.h.

40  : _data(x)
41 {
42 }

Member Function Documentation

◆ dtau()

template<class T >
Real NSViscStressTensorDerivs< T >::dtau ( unsigned  k,
unsigned  ell,
unsigned  m 
)

The primary interface for computing viscous stress tensor derivatives.

Requires access to protected data from the the underlying data. Uses index notation from the notes.

Definition at line 46 of file NSViscStressTensorDerivs.h.

Referenced by NSMomentumViscousFlux::computeQpJacobian(), NSMomentumViscousBC::computeQpJacobian(), NSEnergyViscousFlux::computeQpOffDiagJacobian(), NSMomentumViscousFlux::computeQpOffDiagJacobian(), NSMomentumViscousBC::computeQpOffDiagJacobian(), and NSEnergyViscousBC::computeQpOffDiagJacobian().

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

Member Data Documentation

◆ _data

template<class T>
T& NSViscStressTensorDerivs< T >::_data
private

Definition at line 36 of file NSViscStressTensorDerivs.h.


The documentation for this class was generated from the following file: