@@ -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
102102INTEGER :: I,NS, ITMP
103103REAL (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
105105TYPE (REACTION_TYPE), POINTER :: RN
106106
107107TMP = 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)
208215FVEC(N_TRACKED_SPECIES+2 ) = 0._EB
209216
210-
211217END SUBROUTINE DERIVATIVE
212218
213219
@@ -336,11 +342,11 @@ SUBROUTINE JACOBIAN(CVEC,FVEC,JMAT,TN,USER_DATA)
336342
337343REAL (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)
340346REAL (EB) :: DKCDTBYKC, DBIDC(N_TRACKED_SPECIES), DBIDT, CP, DCPDT, DKINFDTMPBYKINF, DTMPDT, DG, TMPI, RHOI, CPI
341347REAL (EB) :: ZETA, MIXING_FACTOR, SUM_OMEGA_DOT, SUM_CC, SUM_OMEGA_DOT_BY_CC, SUM_CC_I, ENRG_TERM, DUMMY1, DUMMY2, DUMMY3
342348REAL (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
344350INTEGER :: I,NS, NS1, NS2, ITMP
345351TYPE (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,
792824REAL (C_DOUBLE) :: CVEC_C(N_TRACKED_SPECIES+2 ) ! N_SP + 2 (FOR TEMPERATURE AND PRESSURE)
793825REAL (C_DOUBLE) :: ATOLVEC_C(N_TRACKED_SPECIES+2 ) ! N_SP + 2
794826INTEGER (C_LONG) :: MAXSTEPS_C ! MAXIMUM NUMBER OF INTERNAL STEPS
827+ INTEGER (C_INT) :: MAXORD_C ! Maximum number of order.
795828INTEGER (C_INT64_T) :: NEQ
796829REAL (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
891924END 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
894936IERR_C = FCVODESETERRHANDLERFN(CVODE_MEM, C_FUNLOC(FDS_CVODE_ERR_HANDLER), C_NULL_PTR)
895937IF (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+
949988ENDIF
950989
951990IF (IERR_C /= 0 ) THEN
@@ -999,6 +1038,12 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, PR_IN, ZETA0, TAU_MIX, CELL_MASS, TCUR,
9991038CALL FN_VDESTROY(SUNATOL)
10001039IERR_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
10031048END SUBROUTINE CVODE_SERIAL
10041049
0 commit comments