https://mooseframework.inl.gov
Loading...
Searching...
No Matches
NSViscStressTensorDerivs.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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
20template <class T>
22{
23public:
25
32 Real dtau(unsigned k, unsigned ell, unsigned m);
33
34private:
36};
37
38template <class T>
42
43template <class T>
44Real
45NSViscStressTensorDerivs<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 *
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}
const std::vector< double > x
const double mu
const double rho
const double T
void mooseError(Args &&... args)
Class outside the Moose hierarchy that contains common functionality for computing derivatives of the...
Real dtau(unsigned k, unsigned ell, unsigned m)
The primary interface for computing viscous stress tensor derivatives.