?? evac.f90
字號(hào):
!!! This module contains the FDS+Evac human movement algorithm and! related subprograms. Some of the types are defined in the! type.f90 module file. The statistic (cumulative distributions) are in! the ieva.f90, which includes a module dcdflib.f by netlib (http://www.netlib.org/).! The DCDFLIB has been written in the public domain. Some of the DCDFLIB code has! appeared in an ACM publication and it is subject to their algorithms policy,! see the comments at the start of the DCDFLIB in ieva.f90.!! Author: Timo Korhonen, VTT Technical Research Centre of Finland, 2007!!!!!!!!!!!!!!!!Module EVAC ! Use PRECISION_PARAMETERS Use MESH_VARIABLES Use GLOBAL_CONSTANTS Use TRAN Use TYPES Use STAT Use COMP_FUNCTIONS Use MATH_FUNCTIONS Use MEMORY_FUNCTIONS Use MESH_POINTERS Use PHYSICAL_FUNCTIONS, ONLY : GET_MASS_FRACTION2 ! Implicit None CHARACTER(255), PARAMETER :: evacid='$Id: evac.f90 704 2007-09-28 09:22:07Z tkorhon1 $' CHARACTER(255), PARAMETER :: evacrev='$Revision: 704 $' CHARACTER(255), PARAMETER :: evacdate='$Date: 2007-09-28 05:22:07 -0400 (Fri, 28 Sep 2007) $' ! Private ! Public subprograms (called from the main program) Public EVACUATE_HUMANS, INITIALIZE_EVACUATION Public READ_EVAC, DUMP_EVAC, DUMP_EVAC_CSV Public EVAC_MESH_EXCHANGE, INITIALIZE_EVAC_DUMPS, GET_REV_evac ! Public variables (needed in the main program): ! Character(255):: EVAC_VERSION = '1.10' Character(255) :: EVAC_COMPILE_DATE INTEGER :: EVAC_MODULE_REV ! ! This is a group of persons, who are initialized together, ! i.e., they have same mass, speed, etc distributions and ! they are all put in the given rectangle. ! (&EVAC lines) Type EVACUATION_Type Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB,T_START=0._EB, Angle=0._EB Character(60) :: CLASS_NAME='null', ID_NAME='null' Character(30) :: GRID_NAME='null' Logical :: EVACFILE=.FALSE., After_Tpre=.FALSE., No_Persons=.FALSE. Integer :: N_INITIAL=0,COLOR_INDEX=0,SAMPLING=0, IPC=0, IMESH=0 Integer :: GN_MIN=0, GN_MAX=0 Integer :: N_VENT_FFIELDS=0 Integer, Pointer, Dimension(:) :: I_DOOR_NODES Integer, Pointer, Dimension(:) :: I_VENT_FFIELDS Real(EB), Pointer, Dimension(:) :: P_VENT_FFIELDS End Type EVACUATION_Type ! ! An evacuatio hole, i.e., a rectangle where humans should ! not be put. This makes the &EVAC lines easier to define. ! (&EVHO lines) Type EVAC_HOLE_Type Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB Character(60) :: ID_NAME='null', PERS_ID='null', EVAC_ID='null' Character(30) :: GRID_NAME='null' Integer :: IMESH=0 End Type EVAC_HOLE_Type ! ! A spectator stand. IOR: which x,y line is the bottom line of the stand. ! ior=+1 x=x2, ior=-1 x=x1, ior=+2 y=y2, ior=-2 y=y1 ! H is the height of the stand, S is the length along the incline. ! (&EVSS lines) Type EVAC_SSTAND_TYPE Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB, H=0._EB, H0=0._EB, S=0._EB Real(EB) :: Esc_SpeedUp=0._EB, Esc_SpeedDn=0._EB Real(EB) :: fac_v0_up=1._EB, fac_v0_down=1._EB, fac_v0_hori=1._EB Real(EB) :: cos_x=1._EB, cos_y=1._EB, sin_x=0._EB, sin_y=0._EB Character(60) :: ID_NAME='null' Character(26) :: GRID_NAME='null' Integer :: IMESH=0, IOR=0 End Type EVAC_SSTAND_TYPE ! ! Humans belong to some small group (1 to about 5 persons). This type ! collects the common properties of the group. Type GROUP_TYPE Real(EB) :: GROUP_X=0._EB, GROUP_Y=0._EB, MAX_DIST_CENTER=0._EB, LIMIT_COMP=0._EB Real(EB) :: GROUP_EFF=0._EB, RADIUS_COMPLETE_0=0._EB, RADIUS_COMPLETE_1=0._EB Real(EB) :: Speed=0._EB, IntDose=0._EB, Tpre=0._EB, Tdoor=0._EB, Tdet=0._EB Integer :: GROUP_SIZE=0, GROUP_ID=0, COMPLETE=0, IEL=0 Integer, Pointer, Dimension(:) :: GROUP_I_FFIELDS End Type GROUP_TYPE Type KNOWN_DOOR_TYPE Integer :: N_nodes=0, I_Target=0 Integer, Pointer, Dimension(:) :: I_nodes End Type KNOWN_DOOR_TYPE ! ! This defines a class of persons, e.g. soccer fan. ! (&PERS lines) Type EVAC_PERS_Type Real(EB) :: D_mean=0._EB, D_para=0._EB, D_para2=0._EB, D_low=0._EB, D_high=0._EB Real(EB) :: V_mean=0._EB, V_para=0._EB, V_para2=0._EB, V_low=0._EB, V_high=0._EB Real(EB) :: Tau_mean=0._EB, Tau_para=0._EB, Tau_para2=0._EB, Tau_low=0._EB, Tau_high=0._EB Real(EB) :: Tpre_mean=0._EB, Tpre_para=0._EB, Tpre_para2=0._EB, Tpre_low=0._EB, Tpre_high=0._EB Real(EB) :: Tdet_mean=0._EB, Tdet_para=0._EB, Tdet_para2=0._EB, Tdet_low=0._EB, Tdet_high=0._EB Real(EB) :: A=0._EB,B=0._EB,Lambda=0._EB,C_Young=0._EB,Gamma=0._EB,Kappa=0._EB Real(EB) :: r_torso=0._EB,r_shoulder=0._EB,d_shoulder=0._EB,m_iner=0._EB, Tau_iner=0._EB Character(60) :: ID_NAME='null' Integer :: I_DIA_DIST=0, I_VEL_DIST=0, I_PRE_DIST=0, I_DET_DIST=0, I_TAU_DIST=0 End Type EVAC_PERS_Type ! ! Exit door type: this just count the number of persons ! T_first: first person's exit time (saved for output) ! CHECK_FLOW: If true then the flow can not exceed Flow_max ! (&EXIT lines) Type EVAC_EXIT_Type Real(EB) :: T_first=0._EB, T_last=0._EB, Flow_max=0._EB, Width=0._EB Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB, & X=0._EB,Y=0._EB,Z=0._EB,Xsmoke=0._EB,Ysmoke=0._EB,Zsmoke=0._EB Integer :: IOR=0, ICOUNT=0, IMESH=0, INODE=0 Real(EB) :: FED_CO_CO2_O2=0._EB, SOOT_DENS=0._EB, TMP_G=0._EB, RADINT=0._EB Integer :: II=0, JJ=0, KK=0, FED_MESH=0, COLOR_INDEX=0 Logical :: CHECK_FLOW=.FALSE., COUNT_ONLY=.FALSE. Character(60) :: ID_NAME='null' Character(60) :: TO_NODE='null' Character(30) :: GRID_NAME='null' Character(26) :: VENT_FFIELD='null' Integer :: I_VENT_FFIELD=0 End Type EVAC_EXIT_Type ! ! Like exit, but door will always put the persons to some ! other node. (Thus no count_only option.) ! (&DOOR lines) Type EVAC_DOOR_Type Real(EB) :: T_first=0._EB, T_last=0._EB, Flow_max=0._EB, Width=0._EB Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB, & X=0._EB,Y=0._EB,Z=0._EB,Xsmoke=0._EB,Ysmoke=0._EB,Zsmoke=0._EB Integer :: IOR=0, ICOUNT=0, INODE=0, INODE2=0, IMESH=0, IMESH2=0 Real(EB) :: FED_CO_CO2_O2=0._EB, SOOT_DENS=0._EB, TMP_G=0._EB, RADINT=0._EB Integer :: II=0, JJ=0, KK=0, FED_MESH=0, COLOR_INDEX=0 Logical :: CHECK_FLOW=.FALSE., EXIT_SIGN=.FALSE., KEEP_XY=.FALSE. Character(60) :: ID_NAME='null' Character(60) :: TO_NODE='null' Character(30) :: GRID_NAME='null' Character(26) :: VENT_FFIELD='null' Integer :: I_VENT_FFIELD=0 End Type EVAC_DOOR_Type ! ! Like door, but corr will model stairs (or corridors). ! The parameters, like velocity as function of density etc. ! define if it is corridor or stairway ! (&CORR lines) Type EVAC_CORR_Type Real(EB) :: T_first=0._EB, T_last=0._EB, Flow_max=0._EB, Width1=0._EB, Width2=0._EB Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB, Width=0._EB Real(EB) :: Eff_Width=0._EB, Eff_Length=0._EB, Eff_Area=0._EB, Fac_Speed=0._EB ! Note: Corridor may have 2 different points, where smoke etc. data ! is saved. Real(EB), Dimension(2) :: FED_CO_CO2_O2=0._EB, SOOT_DENS=0._EB, TMP_G=0._EB, RADINT=0._EB Integer :: FED_MESH=0, FED_MESH2=0 Integer, Dimension(2) :: II=0, JJ=0, KK=0 Integer :: IOR=0, ICOUNT=0, INODE=0, INODE2=0, IMESH=0, IMESH2=0 Integer :: MAX_HUMANS_INSIDE=0, n_inside=0 Logical :: CHECK_FLOW=.FALSE. Character(60) :: ID_NAME='null' Character(60) :: TO_NODE='null' Character(30) :: GRID_NAME='null' Type (CORR_LL_Type), Pointer :: First End Type EVAC_CORR_Type ! ! This produces more humans on the floor specified by the ! coordinates. the person type ('soccer_fan' etc) are also ! defined here for these persons. ! (&ENTR lines) Type EVAC_ENTR_Type Real(EB) :: T_first=0._EB, T_last=0._EB, Flow=0._EB, Width=0._EB, T_Start=0._EB, T_Stop=0._EB Real(EB) :: X1=0._EB,X2=0._EB,Y1=0._EB,Y2=0._EB,Z1=0._EB,Z2=0._EB Integer :: IOR=0, ICOUNT=0, COLOR_INDEX=0, IPC=0, IMESH=0, INODE=0, & TO_INODE=0, N_Initial=0 Character(60) :: CLASS_NAME='null', ID_NAME='null' Character(60) :: TO_NODE='null' Character(30) :: GRID_NAME='null' Logical :: After_Tpre=.FALSE., No_Persons=.FALSE. Integer :: N_VENT_FFIELDS=0 Integer, Pointer, Dimension(:) :: I_DOOR_NODES Integer, Pointer, Dimension(:) :: I_VENT_FFIELDS Real(EB), Pointer, Dimension(:) :: P_VENT_FFIELDS End Type EVAC_ENTR_Type ! ! coordinates. the person type ('soccer_fan' etc) are also ! defined here for these persons. Type EVAC_NODE_Type Integer :: Node_Index=0, Mesh_Index=0 Character(60) :: ID_NAME='null', Node_Type='null' Character(30) :: GRID_NAME='null' End Type EVAC_NODE_Type ! ! Linked list, needed for the corridors Type CORR_LL_Type Type (HUMAN_Type) :: HUMAN Real(EB) :: T_in=0._EB, T_out=0._EB Logical :: From1_To2=.FALSE. Integer :: Index=0 Type (CORR_LL_Type), Pointer :: Next End Type CORR_LL_Type ! ! Pointers to the allocatable arrays so one can use these as ! shorthands to the array elements. Type (KNOWN_DOOR_Type), Pointer :: KDT Type (GROUP_Type), Pointer :: GR Type (HUMAN_Type), Pointer :: HR, HRE Type (EVACUATION_Type), Pointer :: HPT, HPE Type (EVAC_PERS_Type), Pointer :: PCP Type (EVAC_EXIT_Type), Pointer :: PEX Type (EVAC_DOOR_Type), Pointer :: PDX, PDX2 Type (EVAC_ENTR_Type), Pointer :: PNX, PNX2 Type (EVAC_CORR_Type), Pointer :: PCX, PCX2 Type (EVAC_NODE_Type), Pointer :: NODE Type (EVAC_HOLE_Type), Pointer :: EHX Type (EVAC_SSTAND_Type),Pointer :: ESS ! ! Next holds door information for groups Type (KNOWN_DOOR_TYPE), Dimension(:), Allocatable, Target :: & Group_Known_Doors ! Next holds door information for lonely humans (group_id=0) Type (KNOWN_DOOR_TYPE), Dimension(:), Allocatable, Target :: & Human_Known_Doors Integer :: ilh, ilh_dim ! Holds the list of the different human groups, i33 is a running index ! for the groups, i33_dim is last index, i.e., the dimension of the array. Type (GROUP_TYPE), Dimension(:), Allocatable, Target :: & Group_List Integer :: i33, i33_dim ! Holds the information of the nodes Type (EVAC_NODE_Type), Dimension(:), Allocatable, Target :: & Evac_Node_List ! Holds the information of the EVAC-lines. Type (EVACUATION_Type), Dimension(:), Allocatable, Target :: & EVACUATION ! Holds the information of the EVHO-lines. Type (EVAC_HOLE_Type), Dimension(:), Allocatable, Target :: & EVAC_HOLES ! Holds the information of the EVSS-lines. Type (EVAC_SSTAND_TYPE), Dimension(:), Allocatable, Target :: & EVAC_SSTANDS ! Holds the information of the EXIT-lines. Type (EVAC_EXIT_Type), Dimension(:), Allocatable, Target :: & EVAC_EXITS ! Holds the information of the DOOR-lines. Type (EVAC_DOOR_Type), Dimension(:), Allocatable, Target :: & EVAC_DOORS ! Holds the information of the ENTR-lines. Type (EVAC_ENTR_Type), Dimension(:), Allocatable, Target :: & EVAC_ENTRYS ! Holds the information of the CORR-lines. Type (EVAC_CORR_Type), Dimension(:), Allocatable, Target :: & EVAC_CORRS ! Holds the information of the PERS-lines. Type (EVAC_PERS_Type), Dimension(:), Allocatable, Target :: & EVAC_PERSON_CLASSES ! ! Next are needed for the Gaussian random numbers Integer GaussFlag Real(EB) GaussSet1, GaussSet2 Integer GTrunFlag Real(EB) GTrunSet1, GTrunSet2 ! Integer :: NPC_EVAC, NPC_PERS, N_EXITS, N_DOORS, N_ENTRYS, & N_CORRS, N_EGRIDS, N_NODES, N_HOLES, N_SSTANDS Integer :: NPPS Integer :: ILABEL_last Character(100) :: MESSAGE ! Real(EB), Dimension(:,:), Allocatable :: TT_Evac, FF_Evac Integer, Dimension(:), Allocatable :: NTT_Evac ! ! Logical :: NOT_RANDOM Integer :: I_FRIC_SW, COLOR_METHOD Real(EB) :: FAC_A_WALL, FAC_B_WALL, LAMBDA_WALL, & NOISEME, NOISETH, NOISECM, RADIUS_COMPLETE_0, & RADIUS_COMPLETE_1, GROUP_EFF, FED_DOOR_CRIT, & TDET_SMOKE_DENS, DENS_INIT, EVAC_DT_MAX, GROUP_DENS, & FC_DAMPING, EVAC_DT_MIN, V_MAX, V_ANGULAR_MAX, V_ANGULAR ! Real(EB), Dimension(:), Allocatable :: Tsteps ! Integer :: n_dead, icyc_old Real(EB) :: fed_max_alive, fed_max !Contains ! Subroutine READ_EVAC Implicit None ! Integer :: NUMBER_INITIAL_PERSONS, & SAMPLING_FACTOR, IPC, n_tmp, GN_MIN, GN_MAX Real(EB) :: DTSAM Logical :: EVACFILE Real(EB) :: DUMMY Real(EB) :: XB(6), XB1(6), XB2(6) Real(EB), Dimension(3) :: XYZ, XYZ_SMOKE Integer :: IOS, IZERO, N, I, IOR, j Character(30) QUANTITY Character(60) FYI,ID,PERS_ID,TO_NODE,EVAC_ID, & DEFAULT_PROPERTIES Character(26) FLOW_FIELD_ID Integer :: DIAMETER_DIST,VELOCITY_DIST, & PRE_EVAC_DIST,DET_EVAC_DIST,TAU_EVAC_DIST Real(EB) :: VEL_MEAN,VEL_PARA,VEL_PARA2,VEL_LOW,VEL_HIGH, & DIA_MEAN,DIA_PARA,DIA_PARA2,DIA_LOW,DIA_HIGH, & PRE_MEAN,PRE_PARA,PRE_PARA2,PRE_LOW,PRE_HIGH, & DET_MEAN,DET_PARA,DET_PARA2,DET_LOW,DET_HIGH, & TAU_MEAN,TAU_PARA,TAU_PARA2,TAU_LOW,TAU_HIGH, & FCONST_A,FCONST_B,L_NON_SP, & C_YOUNG,GAMMA,KAPPA, ANGLE, & D_TORSO_MEAN,D_SHOULDER_MEAN, TAU_ROT, M_INERTIA Integer :: MAX_HUMANS_INSIDE, n_max_in_corrs, COLOR_INDEX Real(EB) :: MAX_FLOW, WIDTH, T_START, T_STOP, WIDTH1, & WIDTH2, EFF_WIDTH, EFF_LENGTH, FAC_SPEED Logical :: CHECK_FLOW, COUNT_ONLY, AFTER_REACTION_TIME, & EXIT_SIGN, KEEP_XY Character(26) :: VENT_FFIELD, EVAC_MESH Real(EB) :: FAC_V0_UP, FAC_V0_DOWN, FAC_V0_HORI, HEIGHT, HEIGHT0, ESC_SPEED Character(26), Dimension(51) :: KNOWN_DOOR_NAMES Real(EB), Dimension(51) :: KNOWN_DOOR_PROBS Type (MESH_Type), Pointer :: M Integer :: ii,jj,kk Integer :: size_rnd Integer, Dimension(8) :: t_rnd Integer, Dimension(:), Allocatable :: seed_rnd Namelist /EXIT/ ID, XB, IOR, FLOW_FIELD_ID, CHECK_FLOW, & MAX_FLOW, FYI, COUNT_ONLY, WIDTH, XYZ, VENT_FFIELD, & EVAC_MESH, COLOR_INDEX, XYZ_SMOKE Namelist /DOOR/ ID, XB, IOR, FLOW_FIELD_ID, CHECK_FLOW, & MAX_FLOW, TO_NODE, FYI, WIDTH, XYZ, VENT_FFIELD, & EXIT_SIGN, EVAC_MESH, COLOR_INDEX, XYZ_SMOKE, KEEP_XY Namelist /ENTR/ ID, XB, IOR, FLOW_FIELD_ID, MAX_FLOW, & FYI, WIDTH, QUANTITY, PERS_ID, T_START, & T_STOP, AFTER_REACTION_TIME, & KNOWN_DOOR_NAMES, KNOWN_DOOR_PROBS, & EVAC_MESH Namelist /CORR/ ID, XB, IOR, FLOW_FIELD_ID, CHECK_FLOW, & MAX_FLOW, TO_NODE, FYI, WIDTH, WIDTH1, WIDTH2, & EFF_WIDTH, EFF_LENGTH, MAX_HUMANS_INSIDE, FAC_SPEED, & XB1, XB2 Namelist /EVAC/ NUMBER_INITIAL_PERSONS, QUANTITY, FYI, & ID, DTSAM, XB, FLOW_FIELD_ID, PERS_ID, & T_START, T_STOP, IOR, MAX_FLOW, WIDTH, ANGLE, & AFTER_REACTION_TIME, GN_MIN, GN_MAX, & KNOWN_DOOR_NAMES, KNOWN_DOOR_PROBS, EVAC_MESH Namelist /EVHO/ FYI, ID, XB, EVAC_ID, PERS_ID, EVAC_MESH Namelist /EVSS/ FYI, ID, XB, EVAC_MESH, HEIGHT, HEIGHT0, IOR, & FAC_V0_UP, FAC_V0_DOWN, FAC_V0_HORI, ESC_SPEED Namelist /PERS/ FYI,ID,DIAMETER_DIST,VELOCITY_DIST, & PRE_EVAC_DIST,DET_EVAC_DIST,TAU_EVAC_DIST, &
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -