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 21 of file NSViscStressTensorDerivs.h.

Constructor & Destructor Documentation

◆ NSViscStressTensorDerivs()

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

Definition at line 39 of file NSViscStressTensorDerivs.h.

39  : _data(x)
40 {
41 }

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 45 of file NSViscStressTensorDerivs.h.

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 }

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

Member Data Documentation

◆ _data

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

Definition at line 35 of file NSViscStressTensorDerivs.h.


The documentation for this class was generated from the following file:
NSViscStressTensorDerivs::_data
T & _data
Definition: NSViscStressTensorDerivs.h:35