@@ -2883,12 +2883,12 @@ SUBROUTINE PERFORM_PYROLYSIS
28832883USE PHYSICAL_FUNCTIONS, ONLY: GET_MASS_FRACTION,GET_SPECIFIC_HEAT
28842884REAL (EB), DIMENSION (N_TRACKED_SPECIES) :: M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,ZZ_GET
28852885REAL (EB), DIMENSION (MAX_MATERIALS) :: RHO_TEMP,M_DOT_S_PPP
2886- REAL (EB) :: Q_DOT_G_PPP,Q_DOT_O2_PPP,CP_FILM,TMP_FILM,H_MASS,&
2886+ REAL (EB) :: Q_DOT_G_PPP,Q_DOT_O2_PPP,CP_FILM,TMP_FILM,H_MASS,CHAR_FRONT, &
28872887 Y_O2_G,Y_O2_F,M_DOT_O2_PP,Y_LOWER,Y_UPPER,M_DOT_ERROR,M_DOT_ERROR_OLD,Y_O2_F_OLD,DY,DE
28882888REAL (EB), DIMENSION (MAX_LPC) :: Q_DOT_PART,M_DOT_PART
28892889INTEGER :: ITER,MAX_ITER
28902890LOGICAL :: REMOVE_LAYER
2891- REAL (EB), PARAMETER :: M_DOT_ERROR_TOL= 1.E-6_EB
2891+ REAL (EB), PARAMETER :: M_DOT_ERROR_TOL= 1.E-6_EB , CHAR_DENSITY_THRESHOLD = 5.7_EB ! approx. ASH_DENSITY
28922892
28932893! Get surface oxygen mass fraction
28942894
@@ -2899,6 +2899,23 @@ SUBROUTINE PERFORM_PYROLYSIS
28992899 Y_O2_F = 0._EB
29002900ENDIF
29012901
2902+ ! Determine char front position
2903+
2904+ CHAR_FRONT= 0._EB
2905+ IF (TEST_NEW_CHAR_MODEL .AND. Y_O2_F> TWO_EPSILON_EB .AND. CHAR_INDEX> 0 ) THEN
2906+ ! The new char model starts the exp profile of O2 at the CHAR_FRONT
2907+ ! Find first cell where char has not been consumed
2908+ CHAR_FRONT_POINTS_LOOP: DO I= B2% I_CHAR_FRONT,NWP
2909+ IF (ONE_D% MATL_COMP(CHAR_INDEX)% RHO(I)>CHAR_DENSITY_THRESHOLD) THEN
2910+ CHAR_FRONT= ONE_D% X(I-1 )
2911+ B2% I_CHAR_FRONT= I ! store last position to save time on next time step
2912+ EXIT CHAR_FRONT_POINTS_LOOP
2913+ ENDIF
2914+ ENDDO CHAR_FRONT_POINTS_LOOP
2915+ ENDIF
2916+
2917+ ! Initialize iterations for OXPYRO_MODEL
2918+
29022919MAX_ITER= 1
29032920
29042921! Initialize parameters for oxidative pyrolysis mass transfer model
@@ -2947,13 +2964,13 @@ SUBROUTINE PERFORM_PYROLYSIS
29472964
29482965 IF (PRESENT (PARTICLE_INDEX)) THEN
29492966 CALL PYROLYSIS(ONE_D% N_MATL,ONE_D% MATL_INDEX,SURF_INDEX,BC% IIG,BC% JJG,BC% KKG,ONE_D% TMP(I),B1% TMP_F,Y_O2_F,BC% IOR,&
2950- RHO_DOT(1 :ONE_D% N_MATL,I),RHO_TEMP(1 :ONE_D% N_MATL),ONE_D% X(I-1 ),DX_S,DT_BC_SUB,&
2967+ RHO_DOT(1 :ONE_D% N_MATL,I),RHO_TEMP(1 :ONE_D% N_MATL),ONE_D% X(I-1 ),CHAR_FRONT, DX_S,DT_BC_SUB,&
29512968 M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,M_DOT_S_PPP,Q_S(I),Q_DOT_G_PPP,Q_DOT_O2_PPP,&
29522969 Q_DOT_PART,M_DOT_PART,T_BOIL_EFF,B1% B_NUMBER,LAYER_INDEX(I),REMOVE_LAYER,ONE_D,B1,SOLID_CELL_INDEX= I,&
29532970 R_DROP= R_SURF,LPU= U_SURF,LPV= V_SURF,LPW= W_SURF)
29542971 ELSE
29552972 CALL PYROLYSIS(ONE_D% N_MATL,ONE_D% MATL_INDEX,SURF_INDEX,BC% IIG,BC% JJG,BC% KKG,ONE_D% TMP(I),B1% TMP_F,Y_O2_F,BC% IOR,&
2956- RHO_DOT(1 :ONE_D% N_MATL,I),RHO_TEMP(1 :ONE_D% N_MATL),ONE_D% X(I-1 ),DX_S,DT_BC_SUB,&
2973+ RHO_DOT(1 :ONE_D% N_MATL,I),RHO_TEMP(1 :ONE_D% N_MATL),0.5 * ( ONE_D% X(I-1 )+ ONE_D % X(I)),CHAR_FRONT ,DX_S,DT_BC_SUB,&
29572974 M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,M_DOT_S_PPP,Q_S(I),Q_DOT_G_PPP,Q_DOT_O2_PPP,&
29582975 Q_DOT_PART,M_DOT_PART,T_BOIL_EFF,B1% B_NUMBER,LAYER_INDEX(I),REMOVE_LAYER,ONE_D,B1,SOLID_CELL_INDEX= I)
29592976 ENDIF
@@ -3040,6 +3057,7 @@ END SUBROUTINE SOLID_HEAT_TRANSFER
30403057! > \param RHO_DOT_OUT (1:N_MATS) Array of component reaction rates (kg/m3/s)
30413058! > \param RHO_S (1:N_MATS) Array of component densities (kg/m3)
30423059! > \param DEPTH Distance from surface (m)
3060+ ! > \param CHAR_FRONT Distance from surface to start of char front (m)
30433061! > \param DX_S Array of node sizes (m)
30443062! > \param DT_BC Time step used by the solid phase solver (s)
30453063! > \param M_DOT_G_PPP_ADJUST (1:N_TRACKED_SPECIES) Adjusted mass generation rate per unit volume of the gas species
@@ -3062,7 +3080,8 @@ END SUBROUTINE SOLID_HEAT_TRANSFER
30623080! > \param LPV (OPTIONAL) y component of droplet velocity (m/s)
30633081! > \param LPW (OPTIONAL) z component of droplet velocity (m/s)
30643082
3065- SUBROUTINE PYROLYSIS (N_MATS ,MATL_INDEX ,SURF_INDEX ,IIG ,JJG ,KKG ,TMP_S ,TMP_F ,Y_O2_F ,IOR ,RHO_DOT_OUT ,RHO_S ,DEPTH ,DX_S ,DT_BC ,&
3083+ SUBROUTINE PYROLYSIS (N_MATS ,MATL_INDEX ,SURF_INDEX ,IIG ,JJG ,KKG ,TMP_S ,TMP_F ,Y_O2_F ,IOR ,&
3084+ RHO_DOT_OUT ,RHO_S ,DEPTH ,CHAR_FRONT ,DX_S ,DT_BC ,&
30663085 M_DOT_G_PPP_ADJUST ,M_DOT_G_PPP_ACTUAL ,M_DOT_S_PPP ,Q_DOT_S_PPP ,Q_DOT_G_PPP ,Q_DOT_O2_PPP ,&
30673086 Q_DOT_PART ,M_DOT_PART ,T_BOIL_EFF ,B_NUMBER ,LAYER_INDEX ,REMOVE_LAYER ,ONE_D ,B1 ,SOLID_CELL_INDEX ,&
30683087 R_DROP ,LPU ,LPV ,LPW )
@@ -3075,7 +3094,7 @@ SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F
30753094INTEGER , INTENT (IN ), OPTIONAL :: SOLID_CELL_INDEX
30763095LOGICAL , INTENT (IN ) :: REMOVE_LAYER
30773096REAL (EB), INTENT (OUT ), DIMENSION (:,:) :: RHO_DOT_OUT(N_MATS)
3078- REAL (EB), INTENT (IN ) :: TMP_S,TMP_F,DT_BC,DEPTH,RHO_S(N_MATS),Y_O2_F
3097+ REAL (EB), INTENT (IN ) :: TMP_S,TMP_F,DT_BC,DEPTH,RHO_S(N_MATS),Y_O2_F,CHAR_FRONT
30793098REAL (EB), INTENT (IN ), OPTIONAL :: R_DROP,LPU,LPV,LPW
30803099REAL (EB), INTENT (IN ), DIMENSION (NWP_MAX) :: DX_S
30813100REAL (EB), DIMENSION (:) :: ZZ_GET(1 :N_TRACKED_SPECIES),Y_ALL(1 :N_SPECIES)
@@ -3358,7 +3377,7 @@ SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F
33583377 ! Calculate oxygen volume fraction at the surface
33593378 X_O2 = SPECIES(O2_INDEX)% RCON* Y_O2_F/ RSUM(IIG,JJG,KKG)
33603379 ! Calculate oxygen concentration inside the material, assuming decay function
3361- X_O2 = X_O2 * EXP (- DEPTH/ (TWO_EPSILON_EB+ ML% GAS_DIFFUSION_DEPTH(J)))
3380+ X_O2 = X_O2 * EXP (- MAX ( 0._EB , DEPTH- CHAR_FRONT) / (TWO_EPSILON_EB+ ML% GAS_DIFFUSION_DEPTH(J)))
33623381 REACTION_RATE = REACTION_RATE * X_O2** ML% N_O2(J)
33633382 ENDIF
33643383 REACTION_RATE = MIN (REACTION_RATE,ML% MAX_REACTION_RATE(J)) ! User-specified limit
0 commit comments