diff --git a/Source/fire.f90 b/Source/fire.f90 index 1d698f8ec2d..c8619182272 100644 --- a/Source/fire.f90 +++ b/Source/fire.f90 @@ -1186,73 +1186,83 @@ SUBROUTINE CALC_AFT_REAC_AND_PROD(ZZ,ZZ_REAC,ZZ_PROD) REAL(EB), INTENT(IN) :: ZZ(N_TRACKED_SPECIES) REAL(EB), INTENT(OUT) :: ZZ_REAC(N_TRACKED_SPECIES),ZZ_PROD(N_TRACKED_SPECIES) +REAL(EB) :: ZZ_EQUIV(N_TRACKED_SPECIES) REAL(EB) :: EQUIV, X,Y,Z,A,B,C,D,E, SUM_ZZ REAL(EB) :: ZZ_MASS, ZZ_FUEL_O2_MASS REAL(EB) :: REAC_MASS, PROD_MASS, FUEL_MASS, O2_MASS, CO2_MASS, H2O_MASS INTEGER :: NS - -CALL CALC_EQUIV_RATIO(ZZ(1:N_TRACKED_SPECIES), EQUIV) -IF (SIM_MODE /= DNS_MODE .AND. USE_MIXED_ZN_AFT_TMP) THEN - EQUIV = MAX(1._EB,EQUIV) -ENDIF +REAL(EB), PARAMETER:: EQUIV_TOL=1.E-4_EB ! Adjust for diluents ZZ_FUEL_O2_MASS = 0._EB ZZ_MASS = SUM(ZZ(1:N_TRACKED_SPECIES)) +ZZ_EQUIV = 0.0_EB ZZ_REAC(1:N_TRACKED_SPECIES) = ZZ(1:N_TRACKED_SPECIES) ZZ_PROD(1:N_TRACKED_SPECIES) = ZZ(1:N_TRACKED_SPECIES) DO NS=1, N_TRACKED_SPECIES - IF (SPECIES_MIXTURE(NS)%OXR > TWO_EPSILON_EB) THEN ! FUEL + IF (SPECIES_MIXTURE(NS)%OXR > TWO_EPSILON_EB .AND. & + ABS(SPECIES_MIXTURE(NS)%EQUIV - 1.0_EB) > EQUIV_TOL) THEN ! FUEL ZZ_REAC(NS) = 0._EB ZZ_PROD(NS) = 0._EB ZZ_FUEL_O2_MASS = ZZ_FUEL_O2_MASS + ZZ(NS) + ZZ_EQUIV(NS) = ZZ(NS) ENDIF ENDDO ZZ_REAC(I_O2) = 0._EB ZZ_PROD(I_O2) = 0._EB +ZZ_EQUIV(I_O2) = ZZ(I_O2) ZZ_FUEL_O2_MASS = ZZ_FUEL_O2_MASS + ZZ(I_O2) -! Based on CxHyOz + aO2 = bCO2 + cH2O + dCxHyOz + eO2 -X=SPECIES_MIXTURE(I_FUEL)%ATOMS(6) !C -Y=SPECIES_MIXTURE(I_FUEL)%ATOMS(1) !H -Z=SPECIES_MIXTURE(I_FUEL)%ATOMS(8) !O -A=0.5_EB*((2._EB*X+0.5_EB*Y)/EQUIV -Z) ! a is a function of equivalence ratio -IF (ABS(EQUIV - 1.0_EB) < TWO_EPSILON_EB) THEN ! Stoich - B = X - C = 0.5_EB*Y - D = 0._EB ! No fuel - E = 0._EB ! No O2 -ELSEIF (EQUIV > 1) THEN ! Rich - D = (2._EB*X+0.5_EB*Y-2._EB*A-Z)/(2._EB*X+0.5_EB*Y-Z) - B = (1._EB-D)*X - C = 0.5_EB*(1._EB-D)*Y - E = 0._EB ! No O2 -ELSE !EQUIV < 1, Lean - B = X - C = 0.5_EB*Y - D = 0._EB ! No fuel - E = A + 0.5*Z - B - 0.5_EB*C -ENDIF +IF (ZZ_FUEL_O2_MASS > TWO_EPSILON_EB) THEN + SUM_ZZ=SUM(ZZ_EQUIV) + ZZ_EQUIV = ZZ_EQUIV/(SUM_ZZ + TWO_EPSILON_EB) + CALL CALC_EQUIV_RATIO(ZZ_EQUIV(1:N_TRACKED_SPECIES), EQUIV) + IF (SIM_MODE /= DNS_MODE .AND. USE_MIXED_ZN_AFT_TMP) THEN + EQUIV = MAX(1._EB,EQUIV) + ENDIF -! Setup reactants -FUEL_MASS = 1._EB*SPECIES_MIXTURE(I_FUEL)%MW -O2_MASS = A*SPECIES_MIXTURE(I_O2)%MW -REAC_MASS = FUEL_MASS+O2_MASS -ZZ_REAC(I_FUEL)=FUEL_MASS/REAC_MASS*ZZ_FUEL_O2_MASS -ZZ_REAC(I_O2)=O2_MASS/REAC_MASS*ZZ_FUEL_O2_MASS -SUM_ZZ=SUM(ZZ_REAC) -ZZ_REAC = ZZ_REAC/SUM_ZZ - -! Setup products -CO2_MASS = B*SPECIES_MIXTURE(I_CO2)%MW -H2O_MASS = C*SPECIES_MIXTURE(I_H2O)%MW -FUEL_MASS = D*SPECIES_MIXTURE(I_FUEL)%MW -O2_MASS = E*SPECIES_MIXTURE(I_O2)%MW -PROD_MASS = CO2_MASS+H2O_MASS+FUEL_MASS+O2_MASS -ZZ_PROD(I_CO2)=ZZ_PROD(I_CO2)+CO2_MASS/PROD_MASS*ZZ_FUEL_O2_MASS -ZZ_PROD(I_H2O)=ZZ_PROD(I_H2O)+H2O_MASS/PROD_MASS*ZZ_FUEL_O2_MASS -ZZ_PROD(I_FUEL)=FUEL_MASS/PROD_MASS*ZZ_FUEL_O2_MASS -ZZ_PROD(I_O2)=O2_MASS/PROD_MASS*ZZ_FUEL_O2_MASS + ! Based on CxHyOz + aO2 = bCO2 + cH2O + dCxHyOz + eO2 + X=SPECIES_MIXTURE(I_FUEL)%ATOMS(6) !C + Y=SPECIES_MIXTURE(I_FUEL)%ATOMS(1) !H + Z=SPECIES_MIXTURE(I_FUEL)%ATOMS(8) !O + A=0.5_EB*((2._EB*X+0.5_EB*Y)/EQUIV -Z) ! a is a function of equivalence ratio + IF (ABS(EQUIV - 1.0_EB) < EQUIV_TOL) THEN ! Stoich + B = X + C = 0.5_EB*Y + D = 0._EB ! No fuel + E = 0._EB ! No O2 + ELSEIF (EQUIV > 1) THEN ! Rich + D = (2._EB*X+0.5_EB*Y-2._EB*A-Z)/(2._EB*X+0.5_EB*Y-Z) + B = (1._EB-D)*X + C = 0.5_EB*(1._EB-D)*Y + E = 0._EB ! No O2 + ELSE !EQUIV < 1, Lean + B = X + C = 0.5_EB*Y + D = 0._EB ! No fuel + E = A + 0.5*Z - B - 0.5_EB*C + ENDIF + + ! Setup reactants + FUEL_MASS = 1._EB*SPECIES_MIXTURE(I_FUEL)%MW + O2_MASS = A*SPECIES_MIXTURE(I_O2)%MW + REAC_MASS = FUEL_MASS+O2_MASS + ZZ_REAC(I_FUEL)=FUEL_MASS/REAC_MASS*ZZ_FUEL_O2_MASS + ZZ_REAC(I_O2)=O2_MASS/REAC_MASS*ZZ_FUEL_O2_MASS + SUM_ZZ=SUM(ZZ_REAC) + ZZ_REAC = ZZ_REAC/SUM_ZZ + + ! Setup products + CO2_MASS = B*SPECIES_MIXTURE(I_CO2)%MW + H2O_MASS = C*SPECIES_MIXTURE(I_H2O)%MW + FUEL_MASS = D*SPECIES_MIXTURE(I_FUEL)%MW + O2_MASS = E*SPECIES_MIXTURE(I_O2)%MW + PROD_MASS = CO2_MASS+H2O_MASS+FUEL_MASS+O2_MASS + ZZ_PROD(I_CO2)=ZZ_PROD(I_CO2)+CO2_MASS/PROD_MASS*ZZ_FUEL_O2_MASS + ZZ_PROD(I_H2O)=ZZ_PROD(I_H2O)+H2O_MASS/PROD_MASS*ZZ_FUEL_O2_MASS + ZZ_PROD(I_FUEL)=FUEL_MASS/PROD_MASS*ZZ_FUEL_O2_MASS + ZZ_PROD(I_O2)=O2_MASS/PROD_MASS*ZZ_FUEL_O2_MASS +ENDIF SUM_ZZ=SUM(ZZ_PROD) ZZ_PROD = ZZ_PROD/SUM_ZZ diff --git a/Source/read.f90 b/Source/read.f90 index 5df87474b63..0ea195441c1 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -3458,6 +3458,7 @@ SUBROUTINE READ_SPEC * ELEMENT(8)%MASS / SPECIES_MIXTURE(N1)%MW SPECIES_MIXTURE(N1)%OXA = SPECIES_MIXTURE(N1)%ATOMS(8) * ELEMENT(8)%MASS / SPECIES_MIXTURE(N1)%MW + SPECIES_MIXTURE(N1)%EQUIV = SPECIES_MIXTURE(N1)%OXR/(SPECIES_MIXTURE(N1)%OXA+TWO_EPSILON_EB) ENDDO !If SOOT_OXIDATION is enabled make sure to save accumulation on the wall and check that it is an AEROSOL species diff --git a/Source/type.f90 b/Source/type.f90 index 1e3d3f6ba98..a6e438c9d09 100644 --- a/Source/type.f90 +++ b/Source/type.f90 @@ -650,6 +650,7 @@ MODULE TYPES REAL(EB), ALLOCATABLE, DIMENSION(:) :: R50 REAL(EB) :: OXR !< Required oxygen for complete combustion (gm/gm-species) REAL(EB) :: OXA !< Available oxygen for combustion (gm/gm-species) + REAL(EB) :: EQUIV !< Species equiv ratio OXR/OXA END TYPE SPECIES_MIXTURE_TYPE