Skip to content

Commit 7542d60

Browse files
committed
FDS Source: check atom balance code
1 parent f52afc0 commit 7542d60

2 files changed

Lines changed: 126 additions & 8 deletions

File tree

Source/chem.f90

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,8 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_
845845
REAL(EB) :: H_G
846846
TYPE(USERDATA), TARGET :: USER_DATA
847847
LOGICAL :: ONLY_FIRST_STEP=.TRUE. ! Needed in CV_ONE_STEP
848+
LOGICAL :: RETURN_ORIG = .FALSE.
849+
REAL(EB) :: ZZ_CUR(N_TRACKED_SPECIES),EQUIV_CUR
848850

849851

850852
!======= INTERNALS ============
@@ -1012,8 +1014,9 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_
10121014
IF (IERR_C .NE. CV_SUCCESS) THEN
10131015
IF(IERR_C>=CVODE_ERR_CODE_MIN .AND. IERR_C<=CVODE_ERR_CODE_MAX) THEN
10141016
CVODE_WARNING_CELLS(IERR_C) = CVODE_WARNING_CELLS(IERR_C) + 1
1015-
ENDIF
1016-
IF (DEBUG) THEN
1017+
ENDIF
1018+
RETURN_ORIG = .TRUE.
1019+
!IF (DEBUG) THEN
10171020
IF (IERR_C == CV_TOO_MUCH_WORK) THEN
10181021
WRITE(LU_ERR,'(A, 2E18.8, I8, A)')" WARN: CVODE took all internal substeps. CUR_CFD_TIME, DT, MAXTRY=", CUR_CFD_TIME, &
10191022
(TEND-TCUR), MAXTRY, ". If the warning persists, reduce the timestep."
@@ -1024,17 +1027,24 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_
10241027

10251028
CALL MOLAR_CONC_TO_MASS_FRAC(CC(1:N_TRACKED_SPECIES), ZZ(1:N_TRACKED_SPECIES))
10261029
CALL CALC_EQUIV_RATIO(ZZ(1:N_TRACKED_SPECIES), EQUIV)
1030+
CALL MOLAR_CONC_TO_MASS_FRAC(CVEC_C(1:N_TRACKED_SPECIES), ZZ_CUR(1:N_TRACKED_SPECIES))
1031+
CALL CALC_EQUIV_RATIO(ZZ_CUR(1:N_TRACKED_SPECIES), EQUIV_CUR)
10271032
DO NS = 1, N_TRACKED_SPECIES
1028-
WRITE(LU_ERR,*)" ID, Y=",SPECIES_MIXTURE(NS)%ID, ZZ(NS)
1033+
WRITE(LU_ERR,*)" ID, Y, Y_CUR=",SPECIES_MIXTURE(NS)%ID, ZZ(NS),ZZ_CUR(NS)
10291034
ENDDO
1030-
WRITE(LU_ERR,*)" EQUIVALENCE RATIO, TMP=", EQUIV,TMP_IN
1035+
WRITE(LU_ERR,*)" EQUIVALENCE RATIO, TMP, EQUIV_CUR=", EQUIV,TMP_IN,EQUIV_CUR
10311036
CALL CVODESTATS(CVODE_MEM) ! DIAGNOSTICS OUTPUT
1032-
ENDIF
1037+
!ENDIF
10331038
ENDIF
10341039
ENDIF
10351040

1036-
CC = CVEC_C(1:N_TRACKED_SPECIES) !DISCARD THE TEMPERATURE.
1037-
TMP_OUT = CVEC_C(N_TRACKED_SPECIES+1)
1041+
IF (.NOT. RETURN_ORIG) THEN
1042+
CC = CVEC_C(1:N_TRACKED_SPECIES) !DISCARD THE TEMPERATURE.
1043+
TMP_OUT = CVEC_C(N_TRACKED_SPECIES+1)
1044+
ELSE
1045+
! CC no change. To avoid error in elemental mass balance.
1046+
TMP_OUT = TMP_IN
1047+
ENDIF
10381048
IERR_C = FCVODEGETLASTSTEP(CVODE_MEM, CHEM_TIME_C(1))
10391049
CHEM_TIME=CHEM_TIME_C(1)
10401050

Source/fire.f90

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,7 @@ SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_
971971
ZETA = 1._EB + Q_ALLOWED*DT/(RHO_IN * (SUM(SPECIES_MIXTURE%H_F*(ZZ_MIXED-ZZ_0))) + TWO_EPSILON_EB)
972972
ZETA = MAX(0._EB,MIN(1.0_EB,ZETA))
973973
Q_CAPPED_CELLS = Q_CAPPED_CELLS + 1
974+
WRITE(LU_ERR,*)"Capped cell."
974975
ENDIF
975976
ENDIF
976977
ENDIF
@@ -1013,7 +1014,7 @@ SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_
10131014

10141015

10151016
! Compute heat release rate
1016-
1017+
CALL PERFORM_ELEMENTAL_BALANCE(ZZ_GET,ZZ_0)
10171018
Q_OUT = -RHO_IN*SUM(SPECIES_MIXTURE%H_F*(ZZ_GET-ZZ_0))/DT ! FDS Tech Guide (5.47)
10181019

10191020
! Extinction model
@@ -1064,6 +1065,113 @@ SUBROUTINE COMBUSTION_MODEL(T,DT,ZZ_GET,Q_OUT,MIX_TIME_OUT,CHI_R_OUT,CHEM_SUBIT_
10641065

10651066
END SUBROUTINE COMBUSTION_MODEL
10661067

1068+
SUBROUTINE PERFORM_ELEMENTAL_BALANCE(ZZ_GET, ZZ_0)
1069+
USE PROPERTY_DATA
1070+
REAL(EB), INTENT(IN) :: ZZ_GET(N_TRACKED_SPECIES),ZZ_0(N_TRACKED_SPECIES)
1071+
1072+
INTEGER :: NE, NS
1073+
INTEGER :: N_ELEMENTS
1074+
REAL(EB), ALLOCATABLE :: ZZ_ELEM_GET(:), ZZ_ELEM_0(:)
1075+
REAL(EB) :: DIFF
1076+
LOGICAL :: IMBALANCE_FOUND
1077+
1078+
!-------------------------------
1079+
! Setup
1080+
!-------------------------------
1081+
N_ELEMENTS = 118
1082+
1083+
ALLOCATE(ZZ_ELEM_GET(N_ELEMENTS))
1084+
ALLOCATE(ZZ_ELEM_0(N_ELEMENTS))
1085+
1086+
ZZ_ELEM_GET = 0.0_EB
1087+
ZZ_ELEM_0 = 0.0_EB
1088+
IMBALANCE_FOUND = .FALSE.
1089+
1090+
!-------------------------------
1091+
! Compute elemental mass fractions
1092+
!-------------------------------
1093+
DO NS = 1, N_TRACKED_SPECIES
1094+
DO NE = 1, N_ELEMENTS
1095+
1096+
ZZ_ELEM_GET(NE) = ZZ_ELEM_GET(NE) + &
1097+
ZZ_GET(NS) * SPECIES_MIXTURE(NS)%ATOMS(NE) * ELEMENT(NE)%MASS / &
1098+
SPECIES_MIXTURE(NS)%MW
1099+
1100+
ZZ_ELEM_0(NE) = ZZ_ELEM_0(NE) + &
1101+
ZZ_0(NS) * SPECIES_MIXTURE(NS)%ATOMS(NE) * ELEMENT(NE)%MASS / &
1102+
SPECIES_MIXTURE(NS)%MW
1103+
1104+
END DO
1105+
END DO
1106+
1107+
!-------------------------------
1108+
! Compare elemental balances
1109+
!-------------------------------
1110+
DO NE = 1, N_ELEMENTS
1111+
1112+
IF (ZZ_ELEM_GET(NE) > 0.0_EB .OR. ZZ_ELEM_0(NE) > 0.0_EB) THEN
1113+
1114+
DIFF = ABS(ZZ_ELEM_GET(NE) - ZZ_ELEM_0(NE))
1115+
1116+
IF (DIFF > 1.0E-4_EB) THEN
1117+
IMBALANCE_FOUND = .TRUE.
1118+
!WRITE(*,'(A,I3,3E14.6)') 'Imbalance in element ', NE, &
1119+
! ZZ_ELEM_GET(NE), ZZ_ELEM_0(NE), DIFF
1120+
END IF
1121+
1122+
END IF
1123+
1124+
END DO
1125+
1126+
!-------------------------------
1127+
! Optional summary message
1128+
!-------------------------------
1129+
IF (IMBALANCE_FOUND) THEN
1130+
1131+
WRITE(LU_ERR,*) ' '
1132+
WRITE(LU_ERR,*) '*** Elemental conservation violated ***'
1133+
WRITE(LU_ERR,*) ' '
1134+
1135+
!---------------------------------------
1136+
! Elemental mass fractions
1137+
!---------------------------------------
1138+
WRITE(LU_ERR,'(A)') 'Elemental mass fractions (GET vs 0):'
1139+
WRITE(LU_ERR,'(A)') '-------------------------------------'
1140+
1141+
DO NE = 1, N_ELEMENTS
1142+
IF (ZZ_ELEM_GET(NE) > 0.0_EB .OR. ZZ_ELEM_0(NE) > 0.0_EB) THEN
1143+
WRITE(LU_ERR,'(A4,3E16.8)') TRIM(ELEMENT(NE)%ABBREVIATION), &
1144+
ZZ_ELEM_GET(NE), ZZ_ELEM_0(NE), &
1145+
ZZ_ELEM_GET(NE) - ZZ_ELEM_0(NE)
1146+
END IF
1147+
END DO
1148+
1149+
!---------------------------------------
1150+
! Species comparison
1151+
!---------------------------------------
1152+
WRITE(LU_ERR,*) ' '
1153+
WRITE(LU_ERR,'(A)') 'Species with differences (ZZ_GET vs ZZ_0):'
1154+
WRITE(LU_ERR,'(A)') '-------------------------------------------'
1155+
1156+
DO NS = 1, N_TRACKED_SPECIES
1157+
IF (ABS(ZZ_GET(NS) - ZZ_0(NS)) > 1.0E-8_EB) THEN
1158+
WRITE(LU_ERR,'(A20,3E16.8)') TRIM(SPECIES_MIXTURE(NS)%ID), &
1159+
ZZ_GET(NS), ZZ_0(NS), ZZ_GET(NS) - ZZ_0(NS)
1160+
END IF
1161+
END DO
1162+
1163+
!---------------------------------------
1164+
! Totals
1165+
!---------------------------------------
1166+
WRITE(LU_ERR,*) ' '
1167+
WRITE(LU_ERR,'(A,2E16.8)') 'Sum ZZ_GET, ZZ_0 = ', SUM(ZZ_GET), SUM(ZZ_0)
1168+
1169+
END IF
1170+
1171+
DEALLOCATE(ZZ_ELEM_GET, ZZ_ELEM_0)
1172+
1173+
END SUBROUTINE PERFORM_ELEMENTAL_BALANCE
1174+
10671175
!> \brief call cvode_interface after converting mass fraction to molar concentration.
10681176
!> \param ZZ species mass fraction array
10691177
!> \param TMP_IN is the temperature

0 commit comments

Comments
 (0)