Peano 4
Loading...
Searching...
No Matches
fusedSpaceTimePredictorVolumeIntegralModel.py
Go to the documentation of this file.
24
25
26from .abstractModelBaseClass import AbstractModelBaseClass
27
28import copy
29
30from ..utils import MatmulConfig
31
32
34
35 def generateCode(self):
36 self.context["nVarMinusOne_seq"] = range(self.context["nVar"] - 1)
37 self.context["nDataMinusOne_seq"] = range(self.context["nData"] - 1)
38
39 if self.context["isLinear"]:
40
41 if self.context["useSplitCK"]:
42 if self.context["useVectPDE"]:
43 template = "fusedSPTVI_linear_split_ck_vect_cpp.template"
44 else:
45 template = "fusedSPTVI_linear_split_ck_cpp.template"
46
47 self.render(("aderdg", template), "fusedSpaceTimePredictorVolumeIntegral.cpp")
48
49 if self.context["usePointSources"]:
50 localContext = copy.copy(self.context)
51 localContext["usePointSources"] = False
52 localContext["nameSuffix"] = "_WithoutPS"
53
54 self.render(("aderdg", template), "fusedSpaceTimePredictorVolumeIntegral_WithoutPS.cpp", localContext)
55
56 else:
57 # size of the tmpArray
58 self.context["tmpArraySize"] = max((self.context["nDof"]*self.context["nVarPad"] if self.context["useFlux"] else 0), \
59 (self.context["nDim"]*self.context["nVarPad"] if self.context["useNCP"] else 0))
60
61 self.render(("aderdg", "fusedSPTVI_linear_cpp.template"), "fusedSpaceTimePredictorVolumeIntegral.cpp")
62
63 if self.context["usePointSources"]:
64 localContext = copy.copy(self.context)
65 localContext["usePointSources"] = False
66 localContext["nameSuffix"] = "_WithoutPS"
67
68 self.render(("aderdg", "fusedSPTVI_linear_cpp.template"), "fusedSpaceTimePredictorVolumeIntegral_WithoutPS.cpp", localContext)
69
70 else: #nonlinear
71 self.context["nDof_seq"] = range(0,self.context["nDof"])
72 self.context["i_seq"] = range(0,self.context["nDof"])
73 self.context["j_seq"] = range(0,self.context["nDof"]) if (self.context["nDim"] >= 3) else [0]
74 if self.context["predictorRecompute"]:
75 if self.context["useVectPDE"]:
76 self.render(("aderdg", "fusedSPTVI_nonlinear_mem_vect_cpp.template"), "fusedSpaceTimePredictorVolumeIntegral.cpp")
77 else:
78 self.render(("aderdg", "fusedSPTVI_nonlinear_mem_cpp.template"), "fusedSpaceTimePredictorVolumeIntegral.cpp")
79 else:
80 self.render(("aderdg", "fusedSPTVI_nonlinear_cpp.template"), "fusedSpaceTimePredictorVolumeIntegral.cpp")
81
82 # generates gemms
83 if self.context["useLibxsmm"]:
84 self.controller.generateGemms("asm_fstpvi.c", self.context["matmulConfigs"].values())
85
86
88 # MatmulConfig: M, N, K, LDA, LDB, LDC, alpha, beta, Align A, Align C, name, prefetching, type
89 self.context["matmulConfigs"] = {}
90 # shortcut
91 nVar = self.context["nVar"]
92 nVarPad = self.context["nVarPad"]
93 nDataPad = self.context["nDataPad"]
94 nData = self.context["nData"]
95 nDof = self.context["nDof"]
96 nDof2 = nDof*nDof
97 nDof3 = nDof2*nDof
98 nDof3D = self.context["nDof3D"]
99 nDofPad = self.context["nDofPad"]
100 nDim = self.context["nDim"]
101
102 if self.context["isLinear"]:
103 if self.context["useSplitCK"]:
104 if self.context["useVectPDE"]: # split_ck vect
105 if self.context["useFlux"]:
106 if self.context["useMaterialParam"]:
107 self.context["matmulConfigs"]["flux_x_sck_vect"] = MatmulConfig(nDofPad, nVar, nDof, nDofPad, nDofPad, nDofPad, 1, 0, 1, 1, "flux_x_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"])
108 self.context["matmulConfigs"]["flux_y_or_z_sck_vect"] = MatmulConfig(nDofPad*nVar, nVar, nDof, nDofPad*nVar, nDofPad, nDofPad*nVar, 1, 0, 1, 1, "flux_y_or_z_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"])
109
110 else:
111 self.context["matmulConfigs"]["flux_x_sck_vect"] = MatmulConfig(nDofPad, nVar, nDof, nDofPad , nDofPad, nDofPad, 1, 1, 1, 1, "flux_x_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"])
112 self.context["matmulConfigs"]["flux_y_sck_vect"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar , nDofPad, nDofPad*nVar, 1, 1, 1, 1, "flux_y_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"])
113 if self.context["nDim"]>=3:
114 self.context["matmulConfigs"]["flux_z_sck_vect"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar , nDofPad, nDofPad*nVar*nDof, 1, 1, 1, 1, "flux_z_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"])
115
116 self.context["matmulConfigs"]["gradQ_x_sck_vect"] = MatmulConfig(nDofPad, nVar*nDof*nDof3D, nDof, nDofPad, nDofPad, nDofPad, 1, 0, 1, 1, "gradQ_x_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
117 self.context["matmulConfigs"]["gradQ_y_sck_vect"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar, nDofPad, nDofPad*nVar, 1, 0, 1, 1, "gradQ_y_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
118 if self.context["nDim"]>=3:
119 self.context["matmulConfigs"]["gradQ_z_sck_vect"] = MatmulConfig(nDofPad*nVar*nDof, nDof, nDof, nDofPad*nVar*nDof, nDofPad, nDofPad*nVar*nDof, 1, 0, 1, 1, "gradQ_z_sck_vect", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
120
121
122 else: # split_ck scalar
123 if self.context["useFlux"]:
124 self.context["matmulConfigs"]["flux_x_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 1, 1, 1, "flux_x_sck", "nopf", "gemm", self.context["predictorComputePrecisions"])
125 self.context["matmulConfigs"]["flux_y_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad*nDof , 1, 1, 1, 1, "flux_y_sck", "nopf", "gemm", self.context["predictorComputePrecisions"])
126 if self.context["nDim"]>=3:
127 self.context["matmulConfigs"]["flux_z_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "flux_z_sck", "nopf", "gemm", self.context["predictorComputePrecisions"])
128
129 self.context["matmulConfigs"]["gradQ_x_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 0, 1, 1, "gradQ_x_sck", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
130 self.context["matmulConfigs"]["gradQ_y_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof , nDofPad, nVarPad*nDof , 1, 0, 1, 1, "gradQ_y_sck", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
131 if self.context["nDim"]>=3:
132 self.context["matmulConfigs"]["gradQ_z_sck"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 0, 1, 1, "gradQ_z_sck", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
133
134
135 else: # default linear
136 if self.context["useFlux"]:
137 self.context["matmulConfigs"]["flux_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad, 1, 0, 1, 1, "flux_x", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
138 self.context["matmulConfigs"]["flux_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof , nDofPad, nVarPad, 1, 0, 1, 1, "flux_y", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
139 if self.context["nDim"]>=3:
140 self.context["matmulConfigs"]["flux_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad, 1, 0, 1, 1, "flux_z", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
141
142 if self.context["useNCP"]:
143 self.context["matmulConfigs"]["gradQ_x"] = MatmulConfig(nVar, nDof, nDof, nDataPad , nDofPad, nVarPad , 1, 1, 1, 1, "gradQ_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
144 self.context["matmulConfigs"]["gradQ_y"] = MatmulConfig(nVar, nDof, nDof, nDataPad*nDof , nDofPad, nVarPad*nDof , 1, 1, 1, 1, "gradQ_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
145 if self.context["nDim"]>=3:
146 self.context["matmulConfigs"]["gradQ_z"] = MatmulConfig(nVar, nDof, nDof, nDataPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "gradQ_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
147
148
149 else: #NonLinear
150 if self.context["predictorRecompute"]: # TODO JMG matmuls for gradQ, rhs and lduh are exactly the same...
151 if self.context["useVectPDE"]:
152 if self.context["useFlux"]:
153 self.context["matmulConfigs"]["rhs_x"] = MatmulConfig(nDofPad, nVar, nDof, nDofPad, nDofPad, nDofPad , 1, 1, 1, 1, "rhs_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
154 self.context["matmulConfigs"]["rhs_y"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar, nDofPad, nDofPad*nVar , 1, 1, 1, 1, "rhs_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
155 if self.context["nDim"]>=3:
156 self.context["matmulConfigs"]["rhs_z"] = MatmulConfig(nDofPad*nVar*nDof, nDof, nDof, nDofPad*nVar*nDof, nDofPad, nDofPad*nVar*nDof, 1, 1, 1, 1, "rhs_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
157
158 self.context["matmulConfigs"]["lduh_x"] = MatmulConfig(nDofPad, nVar, nDof, nDofPad, nDofPad, nDofPad , 1, 1, 1, 1, "lduh_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
159 self.context["matmulConfigs"]["lduh_y"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar, nDofPad, nDofPad*nVar , 1, 1, 1, 1, "lduh_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
160 if self.context["nDim"]>=3:
161 self.context["matmulConfigs"]["lduh_z"] = MatmulConfig(nDofPad*nVar*nDof, nDof, nDof, nDofPad*nVar*nDof, nDofPad, nDofPad*nVar*nDof, 1, 1, 1, 1, "lduh_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
162
163 if self.context["useNCP"] or self.context['useViscousFlux']:
164 self.context["matmulConfigs"]["gradQ_x"] = MatmulConfig(nDofPad, nVar, nDof, nDofPad, nDofPad, nDofPad , 1, 1, 1, 1, "gradQ_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
165 self.context["matmulConfigs"]["gradQ_y"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar, nDofPad, nDofPad*nVar , 1, 1, 1, 1, "gradQ_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
166 if self.context["nDim"]>=3:
167 self.context["matmulConfigs"]["gradQ_z"] = MatmulConfig(nDofPad*nVar*nDof, nDof, nDof, nDofPad*nVar*nDof, nDofPad, nDofPad*nVar*nDof, 1, 1, 1, 1, "gradQ_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
168
169 self.context["matmulConfigs"]["lqi"] = MatmulConfig(nDofPad*nVar, nDof, nDof, nDofPad*nVar*nDof*nDof3D, nDofPad, nDofPad*nVar, 1, 0, 1, 1, "lqi", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
170
171
172 else: #scalar predictor recompute
173 if self.context["useFlux"]:
174 self.context["matmulConfigs"]["rhs_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 1, 1, 1, "rhs_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
175 self.context["matmulConfigs"]["rhs_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof , nDofPad, nVarPad*nDof , 1, 1, 1, 1, "rhs_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
176 if self.context["nDim"]>=3:
177 self.context["matmulConfigs"]["rhs_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "rhs_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
178
179 self.context["matmulConfigs"]["lduh_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad, nDofPad, nVarPad , 1, 1, 1, 1, "lduh_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
180 self.context["matmulConfigs"]["lduh_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof, nDofPad, nVarPad*nDof , 1, 1, 1, 1, "lduh_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
181 if self.context["nDim"]>=3:
182 self.context["matmulConfigs"]["lduh_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "lduh_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
183
184 if self.context["useNCP"] or self.context['useViscousFlux']:
185 self.context["matmulConfigs"]["gradQ_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 1, 1, 1, "gradQ_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
186 self.context["matmulConfigs"]["gradQ_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof, nDofPad, nVarPad*nDof , 1, 1, 1, 1, "gradQ_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
187 if self.context["nDim"]>=3:
188 self.context["matmulConfigs"]["gradQ_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "gradQ_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
189
190 self.context["matmulConfigs"]["lqi"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*(nDof**nDim), nDofPad, nVarPad, 1, 0, 1, 1, "lqi", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
191
192
193 else: # default nonlinear
194 if self.context["useFlux"]:
195 self.context["matmulConfigs"]["rhs_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 1, 1, 1, "rhs_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
196 self.context["matmulConfigs"]["rhs_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof , nDofPad, nVarPad*nDof , 1, 1, 1, 1, "rhs_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
197 if self.context["nDim"]>=3:
198 self.context["matmulConfigs"]["rhs_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "rhs_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
199
200 self.context["matmulConfigs"]["lduh_x"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad, nDofPad, nVarPad , 1, 1, 1, 1, "lduh_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
201 self.context["matmulConfigs"]["lduh_y"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad, nDofPad, nVarPad*nDof , 1, 1, 1, 1, "lduh_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
202 if self.context["nDim"]>=3:
203 self.context["matmulConfigs"]["lduh_z"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "lduh_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
204
205 if self.context["useCERKGuess"]:
206 self.context["matmulConfigs"]["gradF_x_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nVarPad , nDofPad, nVarPad , 1, 1, 1, 1, "gradF_x_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
207 self.context["matmulConfigs"]["gradF_y_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nVarPad*nDof , nDofPad, nVarPad*nDof , 1, 1, 1, 1, "gradF_y_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
208 if self.context["nDim"]>=3:
209 self.context["matmulConfigs"]["gradF_z_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nVarPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "gradF_z_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
210
211 if self.context["useNCP"] or self.context['useViscousFlux']:
212 self.context["matmulConfigs"]["gradQ_x"] = MatmulConfig(nVar, nDof, nDof, nDataPad , nDofPad, nVarPad , 1, 1, 1, 1, "gradQ_x", "nopf", "gemm", self.context["predictorComputePrecisions"])
213 self.context["matmulConfigs"]["gradQ_y"] = MatmulConfig(nVar, nDof, nDof, nDataPad*nDof, nDofPad, nVarPad*nDof , 1, 1, 1, 1, "gradQ_y", "nopf", "gemm", self.context["predictorComputePrecisions"])
214 if self.context["nDim"]>=3:
215 self.context["matmulConfigs"]["gradQ_z"] = MatmulConfig(nVar, nDof, nDof, nDataPad*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 1, 1, "gradQ_z", "nopf", "gemm", self.context["predictorComputePrecisions"])
216
217 if self.context["useCERKGuess"]:
218 self.context["matmulConfigs"]["gradQ_x_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nData , nDofPad, nVarPad , 1, 1, 0, 1, "gradQ_x_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
219 self.context["matmulConfigs"]["gradQ_y_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nData*nDof , nDofPad, nVarPad*nDof , 1, 1, 0, 1, "gradQ_y_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
220 if self.context["nDim"]>=3:
221 self.context["matmulConfigs"]["gradQ_z_RKLoop"] = MatmulConfig(nVar, nDof, nDof, nData*nDof2, nDofPad, nVarPad*nDof2, 1, 1, 0, 1, "gradQ_z_RKLoop", "nopf", "gemm", self.context["predictorComputePrecisions"])
222
223 self.context["matmulConfigs"]["lqi"] = MatmulConfig(nVarPad, nDof, nDof, nVarPad*(nDof**nDim), nDofPad, nVarPad, 1, 0, 1, 1, "lqi", "nopf", "gemm", self.context["predictorComputePrecisions"]) # beta, 0 => overwrite C
And from this we can write down f$ nabla phi_i nabla phi_i dx but since we are constructing matrix let s investigate the f$ our matrix elements will nabla phi_i dx f By this will be a sparse as these basis functions are chosen to not overlap with each other almost everywhere In other they have only local support We can read off the right hand side values
Specification of a dense matrix-matrix multiplication.