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

📄 read.f

📁 一个开源的火灾动力模拟的系统
💻 F
📖 第 1 页 / 共 5 页
字号:
      MODULE READ C      USE PREC      USE VARS      USE CONS      USE TRAN      USE PACKERC      IMPLICIT NONEC      PRIVATE      PUBLIC READ_DATA      CHARACTER(60) FYI      CHARACTER(30) QUANTITY,MAKE,LABEL,CB      CHARACTER(30) COLOR_QUANTITY      CHARACTER(80) MESSAGE      CHARACTER(6)  PHASE      CHARACTER(26) PART_ID,SURF_ID,SURF_IDS(3),SURF_ID6(6),     .              ID,AKA,AKA_NAME(0:200),     .              RAMP_MF(0:20),RAMP_Q,RAMP_V,RAMP_G,SURF_DEFAULT,     .              BACKGROUND_SPECIES,REACTION,RAMP_KS,RAMP_C_P,     .              RAMP_KS_CHAR,RAMP_C_P_CHAR,EVAC_SURF_DEFAULT      CHARACTER(20) PROFILE,BACKING,PARTICLE_COLOR      LOGICAL SUCCESS,BNDF_FACE(-3:3),BNDF_BLOCK,EX,     .        THICKEN_OBSTRUCTIONS,PARTICLES      LOGICAL PAPER_MODEL,BNDF_DEFAULT,ADIABATIC,BAD,     .        BURN_AWAY,LEAKING,OUTLINE      REAL(EB) KS,TAU_MF(0:20)      REAL(EB) XYZ(3),XB(6),VEL_T(2),TEXTURE_ORIGIN(3)      CHARACTER(60) TEXTURE_MAP      REAL(EB) TM,TAU_Q,TAU_V,TIGN,F,HRRPUA,EMISSIVITY,TEXTURE_WIDTH,     .         TEXTURE_HEIGHT,     .         E_COEFFICIENT,RADIATIVE_FRACTION,VOLUME_FLUX,     .         C_HORIZONTAL,C_VERTICAL,     .         ALPHA,C_P,TMPWAL,TMPWAL0,DELTA,VEL,C_DELTA_RHO,VBC,     .         TMPIGN,TMPEVAP,VBC0,DTSAM,PBX,PBY,PBZ,     .         T,MASS_FLUX(0:20),MASS_FRACTION(0:20),XI,ETA,ZETA,     .         Z0,PLE,DELTAH,SURFACE_DENSITY,     .         MW_BACKGROUND,MW,DENSITY,DUMMY,     .         THERMAL_CONDUCTIVITY,VISCOSITY,HEAT_FLUX      REAL(EB) DIFFUSION_COEFFICIENT,MU_USER(0:20),K_USER(0:20),     .         D_USER(0:20),POROSITY,     .         HEAT_OF_VAPORIZATION,HEAT_OF_COMBUSTION,     .         HEAT_OF_ABLATION,ABLATION_TEMPERATURE,ABLATION_RATE,     .         BURNING_RATE_MAX,X_O2_LL,IN_DEPTH_COEFFICIENT,     .         GEN_TO_YLD,HUMIDITY,MW_MIN,MW_MAX,     .         ORIENTATION(3),ROTATION,RGB(3),RGB4(4),RADIUS,     .         MASS_FLUX_CRITICAL,A,     .         E,MOISTURE_FRACTION,FUEL_FRACTION,     .         CHAR_DENSITY, C_P_CHAR, KS_CHAR,     .         CRITICAL_FLAME_TEMPERATURE,DX_SOLID,     .         EXTERNAL_FLUX,TMP_BACK      INTEGER NSPRO,NTCO,II,NSFO,NNN,NR,WALL_POINTS,     .        NPPC,IOR,NSPC,ND,NN,     .        I1,I2,J1,J2,K1,K2,N,I,J,K,IZERO,     .        IOS,NVO,LUDUM,ITER,NFILES,NITER      TYPE (MESH_TYPE), POINTER :: M      TYPE(OBSTRUCTION_TYPE), POINTER :: OB,OB2      TYPE (VENTS_TYPE), POINTER :: VT      TYPE(LAGRANGIAN_TYPE), POINTER :: LPCC      CONTAINSCC      SUBROUTINE READ_DATAC      CALL READ_HEAD      CALL READ_GRID      CALL READ_PDIM      CALL READ_TRAN      CALL READ_TIME      CALL READ_MISC      CALL READ_OBST      CALL READ_VENT      CALL READ_PART      CALL READ_TREE      CALL READ_SPEC      CALL READ_SURF      CALL READ_INIT      CALL READ_RAMP      CALL READ_SPRK      CALL READ_HEAT      CALL READ_SMOD      CALL READ_THCP      CALL READ_PL3D      CALL READ_SLCF      CALL READ_ISOF      CALL READ_BNDFC      END SUBROUTINE READ_DATACCC      SUBROUTINE READ_HEADC      NAMELIST /HEAD/ TITLE,CHID,FYIC      CHID    = 'output'      TITLE   = '      'C      HEAD_LOOP: DO      CALL CHECKREAD('HEAD',LU5,IOS) ; IF (IOS.EQ.1) EXIT HEAD_LOOP      READ(LU5,HEAD,END=13,ERR=14,IOSTAT=IOS)   14 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with HEAD line')      ENDDO HEAD_LOOP   13 REWIND(LU5)C      CLOOP: DO I=1,39      IF (CHID(I:I).EQ.'.')     .   CALL SHUTDOWN('ERROR: No periods allowed in CHID')      IF (CHID(I:I).EQ.' ') EXIT CLOOP      ENDDO CLOOPC      INQUIRE(FILE=TRIM(CHID)//'.stop',EXIST=EX)      IF (EX) THEN         WRITE(MESSAGE,'(A,A,A)') "ERROR: Remove the file, ",     .   TRIM(CHID)//'.stop',", from the current directory"         CALL SHUTDOWN(MESSAGE)         ENDIFC      END SUBROUTINE READ_HEADCC      SUBROUTINE READ_GRIDC      INTEGER :: IBAR,JBAR,KBAR,NM,POISSON_BC(6)      LOGICAL :: EVACUATION, EVAC_HUMANS      NAMELIST /GRID/ IBAR,JBAR,KBAR,FYI,ID,SYNCHRONIZE,     .     EVACUATION,EVAC_HUMANS,POISSON_BC      TYPE (MESH_TYPE), POINTER :: MC      NMESHES = 0C      GRID_LOOP: DO      CALL CHECKREAD('GRID',LU5,IOS) ; IF (IOS.EQ.1) EXIT GRID_LOOP      READ(LU5,GRID,END=15,ERR=16,IOSTAT=IOS)      NMESHES = NMESHES + 1   16 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with GRID line')      ENDDO GRID_LOOP   15 REWIND(LU5)C      ALLOCATE(MESH(NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','MESH',IZERO)      ALLOCATE(MESH_NAME(NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','MESH_NAME',IZERO)      ALLOCATE(TUSED(N_TIMERS,NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','TUSED',IZERO)      ALLOCATE(SYNC_TIME_STEP(NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','SYNC_TIME_STEP',IZERO)      SYNC_TIME_STEP = .FALSE.      ALLOCATE(EVACUATION_ONLY(NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','EVACUATION_ONLY',IZERO)      EVACUATION_ONLY = .FALSE.      ALLOCATE(EVACUATION_GRID(NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','EVACUATION_GRID',IZERO)      EVACUATION_GRID = .FALSE.      ALLOCATE(PBC(6,NMESHES),STAT=IZERO)      CALL ChkMemErr('READ','PBC',IZERO)CC Read and store GRID dimensionsC      MESH_LOOP: DO NM=1,NMESHES      IBAR=10 ; JBAR=10 ; KBAR=10      TWO_D = .FALSE.      ID = 'null'      SYNCHRONIZE = .FALSE.      EVACUATION  = .FALSE.      EVAC_HUMANS = .FALSE.      POISSON_BC  = -1      WRITE(MESH_NAME(NM),'(A,I3)') 'MESH',NM      CALL CHECKREAD('GRID',LU5,IOS) ; IF (IOS.EQ.1) EXIT MESH_LOOP      READ(LU5,GRID,END=115)      M => MESH(NM)      M%IBAR = IBAR      M%JBAR = JBAR      M%KBAR = KBAR      M%NEWC = 2*IBAR*JBAR+2*IBAR*KBAR+2*JBAR*KBAR      IF (SYNCHRONIZE) SYNC_TIME_STEP(NM)  = .TRUE.      IF (EVACUATION)  EVACUATION_ONLY(NM) = .TRUE.      IF (EVAC_HUMANS) EVACUATION_GRID(NM) = .TRUE.      IF (JBAR.EQ.1) TWO_D = .TRUE.      IF (TWO_D .AND. JBAR.NE.1) THEN         WRITE(MESSAGE,'(A)') 'ERROR: JBAR must be 1 for all grids'         CALL SHUTDOWN(MESSAGE)         ENDIF      IF (ID.NE.'null') MESH_NAME(NM) = ID      PBC(:,NM) = POISSON_BC(:)      ENDDO MESH_LOOP  115 REWIND(LU5)CC Start the timing arraysC      TUSED      = 0.      TUSED(1,:) = SECOND()C      END SUBROUTINE READ_GRIDCC      SUBROUTINE READ_PDIMC      REAL(EB) :: XBAR,YBAR,ZBAR,XBAR0,YBAR0,ZBAR0      INTEGER :: NMC      REAL(EB) :: RBAR0,RBAR      NAMELIST /PDIM/ XBAR,YBAR,ZBAR,XBAR0,YBAR0,ZBAR0,FYI,RBAR0,RBARC      MESH_LOOP: DO NM=1,NMESHESC      RBAR0 = 0. ; RBAR = -1.      XBAR0 = 0. ; XBAR =  1.      YBAR0 = 0. ; YBAR =  1.      ZBAR0 = 0. ; ZBAR =  1.      CYLINDRICAL = .FALSE.C      CALL CHECKREAD('PDIM',LU5,IOS) ; IF (IOS.EQ.1) EXIT MESH_LOOP      READ(LU5,PDIM,END=19,ERR=20,IOSTAT=IOS)    20 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with PDIM line')C      M => MESH(NM)C      IF (RBAR.GT.0.) THEN         CYLINDRICAL = .TRUE.         XBAR        = RBAR         XBAR0       = RBAR0         ENDIFC      M%XS    = XBAR0      M%XF    = XBAR      M%YS    = YBAR0      M%YF    = YBAR      M%ZS    = ZBAR0      M%ZF    = ZBAR      M%DXI   = (XBAR-XBAR0)/REAL(M%IBAR,EB)      M%DETA  = (YBAR-YBAR0)/REAL(M%JBAR,EB)      M%DZETA = (ZBAR-ZBAR0)/REAL(M%KBAR,EB)      M%RDXI  = 1./M%DXI      M%RDETA = 1./M%DETA      M%RDZETA= 1./M%DZETA      M%IBM1  = M%IBAR-1      M%JBM1  = M%JBAR-1      M%KBM1  = M%KBAR-1      M%IBP1  = M%IBAR+1      M%JBP1  = M%JBAR+1      M%KBP1  = M%KBAR+1C      ENDDO MESH_LOOP   19 REWIND(LU5)C      END SUBROUTINE READ_PDIMCC      SUBROUTINE READ_TRANCC Compute the polynomial transform function for the vertical coordinateC      REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: A,XX      INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ND      REAL(EB)  PC,CC,COEF      INTEGER  IEXP,IC,IDERIV,N,K,IERROR,IOS,I,MESH_NUMBER,     .         NIPX,NIPY,NIPZ,NIPXS,NIPYS,NIPZS,NIPXF,NIPYF,NIPZF,NM      TYPE (MESH_TYPE), POINTER :: M      TYPE (TRAN_TYPE), POINTER :: T      NAMELIST /TRNX/ IDERIV,CC,PC,FYI,MESH_NUMBER      NAMELIST /TRNY/ IDERIV,CC,PC,FYI,MESH_NUMBER      NAMELIST /TRNZ/ IDERIV,CC,PC,FYI,MESH_NUMBERCC Scan the input file, counting the number of NAMELIST entriesC      ALLOCATE(TRANS(NMESHES))C      MESH_LOOP: DO NM=1,NMESHES      M => MESH(NM)      T => TRANS(NM)C      DO N=1,3      T%NOC(N) = 0      TRNLOOP: DO      IF (N.EQ.1) THEN         CALL CHECKREAD('TRNX',LU5,IOS) ; IF (IOS.EQ.1) EXIT TRNLOOP         MESH_NUMBER = 1         READ(LU5,NML=TRNX,END=17,ERR=18,IOSTAT=IOS)         IF (MESH_NUMBER.NE.NM) CYCLE TRNLOOP         ENDIF      IF (N.EQ.2) THEN         CALL CHECKREAD('TRNY',LU5,IOS) ; IF (IOS.EQ.1) EXIT TRNLOOP         MESH_NUMBER = 1         READ(LU5,NML=TRNY,END=17,ERR=18,IOSTAT=IOS)         IF (MESH_NUMBER.NE.NM) CYCLE TRNLOOP         ENDIF      IF (N.EQ.3) THEN         CALL CHECKREAD('TRNZ',LU5,IOS) ; IF (IOS.EQ.1) EXIT TRNLOOP         MESH_NUMBER = 1         READ(LU5,NML=TRNZ,END=17,ERR=18,IOSTAT=IOS)         IF (MESH_NUMBER.NE.NM) CYCLE TRNLOOP         ENDIF      T%NOC(N) = T%NOC(N) + 1   18 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with TRN* line')      ENDDO TRNLOOP   17 REWIND(LU5)      ENDDOC      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.      T%C1(1,1:3)        = 1.      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))C      T%ITRAN  = 0C      DO IC=1,3      NLOOP:  DO N=1,T%NOC(IC)      IDERIV = -1      IF (IC.EQ.1) THEN         LOOP1: DO         CALL CHECKREAD('TRNX',LU5,IOS) ; IF (IOS.EQ.1) EXIT NLOOP         MESH_NUMBER = 1         READ(LU5,TRNX,END=1,ERR=2)         IF (MESH_NUMBER.EQ.NM) EXIT LOOP1         ENDDO LOOP1         ENDIF      IF (IC.EQ.2) THEN         LOOP2: DO         CALL CHECKREAD('TRNY',LU5,IOS) ; IF (IOS.EQ.1) EXIT NLOOP         MESH_NUMBER = 1         READ(LU5,TRNY,END=1,ERR=2)         IF (MESH_NUMBER.EQ.NM) EXIT LOOP2         ENDDO LOOP2         ENDIF      IF (IC.EQ.3) THEN         LOOP3: DO         CALL CHECKREAD('TRNZ',LU5,IOS) ; IF (IOS.EQ.1) EXIT NLOOP         MESH_NUMBER = 1         READ(LU5,TRNZ,END=1,ERR=2)         IF (MESH_NUMBER.EQ.NM) EXIT LOOP3         ENDDO LOOP3         ENDIF      T%CCSTORE(N,IC) = CC      T%PCSTORE(N,IC) = PC      T%IDERIVSTORE(N,IC) = IDERIV      IF (IDERIV.GE.0) T%ITRAN(IC) = 1      IF (IDERIV.LT.0) T%ITRAN(IC) = 2    2 ENDDO NLOOP    1 REWIND(LU5)      ENDDO C      ICLOOP: DO IC=1,3C      IF (T%ITRAN(IC).EQ.1) THENCC If ITRAN=1, do a polynomial transformation C      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.EQ.1) CC = T%CCSTORE(N-1,IC)-M%XS      IF (IC.EQ.2) CC = T%CCSTORE(N-1,IC)-M%YS      IF (IC.EQ.3) CC = T%CCSTORE(N-1,IC)-M%ZS      IF (IC.EQ.1 .AND. IDERIV.EQ.0) PC = T%PCSTORE(N-1,IC)-M%XS      IF (IC.EQ.2 .AND. IDERIV.EQ.0) PC = T%PCSTORE(N-1,IC)-M%YS      IF (IC.EQ.3 .AND. IDERIV.EQ.0) PC = T%PCSTORE(N-1,IC)-M%ZS      IF (IC.EQ.1 .AND. IDERIV.GT.0) PC = T%PCSTORE(N-1,IC)      IF (IC.EQ.2 .AND. IDERIV.GT.0) PC = T%PCSTORE(N-1,IC)      IF (IC.EQ.3 .AND. IDERIV.GT.0) PC = T%PCSTORE(N-1,IC)        ND(N,IC) = IDERIV        XX(N,IC) = CC      T%C1(N,IC) = PC      ENDDO NNLOOPC      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.LT.0) A(N,K) = 0.      IF (IEXP.EQ.0) A(N,K) = COEF      IF (IEXP.GT.0) A(N,K) = COEF*XX(N,IC)**IEXP      ENDDO      ENDDOC      IERROR = 0      CALL GAUSSJ(A,T%NOC(IC)+1,T%NOCMAX+1,T%C1(1:T%NOCMAX+1,IC),     .            1,1,IERROR)      IF (IERROR.NE.0)     .   CALL SHUTDOWN('ERROR: Problem with grid transformation')C      ENDIFC      IF (T%ITRAN(IC).EQ.2) THENCC If ITRAN=2, do a linear transformationC      T%C1(0,IC) = 0.      T%C2(0,IC) = 0.      DO N=1,T%NOC(IC)      IF (IC.EQ.1) CC = T%CCSTORE(N,IC)-M%XS      IF (IC.EQ.2) CC = T%CCSTORE(N,IC)-M%YS      IF (IC.EQ.3) CC = T%CCSTORE(N,IC)-M%ZS      IF (IC.EQ.1) PC = T%PCSTORE(N,IC)-M%XS      IF (IC.EQ.2) PC = T%PCSTORE(N,IC)-M%YS      IF (IC.EQ.3) PC = T%PCSTORE(N,IC)-M%ZS      T%C1(N,IC) = CC      T%C2(N,IC) = PC      ENDDOC      SELECT CASE(IC)      CASE(1)         T%C1(T%NOC(1)+1,1) = M%XF-M%XS

⌨️ 快捷键说明

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