27 USE iso_c_binding,
ONLY: c_double,&
40#include "../base/base_uses.f90"
52 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_gpu'
53 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
64 SUBROUTINE pw_gpu_init_c()
BIND(C, name="pw_gpu_init")
65 END SUBROUTINE pw_gpu_init_c
69#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
83 SUBROUTINE pw_gpu_finalize_c()
BIND(C, name="pw_gpu_finalize")
84 END SUBROUTINE pw_gpu_finalize_c
88#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
89 CALL pw_gpu_finalize_c()
105 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_r3dc1d_3d'
107 COMPLEX(KIND=dp),
POINTER :: ptr_pwout
108 INTEGER :: handle, l1, l2, l3, ngpts
109 INTEGER,
DIMENSION(:),
POINTER :: npts
110 INTEGER,
POINTER :: ptr_ghatmap
111 REAL(kind=
dp) :: scale
112 REAL(kind=
dp),
POINTER :: ptr_pwin
114 SUBROUTINE pw_gpu_cfffg_c(din, zout, ghatmap, npts, ngpts, scale)
BIND(C, name="pw_gpu_cfffg")
116 TYPE(c_ptr),
INTENT(IN),
VALUE :: din
117 TYPE(c_ptr),
VALUE :: zout
118 TYPE(c_ptr),
INTENT(IN),
VALUE :: ghatmap
119 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
120 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: ngpts
121 REAL(kind=c_double),
INTENT(IN),
VALUE :: scale
123 END SUBROUTINE pw_gpu_cfffg_c
126 CALL timeset(routinen, handle)
128 scale = 1.0_dp/real(pw1%pw_grid%ngpts, kind=
dp)
130 ngpts =
SIZE(pw2%pw_grid%gsq)
131 l1 = lbound(pw1%array, 1)
132 l2 = lbound(pw1%array, 2)
133 l3 = lbound(pw1%array, 3)
134 npts => pw1%pw_grid%npts
137 ptr_pwin => pw1%array(l1, l2, l3)
138 ptr_pwout => pw2%array(1)
141 ptr_ghatmap => pw2%pw_grid%g_hatmap(1, 1)
144#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
145 CALL pw_gpu_cfffg_c(c_loc(ptr_pwin), c_loc(ptr_pwout), c_loc(ptr_ghatmap), npts, ngpts, scale)
147 cpabort(
"Compiled without pw offloading.")
150 CALL timestop(handle)
163 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_c1dr3d_3d'
165 COMPLEX(KIND=dp),
POINTER :: ptr_pwin
166 INTEGER :: handle, l1, l2, l3, ngpts, nmaps
167 INTEGER,
DIMENSION(:),
POINTER :: npts
168 INTEGER,
POINTER :: ptr_ghatmap
169 REAL(kind=
dp) :: scale
170 REAL(kind=
dp),
POINTER :: ptr_pwout
172 SUBROUTINE pw_gpu_sfffc_c(zin, dout, ghatmap, npts, ngpts, nmaps, scale)
BIND(C, name="pw_gpu_sfffc")
174 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
175 TYPE(c_ptr),
VALUE :: dout
176 TYPE(c_ptr),
INTENT(IN),
VALUE :: ghatmap
177 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
178 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: ngpts, nmaps
179 REAL(kind=c_double),
INTENT(IN),
VALUE :: scale
180 END SUBROUTINE pw_gpu_sfffc_c
183 CALL timeset(routinen, handle)
187 ngpts =
SIZE(pw1%pw_grid%gsq)
188 l1 = lbound(pw2%array, 1)
189 l2 = lbound(pw2%array, 2)
190 l3 = lbound(pw2%array, 3)
191 npts => pw1%pw_grid%npts
194 ptr_pwin => pw1%array(1)
195 ptr_pwout => pw2%array(l1, l2, l3)
198 nmaps =
SIZE(pw1%pw_grid%g_hatmap, 2)
199 ptr_ghatmap => pw1%pw_grid%g_hatmap(1, 1)
202#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
203 CALL pw_gpu_sfffc_c(c_loc(ptr_pwin), c_loc(ptr_pwout), c_loc(ptr_ghatmap), npts, ngpts, nmaps, scale)
205 cpabort(
"Compiled without pw offloading")
208 CALL timestop(handle)
221 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_r3dc1d_3d_ps'
223 COMPLEX(KIND=dp),
DIMENSION(:, :),
POINTER :: grays, pbuf, qbuf, rbuf, sbuf
224 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
POINTER :: tbuf
225 INTEGER :: g_pos, handle, lg, lmax, mg, mmax, mx2, &
226 mz2, n1, n2, ngpts, nmax, numtask, rp
227 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: p2p
228 INTEGER,
DIMENSION(2) :: r_dim, r_pos
229 INTEGER,
DIMENSION(:),
POINTER :: n, nloc, nyzray
230 INTEGER,
DIMENSION(:, :, :, :),
POINTER :: bo
231 REAL(kind=
dp) :: scale
236 CALL timeset(routinen, handle)
238 scale = 1.0_dp/real(pw1%pw_grid%ngpts, kind=
dp)
241 n => pw1%pw_grid%npts
242 nloc => pw1%pw_grid%npts_local
243 grays => pw1%pw_grid%grays
244 ngpts = nloc(1)*nloc(2)*nloc(3)
247 IF (pw1%pw_grid%para%ray_distribution)
THEN
248 rs_group = pw1%pw_grid%para%group
249 nyzray => pw1%pw_grid%para%nyzray
250 bo => pw1%pw_grid%para%bo
252 g_pos = rs_group%mepos
253 numtask = rs_group%num_pe
254 r_dim = rs_group%num_pe_cart
255 r_pos = rs_group%mepos_cart
260 lmax = max(lg, (ngpts/mmax + 1))
262 ALLOCATE (p2p(0:numtask - 1))
264 CALL rs_group%rank_compare(rs_group, p2p)
267 mx2 = bo(2, 1, rp, 2) - bo(1, 1, rp, 2) + 1
268 mz2 = bo(2, 3, rp, 2) - bo(1, 3, rp, 2) + 1
269 n1 = maxval(bo(2, 1, :, 1) - bo(1, 1, :, 1) + 1)
270 n2 = maxval(bo(2, 2, :, 1) - bo(1, 2, :, 1) + 1)
271 nmax = max((2*n2)/numtask, 2)*mx2*mz2
272 nmax = max(nmax, n1*maxval(nyzray))
274 fft_scratch_size%nx = nloc(1)
275 fft_scratch_size%ny = nloc(2)
276 fft_scratch_size%nz = nloc(3)
277 fft_scratch_size%lmax = lmax
278 fft_scratch_size%mmax = mmax
279 fft_scratch_size%mx1 = bo(2, 1, rp, 1) - bo(1, 1, rp, 1) + 1
280 fft_scratch_size%mx2 = mx2
281 fft_scratch_size%my1 = bo(2, 2, rp, 1) - bo(1, 2, rp, 1) + 1
282 fft_scratch_size%mz2 = mz2
283 fft_scratch_size%lg = lg
284 fft_scratch_size%mg = mg
285 fft_scratch_size%nbx = maxval(bo(2, 1, :, 2))
286 fft_scratch_size%nbz = maxval(bo(2, 3, :, 2))
287 fft_scratch_size%mcz1 = maxval(bo(2, 3, :, 1) - bo(1, 3, :, 1) + 1)
288 fft_scratch_size%mcx2 = maxval(bo(2, 1, :, 2) - bo(1, 1, :, 2) + 1)
289 fft_scratch_size%mcz2 = maxval(bo(2, 3, :, 2) - bo(1, 3, :, 2) + 1)
290 fft_scratch_size%nmax = nmax
291 fft_scratch_size%nmray = maxval(nyzray)
292 fft_scratch_size%nyzray = nyzray(g_pos)
293 fft_scratch_size%rs_group = rs_group
294 fft_scratch_size%g_pos = g_pos
295 fft_scratch_size%r_pos = r_pos
296 fft_scratch_size%r_dim = r_dim
297 fft_scratch_size%numtask = numtask
299 IF (r_dim(2) > 1)
THEN
304 IF (r_dim(1) == 1)
THEN
305 cpabort(
"This processor distribution is not supported.")
308 CALL get_fft_scratch(fft_scratch, tf_type=300, n=n, fft_sizes=fft_scratch_size)
311 qbuf => fft_scratch%p2buf
312 rbuf => fft_scratch%p3buf
313 pbuf => fft_scratch%p4buf
314 sbuf => fft_scratch%p5buf
317 CALL pw_gpu_cf(pw1, qbuf)
320 CALL cube_transpose_2(qbuf, bo(:, :, :, 1), bo(:, :, :, 2), rbuf, fft_scratch)
326 CALL pw_gpu_f(rbuf, pbuf, +1, n(2), mx2*mz2)
329 CALL xz_to_yz(pbuf, rs_group, r_dim, g_pos, p2p, pw1%pw_grid%para%yzp, nyzray, &
330 bo(:, :, :, 2), sbuf, fft_scratch)
333 CALL pw_gpu_fg(sbuf, pw2, scale)
344 CALL get_fft_scratch(fft_scratch, tf_type=200, n=n, fft_sizes=fft_scratch_size)
347 tbuf => fft_scratch%tbuf
348 sbuf => fft_scratch%r1buf
351 CALL pw_gpu_cff(pw1, tbuf)
354 CALL yz_to_x(tbuf, rs_group, g_pos, p2p, pw1%pw_grid%para%yzp, nyzray, &
355 bo(:, :, :, 2), sbuf, fft_scratch)
358 CALL pw_gpu_fg(sbuf, pw2, scale)
368 cpabort(
"Not implemented (no ray_distr.) in: pw_gpu_r3dc1d_3d_ps.")
371 CALL timestop(handle)
384 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_c1dr3d_3d_ps'
386 COMPLEX(KIND=dp),
DIMENSION(:, :),
POINTER :: grays, pbuf, qbuf, rbuf, sbuf
387 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
POINTER :: tbuf
388 INTEGER :: g_pos, handle, lg, lmax, mg, mmax, mx2, &
389 mz2, n1, n2, ngpts, nmax, numtask, rp
390 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: p2p
391 INTEGER,
DIMENSION(2) :: r_dim, r_pos
392 INTEGER,
DIMENSION(:),
POINTER :: n, nloc, nyzray
393 INTEGER,
DIMENSION(:, :, :, :),
POINTER :: bo
394 REAL(kind=
dp) :: scale
399 CALL timeset(routinen, handle)
404 n => pw1%pw_grid%npts
405 nloc => pw1%pw_grid%npts_local
406 grays => pw1%pw_grid%grays
407 ngpts = nloc(1)*nloc(2)*nloc(3)
410 IF (pw1%pw_grid%para%ray_distribution)
THEN
411 rs_group = pw1%pw_grid%para%group
412 nyzray => pw1%pw_grid%para%nyzray
413 bo => pw1%pw_grid%para%bo
415 g_pos = rs_group%mepos
416 numtask = rs_group%num_pe
417 r_dim = rs_group%num_pe_cart
418 r_pos = rs_group%mepos_cart
423 lmax = max(lg, (ngpts/mmax + 1))
425 ALLOCATE (p2p(0:numtask - 1))
427 CALL rs_group%rank_compare(rs_group, p2p)
430 mx2 = bo(2, 1, rp, 2) - bo(1, 1, rp, 2) + 1
431 mz2 = bo(2, 3, rp, 2) - bo(1, 3, rp, 2) + 1
432 n1 = maxval(bo(2, 1, :, 1) - bo(1, 1, :, 1) + 1)
433 n2 = maxval(bo(2, 2, :, 1) - bo(1, 2, :, 1) + 1)
434 nmax = max((2*n2)/numtask, 2)*mx2*mz2
435 nmax = max(nmax, n1*maxval(nyzray))
437 fft_scratch_size%nx = nloc(1)
438 fft_scratch_size%ny = nloc(2)
439 fft_scratch_size%nz = nloc(3)
440 fft_scratch_size%lmax = lmax
441 fft_scratch_size%mmax = mmax
442 fft_scratch_size%mx1 = bo(2, 1, rp, 1) - bo(1, 1, rp, 1) + 1
443 fft_scratch_size%mx2 = mx2
444 fft_scratch_size%my1 = bo(2, 2, rp, 1) - bo(1, 2, rp, 1) + 1
445 fft_scratch_size%mz2 = mz2
446 fft_scratch_size%lg = lg
447 fft_scratch_size%mg = mg
448 fft_scratch_size%nbx = maxval(bo(2, 1, :, 2))
449 fft_scratch_size%nbz = maxval(bo(2, 3, :, 2))
450 fft_scratch_size%mcz1 = maxval(bo(2, 3, :, 1) - bo(1, 3, :, 1) + 1)
451 fft_scratch_size%mcx2 = maxval(bo(2, 1, :, 2) - bo(1, 1, :, 2) + 1)
452 fft_scratch_size%mcz2 = maxval(bo(2, 3, :, 2) - bo(1, 3, :, 2) + 1)
453 fft_scratch_size%nmax = nmax
454 fft_scratch_size%nmray = maxval(nyzray)
455 fft_scratch_size%nyzray = nyzray(g_pos)
456 fft_scratch_size%rs_group = rs_group
457 fft_scratch_size%g_pos = g_pos
458 fft_scratch_size%r_pos = r_pos
459 fft_scratch_size%r_dim = r_dim
460 fft_scratch_size%numtask = numtask
462 IF (r_dim(2) > 1)
THEN
467 IF (r_dim(1) == 1)
THEN
468 cpabort(
"This processor distribution is not supported.")
471 CALL get_fft_scratch(fft_scratch, tf_type=300, n=n, fft_sizes=fft_scratch_size)
474 pbuf => fft_scratch%p7buf
475 qbuf => fft_scratch%p4buf
476 rbuf => fft_scratch%p3buf
477 sbuf => fft_scratch%p2buf
480 CALL pw_gpu_sf(pw1, pbuf, scale)
484 CALL yz_to_xz(pbuf, rs_group, r_dim, g_pos, p2p, pw1%pw_grid%para%yzp, nyzray, &
485 bo(:, :, :, 2), qbuf, fft_scratch)
491 CALL pw_gpu_f(qbuf, rbuf, -1, n(2), mx2*mz2)
496 CALL cube_transpose_1(rbuf, bo(:, :, :, 2), bo(:, :, :, 1), sbuf, fft_scratch)
499 CALL pw_gpu_fc(sbuf, pw2)
510 CALL get_fft_scratch(fft_scratch, tf_type=200, n=n, fft_sizes=fft_scratch_size)
513 sbuf => fft_scratch%r1buf
514 tbuf => fft_scratch%tbuf
517 CALL pw_gpu_sf(pw1, sbuf, scale)
521 CALL x_to_yz(sbuf, rs_group, g_pos, p2p, pw1%pw_grid%para%yzp, nyzray, &
522 bo(:, :, :, 2), tbuf, fft_scratch)
525 CALL pw_gpu_ffc(tbuf, pw2)
535 cpabort(
"Not implemented (no ray_distr.) in: pw_gpu_c1dr3d_3d_ps.")
538 CALL timestop(handle)
547 SUBROUTINE pw_gpu_cff(pw1, pwbuf)
549 COMPLEX(KIND=dp),
DIMENSION(:, :, :), &
550 INTENT(INOUT),
TARGET :: pwbuf
552 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_cff'
554 COMPLEX(KIND=dp),
POINTER :: ptr_pwout
555 INTEGER :: handle, l1, l2, l3
556 INTEGER,
DIMENSION(:),
POINTER :: npts
557 REAL(kind=
dp),
POINTER :: ptr_pwin
559 SUBROUTINE pw_gpu_cff_c(din, zout, npts)
BIND(C, name="pw_gpu_cff")
561 TYPE(c_ptr),
INTENT(IN),
VALUE :: din
562 TYPE(c_ptr),
VALUE :: zout
563 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
564 END SUBROUTINE pw_gpu_cff_c
567 CALL timeset(routinen, handle)
570 npts => pw1%pw_grid%npts_local
571 l1 = lbound(pw1%array, 1)
572 l2 = lbound(pw1%array, 2)
573 l3 = lbound(pw1%array, 3)
576 ptr_pwin => pw1%array(l1, l2, l3)
577 ptr_pwout => pwbuf(1, 1, 1)
580#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
581 CALL pw_gpu_cff_c(c_loc(ptr_pwin), c_loc(ptr_pwout), npts)
583 cpabort(
"Compiled without pw offloading")
586 CALL timestop(handle)
587 END SUBROUTINE pw_gpu_cff
595 SUBROUTINE pw_gpu_ffc(pwbuf, pw2)
596 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
INTENT(IN), &
600 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_ffc'
602 COMPLEX(KIND=dp),
POINTER :: ptr_pwin
603 INTEGER :: handle, l1, l2, l3
604 INTEGER,
DIMENSION(:),
POINTER :: npts
605 REAL(kind=
dp),
POINTER :: ptr_pwout
607 SUBROUTINE pw_gpu_ffc_c(zin, dout, npts)
BIND(C, name="pw_gpu_ffc")
609 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
610 TYPE(c_ptr),
VALUE :: dout
611 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
612 END SUBROUTINE pw_gpu_ffc_c
615 CALL timeset(routinen, handle)
618 npts => pw2%pw_grid%npts_local
619 l1 = lbound(pw2%array, 1)
620 l2 = lbound(pw2%array, 2)
621 l3 = lbound(pw2%array, 3)
624 ptr_pwin => pwbuf(1, 1, 1)
625 ptr_pwout => pw2%array(l1, l2, l3)
628#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
629 CALL pw_gpu_ffc_c(c_loc(ptr_pwin), c_loc(ptr_pwout), npts)
631 cpabort(
"Compiled without pw offloading")
634 CALL timestop(handle)
635 END SUBROUTINE pw_gpu_ffc
643 SUBROUTINE pw_gpu_cf(pw1, pwbuf)
645 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(INOUT), &
648 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_cf'
650 COMPLEX(KIND=dp),
POINTER :: ptr_pwout
651 INTEGER :: handle, l1, l2, l3
652 INTEGER,
DIMENSION(:),
POINTER :: npts
653 REAL(kind=
dp),
POINTER :: ptr_pwin
655 SUBROUTINE pw_gpu_cf_c(din, zout, npts)
BIND(C, name="pw_gpu_cf")
657 TYPE(c_ptr),
INTENT(IN),
VALUE :: din
658 TYPE(c_ptr),
VALUE :: zout
659 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
660 END SUBROUTINE pw_gpu_cf_c
663 CALL timeset(routinen, handle)
666 npts => pw1%pw_grid%npts_local
667 l1 = lbound(pw1%array, 1)
668 l2 = lbound(pw1%array, 2)
669 l3 = lbound(pw1%array, 3)
672 ptr_pwin => pw1%array(l1, l2, l3)
673 ptr_pwout => pwbuf(1, 1)
676#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
677 CALL pw_gpu_cf_c(c_loc(ptr_pwin), c_loc(ptr_pwout), npts)
679 cpabort(
"Compiled without pw offloading")
681 CALL timestop(handle)
682 END SUBROUTINE pw_gpu_cf
690 SUBROUTINE pw_gpu_fc(pwbuf, pw2)
691 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN), &
695 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_fc'
697 COMPLEX(KIND=dp),
POINTER :: ptr_pwin
698 INTEGER :: handle, l1, l2, l3
699 INTEGER,
DIMENSION(:),
POINTER :: npts
700 REAL(kind=
dp),
POINTER :: ptr_pwout
702 SUBROUTINE pw_gpu_fc_c(zin, dout, npts)
BIND(C, name="pw_gpu_fc")
704 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
705 TYPE(c_ptr),
VALUE :: dout
706 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
707 END SUBROUTINE pw_gpu_fc_c
710 CALL timeset(routinen, handle)
712 npts => pw2%pw_grid%npts_local
713 l1 = lbound(pw2%array, 1)
714 l2 = lbound(pw2%array, 2)
715 l3 = lbound(pw2%array, 3)
718 ptr_pwin => pwbuf(1, 1)
719 ptr_pwout => pw2%array(l1, l2, l3)
722#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
723 CALL pw_gpu_fc_c(c_loc(ptr_pwin), c_loc(ptr_pwout), npts)
725 cpabort(
"Compiled without pw offloading")
728 CALL timestop(handle)
729 END SUBROUTINE pw_gpu_fc
740 SUBROUTINE pw_gpu_f(pwbuf1, pwbuf2, dir, n, m)
741 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN), &
743 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(INOUT), &
745 INTEGER,
INTENT(IN) :: dir, n, m
747 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_f'
749 COMPLEX(KIND=dp),
POINTER :: ptr_pwin, ptr_pwout
752 SUBROUTINE pw_gpu_f_c(zin, zout, dir, n, m)
BIND(C, name="pw_gpu_f")
754 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
755 TYPE(c_ptr),
VALUE :: zout
756 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: dir, n, m
757 END SUBROUTINE pw_gpu_f_c
760 CALL timeset(routinen, handle)
764 ptr_pwin => pwbuf1(1, 1)
765 ptr_pwout => pwbuf2(1, 1)
768#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
769 CALL pw_gpu_f_c(c_loc(ptr_pwin), c_loc(ptr_pwout), dir, n, m)
772 cpabort(
"Compiled without pw offloading")
776 CALL timestop(handle)
777 END SUBROUTINE pw_gpu_f
785 SUBROUTINE pw_gpu_fg(pwbuf, pw2, scale)
786 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN), &
789 REAL(kind=
dp),
INTENT(IN) :: scale
791 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_fg'
793 COMPLEX(KIND=dp),
POINTER :: ptr_pwin, ptr_pwout
794 INTEGER :: handle, mg, mmax, ngpts
795 INTEGER,
DIMENSION(:),
POINTER :: npts
796 INTEGER,
POINTER :: ptr_ghatmap
798 SUBROUTINE pw_gpu_fg_c(zin, zout, ghatmap, npts, mmax, ngpts, scale)
BIND(C, name="pw_gpu_fg")
800 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
801 TYPE(c_ptr),
VALUE :: zout
802 TYPE(c_ptr),
INTENT(IN),
VALUE :: ghatmap
803 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
804 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: mmax, ngpts
805 REAL(kind=c_double),
INTENT(IN),
VALUE :: scale
807 END SUBROUTINE pw_gpu_fg_c
810 CALL timeset(routinen, handle)
812 ngpts =
SIZE(pw2%pw_grid%gsq)
813 npts => pw2%pw_grid%npts
815 IF ((npts(1) /= 0) .AND. (ngpts /= 0))
THEN
816 mg =
SIZE(pw2%pw_grid%grays, 2)
820 ptr_pwin => pwbuf(1, 1)
821 ptr_pwout => pw2%array(1)
824 ptr_ghatmap => pw2%pw_grid%g_hatmap(1, 1)
827#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
828 CALL pw_gpu_fg_c(c_loc(ptr_pwin), c_loc(ptr_pwout), c_loc(ptr_ghatmap), npts, mmax, ngpts, scale)
831 cpabort(
"Compiled without pw offloading")
835 CALL timestop(handle)
836 END SUBROUTINE pw_gpu_fg
845 SUBROUTINE pw_gpu_sf(pw1, pwbuf, scale)
847 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(INOUT), &
849 REAL(kind=
dp),
INTENT(IN) :: scale
851 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_gpu_sf'
853 COMPLEX(KIND=dp),
POINTER :: ptr_pwin, ptr_pwout
854 INTEGER :: handle, mg, mmax, ngpts, nmaps
855 INTEGER,
DIMENSION(:),
POINTER :: npts
856 INTEGER,
POINTER :: ptr_ghatmap
858 SUBROUTINE pw_gpu_sf_c(zin, zout, ghatmap, npts, mmax, ngpts, nmaps, scale)
BIND(C, name="pw_gpu_sf")
860 TYPE(c_ptr),
INTENT(IN),
VALUE :: zin
861 TYPE(c_ptr),
VALUE :: zout
862 TYPE(c_ptr),
INTENT(IN),
VALUE :: ghatmap
863 INTEGER(KIND=C_INT),
DIMENSION(*),
INTENT(IN):: npts
864 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: mmax, ngpts, nmaps
865 REAL(kind=c_double),
INTENT(IN),
VALUE :: scale
867 END SUBROUTINE pw_gpu_sf_c
870 CALL timeset(routinen, handle)
872 ngpts =
SIZE(pw1%pw_grid%gsq)
873 npts => pw1%pw_grid%npts
875 IF ((npts(1) /= 0) .AND. (ngpts /= 0))
THEN
876 mg =
SIZE(pw1%pw_grid%grays, 2)
880 ptr_pwin => pw1%array(1)
881 ptr_pwout => pwbuf(1, 1)
884 nmaps =
SIZE(pw1%pw_grid%g_hatmap, 2)
885 ptr_ghatmap => pw1%pw_grid%g_hatmap(1, 1)
888#if defined(__OFFLOAD) && !defined(__NO_OFFLOAD_PW)
889 CALL pw_gpu_sf_c(c_loc(ptr_pwin), c_loc(ptr_pwout), c_loc(ptr_ghatmap), npts, mmax, ngpts, nmaps, scale)
892 cpabort(
"Compiled without pw offloading")
896 CALL timestop(handle)
897 END SUBROUTINE pw_gpu_sf
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
subroutine, public pw_gpu_c1dr3d_3d_ps(pw1, pw2)
perform an parallel scatter followed by a fft on the gpu
subroutine, public pw_gpu_c1dr3d_3d(pw1, pw2)
perform an scatter followed by a fft on the gpu
subroutine, public pw_gpu_init()
Allocates resources on the gpu device for gpu fft acceleration.
subroutine, public pw_gpu_r3dc1d_3d(pw1, pw2)
perform an fft followed by a gather on the gpu
subroutine, public pw_gpu_finalize()
Releases resources on the gpu device for gpu fft acceleration.
subroutine, public pw_gpu_r3dc1d_3d_ps(pw1, pw2)
perform an parallel fft followed by a gather on the gpu
integer, parameter, public fullspace