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