Skip to content

Commit 17af4a1

Browse files
authored
Merge pull request #15046 from cxp484/master
FDS Source: Adiabatic Flame Temperature calculation in Mixing zone
2 parents 95bfb19 + 1cc7596 commit 17af4a1

File tree

15 files changed

+554
-168
lines changed

15 files changed

+554
-168
lines changed

Source/chem.f90

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,8 @@ END FUNCTION DDTMP_TROE
783783
!> \brief cvode interface for ODE integrator. Call sundials cvode in serial mode.
784784
!> \param CC species concentration (kmol/m3) array
785785
!> \param ZZ_0 initial species mass fraction array (of the unbuned zone),needed for mixing+chem
786-
!> \param TMP_IN is the temperature of the cell (unburned zone)
786+
!> \param TMP_IN is the temperature of the mixed zone (For DNS it is cell temp)
787+
!> \param TMP_UNMIX is the unmix zone temperature
787788
!> \param PR_IN is the pressure
788789
!> \param ZETA0 is the initial unmixed fraction
789790
!> \param TAU_MIX is Mixing timescale
@@ -792,13 +793,13 @@ END FUNCTION DDTMP_TROE
792793
!> \param TEND is the end time in seconds
793794
!> \param RTOL is the relative error for all the species (REAL_EB)
794795
!> \param ATOL is the absolute error tolerance array for the species (REAL_EB)
795-
!> \param TMP_OUT reactor calculated temperature at the end
796+
!> \param TMP_OUT reactor calculated mixing zone temperature at the end
796797
!> \param CHEM_TIME Chemical time scale
797798
!> \param WRITE_SUBSTEPS Whether to write cvode substeps. Only write for first cfd step.
798799
!> \param CVODE_CALL_OPTION 1:CV_NORMAL, 2=CV_ONE_STEP
799800
!> \details This is the interface subroutine to the other modules.
800801

801-
SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,TEND, RTOL, ATOL, &
802+
SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,TEND, RTOL, ATOL, &
802803
TMP_OUT, CHEM_TIME, WRITE_SUBSTEPS, CVODE_CALL_OPTION)
803804
USE PHYSICAL_FUNCTIONS, ONLY : MOLAR_CONC_TO_MASS_FRAC, CALC_EQUIV_RATIO, GET_ENTHALPY, GET_MOLECULAR_WEIGHT
804805
USE COMP_FUNCTIONS, ONLY: GET_FILE_NUMBER
@@ -813,7 +814,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
813814
USE FSUNDIALS_NVECTOR_MOD ! FORTRAN INTERFACE TO GENERIC N_VECTOR
814815

815816
REAL(EB), INTENT(INOUT) :: CC(N_TRACKED_SPECIES)
816-
REAL(EB), INTENT(IN) :: ZZ_0(N_TRACKED_SPECIES),TMP_IN,PR_IN,ZETA0,TAU_MIX,CELL_MASS,TCUR,TEND
817+
REAL(EB), INTENT(IN) :: ZZ_0(N_TRACKED_SPECIES),TMP_IN,TMP_UNMIX,PR_IN,ZETA0,TAU_MIX,CELL_MASS,TCUR,TEND
817818
REAL(EB), INTENT(IN) :: ATOL(N_TRACKED_SPECIES)
818819
REAL(EB), INTENT(IN) :: RTOL
819820
REAL(EB), INTENT(OUT) :: TMP_OUT,CHEM_TIME
@@ -841,7 +842,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
841842
TYPE(C_PTR) :: USERDATAPTR ! USER DATA CONTAINS MIXING INFORMATION
842843

843844
REAL(EB) :: ZZ(N_TRACKED_SPECIES), EQUIV, H_IN
844-
INTEGER :: CVODE_TASK, NS, NTRY, MAXTRY, SUBSTEP_COUNT
845+
INTEGER :: CVODE_TASK, NS, NTRY, MAXTRY, SUBSTEP_COUNT, MAXTRY_FAC
845846
REAL(EB) :: H_G
846847
TYPE(USERDATA), TARGET :: USER_DATA
847848
LOGICAL :: ONLY_FIRST_STEP=.TRUE. ! Needed in CV_ONE_STEP
@@ -948,7 +949,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
948949
USER_DATA%CELL_MASS = CELL_MASS
949950
ALLOCATE(USER_DATA%ZZ_0(N_TRACKED_SPECIES))
950951
USER_DATA%ZZ_0 = ZZ_0
951-
CALL GET_ENTHALPY(ZZ_0,H_IN,TMP_IN)
952+
CALL GET_ENTHALPY(ZZ_0,H_IN,TMP_UNMIX)
952953
USER_DATA%H_IN = H_IN
953954
USERDATAPTR = C_LOC(USER_DATA)
954955
IERR_C = FCVODESETUSERDATA(CVODE_MEM, USERDATAPTR)
@@ -987,12 +988,14 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
987988
ENDIF
988989
END DO
989990

990-
991991
ENDIF
992992

993993
IF (IERR_C /= 0) THEN
994-
MAXTRY = CVODE_MAX_TRY
995994
! If all internal substeps are taken try two more times. This will allow larger CFD timestep.
995+
! Make MAXTRY at least CVODE_MAX_TRY or for larger timestep (>1E-3) scale it proportionaly.
996+
MAXTRY_FAC = CEILING((TEND-TCUR)/1.0E-3_EB)
997+
MAXTRY_FAC = MIN(MAX(MAXTRY_FAC,1),50)
998+
MAXTRY = CVODE_MAX_TRY*MAXTRY_FAC
996999
IF (IERR_C == CV_TOO_MUCH_WORK) THEN !CV_TOO_MUCH_WORK == all internal substeps are taken
9971000
NTRY = 0
9981001
DO WHILE (NTRY < MAXTRY)
@@ -1008,8 +1011,8 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
10081011

10091012
IF (IERR_C .NE. CV_SUCCESS) THEN
10101013
IF (IERR_C == CV_TOO_MUCH_WORK) THEN
1011-
WRITE(LU_ERR,'(A, 2E18.8, A)')" WARN: CVODE took all internal substeps. CUR_CFD_TIME, DT=", CUR_CFD_TIME, (TEND-TCUR), &
1012-
". If the warning persists, reduce the timestep."
1014+
WRITE(LU_ERR,'(A, 2E18.8, I8, A)')" WARN: CVODE took all internal substeps. CUR_CFD_TIME, DT, MAXTRY=", CUR_CFD_TIME, &
1015+
(TEND-TCUR), MAXTRY, ". If the warning persists, reduce the timestep."
10131016
ELSE
10141017
WRITE(LU_ERR,'(A, I4, A, 2E18.8, A)')" WARN: CVODE didn't finish ODE solution with message code:", IERR_C, &
10151018
" and CUR_CFD_TIME, DT=", CUR_CFD_TIME, (TEND-TCUR), ". If the warning persists, reduce the timestep."

Source/cons.f90

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -886,14 +886,25 @@ END MODULE RADCONS
886886
MODULE CHEMCONS
887887
USE PRECISION_PARAMETERS
888888

889+
!> \brief Parameters associated with IGNITION_ZONES
890+
TYPE IGNITION_ZONE_TYPE
891+
REAL(EB) :: X1 !< Lower x bound of Ignition Zone
892+
REAL(EB) :: X2 !< Upper x bound of Ignition Zone
893+
REAL(EB) :: Y1 !< Lower y bound of Ignition Zone
894+
REAL(EB) :: Y2 !< Upper y bound of Ignition Zone
895+
REAL(EB) :: Z1 !< Lower z bound of Ignition Zone
896+
REAL(EB) :: Z2 !< Upper z bound of Ignition Zone
897+
INTEGER :: DEVC_INDEX=0 !< Index of device controlling the status of the zone
898+
CHARACTER(LABEL_LENGTH) :: DEVC_ID='null' !< Name of device controlling the status of the zone
899+
END TYPE IGNITION_ZONE_TYPE
900+
889901
INTEGER, ALLOCATABLE, DIMENSION(:) :: YP2ZZ
890902
REAL(EB) :: ODE_MIN_ATOL= -1._EB
891903
LOGICAL :: EQUIV_RATIO_CHECK = .FALSE.
892-
REAL(EB) :: MIN_EQUIV_RATIO=0.0_EB
904+
REAL(EB) :: MIN_EQUIV_RATIO=0.1_EB
893905
REAL(EB) :: MAX_EQUIV_RATIO=20.0_EB
894906
LOGICAL :: DO_CHEM_LOAD_BALANCE = .FALSE.
895907
INTEGER :: MAX_CVODE_SUBSTEPS=100000
896-
REAL(EB) :: MAX_CHEM_TIME=1.E-6_EB
897908
INTEGER :: CVODE_MAX_TRY=4
898909
LOGICAL :: IS_EXPONENT_LT_1 = .FALSE.
899910

@@ -902,5 +913,18 @@ MODULE CHEMCONS
902913
REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: CVODE_SUBSTEP_DATA
903914
INTEGER :: TOTAL_SUBSTEPS_TAKEN
904915

905-
END MODULE CHEMCONS
916+
! Adiabatic flame temperature calculation
917+
CHARACTER(LABEL_LENGTH) :: FUEL_ID_FOR_AFT='null'
918+
INTEGER :: I_FUEL,I_CO2,I_H2O,I_O2,I_N2 ! Store the index of the species in the ZZ array.
919+
LOGICAL :: USE_MIXED_ZN_AFT_TMP = .TRUE.
920+
921+
! Mixing
922+
REAL(EB) :: ZETA_ARTIFICAL_MIN_LIMIT=0.99_EB
923+
REAL(EB) :: ZETA_ARTIFICAL_MAX_LIMIT=0.9999_EB
924+
REAL(EB) :: ZETA_FIRST_STEP_DIV=10._EB
906925

926+
! IGNITION ZONES (mainly for premixed flame)
927+
INTEGER :: N_IGNITION_ZONES = 0
928+
TYPE(IGNITION_ZONE_TYPE), DIMENSION(MAX_IGNITION_ZONES) :: IGNITION_ZONES !< Coordinates of ignition zones used for detailed chemistry
929+
930+
END MODULE CHEMCONS

Source/data.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,10 @@ SUBROUTINE DEFINE_OUTPUT_QUANTITIES
677677
OUTPUT_QUANTITY(144)%SHORT_NAME = 'Y_ELEM'
678678
OUTPUT_QUANTITY(144)%ELEM_ID_REQUIRED = .TRUE.
679679

680+
OUTPUT_QUANTITY(145)%NAME='EQUIVALENCE RATIO'
681+
OUTPUT_QUANTITY(145)%UNITS=''
682+
OUTPUT_QUANTITY(145)%SHORT_NAME = 'equivRatio'
683+
680684
OUTPUT_QUANTITY(150)%NAME = 'SUM LUMPED VOLUME FRACTIONS'
681685
OUTPUT_QUANTITY(150)%UNITS = ''
682686
OUTPUT_QUANTITY(150)%SHORT_NAME = 'sum X'

Source/devc.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ MODULE DEVICE_VARIABLES
1717
SPRAY_ANGLE(2,2),P0=0._EB,PX(3)=0._EB,PXX(3,3)=0._EB,VIEW_ANGLE,PROBE_DIAMETER
1818
INTEGER :: PDPA_M=0,PDPA_N=0,N_SMOKEVIEW_PARAMETERS=0,N_SMOKEVIEW_IDS=0,N_INSERT,I_VEL=0,PARTICLES_PER_SECOND
1919
LOGICAL :: PDPA_INTEGRATE=.TRUE.,PDPA_NORMALIZE=.TRUE.,HISTOGRAM_NORMALIZE=.TRUE.,HISTOGRAM=.FALSE., &
20-
HISTOGRAM_CUMULATIVE=.FALSE.,SPARK=.FALSE.,TC=.TRUE.
20+
HISTOGRAM_CUMULATIVE=.FALSE.,SPARK=.FALSE.,TC=.TRUE.,IGNITION_ZONE=.FALSE.
2121
REAL(EB) :: PDPA_START=0._EB,PDPA_END=1.E6_EB,PDPA_RADIUS=0.1_EB
2222
REAL(EB), ALLOCATABLE, DIMENSION(:) :: TABLE_ROW, V_FACTOR
2323
INTEGER :: PART_INDEX=-1,FLOW_RAMP_INDEX,SPRAY_PATTERN_INDEX,Z_INDEX=-999,Y_INDEX=-999,PRESSURE_RAMP_INDEX

Source/dump.f90

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7316,7 +7316,7 @@ REAL(EB) RECURSIVE FUNCTION GAS_PHASE_OUTPUT(T,DT,NM,II,JJ,KK,IND,IND2,Y_INDEX,Z
73167316
USE PHYSICAL_FUNCTIONS, ONLY: GET_MASS_FRACTION,FED,FIC,GET_SPECIFIC_HEAT,RELATIVE_HUMIDITY, &
73177317
GET_CONDUCTIVITY,GET_MOLECULAR_WEIGHT,GET_MASS_FRACTION_ALL,GET_ENTHALPY,GET_SENSIBLE_ENTHALPY, &
73187318
GET_VISCOSITY,GET_POTENTIAL_TEMPERATURE,GET_SPECIFIC_GAS_CONSTANT,&
7319-
SURFACE_DENSITY
7319+
SURFACE_DENSITY, CALC_EQUIV_RATIO
73207320
USE COMP_FUNCTIONS, ONLY : CURRENT_TIME,SYSTEM_MEM_USAGE
73217321
USE RADCONS, ONLY: WL_LOW, WL_HIGH, RADTMP
73227322
USE RAD, ONLY: BLACKBODY_FRACTION
@@ -7974,6 +7974,10 @@ REAL(EB) RECURSIVE FUNCTION GAS_PHASE_OUTPUT(T,DT,NM,II,JJ,KK,IND,IND2,Y_INDEX,Z
79747974
GAS_PHASE_OUTPUT_RES = GAS_PHASE_OUTPUT_RES + &
79757975
ZZ_GET(NS)*SPECIES_MIXTURE(NS)%ATOMS(ELEM_INDX)*ELEMENT(ELEM_INDX)%MASS/SPECIES_MIXTURE(NS)%MW
79767976
ENDDO
7977+
CASE(145) ! EQUIVALENCE RATIO
7978+
ZZ_GET(1:N_TRACKED_SPECIES) = ZZ(II,JJ,KK,1:N_TRACKED_SPECIES)
7979+
GAS_PHASE_OUTPUT_RES = 0._EB
7980+
CALL CALC_EQUIV_RATIO(ZZ_GET(1:N_TRACKED_SPECIES), GAS_PHASE_OUTPUT_RES)
79777981
CASE(150) ! SUM LUMPED VOLUME FRACTIONS
79787982
ZZ_GET(1:N_TRACKED_SPECIES) = ZZ(II,JJ,KK,1:N_TRACKED_SPECIES)
79797983
CALL GET_MOLECULAR_WEIGHT(ZZ_GET,MW)
@@ -11609,10 +11613,10 @@ SUBROUTINE DUMP_CVODE_SUBSTEPS()
1160911613
DO COLI = 1, NCOLS
1161011614
IF (COLI == NCOLS) THEN
1161111615
! Writing the last column without a trailing comma
11612-
WRITE(LU_CVODE_SUBSTEPS, '(F18.5)') CVODE_SUBSTEP_DATA(ROWI, COLI)
11616+
WRITE(LU_CVODE_SUBSTEPS, '(ES12.5)') CVODE_SUBSTEP_DATA(ROWI, COLI)
1161311617
ELSE
1161411618
! Writing columns with commas
11615-
WRITE(LU_CVODE_SUBSTEPS, '(F18.5, A)', ADVANCE="NO") CVODE_SUBSTEP_DATA(ROWI, COLI), ','
11619+
WRITE(LU_CVODE_SUBSTEPS, '(ES12.5, A)', ADVANCE="NO") CVODE_SUBSTEP_DATA(ROWI, COLI), ','
1161611620
ENDIF
1161711621
ENDDO
1161811622
ENDDO

0 commit comments

Comments
 (0)