📄 pois.f90
字号:
DO I=1,L XT(I,K,MS2+1) = 2._EB*X(I,MS2+1,K) END DOEND DO404 CONTINUERETURNEND SUBROUTINE VCOST1SUBROUTINE VCOSTA(M,LDIMX,MM1,PL,X,XT)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: LDIMXINTEGER :: MM1REAL(EB) X(LDIMX,M), PL(LDIMX),XT(LDIMX,M)DO I=1,LDIMX X(I,1) = XT(I,1) X(I,2) = PL(I)END DODO J=4,M,2 DO I=1,LDIMX X(I,J) = X(I,J-2)-XT(I,J-1) X(I,J-1) = XT(I,J-2) END DOEND DOIF (MOD(M,2) == 0) GO TO 409DO I=1,LDIMX X(I,M) = XT(I,MM1)END DO409 CONTINUERETURNEND SUBROUTINE VCOSTASUBROUTINE VCOSTI(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), WSAVE(N+15)! INITIALIZE NOCOPY AND TPOSE TO DEFAULT! VALUESNOCOPY = .FALSE.TPOSE = .TRUE.PI = FSH19S()IF (N <= 3) RETURNNP1 = N+1NS2 = N/2DT = PI/(N-1)DO K=2,NS2 KC = NP1-K C(K) = 2._EB*SIN((K-1)*DT) C(KC) = 2._EB*COS((K-1)*DT)END DOCALL VRFFTI (N-1,WSAVE)RETURNEND SUBROUTINE VCOSTISUBROUTINE VRFFTF (M,N,R,MDIMR,RT,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: NINTEGER :: MDIMRREAL(EB) RT(M,N)REAL(EB) WSAVE(N+15)REAL(EB) R(MDIMR,N)IF (N == 1) RETURNCALL VRFTF1 (M,N,R,MDIMR,RT,WSAVE(1),WSAVE(N+1))RETURNEND SUBROUTINE VRFFTFSUBROUTINE VRFFTI (N,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: NREAL(EB) WSAVE(N+15)! INITIALIZE NOCOPY AND TPOSE TO DEFAULT! VALUESNOCOPY = .FALSE.TPOSE = .TRUE.IF (N <= 1) RETURNCALL VRFTI1 (N,WSAVE(1),WSAVE(N+1))RETURNEND SUBROUTINE VRFFTISUBROUTINE VRFTF1 (M,N,C,MDIMC,CH,WA,FAC)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: MINTEGER :: NINTEGER :: MDIMCREAL(EB) CH(M,N)REAL(EB) WA(N)REAL(EB) FAC(15)REAL(EB) C(MDIMC,N)NF = FAC(2)NA = 1L2 = NIW = NDO K1=1,NF KH = NF-K1 IP = FAC(KH+3) L1 = L2/IP IDO = N/L2 IDL1 = IDO*L1 IW = IW-(IP-1)*IDO NA = 1-NA IF (IP /= 4) GO TO 102 IX2 = IW+IDO IX3 = IX2+IDO IF (NA /= 0) GO TO 101 CALL VRADF4 (M,IDO,L1,C,MDIMC,CH,M,WA(IW),WA(IX2),WA(IX3)) GO TO 110 101 CALL VRADF4 (M,IDO,L1,CH,M,C,MDIMC,WA(IW),WA(IX2),WA(IX3)) GO TO 110 102 IF (IP /= 2) GO TO 104 IF (NA /= 0) GO TO 103 CALL VRADF2 (M,IDO,L1,C,MDIMC,CH,M,WA(IW)) GO TO 110 103 CALL VRADF2 (M,IDO,L1,CH,M,C,MDIMC,WA(IW)) GO TO 110 104 IF (IP /= 3) GO TO 106 IX2 = IW+IDO IF (NA /= 0) GO TO 105 CALL VRADF3 (M,IDO,L1,C,MDIMC,CH,M,WA(IW),WA(IX2)) GO TO 110 105 CALL VRADF3 (M,IDO,L1,CH,M,C,MDIMC,WA(IW),WA(IX2)) GO TO 110 106 IF (IP /= 5) GO TO 108 IX2 = IW+IDO IX3 = IX2+IDO IX4 = IX3+IDO IF (NA /= 0) GO TO 107 CALL VRADF5(M,IDO,L1,C,MDIMC,CH,M,WA(IW),WA(IX2),WA(IX3),WA(IX4)) GO TO 110 107 CALL VRADF5 (M,IDO,L1,CH,M,C,MDIMC,WA(IW),WA(IX2),WA(IX3),WA(IX4)) GO TO 110 108 IF (IDO == 1) NA = 1-NA IF (NA /= 0) GO TO 109 CALL VRADFG (M,IDO,IP,L1,IDL1,C,C,C,MDIMC,CH,CH,M,WA(IW)) NA = 1 GO TO 110 109 CALL VRADFG (M,IDO,IP,L1,IDL1,CH,CH,CH,M,C,C,MDIMC,WA(IW)) NA = 0 110 L2 = L1END DOOUTARY=.TRUE.IF (NOCOPY) THEN SCALE=SCALE*SQRT(1.0_EB/REAL(N,EB)) IF (NA==0) THEN OUTARY=.FALSE. END IFELSE SCALE=SQRT(1.0_EB/REAL(N,EB)) IF (NA == 1) GO TO 113 DO J=1,N DO I=1,M C(I,J) = SCALE*CH(I,J) END DO END DO RETURN 113 DO J=1,N DO I=1,M C(I,J)=SCALE*C(I,J) END DO END DOEND IFRETURNEND SUBROUTINE VRFTF1SUBROUTINE VRFTI1 (N,WA,FAC)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: NREAL(EB) FAC(15)REAL(EB) WA(N) , NTRYH(4)DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/NL = NNF = 0J = 0101 J = J+1IF (J-4<0) GO TO 102IF (J-4==0) GO TO 102IF (J-4>0) GO TO 103102 NTRY = NTRYH(J)GO TO 104103 NTRY = NTRY+2104 NQ = NL/NTRYNR = NL-NTRY*NQIF (NR<0) GO TO 101IF (NR==0) GO TO 105IF (NR>0) GO TO 101105 NF = NF+1FAC(NF+2) = NTRYNL = NQIF (NTRY /= 2) GO TO 107IF (NF == 1) GO TO 107DO I=2,NF IB = NF-I+2 FAC(IB+2) = FAC(IB+1)END DOFAC(3) = 2107 IF (NL /= 1) GO TO 104FAC(1) = NFAC(2) = NFTPI = 2._EB*FSH19S()ARGH = TPI/REAL(N,EB)IS = 0NFM1 = NF-1L1 = 1IF (NFM1 == 0) RETURNDO K1=1,NFM1 IP = FAC(K1+2) LD = 0 L2 = L1*IP IDO = N/L2 IPM = IP-1 DO J=1,IPM LD = LD+L1 I = IS ARGLD = REAL(LD,EB)*ARGH FI = 0._EB DO II=3,IDO,2 I = I+2 FI = FI+1._EB ARG = FI*ARGLD WA(I-1) = COS(ARG) WA(I) = SIN(ARG) END DO IS = IS+IDO END DO L1 = L2END DORETURNEND SUBROUTINE VRFTI1SUBROUTINE VSCOSB(F,L,M,N,LDIMF,FT,C1,C2,WORK)! +--------------------------------------------------------------------+! | |! | 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) WORK(M+15)REAL(EB) F(LDIMF*N,M)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEX! PREPROCESSINGIF (TPOSE) THEN CALL VSCSB1(L,M,N,LDIMF,F,FT,C1,C2)ELSE DO I=1,LDIMF*N FT(I,1)=.5_EB*F(I,1) END DODO J=2,M DO I=1,LDIMF*N FT(I,J) =(C1(J)*F(I,J)+C2(J)*F(I,M-J+2)) END DOEND DOEND IF! REAL(EB),PERIODIC ANALYSISCALL VRFFTF(LDIMF*N,M,FT,LDIMF*N,F,WORK)! POSTPROCESSINGSCALE=SQRT(2.0_EB)*SCALEIF (OUTARY) THEN CALL VSCSBA(M,N*LDIMF,FT,F)ELSE CALL VSCSBA(M,N*LDIMF,F,FT)END IFRETURNEND SUBROUTINE VSCOSBSUBROUTINE VSCOSF(F,L,M,N,LDIMF,FT,C1,C2,WORK)! +--------------------------------------------------------------------+! | |! | 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) WORK(M+15)REAL(EB) F(LDIMF*N,M)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEX! PREPROCESSINGSCALE=SQRT(2.0_EB)*SCALEIF (TPOSE) THEN CALL VSCSF1(L,M,N,LDIMF,F,FT)ELSE DO I=1,LDIMF*N FT(I,1)=F(I,1) END DOCONTINUEIF (MOD(M,2)==0) THEN DO I=1,LDIMF*N FT(I,M)=F(I,M) END DOEND IFDO J=2,M-1,2 DO I=1,LDIMF*N FT(I,J) = 0.5_EB*(F(I,J)+F(I,J+1)) FT(I,J+1) = -0.5_EB*(F(I,J)-F(I,J+1)) END DOEND DOEND IF! REAL(EB),PERIODIC SYNTHESISCALL VRFFTB(LDIMF*N,M,FT,LDIMF*N,F,WORK)! POSTPROCESSINGIF (OUTARY) THEN CALL VSCSFA(M,N*LDIMF,F,FT,C1,C2)ELSE CALL VSCSFA(M,N*LDIMF,FT,F,C1,C2)END IFRETURNEND SUBROUTINE VSCOSFSUBROUTINE VSCOSI(N,C1,C2,WSAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989! ENTRY VSSINI(N,C1,C2,WSAVE)INTEGER :: NREAL(EB) WSAVE(N+15)REAL(EB) C1(N),C2(N)PI=FSH19S()DX=PI/(2*N)! GENERATE A(I)+-B(I)DO I=1,N C=COS((I-1)*DX) S=SIN((I-1)*DX) C1(I)=.5_EB*(S+C) C2(I)=.5_EB*(S-C)END DO! INITIALIZE VRFFTPK ROUTINECALL VRFFTI(N,WSAVE)RETURNEND SUBROUTINE VSCOSISUBROUTINE VSCOSQ(F,L,M,N,LDIMF,FT,C1,C2,C3,C4,WORK)! +--------------------------------------------------------------------+! | |! | 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) C3(M)REAL(EB) C4(M)REAL(EB) WORK(M+15)REAL(EB) F(LDIMF*N,M)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEX! PREPROCESSINGIF (TPOSE) THEN CALL VSCSQ1(L,M,N,LDIMF,F,FT,C1,C2)ELSE DO I=1,LDIMF*N FT(I,1)=F(I,1) END DO IF (MOD(M,2)==0) THEN DO I=1,LDIMF*N FT(I,M)=-F(I,M) END DO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -