📄 pois.f90
字号:
END IF DO J=2,M-1,2 JBY2=J/2 DO I=1,LDIMF*N FT(I,J) = F(I,J+1)*C1(JBY2)+F(I,J)*C2(JBY2) FT(I,J+1) = -F(I,J+1)*C2(JBY2)+F(I,J)*C1(JBY2) END DO END DOEND IF! REAL(EB),PERIODIC SYNTHESISCALL VRFFTB(LDIMF*N,M,FT,LDIMF*N,F,WORK)! POSTPROCESSINGIF (OUTARY) THEN DO J=1,M DO I=1,LDIMF*N F(I,J)=C4(J)*FT(I,J)+C3(J)*FT(I,M+1-J) END DO END DOELSE DO J=1,M DO I=1,LDIMF*N FT(I,J)=C4(J)*F(I,J)+C3(J)*F(I,M+1-J) END DO END DOEND IFRETURNEND SUBROUTINE VSCOSQSUBROUTINE VSCSB1(L,M,N,LDIMF,F,FT,C1,C2)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFREAL(EB) FT(LDIMF,N,M)REAL(EB) C1(M)REAL(EB) C2(M)REAL(EB) F(LDIMF,M,N)DO K=1,N DO I=1,L FT(I,K,1)=.5_EB*F(I,1,K) END DOEND DODO K=1,N DO J=2,M DO I=1,L FT(I,K,J) =(C1(J)*F(I,J,K)+C2(J)*F(I,M-J+2,K)) END DO END DOEND DORETURNEND SUBROUTINE VSCSB1SUBROUTINE VSCSBA(M,LDIMF,FT,F)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: LDIMFREAL(EB) F(LDIMF,M), FT(LDIMF,M)DO I=1,LDIMF F(I,1) = FT(I,1)END DOIF (MOD(M,2)==0) THEN DO I=1,LDIMF F(I,M) = FT(I,M) END DOEND IFDO J=2,M-1,2 DO I=1,LDIMF F(I,J)=FT(I,J)-FT(I,J+1) F(I,J+1)=FT(I,J)+FT(I,J+1) END DOEND DORETURNEND SUBROUTINE VSCSBASUBROUTINE VSCSF1(L,M,N,LDIMF,F,FT)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFREAL(EB) FT(LDIMF,N,M)REAL(EB) F(LDIMF,M,N)DO K=1,N DO I=1,L FT(I,K,1)=F(I,1,K) END DOEND DOIF (MOD(M,2)==0) THEN DO K=1,N DO I=1,L FT(I,K,M)=F(I,M,K) END DO END DOEND IFDO K=1,N DO J=2,M-1,2 DO I=1,L FT(I,K,J) = 0.5_EB*(F(I,J,K)+F(I,J+1,K)) FT(I,K,J+1) = -0.5_EB*(F(I,J,K)-F(I,J+1,K)) END DO END DOEND DORETURNEND SUBROUTINE VSCSF1SUBROUTINE VSCSFA(M,LDIMF,F,FT,C1,C2)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: LDIMFREAL(EB) FT(LDIMF,M)REAL(EB) C1(M)REAL(EB) F(LDIMF,M), C2(M)DO J=2,M DO I=1,LDIMF F(I,J)=C1(J)*FT(I,J)-C2(J)*FT(I,M+2-J) END DOEND DODO I=1,LDIMF F(I,1)=FT(I,1)END DORETURNEND SUBROUTINE VSCSFASUBROUTINE VSCSQ1(L,M,N,LDIMF,F,FT,C1,C2)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFREAL(EB) FT(LDIMF,N,M)REAL(EB) C1(M)REAL(EB) C2(M)REAL(EB) F(LDIMF,M,N)DO K=1,N DO I=1,L FT(I,K,1)=F(I,1,K) END DOEND DOIF (MOD(M,2)==0) THEN DO K=1,N DO I=1,L FT(I,K,M)=-F(I,M,K) END DO END DOEND IFDO J=2,M-1,2 JBY2=J/2 DO K=1,N DO I=1,L FT(I,K,J) = F(I,J+1,K)*C1(JBY2)+F(I,J,K)*C2(JBY2) FT(I,K,J+1) = -F(I,J+1,K)*C2(JBY2)+F(I,J,K)*C1(JBY2) END DO END DOEND DORETURNEND SUBROUTINE VSCSQ1SUBROUTINE VSCSQI(N,C1,C2,C3,C4,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989! ENTRY VSSNQI(N,C1,C2,C3,C4,WSAVE)INTEGER :: NREAL(EB) C3(N)REAL(EB) C4(N)REAL(EB) WSAVE(N+15)REAL(EB) C1(N),C2(N)PI=FSH19S()DX=PI/NSCALE=SQRT(.5_EB)! GENERATE A(I)+-B(I)DO I=1,(N-1)/2 C=COS(I*DX) S=SIN(I*DX) C1(I)=.5_EB*(S+C) C2(I)=.5_EB*(C-S)END DODX=PI/(2*N)DO I=1,N C=COS((I-.5_EB)*DX) S=SIN((I-.5_EB)*DX) C3(I)=SCALE*(C+S) C4(I)=SCALE*(C-S)END DO! INITIALIZE VRFFTPK ROUTINECALL VRFFTI(N,WSAVE)RETURNEND SUBROUTINE VSCSQISUBROUTINE VSINT(X,L,M,N,LDIMX,XT,C,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMXREAL(EB) XT(LDIMX*N,M+1)REAL(EB) C(M/2)REAL(EB) WSAVE(M+16)REAL(EB) X(LDIMX*N,M)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEXSQRT2I=SQRT(.5_EB)MODM = MOD(M,2)103 MP1 = M+1MS2 = M/2DO I=1,LDIMX*N XT(I,1) = 0._EB XT(I,M+1)=0._EB END DO! ZERO OUT LAST PLANE BECAUSE FOR SINE! IT DOESN'T GET DONE IN FSH02IF (TPOSE) THEN CALL VSINT1(L,M,N,LDIMX,MODM,MS2,C,XT,X)ELSE DO J=1,MS2 JC=M+1-J DO I=1,LDIMX*N XT(I,J+1) = (X(I,J)-X(I,JC))+C(J)*(X(I,J)+X(I,JC)) XT(I,JC+1) = C(J)*(X(I,J)+X(I,JC))-(X(I,J)-X(I,JC)) END DO END DO IF (MODM == 0) GO TO 405 DO I=1,LDIMX*N XT(I,MS2+2) = 4._EB*X(I,MS2+1) END DO405 CONTINUEEND IFCALL VRFFTF (LDIMX*N,MP1,XT,LDIMX*N,X,WSAVE)SCALE=SCALE*SQRT2IIF (OUTARY) THEN CALL VSINTA(M,LDIMX*N,MODM,X,XT)ELSE CALL VSINTA(M,LDIMX*N,MODM,XT,X)END IFRETURNEND SUBROUTINE VSINTSUBROUTINE VSINT1(L,M,N,LDIMX,MODM,MS2,C,XT,X)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMXINTEGER :: MODMINTEGER :: MS2REAL(EB) C(*)REAL(EB) X(LDIMX,M,N)REAL(EB) XT(LDIMX,N,M+1)DO J=1,MS2 JC = M+1-J DO K=1,N DO I=1,L XT(I,K,J+1) = (X(I,J,K)-X(I,JC,K))+C(J)*(X(I,J,K)+X(I,JC,K)) XT(I,K,JC+1) = C(J)*(X(I,J,K)+X(I,JC,K))-(X(I,J,K)-X(I,JC,K)) END DO END DOEND DOIF (MODM == 0) GO TO 405DO K=1,N DO I=1,L XT(I,K,MS2+2) = 4._EB*X(I,MS2+1,K) END DOEND DO405 CONTINUERETURNEND SUBROUTINE VSINT1SUBROUTINE VSINTA(M,LDIMX,MODM,X,XT)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: LDIMXINTEGER :: MODMREAL(EB) X(LDIMX,M), XT(LDIMX,M+1)DO I=1,LDIMX X(I,1) = 0.5_EB*XT(I,1)END DODO J=2,M-1,2 DO I=1,LDIMX X(I,J) = -XT(I,J+1) X(I,J+1) = X(I,J-1)+XT(I,J) END DOEND DOIF (MODM /= 0) GO TO 900DO I=1,LDIMX X(I,M) = -XT(I,M+1)END DO900 CONTINUERETURNEND SUBROUTINE VSINTASUBROUTINE VSINTI(N,C,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989! ******* NOTE ******! SPECIAL DOCUMENTATION FOR USE OF INTERNAL PARAMETER TPOSE. IF! TPOSE = .TRUE., THEN ALL PREPROCESSING ROUTINES TRANSPOSE SECOND! AND THIRD INDICES IN PREPARATION FOR TRANSFORM OF! ORIGINAL SECOND INDEX. IF! TPOSE = .FALSE., THEN ALL PREPROCESSING ROUTINES PREPARE ONLY FOR! TRANSFORM OF THIRD INDEX. TO USE IN THIS CASE,! CALL ROUTINE WITH M AND N INTERCHANGED.INTEGER :: NREAL(EB) C(N/2),WSAVE (N+16)! INITIALIZE NOCOPY AND TPOSE TO DEFAULT! VALUESNOCOPY = .FALSE.TPOSE = .TRUE.IF (N <= 1) RETURNPI=FSH19S()NP1 = N+1NS2 = N/2DT = PI/REAL(NP1,EB)DO K=1,NS2 C(K) = 2._EB*SIN(K*DT)END DOCALL VRFFTI (NP1,WSAVE)RETURNEND SUBROUTINE VSINTISUBROUTINE VSRFTB(F,L,M,N,LDIMF,FT,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989! ******* NOTE ******! SPECIAL DOCUMENTATION FOR USE OF INTERNAL PARAMETER TPOSE. IF! TPOSE = .TRUE., THEN ALL PREPROCESSING ROUTINES TRANSPOSE SECOND! AND THIRD INDICES IN PREPARATION FOR TRANSFORM OF! ORIGINAL SECOND INDEX. IF! TPOSE = .FALSE., THEN ALL PREPROCESSING ROUTINES PREPARE ONLY FOR! TRANSFORM OF THIRD INDEX. TO USE IN THIS CASE,! CALL ROUTINE WITH M AND N INTERCHANGED.! VSFFTPK, VERSION 2, JUNE 1988INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFREAL(EB) FT(LDIMF,N,M)REAL(EB) WSAVE(M+15)REAL(EB) F(LDIMF,M,N)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEXIF (TPOSE) THEN ! RE-ORDER INPUT DO K=1,N DO J=1,M DO I=1,L FT(I,K,J)=F(I,J,K) END DO END DO END DO ! REAL(EB), PERIODIC TRANSFORM CALL VRFFTB(LDIMF*N,M,FT,LDIMF*N,F,WSAVE) OUTARY=.NOT.OUTARY IF (.NOT.NOCOPY) THEN CALL VSRTB1(M,N*LDIMF,F,FT) END IFELSE CALL VRFFTB(LDIMF*N,M,F,LD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -