From 2b32bb1e27ca5d13fd969f5879cf9ee5e45adde2 Mon Sep 17 00:00:00 2001 From: rmcdermo Date: Wed, 14 Aug 2024 13:13:36 -0400 Subject: [PATCH 1/3] FDS Source: use OXPYRO_MODEL by default for thermally thick solids and particles undergoing oxidative pyrolysis --- Source/cons.f90 | 2 +- Source/read.f90 | 18 ++++++++++++++---- Source/wall.f90 | 6 +++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Source/cons.f90 b/Source/cons.f90 index 726a8739294..f25bcba3016 100644 --- a/Source/cons.f90 +++ b/Source/cons.f90 @@ -267,7 +267,7 @@ MODULE GLOBAL_CONSTANTS LOGICAL :: SMOKE3D_16=.FALSE. !< Output 3D smoke values using 16 bit integers LOGICAL :: CHECK_BOUNDARY_ONE_D_ARRAYS=.FALSE. !< Flag that indicates that ONE_D array dimensions need to be checked LOGICAL :: TENSOR_DIFFUSIVITY=.FALSE. !< If true, use experimental tensor diffusivity model for spec and tmp -LOGICAL :: TEST_CHAR_MASS_TRANSFER_MODEL=.FALSE. !< Experimental flag to test mass transfer resistence in char model +LOGICAL :: OXPYRO_MODEL=.FALSE. !< Flag to use oxidative pyrolysis mass transfer model LOGICAL :: OUTPUT_WALL_QUANTITIES=.FALSE. !< Flag to force call to WALL_MODEL INTEGER, ALLOCATABLE, DIMENSION(:) :: CHANGE_TIME_STEP_INDEX !< Flag to indicate if a mesh needs to change time step diff --git a/Source/read.f90 b/Source/read.f90 index 52b3f82a341..8c47c15e6d4 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -1741,7 +1741,7 @@ SUBROUTINE READ_MISC POROUS_FLOOR,PR,PROFILING,& P_INF,RAMP_GX,RAMP_GY,RAMP_GZ,RESTART,RESTART_CHID,SC,& RND_SEED,SHARED_FILE_SYSTEM,SIMULATION_MODE,SMOKE3D_16,SMOKE_ALBEDO,SOLID_PHASE_ONLY,SOOT_DENSITY,SOOT_OXIDATION,& - TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,TEST_CHAR_MASS_TRANSFER_MODEL,TEXTURE_ORIGIN,& + TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,TEXTURE_ORIGIN,& THERMOPHORETIC_DEPOSITION,THERMOPHORETIC_SETTLING,THICKEN_OBSTRUCTIONS,& TMPA,TURBULENCE_MODEL,TURBULENT_DEPOSITION,UVW_FILE,& VERBOSE,VISIBILITY_FACTOR,VN_MAX,VN_MIN,Y_CO2_INFTY,Y_O2_INFTY,& @@ -6133,6 +6133,7 @@ SUBROUTINE PROC_PART TYPE(LAGRANGIAN_PARTICLE_CLASS_TYPE), POINTER :: LPC=>NULL() TYPE(SPECIES_TYPE),POINTER:: SS=>NULL() TYPE(SURFACE_TYPE),POINTER:: SF=>NULL() +TYPE(MATERIAL_TYPE), POINTER :: ML=>NULL() IF (N_LAGRANGIAN_CLASSES == 0) RETURN @@ -6152,7 +6153,7 @@ SUBROUTINE PROC_PART LPC%FTPR = FOTH*PI*LPC%DENSITY ENDIF - IF (SF%THERMAL_BC_INDEX==THERMALLY_THICK) THEN + THERMALLY_THICK_IF: IF (SF%THERMAL_BC_INDEX==THERMALLY_THICK) THEN LPC%INCLUDE_BOUNDARY_ONE_D_TYPE = .TRUE. MASS = 0._EB VOLUME = 0._EB @@ -6182,8 +6183,15 @@ SUBROUTINE PROC_PART LPC%INITIAL_MASS = MASS LPC%FTPR = FOTH*PI*LPC%DENSITY - IF (TEST_CHAR_MASS_TRANSFER_MODEL) LPC%INCLUDE_BOUNDARY_PROP2_TYPE = .TRUE. - ENDIF + ! Set up oxidative pyrolysis mass transfer model for thermally thick particles + + DO NN=1,SF%N_MATL + ML => MATERIAL(NN) + IF ( ANY(ML%N_O2>0._EB) ) OXPYRO_MODEL = .TRUE. + ENDDO + IF (OXPYRO_MODEL) LPC%INCLUDE_BOUNDARY_PROP2_TYPE = .TRUE. + + ENDIF THERMALLY_THICK_IF ! Exclude some convective heat transfer models from being applied to a particle @@ -9423,6 +9431,8 @@ SUBROUTINE PROC_WALL ENDIF ENDDO DENSITY_MIN = MIN(DENSITY_MIN,ML%RHO_S) + ! Set up oxidative pyrolysis mass transfer model for thermally thick solids + IF ( ANY(ML%N_O2>0._EB) ) OXPYRO_MODEL = .TRUE. ENDDO SF%SWELL_RATIO = 1._EB diff --git a/Source/wall.f90 b/Source/wall.f90 index ecec1d3a324..c675f7c9cda 100644 --- a/Source/wall.f90 +++ b/Source/wall.f90 @@ -1875,7 +1875,7 @@ SUBROUTINE SOLID_HEAT_TRANSFER(NM,T,DT_BC,PARTICLE_INDEX,WALL_INDEX,CFACE_INDEX, LP => LAGRANGIAN_PARTICLE(PARTICLE_INDEX) ONE_D => BOUNDARY_ONE_D(LP%OD_INDEX) B1 => BOUNDARY_PROP1(LP%B1_INDEX) - IF (TEST_CHAR_MASS_TRANSFER_MODEL) B2 => BOUNDARY_PROP2(LP%B2_INDEX) + IF (OXPYRO_MODEL) B2 => BOUNDARY_PROP2(LP%B2_INDEX) BC => BOUNDARY_COORD(LP%BC_INDEX) SURF_INDEX = LAGRANGIAN_PARTICLE_CLASS(LP%CLASS_INDEX)%SURF_INDEX SF => SURFACE(SURF_INDEX) @@ -2857,7 +2857,7 @@ SUBROUTINE PERFORM_PYROLYSIS ! Initialize parameters for oxidative pyrolysis mass transfer model -IF (TEST_CHAR_MASS_TRANSFER_MODEL) THEN +IF (OXPYRO_MODEL) THEN MAX_ITER=20 Y_O2_G = Y_O2_F Y_LOWER = 0._EB @@ -2935,7 +2935,7 @@ SUBROUTINE PERFORM_PYROLYSIS ENDDO POINT_LOOP1 !======== Mass transfer resistance to surface O2 concentration ============= - CHAR_MASS_TRANSFER_MODEL_IF: IF (TEST_CHAR_MASS_TRANSFER_MODEL) THEN + CHAR_MASS_TRANSFER_MODEL_IF: IF (OXPYRO_MODEL) THEN ! Solve for Y_O2_F using bounded Newton method M_DOT_ERROR_OLD = M_DOT_ERROR M_DOT_O2_PP = DOT_PRODUCT(Z2Y(O2_INDEX,1:N_TRACKED_SPECIES),M_DOT_G_PP_ACTUAL(1:N_TRACKED_SPECIES)) From db370a1ea5443040dec5e1a4a17957e73ecde6d9 Mon Sep 17 00:00:00 2001 From: rmcdermo Date: Wed, 14 Aug 2024 13:33:38 -0400 Subject: [PATCH 2/3] FDS Source: move particle B2 flag such that all classes inherit the OXPYRO variables --- Source/read.f90 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/read.f90 b/Source/read.f90 index 8c47c15e6d4..2c76a66cbb9 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -6189,7 +6189,6 @@ SUBROUTINE PROC_PART ML => MATERIAL(NN) IF ( ANY(ML%N_O2>0._EB) ) OXPYRO_MODEL = .TRUE. ENDDO - IF (OXPYRO_MODEL) LPC%INCLUDE_BOUNDARY_PROP2_TYPE = .TRUE. ENDIF THERMALLY_THICK_IF @@ -6267,6 +6266,10 @@ SUBROUTINE PROC_PART ENDDO PART_LOOP +! If we use OXPYRO_MODEL, allocate necessary boundary information for all particle classes + +IF (OXPYRO_MODEL) LAGRANGIAN_PARTICLE_CLASS(1:N_LAGRANGIAN_CLASSES)%INCLUDE_BOUNDARY_PROP2_TYPE = .TRUE. + END SUBROUTINE PROC_PART From 5ff85da7929aac4875a8a13123ffef719d46e5a4 Mon Sep 17 00:00:00 2001 From: rmcdermo Date: Wed, 14 Aug 2024 13:35:27 -0400 Subject: [PATCH 3/3] FDS Source: change IF block name --- Source/wall.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/wall.f90 b/Source/wall.f90 index c675f7c9cda..9f027b0f27e 100644 --- a/Source/wall.f90 +++ b/Source/wall.f90 @@ -2935,7 +2935,7 @@ SUBROUTINE PERFORM_PYROLYSIS ENDDO POINT_LOOP1 !======== Mass transfer resistance to surface O2 concentration ============= - CHAR_MASS_TRANSFER_MODEL_IF: IF (OXPYRO_MODEL) THEN + OXPYRO_MODEL_IF: IF (OXPYRO_MODEL) THEN ! Solve for Y_O2_F using bounded Newton method M_DOT_ERROR_OLD = M_DOT_ERROR M_DOT_O2_PP = DOT_PRODUCT(Z2Y(O2_INDEX,1:N_TRACKED_SPECIES),M_DOT_G_PP_ACTUAL(1:N_TRACKED_SPECIES)) @@ -2962,7 +2962,7 @@ SUBROUTINE PERFORM_PYROLYSIS Y_O2_F = 0.5_EB*(Y_LOWER+Y_UPPER) ENDIF DY = Y_O2_F - Y_O2_F_OLD - ENDIF CHAR_MASS_TRANSFER_MODEL_IF + ENDIF OXPYRO_MODEL_IF !=========================================================================== ENDDO O2_LOOP