Peano
Loading...
Searching...
No Matches
RusanovDSLKernel3D.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
11# Parameter added for loop parallelisation (set in parser)
12"""
13loopParallelism: "peano4::utils::LoopPlacement"
14"""
15
16def timeStepWithRusanov(patchData: "CellData<double, double>&") -> "void":
17 N = Integer("patchData.numberOfCells")
18 t = DataBlock([[0, N]], "patchData.t", "double")
19 dt = DataBlock([[0, N]], "patchData.dt", "double")
20 h = DataBlock([[0, N]], "patchData.cellSize", "tarch::la::Vector<3, double>")
21 x = DataBlock([[0, N]], "patchData.cellCentre", "tarch::la::Vector<3, double>")
22 maxEigenvalues = DataBlock([[0, N]], "patchData.maxEigenvalue", "double")
23
24 input = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], "patchData.QIn")
25 output = DataBlock([[0, NumberOfUnknowns + NumberOfAuxiliaryVariables], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], "patchData.QOut")
26 output = input[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch]
27
28 if EvaluateSource:
29 source = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("sourceTerm", input[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], x, h, t, dt))
30 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + dt * source
31
32 maxEigenvaluesX = DataBlock([[0, 1], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], eval("maxEigenvalue", input, x, h, t, dt, 0))
33 lambdaLeft = max(maxEigenvaluesX[0:1, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], maxEigenvaluesX[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
34 lambdaRight = max(maxEigenvaluesX[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], maxEigenvaluesX[0:1, 1:NumberOfVolumesPerAxisInPatch + 1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
35 fluxLeft = -1.0 * lambdaLeft * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
36 fluxRight = -1.0 * lambdaRight * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
37 output = output + dt / h(0) * (fluxLeft - fluxRight) * NumberOfVolumesPerAxisInPatch * 0.5
38
39 maxEigenvaluesY = DataBlock([[0, 1], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], eval("maxEigenvalue", input, x, h, t, dt, 1))
40 lambdaBottom = max(maxEigenvaluesY[0:1, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch], maxEigenvaluesY[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
41 lambdaTop = max(maxEigenvaluesY[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], maxEigenvaluesY[0:1, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch + 1, 0:NumberOfVolumesPerAxisInPatch])
42 fluxBottom = -1.0 * lambdaBottom * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch])
43 fluxTop = -1.0 * lambdaTop * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
44 output = output + dt / h(1) * (fluxBottom - fluxTop) * NumberOfVolumesPerAxisInPatch * 0.5
45
46 maxEigenvaluesZ = DataBlock([[0, 1], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], eval("maxEigenvalue", input, x, h, t, dt, 2))
47 lambdaNear = max(maxEigenvaluesZ[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1], maxEigenvaluesZ[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
48 lambdaFar = max(maxEigenvaluesZ[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], maxEigenvaluesZ[0:1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch + 1])
49 fluxNear = -1.0 * lambdaNear * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1])
50 fluxFar = -1.0 * lambdaFar * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1] - input[0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
51 output = output + dt / h(2) * (fluxNear - fluxFar) * NumberOfVolumesPerAxisInPatch * 0.5
52
53 if EvaluateFlux:
54 flux_x = DataBlock([[0, NumberOfUnknowns], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("flux", input[:, -1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch], x, h, t, dt, 0))
55 flux_y = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("flux", input[:, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch], x, h, t, dt, 1))
56 flux_z = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [-HaloSize, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], eval("flux", input[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch+1], x, h, t, dt, 2))
57 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(0) * (flux_x[:, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - flux_x[:, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
58 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(1) * (flux_y[:, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1, 0:NumberOfVolumesPerAxisInPatch] - flux_y[:, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch])
59 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(2) * (flux_z[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch-1] - flux_z[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1])
60
61 if EvaluateNonconservativeProduct:
62 average_x = 0.5 * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -1:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] + input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch + 1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
63 delta_x = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch + HaloSize, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, -HaloSize:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch]
64 nonconservative_x = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch + HaloSize], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("nonconservativeProduct", average_x, delta_x, x, h, t, dt, 0))
65 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(0) * (-nonconservative_x[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - nonconservative_x[:, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch])
66
67 average_y = 0.5 * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] + input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch + 1, 0:NumberOfVolumesPerAxisInPatch])
68 delta_y = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch + HaloSize, 0:NumberOfVolumesPerAxisInPatch] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, -HaloSize:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch]
69 nonconservative_y = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch + HaloSize], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("nonconservativeProduct", average_y, delta_y, x, h, t, dt, 1))
70 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(1) * (-nonconservative_y[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - nonconservative_y[:, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1, 0:NumberOfVolumesPerAxisInPatch])
71
72 average_z = 0.5 * (input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -1:NumberOfVolumesPerAxisInPatch] + input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch + 1])
73 delta_z = input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch + HaloSize] - input[0:NumberOfUnknowns + NumberOfAuxiliaryVariables, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, -HaloSize:NumberOfVolumesPerAxisInPatch]
74 nonconservative_z = DataBlock([[0, NumberOfUnknowns], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch + HaloSize], [0, N]], eval("nonconservativeProduct", average_z, delta_z, x, h, t, dt, 2))
75 output[0:NumberOfUnknowns, :, :, :] = output[0:NumberOfUnknowns, :, :, :] + 0.5 * NumberOfVolumesPerAxisInPatch * dt / h(2) * (-nonconservative_z[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch] - nonconservative_z[:, 0:NumberOfVolumesPerAxisInPatch, 0:NumberOfVolumesPerAxisInPatch, 1:NumberOfVolumesPerAxisInPatch+1])
76
77 if EvaluateMaximumEigenvalueAfterTimeStep:
78 maxEigenvaluesX2 = DataBlock([[0, 1], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("maxEigenvalue", output, x, h, t, dt, 0))
79 maxEigenvaluesY2 = DataBlock([[0, 1], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("maxEigenvalue", output, x, h, t, dt, 1))
80 maxEigenvaluesZ2 = DataBlock([[0, 1], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, NumberOfVolumesPerAxisInPatch], [0, N]], eval("maxEigenvalue", output, x, h, t, dt, 2))
81 maxEigenvaluesXY = max(maxEigenvaluesX2, maxEigenvaluesY2)
82 maxEigenvaluesPerVolume = max(maxEigenvaluesXY, maxEigenvaluesZ2)
83 maxEigenvalues = max(maxEigenvaluesPerVolume)
84