FE-Project
Loading...
Searching...
No Matches
scale_element_operation_tensorprod3D.F90
Go to the documentation of this file.
1
2!-------------------------------------------------------------------------------
3! Warning: This file was generated from element/scale_element_operation_tensorprod3D.F90.erb.
4! Do not edit this file.
5!-------------------------------------------------------------------------------
6!-------------------------------------------------------------------------------
7!> module FElib / Element / Operation with 3D tensor product elements for GPU
8!!
9!! @par Description
10!! A module for providing mathematical operations assuming a 3D tensor product element with (p+1)^3 DOF for GPU
11!!
12!! @author Yuta Kawai, Xuanzhengbo Ren, and Team SCALE
13!!
14!<
15#include "scaleFElib.h"
17
18 !-----------------------------------------------------------------------------
19 !
20 !++ used modules
21 !
22 use scale_precision
23 use scale_io
24
25 use scale_element_base, only: &
28
31
32 !-----------------------------------------------------------------------------
33 implicit none
34 private
35
36 !-----------------------------------------------------------------------------
37 !
38 !++ Public type & procedure
39 !
40
41 !> Derived type for elementwise operations with 3D tensor product elements
42 type, public, abstract, extends(elementoperationbase3d) :: elementoperationtensorprod3d
43 contains
44 procedure(elementoperationtensorprod3d_init), deferred, public :: init
45 procedure(elementoperationtensorprod3d_final), deferred, public :: final
47
48 interface
49 subroutine elementoperationtensorprod3d_init( this, elem3D )
51 import elementbase3d
52 class(elementoperationtensorprod3d), intent(inout) :: this
53 class(elementbase3d), intent(in), target :: elem3D
55
56 subroutine elementoperationtensorprod3d_final( this )
58 class(elementoperationtensorprod3d), intent(inout) :: this
59 end subroutine elementoperationtensorprod3d_final
60 end interface
61
63
64 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=1
66 real(rp) :: d1d(2,2)
67 real(rp) :: d1d_tr(2,2)
68 real(rp) :: lift_mat(2,2,2,6)
69 real(rp) :: lift_mat_tr(2,2,2,6)
70 real(rp) :: intrpmat_vpordm1_tr(2,2)
71
72 real(rp) :: mfilter_h1d(2,2)
73 real(rp) :: mfilter_h1d_tr(2,2)
74 real(rp) :: mfilter_v1d_tr(2,2)
75
76 real(rp) :: mfilter_tracer_h1d(2,2)
77 real(rp) :: mfilter_tracer_h1d_tr(2,2)
78 real(rp) :: mfilter_tracer_v1d_tr(2,2)
79 contains
80 procedure, public :: init => element_operation_tensorprod3d_init_p1
81 procedure, public :: final => element_operation_tensorprod3d_final_p1
82 procedure, public :: dx => element_operation_tensorprod3d_dx_p1
83 procedure, public :: dy => element_operation_tensorprod3d_dy_p1
84 procedure, public :: dz => element_operation_tensorprod3d_dz_p1
85 procedure, public :: lift => element_operation_tensorprod3d_lift_p1
86 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p1
87 procedure, public :: div => element_operation_tensorprod3d_div_p1
88 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p1
89 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p1
90 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p1
91 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p1
92 !-
93 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p1
94 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p1
95 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p1
96 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p1
98 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=2
100 real(rp) :: d1d(3,3)
101 real(rp) :: d1d_tr(3,3)
102 real(rp) :: lift_mat(3,3,3,6)
103 real(rp) :: lift_mat_tr(3,3,3,6)
104 real(rp) :: intrpmat_vpordm1_tr(3,3)
105
106 real(rp) :: mfilter_h1d(3,3)
107 real(rp) :: mfilter_h1d_tr(3,3)
108 real(rp) :: mfilter_v1d_tr(3,3)
109
110 real(rp) :: mfilter_tracer_h1d(3,3)
111 real(rp) :: mfilter_tracer_h1d_tr(3,3)
112 real(rp) :: mfilter_tracer_v1d_tr(3,3)
113 contains
114 procedure, public :: init => element_operation_tensorprod3d_init_p2
115 procedure, public :: final => element_operation_tensorprod3d_final_p2
116 procedure, public :: dx => element_operation_tensorprod3d_dx_p2
117 procedure, public :: dy => element_operation_tensorprod3d_dy_p2
118 procedure, public :: dz => element_operation_tensorprod3d_dz_p2
119 procedure, public :: lift => element_operation_tensorprod3d_lift_p2
120 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p2
121 procedure, public :: div => element_operation_tensorprod3d_div_p2
122 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p2
123 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p2
124 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p2
125 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p2
126 !-
127 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p2
128 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p2
129 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p2
130 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p2
132 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=3
134 real(rp) :: d1d(4,4)
135 real(rp) :: d1d_tr(4,4)
136 real(rp) :: lift_mat(4,4,4,6)
137 real(rp) :: lift_mat_tr(4,4,4,6)
138 real(rp) :: intrpmat_vpordm1_tr(4,4)
139
140 real(rp) :: mfilter_h1d(4,4)
141 real(rp) :: mfilter_h1d_tr(4,4)
142 real(rp) :: mfilter_v1d_tr(4,4)
143
144 real(rp) :: mfilter_tracer_h1d(4,4)
145 real(rp) :: mfilter_tracer_h1d_tr(4,4)
146 real(rp) :: mfilter_tracer_v1d_tr(4,4)
147 contains
148 procedure, public :: init => element_operation_tensorprod3d_init_p3
149 procedure, public :: final => element_operation_tensorprod3d_final_p3
150 procedure, public :: dx => element_operation_tensorprod3d_dx_p3
151 procedure, public :: dy => element_operation_tensorprod3d_dy_p3
152 procedure, public :: dz => element_operation_tensorprod3d_dz_p3
153 procedure, public :: lift => element_operation_tensorprod3d_lift_p3
154 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p3
155 procedure, public :: div => element_operation_tensorprod3d_div_p3
156 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p3
157 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p3
158 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p3
159 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p3
160 !-
161 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p3
162 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p3
163 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p3
164 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p3
166 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=4
168 real(rp) :: d1d(5,5)
169 real(rp) :: d1d_tr(5,5)
170 real(rp) :: lift_mat(5,5,5,6)
171 real(rp) :: lift_mat_tr(5,5,5,6)
172 real(rp) :: intrpmat_vpordm1_tr(5,5)
173
174 real(rp) :: mfilter_h1d(5,5)
175 real(rp) :: mfilter_h1d_tr(5,5)
176 real(rp) :: mfilter_v1d_tr(5,5)
177
178 real(rp) :: mfilter_tracer_h1d(5,5)
179 real(rp) :: mfilter_tracer_h1d_tr(5,5)
180 real(rp) :: mfilter_tracer_v1d_tr(5,5)
181 contains
182 procedure, public :: init => element_operation_tensorprod3d_init_p4
183 procedure, public :: final => element_operation_tensorprod3d_final_p4
184 procedure, public :: dx => element_operation_tensorprod3d_dx_p4
185 procedure, public :: dy => element_operation_tensorprod3d_dy_p4
186 procedure, public :: dz => element_operation_tensorprod3d_dz_p4
187 procedure, public :: lift => element_operation_tensorprod3d_lift_p4
188 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p4
189 procedure, public :: div => element_operation_tensorprod3d_div_p4
190 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p4
191 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p4
192 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p4
193 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p4
194 !-
195 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p4
196 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p4
197 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p4
198 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p4
200 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=5
202 real(rp) :: d1d(6,6)
203 real(rp) :: d1d_tr(6,6)
204 real(rp) :: lift_mat(6,6,6,6)
205 real(rp) :: lift_mat_tr(6,6,6,6)
206 real(rp) :: intrpmat_vpordm1_tr(6,6)
207
208 real(rp) :: mfilter_h1d(6,6)
209 real(rp) :: mfilter_h1d_tr(6,6)
210 real(rp) :: mfilter_v1d_tr(6,6)
211
212 real(rp) :: mfilter_tracer_h1d(6,6)
213 real(rp) :: mfilter_tracer_h1d_tr(6,6)
214 real(rp) :: mfilter_tracer_v1d_tr(6,6)
215 contains
216 procedure, public :: init => element_operation_tensorprod3d_init_p5
217 procedure, public :: final => element_operation_tensorprod3d_final_p5
218 procedure, public :: dx => element_operation_tensorprod3d_dx_p5
219 procedure, public :: dy => element_operation_tensorprod3d_dy_p5
220 procedure, public :: dz => element_operation_tensorprod3d_dz_p5
221 procedure, public :: lift => element_operation_tensorprod3d_lift_p5
222 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p5
223 procedure, public :: div => element_operation_tensorprod3d_div_p5
224 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p5
225 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p5
226 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p5
227 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p5
228 !-
229 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p5
230 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p5
231 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p5
232 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p5
234 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=6
236 real(rp) :: d1d(7,7)
237 real(rp) :: d1d_tr(7,7)
238 real(rp) :: lift_mat(7,7,7,6)
239 real(rp) :: lift_mat_tr(7,7,7,6)
240 real(rp) :: intrpmat_vpordm1_tr(7,7)
241
242 real(rp) :: mfilter_h1d(7,7)
243 real(rp) :: mfilter_h1d_tr(7,7)
244 real(rp) :: mfilter_v1d_tr(7,7)
245
246 real(rp) :: mfilter_tracer_h1d(7,7)
247 real(rp) :: mfilter_tracer_h1d_tr(7,7)
248 real(rp) :: mfilter_tracer_v1d_tr(7,7)
249 contains
250 procedure, public :: init => element_operation_tensorprod3d_init_p6
251 procedure, public :: final => element_operation_tensorprod3d_final_p6
252 procedure, public :: dx => element_operation_tensorprod3d_dx_p6
253 procedure, public :: dy => element_operation_tensorprod3d_dy_p6
254 procedure, public :: dz => element_operation_tensorprod3d_dz_p6
255 procedure, public :: lift => element_operation_tensorprod3d_lift_p6
256 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p6
257 procedure, public :: div => element_operation_tensorprod3d_div_p6
258 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p6
259 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p6
260 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p6
261 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p6
262 !-
263 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p6
264 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p6
265 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p6
266 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p6
268 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=7
270 real(rp) :: d1d(8,8)
271 real(rp) :: d1d_tr(8,8)
272 real(rp) :: lift_mat(8,8,8,6)
273 real(rp) :: lift_mat_tr(8,8,8,6)
274 real(rp) :: intrpmat_vpordm1_tr(8,8)
275
276 real(rp) :: mfilter_h1d(8,8)
277 real(rp) :: mfilter_h1d_tr(8,8)
278 real(rp) :: mfilter_v1d_tr(8,8)
279
280 real(rp) :: mfilter_tracer_h1d(8,8)
281 real(rp) :: mfilter_tracer_h1d_tr(8,8)
282 real(rp) :: mfilter_tracer_v1d_tr(8,8)
283 contains
284 procedure, public :: init => element_operation_tensorprod3d_init_p7
285 procedure, public :: final => element_operation_tensorprod3d_final_p7
286 procedure, public :: dx => element_operation_tensorprod3d_dx_p7
287 procedure, public :: dy => element_operation_tensorprod3d_dy_p7
288 procedure, public :: dz => element_operation_tensorprod3d_dz_p7
289 procedure, public :: lift => element_operation_tensorprod3d_lift_p7
290 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p7
291 procedure, public :: div => element_operation_tensorprod3d_div_p7
292 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p7
293 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p7
294 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p7
295 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p7
296 !-
297 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p7
298 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p7
299 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p7
300 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p7
302 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=8
304 real(rp) :: d1d(9,9)
305 real(rp) :: d1d_tr(9,9)
306 real(rp) :: lift_mat(9,9,9,6)
307 real(rp) :: lift_mat_tr(9,9,9,6)
308 real(rp) :: intrpmat_vpordm1_tr(9,9)
309
310 real(rp) :: mfilter_h1d(9,9)
311 real(rp) :: mfilter_h1d_tr(9,9)
312 real(rp) :: mfilter_v1d_tr(9,9)
313
314 real(rp) :: mfilter_tracer_h1d(9,9)
315 real(rp) :: mfilter_tracer_h1d_tr(9,9)
316 real(rp) :: mfilter_tracer_v1d_tr(9,9)
317 contains
318 procedure, public :: init => element_operation_tensorprod3d_init_p8
319 procedure, public :: final => element_operation_tensorprod3d_final_p8
320 procedure, public :: dx => element_operation_tensorprod3d_dx_p8
321 procedure, public :: dy => element_operation_tensorprod3d_dy_p8
322 procedure, public :: dz => element_operation_tensorprod3d_dz_p8
323 procedure, public :: lift => element_operation_tensorprod3d_lift_p8
324 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p8
325 procedure, public :: div => element_operation_tensorprod3d_div_p8
326 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p8
327 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p8
328 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p8
329 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p8
330 !-
331 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p8
332 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p8
333 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p8
334 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p8
336 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=9
338 real(rp) :: d1d(10,10)
339 real(rp) :: d1d_tr(10,10)
340 real(rp) :: lift_mat(10,10,10,6)
341 real(rp) :: lift_mat_tr(10,10,10,6)
342 real(rp) :: intrpmat_vpordm1_tr(10,10)
343
344 real(rp) :: mfilter_h1d(10,10)
345 real(rp) :: mfilter_h1d_tr(10,10)
346 real(rp) :: mfilter_v1d_tr(10,10)
347
348 real(rp) :: mfilter_tracer_h1d(10,10)
349 real(rp) :: mfilter_tracer_h1d_tr(10,10)
350 real(rp) :: mfilter_tracer_v1d_tr(10,10)
351 contains
352 procedure, public :: init => element_operation_tensorprod3d_init_p9
353 procedure, public :: final => element_operation_tensorprod3d_final_p9
354 procedure, public :: dx => element_operation_tensorprod3d_dx_p9
355 procedure, public :: dy => element_operation_tensorprod3d_dy_p9
356 procedure, public :: dz => element_operation_tensorprod3d_dz_p9
357 procedure, public :: lift => element_operation_tensorprod3d_lift_p9
358 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p9
359 procedure, public :: div => element_operation_tensorprod3d_div_p9
360 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p9
361 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p9
362 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p9
363 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p9
364 !-
365 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p9
366 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p9
367 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p9
368 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p9
370 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=10
372 real(rp) :: d1d(11,11)
373 real(rp) :: d1d_tr(11,11)
374 real(rp) :: lift_mat(11,11,11,6)
375 real(rp) :: lift_mat_tr(11,11,11,6)
376 real(rp) :: intrpmat_vpordm1_tr(11,11)
377
378 real(rp) :: mfilter_h1d(11,11)
379 real(rp) :: mfilter_h1d_tr(11,11)
380 real(rp) :: mfilter_v1d_tr(11,11)
381
382 real(rp) :: mfilter_tracer_h1d(11,11)
383 real(rp) :: mfilter_tracer_h1d_tr(11,11)
384 real(rp) :: mfilter_tracer_v1d_tr(11,11)
385 contains
386 procedure, public :: init => element_operation_tensorprod3d_init_p10
387 procedure, public :: final => element_operation_tensorprod3d_final_p10
388 procedure, public :: dx => element_operation_tensorprod3d_dx_p10
389 procedure, public :: dy => element_operation_tensorprod3d_dy_p10
390 procedure, public :: dz => element_operation_tensorprod3d_dz_p10
391 procedure, public :: lift => element_operation_tensorprod3d_lift_p10
392 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p10
393 procedure, public :: div => element_operation_tensorprod3d_div_p10
394 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p10
395 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p10
396 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p10
397 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p10
398 !-
399 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p10
400 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p10
401 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p10
402 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p10
404 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=11
406 real(rp) :: d1d(12,12)
407 real(rp) :: d1d_tr(12,12)
408 real(rp) :: lift_mat(12,12,12,6)
409 real(rp) :: lift_mat_tr(12,12,12,6)
410 real(rp) :: intrpmat_vpordm1_tr(12,12)
411
412 real(rp) :: mfilter_h1d(12,12)
413 real(rp) :: mfilter_h1d_tr(12,12)
414 real(rp) :: mfilter_v1d_tr(12,12)
415
416 real(rp) :: mfilter_tracer_h1d(12,12)
417 real(rp) :: mfilter_tracer_h1d_tr(12,12)
418 real(rp) :: mfilter_tracer_v1d_tr(12,12)
419 contains
420 procedure, public :: init => element_operation_tensorprod3d_init_p11
421 procedure, public :: final => element_operation_tensorprod3d_final_p11
422 procedure, public :: dx => element_operation_tensorprod3d_dx_p11
423 procedure, public :: dy => element_operation_tensorprod3d_dy_p11
424 procedure, public :: dz => element_operation_tensorprod3d_dz_p11
425 procedure, public :: lift => element_operation_tensorprod3d_lift_p11
426 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p11
427 procedure, public :: div => element_operation_tensorprod3d_div_p11
428 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p11
429 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p11
430 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p11
431 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p11
432 !-
433 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p11
434 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p11
435 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p11
436 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p11
438 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=12
440 real(rp) :: d1d(13,13)
441 real(rp) :: d1d_tr(13,13)
442 real(rp) :: lift_mat(13,13,13,6)
443 real(rp) :: lift_mat_tr(13,13,13,6)
444 real(rp) :: intrpmat_vpordm1_tr(13,13)
445
446 real(rp) :: mfilter_h1d(13,13)
447 real(rp) :: mfilter_h1d_tr(13,13)
448 real(rp) :: mfilter_v1d_tr(13,13)
449
450 real(rp) :: mfilter_tracer_h1d(13,13)
451 real(rp) :: mfilter_tracer_h1d_tr(13,13)
452 real(rp) :: mfilter_tracer_v1d_tr(13,13)
453 contains
454 procedure, public :: init => element_operation_tensorprod3d_init_p12
455 procedure, public :: final => element_operation_tensorprod3d_final_p12
456 procedure, public :: dx => element_operation_tensorprod3d_dx_p12
457 procedure, public :: dy => element_operation_tensorprod3d_dy_p12
458 procedure, public :: dz => element_operation_tensorprod3d_dz_p12
459 procedure, public :: lift => element_operation_tensorprod3d_lift_p12
460 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p12
461 procedure, public :: div => element_operation_tensorprod3d_div_p12
462 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p12
463 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p12
464 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p12
465 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p12
466 !-
467 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p12
468 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p12
469 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p12
470 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p12
472 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=13
474 real(rp) :: d1d(14,14)
475 real(rp) :: d1d_tr(14,14)
476 real(rp) :: lift_mat(14,14,14,6)
477 real(rp) :: lift_mat_tr(14,14,14,6)
478 real(rp) :: intrpmat_vpordm1_tr(14,14)
479
480 real(rp) :: mfilter_h1d(14,14)
481 real(rp) :: mfilter_h1d_tr(14,14)
482 real(rp) :: mfilter_v1d_tr(14,14)
483
484 real(rp) :: mfilter_tracer_h1d(14,14)
485 real(rp) :: mfilter_tracer_h1d_tr(14,14)
486 real(rp) :: mfilter_tracer_v1d_tr(14,14)
487 contains
488 procedure, public :: init => element_operation_tensorprod3d_init_p13
489 procedure, public :: final => element_operation_tensorprod3d_final_p13
490 procedure, public :: dx => element_operation_tensorprod3d_dx_p13
491 procedure, public :: dy => element_operation_tensorprod3d_dy_p13
492 procedure, public :: dz => element_operation_tensorprod3d_dz_p13
493 procedure, public :: lift => element_operation_tensorprod3d_lift_p13
494 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p13
495 procedure, public :: div => element_operation_tensorprod3d_div_p13
496 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p13
497 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p13
498 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p13
499 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p13
500 !-
501 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p13
502 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p13
503 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p13
504 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p13
506 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=14
508 real(rp) :: d1d(15,15)
509 real(rp) :: d1d_tr(15,15)
510 real(rp) :: lift_mat(15,15,15,6)
511 real(rp) :: lift_mat_tr(15,15,15,6)
512 real(rp) :: intrpmat_vpordm1_tr(15,15)
513
514 real(rp) :: mfilter_h1d(15,15)
515 real(rp) :: mfilter_h1d_tr(15,15)
516 real(rp) :: mfilter_v1d_tr(15,15)
517
518 real(rp) :: mfilter_tracer_h1d(15,15)
519 real(rp) :: mfilter_tracer_h1d_tr(15,15)
520 real(rp) :: mfilter_tracer_v1d_tr(15,15)
521 contains
522 procedure, public :: init => element_operation_tensorprod3d_init_p14
523 procedure, public :: final => element_operation_tensorprod3d_final_p14
524 procedure, public :: dx => element_operation_tensorprod3d_dx_p14
525 procedure, public :: dy => element_operation_tensorprod3d_dy_p14
526 procedure, public :: dz => element_operation_tensorprod3d_dz_p14
527 procedure, public :: lift => element_operation_tensorprod3d_lift_p14
528 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p14
529 procedure, public :: div => element_operation_tensorprod3d_div_p14
530 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p14
531 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p14
532 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p14
533 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p14
534 !-
535 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p14
536 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p14
537 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p14
538 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p14
540 !> Derived type for elementwise operations with 3D tensor product elements with polynomial order p=15
542 real(rp) :: d1d(16,16)
543 real(rp) :: d1d_tr(16,16)
544 real(rp) :: lift_mat(16,16,16,6)
545 real(rp) :: lift_mat_tr(16,16,16,6)
546 real(rp) :: intrpmat_vpordm1_tr(16,16)
547
548 real(rp) :: mfilter_h1d(16,16)
549 real(rp) :: mfilter_h1d_tr(16,16)
550 real(rp) :: mfilter_v1d_tr(16,16)
551
552 real(rp) :: mfilter_tracer_h1d(16,16)
553 real(rp) :: mfilter_tracer_h1d_tr(16,16)
554 real(rp) :: mfilter_tracer_v1d_tr(16,16)
555 contains
556 procedure, public :: init => element_operation_tensorprod3d_init_p15
557 procedure, public :: final => element_operation_tensorprod3d_final_p15
558 procedure, public :: dx => element_operation_tensorprod3d_dx_p15
559 procedure, public :: dy => element_operation_tensorprod3d_dy_p15
560 procedure, public :: dz => element_operation_tensorprod3d_dz_p15
561 procedure, public :: lift => element_operation_tensorprod3d_lift_p15
562 procedure, public :: dxdydzlift => element_operation_tensorprod3d_dxdydzlift_p15
563 procedure, public :: div => element_operation_tensorprod3d_div_p15
564 procedure, public :: div_var5 => element_operation_tensorprod3d_div_var5_p15
565 procedure, public :: div_var5_2 => element_operation_tensorprod3d_div_var5_2_p15
566 procedure, public :: lift_var5 => element_operation_tensorprod3d_lift_var5_p15
567 procedure, public :: vfilterpm1 => element_operation_tensorprod3d_vfilterpm1_p15
568 !-
569 procedure, public :: setup_modalfilter => element_operation_tensorprod3d_setup_modalfilter_p15
570 procedure, public :: setup_modalfilter_tracer => element_operation_tensorprod3d_setup_modalfilter_tracer_p15
571 procedure, public :: modalfilter_tracer => element_operation_tensorprod3d_modalfilter_tracer_p15
572 procedure, public :: modalfilter_var5 => element_operation_tensorprod3d_modalfilter_var5_p15
574
575contains
576 !> Factory subroutine to create an object of ElementOperationTensorProd3D
577!OCL SERIAL
578 subroutine elementoperationtensorprod3d_create( elem3D, obj )
579 use scale_prc, only: prc_abort
580 implicit none
581 class(elementbase3d), intent(in) :: elem3d !< A 3D element object whose polynomial order is used to determine the type of created object
582 class(elementoperationtensorprod3d), intent(out), allocatable :: obj !< Created object of ElementOperationTensorProd3D
583 !-----------------------------------------------------
584
585 if ( elem3d%PolyOrder_h /= elem3d%PolyOrder_v ) then
586 log_info('ElemenetOperationTensorprod3D_create',*) 'PolyOrder_h and PolyOrder_v should be same in this module. ElemenetOperationGeneral should be used!'
587 call prc_abort
588 end if
589
590 select case( elem3d%PolyOrder_h )
591 case(1)
592 allocate( elementoperationtensorprod3d_p1 :: obj )
593 case(2)
594 allocate( elementoperationtensorprod3d_p2 :: obj )
595 case(3)
596 allocate( elementoperationtensorprod3d_p3 :: obj )
597 case(4)
598 allocate( elementoperationtensorprod3d_p4 :: obj )
599 case(5)
600 allocate( elementoperationtensorprod3d_p5 :: obj )
601 case(6)
602 allocate( elementoperationtensorprod3d_p6 :: obj )
603 case(7)
604 allocate( elementoperationtensorprod3d_p7 :: obj )
605 case(8)
606 allocate( elementoperationtensorprod3d_p8 :: obj )
607 case(9)
608 allocate( elementoperationtensorprod3d_p9 :: obj )
609 case(10)
610 allocate( elementoperationtensorprod3d_p10 :: obj )
611 case(11)
612 allocate( elementoperationtensorprod3d_p11 :: obj )
613 case(12)
614 allocate( elementoperationtensorprod3d_p12 :: obj )
615 case(13)
616 allocate( elementoperationtensorprod3d_p13 :: obj )
617 case(14)
618 allocate( elementoperationtensorprod3d_p14 :: obj )
619 case(15)
620 allocate( elementoperationtensorprod3d_p15 :: obj )
621 case default
622 log_info('ElemenetOperationTensorprod3D_create',*) 'The specified polynomial order execceds 15 and is not supported in this module. ElemenetOperationGeneral should be used!'
623 call prc_abort
624 end select
625 call obj%Init( elem3d )
626
627 return
629
630
631!--- For p=1 ------------------------------------
632
633!> Initialization
634!!
635!OCL SERIAL
636 subroutine element_operation_tensorprod3d_init_p1( this, elem3D )
638 implicit none
639 class(elementoperationtensorprod3d_p1), intent(inout) :: this
640 class(elementbase3d), intent(in), target :: elem3d
641 !----------------------------------------------------------
642
643 this%elem3D => elem3d
644 this%operator_type = element_operator_type_tensorprod3d
645
646 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
647 2, elem3d )
648 !$acc enter data copyin( this )
649 !$acc enter data attach( this%elem3D )
650
651 return
652 end subroutine element_operation_tensorprod3d_init_p1
653
654 !> Setup modal filter
655 !!
656!OCL SERIAL
657 subroutine element_operation_tensorprod3d_setup_modalfilter_p1( this, &
658 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
659 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
662 implicit none
663 class(elementoperationtensorprod3d_p1), intent(inout) :: this
664 real(rp), intent(in) :: mf_etac_h
665 real(rp), intent(in) :: mf_alpha_h
666 integer, intent(in) :: mf_order_h
667 real(rp), intent(in) :: mf_etac_v
668 real(rp), intent(in) :: mf_alpha_v
669 integer, intent(in) :: mf_order_v
670 !--------------------------------------------------------
671
672 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
673 mf_etac_h, mf_alpha_h, mf_order_h, &
674 mf_etac_v, mf_alpha_v, mf_order_v, &
675 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
676 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
677 return
678 end subroutine element_operation_tensorprod3d_setup_modalfilter_p1
679
680!> Setup modal filter for tracer
681!!
682!OCL SERIAL
683 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p1( this, &
684 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
685 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
688 implicit none
689 class(elementoperationtensorprod3d_p1), intent(inout) :: this
690 real(rp), intent(in) :: mf_etac_h
691 real(rp), intent(in) :: mf_alpha_h
692 integer, intent(in) :: mf_order_h
693 real(rp), intent(in) :: mf_etac_v
694 real(rp), intent(in) :: mf_alpha_v
695 integer, intent(in) :: mf_order_v
696 !--------------------------------------------------------
697
698 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
699 mf_etac_h, mf_alpha_h, mf_order_h, &
700 mf_etac_v, mf_alpha_v, mf_order_v, &
701 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
702 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
703 return
704 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p1
705
706!> Finalization
707!!
708!OCL SERIAL
709 subroutine element_operation_tensorprod3d_final_p1( this )
710 implicit none
711 class(elementoperationtensorprod3d_p1), intent(inout) :: this
712 !----------------------------------------------------------
713 nullify( this%elem3D )
714 !$acc exit data delete( this )
715 return
716 end subroutine element_operation_tensorprod3d_final_p1
717
718!> Calculate the differential in x-direction
719!!
720!OCL SERIAL
721 subroutine element_operation_tensorprod3d_dx_p1( this, vec_in, vec_out )
723 implicit none
724 class(elementoperationtensorprod3d_p1), intent(in) :: this
725 real(rp), intent(in) :: vec_in(this%elem3d%np)
726 real(rp), intent(out) :: vec_out(this%elem3d%np)
727 !----------------------------------------------------------
728 call element_operation_kernel_matvec_dirx_p1( this%D1D, vec_in, vec_out )
729 return
730 end subroutine element_operation_tensorprod3d_dx_p1
731
732!> Calculate the differential in y-direction
733!!
734!OCL SERIAL
735 subroutine element_operation_tensorprod3d_dy_p1( this, vec_in, vec_out )
737 implicit none
738 class(elementoperationtensorprod3d_p1), intent(in) :: this
739 real(rp), intent(in) :: vec_in(this%elem3d%np)
740 real(rp), intent(out) :: vec_out(this%elem3d%np)
741 !----------------------------------------------------------
742 call element_operation_kernel_matvec_diry_p1( this%D1D_tr, vec_in, vec_out )
743 return
744 end subroutine element_operation_tensorprod3d_dy_p1
745
746!> Calculate the differential in z-direction
747!!
748!OCL SERIAL
749 subroutine element_operation_tensorprod3d_dz_p1( this, vec_in, vec_out )
751 implicit none
752 class(elementoperationtensorprod3d_p1), intent(in) :: this
753 real(rp), intent(in) :: vec_in(this%elem3d%np)
754 real(rp), intent(out) :: vec_out(this%elem3d%np)
755 !----------------------------------------------------------
756 call element_operation_kernel_matvec_dirz_p1( this%D1D_tr, vec_in, vec_out )
757 return
758 end subroutine element_operation_tensorprod3d_dz_p1
759
760!> Calculate the lifting term
761!!
762!OCL SERIAL
763 subroutine element_operation_tensorprod3d_lift_p1( this, vec_in, vec_out )
765 implicit none
766 class(elementoperationtensorprod3d_p1), intent(in) :: this
767 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
768 real(rp), intent(out) :: vec_out(this%elem3d%np)
769 !----------------------------------------------------------
770 call element_operation_kernel_matvec_lift_hexahedral_p1( this%Lift_mat, vec_in, vec_out )
771 return
772 end subroutine element_operation_tensorprod3d_lift_p1
773
774!> Calculate the 3D gradient
775!!
776!OCL SERIAL
777 subroutine element_operation_tensorprod3d_dxdydzlift_p1( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
781 implicit none
782 class(elementoperationtensorprod3d_p1), intent(in) :: this
783 real(rp), intent(in) :: vec_in(this%elem3d%np)
784 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
785 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
786 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
787 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
788 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
789 !----------------------------------------------------------
790 call element_operation_kernel_matvec_gradlike_dirxyz_p1( this%D1D, this%D1D_tr, vec_in, vec_in, &
791 vec_out_dx, vec_out_dy, vec_out_dz )
792 call element_operation_kernel_matvec_lift_hexahedral_p1( this%Lift_mat, vec_in_lift, &
793 vec_out_lift )
794
795 return
796 end subroutine element_operation_tensorprod3d_dxdydzlift_p1
797
798!> Calculate the 3D divergence
799!!
800!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
801!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
802!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
803!!
804!OCL SERIAL
805 subroutine element_operation_tensorprod3d_div_p1( this, vec_in, vec_in_lift, &
806 vec_out )
810 implicit none
811 class(elementoperationtensorprod3d_p1), intent(in) :: this
812 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
813 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
814 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
815 !----------------------------------------------------------
816
817 call element_operation_kernel_matvec_lift_hexahedral_p1( this%Lift_mat, vec_in_lift, &
818 vec_out(:,4) )
819
820 call element_operation_kernel_matvec_divlike_dirxyz_p1( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
821 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
822 return
823 end subroutine element_operation_tensorprod3d_div_p1
824
825!> Calculate the 3D gradient applied for five variables
826!!
827!OCL SERIAL
828 subroutine element_operation_tensorprod3d_div_var5_p1( this, vec_in, vec_in_lift, &
829 vec_out_d )
833 implicit none
834 class(elementoperationtensorprod3d_p1), intent(in) :: this
835 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
836 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
837 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
838
839 integer :: iv
840 !----------------------------------------------------------
841
842 do iv=1, 5
843 call element_operation_kernel_matvec_lift_hexahedral_p1( this%Lift_mat, vec_in_lift(:,iv), &
844 vec_out_d(:,4,iv) )
845 end do
846 do iv=1, 5
847 call element_operation_kernel_matvec_divlike_dirxyz_p1( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
848 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
849 end do
850 return
851 end subroutine element_operation_tensorprod3d_div_var5_p1
852
853!> Calculate the 3D divergence applied for five variables
854!!
855!OCL SERIAL
856 subroutine element_operation_tensorprod3d_div_var5_2_p1( this, vec_in, &
857 vec_out_d )
860 implicit none
861 class(elementoperationtensorprod3d_p1), intent(in) :: this
862 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
863 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
864
865 integer :: iv
866 !----------------------------------------------------------
867
868 do iv=1, 5
869 call element_operation_kernel_matvec_divlike_dirxyz_p1( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
870 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
871 end do
872 return
873 end subroutine element_operation_tensorprod3d_div_var5_2_p1
874
875!> Calculate the lifting term applied for five variables
876!!
877!OCL SERIAL
878 subroutine element_operation_tensorprod3d_lift_var5_p1( this, vec_in, vec_out )
880 implicit none
881 class(elementoperationtensorprod3d_p1), intent(in) :: this
882 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
883 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
884
885 integer :: iv
886 !----------------------------------------------------------
887 do iv=1, 5
888 call element_operation_kernel_matvec_lift_hexahedral_p1( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
889 end do
890 return
891 end subroutine element_operation_tensorprod3d_lift_var5_p1
892
893!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
894!!
895!OCL SERIAL
896 subroutine element_operation_tensorprod3d_vfilterpm1_p1( this, vec_in, vec_out )
898 implicit none
899 class(elementoperationtensorprod3d_p1), intent(in) :: this
900 real(rp), intent(in) :: vec_in(this%elem3d%np)
901 real(rp), intent(out) :: vec_out(this%elem3d%np)
902 !---------------------------------------------------------------
903
904 call element_operation_kernel_matvec_dirz_p1( this%IntrpMat_VPOrdM1_tr, vec_in, &
905 vec_out )
906 return
907 end subroutine element_operation_tensorprod3d_vfilterpm1_p1
908
909!> Apply a modal filter for tracer variables
910!!
911!OCL SERIAL
912 subroutine element_operation_tensorprod3d_modalfilter_tracer_p1( this, vec_in, vec_work, vec_out )
915
916 implicit none
917 class(elementoperationtensorprod3d_p1), intent(in) :: this
918 real(rp), intent(in) :: vec_in(this%elem3d%np)
919 real(rp), intent(out) :: vec_work(this%elem3d%np)
920 real(rp), intent(out) :: vec_out(this%elem3d%np)
921 !---------------------------------------------
922
923 call element_operation_kernel_matvec_modalfilter_p1( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
924 vec_out(:) )
925
926 return
927 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p1
928
929!> Apply a modal filter for five variables
930!!
931!OCL SERIAL
932 subroutine element_operation_tensorprod3d_modalfilter_var5_p1( this, vec_in, vec_work, vec_out )
935
936 implicit none
937 class(elementoperationtensorprod3d_p1), intent(in) :: this
938 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
939 real(rp), intent(out) :: vec_work(this%elem3d%np)
940 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
941 integer :: iv
942 !---------------------------------------------
943
944 do iv=1, 5
945 call element_operation_kernel_matvec_modalfilter_p1( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
946 vec_out(:,iv) )
947 end do
948
949 return
950 end subroutine element_operation_tensorprod3d_modalfilter_var5_p1
951
952
953!--- For p=2 ------------------------------------
954
955!> Initialization
956!!
957!OCL SERIAL
958 subroutine element_operation_tensorprod3d_init_p2( this, elem3D )
960 implicit none
961 class(elementoperationtensorprod3d_p2), intent(inout) :: this
962 class(elementbase3d), intent(in), target :: elem3d
963 !----------------------------------------------------------
964
965 this%elem3D => elem3d
966 this%operator_type = element_operator_type_tensorprod3d
967
968 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
969 3, elem3d )
970 !$acc enter data copyin( this )
971 !$acc enter data attach( this%elem3D )
972
973 return
974 end subroutine element_operation_tensorprod3d_init_p2
975
976 !> Setup modal filter
977 !!
978!OCL SERIAL
979 subroutine element_operation_tensorprod3d_setup_modalfilter_p2( this, &
980 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
981 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
984 implicit none
985 class(elementoperationtensorprod3d_p2), intent(inout) :: this
986 real(rp), intent(in) :: mf_etac_h
987 real(rp), intent(in) :: mf_alpha_h
988 integer, intent(in) :: mf_order_h
989 real(rp), intent(in) :: mf_etac_v
990 real(rp), intent(in) :: mf_alpha_v
991 integer, intent(in) :: mf_order_v
992 !--------------------------------------------------------
993
994 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
995 mf_etac_h, mf_alpha_h, mf_order_h, &
996 mf_etac_v, mf_alpha_v, mf_order_v, &
997 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
998 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
999 return
1000 end subroutine element_operation_tensorprod3d_setup_modalfilter_p2
1001
1002!> Setup modal filter for tracer
1003!!
1004!OCL SERIAL
1005 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p2( this, &
1006 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1007 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1010 implicit none
1011 class(elementoperationtensorprod3d_p2), intent(inout) :: this
1012 real(rp), intent(in) :: mf_etac_h
1013 real(rp), intent(in) :: mf_alpha_h
1014 integer, intent(in) :: mf_order_h
1015 real(rp), intent(in) :: mf_etac_v
1016 real(rp), intent(in) :: mf_alpha_v
1017 integer, intent(in) :: mf_order_v
1018 !--------------------------------------------------------
1019
1020 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
1021 mf_etac_h, mf_alpha_h, mf_order_h, &
1022 mf_etac_v, mf_alpha_v, mf_order_v, &
1023 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1024 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
1025 return
1026 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p2
1027
1028!> Finalization
1029!!
1030!OCL SERIAL
1031 subroutine element_operation_tensorprod3d_final_p2( this )
1032 implicit none
1033 class(elementoperationtensorprod3d_p2), intent(inout) :: this
1034 !----------------------------------------------------------
1035 nullify( this%elem3D )
1036 !$acc exit data delete( this )
1037 return
1038 end subroutine element_operation_tensorprod3d_final_p2
1039
1040!> Calculate the differential in x-direction
1041!!
1042!OCL SERIAL
1043 subroutine element_operation_tensorprod3d_dx_p2( this, vec_in, vec_out )
1045 implicit none
1046 class(elementoperationtensorprod3d_p2), intent(in) :: this
1047 real(rp), intent(in) :: vec_in(this%elem3d%np)
1048 real(rp), intent(out) :: vec_out(this%elem3d%np)
1049 !----------------------------------------------------------
1050 call element_operation_kernel_matvec_dirx_p2( this%D1D, vec_in, vec_out )
1051 return
1052 end subroutine element_operation_tensorprod3d_dx_p2
1053
1054!> Calculate the differential in y-direction
1055!!
1056!OCL SERIAL
1057 subroutine element_operation_tensorprod3d_dy_p2( this, vec_in, vec_out )
1059 implicit none
1060 class(elementoperationtensorprod3d_p2), intent(in) :: this
1061 real(rp), intent(in) :: vec_in(this%elem3d%np)
1062 real(rp), intent(out) :: vec_out(this%elem3d%np)
1063 !----------------------------------------------------------
1064 call element_operation_kernel_matvec_diry_p2( this%D1D_tr, vec_in, vec_out )
1065 return
1066 end subroutine element_operation_tensorprod3d_dy_p2
1067
1068!> Calculate the differential in z-direction
1069!!
1070!OCL SERIAL
1071 subroutine element_operation_tensorprod3d_dz_p2( this, vec_in, vec_out )
1073 implicit none
1074 class(elementoperationtensorprod3d_p2), intent(in) :: this
1075 real(rp), intent(in) :: vec_in(this%elem3d%np)
1076 real(rp), intent(out) :: vec_out(this%elem3d%np)
1077 !----------------------------------------------------------
1078 call element_operation_kernel_matvec_dirz_p2( this%D1D_tr, vec_in, vec_out )
1079 return
1080 end subroutine element_operation_tensorprod3d_dz_p2
1081
1082!> Calculate the lifting term
1083!!
1084!OCL SERIAL
1085 subroutine element_operation_tensorprod3d_lift_p2( this, vec_in, vec_out )
1087 implicit none
1088 class(elementoperationtensorprod3d_p2), intent(in) :: this
1089 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
1090 real(rp), intent(out) :: vec_out(this%elem3d%np)
1091 !----------------------------------------------------------
1092 call element_operation_kernel_matvec_lift_hexahedral_p2( this%Lift_mat, vec_in, vec_out )
1093 return
1094 end subroutine element_operation_tensorprod3d_lift_p2
1095
1096!> Calculate the 3D gradient
1097!!
1098!OCL SERIAL
1099 subroutine element_operation_tensorprod3d_dxdydzlift_p2( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
1103 implicit none
1104 class(elementoperationtensorprod3d_p2), intent(in) :: this
1105 real(rp), intent(in) :: vec_in(this%elem3d%np)
1106 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1107 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
1108 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
1109 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
1110 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
1111 !----------------------------------------------------------
1112 call element_operation_kernel_matvec_gradlike_dirxyz_p2( this%D1D, this%D1D_tr, vec_in, vec_in, &
1113 vec_out_dx, vec_out_dy, vec_out_dz )
1114 call element_operation_kernel_matvec_lift_hexahedral_p2( this%Lift_mat, vec_in_lift, &
1115 vec_out_lift )
1116
1117 return
1118 end subroutine element_operation_tensorprod3d_dxdydzlift_p2
1119
1120!> Calculate the 3D divergence
1121!!
1122!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
1123!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
1124!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
1125!!
1126!OCL SERIAL
1127 subroutine element_operation_tensorprod3d_div_p2( this, vec_in, vec_in_lift, &
1128 vec_out )
1132 implicit none
1133 class(elementoperationtensorprod3d_p2), intent(in) :: this
1134 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
1135 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1136 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
1137 !----------------------------------------------------------
1138
1139 call element_operation_kernel_matvec_lift_hexahedral_p2( this%Lift_mat, vec_in_lift, &
1140 vec_out(:,4) )
1141
1142 call element_operation_kernel_matvec_divlike_dirxyz_p2( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
1143 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
1144 return
1145 end subroutine element_operation_tensorprod3d_div_p2
1146
1147!> Calculate the 3D gradient applied for five variables
1148!!
1149!OCL SERIAL
1150 subroutine element_operation_tensorprod3d_div_var5_p2( this, vec_in, vec_in_lift, &
1151 vec_out_d )
1155 implicit none
1156 class(elementoperationtensorprod3d_p2), intent(in) :: this
1157 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1158 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
1159 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
1160
1161 integer :: iv
1162 !----------------------------------------------------------
1163
1164 do iv=1, 5
1165 call element_operation_kernel_matvec_lift_hexahedral_p2( this%Lift_mat, vec_in_lift(:,iv), &
1166 vec_out_d(:,4,iv) )
1167 end do
1168 do iv=1, 5
1169 call element_operation_kernel_matvec_divlike_dirxyz_p2( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1170 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1171 end do
1172 return
1173 end subroutine element_operation_tensorprod3d_div_var5_p2
1174
1175!> Calculate the 3D divergence applied for five variables
1176!!
1177!OCL SERIAL
1178 subroutine element_operation_tensorprod3d_div_var5_2_p2( this, vec_in, &
1179 vec_out_d )
1182 implicit none
1183 class(elementoperationtensorprod3d_p2), intent(in) :: this
1184 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1185 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
1186
1187 integer :: iv
1188 !----------------------------------------------------------
1189
1190 do iv=1, 5
1191 call element_operation_kernel_matvec_divlike_dirxyz_p2( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1192 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1193 end do
1194 return
1195 end subroutine element_operation_tensorprod3d_div_var5_2_p2
1196
1197!> Calculate the lifting term applied for five variables
1198!!
1199!OCL SERIAL
1200 subroutine element_operation_tensorprod3d_lift_var5_p2( this, vec_in, vec_out )
1202 implicit none
1203 class(elementoperationtensorprod3d_p2), intent(in) :: this
1204 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
1205 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1206
1207 integer :: iv
1208 !----------------------------------------------------------
1209 do iv=1, 5
1210 call element_operation_kernel_matvec_lift_hexahedral_p2( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
1211 end do
1212 return
1213 end subroutine element_operation_tensorprod3d_lift_var5_p2
1214
1215!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
1216!!
1217!OCL SERIAL
1218 subroutine element_operation_tensorprod3d_vfilterpm1_p2( this, vec_in, vec_out )
1220 implicit none
1221 class(elementoperationtensorprod3d_p2), intent(in) :: this
1222 real(rp), intent(in) :: vec_in(this%elem3d%np)
1223 real(rp), intent(out) :: vec_out(this%elem3d%np)
1224 !---------------------------------------------------------------
1225
1226 call element_operation_kernel_matvec_dirz_p2( this%IntrpMat_VPOrdM1_tr, vec_in, &
1227 vec_out )
1228 return
1229 end subroutine element_operation_tensorprod3d_vfilterpm1_p2
1230
1231!> Apply a modal filter for tracer variables
1232!!
1233!OCL SERIAL
1234 subroutine element_operation_tensorprod3d_modalfilter_tracer_p2( this, vec_in, vec_work, vec_out )
1237
1238 implicit none
1239 class(elementoperationtensorprod3d_p2), intent(in) :: this
1240 real(rp), intent(in) :: vec_in(this%elem3d%np)
1241 real(rp), intent(out) :: vec_work(this%elem3d%np)
1242 real(rp), intent(out) :: vec_out(this%elem3d%np)
1243 !---------------------------------------------
1244
1245 call element_operation_kernel_matvec_modalfilter_p2( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
1246 vec_out(:) )
1247
1248 return
1249 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p2
1250
1251!> Apply a modal filter for five variables
1252!!
1253!OCL SERIAL
1254 subroutine element_operation_tensorprod3d_modalfilter_var5_p2( this, vec_in, vec_work, vec_out )
1257
1258 implicit none
1259 class(elementoperationtensorprod3d_p2), intent(in) :: this
1260 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
1261 real(rp), intent(out) :: vec_work(this%elem3d%np)
1262 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1263 integer :: iv
1264 !---------------------------------------------
1265
1266 do iv=1, 5
1267 call element_operation_kernel_matvec_modalfilter_p2( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
1268 vec_out(:,iv) )
1269 end do
1270
1271 return
1272 end subroutine element_operation_tensorprod3d_modalfilter_var5_p2
1273
1274
1275!--- For p=3 ------------------------------------
1276
1277!> Initialization
1278!!
1279!OCL SERIAL
1280 subroutine element_operation_tensorprod3d_init_p3( this, elem3D )
1282 implicit none
1283 class(elementoperationtensorprod3d_p3), intent(inout) :: this
1284 class(elementbase3d), intent(in), target :: elem3d
1285 !----------------------------------------------------------
1286
1287 this%elem3D => elem3d
1288 this%operator_type = element_operator_type_tensorprod3d
1289
1290 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
1291 4, elem3d )
1292 !$acc enter data copyin( this )
1293 !$acc enter data attach( this%elem3D )
1294
1295 return
1296 end subroutine element_operation_tensorprod3d_init_p3
1297
1298 !> Setup modal filter
1299 !!
1300!OCL SERIAL
1301 subroutine element_operation_tensorprod3d_setup_modalfilter_p3( this, &
1302 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1303 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1306 implicit none
1307 class(elementoperationtensorprod3d_p3), intent(inout) :: this
1308 real(rp), intent(in) :: mf_etac_h
1309 real(rp), intent(in) :: mf_alpha_h
1310 integer, intent(in) :: mf_order_h
1311 real(rp), intent(in) :: mf_etac_v
1312 real(rp), intent(in) :: mf_alpha_v
1313 integer, intent(in) :: mf_order_v
1314 !--------------------------------------------------------
1315
1316 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
1317 mf_etac_h, mf_alpha_h, mf_order_h, &
1318 mf_etac_v, mf_alpha_v, mf_order_v, &
1319 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1320 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
1321 return
1322 end subroutine element_operation_tensorprod3d_setup_modalfilter_p3
1323
1324!> Setup modal filter for tracer
1325!!
1326!OCL SERIAL
1327 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p3( this, &
1328 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1329 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1332 implicit none
1333 class(elementoperationtensorprod3d_p3), intent(inout) :: this
1334 real(rp), intent(in) :: mf_etac_h
1335 real(rp), intent(in) :: mf_alpha_h
1336 integer, intent(in) :: mf_order_h
1337 real(rp), intent(in) :: mf_etac_v
1338 real(rp), intent(in) :: mf_alpha_v
1339 integer, intent(in) :: mf_order_v
1340 !--------------------------------------------------------
1341
1342 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
1343 mf_etac_h, mf_alpha_h, mf_order_h, &
1344 mf_etac_v, mf_alpha_v, mf_order_v, &
1345 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1346 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
1347 return
1348 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p3
1349
1350!> Finalization
1351!!
1352!OCL SERIAL
1353 subroutine element_operation_tensorprod3d_final_p3( this )
1354 implicit none
1355 class(elementoperationtensorprod3d_p3), intent(inout) :: this
1356 !----------------------------------------------------------
1357 nullify( this%elem3D )
1358 !$acc exit data delete( this )
1359 return
1360 end subroutine element_operation_tensorprod3d_final_p3
1361
1362!> Calculate the differential in x-direction
1363!!
1364!OCL SERIAL
1365 subroutine element_operation_tensorprod3d_dx_p3( this, vec_in, vec_out )
1367 implicit none
1368 class(elementoperationtensorprod3d_p3), intent(in) :: this
1369 real(rp), intent(in) :: vec_in(this%elem3d%np)
1370 real(rp), intent(out) :: vec_out(this%elem3d%np)
1371 !----------------------------------------------------------
1372 call element_operation_kernel_matvec_dirx_p3( this%D1D, vec_in, vec_out )
1373 return
1374 end subroutine element_operation_tensorprod3d_dx_p3
1375
1376!> Calculate the differential in y-direction
1377!!
1378!OCL SERIAL
1379 subroutine element_operation_tensorprod3d_dy_p3( this, vec_in, vec_out )
1381 implicit none
1382 class(elementoperationtensorprod3d_p3), intent(in) :: this
1383 real(rp), intent(in) :: vec_in(this%elem3d%np)
1384 real(rp), intent(out) :: vec_out(this%elem3d%np)
1385 !----------------------------------------------------------
1386 call element_operation_kernel_matvec_diry_p3( this%D1D_tr, vec_in, vec_out )
1387 return
1388 end subroutine element_operation_tensorprod3d_dy_p3
1389
1390!> Calculate the differential in z-direction
1391!!
1392!OCL SERIAL
1393 subroutine element_operation_tensorprod3d_dz_p3( this, vec_in, vec_out )
1395 implicit none
1396 class(elementoperationtensorprod3d_p3), intent(in) :: this
1397 real(rp), intent(in) :: vec_in(this%elem3d%np)
1398 real(rp), intent(out) :: vec_out(this%elem3d%np)
1399 !----------------------------------------------------------
1400 call element_operation_kernel_matvec_dirz_p3( this%D1D_tr, vec_in, vec_out )
1401 return
1402 end subroutine element_operation_tensorprod3d_dz_p3
1403
1404!> Calculate the lifting term
1405!!
1406!OCL SERIAL
1407 subroutine element_operation_tensorprod3d_lift_p3( this, vec_in, vec_out )
1409 implicit none
1410 class(elementoperationtensorprod3d_p3), intent(in) :: this
1411 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
1412 real(rp), intent(out) :: vec_out(this%elem3d%np)
1413 !----------------------------------------------------------
1414 call element_operation_kernel_matvec_lift_hexahedral_p3( this%Lift_mat, vec_in, vec_out )
1415 return
1416 end subroutine element_operation_tensorprod3d_lift_p3
1417
1418!> Calculate the 3D gradient
1419!!
1420!OCL SERIAL
1421 subroutine element_operation_tensorprod3d_dxdydzlift_p3( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
1425 implicit none
1426 class(elementoperationtensorprod3d_p3), intent(in) :: this
1427 real(rp), intent(in) :: vec_in(this%elem3d%np)
1428 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1429 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
1430 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
1431 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
1432 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
1433 !----------------------------------------------------------
1434 call element_operation_kernel_matvec_gradlike_dirxyz_p3( this%D1D, this%D1D_tr, vec_in, vec_in, &
1435 vec_out_dx, vec_out_dy, vec_out_dz )
1436 call element_operation_kernel_matvec_lift_hexahedral_p3( this%Lift_mat, vec_in_lift, &
1437 vec_out_lift )
1438
1439 return
1440 end subroutine element_operation_tensorprod3d_dxdydzlift_p3
1441
1442!> Calculate the 3D divergence
1443!!
1444!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
1445!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
1446!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
1447!!
1448!OCL SERIAL
1449 subroutine element_operation_tensorprod3d_div_p3( this, vec_in, vec_in_lift, &
1450 vec_out )
1454 implicit none
1455 class(elementoperationtensorprod3d_p3), intent(in) :: this
1456 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
1457 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1458 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
1459 !----------------------------------------------------------
1460
1461 call element_operation_kernel_matvec_lift_hexahedral_p3( this%Lift_mat, vec_in_lift, &
1462 vec_out(:,4) )
1463
1464 call element_operation_kernel_matvec_divlike_dirxyz_p3( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
1465 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
1466 return
1467 end subroutine element_operation_tensorprod3d_div_p3
1468
1469!> Calculate the 3D gradient applied for five variables
1470!!
1471!OCL SERIAL
1472 subroutine element_operation_tensorprod3d_div_var5_p3( this, vec_in, vec_in_lift, &
1473 vec_out_d )
1477 implicit none
1478 class(elementoperationtensorprod3d_p3), intent(in) :: this
1479 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1480 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
1481 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
1482
1483 integer :: iv
1484 !----------------------------------------------------------
1485
1486 do iv=1, 5
1487 call element_operation_kernel_matvec_lift_hexahedral_p3( this%Lift_mat, vec_in_lift(:,iv), &
1488 vec_out_d(:,4,iv) )
1489 end do
1490 do iv=1, 5
1491 call element_operation_kernel_matvec_divlike_dirxyz_p3( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1492 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1493 end do
1494 return
1495 end subroutine element_operation_tensorprod3d_div_var5_p3
1496
1497!> Calculate the 3D divergence applied for five variables
1498!!
1499!OCL SERIAL
1500 subroutine element_operation_tensorprod3d_div_var5_2_p3( this, vec_in, &
1501 vec_out_d )
1504 implicit none
1505 class(elementoperationtensorprod3d_p3), intent(in) :: this
1506 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1507 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
1508
1509 integer :: iv
1510 !----------------------------------------------------------
1511
1512 do iv=1, 5
1513 call element_operation_kernel_matvec_divlike_dirxyz_p3( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1514 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1515 end do
1516 return
1517 end subroutine element_operation_tensorprod3d_div_var5_2_p3
1518
1519!> Calculate the lifting term applied for five variables
1520!!
1521!OCL SERIAL
1522 subroutine element_operation_tensorprod3d_lift_var5_p3( this, vec_in, vec_out )
1524 implicit none
1525 class(elementoperationtensorprod3d_p3), intent(in) :: this
1526 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
1527 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1528
1529 integer :: iv
1530 !----------------------------------------------------------
1531 do iv=1, 5
1532 call element_operation_kernel_matvec_lift_hexahedral_p3( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
1533 end do
1534 return
1535 end subroutine element_operation_tensorprod3d_lift_var5_p3
1536
1537!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
1538!!
1539!OCL SERIAL
1540 subroutine element_operation_tensorprod3d_vfilterpm1_p3( this, vec_in, vec_out )
1542 implicit none
1543 class(elementoperationtensorprod3d_p3), intent(in) :: this
1544 real(rp), intent(in) :: vec_in(this%elem3d%np)
1545 real(rp), intent(out) :: vec_out(this%elem3d%np)
1546 !---------------------------------------------------------------
1547
1548 call element_operation_kernel_matvec_dirz_p3( this%IntrpMat_VPOrdM1_tr, vec_in, &
1549 vec_out )
1550 return
1551 end subroutine element_operation_tensorprod3d_vfilterpm1_p3
1552
1553!> Apply a modal filter for tracer variables
1554!!
1555!OCL SERIAL
1556 subroutine element_operation_tensorprod3d_modalfilter_tracer_p3( this, vec_in, vec_work, vec_out )
1559
1560 implicit none
1561 class(elementoperationtensorprod3d_p3), intent(in) :: this
1562 real(rp), intent(in) :: vec_in(this%elem3d%np)
1563 real(rp), intent(out) :: vec_work(this%elem3d%np)
1564 real(rp), intent(out) :: vec_out(this%elem3d%np)
1565 !---------------------------------------------
1566
1567 call element_operation_kernel_matvec_modalfilter_p3( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
1568 vec_out(:) )
1569
1570 return
1571 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p3
1572
1573!> Apply a modal filter for five variables
1574!!
1575!OCL SERIAL
1576 subroutine element_operation_tensorprod3d_modalfilter_var5_p3( this, vec_in, vec_work, vec_out )
1579
1580 implicit none
1581 class(elementoperationtensorprod3d_p3), intent(in) :: this
1582 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
1583 real(rp), intent(out) :: vec_work(this%elem3d%np)
1584 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1585 integer :: iv
1586 !---------------------------------------------
1587
1588 do iv=1, 5
1589 call element_operation_kernel_matvec_modalfilter_p3( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
1590 vec_out(:,iv) )
1591 end do
1592
1593 return
1594 end subroutine element_operation_tensorprod3d_modalfilter_var5_p3
1595
1596
1597!--- For p=4 ------------------------------------
1598
1599!> Initialization
1600!!
1601!OCL SERIAL
1602 subroutine element_operation_tensorprod3d_init_p4( this, elem3D )
1604 implicit none
1605 class(elementoperationtensorprod3d_p4), intent(inout) :: this
1606 class(elementbase3d), intent(in), target :: elem3d
1607 !----------------------------------------------------------
1608
1609 this%elem3D => elem3d
1610 this%operator_type = element_operator_type_tensorprod3d
1611
1612 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
1613 5, elem3d )
1614 !$acc enter data copyin( this )
1615 !$acc enter data attach( this%elem3D )
1616
1617 return
1618 end subroutine element_operation_tensorprod3d_init_p4
1619
1620 !> Setup modal filter
1621 !!
1622!OCL SERIAL
1623 subroutine element_operation_tensorprod3d_setup_modalfilter_p4( this, &
1624 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1625 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1628 implicit none
1629 class(elementoperationtensorprod3d_p4), intent(inout) :: this
1630 real(rp), intent(in) :: mf_etac_h
1631 real(rp), intent(in) :: mf_alpha_h
1632 integer, intent(in) :: mf_order_h
1633 real(rp), intent(in) :: mf_etac_v
1634 real(rp), intent(in) :: mf_alpha_v
1635 integer, intent(in) :: mf_order_v
1636 !--------------------------------------------------------
1637
1638 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
1639 mf_etac_h, mf_alpha_h, mf_order_h, &
1640 mf_etac_v, mf_alpha_v, mf_order_v, &
1641 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1642 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
1643 return
1644 end subroutine element_operation_tensorprod3d_setup_modalfilter_p4
1645
1646!> Setup modal filter for tracer
1647!!
1648!OCL SERIAL
1649 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p4( this, &
1650 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1651 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1654 implicit none
1655 class(elementoperationtensorprod3d_p4), intent(inout) :: this
1656 real(rp), intent(in) :: mf_etac_h
1657 real(rp), intent(in) :: mf_alpha_h
1658 integer, intent(in) :: mf_order_h
1659 real(rp), intent(in) :: mf_etac_v
1660 real(rp), intent(in) :: mf_alpha_v
1661 integer, intent(in) :: mf_order_v
1662 !--------------------------------------------------------
1663
1664 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
1665 mf_etac_h, mf_alpha_h, mf_order_h, &
1666 mf_etac_v, mf_alpha_v, mf_order_v, &
1667 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1668 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
1669 return
1670 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p4
1671
1672!> Finalization
1673!!
1674!OCL SERIAL
1675 subroutine element_operation_tensorprod3d_final_p4( this )
1676 implicit none
1677 class(elementoperationtensorprod3d_p4), intent(inout) :: this
1678 !----------------------------------------------------------
1679 nullify( this%elem3D )
1680 !$acc exit data delete( this )
1681 return
1682 end subroutine element_operation_tensorprod3d_final_p4
1683
1684!> Calculate the differential in x-direction
1685!!
1686!OCL SERIAL
1687 subroutine element_operation_tensorprod3d_dx_p4( this, vec_in, vec_out )
1689 implicit none
1690 class(elementoperationtensorprod3d_p4), intent(in) :: this
1691 real(rp), intent(in) :: vec_in(this%elem3d%np)
1692 real(rp), intent(out) :: vec_out(this%elem3d%np)
1693 !----------------------------------------------------------
1694 call element_operation_kernel_matvec_dirx_p4( this%D1D, vec_in, vec_out )
1695 return
1696 end subroutine element_operation_tensorprod3d_dx_p4
1697
1698!> Calculate the differential in y-direction
1699!!
1700!OCL SERIAL
1701 subroutine element_operation_tensorprod3d_dy_p4( this, vec_in, vec_out )
1703 implicit none
1704 class(elementoperationtensorprod3d_p4), intent(in) :: this
1705 real(rp), intent(in) :: vec_in(this%elem3d%np)
1706 real(rp), intent(out) :: vec_out(this%elem3d%np)
1707 !----------------------------------------------------------
1708 call element_operation_kernel_matvec_diry_p4( this%D1D_tr, vec_in, vec_out )
1709 return
1710 end subroutine element_operation_tensorprod3d_dy_p4
1711
1712!> Calculate the differential in z-direction
1713!!
1714!OCL SERIAL
1715 subroutine element_operation_tensorprod3d_dz_p4( this, vec_in, vec_out )
1717 implicit none
1718 class(elementoperationtensorprod3d_p4), intent(in) :: this
1719 real(rp), intent(in) :: vec_in(this%elem3d%np)
1720 real(rp), intent(out) :: vec_out(this%elem3d%np)
1721 !----------------------------------------------------------
1722 call element_operation_kernel_matvec_dirz_p4( this%D1D_tr, vec_in, vec_out )
1723 return
1724 end subroutine element_operation_tensorprod3d_dz_p4
1725
1726!> Calculate the lifting term
1727!!
1728!OCL SERIAL
1729 subroutine element_operation_tensorprod3d_lift_p4( this, vec_in, vec_out )
1731 implicit none
1732 class(elementoperationtensorprod3d_p4), intent(in) :: this
1733 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
1734 real(rp), intent(out) :: vec_out(this%elem3d%np)
1735 !----------------------------------------------------------
1736 call element_operation_kernel_matvec_lift_hexahedral_p4( this%Lift_mat, vec_in, vec_out )
1737 return
1738 end subroutine element_operation_tensorprod3d_lift_p4
1739
1740!> Calculate the 3D gradient
1741!!
1742!OCL SERIAL
1743 subroutine element_operation_tensorprod3d_dxdydzlift_p4( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
1747 implicit none
1748 class(elementoperationtensorprod3d_p4), intent(in) :: this
1749 real(rp), intent(in) :: vec_in(this%elem3d%np)
1750 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1751 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
1752 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
1753 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
1754 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
1755 !----------------------------------------------------------
1756 call element_operation_kernel_matvec_gradlike_dirxyz_p4( this%D1D, this%D1D_tr, vec_in, vec_in, &
1757 vec_out_dx, vec_out_dy, vec_out_dz )
1758 call element_operation_kernel_matvec_lift_hexahedral_p4( this%Lift_mat, vec_in_lift, &
1759 vec_out_lift )
1760
1761 return
1762 end subroutine element_operation_tensorprod3d_dxdydzlift_p4
1763
1764!> Calculate the 3D divergence
1765!!
1766!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
1767!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
1768!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
1769!!
1770!OCL SERIAL
1771 subroutine element_operation_tensorprod3d_div_p4( this, vec_in, vec_in_lift, &
1772 vec_out )
1776 implicit none
1777 class(elementoperationtensorprod3d_p4), intent(in) :: this
1778 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
1779 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
1780 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
1781 !----------------------------------------------------------
1782
1783 call element_operation_kernel_matvec_lift_hexahedral_p4( this%Lift_mat, vec_in_lift, &
1784 vec_out(:,4) )
1785
1786 call element_operation_kernel_matvec_divlike_dirxyz_p4( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
1787 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
1788 return
1789 end subroutine element_operation_tensorprod3d_div_p4
1790
1791!> Calculate the 3D gradient applied for five variables
1792!!
1793!OCL SERIAL
1794 subroutine element_operation_tensorprod3d_div_var5_p4( this, vec_in, vec_in_lift, &
1795 vec_out_d )
1799 implicit none
1800 class(elementoperationtensorprod3d_p4), intent(in) :: this
1801 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1802 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
1803 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
1804
1805 integer :: iv
1806 !----------------------------------------------------------
1807
1808 do iv=1, 5
1809 call element_operation_kernel_matvec_lift_hexahedral_p4( this%Lift_mat, vec_in_lift(:,iv), &
1810 vec_out_d(:,4,iv) )
1811 end do
1812 do iv=1, 5
1813 call element_operation_kernel_matvec_divlike_dirxyz_p4( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1814 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1815 end do
1816 return
1817 end subroutine element_operation_tensorprod3d_div_var5_p4
1818
1819!> Calculate the 3D divergence applied for five variables
1820!!
1821!OCL SERIAL
1822 subroutine element_operation_tensorprod3d_div_var5_2_p4( this, vec_in, &
1823 vec_out_d )
1826 implicit none
1827 class(elementoperationtensorprod3d_p4), intent(in) :: this
1828 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
1829 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
1830
1831 integer :: iv
1832 !----------------------------------------------------------
1833
1834 do iv=1, 5
1835 call element_operation_kernel_matvec_divlike_dirxyz_p4( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
1836 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
1837 end do
1838 return
1839 end subroutine element_operation_tensorprod3d_div_var5_2_p4
1840
1841!> Calculate the lifting term applied for five variables
1842!!
1843!OCL SERIAL
1844 subroutine element_operation_tensorprod3d_lift_var5_p4( this, vec_in, vec_out )
1846 implicit none
1847 class(elementoperationtensorprod3d_p4), intent(in) :: this
1848 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
1849 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1850
1851 integer :: iv
1852 !----------------------------------------------------------
1853 do iv=1, 5
1854 call element_operation_kernel_matvec_lift_hexahedral_p4( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
1855 end do
1856 return
1857 end subroutine element_operation_tensorprod3d_lift_var5_p4
1858
1859!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
1860!!
1861!OCL SERIAL
1862 subroutine element_operation_tensorprod3d_vfilterpm1_p4( this, vec_in, vec_out )
1864 implicit none
1865 class(elementoperationtensorprod3d_p4), intent(in) :: this
1866 real(rp), intent(in) :: vec_in(this%elem3d%np)
1867 real(rp), intent(out) :: vec_out(this%elem3d%np)
1868 !---------------------------------------------------------------
1869
1870 call element_operation_kernel_matvec_dirz_p4( this%IntrpMat_VPOrdM1_tr, vec_in, &
1871 vec_out )
1872 return
1873 end subroutine element_operation_tensorprod3d_vfilterpm1_p4
1874
1875!> Apply a modal filter for tracer variables
1876!!
1877!OCL SERIAL
1878 subroutine element_operation_tensorprod3d_modalfilter_tracer_p4( this, vec_in, vec_work, vec_out )
1881
1882 implicit none
1883 class(elementoperationtensorprod3d_p4), intent(in) :: this
1884 real(rp), intent(in) :: vec_in(this%elem3d%np)
1885 real(rp), intent(out) :: vec_work(this%elem3d%np)
1886 real(rp), intent(out) :: vec_out(this%elem3d%np)
1887 !---------------------------------------------
1888
1889 call element_operation_kernel_matvec_modalfilter_p4( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
1890 vec_out(:) )
1891
1892 return
1893 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p4
1894
1895!> Apply a modal filter for five variables
1896!!
1897!OCL SERIAL
1898 subroutine element_operation_tensorprod3d_modalfilter_var5_p4( this, vec_in, vec_work, vec_out )
1901
1902 implicit none
1903 class(elementoperationtensorprod3d_p4), intent(in) :: this
1904 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
1905 real(rp), intent(out) :: vec_work(this%elem3d%np)
1906 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
1907 integer :: iv
1908 !---------------------------------------------
1909
1910 do iv=1, 5
1911 call element_operation_kernel_matvec_modalfilter_p4( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
1912 vec_out(:,iv) )
1913 end do
1914
1915 return
1916 end subroutine element_operation_tensorprod3d_modalfilter_var5_p4
1917
1918
1919!--- For p=5 ------------------------------------
1920
1921!> Initialization
1922!!
1923!OCL SERIAL
1924 subroutine element_operation_tensorprod3d_init_p5( this, elem3D )
1926 implicit none
1927 class(elementoperationtensorprod3d_p5), intent(inout) :: this
1928 class(elementbase3d), intent(in), target :: elem3d
1929 !----------------------------------------------------------
1930
1931 this%elem3D => elem3d
1932 this%operator_type = element_operator_type_tensorprod3d
1933
1934 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
1935 6, elem3d )
1936 !$acc enter data copyin( this )
1937 !$acc enter data attach( this%elem3D )
1938
1939 return
1940 end subroutine element_operation_tensorprod3d_init_p5
1941
1942 !> Setup modal filter
1943 !!
1944!OCL SERIAL
1945 subroutine element_operation_tensorprod3d_setup_modalfilter_p5( this, &
1946 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1947 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1950 implicit none
1951 class(elementoperationtensorprod3d_p5), intent(inout) :: this
1952 real(rp), intent(in) :: mf_etac_h
1953 real(rp), intent(in) :: mf_alpha_h
1954 integer, intent(in) :: mf_order_h
1955 real(rp), intent(in) :: mf_etac_v
1956 real(rp), intent(in) :: mf_alpha_v
1957 integer, intent(in) :: mf_order_v
1958 !--------------------------------------------------------
1959
1960 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
1961 mf_etac_h, mf_alpha_h, mf_order_h, &
1962 mf_etac_v, mf_alpha_v, mf_order_v, &
1963 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1964 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
1965 return
1966 end subroutine element_operation_tensorprod3d_setup_modalfilter_p5
1967
1968!> Setup modal filter for tracer
1969!!
1970!OCL SERIAL
1971 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p5( this, &
1972 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
1973 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
1976 implicit none
1977 class(elementoperationtensorprod3d_p5), intent(inout) :: this
1978 real(rp), intent(in) :: mf_etac_h
1979 real(rp), intent(in) :: mf_alpha_h
1980 integer, intent(in) :: mf_order_h
1981 real(rp), intent(in) :: mf_etac_v
1982 real(rp), intent(in) :: mf_alpha_v
1983 integer, intent(in) :: mf_order_v
1984 !--------------------------------------------------------
1985
1986 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
1987 mf_etac_h, mf_alpha_h, mf_order_h, &
1988 mf_etac_v, mf_alpha_v, mf_order_v, &
1989 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
1990 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
1991 return
1992 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p5
1993
1994!> Finalization
1995!!
1996!OCL SERIAL
1997 subroutine element_operation_tensorprod3d_final_p5( this )
1998 implicit none
1999 class(elementoperationtensorprod3d_p5), intent(inout) :: this
2000 !----------------------------------------------------------
2001 nullify( this%elem3D )
2002 !$acc exit data delete( this )
2003 return
2004 end subroutine element_operation_tensorprod3d_final_p5
2005
2006!> Calculate the differential in x-direction
2007!!
2008!OCL SERIAL
2009 subroutine element_operation_tensorprod3d_dx_p5( this, vec_in, vec_out )
2011 implicit none
2012 class(elementoperationtensorprod3d_p5), intent(in) :: this
2013 real(rp), intent(in) :: vec_in(this%elem3d%np)
2014 real(rp), intent(out) :: vec_out(this%elem3d%np)
2015 !----------------------------------------------------------
2016 call element_operation_kernel_matvec_dirx_p5( this%D1D, vec_in, vec_out )
2017 return
2018 end subroutine element_operation_tensorprod3d_dx_p5
2019
2020!> Calculate the differential in y-direction
2021!!
2022!OCL SERIAL
2023 subroutine element_operation_tensorprod3d_dy_p5( this, vec_in, vec_out )
2025 implicit none
2026 class(elementoperationtensorprod3d_p5), intent(in) :: this
2027 real(rp), intent(in) :: vec_in(this%elem3d%np)
2028 real(rp), intent(out) :: vec_out(this%elem3d%np)
2029 !----------------------------------------------------------
2030 call element_operation_kernel_matvec_diry_p5( this%D1D_tr, vec_in, vec_out )
2031 return
2032 end subroutine element_operation_tensorprod3d_dy_p5
2033
2034!> Calculate the differential in z-direction
2035!!
2036!OCL SERIAL
2037 subroutine element_operation_tensorprod3d_dz_p5( this, vec_in, vec_out )
2039 implicit none
2040 class(elementoperationtensorprod3d_p5), intent(in) :: this
2041 real(rp), intent(in) :: vec_in(this%elem3d%np)
2042 real(rp), intent(out) :: vec_out(this%elem3d%np)
2043 !----------------------------------------------------------
2044 call element_operation_kernel_matvec_dirz_p5( this%D1D_tr, vec_in, vec_out )
2045 return
2046 end subroutine element_operation_tensorprod3d_dz_p5
2047
2048!> Calculate the lifting term
2049!!
2050!OCL SERIAL
2051 subroutine element_operation_tensorprod3d_lift_p5( this, vec_in, vec_out )
2053 implicit none
2054 class(elementoperationtensorprod3d_p5), intent(in) :: this
2055 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
2056 real(rp), intent(out) :: vec_out(this%elem3d%np)
2057 !----------------------------------------------------------
2058 call element_operation_kernel_matvec_lift_hexahedral_p5( this%Lift_mat, vec_in, vec_out )
2059 return
2060 end subroutine element_operation_tensorprod3d_lift_p5
2061
2062!> Calculate the 3D gradient
2063!!
2064!OCL SERIAL
2065 subroutine element_operation_tensorprod3d_dxdydzlift_p5( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
2069 implicit none
2070 class(elementoperationtensorprod3d_p5), intent(in) :: this
2071 real(rp), intent(in) :: vec_in(this%elem3d%np)
2072 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2073 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
2074 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
2075 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
2076 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
2077 !----------------------------------------------------------
2078 call element_operation_kernel_matvec_gradlike_dirxyz_p5( this%D1D, this%D1D_tr, vec_in, vec_in, &
2079 vec_out_dx, vec_out_dy, vec_out_dz )
2080 call element_operation_kernel_matvec_lift_hexahedral_p5( this%Lift_mat, vec_in_lift, &
2081 vec_out_lift )
2082
2083 return
2084 end subroutine element_operation_tensorprod3d_dxdydzlift_p5
2085
2086!> Calculate the 3D divergence
2087!!
2088!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
2089!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
2090!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
2091!!
2092!OCL SERIAL
2093 subroutine element_operation_tensorprod3d_div_p5( this, vec_in, vec_in_lift, &
2094 vec_out )
2098 implicit none
2099 class(elementoperationtensorprod3d_p5), intent(in) :: this
2100 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
2101 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2102 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
2103 !----------------------------------------------------------
2104
2105 call element_operation_kernel_matvec_lift_hexahedral_p5( this%Lift_mat, vec_in_lift, &
2106 vec_out(:,4) )
2107
2108 call element_operation_kernel_matvec_divlike_dirxyz_p5( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
2109 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
2110 return
2111 end subroutine element_operation_tensorprod3d_div_p5
2112
2113!> Calculate the 3D gradient applied for five variables
2114!!
2115!OCL SERIAL
2116 subroutine element_operation_tensorprod3d_div_var5_p5( this, vec_in, vec_in_lift, &
2117 vec_out_d )
2121 implicit none
2122 class(elementoperationtensorprod3d_p5), intent(in) :: this
2123 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2124 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
2125 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
2126
2127 integer :: iv
2128 !----------------------------------------------------------
2129
2130 do iv=1, 5
2131 call element_operation_kernel_matvec_lift_hexahedral_p5( this%Lift_mat, vec_in_lift(:,iv), &
2132 vec_out_d(:,4,iv) )
2133 end do
2134 do iv=1, 5
2135 call element_operation_kernel_matvec_divlike_dirxyz_p5( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2136 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2137 end do
2138 return
2139 end subroutine element_operation_tensorprod3d_div_var5_p5
2140
2141!> Calculate the 3D divergence applied for five variables
2142!!
2143!OCL SERIAL
2144 subroutine element_operation_tensorprod3d_div_var5_2_p5( this, vec_in, &
2145 vec_out_d )
2148 implicit none
2149 class(elementoperationtensorprod3d_p5), intent(in) :: this
2150 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2151 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
2152
2153 integer :: iv
2154 !----------------------------------------------------------
2155
2156 do iv=1, 5
2157 call element_operation_kernel_matvec_divlike_dirxyz_p5( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2158 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2159 end do
2160 return
2161 end subroutine element_operation_tensorprod3d_div_var5_2_p5
2162
2163!> Calculate the lifting term applied for five variables
2164!!
2165!OCL SERIAL
2166 subroutine element_operation_tensorprod3d_lift_var5_p5( this, vec_in, vec_out )
2168 implicit none
2169 class(elementoperationtensorprod3d_p5), intent(in) :: this
2170 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
2171 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2172
2173 integer :: iv
2174 !----------------------------------------------------------
2175 do iv=1, 5
2176 call element_operation_kernel_matvec_lift_hexahedral_p5( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
2177 end do
2178 return
2179 end subroutine element_operation_tensorprod3d_lift_var5_p5
2180
2181!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
2182!!
2183!OCL SERIAL
2184 subroutine element_operation_tensorprod3d_vfilterpm1_p5( this, vec_in, vec_out )
2186 implicit none
2187 class(elementoperationtensorprod3d_p5), intent(in) :: this
2188 real(rp), intent(in) :: vec_in(this%elem3d%np)
2189 real(rp), intent(out) :: vec_out(this%elem3d%np)
2190 !---------------------------------------------------------------
2191
2192 call element_operation_kernel_matvec_dirz_p5( this%IntrpMat_VPOrdM1_tr, vec_in, &
2193 vec_out )
2194 return
2195 end subroutine element_operation_tensorprod3d_vfilterpm1_p5
2196
2197!> Apply a modal filter for tracer variables
2198!!
2199!OCL SERIAL
2200 subroutine element_operation_tensorprod3d_modalfilter_tracer_p5( this, vec_in, vec_work, vec_out )
2203
2204 implicit none
2205 class(elementoperationtensorprod3d_p5), intent(in) :: this
2206 real(rp), intent(in) :: vec_in(this%elem3d%np)
2207 real(rp), intent(out) :: vec_work(this%elem3d%np)
2208 real(rp), intent(out) :: vec_out(this%elem3d%np)
2209 !---------------------------------------------
2210
2211 call element_operation_kernel_matvec_modalfilter_p5( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
2212 vec_out(:) )
2213
2214 return
2215 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p5
2216
2217!> Apply a modal filter for five variables
2218!!
2219!OCL SERIAL
2220 subroutine element_operation_tensorprod3d_modalfilter_var5_p5( this, vec_in, vec_work, vec_out )
2223
2224 implicit none
2225 class(elementoperationtensorprod3d_p5), intent(in) :: this
2226 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
2227 real(rp), intent(out) :: vec_work(this%elem3d%np)
2228 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2229 integer :: iv
2230 !---------------------------------------------
2231
2232 do iv=1, 5
2233 call element_operation_kernel_matvec_modalfilter_p5( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
2234 vec_out(:,iv) )
2235 end do
2236
2237 return
2238 end subroutine element_operation_tensorprod3d_modalfilter_var5_p5
2239
2240
2241!--- For p=6 ------------------------------------
2242
2243!> Initialization
2244!!
2245!OCL SERIAL
2246 subroutine element_operation_tensorprod3d_init_p6( this, elem3D )
2248 implicit none
2249 class(elementoperationtensorprod3d_p6), intent(inout) :: this
2250 class(elementbase3d), intent(in), target :: elem3d
2251 !----------------------------------------------------------
2252
2253 this%elem3D => elem3d
2254 this%operator_type = element_operator_type_tensorprod3d
2255
2256 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
2257 7, elem3d )
2258 !$acc enter data copyin( this )
2259 !$acc enter data attach( this%elem3D )
2260
2261 return
2262 end subroutine element_operation_tensorprod3d_init_p6
2263
2264 !> Setup modal filter
2265 !!
2266!OCL SERIAL
2267 subroutine element_operation_tensorprod3d_setup_modalfilter_p6( this, &
2268 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2269 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2272 implicit none
2273 class(elementoperationtensorprod3d_p6), intent(inout) :: this
2274 real(rp), intent(in) :: mf_etac_h
2275 real(rp), intent(in) :: mf_alpha_h
2276 integer, intent(in) :: mf_order_h
2277 real(rp), intent(in) :: mf_etac_v
2278 real(rp), intent(in) :: mf_alpha_v
2279 integer, intent(in) :: mf_order_v
2280 !--------------------------------------------------------
2281
2282 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
2283 mf_etac_h, mf_alpha_h, mf_order_h, &
2284 mf_etac_v, mf_alpha_v, mf_order_v, &
2285 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2286 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
2287 return
2288 end subroutine element_operation_tensorprod3d_setup_modalfilter_p6
2289
2290!> Setup modal filter for tracer
2291!!
2292!OCL SERIAL
2293 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p6( this, &
2294 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2295 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2298 implicit none
2299 class(elementoperationtensorprod3d_p6), intent(inout) :: this
2300 real(rp), intent(in) :: mf_etac_h
2301 real(rp), intent(in) :: mf_alpha_h
2302 integer, intent(in) :: mf_order_h
2303 real(rp), intent(in) :: mf_etac_v
2304 real(rp), intent(in) :: mf_alpha_v
2305 integer, intent(in) :: mf_order_v
2306 !--------------------------------------------------------
2307
2308 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
2309 mf_etac_h, mf_alpha_h, mf_order_h, &
2310 mf_etac_v, mf_alpha_v, mf_order_v, &
2311 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2312 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
2313 return
2314 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p6
2315
2316!> Finalization
2317!!
2318!OCL SERIAL
2319 subroutine element_operation_tensorprod3d_final_p6( this )
2320 implicit none
2321 class(elementoperationtensorprod3d_p6), intent(inout) :: this
2322 !----------------------------------------------------------
2323 nullify( this%elem3D )
2324 !$acc exit data delete( this )
2325 return
2326 end subroutine element_operation_tensorprod3d_final_p6
2327
2328!> Calculate the differential in x-direction
2329!!
2330!OCL SERIAL
2331 subroutine element_operation_tensorprod3d_dx_p6( this, vec_in, vec_out )
2333 implicit none
2334 class(elementoperationtensorprod3d_p6), intent(in) :: this
2335 real(rp), intent(in) :: vec_in(this%elem3d%np)
2336 real(rp), intent(out) :: vec_out(this%elem3d%np)
2337 !----------------------------------------------------------
2338 call element_operation_kernel_matvec_dirx_p6( this%D1D, vec_in, vec_out )
2339 return
2340 end subroutine element_operation_tensorprod3d_dx_p6
2341
2342!> Calculate the differential in y-direction
2343!!
2344!OCL SERIAL
2345 subroutine element_operation_tensorprod3d_dy_p6( this, vec_in, vec_out )
2347 implicit none
2348 class(elementoperationtensorprod3d_p6), intent(in) :: this
2349 real(rp), intent(in) :: vec_in(this%elem3d%np)
2350 real(rp), intent(out) :: vec_out(this%elem3d%np)
2351 !----------------------------------------------------------
2352 call element_operation_kernel_matvec_diry_p6( this%D1D_tr, vec_in, vec_out )
2353 return
2354 end subroutine element_operation_tensorprod3d_dy_p6
2355
2356!> Calculate the differential in z-direction
2357!!
2358!OCL SERIAL
2359 subroutine element_operation_tensorprod3d_dz_p6( this, vec_in, vec_out )
2361 implicit none
2362 class(elementoperationtensorprod3d_p6), intent(in) :: this
2363 real(rp), intent(in) :: vec_in(this%elem3d%np)
2364 real(rp), intent(out) :: vec_out(this%elem3d%np)
2365 !----------------------------------------------------------
2366 call element_operation_kernel_matvec_dirz_p6( this%D1D_tr, vec_in, vec_out )
2367 return
2368 end subroutine element_operation_tensorprod3d_dz_p6
2369
2370!> Calculate the lifting term
2371!!
2372!OCL SERIAL
2373 subroutine element_operation_tensorprod3d_lift_p6( this, vec_in, vec_out )
2375 implicit none
2376 class(elementoperationtensorprod3d_p6), intent(in) :: this
2377 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
2378 real(rp), intent(out) :: vec_out(this%elem3d%np)
2379 !----------------------------------------------------------
2380 call element_operation_kernel_matvec_lift_hexahedral_p6( this%Lift_mat, vec_in, vec_out )
2381 return
2382 end subroutine element_operation_tensorprod3d_lift_p6
2383
2384!> Calculate the 3D gradient
2385!!
2386!OCL SERIAL
2387 subroutine element_operation_tensorprod3d_dxdydzlift_p6( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
2391 implicit none
2392 class(elementoperationtensorprod3d_p6), intent(in) :: this
2393 real(rp), intent(in) :: vec_in(this%elem3d%np)
2394 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2395 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
2396 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
2397 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
2398 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
2399 !----------------------------------------------------------
2400 call element_operation_kernel_matvec_gradlike_dirxyz_p6( this%D1D, this%D1D_tr, vec_in, vec_in, &
2401 vec_out_dx, vec_out_dy, vec_out_dz )
2402 call element_operation_kernel_matvec_lift_hexahedral_p6( this%Lift_mat, vec_in_lift, &
2403 vec_out_lift )
2404
2405 return
2406 end subroutine element_operation_tensorprod3d_dxdydzlift_p6
2407
2408!> Calculate the 3D divergence
2409!!
2410!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
2411!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
2412!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
2413!!
2414!OCL SERIAL
2415 subroutine element_operation_tensorprod3d_div_p6( this, vec_in, vec_in_lift, &
2416 vec_out )
2420 implicit none
2421 class(elementoperationtensorprod3d_p6), intent(in) :: this
2422 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
2423 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2424 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
2425 !----------------------------------------------------------
2426
2427 call element_operation_kernel_matvec_lift_hexahedral_p6( this%Lift_mat, vec_in_lift, &
2428 vec_out(:,4) )
2429
2430 call element_operation_kernel_matvec_divlike_dirxyz_p6( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
2431 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
2432 return
2433 end subroutine element_operation_tensorprod3d_div_p6
2434
2435!> Calculate the 3D gradient applied for five variables
2436!!
2437!OCL SERIAL
2438 subroutine element_operation_tensorprod3d_div_var5_p6( this, vec_in, vec_in_lift, &
2439 vec_out_d )
2443 implicit none
2444 class(elementoperationtensorprod3d_p6), intent(in) :: this
2445 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2446 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
2447 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
2448
2449 integer :: iv
2450 !----------------------------------------------------------
2451
2452 do iv=1, 5
2453 call element_operation_kernel_matvec_lift_hexahedral_p6( this%Lift_mat, vec_in_lift(:,iv), &
2454 vec_out_d(:,4,iv) )
2455 end do
2456 do iv=1, 5
2457 call element_operation_kernel_matvec_divlike_dirxyz_p6( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2458 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2459 end do
2460 return
2461 end subroutine element_operation_tensorprod3d_div_var5_p6
2462
2463!> Calculate the 3D divergence applied for five variables
2464!!
2465!OCL SERIAL
2466 subroutine element_operation_tensorprod3d_div_var5_2_p6( this, vec_in, &
2467 vec_out_d )
2470 implicit none
2471 class(elementoperationtensorprod3d_p6), intent(in) :: this
2472 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2473 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
2474
2475 integer :: iv
2476 !----------------------------------------------------------
2477
2478 do iv=1, 5
2479 call element_operation_kernel_matvec_divlike_dirxyz_p6( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2480 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2481 end do
2482 return
2483 end subroutine element_operation_tensorprod3d_div_var5_2_p6
2484
2485!> Calculate the lifting term applied for five variables
2486!!
2487!OCL SERIAL
2488 subroutine element_operation_tensorprod3d_lift_var5_p6( this, vec_in, vec_out )
2490 implicit none
2491 class(elementoperationtensorprod3d_p6), intent(in) :: this
2492 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
2493 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2494
2495 integer :: iv
2496 !----------------------------------------------------------
2497 do iv=1, 5
2498 call element_operation_kernel_matvec_lift_hexahedral_p6( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
2499 end do
2500 return
2501 end subroutine element_operation_tensorprod3d_lift_var5_p6
2502
2503!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
2504!!
2505!OCL SERIAL
2506 subroutine element_operation_tensorprod3d_vfilterpm1_p6( this, vec_in, vec_out )
2508 implicit none
2509 class(elementoperationtensorprod3d_p6), intent(in) :: this
2510 real(rp), intent(in) :: vec_in(this%elem3d%np)
2511 real(rp), intent(out) :: vec_out(this%elem3d%np)
2512 !---------------------------------------------------------------
2513
2514 call element_operation_kernel_matvec_dirz_p6( this%IntrpMat_VPOrdM1_tr, vec_in, &
2515 vec_out )
2516 return
2517 end subroutine element_operation_tensorprod3d_vfilterpm1_p6
2518
2519!> Apply a modal filter for tracer variables
2520!!
2521!OCL SERIAL
2522 subroutine element_operation_tensorprod3d_modalfilter_tracer_p6( this, vec_in, vec_work, vec_out )
2525
2526 implicit none
2527 class(elementoperationtensorprod3d_p6), intent(in) :: this
2528 real(rp), intent(in) :: vec_in(this%elem3d%np)
2529 real(rp), intent(out) :: vec_work(this%elem3d%np)
2530 real(rp), intent(out) :: vec_out(this%elem3d%np)
2531 !---------------------------------------------
2532
2533 call element_operation_kernel_matvec_modalfilter_p6( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
2534 vec_out(:) )
2535
2536 return
2537 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p6
2538
2539!> Apply a modal filter for five variables
2540!!
2541!OCL SERIAL
2542 subroutine element_operation_tensorprod3d_modalfilter_var5_p6( this, vec_in, vec_work, vec_out )
2545
2546 implicit none
2547 class(elementoperationtensorprod3d_p6), intent(in) :: this
2548 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
2549 real(rp), intent(out) :: vec_work(this%elem3d%np)
2550 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2551 integer :: iv
2552 !---------------------------------------------
2553
2554 do iv=1, 5
2555 call element_operation_kernel_matvec_modalfilter_p6( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
2556 vec_out(:,iv) )
2557 end do
2558
2559 return
2560 end subroutine element_operation_tensorprod3d_modalfilter_var5_p6
2561
2562
2563!--- For p=7 ------------------------------------
2564
2565!> Initialization
2566!!
2567!OCL SERIAL
2568 subroutine element_operation_tensorprod3d_init_p7( this, elem3D )
2570 implicit none
2571 class(elementoperationtensorprod3d_p7), intent(inout) :: this
2572 class(elementbase3d), intent(in), target :: elem3d
2573 !----------------------------------------------------------
2574
2575 this%elem3D => elem3d
2576 this%operator_type = element_operator_type_tensorprod3d
2577
2578 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
2579 8, elem3d )
2580 !$acc enter data copyin( this )
2581 !$acc enter data attach( this%elem3D )
2582
2583 return
2584 end subroutine element_operation_tensorprod3d_init_p7
2585
2586 !> Setup modal filter
2587 !!
2588!OCL SERIAL
2589 subroutine element_operation_tensorprod3d_setup_modalfilter_p7( this, &
2590 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2591 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2594 implicit none
2595 class(elementoperationtensorprod3d_p7), intent(inout) :: this
2596 real(rp), intent(in) :: mf_etac_h
2597 real(rp), intent(in) :: mf_alpha_h
2598 integer, intent(in) :: mf_order_h
2599 real(rp), intent(in) :: mf_etac_v
2600 real(rp), intent(in) :: mf_alpha_v
2601 integer, intent(in) :: mf_order_v
2602 !--------------------------------------------------------
2603
2604 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
2605 mf_etac_h, mf_alpha_h, mf_order_h, &
2606 mf_etac_v, mf_alpha_v, mf_order_v, &
2607 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2608 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
2609 return
2610 end subroutine element_operation_tensorprod3d_setup_modalfilter_p7
2611
2612!> Setup modal filter for tracer
2613!!
2614!OCL SERIAL
2615 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p7( this, &
2616 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2617 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2620 implicit none
2621 class(elementoperationtensorprod3d_p7), intent(inout) :: this
2622 real(rp), intent(in) :: mf_etac_h
2623 real(rp), intent(in) :: mf_alpha_h
2624 integer, intent(in) :: mf_order_h
2625 real(rp), intent(in) :: mf_etac_v
2626 real(rp), intent(in) :: mf_alpha_v
2627 integer, intent(in) :: mf_order_v
2628 !--------------------------------------------------------
2629
2630 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
2631 mf_etac_h, mf_alpha_h, mf_order_h, &
2632 mf_etac_v, mf_alpha_v, mf_order_v, &
2633 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2634 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
2635 return
2636 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p7
2637
2638!> Finalization
2639!!
2640!OCL SERIAL
2641 subroutine element_operation_tensorprod3d_final_p7( this )
2642 implicit none
2643 class(elementoperationtensorprod3d_p7), intent(inout) :: this
2644 !----------------------------------------------------------
2645 nullify( this%elem3D )
2646 !$acc exit data delete( this )
2647 return
2648 end subroutine element_operation_tensorprod3d_final_p7
2649
2650!> Calculate the differential in x-direction
2651!!
2652!OCL SERIAL
2653 subroutine element_operation_tensorprod3d_dx_p7( this, vec_in, vec_out )
2655 implicit none
2656 class(elementoperationtensorprod3d_p7), intent(in) :: this
2657 real(rp), intent(in) :: vec_in(this%elem3d%np)
2658 real(rp), intent(out) :: vec_out(this%elem3d%np)
2659 !----------------------------------------------------------
2660 call element_operation_kernel_matvec_dirx_p7( this%D1D, vec_in, vec_out )
2661 return
2662 end subroutine element_operation_tensorprod3d_dx_p7
2663
2664!> Calculate the differential in y-direction
2665!!
2666!OCL SERIAL
2667 subroutine element_operation_tensorprod3d_dy_p7( this, vec_in, vec_out )
2669 implicit none
2670 class(elementoperationtensorprod3d_p7), intent(in) :: this
2671 real(rp), intent(in) :: vec_in(this%elem3d%np)
2672 real(rp), intent(out) :: vec_out(this%elem3d%np)
2673 !----------------------------------------------------------
2674 call element_operation_kernel_matvec_diry_p7( this%D1D_tr, vec_in, vec_out )
2675 return
2676 end subroutine element_operation_tensorprod3d_dy_p7
2677
2678!> Calculate the differential in z-direction
2679!!
2680!OCL SERIAL
2681 subroutine element_operation_tensorprod3d_dz_p7( this, vec_in, vec_out )
2683 implicit none
2684 class(elementoperationtensorprod3d_p7), intent(in) :: this
2685 real(rp), intent(in) :: vec_in(this%elem3d%np)
2686 real(rp), intent(out) :: vec_out(this%elem3d%np)
2687 !----------------------------------------------------------
2688 call element_operation_kernel_matvec_dirz_p7( this%D1D_tr, vec_in, vec_out )
2689 return
2690 end subroutine element_operation_tensorprod3d_dz_p7
2691
2692!> Calculate the lifting term
2693!!
2694!OCL SERIAL
2695 subroutine element_operation_tensorprod3d_lift_p7( this, vec_in, vec_out )
2697 implicit none
2698 class(elementoperationtensorprod3d_p7), intent(in) :: this
2699 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
2700 real(rp), intent(out) :: vec_out(this%elem3d%np)
2701 !----------------------------------------------------------
2702 call element_operation_kernel_matvec_lift_hexahedral_p7( this%Lift_mat, vec_in, vec_out )
2703 return
2704 end subroutine element_operation_tensorprod3d_lift_p7
2705
2706!> Calculate the 3D gradient
2707!!
2708!OCL SERIAL
2709 subroutine element_operation_tensorprod3d_dxdydzlift_p7( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
2713 implicit none
2714 class(elementoperationtensorprod3d_p7), intent(in) :: this
2715 real(rp), intent(in) :: vec_in(this%elem3d%np)
2716 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2717 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
2718 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
2719 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
2720 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
2721 !----------------------------------------------------------
2722 call element_operation_kernel_matvec_gradlike_dirxyz_p7( this%D1D, this%D1D_tr, vec_in, vec_in, &
2723 vec_out_dx, vec_out_dy, vec_out_dz )
2724 call element_operation_kernel_matvec_lift_hexahedral_p7( this%Lift_mat, vec_in_lift, &
2725 vec_out_lift )
2726
2727 return
2728 end subroutine element_operation_tensorprod3d_dxdydzlift_p7
2729
2730!> Calculate the 3D divergence
2731!!
2732!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
2733!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
2734!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
2735!!
2736!OCL SERIAL
2737 subroutine element_operation_tensorprod3d_div_p7( this, vec_in, vec_in_lift, &
2738 vec_out )
2742 implicit none
2743 class(elementoperationtensorprod3d_p7), intent(in) :: this
2744 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
2745 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
2746 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
2747 !----------------------------------------------------------
2748
2749 call element_operation_kernel_matvec_lift_hexahedral_p7( this%Lift_mat, vec_in_lift, &
2750 vec_out(:,4) )
2751
2752 call element_operation_kernel_matvec_divlike_dirxyz_p7( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
2753 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
2754 return
2755 end subroutine element_operation_tensorprod3d_div_p7
2756
2757!> Calculate the 3D gradient applied for five variables
2758!!
2759!OCL SERIAL
2760 subroutine element_operation_tensorprod3d_div_var5_p7( this, vec_in, vec_in_lift, &
2761 vec_out_d )
2765 implicit none
2766 class(elementoperationtensorprod3d_p7), intent(in) :: this
2767 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2768 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
2769 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
2770
2771 integer :: iv
2772 !----------------------------------------------------------
2773
2774 do iv=1, 5
2775 call element_operation_kernel_matvec_lift_hexahedral_p7( this%Lift_mat, vec_in_lift(:,iv), &
2776 vec_out_d(:,4,iv) )
2777 end do
2778 do iv=1, 5
2779 call element_operation_kernel_matvec_divlike_dirxyz_p7( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2780 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2781 end do
2782 return
2783 end subroutine element_operation_tensorprod3d_div_var5_p7
2784
2785!> Calculate the 3D divergence applied for five variables
2786!!
2787!OCL SERIAL
2788 subroutine element_operation_tensorprod3d_div_var5_2_p7( this, vec_in, &
2789 vec_out_d )
2792 implicit none
2793 class(elementoperationtensorprod3d_p7), intent(in) :: this
2794 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
2795 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
2796
2797 integer :: iv
2798 !----------------------------------------------------------
2799
2800 do iv=1, 5
2801 call element_operation_kernel_matvec_divlike_dirxyz_p7( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
2802 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
2803 end do
2804 return
2805 end subroutine element_operation_tensorprod3d_div_var5_2_p7
2806
2807!> Calculate the lifting term applied for five variables
2808!!
2809!OCL SERIAL
2810 subroutine element_operation_tensorprod3d_lift_var5_p7( this, vec_in, vec_out )
2812 implicit none
2813 class(elementoperationtensorprod3d_p7), intent(in) :: this
2814 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
2815 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2816
2817 integer :: iv
2818 !----------------------------------------------------------
2819 do iv=1, 5
2820 call element_operation_kernel_matvec_lift_hexahedral_p7( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
2821 end do
2822 return
2823 end subroutine element_operation_tensorprod3d_lift_var5_p7
2824
2825!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
2826!!
2827!OCL SERIAL
2828 subroutine element_operation_tensorprod3d_vfilterpm1_p7( this, vec_in, vec_out )
2830 implicit none
2831 class(elementoperationtensorprod3d_p7), intent(in) :: this
2832 real(rp), intent(in) :: vec_in(this%elem3d%np)
2833 real(rp), intent(out) :: vec_out(this%elem3d%np)
2834 !---------------------------------------------------------------
2835
2836 call element_operation_kernel_matvec_dirz_p7( this%IntrpMat_VPOrdM1_tr, vec_in, &
2837 vec_out )
2838 return
2839 end subroutine element_operation_tensorprod3d_vfilterpm1_p7
2840
2841!> Apply a modal filter for tracer variables
2842!!
2843!OCL SERIAL
2844 subroutine element_operation_tensorprod3d_modalfilter_tracer_p7( this, vec_in, vec_work, vec_out )
2847
2848 implicit none
2849 class(elementoperationtensorprod3d_p7), intent(in) :: this
2850 real(rp), intent(in) :: vec_in(this%elem3d%np)
2851 real(rp), intent(out) :: vec_work(this%elem3d%np)
2852 real(rp), intent(out) :: vec_out(this%elem3d%np)
2853 !---------------------------------------------
2854
2855 call element_operation_kernel_matvec_modalfilter_p7( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
2856 vec_out(:) )
2857
2858 return
2859 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p7
2860
2861!> Apply a modal filter for five variables
2862!!
2863!OCL SERIAL
2864 subroutine element_operation_tensorprod3d_modalfilter_var5_p7( this, vec_in, vec_work, vec_out )
2867
2868 implicit none
2869 class(elementoperationtensorprod3d_p7), intent(in) :: this
2870 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
2871 real(rp), intent(out) :: vec_work(this%elem3d%np)
2872 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
2873 integer :: iv
2874 !---------------------------------------------
2875
2876 do iv=1, 5
2877 call element_operation_kernel_matvec_modalfilter_p7( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
2878 vec_out(:,iv) )
2879 end do
2880
2881 return
2882 end subroutine element_operation_tensorprod3d_modalfilter_var5_p7
2883
2884
2885!--- For p=8 ------------------------------------
2886
2887!> Initialization
2888!!
2889!OCL SERIAL
2890 subroutine element_operation_tensorprod3d_init_p8( this, elem3D )
2892 implicit none
2893 class(elementoperationtensorprod3d_p8), intent(inout) :: this
2894 class(elementbase3d), intent(in), target :: elem3d
2895 !----------------------------------------------------------
2896
2897 this%elem3D => elem3d
2898 this%operator_type = element_operator_type_tensorprod3d
2899
2900 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
2901 9, elem3d )
2902 !$acc enter data copyin( this )
2903 !$acc enter data attach( this%elem3D )
2904
2905 return
2906 end subroutine element_operation_tensorprod3d_init_p8
2907
2908 !> Setup modal filter
2909 !!
2910!OCL SERIAL
2911 subroutine element_operation_tensorprod3d_setup_modalfilter_p8( this, &
2912 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2913 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2916 implicit none
2917 class(elementoperationtensorprod3d_p8), intent(inout) :: this
2918 real(rp), intent(in) :: mf_etac_h
2919 real(rp), intent(in) :: mf_alpha_h
2920 integer, intent(in) :: mf_order_h
2921 real(rp), intent(in) :: mf_etac_v
2922 real(rp), intent(in) :: mf_alpha_v
2923 integer, intent(in) :: mf_order_v
2924 !--------------------------------------------------------
2925
2926 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
2927 mf_etac_h, mf_alpha_h, mf_order_h, &
2928 mf_etac_v, mf_alpha_v, mf_order_v, &
2929 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2930 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
2931 return
2932 end subroutine element_operation_tensorprod3d_setup_modalfilter_p8
2933
2934!> Setup modal filter for tracer
2935!!
2936!OCL SERIAL
2937 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p8( this, &
2938 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
2939 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
2942 implicit none
2943 class(elementoperationtensorprod3d_p8), intent(inout) :: this
2944 real(rp), intent(in) :: mf_etac_h
2945 real(rp), intent(in) :: mf_alpha_h
2946 integer, intent(in) :: mf_order_h
2947 real(rp), intent(in) :: mf_etac_v
2948 real(rp), intent(in) :: mf_alpha_v
2949 integer, intent(in) :: mf_order_v
2950 !--------------------------------------------------------
2951
2952 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
2953 mf_etac_h, mf_alpha_h, mf_order_h, &
2954 mf_etac_v, mf_alpha_v, mf_order_v, &
2955 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
2956 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
2957 return
2958 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p8
2959
2960!> Finalization
2961!!
2962!OCL SERIAL
2963 subroutine element_operation_tensorprod3d_final_p8( this )
2964 implicit none
2965 class(elementoperationtensorprod3d_p8), intent(inout) :: this
2966 !----------------------------------------------------------
2967 nullify( this%elem3D )
2968 !$acc exit data delete( this )
2969 return
2970 end subroutine element_operation_tensorprod3d_final_p8
2971
2972!> Calculate the differential in x-direction
2973!!
2974!OCL SERIAL
2975 subroutine element_operation_tensorprod3d_dx_p8( this, vec_in, vec_out )
2977 implicit none
2978 class(elementoperationtensorprod3d_p8), intent(in) :: this
2979 real(rp), intent(in) :: vec_in(this%elem3d%np)
2980 real(rp), intent(out) :: vec_out(this%elem3d%np)
2981 !----------------------------------------------------------
2982 call element_operation_kernel_matvec_dirx_p8( this%D1D, vec_in, vec_out )
2983 return
2984 end subroutine element_operation_tensorprod3d_dx_p8
2985
2986!> Calculate the differential in y-direction
2987!!
2988!OCL SERIAL
2989 subroutine element_operation_tensorprod3d_dy_p8( this, vec_in, vec_out )
2991 implicit none
2992 class(elementoperationtensorprod3d_p8), intent(in) :: this
2993 real(rp), intent(in) :: vec_in(this%elem3d%np)
2994 real(rp), intent(out) :: vec_out(this%elem3d%np)
2995 !----------------------------------------------------------
2996 call element_operation_kernel_matvec_diry_p8( this%D1D_tr, vec_in, vec_out )
2997 return
2998 end subroutine element_operation_tensorprod3d_dy_p8
2999
3000!> Calculate the differential in z-direction
3001!!
3002!OCL SERIAL
3003 subroutine element_operation_tensorprod3d_dz_p8( this, vec_in, vec_out )
3005 implicit none
3006 class(elementoperationtensorprod3d_p8), intent(in) :: this
3007 real(rp), intent(in) :: vec_in(this%elem3d%np)
3008 real(rp), intent(out) :: vec_out(this%elem3d%np)
3009 !----------------------------------------------------------
3010 call element_operation_kernel_matvec_dirz_p8( this%D1D_tr, vec_in, vec_out )
3011 return
3012 end subroutine element_operation_tensorprod3d_dz_p8
3013
3014!> Calculate the lifting term
3015!!
3016!OCL SERIAL
3017 subroutine element_operation_tensorprod3d_lift_p8( this, vec_in, vec_out )
3019 implicit none
3020 class(elementoperationtensorprod3d_p8), intent(in) :: this
3021 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
3022 real(rp), intent(out) :: vec_out(this%elem3d%np)
3023 !----------------------------------------------------------
3024 call element_operation_kernel_matvec_lift_hexahedral_p8( this%Lift_mat, vec_in, vec_out )
3025 return
3026 end subroutine element_operation_tensorprod3d_lift_p8
3027
3028!> Calculate the 3D gradient
3029!!
3030!OCL SERIAL
3031 subroutine element_operation_tensorprod3d_dxdydzlift_p8( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
3035 implicit none
3036 class(elementoperationtensorprod3d_p8), intent(in) :: this
3037 real(rp), intent(in) :: vec_in(this%elem3d%np)
3038 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3039 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
3040 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
3041 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
3042 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
3043 !----------------------------------------------------------
3044 call element_operation_kernel_matvec_gradlike_dirxyz_p8( this%D1D, this%D1D_tr, vec_in, vec_in, &
3045 vec_out_dx, vec_out_dy, vec_out_dz )
3046 call element_operation_kernel_matvec_lift_hexahedral_p8( this%Lift_mat, vec_in_lift, &
3047 vec_out_lift )
3048
3049 return
3050 end subroutine element_operation_tensorprod3d_dxdydzlift_p8
3051
3052!> Calculate the 3D divergence
3053!!
3054!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
3055!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
3056!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
3057!!
3058!OCL SERIAL
3059 subroutine element_operation_tensorprod3d_div_p8( this, vec_in, vec_in_lift, &
3060 vec_out )
3064 implicit none
3065 class(elementoperationtensorprod3d_p8), intent(in) :: this
3066 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
3067 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3068 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
3069 !----------------------------------------------------------
3070
3071 call element_operation_kernel_matvec_lift_hexahedral_p8( this%Lift_mat, vec_in_lift, &
3072 vec_out(:,4) )
3073
3074 call element_operation_kernel_matvec_divlike_dirxyz_p8( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
3075 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
3076 return
3077 end subroutine element_operation_tensorprod3d_div_p8
3078
3079!> Calculate the 3D gradient applied for five variables
3080!!
3081!OCL SERIAL
3082 subroutine element_operation_tensorprod3d_div_var5_p8( this, vec_in, vec_in_lift, &
3083 vec_out_d )
3087 implicit none
3088 class(elementoperationtensorprod3d_p8), intent(in) :: this
3089 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3090 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
3091 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
3092
3093 integer :: iv
3094 !----------------------------------------------------------
3095
3096 do iv=1, 5
3097 call element_operation_kernel_matvec_lift_hexahedral_p8( this%Lift_mat, vec_in_lift(:,iv), &
3098 vec_out_d(:,4,iv) )
3099 end do
3100 do iv=1, 5
3101 call element_operation_kernel_matvec_divlike_dirxyz_p8( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3102 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3103 end do
3104 return
3105 end subroutine element_operation_tensorprod3d_div_var5_p8
3106
3107!> Calculate the 3D divergence applied for five variables
3108!!
3109!OCL SERIAL
3110 subroutine element_operation_tensorprod3d_div_var5_2_p8( this, vec_in, &
3111 vec_out_d )
3114 implicit none
3115 class(elementoperationtensorprod3d_p8), intent(in) :: this
3116 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3117 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
3118
3119 integer :: iv
3120 !----------------------------------------------------------
3121
3122 do iv=1, 5
3123 call element_operation_kernel_matvec_divlike_dirxyz_p8( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3124 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3125 end do
3126 return
3127 end subroutine element_operation_tensorprod3d_div_var5_2_p8
3128
3129!> Calculate the lifting term applied for five variables
3130!!
3131!OCL SERIAL
3132 subroutine element_operation_tensorprod3d_lift_var5_p8( this, vec_in, vec_out )
3134 implicit none
3135 class(elementoperationtensorprod3d_p8), intent(in) :: this
3136 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
3137 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3138
3139 integer :: iv
3140 !----------------------------------------------------------
3141 do iv=1, 5
3142 call element_operation_kernel_matvec_lift_hexahedral_p8( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
3143 end do
3144 return
3145 end subroutine element_operation_tensorprod3d_lift_var5_p8
3146
3147!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
3148!!
3149!OCL SERIAL
3150 subroutine element_operation_tensorprod3d_vfilterpm1_p8( this, vec_in, vec_out )
3152 implicit none
3153 class(elementoperationtensorprod3d_p8), intent(in) :: this
3154 real(rp), intent(in) :: vec_in(this%elem3d%np)
3155 real(rp), intent(out) :: vec_out(this%elem3d%np)
3156 !---------------------------------------------------------------
3157
3158 call element_operation_kernel_matvec_dirz_p8( this%IntrpMat_VPOrdM1_tr, vec_in, &
3159 vec_out )
3160 return
3161 end subroutine element_operation_tensorprod3d_vfilterpm1_p8
3162
3163!> Apply a modal filter for tracer variables
3164!!
3165!OCL SERIAL
3166 subroutine element_operation_tensorprod3d_modalfilter_tracer_p8( this, vec_in, vec_work, vec_out )
3169
3170 implicit none
3171 class(elementoperationtensorprod3d_p8), intent(in) :: this
3172 real(rp), intent(in) :: vec_in(this%elem3d%np)
3173 real(rp), intent(out) :: vec_work(this%elem3d%np)
3174 real(rp), intent(out) :: vec_out(this%elem3d%np)
3175 !---------------------------------------------
3176
3177 call element_operation_kernel_matvec_modalfilter_p8( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
3178 vec_out(:) )
3179
3180 return
3181 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p8
3182
3183!> Apply a modal filter for five variables
3184!!
3185!OCL SERIAL
3186 subroutine element_operation_tensorprod3d_modalfilter_var5_p8( this, vec_in, vec_work, vec_out )
3189
3190 implicit none
3191 class(elementoperationtensorprod3d_p8), intent(in) :: this
3192 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
3193 real(rp), intent(out) :: vec_work(this%elem3d%np)
3194 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3195 integer :: iv
3196 !---------------------------------------------
3197
3198 do iv=1, 5
3199 call element_operation_kernel_matvec_modalfilter_p8( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
3200 vec_out(:,iv) )
3201 end do
3202
3203 return
3204 end subroutine element_operation_tensorprod3d_modalfilter_var5_p8
3205
3206
3207!--- For p=9 ------------------------------------
3208
3209!> Initialization
3210!!
3211!OCL SERIAL
3212 subroutine element_operation_tensorprod3d_init_p9( this, elem3D )
3214 implicit none
3215 class(elementoperationtensorprod3d_p9), intent(inout) :: this
3216 class(elementbase3d), intent(in), target :: elem3d
3217 !----------------------------------------------------------
3218
3219 this%elem3D => elem3d
3220 this%operator_type = element_operator_type_tensorprod3d
3221
3222 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
3223 10, elem3d )
3224 !$acc enter data copyin( this )
3225 !$acc enter data attach( this%elem3D )
3226
3227 return
3228 end subroutine element_operation_tensorprod3d_init_p9
3229
3230 !> Setup modal filter
3231 !!
3232!OCL SERIAL
3233 subroutine element_operation_tensorprod3d_setup_modalfilter_p9( this, &
3234 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3235 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3238 implicit none
3239 class(elementoperationtensorprod3d_p9), intent(inout) :: this
3240 real(rp), intent(in) :: mf_etac_h
3241 real(rp), intent(in) :: mf_alpha_h
3242 integer, intent(in) :: mf_order_h
3243 real(rp), intent(in) :: mf_etac_v
3244 real(rp), intent(in) :: mf_alpha_v
3245 integer, intent(in) :: mf_order_v
3246 !--------------------------------------------------------
3247
3248 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
3249 mf_etac_h, mf_alpha_h, mf_order_h, &
3250 mf_etac_v, mf_alpha_v, mf_order_v, &
3251 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3252 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
3253 return
3254 end subroutine element_operation_tensorprod3d_setup_modalfilter_p9
3255
3256!> Setup modal filter for tracer
3257!!
3258!OCL SERIAL
3259 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p9( this, &
3260 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3261 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3264 implicit none
3265 class(elementoperationtensorprod3d_p9), intent(inout) :: this
3266 real(rp), intent(in) :: mf_etac_h
3267 real(rp), intent(in) :: mf_alpha_h
3268 integer, intent(in) :: mf_order_h
3269 real(rp), intent(in) :: mf_etac_v
3270 real(rp), intent(in) :: mf_alpha_v
3271 integer, intent(in) :: mf_order_v
3272 !--------------------------------------------------------
3273
3274 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
3275 mf_etac_h, mf_alpha_h, mf_order_h, &
3276 mf_etac_v, mf_alpha_v, mf_order_v, &
3277 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3278 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
3279 return
3280 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p9
3281
3282!> Finalization
3283!!
3284!OCL SERIAL
3285 subroutine element_operation_tensorprod3d_final_p9( this )
3286 implicit none
3287 class(elementoperationtensorprod3d_p9), intent(inout) :: this
3288 !----------------------------------------------------------
3289 nullify( this%elem3D )
3290 !$acc exit data delete( this )
3291 return
3292 end subroutine element_operation_tensorprod3d_final_p9
3293
3294!> Calculate the differential in x-direction
3295!!
3296!OCL SERIAL
3297 subroutine element_operation_tensorprod3d_dx_p9( this, vec_in, vec_out )
3299 implicit none
3300 class(elementoperationtensorprod3d_p9), intent(in) :: this
3301 real(rp), intent(in) :: vec_in(this%elem3d%np)
3302 real(rp), intent(out) :: vec_out(this%elem3d%np)
3303 !----------------------------------------------------------
3304 call element_operation_kernel_matvec_dirx_p9( this%D1D, vec_in, vec_out )
3305 return
3306 end subroutine element_operation_tensorprod3d_dx_p9
3307
3308!> Calculate the differential in y-direction
3309!!
3310!OCL SERIAL
3311 subroutine element_operation_tensorprod3d_dy_p9( this, vec_in, vec_out )
3313 implicit none
3314 class(elementoperationtensorprod3d_p9), intent(in) :: this
3315 real(rp), intent(in) :: vec_in(this%elem3d%np)
3316 real(rp), intent(out) :: vec_out(this%elem3d%np)
3317 !----------------------------------------------------------
3318 call element_operation_kernel_matvec_diry_p9( this%D1D_tr, vec_in, vec_out )
3319 return
3320 end subroutine element_operation_tensorprod3d_dy_p9
3321
3322!> Calculate the differential in z-direction
3323!!
3324!OCL SERIAL
3325 subroutine element_operation_tensorprod3d_dz_p9( this, vec_in, vec_out )
3327 implicit none
3328 class(elementoperationtensorprod3d_p9), intent(in) :: this
3329 real(rp), intent(in) :: vec_in(this%elem3d%np)
3330 real(rp), intent(out) :: vec_out(this%elem3d%np)
3331 !----------------------------------------------------------
3332 call element_operation_kernel_matvec_dirz_p9( this%D1D_tr, vec_in, vec_out )
3333 return
3334 end subroutine element_operation_tensorprod3d_dz_p9
3335
3336!> Calculate the lifting term
3337!!
3338!OCL SERIAL
3339 subroutine element_operation_tensorprod3d_lift_p9( this, vec_in, vec_out )
3341 implicit none
3342 class(elementoperationtensorprod3d_p9), intent(in) :: this
3343 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
3344 real(rp), intent(out) :: vec_out(this%elem3d%np)
3345 !----------------------------------------------------------
3346 call element_operation_kernel_matvec_lift_hexahedral_p9( this%Lift_mat, vec_in, vec_out )
3347 return
3348 end subroutine element_operation_tensorprod3d_lift_p9
3349
3350!> Calculate the 3D gradient
3351!!
3352!OCL SERIAL
3353 subroutine element_operation_tensorprod3d_dxdydzlift_p9( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
3357 implicit none
3358 class(elementoperationtensorprod3d_p9), intent(in) :: this
3359 real(rp), intent(in) :: vec_in(this%elem3d%np)
3360 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3361 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
3362 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
3363 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
3364 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
3365 !----------------------------------------------------------
3366 call element_operation_kernel_matvec_gradlike_dirxyz_p9( this%D1D, this%D1D_tr, vec_in, vec_in, &
3367 vec_out_dx, vec_out_dy, vec_out_dz )
3368 call element_operation_kernel_matvec_lift_hexahedral_p9( this%Lift_mat, vec_in_lift, &
3369 vec_out_lift )
3370
3371 return
3372 end subroutine element_operation_tensorprod3d_dxdydzlift_p9
3373
3374!> Calculate the 3D divergence
3375!!
3376!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
3377!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
3378!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
3379!!
3380!OCL SERIAL
3381 subroutine element_operation_tensorprod3d_div_p9( this, vec_in, vec_in_lift, &
3382 vec_out )
3386 implicit none
3387 class(elementoperationtensorprod3d_p9), intent(in) :: this
3388 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
3389 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3390 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
3391 !----------------------------------------------------------
3392
3393 call element_operation_kernel_matvec_lift_hexahedral_p9( this%Lift_mat, vec_in_lift, &
3394 vec_out(:,4) )
3395
3396 call element_operation_kernel_matvec_divlike_dirxyz_p9( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
3397 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
3398 return
3399 end subroutine element_operation_tensorprod3d_div_p9
3400
3401!> Calculate the 3D gradient applied for five variables
3402!!
3403!OCL SERIAL
3404 subroutine element_operation_tensorprod3d_div_var5_p9( this, vec_in, vec_in_lift, &
3405 vec_out_d )
3409 implicit none
3410 class(elementoperationtensorprod3d_p9), intent(in) :: this
3411 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3412 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
3413 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
3414
3415 integer :: iv
3416 !----------------------------------------------------------
3417
3418 do iv=1, 5
3419 call element_operation_kernel_matvec_lift_hexahedral_p9( this%Lift_mat, vec_in_lift(:,iv), &
3420 vec_out_d(:,4,iv) )
3421 end do
3422 do iv=1, 5
3423 call element_operation_kernel_matvec_divlike_dirxyz_p9( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3424 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3425 end do
3426 return
3427 end subroutine element_operation_tensorprod3d_div_var5_p9
3428
3429!> Calculate the 3D divergence applied for five variables
3430!!
3431!OCL SERIAL
3432 subroutine element_operation_tensorprod3d_div_var5_2_p9( this, vec_in, &
3433 vec_out_d )
3436 implicit none
3437 class(elementoperationtensorprod3d_p9), intent(in) :: this
3438 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3439 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
3440
3441 integer :: iv
3442 !----------------------------------------------------------
3443
3444 do iv=1, 5
3445 call element_operation_kernel_matvec_divlike_dirxyz_p9( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3446 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3447 end do
3448 return
3449 end subroutine element_operation_tensorprod3d_div_var5_2_p9
3450
3451!> Calculate the lifting term applied for five variables
3452!!
3453!OCL SERIAL
3454 subroutine element_operation_tensorprod3d_lift_var5_p9( this, vec_in, vec_out )
3456 implicit none
3457 class(elementoperationtensorprod3d_p9), intent(in) :: this
3458 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
3459 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3460
3461 integer :: iv
3462 !----------------------------------------------------------
3463 do iv=1, 5
3464 call element_operation_kernel_matvec_lift_hexahedral_p9( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
3465 end do
3466 return
3467 end subroutine element_operation_tensorprod3d_lift_var5_p9
3468
3469!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
3470!!
3471!OCL SERIAL
3472 subroutine element_operation_tensorprod3d_vfilterpm1_p9( this, vec_in, vec_out )
3474 implicit none
3475 class(elementoperationtensorprod3d_p9), intent(in) :: this
3476 real(rp), intent(in) :: vec_in(this%elem3d%np)
3477 real(rp), intent(out) :: vec_out(this%elem3d%np)
3478 !---------------------------------------------------------------
3479
3480 call element_operation_kernel_matvec_dirz_p9( this%IntrpMat_VPOrdM1_tr, vec_in, &
3481 vec_out )
3482 return
3483 end subroutine element_operation_tensorprod3d_vfilterpm1_p9
3484
3485!> Apply a modal filter for tracer variables
3486!!
3487!OCL SERIAL
3488 subroutine element_operation_tensorprod3d_modalfilter_tracer_p9( this, vec_in, vec_work, vec_out )
3491
3492 implicit none
3493 class(elementoperationtensorprod3d_p9), intent(in) :: this
3494 real(rp), intent(in) :: vec_in(this%elem3d%np)
3495 real(rp), intent(out) :: vec_work(this%elem3d%np)
3496 real(rp), intent(out) :: vec_out(this%elem3d%np)
3497 !---------------------------------------------
3498
3499 call element_operation_kernel_matvec_modalfilter_p9( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
3500 vec_out(:) )
3501
3502 return
3503 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p9
3504
3505!> Apply a modal filter for five variables
3506!!
3507!OCL SERIAL
3508 subroutine element_operation_tensorprod3d_modalfilter_var5_p9( this, vec_in, vec_work, vec_out )
3511
3512 implicit none
3513 class(elementoperationtensorprod3d_p9), intent(in) :: this
3514 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
3515 real(rp), intent(out) :: vec_work(this%elem3d%np)
3516 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3517 integer :: iv
3518 !---------------------------------------------
3519
3520 do iv=1, 5
3521 call element_operation_kernel_matvec_modalfilter_p9( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
3522 vec_out(:,iv) )
3523 end do
3524
3525 return
3526 end subroutine element_operation_tensorprod3d_modalfilter_var5_p9
3527
3528
3529!--- For p=10 ------------------------------------
3530
3531!> Initialization
3532!!
3533!OCL SERIAL
3534 subroutine element_operation_tensorprod3d_init_p10( this, elem3D )
3536 implicit none
3537 class(elementoperationtensorprod3d_p10), intent(inout) :: this
3538 class(elementbase3d), intent(in), target :: elem3d
3539 !----------------------------------------------------------
3540
3541 this%elem3D => elem3d
3542 this%operator_type = element_operator_type_tensorprod3d
3543
3544 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
3545 11, elem3d )
3546 !$acc enter data copyin( this )
3547 !$acc enter data attach( this%elem3D )
3548
3549 return
3550 end subroutine element_operation_tensorprod3d_init_p10
3551
3552 !> Setup modal filter
3553 !!
3554!OCL SERIAL
3555 subroutine element_operation_tensorprod3d_setup_modalfilter_p10( this, &
3556 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3557 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3560 implicit none
3561 class(elementoperationtensorprod3d_p10), intent(inout) :: this
3562 real(rp), intent(in) :: mf_etac_h
3563 real(rp), intent(in) :: mf_alpha_h
3564 integer, intent(in) :: mf_order_h
3565 real(rp), intent(in) :: mf_etac_v
3566 real(rp), intent(in) :: mf_alpha_v
3567 integer, intent(in) :: mf_order_v
3568 !--------------------------------------------------------
3569
3570 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
3571 mf_etac_h, mf_alpha_h, mf_order_h, &
3572 mf_etac_v, mf_alpha_v, mf_order_v, &
3573 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3574 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
3575 return
3576 end subroutine element_operation_tensorprod3d_setup_modalfilter_p10
3577
3578!> Setup modal filter for tracer
3579!!
3580!OCL SERIAL
3581 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p10( this, &
3582 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3583 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3586 implicit none
3587 class(elementoperationtensorprod3d_p10), intent(inout) :: this
3588 real(rp), intent(in) :: mf_etac_h
3589 real(rp), intent(in) :: mf_alpha_h
3590 integer, intent(in) :: mf_order_h
3591 real(rp), intent(in) :: mf_etac_v
3592 real(rp), intent(in) :: mf_alpha_v
3593 integer, intent(in) :: mf_order_v
3594 !--------------------------------------------------------
3595
3596 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
3597 mf_etac_h, mf_alpha_h, mf_order_h, &
3598 mf_etac_v, mf_alpha_v, mf_order_v, &
3599 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3600 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
3601 return
3602 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p10
3603
3604!> Finalization
3605!!
3606!OCL SERIAL
3607 subroutine element_operation_tensorprod3d_final_p10( this )
3608 implicit none
3609 class(elementoperationtensorprod3d_p10), intent(inout) :: this
3610 !----------------------------------------------------------
3611 nullify( this%elem3D )
3612 !$acc exit data delete( this )
3613 return
3614 end subroutine element_operation_tensorprod3d_final_p10
3615
3616!> Calculate the differential in x-direction
3617!!
3618!OCL SERIAL
3619 subroutine element_operation_tensorprod3d_dx_p10( this, vec_in, vec_out )
3621 implicit none
3622 class(elementoperationtensorprod3d_p10), intent(in) :: this
3623 real(rp), intent(in) :: vec_in(this%elem3d%np)
3624 real(rp), intent(out) :: vec_out(this%elem3d%np)
3625 !----------------------------------------------------------
3626 call element_operation_kernel_matvec_dirx_p10( this%D1D, vec_in, vec_out )
3627 return
3628 end subroutine element_operation_tensorprod3d_dx_p10
3629
3630!> Calculate the differential in y-direction
3631!!
3632!OCL SERIAL
3633 subroutine element_operation_tensorprod3d_dy_p10( this, vec_in, vec_out )
3635 implicit none
3636 class(elementoperationtensorprod3d_p10), intent(in) :: this
3637 real(rp), intent(in) :: vec_in(this%elem3d%np)
3638 real(rp), intent(out) :: vec_out(this%elem3d%np)
3639 !----------------------------------------------------------
3640 call element_operation_kernel_matvec_diry_p10( this%D1D_tr, vec_in, vec_out )
3641 return
3642 end subroutine element_operation_tensorprod3d_dy_p10
3643
3644!> Calculate the differential in z-direction
3645!!
3646!OCL SERIAL
3647 subroutine element_operation_tensorprod3d_dz_p10( this, vec_in, vec_out )
3649 implicit none
3650 class(elementoperationtensorprod3d_p10), intent(in) :: this
3651 real(rp), intent(in) :: vec_in(this%elem3d%np)
3652 real(rp), intent(out) :: vec_out(this%elem3d%np)
3653 !----------------------------------------------------------
3654 call element_operation_kernel_matvec_dirz_p10( this%D1D_tr, vec_in, vec_out )
3655 return
3656 end subroutine element_operation_tensorprod3d_dz_p10
3657
3658!> Calculate the lifting term
3659!!
3660!OCL SERIAL
3661 subroutine element_operation_tensorprod3d_lift_p10( this, vec_in, vec_out )
3663 implicit none
3664 class(elementoperationtensorprod3d_p10), intent(in) :: this
3665 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
3666 real(rp), intent(out) :: vec_out(this%elem3d%np)
3667 !----------------------------------------------------------
3668 call element_operation_kernel_matvec_lift_hexahedral_p10( this%Lift_mat, vec_in, vec_out )
3669 return
3670 end subroutine element_operation_tensorprod3d_lift_p10
3671
3672!> Calculate the 3D gradient
3673!!
3674!OCL SERIAL
3675 subroutine element_operation_tensorprod3d_dxdydzlift_p10( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
3679 implicit none
3680 class(elementoperationtensorprod3d_p10), intent(in) :: this
3681 real(rp), intent(in) :: vec_in(this%elem3d%np)
3682 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3683 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
3684 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
3685 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
3686 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
3687 !----------------------------------------------------------
3688 call element_operation_kernel_matvec_gradlike_dirxyz_p10( this%D1D, this%D1D_tr, vec_in, vec_in, &
3689 vec_out_dx, vec_out_dy, vec_out_dz )
3690 call element_operation_kernel_matvec_lift_hexahedral_p10( this%Lift_mat, vec_in_lift, &
3691 vec_out_lift )
3692
3693 return
3694 end subroutine element_operation_tensorprod3d_dxdydzlift_p10
3695
3696!> Calculate the 3D divergence
3697!!
3698!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
3699!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
3700!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
3701!!
3702!OCL SERIAL
3703 subroutine element_operation_tensorprod3d_div_p10( this, vec_in, vec_in_lift, &
3704 vec_out )
3708 implicit none
3709 class(elementoperationtensorprod3d_p10), intent(in) :: this
3710 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
3711 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
3712 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
3713 !----------------------------------------------------------
3714
3715 call element_operation_kernel_matvec_lift_hexahedral_p10( this%Lift_mat, vec_in_lift, &
3716 vec_out(:,4) )
3717
3718 call element_operation_kernel_matvec_divlike_dirxyz_p10( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
3719 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
3720 return
3721 end subroutine element_operation_tensorprod3d_div_p10
3722
3723!> Calculate the 3D gradient applied for five variables
3724!!
3725!OCL SERIAL
3726 subroutine element_operation_tensorprod3d_div_var5_p10( this, vec_in, vec_in_lift, &
3727 vec_out_d )
3731 implicit none
3732 class(elementoperationtensorprod3d_p10), intent(in) :: this
3733 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3734 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
3735 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
3736
3737 integer :: iv
3738 !----------------------------------------------------------
3739
3740 do iv=1, 5
3741 call element_operation_kernel_matvec_lift_hexahedral_p10( this%Lift_mat, vec_in_lift(:,iv), &
3742 vec_out_d(:,4,iv) )
3743 end do
3744 do iv=1, 5
3745 call element_operation_kernel_matvec_divlike_dirxyz_p10( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3746 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3747 end do
3748 return
3749 end subroutine element_operation_tensorprod3d_div_var5_p10
3750
3751!> Calculate the 3D divergence applied for five variables
3752!!
3753!OCL SERIAL
3754 subroutine element_operation_tensorprod3d_div_var5_2_p10( this, vec_in, &
3755 vec_out_d )
3758 implicit none
3759 class(elementoperationtensorprod3d_p10), intent(in) :: this
3760 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
3761 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
3762
3763 integer :: iv
3764 !----------------------------------------------------------
3765
3766 do iv=1, 5
3767 call element_operation_kernel_matvec_divlike_dirxyz_p10( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
3768 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
3769 end do
3770 return
3771 end subroutine element_operation_tensorprod3d_div_var5_2_p10
3772
3773!> Calculate the lifting term applied for five variables
3774!!
3775!OCL SERIAL
3776 subroutine element_operation_tensorprod3d_lift_var5_p10( this, vec_in, vec_out )
3778 implicit none
3779 class(elementoperationtensorprod3d_p10), intent(in) :: this
3780 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
3781 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3782
3783 integer :: iv
3784 !----------------------------------------------------------
3785 do iv=1, 5
3786 call element_operation_kernel_matvec_lift_hexahedral_p10( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
3787 end do
3788 return
3789 end subroutine element_operation_tensorprod3d_lift_var5_p10
3790
3791!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
3792!!
3793!OCL SERIAL
3794 subroutine element_operation_tensorprod3d_vfilterpm1_p10( this, vec_in, vec_out )
3796 implicit none
3797 class(elementoperationtensorprod3d_p10), intent(in) :: this
3798 real(rp), intent(in) :: vec_in(this%elem3d%np)
3799 real(rp), intent(out) :: vec_out(this%elem3d%np)
3800 !---------------------------------------------------------------
3801
3802 call element_operation_kernel_matvec_dirz_p10( this%IntrpMat_VPOrdM1_tr, vec_in, &
3803 vec_out )
3804 return
3805 end subroutine element_operation_tensorprod3d_vfilterpm1_p10
3806
3807!> Apply a modal filter for tracer variables
3808!!
3809!OCL SERIAL
3810 subroutine element_operation_tensorprod3d_modalfilter_tracer_p10( this, vec_in, vec_work, vec_out )
3813
3814 implicit none
3815 class(elementoperationtensorprod3d_p10), intent(in) :: this
3816 real(rp), intent(in) :: vec_in(this%elem3d%np)
3817 real(rp), intent(out) :: vec_work(this%elem3d%np)
3818 real(rp), intent(out) :: vec_out(this%elem3d%np)
3819 !---------------------------------------------
3820
3821 call element_operation_kernel_matvec_modalfilter_p10( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
3822 vec_out(:) )
3823
3824 return
3825 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p10
3826
3827!> Apply a modal filter for five variables
3828!!
3829!OCL SERIAL
3830 subroutine element_operation_tensorprod3d_modalfilter_var5_p10( this, vec_in, vec_work, vec_out )
3833
3834 implicit none
3835 class(elementoperationtensorprod3d_p10), intent(in) :: this
3836 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
3837 real(rp), intent(out) :: vec_work(this%elem3d%np)
3838 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
3839 integer :: iv
3840 !---------------------------------------------
3841
3842 do iv=1, 5
3843 call element_operation_kernel_matvec_modalfilter_p10( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
3844 vec_out(:,iv) )
3845 end do
3846
3847 return
3848 end subroutine element_operation_tensorprod3d_modalfilter_var5_p10
3849
3850
3851!--- For p=11 ------------------------------------
3852
3853!> Initialization
3854!!
3855!OCL SERIAL
3856 subroutine element_operation_tensorprod3d_init_p11( this, elem3D )
3858 implicit none
3859 class(elementoperationtensorprod3d_p11), intent(inout) :: this
3860 class(elementbase3d), intent(in), target :: elem3d
3861 !----------------------------------------------------------
3862
3863 this%elem3D => elem3d
3864 this%operator_type = element_operator_type_tensorprod3d
3865
3866 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
3867 12, elem3d )
3868 !$acc enter data copyin( this )
3869 !$acc enter data attach( this%elem3D )
3870
3871 return
3872 end subroutine element_operation_tensorprod3d_init_p11
3873
3874 !> Setup modal filter
3875 !!
3876!OCL SERIAL
3877 subroutine element_operation_tensorprod3d_setup_modalfilter_p11( this, &
3878 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3879 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3882 implicit none
3883 class(elementoperationtensorprod3d_p11), intent(inout) :: this
3884 real(rp), intent(in) :: mf_etac_h
3885 real(rp), intent(in) :: mf_alpha_h
3886 integer, intent(in) :: mf_order_h
3887 real(rp), intent(in) :: mf_etac_v
3888 real(rp), intent(in) :: mf_alpha_v
3889 integer, intent(in) :: mf_order_v
3890 !--------------------------------------------------------
3891
3892 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
3893 mf_etac_h, mf_alpha_h, mf_order_h, &
3894 mf_etac_v, mf_alpha_v, mf_order_v, &
3895 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3896 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
3897 return
3898 end subroutine element_operation_tensorprod3d_setup_modalfilter_p11
3899
3900!> Setup modal filter for tracer
3901!!
3902!OCL SERIAL
3903 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p11( this, &
3904 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
3905 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
3908 implicit none
3909 class(elementoperationtensorprod3d_p11), intent(inout) :: this
3910 real(rp), intent(in) :: mf_etac_h
3911 real(rp), intent(in) :: mf_alpha_h
3912 integer, intent(in) :: mf_order_h
3913 real(rp), intent(in) :: mf_etac_v
3914 real(rp), intent(in) :: mf_alpha_v
3915 integer, intent(in) :: mf_order_v
3916 !--------------------------------------------------------
3917
3918 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
3919 mf_etac_h, mf_alpha_h, mf_order_h, &
3920 mf_etac_v, mf_alpha_v, mf_order_v, &
3921 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
3922 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
3923 return
3924 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p11
3925
3926!> Finalization
3927!!
3928!OCL SERIAL
3929 subroutine element_operation_tensorprod3d_final_p11( this )
3930 implicit none
3931 class(elementoperationtensorprod3d_p11), intent(inout) :: this
3932 !----------------------------------------------------------
3933 nullify( this%elem3D )
3934 !$acc exit data delete( this )
3935 return
3936 end subroutine element_operation_tensorprod3d_final_p11
3937
3938!> Calculate the differential in x-direction
3939!!
3940!OCL SERIAL
3941 subroutine element_operation_tensorprod3d_dx_p11( this, vec_in, vec_out )
3943 implicit none
3944 class(elementoperationtensorprod3d_p11), intent(in) :: this
3945 real(rp), intent(in) :: vec_in(this%elem3d%np)
3946 real(rp), intent(out) :: vec_out(this%elem3d%np)
3947 !----------------------------------------------------------
3948 call element_operation_kernel_matvec_dirx_p11( this%D1D, vec_in, vec_out )
3949 return
3950 end subroutine element_operation_tensorprod3d_dx_p11
3951
3952!> Calculate the differential in y-direction
3953!!
3954!OCL SERIAL
3955 subroutine element_operation_tensorprod3d_dy_p11( this, vec_in, vec_out )
3957 implicit none
3958 class(elementoperationtensorprod3d_p11), intent(in) :: this
3959 real(rp), intent(in) :: vec_in(this%elem3d%np)
3960 real(rp), intent(out) :: vec_out(this%elem3d%np)
3961 !----------------------------------------------------------
3962 call element_operation_kernel_matvec_diry_p11( this%D1D_tr, vec_in, vec_out )
3963 return
3964 end subroutine element_operation_tensorprod3d_dy_p11
3965
3966!> Calculate the differential in z-direction
3967!!
3968!OCL SERIAL
3969 subroutine element_operation_tensorprod3d_dz_p11( this, vec_in, vec_out )
3971 implicit none
3972 class(elementoperationtensorprod3d_p11), intent(in) :: this
3973 real(rp), intent(in) :: vec_in(this%elem3d%np)
3974 real(rp), intent(out) :: vec_out(this%elem3d%np)
3975 !----------------------------------------------------------
3976 call element_operation_kernel_matvec_dirz_p11( this%D1D_tr, vec_in, vec_out )
3977 return
3978 end subroutine element_operation_tensorprod3d_dz_p11
3979
3980!> Calculate the lifting term
3981!!
3982!OCL SERIAL
3983 subroutine element_operation_tensorprod3d_lift_p11( this, vec_in, vec_out )
3985 implicit none
3986 class(elementoperationtensorprod3d_p11), intent(in) :: this
3987 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
3988 real(rp), intent(out) :: vec_out(this%elem3d%np)
3989 !----------------------------------------------------------
3990 call element_operation_kernel_matvec_lift_hexahedral_p11( this%Lift_mat, vec_in, vec_out )
3991 return
3992 end subroutine element_operation_tensorprod3d_lift_p11
3993
3994!> Calculate the 3D gradient
3995!!
3996!OCL SERIAL
3997 subroutine element_operation_tensorprod3d_dxdydzlift_p11( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
4001 implicit none
4002 class(elementoperationtensorprod3d_p11), intent(in) :: this
4003 real(rp), intent(in) :: vec_in(this%elem3d%np)
4004 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4005 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
4006 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
4007 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
4008 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
4009 !----------------------------------------------------------
4010 call element_operation_kernel_matvec_gradlike_dirxyz_p11( this%D1D, this%D1D_tr, vec_in, vec_in, &
4011 vec_out_dx, vec_out_dy, vec_out_dz )
4012 call element_operation_kernel_matvec_lift_hexahedral_p11( this%Lift_mat, vec_in_lift, &
4013 vec_out_lift )
4014
4015 return
4016 end subroutine element_operation_tensorprod3d_dxdydzlift_p11
4017
4018!> Calculate the 3D divergence
4019!!
4020!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
4021!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
4022!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
4023!!
4024!OCL SERIAL
4025 subroutine element_operation_tensorprod3d_div_p11( this, vec_in, vec_in_lift, &
4026 vec_out )
4030 implicit none
4031 class(elementoperationtensorprod3d_p11), intent(in) :: this
4032 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
4033 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4034 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
4035 !----------------------------------------------------------
4036
4037 call element_operation_kernel_matvec_lift_hexahedral_p11( this%Lift_mat, vec_in_lift, &
4038 vec_out(:,4) )
4039
4040 call element_operation_kernel_matvec_divlike_dirxyz_p11( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
4041 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
4042 return
4043 end subroutine element_operation_tensorprod3d_div_p11
4044
4045!> Calculate the 3D gradient applied for five variables
4046!!
4047!OCL SERIAL
4048 subroutine element_operation_tensorprod3d_div_var5_p11( this, vec_in, vec_in_lift, &
4049 vec_out_d )
4053 implicit none
4054 class(elementoperationtensorprod3d_p11), intent(in) :: this
4055 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4056 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
4057 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
4058
4059 integer :: iv
4060 !----------------------------------------------------------
4061
4062 do iv=1, 5
4063 call element_operation_kernel_matvec_lift_hexahedral_p11( this%Lift_mat, vec_in_lift(:,iv), &
4064 vec_out_d(:,4,iv) )
4065 end do
4066 do iv=1, 5
4067 call element_operation_kernel_matvec_divlike_dirxyz_p11( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4068 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4069 end do
4070 return
4071 end subroutine element_operation_tensorprod3d_div_var5_p11
4072
4073!> Calculate the 3D divergence applied for five variables
4074!!
4075!OCL SERIAL
4076 subroutine element_operation_tensorprod3d_div_var5_2_p11( this, vec_in, &
4077 vec_out_d )
4080 implicit none
4081 class(elementoperationtensorprod3d_p11), intent(in) :: this
4082 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4083 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
4084
4085 integer :: iv
4086 !----------------------------------------------------------
4087
4088 do iv=1, 5
4089 call element_operation_kernel_matvec_divlike_dirxyz_p11( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4090 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4091 end do
4092 return
4093 end subroutine element_operation_tensorprod3d_div_var5_2_p11
4094
4095!> Calculate the lifting term applied for five variables
4096!!
4097!OCL SERIAL
4098 subroutine element_operation_tensorprod3d_lift_var5_p11( this, vec_in, vec_out )
4100 implicit none
4101 class(elementoperationtensorprod3d_p11), intent(in) :: this
4102 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
4103 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4104
4105 integer :: iv
4106 !----------------------------------------------------------
4107 do iv=1, 5
4108 call element_operation_kernel_matvec_lift_hexahedral_p11( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
4109 end do
4110 return
4111 end subroutine element_operation_tensorprod3d_lift_var5_p11
4112
4113!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
4114!!
4115!OCL SERIAL
4116 subroutine element_operation_tensorprod3d_vfilterpm1_p11( this, vec_in, vec_out )
4118 implicit none
4119 class(elementoperationtensorprod3d_p11), intent(in) :: this
4120 real(rp), intent(in) :: vec_in(this%elem3d%np)
4121 real(rp), intent(out) :: vec_out(this%elem3d%np)
4122 !---------------------------------------------------------------
4123
4124 call element_operation_kernel_matvec_dirz_p11( this%IntrpMat_VPOrdM1_tr, vec_in, &
4125 vec_out )
4126 return
4127 end subroutine element_operation_tensorprod3d_vfilterpm1_p11
4128
4129!> Apply a modal filter for tracer variables
4130!!
4131!OCL SERIAL
4132 subroutine element_operation_tensorprod3d_modalfilter_tracer_p11( this, vec_in, vec_work, vec_out )
4135
4136 implicit none
4137 class(elementoperationtensorprod3d_p11), intent(in) :: this
4138 real(rp), intent(in) :: vec_in(this%elem3d%np)
4139 real(rp), intent(out) :: vec_work(this%elem3d%np)
4140 real(rp), intent(out) :: vec_out(this%elem3d%np)
4141 !---------------------------------------------
4142
4143 call element_operation_kernel_matvec_modalfilter_p11( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
4144 vec_out(:) )
4145
4146 return
4147 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p11
4148
4149!> Apply a modal filter for five variables
4150!!
4151!OCL SERIAL
4152 subroutine element_operation_tensorprod3d_modalfilter_var5_p11( this, vec_in, vec_work, vec_out )
4155
4156 implicit none
4157 class(elementoperationtensorprod3d_p11), intent(in) :: this
4158 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
4159 real(rp), intent(out) :: vec_work(this%elem3d%np)
4160 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4161 integer :: iv
4162 !---------------------------------------------
4163
4164 do iv=1, 5
4165 call element_operation_kernel_matvec_modalfilter_p11( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
4166 vec_out(:,iv) )
4167 end do
4168
4169 return
4170 end subroutine element_operation_tensorprod3d_modalfilter_var5_p11
4171
4172
4173!--- For p=12 ------------------------------------
4174
4175!> Initialization
4176!!
4177!OCL SERIAL
4178 subroutine element_operation_tensorprod3d_init_p12( this, elem3D )
4180 implicit none
4181 class(elementoperationtensorprod3d_p12), intent(inout) :: this
4182 class(elementbase3d), intent(in), target :: elem3d
4183 !----------------------------------------------------------
4184
4185 this%elem3D => elem3d
4186 this%operator_type = element_operator_type_tensorprod3d
4187
4188 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
4189 13, elem3d )
4190 !$acc enter data copyin( this )
4191 !$acc enter data attach( this%elem3D )
4192
4193 return
4194 end subroutine element_operation_tensorprod3d_init_p12
4195
4196 !> Setup modal filter
4197 !!
4198!OCL SERIAL
4199 subroutine element_operation_tensorprod3d_setup_modalfilter_p12( this, &
4200 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4201 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4204 implicit none
4205 class(elementoperationtensorprod3d_p12), intent(inout) :: this
4206 real(rp), intent(in) :: mf_etac_h
4207 real(rp), intent(in) :: mf_alpha_h
4208 integer, intent(in) :: mf_order_h
4209 real(rp), intent(in) :: mf_etac_v
4210 real(rp), intent(in) :: mf_alpha_v
4211 integer, intent(in) :: mf_order_v
4212 !--------------------------------------------------------
4213
4214 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
4215 mf_etac_h, mf_alpha_h, mf_order_h, &
4216 mf_etac_v, mf_alpha_v, mf_order_v, &
4217 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4218 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
4219 return
4220 end subroutine element_operation_tensorprod3d_setup_modalfilter_p12
4221
4222!> Setup modal filter for tracer
4223!!
4224!OCL SERIAL
4225 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p12( this, &
4226 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4227 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4230 implicit none
4231 class(elementoperationtensorprod3d_p12), intent(inout) :: this
4232 real(rp), intent(in) :: mf_etac_h
4233 real(rp), intent(in) :: mf_alpha_h
4234 integer, intent(in) :: mf_order_h
4235 real(rp), intent(in) :: mf_etac_v
4236 real(rp), intent(in) :: mf_alpha_v
4237 integer, intent(in) :: mf_order_v
4238 !--------------------------------------------------------
4239
4240 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
4241 mf_etac_h, mf_alpha_h, mf_order_h, &
4242 mf_etac_v, mf_alpha_v, mf_order_v, &
4243 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4244 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
4245 return
4246 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p12
4247
4248!> Finalization
4249!!
4250!OCL SERIAL
4251 subroutine element_operation_tensorprod3d_final_p12( this )
4252 implicit none
4253 class(elementoperationtensorprod3d_p12), intent(inout) :: this
4254 !----------------------------------------------------------
4255 nullify( this%elem3D )
4256 !$acc exit data delete( this )
4257 return
4258 end subroutine element_operation_tensorprod3d_final_p12
4259
4260!> Calculate the differential in x-direction
4261!!
4262!OCL SERIAL
4263 subroutine element_operation_tensorprod3d_dx_p12( this, vec_in, vec_out )
4265 implicit none
4266 class(elementoperationtensorprod3d_p12), intent(in) :: this
4267 real(rp), intent(in) :: vec_in(this%elem3d%np)
4268 real(rp), intent(out) :: vec_out(this%elem3d%np)
4269 !----------------------------------------------------------
4270 call element_operation_kernel_matvec_dirx_p12( this%D1D, vec_in, vec_out )
4271 return
4272 end subroutine element_operation_tensorprod3d_dx_p12
4273
4274!> Calculate the differential in y-direction
4275!!
4276!OCL SERIAL
4277 subroutine element_operation_tensorprod3d_dy_p12( this, vec_in, vec_out )
4279 implicit none
4280 class(elementoperationtensorprod3d_p12), intent(in) :: this
4281 real(rp), intent(in) :: vec_in(this%elem3d%np)
4282 real(rp), intent(out) :: vec_out(this%elem3d%np)
4283 !----------------------------------------------------------
4284 call element_operation_kernel_matvec_diry_p12( this%D1D_tr, vec_in, vec_out )
4285 return
4286 end subroutine element_operation_tensorprod3d_dy_p12
4287
4288!> Calculate the differential in z-direction
4289!!
4290!OCL SERIAL
4291 subroutine element_operation_tensorprod3d_dz_p12( this, vec_in, vec_out )
4293 implicit none
4294 class(elementoperationtensorprod3d_p12), intent(in) :: this
4295 real(rp), intent(in) :: vec_in(this%elem3d%np)
4296 real(rp), intent(out) :: vec_out(this%elem3d%np)
4297 !----------------------------------------------------------
4298 call element_operation_kernel_matvec_dirz_p12( this%D1D_tr, vec_in, vec_out )
4299 return
4300 end subroutine element_operation_tensorprod3d_dz_p12
4301
4302!> Calculate the lifting term
4303!!
4304!OCL SERIAL
4305 subroutine element_operation_tensorprod3d_lift_p12( this, vec_in, vec_out )
4307 implicit none
4308 class(elementoperationtensorprod3d_p12), intent(in) :: this
4309 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
4310 real(rp), intent(out) :: vec_out(this%elem3d%np)
4311 !----------------------------------------------------------
4312 call element_operation_kernel_matvec_lift_hexahedral_p12( this%Lift_mat, vec_in, vec_out )
4313 return
4314 end subroutine element_operation_tensorprod3d_lift_p12
4315
4316!> Calculate the 3D gradient
4317!!
4318!OCL SERIAL
4319 subroutine element_operation_tensorprod3d_dxdydzlift_p12( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
4323 implicit none
4324 class(elementoperationtensorprod3d_p12), intent(in) :: this
4325 real(rp), intent(in) :: vec_in(this%elem3d%np)
4326 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4327 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
4328 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
4329 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
4330 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
4331 !----------------------------------------------------------
4332 call element_operation_kernel_matvec_gradlike_dirxyz_p12( this%D1D, this%D1D_tr, vec_in, vec_in, &
4333 vec_out_dx, vec_out_dy, vec_out_dz )
4334 call element_operation_kernel_matvec_lift_hexahedral_p12( this%Lift_mat, vec_in_lift, &
4335 vec_out_lift )
4336
4337 return
4338 end subroutine element_operation_tensorprod3d_dxdydzlift_p12
4339
4340!> Calculate the 3D divergence
4341!!
4342!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
4343!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
4344!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
4345!!
4346!OCL SERIAL
4347 subroutine element_operation_tensorprod3d_div_p12( this, vec_in, vec_in_lift, &
4348 vec_out )
4352 implicit none
4353 class(elementoperationtensorprod3d_p12), intent(in) :: this
4354 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
4355 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4356 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
4357 !----------------------------------------------------------
4358
4359 call element_operation_kernel_matvec_lift_hexahedral_p12( this%Lift_mat, vec_in_lift, &
4360 vec_out(:,4) )
4361
4362 call element_operation_kernel_matvec_divlike_dirxyz_p12( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
4363 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
4364 return
4365 end subroutine element_operation_tensorprod3d_div_p12
4366
4367!> Calculate the 3D gradient applied for five variables
4368!!
4369!OCL SERIAL
4370 subroutine element_operation_tensorprod3d_div_var5_p12( this, vec_in, vec_in_lift, &
4371 vec_out_d )
4375 implicit none
4376 class(elementoperationtensorprod3d_p12), intent(in) :: this
4377 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4378 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
4379 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
4380
4381 integer :: iv
4382 !----------------------------------------------------------
4383
4384 do iv=1, 5
4385 call element_operation_kernel_matvec_lift_hexahedral_p12( this%Lift_mat, vec_in_lift(:,iv), &
4386 vec_out_d(:,4,iv) )
4387 end do
4388 do iv=1, 5
4389 call element_operation_kernel_matvec_divlike_dirxyz_p12( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4390 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4391 end do
4392 return
4393 end subroutine element_operation_tensorprod3d_div_var5_p12
4394
4395!> Calculate the 3D divergence applied for five variables
4396!!
4397!OCL SERIAL
4398 subroutine element_operation_tensorprod3d_div_var5_2_p12( this, vec_in, &
4399 vec_out_d )
4402 implicit none
4403 class(elementoperationtensorprod3d_p12), intent(in) :: this
4404 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4405 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
4406
4407 integer :: iv
4408 !----------------------------------------------------------
4409
4410 do iv=1, 5
4411 call element_operation_kernel_matvec_divlike_dirxyz_p12( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4412 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4413 end do
4414 return
4415 end subroutine element_operation_tensorprod3d_div_var5_2_p12
4416
4417!> Calculate the lifting term applied for five variables
4418!!
4419!OCL SERIAL
4420 subroutine element_operation_tensorprod3d_lift_var5_p12( this, vec_in, vec_out )
4422 implicit none
4423 class(elementoperationtensorprod3d_p12), intent(in) :: this
4424 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
4425 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4426
4427 integer :: iv
4428 !----------------------------------------------------------
4429 do iv=1, 5
4430 call element_operation_kernel_matvec_lift_hexahedral_p12( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
4431 end do
4432 return
4433 end subroutine element_operation_tensorprod3d_lift_var5_p12
4434
4435!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
4436!!
4437!OCL SERIAL
4438 subroutine element_operation_tensorprod3d_vfilterpm1_p12( this, vec_in, vec_out )
4440 implicit none
4441 class(elementoperationtensorprod3d_p12), intent(in) :: this
4442 real(rp), intent(in) :: vec_in(this%elem3d%np)
4443 real(rp), intent(out) :: vec_out(this%elem3d%np)
4444 !---------------------------------------------------------------
4445
4446 call element_operation_kernel_matvec_dirz_p12( this%IntrpMat_VPOrdM1_tr, vec_in, &
4447 vec_out )
4448 return
4449 end subroutine element_operation_tensorprod3d_vfilterpm1_p12
4450
4451!> Apply a modal filter for tracer variables
4452!!
4453!OCL SERIAL
4454 subroutine element_operation_tensorprod3d_modalfilter_tracer_p12( this, vec_in, vec_work, vec_out )
4457
4458 implicit none
4459 class(elementoperationtensorprod3d_p12), intent(in) :: this
4460 real(rp), intent(in) :: vec_in(this%elem3d%np)
4461 real(rp), intent(out) :: vec_work(this%elem3d%np)
4462 real(rp), intent(out) :: vec_out(this%elem3d%np)
4463 !---------------------------------------------
4464
4465 call element_operation_kernel_matvec_modalfilter_p12( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
4466 vec_out(:) )
4467
4468 return
4469 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p12
4470
4471!> Apply a modal filter for five variables
4472!!
4473!OCL SERIAL
4474 subroutine element_operation_tensorprod3d_modalfilter_var5_p12( this, vec_in, vec_work, vec_out )
4477
4478 implicit none
4479 class(elementoperationtensorprod3d_p12), intent(in) :: this
4480 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
4481 real(rp), intent(out) :: vec_work(this%elem3d%np)
4482 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4483 integer :: iv
4484 !---------------------------------------------
4485
4486 do iv=1, 5
4487 call element_operation_kernel_matvec_modalfilter_p12( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
4488 vec_out(:,iv) )
4489 end do
4490
4491 return
4492 end subroutine element_operation_tensorprod3d_modalfilter_var5_p12
4493
4494
4495!--- For p=13 ------------------------------------
4496
4497!> Initialization
4498!!
4499!OCL SERIAL
4500 subroutine element_operation_tensorprod3d_init_p13( this, elem3D )
4502 implicit none
4503 class(elementoperationtensorprod3d_p13), intent(inout) :: this
4504 class(elementbase3d), intent(in), target :: elem3d
4505 !----------------------------------------------------------
4506
4507 this%elem3D => elem3d
4508 this%operator_type = element_operator_type_tensorprod3d
4509
4510 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
4511 14, elem3d )
4512 !$acc enter data copyin( this )
4513 !$acc enter data attach( this%elem3D )
4514
4515 return
4516 end subroutine element_operation_tensorprod3d_init_p13
4517
4518 !> Setup modal filter
4519 !!
4520!OCL SERIAL
4521 subroutine element_operation_tensorprod3d_setup_modalfilter_p13( this, &
4522 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4523 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4526 implicit none
4527 class(elementoperationtensorprod3d_p13), intent(inout) :: this
4528 real(rp), intent(in) :: mf_etac_h
4529 real(rp), intent(in) :: mf_alpha_h
4530 integer, intent(in) :: mf_order_h
4531 real(rp), intent(in) :: mf_etac_v
4532 real(rp), intent(in) :: mf_alpha_v
4533 integer, intent(in) :: mf_order_v
4534 !--------------------------------------------------------
4535
4536 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
4537 mf_etac_h, mf_alpha_h, mf_order_h, &
4538 mf_etac_v, mf_alpha_v, mf_order_v, &
4539 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4540 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
4541 return
4542 end subroutine element_operation_tensorprod3d_setup_modalfilter_p13
4543
4544!> Setup modal filter for tracer
4545!!
4546!OCL SERIAL
4547 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p13( this, &
4548 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4549 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4552 implicit none
4553 class(elementoperationtensorprod3d_p13), intent(inout) :: this
4554 real(rp), intent(in) :: mf_etac_h
4555 real(rp), intent(in) :: mf_alpha_h
4556 integer, intent(in) :: mf_order_h
4557 real(rp), intent(in) :: mf_etac_v
4558 real(rp), intent(in) :: mf_alpha_v
4559 integer, intent(in) :: mf_order_v
4560 !--------------------------------------------------------
4561
4562 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
4563 mf_etac_h, mf_alpha_h, mf_order_h, &
4564 mf_etac_v, mf_alpha_v, mf_order_v, &
4565 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4566 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
4567 return
4568 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p13
4569
4570!> Finalization
4571!!
4572!OCL SERIAL
4573 subroutine element_operation_tensorprod3d_final_p13( this )
4574 implicit none
4575 class(elementoperationtensorprod3d_p13), intent(inout) :: this
4576 !----------------------------------------------------------
4577 nullify( this%elem3D )
4578 !$acc exit data delete( this )
4579 return
4580 end subroutine element_operation_tensorprod3d_final_p13
4581
4582!> Calculate the differential in x-direction
4583!!
4584!OCL SERIAL
4585 subroutine element_operation_tensorprod3d_dx_p13( this, vec_in, vec_out )
4587 implicit none
4588 class(elementoperationtensorprod3d_p13), intent(in) :: this
4589 real(rp), intent(in) :: vec_in(this%elem3d%np)
4590 real(rp), intent(out) :: vec_out(this%elem3d%np)
4591 !----------------------------------------------------------
4592 call element_operation_kernel_matvec_dirx_p13( this%D1D, vec_in, vec_out )
4593 return
4594 end subroutine element_operation_tensorprod3d_dx_p13
4595
4596!> Calculate the differential in y-direction
4597!!
4598!OCL SERIAL
4599 subroutine element_operation_tensorprod3d_dy_p13( this, vec_in, vec_out )
4601 implicit none
4602 class(elementoperationtensorprod3d_p13), intent(in) :: this
4603 real(rp), intent(in) :: vec_in(this%elem3d%np)
4604 real(rp), intent(out) :: vec_out(this%elem3d%np)
4605 !----------------------------------------------------------
4606 call element_operation_kernel_matvec_diry_p13( this%D1D_tr, vec_in, vec_out )
4607 return
4608 end subroutine element_operation_tensorprod3d_dy_p13
4609
4610!> Calculate the differential in z-direction
4611!!
4612!OCL SERIAL
4613 subroutine element_operation_tensorprod3d_dz_p13( this, vec_in, vec_out )
4615 implicit none
4616 class(elementoperationtensorprod3d_p13), intent(in) :: this
4617 real(rp), intent(in) :: vec_in(this%elem3d%np)
4618 real(rp), intent(out) :: vec_out(this%elem3d%np)
4619 !----------------------------------------------------------
4620 call element_operation_kernel_matvec_dirz_p13( this%D1D_tr, vec_in, vec_out )
4621 return
4622 end subroutine element_operation_tensorprod3d_dz_p13
4623
4624!> Calculate the lifting term
4625!!
4626!OCL SERIAL
4627 subroutine element_operation_tensorprod3d_lift_p13( this, vec_in, vec_out )
4629 implicit none
4630 class(elementoperationtensorprod3d_p13), intent(in) :: this
4631 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
4632 real(rp), intent(out) :: vec_out(this%elem3d%np)
4633 !----------------------------------------------------------
4634 call element_operation_kernel_matvec_lift_hexahedral_p13( this%Lift_mat, vec_in, vec_out )
4635 return
4636 end subroutine element_operation_tensorprod3d_lift_p13
4637
4638!> Calculate the 3D gradient
4639!!
4640!OCL SERIAL
4641 subroutine element_operation_tensorprod3d_dxdydzlift_p13( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
4645 implicit none
4646 class(elementoperationtensorprod3d_p13), intent(in) :: this
4647 real(rp), intent(in) :: vec_in(this%elem3d%np)
4648 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4649 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
4650 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
4651 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
4652 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
4653 !----------------------------------------------------------
4654 call element_operation_kernel_matvec_gradlike_dirxyz_p13( this%D1D, this%D1D_tr, vec_in, vec_in, &
4655 vec_out_dx, vec_out_dy, vec_out_dz )
4656 call element_operation_kernel_matvec_lift_hexahedral_p13( this%Lift_mat, vec_in_lift, &
4657 vec_out_lift )
4658
4659 return
4660 end subroutine element_operation_tensorprod3d_dxdydzlift_p13
4661
4662!> Calculate the 3D divergence
4663!!
4664!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
4665!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
4666!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
4667!!
4668!OCL SERIAL
4669 subroutine element_operation_tensorprod3d_div_p13( this, vec_in, vec_in_lift, &
4670 vec_out )
4674 implicit none
4675 class(elementoperationtensorprod3d_p13), intent(in) :: this
4676 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
4677 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4678 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
4679 !----------------------------------------------------------
4680
4681 call element_operation_kernel_matvec_lift_hexahedral_p13( this%Lift_mat, vec_in_lift, &
4682 vec_out(:,4) )
4683
4684 call element_operation_kernel_matvec_divlike_dirxyz_p13( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
4685 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
4686 return
4687 end subroutine element_operation_tensorprod3d_div_p13
4688
4689!> Calculate the 3D gradient applied for five variables
4690!!
4691!OCL SERIAL
4692 subroutine element_operation_tensorprod3d_div_var5_p13( this, vec_in, vec_in_lift, &
4693 vec_out_d )
4697 implicit none
4698 class(elementoperationtensorprod3d_p13), intent(in) :: this
4699 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4700 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
4701 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
4702
4703 integer :: iv
4704 !----------------------------------------------------------
4705
4706 do iv=1, 5
4707 call element_operation_kernel_matvec_lift_hexahedral_p13( this%Lift_mat, vec_in_lift(:,iv), &
4708 vec_out_d(:,4,iv) )
4709 end do
4710 do iv=1, 5
4711 call element_operation_kernel_matvec_divlike_dirxyz_p13( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4712 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4713 end do
4714 return
4715 end subroutine element_operation_tensorprod3d_div_var5_p13
4716
4717!> Calculate the 3D divergence applied for five variables
4718!!
4719!OCL SERIAL
4720 subroutine element_operation_tensorprod3d_div_var5_2_p13( this, vec_in, &
4721 vec_out_d )
4724 implicit none
4725 class(elementoperationtensorprod3d_p13), intent(in) :: this
4726 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
4727 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
4728
4729 integer :: iv
4730 !----------------------------------------------------------
4731
4732 do iv=1, 5
4733 call element_operation_kernel_matvec_divlike_dirxyz_p13( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
4734 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
4735 end do
4736 return
4737 end subroutine element_operation_tensorprod3d_div_var5_2_p13
4738
4739!> Calculate the lifting term applied for five variables
4740!!
4741!OCL SERIAL
4742 subroutine element_operation_tensorprod3d_lift_var5_p13( this, vec_in, vec_out )
4744 implicit none
4745 class(elementoperationtensorprod3d_p13), intent(in) :: this
4746 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
4747 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4748
4749 integer :: iv
4750 !----------------------------------------------------------
4751 do iv=1, 5
4752 call element_operation_kernel_matvec_lift_hexahedral_p13( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
4753 end do
4754 return
4755 end subroutine element_operation_tensorprod3d_lift_var5_p13
4756
4757!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
4758!!
4759!OCL SERIAL
4760 subroutine element_operation_tensorprod3d_vfilterpm1_p13( this, vec_in, vec_out )
4762 implicit none
4763 class(elementoperationtensorprod3d_p13), intent(in) :: this
4764 real(rp), intent(in) :: vec_in(this%elem3d%np)
4765 real(rp), intent(out) :: vec_out(this%elem3d%np)
4766 !---------------------------------------------------------------
4767
4768 call element_operation_kernel_matvec_dirz_p13( this%IntrpMat_VPOrdM1_tr, vec_in, &
4769 vec_out )
4770 return
4771 end subroutine element_operation_tensorprod3d_vfilterpm1_p13
4772
4773!> Apply a modal filter for tracer variables
4774!!
4775!OCL SERIAL
4776 subroutine element_operation_tensorprod3d_modalfilter_tracer_p13( this, vec_in, vec_work, vec_out )
4779
4780 implicit none
4781 class(elementoperationtensorprod3d_p13), intent(in) :: this
4782 real(rp), intent(in) :: vec_in(this%elem3d%np)
4783 real(rp), intent(out) :: vec_work(this%elem3d%np)
4784 real(rp), intent(out) :: vec_out(this%elem3d%np)
4785 !---------------------------------------------
4786
4787 call element_operation_kernel_matvec_modalfilter_p13( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
4788 vec_out(:) )
4789
4790 return
4791 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p13
4792
4793!> Apply a modal filter for five variables
4794!!
4795!OCL SERIAL
4796 subroutine element_operation_tensorprod3d_modalfilter_var5_p13( this, vec_in, vec_work, vec_out )
4799
4800 implicit none
4801 class(elementoperationtensorprod3d_p13), intent(in) :: this
4802 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
4803 real(rp), intent(out) :: vec_work(this%elem3d%np)
4804 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
4805 integer :: iv
4806 !---------------------------------------------
4807
4808 do iv=1, 5
4809 call element_operation_kernel_matvec_modalfilter_p13( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
4810 vec_out(:,iv) )
4811 end do
4812
4813 return
4814 end subroutine element_operation_tensorprod3d_modalfilter_var5_p13
4815
4816
4817!--- For p=14 ------------------------------------
4818
4819!> Initialization
4820!!
4821!OCL SERIAL
4822 subroutine element_operation_tensorprod3d_init_p14( this, elem3D )
4824 implicit none
4825 class(elementoperationtensorprod3d_p14), intent(inout) :: this
4826 class(elementbase3d), intent(in), target :: elem3d
4827 !----------------------------------------------------------
4828
4829 this%elem3D => elem3d
4830 this%operator_type = element_operator_type_tensorprod3d
4831
4832 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
4833 15, elem3d )
4834 !$acc enter data copyin( this )
4835 !$acc enter data attach( this%elem3D )
4836
4837 return
4838 end subroutine element_operation_tensorprod3d_init_p14
4839
4840 !> Setup modal filter
4841 !!
4842!OCL SERIAL
4843 subroutine element_operation_tensorprod3d_setup_modalfilter_p14( this, &
4844 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4845 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4848 implicit none
4849 class(elementoperationtensorprod3d_p14), intent(inout) :: this
4850 real(rp), intent(in) :: mf_etac_h
4851 real(rp), intent(in) :: mf_alpha_h
4852 integer, intent(in) :: mf_order_h
4853 real(rp), intent(in) :: mf_etac_v
4854 real(rp), intent(in) :: mf_alpha_v
4855 integer, intent(in) :: mf_order_v
4856 !--------------------------------------------------------
4857
4858 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
4859 mf_etac_h, mf_alpha_h, mf_order_h, &
4860 mf_etac_v, mf_alpha_v, mf_order_v, &
4861 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4862 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
4863 return
4864 end subroutine element_operation_tensorprod3d_setup_modalfilter_p14
4865
4866!> Setup modal filter for tracer
4867!!
4868!OCL SERIAL
4869 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p14( this, &
4870 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
4871 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
4874 implicit none
4875 class(elementoperationtensorprod3d_p14), intent(inout) :: this
4876 real(rp), intent(in) :: mf_etac_h
4877 real(rp), intent(in) :: mf_alpha_h
4878 integer, intent(in) :: mf_order_h
4879 real(rp), intent(in) :: mf_etac_v
4880 real(rp), intent(in) :: mf_alpha_v
4881 integer, intent(in) :: mf_order_v
4882 !--------------------------------------------------------
4883
4884 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
4885 mf_etac_h, mf_alpha_h, mf_order_h, &
4886 mf_etac_v, mf_alpha_v, mf_order_v, &
4887 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
4888 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
4889 return
4890 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p14
4891
4892!> Finalization
4893!!
4894!OCL SERIAL
4895 subroutine element_operation_tensorprod3d_final_p14( this )
4896 implicit none
4897 class(elementoperationtensorprod3d_p14), intent(inout) :: this
4898 !----------------------------------------------------------
4899 nullify( this%elem3D )
4900 !$acc exit data delete( this )
4901 return
4902 end subroutine element_operation_tensorprod3d_final_p14
4903
4904!> Calculate the differential in x-direction
4905!!
4906!OCL SERIAL
4907 subroutine element_operation_tensorprod3d_dx_p14( this, vec_in, vec_out )
4909 implicit none
4910 class(elementoperationtensorprod3d_p14), intent(in) :: this
4911 real(rp), intent(in) :: vec_in(this%elem3d%np)
4912 real(rp), intent(out) :: vec_out(this%elem3d%np)
4913 !----------------------------------------------------------
4914 call element_operation_kernel_matvec_dirx_p14( this%D1D, vec_in, vec_out )
4915 return
4916 end subroutine element_operation_tensorprod3d_dx_p14
4917
4918!> Calculate the differential in y-direction
4919!!
4920!OCL SERIAL
4921 subroutine element_operation_tensorprod3d_dy_p14( this, vec_in, vec_out )
4923 implicit none
4924 class(elementoperationtensorprod3d_p14), intent(in) :: this
4925 real(rp), intent(in) :: vec_in(this%elem3d%np)
4926 real(rp), intent(out) :: vec_out(this%elem3d%np)
4927 !----------------------------------------------------------
4928 call element_operation_kernel_matvec_diry_p14( this%D1D_tr, vec_in, vec_out )
4929 return
4930 end subroutine element_operation_tensorprod3d_dy_p14
4931
4932!> Calculate the differential in z-direction
4933!!
4934!OCL SERIAL
4935 subroutine element_operation_tensorprod3d_dz_p14( this, vec_in, vec_out )
4937 implicit none
4938 class(elementoperationtensorprod3d_p14), intent(in) :: this
4939 real(rp), intent(in) :: vec_in(this%elem3d%np)
4940 real(rp), intent(out) :: vec_out(this%elem3d%np)
4941 !----------------------------------------------------------
4942 call element_operation_kernel_matvec_dirz_p14( this%D1D_tr, vec_in, vec_out )
4943 return
4944 end subroutine element_operation_tensorprod3d_dz_p14
4945
4946!> Calculate the lifting term
4947!!
4948!OCL SERIAL
4949 subroutine element_operation_tensorprod3d_lift_p14( this, vec_in, vec_out )
4951 implicit none
4952 class(elementoperationtensorprod3d_p14), intent(in) :: this
4953 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
4954 real(rp), intent(out) :: vec_out(this%elem3d%np)
4955 !----------------------------------------------------------
4956 call element_operation_kernel_matvec_lift_hexahedral_p14( this%Lift_mat, vec_in, vec_out )
4957 return
4958 end subroutine element_operation_tensorprod3d_lift_p14
4959
4960!> Calculate the 3D gradient
4961!!
4962!OCL SERIAL
4963 subroutine element_operation_tensorprod3d_dxdydzlift_p14( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
4967 implicit none
4968 class(elementoperationtensorprod3d_p14), intent(in) :: this
4969 real(rp), intent(in) :: vec_in(this%elem3d%np)
4970 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
4971 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
4972 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
4973 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
4974 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
4975 !----------------------------------------------------------
4976 call element_operation_kernel_matvec_gradlike_dirxyz_p14( this%D1D, this%D1D_tr, vec_in, vec_in, &
4977 vec_out_dx, vec_out_dy, vec_out_dz )
4978 call element_operation_kernel_matvec_lift_hexahedral_p14( this%Lift_mat, vec_in_lift, &
4979 vec_out_lift )
4980
4981 return
4982 end subroutine element_operation_tensorprod3d_dxdydzlift_p14
4983
4984!> Calculate the 3D divergence
4985!!
4986!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
4987!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
4988!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
4989!!
4990!OCL SERIAL
4991 subroutine element_operation_tensorprod3d_div_p14( this, vec_in, vec_in_lift, &
4992 vec_out )
4996 implicit none
4997 class(elementoperationtensorprod3d_p14), intent(in) :: this
4998 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
4999 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
5000 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
5001 !----------------------------------------------------------
5002
5003 call element_operation_kernel_matvec_lift_hexahedral_p14( this%Lift_mat, vec_in_lift, &
5004 vec_out(:,4) )
5005
5006 call element_operation_kernel_matvec_divlike_dirxyz_p14( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
5007 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
5008 return
5009 end subroutine element_operation_tensorprod3d_div_p14
5010
5011!> Calculate the 3D gradient applied for five variables
5012!!
5013!OCL SERIAL
5014 subroutine element_operation_tensorprod3d_div_var5_p14( this, vec_in, vec_in_lift, &
5015 vec_out_d )
5019 implicit none
5020 class(elementoperationtensorprod3d_p14), intent(in) :: this
5021 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
5022 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
5023 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
5024
5025 integer :: iv
5026 !----------------------------------------------------------
5027
5028 do iv=1, 5
5029 call element_operation_kernel_matvec_lift_hexahedral_p14( this%Lift_mat, vec_in_lift(:,iv), &
5030 vec_out_d(:,4,iv) )
5031 end do
5032 do iv=1, 5
5033 call element_operation_kernel_matvec_divlike_dirxyz_p14( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
5034 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
5035 end do
5036 return
5037 end subroutine element_operation_tensorprod3d_div_var5_p14
5038
5039!> Calculate the 3D divergence applied for five variables
5040!!
5041!OCL SERIAL
5042 subroutine element_operation_tensorprod3d_div_var5_2_p14( this, vec_in, &
5043 vec_out_d )
5046 implicit none
5047 class(elementoperationtensorprod3d_p14), intent(in) :: this
5048 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
5049 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
5050
5051 integer :: iv
5052 !----------------------------------------------------------
5053
5054 do iv=1, 5
5055 call element_operation_kernel_matvec_divlike_dirxyz_p14( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
5056 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
5057 end do
5058 return
5059 end subroutine element_operation_tensorprod3d_div_var5_2_p14
5060
5061!> Calculate the lifting term applied for five variables
5062!!
5063!OCL SERIAL
5064 subroutine element_operation_tensorprod3d_lift_var5_p14( this, vec_in, vec_out )
5066 implicit none
5067 class(elementoperationtensorprod3d_p14), intent(in) :: this
5068 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
5069 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
5070
5071 integer :: iv
5072 !----------------------------------------------------------
5073 do iv=1, 5
5074 call element_operation_kernel_matvec_lift_hexahedral_p14( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
5075 end do
5076 return
5077 end subroutine element_operation_tensorprod3d_lift_var5_p14
5078
5079!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
5080!!
5081!OCL SERIAL
5082 subroutine element_operation_tensorprod3d_vfilterpm1_p14( this, vec_in, vec_out )
5084 implicit none
5085 class(elementoperationtensorprod3d_p14), intent(in) :: this
5086 real(rp), intent(in) :: vec_in(this%elem3d%np)
5087 real(rp), intent(out) :: vec_out(this%elem3d%np)
5088 !---------------------------------------------------------------
5089
5090 call element_operation_kernel_matvec_dirz_p14( this%IntrpMat_VPOrdM1_tr, vec_in, &
5091 vec_out )
5092 return
5093 end subroutine element_operation_tensorprod3d_vfilterpm1_p14
5094
5095!> Apply a modal filter for tracer variables
5096!!
5097!OCL SERIAL
5098 subroutine element_operation_tensorprod3d_modalfilter_tracer_p14( this, vec_in, vec_work, vec_out )
5101
5102 implicit none
5103 class(elementoperationtensorprod3d_p14), intent(in) :: this
5104 real(rp), intent(in) :: vec_in(this%elem3d%np)
5105 real(rp), intent(out) :: vec_work(this%elem3d%np)
5106 real(rp), intent(out) :: vec_out(this%elem3d%np)
5107 !---------------------------------------------
5108
5109 call element_operation_kernel_matvec_modalfilter_p14( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
5110 vec_out(:) )
5111
5112 return
5113 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p14
5114
5115!> Apply a modal filter for five variables
5116!!
5117!OCL SERIAL
5118 subroutine element_operation_tensorprod3d_modalfilter_var5_p14( this, vec_in, vec_work, vec_out )
5121
5122 implicit none
5123 class(elementoperationtensorprod3d_p14), intent(in) :: this
5124 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
5125 real(rp), intent(out) :: vec_work(this%elem3d%np)
5126 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
5127 integer :: iv
5128 !---------------------------------------------
5129
5130 do iv=1, 5
5131 call element_operation_kernel_matvec_modalfilter_p14( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
5132 vec_out(:,iv) )
5133 end do
5134
5135 return
5136 end subroutine element_operation_tensorprod3d_modalfilter_var5_p14
5137
5138
5139!--- For p=15 ------------------------------------
5140
5141!> Initialization
5142!!
5143!OCL SERIAL
5144 subroutine element_operation_tensorprod3d_init_p15( this, elem3D )
5146 implicit none
5147 class(elementoperationtensorprod3d_p15), intent(inout) :: this
5148 class(elementbase3d), intent(in), target :: elem3d
5149 !----------------------------------------------------------
5150
5151 this%elem3D => elem3d
5152 this%operator_type = element_operator_type_tensorprod3d
5153
5154 call setup_elem_operator( this%D1D, this%D1D_tr, this%Lift_mat, this%Lift_mat_tr, this%IntrpMat_VPOrdM1_tr, &
5155 16, elem3d )
5156 !$acc enter data copyin( this )
5157 !$acc enter data attach( this%elem3D )
5158
5159 return
5160 end subroutine element_operation_tensorprod3d_init_p15
5161
5162 !> Setup modal filter
5163 !!
5164!OCL SERIAL
5165 subroutine element_operation_tensorprod3d_setup_modalfilter_p15( this, &
5166 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
5167 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
5170 implicit none
5171 class(elementoperationtensorprod3d_p15), intent(inout) :: this
5172 real(rp), intent(in) :: mf_etac_h
5173 real(rp), intent(in) :: mf_alpha_h
5174 integer, intent(in) :: mf_order_h
5175 real(rp), intent(in) :: mf_etac_v
5176 real(rp), intent(in) :: mf_alpha_v
5177 integer, intent(in) :: mf_order_v
5178 !--------------------------------------------------------
5179
5180 call setup_modalfilter( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, &
5181 mf_etac_h, mf_alpha_h, mf_order_h, &
5182 mf_etac_v, mf_alpha_v, mf_order_v, &
5183 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
5184 !$acc update device( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr )
5185 return
5186 end subroutine element_operation_tensorprod3d_setup_modalfilter_p15
5187
5188!> Setup modal filter for tracer
5189!!
5190!OCL SERIAL
5191 subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p15( this, &
5192 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
5193 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
5196 implicit none
5197 class(elementoperationtensorprod3d_p15), intent(inout) :: this
5198 real(rp), intent(in) :: mf_etac_h
5199 real(rp), intent(in) :: mf_alpha_h
5200 integer, intent(in) :: mf_order_h
5201 real(rp), intent(in) :: mf_etac_v
5202 real(rp), intent(in) :: mf_alpha_v
5203 integer, intent(in) :: mf_order_v
5204 !--------------------------------------------------------
5205
5206 call setup_modalfilter( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, &
5207 mf_etac_h, mf_alpha_h, mf_order_h, &
5208 mf_etac_v, mf_alpha_v, mf_order_v, &
5209 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
5210 !$acc update device( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr )
5211 return
5212 end subroutine element_operation_tensorprod3d_setup_modalfilter_tracer_p15
5213
5214!> Finalization
5215!!
5216!OCL SERIAL
5217 subroutine element_operation_tensorprod3d_final_p15( this )
5218 implicit none
5219 class(elementoperationtensorprod3d_p15), intent(inout) :: this
5220 !----------------------------------------------------------
5221 nullify( this%elem3D )
5222 !$acc exit data delete( this )
5223 return
5224 end subroutine element_operation_tensorprod3d_final_p15
5225
5226!> Calculate the differential in x-direction
5227!!
5228!OCL SERIAL
5229 subroutine element_operation_tensorprod3d_dx_p15( this, vec_in, vec_out )
5231 implicit none
5232 class(elementoperationtensorprod3d_p15), intent(in) :: this
5233 real(rp), intent(in) :: vec_in(this%elem3d%np)
5234 real(rp), intent(out) :: vec_out(this%elem3d%np)
5235 !----------------------------------------------------------
5236 call element_operation_kernel_matvec_dirx_p15( this%D1D, vec_in, vec_out )
5237 return
5238 end subroutine element_operation_tensorprod3d_dx_p15
5239
5240!> Calculate the differential in y-direction
5241!!
5242!OCL SERIAL
5243 subroutine element_operation_tensorprod3d_dy_p15( this, vec_in, vec_out )
5245 implicit none
5246 class(elementoperationtensorprod3d_p15), intent(in) :: this
5247 real(rp), intent(in) :: vec_in(this%elem3d%np)
5248 real(rp), intent(out) :: vec_out(this%elem3d%np)
5249 !----------------------------------------------------------
5250 call element_operation_kernel_matvec_diry_p15( this%D1D_tr, vec_in, vec_out )
5251 return
5252 end subroutine element_operation_tensorprod3d_dy_p15
5253
5254!> Calculate the differential in z-direction
5255!!
5256!OCL SERIAL
5257 subroutine element_operation_tensorprod3d_dz_p15( this, vec_in, vec_out )
5259 implicit none
5260 class(elementoperationtensorprod3d_p15), intent(in) :: this
5261 real(rp), intent(in) :: vec_in(this%elem3d%np)
5262 real(rp), intent(out) :: vec_out(this%elem3d%np)
5263 !----------------------------------------------------------
5264 call element_operation_kernel_matvec_dirz_p15( this%D1D_tr, vec_in, vec_out )
5265 return
5266 end subroutine element_operation_tensorprod3d_dz_p15
5267
5268!> Calculate the lifting term
5269!!
5270!OCL SERIAL
5271 subroutine element_operation_tensorprod3d_lift_p15( this, vec_in, vec_out )
5273 implicit none
5274 class(elementoperationtensorprod3d_p15), intent(in) :: this
5275 real(rp), intent(in) :: vec_in(this%elem3d%nfptot)
5276 real(rp), intent(out) :: vec_out(this%elem3d%np)
5277 !----------------------------------------------------------
5278 call element_operation_kernel_matvec_lift_hexahedral_p15( this%Lift_mat, vec_in, vec_out )
5279 return
5280 end subroutine element_operation_tensorprod3d_lift_p15
5281
5282!> Calculate the 3D gradient
5283!!
5284!OCL SERIAL
5285 subroutine element_operation_tensorprod3d_dxdydzlift_p15( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
5289 implicit none
5290 class(elementoperationtensorprod3d_p15), intent(in) :: this
5291 real(rp), intent(in) :: vec_in(this%elem3d%np)
5292 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
5293 real(rp), intent(out) :: vec_out_dx(this%elem3d%np)
5294 real(rp), intent(out) :: vec_out_dy(this%elem3d%np)
5295 real(rp), intent(out) :: vec_out_dz(this%elem3d%np)
5296 real(rp), intent(out) :: vec_out_lift(this%elem3d%np)
5297 !----------------------------------------------------------
5298 call element_operation_kernel_matvec_gradlike_dirxyz_p15( this%D1D, this%D1D_tr, vec_in, vec_in, &
5299 vec_out_dx, vec_out_dy, vec_out_dz )
5300 call element_operation_kernel_matvec_lift_hexahedral_p15( this%Lift_mat, vec_in_lift, &
5301 vec_out_lift )
5302
5303 return
5304 end subroutine element_operation_tensorprod3d_dxdydzlift_p15
5305
5306!> Calculate the 3D divergence
5307!!
5308!! @param vec_in Array storing flux data (Fx,Fy,Fz) at nodes that we apply the differential matrices Dx, Dy, and Dz, respectively
5309!! @param vec_in_lift Array storing surface flux data (Fs) at nodes that we apply the lifting operator
5310!! @param vec_out Array storing the resulting data (Dx Fx, Dy Fy, Dz Fz, Lift Fs)
5311!!
5312!OCL SERIAL
5313 subroutine element_operation_tensorprod3d_div_p15( this, vec_in, vec_in_lift, &
5314 vec_out )
5318 implicit none
5319 class(elementoperationtensorprod3d_p15), intent(in) :: this
5320 real(rp), intent(in) :: vec_in(this%elem3d%np,3)
5321 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot)
5322 real(rp), intent(out) :: vec_out(this%elem3d%np,4)
5323 !----------------------------------------------------------
5324
5325 call element_operation_kernel_matvec_lift_hexahedral_p15( this%Lift_mat, vec_in_lift, &
5326 vec_out(:,4) )
5327
5328 call element_operation_kernel_matvec_divlike_dirxyz_p15( this%D1D, this%D1D_tr, vec_in(:,1), vec_in(:,2), vec_in(:,3), &
5329 vec_out(:,1), vec_out(:,2), vec_out(:,3) )
5330 return
5331 end subroutine element_operation_tensorprod3d_div_p15
5332
5333!> Calculate the 3D gradient applied for five variables
5334!!
5335!OCL SERIAL
5336 subroutine element_operation_tensorprod3d_div_var5_p15( this, vec_in, vec_in_lift, &
5337 vec_out_d )
5341 implicit none
5342 class(elementoperationtensorprod3d_p15), intent(in) :: this
5343 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
5344 real(rp), intent(in) :: vec_in_lift(this%elem3d%nfptot,5)
5345 real(rp), intent(out) :: vec_out_d(this%elem3d%np,4,5)
5346
5347 integer :: iv
5348 !----------------------------------------------------------
5349
5350 do iv=1, 5
5351 call element_operation_kernel_matvec_lift_hexahedral_p15( this%Lift_mat, vec_in_lift(:,iv), &
5352 vec_out_d(:,4,iv) )
5353 end do
5354 do iv=1, 5
5355 call element_operation_kernel_matvec_divlike_dirxyz_p15( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
5356 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
5357 end do
5358 return
5359 end subroutine element_operation_tensorprod3d_div_var5_p15
5360
5361!> Calculate the 3D divergence applied for five variables
5362!!
5363!OCL SERIAL
5364 subroutine element_operation_tensorprod3d_div_var5_2_p15( this, vec_in, &
5365 vec_out_d )
5368 implicit none
5369 class(elementoperationtensorprod3d_p15), intent(in) :: this
5370 real(rp), intent(in) :: vec_in(this%elem3d%np,3,5)
5371 real(rp), intent(out) :: vec_out_d(this%elem3d%np,3,5)
5372
5373 integer :: iv
5374 !----------------------------------------------------------
5375
5376 do iv=1, 5
5377 call element_operation_kernel_matvec_divlike_dirxyz_p15( this%D1D, this%D1D_tr, vec_in(:,1,iv), vec_in(:,2,iv), vec_in(:,3,iv), &
5378 vec_out_d(:,1,iv), vec_out_d(:,2,iv), vec_out_d(:,3,iv) )
5379 end do
5380 return
5381 end subroutine element_operation_tensorprod3d_div_var5_2_p15
5382
5383!> Calculate the lifting term applied for five variables
5384!!
5385!OCL SERIAL
5386 subroutine element_operation_tensorprod3d_lift_var5_p15( this, vec_in, vec_out )
5388 implicit none
5389 class(elementoperationtensorprod3d_p15), intent(in) :: this
5390 real(rp), intent(in) :: vec_in(this%elem3d%nfptot,5)
5391 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
5392
5393 integer :: iv
5394 !----------------------------------------------------------
5395 do iv=1, 5
5396 call element_operation_kernel_matvec_lift_hexahedral_p15( this%Lift_mat, vec_in(:,iv), vec_out(:,iv) )
5397 end do
5398 return
5399 end subroutine element_operation_tensorprod3d_lift_var5_p15
5400
5401!> Apply a vertical modal filter which a coefficient with the highest vertical mode is set to zero
5402!!
5403!OCL SERIAL
5404 subroutine element_operation_tensorprod3d_vfilterpm1_p15( this, vec_in, vec_out )
5406 implicit none
5407 class(elementoperationtensorprod3d_p15), intent(in) :: this
5408 real(rp), intent(in) :: vec_in(this%elem3d%np)
5409 real(rp), intent(out) :: vec_out(this%elem3d%np)
5410 !---------------------------------------------------------------
5411
5412 call element_operation_kernel_matvec_dirz_p15( this%IntrpMat_VPOrdM1_tr, vec_in, &
5413 vec_out )
5414 return
5415 end subroutine element_operation_tensorprod3d_vfilterpm1_p15
5416
5417!> Apply a modal filter for tracer variables
5418!!
5419!OCL SERIAL
5420 subroutine element_operation_tensorprod3d_modalfilter_tracer_p15( this, vec_in, vec_work, vec_out )
5423
5424 implicit none
5425 class(elementoperationtensorprod3d_p15), intent(in) :: this
5426 real(rp), intent(in) :: vec_in(this%elem3d%np)
5427 real(rp), intent(out) :: vec_work(this%elem3d%np)
5428 real(rp), intent(out) :: vec_out(this%elem3d%np)
5429 !---------------------------------------------
5430
5431 call element_operation_kernel_matvec_modalfilter_p15( this%MFilter_tracer_h1D, this%MFilter_tracer_h1D_tr, this%MFilter_tracer_v1D_tr, vec_in(:), vec_work, &
5432 vec_out(:) )
5433
5434 return
5435 end subroutine element_operation_tensorprod3d_modalfilter_tracer_p15
5436
5437!> Apply a modal filter for five variables
5438!!
5439!OCL SERIAL
5440 subroutine element_operation_tensorprod3d_modalfilter_var5_p15( this, vec_in, vec_work, vec_out )
5443
5444 implicit none
5445 class(elementoperationtensorprod3d_p15), intent(in) :: this
5446 real(rp), intent(in) :: vec_in(this%elem3d%np,5)
5447 real(rp), intent(out) :: vec_work(this%elem3d%np)
5448 real(rp), intent(out) :: vec_out(this%elem3d%np,5)
5449 integer :: iv
5450 !---------------------------------------------
5451
5452 do iv=1, 5
5453 call element_operation_kernel_matvec_modalfilter_p15( this%MFilter_h1D, this%MFilter_h1D_tr, this%MFilter_v1D_tr, vec_in(:,iv), vec_work, &
5454 vec_out(:,iv) )
5455 end do
5456
5457 return
5458 end subroutine element_operation_tensorprod3d_modalfilter_var5_p15
5459
5460
5461!- private -
5462
5463!OCL SERIAL
5464 subroutine setup_modalfilter( MFilter_h1D, MFilter_h1D_tr, MFilter_v1D_tr, &
5465 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
5466 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v, &
5467 PolyOrder_h, PolyOrder_v )
5468
5470 implicit none
5471
5472 real(rp), intent(inout) :: mfilter_h1d(:,:)
5473 real(rp), intent(inout) :: mfilter_h1d_tr(:,:)
5474 real(rp), intent(inout) :: mfilter_v1d_tr(:,:)
5475 real(rp), intent(in) :: mf_etac_h
5476 real(rp), intent(in) :: mf_alpha_h
5477 integer, intent(in) :: mf_order_h
5478 real(rp), intent(in) :: mf_etac_v
5479 real(rp), intent(in) :: mf_alpha_v
5480 integer, intent(in) :: mf_order_v
5481 integer, intent(in) :: polyorder_h
5482 integer, intent(in) :: polyorder_v
5483
5484 type(lineelement) :: elem1d
5485 type(modalfilter) :: mfilter1d
5486 !--------------------------------------------------------
5487
5488 call elem1d%Init( polyorder_h, .false. )
5489
5490 call mfilter1d%Init( elem1d, &
5491 mf_etac_h, mf_alpha_h, mf_order_h )
5492 mfilter_h1d(:,:) = mfilter1d%FilterMat(:,:)
5493 mfilter_h1d_tr(:,:) = transpose(mfilter_h1d(:,:))
5494
5495 call mfilter1d%Final()
5496 call elem1d%Final()
5497
5498 !-
5499 call elem1d%Init( polyorder_v, .false. )
5500
5501 call mfilter1d%Init( elem1d, &
5502 mf_etac_v, mf_alpha_v, mf_order_v )
5503 mfilter_v1d_tr(:,:) = transpose(mfilter1d%FilterMat(:,:))
5504
5505 call mfilter1d%Final()
5506 call elem1d%Final()
5507
5508 return
5509 end subroutine setup_modalfilter
5510
5511!OCL SERIAL
5512 subroutine setup_elem_operator( D1D, D1D_tr, Lift_mat, Lift_mat_tr, IntrpMat_VPOrdM1_tr, &
5513 np, elem3D )
5515 use scale_sparsemat, only: sparsemat
5516 implicit none
5517 integer, intent(in) :: np
5518 class(elementbase3d), intent(in) :: elem3d
5519 real(rp), intent(out) :: d1d(np,np)
5520 real(rp), intent(out) :: d1d_tr(np,np)
5521 real(rp), intent(out) :: lift_mat(np,np,np,6)
5522 real(rp), intent(out) :: lift_mat_tr(6,np,np,np)
5523 real(rp), intent(out) :: intrpmat_vpordm1_tr(np,np)
5524
5525 integer :: p
5526
5527 integer :: p1, p2, p_
5528 real(rp) :: invv_vpordm1(np,np)
5529 real(rp) :: intrpmat_vpordm1(np,np)
5530
5531 type(lineelement) :: elem1d
5532 type(sparsemat) :: lift_sm
5533 integer :: i, j, k
5534 !----------------------------------------------------------
5535
5536 call elem1d%Init( np-1, .false. )
5537 d1d(:,:) = elem1d%Dx1(:,:)
5538 d1d_tr(:,:) = transpose(d1d)
5539
5540 call lift_sm%Init( elem3d%Lift, storage_format='ELL' )
5541 do k=1, np
5542 do j=1, np
5543 do i=1, np
5544 p1 = i + (j-1)*np + (k-1)*np**2
5545 lift_mat_tr(1:6,i,j,k) = &
5546 (/ elem3d%Lift(p1,i+(k-1)*np), &
5547 elem3d%Lift(p1,j+(k-1)*np+(2-1)*np**2), &
5548 elem3d%Lift(p1,i+(k-1)*np+(3-1)*np**2), &
5549 elem3d%Lift(p1,j+(k-1)*np+(4-1)*np**2), &
5550 elem3d%Lift(p1,i+(j-1)*np+(5-1)*np**2), &
5551 elem3d%Lift(p1,i+(j-1)*np+(6-1)*np**2) /)
5552 lift_mat(i,j,k,1:6) = lift_mat_tr(1:6,i,j,k)
5553 end do
5554 end do
5555 end do
5556 call lift_sm%Final()
5557
5558 !--
5559
5560 invv_vpordm1(:,:) = elem1d%invV(:,:)
5561 invv_vpordm1(np,:) = 0.0_rp
5562 intrpmat_vpordm1(:,:) = matmul(elem1d%V, invv_vpordm1)
5563 intrpmat_vpordm1_tr(:,:) = transpose(intrpmat_vpordm1)
5564
5565 !-
5566 call elem1d%Final()
5567
5568 return
5569 end subroutine setup_elem_operator
5570
module FElib / Element / Base
subroutine, public elementbase3d_init(elem, lumpedmat_flag)
Initialize an object to manage a 3D reference element.
subroutine, public elementbase3d_final(elem)
Finalize an object to manage a 3D reference element.
module FElib / Element / hexahedron
module FElib / Element / line
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
integer, public element_operator_type_tensorprod3d
Type ID of tensor-product operator for 3D elements.
module FElib / Element / Operation with 3D tensor product elements
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p14(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p15(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=15.
subroutine, public element_operation_kernel_matvec_dirz_p15(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_dirz_p3(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p1(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p13(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=13.
subroutine, public element_operation_kernel_matvec_modalfilter_p8(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=8.
subroutine, public element_operation_kernel_matvec_dirx_p4(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p3(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirx_p3(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p5(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p6(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p6(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_diry_p12(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_dirx_p12(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_modalfilter_p14(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=14.
subroutine, public element_operation_kernel_matvec_dirz_p6(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_modalfilter_p4(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=4.
subroutine, public element_operation_kernel_matvec_dirz_p8(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_diry_p5(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p13(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p14(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p6(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=6.
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p12(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p10(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=10.
subroutine, public element_operation_kernel_matvec_dirz_p12(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_diry_p15(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_dirz_p4(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_diry_p3(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_diry_p14(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_modalfilter_p2(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=2.
subroutine, public element_operation_kernel_matvec_diry_p10(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p2(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_diry_p9(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p4(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p7(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=7.
subroutine, public element_operation_kernel_matvec_modalfilter_p9(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=9.
subroutine, public element_operation_kernel_matvec_diry_p6(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p5(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p12(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_diry_p1(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_modalfilter_p11(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=11.
subroutine, public element_operation_kernel_matvec_dirx_p9(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p14(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirx_p10(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p15(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p10(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_modalfilter_p12(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=12.
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p2(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirx_p14(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p2(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_diry_p7(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_dirx_p1(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p7(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_diry_p2(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p8(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p3(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirx_p7(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p15(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p10(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_modalfilter_p1(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=1.
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p13(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirx_p15(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_dirz_p1(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p7(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p1(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirx_p5(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_dirx_p8(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_diry_p11(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p9(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_diry_p4(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_modalfilter_p3(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=3.
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p11(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirz_p7(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p3(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirx_p13(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p8(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p1(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p10(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p13(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_diry_p8(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p9(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_modalfilter_p5(mat_h1d, mat_h1d_tr, mat_v1d_tr, vec_in, vec_work, vec_out)
Calculate a matrix-vector multiplication associated with 3D modal filtering with p=5.
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p8(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p7(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p4(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirz_p10(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_dirz_p5(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p4(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirx_p11(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_dirz_p9(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_dirx_p2(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_dirx_p6(mat_x, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (...
subroutine, public element_operation_kernel_matvec_dirz_p11(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p15(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p5(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_diry_p13(mat_y_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p11(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_divlike_dirxyz_p12(mat, mat_tr, vec_in_x, vec_in_y, vec_in_z, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirz_p14(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p9(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
subroutine, public element_operation_kernel_matvec_dirz_p13(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_lift_hexahedral_p6(lift, vec_in, vec_out)
Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=...
subroutine, public element_operation_kernel_matvec_dirz_p2(mat_z_tr, vec_in, vec_out)
Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (...
subroutine, public element_operation_kernel_matvec_gradlike_dirxyz_p11(mat, mat_tr, vec_in, vec_in_, vec_out_x, vec_out_y, vec_out_z)
Calculate a matrix-vector multiplication associated with mathematical operations in the x,...
module FElib / Element / Operation with 3D tensor product elements for GPU
subroutine, public elementoperationtensorprod3d_create(elem3d, obj)
Factory subroutine to create an object of ElementOperationTensorProd3D.
Module common / sparsemat.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a line element.
Derived type representing a modal filter.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=10.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=11.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=12.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=13.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=14.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=15.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=1.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=2.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=3.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=4.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=5.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=6.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=7.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=8.
Derived type for elementwise operations with 3D tensor product elements with polynomial order p=9.
Derived type for elementwise operations with 3D tensor product elements.
Derived type to manage a sparse matrix.