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

📄 read.f90

📁 FDS为火灾动力学模拟软件源代码,该软件为开源项目,代码语言主要为FORTRAN,可在WINDOWS和LINUX下编译运行,详细说明可参考http://fire.nist.gov/fds/官方网址
💻 F90
📖 第 1 页 / 共 5 页
字号:
! Scan the input file, counting the number of NAMELIST entries!ALLOCATE(TRANS(NMESHES))!MESH_LOOP: DO NM=1,NMESHES   M => MESHES(NM)   T => TRANS(NM)!   DO N=1,3      T%NOC(N) = 0      TRNLOOP: DO         SELECT CASE (N)            CASE(1)               CALL CHECKREAD('TRNX',LU_INPUT,IOS)               IF (IOS==1) EXIT TRNLOOP               MESH_NUMBER = 1               READ(LU_INPUT,NML=TRNX,END=17,ERR=18,IOSTAT=IOS)               IF (MESH_NUMBER/=NM) CYCLE TRNLOOP            CASE(2)               CALL CHECKREAD('TRNY',LU_INPUT,IOS)               IF (IOS==1) EXIT TRNLOOP               MESH_NUMBER = 1               READ(LU_INPUT,NML=TRNY,END=17,ERR=18,IOSTAT=IOS)               IF (MESH_NUMBER/=NM) CYCLE TRNLOOP            CASE(3)               CALL CHECKREAD('TRNZ',LU_INPUT,IOS)               IF (IOS==1) EXIT TRNLOOP               MESH_NUMBER = 1               READ(LU_INPUT,NML=TRNZ,END=17,ERR=18,IOSTAT=IOS)               IF (MESH_NUMBER/=NM) CYCLE TRNLOOP         END SELECT         T%NOC(N) = T%NOC(N) + 1         18 IF (IOS>0) CALL SHUTDOWN('ERROR: Problem with TRN* line')      ENDDO TRNLOOP      17 REWIND(LU_INPUT)   ENDDO!   T%NOCMAX = MAX(T%NOC(1),T%NOC(2),T%NOC(3))   ALLOCATE(A(T%NOCMAX+1,T%NOCMAX+1))   ALLOCATE(XX(T%NOCMAX+1,3))   ALLOCATE(ND(T%NOCMAX+1,3))   ALLOCATE(T%C1(0:T%NOCMAX+1,3))   T%C1               = 0._EB   T%C1(1,1:3)        = 1._EB   ALLOCATE(T%C2(0:T%NOCMAX+1,3))   ALLOCATE(T%C3(0:T%NOCMAX+1,3))   ALLOCATE(T%CCSTORE(T%NOCMAX,3))   ALLOCATE(T%PCSTORE(T%NOCMAX,3))   ALLOCATE(T%IDERIVSTORE(T%NOCMAX,3))!   T%ITRAN  = 0!   DO IC=1,3      NLOOP:  DO N=1,T%NOC(IC)         IDERIV = -1         IF (IC==1) THEN            LOOP1: DO               CALL CHECKREAD('TRNX',LU_INPUT,IOS)               IF (IOS==1) EXIT NLOOP               MESH_NUMBER = 1               READ(LU_INPUT,TRNX,END=1,ERR=2)               IF (MESH_NUMBER==NM) EXIT LOOP1            ENDDO LOOP1         ENDIF         IF (IC==2) THEN            LOOP2: DO               CALL CHECKREAD('TRNY',LU_INPUT,IOS)               IF (IOS==1) EXIT NLOOP               MESH_NUMBER = 1               READ(LU_INPUT,TRNY,END=1,ERR=2)               IF (MESH_NUMBER==NM) EXIT LOOP2            ENDDO LOOP2         ENDIF         IF (IC==3) THEN            LOOP3: DO               CALL CHECKREAD('TRNZ',LU_INPUT,IOS)               IF (IOS==1) EXIT NLOOP               MESH_NUMBER = 1               READ(LU_INPUT,TRNZ,END=1,ERR=2)               IF (MESH_NUMBER==NM) EXIT LOOP3            ENDDO LOOP3         ENDIF         T%CCSTORE(N,IC) = CC         T%PCSTORE(N,IC) = PC         T%IDERIVSTORE(N,IC) = IDERIV         IF (IDERIV>=0) T%ITRAN(IC) = 1         IF (IDERIV<0)  T%ITRAN(IC) = 2      2 CONTINUE        ENDDO NLOOP      1 REWIND(LU_INPUT)   ENDDO    ICLOOP: DO IC=1,3      SELECT CASE (T%ITRAN(IC))         CASE (1)  ! polynomial transformation            ND(1,IC)  = 0            SELECT CASE(IC)               CASE(1)                  XX(1,IC)    = M%XF-M%XS                  T%C1(1,IC)  = M%XF-M%XS               CASE(2)                  XX(1,IC)    = M%YF-M%YS                  T%C1(1,IC)  = M%YF-M%YS               CASE(3)                  XX(1,IC)    = M%ZF-M%ZS                  T%C1(1,IC)  = M%ZF-M%ZS            END SELECT            NNLOOP:  DO N=2,T%NOC(IC)+1               IDERIV = T%IDERIVSTORE(N-1,IC)               IF (IC==1) CC = T%CCSTORE(N-1,IC)-M%XS               IF (IC==2) CC = T%CCSTORE(N-1,IC)-M%YS               IF (IC==3) CC = T%CCSTORE(N-1,IC)-M%ZS               IF (IC==1 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%XS               IF (IC==2 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%YS               IF (IC==3 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%ZS               IF (IC==1 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC)               IF (IC==2 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC)               IF (IC==3 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC)               ND(N,IC) = IDERIV               XX(N,IC) = CC               T%C1(N,IC) = PC            ENDDO NNLOOP            DO K=1,T%NOC(IC)+1               DO N=1,T%NOC(IC)+1                  COEF = IFAC(K,ND(N,IC))                  IEXP = K-ND(N,IC)                  IF (IEXP<0) A(N,K) = 0._EB                  IF (IEXP==0) A(N,K) = COEF                  IF (IEXP>0) A(N,K) = COEF*XX(N,IC)**IEXP               ENDDO            ENDDO            IERROR = 0            CALL GAUSSJ(A,T%NOC(IC)+1,T%NOCMAX+1,T%C1(1:T%NOCMAX+1,IC),1,1,IERROR)            IF (IERROR/=0)CALL SHUTDOWN('ERROR: Problem with grid transformation')         CASE (2)  ! linear transformation            T%C1(0,IC) = 0._EB            T%C2(0,IC) = 0._EB            DO N=1,T%NOC(IC)               IF (IC==1) CC = T%CCSTORE(N,IC)-M%XS               IF (IC==2) CC = T%CCSTORE(N,IC)-M%YS               IF (IC==3) CC = T%CCSTORE(N,IC)-M%ZS               IF (IC==1) PC = T%PCSTORE(N,IC)-M%XS               IF (IC==2) PC = T%PCSTORE(N,IC)-M%YS               IF (IC==3) PC = T%PCSTORE(N,IC)-M%ZS               T%C1(N,IC) = CC               T%C2(N,IC) = PC            ENDDO            SELECT CASE(IC)               CASE(1)                  T%C1(T%NOC(1)+1,1) = M%XF-M%XS                  T%C2(T%NOC(1)+1,1) = M%XF-M%XS               CASE(2)                  T%C1(T%NOC(2)+1,2) = M%YF-M%YS                  T%C2(T%NOC(2)+1,2) = M%YF-M%YS               CASE(3)                  T%C1(T%NOC(3)+1,3) = M%ZF-M%ZS                  T%C2(T%NOC(3)+1,3) = M%ZF-M%ZS            END SELECT            DO N=1,T%NOC(IC)+1               T%C3(N,IC) = (T%C2(N,IC)-T%C2(N-1,IC))/(T%C1(N,IC)-T%C1(N-1,IC))            ENDDO      END SELECT   ENDDO ICLOOP   DEALLOCATE(A)   DEALLOCATE(XX)   DEALLOCATE(ND)!! Set up grid stretching arrays!   ALLOCATE(M%R(0:M%IBAR),STAT=IZERO)   CALL ChkMemErr('READ','R',IZERO)   ALLOCATE(M%RC(0:M%IBAR+1),STAT=IZERO)   CALL ChkMemErr('READ','RC',IZERO)   M%RC = 1._EB   ALLOCATE(M%RRN(0:M%IBP1),STAT=IZERO)   CALL ChkMemErr('READ','RRN',IZERO)   M%RRN = 1._EB   ALLOCATE(M%X(0:M%IBAR),STAT=IZERO)   CALL ChkMemErr('READ','X',IZERO)   ALLOCATE(M%XC(0:M%IBP1),STAT=IZERO)   CALL ChkMemErr('READ','XC',IZERO)   ALLOCATE(M%HX(0:M%IBP1),STAT=IZERO)   CALL ChkMemErr('READ','HX',IZERO)   ALLOCATE(M%DX(0:M%IBP1),STAT=IZERO)   CALL ChkMemErr('READ','DX',IZERO)   ALLOCATE(M%RDX(0:M%IBP1),STAT=IZERO)   CALL ChkMemErr('READ','RDX',IZERO)   ALLOCATE(M%DXN(0:M%IBAR),STAT=IZERO)   CALL ChkMemErr('READ','DXN',IZERO)   ALLOCATE(M%RDXN(0:M%IBAR),STAT=IZERO)   CALL ChkMemErr('READ','RDXN',IZERO)   ALLOCATE(M%Y(0:M%JBAR),STAT=IZERO)   CALL ChkMemErr('READ','Y',IZERO)   ALLOCATE(M%YC(0:M%JBP1),STAT=IZERO)   CALL ChkMemErr('READ','YC',IZERO)   ALLOCATE(M%HY(0:M%JBP1),STAT=IZERO)   CALL ChkMemErr('READ','HY',IZERO)   ALLOCATE(M%DY(0:M%JBP1),STAT=IZERO)   CALL ChkMemErr('READ','DY',IZERO)   ALLOCATE(M%RDY(0:M%JBP1),STAT=IZERO)   CALL ChkMemErr('READ','RDY',IZERO)   ALLOCATE(M%DYN(0:M%JBAR),STAT=IZERO)   CALL ChkMemErr('READ','DYN',IZERO)   ALLOCATE(M%RDYN(0:M%JBAR),STAT=IZERO)   CALL ChkMemErr('READ','RDYN',IZERO)   ALLOCATE(M%Z(0:M%KBAR),STAT=IZERO)   CALL ChkMemErr('READ','Z',IZERO)   ALLOCATE(M%ZC(0:M%KBP1),STAT=IZERO)   CALL ChkMemErr('READ','ZC',IZERO)   ALLOCATE(M%HZ(0:M%KBP1),STAT=IZERO)   CALL ChkMemErr('READ','HZ',IZERO)   ALLOCATE(M%DZ(0:M%KBP1),STAT=IZERO)   CALL ChkMemErr('READ','DZ',IZERO)   ALLOCATE(M%RDZ(0:M%KBP1),STAT=IZERO)   CALL ChkMemErr('READ','RDZ',IZERO)   ALLOCATE(M%DZN(0:M%KBAR),STAT=IZERO)   CALL ChkMemErr('READ','DZN',IZERO)   ALLOCATE(M%RDZN(0:M%KBAR),STAT=IZERO)   CALL ChkMemErr('READ','RDZN',IZERO)!! Define X grid stretching terms!   M%DXMIN = 1000._EB   DO I=1,M%IBAR      XI    = (REAL(I,EB)-.5)*M%DXI      M%HX(I) = GP(XI,1,NM)      M%DX(I) = M%HX(I)*M%DXI      M%DXMIN = MIN(M%DXMIN,M%DX(I))      IF (M%HX(I)<=0._EB) THEN         WRITE(MESSAGE,'(A,I2)')  'ERROR: x transformation not monotonic, mesh ',NM         CALL SHUTDOWN(MESSAGE)      ENDIF      M%RDX(I) = 1._EB/M%DX(I)   ENDDO!   M%HX(0)    = M%HX(1)   M%HX(M%IBP1) = M%HX(M%IBAR)   M%DX(0)    = M%DX(1)   M%DX(M%IBP1) = M%DX(M%IBAR)   M%RDX(0)    = 1._EB/M%DX(1)   M%RDX(M%IBP1) = 1._EB/M%DX(M%IBAR)!   DO I=0,M%IBAR      XI     = I*M%DXI      M%X(I) = M%XS + G(XI,1,NM)      IF (CYLINDRICAL) THEN         M%R(I) = M%X(I)      ELSE         M%R(I) = 1._EB      ENDIF      M%DXN(I)  = 0.5_EB*(M%DX(I)+M%DX(I+1))      M%RDXN(I) = 1._EB/M%DXN(I)   ENDDO   M%X(0)      = M%XS   M%X(M%IBAR) = M%XF!   DO I=1,M%IBAR      M%XC(I) = 0.5_EB*(M%X(I)+M%X(I-1))   ENDDO   M%XC(0)      = M%XS - 0.5_EB*M%DX(0)   M%XC(M%IBP1) = M%XF + 0.5_EB*M%DX(M%IBP1)!   IF (CYLINDRICAL) THEN        DO I=1,M%IBAR         M%RRN(I) = 2._EB/(M%R(I)+M%R(I-1))         M%RC(I)  = 0.5_EB*(M%R(I)+M%R(I-1))      ENDDO      M%RRN(0)    = M%RRN(1)      M%RRN(M%IBP1) = M%RRN(M%IBAR)   ENDIF!! Define Y grid stretching terms!   M%DYMIN = 1000._EB   DO J=1,M%JBAR      ETA   = (REAL(J,EB)-.5)*M%DETA      M%HY(J) = GP(ETA,2,NM)      M%DY(J) = M%HY(J)*M%DETA      M%DYMIN = MIN(M%DYMIN,M%DY(J))      IF (M%HY(J)<=0._EB) THEN         WRITE(MESSAGE,'(A,I2)')  'ERROR: y transformation not monotonic, mesh ',NM         CALL SHUTDOWN(MESSAGE)      ENDIF      M%RDY(J) = 1._EB/M%DY(J)   ENDDO!   M%HY(0)    = M%HY(1)   M%HY(M%JBP1) = M%HY(M%JBAR)   M%DY(0)    = M%DY(1)   M%DY(M%JBP1) = M%DY(M%JBAR)   M%RDY(0)    = 1._EB/M%DY(1)   M%RDY(M%JBP1) = 1._EB/M%DY(M%JBAR)!   DO J=0,M%JBAR      ETA     = J*M%DETA      M%Y(J)    = M%YS + G(ETA,2,NM)      M%DYN(J)  = 0.5_EB*(M%DY(J)+M%DY(J+1))      M%RDYN(J) = 1._EB/M%DYN(J)   ENDDO!   M%Y(0)      = M%YS   M%Y(M%JBAR) = M%YF!   DO J=1,M%JBAR      M%YC(J) = 0.5_EB*(M%Y(J)+M%Y(J-1))   ENDDO   M%YC(0)      = M%YS - 0.5_EB*M%DY(0)   M%YC(M%JBP1) = M%YF + 0.5_EB*M%DY(M%JBP1)!! Define Z grid stretching terms!   M%DZMIN = 1000._EB   DO K=1,M%KBAR      ZETA  = (REAL(K,EB)-.5)*M%DZETA      M%HZ(K) = GP(ZETA,3,NM)      M%DZ(K) = M%HZ(K)*M%DZETA      M%DZMIN = MIN(M%DZMIN,M%DZ(K))      IF (M%HZ(K)<=0._EB) THEN         WRITE(MESSAGE,'(A,I2)') 'ERROR: z transformation not monotonic, mesh ',NM         CALL SHUTDOWN(MESSAGE)      ENDIF      M%RDZ(K) = 1._EB/M%DZ(K)   ENDDO!   M%HZ(0)    = M%HZ(1)   M%HZ(M%KBP1) = M%HZ(M%KBAR)   M%DZ(0)    = M%DZ(1)   M%DZ(M%KBP1) = M%DZ(M%KBAR)   M%RDZ(0)    = 1._EB/M%DZ(1)   M%RDZ(M%KBP1) = 1._EB/M%DZ(M%KBAR)!   DO K=0,M%KBAR      ZETA      = K*M%DZETA      M%Z(K)    = M%ZS + G(ZETA,3,NM)      M%DZN(K)  = 0.5_EB*(M%DZ(K)+M%DZ(K+1))      M%RDZN(K) = 1._EB/M%DZN(K)   ENDDO!   M%Z(0)      = M%ZS   M%Z(M%KBAR) = M%ZF!   DO K=1,M%KBAR      M%ZC(K) = 0.5_EB*(M%Z(K)+M%Z(K-1))   ENDDO   M%ZC(0)      = M%ZS - 0.5_EB*M%DZ(0)   M%ZC(M%KBP1) = M%ZF + 0.5_EB*M%DZ(M%KBP1)!! Set up arrays that will return coordinate positions!   NIPX   = 100*M%IBAR   NIPY   = 100*M%JBAR   NIPZ   = 100*M%KBAR   NIPXS  = NINT(NIPX*M%DX(0)/(M%XF-M%XS))   NIPXF  = NINT(NIPX*M%DX(M%IBP1)/(M%XF-M%XS))   NIPYS  = NINT(NIPY*M%DY(0)/(M%YF-M%YS))   NIPYF  = NINT(NIPY*M%DY(M%JBP1)/(M%YF-M%YS))   NIPZS  = NINT(NIPZ*M%DZ(0)/(M%ZF-M%ZS))   NIPZF  = NINT(NIPZ*M%DZ(M%KBP1)/(M%ZF-M%ZS))   M%RDXINT = REAL(NIPX,EB)/(M%XF-M%XS)   M%RDYINT = REAL(NIPY,EB)/(M%YF-M%YS)   M%RDZINT = REAL(NIPZ,EB)/(M%ZF-M%ZS)!   ALLOCATE(M%CELLSI(-NIPXS:NIPX+NIPXF),STAT=IZERO)   CALL ChkMemErr('READ','CELLSI',IZERO)   ALLOCATE(M%CELLSJ(-NIPYS:NIPY+NIPYF),STAT=IZERO)   CALL ChkMemErr('READ','CELLSJ',IZERO)   ALLOCATE(M%CELLSK(-NIPZS:NIPZ+NIPZF),STAT=IZERO)   CALL ChkMemErr('READ','CELLSK',IZERO)!   DO I=-NIPXS,NIPX+NIPXF      M%CELLSI(I) = GINV(REAL(I,EB)/M%RDXINT,1,NM)*M%RDXI      M%CELLSI(I) = MAX(M%CELLSI(I),-0.9_EB)      M%CELLSI(I) = MIN(M%CELLSI(I),REAL(M%IBAR)+0.9_EB)   ENDDO   DO J=-NIPYS,NIPY+NIPYF      M%CELLSJ(J) = GINV(REAL(J,EB)/M%RDYINT,2,NM)*M%RDETA      M%CELLSJ(J) = MAX(M%CELLSJ(J),-0.9_EB)      M%CELLSJ(J) = MIN(M%CELLSJ(J),REAL(M%JBAR)+0.9_EB)   ENDDO   DO K=-NIPZS,NIPZ+NIPZF      M%CELLSK(K) = GINV(REAL(K,EB)/M%RDZINT,3,NM)*M%RDZETA      M%CELLSK(K) = MAX(M%CELLSK(K),-0.9_EB)      M%CELLSK(K) = MIN(M%CELLSK(K),REAL(M%KBAR)+0.9_EB)   ENDDO ENDDO MESH_LOOP  CONTAINS INTEGER FUNCTION IFAC(II,N)INTEGER II,NIFAC = 1DO I=II-N+1,II   IFAC = IFAC*IENDDOEND FUNCTION IFACEND SUBROUTINE READ_TRAN

⌨️ 快捷键说明

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