FE-Project
Loading...
Searching...
No Matches
scale_element_operation_tensorprod3D_kernel.F90
Go to the documentation of this file.
1
2!-------------------------------------------------------------------------------
3! Warning: This file was generated from element/scale_element_operation_tensorprod3D_kernel.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 kernels of matrix and vector 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
24 use scale_element_base, only: &
27 !-----------------------------------------------------------------------------
28 implicit none
29 private
30
31 !-----------------------------------------------------------------------------
32 !
33 !++ Public type & procedure
34 !
140
141contains
142!--- For p=1 ------------------------------------
143
144!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=1
145!!
146!OCL SERIAL
147 subroutine element_operation_kernel_matvec_dirx_p1( Mat_x, vec_in, vec_out )
148 implicit none
149 real(rp), intent(in) :: mat_x(2,2)
150 real(rp), intent(in) :: vec_in(2,2**2)
151 real(rp), intent(out) :: vec_out(2,2**2)
152
153 integer :: i, jk
154 !----------------------------------------------------------
155
156 do jk=1, 2**2
157 do i=1, 2
158 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
159 + mat_x(i,2) * vec_in(2,jk)
160 end do
161 end do
162
163 return
165
166!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=1
167!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
168!!
169!OCL SERIAL
170 subroutine element_operation_kernel_matvec_diry_p1( Mat_y_tr, vec_in, vec_out )
171 implicit none
172 real(rp), intent(in) :: mat_y_tr(2,2)
173 real(rp), intent(in) :: vec_in(2,2,2)
174 real(rp), intent(out) :: vec_out(2,2,2)
175
176 integer :: i, j, k
177 !----------------------------------------------------------
178
179 do k=1, 2
180 do j=1, 2
181 do i=1, 2
182 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
183 + vec_in(i,2,k) * mat_y_tr(2,j)
184 end do
185 end do
186 end do
187
188 return
190
191!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=1
192!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
193!!
194!OCL SERIAL
195 subroutine element_operation_kernel_matvec_dirz_p1( Mat_z_tr, vec_in, vec_out )
196 implicit none
197 real(rp), intent(in) :: mat_z_tr(2,2)
198 real(rp), intent(in) :: vec_in(2,2,2)
199 real(rp), intent(out) :: vec_out(2,2,2)
200
201 integer :: i, j, k
202 !----------------------------------------------------------
203
204 do k=1, 2
205 do j=1, 2
206 do i=1, 2
207 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
208 + vec_in(i,j,2) * mat_z_tr(2,k)
209 end do
210 end do
211 end do
212
213 return
215
216!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=1
217!!
218!OCL SERIAL
219 subroutine element_operation_kernel_matvec_lift_hexahedral_p1( Lift, vec_in, vec_out )
220 implicit none
221 real(rp), intent(in) :: lift(2,2,2,6)
222 real(rp), intent(in) :: vec_in(2,2,6)
223 real(rp), intent(out) :: vec_out(2,2,2)
224
225 integer :: i, j, k
226 !----------------------------------------------------------
227
228 do k=1, 2
229 do j=1, 2
230 do i=1, 2
231 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
232 + lift(i,j,k,2) * vec_in(j,k,2) &
233 + lift(i,j,k,3) * vec_in(i,k,3) &
234 + lift(i,j,k,4) * vec_in(j,k,4) &
235 + lift(i,j,k,5) * vec_in(i,j,5) &
236 + lift(i,j,k,6) * vec_in(i,j,6)
237 end do
238 end do
239 end do
240
241 return
243
244!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=1
245!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
246!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
247!!
248!OCL SERIAL
249 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p1( Mat, Mat_tr, vec_in, vec_in_, &
250 vec_out_x, vec_out_y, vec_out_z )
251 implicit none
252 real(rp), intent(in) :: mat(2,2)
253 real(rp), intent(in) :: mat_tr(2,2)
254 real(rp), intent(in) :: vec_in_(2,2**2)
255 real(rp), intent(in) :: vec_in(2,2,2)
256 real(rp), intent(out) :: vec_out_x(2,2**2)
257 real(rp), intent(out) :: vec_out_y(2,2,2)
258 real(rp), intent(out) :: vec_out_z(2,2,2)
259
260 integer :: i, j, k, jk
261 !----------------------------------------------------------
262
263 ! X-dir
264
265 do jk=1, 2**2
266 do i=1, 2
267 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
268 + mat(i,2) * vec_in_(2,jk)
269 end do
270 end do
271
272 ! Y-dir
273 do k=1, 2
274 do j=1, 2
275 do i=1, 2
276 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
277 + vec_in(i,2,k) * mat_tr(2,j)
278 end do
279 end do
280 end do
281
282 ! Z-dir
283 do k=1, 2
284 do j=1, 2
285 do i=1, 2
286 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
287 + vec_in(i,j,2) * mat_tr(2,k)
288 end do
289 end do
290 end do
291
292 return
294
295!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=1
296!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
297!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
298!!
299!OCL SERIAL
301 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
302 vec_out_x, vec_out_y, vec_out_z )
303 implicit none
304 real(rp), intent(in) :: mat(2,2)
305 real(rp), intent(in) :: mat_tr(2,2)
306 real(rp), intent(in) :: vec_in_x(2,2**2)
307 real(rp), intent(in) :: vec_in_y(2,2,2)
308 real(rp), intent(in) :: vec_in_z(2,2,2)
309 real(rp), intent(out) :: vec_out_x(2,2**2)
310 real(rp), intent(out) :: vec_out_y(2,2**2)
311 real(rp), intent(out) :: vec_out_z(2,2**2)
312
313 integer :: i, j, k, jk
314 !----------------------------------------------------------
315
316 ! X-dir
317
318 do jk=1, 2**2
319 do i=1, 2
320 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
321 + mat(i,2) * vec_in_x(2,jk)
322 end do
323 end do
324
325 ! Y-dir
326 do k=1, 2
327 do j=1, 2
328 jk = j + (k-1)*2
329 do i=1, 2
330 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
331 + vec_in_y(i,2,k) * mat_tr(2,j)
332 end do
333 end do
334 end do
335
336 ! Z-dir
337 do k=1, 2
338 do j=1, 2
339 jk = j + (k-1)*2
340 do i=1, 2
341 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
342 + vec_in_z(i,j,2) * mat_tr(2,k)
343 end do
344 end do
345 end do
346 return
348
349!OCL SERIAL
350 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p1( &
351 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
352 vec_out_x, vec_out_y, vec_out_z )
353 implicit none
354 real(rp), intent(in) :: mat(2,2)
355 real(rp), intent(in) :: mat_tr(2,2)
356 real(rp), intent(in) :: vec_in_x(2,2**2*5)
357 real(rp), intent(in) :: vec_in_y(2,2,2*5)
358 real(rp), intent(in) :: vec_in_z(2,2,2,5)
359 real(rp), intent(out) :: vec_out_x(2,2**2*5)
360 real(rp), intent(out) :: vec_out_y(2,2**2*5)
361 real(rp), intent(out) :: vec_out_z(2,2**2,5)
362
363 integer :: i, j, k, jkv, jk, v, kv
364 !----------------------------------------------------------
365
366 ! X-dir
367
368 do jkv=1, 2**2*5
369 do i=1, 2
370 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
371 + mat(i,2) * vec_in_x(2,jkv)
372 end do
373 end do
374
375 ! Y-dir
376 do kv=1, 2*5
377 do j=1, 2
378 jkv = j + (kv-1)*10
379 do i=1, 2
380 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
381 + vec_in_y(i,2,kv) * mat_tr(2,j)
382 end do
383 end do
384 end do
385
386 ! Z-dir
387 do v=1, 5
388 do k=1, 2
389 do j=1, 2
390 jk = j + (k-1)*2
391 do i=1, 2
392 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
393 + vec_in_z(i,j,2,v) * mat_tr(2,k)
394 end do
395 end do
396 end do
397 end do
398 return
399 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p1
400
401!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=1
402!!
403!OCL SERIAL
404 subroutine element_operation_kernel_matvec_modalfilter_p1( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
405 vec_out )
406 implicit none
407 real(rp), intent(in) :: mat_h1d(2,2)
408 real(rp), intent(in) :: mat_h1d_tr(2,2)
409 real(rp), intent(in) :: mat_v1d_tr(2,2)
410 real(rp), intent(in) :: vec_in(2,2,2)
411 real(rp), intent(out) :: vec_work(2,2,2)
412 real(rp), intent(out) :: vec_out(2,2,2)
413
414 integer :: i, j, k
415 !----------------------------------------------------------
416
417 ! X-dir
418
419 do k=1, 2
420 do j=1, 2
421 do i=1, 2
422 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
423 + mat_h1d(i,2) * vec_in(2,j,k)
424 end do
425 end do
426 end do
427
428 ! Y-dir
429 do k=1, 2
430 do j=1, 2
431 do i=1, 2
432 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
433 + vec_out(i,2,k) * mat_h1d_tr(2,j)
434 end do
435 end do
436 end do
437
438 ! Z-dir
439 do k=1, 2
440 do j=1, 2
441 do i=1, 2
442 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
443 + vec_work(i,j,2) * mat_v1d_tr(2,k)
444 end do
445 end do
446 end do
447
448 return
450
451!--- For p=2 ------------------------------------
452
453!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=2
454!!
455!OCL SERIAL
456 subroutine element_operation_kernel_matvec_dirx_p2( Mat_x, vec_in, vec_out )
457 implicit none
458 real(rp), intent(in) :: mat_x(3,3)
459 real(rp), intent(in) :: vec_in(3,3**2)
460 real(rp), intent(out) :: vec_out(3,3**2)
461
462 integer :: i, jk
463 !----------------------------------------------------------
464
465 do jk=1, 3**2
466 do i=1, 3
467 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
468 + mat_x(i,2) * vec_in(2,jk) &
469 + mat_x(i,3) * vec_in(3,jk)
470 end do
471 end do
472
473 return
475
476!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=2
477!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
478!!
479!OCL SERIAL
480 subroutine element_operation_kernel_matvec_diry_p2( Mat_y_tr, vec_in, vec_out )
481 implicit none
482 real(rp), intent(in) :: mat_y_tr(3,3)
483 real(rp), intent(in) :: vec_in(3,3,3)
484 real(rp), intent(out) :: vec_out(3,3,3)
485
486 integer :: i, j, k
487 !----------------------------------------------------------
488
489 do k=1, 3
490 do j=1, 3
491 do i=1, 3
492 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
493 + vec_in(i,2,k) * mat_y_tr(2,j) &
494 + vec_in(i,3,k) * mat_y_tr(3,j)
495 end do
496 end do
497 end do
498
499 return
501
502!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=2
503!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
504!!
505!OCL SERIAL
506 subroutine element_operation_kernel_matvec_dirz_p2( Mat_z_tr, vec_in, vec_out )
507 implicit none
508 real(rp), intent(in) :: mat_z_tr(3,3)
509 real(rp), intent(in) :: vec_in(3,3,3)
510 real(rp), intent(out) :: vec_out(3,3,3)
511
512 integer :: i, j, k
513 !----------------------------------------------------------
514
515 do k=1, 3
516 do j=1, 3
517 do i=1, 3
518 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
519 + vec_in(i,j,2) * mat_z_tr(2,k) &
520 + vec_in(i,j,3) * mat_z_tr(3,k)
521 end do
522 end do
523 end do
524
525 return
527
528!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=2
529!!
530!OCL SERIAL
531 subroutine element_operation_kernel_matvec_lift_hexahedral_p2( Lift, vec_in, vec_out )
532 implicit none
533 real(rp), intent(in) :: lift(3,3,3,6)
534 real(rp), intent(in) :: vec_in(3,3,6)
535 real(rp), intent(out) :: vec_out(3,3,3)
536
537 integer :: i, j, k
538 !----------------------------------------------------------
539
540 do k=1, 3
541 do j=1, 3
542 do i=1, 3
543 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
544 + lift(i,j,k,2) * vec_in(j,k,2) &
545 + lift(i,j,k,3) * vec_in(i,k,3) &
546 + lift(i,j,k,4) * vec_in(j,k,4) &
547 + lift(i,j,k,5) * vec_in(i,j,5) &
548 + lift(i,j,k,6) * vec_in(i,j,6)
549 end do
550 end do
551 end do
552
553 return
555
556!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=2
557!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
558!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
559!!
560!OCL SERIAL
561 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p2( Mat, Mat_tr, vec_in, vec_in_, &
562 vec_out_x, vec_out_y, vec_out_z )
563 implicit none
564 real(rp), intent(in) :: mat(3,3)
565 real(rp), intent(in) :: mat_tr(3,3)
566 real(rp), intent(in) :: vec_in_(3,3**2)
567 real(rp), intent(in) :: vec_in(3,3,3)
568 real(rp), intent(out) :: vec_out_x(3,3**2)
569 real(rp), intent(out) :: vec_out_y(3,3,3)
570 real(rp), intent(out) :: vec_out_z(3,3,3)
571
572 integer :: i, j, k, jk
573 !----------------------------------------------------------
574
575 ! X-dir
576
577 do jk=1, 3**2
578 do i=1, 3
579 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
580 + mat(i,2) * vec_in_(2,jk) &
581 + mat(i,3) * vec_in_(3,jk)
582 end do
583 end do
584
585 ! Y-dir
586 do k=1, 3
587 do j=1, 3
588 do i=1, 3
589 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
590 + vec_in(i,2,k) * mat_tr(2,j) &
591 + vec_in(i,3,k) * mat_tr(3,j)
592 end do
593 end do
594 end do
595
596 ! Z-dir
597 do k=1, 3
598 do j=1, 3
599 do i=1, 3
600 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
601 + vec_in(i,j,2) * mat_tr(2,k) &
602 + vec_in(i,j,3) * mat_tr(3,k)
603 end do
604 end do
605 end do
606
607 return
609
610!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=2
611!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
612!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
613!!
614!OCL SERIAL
616 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
617 vec_out_x, vec_out_y, vec_out_z )
618 implicit none
619 real(rp), intent(in) :: mat(3,3)
620 real(rp), intent(in) :: mat_tr(3,3)
621 real(rp), intent(in) :: vec_in_x(3,3**2)
622 real(rp), intent(in) :: vec_in_y(3,3,3)
623 real(rp), intent(in) :: vec_in_z(3,3,3)
624 real(rp), intent(out) :: vec_out_x(3,3**2)
625 real(rp), intent(out) :: vec_out_y(3,3**2)
626 real(rp), intent(out) :: vec_out_z(3,3**2)
627
628 integer :: i, j, k, jk
629 !----------------------------------------------------------
630
631 ! X-dir
632
633 do jk=1, 3**2
634 do i=1, 3
635 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
636 + mat(i,2) * vec_in_x(2,jk) &
637 + mat(i,3) * vec_in_x(3,jk)
638 end do
639 end do
640
641 ! Y-dir
642 do k=1, 3
643 do j=1, 3
644 jk = j + (k-1)*3
645 do i=1, 3
646 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
647 + vec_in_y(i,2,k) * mat_tr(2,j) &
648 + vec_in_y(i,3,k) * mat_tr(3,j)
649 end do
650 end do
651 end do
652
653 ! Z-dir
654 do k=1, 3
655 do j=1, 3
656 jk = j + (k-1)*3
657 do i=1, 3
658 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
659 + vec_in_z(i,j,2) * mat_tr(2,k) &
660 + vec_in_z(i,j,3) * mat_tr(3,k)
661 end do
662 end do
663 end do
664 return
666
667!OCL SERIAL
668 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p2( &
669 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
670 vec_out_x, vec_out_y, vec_out_z )
671 implicit none
672 real(rp), intent(in) :: mat(3,3)
673 real(rp), intent(in) :: mat_tr(3,3)
674 real(rp), intent(in) :: vec_in_x(3,3**2*5)
675 real(rp), intent(in) :: vec_in_y(3,3,3*5)
676 real(rp), intent(in) :: vec_in_z(3,3,3,5)
677 real(rp), intent(out) :: vec_out_x(3,3**2*5)
678 real(rp), intent(out) :: vec_out_y(3,3**2*5)
679 real(rp), intent(out) :: vec_out_z(3,3**2,5)
680
681 integer :: i, j, k, jkv, jk, v, kv
682 !----------------------------------------------------------
683
684 ! X-dir
685
686 do jkv=1, 3**2*5
687 do i=1, 3
688 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
689 + mat(i,2) * vec_in_x(2,jkv) &
690 + mat(i,3) * vec_in_x(3,jkv)
691 end do
692 end do
693
694 ! Y-dir
695 do kv=1, 3*5
696 do j=1, 3
697 jkv = j + (kv-1)*15
698 do i=1, 3
699 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
700 + vec_in_y(i,2,kv) * mat_tr(2,j) &
701 + vec_in_y(i,3,kv) * mat_tr(3,j)
702 end do
703 end do
704 end do
705
706 ! Z-dir
707 do v=1, 5
708 do k=1, 3
709 do j=1, 3
710 jk = j + (k-1)*3
711 do i=1, 3
712 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
713 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
714 + vec_in_z(i,j,3,v) * mat_tr(3,k)
715 end do
716 end do
717 end do
718 end do
719 return
720 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p2
721
722!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=2
723!!
724!OCL SERIAL
725 subroutine element_operation_kernel_matvec_modalfilter_p2( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
726 vec_out )
727 implicit none
728 real(rp), intent(in) :: mat_h1d(3,3)
729 real(rp), intent(in) :: mat_h1d_tr(3,3)
730 real(rp), intent(in) :: mat_v1d_tr(3,3)
731 real(rp), intent(in) :: vec_in(3,3,3)
732 real(rp), intent(out) :: vec_work(3,3,3)
733 real(rp), intent(out) :: vec_out(3,3,3)
734
735 integer :: i, j, k
736 !----------------------------------------------------------
737
738 ! X-dir
739
740 do k=1, 3
741 do j=1, 3
742 do i=1, 3
743 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
744 + mat_h1d(i,2) * vec_in(2,j,k) &
745 + mat_h1d(i,3) * vec_in(3,j,k)
746 end do
747 end do
748 end do
749
750 ! Y-dir
751 do k=1, 3
752 do j=1, 3
753 do i=1, 3
754 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
755 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
756 + vec_out(i,3,k) * mat_h1d_tr(3,j)
757 end do
758 end do
759 end do
760
761 ! Z-dir
762 do k=1, 3
763 do j=1, 3
764 do i=1, 3
765 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
766 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
767 + vec_work(i,j,3) * mat_v1d_tr(3,k)
768 end do
769 end do
770 end do
771
772 return
774
775!--- For p=3 ------------------------------------
776
777!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=3
778!!
779!OCL SERIAL
780 subroutine element_operation_kernel_matvec_dirx_p3( Mat_x, vec_in, vec_out )
781 implicit none
782 real(rp), intent(in) :: mat_x(4,4)
783 real(rp), intent(in) :: vec_in(4,4**2)
784 real(rp), intent(out) :: vec_out(4,4**2)
785
786 integer :: i, jk
787 !----------------------------------------------------------
788
789 do jk=1, 4**2
790 do i=1, 4
791 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
792 + mat_x(i,2) * vec_in(2,jk) &
793 + mat_x(i,3) * vec_in(3,jk) &
794 + mat_x(i,4) * vec_in(4,jk)
795 end do
796 end do
797
798 return
800
801!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=3
802!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
803!!
804!OCL SERIAL
805 subroutine element_operation_kernel_matvec_diry_p3( Mat_y_tr, vec_in, vec_out )
806 implicit none
807 real(rp), intent(in) :: mat_y_tr(4,4)
808 real(rp), intent(in) :: vec_in(4,4,4)
809 real(rp), intent(out) :: vec_out(4,4,4)
810
811 integer :: i, j, k
812 !----------------------------------------------------------
813
814 do k=1, 4
815 do j=1, 4
816 do i=1, 4
817 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
818 + vec_in(i,2,k) * mat_y_tr(2,j) &
819 + vec_in(i,3,k) * mat_y_tr(3,j) &
820 + vec_in(i,4,k) * mat_y_tr(4,j)
821 end do
822 end do
823 end do
824
825 return
827
828!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=3
829!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
830!!
831!OCL SERIAL
832 subroutine element_operation_kernel_matvec_dirz_p3( Mat_z_tr, vec_in, vec_out )
833 implicit none
834 real(rp), intent(in) :: mat_z_tr(4,4)
835 real(rp), intent(in) :: vec_in(4,4,4)
836 real(rp), intent(out) :: vec_out(4,4,4)
837
838 integer :: i, j, k
839 !----------------------------------------------------------
840
841 do k=1, 4
842 do j=1, 4
843 do i=1, 4
844 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
845 + vec_in(i,j,2) * mat_z_tr(2,k) &
846 + vec_in(i,j,3) * mat_z_tr(3,k) &
847 + vec_in(i,j,4) * mat_z_tr(4,k)
848 end do
849 end do
850 end do
851
852 return
854
855!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=3
856!!
857!OCL SERIAL
858 subroutine element_operation_kernel_matvec_lift_hexahedral_p3( Lift, vec_in, vec_out )
859 implicit none
860 real(rp), intent(in) :: lift(4,4,4,6)
861 real(rp), intent(in) :: vec_in(4,4,6)
862 real(rp), intent(out) :: vec_out(4,4,4)
863
864 integer :: i, j, k
865 !----------------------------------------------------------
866
867 do k=1, 4
868 do j=1, 4
869 do i=1, 4
870 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
871 + lift(i,j,k,2) * vec_in(j,k,2) &
872 + lift(i,j,k,3) * vec_in(i,k,3) &
873 + lift(i,j,k,4) * vec_in(j,k,4) &
874 + lift(i,j,k,5) * vec_in(i,j,5) &
875 + lift(i,j,k,6) * vec_in(i,j,6)
876 end do
877 end do
878 end do
879
880 return
882
883!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=3
884!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
885!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
886!!
887!OCL SERIAL
888 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p3( Mat, Mat_tr, vec_in, vec_in_, &
889 vec_out_x, vec_out_y, vec_out_z )
890 implicit none
891 real(rp), intent(in) :: mat(4,4)
892 real(rp), intent(in) :: mat_tr(4,4)
893 real(rp), intent(in) :: vec_in_(4,4**2)
894 real(rp), intent(in) :: vec_in(4,4,4)
895 real(rp), intent(out) :: vec_out_x(4,4**2)
896 real(rp), intent(out) :: vec_out_y(4,4,4)
897 real(rp), intent(out) :: vec_out_z(4,4,4)
898
899 integer :: i, j, k, jk
900 !----------------------------------------------------------
901
902 ! X-dir
903
904 do jk=1, 4**2
905 do i=1, 4
906 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
907 + mat(i,2) * vec_in_(2,jk) &
908 + mat(i,3) * vec_in_(3,jk) &
909 + mat(i,4) * vec_in_(4,jk)
910 end do
911 end do
912
913 ! Y-dir
914 do k=1, 4
915 do j=1, 4
916 do i=1, 4
917 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
918 + vec_in(i,2,k) * mat_tr(2,j) &
919 + vec_in(i,3,k) * mat_tr(3,j) &
920 + vec_in(i,4,k) * mat_tr(4,j)
921 end do
922 end do
923 end do
924
925 ! Z-dir
926 do k=1, 4
927 do j=1, 4
928 do i=1, 4
929 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
930 + vec_in(i,j,2) * mat_tr(2,k) &
931 + vec_in(i,j,3) * mat_tr(3,k) &
932 + vec_in(i,j,4) * mat_tr(4,k)
933 end do
934 end do
935 end do
936
937 return
939
940!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=3
941!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
942!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
943!!
944!OCL SERIAL
946 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
947 vec_out_x, vec_out_y, vec_out_z )
948 implicit none
949 real(rp), intent(in) :: mat(4,4)
950 real(rp), intent(in) :: mat_tr(4,4)
951 real(rp), intent(in) :: vec_in_x(4,4**2)
952 real(rp), intent(in) :: vec_in_y(4,4,4)
953 real(rp), intent(in) :: vec_in_z(4,4,4)
954 real(rp), intent(out) :: vec_out_x(4,4**2)
955 real(rp), intent(out) :: vec_out_y(4,4**2)
956 real(rp), intent(out) :: vec_out_z(4,4**2)
957
958 integer :: i, j, k, jk
959 !----------------------------------------------------------
960
961 ! X-dir
962
963 do jk=1, 4**2
964 do i=1, 4
965 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
966 + mat(i,2) * vec_in_x(2,jk) &
967 + mat(i,3) * vec_in_x(3,jk) &
968 + mat(i,4) * vec_in_x(4,jk)
969 end do
970 end do
971
972 ! Y-dir
973 do k=1, 4
974 do j=1, 4
975 jk = j + (k-1)*4
976 do i=1, 4
977 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
978 + vec_in_y(i,2,k) * mat_tr(2,j) &
979 + vec_in_y(i,3,k) * mat_tr(3,j) &
980 + vec_in_y(i,4,k) * mat_tr(4,j)
981 end do
982 end do
983 end do
984
985 ! Z-dir
986 do k=1, 4
987 do j=1, 4
988 jk = j + (k-1)*4
989 do i=1, 4
990 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
991 + vec_in_z(i,j,2) * mat_tr(2,k) &
992 + vec_in_z(i,j,3) * mat_tr(3,k) &
993 + vec_in_z(i,j,4) * mat_tr(4,k)
994 end do
995 end do
996 end do
997 return
999
1000!OCL SERIAL
1001 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p3( &
1002 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
1003 vec_out_x, vec_out_y, vec_out_z )
1004 implicit none
1005 real(rp), intent(in) :: mat(4,4)
1006 real(rp), intent(in) :: mat_tr(4,4)
1007 real(rp), intent(in) :: vec_in_x(4,4**2*5)
1008 real(rp), intent(in) :: vec_in_y(4,4,4*5)
1009 real(rp), intent(in) :: vec_in_z(4,4,4,5)
1010 real(rp), intent(out) :: vec_out_x(4,4**2*5)
1011 real(rp), intent(out) :: vec_out_y(4,4**2*5)
1012 real(rp), intent(out) :: vec_out_z(4,4**2,5)
1013
1014 integer :: i, j, k, jkv, jk, v, kv
1015 !----------------------------------------------------------
1016
1017 ! X-dir
1018
1019 do jkv=1, 4**2*5
1020 do i=1, 4
1021 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
1022 + mat(i,2) * vec_in_x(2,jkv) &
1023 + mat(i,3) * vec_in_x(3,jkv) &
1024 + mat(i,4) * vec_in_x(4,jkv)
1025 end do
1026 end do
1027
1028 ! Y-dir
1029 do kv=1, 4*5
1030 do j=1, 4
1031 jkv = j + (kv-1)*20
1032 do i=1, 4
1033 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
1034 + vec_in_y(i,2,kv) * mat_tr(2,j) &
1035 + vec_in_y(i,3,kv) * mat_tr(3,j) &
1036 + vec_in_y(i,4,kv) * mat_tr(4,j)
1037 end do
1038 end do
1039 end do
1040
1041 ! Z-dir
1042 do v=1, 5
1043 do k=1, 4
1044 do j=1, 4
1045 jk = j + (k-1)*4
1046 do i=1, 4
1047 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
1048 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
1049 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
1050 + vec_in_z(i,j,4,v) * mat_tr(4,k)
1051 end do
1052 end do
1053 end do
1054 end do
1055 return
1056 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p3
1057
1058!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=3
1059!!
1060!OCL SERIAL
1061 subroutine element_operation_kernel_matvec_modalfilter_p3( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
1062 vec_out )
1063 implicit none
1064 real(rp), intent(in) :: mat_h1d(4,4)
1065 real(rp), intent(in) :: mat_h1d_tr(4,4)
1066 real(rp), intent(in) :: mat_v1d_tr(4,4)
1067 real(rp), intent(in) :: vec_in(4,4,4)
1068 real(rp), intent(out) :: vec_work(4,4,4)
1069 real(rp), intent(out) :: vec_out(4,4,4)
1070
1071 integer :: i, j, k
1072 !----------------------------------------------------------
1073
1074 ! X-dir
1075
1076 do k=1, 4
1077 do j=1, 4
1078 do i=1, 4
1079 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
1080 + mat_h1d(i,2) * vec_in(2,j,k) &
1081 + mat_h1d(i,3) * vec_in(3,j,k) &
1082 + mat_h1d(i,4) * vec_in(4,j,k)
1083 end do
1084 end do
1085 end do
1086
1087 ! Y-dir
1088 do k=1, 4
1089 do j=1, 4
1090 do i=1, 4
1091 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
1092 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
1093 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
1094 + vec_out(i,4,k) * mat_h1d_tr(4,j)
1095 end do
1096 end do
1097 end do
1098
1099 ! Z-dir
1100 do k=1, 4
1101 do j=1, 4
1102 do i=1, 4
1103 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
1104 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
1105 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
1106 + vec_work(i,j,4) * mat_v1d_tr(4,k)
1107 end do
1108 end do
1109 end do
1110
1111 return
1113
1114!--- For p=4 ------------------------------------
1115
1116!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=4
1117!!
1118!OCL SERIAL
1119 subroutine element_operation_kernel_matvec_dirx_p4( Mat_x, vec_in, vec_out )
1120 implicit none
1121 real(rp), intent(in) :: mat_x(5,5)
1122 real(rp), intent(in) :: vec_in(5,5**2)
1123 real(rp), intent(out) :: vec_out(5,5**2)
1124
1125 integer :: i, jk
1126 !----------------------------------------------------------
1127
1128 do jk=1, 5**2
1129 do i=1, 5
1130 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
1131 + mat_x(i,2) * vec_in(2,jk) &
1132 + mat_x(i,3) * vec_in(3,jk) &
1133 + mat_x(i,4) * vec_in(4,jk) &
1134 + mat_x(i,5) * vec_in(5,jk)
1135 end do
1136 end do
1137
1138 return
1140
1141!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=4
1142!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
1143!!
1144!OCL SERIAL
1145 subroutine element_operation_kernel_matvec_diry_p4( Mat_y_tr, vec_in, vec_out )
1146 implicit none
1147 real(rp), intent(in) :: mat_y_tr(5,5)
1148 real(rp), intent(in) :: vec_in(5,5,5)
1149 real(rp), intent(out) :: vec_out(5,5,5)
1150
1151 integer :: i, j, k
1152 !----------------------------------------------------------
1153
1154 do k=1, 5
1155 do j=1, 5
1156 do i=1, 5
1157 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
1158 + vec_in(i,2,k) * mat_y_tr(2,j) &
1159 + vec_in(i,3,k) * mat_y_tr(3,j) &
1160 + vec_in(i,4,k) * mat_y_tr(4,j) &
1161 + vec_in(i,5,k) * mat_y_tr(5,j)
1162 end do
1163 end do
1164 end do
1165
1166 return
1168
1169!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=4
1170!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
1171!!
1172!OCL SERIAL
1173 subroutine element_operation_kernel_matvec_dirz_p4( Mat_z_tr, vec_in, vec_out )
1174 implicit none
1175 real(rp), intent(in) :: mat_z_tr(5,5)
1176 real(rp), intent(in) :: vec_in(5,5,5)
1177 real(rp), intent(out) :: vec_out(5,5,5)
1178
1179 integer :: i, j, k
1180 !----------------------------------------------------------
1181
1182 do k=1, 5
1183 do j=1, 5
1184 do i=1, 5
1185 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
1186 + vec_in(i,j,2) * mat_z_tr(2,k) &
1187 + vec_in(i,j,3) * mat_z_tr(3,k) &
1188 + vec_in(i,j,4) * mat_z_tr(4,k) &
1189 + vec_in(i,j,5) * mat_z_tr(5,k)
1190 end do
1191 end do
1192 end do
1193
1194 return
1196
1197!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=4
1198!!
1199!OCL SERIAL
1200 subroutine element_operation_kernel_matvec_lift_hexahedral_p4( Lift, vec_in, vec_out )
1201 implicit none
1202 real(rp), intent(in) :: lift(5,5,5,6)
1203 real(rp), intent(in) :: vec_in(5,5,6)
1204 real(rp), intent(out) :: vec_out(5,5,5)
1205
1206 integer :: i, j, k
1207 !----------------------------------------------------------
1208
1209 do k=1, 5
1210 do j=1, 5
1211 do i=1, 5
1212 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
1213 + lift(i,j,k,2) * vec_in(j,k,2) &
1214 + lift(i,j,k,3) * vec_in(i,k,3) &
1215 + lift(i,j,k,4) * vec_in(j,k,4) &
1216 + lift(i,j,k,5) * vec_in(i,j,5) &
1217 + lift(i,j,k,6) * vec_in(i,j,6)
1218 end do
1219 end do
1220 end do
1221
1222 return
1224
1225!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=4
1226!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
1227!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
1228!!
1229!OCL SERIAL
1230 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p4( Mat, Mat_tr, vec_in, vec_in_, &
1231 vec_out_x, vec_out_y, vec_out_z )
1232 implicit none
1233 real(rp), intent(in) :: mat(5,5)
1234 real(rp), intent(in) :: mat_tr(5,5)
1235 real(rp), intent(in) :: vec_in_(5,5**2)
1236 real(rp), intent(in) :: vec_in(5,5,5)
1237 real(rp), intent(out) :: vec_out_x(5,5**2)
1238 real(rp), intent(out) :: vec_out_y(5,5,5)
1239 real(rp), intent(out) :: vec_out_z(5,5,5)
1240
1241 integer :: i, j, k, jk
1242 !----------------------------------------------------------
1243
1244 ! X-dir
1245
1246 do jk=1, 5**2
1247 do i=1, 5
1248 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
1249 + mat(i,2) * vec_in_(2,jk) &
1250 + mat(i,3) * vec_in_(3,jk) &
1251 + mat(i,4) * vec_in_(4,jk) &
1252 + mat(i,5) * vec_in_(5,jk)
1253 end do
1254 end do
1255
1256 ! Y-dir
1257 do k=1, 5
1258 do j=1, 5
1259 do i=1, 5
1260 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
1261 + vec_in(i,2,k) * mat_tr(2,j) &
1262 + vec_in(i,3,k) * mat_tr(3,j) &
1263 + vec_in(i,4,k) * mat_tr(4,j) &
1264 + vec_in(i,5,k) * mat_tr(5,j)
1265 end do
1266 end do
1267 end do
1268
1269 ! Z-dir
1270 do k=1, 5
1271 do j=1, 5
1272 do i=1, 5
1273 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
1274 + vec_in(i,j,2) * mat_tr(2,k) &
1275 + vec_in(i,j,3) * mat_tr(3,k) &
1276 + vec_in(i,j,4) * mat_tr(4,k) &
1277 + vec_in(i,j,5) * mat_tr(5,k)
1278 end do
1279 end do
1280 end do
1281
1282 return
1284
1285!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=4
1286!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
1287!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
1288!!
1289!OCL SERIAL
1291 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
1292 vec_out_x, vec_out_y, vec_out_z )
1293 implicit none
1294 real(rp), intent(in) :: mat(5,5)
1295 real(rp), intent(in) :: mat_tr(5,5)
1296 real(rp), intent(in) :: vec_in_x(5,5**2)
1297 real(rp), intent(in) :: vec_in_y(5,5,5)
1298 real(rp), intent(in) :: vec_in_z(5,5,5)
1299 real(rp), intent(out) :: vec_out_x(5,5**2)
1300 real(rp), intent(out) :: vec_out_y(5,5**2)
1301 real(rp), intent(out) :: vec_out_z(5,5**2)
1302
1303 integer :: i, j, k, jk
1304 !----------------------------------------------------------
1305
1306 ! X-dir
1307
1308 do jk=1, 5**2
1309 do i=1, 5
1310 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
1311 + mat(i,2) * vec_in_x(2,jk) &
1312 + mat(i,3) * vec_in_x(3,jk) &
1313 + mat(i,4) * vec_in_x(4,jk) &
1314 + mat(i,5) * vec_in_x(5,jk)
1315 end do
1316 end do
1317
1318 ! Y-dir
1319 do k=1, 5
1320 do j=1, 5
1321 jk = j + (k-1)*5
1322 do i=1, 5
1323 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
1324 + vec_in_y(i,2,k) * mat_tr(2,j) &
1325 + vec_in_y(i,3,k) * mat_tr(3,j) &
1326 + vec_in_y(i,4,k) * mat_tr(4,j) &
1327 + vec_in_y(i,5,k) * mat_tr(5,j)
1328 end do
1329 end do
1330 end do
1331
1332 ! Z-dir
1333 do k=1, 5
1334 do j=1, 5
1335 jk = j + (k-1)*5
1336 do i=1, 5
1337 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
1338 + vec_in_z(i,j,2) * mat_tr(2,k) &
1339 + vec_in_z(i,j,3) * mat_tr(3,k) &
1340 + vec_in_z(i,j,4) * mat_tr(4,k) &
1341 + vec_in_z(i,j,5) * mat_tr(5,k)
1342 end do
1343 end do
1344 end do
1345 return
1347
1348!OCL SERIAL
1349 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p4( &
1350 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
1351 vec_out_x, vec_out_y, vec_out_z )
1352 implicit none
1353 real(rp), intent(in) :: mat(5,5)
1354 real(rp), intent(in) :: mat_tr(5,5)
1355 real(rp), intent(in) :: vec_in_x(5,5**2*5)
1356 real(rp), intent(in) :: vec_in_y(5,5,5*5)
1357 real(rp), intent(in) :: vec_in_z(5,5,5,5)
1358 real(rp), intent(out) :: vec_out_x(5,5**2*5)
1359 real(rp), intent(out) :: vec_out_y(5,5**2*5)
1360 real(rp), intent(out) :: vec_out_z(5,5**2,5)
1361
1362 integer :: i, j, k, jkv, jk, v, kv
1363 !----------------------------------------------------------
1364
1365 ! X-dir
1366
1367 do jkv=1, 5**2*5
1368 do i=1, 5
1369 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
1370 + mat(i,2) * vec_in_x(2,jkv) &
1371 + mat(i,3) * vec_in_x(3,jkv) &
1372 + mat(i,4) * vec_in_x(4,jkv) &
1373 + mat(i,5) * vec_in_x(5,jkv)
1374 end do
1375 end do
1376
1377 ! Y-dir
1378 do kv=1, 5*5
1379 do j=1, 5
1380 jkv = j + (kv-1)*25
1381 do i=1, 5
1382 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
1383 + vec_in_y(i,2,kv) * mat_tr(2,j) &
1384 + vec_in_y(i,3,kv) * mat_tr(3,j) &
1385 + vec_in_y(i,4,kv) * mat_tr(4,j) &
1386 + vec_in_y(i,5,kv) * mat_tr(5,j)
1387 end do
1388 end do
1389 end do
1390
1391 ! Z-dir
1392 do v=1, 5
1393 do k=1, 5
1394 do j=1, 5
1395 jk = j + (k-1)*5
1396 do i=1, 5
1397 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
1398 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
1399 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
1400 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
1401 + vec_in_z(i,j,5,v) * mat_tr(5,k)
1402 end do
1403 end do
1404 end do
1405 end do
1406 return
1407 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p4
1408
1409!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=4
1410!!
1411!OCL SERIAL
1412 subroutine element_operation_kernel_matvec_modalfilter_p4( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
1413 vec_out )
1414 implicit none
1415 real(rp), intent(in) :: mat_h1d(5,5)
1416 real(rp), intent(in) :: mat_h1d_tr(5,5)
1417 real(rp), intent(in) :: mat_v1d_tr(5,5)
1418 real(rp), intent(in) :: vec_in(5,5,5)
1419 real(rp), intent(out) :: vec_work(5,5,5)
1420 real(rp), intent(out) :: vec_out(5,5,5)
1421
1422 integer :: i, j, k
1423 !----------------------------------------------------------
1424
1425 ! X-dir
1426
1427 do k=1, 5
1428 do j=1, 5
1429 do i=1, 5
1430 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
1431 + mat_h1d(i,2) * vec_in(2,j,k) &
1432 + mat_h1d(i,3) * vec_in(3,j,k) &
1433 + mat_h1d(i,4) * vec_in(4,j,k) &
1434 + mat_h1d(i,5) * vec_in(5,j,k)
1435 end do
1436 end do
1437 end do
1438
1439 ! Y-dir
1440 do k=1, 5
1441 do j=1, 5
1442 do i=1, 5
1443 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
1444 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
1445 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
1446 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
1447 + vec_out(i,5,k) * mat_h1d_tr(5,j)
1448 end do
1449 end do
1450 end do
1451
1452 ! Z-dir
1453 do k=1, 5
1454 do j=1, 5
1455 do i=1, 5
1456 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
1457 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
1458 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
1459 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
1460 + vec_work(i,j,5) * mat_v1d_tr(5,k)
1461 end do
1462 end do
1463 end do
1464
1465 return
1467
1468!--- For p=5 ------------------------------------
1469
1470!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=5
1471!!
1472!OCL SERIAL
1473 subroutine element_operation_kernel_matvec_dirx_p5( Mat_x, vec_in, vec_out )
1474 implicit none
1475 real(rp), intent(in) :: mat_x(6,6)
1476 real(rp), intent(in) :: vec_in(6,6**2)
1477 real(rp), intent(out) :: vec_out(6,6**2)
1478
1479 integer :: i, jk
1480 !----------------------------------------------------------
1481
1482 do jk=1, 6**2
1483 do i=1, 6
1484 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
1485 + mat_x(i,2) * vec_in(2,jk) &
1486 + mat_x(i,3) * vec_in(3,jk) &
1487 + mat_x(i,4) * vec_in(4,jk) &
1488 + mat_x(i,5) * vec_in(5,jk) &
1489 + mat_x(i,6) * vec_in(6,jk)
1490 end do
1491 end do
1492
1493 return
1495
1496!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=5
1497!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
1498!!
1499!OCL SERIAL
1500 subroutine element_operation_kernel_matvec_diry_p5( Mat_y_tr, vec_in, vec_out )
1501 implicit none
1502 real(rp), intent(in) :: mat_y_tr(6,6)
1503 real(rp), intent(in) :: vec_in(6,6,6)
1504 real(rp), intent(out) :: vec_out(6,6,6)
1505
1506 integer :: i, j, k
1507 !----------------------------------------------------------
1508
1509 do k=1, 6
1510 do j=1, 6
1511 do i=1, 6
1512 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
1513 + vec_in(i,2,k) * mat_y_tr(2,j) &
1514 + vec_in(i,3,k) * mat_y_tr(3,j) &
1515 + vec_in(i,4,k) * mat_y_tr(4,j) &
1516 + vec_in(i,5,k) * mat_y_tr(5,j) &
1517 + vec_in(i,6,k) * mat_y_tr(6,j)
1518 end do
1519 end do
1520 end do
1521
1522 return
1524
1525!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=5
1526!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
1527!!
1528!OCL SERIAL
1529 subroutine element_operation_kernel_matvec_dirz_p5( Mat_z_tr, vec_in, vec_out )
1530 implicit none
1531 real(rp), intent(in) :: mat_z_tr(6,6)
1532 real(rp), intent(in) :: vec_in(6,6,6)
1533 real(rp), intent(out) :: vec_out(6,6,6)
1534
1535 integer :: i, j, k
1536 !----------------------------------------------------------
1537
1538 do k=1, 6
1539 do j=1, 6
1540 do i=1, 6
1541 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
1542 + vec_in(i,j,2) * mat_z_tr(2,k) &
1543 + vec_in(i,j,3) * mat_z_tr(3,k) &
1544 + vec_in(i,j,4) * mat_z_tr(4,k) &
1545 + vec_in(i,j,5) * mat_z_tr(5,k) &
1546 + vec_in(i,j,6) * mat_z_tr(6,k)
1547 end do
1548 end do
1549 end do
1550
1551 return
1553
1554!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=5
1555!!
1556!OCL SERIAL
1557 subroutine element_operation_kernel_matvec_lift_hexahedral_p5( Lift, vec_in, vec_out )
1558 implicit none
1559 real(rp), intent(in) :: lift(6,6,6,6)
1560 real(rp), intent(in) :: vec_in(6,6,6)
1561 real(rp), intent(out) :: vec_out(6,6,6)
1562
1563 integer :: i, j, k
1564 !----------------------------------------------------------
1565
1566 do k=1, 6
1567 do j=1, 6
1568 do i=1, 6
1569 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
1570 + lift(i,j,k,2) * vec_in(j,k,2) &
1571 + lift(i,j,k,3) * vec_in(i,k,3) &
1572 + lift(i,j,k,4) * vec_in(j,k,4) &
1573 + lift(i,j,k,5) * vec_in(i,j,5) &
1574 + lift(i,j,k,6) * vec_in(i,j,6)
1575 end do
1576 end do
1577 end do
1578
1579 return
1581
1582!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=5
1583!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
1584!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
1585!!
1586!OCL SERIAL
1587 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p5( Mat, Mat_tr, vec_in, vec_in_, &
1588 vec_out_x, vec_out_y, vec_out_z )
1589 implicit none
1590 real(rp), intent(in) :: mat(6,6)
1591 real(rp), intent(in) :: mat_tr(6,6)
1592 real(rp), intent(in) :: vec_in_(6,6**2)
1593 real(rp), intent(in) :: vec_in(6,6,6)
1594 real(rp), intent(out) :: vec_out_x(6,6**2)
1595 real(rp), intent(out) :: vec_out_y(6,6,6)
1596 real(rp), intent(out) :: vec_out_z(6,6,6)
1597
1598 integer :: i, j, k, jk
1599 !----------------------------------------------------------
1600
1601 ! X-dir
1602
1603 do jk=1, 6**2
1604 do i=1, 6
1605 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
1606 + mat(i,2) * vec_in_(2,jk) &
1607 + mat(i,3) * vec_in_(3,jk) &
1608 + mat(i,4) * vec_in_(4,jk) &
1609 + mat(i,5) * vec_in_(5,jk) &
1610 + mat(i,6) * vec_in_(6,jk)
1611 end do
1612 end do
1613
1614 ! Y-dir
1615 do k=1, 6
1616 do j=1, 6
1617 do i=1, 6
1618 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
1619 + vec_in(i,2,k) * mat_tr(2,j) &
1620 + vec_in(i,3,k) * mat_tr(3,j) &
1621 + vec_in(i,4,k) * mat_tr(4,j) &
1622 + vec_in(i,5,k) * mat_tr(5,j) &
1623 + vec_in(i,6,k) * mat_tr(6,j)
1624 end do
1625 end do
1626 end do
1627
1628 ! Z-dir
1629 do k=1, 6
1630 do j=1, 6
1631 do i=1, 6
1632 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
1633 + vec_in(i,j,2) * mat_tr(2,k) &
1634 + vec_in(i,j,3) * mat_tr(3,k) &
1635 + vec_in(i,j,4) * mat_tr(4,k) &
1636 + vec_in(i,j,5) * mat_tr(5,k) &
1637 + vec_in(i,j,6) * mat_tr(6,k)
1638 end do
1639 end do
1640 end do
1641
1642 return
1644
1645!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=5
1646!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
1647!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
1648!!
1649!OCL SERIAL
1651 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
1652 vec_out_x, vec_out_y, vec_out_z )
1653 implicit none
1654 real(rp), intent(in) :: mat(6,6)
1655 real(rp), intent(in) :: mat_tr(6,6)
1656 real(rp), intent(in) :: vec_in_x(6,6**2)
1657 real(rp), intent(in) :: vec_in_y(6,6,6)
1658 real(rp), intent(in) :: vec_in_z(6,6,6)
1659 real(rp), intent(out) :: vec_out_x(6,6**2)
1660 real(rp), intent(out) :: vec_out_y(6,6**2)
1661 real(rp), intent(out) :: vec_out_z(6,6**2)
1662
1663 integer :: i, j, k, jk
1664 !----------------------------------------------------------
1665
1666 ! X-dir
1667
1668 do jk=1, 6**2
1669 do i=1, 6
1670 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
1671 + mat(i,2) * vec_in_x(2,jk) &
1672 + mat(i,3) * vec_in_x(3,jk) &
1673 + mat(i,4) * vec_in_x(4,jk) &
1674 + mat(i,5) * vec_in_x(5,jk) &
1675 + mat(i,6) * vec_in_x(6,jk)
1676 end do
1677 end do
1678
1679 ! Y-dir
1680 do k=1, 6
1681 do j=1, 6
1682 jk = j + (k-1)*6
1683 do i=1, 6
1684 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
1685 + vec_in_y(i,2,k) * mat_tr(2,j) &
1686 + vec_in_y(i,3,k) * mat_tr(3,j) &
1687 + vec_in_y(i,4,k) * mat_tr(4,j) &
1688 + vec_in_y(i,5,k) * mat_tr(5,j) &
1689 + vec_in_y(i,6,k) * mat_tr(6,j)
1690 end do
1691 end do
1692 end do
1693
1694 ! Z-dir
1695 do k=1, 6
1696 do j=1, 6
1697 jk = j + (k-1)*6
1698 do i=1, 6
1699 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
1700 + vec_in_z(i,j,2) * mat_tr(2,k) &
1701 + vec_in_z(i,j,3) * mat_tr(3,k) &
1702 + vec_in_z(i,j,4) * mat_tr(4,k) &
1703 + vec_in_z(i,j,5) * mat_tr(5,k) &
1704 + vec_in_z(i,j,6) * mat_tr(6,k)
1705 end do
1706 end do
1707 end do
1708 return
1710
1711!OCL SERIAL
1712 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p5( &
1713 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
1714 vec_out_x, vec_out_y, vec_out_z )
1715 implicit none
1716 real(rp), intent(in) :: mat(6,6)
1717 real(rp), intent(in) :: mat_tr(6,6)
1718 real(rp), intent(in) :: vec_in_x(6,6**2*5)
1719 real(rp), intent(in) :: vec_in_y(6,6,6*5)
1720 real(rp), intent(in) :: vec_in_z(6,6,6,5)
1721 real(rp), intent(out) :: vec_out_x(6,6**2*5)
1722 real(rp), intent(out) :: vec_out_y(6,6**2*5)
1723 real(rp), intent(out) :: vec_out_z(6,6**2,5)
1724
1725 integer :: i, j, k, jkv, jk, v, kv
1726 !----------------------------------------------------------
1727
1728 ! X-dir
1729
1730 do jkv=1, 6**2*5
1731 do i=1, 6
1732 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
1733 + mat(i,2) * vec_in_x(2,jkv) &
1734 + mat(i,3) * vec_in_x(3,jkv) &
1735 + mat(i,4) * vec_in_x(4,jkv) &
1736 + mat(i,5) * vec_in_x(5,jkv) &
1737 + mat(i,6) * vec_in_x(6,jkv)
1738 end do
1739 end do
1740
1741 ! Y-dir
1742 do kv=1, 6*5
1743 do j=1, 6
1744 jkv = j + (kv-1)*30
1745 do i=1, 6
1746 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
1747 + vec_in_y(i,2,kv) * mat_tr(2,j) &
1748 + vec_in_y(i,3,kv) * mat_tr(3,j) &
1749 + vec_in_y(i,4,kv) * mat_tr(4,j) &
1750 + vec_in_y(i,5,kv) * mat_tr(5,j) &
1751 + vec_in_y(i,6,kv) * mat_tr(6,j)
1752 end do
1753 end do
1754 end do
1755
1756 ! Z-dir
1757 do v=1, 5
1758 do k=1, 6
1759 do j=1, 6
1760 jk = j + (k-1)*6
1761 do i=1, 6
1762 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
1763 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
1764 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
1765 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
1766 + vec_in_z(i,j,5,v) * mat_tr(5,k) &
1767 + vec_in_z(i,j,6,v) * mat_tr(6,k)
1768 end do
1769 end do
1770 end do
1771 end do
1772 return
1773 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p5
1774
1775!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=5
1776!!
1777!OCL SERIAL
1778 subroutine element_operation_kernel_matvec_modalfilter_p5( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
1779 vec_out )
1780 implicit none
1781 real(rp), intent(in) :: mat_h1d(6,6)
1782 real(rp), intent(in) :: mat_h1d_tr(6,6)
1783 real(rp), intent(in) :: mat_v1d_tr(6,6)
1784 real(rp), intent(in) :: vec_in(6,6,6)
1785 real(rp), intent(out) :: vec_work(6,6,6)
1786 real(rp), intent(out) :: vec_out(6,6,6)
1787
1788 integer :: i, j, k
1789 !----------------------------------------------------------
1790
1791 ! X-dir
1792
1793 do k=1, 6
1794 do j=1, 6
1795 do i=1, 6
1796 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
1797 + mat_h1d(i,2) * vec_in(2,j,k) &
1798 + mat_h1d(i,3) * vec_in(3,j,k) &
1799 + mat_h1d(i,4) * vec_in(4,j,k) &
1800 + mat_h1d(i,5) * vec_in(5,j,k) &
1801 + mat_h1d(i,6) * vec_in(6,j,k)
1802 end do
1803 end do
1804 end do
1805
1806 ! Y-dir
1807 do k=1, 6
1808 do j=1, 6
1809 do i=1, 6
1810 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
1811 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
1812 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
1813 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
1814 + vec_out(i,5,k) * mat_h1d_tr(5,j) &
1815 + vec_out(i,6,k) * mat_h1d_tr(6,j)
1816 end do
1817 end do
1818 end do
1819
1820 ! Z-dir
1821 do k=1, 6
1822 do j=1, 6
1823 do i=1, 6
1824 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
1825 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
1826 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
1827 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
1828 + vec_work(i,j,5) * mat_v1d_tr(5,k) &
1829 + vec_work(i,j,6) * mat_v1d_tr(6,k)
1830 end do
1831 end do
1832 end do
1833
1834 return
1836
1837!--- For p=6 ------------------------------------
1838
1839!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=6
1840!!
1841!OCL SERIAL
1842 subroutine element_operation_kernel_matvec_dirx_p6( Mat_x, vec_in, vec_out )
1843 implicit none
1844 real(rp), intent(in) :: mat_x(7,7)
1845 real(rp), intent(in) :: vec_in(7,7**2)
1846 real(rp), intent(out) :: vec_out(7,7**2)
1847
1848 integer :: i, jk
1849 !----------------------------------------------------------
1850
1851 do jk=1, 7**2
1852 do i=1, 7
1853 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
1854 + mat_x(i,2) * vec_in(2,jk) &
1855 + mat_x(i,3) * vec_in(3,jk) &
1856 + mat_x(i,4) * vec_in(4,jk) &
1857 + mat_x(i,5) * vec_in(5,jk) &
1858 + mat_x(i,6) * vec_in(6,jk) &
1859 + mat_x(i,7) * vec_in(7,jk)
1860 end do
1861 end do
1862
1863 return
1865
1866!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=6
1867!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
1868!!
1869!OCL SERIAL
1870 subroutine element_operation_kernel_matvec_diry_p6( Mat_y_tr, vec_in, vec_out )
1871 implicit none
1872 real(rp), intent(in) :: mat_y_tr(7,7)
1873 real(rp), intent(in) :: vec_in(7,7,7)
1874 real(rp), intent(out) :: vec_out(7,7,7)
1875
1876 integer :: i, j, k
1877 !----------------------------------------------------------
1878
1879 do k=1, 7
1880 do j=1, 7
1881 do i=1, 7
1882 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
1883 + vec_in(i,2,k) * mat_y_tr(2,j) &
1884 + vec_in(i,3,k) * mat_y_tr(3,j) &
1885 + vec_in(i,4,k) * mat_y_tr(4,j) &
1886 + vec_in(i,5,k) * mat_y_tr(5,j) &
1887 + vec_in(i,6,k) * mat_y_tr(6,j) &
1888 + vec_in(i,7,k) * mat_y_tr(7,j)
1889 end do
1890 end do
1891 end do
1892
1893 return
1895
1896!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=6
1897!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
1898!!
1899!OCL SERIAL
1900 subroutine element_operation_kernel_matvec_dirz_p6( Mat_z_tr, vec_in, vec_out )
1901 implicit none
1902 real(rp), intent(in) :: mat_z_tr(7,7)
1903 real(rp), intent(in) :: vec_in(7,7,7)
1904 real(rp), intent(out) :: vec_out(7,7,7)
1905
1906 integer :: i, j, k
1907 !----------------------------------------------------------
1908
1909 do k=1, 7
1910 do j=1, 7
1911 do i=1, 7
1912 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
1913 + vec_in(i,j,2) * mat_z_tr(2,k) &
1914 + vec_in(i,j,3) * mat_z_tr(3,k) &
1915 + vec_in(i,j,4) * mat_z_tr(4,k) &
1916 + vec_in(i,j,5) * mat_z_tr(5,k) &
1917 + vec_in(i,j,6) * mat_z_tr(6,k) &
1918 + vec_in(i,j,7) * mat_z_tr(7,k)
1919 end do
1920 end do
1921 end do
1922
1923 return
1925
1926!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=6
1927!!
1928!OCL SERIAL
1929 subroutine element_operation_kernel_matvec_lift_hexahedral_p6( Lift, vec_in, vec_out )
1930 implicit none
1931 real(rp), intent(in) :: lift(7,7,7,6)
1932 real(rp), intent(in) :: vec_in(7,7,6)
1933 real(rp), intent(out) :: vec_out(7,7,7)
1934
1935 integer :: i, j, k
1936 !----------------------------------------------------------
1937
1938 do k=1, 7
1939 do j=1, 7
1940 do i=1, 7
1941 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
1942 + lift(i,j,k,2) * vec_in(j,k,2) &
1943 + lift(i,j,k,3) * vec_in(i,k,3) &
1944 + lift(i,j,k,4) * vec_in(j,k,4) &
1945 + lift(i,j,k,5) * vec_in(i,j,5) &
1946 + lift(i,j,k,6) * vec_in(i,j,6)
1947 end do
1948 end do
1949 end do
1950
1951 return
1953
1954!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=6
1955!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
1956!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
1957!!
1958!OCL SERIAL
1959 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p6( Mat, Mat_tr, vec_in, vec_in_, &
1960 vec_out_x, vec_out_y, vec_out_z )
1961 implicit none
1962 real(rp), intent(in) :: mat(7,7)
1963 real(rp), intent(in) :: mat_tr(7,7)
1964 real(rp), intent(in) :: vec_in_(7,7**2)
1965 real(rp), intent(in) :: vec_in(7,7,7)
1966 real(rp), intent(out) :: vec_out_x(7,7**2)
1967 real(rp), intent(out) :: vec_out_y(7,7,7)
1968 real(rp), intent(out) :: vec_out_z(7,7,7)
1969
1970 integer :: i, j, k, jk
1971 !----------------------------------------------------------
1972
1973 ! X-dir
1974
1975 do jk=1, 7**2
1976 do i=1, 7
1977 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
1978 + mat(i,2) * vec_in_(2,jk) &
1979 + mat(i,3) * vec_in_(3,jk) &
1980 + mat(i,4) * vec_in_(4,jk) &
1981 + mat(i,5) * vec_in_(5,jk) &
1982 + mat(i,6) * vec_in_(6,jk) &
1983 + mat(i,7) * vec_in_(7,jk)
1984 end do
1985 end do
1986
1987 ! Y-dir
1988 do k=1, 7
1989 do j=1, 7
1990 do i=1, 7
1991 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
1992 + vec_in(i,2,k) * mat_tr(2,j) &
1993 + vec_in(i,3,k) * mat_tr(3,j) &
1994 + vec_in(i,4,k) * mat_tr(4,j) &
1995 + vec_in(i,5,k) * mat_tr(5,j) &
1996 + vec_in(i,6,k) * mat_tr(6,j) &
1997 + vec_in(i,7,k) * mat_tr(7,j)
1998 end do
1999 end do
2000 end do
2001
2002 ! Z-dir
2003 do k=1, 7
2004 do j=1, 7
2005 do i=1, 7
2006 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
2007 + vec_in(i,j,2) * mat_tr(2,k) &
2008 + vec_in(i,j,3) * mat_tr(3,k) &
2009 + vec_in(i,j,4) * mat_tr(4,k) &
2010 + vec_in(i,j,5) * mat_tr(5,k) &
2011 + vec_in(i,j,6) * mat_tr(6,k) &
2012 + vec_in(i,j,7) * mat_tr(7,k)
2013 end do
2014 end do
2015 end do
2016
2017 return
2019
2020!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=6
2021!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
2022!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
2023!!
2024!OCL SERIAL
2026 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2027 vec_out_x, vec_out_y, vec_out_z )
2028 implicit none
2029 real(rp), intent(in) :: mat(7,7)
2030 real(rp), intent(in) :: mat_tr(7,7)
2031 real(rp), intent(in) :: vec_in_x(7,7**2)
2032 real(rp), intent(in) :: vec_in_y(7,7,7)
2033 real(rp), intent(in) :: vec_in_z(7,7,7)
2034 real(rp), intent(out) :: vec_out_x(7,7**2)
2035 real(rp), intent(out) :: vec_out_y(7,7**2)
2036 real(rp), intent(out) :: vec_out_z(7,7**2)
2037
2038 integer :: i, j, k, jk
2039 !----------------------------------------------------------
2040
2041 ! X-dir
2042
2043 do jk=1, 7**2
2044 do i=1, 7
2045 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
2046 + mat(i,2) * vec_in_x(2,jk) &
2047 + mat(i,3) * vec_in_x(3,jk) &
2048 + mat(i,4) * vec_in_x(4,jk) &
2049 + mat(i,5) * vec_in_x(5,jk) &
2050 + mat(i,6) * vec_in_x(6,jk) &
2051 + mat(i,7) * vec_in_x(7,jk)
2052 end do
2053 end do
2054
2055 ! Y-dir
2056 do k=1, 7
2057 do j=1, 7
2058 jk = j + (k-1)*7
2059 do i=1, 7
2060 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
2061 + vec_in_y(i,2,k) * mat_tr(2,j) &
2062 + vec_in_y(i,3,k) * mat_tr(3,j) &
2063 + vec_in_y(i,4,k) * mat_tr(4,j) &
2064 + vec_in_y(i,5,k) * mat_tr(5,j) &
2065 + vec_in_y(i,6,k) * mat_tr(6,j) &
2066 + vec_in_y(i,7,k) * mat_tr(7,j)
2067 end do
2068 end do
2069 end do
2070
2071 ! Z-dir
2072 do k=1, 7
2073 do j=1, 7
2074 jk = j + (k-1)*7
2075 do i=1, 7
2076 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
2077 + vec_in_z(i,j,2) * mat_tr(2,k) &
2078 + vec_in_z(i,j,3) * mat_tr(3,k) &
2079 + vec_in_z(i,j,4) * mat_tr(4,k) &
2080 + vec_in_z(i,j,5) * mat_tr(5,k) &
2081 + vec_in_z(i,j,6) * mat_tr(6,k) &
2082 + vec_in_z(i,j,7) * mat_tr(7,k)
2083 end do
2084 end do
2085 end do
2086 return
2088
2089!OCL SERIAL
2090 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p6( &
2091 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2092 vec_out_x, vec_out_y, vec_out_z )
2093 implicit none
2094 real(rp), intent(in) :: mat(7,7)
2095 real(rp), intent(in) :: mat_tr(7,7)
2096 real(rp), intent(in) :: vec_in_x(7,7**2*5)
2097 real(rp), intent(in) :: vec_in_y(7,7,7*5)
2098 real(rp), intent(in) :: vec_in_z(7,7,7,5)
2099 real(rp), intent(out) :: vec_out_x(7,7**2*5)
2100 real(rp), intent(out) :: vec_out_y(7,7**2*5)
2101 real(rp), intent(out) :: vec_out_z(7,7**2,5)
2102
2103 integer :: i, j, k, jkv, jk, v, kv
2104 !----------------------------------------------------------
2105
2106 ! X-dir
2107
2108 do jkv=1, 7**2*5
2109 do i=1, 7
2110 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
2111 + mat(i,2) * vec_in_x(2,jkv) &
2112 + mat(i,3) * vec_in_x(3,jkv) &
2113 + mat(i,4) * vec_in_x(4,jkv) &
2114 + mat(i,5) * vec_in_x(5,jkv) &
2115 + mat(i,6) * vec_in_x(6,jkv) &
2116 + mat(i,7) * vec_in_x(7,jkv)
2117 end do
2118 end do
2119
2120 ! Y-dir
2121 do kv=1, 7*5
2122 do j=1, 7
2123 jkv = j + (kv-1)*35
2124 do i=1, 7
2125 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
2126 + vec_in_y(i,2,kv) * mat_tr(2,j) &
2127 + vec_in_y(i,3,kv) * mat_tr(3,j) &
2128 + vec_in_y(i,4,kv) * mat_tr(4,j) &
2129 + vec_in_y(i,5,kv) * mat_tr(5,j) &
2130 + vec_in_y(i,6,kv) * mat_tr(6,j) &
2131 + vec_in_y(i,7,kv) * mat_tr(7,j)
2132 end do
2133 end do
2134 end do
2135
2136 ! Z-dir
2137 do v=1, 5
2138 do k=1, 7
2139 do j=1, 7
2140 jk = j + (k-1)*7
2141 do i=1, 7
2142 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
2143 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
2144 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
2145 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
2146 + vec_in_z(i,j,5,v) * mat_tr(5,k) &
2147 + vec_in_z(i,j,6,v) * mat_tr(6,k) &
2148 + vec_in_z(i,j,7,v) * mat_tr(7,k)
2149 end do
2150 end do
2151 end do
2152 end do
2153 return
2154 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p6
2155
2156!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=6
2157!!
2158!OCL SERIAL
2159 subroutine element_operation_kernel_matvec_modalfilter_p6( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
2160 vec_out )
2161 implicit none
2162 real(rp), intent(in) :: mat_h1d(7,7)
2163 real(rp), intent(in) :: mat_h1d_tr(7,7)
2164 real(rp), intent(in) :: mat_v1d_tr(7,7)
2165 real(rp), intent(in) :: vec_in(7,7,7)
2166 real(rp), intent(out) :: vec_work(7,7,7)
2167 real(rp), intent(out) :: vec_out(7,7,7)
2168
2169 integer :: i, j, k
2170 !----------------------------------------------------------
2171
2172 ! X-dir
2173
2174 do k=1, 7
2175 do j=1, 7
2176 do i=1, 7
2177 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
2178 + mat_h1d(i,2) * vec_in(2,j,k) &
2179 + mat_h1d(i,3) * vec_in(3,j,k) &
2180 + mat_h1d(i,4) * vec_in(4,j,k) &
2181 + mat_h1d(i,5) * vec_in(5,j,k) &
2182 + mat_h1d(i,6) * vec_in(6,j,k) &
2183 + mat_h1d(i,7) * vec_in(7,j,k)
2184 end do
2185 end do
2186 end do
2187
2188 ! Y-dir
2189 do k=1, 7
2190 do j=1, 7
2191 do i=1, 7
2192 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
2193 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
2194 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
2195 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
2196 + vec_out(i,5,k) * mat_h1d_tr(5,j) &
2197 + vec_out(i,6,k) * mat_h1d_tr(6,j) &
2198 + vec_out(i,7,k) * mat_h1d_tr(7,j)
2199 end do
2200 end do
2201 end do
2202
2203 ! Z-dir
2204 do k=1, 7
2205 do j=1, 7
2206 do i=1, 7
2207 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
2208 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
2209 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
2210 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
2211 + vec_work(i,j,5) * mat_v1d_tr(5,k) &
2212 + vec_work(i,j,6) * mat_v1d_tr(6,k) &
2213 + vec_work(i,j,7) * mat_v1d_tr(7,k)
2214 end do
2215 end do
2216 end do
2217
2218 return
2220
2221!--- For p=7 ------------------------------------
2222
2223!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=7
2224!!
2225!OCL SERIAL
2226 subroutine element_operation_kernel_matvec_dirx_p7( Mat_x, vec_in, vec_out )
2227 implicit none
2228 real(rp), intent(in) :: mat_x(8,8)
2229 real(rp), intent(in) :: vec_in(8,8**2)
2230 real(rp), intent(out) :: vec_out(8,8**2)
2231
2232 integer :: i, jk
2233 !----------------------------------------------------------
2234
2235 do jk=1, 8**2
2236 do i=1, 8
2237 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
2238 + mat_x(i,2) * vec_in(2,jk) &
2239 + mat_x(i,3) * vec_in(3,jk) &
2240 + mat_x(i,4) * vec_in(4,jk) &
2241 + mat_x(i,5) * vec_in(5,jk) &
2242 + mat_x(i,6) * vec_in(6,jk) &
2243 + mat_x(i,7) * vec_in(7,jk) &
2244 + mat_x(i,8) * vec_in(8,jk)
2245 end do
2246 end do
2247
2248 return
2250
2251!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=7
2252!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
2253!!
2254!OCL SERIAL
2255 subroutine element_operation_kernel_matvec_diry_p7( Mat_y_tr, vec_in, vec_out )
2256 implicit none
2257 real(rp), intent(in) :: mat_y_tr(8,8)
2258 real(rp), intent(in) :: vec_in(8,8,8)
2259 real(rp), intent(out) :: vec_out(8,8,8)
2260
2261 integer :: i, j, k
2262 !----------------------------------------------------------
2263
2264 do k=1, 8
2265 do j=1, 8
2266 do i=1, 8
2267 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
2268 + vec_in(i,2,k) * mat_y_tr(2,j) &
2269 + vec_in(i,3,k) * mat_y_tr(3,j) &
2270 + vec_in(i,4,k) * mat_y_tr(4,j) &
2271 + vec_in(i,5,k) * mat_y_tr(5,j) &
2272 + vec_in(i,6,k) * mat_y_tr(6,j) &
2273 + vec_in(i,7,k) * mat_y_tr(7,j) &
2274 + vec_in(i,8,k) * mat_y_tr(8,j)
2275 end do
2276 end do
2277 end do
2278
2279 return
2281
2282!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=7
2283!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
2284!!
2285!OCL SERIAL
2286 subroutine element_operation_kernel_matvec_dirz_p7( Mat_z_tr, vec_in, vec_out )
2287 implicit none
2288 real(rp), intent(in) :: mat_z_tr(8,8)
2289 real(rp), intent(in) :: vec_in(8,8,8)
2290 real(rp), intent(out) :: vec_out(8,8,8)
2291
2292 integer :: i, j, k
2293 !----------------------------------------------------------
2294
2295 do k=1, 8
2296 do j=1, 8
2297 do i=1, 8
2298 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
2299 + vec_in(i,j,2) * mat_z_tr(2,k) &
2300 + vec_in(i,j,3) * mat_z_tr(3,k) &
2301 + vec_in(i,j,4) * mat_z_tr(4,k) &
2302 + vec_in(i,j,5) * mat_z_tr(5,k) &
2303 + vec_in(i,j,6) * mat_z_tr(6,k) &
2304 + vec_in(i,j,7) * mat_z_tr(7,k) &
2305 + vec_in(i,j,8) * mat_z_tr(8,k)
2306 end do
2307 end do
2308 end do
2309
2310 return
2312
2313!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=7
2314!!
2315!OCL SERIAL
2316 subroutine element_operation_kernel_matvec_lift_hexahedral_p7( Lift, vec_in, vec_out )
2317 implicit none
2318 real(rp), intent(in) :: lift(8,8,8,6)
2319 real(rp), intent(in) :: vec_in(8,8,6)
2320 real(rp), intent(out) :: vec_out(8,8,8)
2321
2322 integer :: i, j, k
2323 !----------------------------------------------------------
2324
2325 do k=1, 8
2326 do j=1, 8
2327 do i=1, 8
2328 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
2329 + lift(i,j,k,2) * vec_in(j,k,2) &
2330 + lift(i,j,k,3) * vec_in(i,k,3) &
2331 + lift(i,j,k,4) * vec_in(j,k,4) &
2332 + lift(i,j,k,5) * vec_in(i,j,5) &
2333 + lift(i,j,k,6) * vec_in(i,j,6)
2334 end do
2335 end do
2336 end do
2337
2338 return
2340
2341!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=7
2342!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
2343!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
2344!!
2345!OCL SERIAL
2346 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p7( Mat, Mat_tr, vec_in, vec_in_, &
2347 vec_out_x, vec_out_y, vec_out_z )
2348 implicit none
2349 real(rp), intent(in) :: mat(8,8)
2350 real(rp), intent(in) :: mat_tr(8,8)
2351 real(rp), intent(in) :: vec_in_(8,8**2)
2352 real(rp), intent(in) :: vec_in(8,8,8)
2353 real(rp), intent(out) :: vec_out_x(8,8**2)
2354 real(rp), intent(out) :: vec_out_y(8,8,8)
2355 real(rp), intent(out) :: vec_out_z(8,8,8)
2356
2357 integer :: i, j, k, jk
2358 !----------------------------------------------------------
2359
2360 ! X-dir
2361
2362 do jk=1, 8**2
2363 do i=1, 8
2364 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
2365 + mat(i,2) * vec_in_(2,jk) &
2366 + mat(i,3) * vec_in_(3,jk) &
2367 + mat(i,4) * vec_in_(4,jk) &
2368 + mat(i,5) * vec_in_(5,jk) &
2369 + mat(i,6) * vec_in_(6,jk) &
2370 + mat(i,7) * vec_in_(7,jk) &
2371 + mat(i,8) * vec_in_(8,jk)
2372 end do
2373 end do
2374
2375 ! Y-dir
2376 do k=1, 8
2377 do j=1, 8
2378 do i=1, 8
2379 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
2380 + vec_in(i,2,k) * mat_tr(2,j) &
2381 + vec_in(i,3,k) * mat_tr(3,j) &
2382 + vec_in(i,4,k) * mat_tr(4,j) &
2383 + vec_in(i,5,k) * mat_tr(5,j) &
2384 + vec_in(i,6,k) * mat_tr(6,j) &
2385 + vec_in(i,7,k) * mat_tr(7,j) &
2386 + vec_in(i,8,k) * mat_tr(8,j)
2387 end do
2388 end do
2389 end do
2390
2391 ! Z-dir
2392 do k=1, 8
2393 do j=1, 8
2394 do i=1, 8
2395 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
2396 + vec_in(i,j,2) * mat_tr(2,k) &
2397 + vec_in(i,j,3) * mat_tr(3,k) &
2398 + vec_in(i,j,4) * mat_tr(4,k) &
2399 + vec_in(i,j,5) * mat_tr(5,k) &
2400 + vec_in(i,j,6) * mat_tr(6,k) &
2401 + vec_in(i,j,7) * mat_tr(7,k) &
2402 + vec_in(i,j,8) * mat_tr(8,k)
2403 end do
2404 end do
2405 end do
2406
2407 return
2409
2410!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=7
2411!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
2412!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
2413!!
2414!OCL SERIAL
2416 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2417 vec_out_x, vec_out_y, vec_out_z )
2418 implicit none
2419 real(rp), intent(in) :: mat(8,8)
2420 real(rp), intent(in) :: mat_tr(8,8)
2421 real(rp), intent(in) :: vec_in_x(8,8**2)
2422 real(rp), intent(in) :: vec_in_y(8,8,8)
2423 real(rp), intent(in) :: vec_in_z(8,8,8)
2424 real(rp), intent(out) :: vec_out_x(8,8**2)
2425 real(rp), intent(out) :: vec_out_y(8,8**2)
2426 real(rp), intent(out) :: vec_out_z(8,8**2)
2427
2428 integer :: i, j, k, jk
2429 !----------------------------------------------------------
2430
2431 ! X-dir
2432
2433 do jk=1, 8**2
2434 do i=1, 8
2435 vec_out_x(i,jk) = mat(i,1) * vec_in_x(1,jk) &
2436 + mat(i,2) * vec_in_x(2,jk) &
2437 + mat(i,3) * vec_in_x(3,jk) &
2438 + mat(i,4) * vec_in_x(4,jk) &
2439 + mat(i,5) * vec_in_x(5,jk) &
2440 + mat(i,6) * vec_in_x(6,jk) &
2441 + mat(i,7) * vec_in_x(7,jk) &
2442 + mat(i,8) * vec_in_x(8,jk)
2443 end do
2444 end do
2445
2446 ! Y-dir
2447 do k=1, 8
2448 do j=1, 8
2449 jk = j + (k-1)*8
2450 do i=1, 8
2451 vec_out_y(i,jk) = vec_in_y(i,1,k) * mat_tr(1,j) &
2452 + vec_in_y(i,2,k) * mat_tr(2,j) &
2453 + vec_in_y(i,3,k) * mat_tr(3,j) &
2454 + vec_in_y(i,4,k) * mat_tr(4,j) &
2455 + vec_in_y(i,5,k) * mat_tr(5,j) &
2456 + vec_in_y(i,6,k) * mat_tr(6,j) &
2457 + vec_in_y(i,7,k) * mat_tr(7,j) &
2458 + vec_in_y(i,8,k) * mat_tr(8,j)
2459 end do
2460 end do
2461 end do
2462
2463 ! Z-dir
2464 do k=1, 8
2465 do j=1, 8
2466 jk = j + (k-1)*8
2467 do i=1, 8
2468 vec_out_z(i,jk) = vec_in_z(i,j,1) * mat_tr(1,k) &
2469 + vec_in_z(i,j,2) * mat_tr(2,k) &
2470 + vec_in_z(i,j,3) * mat_tr(3,k) &
2471 + vec_in_z(i,j,4) * mat_tr(4,k) &
2472 + vec_in_z(i,j,5) * mat_tr(5,k) &
2473 + vec_in_z(i,j,6) * mat_tr(6,k) &
2474 + vec_in_z(i,j,7) * mat_tr(7,k) &
2475 + vec_in_z(i,j,8) * mat_tr(8,k)
2476 end do
2477 end do
2478 end do
2479 return
2481
2482!OCL SERIAL
2483 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p7( &
2484 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2485 vec_out_x, vec_out_y, vec_out_z )
2486 implicit none
2487 real(rp), intent(in) :: mat(8,8)
2488 real(rp), intent(in) :: mat_tr(8,8)
2489 real(rp), intent(in) :: vec_in_x(8,8**2*5)
2490 real(rp), intent(in) :: vec_in_y(8,8,8*5)
2491 real(rp), intent(in) :: vec_in_z(8,8,8,5)
2492 real(rp), intent(out) :: vec_out_x(8,8**2*5)
2493 real(rp), intent(out) :: vec_out_y(8,8**2*5)
2494 real(rp), intent(out) :: vec_out_z(8,8**2,5)
2495
2496 integer :: i, j, k, jkv, jk, v, kv
2497 !----------------------------------------------------------
2498
2499 ! X-dir
2500
2501 do jkv=1, 8**2*5
2502 do i=1, 8
2503 vec_out_x(i,jkv) = mat(i,1) * vec_in_x(1,jkv) &
2504 + mat(i,2) * vec_in_x(2,jkv) &
2505 + mat(i,3) * vec_in_x(3,jkv) &
2506 + mat(i,4) * vec_in_x(4,jkv) &
2507 + mat(i,5) * vec_in_x(5,jkv) &
2508 + mat(i,6) * vec_in_x(6,jkv) &
2509 + mat(i,7) * vec_in_x(7,jkv) &
2510 + mat(i,8) * vec_in_x(8,jkv)
2511 end do
2512 end do
2513
2514 ! Y-dir
2515 do kv=1, 8*5
2516 do j=1, 8
2517 jkv = j + (kv-1)*40
2518 do i=1, 8
2519 vec_out_y(i,jkv) = vec_in_y(i,1,kv) * mat_tr(1,j) &
2520 + vec_in_y(i,2,kv) * mat_tr(2,j) &
2521 + vec_in_y(i,3,kv) * mat_tr(3,j) &
2522 + vec_in_y(i,4,kv) * mat_tr(4,j) &
2523 + vec_in_y(i,5,kv) * mat_tr(5,j) &
2524 + vec_in_y(i,6,kv) * mat_tr(6,j) &
2525 + vec_in_y(i,7,kv) * mat_tr(7,j) &
2526 + vec_in_y(i,8,kv) * mat_tr(8,j)
2527 end do
2528 end do
2529 end do
2530
2531 ! Z-dir
2532 do v=1, 5
2533 do k=1, 8
2534 do j=1, 8
2535 jk = j + (k-1)*8
2536 do i=1, 8
2537 vec_out_z(i,jk,v) = vec_in_z(i,j,1,v) * mat_tr(1,k) &
2538 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
2539 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
2540 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
2541 + vec_in_z(i,j,5,v) * mat_tr(5,k) &
2542 + vec_in_z(i,j,6,v) * mat_tr(6,k) &
2543 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
2544 + vec_in_z(i,j,8,v) * mat_tr(8,k)
2545 end do
2546 end do
2547 end do
2548 end do
2549 return
2550 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p7
2551
2552!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=7
2553!!
2554!OCL SERIAL
2555 subroutine element_operation_kernel_matvec_modalfilter_p7( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
2556 vec_out )
2557 implicit none
2558 real(rp), intent(in) :: mat_h1d(8,8)
2559 real(rp), intent(in) :: mat_h1d_tr(8,8)
2560 real(rp), intent(in) :: mat_v1d_tr(8,8)
2561 real(rp), intent(in) :: vec_in(8,8,8)
2562 real(rp), intent(out) :: vec_work(8,8,8)
2563 real(rp), intent(out) :: vec_out(8,8,8)
2564
2565 integer :: i, j, k
2566 !----------------------------------------------------------
2567
2568 ! X-dir
2569
2570 do k=1, 8
2571 do j=1, 8
2572 do i=1, 8
2573 vec_out(i,j,k) = mat_h1d(i,1) * vec_in(1,j,k) &
2574 + mat_h1d(i,2) * vec_in(2,j,k) &
2575 + mat_h1d(i,3) * vec_in(3,j,k) &
2576 + mat_h1d(i,4) * vec_in(4,j,k) &
2577 + mat_h1d(i,5) * vec_in(5,j,k) &
2578 + mat_h1d(i,6) * vec_in(6,j,k) &
2579 + mat_h1d(i,7) * vec_in(7,j,k) &
2580 + mat_h1d(i,8) * vec_in(8,j,k)
2581 end do
2582 end do
2583 end do
2584
2585 ! Y-dir
2586 do k=1, 8
2587 do j=1, 8
2588 do i=1, 8
2589 vec_work(i,j,k) = vec_out(i,1,k) * mat_h1d_tr(1,j) &
2590 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
2591 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
2592 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
2593 + vec_out(i,5,k) * mat_h1d_tr(5,j) &
2594 + vec_out(i,6,k) * mat_h1d_tr(6,j) &
2595 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
2596 + vec_out(i,8,k) * mat_h1d_tr(8,j)
2597 end do
2598 end do
2599 end do
2600
2601 ! Z-dir
2602 do k=1, 8
2603 do j=1, 8
2604 do i=1, 8
2605 vec_out(i,j,k) = vec_work(i,j,1) * mat_v1d_tr(1,k) &
2606 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
2607 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
2608 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
2609 + vec_work(i,j,5) * mat_v1d_tr(5,k) &
2610 + vec_work(i,j,6) * mat_v1d_tr(6,k) &
2611 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
2612 + vec_work(i,j,8) * mat_v1d_tr(8,k)
2613 end do
2614 end do
2615 end do
2616
2617 return
2619
2620!--- For p=8 ------------------------------------
2621
2622!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=8
2623!!
2624!OCL SERIAL
2625 subroutine element_operation_kernel_matvec_dirx_p8( Mat_x, vec_in, vec_out )
2626 implicit none
2627 real(rp), intent(in) :: mat_x(9,9)
2628 real(rp), intent(in) :: vec_in(9,9**2)
2629 real(rp), intent(out) :: vec_out(9,9**2)
2630
2631 integer :: i, jk
2632 !----------------------------------------------------------
2633
2634 do jk=1, 9**2
2635 do i=1, 9
2636 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
2637 + mat_x(i,2) * vec_in(2,jk) &
2638 + mat_x(i,3) * vec_in(3,jk) &
2639 + mat_x(i,4) * vec_in(4,jk) &
2640 + mat_x(i,5) * vec_in(5,jk) &
2641 + mat_x(i,6) * vec_in(6,jk) &
2642 + mat_x(i,7) * vec_in(7,jk) &
2643 + mat_x(i,8) * vec_in(8,jk) &
2644 + mat_x(i,9) * vec_in(9,jk)
2645 end do
2646 end do
2647
2648 return
2650
2651!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=8
2652!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
2653!!
2654!OCL SERIAL
2655 subroutine element_operation_kernel_matvec_diry_p8( Mat_y_tr, vec_in, vec_out )
2656 implicit none
2657 real(rp), intent(in) :: mat_y_tr(9,9)
2658 real(rp), intent(in) :: vec_in(9,9,9)
2659 real(rp), intent(out) :: vec_out(9,9,9)
2660
2661 integer :: i, j, k
2662 !----------------------------------------------------------
2663
2664 do k=1, 9
2665 do j=1, 9
2666 do i=1, 9
2667 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
2668 + vec_in(i,2,k) * mat_y_tr(2,j) &
2669 + vec_in(i,3,k) * mat_y_tr(3,j) &
2670 + vec_in(i,4,k) * mat_y_tr(4,j) &
2671 + vec_in(i,5,k) * mat_y_tr(5,j) &
2672 + vec_in(i,6,k) * mat_y_tr(6,j) &
2673 + vec_in(i,7,k) * mat_y_tr(7,j) &
2674 + vec_in(i,8,k) * mat_y_tr(8,j) &
2675 + vec_in(i,9,k) * mat_y_tr(9,j)
2676 end do
2677 end do
2678 end do
2679
2680 return
2682
2683!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=8
2684!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
2685!!
2686!OCL SERIAL
2687 subroutine element_operation_kernel_matvec_dirz_p8( Mat_z_tr, vec_in, vec_out )
2688 implicit none
2689 real(rp), intent(in) :: mat_z_tr(9,9)
2690 real(rp), intent(in) :: vec_in(9,9,9)
2691 real(rp), intent(out) :: vec_out(9,9,9)
2692
2693 integer :: i, j, k
2694 !----------------------------------------------------------
2695
2696 do k=1, 9
2697 do j=1, 9
2698 do i=1, 9
2699 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
2700 + vec_in(i,j,2) * mat_z_tr(2,k) &
2701 + vec_in(i,j,3) * mat_z_tr(3,k) &
2702 + vec_in(i,j,4) * mat_z_tr(4,k) &
2703 + vec_in(i,j,5) * mat_z_tr(5,k) &
2704 + vec_in(i,j,6) * mat_z_tr(6,k) &
2705 + vec_in(i,j,7) * mat_z_tr(7,k) &
2706 + vec_in(i,j,8) * mat_z_tr(8,k) &
2707 + vec_in(i,j,9) * mat_z_tr(9,k)
2708 end do
2709 end do
2710 end do
2711
2712 return
2714
2715!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=8
2716!!
2717!OCL SERIAL
2718 subroutine element_operation_kernel_matvec_lift_hexahedral_p8( Lift, vec_in, vec_out )
2719 implicit none
2720 real(rp), intent(in) :: lift(9,9,9,6)
2721 real(rp), intent(in) :: vec_in(9,9,6)
2722 real(rp), intent(out) :: vec_out(9,9,9)
2723
2724 integer :: i, j, k
2725 !----------------------------------------------------------
2726
2727 do k=1, 9
2728 do j=1, 9
2729 do i=1, 9
2730 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
2731 + lift(i,j,k,2) * vec_in(j,k,2) &
2732 + lift(i,j,k,3) * vec_in(i,k,3) &
2733 + lift(i,j,k,4) * vec_in(j,k,4) &
2734 + lift(i,j,k,5) * vec_in(i,j,5) &
2735 + lift(i,j,k,6) * vec_in(i,j,6)
2736 end do
2737 end do
2738 end do
2739
2740 return
2742
2743!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=8
2744!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
2745!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
2746!!
2747!OCL SERIAL
2748 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p8( Mat, Mat_tr, vec_in, vec_in_, &
2749 vec_out_x, vec_out_y, vec_out_z )
2750 implicit none
2751 real(rp), intent(in) :: mat(9,9)
2752 real(rp), intent(in) :: mat_tr(9,9)
2753 real(rp), intent(in) :: vec_in_(9,9**2)
2754 real(rp), intent(in) :: vec_in(9,9,9)
2755 real(rp), intent(out) :: vec_out_x(9,9**2)
2756 real(rp), intent(out) :: vec_out_y(9,9,9)
2757 real(rp), intent(out) :: vec_out_z(9,9,9)
2758
2759 integer :: i, j, k, jk
2760 !----------------------------------------------------------
2761
2762 ! X-dir
2763
2764 do jk=1, 9**2
2765 do i=1, 9
2766 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
2767 + mat(i,2) * vec_in_(2,jk) &
2768 + mat(i,3) * vec_in_(3,jk) &
2769 + mat(i,4) * vec_in_(4,jk) &
2770 + mat(i,5) * vec_in_(5,jk) &
2771 + mat(i,6) * vec_in_(6,jk) &
2772 + mat(i,7) * vec_in_(7,jk) &
2773 + mat(i,8) * vec_in_(8,jk) &
2774 + mat(i,9) * vec_in_(9,jk)
2775 end do
2776 end do
2777
2778 ! Y-dir
2779 do k=1, 9
2780 do j=1, 9
2781 do i=1, 9
2782 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
2783 + vec_in(i,2,k) * mat_tr(2,j) &
2784 + vec_in(i,3,k) * mat_tr(3,j) &
2785 + vec_in(i,4,k) * mat_tr(4,j) &
2786 + vec_in(i,5,k) * mat_tr(5,j) &
2787 + vec_in(i,6,k) * mat_tr(6,j) &
2788 + vec_in(i,7,k) * mat_tr(7,j) &
2789 + vec_in(i,8,k) * mat_tr(8,j) &
2790 + vec_in(i,9,k) * mat_tr(9,j)
2791 end do
2792 end do
2793 end do
2794
2795 ! Z-dir
2796 do k=1, 9
2797 do j=1, 9
2798 do i=1, 9
2799 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
2800 + vec_in(i,j,2) * mat_tr(2,k) &
2801 + vec_in(i,j,3) * mat_tr(3,k) &
2802 + vec_in(i,j,4) * mat_tr(4,k) &
2803 + vec_in(i,j,5) * mat_tr(5,k) &
2804 + vec_in(i,j,6) * mat_tr(6,k) &
2805 + vec_in(i,j,7) * mat_tr(7,k) &
2806 + vec_in(i,j,8) * mat_tr(8,k) &
2807 + vec_in(i,j,9) * mat_tr(9,k)
2808 end do
2809 end do
2810 end do
2811
2812 return
2814
2815!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=8
2816!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
2817!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
2818!!
2819!OCL SERIAL
2821 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2822 vec_out_x, vec_out_y, vec_out_z )
2823 implicit none
2824 real(rp), intent(in) :: mat(9,9)
2825 real(rp), intent(in) :: mat_tr(9,9)
2826 real(rp), intent(in) :: vec_in_x(9,9**2)
2827 real(rp), intent(in) :: vec_in_y(9,9,9)
2828 real(rp), intent(in) :: vec_in_z(9,9,9)
2829 real(rp), intent(out) :: vec_out_x(9,9**2)
2830 real(rp), intent(out) :: vec_out_y(9,9**2)
2831 real(rp), intent(out) :: vec_out_z(9,9**2)
2832
2833 integer :: i, j, k, jk
2834 real(rp) :: tmp1, tmp2, tmp3
2835 !----------------------------------------------------------
2836
2837 ! X-dir
2838
2839 do jk=1, 9**2
2840 do i=1, 9
2841 tmp1 = mat(i,1) * vec_in_x(1,jk) &
2842 + mat(i,2) * vec_in_x(2,jk) &
2843 + mat(i,3) * vec_in_x(3,jk)
2844 tmp2 = mat(i,4) * vec_in_x(4,jk) &
2845 + mat(i,5) * vec_in_x(5,jk) &
2846 + mat(i,6) * vec_in_x(6,jk)
2847 tmp3 = mat(i,7) * vec_in_x(7,jk) &
2848 + mat(i,8) * vec_in_x(8,jk) &
2849 + mat(i,9) * vec_in_x(9,jk)
2850 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
2851 end do
2852 end do
2853
2854 ! Y-dir
2855 do k=1, 9
2856 do j=1, 9
2857 jk = j + (k-1)*9
2858 do i=1, 9
2859 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
2860 + vec_in_y(i,2,k) * mat_tr(2,j) &
2861 + vec_in_y(i,3,k) * mat_tr(3,j)
2862 tmp2 = vec_in_y(i,4,k) * mat_tr(4,j) &
2863 + vec_in_y(i,5,k) * mat_tr(5,j) &
2864 + vec_in_y(i,6,k) * mat_tr(6,j)
2865 tmp3 = vec_in_y(i,7,k) * mat_tr(7,j) &
2866 + vec_in_y(i,8,k) * mat_tr(8,j) &
2867 + vec_in_y(i,9,k) * mat_tr(9,j)
2868 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
2869 end do
2870 end do
2871 end do
2872
2873 ! Z-dir
2874 do k=1, 9
2875 do j=1, 9
2876 jk = j + (k-1)*9
2877 do i=1, 9
2878 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
2879 + vec_in_z(i,j,2) * mat_tr(2,k) &
2880 + vec_in_z(i,j,3) * mat_tr(3,k)
2881 tmp2 = vec_in_z(i,j,4) * mat_tr(4,k) &
2882 + vec_in_z(i,j,5) * mat_tr(5,k) &
2883 + vec_in_z(i,j,6) * mat_tr(6,k)
2884 tmp3 = vec_in_z(i,j,7) * mat_tr(7,k) &
2885 + vec_in_z(i,j,8) * mat_tr(8,k) &
2886 + vec_in_z(i,j,9) * mat_tr(9,k)
2887 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
2888 end do
2889 end do
2890 end do
2891 return
2893
2894!OCL SERIAL
2895 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p8( &
2896 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
2897 vec_out_x, vec_out_y, vec_out_z )
2898 implicit none
2899 real(rp), intent(in) :: mat(9,9)
2900 real(rp), intent(in) :: mat_tr(9,9)
2901 real(rp), intent(in) :: vec_in_x(9,9**2*5)
2902 real(rp), intent(in) :: vec_in_y(9,9,9*5)
2903 real(rp), intent(in) :: vec_in_z(9,9,9,5)
2904 real(rp), intent(out) :: vec_out_x(9,9**2*5)
2905 real(rp), intent(out) :: vec_out_y(9,9**2*5)
2906 real(rp), intent(out) :: vec_out_z(9,9**2,5)
2907
2908 integer :: i, j, k, jkv, jk, v, kv
2909 real(rp) :: tmp1, tmp2, tmp3
2910 !----------------------------------------------------------
2911
2912 ! X-dir
2913
2914 do jkv=1, 9**2*5
2915 do i=1, 9
2916 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
2917 + mat(i,2) * vec_in_x(2,jkv) &
2918 + mat(i,3) * vec_in_x(3,jkv)
2919 tmp2 = mat(i,4) * vec_in_x(4,jkv) &
2920 + mat(i,5) * vec_in_x(5,jkv) &
2921 + mat(i,6) * vec_in_x(6,jkv)
2922 tmp3 = mat(i,7) * vec_in_x(7,jkv) &
2923 + mat(i,8) * vec_in_x(8,jkv) &
2924 + mat(i,9) * vec_in_x(9,jkv)
2925 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
2926 end do
2927 end do
2928
2929 ! Y-dir
2930 do kv=1, 9*5
2931 do j=1, 9
2932 jkv = j + (kv-1)*45
2933 do i=1, 9
2934 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
2935 + vec_in_y(i,2,kv) * mat_tr(2,j) &
2936 + vec_in_y(i,3,kv) * mat_tr(3,j)
2937 tmp2 = vec_in_y(i,4,kv) * mat_tr(4,j) &
2938 + vec_in_y(i,5,kv) * mat_tr(5,j) &
2939 + vec_in_y(i,6,kv) * mat_tr(6,j)
2940 tmp3 = vec_in_y(i,7,kv) * mat_tr(7,j) &
2941 + vec_in_y(i,8,kv) * mat_tr(8,j) &
2942 + vec_in_y(i,9,kv) * mat_tr(9,j)
2943 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
2944 end do
2945 end do
2946 end do
2947
2948 ! Z-dir
2949 do v=1, 5
2950 do k=1, 9
2951 do j=1, 9
2952 jk = j + (k-1)*9
2953 do i=1, 9
2954 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
2955 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
2956 + vec_in_z(i,j,3,v) * mat_tr(3,k)
2957 tmp2 = vec_in_z(i,j,4,v) * mat_tr(4,k) &
2958 + vec_in_z(i,j,5,v) * mat_tr(5,k) &
2959 + vec_in_z(i,j,6,v) * mat_tr(6,k)
2960 tmp3 = vec_in_z(i,j,7,v) * mat_tr(7,k) &
2961 + vec_in_z(i,j,8,v) * mat_tr(8,k) &
2962 + vec_in_z(i,j,9,v) * mat_tr(9,k)
2963 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
2964 end do
2965 end do
2966 end do
2967 end do
2968 return
2969 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p8
2970
2971!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=8
2972!!
2973!OCL SERIAL
2974 subroutine element_operation_kernel_matvec_modalfilter_p8( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
2975 vec_out )
2976 implicit none
2977 real(rp), intent(in) :: mat_h1d(9,9)
2978 real(rp), intent(in) :: mat_h1d_tr(9,9)
2979 real(rp), intent(in) :: mat_v1d_tr(9,9)
2980 real(rp), intent(in) :: vec_in(9,9,9)
2981 real(rp), intent(out) :: vec_work(9,9,9)
2982 real(rp), intent(out) :: vec_out(9,9,9)
2983
2984 integer :: i, j, k
2985 real(rp) :: tmp1, tmp2, tmp3
2986 !----------------------------------------------------------
2987
2988 ! X-dir
2989
2990 do k=1, 9
2991 do j=1, 9
2992 do i=1, 9
2993 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
2994 + mat_h1d(i,2) * vec_in(2,j,k) &
2995 + mat_h1d(i,3) * vec_in(3,j,k)
2996 tmp2 = mat_h1d(i,4) * vec_in(4,j,k) &
2997 + mat_h1d(i,5) * vec_in(5,j,k) &
2998 + mat_h1d(i,6) * vec_in(6,j,k)
2999 tmp3 = mat_h1d(i,7) * vec_in(7,j,k) &
3000 + mat_h1d(i,8) * vec_in(8,j,k) &
3001 + mat_h1d(i,9) * vec_in(9,j,k)
3002 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3003 end do
3004 end do
3005 end do
3006
3007 ! Y-dir
3008 do k=1, 9
3009 do j=1, 9
3010 do i=1, 9
3011 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
3012 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
3013 + vec_out(i,3,k) * mat_h1d_tr(3,j)
3014 tmp2 = vec_out(i,4,k) * mat_h1d_tr(4,j) &
3015 + vec_out(i,5,k) * mat_h1d_tr(5,j) &
3016 + vec_out(i,6,k) * mat_h1d_tr(6,j)
3017 tmp3 = vec_out(i,7,k) * mat_h1d_tr(7,j) &
3018 + vec_out(i,8,k) * mat_h1d_tr(8,j) &
3019 + vec_out(i,9,k) * mat_h1d_tr(9,j)
3020 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
3021 end do
3022 end do
3023 end do
3024
3025 ! Z-dir
3026 do k=1, 9
3027 do j=1, 9
3028 do i=1, 9
3029 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
3030 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
3031 + vec_work(i,j,3) * mat_v1d_tr(3,k)
3032 tmp2 = vec_work(i,j,4) * mat_v1d_tr(4,k) &
3033 + vec_work(i,j,5) * mat_v1d_tr(5,k) &
3034 + vec_work(i,j,6) * mat_v1d_tr(6,k)
3035 tmp3 = vec_work(i,j,7) * mat_v1d_tr(7,k) &
3036 + vec_work(i,j,8) * mat_v1d_tr(8,k) &
3037 + vec_work(i,j,9) * mat_v1d_tr(9,k)
3038 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3039 end do
3040 end do
3041 end do
3042
3043 return
3045
3046!--- For p=9 ------------------------------------
3047
3048!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=9
3049!!
3050!OCL SERIAL
3051 subroutine element_operation_kernel_matvec_dirx_p9( Mat_x, vec_in, vec_out )
3052 implicit none
3053 real(rp), intent(in) :: mat_x(10,10)
3054 real(rp), intent(in) :: vec_in(10,10**2)
3055 real(rp), intent(out) :: vec_out(10,10**2)
3056
3057 integer :: i, jk
3058 !----------------------------------------------------------
3059
3060 do jk=1, 10**2
3061 do i=1, 10
3062 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
3063 + mat_x(i,2) * vec_in(2,jk) &
3064 + mat_x(i,3) * vec_in(3,jk) &
3065 + mat_x(i,4) * vec_in(4,jk) &
3066 + mat_x(i,5) * vec_in(5,jk) &
3067 + mat_x(i,6) * vec_in(6,jk) &
3068 + mat_x(i,7) * vec_in(7,jk) &
3069 + mat_x(i,8) * vec_in(8,jk) &
3070 + mat_x(i,9) * vec_in(9,jk) &
3071 + mat_x(i,10) * vec_in(10,jk)
3072 end do
3073 end do
3074
3075 return
3077
3078!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=9
3079!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
3080!!
3081!OCL SERIAL
3082 subroutine element_operation_kernel_matvec_diry_p9( Mat_y_tr, vec_in, vec_out )
3083 implicit none
3084 real(rp), intent(in) :: mat_y_tr(10,10)
3085 real(rp), intent(in) :: vec_in(10,10,10)
3086 real(rp), intent(out) :: vec_out(10,10,10)
3087
3088 integer :: i, j, k
3089 !----------------------------------------------------------
3090
3091 do k=1, 10
3092 do j=1, 10
3093 do i=1, 10
3094 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
3095 + vec_in(i,2,k) * mat_y_tr(2,j) &
3096 + vec_in(i,3,k) * mat_y_tr(3,j) &
3097 + vec_in(i,4,k) * mat_y_tr(4,j) &
3098 + vec_in(i,5,k) * mat_y_tr(5,j) &
3099 + vec_in(i,6,k) * mat_y_tr(6,j) &
3100 + vec_in(i,7,k) * mat_y_tr(7,j) &
3101 + vec_in(i,8,k) * mat_y_tr(8,j) &
3102 + vec_in(i,9,k) * mat_y_tr(9,j) &
3103 + vec_in(i,10,k) * mat_y_tr(10,j)
3104 end do
3105 end do
3106 end do
3107
3108 return
3110
3111!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=9
3112!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
3113!!
3114!OCL SERIAL
3115 subroutine element_operation_kernel_matvec_dirz_p9( Mat_z_tr, vec_in, vec_out )
3116 implicit none
3117 real(rp), intent(in) :: mat_z_tr(10,10)
3118 real(rp), intent(in) :: vec_in(10,10,10)
3119 real(rp), intent(out) :: vec_out(10,10,10)
3120
3121 integer :: i, j, k
3122 !----------------------------------------------------------
3123
3124 do k=1, 10
3125 do j=1, 10
3126 do i=1, 10
3127 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
3128 + vec_in(i,j,2) * mat_z_tr(2,k) &
3129 + vec_in(i,j,3) * mat_z_tr(3,k) &
3130 + vec_in(i,j,4) * mat_z_tr(4,k) &
3131 + vec_in(i,j,5) * mat_z_tr(5,k) &
3132 + vec_in(i,j,6) * mat_z_tr(6,k) &
3133 + vec_in(i,j,7) * mat_z_tr(7,k) &
3134 + vec_in(i,j,8) * mat_z_tr(8,k) &
3135 + vec_in(i,j,9) * mat_z_tr(9,k) &
3136 + vec_in(i,j,10) * mat_z_tr(10,k)
3137 end do
3138 end do
3139 end do
3140
3141 return
3143
3144!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=9
3145!!
3146!OCL SERIAL
3147 subroutine element_operation_kernel_matvec_lift_hexahedral_p9( Lift, vec_in, vec_out )
3148 implicit none
3149 real(rp), intent(in) :: lift(10,10,10,6)
3150 real(rp), intent(in) :: vec_in(10,10,6)
3151 real(rp), intent(out) :: vec_out(10,10,10)
3152
3153 integer :: i, j, k
3154 !----------------------------------------------------------
3155
3156 do k=1, 10
3157 do j=1, 10
3158 do i=1, 10
3159 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
3160 + lift(i,j,k,2) * vec_in(j,k,2) &
3161 + lift(i,j,k,3) * vec_in(i,k,3) &
3162 + lift(i,j,k,4) * vec_in(j,k,4) &
3163 + lift(i,j,k,5) * vec_in(i,j,5) &
3164 + lift(i,j,k,6) * vec_in(i,j,6)
3165 end do
3166 end do
3167 end do
3168
3169 return
3171
3172!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=9
3173!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
3174!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
3175!!
3176!OCL SERIAL
3177 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p9( Mat, Mat_tr, vec_in, vec_in_, &
3178 vec_out_x, vec_out_y, vec_out_z )
3179 implicit none
3180 real(rp), intent(in) :: mat(10,10)
3181 real(rp), intent(in) :: mat_tr(10,10)
3182 real(rp), intent(in) :: vec_in_(10,10**2)
3183 real(rp), intent(in) :: vec_in(10,10,10)
3184 real(rp), intent(out) :: vec_out_x(10,10**2)
3185 real(rp), intent(out) :: vec_out_y(10,10,10)
3186 real(rp), intent(out) :: vec_out_z(10,10,10)
3187
3188 integer :: i, j, k, jk
3189 !----------------------------------------------------------
3190
3191 ! X-dir
3192
3193 do jk=1, 10**2
3194 do i=1, 10
3195 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
3196 + mat(i,2) * vec_in_(2,jk) &
3197 + mat(i,3) * vec_in_(3,jk) &
3198 + mat(i,4) * vec_in_(4,jk) &
3199 + mat(i,5) * vec_in_(5,jk) &
3200 + mat(i,6) * vec_in_(6,jk) &
3201 + mat(i,7) * vec_in_(7,jk) &
3202 + mat(i,8) * vec_in_(8,jk) &
3203 + mat(i,9) * vec_in_(9,jk) &
3204 + mat(i,10) * vec_in_(10,jk)
3205 end do
3206 end do
3207
3208 ! Y-dir
3209 do k=1, 10
3210 do j=1, 10
3211 do i=1, 10
3212 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
3213 + vec_in(i,2,k) * mat_tr(2,j) &
3214 + vec_in(i,3,k) * mat_tr(3,j) &
3215 + vec_in(i,4,k) * mat_tr(4,j) &
3216 + vec_in(i,5,k) * mat_tr(5,j) &
3217 + vec_in(i,6,k) * mat_tr(6,j) &
3218 + vec_in(i,7,k) * mat_tr(7,j) &
3219 + vec_in(i,8,k) * mat_tr(8,j) &
3220 + vec_in(i,9,k) * mat_tr(9,j) &
3221 + vec_in(i,10,k) * mat_tr(10,j)
3222 end do
3223 end do
3224 end do
3225
3226 ! Z-dir
3227 do k=1, 10
3228 do j=1, 10
3229 do i=1, 10
3230 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
3231 + vec_in(i,j,2) * mat_tr(2,k) &
3232 + vec_in(i,j,3) * mat_tr(3,k) &
3233 + vec_in(i,j,4) * mat_tr(4,k) &
3234 + vec_in(i,j,5) * mat_tr(5,k) &
3235 + vec_in(i,j,6) * mat_tr(6,k) &
3236 + vec_in(i,j,7) * mat_tr(7,k) &
3237 + vec_in(i,j,8) * mat_tr(8,k) &
3238 + vec_in(i,j,9) * mat_tr(9,k) &
3239 + vec_in(i,j,10) * mat_tr(10,k)
3240 end do
3241 end do
3242 end do
3243
3244 return
3246
3247!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=9
3248!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
3249!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
3250!!
3251!OCL SERIAL
3253 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
3254 vec_out_x, vec_out_y, vec_out_z )
3255 implicit none
3256 real(rp), intent(in) :: mat(10,10)
3257 real(rp), intent(in) :: mat_tr(10,10)
3258 real(rp), intent(in) :: vec_in_x(10,10**2)
3259 real(rp), intent(in) :: vec_in_y(10,10,10)
3260 real(rp), intent(in) :: vec_in_z(10,10,10)
3261 real(rp), intent(out) :: vec_out_x(10,10**2)
3262 real(rp), intent(out) :: vec_out_y(10,10**2)
3263 real(rp), intent(out) :: vec_out_z(10,10**2)
3264
3265 integer :: i, j, k, jk
3266 real(rp) :: tmp1, tmp2, tmp3
3267 !----------------------------------------------------------
3268
3269 ! X-dir
3270
3271 do jk=1, 10**2
3272 do i=1, 10
3273 tmp1 = mat(i,1) * vec_in_x(1,jk) &
3274 + mat(i,2) * vec_in_x(2,jk) &
3275 + mat(i,3) * vec_in_x(3,jk)
3276 tmp2 = mat(i,4) * vec_in_x(4,jk) &
3277 + mat(i,5) * vec_in_x(5,jk) &
3278 + mat(i,6) * vec_in_x(6,jk)
3279 tmp3 = mat(i,7) * vec_in_x(7,jk) &
3280 + mat(i,8) * vec_in_x(8,jk) &
3281 + mat(i,9) * vec_in_x(9,jk) &
3282 + mat(i,10) * vec_in_x(10,jk)
3283 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
3284 end do
3285 end do
3286
3287 ! Y-dir
3288 do k=1, 10
3289 do j=1, 10
3290 jk = j + (k-1)*10
3291 do i=1, 10
3292 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
3293 + vec_in_y(i,2,k) * mat_tr(2,j) &
3294 + vec_in_y(i,3,k) * mat_tr(3,j)
3295 tmp2 = vec_in_y(i,4,k) * mat_tr(4,j) &
3296 + vec_in_y(i,5,k) * mat_tr(5,j) &
3297 + vec_in_y(i,6,k) * mat_tr(6,j)
3298 tmp3 = vec_in_y(i,7,k) * mat_tr(7,j) &
3299 + vec_in_y(i,8,k) * mat_tr(8,j) &
3300 + vec_in_y(i,9,k) * mat_tr(9,j) &
3301 + vec_in_y(i,10,k) * mat_tr(10,j)
3302 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
3303 end do
3304 end do
3305 end do
3306
3307 ! Z-dir
3308 do k=1, 10
3309 do j=1, 10
3310 jk = j + (k-1)*10
3311 do i=1, 10
3312 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
3313 + vec_in_z(i,j,2) * mat_tr(2,k) &
3314 + vec_in_z(i,j,3) * mat_tr(3,k)
3315 tmp2 = vec_in_z(i,j,4) * mat_tr(4,k) &
3316 + vec_in_z(i,j,5) * mat_tr(5,k) &
3317 + vec_in_z(i,j,6) * mat_tr(6,k)
3318 tmp3 = vec_in_z(i,j,7) * mat_tr(7,k) &
3319 + vec_in_z(i,j,8) * mat_tr(8,k) &
3320 + vec_in_z(i,j,9) * mat_tr(9,k) &
3321 + vec_in_z(i,j,10) * mat_tr(10,k)
3322 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
3323 end do
3324 end do
3325 end do
3326 return
3328
3329!OCL SERIAL
3330 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p9( &
3331 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
3332 vec_out_x, vec_out_y, vec_out_z )
3333 implicit none
3334 real(rp), intent(in) :: mat(10,10)
3335 real(rp), intent(in) :: mat_tr(10,10)
3336 real(rp), intent(in) :: vec_in_x(10,10**2*5)
3337 real(rp), intent(in) :: vec_in_y(10,10,10*5)
3338 real(rp), intent(in) :: vec_in_z(10,10,10,5)
3339 real(rp), intent(out) :: vec_out_x(10,10**2*5)
3340 real(rp), intent(out) :: vec_out_y(10,10**2*5)
3341 real(rp), intent(out) :: vec_out_z(10,10**2,5)
3342
3343 integer :: i, j, k, jkv, jk, v, kv
3344 real(rp) :: tmp1, tmp2, tmp3
3345 !----------------------------------------------------------
3346
3347 ! X-dir
3348
3349 do jkv=1, 10**2*5
3350 do i=1, 10
3351 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
3352 + mat(i,2) * vec_in_x(2,jkv) &
3353 + mat(i,3) * vec_in_x(3,jkv)
3354 tmp2 = mat(i,4) * vec_in_x(4,jkv) &
3355 + mat(i,5) * vec_in_x(5,jkv) &
3356 + mat(i,6) * vec_in_x(6,jkv)
3357 tmp3 = mat(i,7) * vec_in_x(7,jkv) &
3358 + mat(i,8) * vec_in_x(8,jkv) &
3359 + mat(i,9) * vec_in_x(9,jkv) &
3360 + mat(i,10) * vec_in_x(10,jkv)
3361 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
3362 end do
3363 end do
3364
3365 ! Y-dir
3366 do kv=1, 10*5
3367 do j=1, 10
3368 jkv = j + (kv-1)*50
3369 do i=1, 10
3370 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
3371 + vec_in_y(i,2,kv) * mat_tr(2,j) &
3372 + vec_in_y(i,3,kv) * mat_tr(3,j)
3373 tmp2 = vec_in_y(i,4,kv) * mat_tr(4,j) &
3374 + vec_in_y(i,5,kv) * mat_tr(5,j) &
3375 + vec_in_y(i,6,kv) * mat_tr(6,j)
3376 tmp3 = vec_in_y(i,7,kv) * mat_tr(7,j) &
3377 + vec_in_y(i,8,kv) * mat_tr(8,j) &
3378 + vec_in_y(i,9,kv) * mat_tr(9,j) &
3379 + vec_in_y(i,10,kv) * mat_tr(10,j)
3380 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
3381 end do
3382 end do
3383 end do
3384
3385 ! Z-dir
3386 do v=1, 5
3387 do k=1, 10
3388 do j=1, 10
3389 jk = j + (k-1)*10
3390 do i=1, 10
3391 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
3392 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
3393 + vec_in_z(i,j,3,v) * mat_tr(3,k)
3394 tmp2 = vec_in_z(i,j,4,v) * mat_tr(4,k) &
3395 + vec_in_z(i,j,5,v) * mat_tr(5,k) &
3396 + vec_in_z(i,j,6,v) * mat_tr(6,k)
3397 tmp3 = vec_in_z(i,j,7,v) * mat_tr(7,k) &
3398 + vec_in_z(i,j,8,v) * mat_tr(8,k) &
3399 + vec_in_z(i,j,9,v) * mat_tr(9,k) &
3400 + vec_in_z(i,j,10,v) * mat_tr(10,k)
3401 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
3402 end do
3403 end do
3404 end do
3405 end do
3406 return
3407 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p9
3408
3409!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=9
3410!!
3411!OCL SERIAL
3412 subroutine element_operation_kernel_matvec_modalfilter_p9( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
3413 vec_out )
3414 implicit none
3415 real(rp), intent(in) :: mat_h1d(10,10)
3416 real(rp), intent(in) :: mat_h1d_tr(10,10)
3417 real(rp), intent(in) :: mat_v1d_tr(10,10)
3418 real(rp), intent(in) :: vec_in(10,10,10)
3419 real(rp), intent(out) :: vec_work(10,10,10)
3420 real(rp), intent(out) :: vec_out(10,10,10)
3421
3422 integer :: i, j, k
3423 real(rp) :: tmp1, tmp2, tmp3
3424 !----------------------------------------------------------
3425
3426 ! X-dir
3427
3428 do k=1, 10
3429 do j=1, 10
3430 do i=1, 10
3431 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
3432 + mat_h1d(i,2) * vec_in(2,j,k) &
3433 + mat_h1d(i,3) * vec_in(3,j,k)
3434 tmp2 = mat_h1d(i,4) * vec_in(4,j,k) &
3435 + mat_h1d(i,5) * vec_in(5,j,k) &
3436 + mat_h1d(i,6) * vec_in(6,j,k)
3437 tmp3 = mat_h1d(i,7) * vec_in(7,j,k) &
3438 + mat_h1d(i,8) * vec_in(8,j,k) &
3439 + mat_h1d(i,9) * vec_in(9,j,k) &
3440 + mat_h1d(i,10) * vec_in(10,j,k)
3441 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3442 end do
3443 end do
3444 end do
3445
3446 ! Y-dir
3447 do k=1, 10
3448 do j=1, 10
3449 do i=1, 10
3450 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
3451 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
3452 + vec_out(i,3,k) * mat_h1d_tr(3,j)
3453 tmp2 = vec_out(i,4,k) * mat_h1d_tr(4,j) &
3454 + vec_out(i,5,k) * mat_h1d_tr(5,j) &
3455 + vec_out(i,6,k) * mat_h1d_tr(6,j)
3456 tmp3 = vec_out(i,7,k) * mat_h1d_tr(7,j) &
3457 + vec_out(i,8,k) * mat_h1d_tr(8,j) &
3458 + vec_out(i,9,k) * mat_h1d_tr(9,j) &
3459 + vec_out(i,10,k) * mat_h1d_tr(10,j)
3460 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
3461 end do
3462 end do
3463 end do
3464
3465 ! Z-dir
3466 do k=1, 10
3467 do j=1, 10
3468 do i=1, 10
3469 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
3470 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
3471 + vec_work(i,j,3) * mat_v1d_tr(3,k)
3472 tmp2 = vec_work(i,j,4) * mat_v1d_tr(4,k) &
3473 + vec_work(i,j,5) * mat_v1d_tr(5,k) &
3474 + vec_work(i,j,6) * mat_v1d_tr(6,k)
3475 tmp3 = vec_work(i,j,7) * mat_v1d_tr(7,k) &
3476 + vec_work(i,j,8) * mat_v1d_tr(8,k) &
3477 + vec_work(i,j,9) * mat_v1d_tr(9,k) &
3478 + vec_work(i,j,10) * mat_v1d_tr(10,k)
3479 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3480 end do
3481 end do
3482 end do
3483
3484 return
3486
3487!--- For p=10 ------------------------------------
3488
3489!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=10
3490!!
3491!OCL SERIAL
3492 subroutine element_operation_kernel_matvec_dirx_p10( Mat_x, vec_in, vec_out )
3493 implicit none
3494 real(rp), intent(in) :: mat_x(11,11)
3495 real(rp), intent(in) :: vec_in(11,11**2)
3496 real(rp), intent(out) :: vec_out(11,11**2)
3497
3498 integer :: i, jk
3499 !----------------------------------------------------------
3500
3501 do jk=1, 11**2
3502 do i=1, 11
3503 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
3504 + mat_x(i,2) * vec_in(2,jk) &
3505 + mat_x(i,3) * vec_in(3,jk) &
3506 + mat_x(i,4) * vec_in(4,jk) &
3507 + mat_x(i,5) * vec_in(5,jk) &
3508 + mat_x(i,6) * vec_in(6,jk) &
3509 + mat_x(i,7) * vec_in(7,jk) &
3510 + mat_x(i,8) * vec_in(8,jk) &
3511 + mat_x(i,9) * vec_in(9,jk) &
3512 + mat_x(i,10) * vec_in(10,jk) &
3513 + mat_x(i,11) * vec_in(11,jk)
3514 end do
3515 end do
3516
3517 return
3519
3520!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=10
3521!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
3522!!
3523!OCL SERIAL
3524 subroutine element_operation_kernel_matvec_diry_p10( Mat_y_tr, vec_in, vec_out )
3525 implicit none
3526 real(rp), intent(in) :: mat_y_tr(11,11)
3527 real(rp), intent(in) :: vec_in(11,11,11)
3528 real(rp), intent(out) :: vec_out(11,11,11)
3529
3530 integer :: i, j, k
3531 !----------------------------------------------------------
3532
3533 do k=1, 11
3534 do j=1, 11
3535 do i=1, 11
3536 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
3537 + vec_in(i,2,k) * mat_y_tr(2,j) &
3538 + vec_in(i,3,k) * mat_y_tr(3,j) &
3539 + vec_in(i,4,k) * mat_y_tr(4,j) &
3540 + vec_in(i,5,k) * mat_y_tr(5,j) &
3541 + vec_in(i,6,k) * mat_y_tr(6,j) &
3542 + vec_in(i,7,k) * mat_y_tr(7,j) &
3543 + vec_in(i,8,k) * mat_y_tr(8,j) &
3544 + vec_in(i,9,k) * mat_y_tr(9,j) &
3545 + vec_in(i,10,k) * mat_y_tr(10,j) &
3546 + vec_in(i,11,k) * mat_y_tr(11,j)
3547 end do
3548 end do
3549 end do
3550
3551 return
3553
3554!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=10
3555!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
3556!!
3557!OCL SERIAL
3558 subroutine element_operation_kernel_matvec_dirz_p10( Mat_z_tr, vec_in, vec_out )
3559 implicit none
3560 real(rp), intent(in) :: mat_z_tr(11,11)
3561 real(rp), intent(in) :: vec_in(11,11,11)
3562 real(rp), intent(out) :: vec_out(11,11,11)
3563
3564 integer :: i, j, k
3565 !----------------------------------------------------------
3566
3567 do k=1, 11
3568 do j=1, 11
3569 do i=1, 11
3570 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
3571 + vec_in(i,j,2) * mat_z_tr(2,k) &
3572 + vec_in(i,j,3) * mat_z_tr(3,k) &
3573 + vec_in(i,j,4) * mat_z_tr(4,k) &
3574 + vec_in(i,j,5) * mat_z_tr(5,k) &
3575 + vec_in(i,j,6) * mat_z_tr(6,k) &
3576 + vec_in(i,j,7) * mat_z_tr(7,k) &
3577 + vec_in(i,j,8) * mat_z_tr(8,k) &
3578 + vec_in(i,j,9) * mat_z_tr(9,k) &
3579 + vec_in(i,j,10) * mat_z_tr(10,k) &
3580 + vec_in(i,j,11) * mat_z_tr(11,k)
3581 end do
3582 end do
3583 end do
3584
3585 return
3587
3588!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=10
3589!!
3590!OCL SERIAL
3592 implicit none
3593 real(rp), intent(in) :: lift(11,11,11,6)
3594 real(rp), intent(in) :: vec_in(11,11,6)
3595 real(rp), intent(out) :: vec_out(11,11,11)
3596
3597 integer :: i, j, k
3598 !----------------------------------------------------------
3599
3600 do k=1, 11
3601 do j=1, 11
3602 do i=1, 11
3603 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
3604 + lift(i,j,k,2) * vec_in(j,k,2) &
3605 + lift(i,j,k,3) * vec_in(i,k,3) &
3606 + lift(i,j,k,4) * vec_in(j,k,4) &
3607 + lift(i,j,k,5) * vec_in(i,j,5) &
3608 + lift(i,j,k,6) * vec_in(i,j,6)
3609 end do
3610 end do
3611 end do
3612
3613 return
3615
3616!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=10
3617!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
3618!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
3619!!
3620!OCL SERIAL
3621 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p10( Mat, Mat_tr, vec_in, vec_in_, &
3622 vec_out_x, vec_out_y, vec_out_z )
3623 implicit none
3624 real(rp), intent(in) :: mat(11,11)
3625 real(rp), intent(in) :: mat_tr(11,11)
3626 real(rp), intent(in) :: vec_in_(11,11**2)
3627 real(rp), intent(in) :: vec_in(11,11,11)
3628 real(rp), intent(out) :: vec_out_x(11,11**2)
3629 real(rp), intent(out) :: vec_out_y(11,11,11)
3630 real(rp), intent(out) :: vec_out_z(11,11,11)
3631
3632 integer :: i, j, k, jk
3633 !----------------------------------------------------------
3634
3635 ! X-dir
3636
3637 do jk=1, 11**2
3638 do i=1, 11
3639 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
3640 + mat(i,2) * vec_in_(2,jk) &
3641 + mat(i,3) * vec_in_(3,jk) &
3642 + mat(i,4) * vec_in_(4,jk) &
3643 + mat(i,5) * vec_in_(5,jk) &
3644 + mat(i,6) * vec_in_(6,jk) &
3645 + mat(i,7) * vec_in_(7,jk) &
3646 + mat(i,8) * vec_in_(8,jk) &
3647 + mat(i,9) * vec_in_(9,jk) &
3648 + mat(i,10) * vec_in_(10,jk) &
3649 + mat(i,11) * vec_in_(11,jk)
3650 end do
3651 end do
3652
3653 ! Y-dir
3654 do k=1, 11
3655 do j=1, 11
3656 do i=1, 11
3657 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
3658 + vec_in(i,2,k) * mat_tr(2,j) &
3659 + vec_in(i,3,k) * mat_tr(3,j) &
3660 + vec_in(i,4,k) * mat_tr(4,j) &
3661 + vec_in(i,5,k) * mat_tr(5,j) &
3662 + vec_in(i,6,k) * mat_tr(6,j) &
3663 + vec_in(i,7,k) * mat_tr(7,j) &
3664 + vec_in(i,8,k) * mat_tr(8,j) &
3665 + vec_in(i,9,k) * mat_tr(9,j) &
3666 + vec_in(i,10,k) * mat_tr(10,j) &
3667 + vec_in(i,11,k) * mat_tr(11,j)
3668 end do
3669 end do
3670 end do
3671
3672 ! Z-dir
3673 do k=1, 11
3674 do j=1, 11
3675 do i=1, 11
3676 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
3677 + vec_in(i,j,2) * mat_tr(2,k) &
3678 + vec_in(i,j,3) * mat_tr(3,k) &
3679 + vec_in(i,j,4) * mat_tr(4,k) &
3680 + vec_in(i,j,5) * mat_tr(5,k) &
3681 + vec_in(i,j,6) * mat_tr(6,k) &
3682 + vec_in(i,j,7) * mat_tr(7,k) &
3683 + vec_in(i,j,8) * mat_tr(8,k) &
3684 + vec_in(i,j,9) * mat_tr(9,k) &
3685 + vec_in(i,j,10) * mat_tr(10,k) &
3686 + vec_in(i,j,11) * mat_tr(11,k)
3687 end do
3688 end do
3689 end do
3690
3691 return
3693
3694!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=10
3695!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
3696!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
3697!!
3698!OCL SERIAL
3700 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
3701 vec_out_x, vec_out_y, vec_out_z )
3702 implicit none
3703 real(rp), intent(in) :: mat(11,11)
3704 real(rp), intent(in) :: mat_tr(11,11)
3705 real(rp), intent(in) :: vec_in_x(11,11**2)
3706 real(rp), intent(in) :: vec_in_y(11,11,11)
3707 real(rp), intent(in) :: vec_in_z(11,11,11)
3708 real(rp), intent(out) :: vec_out_x(11,11**2)
3709 real(rp), intent(out) :: vec_out_y(11,11**2)
3710 real(rp), intent(out) :: vec_out_z(11,11**2)
3711
3712 integer :: i, j, k, jk
3713 real(rp) :: tmp1, tmp2, tmp3
3714 !----------------------------------------------------------
3715
3716 ! X-dir
3717
3718 do jk=1, 11**2
3719 do i=1, 11
3720 tmp1 = mat(i,1) * vec_in_x(1,jk) &
3721 + mat(i,2) * vec_in_x(2,jk) &
3722 + mat(i,3) * vec_in_x(3,jk) &
3723 + mat(i,4) * vec_in_x(4,jk)
3724 tmp2 = mat(i,5) * vec_in_x(5,jk) &
3725 + mat(i,6) * vec_in_x(6,jk) &
3726 + mat(i,7) * vec_in_x(7,jk) &
3727 + mat(i,8) * vec_in_x(8,jk)
3728 tmp3 = mat(i,9) * vec_in_x(9,jk) &
3729 + mat(i,10) * vec_in_x(10,jk) &
3730 + mat(i,11) * vec_in_x(11,jk)
3731 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
3732 end do
3733 end do
3734
3735 ! Y-dir
3736 do k=1, 11
3737 do j=1, 11
3738 jk = j + (k-1)*11
3739 do i=1, 11
3740 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
3741 + vec_in_y(i,2,k) * mat_tr(2,j) &
3742 + vec_in_y(i,3,k) * mat_tr(3,j) &
3743 + vec_in_y(i,4,k) * mat_tr(4,j)
3744 tmp2 = vec_in_y(i,5,k) * mat_tr(5,j) &
3745 + vec_in_y(i,6,k) * mat_tr(6,j) &
3746 + vec_in_y(i,7,k) * mat_tr(7,j) &
3747 + vec_in_y(i,8,k) * mat_tr(8,j)
3748 tmp3 = vec_in_y(i,9,k) * mat_tr(9,j) &
3749 + vec_in_y(i,10,k) * mat_tr(10,j) &
3750 + vec_in_y(i,11,k) * mat_tr(11,j)
3751 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
3752 end do
3753 end do
3754 end do
3755
3756 ! Z-dir
3757 do k=1, 11
3758 do j=1, 11
3759 jk = j + (k-1)*11
3760 do i=1, 11
3761 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
3762 + vec_in_z(i,j,2) * mat_tr(2,k) &
3763 + vec_in_z(i,j,3) * mat_tr(3,k) &
3764 + vec_in_z(i,j,4) * mat_tr(4,k)
3765 tmp2 = vec_in_z(i,j,5) * mat_tr(5,k) &
3766 + vec_in_z(i,j,6) * mat_tr(6,k) &
3767 + vec_in_z(i,j,7) * mat_tr(7,k) &
3768 + vec_in_z(i,j,8) * mat_tr(8,k)
3769 tmp3 = vec_in_z(i,j,9) * mat_tr(9,k) &
3770 + vec_in_z(i,j,10) * mat_tr(10,k) &
3771 + vec_in_z(i,j,11) * mat_tr(11,k)
3772 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
3773 end do
3774 end do
3775 end do
3776 return
3778
3779!OCL SERIAL
3780 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p10( &
3781 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
3782 vec_out_x, vec_out_y, vec_out_z )
3783 implicit none
3784 real(rp), intent(in) :: mat(11,11)
3785 real(rp), intent(in) :: mat_tr(11,11)
3786 real(rp), intent(in) :: vec_in_x(11,11**2*5)
3787 real(rp), intent(in) :: vec_in_y(11,11,11*5)
3788 real(rp), intent(in) :: vec_in_z(11,11,11,5)
3789 real(rp), intent(out) :: vec_out_x(11,11**2*5)
3790 real(rp), intent(out) :: vec_out_y(11,11**2*5)
3791 real(rp), intent(out) :: vec_out_z(11,11**2,5)
3792
3793 integer :: i, j, k, jkv, jk, v, kv
3794 real(rp) :: tmp1, tmp2, tmp3
3795 !----------------------------------------------------------
3796
3797 ! X-dir
3798
3799 do jkv=1, 11**2*5
3800 do i=1, 11
3801 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
3802 + mat(i,2) * vec_in_x(2,jkv) &
3803 + mat(i,3) * vec_in_x(3,jkv) &
3804 + mat(i,4) * vec_in_x(4,jkv)
3805 tmp2 = mat(i,5) * vec_in_x(5,jkv) &
3806 + mat(i,6) * vec_in_x(6,jkv) &
3807 + mat(i,7) * vec_in_x(7,jkv) &
3808 + mat(i,8) * vec_in_x(8,jkv)
3809 tmp3 = mat(i,9) * vec_in_x(9,jkv) &
3810 + mat(i,10) * vec_in_x(10,jkv) &
3811 + mat(i,11) * vec_in_x(11,jkv)
3812 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
3813 end do
3814 end do
3815
3816 ! Y-dir
3817 do kv=1, 11*5
3818 do j=1, 11
3819 jkv = j + (kv-1)*55
3820 do i=1, 11
3821 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
3822 + vec_in_y(i,2,kv) * mat_tr(2,j) &
3823 + vec_in_y(i,3,kv) * mat_tr(3,j) &
3824 + vec_in_y(i,4,kv) * mat_tr(4,j)
3825 tmp2 = vec_in_y(i,5,kv) * mat_tr(5,j) &
3826 + vec_in_y(i,6,kv) * mat_tr(6,j) &
3827 + vec_in_y(i,7,kv) * mat_tr(7,j) &
3828 + vec_in_y(i,8,kv) * mat_tr(8,j)
3829 tmp3 = vec_in_y(i,9,kv) * mat_tr(9,j) &
3830 + vec_in_y(i,10,kv) * mat_tr(10,j) &
3831 + vec_in_y(i,11,kv) * mat_tr(11,j)
3832 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
3833 end do
3834 end do
3835 end do
3836
3837 ! Z-dir
3838 do v=1, 5
3839 do k=1, 11
3840 do j=1, 11
3841 jk = j + (k-1)*11
3842 do i=1, 11
3843 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
3844 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
3845 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
3846 + vec_in_z(i,j,4,v) * mat_tr(4,k)
3847 tmp2 = vec_in_z(i,j,5,v) * mat_tr(5,k) &
3848 + vec_in_z(i,j,6,v) * mat_tr(6,k) &
3849 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
3850 + vec_in_z(i,j,8,v) * mat_tr(8,k)
3851 tmp3 = vec_in_z(i,j,9,v) * mat_tr(9,k) &
3852 + vec_in_z(i,j,10,v) * mat_tr(10,k) &
3853 + vec_in_z(i,j,11,v) * mat_tr(11,k)
3854 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
3855 end do
3856 end do
3857 end do
3858 end do
3859 return
3860 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p10
3861
3862!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=10
3863!!
3864!OCL SERIAL
3865 subroutine element_operation_kernel_matvec_modalfilter_p10( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
3866 vec_out )
3867 implicit none
3868 real(rp), intent(in) :: mat_h1d(11,11)
3869 real(rp), intent(in) :: mat_h1d_tr(11,11)
3870 real(rp), intent(in) :: mat_v1d_tr(11,11)
3871 real(rp), intent(in) :: vec_in(11,11,11)
3872 real(rp), intent(out) :: vec_work(11,11,11)
3873 real(rp), intent(out) :: vec_out(11,11,11)
3874
3875 integer :: i, j, k
3876 real(rp) :: tmp1, tmp2, tmp3
3877 !----------------------------------------------------------
3878
3879 ! X-dir
3880
3881 do k=1, 11
3882 do j=1, 11
3883 do i=1, 11
3884 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
3885 + mat_h1d(i,2) * vec_in(2,j,k) &
3886 + mat_h1d(i,3) * vec_in(3,j,k) &
3887 + mat_h1d(i,4) * vec_in(4,j,k)
3888 tmp2 = mat_h1d(i,5) * vec_in(5,j,k) &
3889 + mat_h1d(i,6) * vec_in(6,j,k) &
3890 + mat_h1d(i,7) * vec_in(7,j,k) &
3891 + mat_h1d(i,8) * vec_in(8,j,k)
3892 tmp3 = mat_h1d(i,9) * vec_in(9,j,k) &
3893 + mat_h1d(i,10) * vec_in(10,j,k) &
3894 + mat_h1d(i,11) * vec_in(11,j,k)
3895 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3896 end do
3897 end do
3898 end do
3899
3900 ! Y-dir
3901 do k=1, 11
3902 do j=1, 11
3903 do i=1, 11
3904 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
3905 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
3906 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
3907 + vec_out(i,4,k) * mat_h1d_tr(4,j)
3908 tmp2 = vec_out(i,5,k) * mat_h1d_tr(5,j) &
3909 + vec_out(i,6,k) * mat_h1d_tr(6,j) &
3910 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
3911 + vec_out(i,8,k) * mat_h1d_tr(8,j)
3912 tmp3 = vec_out(i,9,k) * mat_h1d_tr(9,j) &
3913 + vec_out(i,10,k) * mat_h1d_tr(10,j) &
3914 + vec_out(i,11,k) * mat_h1d_tr(11,j)
3915 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
3916 end do
3917 end do
3918 end do
3919
3920 ! Z-dir
3921 do k=1, 11
3922 do j=1, 11
3923 do i=1, 11
3924 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
3925 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
3926 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
3927 + vec_work(i,j,4) * mat_v1d_tr(4,k)
3928 tmp2 = vec_work(i,j,5) * mat_v1d_tr(5,k) &
3929 + vec_work(i,j,6) * mat_v1d_tr(6,k) &
3930 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
3931 + vec_work(i,j,8) * mat_v1d_tr(8,k)
3932 tmp3 = vec_work(i,j,9) * mat_v1d_tr(9,k) &
3933 + vec_work(i,j,10) * mat_v1d_tr(10,k) &
3934 + vec_work(i,j,11) * mat_v1d_tr(11,k)
3935 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
3936 end do
3937 end do
3938 end do
3939
3940 return
3942
3943!--- For p=11 ------------------------------------
3944
3945!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=11
3946!!
3947!OCL SERIAL
3948 subroutine element_operation_kernel_matvec_dirx_p11( Mat_x, vec_in, vec_out )
3949 implicit none
3950 real(rp), intent(in) :: mat_x(12,12)
3951 real(rp), intent(in) :: vec_in(12,12**2)
3952 real(rp), intent(out) :: vec_out(12,12**2)
3953
3954 integer :: i, jk
3955 !----------------------------------------------------------
3956
3957 do jk=1, 12**2
3958 do i=1, 12
3959 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
3960 + mat_x(i,2) * vec_in(2,jk) &
3961 + mat_x(i,3) * vec_in(3,jk) &
3962 + mat_x(i,4) * vec_in(4,jk) &
3963 + mat_x(i,5) * vec_in(5,jk) &
3964 + mat_x(i,6) * vec_in(6,jk) &
3965 + mat_x(i,7) * vec_in(7,jk) &
3966 + mat_x(i,8) * vec_in(8,jk) &
3967 + mat_x(i,9) * vec_in(9,jk) &
3968 + mat_x(i,10) * vec_in(10,jk) &
3969 + mat_x(i,11) * vec_in(11,jk) &
3970 + mat_x(i,12) * vec_in(12,jk)
3971 end do
3972 end do
3973
3974 return
3976
3977!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=11
3978!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
3979!!
3980!OCL SERIAL
3981 subroutine element_operation_kernel_matvec_diry_p11( Mat_y_tr, vec_in, vec_out )
3982 implicit none
3983 real(rp), intent(in) :: mat_y_tr(12,12)
3984 real(rp), intent(in) :: vec_in(12,12,12)
3985 real(rp), intent(out) :: vec_out(12,12,12)
3986
3987 integer :: i, j, k
3988 !----------------------------------------------------------
3989
3990 do k=1, 12
3991 do j=1, 12
3992 do i=1, 12
3993 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
3994 + vec_in(i,2,k) * mat_y_tr(2,j) &
3995 + vec_in(i,3,k) * mat_y_tr(3,j) &
3996 + vec_in(i,4,k) * mat_y_tr(4,j) &
3997 + vec_in(i,5,k) * mat_y_tr(5,j) &
3998 + vec_in(i,6,k) * mat_y_tr(6,j) &
3999 + vec_in(i,7,k) * mat_y_tr(7,j) &
4000 + vec_in(i,8,k) * mat_y_tr(8,j) &
4001 + vec_in(i,9,k) * mat_y_tr(9,j) &
4002 + vec_in(i,10,k) * mat_y_tr(10,j) &
4003 + vec_in(i,11,k) * mat_y_tr(11,j) &
4004 + vec_in(i,12,k) * mat_y_tr(12,j)
4005 end do
4006 end do
4007 end do
4008
4009 return
4011
4012!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=11
4013!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
4014!!
4015!OCL SERIAL
4016 subroutine element_operation_kernel_matvec_dirz_p11( Mat_z_tr, vec_in, vec_out )
4017 implicit none
4018 real(rp), intent(in) :: mat_z_tr(12,12)
4019 real(rp), intent(in) :: vec_in(12,12,12)
4020 real(rp), intent(out) :: vec_out(12,12,12)
4021
4022 integer :: i, j, k
4023 !----------------------------------------------------------
4024
4025 do k=1, 12
4026 do j=1, 12
4027 do i=1, 12
4028 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
4029 + vec_in(i,j,2) * mat_z_tr(2,k) &
4030 + vec_in(i,j,3) * mat_z_tr(3,k) &
4031 + vec_in(i,j,4) * mat_z_tr(4,k) &
4032 + vec_in(i,j,5) * mat_z_tr(5,k) &
4033 + vec_in(i,j,6) * mat_z_tr(6,k) &
4034 + vec_in(i,j,7) * mat_z_tr(7,k) &
4035 + vec_in(i,j,8) * mat_z_tr(8,k) &
4036 + vec_in(i,j,9) * mat_z_tr(9,k) &
4037 + vec_in(i,j,10) * mat_z_tr(10,k) &
4038 + vec_in(i,j,11) * mat_z_tr(11,k) &
4039 + vec_in(i,j,12) * mat_z_tr(12,k)
4040 end do
4041 end do
4042 end do
4043
4044 return
4046
4047!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=11
4048!!
4049!OCL SERIAL
4051 implicit none
4052 real(rp), intent(in) :: lift(12,12,12,6)
4053 real(rp), intent(in) :: vec_in(12,12,6)
4054 real(rp), intent(out) :: vec_out(12,12,12)
4055
4056 integer :: i, j, k
4057 !----------------------------------------------------------
4058
4059 do k=1, 12
4060 do j=1, 12
4061 do i=1, 12
4062 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
4063 + lift(i,j,k,2) * vec_in(j,k,2) &
4064 + lift(i,j,k,3) * vec_in(i,k,3) &
4065 + lift(i,j,k,4) * vec_in(j,k,4) &
4066 + lift(i,j,k,5) * vec_in(i,j,5) &
4067 + lift(i,j,k,6) * vec_in(i,j,6)
4068 end do
4069 end do
4070 end do
4071
4072 return
4074
4075!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=11
4076!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
4077!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
4078!!
4079!OCL SERIAL
4080 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p11( Mat, Mat_tr, vec_in, vec_in_, &
4081 vec_out_x, vec_out_y, vec_out_z )
4082 implicit none
4083 real(rp), intent(in) :: mat(12,12)
4084 real(rp), intent(in) :: mat_tr(12,12)
4085 real(rp), intent(in) :: vec_in_(12,12**2)
4086 real(rp), intent(in) :: vec_in(12,12,12)
4087 real(rp), intent(out) :: vec_out_x(12,12**2)
4088 real(rp), intent(out) :: vec_out_y(12,12,12)
4089 real(rp), intent(out) :: vec_out_z(12,12,12)
4090
4091 integer :: i, j, k, jk
4092 !----------------------------------------------------------
4093
4094 ! X-dir
4095
4096 do jk=1, 12**2
4097 do i=1, 12
4098 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
4099 + mat(i,2) * vec_in_(2,jk) &
4100 + mat(i,3) * vec_in_(3,jk) &
4101 + mat(i,4) * vec_in_(4,jk) &
4102 + mat(i,5) * vec_in_(5,jk) &
4103 + mat(i,6) * vec_in_(6,jk) &
4104 + mat(i,7) * vec_in_(7,jk) &
4105 + mat(i,8) * vec_in_(8,jk) &
4106 + mat(i,9) * vec_in_(9,jk) &
4107 + mat(i,10) * vec_in_(10,jk) &
4108 + mat(i,11) * vec_in_(11,jk) &
4109 + mat(i,12) * vec_in_(12,jk)
4110 end do
4111 end do
4112
4113 ! Y-dir
4114 do k=1, 12
4115 do j=1, 12
4116 do i=1, 12
4117 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
4118 + vec_in(i,2,k) * mat_tr(2,j) &
4119 + vec_in(i,3,k) * mat_tr(3,j) &
4120 + vec_in(i,4,k) * mat_tr(4,j) &
4121 + vec_in(i,5,k) * mat_tr(5,j) &
4122 + vec_in(i,6,k) * mat_tr(6,j) &
4123 + vec_in(i,7,k) * mat_tr(7,j) &
4124 + vec_in(i,8,k) * mat_tr(8,j) &
4125 + vec_in(i,9,k) * mat_tr(9,j) &
4126 + vec_in(i,10,k) * mat_tr(10,j) &
4127 + vec_in(i,11,k) * mat_tr(11,j) &
4128 + vec_in(i,12,k) * mat_tr(12,j)
4129 end do
4130 end do
4131 end do
4132
4133 ! Z-dir
4134 do k=1, 12
4135 do j=1, 12
4136 do i=1, 12
4137 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
4138 + vec_in(i,j,2) * mat_tr(2,k) &
4139 + vec_in(i,j,3) * mat_tr(3,k) &
4140 + vec_in(i,j,4) * mat_tr(4,k) &
4141 + vec_in(i,j,5) * mat_tr(5,k) &
4142 + vec_in(i,j,6) * mat_tr(6,k) &
4143 + vec_in(i,j,7) * mat_tr(7,k) &
4144 + vec_in(i,j,8) * mat_tr(8,k) &
4145 + vec_in(i,j,9) * mat_tr(9,k) &
4146 + vec_in(i,j,10) * mat_tr(10,k) &
4147 + vec_in(i,j,11) * mat_tr(11,k) &
4148 + vec_in(i,j,12) * mat_tr(12,k)
4149 end do
4150 end do
4151 end do
4152
4153 return
4155
4156!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=11
4157!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
4158!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
4159!!
4160!OCL SERIAL
4162 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
4163 vec_out_x, vec_out_y, vec_out_z )
4164 implicit none
4165 real(rp), intent(in) :: mat(12,12)
4166 real(rp), intent(in) :: mat_tr(12,12)
4167 real(rp), intent(in) :: vec_in_x(12,12**2)
4168 real(rp), intent(in) :: vec_in_y(12,12,12)
4169 real(rp), intent(in) :: vec_in_z(12,12,12)
4170 real(rp), intent(out) :: vec_out_x(12,12**2)
4171 real(rp), intent(out) :: vec_out_y(12,12**2)
4172 real(rp), intent(out) :: vec_out_z(12,12**2)
4173
4174 integer :: i, j, k, jk
4175 real(rp) :: tmp1, tmp2, tmp3
4176 !----------------------------------------------------------
4177
4178 ! X-dir
4179
4180 do jk=1, 12**2
4181 do i=1, 12
4182 tmp1 = mat(i,1) * vec_in_x(1,jk) &
4183 + mat(i,2) * vec_in_x(2,jk) &
4184 + mat(i,3) * vec_in_x(3,jk) &
4185 + mat(i,4) * vec_in_x(4,jk)
4186 tmp2 = mat(i,5) * vec_in_x(5,jk) &
4187 + mat(i,6) * vec_in_x(6,jk) &
4188 + mat(i,7) * vec_in_x(7,jk) &
4189 + mat(i,8) * vec_in_x(8,jk)
4190 tmp3 = mat(i,9) * vec_in_x(9,jk) &
4191 + mat(i,10) * vec_in_x(10,jk) &
4192 + mat(i,11) * vec_in_x(11,jk) &
4193 + mat(i,12) * vec_in_x(12,jk)
4194 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
4195 end do
4196 end do
4197
4198 ! Y-dir
4199 do k=1, 12
4200 do j=1, 12
4201 jk = j + (k-1)*12
4202 do i=1, 12
4203 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
4204 + vec_in_y(i,2,k) * mat_tr(2,j) &
4205 + vec_in_y(i,3,k) * mat_tr(3,j) &
4206 + vec_in_y(i,4,k) * mat_tr(4,j)
4207 tmp2 = vec_in_y(i,5,k) * mat_tr(5,j) &
4208 + vec_in_y(i,6,k) * mat_tr(6,j) &
4209 + vec_in_y(i,7,k) * mat_tr(7,j) &
4210 + vec_in_y(i,8,k) * mat_tr(8,j)
4211 tmp3 = vec_in_y(i,9,k) * mat_tr(9,j) &
4212 + vec_in_y(i,10,k) * mat_tr(10,j) &
4213 + vec_in_y(i,11,k) * mat_tr(11,j) &
4214 + vec_in_y(i,12,k) * mat_tr(12,j)
4215 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
4216 end do
4217 end do
4218 end do
4219
4220 ! Z-dir
4221 do k=1, 12
4222 do j=1, 12
4223 jk = j + (k-1)*12
4224 do i=1, 12
4225 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
4226 + vec_in_z(i,j,2) * mat_tr(2,k) &
4227 + vec_in_z(i,j,3) * mat_tr(3,k) &
4228 + vec_in_z(i,j,4) * mat_tr(4,k)
4229 tmp2 = vec_in_z(i,j,5) * mat_tr(5,k) &
4230 + vec_in_z(i,j,6) * mat_tr(6,k) &
4231 + vec_in_z(i,j,7) * mat_tr(7,k) &
4232 + vec_in_z(i,j,8) * mat_tr(8,k)
4233 tmp3 = vec_in_z(i,j,9) * mat_tr(9,k) &
4234 + vec_in_z(i,j,10) * mat_tr(10,k) &
4235 + vec_in_z(i,j,11) * mat_tr(11,k) &
4236 + vec_in_z(i,j,12) * mat_tr(12,k)
4237 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
4238 end do
4239 end do
4240 end do
4241 return
4243
4244!OCL SERIAL
4245 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p11( &
4246 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
4247 vec_out_x, vec_out_y, vec_out_z )
4248 implicit none
4249 real(rp), intent(in) :: mat(12,12)
4250 real(rp), intent(in) :: mat_tr(12,12)
4251 real(rp), intent(in) :: vec_in_x(12,12**2*5)
4252 real(rp), intent(in) :: vec_in_y(12,12,12*5)
4253 real(rp), intent(in) :: vec_in_z(12,12,12,5)
4254 real(rp), intent(out) :: vec_out_x(12,12**2*5)
4255 real(rp), intent(out) :: vec_out_y(12,12**2*5)
4256 real(rp), intent(out) :: vec_out_z(12,12**2,5)
4257
4258 integer :: i, j, k, jkv, jk, v, kv
4259 real(rp) :: tmp1, tmp2, tmp3
4260 !----------------------------------------------------------
4261
4262 ! X-dir
4263
4264 do jkv=1, 12**2*5
4265 do i=1, 12
4266 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
4267 + mat(i,2) * vec_in_x(2,jkv) &
4268 + mat(i,3) * vec_in_x(3,jkv) &
4269 + mat(i,4) * vec_in_x(4,jkv)
4270 tmp2 = mat(i,5) * vec_in_x(5,jkv) &
4271 + mat(i,6) * vec_in_x(6,jkv) &
4272 + mat(i,7) * vec_in_x(7,jkv) &
4273 + mat(i,8) * vec_in_x(8,jkv)
4274 tmp3 = mat(i,9) * vec_in_x(9,jkv) &
4275 + mat(i,10) * vec_in_x(10,jkv) &
4276 + mat(i,11) * vec_in_x(11,jkv) &
4277 + mat(i,12) * vec_in_x(12,jkv)
4278 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
4279 end do
4280 end do
4281
4282 ! Y-dir
4283 do kv=1, 12*5
4284 do j=1, 12
4285 jkv = j + (kv-1)*60
4286 do i=1, 12
4287 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
4288 + vec_in_y(i,2,kv) * mat_tr(2,j) &
4289 + vec_in_y(i,3,kv) * mat_tr(3,j) &
4290 + vec_in_y(i,4,kv) * mat_tr(4,j)
4291 tmp2 = vec_in_y(i,5,kv) * mat_tr(5,j) &
4292 + vec_in_y(i,6,kv) * mat_tr(6,j) &
4293 + vec_in_y(i,7,kv) * mat_tr(7,j) &
4294 + vec_in_y(i,8,kv) * mat_tr(8,j)
4295 tmp3 = vec_in_y(i,9,kv) * mat_tr(9,j) &
4296 + vec_in_y(i,10,kv) * mat_tr(10,j) &
4297 + vec_in_y(i,11,kv) * mat_tr(11,j) &
4298 + vec_in_y(i,12,kv) * mat_tr(12,j)
4299 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
4300 end do
4301 end do
4302 end do
4303
4304 ! Z-dir
4305 do v=1, 5
4306 do k=1, 12
4307 do j=1, 12
4308 jk = j + (k-1)*12
4309 do i=1, 12
4310 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
4311 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
4312 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
4313 + vec_in_z(i,j,4,v) * mat_tr(4,k)
4314 tmp2 = vec_in_z(i,j,5,v) * mat_tr(5,k) &
4315 + vec_in_z(i,j,6,v) * mat_tr(6,k) &
4316 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
4317 + vec_in_z(i,j,8,v) * mat_tr(8,k)
4318 tmp3 = vec_in_z(i,j,9,v) * mat_tr(9,k) &
4319 + vec_in_z(i,j,10,v) * mat_tr(10,k) &
4320 + vec_in_z(i,j,11,v) * mat_tr(11,k) &
4321 + vec_in_z(i,j,12,v) * mat_tr(12,k)
4322 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
4323 end do
4324 end do
4325 end do
4326 end do
4327 return
4328 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p11
4329
4330!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=11
4331!!
4332!OCL SERIAL
4333 subroutine element_operation_kernel_matvec_modalfilter_p11( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
4334 vec_out )
4335 implicit none
4336 real(rp), intent(in) :: mat_h1d(12,12)
4337 real(rp), intent(in) :: mat_h1d_tr(12,12)
4338 real(rp), intent(in) :: mat_v1d_tr(12,12)
4339 real(rp), intent(in) :: vec_in(12,12,12)
4340 real(rp), intent(out) :: vec_work(12,12,12)
4341 real(rp), intent(out) :: vec_out(12,12,12)
4342
4343 integer :: i, j, k
4344 real(rp) :: tmp1, tmp2, tmp3
4345 !----------------------------------------------------------
4346
4347 ! X-dir
4348
4349 do k=1, 12
4350 do j=1, 12
4351 do i=1, 12
4352 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
4353 + mat_h1d(i,2) * vec_in(2,j,k) &
4354 + mat_h1d(i,3) * vec_in(3,j,k) &
4355 + mat_h1d(i,4) * vec_in(4,j,k)
4356 tmp2 = mat_h1d(i,5) * vec_in(5,j,k) &
4357 + mat_h1d(i,6) * vec_in(6,j,k) &
4358 + mat_h1d(i,7) * vec_in(7,j,k) &
4359 + mat_h1d(i,8) * vec_in(8,j,k)
4360 tmp3 = mat_h1d(i,9) * vec_in(9,j,k) &
4361 + mat_h1d(i,10) * vec_in(10,j,k) &
4362 + mat_h1d(i,11) * vec_in(11,j,k) &
4363 + mat_h1d(i,12) * vec_in(12,j,k)
4364 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
4365 end do
4366 end do
4367 end do
4368
4369 ! Y-dir
4370 do k=1, 12
4371 do j=1, 12
4372 do i=1, 12
4373 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
4374 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
4375 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
4376 + vec_out(i,4,k) * mat_h1d_tr(4,j)
4377 tmp2 = vec_out(i,5,k) * mat_h1d_tr(5,j) &
4378 + vec_out(i,6,k) * mat_h1d_tr(6,j) &
4379 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
4380 + vec_out(i,8,k) * mat_h1d_tr(8,j)
4381 tmp3 = vec_out(i,9,k) * mat_h1d_tr(9,j) &
4382 + vec_out(i,10,k) * mat_h1d_tr(10,j) &
4383 + vec_out(i,11,k) * mat_h1d_tr(11,j) &
4384 + vec_out(i,12,k) * mat_h1d_tr(12,j)
4385 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
4386 end do
4387 end do
4388 end do
4389
4390 ! Z-dir
4391 do k=1, 12
4392 do j=1, 12
4393 do i=1, 12
4394 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
4395 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
4396 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
4397 + vec_work(i,j,4) * mat_v1d_tr(4,k)
4398 tmp2 = vec_work(i,j,5) * mat_v1d_tr(5,k) &
4399 + vec_work(i,j,6) * mat_v1d_tr(6,k) &
4400 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
4401 + vec_work(i,j,8) * mat_v1d_tr(8,k)
4402 tmp3 = vec_work(i,j,9) * mat_v1d_tr(9,k) &
4403 + vec_work(i,j,10) * mat_v1d_tr(10,k) &
4404 + vec_work(i,j,11) * mat_v1d_tr(11,k) &
4405 + vec_work(i,j,12) * mat_v1d_tr(12,k)
4406 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
4407 end do
4408 end do
4409 end do
4410
4411 return
4413
4414!--- For p=12 ------------------------------------
4415
4416!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=12
4417!!
4418!OCL SERIAL
4419 subroutine element_operation_kernel_matvec_dirx_p12( Mat_x, vec_in, vec_out )
4420 implicit none
4421 real(rp), intent(in) :: mat_x(13,13)
4422 real(rp), intent(in) :: vec_in(13,13**2)
4423 real(rp), intent(out) :: vec_out(13,13**2)
4424
4425 integer :: i, jk
4426 !----------------------------------------------------------
4427
4428 do jk=1, 13**2
4429 do i=1, 13
4430 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
4431 + mat_x(i,2) * vec_in(2,jk) &
4432 + mat_x(i,3) * vec_in(3,jk) &
4433 + mat_x(i,4) * vec_in(4,jk) &
4434 + mat_x(i,5) * vec_in(5,jk) &
4435 + mat_x(i,6) * vec_in(6,jk) &
4436 + mat_x(i,7) * vec_in(7,jk) &
4437 + mat_x(i,8) * vec_in(8,jk) &
4438 + mat_x(i,9) * vec_in(9,jk) &
4439 + mat_x(i,10) * vec_in(10,jk) &
4440 + mat_x(i,11) * vec_in(11,jk) &
4441 + mat_x(i,12) * vec_in(12,jk) &
4442 + mat_x(i,13) * vec_in(13,jk)
4443 end do
4444 end do
4445
4446 return
4448
4449!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=12
4450!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
4451!!
4452!OCL SERIAL
4453 subroutine element_operation_kernel_matvec_diry_p12( Mat_y_tr, vec_in, vec_out )
4454 implicit none
4455 real(rp), intent(in) :: mat_y_tr(13,13)
4456 real(rp), intent(in) :: vec_in(13,13,13)
4457 real(rp), intent(out) :: vec_out(13,13,13)
4458
4459 integer :: i, j, k
4460 !----------------------------------------------------------
4461
4462 do k=1, 13
4463 do j=1, 13
4464 do i=1, 13
4465 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
4466 + vec_in(i,2,k) * mat_y_tr(2,j) &
4467 + vec_in(i,3,k) * mat_y_tr(3,j) &
4468 + vec_in(i,4,k) * mat_y_tr(4,j) &
4469 + vec_in(i,5,k) * mat_y_tr(5,j) &
4470 + vec_in(i,6,k) * mat_y_tr(6,j) &
4471 + vec_in(i,7,k) * mat_y_tr(7,j) &
4472 + vec_in(i,8,k) * mat_y_tr(8,j) &
4473 + vec_in(i,9,k) * mat_y_tr(9,j) &
4474 + vec_in(i,10,k) * mat_y_tr(10,j) &
4475 + vec_in(i,11,k) * mat_y_tr(11,j) &
4476 + vec_in(i,12,k) * mat_y_tr(12,j) &
4477 + vec_in(i,13,k) * mat_y_tr(13,j)
4478 end do
4479 end do
4480 end do
4481
4482 return
4484
4485!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=12
4486!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
4487!!
4488!OCL SERIAL
4489 subroutine element_operation_kernel_matvec_dirz_p12( Mat_z_tr, vec_in, vec_out )
4490 implicit none
4491 real(rp), intent(in) :: mat_z_tr(13,13)
4492 real(rp), intent(in) :: vec_in(13,13,13)
4493 real(rp), intent(out) :: vec_out(13,13,13)
4494
4495 integer :: i, j, k
4496 !----------------------------------------------------------
4497
4498 do k=1, 13
4499 do j=1, 13
4500 do i=1, 13
4501 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
4502 + vec_in(i,j,2) * mat_z_tr(2,k) &
4503 + vec_in(i,j,3) * mat_z_tr(3,k) &
4504 + vec_in(i,j,4) * mat_z_tr(4,k) &
4505 + vec_in(i,j,5) * mat_z_tr(5,k) &
4506 + vec_in(i,j,6) * mat_z_tr(6,k) &
4507 + vec_in(i,j,7) * mat_z_tr(7,k) &
4508 + vec_in(i,j,8) * mat_z_tr(8,k) &
4509 + vec_in(i,j,9) * mat_z_tr(9,k) &
4510 + vec_in(i,j,10) * mat_z_tr(10,k) &
4511 + vec_in(i,j,11) * mat_z_tr(11,k) &
4512 + vec_in(i,j,12) * mat_z_tr(12,k) &
4513 + vec_in(i,j,13) * mat_z_tr(13,k)
4514 end do
4515 end do
4516 end do
4517
4518 return
4520
4521!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=12
4522!!
4523!OCL SERIAL
4525 implicit none
4526 real(rp), intent(in) :: lift(13,13,13,6)
4527 real(rp), intent(in) :: vec_in(13,13,6)
4528 real(rp), intent(out) :: vec_out(13,13,13)
4529
4530 integer :: i, j, k
4531 !----------------------------------------------------------
4532
4533 do k=1, 13
4534 do j=1, 13
4535 do i=1, 13
4536 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
4537 + lift(i,j,k,2) * vec_in(j,k,2) &
4538 + lift(i,j,k,3) * vec_in(i,k,3) &
4539 + lift(i,j,k,4) * vec_in(j,k,4) &
4540 + lift(i,j,k,5) * vec_in(i,j,5) &
4541 + lift(i,j,k,6) * vec_in(i,j,6)
4542 end do
4543 end do
4544 end do
4545
4546 return
4548
4549!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=12
4550!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
4551!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
4552!!
4553!OCL SERIAL
4554 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p12( Mat, Mat_tr, vec_in, vec_in_, &
4555 vec_out_x, vec_out_y, vec_out_z )
4556 implicit none
4557 real(rp), intent(in) :: mat(13,13)
4558 real(rp), intent(in) :: mat_tr(13,13)
4559 real(rp), intent(in) :: vec_in_(13,13**2)
4560 real(rp), intent(in) :: vec_in(13,13,13)
4561 real(rp), intent(out) :: vec_out_x(13,13**2)
4562 real(rp), intent(out) :: vec_out_y(13,13,13)
4563 real(rp), intent(out) :: vec_out_z(13,13,13)
4564
4565 integer :: i, j, k, jk
4566 !----------------------------------------------------------
4567
4568 ! X-dir
4569
4570 do jk=1, 13**2
4571 do i=1, 13
4572 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
4573 + mat(i,2) * vec_in_(2,jk) &
4574 + mat(i,3) * vec_in_(3,jk) &
4575 + mat(i,4) * vec_in_(4,jk) &
4576 + mat(i,5) * vec_in_(5,jk) &
4577 + mat(i,6) * vec_in_(6,jk) &
4578 + mat(i,7) * vec_in_(7,jk) &
4579 + mat(i,8) * vec_in_(8,jk) &
4580 + mat(i,9) * vec_in_(9,jk) &
4581 + mat(i,10) * vec_in_(10,jk) &
4582 + mat(i,11) * vec_in_(11,jk) &
4583 + mat(i,12) * vec_in_(12,jk) &
4584 + mat(i,13) * vec_in_(13,jk)
4585 end do
4586 end do
4587
4588 ! Y-dir
4589 do k=1, 13
4590 do j=1, 13
4591 do i=1, 13
4592 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
4593 + vec_in(i,2,k) * mat_tr(2,j) &
4594 + vec_in(i,3,k) * mat_tr(3,j) &
4595 + vec_in(i,4,k) * mat_tr(4,j) &
4596 + vec_in(i,5,k) * mat_tr(5,j) &
4597 + vec_in(i,6,k) * mat_tr(6,j) &
4598 + vec_in(i,7,k) * mat_tr(7,j) &
4599 + vec_in(i,8,k) * mat_tr(8,j) &
4600 + vec_in(i,9,k) * mat_tr(9,j) &
4601 + vec_in(i,10,k) * mat_tr(10,j) &
4602 + vec_in(i,11,k) * mat_tr(11,j) &
4603 + vec_in(i,12,k) * mat_tr(12,j) &
4604 + vec_in(i,13,k) * mat_tr(13,j)
4605 end do
4606 end do
4607 end do
4608
4609 ! Z-dir
4610 do k=1, 13
4611 do j=1, 13
4612 do i=1, 13
4613 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
4614 + vec_in(i,j,2) * mat_tr(2,k) &
4615 + vec_in(i,j,3) * mat_tr(3,k) &
4616 + vec_in(i,j,4) * mat_tr(4,k) &
4617 + vec_in(i,j,5) * mat_tr(5,k) &
4618 + vec_in(i,j,6) * mat_tr(6,k) &
4619 + vec_in(i,j,7) * mat_tr(7,k) &
4620 + vec_in(i,j,8) * mat_tr(8,k) &
4621 + vec_in(i,j,9) * mat_tr(9,k) &
4622 + vec_in(i,j,10) * mat_tr(10,k) &
4623 + vec_in(i,j,11) * mat_tr(11,k) &
4624 + vec_in(i,j,12) * mat_tr(12,k) &
4625 + vec_in(i,j,13) * mat_tr(13,k)
4626 end do
4627 end do
4628 end do
4629
4630 return
4632
4633!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=12
4634!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
4635!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
4636!!
4637!OCL SERIAL
4639 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
4640 vec_out_x, vec_out_y, vec_out_z )
4641 implicit none
4642 real(rp), intent(in) :: mat(13,13)
4643 real(rp), intent(in) :: mat_tr(13,13)
4644 real(rp), intent(in) :: vec_in_x(13,13**2)
4645 real(rp), intent(in) :: vec_in_y(13,13,13)
4646 real(rp), intent(in) :: vec_in_z(13,13,13)
4647 real(rp), intent(out) :: vec_out_x(13,13**2)
4648 real(rp), intent(out) :: vec_out_y(13,13**2)
4649 real(rp), intent(out) :: vec_out_z(13,13**2)
4650
4651 integer :: i, j, k, jk
4652 real(rp) :: tmp1, tmp2, tmp3
4653 !----------------------------------------------------------
4654
4655 ! X-dir
4656
4657 do jk=1, 13**2
4658 do i=1, 13
4659 tmp1 = mat(i,1) * vec_in_x(1,jk) &
4660 + mat(i,2) * vec_in_x(2,jk) &
4661 + mat(i,3) * vec_in_x(3,jk) &
4662 + mat(i,4) * vec_in_x(4,jk)
4663 tmp2 = mat(i,5) * vec_in_x(5,jk) &
4664 + mat(i,6) * vec_in_x(6,jk) &
4665 + mat(i,7) * vec_in_x(7,jk) &
4666 + mat(i,8) * vec_in_x(8,jk)
4667 tmp3 = mat(i,9) * vec_in_x(9,jk) &
4668 + mat(i,10) * vec_in_x(10,jk) &
4669 + mat(i,11) * vec_in_x(11,jk) &
4670 + mat(i,12) * vec_in_x(12,jk) &
4671 + mat(i,13) * vec_in_x(13,jk)
4672 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
4673 end do
4674 end do
4675
4676 ! Y-dir
4677 do k=1, 13
4678 do j=1, 13
4679 jk = j + (k-1)*13
4680 do i=1, 13
4681 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
4682 + vec_in_y(i,2,k) * mat_tr(2,j) &
4683 + vec_in_y(i,3,k) * mat_tr(3,j) &
4684 + vec_in_y(i,4,k) * mat_tr(4,j)
4685 tmp2 = vec_in_y(i,5,k) * mat_tr(5,j) &
4686 + vec_in_y(i,6,k) * mat_tr(6,j) &
4687 + vec_in_y(i,7,k) * mat_tr(7,j) &
4688 + vec_in_y(i,8,k) * mat_tr(8,j)
4689 tmp3 = vec_in_y(i,9,k) * mat_tr(9,j) &
4690 + vec_in_y(i,10,k) * mat_tr(10,j) &
4691 + vec_in_y(i,11,k) * mat_tr(11,j) &
4692 + vec_in_y(i,12,k) * mat_tr(12,j) &
4693 + vec_in_y(i,13,k) * mat_tr(13,j)
4694 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
4695 end do
4696 end do
4697 end do
4698
4699 ! Z-dir
4700 do k=1, 13
4701 do j=1, 13
4702 jk = j + (k-1)*13
4703 do i=1, 13
4704 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
4705 + vec_in_z(i,j,2) * mat_tr(2,k) &
4706 + vec_in_z(i,j,3) * mat_tr(3,k) &
4707 + vec_in_z(i,j,4) * mat_tr(4,k)
4708 tmp2 = vec_in_z(i,j,5) * mat_tr(5,k) &
4709 + vec_in_z(i,j,6) * mat_tr(6,k) &
4710 + vec_in_z(i,j,7) * mat_tr(7,k) &
4711 + vec_in_z(i,j,8) * mat_tr(8,k)
4712 tmp3 = vec_in_z(i,j,9) * mat_tr(9,k) &
4713 + vec_in_z(i,j,10) * mat_tr(10,k) &
4714 + vec_in_z(i,j,11) * mat_tr(11,k) &
4715 + vec_in_z(i,j,12) * mat_tr(12,k) &
4716 + vec_in_z(i,j,13) * mat_tr(13,k)
4717 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
4718 end do
4719 end do
4720 end do
4721 return
4723
4724!OCL SERIAL
4725 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p12( &
4726 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
4727 vec_out_x, vec_out_y, vec_out_z )
4728 implicit none
4729 real(rp), intent(in) :: mat(13,13)
4730 real(rp), intent(in) :: mat_tr(13,13)
4731 real(rp), intent(in) :: vec_in_x(13,13**2*5)
4732 real(rp), intent(in) :: vec_in_y(13,13,13*5)
4733 real(rp), intent(in) :: vec_in_z(13,13,13,5)
4734 real(rp), intent(out) :: vec_out_x(13,13**2*5)
4735 real(rp), intent(out) :: vec_out_y(13,13**2*5)
4736 real(rp), intent(out) :: vec_out_z(13,13**2,5)
4737
4738 integer :: i, j, k, jkv, jk, v, kv
4739 real(rp) :: tmp1, tmp2, tmp3
4740 !----------------------------------------------------------
4741
4742 ! X-dir
4743
4744 do jkv=1, 13**2*5
4745 do i=1, 13
4746 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
4747 + mat(i,2) * vec_in_x(2,jkv) &
4748 + mat(i,3) * vec_in_x(3,jkv) &
4749 + mat(i,4) * vec_in_x(4,jkv)
4750 tmp2 = mat(i,5) * vec_in_x(5,jkv) &
4751 + mat(i,6) * vec_in_x(6,jkv) &
4752 + mat(i,7) * vec_in_x(7,jkv) &
4753 + mat(i,8) * vec_in_x(8,jkv)
4754 tmp3 = mat(i,9) * vec_in_x(9,jkv) &
4755 + mat(i,10) * vec_in_x(10,jkv) &
4756 + mat(i,11) * vec_in_x(11,jkv) &
4757 + mat(i,12) * vec_in_x(12,jkv) &
4758 + mat(i,13) * vec_in_x(13,jkv)
4759 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
4760 end do
4761 end do
4762
4763 ! Y-dir
4764 do kv=1, 13*5
4765 do j=1, 13
4766 jkv = j + (kv-1)*65
4767 do i=1, 13
4768 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
4769 + vec_in_y(i,2,kv) * mat_tr(2,j) &
4770 + vec_in_y(i,3,kv) * mat_tr(3,j) &
4771 + vec_in_y(i,4,kv) * mat_tr(4,j)
4772 tmp2 = vec_in_y(i,5,kv) * mat_tr(5,j) &
4773 + vec_in_y(i,6,kv) * mat_tr(6,j) &
4774 + vec_in_y(i,7,kv) * mat_tr(7,j) &
4775 + vec_in_y(i,8,kv) * mat_tr(8,j)
4776 tmp3 = vec_in_y(i,9,kv) * mat_tr(9,j) &
4777 + vec_in_y(i,10,kv) * mat_tr(10,j) &
4778 + vec_in_y(i,11,kv) * mat_tr(11,j) &
4779 + vec_in_y(i,12,kv) * mat_tr(12,j) &
4780 + vec_in_y(i,13,kv) * mat_tr(13,j)
4781 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
4782 end do
4783 end do
4784 end do
4785
4786 ! Z-dir
4787 do v=1, 5
4788 do k=1, 13
4789 do j=1, 13
4790 jk = j + (k-1)*13
4791 do i=1, 13
4792 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
4793 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
4794 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
4795 + vec_in_z(i,j,4,v) * mat_tr(4,k)
4796 tmp2 = vec_in_z(i,j,5,v) * mat_tr(5,k) &
4797 + vec_in_z(i,j,6,v) * mat_tr(6,k) &
4798 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
4799 + vec_in_z(i,j,8,v) * mat_tr(8,k)
4800 tmp3 = vec_in_z(i,j,9,v) * mat_tr(9,k) &
4801 + vec_in_z(i,j,10,v) * mat_tr(10,k) &
4802 + vec_in_z(i,j,11,v) * mat_tr(11,k) &
4803 + vec_in_z(i,j,12,v) * mat_tr(12,k) &
4804 + vec_in_z(i,j,13,v) * mat_tr(13,k)
4805 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
4806 end do
4807 end do
4808 end do
4809 end do
4810 return
4811 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p12
4812
4813!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=12
4814!!
4815!OCL SERIAL
4816 subroutine element_operation_kernel_matvec_modalfilter_p12( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
4817 vec_out )
4818 implicit none
4819 real(rp), intent(in) :: mat_h1d(13,13)
4820 real(rp), intent(in) :: mat_h1d_tr(13,13)
4821 real(rp), intent(in) :: mat_v1d_tr(13,13)
4822 real(rp), intent(in) :: vec_in(13,13,13)
4823 real(rp), intent(out) :: vec_work(13,13,13)
4824 real(rp), intent(out) :: vec_out(13,13,13)
4825
4826 integer :: i, j, k
4827 real(rp) :: tmp1, tmp2, tmp3
4828 !----------------------------------------------------------
4829
4830 ! X-dir
4831
4832 do k=1, 13
4833 do j=1, 13
4834 do i=1, 13
4835 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
4836 + mat_h1d(i,2) * vec_in(2,j,k) &
4837 + mat_h1d(i,3) * vec_in(3,j,k) &
4838 + mat_h1d(i,4) * vec_in(4,j,k)
4839 tmp2 = mat_h1d(i,5) * vec_in(5,j,k) &
4840 + mat_h1d(i,6) * vec_in(6,j,k) &
4841 + mat_h1d(i,7) * vec_in(7,j,k) &
4842 + mat_h1d(i,8) * vec_in(8,j,k)
4843 tmp3 = mat_h1d(i,9) * vec_in(9,j,k) &
4844 + mat_h1d(i,10) * vec_in(10,j,k) &
4845 + mat_h1d(i,11) * vec_in(11,j,k) &
4846 + mat_h1d(i,12) * vec_in(12,j,k) &
4847 + mat_h1d(i,13) * vec_in(13,j,k)
4848 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
4849 end do
4850 end do
4851 end do
4852
4853 ! Y-dir
4854 do k=1, 13
4855 do j=1, 13
4856 do i=1, 13
4857 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
4858 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
4859 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
4860 + vec_out(i,4,k) * mat_h1d_tr(4,j)
4861 tmp2 = vec_out(i,5,k) * mat_h1d_tr(5,j) &
4862 + vec_out(i,6,k) * mat_h1d_tr(6,j) &
4863 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
4864 + vec_out(i,8,k) * mat_h1d_tr(8,j)
4865 tmp3 = vec_out(i,9,k) * mat_h1d_tr(9,j) &
4866 + vec_out(i,10,k) * mat_h1d_tr(10,j) &
4867 + vec_out(i,11,k) * mat_h1d_tr(11,j) &
4868 + vec_out(i,12,k) * mat_h1d_tr(12,j) &
4869 + vec_out(i,13,k) * mat_h1d_tr(13,j)
4870 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
4871 end do
4872 end do
4873 end do
4874
4875 ! Z-dir
4876 do k=1, 13
4877 do j=1, 13
4878 do i=1, 13
4879 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
4880 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
4881 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
4882 + vec_work(i,j,4) * mat_v1d_tr(4,k)
4883 tmp2 = vec_work(i,j,5) * mat_v1d_tr(5,k) &
4884 + vec_work(i,j,6) * mat_v1d_tr(6,k) &
4885 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
4886 + vec_work(i,j,8) * mat_v1d_tr(8,k)
4887 tmp3 = vec_work(i,j,9) * mat_v1d_tr(9,k) &
4888 + vec_work(i,j,10) * mat_v1d_tr(10,k) &
4889 + vec_work(i,j,11) * mat_v1d_tr(11,k) &
4890 + vec_work(i,j,12) * mat_v1d_tr(12,k) &
4891 + vec_work(i,j,13) * mat_v1d_tr(13,k)
4892 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
4893 end do
4894 end do
4895 end do
4896
4897 return
4899
4900!--- For p=13 ------------------------------------
4901
4902!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=13
4903!!
4904!OCL SERIAL
4905 subroutine element_operation_kernel_matvec_dirx_p13( Mat_x, vec_in, vec_out )
4906 implicit none
4907 real(rp), intent(in) :: mat_x(14,14)
4908 real(rp), intent(in) :: vec_in(14,14**2)
4909 real(rp), intent(out) :: vec_out(14,14**2)
4910
4911 integer :: i, jk
4912 !----------------------------------------------------------
4913
4914 do jk=1, 14**2
4915 do i=1, 14
4916 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
4917 + mat_x(i,2) * vec_in(2,jk) &
4918 + mat_x(i,3) * vec_in(3,jk) &
4919 + mat_x(i,4) * vec_in(4,jk) &
4920 + mat_x(i,5) * vec_in(5,jk) &
4921 + mat_x(i,6) * vec_in(6,jk) &
4922 + mat_x(i,7) * vec_in(7,jk) &
4923 + mat_x(i,8) * vec_in(8,jk) &
4924 + mat_x(i,9) * vec_in(9,jk) &
4925 + mat_x(i,10) * vec_in(10,jk) &
4926 + mat_x(i,11) * vec_in(11,jk) &
4927 + mat_x(i,12) * vec_in(12,jk) &
4928 + mat_x(i,13) * vec_in(13,jk) &
4929 + mat_x(i,14) * vec_in(14,jk)
4930 end do
4931 end do
4932
4933 return
4935
4936!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=13
4937!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
4938!!
4939!OCL SERIAL
4940 subroutine element_operation_kernel_matvec_diry_p13( Mat_y_tr, vec_in, vec_out )
4941 implicit none
4942 real(rp), intent(in) :: mat_y_tr(14,14)
4943 real(rp), intent(in) :: vec_in(14,14,14)
4944 real(rp), intent(out) :: vec_out(14,14,14)
4945
4946 integer :: i, j, k
4947 !----------------------------------------------------------
4948
4949 do k=1, 14
4950 do j=1, 14
4951 do i=1, 14
4952 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
4953 + vec_in(i,2,k) * mat_y_tr(2,j) &
4954 + vec_in(i,3,k) * mat_y_tr(3,j) &
4955 + vec_in(i,4,k) * mat_y_tr(4,j) &
4956 + vec_in(i,5,k) * mat_y_tr(5,j) &
4957 + vec_in(i,6,k) * mat_y_tr(6,j) &
4958 + vec_in(i,7,k) * mat_y_tr(7,j) &
4959 + vec_in(i,8,k) * mat_y_tr(8,j) &
4960 + vec_in(i,9,k) * mat_y_tr(9,j) &
4961 + vec_in(i,10,k) * mat_y_tr(10,j) &
4962 + vec_in(i,11,k) * mat_y_tr(11,j) &
4963 + vec_in(i,12,k) * mat_y_tr(12,j) &
4964 + vec_in(i,13,k) * mat_y_tr(13,j) &
4965 + vec_in(i,14,k) * mat_y_tr(14,j)
4966 end do
4967 end do
4968 end do
4969
4970 return
4972
4973!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=13
4974!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
4975!!
4976!OCL SERIAL
4977 subroutine element_operation_kernel_matvec_dirz_p13( Mat_z_tr, vec_in, vec_out )
4978 implicit none
4979 real(rp), intent(in) :: mat_z_tr(14,14)
4980 real(rp), intent(in) :: vec_in(14,14,14)
4981 real(rp), intent(out) :: vec_out(14,14,14)
4982
4983 integer :: i, j, k
4984 !----------------------------------------------------------
4985
4986 do k=1, 14
4987 do j=1, 14
4988 do i=1, 14
4989 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
4990 + vec_in(i,j,2) * mat_z_tr(2,k) &
4991 + vec_in(i,j,3) * mat_z_tr(3,k) &
4992 + vec_in(i,j,4) * mat_z_tr(4,k) &
4993 + vec_in(i,j,5) * mat_z_tr(5,k) &
4994 + vec_in(i,j,6) * mat_z_tr(6,k) &
4995 + vec_in(i,j,7) * mat_z_tr(7,k) &
4996 + vec_in(i,j,8) * mat_z_tr(8,k) &
4997 + vec_in(i,j,9) * mat_z_tr(9,k) &
4998 + vec_in(i,j,10) * mat_z_tr(10,k) &
4999 + vec_in(i,j,11) * mat_z_tr(11,k) &
5000 + vec_in(i,j,12) * mat_z_tr(12,k) &
5001 + vec_in(i,j,13) * mat_z_tr(13,k) &
5002 + vec_in(i,j,14) * mat_z_tr(14,k)
5003 end do
5004 end do
5005 end do
5006
5007 return
5009
5010!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=13
5011!!
5012!OCL SERIAL
5014 implicit none
5015 real(rp), intent(in) :: lift(14,14,14,6)
5016 real(rp), intent(in) :: vec_in(14,14,6)
5017 real(rp), intent(out) :: vec_out(14,14,14)
5018
5019 integer :: i, j, k
5020 !----------------------------------------------------------
5021
5022 do k=1, 14
5023 do j=1, 14
5024 do i=1, 14
5025 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
5026 + lift(i,j,k,2) * vec_in(j,k,2) &
5027 + lift(i,j,k,3) * vec_in(i,k,3) &
5028 + lift(i,j,k,4) * vec_in(j,k,4) &
5029 + lift(i,j,k,5) * vec_in(i,j,5) &
5030 + lift(i,j,k,6) * vec_in(i,j,6)
5031 end do
5032 end do
5033 end do
5034
5035 return
5037
5038!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=13
5039!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
5040!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
5041!!
5042!OCL SERIAL
5043 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p13( Mat, Mat_tr, vec_in, vec_in_, &
5044 vec_out_x, vec_out_y, vec_out_z )
5045 implicit none
5046 real(rp), intent(in) :: mat(14,14)
5047 real(rp), intent(in) :: mat_tr(14,14)
5048 real(rp), intent(in) :: vec_in_(14,14**2)
5049 real(rp), intent(in) :: vec_in(14,14,14)
5050 real(rp), intent(out) :: vec_out_x(14,14**2)
5051 real(rp), intent(out) :: vec_out_y(14,14,14)
5052 real(rp), intent(out) :: vec_out_z(14,14,14)
5053
5054 integer :: i, j, k, jk
5055 !----------------------------------------------------------
5056
5057 ! X-dir
5058
5059 do jk=1, 14**2
5060 do i=1, 14
5061 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
5062 + mat(i,2) * vec_in_(2,jk) &
5063 + mat(i,3) * vec_in_(3,jk) &
5064 + mat(i,4) * vec_in_(4,jk) &
5065 + mat(i,5) * vec_in_(5,jk) &
5066 + mat(i,6) * vec_in_(6,jk) &
5067 + mat(i,7) * vec_in_(7,jk) &
5068 + mat(i,8) * vec_in_(8,jk) &
5069 + mat(i,9) * vec_in_(9,jk) &
5070 + mat(i,10) * vec_in_(10,jk) &
5071 + mat(i,11) * vec_in_(11,jk) &
5072 + mat(i,12) * vec_in_(12,jk) &
5073 + mat(i,13) * vec_in_(13,jk) &
5074 + mat(i,14) * vec_in_(14,jk)
5075 end do
5076 end do
5077
5078 ! Y-dir
5079 do k=1, 14
5080 do j=1, 14
5081 do i=1, 14
5082 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
5083 + vec_in(i,2,k) * mat_tr(2,j) &
5084 + vec_in(i,3,k) * mat_tr(3,j) &
5085 + vec_in(i,4,k) * mat_tr(4,j) &
5086 + vec_in(i,5,k) * mat_tr(5,j) &
5087 + vec_in(i,6,k) * mat_tr(6,j) &
5088 + vec_in(i,7,k) * mat_tr(7,j) &
5089 + vec_in(i,8,k) * mat_tr(8,j) &
5090 + vec_in(i,9,k) * mat_tr(9,j) &
5091 + vec_in(i,10,k) * mat_tr(10,j) &
5092 + vec_in(i,11,k) * mat_tr(11,j) &
5093 + vec_in(i,12,k) * mat_tr(12,j) &
5094 + vec_in(i,13,k) * mat_tr(13,j) &
5095 + vec_in(i,14,k) * mat_tr(14,j)
5096 end do
5097 end do
5098 end do
5099
5100 ! Z-dir
5101 do k=1, 14
5102 do j=1, 14
5103 do i=1, 14
5104 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
5105 + vec_in(i,j,2) * mat_tr(2,k) &
5106 + vec_in(i,j,3) * mat_tr(3,k) &
5107 + vec_in(i,j,4) * mat_tr(4,k) &
5108 + vec_in(i,j,5) * mat_tr(5,k) &
5109 + vec_in(i,j,6) * mat_tr(6,k) &
5110 + vec_in(i,j,7) * mat_tr(7,k) &
5111 + vec_in(i,j,8) * mat_tr(8,k) &
5112 + vec_in(i,j,9) * mat_tr(9,k) &
5113 + vec_in(i,j,10) * mat_tr(10,k) &
5114 + vec_in(i,j,11) * mat_tr(11,k) &
5115 + vec_in(i,j,12) * mat_tr(12,k) &
5116 + vec_in(i,j,13) * mat_tr(13,k) &
5117 + vec_in(i,j,14) * mat_tr(14,k)
5118 end do
5119 end do
5120 end do
5121
5122 return
5124
5125!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=13
5126!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
5127!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
5128!!
5129!OCL SERIAL
5131 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
5132 vec_out_x, vec_out_y, vec_out_z )
5133 implicit none
5134 real(rp), intent(in) :: mat(14,14)
5135 real(rp), intent(in) :: mat_tr(14,14)
5136 real(rp), intent(in) :: vec_in_x(14,14**2)
5137 real(rp), intent(in) :: vec_in_y(14,14,14)
5138 real(rp), intent(in) :: vec_in_z(14,14,14)
5139 real(rp), intent(out) :: vec_out_x(14,14**2)
5140 real(rp), intent(out) :: vec_out_y(14,14**2)
5141 real(rp), intent(out) :: vec_out_z(14,14**2)
5142
5143 integer :: i, j, k, jk
5144 real(rp) :: tmp1, tmp2, tmp3
5145 !----------------------------------------------------------
5146
5147 ! X-dir
5148
5149 do jk=1, 14**2
5150 do i=1, 14
5151 tmp1 = mat(i,1) * vec_in_x(1,jk) &
5152 + mat(i,2) * vec_in_x(2,jk) &
5153 + mat(i,3) * vec_in_x(3,jk) &
5154 + mat(i,4) * vec_in_x(4,jk) &
5155 + mat(i,5) * vec_in_x(5,jk)
5156 tmp2 = mat(i,6) * vec_in_x(6,jk) &
5157 + mat(i,7) * vec_in_x(7,jk) &
5158 + mat(i,8) * vec_in_x(8,jk) &
5159 + mat(i,9) * vec_in_x(9,jk) &
5160 + mat(i,10) * vec_in_x(10,jk)
5161 tmp3 = mat(i,11) * vec_in_x(11,jk) &
5162 + mat(i,12) * vec_in_x(12,jk) &
5163 + mat(i,13) * vec_in_x(13,jk) &
5164 + mat(i,14) * vec_in_x(14,jk)
5165 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
5166 end do
5167 end do
5168
5169 ! Y-dir
5170 do k=1, 14
5171 do j=1, 14
5172 jk = j + (k-1)*14
5173 do i=1, 14
5174 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
5175 + vec_in_y(i,2,k) * mat_tr(2,j) &
5176 + vec_in_y(i,3,k) * mat_tr(3,j) &
5177 + vec_in_y(i,4,k) * mat_tr(4,j) &
5178 + vec_in_y(i,5,k) * mat_tr(5,j)
5179 tmp2 = vec_in_y(i,6,k) * mat_tr(6,j) &
5180 + vec_in_y(i,7,k) * mat_tr(7,j) &
5181 + vec_in_y(i,8,k) * mat_tr(8,j) &
5182 + vec_in_y(i,9,k) * mat_tr(9,j) &
5183 + vec_in_y(i,10,k) * mat_tr(10,j)
5184 tmp3 = vec_in_y(i,11,k) * mat_tr(11,j) &
5185 + vec_in_y(i,12,k) * mat_tr(12,j) &
5186 + vec_in_y(i,13,k) * mat_tr(13,j) &
5187 + vec_in_y(i,14,k) * mat_tr(14,j)
5188 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
5189 end do
5190 end do
5191 end do
5192
5193 ! Z-dir
5194 do k=1, 14
5195 do j=1, 14
5196 jk = j + (k-1)*14
5197 do i=1, 14
5198 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
5199 + vec_in_z(i,j,2) * mat_tr(2,k) &
5200 + vec_in_z(i,j,3) * mat_tr(3,k) &
5201 + vec_in_z(i,j,4) * mat_tr(4,k) &
5202 + vec_in_z(i,j,5) * mat_tr(5,k)
5203 tmp2 = vec_in_z(i,j,6) * mat_tr(6,k) &
5204 + vec_in_z(i,j,7) * mat_tr(7,k) &
5205 + vec_in_z(i,j,8) * mat_tr(8,k) &
5206 + vec_in_z(i,j,9) * mat_tr(9,k) &
5207 + vec_in_z(i,j,10) * mat_tr(10,k)
5208 tmp3 = vec_in_z(i,j,11) * mat_tr(11,k) &
5209 + vec_in_z(i,j,12) * mat_tr(12,k) &
5210 + vec_in_z(i,j,13) * mat_tr(13,k) &
5211 + vec_in_z(i,j,14) * mat_tr(14,k)
5212 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
5213 end do
5214 end do
5215 end do
5216 return
5218
5219!OCL SERIAL
5220 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p13( &
5221 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
5222 vec_out_x, vec_out_y, vec_out_z )
5223 implicit none
5224 real(rp), intent(in) :: mat(14,14)
5225 real(rp), intent(in) :: mat_tr(14,14)
5226 real(rp), intent(in) :: vec_in_x(14,14**2*5)
5227 real(rp), intent(in) :: vec_in_y(14,14,14*5)
5228 real(rp), intent(in) :: vec_in_z(14,14,14,5)
5229 real(rp), intent(out) :: vec_out_x(14,14**2*5)
5230 real(rp), intent(out) :: vec_out_y(14,14**2*5)
5231 real(rp), intent(out) :: vec_out_z(14,14**2,5)
5232
5233 integer :: i, j, k, jkv, jk, v, kv
5234 real(rp) :: tmp1, tmp2, tmp3
5235 !----------------------------------------------------------
5236
5237 ! X-dir
5238
5239 do jkv=1, 14**2*5
5240 do i=1, 14
5241 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
5242 + mat(i,2) * vec_in_x(2,jkv) &
5243 + mat(i,3) * vec_in_x(3,jkv) &
5244 + mat(i,4) * vec_in_x(4,jkv) &
5245 + mat(i,5) * vec_in_x(5,jkv)
5246 tmp2 = mat(i,6) * vec_in_x(6,jkv) &
5247 + mat(i,7) * vec_in_x(7,jkv) &
5248 + mat(i,8) * vec_in_x(8,jkv) &
5249 + mat(i,9) * vec_in_x(9,jkv) &
5250 + mat(i,10) * vec_in_x(10,jkv)
5251 tmp3 = mat(i,11) * vec_in_x(11,jkv) &
5252 + mat(i,12) * vec_in_x(12,jkv) &
5253 + mat(i,13) * vec_in_x(13,jkv) &
5254 + mat(i,14) * vec_in_x(14,jkv)
5255 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
5256 end do
5257 end do
5258
5259 ! Y-dir
5260 do kv=1, 14*5
5261 do j=1, 14
5262 jkv = j + (kv-1)*70
5263 do i=1, 14
5264 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
5265 + vec_in_y(i,2,kv) * mat_tr(2,j) &
5266 + vec_in_y(i,3,kv) * mat_tr(3,j) &
5267 + vec_in_y(i,4,kv) * mat_tr(4,j) &
5268 + vec_in_y(i,5,kv) * mat_tr(5,j)
5269 tmp2 = vec_in_y(i,6,kv) * mat_tr(6,j) &
5270 + vec_in_y(i,7,kv) * mat_tr(7,j) &
5271 + vec_in_y(i,8,kv) * mat_tr(8,j) &
5272 + vec_in_y(i,9,kv) * mat_tr(9,j) &
5273 + vec_in_y(i,10,kv) * mat_tr(10,j)
5274 tmp3 = vec_in_y(i,11,kv) * mat_tr(11,j) &
5275 + vec_in_y(i,12,kv) * mat_tr(12,j) &
5276 + vec_in_y(i,13,kv) * mat_tr(13,j) &
5277 + vec_in_y(i,14,kv) * mat_tr(14,j)
5278 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
5279 end do
5280 end do
5281 end do
5282
5283 ! Z-dir
5284 do v=1, 5
5285 do k=1, 14
5286 do j=1, 14
5287 jk = j + (k-1)*14
5288 do i=1, 14
5289 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
5290 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
5291 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
5292 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
5293 + vec_in_z(i,j,5,v) * mat_tr(5,k)
5294 tmp2 = vec_in_z(i,j,6,v) * mat_tr(6,k) &
5295 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
5296 + vec_in_z(i,j,8,v) * mat_tr(8,k) &
5297 + vec_in_z(i,j,9,v) * mat_tr(9,k) &
5298 + vec_in_z(i,j,10,v) * mat_tr(10,k)
5299 tmp3 = vec_in_z(i,j,11,v) * mat_tr(11,k) &
5300 + vec_in_z(i,j,12,v) * mat_tr(12,k) &
5301 + vec_in_z(i,j,13,v) * mat_tr(13,k) &
5302 + vec_in_z(i,j,14,v) * mat_tr(14,k)
5303 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
5304 end do
5305 end do
5306 end do
5307 end do
5308 return
5309 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p13
5310
5311!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=13
5312!!
5313!OCL SERIAL
5314 subroutine element_operation_kernel_matvec_modalfilter_p13( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
5315 vec_out )
5316 implicit none
5317 real(rp), intent(in) :: mat_h1d(14,14)
5318 real(rp), intent(in) :: mat_h1d_tr(14,14)
5319 real(rp), intent(in) :: mat_v1d_tr(14,14)
5320 real(rp), intent(in) :: vec_in(14,14,14)
5321 real(rp), intent(out) :: vec_work(14,14,14)
5322 real(rp), intent(out) :: vec_out(14,14,14)
5323
5324 integer :: i, j, k
5325 real(rp) :: tmp1, tmp2, tmp3
5326 !----------------------------------------------------------
5327
5328 ! X-dir
5329
5330 do k=1, 14
5331 do j=1, 14
5332 do i=1, 14
5333 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
5334 + mat_h1d(i,2) * vec_in(2,j,k) &
5335 + mat_h1d(i,3) * vec_in(3,j,k) &
5336 + mat_h1d(i,4) * vec_in(4,j,k) &
5337 + mat_h1d(i,5) * vec_in(5,j,k)
5338 tmp2 = mat_h1d(i,6) * vec_in(6,j,k) &
5339 + mat_h1d(i,7) * vec_in(7,j,k) &
5340 + mat_h1d(i,8) * vec_in(8,j,k) &
5341 + mat_h1d(i,9) * vec_in(9,j,k) &
5342 + mat_h1d(i,10) * vec_in(10,j,k)
5343 tmp3 = mat_h1d(i,11) * vec_in(11,j,k) &
5344 + mat_h1d(i,12) * vec_in(12,j,k) &
5345 + mat_h1d(i,13) * vec_in(13,j,k) &
5346 + mat_h1d(i,14) * vec_in(14,j,k)
5347 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
5348 end do
5349 end do
5350 end do
5351
5352 ! Y-dir
5353 do k=1, 14
5354 do j=1, 14
5355 do i=1, 14
5356 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
5357 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
5358 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
5359 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
5360 + vec_out(i,5,k) * mat_h1d_tr(5,j)
5361 tmp2 = vec_out(i,6,k) * mat_h1d_tr(6,j) &
5362 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
5363 + vec_out(i,8,k) * mat_h1d_tr(8,j) &
5364 + vec_out(i,9,k) * mat_h1d_tr(9,j) &
5365 + vec_out(i,10,k) * mat_h1d_tr(10,j)
5366 tmp3 = vec_out(i,11,k) * mat_h1d_tr(11,j) &
5367 + vec_out(i,12,k) * mat_h1d_tr(12,j) &
5368 + vec_out(i,13,k) * mat_h1d_tr(13,j) &
5369 + vec_out(i,14,k) * mat_h1d_tr(14,j)
5370 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
5371 end do
5372 end do
5373 end do
5374
5375 ! Z-dir
5376 do k=1, 14
5377 do j=1, 14
5378 do i=1, 14
5379 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
5380 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
5381 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
5382 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
5383 + vec_work(i,j,5) * mat_v1d_tr(5,k)
5384 tmp2 = vec_work(i,j,6) * mat_v1d_tr(6,k) &
5385 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
5386 + vec_work(i,j,8) * mat_v1d_tr(8,k) &
5387 + vec_work(i,j,9) * mat_v1d_tr(9,k) &
5388 + vec_work(i,j,10) * mat_v1d_tr(10,k)
5389 tmp3 = vec_work(i,j,11) * mat_v1d_tr(11,k) &
5390 + vec_work(i,j,12) * mat_v1d_tr(12,k) &
5391 + vec_work(i,j,13) * mat_v1d_tr(13,k) &
5392 + vec_work(i,j,14) * mat_v1d_tr(14,k)
5393 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
5394 end do
5395 end do
5396 end do
5397
5398 return
5400
5401!--- For p=14 ------------------------------------
5402
5403!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=14
5404!!
5405!OCL SERIAL
5406 subroutine element_operation_kernel_matvec_dirx_p14( Mat_x, vec_in, vec_out )
5407 implicit none
5408 real(rp), intent(in) :: mat_x(15,15)
5409 real(rp), intent(in) :: vec_in(15,15**2)
5410 real(rp), intent(out) :: vec_out(15,15**2)
5411
5412 integer :: i, jk
5413 !----------------------------------------------------------
5414
5415 do jk=1, 15**2
5416 do i=1, 15
5417 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
5418 + mat_x(i,2) * vec_in(2,jk) &
5419 + mat_x(i,3) * vec_in(3,jk) &
5420 + mat_x(i,4) * vec_in(4,jk) &
5421 + mat_x(i,5) * vec_in(5,jk) &
5422 + mat_x(i,6) * vec_in(6,jk) &
5423 + mat_x(i,7) * vec_in(7,jk) &
5424 + mat_x(i,8) * vec_in(8,jk) &
5425 + mat_x(i,9) * vec_in(9,jk) &
5426 + mat_x(i,10) * vec_in(10,jk) &
5427 + mat_x(i,11) * vec_in(11,jk) &
5428 + mat_x(i,12) * vec_in(12,jk) &
5429 + mat_x(i,13) * vec_in(13,jk) &
5430 + mat_x(i,14) * vec_in(14,jk) &
5431 + mat_x(i,15) * vec_in(15,jk)
5432 end do
5433 end do
5434
5435 return
5437
5438!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=14
5439!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
5440!!
5441!OCL SERIAL
5442 subroutine element_operation_kernel_matvec_diry_p14( Mat_y_tr, vec_in, vec_out )
5443 implicit none
5444 real(rp), intent(in) :: mat_y_tr(15,15)
5445 real(rp), intent(in) :: vec_in(15,15,15)
5446 real(rp), intent(out) :: vec_out(15,15,15)
5447
5448 integer :: i, j, k
5449 !----------------------------------------------------------
5450
5451 do k=1, 15
5452 do j=1, 15
5453 do i=1, 15
5454 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
5455 + vec_in(i,2,k) * mat_y_tr(2,j) &
5456 + vec_in(i,3,k) * mat_y_tr(3,j) &
5457 + vec_in(i,4,k) * mat_y_tr(4,j) &
5458 + vec_in(i,5,k) * mat_y_tr(5,j) &
5459 + vec_in(i,6,k) * mat_y_tr(6,j) &
5460 + vec_in(i,7,k) * mat_y_tr(7,j) &
5461 + vec_in(i,8,k) * mat_y_tr(8,j) &
5462 + vec_in(i,9,k) * mat_y_tr(9,j) &
5463 + vec_in(i,10,k) * mat_y_tr(10,j) &
5464 + vec_in(i,11,k) * mat_y_tr(11,j) &
5465 + vec_in(i,12,k) * mat_y_tr(12,j) &
5466 + vec_in(i,13,k) * mat_y_tr(13,j) &
5467 + vec_in(i,14,k) * mat_y_tr(14,j) &
5468 + vec_in(i,15,k) * mat_y_tr(15,j)
5469 end do
5470 end do
5471 end do
5472
5473 return
5475
5476!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=14
5477!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
5478!!
5479!OCL SERIAL
5480 subroutine element_operation_kernel_matvec_dirz_p14( Mat_z_tr, vec_in, vec_out )
5481 implicit none
5482 real(rp), intent(in) :: mat_z_tr(15,15)
5483 real(rp), intent(in) :: vec_in(15,15,15)
5484 real(rp), intent(out) :: vec_out(15,15,15)
5485
5486 integer :: i, j, k
5487 !----------------------------------------------------------
5488
5489 do k=1, 15
5490 do j=1, 15
5491 do i=1, 15
5492 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
5493 + vec_in(i,j,2) * mat_z_tr(2,k) &
5494 + vec_in(i,j,3) * mat_z_tr(3,k) &
5495 + vec_in(i,j,4) * mat_z_tr(4,k) &
5496 + vec_in(i,j,5) * mat_z_tr(5,k) &
5497 + vec_in(i,j,6) * mat_z_tr(6,k) &
5498 + vec_in(i,j,7) * mat_z_tr(7,k) &
5499 + vec_in(i,j,8) * mat_z_tr(8,k) &
5500 + vec_in(i,j,9) * mat_z_tr(9,k) &
5501 + vec_in(i,j,10) * mat_z_tr(10,k) &
5502 + vec_in(i,j,11) * mat_z_tr(11,k) &
5503 + vec_in(i,j,12) * mat_z_tr(12,k) &
5504 + vec_in(i,j,13) * mat_z_tr(13,k) &
5505 + vec_in(i,j,14) * mat_z_tr(14,k) &
5506 + vec_in(i,j,15) * mat_z_tr(15,k)
5507 end do
5508 end do
5509 end do
5510
5511 return
5513
5514!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=14
5515!!
5516!OCL SERIAL
5518 implicit none
5519 real(rp), intent(in) :: lift(15,15,15,6)
5520 real(rp), intent(in) :: vec_in(15,15,6)
5521 real(rp), intent(out) :: vec_out(15,15,15)
5522
5523 integer :: i, j, k
5524 !----------------------------------------------------------
5525
5526 do k=1, 15
5527 do j=1, 15
5528 do i=1, 15
5529 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
5530 + lift(i,j,k,2) * vec_in(j,k,2) &
5531 + lift(i,j,k,3) * vec_in(i,k,3) &
5532 + lift(i,j,k,4) * vec_in(j,k,4) &
5533 + lift(i,j,k,5) * vec_in(i,j,5) &
5534 + lift(i,j,k,6) * vec_in(i,j,6)
5535 end do
5536 end do
5537 end do
5538
5539 return
5541
5542!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=14
5543!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
5544!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
5545!!
5546!OCL SERIAL
5547 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p14( Mat, Mat_tr, vec_in, vec_in_, &
5548 vec_out_x, vec_out_y, vec_out_z )
5549 implicit none
5550 real(rp), intent(in) :: mat(15,15)
5551 real(rp), intent(in) :: mat_tr(15,15)
5552 real(rp), intent(in) :: vec_in_(15,15**2)
5553 real(rp), intent(in) :: vec_in(15,15,15)
5554 real(rp), intent(out) :: vec_out_x(15,15**2)
5555 real(rp), intent(out) :: vec_out_y(15,15,15)
5556 real(rp), intent(out) :: vec_out_z(15,15,15)
5557
5558 integer :: i, j, k, jk
5559 !----------------------------------------------------------
5560
5561 ! X-dir
5562
5563 do jk=1, 15**2
5564 do i=1, 15
5565 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
5566 + mat(i,2) * vec_in_(2,jk) &
5567 + mat(i,3) * vec_in_(3,jk) &
5568 + mat(i,4) * vec_in_(4,jk) &
5569 + mat(i,5) * vec_in_(5,jk) &
5570 + mat(i,6) * vec_in_(6,jk) &
5571 + mat(i,7) * vec_in_(7,jk) &
5572 + mat(i,8) * vec_in_(8,jk) &
5573 + mat(i,9) * vec_in_(9,jk) &
5574 + mat(i,10) * vec_in_(10,jk) &
5575 + mat(i,11) * vec_in_(11,jk) &
5576 + mat(i,12) * vec_in_(12,jk) &
5577 + mat(i,13) * vec_in_(13,jk) &
5578 + mat(i,14) * vec_in_(14,jk) &
5579 + mat(i,15) * vec_in_(15,jk)
5580 end do
5581 end do
5582
5583 ! Y-dir
5584 do k=1, 15
5585 do j=1, 15
5586 do i=1, 15
5587 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
5588 + vec_in(i,2,k) * mat_tr(2,j) &
5589 + vec_in(i,3,k) * mat_tr(3,j) &
5590 + vec_in(i,4,k) * mat_tr(4,j) &
5591 + vec_in(i,5,k) * mat_tr(5,j) &
5592 + vec_in(i,6,k) * mat_tr(6,j) &
5593 + vec_in(i,7,k) * mat_tr(7,j) &
5594 + vec_in(i,8,k) * mat_tr(8,j) &
5595 + vec_in(i,9,k) * mat_tr(9,j) &
5596 + vec_in(i,10,k) * mat_tr(10,j) &
5597 + vec_in(i,11,k) * mat_tr(11,j) &
5598 + vec_in(i,12,k) * mat_tr(12,j) &
5599 + vec_in(i,13,k) * mat_tr(13,j) &
5600 + vec_in(i,14,k) * mat_tr(14,j) &
5601 + vec_in(i,15,k) * mat_tr(15,j)
5602 end do
5603 end do
5604 end do
5605
5606 ! Z-dir
5607 do k=1, 15
5608 do j=1, 15
5609 do i=1, 15
5610 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
5611 + vec_in(i,j,2) * mat_tr(2,k) &
5612 + vec_in(i,j,3) * mat_tr(3,k) &
5613 + vec_in(i,j,4) * mat_tr(4,k) &
5614 + vec_in(i,j,5) * mat_tr(5,k) &
5615 + vec_in(i,j,6) * mat_tr(6,k) &
5616 + vec_in(i,j,7) * mat_tr(7,k) &
5617 + vec_in(i,j,8) * mat_tr(8,k) &
5618 + vec_in(i,j,9) * mat_tr(9,k) &
5619 + vec_in(i,j,10) * mat_tr(10,k) &
5620 + vec_in(i,j,11) * mat_tr(11,k) &
5621 + vec_in(i,j,12) * mat_tr(12,k) &
5622 + vec_in(i,j,13) * mat_tr(13,k) &
5623 + vec_in(i,j,14) * mat_tr(14,k) &
5624 + vec_in(i,j,15) * mat_tr(15,k)
5625 end do
5626 end do
5627 end do
5628
5629 return
5631
5632!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=14
5633!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
5634!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
5635!!
5636!OCL SERIAL
5638 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
5639 vec_out_x, vec_out_y, vec_out_z )
5640 implicit none
5641 real(rp), intent(in) :: mat(15,15)
5642 real(rp), intent(in) :: mat_tr(15,15)
5643 real(rp), intent(in) :: vec_in_x(15,15**2)
5644 real(rp), intent(in) :: vec_in_y(15,15,15)
5645 real(rp), intent(in) :: vec_in_z(15,15,15)
5646 real(rp), intent(out) :: vec_out_x(15,15**2)
5647 real(rp), intent(out) :: vec_out_y(15,15**2)
5648 real(rp), intent(out) :: vec_out_z(15,15**2)
5649
5650 integer :: i, j, k, jk
5651 real(rp) :: tmp1, tmp2, tmp3
5652 !----------------------------------------------------------
5653
5654 ! X-dir
5655
5656 do jk=1, 15**2
5657 do i=1, 15
5658 tmp1 = mat(i,1) * vec_in_x(1,jk) &
5659 + mat(i,2) * vec_in_x(2,jk) &
5660 + mat(i,3) * vec_in_x(3,jk) &
5661 + mat(i,4) * vec_in_x(4,jk) &
5662 + mat(i,5) * vec_in_x(5,jk)
5663 tmp2 = mat(i,6) * vec_in_x(6,jk) &
5664 + mat(i,7) * vec_in_x(7,jk) &
5665 + mat(i,8) * vec_in_x(8,jk) &
5666 + mat(i,9) * vec_in_x(9,jk) &
5667 + mat(i,10) * vec_in_x(10,jk)
5668 tmp3 = mat(i,11) * vec_in_x(11,jk) &
5669 + mat(i,12) * vec_in_x(12,jk) &
5670 + mat(i,13) * vec_in_x(13,jk) &
5671 + mat(i,14) * vec_in_x(14,jk) &
5672 + mat(i,15) * vec_in_x(15,jk)
5673 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
5674 end do
5675 end do
5676
5677 ! Y-dir
5678 do k=1, 15
5679 do j=1, 15
5680 jk = j + (k-1)*15
5681 do i=1, 15
5682 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
5683 + vec_in_y(i,2,k) * mat_tr(2,j) &
5684 + vec_in_y(i,3,k) * mat_tr(3,j) &
5685 + vec_in_y(i,4,k) * mat_tr(4,j) &
5686 + vec_in_y(i,5,k) * mat_tr(5,j)
5687 tmp2 = vec_in_y(i,6,k) * mat_tr(6,j) &
5688 + vec_in_y(i,7,k) * mat_tr(7,j) &
5689 + vec_in_y(i,8,k) * mat_tr(8,j) &
5690 + vec_in_y(i,9,k) * mat_tr(9,j) &
5691 + vec_in_y(i,10,k) * mat_tr(10,j)
5692 tmp3 = vec_in_y(i,11,k) * mat_tr(11,j) &
5693 + vec_in_y(i,12,k) * mat_tr(12,j) &
5694 + vec_in_y(i,13,k) * mat_tr(13,j) &
5695 + vec_in_y(i,14,k) * mat_tr(14,j) &
5696 + vec_in_y(i,15,k) * mat_tr(15,j)
5697 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
5698 end do
5699 end do
5700 end do
5701
5702 ! Z-dir
5703 do k=1, 15
5704 do j=1, 15
5705 jk = j + (k-1)*15
5706 do i=1, 15
5707 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
5708 + vec_in_z(i,j,2) * mat_tr(2,k) &
5709 + vec_in_z(i,j,3) * mat_tr(3,k) &
5710 + vec_in_z(i,j,4) * mat_tr(4,k) &
5711 + vec_in_z(i,j,5) * mat_tr(5,k)
5712 tmp2 = vec_in_z(i,j,6) * mat_tr(6,k) &
5713 + vec_in_z(i,j,7) * mat_tr(7,k) &
5714 + vec_in_z(i,j,8) * mat_tr(8,k) &
5715 + vec_in_z(i,j,9) * mat_tr(9,k) &
5716 + vec_in_z(i,j,10) * mat_tr(10,k)
5717 tmp3 = vec_in_z(i,j,11) * mat_tr(11,k) &
5718 + vec_in_z(i,j,12) * mat_tr(12,k) &
5719 + vec_in_z(i,j,13) * mat_tr(13,k) &
5720 + vec_in_z(i,j,14) * mat_tr(14,k) &
5721 + vec_in_z(i,j,15) * mat_tr(15,k)
5722 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
5723 end do
5724 end do
5725 end do
5726 return
5728
5729!OCL SERIAL
5730 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p14( &
5731 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
5732 vec_out_x, vec_out_y, vec_out_z )
5733 implicit none
5734 real(rp), intent(in) :: mat(15,15)
5735 real(rp), intent(in) :: mat_tr(15,15)
5736 real(rp), intent(in) :: vec_in_x(15,15**2*5)
5737 real(rp), intent(in) :: vec_in_y(15,15,15*5)
5738 real(rp), intent(in) :: vec_in_z(15,15,15,5)
5739 real(rp), intent(out) :: vec_out_x(15,15**2*5)
5740 real(rp), intent(out) :: vec_out_y(15,15**2*5)
5741 real(rp), intent(out) :: vec_out_z(15,15**2,5)
5742
5743 integer :: i, j, k, jkv, jk, v, kv
5744 real(rp) :: tmp1, tmp2, tmp3
5745 !----------------------------------------------------------
5746
5747 ! X-dir
5748
5749 do jkv=1, 15**2*5
5750 do i=1, 15
5751 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
5752 + mat(i,2) * vec_in_x(2,jkv) &
5753 + mat(i,3) * vec_in_x(3,jkv) &
5754 + mat(i,4) * vec_in_x(4,jkv) &
5755 + mat(i,5) * vec_in_x(5,jkv)
5756 tmp2 = mat(i,6) * vec_in_x(6,jkv) &
5757 + mat(i,7) * vec_in_x(7,jkv) &
5758 + mat(i,8) * vec_in_x(8,jkv) &
5759 + mat(i,9) * vec_in_x(9,jkv) &
5760 + mat(i,10) * vec_in_x(10,jkv)
5761 tmp3 = mat(i,11) * vec_in_x(11,jkv) &
5762 + mat(i,12) * vec_in_x(12,jkv) &
5763 + mat(i,13) * vec_in_x(13,jkv) &
5764 + mat(i,14) * vec_in_x(14,jkv) &
5765 + mat(i,15) * vec_in_x(15,jkv)
5766 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
5767 end do
5768 end do
5769
5770 ! Y-dir
5771 do kv=1, 15*5
5772 do j=1, 15
5773 jkv = j + (kv-1)*75
5774 do i=1, 15
5775 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
5776 + vec_in_y(i,2,kv) * mat_tr(2,j) &
5777 + vec_in_y(i,3,kv) * mat_tr(3,j) &
5778 + vec_in_y(i,4,kv) * mat_tr(4,j) &
5779 + vec_in_y(i,5,kv) * mat_tr(5,j)
5780 tmp2 = vec_in_y(i,6,kv) * mat_tr(6,j) &
5781 + vec_in_y(i,7,kv) * mat_tr(7,j) &
5782 + vec_in_y(i,8,kv) * mat_tr(8,j) &
5783 + vec_in_y(i,9,kv) * mat_tr(9,j) &
5784 + vec_in_y(i,10,kv) * mat_tr(10,j)
5785 tmp3 = vec_in_y(i,11,kv) * mat_tr(11,j) &
5786 + vec_in_y(i,12,kv) * mat_tr(12,j) &
5787 + vec_in_y(i,13,kv) * mat_tr(13,j) &
5788 + vec_in_y(i,14,kv) * mat_tr(14,j) &
5789 + vec_in_y(i,15,kv) * mat_tr(15,j)
5790 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
5791 end do
5792 end do
5793 end do
5794
5795 ! Z-dir
5796 do v=1, 5
5797 do k=1, 15
5798 do j=1, 15
5799 jk = j + (k-1)*15
5800 do i=1, 15
5801 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
5802 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
5803 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
5804 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
5805 + vec_in_z(i,j,5,v) * mat_tr(5,k)
5806 tmp2 = vec_in_z(i,j,6,v) * mat_tr(6,k) &
5807 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
5808 + vec_in_z(i,j,8,v) * mat_tr(8,k) &
5809 + vec_in_z(i,j,9,v) * mat_tr(9,k) &
5810 + vec_in_z(i,j,10,v) * mat_tr(10,k)
5811 tmp3 = vec_in_z(i,j,11,v) * mat_tr(11,k) &
5812 + vec_in_z(i,j,12,v) * mat_tr(12,k) &
5813 + vec_in_z(i,j,13,v) * mat_tr(13,k) &
5814 + vec_in_z(i,j,14,v) * mat_tr(14,k) &
5815 + vec_in_z(i,j,15,v) * mat_tr(15,k)
5816 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
5817 end do
5818 end do
5819 end do
5820 end do
5821 return
5822 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p14
5823
5824!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=14
5825!!
5826!OCL SERIAL
5827 subroutine element_operation_kernel_matvec_modalfilter_p14( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
5828 vec_out )
5829 implicit none
5830 real(rp), intent(in) :: mat_h1d(15,15)
5831 real(rp), intent(in) :: mat_h1d_tr(15,15)
5832 real(rp), intent(in) :: mat_v1d_tr(15,15)
5833 real(rp), intent(in) :: vec_in(15,15,15)
5834 real(rp), intent(out) :: vec_work(15,15,15)
5835 real(rp), intent(out) :: vec_out(15,15,15)
5836
5837 integer :: i, j, k
5838 real(rp) :: tmp1, tmp2, tmp3
5839 !----------------------------------------------------------
5840
5841 ! X-dir
5842
5843 do k=1, 15
5844 do j=1, 15
5845 do i=1, 15
5846 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
5847 + mat_h1d(i,2) * vec_in(2,j,k) &
5848 + mat_h1d(i,3) * vec_in(3,j,k) &
5849 + mat_h1d(i,4) * vec_in(4,j,k) &
5850 + mat_h1d(i,5) * vec_in(5,j,k)
5851 tmp2 = mat_h1d(i,6) * vec_in(6,j,k) &
5852 + mat_h1d(i,7) * vec_in(7,j,k) &
5853 + mat_h1d(i,8) * vec_in(8,j,k) &
5854 + mat_h1d(i,9) * vec_in(9,j,k) &
5855 + mat_h1d(i,10) * vec_in(10,j,k)
5856 tmp3 = mat_h1d(i,11) * vec_in(11,j,k) &
5857 + mat_h1d(i,12) * vec_in(12,j,k) &
5858 + mat_h1d(i,13) * vec_in(13,j,k) &
5859 + mat_h1d(i,14) * vec_in(14,j,k) &
5860 + mat_h1d(i,15) * vec_in(15,j,k)
5861 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
5862 end do
5863 end do
5864 end do
5865
5866 ! Y-dir
5867 do k=1, 15
5868 do j=1, 15
5869 do i=1, 15
5870 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
5871 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
5872 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
5873 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
5874 + vec_out(i,5,k) * mat_h1d_tr(5,j)
5875 tmp2 = vec_out(i,6,k) * mat_h1d_tr(6,j) &
5876 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
5877 + vec_out(i,8,k) * mat_h1d_tr(8,j) &
5878 + vec_out(i,9,k) * mat_h1d_tr(9,j) &
5879 + vec_out(i,10,k) * mat_h1d_tr(10,j)
5880 tmp3 = vec_out(i,11,k) * mat_h1d_tr(11,j) &
5881 + vec_out(i,12,k) * mat_h1d_tr(12,j) &
5882 + vec_out(i,13,k) * mat_h1d_tr(13,j) &
5883 + vec_out(i,14,k) * mat_h1d_tr(14,j) &
5884 + vec_out(i,15,k) * mat_h1d_tr(15,j)
5885 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
5886 end do
5887 end do
5888 end do
5889
5890 ! Z-dir
5891 do k=1, 15
5892 do j=1, 15
5893 do i=1, 15
5894 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
5895 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
5896 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
5897 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
5898 + vec_work(i,j,5) * mat_v1d_tr(5,k)
5899 tmp2 = vec_work(i,j,6) * mat_v1d_tr(6,k) &
5900 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
5901 + vec_work(i,j,8) * mat_v1d_tr(8,k) &
5902 + vec_work(i,j,9) * mat_v1d_tr(9,k) &
5903 + vec_work(i,j,10) * mat_v1d_tr(10,k)
5904 tmp3 = vec_work(i,j,11) * mat_v1d_tr(11,k) &
5905 + vec_work(i,j,12) * mat_v1d_tr(12,k) &
5906 + vec_work(i,j,13) * mat_v1d_tr(13,k) &
5907 + vec_work(i,j,14) * mat_v1d_tr(14,k) &
5908 + vec_work(i,j,15) * mat_v1d_tr(15,k)
5909 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
5910 end do
5911 end do
5912 end do
5913
5914 return
5916
5917!--- For p=15 ------------------------------------
5918
5919!> Calculate a matrix-vector multiplication associated with mathematical operations in the x direction (first dimension of vec_in) with p=15
5920!!
5921!OCL SERIAL
5922 subroutine element_operation_kernel_matvec_dirx_p15( Mat_x, vec_in, vec_out )
5923 implicit none
5924 real(rp), intent(in) :: mat_x(16,16)
5925 real(rp), intent(in) :: vec_in(16,16**2)
5926 real(rp), intent(out) :: vec_out(16,16**2)
5927
5928 integer :: i, jk
5929 !----------------------------------------------------------
5930
5931 do jk=1, 16**2
5932 do i=1, 16
5933 vec_out(i,jk) = mat_x(i,1) * vec_in(1,jk) &
5934 + mat_x(i,2) * vec_in(2,jk) &
5935 + mat_x(i,3) * vec_in(3,jk) &
5936 + mat_x(i,4) * vec_in(4,jk) &
5937 + mat_x(i,5) * vec_in(5,jk) &
5938 + mat_x(i,6) * vec_in(6,jk) &
5939 + mat_x(i,7) * vec_in(7,jk) &
5940 + mat_x(i,8) * vec_in(8,jk) &
5941 + mat_x(i,9) * vec_in(9,jk) &
5942 + mat_x(i,10) * vec_in(10,jk) &
5943 + mat_x(i,11) * vec_in(11,jk) &
5944 + mat_x(i,12) * vec_in(12,jk) &
5945 + mat_x(i,13) * vec_in(13,jk) &
5946 + mat_x(i,14) * vec_in(14,jk) &
5947 + mat_x(i,15) * vec_in(15,jk) &
5948 + mat_x(i,16) * vec_in(16,jk)
5949 end do
5950 end do
5951
5952 return
5954
5955!> Calculate a matrix-vector multiplication associated with mathematical operations in the y direction (second dimension of vec_in) with p=15
5956!! For a matrix-vector multiplication (vec_out = Mat_y vec_in), the passed variable of Mat_y should be transposed.
5957!!
5958!OCL SERIAL
5959 subroutine element_operation_kernel_matvec_diry_p15( Mat_y_tr, vec_in, vec_out )
5960 implicit none
5961 real(rp), intent(in) :: mat_y_tr(16,16)
5962 real(rp), intent(in) :: vec_in(16,16,16)
5963 real(rp), intent(out) :: vec_out(16,16,16)
5964
5965 integer :: i, j, k
5966 !----------------------------------------------------------
5967
5968 do k=1, 16
5969 do j=1, 16
5970 do i=1, 16
5971 vec_out(i,j,k) = vec_in(i,1,k) * mat_y_tr(1,j) &
5972 + vec_in(i,2,k) * mat_y_tr(2,j) &
5973 + vec_in(i,3,k) * mat_y_tr(3,j) &
5974 + vec_in(i,4,k) * mat_y_tr(4,j) &
5975 + vec_in(i,5,k) * mat_y_tr(5,j) &
5976 + vec_in(i,6,k) * mat_y_tr(6,j) &
5977 + vec_in(i,7,k) * mat_y_tr(7,j) &
5978 + vec_in(i,8,k) * mat_y_tr(8,j) &
5979 + vec_in(i,9,k) * mat_y_tr(9,j) &
5980 + vec_in(i,10,k) * mat_y_tr(10,j) &
5981 + vec_in(i,11,k) * mat_y_tr(11,j) &
5982 + vec_in(i,12,k) * mat_y_tr(12,j) &
5983 + vec_in(i,13,k) * mat_y_tr(13,j) &
5984 + vec_in(i,14,k) * mat_y_tr(14,j) &
5985 + vec_in(i,15,k) * mat_y_tr(15,j) &
5986 + vec_in(i,16,k) * mat_y_tr(16,j)
5987 end do
5988 end do
5989 end do
5990
5991 return
5993
5994!> Calculate a matrix-vector multiplication associated with mathematical operations in the z direction (third dimension of vec_in) with p=15
5995!! For a matrix-vector multiplication (vec_out = Mat_z vec_in), the passed variable of Mat_z should be transposed.
5996!!
5997!OCL SERIAL
5998 subroutine element_operation_kernel_matvec_dirz_p15( Mat_z_tr, vec_in, vec_out )
5999 implicit none
6000 real(rp), intent(in) :: mat_z_tr(16,16)
6001 real(rp), intent(in) :: vec_in(16,16,16)
6002 real(rp), intent(out) :: vec_out(16,16,16)
6003
6004 integer :: i, j, k
6005 !----------------------------------------------------------
6006
6007 do k=1, 16
6008 do j=1, 16
6009 do i=1, 16
6010 vec_out(i,j,k) = vec_in(i,j,1) * mat_z_tr(1,k) &
6011 + vec_in(i,j,2) * mat_z_tr(2,k) &
6012 + vec_in(i,j,3) * mat_z_tr(3,k) &
6013 + vec_in(i,j,4) * mat_z_tr(4,k) &
6014 + vec_in(i,j,5) * mat_z_tr(5,k) &
6015 + vec_in(i,j,6) * mat_z_tr(6,k) &
6016 + vec_in(i,j,7) * mat_z_tr(7,k) &
6017 + vec_in(i,j,8) * mat_z_tr(8,k) &
6018 + vec_in(i,j,9) * mat_z_tr(9,k) &
6019 + vec_in(i,j,10) * mat_z_tr(10,k) &
6020 + vec_in(i,j,11) * mat_z_tr(11,k) &
6021 + vec_in(i,j,12) * mat_z_tr(12,k) &
6022 + vec_in(i,j,13) * mat_z_tr(13,k) &
6023 + vec_in(i,j,14) * mat_z_tr(14,k) &
6024 + vec_in(i,j,15) * mat_z_tr(15,k) &
6025 + vec_in(i,j,16) * mat_z_tr(16,k)
6026 end do
6027 end do
6028 end do
6029
6030 return
6032
6033!> Calculate a matrix-vector multiplication with lifting operations for a hexahedral element of order p=15
6034!!
6035!OCL SERIAL
6037 implicit none
6038 real(rp), intent(in) :: lift(16,16,16,6)
6039 real(rp), intent(in) :: vec_in(16,16,6)
6040 real(rp), intent(out) :: vec_out(16,16,16)
6041
6042 integer :: i, j, k
6043 !----------------------------------------------------------
6044
6045 do k=1, 16
6046 do j=1, 16
6047 do i=1, 16
6048 vec_out(i,j,k) = lift(i,j,k,1) * vec_in(i,k,1) &
6049 + lift(i,j,k,2) * vec_in(j,k,2) &
6050 + lift(i,j,k,3) * vec_in(i,k,3) &
6051 + lift(i,j,k,4) * vec_in(j,k,4) &
6052 + lift(i,j,k,5) * vec_in(i,j,5) &
6053 + lift(i,j,k,6) * vec_in(i,j,6)
6054 end do
6055 end do
6056 end do
6057
6058 return
6060
6061!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=15
6062!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
6063!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
6064!!
6065!OCL SERIAL
6066 subroutine element_operation_kernel_matvec_gradlike_dirxyz_p15( Mat, Mat_tr, vec_in, vec_in_, &
6067 vec_out_x, vec_out_y, vec_out_z )
6068 implicit none
6069 real(rp), intent(in) :: mat(16,16)
6070 real(rp), intent(in) :: mat_tr(16,16)
6071 real(rp), intent(in) :: vec_in_(16,16**2)
6072 real(rp), intent(in) :: vec_in(16,16,16)
6073 real(rp), intent(out) :: vec_out_x(16,16**2)
6074 real(rp), intent(out) :: vec_out_y(16,16,16)
6075 real(rp), intent(out) :: vec_out_z(16,16,16)
6076
6077 integer :: i, j, k, jk
6078 !----------------------------------------------------------
6079
6080 ! X-dir
6081
6082 do jk=1, 16**2
6083 do i=1, 16
6084 vec_out_x(i,jk) = mat(i,1) * vec_in_(1,jk) &
6085 + mat(i,2) * vec_in_(2,jk) &
6086 + mat(i,3) * vec_in_(3,jk) &
6087 + mat(i,4) * vec_in_(4,jk) &
6088 + mat(i,5) * vec_in_(5,jk) &
6089 + mat(i,6) * vec_in_(6,jk) &
6090 + mat(i,7) * vec_in_(7,jk) &
6091 + mat(i,8) * vec_in_(8,jk) &
6092 + mat(i,9) * vec_in_(9,jk) &
6093 + mat(i,10) * vec_in_(10,jk) &
6094 + mat(i,11) * vec_in_(11,jk) &
6095 + mat(i,12) * vec_in_(12,jk) &
6096 + mat(i,13) * vec_in_(13,jk) &
6097 + mat(i,14) * vec_in_(14,jk) &
6098 + mat(i,15) * vec_in_(15,jk) &
6099 + mat(i,16) * vec_in_(16,jk)
6100 end do
6101 end do
6102
6103 ! Y-dir
6104 do k=1, 16
6105 do j=1, 16
6106 do i=1, 16
6107 vec_out_y(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
6108 + vec_in(i,2,k) * mat_tr(2,j) &
6109 + vec_in(i,3,k) * mat_tr(3,j) &
6110 + vec_in(i,4,k) * mat_tr(4,j) &
6111 + vec_in(i,5,k) * mat_tr(5,j) &
6112 + vec_in(i,6,k) * mat_tr(6,j) &
6113 + vec_in(i,7,k) * mat_tr(7,j) &
6114 + vec_in(i,8,k) * mat_tr(8,j) &
6115 + vec_in(i,9,k) * mat_tr(9,j) &
6116 + vec_in(i,10,k) * mat_tr(10,j) &
6117 + vec_in(i,11,k) * mat_tr(11,j) &
6118 + vec_in(i,12,k) * mat_tr(12,j) &
6119 + vec_in(i,13,k) * mat_tr(13,j) &
6120 + vec_in(i,14,k) * mat_tr(14,j) &
6121 + vec_in(i,15,k) * mat_tr(15,j) &
6122 + vec_in(i,16,k) * mat_tr(16,j)
6123 end do
6124 end do
6125 end do
6126
6127 ! Z-dir
6128 do k=1, 16
6129 do j=1, 16
6130 do i=1, 16
6131 vec_out_z(i,j,k) = vec_in(i,1,k) * mat_tr(1,j) &
6132 + vec_in(i,j,2) * mat_tr(2,k) &
6133 + vec_in(i,j,3) * mat_tr(3,k) &
6134 + vec_in(i,j,4) * mat_tr(4,k) &
6135 + vec_in(i,j,5) * mat_tr(5,k) &
6136 + vec_in(i,j,6) * mat_tr(6,k) &
6137 + vec_in(i,j,7) * mat_tr(7,k) &
6138 + vec_in(i,j,8) * mat_tr(8,k) &
6139 + vec_in(i,j,9) * mat_tr(9,k) &
6140 + vec_in(i,j,10) * mat_tr(10,k) &
6141 + vec_in(i,j,11) * mat_tr(11,k) &
6142 + vec_in(i,j,12) * mat_tr(12,k) &
6143 + vec_in(i,j,13) * mat_tr(13,k) &
6144 + vec_in(i,j,14) * mat_tr(14,k) &
6145 + vec_in(i,j,15) * mat_tr(15,k) &
6146 + vec_in(i,j,16) * mat_tr(16,k)
6147 end do
6148 end do
6149 end do
6150
6151 return
6153
6154!> Calculate a matrix-vector multiplication associated with mathematical operations in the x, y, and z direction (third dimension of vec_in) with p=15
6155!! For a matrix-vector multiplication (vec_d_out = Mat_d vec_d_in where d=x,y,z), the passed variables of Mat_y and Mat_z should be transposed.
6156!! Note that we assume that vec_in_ has same data as vec_in, but are reshaped via the call of this subroutine.
6157!!
6158!OCL SERIAL
6160 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
6161 vec_out_x, vec_out_y, vec_out_z )
6162 implicit none
6163 real(rp), intent(in) :: mat(16,16)
6164 real(rp), intent(in) :: mat_tr(16,16)
6165 real(rp), intent(in) :: vec_in_x(16,16**2)
6166 real(rp), intent(in) :: vec_in_y(16,16,16)
6167 real(rp), intent(in) :: vec_in_z(16,16,16)
6168 real(rp), intent(out) :: vec_out_x(16,16**2)
6169 real(rp), intent(out) :: vec_out_y(16,16**2)
6170 real(rp), intent(out) :: vec_out_z(16,16**2)
6171
6172 integer :: i, j, k, jk
6173 real(rp) :: tmp1, tmp2, tmp3
6174 !----------------------------------------------------------
6175
6176 ! X-dir
6177
6178 do jk=1, 16**2
6179 do i=1, 16
6180 tmp1 = mat(i,1) * vec_in_x(1,jk) &
6181 + mat(i,2) * vec_in_x(2,jk) &
6182 + mat(i,3) * vec_in_x(3,jk) &
6183 + mat(i,4) * vec_in_x(4,jk) &
6184 + mat(i,5) * vec_in_x(5,jk)
6185 tmp2 = mat(i,6) * vec_in_x(6,jk) &
6186 + mat(i,7) * vec_in_x(7,jk) &
6187 + mat(i,8) * vec_in_x(8,jk) &
6188 + mat(i,9) * vec_in_x(9,jk) &
6189 + mat(i,10) * vec_in_x(10,jk)
6190 tmp3 = mat(i,11) * vec_in_x(11,jk) &
6191 + mat(i,12) * vec_in_x(12,jk) &
6192 + mat(i,13) * vec_in_x(13,jk) &
6193 + mat(i,14) * vec_in_x(14,jk) &
6194 + mat(i,15) * vec_in_x(15,jk) &
6195 + mat(i,16) * vec_in_x(16,jk)
6196 vec_out_x(i,jk) = tmp1 + tmp2 + tmp3
6197 end do
6198 end do
6199
6200 ! Y-dir
6201 do k=1, 16
6202 do j=1, 16
6203 jk = j + (k-1)*16
6204 do i=1, 16
6205 tmp1 = vec_in_y(i,1,k) * mat_tr(1,j) &
6206 + vec_in_y(i,2,k) * mat_tr(2,j) &
6207 + vec_in_y(i,3,k) * mat_tr(3,j) &
6208 + vec_in_y(i,4,k) * mat_tr(4,j) &
6209 + vec_in_y(i,5,k) * mat_tr(5,j)
6210 tmp2 = vec_in_y(i,6,k) * mat_tr(6,j) &
6211 + vec_in_y(i,7,k) * mat_tr(7,j) &
6212 + vec_in_y(i,8,k) * mat_tr(8,j) &
6213 + vec_in_y(i,9,k) * mat_tr(9,j) &
6214 + vec_in_y(i,10,k) * mat_tr(10,j)
6215 tmp3 = vec_in_y(i,11,k) * mat_tr(11,j) &
6216 + vec_in_y(i,12,k) * mat_tr(12,j) &
6217 + vec_in_y(i,13,k) * mat_tr(13,j) &
6218 + vec_in_y(i,14,k) * mat_tr(14,j) &
6219 + vec_in_y(i,15,k) * mat_tr(15,j) &
6220 + vec_in_y(i,16,k) * mat_tr(16,j)
6221 vec_out_y(i,jk) = tmp1 + tmp2 + tmp3
6222 end do
6223 end do
6224 end do
6225
6226 ! Z-dir
6227 do k=1, 16
6228 do j=1, 16
6229 jk = j + (k-1)*16
6230 do i=1, 16
6231 tmp1 = vec_in_z(i,j,1) * mat_tr(1,k) &
6232 + vec_in_z(i,j,2) * mat_tr(2,k) &
6233 + vec_in_z(i,j,3) * mat_tr(3,k) &
6234 + vec_in_z(i,j,4) * mat_tr(4,k) &
6235 + vec_in_z(i,j,5) * mat_tr(5,k)
6236 tmp2 = vec_in_z(i,j,6) * mat_tr(6,k) &
6237 + vec_in_z(i,j,7) * mat_tr(7,k) &
6238 + vec_in_z(i,j,8) * mat_tr(8,k) &
6239 + vec_in_z(i,j,9) * mat_tr(9,k) &
6240 + vec_in_z(i,j,10) * mat_tr(10,k)
6241 tmp3 = vec_in_z(i,j,11) * mat_tr(11,k) &
6242 + vec_in_z(i,j,12) * mat_tr(12,k) &
6243 + vec_in_z(i,j,13) * mat_tr(13,k) &
6244 + vec_in_z(i,j,14) * mat_tr(14,k) &
6245 + vec_in_z(i,j,15) * mat_tr(15,k) &
6246 + vec_in_z(i,j,16) * mat_tr(16,k)
6247 vec_out_z(i,jk) = tmp1 + tmp2 + tmp3
6248 end do
6249 end do
6250 end do
6251 return
6253
6254!OCL SERIAL
6255 subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p15( &
6256 Mat, Mat_tr, vec_in_x, vec_in_y, vec_in_z, &
6257 vec_out_x, vec_out_y, vec_out_z )
6258 implicit none
6259 real(rp), intent(in) :: mat(16,16)
6260 real(rp), intent(in) :: mat_tr(16,16)
6261 real(rp), intent(in) :: vec_in_x(16,16**2*5)
6262 real(rp), intent(in) :: vec_in_y(16,16,16*5)
6263 real(rp), intent(in) :: vec_in_z(16,16,16,5)
6264 real(rp), intent(out) :: vec_out_x(16,16**2*5)
6265 real(rp), intent(out) :: vec_out_y(16,16**2*5)
6266 real(rp), intent(out) :: vec_out_z(16,16**2,5)
6267
6268 integer :: i, j, k, jkv, jk, v, kv
6269 real(rp) :: tmp1, tmp2, tmp3
6270 !----------------------------------------------------------
6271
6272 ! X-dir
6273
6274 do jkv=1, 16**2*5
6275 do i=1, 16
6276 tmp1 = mat(i,1) * vec_in_x(1,jkv) &
6277 + mat(i,2) * vec_in_x(2,jkv) &
6278 + mat(i,3) * vec_in_x(3,jkv) &
6279 + mat(i,4) * vec_in_x(4,jkv) &
6280 + mat(i,5) * vec_in_x(5,jkv)
6281 tmp2 = mat(i,6) * vec_in_x(6,jkv) &
6282 + mat(i,7) * vec_in_x(7,jkv) &
6283 + mat(i,8) * vec_in_x(8,jkv) &
6284 + mat(i,9) * vec_in_x(9,jkv) &
6285 + mat(i,10) * vec_in_x(10,jkv)
6286 tmp3 = mat(i,11) * vec_in_x(11,jkv) &
6287 + mat(i,12) * vec_in_x(12,jkv) &
6288 + mat(i,13) * vec_in_x(13,jkv) &
6289 + mat(i,14) * vec_in_x(14,jkv) &
6290 + mat(i,15) * vec_in_x(15,jkv) &
6291 + mat(i,16) * vec_in_x(16,jkv)
6292 vec_out_x(i,jkv) = tmp1 + tmp2 + tmp3
6293 end do
6294 end do
6295
6296 ! Y-dir
6297 do kv=1, 16*5
6298 do j=1, 16
6299 jkv = j + (kv-1)*80
6300 do i=1, 16
6301 tmp1 = vec_in_y(i,1,kv) * mat_tr(1,j) &
6302 + vec_in_y(i,2,kv) * mat_tr(2,j) &
6303 + vec_in_y(i,3,kv) * mat_tr(3,j) &
6304 + vec_in_y(i,4,kv) * mat_tr(4,j) &
6305 + vec_in_y(i,5,kv) * mat_tr(5,j)
6306 tmp2 = vec_in_y(i,6,kv) * mat_tr(6,j) &
6307 + vec_in_y(i,7,kv) * mat_tr(7,j) &
6308 + vec_in_y(i,8,kv) * mat_tr(8,j) &
6309 + vec_in_y(i,9,kv) * mat_tr(9,j) &
6310 + vec_in_y(i,10,kv) * mat_tr(10,j)
6311 tmp3 = vec_in_y(i,11,kv) * mat_tr(11,j) &
6312 + vec_in_y(i,12,kv) * mat_tr(12,j) &
6313 + vec_in_y(i,13,kv) * mat_tr(13,j) &
6314 + vec_in_y(i,14,kv) * mat_tr(14,j) &
6315 + vec_in_y(i,15,kv) * mat_tr(15,j) &
6316 + vec_in_y(i,16,kv) * mat_tr(16,j)
6317 vec_out_y(i,jkv) = tmp1 + tmp2 + tmp3
6318 end do
6319 end do
6320 end do
6321
6322 ! Z-dir
6323 do v=1, 5
6324 do k=1, 16
6325 do j=1, 16
6326 jk = j + (k-1)*16
6327 do i=1, 16
6328 tmp1 = vec_in_z(i,j,1,v) * mat_tr(1,k) &
6329 + vec_in_z(i,j,2,v) * mat_tr(2,k) &
6330 + vec_in_z(i,j,3,v) * mat_tr(3,k) &
6331 + vec_in_z(i,j,4,v) * mat_tr(4,k) &
6332 + vec_in_z(i,j,5,v) * mat_tr(5,k)
6333 tmp2 = vec_in_z(i,j,6,v) * mat_tr(6,k) &
6334 + vec_in_z(i,j,7,v) * mat_tr(7,k) &
6335 + vec_in_z(i,j,8,v) * mat_tr(8,k) &
6336 + vec_in_z(i,j,9,v) * mat_tr(9,k) &
6337 + vec_in_z(i,j,10,v) * mat_tr(10,k)
6338 tmp3 = vec_in_z(i,j,11,v) * mat_tr(11,k) &
6339 + vec_in_z(i,j,12,v) * mat_tr(12,k) &
6340 + vec_in_z(i,j,13,v) * mat_tr(13,k) &
6341 + vec_in_z(i,j,14,v) * mat_tr(14,k) &
6342 + vec_in_z(i,j,15,v) * mat_tr(15,k) &
6343 + vec_in_z(i,j,16,v) * mat_tr(16,k)
6344 vec_out_z(i,jk,v) = tmp1 + tmp2 + tmp3
6345 end do
6346 end do
6347 end do
6348 end do
6349 return
6350 end subroutine element_operation_kernel_matvec_divlike_dirxyz_var5_p15
6351
6352!> Calculate a matrix-vector multiplication associated with 3D modal filtering with p=15
6353!!
6354!OCL SERIAL
6355 subroutine element_operation_kernel_matvec_modalfilter_p15( Mat_h1D, Mat_h1D_tr, Mat_v1D_tr, vec_in, vec_work, &
6356 vec_out )
6357 implicit none
6358 real(rp), intent(in) :: mat_h1d(16,16)
6359 real(rp), intent(in) :: mat_h1d_tr(16,16)
6360 real(rp), intent(in) :: mat_v1d_tr(16,16)
6361 real(rp), intent(in) :: vec_in(16,16,16)
6362 real(rp), intent(out) :: vec_work(16,16,16)
6363 real(rp), intent(out) :: vec_out(16,16,16)
6364
6365 integer :: i, j, k
6366 real(rp) :: tmp1, tmp2, tmp3
6367 !----------------------------------------------------------
6368
6369 ! X-dir
6370
6371 do k=1, 16
6372 do j=1, 16
6373 do i=1, 16
6374 tmp1 = mat_h1d(i,1) * vec_in(1,j,k) &
6375 + mat_h1d(i,2) * vec_in(2,j,k) &
6376 + mat_h1d(i,3) * vec_in(3,j,k) &
6377 + mat_h1d(i,4) * vec_in(4,j,k) &
6378 + mat_h1d(i,5) * vec_in(5,j,k)
6379 tmp2 = mat_h1d(i,6) * vec_in(6,j,k) &
6380 + mat_h1d(i,7) * vec_in(7,j,k) &
6381 + mat_h1d(i,8) * vec_in(8,j,k) &
6382 + mat_h1d(i,9) * vec_in(9,j,k) &
6383 + mat_h1d(i,10) * vec_in(10,j,k)
6384 tmp3 = mat_h1d(i,11) * vec_in(11,j,k) &
6385 + mat_h1d(i,12) * vec_in(12,j,k) &
6386 + mat_h1d(i,13) * vec_in(13,j,k) &
6387 + mat_h1d(i,14) * vec_in(14,j,k) &
6388 + mat_h1d(i,15) * vec_in(15,j,k) &
6389 + mat_h1d(i,16) * vec_in(16,j,k)
6390 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
6391 end do
6392 end do
6393 end do
6394
6395 ! Y-dir
6396 do k=1, 16
6397 do j=1, 16
6398 do i=1, 16
6399 tmp1 = vec_out(i,1,k) * mat_h1d_tr(1,j) &
6400 + vec_out(i,2,k) * mat_h1d_tr(2,j) &
6401 + vec_out(i,3,k) * mat_h1d_tr(3,j) &
6402 + vec_out(i,4,k) * mat_h1d_tr(4,j) &
6403 + vec_out(i,5,k) * mat_h1d_tr(5,j)
6404 tmp2 = vec_out(i,6,k) * mat_h1d_tr(6,j) &
6405 + vec_out(i,7,k) * mat_h1d_tr(7,j) &
6406 + vec_out(i,8,k) * mat_h1d_tr(8,j) &
6407 + vec_out(i,9,k) * mat_h1d_tr(9,j) &
6408 + vec_out(i,10,k) * mat_h1d_tr(10,j)
6409 tmp3 = vec_out(i,11,k) * mat_h1d_tr(11,j) &
6410 + vec_out(i,12,k) * mat_h1d_tr(12,j) &
6411 + vec_out(i,13,k) * mat_h1d_tr(13,j) &
6412 + vec_out(i,14,k) * mat_h1d_tr(14,j) &
6413 + vec_out(i,15,k) * mat_h1d_tr(15,j) &
6414 + vec_out(i,16,k) * mat_h1d_tr(16,j)
6415 vec_work(i,j,k) = tmp1 + tmp2 + tmp3
6416 end do
6417 end do
6418 end do
6419
6420 ! Z-dir
6421 do k=1, 16
6422 do j=1, 16
6423 do i=1, 16
6424 tmp1 = vec_work(i,j,1) * mat_v1d_tr(1,k) &
6425 + vec_work(i,j,2) * mat_v1d_tr(2,k) &
6426 + vec_work(i,j,3) * mat_v1d_tr(3,k) &
6427 + vec_work(i,j,4) * mat_v1d_tr(4,k) &
6428 + vec_work(i,j,5) * mat_v1d_tr(5,k)
6429 tmp2 = vec_work(i,j,6) * mat_v1d_tr(6,k) &
6430 + vec_work(i,j,7) * mat_v1d_tr(7,k) &
6431 + vec_work(i,j,8) * mat_v1d_tr(8,k) &
6432 + vec_work(i,j,9) * mat_v1d_tr(9,k) &
6433 + vec_work(i,j,10) * mat_v1d_tr(10,k)
6434 tmp3 = vec_work(i,j,11) * mat_v1d_tr(11,k) &
6435 + vec_work(i,j,12) * mat_v1d_tr(12,k) &
6436 + vec_work(i,j,13) * mat_v1d_tr(13,k) &
6437 + vec_work(i,j,14) * mat_v1d_tr(14,k) &
6438 + vec_work(i,j,15) * mat_v1d_tr(15,k) &
6439 + vec_work(i,j,16) * mat_v1d_tr(16,k)
6440 vec_out(i,j,k) = tmp1 + tmp2 + tmp3
6441 end do
6442 end do
6443 end do
6444
6445 return
6447
6448
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 / 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,...
Derived type representing a 3D reference element.