📄 init.f90
字号:
MODULE INIT ! Allocate numerous arrays and perform miscellaneous initializationsUSE PRECISION_PARAMETERSUSE MESH_VARIABLESUSE MESH_POINTERSUSE GLOBAL_CONSTANTSUSE TRANUSE MEMORY_FUNCTIONS, ONLY : CHKMEMERR USE COMP_FUNCTIONS, ONLY : SHUTDOWNUSE DEVICE_VARIABLESIMPLICIT NONEPRIVATEINTEGER IZEROCHARACTER(255), PARAMETER :: initid='$Id: init.f90 708 2007-09-28 17:17:17Z drjfloyd $'CHARACTER(255), PARAMETER :: initrev='$Revision: 708 $'CHARACTER(255), PARAMETER :: initdate='$Date: 2007-09-28 13:17:17 -0400 (Fri, 28 Sep 2007) $'CHARACTER(100) MESSAGEPUBLIC INITIALIZE_MESH_VARIABLES,INITIALIZE_GLOBAL_VARIABLES, OPEN_AND_CLOSE, GET_REV_initTYPE (MESH_TYPE), POINTER :: MTYPE (OBSTRUCTION_TYPE), POINTER :: OBTYPE (SURFACE_TYPE), POINTER :: SFTYPE (MATERIAL_TYPE), POINTER :: ML CONTAINS SUBROUTINE INITIALIZE_MESH_VARIABLES(NM)USE RADCONS, ONLY: UIIDIM,NSB,NRAUSE CONTROL_VARIABLESINTEGER :: N,I,J,K,II,JJ,KK,IPTS,JPTS,KPTS,N_EDGES_DIM,IW,IC,IBC,IOR,IOPZINTEGER, INTENT(IN) :: NMREAL(EB) :: MU_NINTEGER, POINTER :: IBP1, JBP1, KBP1,IBAR, JBAR, KBAR, NDWC, N_EDGES, NWCREAL(EB),POINTER :: XS,XF,YS,YF,ZS,ZFTYPE (INITIALIZATION_TYPE), POINTER :: INTYPE (P_ZONE_TYPE), POINTER :: PZ M => MESHES(NM)IBP1 =>M%IBP1JBP1 =>M%JBP1KBP1 =>M%KBP1IBAR =>M%IBARJBAR =>M%JBARKBAR =>M%KBARNDWC =>M%NDWCNWC =>M%NWCN_EDGES=>M%N_EDGESXS=>M%XS YS=>M%YS ZS=>M%ZSXF=>M%XF YF=>M%YF ZF=>M%ZFALLOCATE( M%RHO(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','RHO',IZERO)ALLOCATE( M%RHOS(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','RHOS',IZERO)ALLOCATE( M%TMP(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','TMP',IZERO)ALLOCATE( M%FRHO(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','FRHO',IZERO)ALLOCATE( M%U(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','U',IZERO)ALLOCATE( M%V(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','V',IZERO)ALLOCATE( M%W(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','W',IZERO)ALLOCATE(M%US(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','US',IZERO)ALLOCATE(M%VS(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','VS',IZERO)ALLOCATE(M%WS(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WS',IZERO)ALLOCATE(M%FVX(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','FVX',IZERO)ALLOCATE(M%FVY(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','FVY',IZERO)ALLOCATE(M%FVZ(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','FVZ',IZERO)ALLOCATE( M%H(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','H',IZERO)ALLOCATE( M%HP(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','HP',IZERO)ALLOCATE(M%DDDT(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','DDDT',IZERO)ALLOCATE( M%D(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','D',IZERO)ALLOCATE( M%DS(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','DS',IZERO)ALLOCATE( M%MU(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','MU',IZERO)ALLOCATE( M%Q(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','Q',IZERO)! Background pressure, temperature, density as a function of height (Z coordinate)ALLOCATE( M%PBAR(0:KBP1,0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','PBAR',IZERO)ALLOCATE( M%PBAR_S(0:KBP1,0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','PBAR_S',IZERO)ALLOCATE( M%R_PBAR(0:KBP1,0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','R_PBAR',IZERO)ALLOCATE( M%D_PBAR_DT(N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','D_PBAR_DT',IZERO)ALLOCATE( M%D_PBAR_S_DT(N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','D_PBAR_S_DT',IZERO)ALLOCATE(M%P_0(0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','P_0',IZERO)ALLOCATE(M%TMP_0(0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','TMP_0',IZERO)ALLOCATE(M%RHO_0(0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','RHO_0',IZERO)! LeaksALLOCATE( M%LEAK_AREA(0:N_ZONE,0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','LEAK_AREA',IZERO)M%LEAK_AREA = 0._EBALLOCATE( M%U_LEAK(0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','U_LEAK',IZERO)M%U_LEAK = 0._EBALLOCATE( M%FDS_LEAK_AREA(0:N_ZONE,0:N_ZONE),STAT=IZERO)CALL ChkMemErr('INIT','FDS_LEAK_AREA',IZERO)M%FDS_LEAK_AREA = 0._EB! Allocate species arrays IF (N_SPECIES>0) THEN ALLOCATE( M%YY(0:IBP1,0:JBP1,0:KBP1,N_SPECIES),STAT=IZERO) CALL ChkMemErr('INIT','YY',IZERO) M%YY = 0._EB ALLOCATE(M%YYS(0:IBP1,0:JBP1,0:KBP1,N_SPECIES),STAT=IZERO) CALL ChkMemErr('INIT','YYS',IZERO) M%YYS = 0._EB ALLOCATE(M%DEL_RHO_D_DEL_Y(0:IBP1,0:JBP1,0:KBP1,N_SPECIES),STAT=IZERO) CALL ChkMemErr('INIT','DEL_RHO_D_DEL_Y',IZERO) M%DEL_RHO_D_DEL_Y = 0._EB ALLOCATE(M%RSUM(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO) CALL ChkMemErr('INIT','RSUM',IZERO) M%RSUM = RSUM0 ALLOCATE(M%Z_SUM(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO) CALL ChkMemErr('INIT','Z_SUM',IZERO) M%Z_SUM = 0._EB ALLOCATE(M%Y_SUM(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO) CALL ChkMemErr('INIT','Y_SUM',IZERO) M%Y_SUM = 0._EB ENDIF! Allocate water mass arrays if sprinklers are present IF (DROPLET_FILE) PARTICLE_TAG = NMIF (N_EVAP_INDICIES>0) THEN ALLOCATE(M%AVG_DROP_DEN(0:IBP1,0:JBP1,0:KBP1,N_EVAP_INDICIES),STAT=IZERO) CALL ChkMemErr('INIT','AVG_DROP_DEN',IZERO) M%AVG_DROP_DEN=0._EB ALLOCATE(M%AVG_DROP_TMP(0:IBP1,0:JBP1,0:KBP1,N_EVAP_INDICIES),STAT=IZERO) CALL ChkMemErr('INIT','AVG_DROP_TMP',IZERO) M%AVG_DROP_TMP=TMPM ALLOCATE(M%AVG_DROP_RAD(0:IBP1,0:JBP1,0:KBP1,N_EVAP_INDICIES),STAT=IZERO) CALL ChkMemErr('INIT','AVG_DROP_RAD',IZERO) M%AVG_DROP_RAD=0._EB ALLOCATE(M%QR_W(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO) CALL ChkMemErr('INIT','QR_W',IZERO) M%QR_W = 0._EB ALLOCATE(M%D_VAP(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO) CALL ChkMemErr('INIT','D_VAP',IZERO) M%D_VAP = 0._EBENDIF ! If radiation absorption desired allocate arrays ALLOCATE(M%QR(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','QR',IZERO)M%QR = 0._EBALLOCATE(M%KAPPA(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','KAPPA',IZERO) M%KAPPA = 0._EBALLOCATE(M%UII(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','UII',IZERO)M%UII = 0._EB! Work arraysALLOCATE(M%WORK1(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK1',IZERO)ALLOCATE(M%WORK2(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK2',IZERO)ALLOCATE(M%WORK3(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK3',IZERO)ALLOCATE(M%WORK4(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK4',IZERO)ALLOCATE(M%WORK5(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK5',IZERO)ALLOCATE(M%WORK6(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK6',IZERO)ALLOCATE(M%WORK7(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','WORK7',IZERO)ALLOCATE(M%LOGICAL_WORK(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','LOGICAL_WORK',IZERO) ! Boundary file patch counter ALLOCATE(M%INC(-3:3,0:M%N_OBST),STAT=IZERO)CALL ChkMemErr('INIT','INC',IZERO)! Initialize background pressure, temperature and densityM%D_PBAR_DT = 0._EBM%D_PBAR_S_DT = 0._EBIF (STRATIFICATION) THEN DO K=0,M%KBP1 M%TMP_0(K) = TMPA + LAPSE_RATE*M%ZC(K) IF (LAPSE_RATE /= 0._EB) THEN M%P_0(K) = P_INF*(M%TMP_0(K)/TMPA)**(GVEC(3)/RSUM0/LAPSE_RATE) ELSE M%P_0(K) = P_INF*EXP(GVEC(3)*M%ZC(K)/(RSUM0*TMPA)) ENDIF ENDDOELSE M%TMP_0(:) = TMPA M%P_0(:) = P_INFENDIFDO K=0,M%KBP1 M%PBAR(K,:) = M%P_0(K) M%PBAR_S(K,:) = M%P_0(K) M%RHO_0(K) = M%P_0(K)/(M%TMP_0(K)*RSUM0)ENDDO! Initialize various time step variables M%DTOLD = M%DTM%DTNEXT = M%DTM%DTINT = M%DT! Initialize major arraysDO K=0,M%KBP1 M%RHO(:,:,K) = M%RHO_0(K) M%TMP(:,:,K) = M%TMP_0(K)ENDDOM%RHOS = M%RHOM%RHO_AVG = RHOAM%FRHO = 0._EBM%U = U0M%V = V0M%W = W0M%US = U0M%VS = V0M%WS = W0IF (NOISE) CALL INITIAL_NOISEM%FVX = 0._EBM%FVY = 0._EBM%FVZ = 0._EBM%H = H0M%DDDT = 0._EBM%D = 0._EBM%DS = 0._EBM%Q = 0._EBIF (N_SPECIES > 0) M%DEL_RHO_D_DEL_Y = 0._EB ! Upper bounds on local HRR per unit volume IF (TWO_D) THEN M%Q_UPPER = HRRPUA_SHEET*1000._EB/(M%DXMIN*M%DZMIN)**0.5_EBELSE M%Q_UPPER = HRRPUA_SHEET*1000._EB/(M%DXMIN*M%DYMIN*M%DZMIN)**ONTHENDIF! Viscosity MU_N = SPECIES(0)%MU(NINT(0.1_EB*TMPA))M%MU = MU_NIF (DNS .AND. ISOTHERMAL) THEN ALLOCATE(M%RREDX(M%IBAR),STAT=IZERO) CALL ChkMemErr('READ','RREDX',IZERO) ALLOCATE(M%RREDY(M%JBAR),STAT=IZERO) CALL ChkMemErr('READ','RREDY',IZERO) ALLOCATE(M%RREDZ(M%KBAR),STAT=IZERO) CALL ChkMemErr('READ','RREDZ',IZERO) DO I=1,M%IBAR M%RREDX(I) = (MU_N/RHOA)*M%RDX(I) ENDDO DO J=1,M%JBAR M%RREDY(J) = (MU_N/RHOA)*M%RDY(J) ENDDO DO K=1,M%KBAR M%RREDZ(K) = (MU_N/RHOA)*M%RDZ(K) ENDDOENDIF ! Initialize mass fraction arraysIF (N_SPECIES > 0) THEN M%RSUM = RSUM0 DO N=1,N_SPECIES M%YY(:,:,:,N) = SPECIES(N)%YY0 M%YYS(:,:,:,N) = SPECIES(N)%YY0 IF (SPECIES(N)%MODE==MIXTURE_FRACTION_SPECIES) M%Z_SUM = M%Z_SUM + SPECIES(N)%YY0 IF (SPECIES(N)%MODE==GAS_SPECIES) THEN M%Y_SUM = M%Y_SUM + SPECIES(N)%YY0 M%RSUM = M%RSUM + (SPECIES(N)%RCON - SPECIES(0)%RCON)*SPECIES(N)%YY0 ENDIF ENDDOENDIF! Initialize pressure ZONEs ALLOCATE(M%PRESSURE_ZONE(0:IBP1,0:JBP1,0:KBP1),STAT=IZERO)CALL ChkMemErr('INIT','PRESSURE_ZONE',IZERO)M%PRESSURE_ZONE = 0DO N=1,N_ZONE PZ => P_ZONE(N) DO K=0,KBP1 DO J=0,JBP1 DO I=0,IBP1 IF (M%XC(I) > PZ%X1 .AND. M%XC(I) < PZ%X2 .AND. & M%YC(J) > PZ%Y1 .AND. M%YC(J) < PZ%Y2 .AND. & M%ZC(K) > PZ%Z1 .AND. M%ZC(K) < PZ%Z2) THEN M%PRESSURE_ZONE(I,J,K) = N DO IOPZ=0,N_ZONE IF (PZ%LEAK_AREA(IOPZ) > 0._EB) M%LEAK_AREA(N,IOPZ) = PZ%LEAK_AREA(IOPZ) IF (PZ%LEAK_AREA(IOPZ) > 0._EB) M%LEAK_AREA(IOPZ,N) = PZ%LEAK_AREA(IOPZ) ENDDO ENDIF ENDDO ENDDO ENDDOENDDO! Over-ride default ambient conditions with user-prescribed INITializations DO N=1,N_INIT IN => INITIALIZATION(N) DO K=0,KBP1 DO J=0,JBP1 DO I=0,IBP1 IF (M%XC(I) > IN%X1 .AND. M%XC(I) < IN%X2 .AND. & M%YC(J) > IN%Y1 .AND. M%YC(J) < IN%Y2 .AND. & M%ZC(K) > IN%Z1 .AND. M%ZC(K) < IN%Z2) THEN M%TMP(I,J,K) = IN%TEMPERATURE M%RHO(I,J,K) = IN%DENSITY IF (N_SPECIES>0) M%YY(I,J,K,1:N_SPECIES) = IN%MASS_FRACTION(1:N_SPECIES) IF (IN%ADJUST_DENSITY) M%RHO(I,J,K) = M%RHO(I,J,K)*M%P_0(K)/P_INF IF (IN%ADJUST_TEMPERATURE) M%TMP(I,J,K) = M%TMP(I,J,K)*M%P_0(K)/P_INF ENDIF ENDDO ENDDO ENDDOENDDOM%RHOS = M%RHO! RadiationM%QR = 0._EBM%KAPPA = 0._EBM%UII = 4._EB*SIGMA*TMPA4M%WORK1 = 0._EBM%WORK2 = 0._EBM%WORK3 = 0._EBM%WORK4 = 0._EBM%WORK5 = 0._EBM%WORK6 = 0._EBM%WORK7 = 0._EB! Designate each boundary cell with a reference number for wall BC's NWC = 0NDWC = 0 ! Determine the number of wall cells to allocate OBST_LOOP_1: DO N=1,M%N_OBST OB=>M%OBSTRUCTION(N) IF (OB%CONSUMABLE) THEN NDWC = NDWC + 3*(OB%I2-OB%I1+1)*(OB%J2-OB%J1+1)*(OB%K2-OB%K1+1) ELSEIF (OB%DEVC_INDEX>0 .OR. OB%CTRL_INDEX>0 ) THEN NDWC = NDWC + 3*(OB%I2-OB%I1+1)*(OB%J2-OB%J1+1)*(OB%K2-OB%K1+1) ! IF (.NOT. DEVICE(OB%DEVC_INDEX)%INITIAL_STATE) NDWC = NDWC + 3*(OB%I2-OB%I1+1)*(OB%J2-OB%J1+1)*(OB%K2-OB%K1+1)! ELSEIF (OB%CTRL_INDEX/=0) THEN! IF (.NOT. CONTROL(OB%CTRL_INDEX)%INITIAL_STATE) NDWC = NDWC + 3*(OB%I2-OB%I1+1)*(OB%J2-OB%J1+1)*(OB%K2-OB%K1+1) ELSE DO K=OB%K1+1,OB%K2 DO J=OB%J1+1,OB%J2 IC = M%CELL_INDEX(OB%I1 ,J,K) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 IC = M%CELL_INDEX(OB%I2+1,J,K) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 ENDDO ENDDO DO K=OB%K1+1,OB%K2 DO I=OB%I1+1,OB%I2 IC = M%CELL_INDEX(I,OB%J1 ,K) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 IC = M%CELL_INDEX(I,OB%J2+1,K) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 ENDDO ENDDO DO J=OB%J1+1,OB%J2 DO I=OB%I1+1,OB%I2 IC = M%CELL_INDEX(I,J,OB%K1 ) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 IC = M%CELL_INDEX(I,J,OB%K2+1) IF (.NOT.M%SOLID(IC)) NDWC = NDWC + 1 ENDDO ENDDO ENDIFENDDO OBST_LOOP_1NDWC = NDWC + M%NEWCALLOCATE(M%WALL(1:NDWC),STAT=IZERO)CALL ChkMemErr('INIT','WALL',IZERO) ALLOCATE(M%TMP_F(NDWC),STAT=IZERO)CALL ChkMemErr('INIT','TMP_F',IZERO) M%TMP_F = TMPAALLOCATE(M%TMP_B(NDWC),STAT=IZERO)CALL ChkMemErr('INIT','TMP_B',IZERO) M%TMP_B = TMPAALLOCATE(M%TMP_W(NDWC),STAT=IZERO)CALL ChkMemErr('INIT','TMP_W',IZERO) M%TMP_W = TMPAIF (N_EVAP_INDICIES > 0) THEN ALLOCATE(M%RCP_W(NDWC),STAT=IZERO) CALL ChkMemErr('INIT','RCP_W',IZERO) M%RCP_W = 0._EBENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -