Changeset 3634 for palm/trunk/SOURCE/fft_xy_mod.f90
- Timestamp:
- Dec 18, 2018 12:31:28 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/fft_xy_mod.f90
r3241 r3634 25 25 ! ----------------- 26 26 ! $Id$ 27 ! OpenACC port for SPEC 28 ! 29 ! 3241 2018-09-12 15:02:00Z raasch 27 30 ! preprocessor switches for variables that are required on NEC only 28 31 ! … … 156 159 ONLY: fft_method, message_string 157 160 161 USE cuda_fft_interfaces 162 158 163 USE indices, & 159 164 ONLY: nx, ny, nz 160 165 161 #if defined( __fftw ) 166 #if defined( __cuda_fft ) 167 USE ISO_C_BINDING 168 #elif defined( __fftw ) 162 169 USE, INTRINSIC :: ISO_C_BINDING 163 170 #endif … … 210 217 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: trig_yf !< 211 218 219 #elif defined( __cuda_fft ) 220 INTEGER(C_INT), SAVE :: plan_xf !< 221 INTEGER(C_INT), SAVE :: plan_xi !< 222 INTEGER(C_INT), SAVE :: plan_yf !< 223 INTEGER(C_INT), SAVE :: plan_yi !< 224 212 225 #endif 213 226 … … 298 311 ENDIF 299 312 313 #if defined( _OPENACC ) && defined( __cuda_fft ) 314 fft_method = 'system-specific' 315 #endif 316 300 317 IF ( fft_method == 'system-specific' ) THEN 301 318 … … 346 363 CALL ZDFFTM( 0, ny+1, nz1, sqr_dny, work_y, ny+4, work_y, ny+4, & 347 364 trig_yb, worky, 0 ) 365 #elif defined( __cuda_fft ) 366 CALL CUFFTPLAN1D( plan_xf, nx+1, CUFFT_D2Z, (nyn_x-nys_x+1) * (nzt_x-nzb_x+1) ) 367 CALL CUFFTPLAN1D( plan_xi, nx+1, CUFFT_Z2D, (nyn_x-nys_x+1) * (nzt_x-nzb_x+1) ) 368 CALL CUFFTPLAN1D( plan_yf, ny+1, CUFFT_D2Z, (nxr_y-nxl_y+1) * (nzt_y-nzb_y+1) ) 369 CALL CUFFTPLAN1D( plan_yi, ny+1, CUFFT_Z2D, (nxr_y-nxl_y+1) * (nzt_y-nzb_y+1) ) 348 370 #else 349 371 message_string = 'no system-specific fft-call available' … … 425 447 #elif defined( __nec ) 426 448 REAL(wp), DIMENSION(6*(nx+1)) :: work2 !< 449 #elif defined( __cuda_fft ) 450 COMPLEX(dp), DIMENSION(0:(nx+1)/2,nys_x:nyn_x,nzb_x:nzt_x) :: & 451 ar_tmp !< 452 !$ACC DECLARE CREATE(ar_tmp) 427 453 #endif 428 454 … … 726 752 ENDDO 727 753 !$OMP END PARALLEL 754 755 ENDIF 756 757 #elif defined( __cuda_fft ) 758 759 IF ( forward_fft ) THEN 760 761 !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp) 762 CALL CUFFTEXECD2Z( plan_xf, ar, ar_tmp ) 763 !$ACC END HOST_DATA 764 765 !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) & 766 !$ACC PRESENT(ar, ar_tmp) 767 DO k = nzb_x, nzt_x 768 DO j = nys_x, nyn_x 769 770 DO i = 0, (nx+1)/2 771 ar(i,j,k) = REAL( ar_tmp(i,j,k), KIND=wp ) * dnx 772 ENDDO 773 774 DO i = 1, (nx+1)/2 - 1 775 ar(nx+1-i,j,k) = AIMAG( ar_tmp(i,j,k) ) * dnx 776 ENDDO 777 778 ENDDO 779 ENDDO 780 781 ELSE 782 783 !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) & 784 !$ACC PRESENT(ar, ar_tmp) 785 DO k = nzb_x, nzt_x 786 DO j = nys_x, nyn_x 787 788 ar_tmp(0,j,k) = CMPLX( ar(0,j,k), 0.0_wp, KIND=wp ) 789 790 DO i = 1, (nx+1)/2 - 1 791 ar_tmp(i,j,k) = CMPLX( ar(i,j,k), ar(nx+1-i,j,k), & 792 KIND=wp ) 793 ENDDO 794 ar_tmp((nx+1)/2,j,k) = CMPLX( ar((nx+1)/2,j,k), 0.0_wp, & 795 KIND=wp ) 796 797 ENDDO 798 ENDDO 799 800 !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp) 801 CALL CUFFTEXECZ2D( plan_xi, ar_tmp, ar ) 802 !$ACC END HOST_DATA 728 803 729 804 ENDIF … … 1001 1076 #elif defined( __nec ) 1002 1077 REAL(wp), DIMENSION(6*(ny+1)) :: work2 !< 1078 #elif defined( __cuda_fft ) 1079 COMPLEX(dp), DIMENSION(0:(ny+1)/2,nxl_y:nxr_y,nzb_y:nzt_y) :: & 1080 ar_tmp !< 1081 !$ACC DECLARE CREATE(ar_tmp) 1003 1082 #endif 1004 1083 … … 1278 1357 1279 1358 ENDIF 1359 #elif defined( __cuda_fft ) 1360 1361 IF ( forward_fft ) THEN 1362 1363 !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp) 1364 CALL CUFFTEXECD2Z( plan_yf, ar, ar_tmp ) 1365 !$ACC END HOST_DATA 1366 1367 !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) & 1368 !$ACC PRESENT(ar, ar_tmp) 1369 DO k = nzb_y, nzt_y 1370 DO i = nxl_y, nxr_y 1371 1372 DO j = 0, (ny+1)/2 1373 ar(j,i,k) = REAL( ar_tmp(j,i,k), KIND=wp ) * dny 1374 ENDDO 1375 1376 DO j = 1, (ny+1)/2 - 1 1377 ar(ny+1-j,i,k) = AIMAG( ar_tmp(j,i,k) ) * dny 1378 ENDDO 1379 1380 ENDDO 1381 ENDDO 1382 1383 ELSE 1384 1385 !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) & 1386 !$ACC PRESENT(ar, ar_tmp) 1387 DO k = nzb_y, nzt_y 1388 DO i = nxl_y, nxr_y 1389 1390 ar_tmp(0,i,k) = CMPLX( ar(0,i,k), 0.0_wp, KIND=wp ) 1391 1392 DO j = 1, (ny+1)/2 - 1 1393 ar_tmp(j,i,k) = CMPLX( ar(j,i,k), ar(ny+1-j,i,k), & 1394 KIND=wp ) 1395 ENDDO 1396 ar_tmp((ny+1)/2,i,k) = CMPLX( ar((ny+1)/2,i,k), 0.0_wp, & 1397 KIND=wp ) 1398 1399 ENDDO 1400 ENDDO 1401 1402 !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp) 1403 CALL CUFFTEXECZ2D( plan_yi, ar_tmp, ar ) 1404 !$ACC END HOST_DATA 1405 1406 ENDIF 1407 1280 1408 #endif 1281 1409
Note: See TracChangeset
for help on using the changeset viewer.