@@ -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 )
803804USE PHYSICAL_FUNCTIONS, ONLY : MOLAR_CONC_TO_MASS_FRAC, CALC_EQUIV_RATIO, GET_ENTHALPY, GET_MOLECULAR_WEIGHT
804805USE 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,
813814USE FSUNDIALS_NVECTOR_MOD ! FORTRAN INTERFACE TO GENERIC N_VECTOR
814815
815816REAL (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
817818REAL (EB), INTENT (IN ) :: ATOL(N_TRACKED_SPECIES)
818819REAL (EB), INTENT (IN ) :: RTOL
819820REAL (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,
841842TYPE (C_PTR) :: USERDATAPTR ! USER DATA CONTAINS MIXING INFORMATION
842843
843844REAL (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
845846REAL (EB) :: H_G
846847TYPE (USERDATA), TARGET :: USER_DATA
847848LOGICAL :: 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,
948949USER_DATA% CELL_MASS = CELL_MASS
949950ALLOCATE (USER_DATA% ZZ_0(N_TRACKED_SPECIES))
950951USER_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 )
952953USER_DATA% H_IN = H_IN
953954USERDATAPTR = C_LOC(USER_DATA)
954955IERR_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-
991991ENDIF
992992
993993IF (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."
0 commit comments