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

📄 evac.f90

📁 FDS为火灾动力学模拟软件源代码,该软件为开源项目,代码语言主要为FORTRAN,可在WINDOWS和LINUX下编译运行,详细说明可参考http://fire.nist.gov/fds/官方网址
💻 F90
📖 第 1 页 / 共 5 页
字号:
!!! 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, &

⌨️ 快捷键说明

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