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,
16 const T hLeft = QL[Shortcuts::h];
17 const T hRight = QR[Shortcuts::h];
18 const T huLeft = QL[Shortcuts::hu];
19 const T huRight = QR[Shortcuts::hu];
20 const T hvLeft = QL[Shortcuts::hu + 1];
21 const T hvRight = QR[Shortcuts::hu + 1];
22 const T bLeft = QL[Shortcuts::z];
23 const T bRight = QR[Shortcuts::z];
25 const T dryTol = std::pow(h[0], 4);
28 const T uCorrectedLeft = huLeft * hLeft * std::sqrt(2)
29 / std::sqrt(std::pow(hLeft, 4) + std::pow(std::fmax(hLeft, dryTol), 4));
30 const T uCorrectedRight = huRight * hRight * std::sqrt(2)
31 / std::sqrt(std::pow(hRight, 4) + std::pow(std::fmax(hRight, dryTol), 4));
32 const T vCorrectedLeft = hvLeft * hLeft * std::sqrt(2)
33 / std::sqrt(std::pow(hLeft, 4) + std::pow(std::fmax(hLeft, dryTol), 4));
34 const T vCorrectedRight = hvRight * hRight * std::sqrt(2)
35 / std::sqrt(std::pow(hRight, 4) + std::pow(std::fmax(hRight, dryTol), 4));
38 const T bathymetryMax = std::fmax(QR[Shortcuts::z], QL[Shortcuts::z]);
39 const T reconstructedHeightLeft = std::fmax(0.0, QL[Shortcuts::h] + QL[Shortcuts::z] - bathymetryMax);
40 const T reconstructedHeightRight = std::fmax(0.0, QR[Shortcuts::h] + QR[Shortcuts::z] - bathymetryMax);
43 const T reconstructedHuLeft = reconstructedHeightLeft * uCorrectedLeft;
44 const T reconstructedHvLeft = reconstructedHeightLeft * vCorrectedLeft;
45 const T reconstructedHuRight = reconstructedHeightRight * uCorrectedRight;
46 const T reconstructedHvRight = reconstructedHeightRight * vCorrectedRight;
48 const T cLeft = std::sqrt(g * reconstructedHeightLeft);
49 const T cRight = std::sqrt(g * reconstructedHeightRight);
52 normal == 0 ? uCorrectedLeft + cLeft : vCorrectedLeft + cLeft,
53 normal == 0 ? uCorrectedLeft - cLeft : vCorrectedLeft - cLeft,
54 normal == 0 ? uCorrectedLeft : vCorrectedLeft
58 normal == 0 ? uCorrectedRight + cRight : vCorrectedRight + cRight,
59 normal == 0 ? uCorrectedRight - cRight : vCorrectedRight - cRight,
60 normal == 0 ? uCorrectedRight : vCorrectedRight
65 for (
int i = 0; i < 3; i++) {
66 const T absEigenvalueLeft = std::fabs(LL[i]);
67 maxWaveSpeed = std::fmax(absEigenvalueLeft, maxWaveSpeed);
70 for (
int i = 0; i < 3; i++) {
71 const T absEigenvalueRight = std::fabs(LR[i]);
72 maxWaveSpeed = std::fmax(absEigenvalueRight, maxWaveSpeed);
76 normal == 0 ? reconstructedHuLeft : reconstructedHvLeft,
78 ? reconstructedHeightLeft * uCorrectedLeft * uCorrectedLeft
79 + 0.5 * g * (reconstructedHeightLeft * reconstructedHeightLeft)
80 : reconstructedHeightLeft * vCorrectedLeft * uCorrectedLeft,
82 ? reconstructedHeightLeft * uCorrectedLeft * vCorrectedLeft
83 : reconstructedHeightLeft * vCorrectedLeft * vCorrectedLeft
84 + 0.5 * g * (reconstructedHeightLeft * reconstructedHeightLeft)
88 normal == 0 ? reconstructedHuRight : reconstructedHvRight,
90 ? reconstructedHeightRight * uCorrectedRight * uCorrectedRight
91 + 0.5 * g * (reconstructedHeightRight * reconstructedHeightRight)
92 : reconstructedHeightRight * vCorrectedRight * uCorrectedRight,
94 ? reconstructedHeightRight * uCorrectedRight * vCorrectedRight
95 : reconstructedHeightRight * vCorrectedRight * vCorrectedRight
96 + 0.5 * g * (reconstructedHeightRight * reconstructedHeightRight)
99 const T deltaEta = reconstructedHeightRight - reconstructedHeightLeft;
103 0.5 * (fluxLeft[Shortcuts::h] + fluxRight[Shortcuts::h]) - 0.5 * maxWaveSpeed * deltaEta,
104 0.5 * (fluxLeft[Shortcuts::hu] + fluxRight[Shortcuts::hu])
105 - 0.5 * maxWaveSpeed * (reconstructedHuRight - reconstructedHuLeft),
106 0.5 * (fluxLeft[Shortcuts::hu + 1] + fluxRight[Shortcuts::hu + 1])
107 - 0.5 * maxWaveSpeed * (reconstructedHvRight - reconstructedHvLeft)
115 ? g * 0.5 * ((QL[Shortcuts::h] * QL[Shortcuts::h]) - (reconstructedHeightLeft * reconstructedHeightLeft))
119 : g * 0.5 * ((QL[Shortcuts::h] * QL[Shortcuts::h]) - (reconstructedHeightLeft * reconstructedHeightLeft))
124 ? g * 0.5 * ((QR[Shortcuts::h] * QR[Shortcuts::h]) - (reconstructedHeightRight * reconstructedHeightRight))
128 : g * 0.5 * ((QR[Shortcuts::h] * QR[Shortcuts::h]) - (reconstructedHeightRight * reconstructedHeightRight))
131 for (
int i = 0; i < 3; i++) {
132 FL[i] = netUpdates[i] + sourceLeft[i];
133 FR[i] = netUpdates[i] + sourceRight[i];