📄 pois.f90
字号:
DATARY=.TRUE.SCALE=1._EB IFWRD = 1100 CONTINUEIF (N/=1) THEN TPOSE=.FALSE. IF (IFWRD==2) TPOSE=.TRUE. ! TRANSFORM IN Z IF (DATARY) THEN CALL FSH26S(IGRID,IFWRD,NP,L,N,M,LDIMFT,F,FT,CFZ,WSAVEZ) DATARY=OUTARY ELSE CALL FSH26S(IGRID,IFWRD,NP,L,N,M,LDIMFT,FT,F,CFZ,WSAVEZ) DATARY=.NOT.OUTARY END IF END IFSELECT CASE(IFWRD)CASE(1) ; GO TO 490CASE(2) ; GO TO 510END SELECT490 CONTINUEIF (M/=1) THEN TPOSE=.TRUE. IF (IFWRD==2) TPOSE=.FALSE. ! TRANSFORM Y IF (DATARY) THEN CALL FSH26S(IGRID,IFWRD,MP,L,M,N,LDIMFT,F,FT,CFY,WSAVEY) DATARY=OUTARY ELSE CALL FSH26S(IGRID,IFWRD,MP,L,M,N,LDIMFT,FT,F,CFY,WSAVEY) DATARY=.NOT.OUTARY END IF END IFSELECT CASE(IFWRD)CASE(1) ; GO TO 285CASE(2) ; GO TO 100END SELECT285 CONTINUEIF (L>1) THEN ! SOLVE TRIDIAGONAL SYSTEMS IN X THAT WERE! PREVIOUSLY FACTORED IN FSH01S ! CALL VECTORIZED TRIDIAGONAL SOLVER DATASW=.FALSE. IF (NP==1) DATASW=.NOT.DATASW IF (MP==1) DATASW=.NOT.DATASW IF (DATARY) THEN IF (DATASW) THEN CALL FSH06S(L,LP,M*N,LDIMFC,LDIMFT,SCALE,A,C,F,FT,FCTRD) DATARY=.FALSE. ELSE CALL FSH06S(L,LP,M*N,LDIMFC,LDIMFT,SCALE,A,C,F,F,FCTRD) END IF ELSE IF (DATASW) THEN CALL FSH06S(L,LP,M*N,LDIMFC,LDIMFT,SCALE,A,C,FT,F,FCTRD) DATARY=.TRUE. ELSE CALL FSH06S(L,LP,M*N,LDIMFC,LDIMFT,SCALE,A,C,FT,FT,FCTRD) END IF END IF END IFIFWRD = 2GO TO 490510 CONTINUEIF (.NOT.DATARY) THEN DO K=1,N DO J=1,M DO I=1,L F(I,J,K)=FT(I,J,K) END DO END DO END DOEND IFRETURNEND SUBROUTINE FSH03SSUBROUTINE FSH04S(L,M,N,LDIMF,MDIMF,LDIMG,F,G)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFINTEGER :: MDIMFINTEGER :: LDIMGREAL(EB) F(LDIMF,MDIMF, N), G(LDIMG,M,N)! THIS SUBROUTINE PACKS THE SUB-ARRAY! F(I,J,K), I=1,...,L, J=1,...,M, K=1,...,N! INTO THE ARRAY G.DO K = 1,N DO J = 1,M DO I = 1,L G(I,J,K) = F(I,J,K) END DO END DOEND DOIF (LDIMG>L) THEN DO K=1,N DO J=1,M G(LDIMG,J,K)=0._EB END DO END DOEND IFRETURNEND SUBROUTINE FSH04SSUBROUTINE FSH05S(L,M,N,LDIMF,MDIMF,LDIMG,F,G)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFINTEGER :: MDIMFINTEGER :: LDIMGREAL(EB) G(LDIMG,M,N)REAL(EB) F(LDIMF,MDIMF,N)! THIS SUBROUTINE EXPANDS THE ARRAY G OF! DIMENSION L X M X N INTO THE ARRAY F OF! DIMENSION LDIMF X MDIMF X N.DO K = 1,N DO J = 1,M DO I = 1,L F(I,J,K) = G(I,J,K) END DO END DOEND DORETURNEND SUBROUTINE FSH05SSUBROUTINE FSH06S(L,LP,M,LDIMFC,LDIMFT,SCALE,A,C,F,FT,FCTRD)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER :: LINTEGER :: LPINTEGER :: MINTEGER :: LDIMFCINTEGER :: LDIMFTREAL(EB) :: SCALEREAL(EB) FT(LDIMFT,M)REAL(EB) FCTRD(LDIMFC,M)REAL(EB) A(L),C(L),F(LDIMFT,M)! THIS SUBROUTINE SOLVES M TRIDIAGONAL! SYSTEMS OF ORDER L THAT HAVE! FACTORIZATION STORED IN ARRAY FCTRD AND! RIGHT SIDES IN FTSCALE=SCALE**2IF (LP==1) THEN LH=(L+1)/2 LQ=(LH-1)/2 DO I=1,LQ DO J=1,M F(I,J)=F(I,J)-F(2*LH-I,J) F(LH-I,J)=F(LH-I,J)-F(LH+I,J) F(LH+I,J)=F(LH-I,J)+2._EB*F(LH+I,J) F(2*LH-I,J)=F(I,J)+2._EB*F(2*LH-I,J) END DO CALL SSWAP(M,F(I,1),LDIMFT,F(LH-I,1),LDIMFT) END DO DO J=1,M F(LH,J)=2._EB*F(LH,J) END DOIF (MOD(L,2)==0) THEN DO J=1,M F(L,J)=2._EB*F(L,J) END DOEND IFIF (MOD(LH,2)==0) THEN DO J=1,M F( LH/2,J)=F(LH/2,J)-F(3*LH/2,J) F(3*LH/2,J)=F(LH/2,J)+2._EB*F(3*LH/2,J) END DOEND IFSCALE=0.5_EB*SCALEEND IF! FORWARD SUBSTITUTIONDO J = 1,M FT(1,J) = SCALE*F(1,J)*FCTRD(1,J) DO I = 2,L FT(I,J) = (SCALE*F(I,J)-A(I)*FT(I-1,J))*FCTRD(I,J) END DOEND DO! BACKWARD SUBSTITUTIONDO J = 1,M DO I = L - 1,1,-1 FT(I,J) = FT(I,J) - C(I)*FCTRD(I,J)*FT(I+1,J) END DOEND DOIF (LP==1) THEN DO I=1,LQ DO J=1,M FT(I,J)=FT(LH+I,J)+FT(I,J) FT(LH-I,J)=FT(2*LH-I,J)+FT(LH-I,J) FT(2*LH-I,J)=2._EB*FT(2*LH-I,J)-FT(LH-I,J) FT( LH+I,J)=2._EB*FT(LH+I,J)-FT(I,J) END DO CALL SSWAP(M,FT(I,1),LDIMFT,FT(LH-I,1),LDIMFT) END DO IF (MOD(LH,2)==0) THEN DO J=1,M FT( LH/2,J)=FT(3*LH/2,J)+FT(LH/2,J) FT(3*LH/2,J)=2._EB*FT(3*LH/2,J)-FT(LH/2,J) END DO END IF END IFRETURNEND SUBROUTINE FSH06SFUNCTION FSH19S()! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! THIS FUNCTION FURNISHES PI TO MACHINE! PREC! PI=3.14159265358979323846264338327950288REAL(EB) FSH19SFSH19S = 4._EB* ATAN(1._EB) !3.14159265358979323846264338327950288_EBRETURNEND FUNCTION FSH19SFUNCTION FSH20S()! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! THIS FUNCTION FURNISHES THE MACHINE! PREC EPS--THE SMALLEST POSITIVE! MACHINE NUMBER SATISFYING! FL(1._EB+EPS) > 1.! FSH20S = 2.4E-7_EBREAL(EB) FSH20SFSH20S = SPACING (1._EB)!4.E-15_EBRETURNEND FUNCTION FSH20SSUBROUTINE FSH26S(IGRID,IFWRD,MP,L,M,N,LDIMFT,F,FT,CFY,WSAVEY)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER :: IGRIDINTEGER :: IFWRDINTEGER :: MPINTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMFTREAL(EB) FT(LDIMFT,M,N)REAL(EB) CFY(4*M)REAL(EB) WSAVEY(M+16)REAL(EB) F(LDIMFT,M,N)SELECT CASE(IGRID)CASE(1) ; GO TO 110CASE(2) ; GO TO 120END SELECT110 CONTINUESELECT CASE(MP)CASE(1) ; GO TO 130CASE(2) ; GO TO 160CASE(3) ; GO TO 170CASE(4) ; GO TO 220CASE(5) ; GO TO 230END SELECT120 CONTINUESELECT CASE(MP)CASE(1) ; GO TO 130CASE(2) ; GO TO 180CASE(3) ; GO TO 210CASE(4) ; GO TO 240CASE(5) ; GO TO 270END SELECT130 CONTINUESELECT CASE(IFWRD)CASE(1) ; GO TO 140CASE(2) ; GO TO 150END SELECT140 CONTINUECALL VSRFTF(F,L,M,N,LDIMFT,FT,WSAVEY)GO TO 280150 CONTINUECALL VSRFTB(F,L,M,N,LDIMFT,FT,WSAVEY)GO TO 280160 CONTINUECALL VSINT(F,L,M,N,LDIMFT,FT,CFY,WSAVEY)GO TO 280170 CONTINUESELECT CASE(IFWRD)CASE(1) ; GO TO 200CASE(2) ; GO TO 190END SELECT180 CONTINUESELECT CASE(IFWRD)CASE(1) ; GO TO 190CASE(2) ; GO TO 200END SELECT190 CONTINUECALL VSSINF(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1),WSAVEY)GO TO 280200 CONTINUECALL VSSINB(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1),WSAVEY)GO TO 280210 CONTINUECALL VSSINQ(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1), CFY(2*M+1),CFY(3*M+1),WSAVEY)GO TO 280220 CONTINUECALL VCOST(F,L,M,N,LDIMFT,FT,CFY,WSAVEY)GO TO 280230 CONTINUESELECT CASE(IFWRD)CASE(1) ; GO TO 260CASE(2) ; GO TO 250END SELECT240 CONTINUESELECT CASE(IFWRD)CASE(1) ; GO TO 250CASE(2) ; GO TO 260END SELECT250 CONTINUECALL VSCOSF(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1),WSAVEY)GO TO 280260 CONTINUECALL VSCOSB(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1),WSAVEY)GO TO 280270 CONTINUECALL VSCOSQ(F,L,M,N,LDIMFT,FT,CFY(1),CFY(M+1), CFY(2*M+1),CFY(3*M+1),WSAVEY)280 CONTINUERETURNEND SUBROUTINE FSH26SSUBROUTINE VCOST(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)REAL(EB) C(M)REAL(EB) WSAVE(M+15)REAL(EB) X(LDIMX*N,M)! TPOSE = .TRUE. IF TRANSFORMING SECOND INDEX (SO TRANSPOSE)! = .FALSE. IF TRANSFORMING THIRD INDEXMM1 = M-1MS2 = M/2SCALE=SCALE*SQRT(0.5_EB)IF (TPOSE) THEN CALL VCOST1(L,M,N,LDIMX,MS2,C,XT,X)ELSE DO I=1,LDIMX*N XT(I,M)= X(I,1)-X(I,M) XT(I,1) = X(I,1)+X(I,M) END DODO J=2,MS2 JC = M+1-J DO I=1,LDIMX*N XT(I,M) = XT(I,M)+C(JC)*(X(I,J)-X(I,JC)) XT(I,J) = (X(I,J)+X(I,JC))-(C(J)*(X(I,J)-X(I,JC))) XT(I,JC) = (X(I,J)+X(I,JC))+(C(J)*(X(I,J)-X(I,JC))) END DOEND DOIF (MOD(M,2) == 0) GO TO 404DO I=1,LDIMX*N XT(I,MS2+1) = 2._EB*X(I,MS2+1)END DO404 CONTINUEEND IFIF (M>3) THEN 450 CALL VRFFTF (LDIMX*N,MM1,XT,LDIMX*N,X,WSAVE) IF (OUTARY) THEN CALL VCOSTA(M,N*LDIMX,MM1,XT(1,M),X,XT) ELSE CALL VCOSTA(M,N*LDIMX,MM1,XT(1,M),XT,X) END IFELSE IF (M==2) THEN OUTARY=.FALSE.ELSE DO I=1,LDIMX*N X(I,2)=XT(I,3) X(I,1)=XT(I,1)+XT(I,2) X(I,3)=XT(I,1)-XT(I,2) END DOOUTARY=.TRUE.SCALE=SCALE*SQRT(0.5_EB)END IFRETURNEND SUBROUTINE VCOSTSUBROUTINE VCOST1(L,M,N,LDIMX,MS2,C,XT,X)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+! PACKAGE VFFTPAK, VERSION 1, JUNE 1989INTEGER :: LINTEGER :: MINTEGER :: NINTEGER :: LDIMXINTEGER :: MS2REAL(EB) C(*)REAL(EB) XT(LDIMX,N,M)REAL(EB) X(LDIMX,M,N)DO K=1,N DO I=1,L XT(I,K,M)=X(I,1,K)-X(I,M,K) XT(I,K,1) = X(I,1,K)+X(I,M,K) END DOEND DODO J=2,MS2 JC = M+1-J DO K=1,N DO I=1,L XT(I,K,M) = XT(I,K,M)+C(JC)*(X(I,J,K)-X(I,JC,K)) XT(I,K,J) = (X(I,J,K)+X(I,JC,K))-(C(J)*(X(I,J,K)-X(I,JC,K))) XT(I,K,JC) = (X(I,J,K)+X(I,JC,K))+(C(J)*(X(I,J,K)-X(I,JC,K))) END DO END DOEND DOIF (MOD(M,2) == 0) GO TO 404DO K=1,N
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -