C---*----1----*----2----*----3----*----4----*----5----*----6----*----7 C C3FFT(MFFT) <---> MKL(DFT) C IFFT = 1:INVERSE FFT C IFFT = -1:FFT C SUBROUTINE C3FFT_MKL(ZRB,KFT1,KFT1_1,KFT2,KFT3,IWL,IWM,IWN SUBROUTINE C3FFT(ZRB,KFT1,KFT1_1,KFT2,KFT3,IWL,IWM,IWN & ,IDUM1,IFFT,IDUM2,IWORK,IERR) IMPLICIT REAL(A-H,O-Y) IMPLICIT COMPLEX(Z) INCLUDE 'PACVPP' C-----ARRAYS FOR MFFT-------------------------------------------- DIMENSION IWL(8*IFX2+28),IWM(8*IFY2+28),IWN(8*IFZ2+28) & ,IWORK(2*IFX2),IP1(3),IP2(3),IP3(3),IOPT(2) C C ZWK(NWK): NWK >= MAX((NX + NWKW)*NY*NZ, NX*(NY + NWKW)*NZ) C C PARAMETER(ISX=0,ISY=0,ISZ=0,IFX=KNX+ISX,IFY=KNY+ISY,IFZ=KNZ+ISZ) C PARAMETER(IFX2=2*IFX-1,IFY2=2*IFY-2,IFZ2=2*IFZ-2) C PARAMETER(KFFT=IFX2*IFY2*IFZ2) C PARAMETER(KFFT2=IFX2*(IFY2+1)*IFZ2) C KFFT DIMENSION ZTB1(IFX2-1),ZTB2(IFY2),ZTB3(IFZ2),ZWK(KFFT2) DIMENSION ZRB(IFX2,IFY2,IFZ2) C KFT1 = IFX2 KFT2 = IFY2 KFT3 = IFZ2 IERR = 0 C IF (IFFT.NE.0) THEN C IERR = 0 KSUM=KFT1*KFT2*KFT3 KVOL=(KFT1-1)*KFT2*KFT3 C C SUBROUTINE C3FFT(ZRB,KFT1,KFT1-1,KFT2,KFT3,IWL,IWM,IWN C & ,IDUM1,IFFT,IDUM2,IWORK,IERR) C IFFT=1:INVERSE FFT,IFFT=-1:FFT C SUBROUTINE C3FFT_MKL(X_IN,KFT1,KFT1-1,KFT2,KFT3,IERR) CALL C3FFT_MKL(ZRB,KFT1,KFT1-1,KFT2,KFT3,IFFT,IERR) C IF (IERR.NE.0) THEN WRITE (6,*) ' C3FFT(SET UP)] IERR = ',IERR STOP END IF C END IF C RETURN END C---*----1----*----2----*----3----*----4----*----5----*----6----*----7 SUBROUTINE C3FFT_MKL(ZRB,KFT1,KFT1_1,KFT2,KFT3,IFFT,IERR) C C IntelのMKLにあった参考プログラムを元にして、筆者使用の C プログラムで動くように新たに作り直したルーチンである(無保証)。 C [1/7, 2009] C USE MKL_DFTI C INCLUDE 'PACVPP' C INTEGER M, N, K C INTEGER IFFT, IERR, KFT1,KFT2,KFT3,KFT1_1 C COMPLEX(8) :: X_IN_3D(IFX2-1,IFY2,IFZ2) COMPLEX(8) :: X_IN ((IFX2-1)*IFY2*IFZ2) C COMPLEX(8) :: ZRB(IFX2,IFY2,IFZ2) C EQUIVALENCE (X_IN, X_IN_3D) C TYPE(DFTI_DESCRIPTOR), POINTER :: Desc_Handle INTEGER STATUS REAL(8) SCALE INTEGER LENGTHS(3) C INTEGER I, J, L C C m <-- KFT1_1 C n <-- KFT2 C k <-- KFT3 C C IFFT = 1:INVERSE FFT C IFFT = -1:FFT C WRITE (6,*) "IFFT,IERR = ",IFFT,IERR C KFT1_1 = KFT1 - 1 M = KFT1_1 N = KFT2 K = KFT3 C DO 111 L=1,IFZ2 DO 112 J=1,IFY2 DO 113 I=1,IFX2-1 C DO 113 I=1,IFX2 X_IN_3D(I,J,L)=ZRB(I,J,L) 113 CONTINUE 112 CONTINUE 111 CONTINUE C LENGTHS(1) = M LENGTHS(2) = N LENGTHS(3) = K C C DftiCreateDescriptor C STATUS = DftiCreateDescriptor( Desc_Handle, & DFTI_DOUBLE, DFTI_COMPLEX, 3, LENGTHS) C IF (IFFT .EQ. -1) THEN C C DftiCommitDescriptor C STATUS = DftiCommitDescriptor( Desc_Handle ) C C DftiComputeForward C STATUS = DftiComputeForward( Desc_Handle, X_IN) C ELSE IF (IFFT .EQ. 1) THEN C C SET SCALE = 1.0 (1/6, 2008) = NUMBER FOR BACKWARD TRANSFORM C DftiSetValue C C SCALE = 1.0/REAL(M*N*K, KIND=8) SCALE = 1.0 C STATUS = DftiSetValue(Desc_Handle, DFTI_BACKWARD_SCALE, SCALE) C C DftiCommitDescriptor C STATUS = DftiCommitDescriptor( Desc_Handle ) C C DftiComputeBackward C STATUS = DftiComputeBackward( Desc_Handle, X_IN) C END IF C DO 211 L=1,IFZ2 DO 212 J=1,IFY2 DO 213 I=1,IFX2-1 C DO 113 I=1,IFX2 ZRB(I,J,L) = X_IN_3D(I,J,L) 213 CONTINUE 212 CONTINUE 211 CONTINUE C 100 CONTINUE STATUS = DftiFreeDescriptor(Desc_Handle) C 101 CONTINUE END