⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pois.f90

📁 FDS为火灾动力学模拟软件源代码,该软件为开源项目,代码语言主要为FORTRAN,可在WINDOWS和LINUX下编译运行,详细说明可参考http://fire.nist.gov/fds/官方网址
💻 F90
📖 第 1 页 / 共 5 页
字号:
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 + -