📄 mass.f90
字号:
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 + -