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

📄 pois.f90

📁 FDS为火灾动力学模拟软件源代码,该软件为开源项目,代码语言主要为FORTRAN,可在WINDOWS和LINUX下编译运行,详细说明可参考http://fire.nist.gov/fds/官方网址
💻 F90
📖 第 1 页 / 共 5 页
字号:
MODULE POIS ! CODE CONVERTED USING TO_F90 BY ALAN MILLER! DATE: 2006-01-18  TIME: 13:48:46! POISSON SOLVER ROUTINESUSE PRECISION_PARAMETERSIMPLICIT REAL(EB) (A-H,O-Z)IMPLICIT INTEGER (I-N)PRIVATEREAL(EB) SCALEINTEGER :: KAPPA,NMAX,IKPWRLOGICAL :: TPOSE,NOCOPY,OUTARYCHARACTER(255), PARAMETER :: poisid='$Id: pois.f90 607 2007-09-17 17:53:03Z mcgratta $'CHARACTER(255), PARAMETER :: poisrev='$Revision: 607 $'CHARACTER(255), PARAMETER :: poisdate='$Date: 2007-09-17 13:53:03 -0400 (Mon, 17 Sep 2007) $'PUBLIC H3CZIS,H3CZSS,H2CZSS,H2CYSS,H3CSSS,H2CZIS,H3CSIS,H2CYIS,GET_REV_poisCONTAINSSUBROUTINE H3CZIS(XS,XF,L,LBDCND,YS,YF,M,MBDCND,ZS,ZF,N,NBDCND,  &    H,ELMBDA,LDIMF,MDIMF,IERROR,SAVE)! +--------------------------------------------------------------------+! |                                                                    |! |                       COPYRIGHT (C) 1989 BY                        |! |                          ROLAND A. SWEET                           |! |                        ALL RIGHTS RESERVED                         |! |                                                                    |! +--------------------------------------------------------------------+REAL(EB)::  XS, XF, YS, YF, ZS, ZF, ELMBDA, DLZSQRINTEGER:: L, LBDCND, M, MBDCND, N, NBDCND, LDIMF, MDIMF, IERROR, LPERODREAL(EB) SAVE(-3:*),H(0:*)!                               CHECK FOR INVALID INPUTIERROR = 0IF (XS>XF) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 1._EBEND IFIF (L<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 2._EBEND IFIF (LBDCND<0 .OR. LBDCND>4) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 3._EB END IFIF (YS>YF) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 4._EB END IFIF (M<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 5._EB END IFIF (MBDCND<0 .OR. MBDCND>4) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 6._EB END IFIF (ZS>ZF) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 7._EB END IFIF (N<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 8._EB END IFIF (NBDCND<0 .OR. NBDCND>4) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 9._EB END IFIF (LDIMF<L) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 10._EB END IFIF (MDIMF<M) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 11._EB END IFIF (IERROR/=0) THEN  RETURNELSE  SAVE(1) = 0._EB END IF!                               DEFINE GRID PARAMETERSDX = (XF-XS)/LDY = (YF-YS)/MDZ = (ZF-ZS)/NDLXSQR = 1._EB/DX**2DLYSQR = 1._EB/DY**2DLZSQR = 1._EB/DZ**2LP = LBDCND + 1MP = MBDCND + 1NP = NBDCND + 1!                               ALLOCATE SAVE ARRAYIA = 12IB = IA + LIC = IB + LID = IC + LIS = ID + L!                               DEFINE THE A,B,C COEFFICIENTS!                               IN SAVE ARRAYDO  I = 0,L - 1  HM = .5_EB*(H(I)+H(I+1))  HP = .5_EB*(H(I+1)+H(I+2))  SAVE(IA+I) = DLXSQR/(H(I+1)*HM)  SAVE(IC+I) = DLXSQR/(H(I+1)*HP)  SAVE(IB+I) = - (SAVE(IA+I)+SAVE(IC+I)) + ELMBDA  SAVE(ID+I) = DLYSQREND DOSELECT CASE(LP)CASE(2)SAVE(IB) = SAVE(IB) - SAVE(IA)SAVE(IC-1) = SAVE(IC-1) - SAVE(ID-1)CASE(3)SAVE(IB) = SAVE(IB) - SAVE(IA)SAVE(IC-1) = SAVE(IC-1) + SAVE(ID-1)CASE(4)SAVE(IB) = SAVE(IB) + SAVE(IA)SAVE(IC-1) = SAVE(IC-1) + SAVE(ID-1)CASE(5)SAVE(IB) = SAVE(IB) + SAVE(IA)SAVE(IC-1) = SAVE(IC-1) - SAVE(ID-1)END SELECT!                               DETERMINE WHETHER OR NOT BOUNDARY!                               CONDITION IS PERIODIC IN XIF (LBDCND==0) THEN  LPEROD = 0ELSE  LPEROD = 1END IF!                               INITIALIZE SOLVER ROUTINE S3CFIS.CALL S3CFIS(LPEROD,L,MBDCND,M,NBDCND,N,DLZSQR,SAVE(IA),SAVE(IB),  &    SAVE(IC),SAVE(ID),LDIMF,MDIMF,IR,SAVE(IS))!                               TEST ERROR FLAG FROM S3CFIS FOR!                               INTERNAL ERRORIF (IR/=0) THEN  SAVE(1) = 99._EB   IERROR = 1    RETURNEND IF!                               SAVE PARAMETERS FOR H3CZSS IN SAVE ARRAYSAVE(2) = DXSAVE(3) = LSAVE(4) = LPSAVE(5) = DYSAVE(6) = MSAVE(7) = MPSAVE(8) = DZSAVE(9) = NSAVE(10) = NPSAVE(11) = ELMBDARETURNEND SUBROUTINE H3CZISSUBROUTINE H3CZSS(BDXS,BDXF,BDYS,BDYF,BDZS,BDZF,LDIMF,MDIMF,F,  &    PERTRB,SAVE,W,H)! +--------------------------------------------------------------------+! |                                                                    |! |                       COPYRIGHT (C) 1989 BY                        |! |                          ROLAND A. SWEET                           |! |                        ALL RIGHTS RESERVED                         |! |                                                                    |! +--------------------------------------------------------------------+REAL(EB):: BDXS(MDIMF,*), BDXF(MDIMF,*), BDYS(LDIMF,*), BDYF(LDIMF,*), BDZS(LDIMF,*), BDZF(LDIMF,*), &           F(LDIMF,MDIMF,*),SAVE(-3:*),W(*),H(0:*), PERTRBINTEGER:: LDIMF, MDIMF !                               CHECK VALUE OF IERROR (=SAVE(1)).!                               IF NON-ZERO, RETURN.IF (SAVE(1)/=0._EB) RETURN!                               GET PARAMETERS FOR H3CZSS FROM SAVE!                               ARRAY WHERE THEY WERE STORED IN!                               INITIALIZATION SUBROUTINE H3CZIS.DX = SAVE(2)L = SAVE(3)LP = SAVE(4)DY = SAVE(5)M = SAVE(6)MP = SAVE(7)DZ = SAVE(8)N = SAVE(9)NP = SAVE(10)ELMBDA = SAVE(11)DLYRCP = 1._EB/DYTWDYSQ = 2._EB/DY**2DLZRCP = 1._EB/DZTWDZSQ = 2._EB/DZ**2!                               ALLOCATE SAVE ARRAYIA = 12IB = IA + LIC = IB + LID = IC + LIS = 12 + 4*L!                               ENTER BOUNDARY DATA FOR X-BOUNDARIESIF (LP==2 .OR. LP==3) THEN  DO K = 1,N    DO J = 1,M      F(1,J,K) = F(1,J,K) - 2._EB*BDXS(J,K)*SAVE(IA)    END DO  END DOEND IFIF (LP==4 .OR. LP==5) THEN  DO K = 1,N    DO J = 1,M      F(1,J,K) = F(1,J,K) + SAVE(IA)*DX*BDXS(J,K)    END DO  END DOEND IFIF (LP==2 .OR. LP==5) THEN  DO K = 1,N    DO J = 1,M      F(L,J,K) = F(L,J,K) - 2._EB*BDXF(J,K)*SAVE(ID-1)    END DO  END DOEND IFIF (LP==3 .OR. LP==4) THEN  DO K = 1,N    DO J = 1,M      F(L,J,K) = F(L,J,K) - SAVE(ID-1)*DX*BDXF(J,K)    END DO  END DOEND IF!                               ENTER BOUNDARY DATA FOR Y-BOUNDARIESIF (MP==2 .OR. MP==3) THEN  DO K = 1,N    DO I = 1,L      F(I,1,K) = F(I,1,K) - BDYS(I,K)*TWDYSQ    END DO  END DOEND IFIF (MP==4 .OR. MP==5) THEN  DO K = 1,N    DO I = 1,L      F(I,1,K) = F(I,1,K) + BDYS(I,K)*DLYRCP    END DO  END DOEND IFIF (MP==2 .OR. MP==5) THEN  DO K = 1,N    DO I = 1,L      F(I,M,K) = F(I,M,K) - BDYF(I,K)*TWDYSQ    END DO  END DOEND IFIF (MP==3 .OR. MP==4) THEN  DO K = 1,N    DO I = 1,L      F(I,M,K) = F(I,M,K) - BDYF(I,K)*DLYRCP    END DO  END DOEND IF!                               ENTER BOUNDARY DATA FOR Z-BOUNDARIESIF (NP==2 .OR. NP==3) THEN  DO J = 1,M    DO I = 1,L      F(I,J,1) = F(I,J,1) - BDZS(I,J)*TWDZSQ    END DO  END DOEND IFIF (NP==4 .OR. NP==5) THEN  DO J = 1,M    DO I = 1,L      F(I,J,1) = F(I,J,1) + BDZS(I,J)*DLZRCP    END DO  END DOEND IFIF (NP==2 .OR. NP==5) THEN  DO J = 1,M    DO I = 1,L      F(I,J,N) = F(I,J,N) - BDZF(I,J)*TWDZSQ    END DO  END DOEND IFIF (NP==3 .OR. NP==4) THEN  DO J = 1,M    DO I = 1,L      F(I,J,N) = F(I,J,N) - BDZF(I,J)*DLZRCP    END DO  END DOEND IFPERTRB = 0._EB PERT   = 0._EB ISING = 0!                               FOR SINGULAR PROBLEMS ADJUST DATA TO!                               INSURE A SOLUTION WILL EXIST.  GO THRU!                               THIS CODE TWICE: ISING=1 FOR CALCULATING!                               PERTRB; ISING=2 FOR NORMALIZING SOLUTION!                               AFTER IT IS COMPUTED.SELECT CASE(LP)CASE(1)   ; GO TO 630CASE(2:3) ; GO TO 750CASE(4)   ; GO TO 630CASE(5)   ; GO TO 750END SELECT630 CONTINUESELECT CASE(MP)CASE(1)   ; GO TO 640CASE(2:3) ; GO TO 750CASE(4)   ; GO TO 640CASE(5)   ; GO TO 750END SELECT640 CONTINUESELECT CASE(NP)CASE(1)   ; GO TO 650CASE(2:3) ; GO TO 750CASE(4)   ; GO TO 650CASE(5)   ; GO TO 750END SELECT650 CONTINUEIF (ELMBDA/=0._EB) GO TO 750ISING = 1660 CONTINUEPERT = 0._EB DO  I = 1,L  W(I) = 0._EB END DODO  K = 1,N  DO  J = 1,M    DO  I = 1,L      W(I) = W(I) + F(I,J,K)    END DO  END DOEND DOS1 = 0._EB S3 = 0._EB DO  I = 1,L  S3 = S3 + H(I)  S1 = S1 + H(I)*W(I)END DOS3   = S3*M*NPERT = S1/S3!                               ADJUST F ARRAY BY PERTDO  K = 1,N  DO  J = 1,M    DO  I = 1,L      F(I,J,K) = F(I,J,K) - PERT    END DO  END DOEND DO750 CONTINUE!                               IF NORMALIZING SOLUTION, RESTORE PERTRB!                               AND JUMP TO ENDIF (ISING==2) THEN  PERTRB = PRTSAV    GO TO 800  END IFPRTSAV = PERT!                               SOLVE THE EQUATIONCALL S3CFSS(LDIMF,MDIMF,F,SAVE(IS),W)!                               IF A SINGULAR PROBLEM,!                               RE-NORMALIZE SOLUTION (ISING=2)IF (ISING==1) THEN  ISING = 2    GO TO 660  END IF800 CONTINUERETURNEND SUBROUTINE H3CZSSSUBROUTINE S3CFIS(LPEROD,L,MPEROD,M,NPEROD,N,SCAL,A,B,C,D,LDIMF,  &    MDIMF,IERROR,SAVE)! +--------------------------------------------------------------------+! |                                                                    |! |                       COPYRIGHT (C) 1989 BY                        |! |                          ROLAND A. SWEET                           |! |                        ALL RIGHTS RESERVED                         |! |                                                                    |! +--------------------------------------------------------------------+INTEGER:: LPEROD, L, MPEROD, M, NPEROD, NREAL(EB):: SCALREAL(EB):: A(L), B(L), C(L), D(L), SAVE(-3:*)INTEGER:: LDIMF, MDIMF, IERROR!                               CHECK FOR INVALID INPUTIERROR = 0IF (LPEROD/=0 .AND. LPEROD/=1) THEN  IERROR = 1  SAVE(1) = 1._EB END IFIF (L<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 2._EB END IFIF (MPEROD<0 .AND. MPEROD>4) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 3._EB END IFIF (M<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 4._EB END IFIF (NPEROD<0 .AND. NPEROD>4) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 5._EB END IFIF (N<3) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 6._EB END IFIF (LDIMF<L) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 7._EB END IFIF (MDIMF<M) THEN  IERROR = IERROR + 1  SAVE(IERROR) = 8._EB END IFIF (LPEROD==0) THEN  DO  I = 1,L        IF (A(I)/=A(1)) GO TO 110    IF (B(I)/=B(1)) GO TO 110    IF (C(I)/=A(1)) GO TO 110    IF (D(I)/=D(1)) GO TO 110      END DO    GO TO 120    110     CONTINUE  IERROR = IERROR + 1  SAVE(IERROR) = 9._EB END IF120 CONTINUEIF (IERROR/=0) THEN  RETURNELSE  SAVE(1) = IERROREND IF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -