Skip to content

Commit 2c5b1c0

Browse files
RyadElKhatibMFsamhatfield
authored andcommitted
Variable LALL_FFTW to perform fftw transforms in one bunch of all fields
1 parent 781e02c commit 2c5b1c0

File tree

7 files changed

+31
-22
lines changed

7 files changed

+31
-22
lines changed

src/trans/cpu/external/setup_trans.F90

+9-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
1212
&KTMAX,KRESOL,PWEIGHT,LDGRIDONLY,LDUSERPNM,LDKEEPRPNM,LDUSEFLT,&
13-
&LDSPSETUPONLY,LDPNMONLY,LDUSEFFTW,&
13+
&LDSPSETUPONLY,LDPNMONLY,LDUSEFFTW,LD_ALL_FFTW,&
1414
&LDLL,LDSHIFTLL,CDIO_LEGPOL,CDLEGPOLFNAME,KLEGPOLPTR,KLEGPOLPTR_LEN)
1515

1616
!**** *SETUP_TRANS* - Setup transform package for specific resolution
@@ -54,6 +54,7 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
5454
! FLT, otherwise always kept)
5555
! LDPNMONLY - Compute the Legendre polynomials only, not the FFTs.
5656
! LDUSEFFTW - Use FFTW for FFTs (option deprecated - FFTW is now mandatory)
57+
! LD_ALL_FFTW : T to transform all fields in one call, F to transforms fields one after another
5758
! LDLL - Setup second set of input/output latitudes
5859
! the number of input/output latitudes to transform is equal KDGL
5960
! or KDGL+2 in the case that includes poles + equator
@@ -96,6 +97,7 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
9697
! G. Mozdzynski : Jun 2015 Support alternative FFTs to FFTW
9798
! M.Hamrud/W.Deconinck : July 2015 IO options for Legenndre polynomials
9899
! R. El Khatib 07-Mar-2016 Better flexibility for Legendre polynomials computation in stretched mode
100+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
99101
! ------------------------------------------------------------------
100102

101103
USE PARKIND1, ONLY: JPIM, JPRD, JPRB
@@ -140,6 +142,7 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
140142
REAL(KIND=JPRD) ,OPTIONAL,INTENT(IN) :: PSTRET
141143
LOGICAL ,OPTIONAL,INTENT(IN):: LDGRIDONLY
142144
LOGICAL ,OPTIONAL,INTENT(IN):: LDUSEFLT
145+
LOGICAL ,OPTIONAL,INTENT(IN):: LD_ALL_FFTW
143146
LOGICAL ,OPTIONAL,INTENT(IN):: LDUSERPNM
144147
LOGICAL ,OPTIONAL,INTENT(IN):: LDKEEPRPNM
145148
LOGICAL ,OPTIONAL,INTENT(IN):: LDSPSETUPONLY
@@ -228,6 +231,7 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
228231
S%LUSE_BELUSOV=.TRUE. ! use Belusov algorithm to compute RPNM array instead of per m
229232
S%LKEEPRPNM=.FALSE. ! Keep Legendre polonomials (RPNM)
230233
S%LUSEFLT=.FALSE. ! Use fast legendre transforms
234+
TW%LALL_FFTW=.FALSE. ! transform fields one at a time
231235
LLSPSETUPONLY = .FALSE. ! Only create distributed spectral setup
232236
S%LDLL = .FALSE. ! use mapping to/from second set of latitudes
233237
S%LSHIFTLL = .FALSE. ! shift output lat-lon by 0.5dx, 0.5dy
@@ -340,6 +344,10 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
340344
! Setup distribution independent dimensions
341345
CALL SETUP_DIMS
342346

347+
IF(PRESENT(LD_ALL_FFTW)) THEN
348+
TW%LALL_FFTW=LD_ALL_FFTW
349+
ENDIF
350+
343351
S%LSOUTHPNM=.FALSE.
344352
IF(PRESENT(PSTRET)) THEN
345353
IF (ABS(PSTRET-1.0_JPRD)>100._JPRD*EPSILON(1._JPRD)) THEN

src/trans/cpu/internal/ftdir_mod.F90

+3-4
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ SUBROUTINE FTDIR(PREEL,KFIELDS,KGL)
4343
! D. Degrauwe (Feb 2012): Alternative extension zone (E')
4444
! G. Mozdzynski (Oct 2014): support for FFTW transforms
4545
! G. Mozdzynski (Jun 2015): Support alternative FFTs to FFTW
46-
46+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
4747
! ------------------------------------------------------------------
4848

4949
USE PARKIND1 ,ONLY : JPIM, JPIB, JPRB
5050

5151
USE TPM_DISTR ,ONLY : D, MYSETW
5252
USE TPM_GEOMETRY ,ONLY : G
53-
USE TPM_FFTW ,ONLY : EXEC_FFTW
53+
USE TPM_FFTW ,ONLY : TW, EXEC_FFTW
5454
USE TPM_DIM ,ONLY : R
5555
!
5656

@@ -61,7 +61,6 @@ SUBROUTINE FTDIR(PREEL,KFIELDS,KGL)
6161

6262
INTEGER(KIND=JPIM) :: IGLG,IST,ILEN,JJ,IST1
6363
INTEGER(KIND=JPIM) :: IOFF,IRLEN,ICLEN, ITYPE
64-
LOGICAL :: LL_ALL=.FALSE. ! T=do kfields ffts in one batch, F=do kfields ffts one at a time
6564

6665
! ------------------------------------------------------------------
6766

@@ -75,7 +74,7 @@ SUBROUTINE FTDIR(PREEL,KFIELDS,KGL)
7574
IRLEN=G%NLOEN(IGLG)+R%NNOEXTZL
7675
ICLEN=(IRLEN/2+1)*2
7776

78-
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,LL_ALL,PREEL)
77+
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,TW%LALL_FFTW,PREEL)
7978
ENDIF
8079

8180
IST1=1

src/trans/cpu/internal/ftdirad_mod.F90

+3-4
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ SUBROUTINE FTDIRAD(PREEL,KFIELDS,KGL)
4242
! D. Degrauwe (Feb 2012): Alternative extension zone (E')
4343
! G. Mozdzynski (Oct 2014): support for FFTW transforms
4444
! G. Mozdzynski (Jun 2015): Support alternative FFTs to FFTW
45-
45+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
4646
! ------------------------------------------------------------------
4747

4848
USE PARKIND1 ,ONLY : JPIM, JPRB
4949

5050
USE TPM_DISTR ,ONLY : D, MYSETW
5151
USE TPM_GEOMETRY ,ONLY : G
52-
USE TPM_FFTW ,ONLY : EXEC_FFTW
52+
USE TPM_FFTW ,ONLY : TW, EXEC_FFTW
5353
USE TPM_DIM ,ONLY : R
5454

5555
IMPLICIT NONE
@@ -60,7 +60,6 @@ SUBROUTINE FTDIRAD(PREEL,KFIELDS,KGL)
6060
INTEGER(KIND=JPIM) :: IGLG,IST,ILEN,JJ,JF,ILOEN
6161
INTEGER(KIND=JPIM) :: IOFF,IRLEN,ICLEN,ITYPE
6262
REAL(KIND=JPRB) :: ZMUL
63-
LOGICAL :: LL_ALL=.FALSE. ! T=do kfields ffts in one batch, F=do kfields ffts one at a time
6463
! ------------------------------------------------------------------
6564

6665
ITYPE = 1
@@ -78,7 +77,7 @@ SUBROUTINE FTDIRAD(PREEL,KFIELDS,KGL)
7877
ENDDO
7978
ENDDO
8079

81-
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,LL_ALL,PREEL)
80+
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,TW%LALL_FFTW,PREEL)
8281

8382
! Change of metric (not in forward routine)
8483

src/trans/cpu/internal/ftinv_mod.F90

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@ SUBROUTINE FTINV(PREEL,KFIELDS,KGL)
4242
! D. Degrauwe (Feb 2012): Alternative extension zone (E')
4343
! G. Mozdzynski (Oct 2014): support for FFTW transforms
4444
! G. Mozdzynski (Jun 2015): Support alternative FFTs to FFTW
45+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
4546
! ------------------------------------------------------------------
4647

4748
USE PARKIND1 ,ONLY : JPIM, JPRB
4849

4950
USE TPM_DISTR ,ONLY : D, MYSETW
5051
USE TPM_GEOMETRY ,ONLY : G
51-
USE TPM_FFTW ,ONLY : EXEC_FFTW
52+
USE TPM_FFTW ,ONLY : TW, EXEC_FFTW
5253
USE TPM_DIM ,ONLY : R
5354

5455
IMPLICIT NONE
@@ -58,7 +59,6 @@ SUBROUTINE FTINV(PREEL,KFIELDS,KGL)
5859

5960
INTEGER(KIND=JPIM) :: IGLG,IST,ILEN,JJ,JF,IST1
6061
INTEGER(KIND=JPIM) :: IOFF,IRLEN,ICLEN, ITYPE
61-
LOGICAL :: LL_ALL=.FALSE. ! T=do kfields ffts in one batch, F=do kfields ffts one at a time
6262

6363
! ------------------------------------------------------------------
6464

@@ -80,7 +80,7 @@ SUBROUTINE FTINV(PREEL,KFIELDS,KGL)
8080
IRLEN=G%NLOEN(IGLG)+R%NNOEXTZL
8181
ICLEN=(IRLEN/2+1)*2
8282

83-
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,LL_ALL,PREEL)
83+
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,TW%LALL_FFTW,PREEL)
8484
ENDIF
8585

8686
! ------------------------------------------------------------------

src/trans/cpu/internal/ftinvad_mod.F90

+3-4
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ SUBROUTINE FTINVAD(PREEL,KFIELDS,KGL)
4242
! D. Degrauwe (Feb 2012): Alternative extension zone (E')
4343
! G. Mozdzynski (Oct 2014): support for FFTW transforms
4444
! G. Mozdzynski (Jun 2015): Support alternative FFTs to FFTW
45-
45+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
4646
! ------------------------------------------------------------------
4747

4848
USE PARKIND1 ,ONLY : JPIM, JPIB, JPRB
4949

5050
USE TPM_DISTR ,ONLY : D, MYSETW
5151
USE TPM_DIM ,ONLY : R
5252
USE TPM_GEOMETRY ,ONLY : G
53-
USE TPM_FFTW ,ONLY : EXEC_FFTW
53+
USE TPM_FFTW ,ONLY : TW, EXEC_FFTW
5454
USE TPM_DIM ,ONLY : R
5555
!
5656

@@ -61,7 +61,6 @@ SUBROUTINE FTINVAD(PREEL,KFIELDS,KGL)
6161

6262
INTEGER(KIND=JPIM) :: IGLG,IST,ILEN,JJ,JF,ILOEN
6363
INTEGER(KIND=JPIM) :: IOFF,IRLEN,ICLEN,ITYPE
64-
LOGICAL :: LL_ALL=.FALSE. ! T=do kfields ffts in one batch, F=do kfields ffts one at a time
6564

6665
! ------------------------------------------------------------------
6766

@@ -81,7 +80,7 @@ SUBROUTINE FTINVAD(PREEL,KFIELDS,KGL)
8180
ENDDO
8281
ENDDO
8382

84-
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,LL_ALL,PREEL)
83+
CALL EXEC_FFTW(ITYPE,IRLEN,ICLEN,IOFF,KFIELDS,TW%LALL_FFTW,PREEL)
8584

8685
DO JJ=1,ILEN
8786
DO JF=1,KFIELDS

src/trans/cpu/internal/tpm_fftw.F90

+7-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ MODULE TPM_FFTW
1717
! --------------
1818
! Original October 2014
1919
! R. El Khatib 01-Sep-2015 More subroutines for better modularity
20+
! R. El Khatib 08-Jun-2023 LALL_FFTW for better flexibility
2021

2122
USE, INTRINSIC :: ISO_C_BINDING
2223

@@ -44,7 +45,8 @@ MODULE TPM_FFTW
4445
INTEGER(KIND=JPIM),ALLOCATABLE :: N_PLANS(:)
4546
TYPE(FFTW_PLAN),POINTER :: FFTW_PLANS(:) => NULL()
4647
INTEGER(KIND=JPIM) :: N_MAX=0 ! maximum number of latitudes
47-
INTEGER(KIND=JPIM) :: N_MAX_PLANS=4 ! maximum number of plans for each active latitudes
48+
INTEGER(KIND=JPIM) :: N_MAX_PLANS=4 ! maximum number of plans for each active latitude
49+
LOGICAL :: LALL_FFTW=.FALSE. ! T=do kfields ffts in one batch, F=do kfields ffts one at a time
4850
END TYPE FFTW_TYPE
4951

5052

@@ -422,8 +424,8 @@ SUBROUTINE EXEC_EFFTW(KTYPE,KRLEN,KCLEN,KOFF,KFIELDS,LD_ALL,PREEL)
422424
CALL SFFTW_EXECUTE_DFT_C2R(IPLAN_C2R,ZFFT,ZFFT)
423425
END IF
424426
IF (LHOOK) CALL DR_HOOK('FFTW_EXECUTE_DFT_C2R',1,ZHOOK_HANDLE2)
425-
DO JJ=1,KRLEN
426-
DO JF=1,KFIELDS
427+
DO JF=1,KFIELDS
428+
DO JJ=1,KRLEN
427429
PREEL(KOFF+JJ-1,JF)=ZFFT(JJ,JF)
428430
ENDDO
429431
ENDDO
@@ -440,8 +442,8 @@ SUBROUTINE EXEC_EFFTW(KTYPE,KRLEN,KCLEN,KOFF,KFIELDS,LD_ALL,PREEL)
440442
CALL SFFTW_EXECUTE_DFT_R2C(IPLAN_C2R,ZFFT,ZFFT)
441443
END IF
442444
IF (LHOOK) CALL DR_HOOK('FFTW_EXECUTE_DFT_R2C',1,ZHOOK_HANDLE2)
443-
DO JJ=1,KCLEN
444-
DO JF=1,KFIELDS
445+
DO JF=1,KFIELDS
446+
DO JJ=1,KCLEN
445447
PREEL(KOFF+JJ-1,JF)=ZFFT(JJ,JF)/REAL(KRLEN,JPRB)
446448
ENDDO
447449
ENDDO

src/trans/include/ectrans/setup_trans.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
INTERFACE
1212
SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
1313
&KTMAX,KRESOL,PWEIGHT,LDGRIDONLY,LDUSERPNM,LDKEEPRPNM,LDUSEFLT,&
14-
&LDSPSETUPONLY,LDPNMONLY,LDUSEFFTW,&
14+
&LDSPSETUPONLY,LDPNMONLY,LDUSEFFTW,LD_ALL_FFTW,&
1515
&LDLL,LDSHIFTLL,CDIO_LEGPOL,CDLEGPOLFNAME,KLEGPOLPTR,KLEGPOLPTR_LEN)
1616

1717
!**** *SETUP_TRANS* - Setup transform package for specific resolution
@@ -52,6 +52,7 @@ SUBROUTINE SETUP_TRANS(KSMAX,KDGL,KDLON,KLOEN,LDSPLIT,PSTRET,&
5252
! FLT, otherwise always kept)
5353
! LDPNMONLY - Compute the Legendre polynomialsonly, not the FFTs.
5454
! LDUSEFFTW - Use FFTW for FFTs (option deprecated - FFTW is now mandatory)
55+
! LD_ALL_FFTW : T to transform all fields in one call, F to transforms fields one after another
5556
! LDLL - Setup second set of input/output latitudes
5657
! the number of input/output latitudes to transform is equal KDGL
5758
! or KDGL+2 in the case that includes poles + equator
@@ -97,6 +98,7 @@ REAL(KIND=JPRD) ,OPTIONAL,INTENT(IN) :: PWEIGHT(:)
9798
REAL(KIND=JPRD) ,OPTIONAL,INTENT(IN) :: PSTRET
9899
LOGICAL ,OPTIONAL,INTENT(IN):: LDGRIDONLY
99100
LOGICAL ,OPTIONAL,INTENT(IN):: LDUSEFLT
101+
LOGICAL ,OPTIONAL,INTENT(IN):: LD_ALL_FFTW
100102
LOGICAL ,OPTIONAL,INTENT(IN):: LDUSERPNM
101103
LOGICAL ,OPTIONAL,INTENT(IN):: LDKEEPRPNM
102104
LOGICAL ,OPTIONAL,INTENT(IN):: LDPNMONLY

0 commit comments

Comments
 (0)