Ignore:
Timestamp:
Aug 14, 2013 10:58:20 AM (11 years ago)
Author:
raasch
Message:

fftw support added; object file list in Makefile replaced by a short one line statement

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/fft_xy.f90

    r1167 r1210  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! fftw added
    2323!
    2424! Former revisions:
     
    8282#if defined( __cuda_fft )
    8383    USE ISO_C_BINDING
     84#elif defined( __fftw )
     85    USE, INTRINSIC ::  ISO_C_BINDING
    8486#endif
    8587    USE precision_kind
     
    113115    INTEGER(C_INT), SAVE ::  plan_xf, plan_xi, plan_yf, plan_yi
    114116    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
    115123#endif
    116124
     
    244252          CALL set99( trigs_y, ifax_y, ny+1 )
    245253
     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
    246271       ELSEIF ( fft_method == 'singleton-algorithm' )  THEN
    247272
     
    413438          ENDIF
    414439
     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
    415486       ELSEIF ( fft_method == 'system-specific' )  THEN
    416487
     
    924995          ENDIF
    925996
     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
    9261044       ELSEIF ( fft_method == 'system-specific' )  THEN
    9271045
Note: See TracChangeset for help on using the changeset viewer.