Changeset 1210 for palm/trunk/SOURCE/fft_xy.f90
- Timestamp:
- Aug 14, 2013 10:58:20 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/fft_xy.f90
r1167 r1210 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! fftw added 23 23 ! 24 24 ! Former revisions: … … 82 82 #if defined( __cuda_fft ) 83 83 USE ISO_C_BINDING 84 #elif defined( __fftw ) 85 USE, INTRINSIC :: ISO_C_BINDING 84 86 #endif 85 87 USE precision_kind … … 113 115 INTEGER(C_INT), SAVE :: plan_xf, plan_xi, plan_yf, plan_yi 114 116 INTEGER, SAVE :: total_points_x_transpo, total_points_y_transpo 117 #elif defined( __fftw ) 118 INCLUDE 'fftw3.f03' 119 INTEGER(KIND=C_INT) :: nx_c, ny_c 120 COMPLEX(KIND=C_DOUBLE_COMPLEX), DIMENSION(:), ALLOCATABLE, SAVE :: x_out, y_out 121 REAL(KIND=C_DOUBLE), DIMENSION(:), ALLOCATABLE, SAVE :: x_in, y_in 122 TYPE(C_PTR), SAVE :: plan_xf, plan_xi, plan_yf, plan_yi 115 123 #endif 116 124 … … 244 252 CALL set99( trigs_y, ifax_y, ny+1 ) 245 253 254 ELSEIF ( fft_method == 'fftw' ) THEN 255 ! 256 !-- FFTW 257 #if defined( __fftw ) 258 nx_c = nx+1 259 ny_c = ny+1 260 ALLOCATE( x_in(0:nx+2), y_in(0:ny+2), x_out(0:(nx+1)/2), & 261 y_out(0:(ny+1)/2) ) 262 plan_xf = FFTW_PLAN_DFT_R2C_1D( nx_c, x_in, x_out, FFTW_ESTIMATE ) 263 plan_xi = FFTW_PLAN_DFT_C2R_1D( nx_c, x_out, x_in, FFTW_ESTIMATE ) 264 plan_yf = FFTW_PLAN_DFT_R2C_1D( ny_c, y_in, y_out, FFTW_ESTIMATE ) 265 plan_yi = FFTW_PLAN_DFT_C2R_1D( ny_c, y_out, y_in, FFTW_ESTIMATE ) 266 #else 267 message_string = 'preprocessor switch for fftw is missing' 268 CALL message( 'fft_init', 'PA0080', 1, 2, 0, 6, 0 ) 269 #endif 270 246 271 ELSEIF ( fft_method == 'singleton-algorithm' ) THEN 247 272 … … 413 438 ENDIF 414 439 440 ELSEIF ( fft_method == 'fftw' ) THEN 441 442 #if defined( __fftw ) 443 IF ( forward_fft ) THEN 444 445 !$OMP PARALLEL PRIVATE ( work, i, j, k ) 446 !$OMP DO 447 DO k = nzb_x, nzt_x 448 DO j = nys_x, nyn_x 449 450 x_in(0:nx) = ar(0:nx,j,k) 451 CALL FFTW_EXECUTE_DFT_R2C( plan_xf, x_in, x_out ) 452 453 DO i = 0, (nx+1)/2 454 ar(i,j,k) = REAL( x_out(i) ) / ( nx+1 ) 455 ENDDO 456 DO i = 1, (nx+1)/2 - 1 457 ar(nx+1-i,j,k) = AIMAG( x_out(i) ) / ( nx+1 ) 458 ENDDO 459 460 ENDDO 461 ENDDO 462 !$OMP END PARALLEL 463 464 ELSE 465 !$OMP PARALLEL PRIVATE ( work, i, j, k ) 466 !$OMP DO 467 DO k = nzb_x, nzt_x 468 DO j = nys_x, nyn_x 469 470 x_out(0) = CMPLX( ar(0,j,k), 0.0 ) 471 DO i = 1, (nx+1)/2 - 1 472 x_out(i) = CMPLX( ar(i,j,k), ar(nx+1-i,j,k) ) 473 ENDDO 474 x_out((nx+1)/2) = CMPLX( ar((nx+1)/2,j,k), 0.0 ) 475 476 CALL FFTW_EXECUTE_DFT_C2R( plan_xi, x_out, x_in) 477 ar(0:nx,j,k) = x_in(0:nx) 478 479 ENDDO 480 ENDDO 481 !$OMP END PARALLEL 482 483 ENDIF 484 #endif 485 415 486 ELSEIF ( fft_method == 'system-specific' ) THEN 416 487 … … 924 995 ENDIF 925 996 997 ELSEIF ( fft_method == 'fftw' ) THEN 998 999 #if defined( __fftw ) 1000 IF ( forward_fft ) THEN 1001 1002 !$OMP PARALLEL PRIVATE ( work, i, j, k ) 1003 !$OMP DO 1004 DO k = nzb_y, nzt_y 1005 DO i = nxl_y, nxr_y 1006 1007 y_in(0:ny) = ar(0:ny,i,k) 1008 CALL FFTW_EXECUTE_DFT_R2C( plan_yf, y_in, y_out ) 1009 1010 DO j = 0, (ny+1)/2 1011 ar(j,i,k) = REAL( y_out(j) ) /(ny+1) 1012 ENDDO 1013 DO j = 1, (ny+1)/2 - 1 1014 ar(ny+1-j,i,k) = AIMAG( y_out(j) ) /(ny+1) 1015 ENDDO 1016 1017 ENDDO 1018 ENDDO 1019 !$OMP END PARALLEL 1020 1021 ELSE 1022 1023 !$OMP PARALLEL PRIVATE ( work, i, j, k ) 1024 !$OMP DO 1025 DO k = nzb_y, nzt_y 1026 DO i = nxl_y, nxr_y 1027 1028 y_out(0) = CMPLX( ar(0,i,k), 0.0 ) 1029 DO j = 1, (ny+1)/2 - 1 1030 y_out(j) = CMPLX( ar(j,i,k), ar(ny+1-j,i,k) ) 1031 ENDDO 1032 y_out((ny+1)/2) = CMPLX( ar((ny+1)/2,i,k), 0.0 ) 1033 1034 CALL FFTW_EXECUTE_DFT_C2R( plan_yi, y_out, y_in ) 1035 ar(0:ny,i,k) = y_in(0:ny) 1036 1037 ENDDO 1038 ENDDO 1039 !$OMP END PARALLEL 1040 1041 ENDIF 1042 #endif 1043 926 1044 ELSEIF ( fft_method == 'system-specific' ) THEN 927 1045
Note: See TracChangeset
for help on using the changeset viewer.