11def timeStepWithMUSCLHancock(patchData:
"CellData<double, double>&") ->
"void":
12 N = Integer(
"patchData.numberOfCells")
13 t = DataBlock([[0, N]],
"patchData.t",
"double")
14 dt = DataBlock([[0, N]],
"patchData.dt",
"double")
15 h = DataBlock([[0, N]],
"patchData.cellSize",
"tarch::la::Vector<2, double>")
16 x = DataBlock([[0, N]],
"patchData.cellCentre",
"tarch::la::Vector<2, double>")
17 maxEigenvalues = DataBlock([[0, N]],
"patchData.maxEigenvalue",
"double")
19 input = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [-H, NV + H], [-H, NV + H], [0, N]],
"patchData.QIn")
20 output = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [0, NV], [0, NV], [0, N]],
"patchData.QOut")
21 output = input[:, 0:NV, 0:NV]
24 source = DataBlock([[0, NumberOfUnknowns], [0, NV], [0, NV], [0, N]], eval(
"sourceTerm", input[:, 0:NV, 0:NV], x, h, t, dt))
25 output[0:NumberOfUnknowns, 0:NV, 0:NV] = output[0:NumberOfUnknowns, 0:NV, 0:NV] + dt * source
29 slopeRight = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV+2, 0:NV] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV+1, 0:NV]
30 slopeLeft = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV+1, 0:NV] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -2:NV, 0:NV]
31 slopeX = ((slopeRight * slopeRight + epsilon * epsilon)*slopeLeft + (slopeLeft * slopeLeft + epsilon * epsilon)*slopeRight) \
32 / (slopeLeft * slopeLeft + slopeRight * slopeRight + 2 * epsilon * epsilon)
34 slopeTop = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 0:NV+2] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV+1]
35 slopeBottom = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV+1] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -2:NV]
36 slopeY = ((slopeTop * slopeTop + epsilon * epsilon)*slopeBottom + (slopeBottom * slopeBottom + epsilon * epsilon)*slopeTop) \
37 / (slopeBottom * slopeBottom + slopeTop * slopeTop + 2 * epsilon * epsilon)
40 leftFace = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV+1, 0:NV] - 0.5 * slopeX
41 rightFace = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV+1, 0:NV] + 0.5 * slopeX
42 bottomFace = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV+1] - 0.5 * slopeY
43 topFace = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV+1] + 0.5 * slopeY
47 fluxLeft = DataBlock([[0, NumberOfUnknowns], [-1, NV+1], [0, NV], [0, N]], eval(
"flux", leftFace, x, h, t, dt, 0))
48 fluxRight = DataBlock([[0, NumberOfUnknowns], [-1, NV+1], [0, NV], [0, N]], eval(
"flux", rightFace, x, h, t, dt, 0))
49 fluxBottom = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV+1], [0, N]], eval(
"flux", bottomFace, x, h, t, dt, 1))
50 fluxTop = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV+1], [0, N]], eval(
"flux", topFace, x, h, t, dt, 1))
52 leftFace[0:NumberOfUnknowns, -1:NV+1, 0:NV] = leftFace[0:NumberOfUnknowns, -1:NV+1, 0:NV] \
53 - 0.5 * (dt / h(0)) * (fluxRight - fluxLeft)
54 rightFace[0:NumberOfUnknowns, -1:NV+1, 0:NV] = rightFace[0:NumberOfUnknowns, -1:NV+1, 0:NV] \
55 - 0.5 * (dt / h(0)) * (fluxRight - fluxLeft)
56 bottomFace[0:NumberOfUnknowns, 0:NV, -1:NV+1] = bottomFace[0:NumberOfUnknowns, 0:NV, -1:NV+1] \
57 - 0.5 * (dt / h(1)) * (fluxTop - fluxBottom)
58 topFace[0:NumberOfUnknowns, 0:NV, -1:NV+1] = topFace[0:NumberOfUnknowns, 0:NV, -1:NV+1] \
59 - 0.5 * (dt / h(1)) * (fluxTop - fluxBottom)
62 sourceLeftFace = DataBlock([[0, NumberOfUnknowns], [-1, NV+1], [0, NV], [0, N]], eval(
"sourceTerm", leftFace, x, h, t, dt))
63 sourceRightFace = DataBlock([[0, NumberOfUnknowns], [-1, NV+1], [0, NV], [0, N]], eval(
"sourceTerm", rightFace, x, h, t, dt))
64 sourceBottomFace = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV+1], [0, N]], eval(
"sourceTerm", bottomFace, x, h, t, dt))
65 sourceTopFace = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV+1], [0, N]], eval(
"sourceTerm", topFace, x, h, t, dt))
67 leftFace[0:NumberOfUnknowns, 0:NV, 0:NV] = leftFace[0:NumberOfUnknowns, 0:NV, 0:NV] + 0.5 * dt * sourceLeftFace
68 rightFace[0:NumberOfUnknowns, 0:NV, 0:NV] = rightFace[0:NumberOfUnknowns, 0:NV, 0:NV] + 0.5 * dt * sourceRightFace
69 bottomFace[0:NumberOfUnknowns, 0:NV, 0:NV] = bottomFace[0:NumberOfUnknowns, 0:NV, 0:NV] + 0.5 * dt * sourceBottomFace
70 topFace[0:NumberOfUnknowns, 0:NV, 0:NV] = topFace[0:NumberOfUnknowns, 0:NV, 0:NV] + 0.5 * dt * sourceTopFace
73 maxEigenvaluesLeft = DataBlock([[0, 1], [-1, NV+1], [0, NV], [0, N]], eval(
"maxEigenvalue", leftFace, x, h, t, dt, 0))
74 maxEigenvaluesRight = DataBlock([[0, 1], [-1, NV+1], [0, NV], [0, N]], eval(
"maxEigenvalue", rightFace, x, h, t, dt, 0))
75 lambdaX = max(maxEigenvaluesLeft[0:1, 0:NV+1, 0:NV], maxEigenvaluesRight[0:1, -1:NV, 0:NV])
77 maxEigenvaluesBottom = DataBlock([[0, 1], [0, NV], [-1, NV+1], [0, N]], eval(
"maxEigenvalue", bottomFace, x, h, t, dt, 1))
78 maxEigenvaluesTop = DataBlock([[0, 1], [0, NV], [-1, NV+1], [0, N]], eval(
"maxEigenvalue", topFace, x, h, t, dt, 1))
79 lambdaY = max(maxEigenvaluesBottom[0:1, 0:NV, 0:NV+1], maxEigenvaluesTop[0:1, 0:NV, -1:NV])
81 rusanovFluxLeft = - 0.5 * lambdaX[0:1, 0:NV, 0:NV] * (leftFace[0:NumberOfUnknowns, 0:NV, 0:NV] - rightFace[0:NumberOfUnknowns, -1:NV-1, 0:NV])
82 rusanovFluxRight = - 0.5 * lambdaX[0:1, 1:NV+1, 0:NV] * (leftFace[0:NumberOfUnknowns, 1:NV+1, 0:NV] - rightFace[0:NumberOfUnknowns, 0:NV, 0:NV])
83 rusanovFluxBottom = - 0.5 * lambdaY[0:1, 0:NV, 0:NV] * (bottomFace[0:NumberOfUnknowns, 0:NV, 0:NV] - topFace[0:NumberOfUnknowns, 0:NV, -1:NV-1])
84 rusanovFluxTop = - 0.5 * lambdaY[0:1, 0:NV, 1:NV+1] * (bottomFace[0:NumberOfUnknowns, 0:NV, 1:NV+1] - topFace[0:NumberOfUnknowns, 0:NV, 0:NV])
87 timeAveragedfluxLeft = DataBlock([[0, NumberOfUnknowns], [-1, NV + 1], [0, NV], [0, N]], eval(
"flux", leftFace, x, h, t, dt, 0))
88 timeAveragedfluxRight = DataBlock([[0, NumberOfUnknowns], [-1, NV + 1], [0, NV], [0, N]], eval(
"flux", rightFace, x, h, t, dt, 0))
89 timeAveragedfluxBottom = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV + 1], [0, N]], eval(
"flux", bottomFace, x, h, t, dt, 1))
90 timeAveragedfluxTop = DataBlock([[0, NumberOfUnknowns], [0, NV], [-1, NV + 1], [0, N]], eval(
"flux", topFace, x, h, t, dt, 1))
92 rusanovFluxLeft = rusanovFluxLeft + 0.5 * (timeAveragedfluxLeft[:, 0:NV, 0:NV] + timeAveragedfluxRight[:, -1:NV-1, 0:NV])
93 rusanovFluxRight = rusanovFluxRight + 0.5 * (timeAveragedfluxLeft[:, 1:NV+1, 0:NV] + timeAveragedfluxRight[:, 0:NV, 0:NV])
94 rusanovFluxBottom = rusanovFluxBottom + 0.5 * (timeAveragedfluxBottom[:, 0:NV, 0:NV] + timeAveragedfluxTop[:, 0:NV, -1:NV-1])
95 rusanovFluxTop = rusanovFluxTop + 0.5 * (timeAveragedfluxBottom[:, 0:NV, 1:NV+1] + timeAveragedfluxTop[:, 0:NV, 0:NV])
97 output[0:NumberOfUnknowns, :, :] = output[0:NumberOfUnknowns, :, :] + (dt / h(0)) * NV * (rusanovFluxLeft - rusanovFluxRight)
98 output[0:NumberOfUnknowns, :, :] = output[0:NumberOfUnknowns, :, :] + (dt / h(1)) * NV * (rusanovFluxBottom - rusanovFluxTop)
111 if EvaluateMaximumEigenvalueAfterTimeStep:
112 maxEigenvaluesX2 = DataBlock([[0, 1], [0, NV], [0, NV], [0, N]], eval(
"maxEigenvalue", output, x, h, t, dt, 0))
113 maxEigenvaluesY2 = DataBlock([[0, 1], [0, NV], [0, NV], [0, N]], eval(
"maxEigenvalue", output, x, h, t, dt, 1))
114 maxEigenvaluesPerVolume = max(maxEigenvaluesX2, maxEigenvaluesY2)
115 maxEigenvalues = max(maxEigenvaluesPerVolume)