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 }
const std::vector< double > x

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.

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

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 *
97  ((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 }
void mooseError(Args &&... args)
static const std::string mu
Definition: NS.h:122
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string k
Definition: NS.h:124

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: