Ignore:
Timestamp:
Aug 26, 2013 9:31:42 AM (11 years ago)
Author:
raasch
Message:

overlapping execution of fft and transpositions (MPI_ALLTOALL), but real overlapping is not activated so far,
fftw implemented for 1D-decomposition
resorting of arrays moved to separate routines resort_for_...
bugfix in mbuild concerning Makefile_check

File:
1 edited

Legend:

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

    r1211 r1216  
    286286
    287287
    288     SUBROUTINE fft_x( ar, direction )
     288    SUBROUTINE fft_x( ar, direction, ar_2d )
    289289
    290290!----------------------------------------------------------------------!
     
    321321       COMPLEX(dpk), DIMENSION(0:(nx+1)/2,nys_x:nyn_x,nzb_x:nzt_x) ::  ar_tmp
    322322#endif
     323       REAL, DIMENSION(0:nx,nys_x:nyn_x), OPTIONAL   ::  ar_2d
    323324       REAL, DIMENSION(0:nx,nys_x:nyn_x,nzb_x:nzt_x) ::  ar
    324325
     
    454455                   CALL FFTW_EXECUTE_DFT_R2C( plan_xf, x_in, x_out )
    455456
    456                    DO  i = 0, (nx+1)/2
    457                       ar(i,j,k) = REAL( x_out(i) ) / ( nx+1 )
    458                    ENDDO
    459                    DO  i = 1, (nx+1)/2 - 1
    460                       ar(nx+1-i,j,k) = AIMAG( x_out(i) ) / ( nx+1 )
    461                    ENDDO
     457                   IF ( PRESENT( ar_2d ) )  THEN
     458
     459                      DO  i = 0, (nx+1)/2
     460                         ar_2d(i,j) = REAL( x_out(i) ) / ( nx+1 )
     461                      ENDDO
     462                      DO  i = 1, (nx+1)/2 - 1
     463                         ar_2d(nx+1-i,j) = AIMAG( x_out(i) ) / ( nx+1 )
     464                      ENDDO
     465
     466                   ELSE
     467
     468                      DO  i = 0, (nx+1)/2
     469                         ar(i,j,k) = REAL( x_out(i) ) / ( nx+1 )
     470                      ENDDO
     471                      DO  i = 1, (nx+1)/2 - 1
     472                         ar(nx+1-i,j,k) = AIMAG( x_out(i) ) / ( nx+1 )
     473                      ENDDO
     474
     475                   ENDIF
    462476
    463477                ENDDO
     
    465479             !$OMP END PARALLEL
    466480
    467          ELSE
     481          ELSE
    468482             !$OMP PARALLEL PRIVATE ( work, i, j, k )
    469483             !$OMP DO
     
    471485                DO  j = nys_x, nyn_x
    472486
    473                    x_out(0) = CMPLX( ar(0,j,k), 0.0 )
    474                    DO  i = 1, (nx+1)/2 - 1
    475                       x_out(i)   = CMPLX( ar(i,j,k), ar(nx+1-i,j,k) )
    476                    ENDDO
    477                    x_out((nx+1)/2) = CMPLX( ar((nx+1)/2,j,k), 0.0 )
     487                   IF ( PRESENT( ar_2d ) )  THEN
     488
     489                      x_out(0) = CMPLX( ar_2d(0,j), 0.0 )
     490                      DO  i = 1, (nx+1)/2 - 1
     491                         x_out(i) = CMPLX( ar_2d(i,j), ar_2d(nx+1-i,j) )
     492                      ENDDO
     493                      x_out((nx+1)/2) = CMPLX( ar_2d((nx+1)/2,j), 0.0 )
     494
     495                   ELSE
     496
     497                      x_out(0) = CMPLX( ar(0,j,k), 0.0 )
     498                      DO  i = 1, (nx+1)/2 - 1
     499                         x_out(i) = CMPLX( ar(i,j,k), ar(nx+1-i,j,k) )
     500                      ENDDO
     501                      x_out((nx+1)/2) = CMPLX( ar((nx+1)/2,j,k), 0.0 )
     502
     503                   ENDIF
    478504
    479505                   CALL FFTW_EXECUTE_DFT_C2R( plan_xi, x_out, x_in)
     
    484510             !$OMP END PARALLEL
    485511
    486          ENDIF
     512          ENDIF
    487513#endif
    488514
     
    766792          ENDIF
    767793
     794       ELSEIF ( fft_method == 'fftw' )  THEN
     795
     796#if defined( __fftw )
     797          IF ( forward_fft )  THEN
     798
     799             x_in(0:nx) = ar(0:nx)
     800             CALL FFTW_EXECUTE_DFT_R2C( plan_xf, x_in, x_out )
     801
     802             DO  i = 0, (nx+1)/2
     803                ar(i) = REAL( x_out(i) ) / ( nx+1 )
     804             ENDDO
     805             DO  i = 1, (nx+1)/2 - 1
     806                ar(nx+1-i) = AIMAG( x_out(i) ) / ( nx+1 )
     807             ENDDO
     808
     809         ELSE
     810
     811             x_out(0) = CMPLX( ar(0), 0.0 )
     812             DO  i = 1, (nx+1)/2 - 1
     813                x_out(i) = CMPLX( ar(i), ar(nx+1-i) )
     814             ENDDO
     815             x_out((nx+1)/2) = CMPLX( ar((nx+1)/2), 0.0 )
     816
     817             CALL FFTW_EXECUTE_DFT_C2R( plan_xi, x_out, x_in)
     818             ar(0:nx) = x_in(0:nx)
     819
     820         ENDIF
     821#endif
     822
    768823       ELSEIF ( fft_method == 'system-specific' )  THEN
    769824
     
    843898    END SUBROUTINE fft_x_1d
    844899
    845     SUBROUTINE fft_y( ar, direction )
     900    SUBROUTINE fft_y( ar, direction, ar_tr, nxl_y_bound, nxr_y_bound, nxl_y_l, &
     901                      nxr_y_l )
    846902
    847903!----------------------------------------------------------------------!
     
    853909!      fft_y uses internal algorithms (Singleton or Temperton) or      !
    854910!           system-specific routines, if they are available            !
     911!                                                                      !
     912! direction:  'forward' or 'backward'                                  !
     913! ar, ar_tr:  3D data arrays                                           !
     914!             forward:   ar: before  ar_tr: after transformation       !
     915!             backward:  ar_tr: before  ar: after transfosition        !
     916!                                                                      !
     917! In case of non-overlapping transposition/transformation:             !
     918! nxl_y_bound = nxl_y_l = nxl_y                                        !
     919! nxr_y_bound = nxr_y_l = nxr_y                                        !
     920!                                                                      !
     921! In case of overlapping transposition/transformation                  !
     922! - nxl_y_bound  and  nxr_y_bound have the original values of          !
     923!   nxl_y, nxr_y.  ar_tr is dimensioned using these values.            !
     924! - nxl_y_l = nxr_y_r.  ar is dimensioned with these values, so that   !
     925!   transformation is carried out for a 2D-plane only.                 !
    855926!----------------------------------------------------------------------!
    856927
     
    864935       CHARACTER (LEN=*) ::  direction
    865936       INTEGER ::  i, j, jshape(1), k
     937       INTEGER ::  nxl_y_bound, nxl_y_l, nxr_y_bound, nxr_y_l
    866938
    867939       LOGICAL ::  forward_fft
     
    878950       COMPLEX(dpk), DIMENSION(0:(ny+1)/2,nxl_y:nxr_y,nzb_y:nzt_y) ::  ar_tmp
    879951#endif
    880        REAL, DIMENSION(0:ny,nxl_y:nxr_y,nzb_y:nzt_y) ::  ar
     952       REAL, DIMENSION(0:ny,nxl_y_l:nxr_y_l,nzb_y:nzt_y) ::  ar
     953       REAL, DIMENSION(0:ny,nxl_y_bound:nxr_y_bound,nzb_y:nzt_y) ::  ar_tr
    881954
    882955       IF ( direction == 'forward' )  THEN
     
    898971             !$OMP DO
    899972             DO  k = nzb_y, nzt_y
    900                 DO  i = nxl_y, nxr_y
     973                DO  i = nxl_y_l, nxr_y_l
    901974
    902975                   DO  j = 0, ny
     
    908981
    909982                   DO  j = 0, (ny+1)/2
    910                       ar(j,i,k) = REAL( cwork(j) )
     983                      ar_tr(j,i,k) = REAL( cwork(j) )
    911984                   ENDDO
    912985                   DO  j = 1, (ny+1)/2 - 1
    913                       ar(ny+1-j,i,k) = -AIMAG( cwork(j) )
     986                      ar_tr(ny+1-j,i,k) = -AIMAG( cwork(j) )
    914987                   ENDDO
    915988
     
    923996             !$OMP DO
    924997             DO  k = nzb_y, nzt_y
    925                 DO  i = nxl_y, nxr_y
    926 
    927                    cwork(0) = CMPLX( ar(0,i,k), 0.0 )
     998                DO  i = nxl_y_l, nxr_y_l
     999
     1000                   cwork(0) = CMPLX( ar_tr(0,i,k), 0.0 )
    9281001                   DO  j = 1, (ny+1)/2 - 1
    929                       cwork(j)      = CMPLX( ar(j,i,k), -ar(ny+1-j,i,k) )
    930                       cwork(ny+1-j) = CMPLX( ar(j,i,k),  ar(ny+1-j,i,k) )
    931                    ENDDO
    932                    cwork((ny+1)/2) = CMPLX( ar((ny+1)/2,i,k), 0.0 )
     1002                      cwork(j)      = CMPLX( ar_tr(j,i,k), -ar_tr(ny+1-j,i,k) )
     1003                      cwork(ny+1-j) = CMPLX( ar_tr(j,i,k),  ar_tr(ny+1-j,i,k) )
     1004                   ENDDO
     1005                   cwork((ny+1)/2) = CMPLX( ar_tr((ny+1)/2,i,k), 0.0 )
    9331006
    9341007                   jshape = SHAPE( cwork )
     
    9571030             !$OMP DO
    9581031             DO  k = nzb_y, nzt_y
    959                 DO  i = nxl_y, nxr_y
     1032                DO  i = nxl_y_l, nxr_y_l
    9601033
    9611034                   work(0:ny) = ar(0:ny,i,k)
     
    9631036
    9641037                   DO  j = 0, (ny+1)/2
    965                       ar(j,i,k) = work(2*j)
     1038                      ar_tr(j,i,k) = work(2*j)
    9661039                   ENDDO
    9671040                   DO  j = 1, (ny+1)/2 - 1
    968                       ar(ny+1-j,i,k) = work(2*j+1)
     1041                      ar_tr(ny+1-j,i,k) = work(2*j+1)
    9691042                   ENDDO
    9701043
     
    9781051             !$OMP DO
    9791052             DO  k = nzb_y, nzt_y
    980                 DO  i = nxl_y, nxr_y
     1053                DO  i = nxl_y_l, nxr_y_l
    9811054
    9821055                   DO  j = 0, (ny+1)/2
    983                       work(2*j) = ar(j,i,k)
     1056                      work(2*j) = ar_tr(j,i,k)
    9841057                   ENDDO
    9851058                   DO  j = 1, (ny+1)/2 - 1
    986                       work(2*j+1) = ar(ny+1-j,i,k)
     1059                      work(2*j+1) = ar_tr(ny+1-j,i,k)
    9871060                   ENDDO
    9881061                   work(1)    = 0.0
     
    10061079             !$OMP DO
    10071080             DO  k = nzb_y, nzt_y
    1008                 DO  i = nxl_y, nxr_y
     1081                DO  i = nxl_y_l, nxr_y_l
    10091082
    10101083                   y_in(0:ny) = ar(0:ny,i,k)
     
    10121085
    10131086                   DO  j = 0, (ny+1)/2
    1014                       ar(j,i,k) = REAL( y_out(j) )  /(ny+1)
     1087                      ar_tr(j,i,k) = REAL( y_out(j) ) / (ny+1)
    10151088                   ENDDO
    10161089                   DO  j = 1, (ny+1)/2 - 1
    1017                       ar(ny+1-j,i,k) = AIMAG( y_out(j) )  /(ny+1)
     1090                      ar_tr(ny+1-j,i,k) = AIMAG( y_out(j) ) / (ny+1)
    10181091                   ENDDO
    10191092
     
    10271100             !$OMP DO
    10281101             DO  k = nzb_y, nzt_y
    1029                 DO  i = nxl_y, nxr_y
    1030 
    1031                    y_out(0) = CMPLX( ar(0,i,k), 0.0 )
     1102                DO  i = nxl_y_l, nxr_y_l
     1103
     1104                   y_out(0) = CMPLX( ar_tr(0,i,k), 0.0 )
    10321105                   DO  j = 1, (ny+1)/2 - 1
    1033                       y_out(j) = CMPLX( ar(j,i,k), ar(ny+1-j,i,k) )
    1034                    ENDDO
    1035                    y_out((ny+1)/2) = CMPLX( ar((ny+1)/2,i,k), 0.0 )
     1106                      y_out(j) = CMPLX( ar_tr(j,i,k), ar_tr(ny+1-j,i,k) )
     1107                   ENDDO
     1108                   y_out((ny+1)/2) = CMPLX( ar_tr((ny+1)/2,i,k), 0.0 )
    10361109
    10371110                   CALL FFTW_EXECUTE_DFT_C2R( plan_yi, y_out, y_in )
     
    10531126             !$OMP DO
    10541127             DO  k = nzb_y, nzt_y
    1055                 DO  i = nxl_y, nxr_y
     1128                DO  i = nxl_y_l, nxr_y_l
    10561129
    10571130                   CALL DRCFT( 0, ar, 1, work, 1, ny+1, 1, 1, sqr_dny, auy1, nau1, &
     
    10591132
    10601133                   DO  j = 0, (ny+1)/2
    1061                       ar(j,i,k) = work(2*j)
     1134                      ar_tr(j,i,k) = work(2*j)
    10621135                   ENDDO
    10631136                   DO  j = 1, (ny+1)/2 - 1
    1064                       ar(ny+1-j,i,k) = work(2*j+1)
     1137                      ar_tr(ny+1-j,i,k) = work(2*j+1)
    10651138                   ENDDO
    10661139
     
    10741147             !$OMP DO
    10751148             DO  k = nzb_y, nzt_y
    1076                 DO  i = nxl_y, nxr_y
     1149                DO  i = nxl_y_l, nxr_y_l
    10771150
    10781151                   DO  j = 0, (ny+1)/2
    1079                       work(2*j) = ar(j,i,k)
     1152                      work(2*j) = ar_tr(j,i,k)
    10801153                   ENDDO
    10811154                   DO  j = 1, (ny+1)/2 - 1
    1082                       work(2*j+1) = ar(ny+1-j,i,k)
     1155                      work(2*j+1) = ar_tr(ny+1-j,i,k)
    10831156                   ENDDO
    10841157                   work(1)    = 0.0
     
    11031176             !$OMP DO
    11041177             DO  k = nzb_y, nzt_y
    1105                 DO  i = nxl_y, nxr_y
     1178                DO  i = nxl_y_l, nxr_y_l
    11061179
    11071180                   work(0:ny) = ar(0:ny,i,k)
     
    11101183
    11111184                   DO  j = 0, (ny+1)/2
    1112                       ar(j,i,k) = work(2*j)
     1185                      ar_tr(j,i,k) = work(2*j)
    11131186                   ENDDO
    11141187                   DO  j = 1, (ny+1)/2 - 1
    1115                       ar(ny+1-j,i,k) = work(2*j+1)
     1188                      ar_tr(ny+1-j,i,k) = work(2*j+1)
    11161189                   ENDDO
    11171190
     
    11251198             !$OMP DO
    11261199             DO  k = nzb_y, nzt_y
    1127                 DO  i = nxl_y, nxr_y
     1200                DO  i = nxl_y_l, nxr_y_l
    11281201
    11291202                   DO  j = 0, (ny+1)/2
    1130                       work(2*j) = ar(j,i,k)
     1203                      work(2*j) = ar_tr(j,i,k)
    11311204                   ENDDO
    11321205                   DO  j = 1, (ny+1)/2 - 1
    1133                       work(2*j+1) = ar(ny+1-j,i,k)
     1206                      work(2*j+1) = ar_tr(ny+1-j,i,k)
    11341207                   ENDDO
    11351208                   work(1) = 0.0
     
    13221395
    13231396          ENDIF
     1397
     1398       ELSEIF ( fft_method == 'fftw' )  THEN
     1399
     1400#if defined( __fftw )
     1401          IF ( forward_fft )  THEN
     1402
     1403             y_in(0:ny) = ar(0:ny)
     1404             CALL FFTW_EXECUTE_DFT_R2C( plan_yf, y_in, y_out )
     1405
     1406             DO  j = 0, (ny+1)/2
     1407                ar(j) = REAL( y_out(j) ) / (ny+1)
     1408             ENDDO
     1409             DO  j = 1, (ny+1)/2 - 1
     1410                ar(ny+1-j) = AIMAG( y_out(j) ) / (ny+1)
     1411             ENDDO
     1412
     1413          ELSE
     1414
     1415             y_out(0) = CMPLX( ar(0), 0.0 )
     1416             DO  j = 1, (ny+1)/2 - 1
     1417                y_out(j) = CMPLX( ar(j), ar(ny+1-j) )
     1418             ENDDO
     1419             y_out((ny+1)/2) = CMPLX( ar((ny+1)/2), 0.0 )
     1420
     1421             CALL FFTW_EXECUTE_DFT_C2R( plan_yi, y_out, y_in )
     1422             ar(0:ny) = y_in(0:ny)
     1423
     1424          ENDIF
     1425#endif
    13241426
    13251427       ELSEIF ( fft_method == 'system-specific' )  THEN
Note: See TracChangeset for help on using the changeset viewer.