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

📄 mass.f90

📁 FDS为火灾动力学模拟软件源代码,该软件为开源项目,代码语言主要为FORTRAN,可在WINDOWS和LINUX下编译运行,详细说明可参考http://fire.nist.gov/fds/官方网址
💻 F90
📖 第 1 页 / 共 2 页
字号:
         ENDDO      ENDDO      IF (N_SPEC_DILUENTS > 0) RSUM = RSUM*(1._EB-Y_SUM) + R_SUM_DILUENTS   ENDIF   ! Extract temperature from the Equation of State   IF (.NOT.ISOTHERMAL) THEN      IF (N_SPECIES==0) THEN         FORALL (I=0:IBP1,J=0:JBP1,K=0:KBP1) TMP(I,J,K) = PBAR(K,PRESSURE_ZONE(I,J,K))/(SPECIES(0)%RCON*RHO(I,J,K))      ELSE         FORALL (I=0:IBP1,J=0:JBP1,K=0:KBP1) TMP(I,J,K) = PBAR(K,PRESSURE_ZONE(I,J,K))/(RSUM(I,J,K)*RHO(I,J,K))      ENDIF      TMP = MAX(TMPMIN,MIN(TMPMAX,TMP))   ENDIFEND SELECT PREDICTOR_STEPTUSED(3,NM)=TUSED(3,NM)+SECOND()-TNOW CONTAINS SUBROUTINE CHECK_DENSITY ! Redistribute mass from cells below or above the density cut-off limitsUSE GLOBAL_CONSTANTS, ONLY : PREDICTOR, CORRECTOR, N_SPECIES,RHOMIN,RHOMAX REAL(EB) :: SUM,CONST,RHOMI,RHOPI,RHOMJ,RHOPJ,RHOMK,RHOPK,RHO00,RMIN,RMAXINTEGER  :: IC,ISUMLOGICAL :: LC(-3:3)REAL(EB), POINTER, DIMENSION(:,:,:) :: RHODELTARHODELTA => WORK2IF (PREDICTOR) THEN   RHOP=>RHOS   YYP=>YYSELSE   RHOP=>RHO   YYP=>YYENDIF ! Correct undershootsRHODELTA = 0._EBDO K=1,KBAR   DO J=1,JBAR      CHECK_LOOP: DO I=1,IBAR         IC = CELL_INDEX(I,J,K)         IF (SOLID(IC)) CYCLE CHECK_LOOP         RMIN = RHOMIN         IF (RHOP(I,J,K)>=RMIN) CYCLE CHECK_LOOP         SUM   = 0.         ISUM  = 0         LC    = .FALSE.         RHO00 = RHOP(I,J,K)         RHOMI = RHOP(I-1,J,K)         RHOPI = RHOP(I+1,J,K)         RHOMJ = RHOP(I,J-1,K)         RHOPJ = RHOP(I,J+1,K)         RHOMK = RHOP(I,J,K-1)         RHOPK = RHOP(I,J,K+1)         IF (WALL_INDEX(IC,-1)==0 .AND. RHOMI>RMIN) THEN            SUM = SUM + RHOMI            ISUM = ISUM + 1            LC(-1) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 1)==0 .AND. RHOPI>RMIN) THEN            SUM = SUM + RHOPI            ISUM = ISUM + 1            LC( 1) = .TRUE.         ENDIF         IF (WALL_INDEX(IC,-2)==0 .AND. RHOMJ>RMIN) THEN            SUM = SUM + RHOMJ            ISUM = ISUM + 1            LC(-2) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 2)==0 .AND. RHOPJ>RMIN) THEN            SUM = SUM + RHOPJ            ISUM = ISUM + 1            LC( 2) = .TRUE.         ENDIF         IF (WALL_INDEX(IC,-3)==0 .AND. RHOMK>RMIN) THEN            SUM = SUM + RHOMK            ISUM = ISUM + 1            LC(-3) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 3)==0 .AND. RHOPK>RMIN) THEN            SUM = SUM + RHOPK            ISUM = ISUM + 1            LC( 3) = .TRUE.         ENDIF         IF (ISUM==0) THEN            RHODELTA(I,J,K) = RMIN - RHOP(I,J,K)            CYCLE CHECK_LOOP         ELSE            CONST = (RHOMIN-RHO00)/(SUM-ISUM*RHO00)            IF (LC(-1)) RHODELTA(I-1,J,K) = RHODELTA(I-1,J,K) + MAX(RMIN,RHOMI+CONST*(RHO00-RHOMI)) - RHOP(I-1,J,K)            IF (LC( 1)) RHODELTA(I+1,J,K) = RHODELTA(I+1,J,K) + MAX(RMIN,RHOPI+CONST*(RHO00-RHOPI)) - RHOP(I+1,J,K)            IF (LC(-2)) RHODELTA(I,J-1,K) = RHODELTA(I,J-1,K) + MAX(RMIN,RHOMJ+CONST*(RHO00-RHOMJ)) - RHOP(I,J-1,K)            IF (LC( 2)) RHODELTA(I,J+1,K) = RHODELTA(I,J+1,K) + MAX(RMIN,RHOPJ+CONST*(RHO00-RHOPJ)) - RHOP(I,J+1,K)            IF (LC(-3)) RHODELTA(I,J,K-1) = RHODELTA(I,J,K-1) + MAX(RMIN,RHOMK+CONST*(RHO00-RHOMK)) - RHOP(I,J,K-1)            IF (LC( 3)) RHODELTA(I,J,K+1) = RHODELTA(I,J,K+1) + MAX(RMIN,RHOPK+CONST*(RHO00-RHOPK)) - RHOP(I,J,K+1)            RHODELTA(I,J,K) = RHODELTA(I,J,K) + RMIN - RHOP(I,J,K)         ENDIF      ENDDO CHECK_LOOP   ENDDOENDDORHOP = RHOP + RHODELTA! Correct overshootsRHODELTA = 0._EBDO K=1,KBAR   DO J=1,JBAR      CHECK_LOOP2: DO I=1,IBAR         IC = CELL_INDEX(I,J,K)         IF (SOLID(IC)) CYCLE CHECK_LOOP2         RMAX = RHOMAX         IF (RHOP(I,J,K)<=RMAX) CYCLE CHECK_LOOP2         SUM   = 0.         ISUM  = 0         LC    = .FALSE.         RHO00 = RHOP(I,J,K)         RHOMI = RHOP(I-1,J,K)         RHOPI = RHOP(I+1,J,K)         RHOMJ = RHOP(I,J-1,K)         RHOPJ = RHOP(I,J+1,K)         RHOMK = RHOP(I,J,K-1)         RHOPK = RHOP(I,J,K+1)         IF (WALL_INDEX(IC,-1)==0 .AND. RHOMI<RMAX) THEN            SUM = SUM + RHOMI            ISUM = ISUM + 1            LC(-1) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 1)==0 .AND. RHOPI<RMAX) THEN            SUM = SUM + RHOPI            ISUM = ISUM + 1            LC( 1) = .TRUE.         ENDIF         IF (WALL_INDEX(IC,-2)==0 .AND. RHOMJ<RMAX) THEN            SUM = SUM + RHOMJ            ISUM = ISUM + 1            LC(-2) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 2)==0 .AND. RHOPJ<RMAX) THEN            SUM = SUM + RHOPJ            ISUM = ISUM + 1            LC( 2) = .TRUE.         ENDIF         IF (WALL_INDEX(IC,-3)==0 .AND. RHOMK<RMAX) THEN            SUM = SUM + RHOMK            ISUM = ISUM + 1            LC(-3) = .TRUE.         ENDIF         IF (WALL_INDEX(IC, 3)==0 .AND. RHOPK<RMAX) THEN            SUM = SUM + RHOPK            ISUM = ISUM + 1            LC( 3) = .TRUE.         ENDIF         IF (ISUM==0) THEN            RHODELTA(I,J,K) = RMAX - RHOP(I,J,K)            CYCLE CHECK_LOOP2         ELSE            CONST = (RMAX-RHO00)/(SUM-ISUM*RHO00)            IF (LC(-1)) RHODELTA(I-1,J,K) = RHODELTA(I-1,J,K) + MIN(RMAX,RHOMI+CONST*(RHO00-RHOMI)) - RHOP(I-1,J,K)            IF (LC( 1)) RHODELTA(I+1,J,K) = RHODELTA(I+1,J,K) + MIN(RMAX,RHOPI+CONST*(RHO00-RHOPI)) - RHOP(I+1,J,K)            IF (LC(-2)) RHODELTA(I,J-1,K) = RHODELTA(I,J-1,K) + MIN(RMAX,RHOMJ+CONST*(RHO00-RHOMJ)) - RHOP(I,J-1,K)            IF (LC( 2)) RHODELTA(I,J+1,K) = RHODELTA(I,J+1,K) + MIN(RMAX,RHOPJ+CONST*(RHO00-RHOPJ)) - RHOP(I,J+1,K)            IF (LC(-3)) RHODELTA(I,J,K-1) = RHODELTA(I,J,K-1) + MIN(RMAX,RHOMK+CONST*(RHO00-RHOMK)) - RHOP(I,J,K-1)            IF (LC( 3)) RHODELTA(I,J,K+1) = RHODELTA(I,J,K+1) + MIN(RMAX,RHOPK+CONST*(RHO00-RHOPK)) - RHOP(I,J,K+1)            RHODELTA(I,J,K) = RHODELTA(I,J,K) + RMAX - RHOP(I,J,K)         ENDIF      ENDDO CHECK_LOOP2   ENDDOENDDORHOP = RHOP + RHODELTAEND SUBROUTINE CHECK_DENSITY  SUBROUTINE CHECK_MASS_FRACTION! Redistribute species mass from cells below or above the cut-off limitsUSE GLOBAL_CONSTANTS, ONLY : PREDICTOR, CORRECTOR, N_SPECIES,YYMIN,YYMAXREAL(EB) :: SUM,CONST,RHYMI,RHYPI,RHYMJ,RHYPJ,RHYMK,RHYPK,RHY0,YMI,YPI,YMJ,YPJ,YMK,YPK,Y00,YMIN,YMAXINTEGER  :: IC,N,ISUM, IW_A(-3:3)LOGICAL  :: LC(-3:3)REAL(EB), POINTER, DIMENSION(:,:,:) :: YYDELTAYYDELTA => WORK1YYDELTA = 0._EBIF (PREDICTOR) THEN   RHOP    => RHOS   YYP     => YYSELSE   RHOP    => RHO   YYP     => YYENDIF! Search the domain for negative values of Y or Z. Redistribute mass where appropriate.SPECIESLOOP: DO N=1,N_SPECIES   YYDELTA = 0._EB   ! Do undershoots   DO K=1,KBAR      DO J=1,JBAR         CHECK_LOOP: DO I=1,IBAR            IC = CELL_INDEX(I,J,K)            IF (SOLID(IC)) CYCLE CHECK_LOOP            IW_A = WALL_INDEX(IC,:)            Y00   = YYP(I,J,K,N)            SUM   = 0._EB            ISUM  = 0            LC    = .FALSE.            YMIN  = YYMAX(N)             IF (IW_A(-1) == 0) THEN               YMI = YYP(I-1,J,K,N)               LC(-1) = .TRUE.            ELSE               YMI = YY_W(IW_A(-1),N)              ENDIF                      IF (IW_A( 1) == 0) THEN               YPI = YYP(I+1,J,K,N)               LC( 1) = .TRUE.            ELSE               YPI = YY_W(IW_A( 1),N)              ENDIF                       IF (IW_A(-2) == 0) THEN               YMJ = YYP(I,J-1,K,N)               LC(-2) = .TRUE.            ELSE               YMJ = YY_W(IW_A(-2),N)              ENDIF                     IF (IW_A( 2) == 0) THEN               YPJ = YYP(I,J+1,K,N)               LC( 2) = .TRUE.            ELSE               YPJ = YY_W(IW_A( 2),N)              ENDIF                     IF (IW_A(-3) == 0) THEN               YMK = YYP(I,J,K-1,N)               LC(-3) = .TRUE.            ELSE               YMK = YY_W(IW_A(-3),N)              ENDIF                     IF (IW_A( 3) == 0) THEN               YPK = YYP(I,J,K+1,N)               LC( 3) = .TRUE.            ELSE               YPK = YY_W(IW_A( 3),N)              ENDIF                       YMIN  = MIN(YMI,YPI,YMJ,YPJ,YMK,YPK)            YMIN = MAX(YMIN,YYMIN(N))            IF ((DEL_RHO_D_DEL_Y(I,J,K,N) > 0._EB .AND. Y00 < YMIN) .OR. Y00 < YYMIN(N)) THEN               RHY0  = RHOP(I,J,K)  *(YMIN - Y00)               IF (LC(-1) .AND. YMI>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I-1,J,K,N) < 0._EB) THEN                  RHYMI = RHOP(I-1,J,K)*(YMI - YMIN)                  SUM  = SUM + RHYMI                   ISUM = ISUM + 1               ELSE                  LC(-1) = .FALSE.               ENDIF               IF (LC( 1) .AND. YPI>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I+1,J,K,N) < 0._EB) THEN                  RHYPI = RHOP(I+1,J,K)*(YPI - YMIN)                  SUM  = SUM + RHYPI                  ISUM = ISUM + 1               ELSE                  LC( 1) = .FALSE.               ENDIF               IF (LC(-2) .AND. YMJ>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I,J-1,K,N) < 0._EB) THEN                  RHYMJ = RHOP(I,J-1,K)*(YMJ - YMIN)                  SUM  = SUM + RHYMJ                  ISUM = ISUM + 1               ELSE                  LC(-2) = .FALSE.               ENDIF               IF (LC( 2) .AND. YPJ>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I,J+1,K,N) < 0._EB) THEN                  RHYPJ = RHOP(I,J+1,K)*(YPJ - YMIN)                  SUM  = SUM + RHYPJ                  ISUM = ISUM + 1                  LC( 2) = .TRUE.               ELSE                  LC( 2) = .FALSE.               ENDIF               IF (LC(-3) .AND. YMK>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I,J,K-1,N) < 0._EB) THEN               RHYMK = RHOP(I,J,K-1)*(YMK - YMIN)                  SUM  = SUM + RHYMK                  ISUM = ISUM + 1               ELSE                  LC(-3) = .FALSE.               ENDIF               IF (LC( 3) .AND. YPK>YMIN) THEN! .AND. DEL_RHO_D_DEL_Y(I,J,K+1,N) < 0._EB) THEN                  RHYPK = RHOP(I,J,K+1)*(YPK - YMIN)                  SUM  = SUM + RHYPK                  ISUM = ISUM + 1               ELSE                  LC( 3) = .FALSE.               ENDIF                               IF (ISUM==0) THEN                  IF (YMIN <= YYMIN(N)) YYDELTA(I,J,K) = YYDELTA(I,J,K) + YMIN - Y00                    CYCLE CHECK_LOOP               ELSE                  YYDELTA(I,J,K) = YYDELTA(I,J,K) + YMIN - Y00                                 CONST = MIN(1._EB,RHY0/SUM)                  IF (LC(-1)) YYDELTA(I-1,J,K) = YYDELTA(I-1,J,K) - RHYMI*CONST/RHOP(I-1,J,K)                  IF (LC( 1)) YYDELTA(I+1,J,K) = YYDELTA(I+1,J,K) - RHYPI*CONST/RHOP(I+1,J,K)                  IF (LC(-2)) YYDELTA(I,J-1,K) = YYDELTA(I,J-1,K) - RHYMJ*CONST/RHOP(I,J-1,K)                  IF (LC( 2)) YYDELTA(I,J+1,K) = YYDELTA(I,J+1,K) - RHYPJ*CONST/RHOP(I,J+1,K)                  IF (LC(-3)) YYDELTA(I,J,K-1) = YYDELTA(I,J,K-1) - RHYMK*CONST/RHOP(I,J,K-1)                  IF (LC( 3)) YYDELTA(I,J,K+1) = YYDELTA(I,J,K+1) - RHYPK*CONST/RHOP(I,J,K+1)               ENDIF            ENDIF         ENDDO CHECK_LOOP      ENDDO   ENDDO   YYP(:,:,:,N) = YYP(:,:,:,N) + YYDELTA   YYDELTA=0._EB   ! Do overshoots   DO K=1,KBAR      DO J=1,JBAR         CHECK_LOOP2: DO I=1,IBAR            IC = CELL_INDEX(I,J,K)            IF (SOLID(IC)) CYCLE CHECK_LOOP2            IW_A  = WALL_INDEX(IC,:)            Y00   = YYP(I,J,K,N)            SUM   = 0._EB            ISUM  = 0            LC    = .FALSE.            YMIN  = YYMAX(N)             IF (IW_A(-1) == 0) THEN               YMI = YYP(I-1,J,K,N)               LC(-1) = .TRUE.            ELSE               YMI = YY_W(IW_A(-1),N)              ENDIF                      IF (IW_A( 1) == 0) THEN               YPI = YYP(I+1,J,K,N)               LC( 1) = .TRUE.            ELSE               YPI = YY_W(IW_A( 1),N)              ENDIF                       IF (IW_A(-2) == 0) THEN               YMJ = YYP(I,J-1,K,N)               LC(-2) = .TRUE.            ELSE               YMJ = YY_W(IW_A(-2),N)              ENDIF                     IF (IW_A( 2) == 0) THEN               YPJ = YYP(I,J+1,K,N)               LC( 2) = .TRUE.            ELSE               YPJ = YY_W(IW_A( 2),N)              ENDIF                     IF (IW_A(-3) == 0) THEN               YMK = YYP(I,J,K-1,N)               LC(-3) = .TRUE.            ELSE               YMK = YY_W(IW_A(-3),N)              ENDIF                     IF (IW_A( 3) == 0) THEN               YPK = YYP(I,J,K+1,N)               LC( 3) = .TRUE.            ELSE               YPK = YY_W(IW_A( 3),N)              ENDIF                       YMAX  = MAX(YMI,YPI,YMJ,YPJ,YMK,YPK)            YMAX = MIN(YMAX,YYMAX(N))                        IF ((DEL_RHO_D_DEL_Y(I,J,K,N) < 0._EB .AND. Y00 > YMAX) .OR. Y00 > YYMAX(N)) THEN               RHY0  = RHOP(I,J,K)  *(Y00 - YMAX)               IF (LC(-1) .AND. YMI<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I-1,J,K,N) > 0._EB) THEN                  RHYMI = RHOP(I-1,J,K)*(YMAX - YMI)                  SUM  = SUM + RHYMI                  ISUM = ISUM + 1               ELSE                  LC(-1) = .FALSE.               ENDIF               IF (LC( 1) .AND. YPI<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I+1,J,K,N) > 0._EB) THEN                  RHYPI = RHOP(I+1,J,K)*(YMAX - YPI)                  SUM  = SUM + RHYPI                  ISUM = ISUM + 1               ELSE                  LC( 1) = .FALSE.               ENDIF               IF (LC(-2) .AND. YMJ<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I,J-1,K,N) > 0._EB) THEN                  RHYMJ = RHOP(I,J-1,K)*(YMAX - YMJ)                  SUM  = SUM + RHYMJ                  ISUM = ISUM + 1               ELSE                  LC(-2) = .FALSE.               ENDIF               IF (LC( 2) .AND. YPJ<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I,J+1,K,N) > 0._EB) THEN                  RHYPJ = RHOP(I,J+1,K)*(YMAX - YPJ)                  SUM  = SUM + RHYPJ                  ISUM = ISUM + 1               ELSE                  LC( 2) = .FALSE.               ENDIF               IF (LC(-3) .AND. YMK<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I,J,K-1,N) > 0._EB) THEN                  RHYMK = RHOP(I,J,K-1)*(YMAX - YMK)                  SUM  = SUM + RHYMK                  ISUM = ISUM + 1               ELSE                  LC(-3) = .FALSE.               ENDIF               IF (LC( 3) .AND. YPK<YMAX) THEN! .AND. DEL_RHO_D_DEL_Y(I,J,K+1,N) > 0._EB) THEN                  RHYPK = RHOP(I,J,K+1)*(YMAX - YPK)                  SUM  = SUM + RHYPK                  ISUM = ISUM + 1               ELSE                  LC( 3) = .FALSE.               ENDIF                                     IF (ISUM==0) THEN                  IF(YMAX >= YYMAX(N)) YYDELTA(I,J,K) = YYDELTA(I,J,K) + YMAX - Y00                  CYCLE CHECK_LOOP2               ELSE                  YYDELTA(I,J,K) = YYDELTA(I,J,K) + YMAX - Y00                                 CONST = MIN(1._EB,RHY0/SUM)                  IF (LC(-1)) YYDELTA(I-1,J,K) = YYDELTA(I-1,J,K) + RHYMI*CONST/RHOP(I-1,J,K)                  IF (LC( 1)) YYDELTA(I+1,J,K) = YYDELTA(I+1,J,K) + RHYPI*CONST/RHOP(I+1,J,K)                  IF (LC(-2)) YYDELTA(I,J-1,K) = YYDELTA(I,J-1,K) + RHYMJ*CONST/RHOP(I,J-1,K)                  IF (LC( 2)) YYDELTA(I,J+1,K) = YYDELTA(I,J+1,K) + RHYPJ*CONST/RHOP(I,J+1,K)                  IF (LC(-3)) YYDELTA(I,J,K-1) = YYDELTA(I,J,K-1) + RHYMK*CONST/RHOP(I,J,K-1)                  IF (LC( 3)) YYDELTA(I,J,K+1) = YYDELTA(I,J,K+1) + RHYPK*CONST/RHOP(I,J,K+1)               ENDIF            ENDIF         ENDDO CHECK_LOOP2      ENDDO   ENDDO      YYP(:,:,:,N) = YYP(:,:,:,N) + YYDELTA   ENDDO SPECIESLOOPRETURNEND SUBROUTINE CHECK_MASS_FRACTION END SUBROUTINE DENSITYSUBROUTINE GET_REV_mass(MODULE_REV,MODULE_DATE)INTEGER,INTENT(INOUT) :: MODULE_REVCHARACTER(255),INTENT(INOUT) :: MODULE_DATEWRITE(MODULE_DATE,'(A)') massrev(INDEX(massrev,':')+1:LEN_TRIM(massrev)-2)READ (MODULE_DATE,'(I5)') MODULE_REVWRITE(MODULE_DATE,'(A)') massdateEND SUBROUTINE GET_REV_mass END MODULE MASS

⌨️ 快捷键说明

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