diff --git a/Source/cons.f90 b/Source/cons.f90 index 986215c4723..e4a164dd01c 100644 --- a/Source/cons.f90 +++ b/Source/cons.f90 @@ -439,6 +439,7 @@ MODULE GLOBAL_CONSTANTS INTEGER :: N_PASSIVE_SCALARS=0 !< Number of passive scalars INTEGER :: N_TOTAL_SCALARS=0 !< Number of total scalars, tracked and passive INTEGER :: N_FIXED_CHEMISTRY_SUBSTEPS=-1 !< Number of chemistry substeps in combustion routine +INTEGER :: ZETA_0_RAMP_INDEX=0 !< Ramp index for initial unmixed fraction LOGICAL :: OUTPUT_CHEM_IT=.FALSE. LOGICAL :: REAC_SOURCE_CHECK=.FALSE. diff --git a/Source/fire.f90 b/Source/fire.f90 index 9eb8cb2650a..42b99fb6651 100644 --- a/Source/fire.f90 +++ b/Source/fire.f90 @@ -96,12 +96,13 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) USE PHYSICAL_FUNCTIONS, ONLY: GET_SPECIFIC_GAS_CONSTANT,GET_MASS_FRACTION_ALL,GET_SPECIFIC_HEAT,GET_MOLECULAR_WEIGHT, & GET_SENSIBLE_ENTHALPY_Z,IS_REALIZABLE USE CHEMCONS, ONLY: DO_CHEM_LOAD_BALANCE +USE MATH_FUNCTIONS, ONLY: EVALUATE_RAMP INTEGER :: NM,I,J,K,NC, CHEM_SUBIT_TMP,CHEM_SUBIT_TMP_OUT,ICC,JCC,INDX,NRECEIVE_CELLS INTEGER :: NCHEM_ACTIVE_CELLS_AND_CC, NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL, IERR, NCHEM_ACTIVE_CELLS, NCHEM_ACTIVE_CC REAL(EB), INTENT(IN) :: T,DT REAL(EB) :: ZZ_GET(1:N_TRACKED_SPECIES),DZZ(1:N_TRACKED_SPECIES),& - REAC_SOURCE_TERM_TMP(N_TRACKED_SPECIES),Q_REAC_TMP(N_REACTIONS),VCELL,PRES + REAC_SOURCE_TERM_TMP(N_TRACKED_SPECIES),Q_REAC_TMP(N_REACTIONS),VCELL,PRES,ZETA_0,TSI LOGICAL :: Q_EXISTS TYPE (CC_CUTCELL_TYPE), POINTER :: CC LOGICAL :: IS_CHEM_ACTIVE @@ -175,7 +176,10 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) ! For 1 MPI process (serial) distribution is not needed. !------ - DO_CHEM_LOAD_BALANCE_IF : IF(N_MPI_PROCESSES > 1 .AND. DO_CHEM_LOAD_BALANCE) THEN +TSI = T-T_BEGIN +ZETA_0 = EVALUATE_RAMP(TSI,ZETA_0_RAMP_INDEX)*INITIAL_UNMIXED_FRACTION + +CHEM_LOAD_BALANCE_IF : IF(N_MPI_PROCESSES > 1 .AND. DO_CHEM_LOAD_BALANCE) THEN IF (.NOT. ALLOCATED(NCHEM_ACTIVE_CELLS_AND_CC_RANK_WISE)) ALLOCATE(NCHEM_ACTIVE_CELLS_AND_CC_RANK_WISE(N_MPI_PROCESSES)) NCHEM_ACTIVE_CELLS_AND_CC_RANK_WISE = 0 CALL MPI_ALLGATHER(NCHEM_ACTIVE_CELLS_AND_CC,1,MPI_INTEGER,NCHEM_ACTIVE_CELLS_AND_CC_RANK_WISE,1,MPI_INTEGER,MPI_COMM_WORLD,IERR) @@ -205,7 +209,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) ! Call combustion integration routine for Cartesian cell (I,J,K) CALL COMBUSTION_MODEL( T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,& CHEM_SUBIT_TMP_OUT,REAC_SOURCE_TERM_TMP,Q_REAC_TMP,& - MYTEMP,MYRHO,PRES,MYMU,DELTA,VOL) + MYTEMP,MYRHO,PRES,MYMU,DELTA,VOL,ZETA_0) !*************************************************************************************** RESULTS_TO_SEND_ARRAY(1:N_TRACKED_SPECIES,INDX) = ZZ_GET @@ -216,7 +220,6 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) ENDDO - IF (COMBUSTION_ODE_SOLVER == CVODE_SOLVER) THEN T_CHEM_ODE = T_CHEM_ODE+CURRENT_TIME()-TNOW2 ENDIF @@ -230,7 +233,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) IF (STOP_STATUS/=NO_STOP) RETURN ENDIF !NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL >0 -ELSE DO_CHEM_LOAD_BALANCE_IF +ELSE CHEM_LOAD_BALANCE_IF IF (NCHEM_ACTIVE_CELLS_AND_CC >0) THEN ! Serial chemistry: @@ -254,7 +257,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) CALL COMBUSTION_MODEL( T,DT,ZZ_GET,Q(I,J,K),MIX_TIME(I,J,K),CHI_R(I,J,K),& CHEM_SUBIT_TMP,REAC_SOURCE_TERM_TMP,Q_REAC_TMP,& TMP(I,J,K),RHO(I,J,K),PRES, MU(I,J,K),& - LES_FILTER_WIDTH(I,J,K),DX(I)*DY(J)*DZ(K),IIC=I,JJC=J,KKC=K ) + LES_FILTER_WIDTH(I,J,K),DX(I)*DY(J)*DZ(K),ZETA_0,IIC=I,JJC=J,KKC=K ) !*************************************************************************************** !IF (STOP_STATUS/=NO_STOP) RETURN IF (OUTPUT_CHEM_IT) CHEM_SUBIT(I,J,K) = CHEM_SUBIT_TMP @@ -278,7 +281,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) CC%CHI_R(JCC),& CHEM_SUBIT_TMP,REAC_SOURCE_TERM_TMP,Q_REAC_TMP,& CC%TMP(JCC),CC%RHO(JCC),PRES,MU(I,J,K),& - LES_FILTER_WIDTH(I,J,K),CC%VOLUME(JCC),IIC=I,JJC=J,KKC=K) + LES_FILTER_WIDTH(I,J,K),CC%VOLUME(JCC),ZETA_0,IIC=I,JJC=J,KKC=K) !*************************************************************************************** CALL SET_SPECIES_SOURCE_TERM_CUTCELL(DT, ICC, JCC, ZZ_GET, DZZ, REAC_SOURCE_TERM_TMP, Q_REAC_TMP) END DO @@ -291,7 +294,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) T_CHEM_ODE = T_CHEM_ODE+CURRENT_TIME()-TNOW2 ENDIF ENDIF !NCHEM_ACTIVE_CELLS_AND_CC >0 -ENDIF DO_CHEM_LOAD_BALANCE_IF +ENDIF CHEM_LOAD_BALANCE_IF ! This volume refactoring is needed for RADIATION_FVM (CHI_R, Q) and plotting slices: IF(CC_IBM) THEN @@ -712,13 +715,13 @@ END SUBROUTINE GATHER_CELLS_FROM_MPI_PROCESSES SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_OUT,REAC_SOURCE_TERM_OUT,Q_REAC_OUT,& - TMP_IN,RHO_IN,PRES_IN,MU_IN,DELTA,CELL_VOLUME,IIC,JJC,KKC) + TMP_IN,RHO_IN,PRES_IN,MU_IN,DELTA,CELL_VOLUME,ZETA_0_IN,IIC,JJC,KKC) USE MATH_FUNCTIONS, ONLY: EVALUATE_RAMP USE PHYSICAL_FUNCTIONS, ONLY: GET_REALIZABLE_MF USE COMP_FUNCTIONS, ONLY: SHUTDOWN USE CHEMCONS, ONLY: ODE_MIN_ATOL INTEGER, INTENT(IN), OPTIONAL :: IIC,JJC,KKC -REAL(EB), INTENT(IN) :: T,DT,RHO_IN,PRES_IN,MU_IN,DELTA,CELL_VOLUME +REAL(EB), INTENT(IN) :: T,DT,RHO_IN,PRES_IN,MU_IN,DELTA,CELL_VOLUME,ZETA_0_IN REAL(EB), INTENT(OUT) :: Q_OUT,MIX_TIME_OUT,CHI_R_OUT,REAC_SOURCE_TERM_OUT(N_TRACKED_SPECIES),Q_REAC_OUT(N_REACTIONS) INTEGER, INTENT(OUT) :: CHEM_SUBIT_OUT REAL(EB), INTENT(INOUT) :: ZZ_GET(1:N_TRACKED_SPECIES) @@ -730,7 +733,7 @@ SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_ Q_REAC_SUM(1:N_REACTIONS),Q_SUM_CHI_R,CHI_R_SUM,TIME_RAMP_FACTOR,& TOTAL_MIXED_MASS_1,TOTAL_MIXED_MASS_2,TOTAL_MIXED_MASS_4,TOTAL_MIXED_MASS,& ZETA_1,ZETA_2,ZETA_4,D_F,TMP_IN,C_U,DT_SUB_OLD,ERR_EST(N_TRACKED_SPECIES),ERR_TOL(N_TRACKED_SPECIES),ERR_TINY,& - ZZ_TEMP(1:N_TRACKED_SPECIES), ATOL(1:N_TRACKED_SPECIES) + ZZ_TEMP(1:N_TRACKED_SPECIES),ATOL(1:N_TRACKED_SPECIES) INTEGER :: NR,NS,ITER,TVI,RICH_ITER,TIME_ITER,RICH_ITER_MAX INTEGER, PARAMETER :: TV_ITER_MIN=5 LOGICAL :: TV_FLUCT(1:N_TRACKED_SPECIES),EXTINCT,NO_REACTIONS,NO_REAC_2,NO_REAC_4 @@ -761,7 +764,7 @@ SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_ END SELECT ENDIF -ZETA_0 = INITIAL_UNMIXED_FRACTION +ZETA_0 = ZETA_0_IN CELL_MASS = RHO_IN*CELL_VOLUME DT_SUB_MIN = DT/REAL(MAX_CHEMISTRY_SUBSTEPS,EB) diff --git a/Source/read.f90 b/Source/read.f90 index a85b8209174..8503b306167 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -4492,11 +4492,12 @@ END SUBROUTINE PROC_SPEC_2 SUBROUTINE READ_COMB USE CHEMCONS, ONLY: ODE_MIN_ATOL, EQUIV_RATIO_CHECK, MIN_EQUIV_RATIO, MAX_EQUIV_RATIO, DO_CHEM_LOAD_BALANCE REAL(EB) :: ODE_REL_ERROR +CHARACTER(LABEL_LENGTH) :: RAMP_ZETA_0='null' NAMELIST /COMB/ CHECK_REALIZABILITY,COMPUTE_ADIABATIC_FLAME_TEMPERATURE, DO_CHEM_LOAD_BALANCE, EQUIV_RATIO_CHECK, & EXTINCTION_MODEL,FINITE_RATE_MIN_TEMP, FIXED_MIX_TIME,FREE_BURN_TEMPERATURE,& INITIAL_UNMIXED_FRACTION, MAX_CHEMISTRY_SUBSTEPS, MAX_EQUIV_RATIO, MIN_EQUIV_RATIO, & N_FIXED_CHEMISTRY_SUBSTEPS, ODE_MIN_ATOL,ODE_REL_ERROR,ODE_SOLVER,SUPPRESSION,TAU_CHEM, & - TAU_FLAME,ZZ_MIN_GLOBAL + TAU_FLAME,RAMP_ZETA_0,ZZ_MIN_GLOBAL ODE_SOLVER = 'null' ODE_REL_ERROR = -1._EB @@ -4563,6 +4564,10 @@ SUBROUTINE READ_COMB IF (ODE_MIN_ATOL < 0.D0) ODE_MIN_ATOL = DBLE(0.1_EB*ZZ_MIN_GLOBAL) IF (ODE_REL_ERROR > 0._EB) GLOBAL_ODE_REL_ERROR = ODE_REL_ERROR +! Set index for ZETA_0 ramp, if needed + +IF (RAMP_ZETA_0 /='null') CALL GET_RAMP_INDEX(RAMP_ZETA_0,'TIME',ZETA_0_RAMP_INDEX) + END SUBROUTINE READ_COMB