📄 pois.f90
字号:
LDIMFC=LIF (LDIMF>L .AND. MOD(L,2)==0) LDIMFC=L+1IGRID = 2CALL FSH00S(IGRID,LPEROD,L,MPEROD,M,NPEROD,N,LDIMFC, SCAL,A,B,C,D,SAVE)RETURNEND SUBROUTINE S3CFISSUBROUTINE S3CFSS(LDIMF,MDIMF,F,SAVE,W)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER:: LDIMF, MDIMFREAL(EB) F(LDIMF,MDIMF,*), SAVE(-3:*), W(*)! CHECK VALUE OF IERROR (=SAVE(1)).! IF NON-ZERO, RETURN.IF (SAVE(1)/=0._EB) RETURNCALL FSH02S(LDIMF,MDIMF,F,SAVE,W)RETURNEND SUBROUTINE S3CFSSSUBROUTINE FSH00S(IGRID,LPEROD,L,MPEROD,M,NPEROD,N,LDIMFC,C2, A,B,C,D,SAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+REAL(EB) a(l),b(l),c(l),d(l),save(-3:*), C2INTEGER:: IGRID, LPEROD, L, MPEROD, M, NPEROD, N, LDIMFC! THIS SUBROUTINE INITIALIZES FFT SOLVER! ALLOCATE SAVE ARRAYIA = 12IB = IA + LIC = IB + LICFY = IC + LIF (IGRID==1) THEN ICFZ = ICFY + 2*M IFCTRD = ICFZ + 2*NELSE ICFZ = ICFY + 4*M IFCTRD = ICFZ + 4*NEND IFIWSY = IFCTRD + LDIMFC*M*NIWSZ = IWSY + M + 16IZRT = IWSZ + N + 16! COPY COEFFICIENT ARRAYS A,B, AND C INTO! SAVE ARRAY. A COPY OF B IS MADE BECAUSE! IN THE NEXT LEVEL ROUTINE, BOUNDARY! ELEMENTS OF B MAY BE CHANGED.DO I = 0,L - 1 SAVE(IA+I) = A(I+1) SAVE(IB+I) = B(I+1) SAVE(IC+I) = C(I+1)END DOLP = LPEROD + 1MP = MPEROD + 1NP = NPEROD + 1! CALL LOWER LEVEL INITIALIZATION ROUTINECALL FSH01S(IGRID,L,LP,M,MP,D,N,NP,LDIMFC,C2,SAVE(IA),SAVE(IB), & SAVE(IC),SAVE(ICFY),SAVE(ICFZ),SAVE(IFCTRD), SAVE(IWSY),SAVE(IWSZ),SAVE(IZRT))! SAVE PARAMETERS FOR SUBROUTINE SOLVERSAVE(2) = LSAVE(3) = LPSAVE(4) = MSAVE(5) = MPSAVE(6) = NSAVE(7) = NPSAVE(8) = ICFZSAVE(9) = IWSZSAVE(10) = IZRTSAVE(11) = IGRIDRETURNEND SUBROUTINE FSH00SSUBROUTINE FSH01S(IGRID,L,LP,M,MP,D,N,NP,LDIMFC,C2,A,B,C,CFY,CFZ, & FCTRD,WSAVEY,WSAVEZ,ZRT)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+REAL(EB) a(l),b(l),c(l),d(l),cfy(4*m),cfz(4*n),fctrd(ldimfc,n,m),wsavey(m+16),wsavez(n+16),zrt(n)INTEGER:: IGRID, L, LP, M, MP, N, NP, LDIMFC, K, IREAL(EB):: C2! INITIALIZATION ROUTINE FOR FFT SOLVERSPI = FSH19S()EPS = FSH20S()IF (L>1 .AND. LP==1) THEN LH = (L+1)/2 LODD = 1 IF (2*LH==L) LODD = 2 C(LH-1) = 0._EB A(LH) = 0._EB C(LH) = 2._EB*C(LH) IF (LODD==1) THEN B(LH-1) = B(LH-1) - A(LH-1) B(L) = B(L) + A(L) END IF IF (LODD==2) A(L) = C(LH)END IF! COMPUTE TRANSFORM ROOTS FOR J-DIRECTIONIF (M==1) THEN CFY(1) = 0._EB ELSE IF (IGRID==1) THEN MRDEL = ((MP-1)* (MP-3)* (MP-5))/3 DEL = PI/ (2._EB* (M+MRDEL)) ELSE DEL = PI/ (2*M) END IF IF (MP==1) THEN CFY(1) = 0._EB CFY(M) = -4._EB DO J = 2,M - 1,2 CFY(J) = -4._EB*SIN(J*DEL)**2 CFY(J+1) = CFY(J) END DO END IF IF (MP==2) THEN DO J = 1,M CFY(J) = -4._EB*SIN(J*DEL)**2 END DO END IF IF (MP==3 .OR. MP==5) THEN DO J = 1,M CFY(J) = -4._EB*SIN((J-.5_EB)*DEL)**2 END DO END IF IF (MP==4) THEN DO J = 1,M CFY(J) = -4._EB*SIN((J-1)*DEL)**2 END DO END IF END IF! COMPUTE TRANSFORM ROOTS IN K-DIRECTIONIF (N==1) THEN ZRT(1) = 0._EB ELSE IF (IGRID==1) THEN NRDEL = ((NP-1)* (NP-3)* (NP-5))/3 DEL = PI/ (2._EB* (N+NRDEL)) ELSE DEL = PI/ (2*N) END IF IF (NP==1) THEN ZRT(1) = 0._EB ZRT(N) = -4._EB*C2 DO K = 2,N - 1,2 ZRT(K) = -4._EB*C2*SIN(K*DEL)**2 ZRT(K+1) = ZRT(K) END DO END IF IF (NP==2) THEN DO K = 1,N ZRT(K) = -4._EB*C2*SIN(K*DEL)**2 END DO END IF IF (NP==3 .OR. NP==5) THEN DO K = 1,N ZRT(K) = -4._EB*C2*SIN((K-.5_EB)*DEL)**2 END DO END IF IF (NP==4) THEN DO K = 1,N ZRT(K) = -4._EB*C2*SIN((K-1)*DEL)**2 END DO END IF END IFIF (L>1) THEN ! FACTOR M*N TRIDIAGONAL SYSTEMS.! FIRST, DO THE POSSIBLY SINGULAR! CASE CORRESPONDING TO J = K = 1. FCTRD(1,1,1) = 1._EB/ (B(1)+D(1)*CFY(1)+ZRT(1)) DO I = 2,L - 1 FCTRD(I,1,1) = 1._EB/ (B(I)+D(I)*CFY(1)+ZRT(1)- A(I)*C(I-1)*FCTRD(I-1,1,1)) END DO ! IF TRIDIAGONAL SYSTEM! (...,A(I),B(I),C(I),...) IS SINGULAR! THEN FCTRD(1,1,L) IS 1._EB/0. IF! DENOMINATOR IS WITHIN ROUND-OFF OF 0,! SET FCTRD(1,1,L) ARBITRARILY DEN = B(L) + D(L)*CFY(1) + ZRT(1) - A(L)*C(L-1)*FCTRD(L-1,1,1) BMAX = ABS(B(1)) DO I = 2,L BMAX = MAX(BMAX,ABS(B(I))) END DO IF (ABS(DEN/BMAX)<=10._EB *EPS) DEN = BMAX FCTRD(L,1,1) = 1._EB/DEN ! FACTOR CASES J=1, K=2,...,N. DO K = 2,N FCTRD(1,K,1) = 1._EB/ (B(1)+D(1)*CFY(1)+ZRT(K)) END DO DO I = 2,L DO K = 2,N FCTRD(I,K,1) = 1._EB/ (B(I)+D(I)*CFY(1)+ZRT(K)- A(I)*C(I-1)*FCTRD(I-1,K,1)) END DO END DO ! FACTOR CASES K=1, J=2,...,M. DO J = 2,M FCTRD(1,1,J) = 1._EB/ (B(1)+D(1)*CFY(J)+ZRT(1)) END DO DO I = 2,L DO J = 2,M FCTRD(I,1,J) = 1._EB/ (B(I)+D(I)*CFY(J)+ZRT(1)- A(I)*C(I-1)*FCTRD(I-1,1,J)) END DO END DO ! FACTOR REMAINING CASES. DO K = 2,N DO J = 2,M FCTRD(1,K,J) = 1._EB/ (B(1)+D(1)*CFY(J)+ZRT(K)) END DO END DO DO I = 2,L DO K = 2,N DO J = 2,M FCTRD(I,K,J) = 1._EB/ (B(I)+D(I)*CFY(J)+ZRT(K)- & A(I)*C(I-1)*FCTRD(I-1,K,J)) END DO END DO END DOEND IF! INITIALIZE FFT TRANSFORMS AND! PRE-PROCESSING COEFFICIENTS IN JIF (M/=1) THEN SELECT CASE(IGRID) CASE(1) ; GO TO 440 CASE(2) ; GO TO 450END SELECT440 CONTINUESELECT CASE(MP)CASE(1) ; GO TO 460CASE(2) ; GO TO 470CASE(3) ; GO TO 480CASE(4) ; GO TO 500CASE(5) ; GO TO 510END SELECT450 CONTINUESELECT CASE(MP)CASE(1) ; GO TO 460CASE(2) ; GO TO 480CASE(3) ; GO TO 490CASE(4) ; GO TO 510CASE(5) ; GO TO 520END SELECT460 CONTINUECALL VSRFTI(M,WSAVEY)GO TO 530470 CONTINUECALL VSINTI(M,CFY,WSAVEY)GO TO 530480 CONTINUE!EB CALL VSSINI(M,CFY(1),CFY(M+1),WSAVEY)CALL VSCOSI(M,CFY(1),CFY(M+1),WSAVEY)GO TO 530490 CONTINUE!EB CALL VSSNQI(M,CFY(1),CFY(M+1),CFY(2*M+1),CFY(3*M+1),WSAVEY)CALL VSCSQI(M,CFY(1),CFY(M+1),CFY(2*M+1),CFY(3*M+1),WSAVEY)GO TO 530500 CONTINUECALL VCOSTI(M,CFY,WSAVEY)GO TO 530510 CONTINUECALL VSCOSI(M,CFY(1),CFY(M+1),WSAVEY)GO TO 530520 CONTINUECALL VSCSQI(M,CFY(1),CFY(M+1),CFY(2*M+1),CFY(3*M+1),WSAVEY)530 CONTINUEEND IF! INITIALIZE FFT TRANSFORMS AND! PRE-PROCESSING COEFFICIENTS IN KIF (N/=1) THEN SELECT CASE(IGRID) CASE(1) ; GO TO 540 CASE(2) ; GO TO 550END SELECT540 CONTINUESELECT CASE(NP)CASE(1) ; GO TO 560CASE(2) ; GO TO 570CASE(3) ; GO TO 580CASE(4) ; GO TO 600CASE(5) ; GO TO 610END SELECT550 CONTINUESELECT CASE(NP)CASE(1) ; GO TO 560CASE(2) ; GO TO 580CASE(3) ; GO TO 590CASE(4) ; GO TO 610CASE(5) ; GO TO 620END SELECT560 CONTINUECALL VSRFTI(N,WSAVEZ)GO TO 630570 CONTINUECALL VSINTI(N,CFZ,WSAVEZ)GO TO 630580 CONTINUE!EB CALL VSSINI(N,CFZ(1),CFZ(N+1),WSAVEZ)CALL VSCOSI(N,CFZ(1),CFZ(N+1),WSAVEZ)GO TO 630590 CONTINUE!EB CALL VSSNQI(N,CFZ(1),CFZ(N+1),CFZ(2*N+1),CFZ(3*N+1),WSAVEZ)CALL VSCSQI(N,CFZ(1),CFZ(N+1),CFZ(2*N+1),CFZ(3*N+1),WSAVEZ)GO TO 630600 CONTINUECALL VCOSTI(N,CFZ,WSAVEZ)GO TO 630610 CONTINUECALL VSCOSI(N,CFZ(1),CFZ(N+1),WSAVEZ)GO TO 630620 CONTINUECALL VSCSQI(N,CFZ(1),CFZ(N+1),CFZ(2*N+1),CFZ(3*N+1),WSAVEZ)630 CONTINUEEND IFRETURNEND SUBROUTINE FSH01SSUBROUTINE FSH02S(LDIMF,MDIMF,F,SAVE,W)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER:: LDIMF, MDIMFREAL(EB) F(LDIMF,MDIMF,*), W(*), SAVE(-3:*)! RETRIEVE CONSTANTS FROM SAVE ARRAYL = SAVE(2)LP = SAVE(3)M = SAVE(4)MP = SAVE(5)N = SAVE(6)NP = SAVE(7)IGRID = SAVE(11)! ALLOCATION OF SAVE ARRAYIA = 12IC = IA + 2*LICFY = IC + LIF (IGRID==1) THEN ICFZ = ICFY + 2*M IFCTRD = ICFZ + 2*NELSE ICFZ = ICFY + 4*M IFCTRD = ICFZ + 4*NEND IFLDIMFC=LIF (LDIMF>L .AND. MOD(L,2)==0) LDIMFC=L+1IWSY = IFCTRD + LDIMFC*M*NIWSZ = IWSY + M + 16LDIMFT=LIF (LDIMF==L .AND. MDIMF==M) THEN ! NO HOLES IN DATA ARRAY, SO CALL SOLVER CALL FSH03S(IGRID,L,LP,M,MP,N,NP,LDIMFC,LDIMFT,F,SAVE(ICFY), SAVE(ICFZ), & W,SAVE(IA),SAVE(IC),SAVE(IFCTRD),SAVE(IWSY), SAVE(IWSZ))ELSE IF (LDIMF>L .AND. MOD(L,2)==0) LDIMFT=L+1 ! PACK DATA ARRAY, CALL SOLVER,! AND THEN UNPACK SOLUTION ARRAY CALL FSH04S(L,M,N,LDIMF,MDIMF,LDIMFT,F,W) CALL FSH03S(IGRID,L,LP,M,MP,N,NP,LDIMFC,LDIMFT,W,SAVE(ICFY), & SAVE(ICFZ),F, SAVE(IA),SAVE(IC),SAVE(IFCTRD),SAVE(IWSY), & SAVE(IWSZ)) CALL FSH05S(L,M,N,LDIMF,MDIMF,LDIMFT,F,W)END IFRETURNEND SUBROUTINE FSH02SSUBROUTINE FSH03S(IGRID,L,LP,M,MP,N,NP,LDIMFC,LDIMFT,F,CFY,CFZ, & FT,A,C,FCTRD,WSAVEY,WSAVEZ)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER :: IGRIDINTEGER :: LINTEGER :: LPINTEGER :: MINTEGER :: MPINTEGER :: NINTEGER :: NPINTEGER :: LDIMFCINTEGER :: LDIMFTREAL(EB) CFY(4*M)REAL(EB) CFZ(4*N)REAL(EB) FT(LDIMFT,M,N)REAL(EB) FCTRD(LDIMFC,M,N)REAL(EB) WSAVEY(M+16)REAL(EB) WSAVEZ(N+16)REAL(EB) A(L),C(L),F(LDIMFT,M,N) LOGICAL :: DATARY,DATASW! ZERO OUT BOTTOM PLANE OF ARRAY FTDO K=1,N DO J=1,M FT(LDIMFT,J,K)=0._EB END DOEND DONOCOPY=.TRUE.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -