6 const T*
const NOALIAS QL,
7 const T*
const NOALIAS QR,
8 const tarch::la::Vector<DIMENSIONS, double>& x,
9 const tarch::la::Vector<DIMENSIONS, double>& h,
21 T hLeft = QL[Shortcuts::h];
22 T hRight = QR[Shortcuts::h];
23 T huLeft = QL[Shortcuts::hu + normal];
24 T huRight = QR[Shortcuts::hu + normal];
25 T zLeft = QL[Shortcuts::z];
26 T zRight = QR[Shortcuts::z];
32 if (hLeft <= hThreshold && hRight <= hThreshold) {
33 wetDryState = WetDryState::DryDry;
34 }
else if (hLeft <= hThreshold) {
35 uRight = huRight / hRight;
41 wetDryState = WetDryState::DryWetWall;
42 }
else if (hRight <= hThreshold) {
43 uLeft = huLeft / hLeft;
48 wetDryState = WetDryState::WetDryWall;
50 uLeft = huLeft / hLeft;
51 uRight = huRight / hRight;
52 wetDryState = WetDryState::WetWet;
56 for (
int i = 0; i < 3; i++) {
62 if (wetDryState == WetDryState::DryDry) {
67 const T hRoe = 0.5 * (hRight + hLeft);
68 const T uRoe = (uLeft * std::sqrt(hLeft) + uRight * std::sqrt(hRight)) / (std::sqrt(hLeft) + std::sqrt(hRight));
69 const T roeSpeeds[2] = {uRoe - std::sqrt(g * hRoe), uRoe + std::sqrt(g * hRoe)};
70 const T characteristicSpeeds[2] = {uLeft - std::sqrt(g * hLeft), uRight + std::sqrt(g * hRight)};
71 const T einfeldtSpeeds[2] = {
72 std::fmin(characteristicSpeeds[0], roeSpeeds[0]),
73 std::fmax(characteristicSpeeds[1], roeSpeeds[1])
78 const T waveSpeeds[2]{einfeldtSpeeds[0], einfeldtSpeeds[1]};
79 const T deltaLambda = waveSpeeds[1] - waveSpeeds[0];
83 assertion(waveSpeeds[0] < waveSpeeds[1]);
84 assertion(std::fabs(deltaLambda) > 0);
87 const T inverseDeltaLambda = 1.0 / deltaLambda;
101 {inverseDeltaLambda * waveSpeeds[1], -inverseDeltaLambda},
102 {inverseDeltaLambda * -waveSpeeds[0], inverseDeltaLambda}
106 const T fluxLeft[2]{huLeft, huLeft * uLeft + 0.5 * g * hLeft * hLeft};
107 const T fluxRight[2]{huRight, huRight * uRight + 0.5 * g * hRight * hRight};
110 const T deltaxPsi = -g * (zRight - zLeft) * hRoe;
112 const T deltaFlux[2]{fluxRight[0] - fluxLeft[0], fluxRight[1] - fluxLeft[1] - deltaxPsi};
116 Rinv[0][0] * deltaFlux[0] + Rinv[0][1] * deltaFlux[1],
117 Rinv[1][0] * deltaFlux[0] + Rinv[1][1] * deltaFlux[1]
121 const T fWaves[2][2]{{alpha[0], alpha[0] * waveSpeeds[0]}, {alpha[1], alpha[1] * waveSpeeds[1]}};
125 T hUpdateRight = 0.0;
126 T huUpdateLeft = 0.0;
127 T huUpdateRight = 0.0;
129 constexpr T
ZERO_TOL = std::numeric_limits<T>::epsilon();
132 hUpdateLeft += fWaves[0][0];
133 huUpdateLeft += fWaves[0][1];
134 }
else if (waveSpeeds[0] >
ZERO_TOL) {
135 hUpdateRight -= fWaves[0][0];
136 huUpdateRight -= fWaves[0][1];
138 hUpdateLeft += 0.5 * fWaves[0][0];
139 huUpdateLeft += 0.5 * fWaves[0][1];
140 hUpdateRight -= 0.5 * fWaves[0][0];
141 huUpdateRight -= 0.5 * fWaves[0][1];
146 hUpdateLeft += fWaves[1][0];
147 huUpdateLeft += fWaves[1][1];
148 }
else if (waveSpeeds[1] >
ZERO_TOL) {
149 hUpdateRight -= fWaves[1][0];
150 huUpdateRight -= fWaves[1][1];
152 hUpdateLeft += 0.5 * fWaves[1][0];
153 huUpdateLeft += 0.5 * fWaves[1][1];
154 hUpdateRight -= 0.5 * fWaves[1][0];
155 huUpdateRight -= 0.5 * fWaves[1][1];
159 if (wetDryState == WetDryState::WetDryWall) {
162 }
else if (wetDryState == WetDryState::DryWetWall) {
168 const T maxWaveSpeed = std::fmax(std::fabs(waveSpeeds[0]), std::fabs(waveSpeeds[1]));
170#if !defined(WITH_GPU)
171 assertion(!std::isnan(hUpdateLeft));
172 assertion(!std::isnan(hUpdateRight));
173 assertion(!std::isnan(huUpdateLeft));
174 assertion(!std::isnan(huUpdateRight));
175 assertion(!std::isnan(maxWaveSpeed));
179 FL[Shortcuts::h] = hUpdateLeft;
180 FR[Shortcuts::h] = hUpdateRight;
181 FL[normal + 1] = huUpdateLeft;
182 FR[normal + 1] = huUpdateRight;