Skip to content

Commit b9a4d01

Browse files
authored
Merge pull request #14804 from cxp484/master
FDS Source: Handle reaction exponent <1.
2 parents 4190be1 + a78655a commit b9a4d01

File tree

3 files changed

+70
-15
lines changed

3 files changed

+70
-15
lines changed

Source/chem.f90

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ SUBROUTINE DERIVATIVE(CVEC,FVEC, TN, USER_DATA)
101101
K_0, K_INF, P_RI, FCENT, B_I, RRTMP, THIRD_BODY_ENHANCEMENT, PR
102102
INTEGER :: I,NS, ITMP
103103
REAL(EB) :: ZZ(N_TRACKED_SPECIES), CP, HS_I, DG, TMPI
104-
REAL(EB) :: ZETA, MIXING_FACTOR, VOL_CHANGE_TERM, SUM_OMEGA_DOT, SUM_CC, MW0, MW, SUM_H_ZZ0
104+
REAL(EB) :: ZETA, MIXING_FACTOR, VOL_CHANGE_TERM, SUM_OMEGA_DOT, SUM_CC, MW0, MW, SUM_H_ZZ0, EXPONENT, CONC
105105
TYPE(REACTION_TYPE), POINTER :: RN
106106

107107
TMP = MAX(CVEC(N_TRACKED_SPECIES+1), MIN_CHEM_TMP)
@@ -144,7 +144,14 @@ SUBROUTINE DERIVATIVE(CVEC,FVEC, TN, USER_DATA)
144144
! MULTIPLY WITH MOLAR_CONCENTRATION ^ STOICHIOMETRIC_COEFF
145145
DO NS=1,RN%N_SPEC
146146
IF (CVEC(YP2ZZ(RN%N_S_INDEX(NS))) < MIN_SPEC(YP2ZZ(RN%N_S_INDEX(NS)))) CYCLE REACTION_LOOP
147-
R_F = R_F*(CVEC(YP2ZZ(RN%N_S_INDEX(NS))))**RN%N_S(NS)
147+
EXPONENT = RN%N_S(NS)
148+
CONC = CVEC(YP2ZZ(RN%N_S_INDEX(NS)))
149+
IF (EXPONENT < 1._EB) THEN
150+
R_F = R_F * CONC**(EXPONENT - 1._EB)
151+
R_F = R_F * CONC
152+
ELSE
153+
R_F = R_F * CONC**EXPONENT
154+
END IF
148155
ENDDO
149156

150157
! CALCULATE B_I BASED ON TYPE OF REACTION
@@ -207,7 +214,6 @@ SUBROUTINE DERIVATIVE(CVEC,FVEC, TN, USER_DATA)
207214
! PRESSURE DERIVATIVE (CONSTANT PRESSURE ASSUMPTION)
208215
FVEC(N_TRACKED_SPECIES+2) = 0._EB
209216

210-
211217
END SUBROUTINE DERIVATIVE
212218

213219

@@ -336,11 +342,11 @@ SUBROUTINE JACOBIAN(CVEC,FVEC,JMAT,TN,USER_DATA)
336342

337343
REAL(EB) :: R_F,DCVEC1,DCVEC2, MIN_SPEC(N_TRACKED_SPECIES), KG, TMP, RHO, &
338344
K_0, K_INF, P_RI, FCENT, B_I, RRTMP, THIRD_BODY_ENHANCEMENT, PR
339-
REAL(EB) :: ZZ(N_TRACKED_SPECIES), CP_I(N_TRACKED_SPECIES), HS_I(N_TRACKED_SPECIES)
345+
REAL(EB) :: ZZ(N_TRACKED_SPECIES), CP_I(N_TRACKED_SPECIES), HS_I(N_TRACKED_SPECIES)
340346
REAL(EB) :: DKCDTBYKC, DBIDC(N_TRACKED_SPECIES), DBIDT, CP, DCPDT, DKINFDTMPBYKINF, DTMPDT, DG, TMPI, RHOI, CPI
341347
REAL(EB) :: ZETA, MIXING_FACTOR, SUM_OMEGA_DOT, SUM_CC, SUM_OMEGA_DOT_BY_CC, SUM_CC_I, ENRG_TERM, DUMMY1, DUMMY2, DUMMY3
342348
REAL(EB) :: VOL_CHANGE_TERM1, VOL_CHANGE_TERM2, VOL_CHANGE_TERM3, VOL_CHANGE_TERM, SUM_DOMEGA_DOT_BY_DT, MW0, MW, &
343-
SUM_CP_ZZ0,SUM_H_ZZ0
349+
SUM_CP_ZZ0,SUM_H_ZZ0, EXPONENT, CONC, CONC_EXP
344350
INTEGER :: I,NS, NS1, NS2, ITMP
345351
TYPE(REACTION_TYPE), POINTER :: RN
346352

@@ -391,10 +397,8 @@ SUBROUTINE JACOBIAN(CVEC,FVEC,JMAT,TN,USER_DATA)
391397
DKCDTBYKC = ((RN%DELTA_G(MIN(I_MAX_TEMP,NINT(TMP)))*TMPI + RN%DELTA_S(MIN(I_MAX_TEMP,NINT(TMP))))+RN%C0_EXP)*TMPI
392398
ENDIF
393399

394-
! MULTIPLY WITH MOLAR_CONCENTRATION ^ STOICHIOMETRIC_COEFF
395400
DO NS=1,RN%N_SPEC
396401
IF (CVEC(YP2ZZ(RN%N_S_INDEX(NS))) < MIN_SPEC(YP2ZZ(RN%N_S_INDEX(NS)))) CYCLE REACTION_LOOP
397-
R_F = R_F*(CVEC(YP2ZZ(RN%N_S_INDEX(NS))))**RN%N_S(NS)
398402
ENDDO
399403

400404

@@ -431,13 +435,41 @@ SUBROUTINE JACOBIAN(CVEC,FVEC,JMAT,TN,USER_DATA)
431435

432436
!Contribution of qi
433437
DO NS1 = 1, RN%N_SPEC
438+
! MULTIPLY WITH MOLAR_CONCENTRATION ^ STOICHIOMETRIC_COEFF
439+
CONC_EXP = 1.0_EB
440+
DO NS2=1,RN%N_SPEC
441+
EXPONENT = RN%N_S(NS2)
442+
CONC = CVEC(YP2ZZ(RN%N_S_INDEX(NS2)))
443+
IF (NS2 == NS1) THEN
444+
CONC_EXP = CONC_EXP * MERGE((CONC+TWO_EPSILON_EB)**(EXPONENT - 1._EB), CONC**(EXPONENT - 1._EB), EXPONENT < 1._EB)
445+
ELSE
446+
IF (EXPONENT < 1._EB) THEN
447+
CONC_EXP = CONC_EXP * CONC * (CONC+TWO_EPSILON_EB)**(EXPONENT - 1._EB)
448+
ELSE
449+
CONC_EXP = CONC_EXP * CONC**EXPONENT
450+
END IF
451+
ENDIF
452+
ENDDO
453+
434454
DO NS=1,RN%N_SMIX_FR
435-
DCVEC1 = R_F*RN%NU_NN(RN%NU_INDEX(NS))*RN%N_S(NS1)/CVEC(YP2ZZ(RN%N_S_INDEX(NS1)))
455+
DCVEC1 = R_F*CONC_EXP*RN%NU_NN(RN%NU_INDEX(NS))*RN%N_S(NS1)
436456
JMAT((YP2ZZ(RN%N_S_INDEX(NS1))),RN%NU_INDEX(NS)) = &
437457
JMAT((YP2ZZ(RN%N_S_INDEX(NS1))),RN%NU_INDEX(NS))+ DCVEC1
438458
ENDDO
439459
ENDDO
440460

461+
! CALCULATE THE REACTION RATE
462+
DO NS=1,RN%N_SPEC
463+
EXPONENT = RN%N_S(NS)
464+
CONC = CVEC(YP2ZZ(RN%N_S_INDEX(NS)))
465+
IF (EXPONENT < 1._EB) THEN
466+
R_F = R_F * CONC**(EXPONENT - 1._EB)
467+
R_F = R_F * CONC
468+
ELSE
469+
R_F = R_F * CONC**EXPONENT
470+
END IF
471+
ENDDO
472+
441473
! Add contribution of C_I
442474
IF (RN%THIRD_BODY) THEN
443475
DO NS = 1,N_TRACKED_SPECIES
@@ -792,6 +824,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
792824
REAL(C_DOUBLE) :: CVEC_C(N_TRACKED_SPECIES+2) ! N_SP + 2 (FOR TEMPERATURE AND PRESSURE)
793825
REAL(C_DOUBLE) :: ATOLVEC_C(N_TRACKED_SPECIES+2) ! N_SP + 2
794826
INTEGER(C_LONG) :: MAXSTEPS_C ! MAXIMUM NUMBER OF INTERNAL STEPS
827+
INTEGER(C_INT) :: MAXORD_C ! Maximum number of order.
795828
INTEGER(C_INT64_T) :: NEQ
796829
REAL(C_DOUBLE) :: CHEM_TIME_C(1) ! OUTPUT CHEMICAL TIME
797830

@@ -890,6 +923,15 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
890923
STOP 1
891924
END IF
892925

926+
! SET MAX ORDER
927+
MAXORD_C = 5
928+
IF (IS_EXPONENT_LT_1) MAXORD_C = 1
929+
IERR_C = FCVODESETMAXORD(CVODE_MEM, MAXORD_C)
930+
IF (IERR_C /= 0) THEN
931+
WRITE(LU_ERR,*) 'ERROR IN FCVODESETMAXORD, IERR = ', IERR_C, '; HALTING'
932+
STOP 1
933+
END IF
934+
893935
! SET ERROR HANDLER
894936
IERR_C = FCVODESETERRHANDLERFN(CVODE_MEM, C_FUNLOC(FDS_CVODE_ERR_HANDLER), C_NULL_PTR)
895937
IF (IERR_C /= 0) THEN
@@ -920,7 +962,8 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
920962
ONLY_FIRST_STEP = .TRUE.
921963
IF (WRITE_SUBSTEPS) THEN ! This WRITE_SUBSTEPS is only true for few verification cases.
922964
ONLY_FIRST_STEP = .FALSE.
923-
ALLOCATE(CVODE_SUBSTEP_DATA((CVODE_MAX_TRY+1)*MAX_CVODE_SUBSTEPS, N_TRACKED_SPECIES+4))
965+
IF (.NOT. ALLOCATED(CVODE_SUBSTEP_DATA)) &
966+
ALLOCATE(CVODE_SUBSTEP_DATA((CVODE_MAX_TRY+1)*MAX_CVODE_SUBSTEPS, N_TRACKED_SPECIES+4))
924967
ENDIF
925968

926969
SUBSTEP_COUNT = 0
@@ -941,11 +984,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
941984
ENDIF
942985
END DO
943986

944-
IF (WRITE_SUBSTEPS) THEN
945-
TOTAL_SUBSTEPS_TAKEN = SUBSTEP_COUNT
946-
STOP_STATUS=CVODE_SUBSTEP_STOP
947-
RETURN
948-
ENDIF
987+
949988
ENDIF
950989

951990
IF (IERR_C /= 0) THEN
@@ -999,6 +1038,12 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
9991038
CALL FN_VDESTROY(SUNATOL)
10001039
IERR_C = FSUNCONTEXT_FREE(SUNCTX)
10011040

1041+
IF (WRITE_SUBSTEPS) THEN
1042+
TOTAL_SUBSTEPS_TAKEN = SUBSTEP_COUNT
1043+
STOP_STATUS=CVODE_SUBSTEP_STOP
1044+
RETURN
1045+
ENDIF
1046+
10021047

10031048
END SUBROUTINE CVODE_SERIAL
10041049

Source/cons.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,7 @@ MODULE CHEMCONS
894894
INTEGER :: MAX_CVODE_SUBSTEPS=100000
895895
REAL(EB) :: MAX_CHEM_TIME=1.E-6_EB
896896
INTEGER :: CVODE_MAX_TRY=4
897+
LOGICAL :: IS_EXPONENT_LT_1 = .FALSE.
897898

898899
! FOR WRITING CVODE SUBSTEPS
899900
LOGICAL :: WRITE_CVODE_SUBSTEPS = .FALSE.

Source/read.f90

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5061,7 +5061,7 @@ END SUBROUTINE READ_REAC
50615061

50625062

50635063
SUBROUTINE PROC_REAC_1
5064-
USE CHEMCONS, ONLY: YP2ZZ
5064+
USE CHEMCONS, ONLY: YP2ZZ, IS_EXPONENT_LT_1
50655065
USE PROPERTY_DATA, ONLY : PARSE_EQUATION, SHUTDOWN_ATOM
50665066
REAL(EB) :: MASS_PRODUCT,MASS_REACTANT,REACTION_BALANCE(118),NU_Y(N_SPECIES)
50675067
INTEGER :: NS,NS2, NR
@@ -5284,6 +5284,15 @@ SUBROUTINE PROC_REAC_1
52845284
ENDIF
52855285
ENDDO
52865286

5287+
IF(TRIM(ODE_SOLVER)=='CVODE' .AND. .NOT. IS_EXPONENT_LT_1) THEN
5288+
DO NS=1,RN%N_SPEC
5289+
IF (RN%N_S(NS) .LT. 1) THEN
5290+
IS_EXPONENT_LT_1 = .TRUE.
5291+
WRITE(LU_ERR,*)"Info: CVODE solver order set to 1 because one of the reaction involves exponent < 1.0. "
5292+
EXIT
5293+
ENDIF
5294+
ENDDO
5295+
ENDIF
52875296

52885297
! Normalize the stoichiometric coefficients by that of the fuel.
52895298
RN%NU_FUEL_0 = -RN%NU(RN%FUEL_SMIX_INDEX)

0 commit comments

Comments
 (0)