📄 read.f
字号:
NU_CO = CO_YIELD*MW_FUEL/MW_CO NU_CO2 = NU_CO2 - NU_SOOT - NU_CO NU_H2O = NU_H2O - NU_H2 NU_O2 = NU_O2 - NU_SOOT - 0.5*(NU_H2+NU_CO) NU_N2_AIR = NU_O2*MW_O2*Y_N2_INFTY/(Y_O2_INFTY*MW_N2) NU_N2_DILUENT = NU_FUEL*MW_FUEL*Y_N2_INLET/(Y_F_INLET*MW_N2)CC Stoichiometric value of mixture fractionC Z_F = Y_O2_INFTY/ .(Y_O2_INFTY+Y_F_INLET*NU_O2*MW_O2/MW_FUEL)C IF (Y_F_INLET.LT.(1.-MW_N2*FUEL_N2/MW_FUEL)) . AUTOMATIC_Z = .FALSE. IF (DNS) AUTOMATIC_Z = .FALSE.CC Allocate state relation arraysC ALLOCATE (MW_AVG(0:10000)) CALL ChkMemErr('READ','MW_AVG',IZERO) ; MW_AVG=0. ALLOCATE (Y_STATE(0:10000,1:8)) CALL ChkMemErr('READ','Y_STATE',IZERO) ; Y_STATE=0. ALLOCATE (RSUM_MF(0:10000)) CALL ChkMemErr('READ','RSUM_MF',IZERO) ; RSUM_MF=0.CC Compute Y_STATE and MW_AVGC Y_STATE(0,1) = 0. Y_STATE(0,2) = Y_O2_INFTY Y_STATE(0,3) = Y_N2_INFTY MW_AVG(0) = 1/(Y_N2_INFTY/MW_N2+Y_O2_INFTY/MW_O2)C Y_STATE(10000,1) = Y_F_INLET Y_STATE(10000,2) = 0. Y_STATE(10000,3) = Y_N2_INLET MW_AVG(10000) = 1/(Y_F_INLET/MW_FUEL+Y_N2_INLET/MW_N2)C DZZ=1./10000. CHI=1.0C DO I=1,9999 ZZ=I*DZZC S_TERM = NU_O2*MW_O2/MW_FUEL Z_TERM = ZZ*(S_TERM*Y_F_INLET+Y_O2_INFTY) - Y_O2_INFTY ETA = ((S_TERM-Z_TERM)*MW_FUEL-Z_TERM*NU_N2_DILUENT*MW_N2)/ . (NU_O2*MW_O2*(Z_TERM+1.)+NU_N2_AIR*MW_N2*Z_TERM) TOTAL_MASS = MW_FUEL + ETA*(NU_O2*MW_O2 + NU_N2_AIR*MW_N2)+ . NU_N2_DILUENT*MW_N2C Y_STATE(I,1) = MW_FUEL*MAX(0._EB,1.-ETA)/TOTAL_MASS . + MW_FUEL*MIN(1._EB,ETA)*(1.-CHI)/TOTAL_MASS Y_STATE(I,2) = MW_O2*NU_O2*MAX(0._EB,ETA-1.)/TOTAL_MASS . + MW_O2*NU_O2*MIN(1._EB,ETA)*(1.-CHI)/TOTAL_MASS Y_STATE(I,3) = MW_N2 *(NU_N2_AIR*ETA+NU_N2_DILUENT)/TOTAL_MASS Y_STATE(I,4) = MW_H2O *NU_H2O *MIN(1._EB,ETA)*CHI/TOTAL_MASS Y_STATE(I,5) = MW_CO2 *NU_CO2 *MIN(1._EB,ETA)*CHI/TOTAL_MASS Y_STATE(I,6) = MW_CO *NU_CO *MIN(1._EB,ETA)*CHI/TOTAL_MASS Y_STATE(I,7) = MW_H2 *NU_H2 *MIN(1._EB,ETA)*CHI/TOTAL_MASS Y_STATE(I,8) = MW_C *NU_SOOT*MIN(1._EB,ETA)*CHI/TOTAL_MASS MW_AVG(I) = 1./(Y_STATE(I,1)/MW_FUEL + . Y_STATE(I,2)/MW_O2 + . Y_STATE(I,3)/MW_N2 + . Y_STATE(I,4)/MW_H2O + . Y_STATE(I,5)/MW_CO2 + . Y_STATE(I,6)/MW_CO + . Y_STATE(I,7)/MW_H2 + . Y_STATE(I,8)/MW_C)C ENDDOCC Compute R0/MW_AVGC RSUM_MF = R0/MW_AVGC END SUBROUTINE STATE_RELATIONSHIPSCC SUBROUTINE SET_REAC_DEFAULTSC ID = 'null' BOF = 0. ! Pre-exponential Factor (cm**3/mol-s) E = 0. ! Activation Energy (kJ/kmol) XNO = 1. XNF = 1. FUEL = 'nullspecies' DELTAH = -1. DELTAH_FUEL = 40000. ! Energy per unit mass fuel consumed (kJ/kg) HRRPUA_SHEET = 200. ! Max HRR per unit area of flame sheet TMP_LOWER = 325. ! Lower Temp for One Step Reaction EPUMO2 = 13100. ! Energy per unit mass oxygen (kJ/kg) IF (LES) THEN RADIATIVE_FRACTION = 0.35 SOOT_YIELD = 0.01 ELSE RADIATIVE_FRACTION = 0.0 SOOT_YIELD = 0. ENDIF DTSAM = TWFIN/REAL(NFRAMES) Y_O2_INFTY = 0.23 X_O2_LL = 0.15 CRITICAL_FLAME_TEMPERATURE = 1427. Y_F_INLET = 1. NU_O2 = 5. ! Default fuel is propane NU_CO2 = 3. NU_H2O = 4. NU_FUEL = 1. MW_FUEL = 44. MW_O2 = 32. MW_CO2 = 44. MW_C = 12. MW_N2 = 28. MW_H2O = 18. MW_CO = 28. MW_H2 = 2. FUEL_N2 = 0. CO_YIELD = -1. H2_YIELD = 0. MASS_EXTINCTION_COEFFICIENT = 7600. ! m2/kg VISIBILITY_FACTOR = 3. MAXIMUM_VISIBILITY = 30. Z_CONSTANT = 1.0C END SUBROUTINE SET_REAC_DEFAULTSC END SUBROUTINE READ_SPECCC SUBROUTINE READ_PARTC INTEGER :: NUMBER_INITIAL_DROPLETS,NIP,NISP,NSPINS,NPDIM, . NSPDIM,SAMPLING_FACTOR,DROPLETS_PER_SECOND, . NPSAM,NSPSAM REAL(EB) :: SPECIFIC_HEAT,VAPORIZATION_TEMPERATURE, . MELTING_TEMPERATURE,MASS_PER_VOLUME,DIAMETER, . GAMMA_D,WMPUV,DTSAM,AGE,DELAY,INITIAL_TEMPERATURE CHARACTER(30) :: SPEC_ID,HEAT_ACTIVATE LOGICAL :: MASSLESS,STATIC,FUEL,WATER,TREE,FUEL_DROPLETS NAMELIST /PART/ NUMBER_INITIAL_DROPLETS,QUANTITY,FYI, . DROPLETS_PER_SECOND,MASS_PER_VOLUME, . SAMPLING_FACTOR,NPSAM,NSPSAM, . ID,STATIC,MASSLESS,FUEL,WATER,TREE, . DENSITY,VAPORIZATION_TEMPERATURE, . SPECIFIC_HEAT,HEAT_OF_VAPORIZATION, . MELTING_TEMPERATURE,DIAMETER,GAMMA_D,WMPUV, . HEAT_OF_COMBUSTION,DTPAR,DTSPAR, . NIP,NISP,NSPINS,DTSAM,AGE,NPDIM,NSPDIM, . FUEL_DROPLETS,SPEC_ID,INITIAL_TEMPERATURE,XB EQUIVALENCE (SAMPLING_FACTOR,NPSAM,NSPSAM) EQUIVALENCE (NUMBER_INITIAL_DROPLETS,NISP,NIP) EQUIVALENCE (WMPUV,MASS_PER_VOLUME) EQUIVALENCE (FUEL,FUEL_DROPLETS)C REAL(EB) T_ACTIVATE,T_DEACTIVATE NAMELIST /SPRK/ XYZ,MAKE,T_ACTIVATE,T_DEACTIVATE,FYI, . ORIENTATION,ROTATION,PART_ID,LABEL,DELAY, . HEAT_ACTIVATEC WATER_EVAPORATION = .FALSE. FUEL_EVAPORATION = .FALSE. EVAPORATION = .FALSE.CC Look for sprinklers, if found WATER VAPOR will be a speciesC NSPR = 0 SPRLOOP: DO PART_ID = 'null' CALL CHECKREAD('SPRK',LU5,IOS) ; IF (IOS.EQ.1) EXIT SPRLOOP READ(LU5,SPRK,END=7,ERR=8,IOSTAT=IOS) NSPR = NSPR + 1 IF (PART_ID.EQ.'null') WATER_EVAPORATION = .TRUE. 8 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with SPRK line') ENDDO SPRLOOP 7 REWIND(LU5)CC Determine total number of PART lines in the input fileC NPC = 0 COUNT_PART_LOOP: DO CALL CHECKREAD('PART',LU5,IOS) IF (IOS.EQ.1) EXIT COUNT_PART_LOOP READ(LU5,NML=PART,END=219,ERR=220,IOSTAT=IOS) NPC = NPC + 1 220 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with PART line') ENDDO COUNT_PART_LOOP 219 REWIND(LU5)CC Add two special PART classes, sprinkler droplets and tracersC NPC = NPC + 2CC Allocate quantities for PART classesC IPART = 0C ALLOCATE(LAGRANGIAN(NPC),STAT=IZERO) CALL ChkMemErr('READ','LAGRANGIAN',IZERO) LAGRANGIAN(1:NPC)%ADJUST_EVAPORATION = 1. LAGRANGIAN(1:NPC)%SPECIES_INDEX = 0 LAGRANGIAN(1:NPC)%SPECIES = ' ' LAGRANGIAN(1:NPC)%COLOR_INDEX = 0C READ_PART_LOOP: DO N=1,NPCC LP=>LAGRANGIAN(N)C DENSITY = 1000. ! kg/m3 MASS_PER_VOLUME = 1. ! kg/m3 VAPORIZATION_TEMPERATURE = 100.0 ! C INITIAL_TEMPERATURE = TMPA - TMPM ! C MELTING_TEMPERATURE = TMPM - TMPM ! C SPECIFIC_HEAT = 4.184 ! kJ/kg-K HEAT_OF_VAPORIZATION = 2259. ! kJ/kg HEAT_OF_COMBUSTION = -1. ! kJ/kg DROPLETS_PER_SECOND = 1000 DIAMETER = 100. ! mu-m GAMMA_D = 2.4 AGE = 1.E6 ! sC ID = 'null' QUANTITY = 'null' SPEC_ID = 'null' SAMPLING_FACTOR = -1 NUMBER_INITIAL_DROPLETS = 0 XB = 0. FUEL = .FALSE. WATER = .FALSE. STATIC = .FALSE. MASSLESS = .FALSE. TREE = .FALSE.CC Read the PART lineC IF (N.LT.NPC-1) THEN CALL CHECKREAD('PART',LU5,IOS) ; IF (IOS.EQ.1) EXIT READ_PART_LOOP READ(LU5,PART,END=25,IOSTAT=IOS)C IF (NUMBER_INITIAL_DROPLETS.GT.0 .AND. RESTART) . NUMBER_INITIAL_DROPLETS = 0 ENDIFC IF (N.EQ.NPC-1) THEN MASSLESS = .TRUE. ID = 'tracer particles' ENDIFC IF (SAMPLING_FACTOR.LE.0) THEN IF (MASSLESS) THEN SAMPLING_FACTOR = 1 ELSE SAMPLING_FACTOR = 10 ENDIF ENDIFC IF (N.EQ.NPC) THEN WATER = .TRUE. ID = 'water droplets' SPEC_ID = 'WATER VAPOR' AGE = 60. ENDIFC IF (TREE) FUEL = .TRUE. IF (TREE) STATIC = .TRUE.C IF (MASSLESS) DIAMETER = 0.C LP%CLASS_NAME = IDC IF (QUANTITY.EQ.'TEMPERATURE') IPART = -1 IF (QUANTITY.EQ.'HRRPUV') IPART = -2 IF (QUANTITY.EQ.'DIAMETER') IPART = -3 IF (QUANTITY.EQ.'VELOCITY') IPART = -4 IF (QUANTITY.EQ.'DROPLET_PHASE') IPART = -5 IF (QUANTITY.EQ.'AGE') IPART = -6 IF (QUANTITY.EQ.'BLACK') LP%COLOR_INDEX = 0 IF (QUANTITY.EQ.'YELLOW') LP%COLOR_INDEX = 1 IF (QUANTITY.EQ.'BLUE') LP%COLOR_INDEX = 2 IF (QUANTITY.EQ.'RED') LP%COLOR_INDEX = 3 IF (QUANTITY.EQ.'GREEN') LP%COLOR_INDEX = 4 IF (QUANTITY.EQ.'MAGENTA') LP%COLOR_INDEX = 5 IF (QUANTITY.EQ.'CYAN') LP%COLOR_INDEX = 6 IF (QUANTITY.EQ.'WHITE') LP%COLOR_INDEX = 7C IF (QUANTITY.EQ.'null' .AND. WATER) LP%COLOR_INDEX = 2 IF (QUANTITY.EQ.'null' .AND. TREE) LP%COLOR_INDEX = 4C LP%SAMPLING = SAMPLING_FACTORC IF (NUMBER_INITIAL_DROPLETS.GT.0) DROPLET_FILE = .TRUE.C IF (NUMBER_INITIAL_DROPLETS.GT.0) THEN DO I=1,5,2 IF (XB(I).GT.XB(I+1)) THEN DUMMY = XB(I) XB(I) = XB(I+1) XB(I+1) = DUMMY ENDIF ENDDO ENDIFC LP%X1 = XB(1) LP%X2 = XB(2) LP%Y1 = XB(3) LP%Y2 = XB(4) LP%Z1 = XB(5) LP%Z2 = XB(6)C LP%N_INITIAL = NUMBER_INITIAL_DROPLETS LP%N_INSERT = DROPLETS_PER_SECOND*DTSPARC IF (DIAMETER.GT.0.) THEN ALLOCATE(LP%CDF(0:NDC),STAT=IZERO) CALL ChkMemErr('READ','CDF',IZERO) ALLOCATE(LP%R_CDF(0:NDC),STAT=IZERO) CALL ChkMemErr('READ','R_CDF',IZERO) ALLOCATE(LP%IL_CDF(NSTRATA),STAT=IZERO) CALL ChkMemErr('READ','IL_CDF',IZERO) ALLOCATE(LP%IU_CDF(NSTRATA),STAT=IZERO) CALL ChkMemErr('READ','IU_CDF',IZERO) ALLOCATE(LP%W_CDF(NSTRATA),STAT=IZERO) CALL ChkMemErr('READ','W_CDF',IZERO) ENDIFCC Assign property data to LAGRANGIAN classC LP%DIAMETER = DIAMETER*1.E-6 LP%GAMMA = GAMMA_D LP%SIGMA = 1.15/GAMMA_D LP%TMP_INITIAL = INITIAL_TEMPERATURE + TMPM LP%C_P = SPECIFIC_HEAT*1000. LP%H_V_0 = HEAT_OF_VAPORIZATION*1000. LP%DELTAH = HEAT_OF_COMBUSTION*1000. LP%TMP_V = VAPORIZATION_TEMPERATURE + TMPM LP%DENSITY = DENSITY LP%FTPR = FOTH*PI*DENSITY LP%MASS_PER_VOLUME = MASS_PER_VOLUME LP%TMP_MELT = MELTING_TEMPERATURE + TMPM LP%MASSLESS = MASSLESS LP%LIFETIME = AGE LP%TREE = TREE LP%FUEL = FUEL LP%WATER = WATER LP%STATIC = STATIC IF (FUEL) SPEC_ID = 'MIXTURE_FRACTION' IF (WATER) SPEC_ID = 'WATER VAPOR' LP%SPECIES = SPEC_IDC IF (N.LT.NPC-1 .AND. FUEL) FUEL_EVAPORATION = .TRUE. IF (N.LT.NPC-1 .AND. WATER) WATER_EVAPORATION = .TRUE.C ENDDO READ_PART_LOOP 25 REWIND(LU5)C IF (FUEL_EVAPORATION .OR. WATER_EVAPORATION) EVAPORATION=.TRUE.C END SUBROUTINE READ_PARTCC SUBROUTINE READ_TREEC INTEGER :: IPC,N_TREES_0,NM,NN,N REAL(EB) :: CANOPY_WIDTH,CANOPY_BASE_HEIGHT,TREE_HEIGHT NAMELIST /TREE/ XYZ,CANOPY_WIDTH,CANOPY_BASE_HEIGHT, . TREE_HEIGHT,PART_IDCC Read the TREE lines to determine how many cone shaped treesC there will beC N_TREES = 0 COUNT_TREE_LOOP: DO CALL CHECKREAD('TREE',LU5,IOS) IF (IOS.EQ.1) EXIT COUNT_TREE_LOOP READ(LU5,NML=TREE,END=11,ERR=12,IOSTAT=IOS) N_TREES = N_TREES + 1 12 IF (IOS.GT.0) CALL SHUTDOWN('ERROR: Problem with TREE line') ENDDO COUNT_TREE_LOOP 11 REWIND(LU5)CC Sequentially read the CONE_TREE namelist to get shape and sizeC parameters for each tree.C IF (N_TREES.EQ.0) RETURNC ALLOCATE(CANOPY_W(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','CANOPY_W',IZERO) ALLOCATE(CANOPY_B_H(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','CANOPY_B_H',IZERO) ALLOCATE(TREE_H(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','TREE_H',IZERO) ALLOCATE(X_TREE(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','X_TREE',IZERO) ALLOCATE(Y_TREE(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','Y_TREE',IZERO) ALLOCATE(Z_TREE(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','Z_TREE',IZERO) ALLOCATE(TREE_PARTICLE_CLASS(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','TREE_PARTICLE_CLASS',IZERO) ALLOCATE(TREE_MESH(N_TREES),STAT=IZERO) CALL ChkMemErr('READ','TREE_MESH',IZERO)C N_TREES_0 = N_TREES N = 0C CONE_LOOP: DO NN=1,N_TREES_0 N = N + 1C PART_ID = 'null'C CALL CHECKREAD('TREE',LU5,IOS) ; IF (IOS.EQ.1) EXIT CONE_LOOP READ(LU5,TREE,END=25,IOSTAT=IOS)C MESH_LOOP: DO NM=1,NMESHES IF (XYZ(1).GE.MESH(NM)%XS .AND. XYZ(1).LE.MESH(NM)%XF .AND. . XYZ(2).GE.MESH(NM)%YS .AND. XYZ(2).LE.MESH(NM)%YF .AND. . XYZ(3).GE.MESH(NM)%ZS .AND. XYZ(3).LE.MESH(NM)%ZF) THEN TREE_MESH(N) = NM EXIT MESH_LOOP ENDIF IF (NM.EQ.NMESHES) THEN N = N-1 N_TREES = N_TREES - 1 CYCLE CONE_LOOP ENDIF EN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -