Peano
Loading...
Searching...
No Matches
MUSCLHancockDSLKernel2D.py
Go to the documentation of this file.
1# The following parameters shoule be set when calling Parser().parse(...)
2
3# Parameters used to generate non stateless code (set in parser)
4"""
5flux: "const fluxFunctor&",
6nonconservativeProduct: "const nonconservativeProductFunctor&",
7sourceTerm: "const sourceFunctor&",
8maxEigenvalue: "const maxEigenvalueFunctor&",
9"""
10
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")
18
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]
22
23 if EvaluateSource:
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
26
27 #Compute slope with van Albada limiter
28 epsilon = 0.01
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)
33
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)
38
39 #Compute face values
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
44
45 #Evolve face values by half time step
46 if EvaluateFlux:
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))
51
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)
60
61 if EvaluateSource:
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))
66
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
71
72 #Evolve volumes
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])
76
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])
80
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])
85
86 if EvaluateFlux:
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))
91
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])
96
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)
99
100 #if EvaluateNonconservativeProduct:
101 # average_x = 0.5 * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV, 0:NV] + input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV + 1, 0:NV])
102 # delta_x = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV + 1, 0:NV] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NV, 0:NV]
103 # nonconservative_x = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [0, NV + 1], [0, NV], [0, N]], eval("nonconservativeProduct", average_x, delta_x, x, h, t, dt, 0))
104 # output = output + 0.5 * NV * dt / h(0) * (-nonconservative_x[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 0:NV] - nonconservative_x[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 1:NV+1, 0:NV])
105 #
106 # average_y = 0.5 * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV] + input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 0:NV + 1])
107 # delta_y = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 0:NV + 1] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, -1:NV]
108 # nonconservative_y = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [0, NV], [0, NV + 1], [0, N]], eval("nonconservativeProduct", average_y, delta_y, x, h, t, dt, 1))
109 # output = output + 0.5 * NV * dt / h(1) * (-nonconservative_y[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 0:NV] - nonconservative_y[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NV, 1:NV+1])
110
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)