From 7e15d89613a50bba2efd71150de3a75855676acd Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 6 Jun 2024 16:14:20 -0600 Subject: [PATCH 01/57] Add capability to run idealized simulations --- driver/fire_behavior.F90 | 18 ++++- driver/initialize_mod.F90 | 25 ++++--- io/namelist_mod.F90 | 114 +++++++++++++++++++++++++++++++- state/state_mod.F90 | 135 ++++++++++++++++++++++++++++---------- tests/test7/namelist.fire | 2 + tests/test8/namelist.fire | 2 + tests/testx/namelist.fire | 2 + 7 files changed, 250 insertions(+), 48 deletions(-) diff --git a/driver/fire_behavior.F90 b/driver/fire_behavior.F90 index 22b8a9e..78480e0 100644 --- a/driver/fire_behavior.F90 +++ b/driver/fire_behavior.F90 @@ -17,6 +17,7 @@ program fire_behavior type (wrf_t) :: atm_state type (namelist_t) :: config_flags + #ifdef DM_PARALLEL call mpi_init (ierr) if (ierr /= MPI_SUCCESS) then @@ -28,14 +29,25 @@ program fire_behavior ! Read namelist call config_flags%Initialization (file_name = 'namelist.fire') - call Init_atm_state (atm_state, config_flags) - call Init_fire_state (grid, config_flags, atm_state) + select case (config_flags%ideal_opt) + case (0) + call Init_atm_state (atm_state, config_flags) + call Init_fire_state (grid, config_flags, atm_state) + + case (1) + call Init_fire_state (grid, config_flags) + + case default + write (ERROR_UNIT, *) 'ERROR: ideal_opt option not supported: ', config_flags%ideal_opt + stop + + end select call grid%Save_state () do while (grid%datetime_now < grid%datetime_end) call Advance_state (grid, config_flags) call grid%Handle_output (config_flags) - call grid%Handle_wrfdata_update (atm_state, config_flags) + if (config_flags%ideal_opt == 0) call grid%Handle_wrfdata_update (atm_state, config_flags) end do #ifdef DM_PARALLEL diff --git a/driver/initialize_mod.F90 b/driver/initialize_mod.F90 index 0c500a1..e44d15b 100644 --- a/driver/initialize_mod.F90 +++ b/driver/initialize_mod.F90 @@ -46,20 +46,25 @@ subroutine Init_fire_state (grid, config_flags, wrf) if (DEBUG_LOCAL) call Print_message (' Entering subroutine Init_state') - ! Fire state initialization - if (DEBUG_LOCAL) call Print_message (' Reading geogrid file') - geogrid = geogrid_t (file_name = 'geo_em.d01.nc') + if (DEBUG_LOCAL) call Print_message (' Initialization...') + if (config_flags%ideal_opt == 0) then + ! Real world + if (DEBUG_LOCAL) call Print_message (' Reading geogrid file') + geogrid = geogrid_t (file_name = 'geo_em.d01.nc') - if (DEBUG_LOCAL) call Print_message (' Initializing state') - call grid%Initialization (config_flags, geogrid) + if (DEBUG_LOCAL) call Print_message (' Initializing fire state') + call grid%Initialization (config_flags, geogrid) - ! Atmosphere to Fire - if (present (wrf)) then - if (DEBUG_LOCAL) call Print_message (' Initializing atmospheric state') - call grid%Handle_wrfdata_update (wrf, config_flags) + if (present (wrf)) then + if (DEBUG_LOCAL) call Print_message (' Initializing atmospheric state') + call grid%Handle_wrfdata_update (wrf, config_flags) + end if + else + ! Ideal + if (DEBUG_LOCAL) call Print_message (' Initializing fire state') + call grid%Initialization (config_flags) end if - ! Fire init call Init_fire_components (grid, config_flags) if (DEBUG_LOCAL) then diff --git a/io/namelist_mod.F90 b/io/namelist_mod.F90 index cc1cdda..44c15a2 100644 --- a/io/namelist_mod.F90 +++ b/io/namelist_mod.F90 @@ -9,6 +9,12 @@ module namelist_mod public :: namelist_t, FIRE_MAX_IGNITIONS_IN_NAMELIST integer, parameter :: FIRE_MAX_IGNITIONS_IN_NAMELIST = 5 + ! Default ideal block + real, parameter :: DX_DEFAULT = 100.0, U_DEFAULT = 5.0, V_DEFAULT = 0.0, LAT_DEFAULT = 40.3636, LON_DEFAULT = -4.4035, & + DZ_DX_DEFAULT = 0.0, ELEVATION_DEFAULT = 0.0 + integer, parameter :: IDEAL_OPT_DEFAULT = 0, NX_DEFAULT = 100, FUEL_CAT_DEFAULT = 1 + ! Default options + integer, parameter :: NO_FMC_MODEL = -1 type :: namelist_t integer :: start_year = -1, start_month = -1, start_day = -1, start_hour = -1, start_minute = -1, start_second = -1, & @@ -51,7 +57,7 @@ module namelist_mod ! Objects integer :: fuel_opt = 1 ! Fuel model integer :: ros_opt = 0 ! ROS parameterization - integer :: fmc_opt = -1 ! FMC model + integer :: fmc_opt = NO_FMC_MODEL ! FMC model ! Ignitions integer :: fire_num_ignitions = 0 ! "number of ignition lines" @@ -101,17 +107,50 @@ module namelist_mod real :: fire_ignition_end_time5 = 0.0 real :: fire_ignition_radius5 = 0.0 + ! Ideal block + integer :: ideal_opt = IDEAL_OPT_DEFAULT ! 0) real world, 1) ideal + real :: dx = DX_DEFAULT + real :: dy = DX_DEFAULT + integer :: nx = NX_DEFAULT + integer :: ny = NX_DEFAULT + + real :: zonal_wind = U_DEFAULT + real :: meridional_wind = V_DEFAULT + integer :: fuel_cat = FUEL_CAT_DEFAULT + real :: dz_dx = DZ_DX_DEFAULT + real :: dz_dy = DZ_DX_DEFAULT + real :: elevation = ELEVATION_DEFAULT + + real :: cen_lat = LAT_DEFAULT + real :: cen_lon = LON_DEFAULT + real :: stand_lon = LON_DEFAULT + real :: true_lat_1 = LAT_DEFAULT + real :: true_lat_2 = LAT_DEFAULT + ! Atmosphere integer :: kds = 1, kde = 1 contains + procedure, public :: Check_nml => Check_nml procedure, public :: Initialization => Init_namelist procedure, public :: Init_fire_block => Init_fire_block + procedure, public :: Init_ideal_block => Init_ideal_block procedure, public :: Init_time_block => Init_time_block procedure, public :: Init_atm_block => Init_atm_block_legacy end type namelist_t contains + subroutine Check_nml (this) + + implicit none + + class (namelist_t), intent (in out) :: this + + if (this%ideal_opt /= 0 .and. this%fmoist_run) & + call Stop_simulation ('ideal runs do not support a FMC model') + + end subroutine Check_nml + subroutine Init_atm_block_legacy (this, file_name) implicit none @@ -329,6 +368,76 @@ subroutine Init_fire_block (this, file_name) end subroutine Init_fire_block + subroutine Init_ideal_block (this, file_name) + + implicit none + + class (namelist_t), intent (in out) :: this + character (len = *), intent (in) :: file_name + + real :: dx, dy, zonal_wind, meridional_wind, cen_lat, cen_lon, stand_lon, true_lat_1, true_lat_2, & + dz_dx, dz_dy, elevation + integer :: nx, ny, fuel_cat, ideal_opt + + character (len = :), allocatable :: msg + integer :: unit_nml, io_stat + + namelist /ideal/ ideal_opt, dx, dy, nx, ny, zonal_wind, meridional_wind, fuel_cat, & + dz_dx, dz_dy, elevation, cen_lat, cen_lon, stand_lon, true_lat_1, true_lat_2 + + + ! Set default values + ideal_opt = IDEAL_OPT_DEFAULT + dx = DX_DEFAULT + dy = DX_DEFAULT + nx = NX_DEFAULT + ny = NX_DEFAULT + + zonal_wind = U_DEFAULT + meridional_wind = V_DEFAULT + fuel_cat = FUEL_CAT_DEFAULT + dz_dx = DZ_DX_DEFAULT + dz_dy = DZ_DX_DEFAULT + elevation = ELEVATION_DEFAULT + + cen_lat = LAT_DEFAULT + cen_lon = LON_DEFAULT + stand_lon = LON_DEFAULT + true_lat_1 = LAT_DEFAULT + true_lat_2 = LAT_DEFAULT + + open (newunit = unit_nml, file = trim (file_name), action = 'read', iostat = io_stat) + if (io_stat /= 0) then + msg = 'Problems opening namelist file ' // trim (file_name) + call Stop_simulation (msg) + end if + + read (unit_nml, nml = ideal, iostat = io_stat) + if (io_stat /= 0) call Stop_simulation ('Problems reading namelist ideal block') + close (unit_nml) + + this%ideal_opt = ideal_opt + this%dx = dx + this%dy = dy + + this%nx = nx + this%ny = ny + + this%zonal_wind = zonal_wind + this%meridional_wind = meridional_wind + this%fuel_cat = fuel_cat + this%dz_dx = dz_dx + this%dz_dy = dz_dy + this%elevation = elevation + + this%cen_lat = cen_lat + this%cen_lon = cen_lon + this%stand_lon = stand_lon + this%true_lat_1 = true_lat_1 + this%true_lat_2 = true_lat_2 + + end subroutine Init_ideal_block + subroutine Init_time_block (this, file_name) implicit none @@ -409,6 +518,9 @@ subroutine Init_namelist (this, file_name) call this%Init_time_block (file_name = trim (file_name)) call this%Init_fire_block (file_name = trim (file_name)) call this%Init_atm_block (file_name = trim (file_name)) + call this%Init_ideal_block (file_name = trim (file_name)) + + call this%Check_nml () if (DEBUG_LOCAL) call Print_message (' Leaving subroutine Read_namelist') diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 64d333c..1558ed6 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -180,17 +180,50 @@ subroutine Init_domain (this, config_flags, geogrid) class (state_fire_t), intent(in out) :: this type (namelist_t), intent (in) :: config_flags - type (geogrid_t), intent (in) :: geogrid + type (geogrid_t), intent (in), optional :: geogrid logical, parameter :: DEBUG_LOCAL = .false. - integer :: ids0, ide0, jds0, jde0 + integer :: ids0, ide0, jds0, jde0, i, j + type (proj_lc_t) :: proj + logical :: is_ideal_sim + + if (present (geogrid)) then + is_ideal_sim = .false. + else + is_ideal_sim = .true. + end if ! Domain dimensions - ids0 = geogrid%ifds - ide0 = geogrid%ifde - jds0 = geogrid%jfds - jde0 = geogrid%jfde + Ideal_sim1: if (is_ideal_sim) then + ids0 = 1 + ide0 = config_flags%nx + jds0 = 1 + jde0 = config_flags%ny + + this%dx = config_flags%dx + this%dy = config_flags%dy + + this%cen_lat = config_flags%cen_lat + this%cen_lon = config_flags%cen_lon + + proj = proj_lc_t (cen_lat = this%cen_lat , cen_lon = this%cen_lon, dx = this%dx, dy = this%dy, & + standard_lon = config_flags%stand_lon, true_lat_1 = config_flags%true_lat_1, & + true_lat_2 = config_flags%true_lat_2, nx = config_flags%nx, ny = config_flags%ny) + else + ids0 = geogrid%ifds + ide0 = geogrid%ifde + jds0 = geogrid%jfds + jde0 = geogrid%jfde + + this%dx = geogrid%dx / geogrid%sr_x + this%dy = geogrid%dy / geogrid%sr_y + + this%cen_lat = geogrid%cen_lat + this%cen_lon = geogrid%cen_lon + + proj = geogrid%Get_atm_proj () + end if Ideal_sim1 this%ifds = ids0 this%ifde = ide0 @@ -227,11 +260,6 @@ subroutine Init_domain (this, config_flags, geogrid) this%datetime_next_atm_update = this%datetime_start - this%cen_lat = geogrid%cen_lat - this%cen_lon = geogrid%cen_lon - - this%dx = geogrid%dx / geogrid%sr_x - this%dy = geogrid%dy / geogrid%sr_y if (DEBUG_LOCAL) call this%Print() @@ -240,8 +268,6 @@ subroutine Init_domain (this, config_flags, geogrid) allocate (this%uf(this%ifms:this%ifme, this%jfms:this%jfme)) allocate (this%vf(this%ifms:this%ifme, this%jfms:this%jfme)) - this%uf = 0. - this%vf = 0. allocate (this%fmc_g(this%ifms:this%ifme, this%jfms:this%jfme)) this%fmc_g = config_flags%fuelmc_g @@ -301,12 +327,35 @@ subroutine Init_domain (this, config_flags, geogrid) allocate (this%emis_smoke(this%ifms:this%ifme, this%jfms:this%jfme)) this%emis_smoke = 0.0 - this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations - this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs - this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dys - this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%fuel_cats + Ideal_sim2: if (is_ideal_sim) then + do j = this%jfds, this%jfde + do i = this%ifds, this%ifde + this%zsf(i, j) = config_flags%elevation + & + (i - this%ifds) * config_flags%dz_dx * config_flags%dx + & + (j - this%jfds) * config_flags%dz_dy * config_flags%dy + end do + end do + this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dx + this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dy + this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%fuel_cat + + this%uf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%zonal_wind + this%vf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%meridional_wind + + call this%Init_latlons (proj) + else + this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations + this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs + this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dys + this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%fuel_cats + + this%uf = 0.0 + this%vf = 0.0 - if (config_flags%fire_is_real_perim) then + call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) + end if Ideal_sim2 + + if (config_flags%fire_is_real_perim .and. .not. is_ideal_sim) then if (allocated (geogrid%lfn_init)) then this%lfn_hist(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%lfn_init else @@ -316,7 +365,6 @@ subroutine Init_domain (this, config_flags, geogrid) this%unit_fxlat = 2.0 * PI / (360.0 * RERADIUS) ! earth circumference in m / 360 degrees this%unit_fxlong = cos (this%cen_lat * 2.0 * PI / 360.0) * this%unit_fxlat ! latitude - call this%Init_latlons (geogrid) call this%Init_tiles (config_flags) @@ -371,33 +419,46 @@ subroutine Init_ignition_lines (this, config_flags) end subroutine Init_ignition_lines - subroutine Init_latlons (this, geogrid) + subroutine Init_latlons (this, proj, srx, sry) implicit none class (state_fire_t), intent (in out) :: this - type (geogrid_t), intent(in) :: geogrid +! type (geogrid_t), intent(in) :: geogrid + type (proj_lc_t), intent(in) :: proj + integer, optional :: srx, sry real, parameter :: OFFSET = 0.5 - type (proj_lc_t) :: proj - integer :: i, j + integer :: i, j, sr_x, sr_y real :: i_atm, j_atm, offset_corners_x, offset_corners_y + if (present (srx) .and. present (sry)) then + sr_x = srx + sr_y = sry + else + sr_x = 1 + sr_y = 1 + end if + allocate (this%lons(this%ifms:this%ifme, this%jfms:this%jfme)) allocate (this%lats(this%ifms:this%ifme, this%jfms:this%jfme)) allocate (this%lons_c(this%nx + 1, this%ny + 1)) allocate (this%lats_c(this%nx + 1, this%ny + 1)) - proj = geogrid%Get_atm_proj () +! proj = geogrid%Get_atm_proj () - offset_corners_x = (1.0 / real (geogrid%sr_x)) / 2.0 - offset_corners_y = (1.0 / real (geogrid%sr_y)) / 2.0 +! offset_corners_x = (1.0 / real (geogrid%sr_x)) / 2.0 +! offset_corners_y = (1.0 / real (geogrid%sr_y)) / 2.0 + offset_corners_x = (1.0 / real (sr_x)) / 2.0 + offset_corners_y = (1.0 / real (sr_y)) / 2.0 do j = 1, this%ny do i = 1, this%nx - i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET +! i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET +! j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (i - OFFSET) / sr_x + OFFSET + j_atm = (j - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm, j = j_atm, lat = this%lats(i, j), lon = this%lons(i, j)) call proj%Calc_latlon (i = i_atm - offset_corners_x, j = j_atm - offset_corners_y, & lat = this%lats_c(i, j), lon = this%lons_c(i, j)) @@ -405,21 +466,27 @@ subroutine Init_latlons (this, geogrid) end do do j = 1, this%ny - i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET +! i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET +! j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (this%nx - OFFSET) / sr_x + OFFSET + j_atm = (j - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm + offset_corners_x, j = j_atm - offset_corners_y, & lat = this%lats_c(this%nx + 1, j), lon = this%lons_c(this%nx + 1, j)) end do do i = 1, this%nx - i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET +! i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET +! j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (i - OFFSET) / sr_x + OFFSET + j_atm = (this%ny - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm - offset_corners_x, j = j_atm + offset_corners_y, & lat = this%lats_c(i, this%ny + 1), lon = this%lons_c(i, this%ny + 1)) end do - i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET +! i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET +! j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (this%nx - OFFSET) / sr_x + OFFSET + j_atm = (this%ny - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm + offset_corners_x, j = j_atm + offset_corners_y, & lat = this%lats_c(this%nx + 1, this%ny + 1), lon = this%lons_c(this%nx + 1, this%ny + 1)) diff --git a/tests/test7/namelist.fire b/tests/test7/namelist.fire index 58ce971..fffaea8 100644 --- a/tests/test7/namelist.fire +++ b/tests/test7/namelist.fire @@ -37,3 +37,5 @@ fire_upwinding = 9, ! 0=none, 1=standard, 2=godunov, 3=eno, 4=sethian / + &ideal + / diff --git a/tests/test8/namelist.fire b/tests/test8/namelist.fire index ba75bdf..68cf0ed 100644 --- a/tests/test8/namelist.fire +++ b/tests/test8/namelist.fire @@ -39,3 +39,5 @@ fmoist_freq = 1, ! Fuel moisture model updated every time step / + &ideal + / diff --git a/tests/testx/namelist.fire b/tests/testx/namelist.fire index 58ce971..fffaea8 100644 --- a/tests/testx/namelist.fire +++ b/tests/testx/namelist.fire @@ -37,3 +37,5 @@ fire_upwinding = 9, ! 0=none, 1=standard, 2=godunov, 3=eno, 4=sethian / + &ideal + / From ab393cf19e501cef2c663e91d87064a2268beaf7 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 19 Jun 2024 17:25:31 -0600 Subject: [PATCH 02/57] Allocate state vars in a subroutine --- state/state_mod.F90 | 112 ++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 51 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 64d333c..4e65dea 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -91,6 +91,7 @@ module state_mod integer :: ny ! "number of latitudinal grid points" "1" real :: cen_lat, cen_lon contains + procedure, public :: Allocate_vars => Allocate_vars procedure, public :: Convert_sb_to_ander => Convert_scottburgan_to_anderson procedure, public :: Handle_output => Handle_output procedure, public :: Handle_wrfdata_update => Handle_wrfdata_update @@ -107,6 +108,59 @@ module state_mod contains + subroutine Allocate_vars (this, ifms, ifme, jfms, jfme) + + implicit none + + class (state_fire_t), intent(in out) :: this + integer, intent (in) :: ifms, ifme, jfms, jfme + + + !pajm + allocate (this%uf(ifms:ifme, jfms:jfme)) + allocate (this%vf(ifms:ifme, jfms:jfme)) + allocate (this%fmc_g(ifms:ifme, jfms:jfme)) + allocate (this%lfn(ifms:ifme, jfms:jfme)) + allocate (this%lfn_hist(ifms:ifme, jfms:jfme)) + allocate (this%lfn_0(ifms:ifme, jfms:jfme)) + allocate (this%lfn_1(ifms:ifme, jfms:jfme)) + allocate (this%lfn_2(ifms:ifme, jfms:jfme)) + allocate (this%lfn_s0(ifms:ifme, jfms:jfme)) + allocate (this%lfn_s1(ifms:ifme, jfms:jfme)) + allocate (this%lfn_s2(ifms:ifme, jfms:jfme)) + allocate (this%lfn_s3(ifms:ifme, jfms:jfme)) + allocate (this%lfn_out(ifms:ifme, jfms:jfme)) + allocate (this%fuel_load_g(ifms:ifme, jfms:jfme)) + allocate (this%flame_length(ifms:ifme, jfms:jfme)) + allocate (this%ros_front(ifms:ifme, jfms:jfme)) + allocate (this%tign_g(ifms:ifme, jfms:jfme)) + allocate (this%fuel_frac(ifms:ifme, jfms:jfme)) + allocate (this%fire_area(ifms:ifme, jfms:jfme)) + allocate (this%fuel_frac_burnt_dt(ifms:ifme, jfms:jfme)) + allocate (this%fgrnhfx(ifms:ifme, jfms:jfme)) + allocate (this%fgrnqfx(ifms:ifme, jfms:jfme)) + allocate (this%fcanhfx(ifms:ifme, jfms:jfme)) + allocate (this%fcanqfx(ifms:ifme, jfms:jfme)) + allocate (this%ros(ifms:ifme, jfms:jfme)) + allocate (this%fz0(ifms:ifme, jfms:jfme)) + allocate (this%fuel_time(ifms:ifme, jfms:jfme)) + allocate (this%fire_psfc(ifms:ifme, jfms:jfme)) + allocate (this%fire_rain(ifms:ifme, jfms:jfme)) + allocate (this%fire_t2(ifms:ifme, jfms:jfme)) + allocate (this%fire_q2(ifms:ifme, jfms:jfme)) + allocate (this%fire_rh_fire(ifms:ifme, jfms:jfme)) + allocate (this%fire_psfc_old(ifms:ifme, jfms:jfme)) + allocate (this%fire_rain_old(ifms:ifme, jfms:jfme)) + allocate (this%fire_t2_old(ifms:ifme, jfms:jfme)) + allocate (this%fire_q2_old(ifms:ifme, jfms:jfme)) + allocate (this%zsf(ifms:ifme, jfms:jfme)) + allocate (this%dzdxf(ifms:ifme, jfms:jfme)) + allocate (this%dzdyf(ifms:ifme, jfms:jfme)) + allocate (this%nfuel_cat(ifms:ifme, jfms:jfme)) + allocate (this%emis_smoke(ifms:ifme, jfms:jfme)) + + end subroutine Allocate_vars + subroutine Convert_scottburgan_to_anderson (this) implicit none @@ -238,67 +292,23 @@ subroutine Init_domain (this, config_flags, geogrid) this%nx = this%ifde this%ny = this%jfde - allocate (this%uf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%vf(this%ifms:this%ifme, this%jfms:this%jfme)) - this%uf = 0. - this%vf = 0. - allocate (this%fmc_g(this%ifms:this%ifme, this%jfms:this%jfme)) - this%fmc_g = config_flags%fuelmc_g + this%dt = config_flags%dt + + call this%Allocate_vars (this%ifms, this%ifme, this%jfms, this%jfme) + ! pajm + this%uf = 0.0 + this%vf = 0.0 + this%fmc_g = config_flags%fuelmc_g ! Init lfn more than the largest domain side - allocate (this%lfn(this%ifms:this%ifme, this%jfms:this%jfme)) this%lfn(this%ifds:this%ifde, this%jfds:this%jfde) = 2.0 * & max ((this%ifde - this%ifds + 1) * this%dx, (this%jfde - this%jfds + 1) * this%dy) - - allocate (this%lfn_hist(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_1(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s1(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s3(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_out(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fuel_load_g(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%flame_length(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%ros_front(this%ifms:this%ifme, this%jfms:this%jfme)) - ! Init tign_g a bit into the future - allocate (this%tign_g(this%ifms:this%ifme, this%jfms:this%jfme)) this%tign_g(this%ifps:this%ifpe, this%jfps:this%jfpe) = epsilon (this%tign_g) - allocate (this%fuel_frac(this%ifms:this%ifme, this%jfms:this%jfme)) this%fuel_frac(this%ifds:this%ifde, this%jfds:this%jfde) = 1.0 - - allocate (this%fire_area(this%ifms:this%ifme, this%jfms:this%jfme)) this%fire_area(this%ifds:this%ifde, this%jfds:this%jfde) = 0.0 - allocate (this%fuel_frac_burnt_dt(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fgrnhfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fgrnqfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fcanhfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fcanqfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%ros(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fz0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fuel_time(this%ifms:this%ifme, this%jfms:this%jfme)) - - allocate (this%fire_psfc(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rain(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_t2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_q2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rh_fire(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_psfc_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rain_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_t2_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_q2_old(this%ifms:this%ifme, this%jfms:this%jfme)) - - this%dt = config_flags%dt - - allocate (this%zsf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%dzdxf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%dzdyf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%nfuel_cat(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%emis_smoke(this%ifms:this%ifme, this%jfms:this%jfme)) this%emis_smoke = 0.0 this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations From c8859f082ef5e6e49031a8421eb62f83a0f93717 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 19 Jun 2024 17:45:54 -0600 Subject: [PATCH 03/57] Set state vars to default in a subroutine --- state/state_mod.F90 | 47 ++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 4e65dea..a4ccfef 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -104,6 +104,7 @@ module state_mod procedure, public :: Interpolate_profile => Interpolate_profile procedure, public :: Print => Print_domain ! private procedure, public :: Save_state => Save_state + procedure, public :: Set_vars_to_default => Set_vars_to_default end type state_fire_t contains @@ -116,7 +117,6 @@ subroutine Allocate_vars (this, ifms, ifme, jfms, jfme) integer, intent (in) :: ifms, ifme, jfms, jfme - !pajm allocate (this%uf(ifms:ifme, jfms:jfme)) allocate (this%vf(ifms:ifme, jfms:jfme)) allocate (this%fmc_g(ifms:ifme, jfms:jfme)) @@ -291,25 +291,11 @@ subroutine Init_domain (this, config_flags, geogrid) this%nx = this%ifde this%ny = this%jfde - this%dt = config_flags%dt call this%Allocate_vars (this%ifms, this%ifme, this%jfms, this%jfme) - ! pajm - this%uf = 0.0 - this%vf = 0.0 - this%fmc_g = config_flags%fuelmc_g - ! Init lfn more than the largest domain side - this%lfn(this%ifds:this%ifde, this%jfds:this%jfde) = 2.0 * & - max ((this%ifde - this%ifds + 1) * this%dx, (this%jfde - this%jfds + 1) * this%dy) - ! Init tign_g a bit into the future - this%tign_g(this%ifps:this%ifpe, this%jfps:this%jfpe) = epsilon (this%tign_g) - - this%fuel_frac(this%ifds:this%ifde, this%jfds:this%jfde) = 1.0 - this%fire_area(this%ifds:this%ifde, this%jfds:this%jfde) = 0.0 - - this%emis_smoke = 0.0 + call this%Set_vars_to_default (config_flags) this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs @@ -324,8 +310,6 @@ subroutine Init_domain (this, config_flags, geogrid) end if end if - this%unit_fxlat = 2.0 * PI / (360.0 * RERADIUS) ! earth circumference in m / 360 degrees - this%unit_fxlong = cos (this%cen_lat * 2.0 * PI / 360.0) * this%unit_fxlat ! latitude call this%Init_latlons (geogrid) call this%Init_tiles (config_flags) @@ -665,5 +649,32 @@ subroutine Save_state (this) end subroutine Save_state + subroutine Set_vars_to_default (this, config_flags) + + implicit none + + class (state_fire_t), intent (in out) :: this + type (namelist_t), intent (in) :: config_flags + + + this%uf = 0.0 + this%vf = 0.0 + this%fmc_g = config_flags%fuelmc_g + ! Init lfn more than the largest domain side + this%lfn(this%ifds:this%ifde, this%jfds:this%jfde) = 2.0 * & + max ((this%ifde - this%ifds + 1) * this%dx, (this%jfde - this%jfds + 1) * this%dy) + ! Init tign_g a bit into the future + this%tign_g(this%ifps:this%ifpe, this%jfps:this%jfpe) = epsilon (this%tign_g) + + this%fuel_frac(this%ifds:this%ifde, this%jfds:this%jfde) = 1.0 + this%fire_area(this%ifds:this%ifde, this%jfds:this%jfde) = 0.0 + + this%emis_smoke = 0.0 + + this%unit_fxlat = 2.0 * PI / (360.0 * RERADIUS) ! earth circumference in m / 360 degrees + this%unit_fxlong = cos (this%cen_lat * 2.0 * PI / 360.0) * this%unit_fxlat ! latitude + + end subroutine Set_vars_to_default + end module state_mod From adf1e8cbcae290e8739af87cb8d7771df2f563e1 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 19 Jun 2024 17:57:12 -0600 Subject: [PATCH 04/57] Set initial time stamps in a subroutine --- state/state_mod.F90 | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index a4ccfef..832fea8 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -105,6 +105,7 @@ module state_mod procedure, public :: Print => Print_domain ! private procedure, public :: Save_state => Save_state procedure, public :: Set_vars_to_default => Set_vars_to_default + procedure, public :: Set_time_stamps => Set_time_stamps end type state_fire_t contains @@ -269,17 +270,7 @@ subroutine Init_domain (this, config_flags, geogrid) this%kfts = config_flags%kds this%kfte = config_flags%kde - ! Datetimes - this%datetime_start = datetime_t (config_flags%start_year, config_flags%start_month, config_flags%start_day, & - config_flags%start_hour, config_flags%start_minute, config_flags%start_second) - this%datetime_end = datetime_t (config_flags%end_year, config_flags%end_month, config_flags%end_day, & - config_flags%end_hour, config_flags%end_minute, config_flags%end_second) - this%datetime_now = this%datetime_start - - this%datetime_next_output = this%datetime_start - call this%datetime_next_output%Add_seconds (config_flags%interval_output) - - this%datetime_next_atm_update = this%datetime_start + call this%Set_time_stamps (config_flags) this%cen_lat = geogrid%cen_lat this%cen_lon = geogrid%cen_lon @@ -287,8 +278,6 @@ subroutine Init_domain (this, config_flags, geogrid) this%dx = geogrid%dx / geogrid%sr_x this%dy = geogrid%dy / geogrid%sr_y - if (DEBUG_LOCAL) call this%Print() - this%nx = this%ifde this%ny = this%jfde this%dt = config_flags%dt @@ -316,6 +305,8 @@ subroutine Init_domain (this, config_flags, geogrid) if (config_flags%fuel_opt == FUEL_ANDERSON) call this%Convert_sb_to_ander () + if (DEBUG_LOCAL) call this%Print() + end subroutine Init_domain subroutine Init_fuel_vars (this) @@ -649,6 +640,27 @@ subroutine Save_state (this) end subroutine Save_state + subroutine Set_time_stamps (this, config_flags) + + implicit none + + class (state_fire_t), intent (in out) :: this + type (namelist_t), intent (in) :: config_flags + + + this%datetime_start = datetime_t (config_flags%start_year, config_flags%start_month, config_flags%start_day, & + config_flags%start_hour, config_flags%start_minute, config_flags%start_second) + this%datetime_end = datetime_t (config_flags%end_year, config_flags%end_month, config_flags%end_day, & + config_flags%end_hour, config_flags%end_minute, config_flags%end_second) + this%datetime_now = this%datetime_start + + this%datetime_next_output = this%datetime_start + call this%datetime_next_output%Add_seconds (config_flags%interval_output) + + this%datetime_next_atm_update = this%datetime_start + + end subroutine Set_time_stamps + subroutine Set_vars_to_default (this, config_flags) implicit none From 9a2d117b4491d004ae28abeb4ffaa6fdadf5c69e Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 20 Jun 2024 07:12:51 -0600 Subject: [PATCH 05/57] Init latlon subroutine does not use geogrid --- state/state_mod.F90 | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 832fea8..45cfdae 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -237,6 +237,7 @@ subroutine Init_domain (this, config_flags, geogrid) type (namelist_t), intent (in) :: config_flags type (geogrid_t), intent (in) :: geogrid + type (proj_lc_t) :: proj logical, parameter :: DEBUG_LOCAL = .false. integer :: ids0, ide0, jds0, jde0 @@ -299,7 +300,8 @@ subroutine Init_domain (this, config_flags, geogrid) end if end if - call this%Init_latlons (geogrid) + proj = geogrid%Get_atm_proj () + call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) call this%Init_tiles (config_flags) @@ -356,33 +358,39 @@ subroutine Init_ignition_lines (this, config_flags) end subroutine Init_ignition_lines - subroutine Init_latlons (this, geogrid) + subroutine Init_latlons (this, proj, srx, sry) implicit none class (state_fire_t), intent (in out) :: this - type (geogrid_t), intent(in) :: geogrid + type (proj_lc_t), intent(in) :: proj + integer, optional :: srx, sry real, parameter :: OFFSET = 0.5 - type (proj_lc_t) :: proj - integer :: i, j + integer :: i, j, sr_x, sr_y real :: i_atm, j_atm, offset_corners_x, offset_corners_y + if (present (srx) .and. present (sry)) then + sr_x = srx + sr_y = sry + else + sr_x = 1 + sr_y = 1 + end if + allocate (this%lons(this%ifms:this%ifme, this%jfms:this%jfme)) allocate (this%lats(this%ifms:this%ifme, this%jfms:this%jfme)) allocate (this%lons_c(this%nx + 1, this%ny + 1)) allocate (this%lats_c(this%nx + 1, this%ny + 1)) - proj = geogrid%Get_atm_proj () - - offset_corners_x = (1.0 / real (geogrid%sr_x)) / 2.0 - offset_corners_y = (1.0 / real (geogrid%sr_y)) / 2.0 + offset_corners_x = (1.0 / real (sr_x)) / 2.0 + offset_corners_y = (1.0 / real (sr_y)) / 2.0 do j = 1, this%ny do i = 1, this%nx - i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (i - OFFSET) / sr_x + OFFSET + j_atm = (j - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm, j = j_atm, lat = this%lats(i, j), lon = this%lons(i, j)) call proj%Calc_latlon (i = i_atm - offset_corners_x, j = j_atm - offset_corners_y, & lat = this%lats_c(i, j), lon = this%lons_c(i, j)) @@ -390,21 +398,21 @@ subroutine Init_latlons (this, geogrid) end do do j = 1, this%ny - i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (j - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (this%nx - OFFSET) / sr_x + OFFSET + j_atm = (j - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm + offset_corners_x, j = j_atm - offset_corners_y, & lat = this%lats_c(this%nx + 1, j), lon = this%lons_c(this%nx + 1, j)) end do do i = 1, this%nx - i_atm = (i - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (i - OFFSET) / sr_x + OFFSET + j_atm = (this%ny - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm - offset_corners_x, j = j_atm + offset_corners_y, & lat = this%lats_c(i, this%ny + 1), lon = this%lons_c(i, this%ny + 1)) end do - i_atm = (this%nx - OFFSET) / geogrid%sr_x + OFFSET - j_atm = (this%ny - OFFSET) / geogrid%sr_y + OFFSET + i_atm = (this%nx - OFFSET) / sr_x + OFFSET + j_atm = (this%ny - OFFSET) / sr_y + OFFSET call proj%Calc_latlon (i = i_atm + offset_corners_x, j = j_atm + offset_corners_y, & lat = this%lats_c(this%nx + 1, this%ny + 1), lon = this%lons_c(this%nx + 1, this%ny + 1)) From 9a8f659b0226053885c6df36903a187c08f3bbec Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 20 Jun 2024 07:31:35 -0600 Subject: [PATCH 06/57] Reorganize calls to subs in init state --- state/state_mod.F90 | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 45cfdae..7e11e87 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -242,7 +242,7 @@ subroutine Init_domain (this, config_flags, geogrid) integer :: ids0, ide0, jds0, jde0 - ! Domain dimensions + ! Set dimensions ids0 = geogrid%ifds ide0 = geogrid%ifde jds0 = geogrid%jfds @@ -271,20 +271,26 @@ subroutine Init_domain (this, config_flags, geogrid) this%kfts = config_flags%kds this%kfte = config_flags%kde - call this%Set_time_stamps (config_flags) - - this%cen_lat = geogrid%cen_lat - this%cen_lon = geogrid%cen_lon - - this%dx = geogrid%dx / geogrid%sr_x - this%dy = geogrid%dy / geogrid%sr_y + call this%Init_tiles (config_flags) this%nx = this%ifde this%ny = this%jfde this%dt = config_flags%dt + ! Init memory call this%Allocate_vars (this%ifms, this%ifme, this%jfms, this%jfme) + ! Set projection + proj = geogrid%Get_atm_proj () + call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) + + this%cen_lat = geogrid%cen_lat + this%cen_lon = geogrid%cen_lon + + this%dx = geogrid%dx / geogrid%sr_x + this%dy = geogrid%dy / geogrid%sr_y + + ! Init vars call this%Set_vars_to_default (config_flags) this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations @@ -300,13 +306,11 @@ subroutine Init_domain (this, config_flags, geogrid) end if end if - proj = geogrid%Get_atm_proj () - call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) - - call this%Init_tiles (config_flags) - if (config_flags%fuel_opt == FUEL_ANDERSON) call this%Convert_sb_to_ander () + ! Set clock + call this%Set_time_stamps (config_flags) + if (DEBUG_LOCAL) call this%Print() end subroutine Init_domain @@ -427,6 +431,7 @@ subroutine Init_tiles (this, config_flags) integer :: num_tiles + num_tiles = config_flags%num_tiles call Calc_tiles_dims (this%ifps, this%ifpe, this%jfps, this%jfpe, num_tiles, & this%i_start, this%i_end, this%j_start, this%j_end) From 65b3ab81a3fc4f24ce1965bdf61b520b5281cdbf Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 20 Jun 2024 07:55:56 -0600 Subject: [PATCH 07/57] Initial changes for a more flexible fire state initialization --- state/state_mod.F90 | 139 ++++++++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 51 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 7e11e87..ab539f4 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -229,49 +229,72 @@ subroutine Handle_wrfdata_update (this, wrf, config_flags) end subroutine Handle_wrfdata_update - subroutine Init_domain (this, config_flags, geogrid) + subroutine Init_domain (this, config_flags, geogrid, & + ifds, ifde, ifms, ifme, ifps, ifpe, & + jfds, jfde, jfms, jfme, jfps, jfpe, & + kfds, kfde, kfms, kfme, kfps, kfpe, & + kfts, kfte, i_start, i_end, j_start, j_end, num_tiles) implicit none class (state_fire_t), intent(in out) :: this type (namelist_t), intent (in) :: config_flags - type (geogrid_t), intent (in) :: geogrid - + type (geogrid_t), intent (in), optional :: geogrid + integer, intent (in), optional :: ifds, ifde, ifms, ifme, ifps, ifpe, & + jfds, jfde, jfms, jfme, jfps, jfpe, & + kfds, kfde, kfms, kfme, kfps, kfpe, & + kfts, kfte, num_tiles + real, dimension(:), allocatable, intent (in), optional :: i_start, i_end, j_start, j_end + + integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1 type (proj_lc_t) :: proj logical, parameter :: DEBUG_LOCAL = .false. - integer :: ids0, ide0, jds0, jde0 + integer :: ids0, ide0, jds0, jde0, init_mode + + init_mode = INIT_MODE_NONE + if (present (geogrid)) init_mode = INIT_MODE_GEOGRID + if (init_mode == INIT_MODE_NONE) & + call Stop_simulation ('Not enough information to initialize domain') ! Set dimensions - ids0 = geogrid%ifds - ide0 = geogrid%ifde - jds0 = geogrid%jfds - jde0 = geogrid%jfde - - this%ifds = ids0 - this%ifde = ide0 - this%ifms = ids0 - N_POINTS_IN_HALO - this%ifme = ide0 + N_POINTS_IN_HALO - this%ifps = ids0 - this%ifpe = ide0 - - this%jfds = jds0 - this%jfde = jde0 - this%jfms = jds0 - N_POINTS_IN_HALO - this%jfme = jde0 + N_POINTS_IN_HALO - this%jfps = jds0 - this%jfpe = jde0 - - this%kfds = config_flags%kds - this%kfde = config_flags%kde - this%kfms = config_flags%kds - this%kfme = config_flags%kde - this%kfps = config_flags%kds - this%kfpe = config_flags%kde - this%kfts = config_flags%kds - this%kfte = config_flags%kde - - call this%Init_tiles (config_flags) + Set_dims: select case (init_mode) + case (INIT_MODE_GEOGRID) + ids0 = geogrid%ifds + ide0 = geogrid%ifde + jds0 = geogrid%jfds + jde0 = geogrid%jfde + + this%ifds = ids0 + this%ifde = ide0 + this%ifms = ids0 - N_POINTS_IN_HALO + this%ifme = ide0 + N_POINTS_IN_HALO + this%ifps = ids0 + this%ifpe = ide0 + + this%jfds = jds0 + this%jfde = jde0 + this%jfms = jds0 - N_POINTS_IN_HALO + this%jfme = jde0 + N_POINTS_IN_HALO + this%jfps = jds0 + this%jfpe = jde0 + + this%kfds = config_flags%kds + this%kfde = config_flags%kde + this%kfms = config_flags%kds + this%kfme = config_flags%kde + this%kfps = config_flags%kds + this%kfpe = config_flags%kde + this%kfts = config_flags%kds + this%kfte = config_flags%kde + + call this%Init_tiles (config_flags) + + case default + + call Stop_simulation ('Not ready to complete fire state initialization 1') + + end select Set_dims this%nx = this%ifde this%ny = this%jfde @@ -281,30 +304,44 @@ subroutine Init_domain (this, config_flags, geogrid) call this%Allocate_vars (this%ifms, this%ifme, this%jfms, this%jfme) ! Set projection - proj = geogrid%Get_atm_proj () - call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) + Set_proj: select case (init_mode) + case (INIT_MODE_GEOGRID) + proj = geogrid%Get_atm_proj () + call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) + + this%cen_lat = geogrid%cen_lat + this%cen_lon = geogrid%cen_lon - this%cen_lat = geogrid%cen_lat - this%cen_lon = geogrid%cen_lon + this%dx = geogrid%dx / geogrid%sr_x + this%dy = geogrid%dy / geogrid%sr_y - this%dx = geogrid%dx / geogrid%sr_x - this%dy = geogrid%dy / geogrid%sr_y + case default + call Stop_simulation ('Not ready to complete fire state initialization 2') + + end select Set_proj ! Init vars call this%Set_vars_to_default (config_flags) - this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations - this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs - this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dys - this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%fuel_cats - - if (config_flags%fire_is_real_perim) then - if (allocated (geogrid%lfn_init)) then - this%lfn_hist(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%lfn_init - else - Call Stop_simulation ('Attenting to initialize fire from given perimeter but no initialization data present') - end if - end if + Set_topo_fuels: select case (init_mode) + case (INIT_MODE_GEOGRID) + this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations + this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs + this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dys + this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%fuel_cats + + if (config_flags%fire_is_real_perim) then + if (allocated (geogrid%lfn_init)) then + this%lfn_hist(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%lfn_init + else + Call Stop_simulation ('Attenting to initialize fire from given perimeter but no initialization data present') + end if + end if + + case default + call Stop_simulation ('Not ready to complete fire state initialization 3') + + end select Set_topo_fuels if (config_flags%fuel_opt == FUEL_ANDERSON) call this%Convert_sb_to_ander () From 6aa4c08a876ba609e9e2d2f0a09f803f7eb27ff5 Mon Sep 17 00:00:00 2001 From: Anthony Islas Date: Tue, 28 May 2024 12:03:48 -0700 Subject: [PATCH 08/57] Fix find of cmake hdf5 failing on unknown compilation of c files --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bfb2a60..e497be0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.18) project( ufs_fire_behavior VERSION 0.0.1 - LANGUAGES Fortran CXX) + LANGUAGES Fortran CXX C ) # user defined cmake modules list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/") From 53777679070e7249f8a18f933587712e6b3c1e88 Mon Sep 17 00:00:00 2001 From: Anthony Islas Date: Tue, 28 May 2024 12:05:13 -0700 Subject: [PATCH 09/57] Use netCDF targets as named, and properly link in MPI --- CMakeLists.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e497be0..9e5201c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mod") install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} DESTINATION ${CMAKE_INSTALL_PREFIX}) # third party libraries -find_package(NetCDF REQUIRED Fortran) +find_package(netCDF-Fortran REQUIRED) # turn on DM_PARALLEL preprocessor directive if(DM_PARALLEL) @@ -88,14 +88,18 @@ list(APPEND _driver_files driver/advance_mod.F90 # configure fire behavior library add_library(firelib STATIC ${_state_files} ${_share_files} ${_io_files} ${_wrffire_physics} ${_driver_files}) -target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) -target_link_libraries(firelib PUBLIC $) +# target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) +target_link_libraries(firelib PUBLIC netCDF::netcdff MPI::MPI_Fortran ) +set_target_properties( + firelib + PROPERTIES + Fortran_FORMAT FREE + ) # configure fire behavior executable add_executable(fire_behavior.exe driver/fire_behavior.F90) add_dependencies(fire_behavior.exe firelib) target_link_libraries(fire_behavior.exe PUBLIC firelib) -target_link_libraries(fire_behavior.exe PUBLIC NetCDF::NetCDF_Fortran) install(TARGETS fire_behavior.exe DESTINATION bin) if(NUOPC OR ESMX) From 1f032ec82d21d3a39ed1e1062950d684e26234cb Mon Sep 17 00:00:00 2001 From: Anthony Islas Date: Tue, 28 May 2024 12:23:10 -0700 Subject: [PATCH 10/57] Break up MPI linking for when dm parallel is off --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e5201c..e9b7ec8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,7 +89,10 @@ list(APPEND _driver_files driver/advance_mod.F90 # configure fire behavior library add_library(firelib STATIC ${_state_files} ${_share_files} ${_io_files} ${_wrffire_physics} ${_driver_files}) # target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) -target_link_libraries(firelib PUBLIC netCDF::netcdff MPI::MPI_Fortran ) +target_link_libraries(firelib PUBLIC netCDF::netcdff ) +if (DM_PARALLEL) + target_link_libraries( firelib PUBLIC MPI::MPI_Fortran ) +endif() set_target_properties( firelib PROPERTIES From 3cebf74104a3746048e1698712050b519dd52479 Mon Sep 17 00:00:00 2001 From: Anthony Islas Date: Tue, 28 May 2024 12:50:48 -0700 Subject: [PATCH 11/57] Fix bad syntax that treats unset vars as not equal to empty string --- cmake/modules/FireBuildSettings.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/modules/FireBuildSettings.cmake b/cmake/modules/FireBuildSettings.cmake index ed897b8..7fec919 100644 --- a/cmake/modules/FireBuildSettings.cmake +++ b/cmake/modules/FireBuildSettings.cmake @@ -1,11 +1,11 @@ macro(set_fire_defaults) - if(DM_PARALLEL STREQUAL "") + if("${DM_PARALLEL}" STREQUAL "") set(DM_PARALLEL ON) endif() - if(NUOPC STREQUAL "") + if("${NUOPC}" STREQUAL "") set(NUOPC OFF) endif() - if(ESMX STREQUAL "") + if("${ESMX}" STREQUAL "") set(ESMX OFF) endif() endmacro() From ab6dfd373d83450d90351e819db5b1aa98f31e20 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 12 Jun 2024 16:30:11 -0600 Subject: [PATCH 12/57] Adding subroutines to print at initialization and advance calls --- driver/advance_mod.F90 | 21 ++++++++++++++++++++- driver/initialize_mod.F90 | 21 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/driver/advance_mod.F90 b/driver/advance_mod.F90 index 352e142..031119e 100644 --- a/driver/advance_mod.F90 +++ b/driver/advance_mod.F90 @@ -9,10 +9,29 @@ module advance_mod private - public :: Advance_state + public :: Advance_state, Advance_state_to_be_removed contains + subroutine Advance_state_to_be_removed (state, config_flags) + + implicit none + + type (state_fire_t), intent (in), optional :: state + type (namelist_t), intent (in), optional :: config_flags + + logical :: is_state_present, is_nml_present + + + is_state_present = present (state) + is_nml_present = present (config_flags) + + print *, 'Advancing CFBM model within WRF' + print *, 'Is state present? ', is_state_present + print *, 'Is nml present? ', is_nml_present + + end subroutine Advance_state_to_be_removed + subroutine Advance_state (grid, config_flags) implicit none diff --git a/driver/initialize_mod.F90 b/driver/initialize_mod.F90 index 0c500a1..cdc5cd8 100644 --- a/driver/initialize_mod.F90 +++ b/driver/initialize_mod.F90 @@ -9,7 +9,7 @@ module initialize_mod private - public :: Init_fire_state, Init_atm_state + public :: Init_fire_state, Init_atm_state, Init_fire_state_within_wrf contains @@ -90,4 +90,23 @@ subroutine Init_fire_state (grid, config_flags, wrf) end subroutine Init_fire_state + subroutine Init_fire_state_within_wrf (state, config_flags) + + implicit none + + type (state_fire_t), intent (in out), optional :: state + type (namelist_t), intent (in), optional :: config_flags + + logical :: is_state_present, is_nml_present + + + is_state_present = present (state) + is_nml_present = present (config_flags) + + print *, 'Initializing the CFBM model within WRF' + print *, 'Is state present? ', is_state_present + print *, 'Is nml present? ', is_nml_present + + end subroutine Init_fire_state_within_wrf + end module initialize_mod From e2e988cf8186e552e9eaa93c49bc2a0abe7e78c5 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 20 Jun 2024 20:12:00 -0600 Subject: [PATCH 13/57] Initialize state from WRF online --- driver/initialize_mod.F90 | 39 ++++++++++++++------- state/state_mod.F90 | 73 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 95 insertions(+), 17 deletions(-) diff --git a/driver/initialize_mod.F90 b/driver/initialize_mod.F90 index cdc5cd8..9061f6d 100644 --- a/driver/initialize_mod.F90 +++ b/driver/initialize_mod.F90 @@ -90,22 +90,35 @@ subroutine Init_fire_state (grid, config_flags, wrf) end subroutine Init_fire_state - subroutine Init_fire_state_within_wrf (state, config_flags) + subroutine Init_fire_state_within_wrf (state, config_flags, & + ifds, ifde, ifms, ifme, ifps, ifpe, & + jfds, jfde, jfms, jfme, jfps, jfpe, & + kfds, kfde, kfms, kfme, kfps, kfpe, & + kfts, kfte, ide, jde, i_start, i_end, j_start, j_end, dx, dy, sr_x, sr_y, & + map_proj, cen_lat, cen_lon, truelat1, truelat2, stand_lon, & + nfuel_cat, zsf, dzdxf, dzdyf) implicit none - type (state_fire_t), intent (in out), optional :: state - type (namelist_t), intent (in), optional :: config_flags - - logical :: is_state_present, is_nml_present - - - is_state_present = present (state) - is_nml_present = present (config_flags) - - print *, 'Initializing the CFBM model within WRF' - print *, 'Is state present? ', is_state_present - print *, 'Is nml present? ', is_nml_present + type (state_fire_t), intent (in out) :: state + type (namelist_t), intent (in) :: config_flags + integer, intent (in) :: ifds, ifde, ifms, ifme, ifps, ifpe, & + jfds, jfde, jfms, jfme, jfps, jfpe, & + kfds, kfde, kfms, kfme, kfps, kfpe, & + kfts, kfte, map_proj, sr_x, sr_y, ide, jde + integer, dimension(:), intent (in) :: i_start, i_end, j_start, j_end + real :: dx, dy, cen_lat, cen_lon, truelat1, truelat2, stand_lon + real, dimension(ifms:ifme, jfms:jfme), intent (in) :: nfuel_cat, zsf, dzdxf, dzdyf + + + call state%Initialization (config_flags, & + ifds = ifds, ifde = ifde, ifms = ifms, ifme = ifme, ifps = ifps, ifpe = ifpe, & + jfds = jfds, jfde = jfde, jfms = jfms, jfme = jfme, jfps = jfps, jfpe = jfpe, & + kfds = kfds, kfde = kfde, kfms = kfms, kfme = kfme, kfps = kfps, kfpe = kfpe, & + kfts = kfts, kfte = kfte, ide = ide, jde = jde, i_start = i_start, i_end = i_end, j_start = j_start, & + j_end = j_end, cen_lat = cen_lat, cen_lon = cen_lon, truelat1 = truelat1, & + truelat2 = truelat2, stand_lon = stand_lon, dx = dx, dy = dy, sr_x = sr_x, sr_y = sr_y, & + nfuel_cat = nfuel_cat, zsf = zsf, dzdxf = dzdxf, dzdyf = dzdyf) end subroutine Init_fire_state_within_wrf diff --git a/state/state_mod.F90 b/state/state_mod.F90 index ab539f4..2b466b4 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -233,7 +233,10 @@ subroutine Init_domain (this, config_flags, geogrid, & ifds, ifde, ifms, ifme, ifps, ifpe, & jfds, jfde, jfms, jfme, jfps, jfpe, & kfds, kfde, kfms, kfme, kfps, kfpe, & - kfts, kfte, i_start, i_end, j_start, j_end, num_tiles) + kfts, kfte, ide, jde, i_start, i_end, j_start, j_end, & + cen_lat, cen_lon, truelat1, truelat2, stand_lon, & + dx, dy, sr_x, sr_y, nfuel_cat, zsf, dzdxf, dzdyf) + implicit none @@ -243,10 +246,13 @@ subroutine Init_domain (this, config_flags, geogrid, & integer, intent (in), optional :: ifds, ifde, ifms, ifme, ifps, ifpe, & jfds, jfde, jfms, jfme, jfps, jfpe, & kfds, kfde, kfms, kfme, kfps, kfpe, & - kfts, kfte, num_tiles - real, dimension(:), allocatable, intent (in), optional :: i_start, i_end, j_start, j_end + kfts, kfte, sr_x, sr_y, ide, jde + real, intent (in), optional :: cen_lat, cen_lon, truelat1, truelat2, stand_lon, dx, dy + integer, dimension(:), intent (in), optional :: i_start, i_end, j_start, j_end + real, dimension(:, :), intent (in), optional :: nfuel_cat, zsf, dzdxf, dzdyf + - integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1 + integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1, INIT_MODE_WRF = 2 type (proj_lc_t) :: proj logical, parameter :: DEBUG_LOCAL = .false. integer :: ids0, ide0, jds0, jde0, init_mode @@ -254,6 +260,16 @@ subroutine Init_domain (this, config_flags, geogrid, & init_mode = INIT_MODE_NONE if (present (geogrid)) init_mode = INIT_MODE_GEOGRID + if (present (ifds) .and. present (ifde) .and. present (ifms) .and. present (ifme) .and. present (ifps) .and. present (ifpe) .and. & + present (jfds) .and. present (jfde) .and. present (jfms) .and. present (jfme) .and. present (jfps) .and. present (jfpe) .and. & + present (kfds) .and. present (kfde) .and. present (kfms) .and. present (kfme) .and. present (kfps) .and. present (kfpe) .and. & + present (kfts) .and. present (kfte) .and. present (ide) .and. present (jde) .and. & + present (i_start) .and. present (i_end) .and. present (j_start) .and. present (j_end) .and. & + present (cen_lat) .and. present (cen_lon) .and. present (truelat1) .and. present (truelat2) .and. present (stand_lon) .and. & + present (dx) .and. present (dy) .and. present (sr_x) .and. present (sr_y) .and. present (nfuel_cat) .and. present (zsf) .and. & + present (dzdxf) .and. present (dzdyf)) & + init_mode = INIT_MODE_WRF + if (init_mode == INIT_MODE_NONE) & call Stop_simulation ('Not enough information to initialize domain') @@ -290,6 +306,35 @@ subroutine Init_domain (this, config_flags, geogrid, & call this%Init_tiles (config_flags) + case (INIT_MODE_WRF) + this%ifds = ifds + this%ifde = ifde + this%ifms = ifms + this%ifme = ifme + this%ifps = ifps + this%ifpe = ifpe + + this%jfds = jfds + this%jfde = jfde + this%jfms = jfms + this%jfme = jfme + this%jfps = jfps + this%jfpe = jfpe + + this%kfds = kfds + this%kfde = kfde + this%kfms = kfms + this%kfme = kfme + this%kfps = kfps + this%kfpe = kfpe + this%kfts = kfts + this%kfte = kfte + + this%i_start = i_start + this%j_start = j_start + this%i_end = i_end + this%j_end = j_end + case default call Stop_simulation ('Not ready to complete fire state initialization 1') @@ -315,6 +360,17 @@ subroutine Init_domain (this, config_flags, geogrid, & this%dx = geogrid%dx / geogrid%sr_x this%dy = geogrid%dy / geogrid%sr_y + case (INIT_MODE_WRF) + proj = proj_lc_t (cen_lat = cen_lat , cen_lon = cen_lon, dx = dx, dy = dy, & + standard_lon = stand_lon, true_lat_1 = truelat1, true_lat_2 = truelat2, nx = ide - 1, ny = jde - 1) + call this%Init_latlons (proj, srx = sr_x, sry = sr_y) + + this%cen_lat = cen_lat + this%cen_lon = cen_lon + + this%dx = dx / sr_x + this%dy = dy / sr_y + case default call Stop_simulation ('Not ready to complete fire state initialization 2') @@ -338,6 +394,15 @@ subroutine Init_domain (this, config_flags, geogrid, & end if end if + case (INIT_MODE_WRF) + this%zsf(this%ifms:this%ifme, this%jfms:this%jfme) = zsf + this%dzdxf(this%ifms:this%ifme, this%jfms:this%jfme) = dzdxf + this%dzdyf(this%ifms:this%ifme, this%jfms:this%jfme) = dzdyf + this%nfuel_cat(this%ifms:this%ifme, this%jfms:this%jfme) = nfuel_cat + if (config_flags%fire_is_real_perim) & + !this%lfn_hist(this%ifms:this%ifme, this%jfms:this%jfme) = lfn_hist + call Stop_simulation ('Not ready to initialize from fire perimeter inside WRF') + case default call Stop_simulation ('Not ready to complete fire state initialization 3') From 3cbbb0dfc6ac85e404783ab6e09f994e211acf4f Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 21 Jun 2024 13:26:35 -0600 Subject: [PATCH 14/57] Coupled to WRF online --- driver/advance_mod.F90 | 23 ++--------------------- driver/initialize_mod.F90 | 9 +++++---- physics/fire_driver_mod.F90 | 5 +++++ physics/fire_model_mod.F90 | 18 +++++++++++++++++- physics/level_set_mod.F90 | 19 ++++++++++++++++++- state/state_mod.F90 | 14 +++----------- 6 files changed, 50 insertions(+), 38 deletions(-) diff --git a/driver/advance_mod.F90 b/driver/advance_mod.F90 index 031119e..7b5c39e 100644 --- a/driver/advance_mod.F90 +++ b/driver/advance_mod.F90 @@ -9,29 +9,10 @@ module advance_mod private - public :: Advance_state, Advance_state_to_be_removed + public :: Advance_state contains - subroutine Advance_state_to_be_removed (state, config_flags) - - implicit none - - type (state_fire_t), intent (in), optional :: state - type (namelist_t), intent (in), optional :: config_flags - - logical :: is_state_present, is_nml_present - - - is_state_present = present (state) - is_nml_present = present (config_flags) - - print *, 'Advancing CFBM model within WRF' - print *, 'Is state present? ', is_state_present - print *, 'Is nml present? ', is_nml_present - - end subroutine Advance_state_to_be_removed - subroutine Advance_state (grid, config_flags) implicit none @@ -39,7 +20,7 @@ subroutine Advance_state (grid, config_flags) type (state_fire_t), intent (in out) :: grid type (namelist_t), intent (in) :: config_flags - logical, parameter :: DEBUG_LOCAL = .false. + logical, parameter :: DEBUG_LOCAL = .true. if (DEBUG_LOCAL) call Print_message (' Entering Advance_state... ') diff --git a/driver/initialize_mod.F90 b/driver/initialize_mod.F90 index 9061f6d..94f83a0 100644 --- a/driver/initialize_mod.F90 +++ b/driver/initialize_mod.F90 @@ -94,7 +94,7 @@ subroutine Init_fire_state_within_wrf (state, config_flags, & ifds, ifde, ifms, ifme, ifps, ifpe, & jfds, jfde, jfms, jfme, jfps, jfpe, & kfds, kfde, kfms, kfme, kfps, kfpe, & - kfts, kfte, ide, jde, i_start, i_end, j_start, j_end, dx, dy, sr_x, sr_y, & + kfts, kfte, ide, jde, dx, dy, sr_x, sr_y, & map_proj, cen_lat, cen_lon, truelat1, truelat2, stand_lon, & nfuel_cat, zsf, dzdxf, dzdyf) @@ -106,7 +106,6 @@ subroutine Init_fire_state_within_wrf (state, config_flags, & jfds, jfde, jfms, jfme, jfps, jfpe, & kfds, kfde, kfms, kfme, kfps, kfpe, & kfts, kfte, map_proj, sr_x, sr_y, ide, jde - integer, dimension(:), intent (in) :: i_start, i_end, j_start, j_end real :: dx, dy, cen_lat, cen_lon, truelat1, truelat2, stand_lon real, dimension(ifms:ifme, jfms:jfme), intent (in) :: nfuel_cat, zsf, dzdxf, dzdyf @@ -115,11 +114,13 @@ subroutine Init_fire_state_within_wrf (state, config_flags, & ifds = ifds, ifde = ifde, ifms = ifms, ifme = ifme, ifps = ifps, ifpe = ifpe, & jfds = jfds, jfde = jfde, jfms = jfms, jfme = jfme, jfps = jfps, jfpe = jfpe, & kfds = kfds, kfde = kfde, kfms = kfms, kfme = kfme, kfps = kfps, kfpe = kfpe, & - kfts = kfts, kfte = kfte, ide = ide, jde = jde, i_start = i_start, i_end = i_end, j_start = j_start, & - j_end = j_end, cen_lat = cen_lat, cen_lon = cen_lon, truelat1 = truelat1, & + kfts = kfts, kfte = kfte, ide = ide, jde = jde, & + cen_lat = cen_lat, cen_lon = cen_lon, truelat1 = truelat1, & truelat2 = truelat2, stand_lon = stand_lon, dx = dx, dy = dy, sr_x = sr_x, sr_y = sr_y, & nfuel_cat = nfuel_cat, zsf = zsf, dzdxf = dzdxf, dzdyf = dzdyf) + call Init_fire_components (state, config_flags) + end subroutine Init_fire_state_within_wrf end module initialize_mod diff --git a/physics/fire_driver_mod.F90 b/physics/fire_driver_mod.F90 index c30e1c7..8f66cc8 100644 --- a/physics/fire_driver_mod.F90 +++ b/physics/fire_driver_mod.F90 @@ -94,8 +94,11 @@ subroutine Advance_fire_components (grid, config_flags) integer, parameter :: PRINT_LEVEL = 1 integer :: ij + logical, parameter :: DEBUG_LOCAL = .false. + if (DEBUG_LOCAL) call Print_message ('Entering Advance_fire_components...') + if (config_flags%fmoist_run) call grid%fmc_param%Advance_fmc_model (config_flags%fmoist_freq, config_flags%fmoist_dt, & grid%itimestep, grid%dt, grid%ifms, grid%ifme, grid%jfms, grid%jfme, & grid%i_start, grid%i_end, grid%j_start, & @@ -110,6 +113,8 @@ subroutine Advance_fire_components (grid, config_flags) if (config_flags%fire_print_msg >= PRINT_LEVEL) call Print_summary (config_flags, grid) + if (DEBUG_LOCAL) call Print_message ('Leaving Advance_fire_components...') + end subroutine Advance_fire_components function Calc_domain_stats (fun, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, a, b) result (return_value) diff --git a/physics/fire_model_mod.F90 b/physics/fire_model_mod.F90 index 0332f67..cd1cf7e 100644 --- a/physics/fire_model_mod.F90 +++ b/physics/fire_model_mod.F90 @@ -5,6 +5,7 @@ module fire_model_mod use namelist_mod, only : namelist_t use ros_mod, only : ros_t use state_mod, only: state_fire_t + use stderrout_mod, only : Print_message private @@ -43,8 +44,11 @@ subroutine Advance_fire_model (config_flags, grid, i_start, i_end, j_start, j_en integer :: ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme real :: tbound, time_start + logical, parameter :: DEBUG_LOCAL = .false. + if (DEBUG_LOCAL) call Print_message ('Entering Advance_fire_model...') + ifds = grid%ifds ifde = grid%ifde jfds = grid%jfds @@ -62,37 +66,49 @@ subroutine Advance_fire_model (config_flags, grid, i_start, i_end, j_start, j_en time_start = grid%itimestep * grid%dt + if (DEBUG_LOCAL) call Print_message ('calling Prop_level_set...') call Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, time_start, grid%dt, grid%dx, grid%dy, & config_flags%fire_upwinding, config_flags%fire_viscosity, config_flags%fire_viscosity_bg, config_flags%fire_viscosity_band, & config_flags%fire_viscosity_ngp, config_flags%fire_lsm_band_ngp, tbound, grid%lfn, grid%lfn_0, grid%lfn_1, grid%lfn_2, & grid%lfn_out, grid%tign_g, grid%ros, grid%uf, grid%vf, grid%dzdxf, grid%dzdyf, grid%ros_param) + if (DEBUG_LOCAL) call Print_message ('calling Stop_if_close_to_bdy...') call Stop_if_close_to_bdy (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, grid%lfn_out) + if (DEBUG_LOCAL) call Print_message ('calling Update_ignition_times...') call Update_ignition_times (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, & time_start, grid%dt, grid%lfn, grid%lfn_out, grid%tign_g) + if (DEBUG_LOCAL) call Print_message ('calling Calc_flame_length...') call Calc_flame_length (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & grid%ros, grid%ros_param%iboros, grid%flame_length, grid%ros_front, grid%fire_area) + if (DEBUG_LOCAL) call Print_message ('calling Reinit_level_set...') if (config_flags%fire_lsm_reinit) call Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & ifds, ifde, jfds, jfde, time_start, grid%dt, grid%dx, grid%dy, config_flags%fire_upwinding_reinit, & config_flags%fire_lsm_reinit_iter, config_flags%fire_lsm_band_ngp, grid%lfn, grid%lfn_2, grid%lfn_s0, & grid%lfn_s1, grid%lfn_s2, grid%lfn_s3, grid%lfn_out, grid%tign_g) + if (DEBUG_LOCAL) call Print_message ('calling Copy_lfnout_to_lfn...') call Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, grid%lfn_out, grid%lfn) - + + if (DEBUG_LOCAL) call Print_message ('calling Ignite_prescribed_fires...') call Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) + if (DEBUG_LOCAL) call Print_message ('calling Calc_fuel_left...') call Calc_fuel_left (ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, ifts, ifte, jfts, jfte, & grid%lfn,grid%tign_g,grid%fuel_time, time_start + grid%dt, grid%fuel_frac, grid%fire_area, & grid%fuel_frac_burnt_dt) + if (DEBUG_LOCAL) call Print_message ('calling Calc_fire_fluxes...') call Calc_fire_fluxes (grid%dt, grid, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, & ifts, ifte, jfts, jfte, grid%fuel_load_g, grid%fuel_frac_burnt_dt, grid%fgrnhfx, grid%fgrnqfx) + if (DEBUG_LOCAL) call Print_message ('calling Calc_smoke_emissions...') call Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) + if (DEBUG_LOCAL) call Print_message ('Leaving Advance_fire_model...') + end subroutine Advance_fire_model subroutine Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) diff --git a/physics/level_set_mod.F90 b/physics/level_set_mod.F90 index cf558e0..8b00928 100644 --- a/physics/level_set_mod.F90 +++ b/physics/level_set_mod.F90 @@ -14,7 +14,7 @@ module level_set_mod ! https://doi.org/10.1002/2017MS001108 use ros_wrffire_mod, only: ros_wrffire_t - use stderrout_mod, only: Stop_simulation + use stderrout_mod, only: Stop_simulation, Print_message use state_mod, only: state_fire_t use ignition_line_mod, only : ignition_line_t use ros_mod, only : ros_t @@ -290,8 +290,11 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & real :: tbound2, tbound3 integer :: i, j character (len = :), allocatable :: msg + logical, parameter :: DEBUG_LOCAL = .false. + if (DEBUG_LOCAL) call Print_message ('Entering sub Prop_level_set...') + ! Runge-Kutta step 1 do j = jfts, jfte do i = ifts, ifte @@ -299,6 +302,7 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do end do + if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 1...') call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & ifms, ifme, jfms, jfme, ts, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & @@ -311,6 +315,8 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do ! Runge-Kutta step 2 + if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 2...') + call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & ifms,ifme,jfms,jfme, ts + dt, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & @@ -323,6 +329,8 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do ! Runge-Kutta step 3 + if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 3...') + call Calc_tend_ls (ifds,ifde,jfds,jfde, ifts, ifte, jfts, jfte, & ifms, ifme, jfms, jfme, ts + dt, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & @@ -344,6 +352,8 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & !$omp end critical end if + if (DEBUG_LOCAL) call Print_message ('leaving sub Prop_level_set...') + end subroutine Prop_level_set subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & @@ -613,15 +623,20 @@ subroutine Calc_tend_ls (ids, ide, jds, jde, its, ite, jts, jte, ifms, ifme, jfm threshold_hlu, threshold_av, fire_viscosity_var integer :: i, j character (len = :), allocatable :: msg + logical, parameter :: DEBUG_LOCAL = .false. + + if (DEBUG_LOCAL) call Print_message ('Entering subroutine Calc_tend_ls') threshold_hll = -fire_lsm_band_ngp * dx threshold_hlu = fire_lsm_band_ngp * dx threshold_av = fire_viscosity_ngp * dx + if (DEBUG_LOCAL) call Print_message ('calling Extrapol_var_at_bdys') call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ids, ide, jds, jde, & its, ite, jts, jte, lfn) + if (DEBUG_LOCAL) call Print_message ('starting ij loops') tbound = 0.0 do j = jts, jte do i = its, ite @@ -783,6 +798,8 @@ subroutine Calc_tend_ls (ids, ide, jds, jde, its, ite, jts, jte, ifms, ifme, jfm ! final CFL bound tbound = 1.0 / (tbound + TOL) + if (DEBUG_LOCAL) call Print_message ('Leaving subroutine Calc_tend_ls') + end subroutine Calc_tend_ls pure function Select_upwind (diff_lx, diff_rx) result (return_value) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 2b466b4..d7b766c 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -233,7 +233,7 @@ subroutine Init_domain (this, config_flags, geogrid, & ifds, ifde, ifms, ifme, ifps, ifpe, & jfds, jfde, jfms, jfme, jfps, jfpe, & kfds, kfde, kfms, kfme, kfps, kfpe, & - kfts, kfte, ide, jde, i_start, i_end, j_start, j_end, & + kfts, kfte, ide, jde, & cen_lat, cen_lon, truelat1, truelat2, stand_lon, & dx, dy, sr_x, sr_y, nfuel_cat, zsf, dzdxf, dzdyf) @@ -248,10 +248,8 @@ subroutine Init_domain (this, config_flags, geogrid, & kfds, kfde, kfms, kfme, kfps, kfpe, & kfts, kfte, sr_x, sr_y, ide, jde real, intent (in), optional :: cen_lat, cen_lon, truelat1, truelat2, stand_lon, dx, dy - integer, dimension(:), intent (in), optional :: i_start, i_end, j_start, j_end real, dimension(:, :), intent (in), optional :: nfuel_cat, zsf, dzdxf, dzdyf - integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1, INIT_MODE_WRF = 2 type (proj_lc_t) :: proj logical, parameter :: DEBUG_LOCAL = .false. @@ -264,7 +262,6 @@ subroutine Init_domain (this, config_flags, geogrid, & present (jfds) .and. present (jfde) .and. present (jfms) .and. present (jfme) .and. present (jfps) .and. present (jfpe) .and. & present (kfds) .and. present (kfde) .and. present (kfms) .and. present (kfme) .and. present (kfps) .and. present (kfpe) .and. & present (kfts) .and. present (kfte) .and. present (ide) .and. present (jde) .and. & - present (i_start) .and. present (i_end) .and. present (j_start) .and. present (j_end) .and. & present (cen_lat) .and. present (cen_lon) .and. present (truelat1) .and. present (truelat2) .and. present (stand_lon) .and. & present (dx) .and. present (dy) .and. present (sr_x) .and. present (sr_y) .and. present (nfuel_cat) .and. present (zsf) .and. & present (dzdxf) .and. present (dzdyf)) & @@ -304,8 +301,6 @@ subroutine Init_domain (this, config_flags, geogrid, & this%kfts = config_flags%kds this%kfte = config_flags%kde - call this%Init_tiles (config_flags) - case (INIT_MODE_WRF) this%ifds = ifds this%ifde = ifde @@ -330,17 +325,14 @@ subroutine Init_domain (this, config_flags, geogrid, & this%kfts = kfts this%kfte = kfte - this%i_start = i_start - this%j_start = j_start - this%i_end = i_end - this%j_end = j_end - case default call Stop_simulation ('Not ready to complete fire state initialization 1') end select Set_dims + call this%Init_tiles (config_flags) + this%nx = this%ifde this%ny = this%jfde this%dt = config_flags%dt From 33a6c1bf3dd885f1d693d7bd8ac771593ba3224a Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 2 Oct 2024 10:12:44 -0600 Subject: [PATCH 15/57] One-way coupling to WRF --- CMakeLists.txt | 1 + io/wrf_mod.F90 | 66 +++++++++++++++++++++++++- physics/level_set_mod.F90 | 2 +- share/interp_mod.F90 | 99 +++++++++++++++++++++++++++++++++++++++ state/state_mod.F90 | 2 + 5 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 share/interp_mod.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index e9b7ec8..e2b1a39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ list(APPEND _share_files share/proj_lc_mod.F90 share/fuel_mod.F90 share/ros_mod.F90 share/fmc_mod.F90 + share/interp_mod.F90 share/constants_mod.F90) # IO diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index a246e26..b549a2e 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -6,12 +6,13 @@ module wrf_mod use netcdf_mod, only : Get_netcdf_var, Get_netcdf_att, Get_netcdf_dim, Is_netcdf_file_present use proj_lc_mod, only : proj_lc_t use stderrout_mod, only : Print_message + use interp_mod, only : Interp_profile implicit none private - public :: wrf_t, G, RERADIUS + public :: wrf_t, G, RERADIUS, Interp_wrf2dvar_to_cfbm, Interp_wrfwinds_to_cfbm real, parameter :: G = 9.81 ! acceleration due to gravity [m s-2] real, parameter :: RERADIUS = 1.0 / 6370.0e03 ! reciprocal of earth radius (m^-1) @@ -643,6 +644,69 @@ subroutine Interp_var2grid_nearest (this, lats_in, lons_in, var_name, vals_out) end subroutine Interp_var2grid_nearest + subroutine Interp_wrf2dvar_to_cfbm (wrfatm2dvar, ims, ime, jms, jme, ifms, ifme, jfms, jfme, ifps, ifpe, jfps, jfpe, & + lats_in, lons_in, proj, vals_out) + + implicit none + + integer, intent (in) :: ims, ime, jms, jme, & + ifms, ifme, jfms, jfme, & + ifps, ifpe, jfps, jfpe + real, dimension(ims:ime, jms:jme), intent (in) :: wrfatm2dvar + real, dimension(ifms:ifme, jfms:jfme), intent (in) :: lats_in, lons_in + type (proj_lc_t), intent (in) :: proj + real, dimension(ifms:ifme, jfms:jfme), intent (in out) :: vals_out + + integer :: i, j, i_wrf, j_wrf + real :: i_real, j_real + + + do j = jfps, jfpe + do i = ifps, ifpe + call proj%Calc_ij (lats_in(i, j), lons_in(i, j), i_real, j_real) + i_wrf = min (max (ims, nint (i_real)), ime) + j_wrf = min (max (jms, nint (j_real)), jme) + vals_out(i, j) = wrfatm2dvar(i_wrf, j_wrf) + end do + end do + + end subroutine Interp_wrf2dvar_to_cfbm + + subroutine Interp_wrfwinds_to_cfbm (u_phy, v_phy, z_at_w, ims, ime, kms, kme, jms, jme, ifms, ifme, jfms, jfme, ifps, ifpe, jfps, jfpe, & + kfds, kfde, lats_in, lons_in, proj, z0f, fire_lsm_zcoupling, fire_lsm_zcoupling_ref, fire_wind_height, u_out, v_out) + + implicit none + + integer, intent (in) :: ims, ime, kms, kme, jms, jme, & + ifms, ifme, jfms, jfme, & + ifps, ifpe, jfps, jfpe, & + kfds, kfde + logical, intent (in) :: fire_lsm_zcoupling + real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: u_phy, v_phy, z_at_w + real, dimension(ifms:ifme, jfms:jfme), intent (in) :: lats_in, lons_in, z0f + type (proj_lc_t), intent (in) :: proj + real, intent (in) :: fire_wind_height, fire_lsm_zcoupling_ref + real, dimension(ifms:ifme, jfms:jfme), intent (in out) :: u_out, v_out + + integer :: i, j, i_wrf, j_wrf + real :: i_real, j_real, uout, vout + + + do j = jfps, jfpe + do i = ifps, ifpe + call proj%Calc_ij (lats_in(i, j), lons_in(i, j), i_real, j_real) + i_wrf = min (max (ims, nint (i_real)), ime) + j_wrf = min (max (jms, nint (j_real)), jme) + call Interp_profile (fire_lsm_zcoupling, fire_lsm_zcoupling_ref, fire_wind_height, kfds, kfde, & + u_phy(i_wrf, :, j_wrf), v_phy(i_wrf, :, j_wrf), z_at_w(i_wrf, :, j_wrf), z0f(i, j), & + uout, vout) + u_out(i, j) = uout + v_out(i, j) = vout + end do + end do + + end subroutine Interp_wrfwinds_to_cfbm + subroutine Print_domain (this) use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT diff --git a/physics/level_set_mod.F90 b/physics/level_set_mod.F90 index 8b00928..1b4d727 100644 --- a/physics/level_set_mod.F90 +++ b/physics/level_set_mod.F90 @@ -398,7 +398,7 @@ subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & jfds, jfde, ifts, ifte, jfts, jfte, lfn_s3) - dt_s = 0.0001 * dx + dt_s = 0.01 * dx ! iterate to solve to steady state reinit PDE ! 1 iter each time step is enoguh do nts = 1, fire_lsm_reinit_iter diff --git a/share/interp_mod.F90 b/share/interp_mod.F90 new file mode 100644 index 0000000..57932b3 --- /dev/null +++ b/share/interp_mod.F90 @@ -0,0 +1,99 @@ + module interp_mod + + implicit none + + private + + public :: Interp_profile + + contains + + subroutine Interp_profile (fire_lsm_zcoupling, fire_lsm_zcoupling_ref, fire_wind_height, kfds, kfde, & + uin, vin, z_at_w, z0f, uout, vout) + + implicit none + + real, intent (in) :: fire_wind_height, fire_lsm_zcoupling_ref + integer, intent (in) :: kfds, kfde + real, dimension(:), intent (in) :: uin, vin, z_at_w + real, intent (in) :: z0f + logical, intent (in) :: fire_lsm_zcoupling + real, intent (out) :: uout, vout + + + real, parameter :: VK_KAPPA = 0.4 + real, dimension (kfds:kfde - 1) :: altw, hgt + integer :: k, kdmax + real :: loght, loglast, logz0, logfwh, ht, r_nan, fire_wind_height_local, z0fc, & + ust_d, wsf, wsf1, uf_temp, vf_temp + + + ! max layer to interpolate from, can be less + kdmax = kfde - 2 + do k = kfds, kdmax + 1 + ! altitude of the bottom w-point +! altw(k) = phl(k) / G + altw(k) = z_at_w(k) + end do + + do k = kfds, kdmax + ! height of the mass point above the ground + hgt(k) = 0.5 * (altw(k) + altw(k + 1)) - altw(kfds) + end do + + ! extrapolate mid-flame height from fire_lsm_zcoupling_ref? + if (fire_lsm_zcoupling) then + logfwh = log (fire_lsm_zcoupling_ref) + fire_wind_height_local = fire_lsm_zcoupling_ref + else + logfwh = log (fire_wind_height) + fire_wind_height_local = fire_wind_height + end if + + ! interpolate u + if (fire_wind_height_local > z0f)then + do k = kfds, kdmax + ht = hgt(k) + if (ht >= fire_wind_height_local) then + ! found layer k this point is in + loght = log(ht) + if (k == kfds) then + ! first layer, log linear interpolation from 0 at zr + logz0 = log(z0f) + uout = uin(k) * (logfwh - logz0) / (loght - logz0) + vout = vin(k) * (logfwh - logz0) / (loght - logz0) + else + ! log linear interpolation + loglast = log (hgt(k - 1)) + uout = uin(k - 1) + (uin(k) - uin(k - 1)) * (logfwh - loglast) / (loght - loglast) + vout = vin(k - 1) + (vin(k) - vin(k - 1)) * (logfwh - loglast) / (loght - loglast) + end if + exit + end if + if (k == kdmax) then + ! last layer, still not high enough + uout = uin(k) + vout = vin(k) + end if + end do + else + ! roughness higher than the fire wind height + uout = 0.0 + vout = 0.0 + end if + + ! Extrapol wind to target height + if (fire_lsm_zcoupling) then + uf_temp = uout + vf_temp = vout + wsf = max (sqrt (uf_temp ** 2.0 + vf_temp ** 2.0), 0.1) + z0fc = z0f + ust_d = wsf * VK_KAPPA / log(fire_lsm_zcoupling_ref / z0fc) + wsf1 = (ust_d / VK_KAPPA) * log((fire_wind_height + z0fc) / z0fc) + uout = wsf1 * uf_temp / wsf + vout = wsf1 * vf_temp / wsf + end if + + end subroutine Interp_profile + + end module interp_mod diff --git a/state/state_mod.F90 b/state/state_mod.F90 index d7b766c..10f035a 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -72,6 +72,7 @@ module state_mod class (ros_t), allocatable :: ros_param type (ignition_line_t) :: ignition_lines class (fmc_t), allocatable :: fmc_param + type (proj_lc_t) :: proj ! New vars defined on fire grid for NUOPC coupling real, dimension(:, :), allocatable :: fire_psfc ! "Surface Pressure" "Pa" @@ -367,6 +368,7 @@ subroutine Init_domain (this, config_flags, geogrid, & call Stop_simulation ('Not ready to complete fire state initialization 2') end select Set_proj + this%proj = proj ! Init vars call this%Set_vars_to_default (config_flags) From 451e8b9e01f106f4b896d9ba5661c09f20c619aa Mon Sep 17 00:00:00 2001 From: masih Date: Wed, 16 Oct 2024 17:57:03 -0600 Subject: [PATCH 16/57] subroutine for adding fire smoke to atm tracer --- io/wrf_mod.F90 | 74 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index b549a2e..0803a62 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -12,7 +12,7 @@ module wrf_mod private - public :: wrf_t, G, RERADIUS, Interp_wrf2dvar_to_cfbm, Interp_wrfwinds_to_cfbm + public :: wrf_t, G, RERADIUS, Interp_wrf2dvar_to_cfbm, Interp_wrfwinds_to_cfbm, Provide_atm_feedback real, parameter :: G = 9.81 ! acceleration due to gravity [m s-2] real, parameter :: RERADIUS = 1.0 / 6370.0e03 ! reciprocal of earth radius (m^-1) @@ -731,6 +731,78 @@ subroutine Print_domain (this) end subroutine Print_domain + subroutine Provide_atm_feedback (config_flags, & + ifms, ifme, jfms, jfme, & + i_start, i_end, j_start, j_end, & + num_tiles, & + ifps, ifpe, jfps, jfpe, & + ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte, & + rho, dz8w, & + emis_smoke, smoke_tracer, tracer_opt) + + use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT + implicit none + + type (namelist_t), intent (in) :: config_flags + integer, intent (in) :: ifms, ifme, jfms, jfme, & + ifps, ifpe, jfps, jfpe, & + ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte, num_tiles + + integer, dimension(num_tiles), intent(in) :: i_start, i_end, j_start, j_end + + real, dimension(ifms:ifme, jfms:jfme), intent (in) :: emis_smoke + real, dimension(ims:ime, kms:kme, jms:jme), intent (in out), optional :: smoke_tracer + real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: rho, dz8w + integer, intent (in) :: tracer_opt + + integer :: i, j, ibase, jbase, i_f, j_f, ioff, joff + real :: avgw + integer :: isz1, jsz1, isz2, jsz2, ir, jr + integer :: ifts, ifte, jfts, jfte, ij + + if (tracer_opt == 3) then + + !$OMP PARALLEL DO & + !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte) + DO ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + isz1 = ite - its + 1 + jsz1 = jte - jts + 1 + isz2 = ifte - ifts + 1 + jsz2 = jfte - jfts + 1 + ir = isz2 / isz1 + jr = jsz2 / jsz1 + avgw = 1.0 / (ir * jr) + + do j=max(jds+1,jts),min(jte,jde-2) + jbase = jfts + jr * (j - jts) + do i=max(ids+1,its),min(ite,ide-2) + ibase = ifts + ir * (i - its) + do joff=0,jr-1 + j_f = joff + jbase + do ioff=0,ir-1 + i_f = ioff + ibase + smoke_tracer(i,kts,j) = smoke_tracer(i,kts,j) + & + (avgw * emis_smoke(i_f,j_f) * 1000/(rho(i,kts,j)*dz8w(i,kts,j))) + end do + end do + end do + end do + END DO + !$OMP END PARALLEL DO + + end if + + end subroutine Provide_atm_feedback + subroutine Update_atm_state (this, datetime_now) implicit none From d3fdc2ac2ba49a66370f186693bf037273279768 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:03:42 -0600 Subject: [PATCH 17/57] First draft of fire behavior documentation --- doc/Makefile | 27 ++++ doc/UsersGuide/Configuration.rst | 247 +++++++++++++++++++++++++++++++ doc/UsersGuide/Glossary.rst | 76 ++++++++++ doc/UsersGuide/Idealized.rst | 13 ++ doc/UsersGuide/Introduction.rst | 17 +++ doc/UsersGuide/SRW.rst | 18 +++ doc/UsersGuide/WRFData.rst | 13 ++ doc/UsersGuide/index.rst | 13 ++ doc/conf.py | 216 +++++++++++++++++++++++++++ doc/index.rst | 7 + doc/make.bat | 35 +++++ doc/references.bib | 16 ++ doc/requirements.in | 3 + 13 files changed, 701 insertions(+) create mode 100644 doc/Makefile create mode 100644 doc/UsersGuide/Configuration.rst create mode 100644 doc/UsersGuide/Glossary.rst create mode 100644 doc/UsersGuide/Idealized.rst create mode 100644 doc/UsersGuide/Introduction.rst create mode 100644 doc/UsersGuide/SRW.rst create mode 100644 doc/UsersGuide/WRFData.rst create mode 100644 doc/UsersGuide/index.rst create mode 100644 doc/conf.py create mode 100644 doc/index.rst create mode 100644 doc/make.bat create mode 100644 doc/references.bib create mode 100644 doc/requirements.in diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..c91f2f1 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,27 @@ +# Makefile for Sphinx documentation + +SPHINXOPTS = -a -n #-W +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = build +LINKCHECKDIR = $(BUILDDIR)/linkcheck + +.PHONY: help Makefile linkcheck + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) + +doc: + make clean + $(MAKE) linkcheck + $(MAKE) html + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(SPHINXOPTS) $(SOURCEDIR) $(LINKCHECKDIR) + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). + +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -w $(BUILDDIR)/warnings.log \ No newline at end of file diff --git a/doc/UsersGuide/Configuration.rst b/doc/UsersGuide/Configuration.rst new file mode 100644 index 0000000..b4fc6e2 --- /dev/null +++ b/doc/UsersGuide/Configuration.rst @@ -0,0 +1,247 @@ +.. _Configuration: + +============================================== +Configuring the Community Fire Behavior Module +============================================== + + +.. _domain_config: + +Configuring a domain with the WRF Pre-processing System (WPS) +============================================================= + +Because the CFBM was originally developed as part of the WRF model, creating a domain must be done using the WRF Pre-processing System (WPS). These instructions can be found in `the WRF Users Guide `_. + +Future releases will include a method for creating domains without needing to compile WPS. + +.. _namelist: + +Namelist Configuration +====================== + +The options specific to the CFBM are controlled by a :term:`namelist` file ``namelist.fire``. This namelist file consists of three sections: ``&time``, ``&atm``, and ``&fire``. The available options in each section are described below. + +Example namelists can be found in the various test subdirectories under the ``tests/`` directory. + + +&time +--------------------------------- + +``start_year``: *integer* (Required) + Start year of the simulation. + +``start_month``: *integer* (Required) + Start month of the simulation. + +``start_day``: *integer* (Required) + Start day of the simulation. + +``start_hour``: *integer* (Required) + Start hour of the simulation. + +``start_minute``: *integer* (Required) + Start minute of the simulation. + +``start_second``: *integer* (Required) + Start second of the simulation. + +``end_year``: *integer* (Required) + End year of the simulation. + +``end_month``: *integer* (Required) + End month of the simulation. + +``end_day``: *integer* (Required) + End day of the simulation. + +``end_hour``: *integer* (Required) + End hour of the simulation. + +``end_minute``: *integer* (Required) + End minute of the simulation. + +``end_second``: *integer* (Required) + End second of the simulation. + +``dt``: *real* (Default: ``2.0``) + Atmospheric time step in seconds. + +``interval_output``: *integer* (Required) + Description needed + +``num_tiles``: *integer* (Default: ``1``) + Description needed + + +&atm +---- +``kde``: *integer* (Default: ``2``) + Number of vertical levels for the atmospheric simulation + +``interval_atm``: *integer* (Default: ``0``) + Description needed + + +&fire +----- + +``fire_print_msg``: *integer* (Default: ``0``) + Debug print level for the fire module. + Levels greater than 0 will print extra messages at run time. + + 0: no extra prints + + 1: Extra prints + + 2: More extra prints + + 3: Even more extra prints + +``fire_atm_feedback``: *real* (Default: ``1.0``) + Multiplier for heat fluxes from the fire to the atmosphere. + Use 0.0 for one-way (atmosphere --> fire) coupling. Use 1.0 for normal two-way coupling. + Intermediate values will vary the amount of forcing provided from the fire to the dynamical core. + +``fire_upwinding``: *integer* (Default: ``9``) + Method for calculating fire spread upwind. + 0: None + + 1: Standard + + 2: GODUNOV + + 3: ENO + + 4: SETHIAN + + 5: 2nd-order + + 6: WENO3 + + 7: WENO5 + + 8: hybrid WENO3/ENO1 + + 9: hybrid WENO5/ENO1 + + More description needed for these options + +``fire_viscosity``: *real* (Default: ``0.4``) + Artificial viscocity in :term:`level-set method` away from the near-front region. + +``fire_lsm_reinit``: *logical* (Default: ``.true.``) + + Flag to activate reinitialization of the :term:`level-set method` + +``fire_lsm_reinit_iter``: *integer* (Default: ``1``) + Number of iterations for reinitialization :term:`PDE` + +``fire_upwinding_reinit``: *integer* (Default: ``4``) + Numerical scheme (space) for reinitialization :term:`PDE`. + 1: WENO3 + + 2: WENO5 + + 3: hybrid WENO3-ENO1 + + 4: hybrid WENO5-ENO1 + +``fire_lsm_band_ngp``: *integer* (Default: ``4``) + When using ``fire_upwinding_reinit=3,4`` and ``fire_upwinding=8/9``, the number of grid points around lfn=0 that WENO5/3 is used + +``fire_lsm_zcoupling``: *logical* (Default: ``1``) + When true, uses ``fire_lsm_zcoupling_ref`` instead of ``fire_wind_height`` as a reference height to calculate the logarithmic surface layer wind profile + +``fire_lsm_zcoupling_ref``: *real* (Default: ``50.0``) + Units: m + Reference height from which the velocity at ``fire_wind_height`` is calculated using a logarithmic profile + +``fire_viscosity_bg``: *real* (Default: ``0.4``) + Artificial viscosity in the near-front region + +``fire_viscosity_band``: *real* (Default: ``0.5``) + Number of times the hybrid advection band to transition from ``fire_viscosity_bg`` to ``fire_viscosity`` + +``fire_viscosity_ngp``: *integer* (Default: ``2``) + Number of grid points around lfn=0 where ``fire_viscosity_bg`` is used + +``fmoist_run``: *logical* (Default: ``.false.``) + Runs moisture model on the atmospheric grid, outputting the result as a variable named ``fmc_gc`` + +``fmoist_freq``: *integer* (Default: ``0``) + Frequency to run moisture model. + 0: use ``fmoist_dt`` + + k>0: every "k" timesteps + +``fmoist_dt``: *integer* (Default: ``600``) + Units: s + Time step of moisture model (only used if ``fmoist_freq=0``) + +``fire_wind_height``: *integer* (Default: ``6.096``) + Units: m + Height of uah,vah wind in fire spread formula + +``fire_is_real_perim``: *logical* (Default: ``.false.``) + Determines if perimeter represents a real fire boundary. + .true. = observed perimeter + + .false. = point/line ignition + +``frac_fburnt_to_smoke``: *real* (Default: ``0.02``) + Units: g/kg + Parts per unit of burned fuel converted to smoke, represented as grams of smoke per kilogram of air. + +``fuelmc_g``: *real* (Default: ``0.08``) + Fuel moisture content ground (Dead :term:`FMC`) + +``fuelmc_g_live``: *real* (Default: ``0.30``) + Fuel moisture content ground (Live :term:`FMC`). 30% Completely cured, treat as dead fuel + +``fuelmc_c``: *real* (Default: ``1.00``) + Fuel moisture content of the canopy + +``fuel_opt``: *integer* (Default: ``1``) + Do not change. + Fuel model + +``ros_opt``: *integer* (Default: ``0``) + Do not change. + Rate of spread option parameterization. + +``fmc_opt``: *integer* (Default: ``1``) + Do not change. + :term:`FMC` model + +``fire_num_ignitions``: *integer* (Default: ``1``) + Number of ignitions for fire initiation. Maximum of 5. + +.. note:: + For each additional fire ignition, you must specify an additional set of ignition parameters below, with increasing numerical suffixes ( *i.e.* ``fire_ignition_start_lon2``, ``fire_ignition_start_lon3``, etc. ) + +``fire_ignition_start_lon1``: *real* (Default: ``0.0``) + Longitude of first ignition start point. + +``fire_ignition_start_lat1``: *real* (Default: ``0.0``) + Latitude of first ignition start point. + +``fire_ignition_end_lon1``: *real* (Default: ``0.0``) + Longitude of first ignition end point. + +``fire_ignition_end_lat1``: *real* (Default: ``0.0``) + Latitude of first ignition end point. + +``fire_ignition_ros1``: *real* (Default: ``0.01``) + Rate of spread for first ignition (Rothermel parameterization). + +``fire_ignition_start_time1``: *integer* (Default: ``0.0``) + Start time of first ignition in seconds (counting from the beginning of the simulation) + +``fire_ignition_end_time1``: *integer* (Default: ``1``) + End time of first ignition in seconds (counting from the beginning of the simulation) + +``fire_ignition_radius1``: *real* (Default: ``1``) + Units: m + Radius of the ignition area for first ignition. + + diff --git a/doc/UsersGuide/Glossary.rst b/doc/UsersGuide/Glossary.rst new file mode 100644 index 0000000..107c99e --- /dev/null +++ b/doc/UsersGuide/Glossary.rst @@ -0,0 +1,76 @@ +.. _Glossary: + +************************* +Glossary +************************* + +.. glossary:: + + advect + advection + According to the American Meteorological Society (AMS) definition, `advection `_ is "The process of transport of an atmospheric property solely by the mass motion (velocity field) of the atmosphere." In common parlance, advection is movement of atmospheric substances that are carried around by the wind. + + CAPE + Convective Available Potential Energy. + + CCPP + The `Common Community Physics Package `_ is a forecast-model agnostic, vetted collection of code containing atmospheric physical parameterizations and suites of parameterizations for use in Numerical Weather Prediction (NWP) along with a framework that connects the physics to the host forecast model. + + ESMF + `Earth System Modeling Framework `__. The ESMF defines itself as “a suite of software tools for developing high-performance, multi-component Earth science modeling applications.” + + FMC + Fuel moisture content + + FV3 + The Finite-Volume Cubed-Sphere :term:`dynamical core` (dycore). Developed at NOAA's `Geophysical + Fluid Dynamics Laboratory `__ (GFDL), it is a scalable and flexible dycore capable of both hydrostatic and non-hydrostatic atmospheric simulations. It is the dycore used in the UFS Weather Model. + + HRRR + `High Resolution Rapid Refresh `__. The HRRR is a NOAA real-time 3-km resolution, hourly updated, cloud-resolving, convection-allowing atmospheric model initialized by 3km grids with 3km radar assimilation. Radar data is assimilated in the HRRR every 15 min over a 1-h period adding further detail to that provided by the hourly data assimilation from the 13km radar-enhanced Rapid Refresh. + + ICs + Initial conditions + + level-set method + A commonly used method in wildland fire modeling used to track and propogate the fire perimiter. More details available in :cite:alp:`LevelSetMethod`. + + LBCs + Lateral boundary conditions + + namelist + A namelist defines a group of variables or arrays. Namelists are an I/O feature for format-free input and output of variables by key-value assignments in Fortran compilers. Fortran variables can be read from and written to plain-text files in a standardised format, usually with a ``.nml`` file ending. + + NCAR + The `National Center for Atmospheric Research `__. + + NCEP + National Centers for Environmental Prediction (NCEP) is an arm of the National Weather Service + consisting of nine centers. More information can be found at https://www.ncep.noaa.gov. + + netCDF + NetCDF (`Network Common Data Form `__) is a file format and community standard for storing multidimensional scientific data. It includes a set of software libraries and machine-independent data formats that support the creation, access, and sharing of array-oriented scientific data. + + NUOPC + The `National Unified Operational Prediction Capability `__ Layer "defines conventions and a set of generic components for building coupled models using the Earth System Modeling Framework (:term:`ESMF`)." + + NWS + The `National Weather Service `__ (NWS) is an agency of the United States government that is tasked with providing weather forecasts, warnings of hazardous weather, and other weather-related products to organizations and the public for the purposes of protection, safety, and general information. It is a part of the National Oceanic and Atmospheric Administration (NOAA) branch of the Department of Commerce. + + Parameterizations + Simplified functions that approximate the effects of small-scale processes (e.g., microphysics, gravity wave drag) that cannot be explicitly resolved by a model grid’s representation of the earth. + + PDE + Partial differential equation + + SDF + Suite Definition File. An external file containing information about the construction of a physics suite. It describes the schemes that are called, in which order they are called, whether they are subcycled, and whether they are assembled into groups to be called together. + + tracer + According to the American Meteorological Society (AMS) definition, a `tracer `_ is "Any substance in the atmosphere that can be used to track the history [i.e., movement] of an air mass." Tracers are carried around by the motion of the atmosphere (i.e., by :term:`advection`). These substances are usually gases (e.g., water vapor, CO2), but they can also be non-gaseous (e.g., rain drops in microphysics parameterizations). In weather models, temperature (or potential temperature), absolute humidity, and radioactivity are also usually treated as tracers. According to AMS, "The main requirement for a tracer is that its lifetime be substantially longer than the transport process under study." + + UFS + The Unified Forecast System is a community-based, coupled, comprehensive Earth modeling + system consisting of several applications (apps). These apps span regional to global + domains and sub-hourly to seasonal time scales. The UFS is designed to support the :term:`Weather Enterprise` and to be the source system for NOAA's operational numerical weather prediction applications. For more information, visit https://ufs.epic.noaa.gov/. + diff --git a/doc/UsersGuide/Idealized.rst b/doc/UsersGuide/Idealized.rst new file mode 100644 index 0000000..4a2f5da --- /dev/null +++ b/doc/UsersGuide/Idealized.rst @@ -0,0 +1,13 @@ +.. _Idealized: + +===================== +CFBM: Idealized cases +===================== + +Under construction + +.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif + :height: 400 + :alt: An animated construction sign + :align: center + diff --git a/doc/UsersGuide/Introduction.rst b/doc/UsersGuide/Introduction.rst new file mode 100644 index 0000000..f4038e4 --- /dev/null +++ b/doc/UsersGuide/Introduction.rst @@ -0,0 +1,17 @@ +.. _Introduction: + +============== +Introduction +============== + +Under construction + +.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif + :height: 400 + :alt: An animated construction sign + :align: center + +References +================= + +.. bibliography:: ../references.bib diff --git a/doc/UsersGuide/SRW.rst b/doc/UsersGuide/SRW.rst new file mode 100644 index 0000000..b7b3e2f --- /dev/null +++ b/doc/UsersGuide/SRW.rst @@ -0,0 +1,18 @@ +.. _SRW: + +================================================ +Coupling to the UFS: Running the CFBM in the SRW +================================================ + +Under construction + +.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif + :height: 400 + :alt: An animated construction sign + :align: center + +UFS Short-Range Weather Application (SRW) +========================================= + +You can run CFBM in the UFS SRW! Here is how... + diff --git a/doc/UsersGuide/WRFData.rst b/doc/UsersGuide/WRFData.rst new file mode 100644 index 0000000..8db2b61 --- /dev/null +++ b/doc/UsersGuide/WRFData.rst @@ -0,0 +1,13 @@ +.. _WRF_data: + +================================ +Running real cases with WRF data +================================ + +Under construction + +.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif + :height: 400 + :alt: An animated construction sign + :align: center + diff --git a/doc/UsersGuide/index.rst b/doc/UsersGuide/index.rst new file mode 100644 index 0000000..7bc78b6 --- /dev/null +++ b/doc/UsersGuide/index.rst @@ -0,0 +1,13 @@ +User's Guide +============== + +.. toctree:: + :numbered: + :maxdepth: 3 + + Introduction + Configuration + SRW + WRFData + Idealized + Glossary diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..2f28067 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +import sphinx +from sphinx.util import logging +sys.path.insert(0, os.path.abspath('../physics')) +sys.path.insert(0, os.path.abspath('../tests')) + + +# -- Project information ----------------------------------------------------- + +project = 'Community Fire Behavior Model User\'s Guide' +copyright = '2024, ' +author = ' ' + +# The short X.Y version +version = 'develop' +# The full version, including alpha/beta/rc tags +release = f'Documentation version {version}' +html_logo = "https://www.archives.ucar.edu/sites/default/files/images/NSF-NCAR_Lockup-UCAR-Dark_102523%20%282%29.png" + +numfig = True + +nitpick_ignore = [('py:class', 'obj'),('py:class', + 'yaml.dumper.Dumper'),('py:class', + 'xml.etree.ElementTree'),] + +# -- General configuration --------------------------------------------------- + +# Sphinx extension module names: +extensions = [ + 'sphinx_rtd_theme', + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.intersphinx', + 'sphinx.ext.extlinks', + 'sphinx.ext.mathjax', + 'sphinxcontrib.bibtex', +] + +bibtex_bibfiles = ['references.bib'] +bibtex_reference_style = 'author_year' + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. +# Not set because default is 'en'. +# language = 'en' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', + '.DS_Store',] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# Documentation-wide substitutions + +rst_prolog = """ +.. |wflow_env| replace:: ``srw_app`` +.. |graphics_env| replace:: ``regional_workflow`` +.. |cmaq_env| replace:: ``regional_workflow_cmaq`` +.. |activate| replace:: ``conda activate srw_app`` +.. |prompt| replace:: ``(srw_app)`` +.. |latestr| replace:: v2.2.0 +.. |branch| replace:: ``develop`` +.. |data| replace:: develop +""" + +# Linkcheck options + +# Avoid a 403 Forbidden error when accessing certain links (e.g., noaa.gov) +user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + +# Ignore working links that cause a linkcheck 403 error. +#linkcheck_ignore = [r'https://www\.intel\.com/content/www/us/en/docs/cpp\-compiler/developer\-guide\-reference/2021\-10/thread\-affinity\-interface\.html', +# r'https://www\.intel\.com/content/www/us/en/developer/tools/oneapi/hpc\-toolkit\-download\.html', +# r'https://glossary.ametsoc.org/.*', +# ] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' +html_theme_path = ["_themes", ] +html_logo= "https://www.archives.ucar.edu/sites/default/files/images/NSF-NCAR_Lockup-UCAR-Dark_102523%20%282%29.png" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} +html_theme_options = { + "body_max_width": "none", + "navigation_depth": 8, + } + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'UFS-SRWeather-App' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_engine = 'pdflatex' +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + 'pointsize': '11pt', + + # Additional stuff for the LaTeX preamble. + 'preamble': r''' + \usepackage{charter} + \usepackage[defaultsans]{lato} + \usepackage{inconsolata} + ''', + # Release name prefix + 'releasename': ' ', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'CFBM-UsersGuide.tex', 'Community Fire Behavior Module Documentation', + ' ', 'manual'), +] + + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- + + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'hpc-stack': ('https://hpc-stack-epic.readthedocs.io/en/develop/', None), + 'spack-stack': ('https://spack-stack.readthedocs.io/en/develop/', None), + 'met': ('https://met.readthedocs.io/en/develop/', None), + 'metplus': ('https://metplus.readthedocs.io/en/develop/', None), + 'ufs-wm': ('https://ufs-weather-model.readthedocs.io/en/develop/', None), + 'upp': ('https://upp.readthedocs.io/en/develop/', None), + 'ufs-utils': ('https://noaa-emcufs-utils.readthedocs.io/en/latest/', None), + 'ccpp-techdoc': ('https://ccpp-techdoc.readthedocs.io/en/ufs_srw_app_v2.2.0/', None), + 'stochphys': ('https://stochastic-physics.readthedocs.io/en/latest/', None), + 'srw_v2.2.0': ('https://ufs-srweather-app.readthedocs.io/en/release-public-v2.2.0/', None), +} + +# -- Options for extlinks extension --------------------------------------- + +extlinks_detect_hardcoded_links = True +extlinks = {'github-docs': ('https://docs.github.com/en/%s', '%s'), + 'nco': ('https://www.nco.ncep.noaa.gov/idsb/implementation_standards/%s', '%s'), + "rst": ("https://www.sphinx-doc.org/en/master/usage/restructuredtext/%s", "%s"), + "rtd": ("https://readthedocs.org/projects/ufs-srweather-app/%s", "%s"), + 'srw-repo': ('https://github.com/ufs-community/ufs-srweather-app/%s', '%s'), + 'srw-wiki': ('https://github.com/ufs-community/ufs-srweather-app/wiki/%s','%s'), + 'uw': ('https://uwtools.readthedocs.io/en/main/%s', '%s'), + } + diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..b190727 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,7 @@ +Community Fire Behavior Module (CFBM) Documentation (|version|) +============================================================ + +.. toctree:: + :maxdepth: 2 + + UsersGuide/index diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..295c7e3 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=doc +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/doc/references.bib b/doc/references.bib new file mode 100644 index 0000000..33fe1bd --- /dev/null +++ b/doc/references.bib @@ -0,0 +1,16 @@ +@article{CFBM, + title={The Community Fire Behavior Model for coupled fire-atmosphere modeling: Implementation in the Unified Forecast System}, + author={Pedro Angel Jimenez y Munoz and Maria Frediani and Masih Eghdami and Daniel Rosen and Michael Kavulich and and Timothy W. Juliano}, + journal={Geosci. Model Dev.}, + year={2024}, + doi={10.5194/gmd-2024-124}, + } + +@article{LevelSetMethod, + title={An accurate fire-spread algorithm in the Weather Research and Forecasting model using the level-set method}, + author={Domingo Muñoz-Esparza and Branko Kosović and Pedro A. Jiménez and Janice L. Coen}, + journal={J. Adv. Model. Earth Syst.}, + year={2018}, + doi={10.1002/2017MS001108}, + } + diff --git a/doc/requirements.in b/doc/requirements.in new file mode 100644 index 0000000..26c778f --- /dev/null +++ b/doc/requirements.in @@ -0,0 +1,3 @@ +sphinx>=6.0.0 +sphinx_rtd_theme +sphinxcontrib-bibtex From 62d856656146fbdd933184bc113446d484a32237 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:06:36 -0600 Subject: [PATCH 18/57] Add .readthedocs.yaml for automatic documentation builds with ReadTheDocs --- .readthedocs.yaml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..92a05e5 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,32 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "19" + # rust: "1.64" + # golang: "1.19" + +# Build documentation in the "doc/" directory with Sphinx +sphinx: + configuration: doc/conf.py + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: doc/requirements.txt From 155ce455d6fa19ea45c1cba0ef918a3ccf30ffdd Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:14:33 -0600 Subject: [PATCH 19/57] Add requirements.txt needed for readthedocs python environment --- doc/requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/requirements.txt diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 0000000..59709ec --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1 @@ +sphinx-rtd-theme==2.0.0 From dbe532f90b55fe5a98420b6e2aac89d8b0e829cc Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:23:02 -0600 Subject: [PATCH 20/57] Steal SRW requirements.txt as a test --- doc/requirements.txt | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/doc/requirements.txt b/doc/requirements.txt index 59709ec..38fdd2e 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1 +1,81 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --strip-extras requirements.in +# +alabaster==0.7.16 + # via sphinx +babel==2.14.0 + # via sphinx +certifi==2024.7.4 + # via requests +charset-normalizer==3.3.2 + # via requests +docutils==0.20.1 + # via + # pybtex-docutils + # sphinx + # sphinx-rtd-theme + # sphinxcontrib-bibtex +idna==3.7 + # via requests +imagesize==1.4.1 + # via sphinx +jinja2==3.1.4 + # via sphinx +latexcodec==2.0.1 + # via pybtex +markupsafe==2.1.5 + # via jinja2 +packaging==23.2 + # via sphinx +pybtex==0.24.0 + # via + # pybtex-docutils + # sphinxcontrib-bibtex +pybtex-docutils==1.0.3 + # via sphinxcontrib-bibtex +pygments==2.17.2 + # via sphinx +pyyaml==6.0.1 + # via pybtex +requests==2.32.2 + # via sphinx +ruamel-yaml==0.16.13 + # via sphinxcontrib-autoyaml +six==1.16.0 + # via + # latexcodec + # pybtex +snowballstemmer==2.2.0 + # via sphinx +sphinx==7.2.6 + # via + # -r requirements.in + # sphinx-rtd-theme + # sphinxcontrib-autoyaml + # sphinxcontrib-bibtex + # sphinxcontrib-jquery sphinx-rtd-theme==2.0.0 + # via -r requirements.in +sphinxcontrib-applehelp==1.0.8 + # via sphinx +sphinxcontrib-autoyaml==1.1.1 + # via -r requirements.in +sphinxcontrib-bibtex==2.6.2 + # via -r requirements.in +sphinxcontrib-devhelp==1.0.6 + # via sphinx +sphinxcontrib-htmlhelp==2.0.5 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-rtd-theme +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.7 + # via sphinx +sphinxcontrib-serializinghtml==1.1.10 + # via sphinx +urllib3==2.2.2 + # via requests From 575167fcacdbf3071a83a83d1805b9bdc12a3c1d Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:27:26 -0600 Subject: [PATCH 21/57] Remove sphinx_rtd_theme for now --- doc/conf.py | 4 +-- doc/requirements.txt | 81 -------------------------------------------- 2 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 doc/requirements.txt diff --git a/doc/conf.py b/doc/conf.py index 2f28067..02a2323 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -42,7 +42,6 @@ # Sphinx extension module names: extensions = [ - 'sphinx_rtd_theme', 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', @@ -109,8 +108,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' -html_theme_path = ["_themes", ] +html_theme = 'classic' html_logo= "https://www.archives.ucar.edu/sites/default/files/images/NSF-NCAR_Lockup-UCAR-Dark_102523%20%282%29.png" # Theme options are theme-specific and customize the look and feel of a theme diff --git a/doc/requirements.txt b/doc/requirements.txt deleted file mode 100644 index 38fdd2e..0000000 --- a/doc/requirements.txt +++ /dev/null @@ -1,81 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --strip-extras requirements.in -# -alabaster==0.7.16 - # via sphinx -babel==2.14.0 - # via sphinx -certifi==2024.7.4 - # via requests -charset-normalizer==3.3.2 - # via requests -docutils==0.20.1 - # via - # pybtex-docutils - # sphinx - # sphinx-rtd-theme - # sphinxcontrib-bibtex -idna==3.7 - # via requests -imagesize==1.4.1 - # via sphinx -jinja2==3.1.4 - # via sphinx -latexcodec==2.0.1 - # via pybtex -markupsafe==2.1.5 - # via jinja2 -packaging==23.2 - # via sphinx -pybtex==0.24.0 - # via - # pybtex-docutils - # sphinxcontrib-bibtex -pybtex-docutils==1.0.3 - # via sphinxcontrib-bibtex -pygments==2.17.2 - # via sphinx -pyyaml==6.0.1 - # via pybtex -requests==2.32.2 - # via sphinx -ruamel-yaml==0.16.13 - # via sphinxcontrib-autoyaml -six==1.16.0 - # via - # latexcodec - # pybtex -snowballstemmer==2.2.0 - # via sphinx -sphinx==7.2.6 - # via - # -r requirements.in - # sphinx-rtd-theme - # sphinxcontrib-autoyaml - # sphinxcontrib-bibtex - # sphinxcontrib-jquery -sphinx-rtd-theme==2.0.0 - # via -r requirements.in -sphinxcontrib-applehelp==1.0.8 - # via sphinx -sphinxcontrib-autoyaml==1.1.1 - # via -r requirements.in -sphinxcontrib-bibtex==2.6.2 - # via -r requirements.in -sphinxcontrib-devhelp==1.0.6 - # via sphinx -sphinxcontrib-htmlhelp==2.0.5 - # via sphinx -sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.7 - # via sphinx -sphinxcontrib-serializinghtml==1.1.10 - # via sphinx -urllib3==2.2.2 - # via requests From 66b78f7fae127f29ad75713d08554c0715c22072 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:30:54 -0600 Subject: [PATCH 22/57] This should fix it, forgot to add requirements doc to .readthedocs.yaml --- .readthedocs.yaml | 6 +++--- doc/requirements.txt | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 doc/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 92a05e5..ed8f062 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -27,6 +27,6 @@ sphinx: # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -# python: -# install: -# - requirements: doc/requirements.txt +python: + install: + - requirements: doc/requirements.txt diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 0000000..15617eb --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,3 @@ +sphinx-rtd-theme==2.0.0 +sphinxcontrib-bibtex==2.6.2 + From e656e3691cb7e1a679c54e43f2e0fbf654102f53 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 29 Oct 2024 15:39:06 -0600 Subject: [PATCH 23/57] No reason for this nested directory, move everything under doc/ --- doc/{UsersGuide => }/Configuration.rst | 0 doc/{UsersGuide => }/Glossary.rst | 0 doc/{UsersGuide => }/Idealized.rst | 0 doc/{UsersGuide => }/Introduction.rst | 2 +- doc/{UsersGuide => }/SRW.rst | 0 doc/UsersGuide/index.rst | 13 ------------- doc/{UsersGuide => }/WRFData.rst | 0 doc/conf.py | 2 +- doc/index.rst | 14 ++++++++++---- 9 files changed, 12 insertions(+), 19 deletions(-) rename doc/{UsersGuide => }/Configuration.rst (100%) rename doc/{UsersGuide => }/Glossary.rst (100%) rename doc/{UsersGuide => }/Idealized.rst (100%) rename doc/{UsersGuide => }/Introduction.rst (88%) rename doc/{UsersGuide => }/SRW.rst (100%) delete mode 100644 doc/UsersGuide/index.rst rename doc/{UsersGuide => }/WRFData.rst (100%) diff --git a/doc/UsersGuide/Configuration.rst b/doc/Configuration.rst similarity index 100% rename from doc/UsersGuide/Configuration.rst rename to doc/Configuration.rst diff --git a/doc/UsersGuide/Glossary.rst b/doc/Glossary.rst similarity index 100% rename from doc/UsersGuide/Glossary.rst rename to doc/Glossary.rst diff --git a/doc/UsersGuide/Idealized.rst b/doc/Idealized.rst similarity index 100% rename from doc/UsersGuide/Idealized.rst rename to doc/Idealized.rst diff --git a/doc/UsersGuide/Introduction.rst b/doc/Introduction.rst similarity index 88% rename from doc/UsersGuide/Introduction.rst rename to doc/Introduction.rst index f4038e4..7673657 100644 --- a/doc/UsersGuide/Introduction.rst +++ b/doc/Introduction.rst @@ -14,4 +14,4 @@ Under construction References ================= -.. bibliography:: ../references.bib +.. bibliography:: references.bib diff --git a/doc/UsersGuide/SRW.rst b/doc/SRW.rst similarity index 100% rename from doc/UsersGuide/SRW.rst rename to doc/SRW.rst diff --git a/doc/UsersGuide/index.rst b/doc/UsersGuide/index.rst deleted file mode 100644 index 7bc78b6..0000000 --- a/doc/UsersGuide/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -User's Guide -============== - -.. toctree:: - :numbered: - :maxdepth: 3 - - Introduction - Configuration - SRW - WRFData - Idealized - Glossary diff --git a/doc/UsersGuide/WRFData.rst b/doc/WRFData.rst similarity index 100% rename from doc/UsersGuide/WRFData.rst rename to doc/WRFData.rst diff --git a/doc/conf.py b/doc/conf.py index 02a2323..0d2e167 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -29,7 +29,7 @@ # The short X.Y version version = 'develop' # The full version, including alpha/beta/rc tags -release = f'Documentation version {version}' +release = f'version {version}' html_logo = "https://www.archives.ucar.edu/sites/default/files/images/NSF-NCAR_Lockup-UCAR-Dark_102523%20%282%29.png" numfig = True diff --git a/doc/index.rst b/doc/index.rst index b190727..3aad61a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,7 +1,13 @@ Community Fire Behavior Module (CFBM) Documentation (|version|) -============================================================ - +=============================================================== + .. toctree:: - :maxdepth: 2 + :numbered: + :maxdepth: 3 - UsersGuide/index + Introduction + Configuration + SRW + WRFData + Idealized + Glossary From 942b1b0003afb3b523eca4320468855904a01731 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 5 Nov 2024 13:30:14 -0700 Subject: [PATCH 24/57] Add some more units, fix some types, remove spaces at end of lines --- doc/Configuration.rst | 67 ++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/doc/Configuration.rst b/doc/Configuration.rst index b4fc6e2..15705e2 100644 --- a/doc/Configuration.rst +++ b/doc/Configuration.rst @@ -27,37 +27,37 @@ Example namelists can be found in the various test subdirectories under the ``te &time --------------------------------- -``start_year``: *integer* (Required) +``start_year``: *integer* (Required) Start year of the simulation. -``start_month``: *integer* (Required) +``start_month``: *integer* (Required) Start month of the simulation. -``start_day``: *integer* (Required) +``start_day``: *integer* (Required) Start day of the simulation. -``start_hour``: *integer* (Required) +``start_hour``: *integer* (Required) Start hour of the simulation. -``start_minute``: *integer* (Required) +``start_minute``: *integer* (Required) Start minute of the simulation. -``start_second``: *integer* (Required) +``start_second``: *integer* (Required) Start second of the simulation. -``end_year``: *integer* (Required) +``end_year``: *integer* (Required) End year of the simulation. -``end_month``: *integer* (Required) +``end_month``: *integer* (Required) End month of the simulation. -``end_day``: *integer* (Required) +``end_day``: *integer* (Required) End day of the simulation. -``end_hour``: *integer* (Required) +``end_hour``: *integer* (Required) End hour of the simulation. -``end_minute``: *integer* (Required) +``end_minute``: *integer* (Required) End minute of the simulation. ``end_second``: *integer* (Required) @@ -66,7 +66,7 @@ Example namelists can be found in the various test subdirectories under the ``te ``dt``: *real* (Default: ``2.0``) Atmospheric time step in seconds. -``interval_output``: *integer* (Required) +``interval_output``: *integer* (Required) Description needed ``num_tiles``: *integer* (Default: ``1``) @@ -99,7 +99,7 @@ Example namelists can be found in the various test subdirectories under the ``te ``fire_atm_feedback``: *real* (Default: ``1.0``) Multiplier for heat fluxes from the fire to the atmosphere. - Use 0.0 for one-way (atmosphere --> fire) coupling. Use 1.0 for normal two-way coupling. + Use 0.0 for one-way (atmosphere --> fire) coupling. Use 1.0 for normal two-way coupling. Intermediate values will vary the amount of forcing provided from the fire to the dynamical core. ``fire_upwinding``: *integer* (Default: ``9``) @@ -126,14 +126,14 @@ Example namelists can be found in the various test subdirectories under the ``te More description needed for these options -``fire_viscosity``: *real* (Default: ``0.4``) +``fire_viscosity``: *real* (Default: ``0.4``) Artificial viscocity in :term:`level-set method` away from the near-front region. ``fire_lsm_reinit``: *logical* (Default: ``.true.``) - + Flag to activate reinitialization of the :term:`level-set method` -``fire_lsm_reinit_iter``: *integer* (Default: ``1``) +``fire_lsm_reinit_iter``: *integer* (Default: ``1``) Number of iterations for reinitialization :term:`PDE` ``fire_upwinding_reinit``: *integer* (Default: ``4``) @@ -159,22 +159,22 @@ Example namelists can be found in the various test subdirectories under the ``te ``fire_viscosity_bg``: *real* (Default: ``0.4``) Artificial viscosity in the near-front region -``fire_viscosity_band``: *real* (Default: ``0.5``) +``fire_viscosity_band``: *real* (Default: ``0.5``) Number of times the hybrid advection band to transition from ``fire_viscosity_bg`` to ``fire_viscosity`` -``fire_viscosity_ngp``: *integer* (Default: ``2``) +``fire_viscosity_ngp``: *integer* (Default: ``2``) Number of grid points around lfn=0 where ``fire_viscosity_bg`` is used -``fmoist_run``: *logical* (Default: ``.false.``) +``fmoist_run``: *logical* (Default: ``.false.``) Runs moisture model on the atmospheric grid, outputting the result as a variable named ``fmc_gc`` -``fmoist_freq``: *integer* (Default: ``0``) +``fmoist_freq``: *integer* (Default: ``0``) Frequency to run moisture model. 0: use ``fmoist_dt`` k>0: every "k" timesteps -``fmoist_dt``: *integer* (Default: ``600``) +``fmoist_dt``: *real* (Default: ``600.0``) Units: s Time step of moisture model (only used if ``fmoist_freq=0``) @@ -201,7 +201,7 @@ Example namelists can be found in the various test subdirectories under the ``te ``fuelmc_c``: *real* (Default: ``1.00``) Fuel moisture content of the canopy -``fuel_opt``: *integer* (Default: ``1``) +``fuel_opt``: *integer* (Default: ``1``) Do not change. Fuel model @@ -209,11 +209,11 @@ Example namelists can be found in the various test subdirectories under the ``te Do not change. Rate of spread option parameterization. -``fmc_opt``: *integer* (Default: ``1``) +``fmc_opt``: *integer* (Default: ``1``) Do not change. :term:`FMC` model -``fire_num_ignitions``: *integer* (Default: ``1``) +``fire_num_ignitions``: *integer* (Default: ``1``) Number of ignitions for fire initiation. Maximum of 5. .. note:: @@ -222,7 +222,7 @@ Example namelists can be found in the various test subdirectories under the ``te ``fire_ignition_start_lon1``: *real* (Default: ``0.0``) Longitude of first ignition start point. -``fire_ignition_start_lat1``: *real* (Default: ``0.0``) +``fire_ignition_start_lat1``: *real* (Default: ``0.0``) Latitude of first ignition start point. ``fire_ignition_end_lon1``: *real* (Default: ``0.0``) @@ -231,16 +231,19 @@ Example namelists can be found in the various test subdirectories under the ``te ``fire_ignition_end_lat1``: *real* (Default: ``0.0``) Latitude of first ignition end point. -``fire_ignition_ros1``: *real* (Default: ``0.01``) - Rate of spread for first ignition (Rothermel parameterization). +``fire_ignition_ros1``: *real* (Default: ``0.01``) + Units: m/s + Rate of spread for first ignition (Rothermel parameterization). -``fire_ignition_start_time1``: *integer* (Default: ``0.0``) - Start time of first ignition in seconds (counting from the beginning of the simulation) +``fire_ignition_start_time1``: *real* (Default: ``0.0``) + Units: s + Start time of first ignition in seconds (counting from the beginning of the simulation) -``fire_ignition_end_time1``: *integer* (Default: ``1``) - End time of first ignition in seconds (counting from the beginning of the simulation) +``fire_ignition_end_time1``: *real* (Default: ``1``) + Units: s + End time of first ignition in seconds (counting from the beginning of the simulation) -``fire_ignition_radius1``: *real* (Default: ``1``) +``fire_ignition_radius1``: *real* (Default: ``0.0``) Units: m Radius of the ignition area for first ignition. From 89f816e2196156d0c1c3b4f08107e5bfe26bae1a Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 5 Nov 2024 14:43:14 -0700 Subject: [PATCH 25/57] More detailed namelist descriptions, consistent formatting --- doc/Configuration.rst | 110 +++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/doc/Configuration.rst b/doc/Configuration.rst index 15705e2..cd662b9 100644 --- a/doc/Configuration.rst +++ b/doc/Configuration.rst @@ -27,50 +27,51 @@ Example namelists can be found in the various test subdirectories under the ``te &time --------------------------------- -``start_year``: *integer* (Required) +``start_year``: *integer* (**Required**) Start year of the simulation. -``start_month``: *integer* (Required) +``start_month``: *integer* (**Required**) Start month of the simulation. -``start_day``: *integer* (Required) +``start_day``: *integer* (**Required**) Start day of the simulation. -``start_hour``: *integer* (Required) +``start_hour``: *integer* (**Required**) Start hour of the simulation. -``start_minute``: *integer* (Required) +``start_minute``: *integer* (**Required**) Start minute of the simulation. -``start_second``: *integer* (Required) +``start_second``: *integer* (**Required**) Start second of the simulation. -``end_year``: *integer* (Required) +``end_year``: *integer* (**Required**) End year of the simulation. -``end_month``: *integer* (Required) +``end_month``: *integer* (**Required**) End month of the simulation. -``end_day``: *integer* (Required) +``end_day``: *integer* (**Required**) End day of the simulation. -``end_hour``: *integer* (Required) +``end_hour``: *integer* (**Required**) End hour of the simulation. -``end_minute``: *integer* (Required) +``end_minute``: *integer* (**Required**) End minute of the simulation. -``end_second``: *integer* (Required) +``end_second``: *integer* (**Required**) End second of the simulation. ``dt``: *real* (Default: ``2.0``) Atmospheric time step in seconds. -``interval_output``: *integer* (Required) - Description needed +``interval_output``: *integer* (**Required**) + [Units: s] + Specifies the time interval (in seconds) for writing to the history output files ``num_tiles``: *integer* (Default: ``1``) - Description needed + Number of tiles for MPI domain decomposition. Not yet implemented. &atm @@ -79,7 +80,8 @@ Example namelists can be found in the various test subdirectories under the ``te Number of vertical levels for the atmospheric simulation ``interval_atm``: *integer* (Default: ``0``) - Description needed + [Units: s] + Time interval (in seconds) for incoming atmospheric data. When running a coupled model, this value represents the atmospheric timestep. In offline mode, it determines the frequency of reading atmospheric data from the input file. &fire @@ -99,38 +101,38 @@ Example namelists can be found in the various test subdirectories under the ``te ``fire_atm_feedback``: *real* (Default: ``1.0``) Multiplier for heat fluxes from the fire to the atmosphere. - Use 0.0 for one-way (atmosphere --> fire) coupling. Use 1.0 for normal two-way coupling. + 0.0: one-way (atmosphere --> fire) coupling. + + 1.0: normal two-way coupling. + Intermediate values will vary the amount of forcing provided from the fire to the dynamical core. ``fire_upwinding``: *integer* (Default: ``9``) - Method for calculating fire spread upwind. - 0: None + This option controls the type of upwinding scheme used for calculating the normal spread of the fire front. The choice of upwinding scheme significantly impacts the accuracy of fire spread simulations. Higher-order schemes, like WENO3 and WENO5, generally offer better accuracy but can be more computationally expensive. + 0: Central Difference: Uses central differences for calculating gradients, combining left- and right-sided differences for both x- and y-directions to compute a central gradient approximation. - 1: Standard + 1: Standard: Employs an upwind scheme, selecting between left- and right-sided differences based on flow direction. - 2: GODUNOV + 2: Godunov: The Godunov scheme is a first-order upwind scheme based on Osher & Fedkiw - 3: ENO + 3: ENO1: The First-Order Essentially Non-Oscillatory (ENO1) scheme uses the smoothest stencil to avoid sharp gradients, which can lead to underestimations of fire area and errors in the rate of spread. - 4: SETHIAN + 4: Sethian scheme :cite:`SethianMethod` - 5: 2nd-order + 5: 2nd-order: Calculates gradients using a second-order central difference. - 6: WENO3 + 6: WENO3: Third-Order Weighted Essentially Non-Oscillatory (WENO3) scheme. - 7: WENO5 + 7: WENO5: Fifth-Order Weighted Essentially Non-Oscillatory (WENO5) scheme. - 8: hybrid WENO3/ENO1 + 8: Hybrid WENO3/ENO1: A hybrid scheme that combines WENO3 in a band surrounding the fire front interface with ENO1 for regions further away. This approach reduces computational cost while maintaining accuracy near the front. - 9: hybrid WENO5/ENO1 - - More description needed for these options + 9: Hybrid WENO5/ENO1 (default): Similar to option 8, but uses WENO5 instead of WENO3 in the band surrounding the fire front. This approach reduces computational cost while maintaining accuracy near the front. ``fire_viscosity``: *real* (Default: ``0.4``) Artificial viscocity in :term:`level-set method` away from the near-front region. ``fire_lsm_reinit``: *logical* (Default: ``.true.``) - Flag to activate reinitialization of the :term:`level-set method` ``fire_lsm_reinit_iter``: *integer* (Default: ``1``) @@ -153,8 +155,8 @@ Example namelists can be found in the various test subdirectories under the ``te When true, uses ``fire_lsm_zcoupling_ref`` instead of ``fire_wind_height`` as a reference height to calculate the logarithmic surface layer wind profile ``fire_lsm_zcoupling_ref``: *real* (Default: ``50.0``) - Units: m - Reference height from which the velocity at ``fire_wind_height`` is calculated using a logarithmic profile + [Units: m] + Reference height from which the velocity at ``fire_wind_height`` is calculated using a logarithmic profile ``fire_viscosity_bg``: *real* (Default: ``0.4``) Artificial viscosity in the near-front region @@ -175,12 +177,12 @@ Example namelists can be found in the various test subdirectories under the ``te k>0: every "k" timesteps ``fmoist_dt``: *real* (Default: ``600.0``) - Units: s - Time step of moisture model (only used if ``fmoist_freq=0``) + [Units: s] + Time step of moisture model (only used if ``fmoist_freq=0``) ``fire_wind_height``: *integer* (Default: ``6.096``) - Units: m - Height of uah,vah wind in fire spread formula + [Units: m] + Height of uah,vah wind in fire spread formula ``fire_is_real_perim``: *logical* (Default: ``.false.``) Determines if perimeter represents a real fire boundary. @@ -189,8 +191,8 @@ Example namelists can be found in the various test subdirectories under the ``te .false. = point/line ignition ``frac_fburnt_to_smoke``: *real* (Default: ``0.02``) - Units: g/kg - Parts per unit of burned fuel converted to smoke, represented as grams of smoke per kilogram of air. + [Units: g/kg] + Parts per unit of burned fuel converted to smoke, represented as grams of smoke per kilogram of air. ``fuelmc_g``: *real* (Default: ``0.08``) Fuel moisture content ground (Dead :term:`FMC`) @@ -202,22 +204,22 @@ Example namelists can be found in the various test subdirectories under the ``te Fuel moisture content of the canopy ``fuel_opt``: *integer* (Default: ``1``) - Do not change. - Fuel model + Fuel type model. + 1: Anderson fuel model (only option currently implemented) ``ros_opt``: *integer* (Default: ``0``) - Do not change. - Rate of spread option parameterization. + Rate of Spread (ROS) parameterization option. + 0: Rothermel model (only option currently implemented) ``fmc_opt``: *integer* (Default: ``1``) - Do not change. - :term:`FMC` model + :term:`FMC` model + -1 = Constant fuel moisture (only option currently implemented) ``fire_num_ignitions``: *integer* (Default: ``1``) Number of ignitions for fire initiation. Maximum of 5. .. note:: - For each additional fire ignition, you must specify an additional set of ignition parameters below, with increasing numerical suffixes ( *i.e.* ``fire_ignition_start_lon2``, ``fire_ignition_start_lon3``, etc. ) + For each additional fire ignition, you must specify an additional set of ignition parameters below, with increasing numerical suffixes ( *e.g.* ``fire_ignition_start_lon2``, ``fire_ignition_start_lon3``, etc. ) ``fire_ignition_start_lon1``: *real* (Default: ``0.0``) Longitude of first ignition start point. @@ -232,19 +234,19 @@ Example namelists can be found in the various test subdirectories under the ``te Latitude of first ignition end point. ``fire_ignition_ros1``: *real* (Default: ``0.01``) - Units: m/s - Rate of spread for first ignition (Rothermel parameterization). + [Units: m/s] + Rate of spread for first ignition (Rothermel parameterization). ``fire_ignition_start_time1``: *real* (Default: ``0.0``) - Units: s - Start time of first ignition in seconds (counting from the beginning of the simulation) + [Units: s] + Start time of first ignition in seconds (counting from the beginning of the simulation) ``fire_ignition_end_time1``: *real* (Default: ``1``) - Units: s - End time of first ignition in seconds (counting from the beginning of the simulation) + [Units: s] + End time of first ignition in seconds (counting from the beginning of the simulation) ``fire_ignition_radius1``: *real* (Default: ``0.0``) - Units: m - Radius of the ignition area for first ignition. + [Units: m] + Radius of the ignition area for first ignition. From dc215a72b867c3d5963852a1e21f9b80f57ffc05 Mon Sep 17 00:00:00 2001 From: "Michael Kavulich, Jr" Date: Tue, 5 Nov 2024 14:43:54 -0700 Subject: [PATCH 26/57] Minor improvements, Sethian citation, some info and links for running in SRW --- doc/Glossary.rst | 5 +---- doc/Introduction.rst | 4 +++- doc/SRW.rst | 9 +++++++-- doc/references.bib | 8 ++++++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/Glossary.rst b/doc/Glossary.rst index 107c99e..ce867d4 100644 --- a/doc/Glossary.rst +++ b/doc/Glossary.rst @@ -10,9 +10,6 @@ Glossary advection According to the American Meteorological Society (AMS) definition, `advection `_ is "The process of transport of an atmospheric property solely by the mass motion (velocity field) of the atmosphere." In common parlance, advection is movement of atmospheric substances that are carried around by the wind. - CAPE - Convective Available Potential Energy. - CCPP The `Common Community Physics Package `_ is a forecast-model agnostic, vetted collection of code containing atmospheric physical parameterizations and suites of parameterizations for use in Numerical Weather Prediction (NWP) along with a framework that connects the physics to the host forecast model. @@ -42,7 +39,7 @@ Glossary A namelist defines a group of variables or arrays. Namelists are an I/O feature for format-free input and output of variables by key-value assignments in Fortran compilers. Fortran variables can be read from and written to plain-text files in a standardised format, usually with a ``.nml`` file ending. NCAR - The `National Center for Atmospheric Research `__. + The National Science Foundation's `National Center for Atmospheric Research `__. NCEP National Centers for Environmental Prediction (NCEP) is an arm of the National Weather Service diff --git a/doc/Introduction.rst b/doc/Introduction.rst index 7673657..aa7861f 100644 --- a/doc/Introduction.rst +++ b/doc/Introduction.rst @@ -4,7 +4,9 @@ Introduction ============== -Under construction +This is the users guide for the Community Fire Behavior Model (CFBM). + +This page is under construction .. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif :height: 400 diff --git a/doc/SRW.rst b/doc/SRW.rst index b7b3e2f..5694c38 100644 --- a/doc/SRW.rst +++ b/doc/SRW.rst @@ -4,7 +4,7 @@ Coupling to the UFS: Running the CFBM in the SRW ================================================ -Under construction +This page is under construction .. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif :height: 400 @@ -14,5 +14,10 @@ Under construction UFS Short-Range Weather Application (SRW) ========================================= -You can run CFBM in the UFS SRW! Here is how... +The CFBM has been coupled to the UFS Weather Model for both one-way (atmosphere -> fire) and two-way coupled simulations. +Simulations can be run using the UFS Short-Range Weather Application (SRW), a community-supported application for running +numerical weather prediction simulations on limited-area domains. For information on using this capability, see +`the SRW Users Guide `_. + +A preprint on scientific results using this new UFS Fire capability is available (:cite:`CFBM`). diff --git a/doc/references.bib b/doc/references.bib index 33fe1bd..3c5bb40 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -14,3 +14,11 @@ @article{LevelSetMethod doi={10.1002/2017MS001108}, } +@article{SethianMethod, + title={A fast marching level set method for monotonically advancing fronts}, + author={J A Sethian}, + journal={P. Natl. Acad. Sci. USA}, + year={1996}, + doi={10.1073/pnas.93.4.159}, + } + From b610900dc88ee437a1eb68ae7b36b9f04b11241c Mon Sep 17 00:00:00 2001 From: Michael Kavulich Date: Wed, 20 Nov 2024 11:23:05 -0700 Subject: [PATCH 27/57] Update SRW.rst Correcting link to SRW Users Guide --- doc/SRW.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/SRW.rst b/doc/SRW.rst index 5694c38..c71dc52 100644 --- a/doc/SRW.rst +++ b/doc/SRW.rst @@ -17,7 +17,7 @@ UFS Short-Range Weather Application (SRW) The CFBM has been coupled to the UFS Weather Model for both one-way (atmosphere -> fire) and two-way coupled simulations. Simulations can be run using the UFS Short-Range Weather Application (SRW), a community-supported application for running numerical weather prediction simulations on limited-area domains. For information on using this capability, see -`the SRW Users Guide `_. +`the SRW Users Guide `_. A preprint on scientific results using this new UFS Fire capability is available (:cite:`CFBM`). From b5571d285b3e55c7955fc18ce336ff89de450d5c Mon Sep 17 00:00:00 2001 From: masih Date: Tue, 31 Dec 2024 10:10:53 -0700 Subject: [PATCH 28/57] docs:Updated the introduction --- doc/Introduction.rst | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/Introduction.rst b/doc/Introduction.rst index aa7861f..6d7fc31 100644 --- a/doc/Introduction.rst +++ b/doc/Introduction.rst @@ -4,14 +4,11 @@ Introduction ============== -This is the users guide for the Community Fire Behavior Model (CFBM). +Welcome to the Community Fire Behavior Model (CFBM) User’s Guide! -This page is under construction +CFBM is a cutting-edge tool designed to simulate the evolution of wildland fires. It leverages the Earth System Modeling Framework (ESMF) and supports both idealized or offline fire spread simulations, as well as coupling with atmospheric models such as WRF or the Univied Forecast System (UFS) atmospheric (FV3) components.The fire model relies on wind and other near-surface variables from the atmospheric component to propagate fires. In turn, it provides feedback to the atmospheric component by delivering heat and moisture fluxes generated by the fire. Additionally, the model releases smoke, which can be advected and diffused as a tracer by the atmospheric component. -.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif - :height: 400 - :alt: An animated construction sign - :align: center +CFBM draws from the proven capabilities of Weather Research and Forecasting Model (WRF-Fire) version 4.3.3, yet continues to expand and evolve to meet the demands of both research and operational communities. This documentation serves as a practical guide for setting up and running simulations using CFBM. References ================= From d25f2e7f670178a9abf53f97ffff1b3d8ed3129b Mon Sep 17 00:00:00 2001 From: masih Date: Tue, 31 Dec 2024 10:17:49 -0700 Subject: [PATCH 29/57] docs:Updated SRW documentation --- doc/CFBM-NUOPC.jpeg | Bin 0 -> 515211 bytes doc/SRW.rst | 12 +++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 doc/CFBM-NUOPC.jpeg diff --git a/doc/CFBM-NUOPC.jpeg b/doc/CFBM-NUOPC.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..df0a450586daab816526d989c9a09618b88962db GIT binary patch literal 515211 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%0D{2~!B66_wq*uwE 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 z%0A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 +ZyO?UX=a4f)js_0Z~89%lW46yZ4I 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

5t)?)(%Bfj+Qg2+lyZY;wW5DH`Wb1h5=n9Kk9Om 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 literal 0 HcmV?d00001 diff --git a/doc/SRW.rst b/doc/SRW.rst index c71dc52..7adee36 100644 --- a/doc/SRW.rst +++ b/doc/SRW.rst @@ -4,12 +4,14 @@ Coupling to the UFS: Running the CFBM in the SRW ================================================ -This page is under construction +This schematic figure illustrates the integration of the Community Fire Behavior Model (CFBM) as a component within the Unified Forecast System (UFS) using the NUOPC (National Unified Operational Prediction Capability) framework. -.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif - :height: 400 - :alt: An animated construction sign - :align: center +The blue box at the top represents the UFS atmosphere component, which provides atmospheric variables (e.g., wind, temperature) to drive the fire model. The orange box represents CFBM that simulates fire spread and calculates heat, moisture, and fire smoke, which feed back into the atmospheric component. The NUOPC cap acts as an interface, facilitating the exchange of data between the UFS atmosphere and the CFBM. The CFBM requires static input in the form of geo_em.d01, which contains refined grids, fire fuels, and detailed topography to accurately simulate fire spread. + +.. image:: https://github.com/NCAR/fire_behavior/blob/develop/doc/CFBM-NUOPC.jpeg + :width: 400 + :alt: CFBM-NUOPC coupling schematic + :align: center UFS Short-Range Weather Application (SRW) ========================================= From c5c5555553fd32881dc8f5e189531916269f7509 Mon Sep 17 00:00:00 2001 From: masih Date: Tue, 18 Feb 2025 15:55:36 -0700 Subject: [PATCH 30/57] Edits to the documentation --- doc/Configuration.rst | 2 +- doc/SRW.rst | 8 ++++---- doc/WRFData.rst | 22 +++++++++++++++++----- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/doc/Configuration.rst b/doc/Configuration.rst index cd662b9..473e2fe 100644 --- a/doc/Configuration.rst +++ b/doc/Configuration.rst @@ -10,7 +10,7 @@ Configuring the Community Fire Behavior Module Configuring a domain with the WRF Pre-processing System (WPS) ============================================================= -Because the CFBM was originally developed as part of the WRF model, creating a domain must be done using the WRF Pre-processing System (WPS). These instructions can be found in `the WRF Users Guide `_. +Because the CFBM was originally developed as part of the WRF model, creating a domain must be done using the WRF Pre-processing System (WPS). These instructions can be found in `the WRF Users Guide `_. To run the CFBM with the UFS or with WRF data, users need to provide a geo_em.d01.nc file containting the interpolated static data fields. Future releases will include a method for creating domains without needing to compile WPS. diff --git a/doc/SRW.rst b/doc/SRW.rst index 7adee36..c283cdf 100644 --- a/doc/SRW.rst +++ b/doc/SRW.rst @@ -8,10 +8,10 @@ This schematic figure illustrates the integration of the Community Fire Behavior The blue box at the top represents the UFS atmosphere component, which provides atmospheric variables (e.g., wind, temperature) to drive the fire model. The orange box represents CFBM that simulates fire spread and calculates heat, moisture, and fire smoke, which feed back into the atmospheric component. The NUOPC cap acts as an interface, facilitating the exchange of data between the UFS atmosphere and the CFBM. The CFBM requires static input in the form of geo_em.d01, which contains refined grids, fire fuels, and detailed topography to accurately simulate fire spread. -.. image:: https://github.com/NCAR/fire_behavior/blob/develop/doc/CFBM-NUOPC.jpeg - :width: 400 - :alt: CFBM-NUOPC coupling schematic - :align: center +.. !.. image:: https://github.com/NCAR/fire_behavior/blob/develop/doc/CFBM-NUOPC.jpeg +.. ! :width: 400 +.. ! :alt: CFBM-NUOPC coupling schematic +.. ! :align: center UFS Short-Range Weather Application (SRW) ========================================= diff --git a/doc/WRFData.rst b/doc/WRFData.rst index 8db2b61..e03400b 100644 --- a/doc/WRFData.rst +++ b/doc/WRFData.rst @@ -4,10 +4,22 @@ Running real cases with WRF data ================================ -Under construction +The schematic figure illustrates the CFBM operating in offline mode. To run CFBM in the offline mode, users need to provide WRF atmospheric data in the ```wrf.nc``` format and static inputs as ```geo_em.d01.nc```. -.. image:: https://media.tenor.com/4fu8LKc2vZ4AAAAi/under-construction-wip.gif - :height: 400 - :alt: An animated construction sign - :align: center +Users can obtain the model from the github repository: + +```git clone https://github.com/NCAR/fire_behavior.git``` + +To compile the code on derecho, run: + +```./compile.sh --env-auto``` + +If the compilation is successful, the model can be run using ```fire_behavior.exe``` located in the ```build``` directory. + +An example is provided in ```test/test7/``` directory with the ```namelist.fire```. + +.. !image:: https://github.com/NCAR/fire_behavior/blob/develop/doc/CFBM-offline.jpeg +.. ! :width: 400 +.. ! :alt: CFBM-WRF data schematic +.. ! :align: center From 63660b29fe2cb0d974d22627e9139017e45a8a79 Mon Sep 17 00:00:00 2001 From: masih Date: Tue, 18 Feb 2025 20:34:03 -0700 Subject: [PATCH 31/57] Edits for the documention WRFData.html and references --- doc/WRFData.rst | 9 ++++----- doc/references.bib | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/WRFData.rst b/doc/WRFData.rst index e03400b..d4faeaf 100644 --- a/doc/WRFData.rst +++ b/doc/WRFData.rst @@ -4,7 +4,9 @@ Running real cases with WRF data ================================ -The schematic figure illustrates the CFBM operating in offline mode. To run CFBM in the offline mode, users need to provide WRF atmospheric data in the ```wrf.nc``` format and static inputs as ```geo_em.d01.nc```. +The CFBM can run in offline mode using WRF atmospheric fields as input. To run CFBM in the offline mode, users need to provide WRF atmospheric data, including all available timestamps, in a file named ```wrf.nc```, along with static inpupts in ```geo_em.d01.nc```. The atmospheric data must include wind components (U, V), geopotential heights (PH, PHB), surface variables used with the fuel moisture model (RAINC, RAINNC, T2, Q2, PSFC), and roughness length (ZNT). + +The simulation configuration is set up in the ```namelist.fire``` file, as described in Section 2.2. Users must specify the number of vertical levels (```kde```) and the time interval for incoming atmospheric data (```interval_atm```) to match the data provided in the ```wrf.nc``` file. Users can obtain the model from the github repository: @@ -18,8 +20,5 @@ If the compilation is successful, the model can be run using ```fire_behavior.ex An example is provided in ```test/test7/``` directory with the ```namelist.fire```. -.. !image:: https://github.com/NCAR/fire_behavior/blob/develop/doc/CFBM-offline.jpeg -.. ! :width: 400 -.. ! :alt: CFBM-WRF data schematic -.. ! :align: center +If the simulation is successful, the model outputs are written to files named 'fire_output_*', and diagnostic messages are recorded in the 'log' file. diff --git a/doc/references.bib b/doc/references.bib index 3c5bb40..ce4fd0c 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -1,6 +1,6 @@ @article{CFBM, title={The Community Fire Behavior Model for coupled fire-atmosphere modeling: Implementation in the Unified Forecast System}, - author={Pedro Angel Jimenez y Munoz and Maria Frediani and Masih Eghdami and Daniel Rosen and Michael Kavulich and and Timothy W. Juliano}, + author={Pedro Angel {Jimenez y Munoz} and Maria Frediani and Masih Eghdami and Daniel Rosen and Michael Kavulich and and Timothy W. Juliano}, journal={Geosci. Model Dev.}, year={2024}, doi={10.5194/gmd-2024-124}, From a09351ea62b1098f9e8bbea7fcbb2c49d907120b Mon Sep 17 00:00:00 2001 From: masih Date: Mon, 24 Feb 2025 18:42:24 -0700 Subject: [PATCH 32/57] Added wrf temperature and moisture tendencies For now the variables are zero --- io/wrf_mod.F90 | 206 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 194 insertions(+), 12 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index 0803a62..c7d02de 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -5,7 +5,7 @@ module wrf_mod use namelist_mod, only : namelist_t use netcdf_mod, only : Get_netcdf_var, Get_netcdf_att, Get_netcdf_dim, Is_netcdf_file_present use proj_lc_mod, only : proj_lc_t - use stderrout_mod, only : Print_message + use stderrout_mod, only : Print_message, Stop_simulation use interp_mod, only : Interp_profile implicit none @@ -739,8 +739,13 @@ subroutine Provide_atm_feedback (config_flags, & ids, ide, kds, kde, jds, jde, & ims, ime, kms, kme, jms, jme, & its, ite, kts, kte, jts, jte, & - rho, dz8w, & - emis_smoke, smoke_tracer, tracer_opt) + emis_smoke, smoke_tracer, tracer_opt, & + fgrnhfx, fgrnqfx, & + grnhfx, grnqfx, canhfx, canqfx, & + alfg, alfc, z1can, & + rho, dz8w, z_at_w, & + mu, c1h, c2h, & + rthfrten, rqvfrten) use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT implicit none @@ -756,18 +761,26 @@ subroutine Provide_atm_feedback (config_flags, & real, dimension(ifms:ifme, jfms:jfme), intent (in) :: emis_smoke real, dimension(ims:ime, kms:kme, jms:jme), intent (in out), optional :: smoke_tracer - real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: rho, dz8w integer, intent (in) :: tracer_opt - + real, dimension(ifms:ifme, jfms:jfme), intent (in) :: fgrnhfx, fgrnqfx + real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: rho, dz8w, z_at_w + real, intent(in), dimension(ims:ime, jms:jme) :: mu ! dry air mass (pa) + real, intent(in), dimension(kms:kme) :: c1h, c2h ! hybrid coordinate weights + real, intent(in) :: alfg ! extinction depth surface fire heat (m) + real, intent(in) :: alfc ! extinction depth crown fire heat (m) + real, intent(in) :: z1can ! height of crown fire heat release (m) + real, dimension(ims:ime, jms:jme), intent (out) :: grnhfx, grnqfx, canhfx, canqfx + real, intent(out), dimension(ims:ime, kms:kme, jms:jme) :: & + rthfrten, & ! theta tendency from fire (in mass units) + rqvfrten ! Qv tendency from fire (in mass units) + + ! Local integer :: i, j, ibase, jbase, i_f, j_f, ioff, joff real :: avgw integer :: isz1, jsz1, isz2, jsz2, ir, jr integer :: ifts, ifte, jfts, jfte, ij - if (tracer_opt == 3) then - !$OMP PARALLEL DO & - !$OMP PRIVATE ( ij ,i,j,k,its,ite,jts,jte) DO ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -782,6 +795,17 @@ subroutine Provide_atm_feedback (config_flags, & jr = jsz2 / jsz1 avgw = 1.0 / (ir * jr) + write (OUTPUT_UNIT, *) 'masih: ifts, ifte, jfts, jfte', ifts, ifte, jfts, jfte + write (OUTPUT_UNIT, *) 'masih: isz1, jsz1, isz2, jsz2', isz1, jsz1, isz2, jsz2 + write (OUTPUT_UNIT, *) 'masih: ir, jz', ir, jr + + do j=max(jds+1,jts),min(jte,jde-2) + do i=max(ids+1,its),min(ite,ide-2) + grnhfx(i,j) = 0.0 + grnqfx(i,j) = 0.0 + end do + end do + do j=max(jds+1,jts),min(jte,jde-2) jbase = jfts + jr * (j - jts) do i=max(ids+1,its),min(ite,ide-2) @@ -790,19 +814,177 @@ subroutine Provide_atm_feedback (config_flags, & j_f = joff + jbase do ioff=0,ir-1 i_f = ioff + ibase - smoke_tracer(i,kts,j) = smoke_tracer(i,kts,j) + & - (avgw * emis_smoke(i_f,j_f) * 1000/(rho(i,kts,j)*dz8w(i,kts,j))) + if (tracer_opt == 3) then + smoke_tracer(i,kts,j) = smoke_tracer(i,kts,j) + & + (avgw * emis_smoke(i_f,j_f) * 1000.0/(rho(i,kts,j)*dz8w(i,kts,j))) + end if + grnhfx(i,j) = grnhfx(i,j) + fgrnhfx(i_f,j_f) * config_flags%fire_atm_feedback + grnqfx(i,j) = grnqfx(i,j) + fgrnqfx(i_f,j_f) * config_flags%fire_atm_feedback end do end do end do end do END DO - !$OMP END PARALLEL DO - end if + canqfx = 0. ! currently no canopy model + canhfx = 0. + +! call Fire_tendency ( & +! ids,ide,kds,kde,jds,jde, & ! dimensions +! ims,ime,kms,kme,jms,jme, & +! its,ite,kts,kte,jts,jte, & +! grnhfx,grnqfx,canhfx,canqfx, & ! heat fluxes summed up to atm grid +! alfg,alfc,z1can, & ! coeffients, properties, geometry +! z_at_w,dz8w,mu,c1h,c2h,rho, & +! rthfrten,rqvfrten) ! theta and Qv tendencies + + ! currently the no tendencies + rthfrten = 0. + rqvfrten = 0. end subroutine Provide_atm_feedback + subroutine Fire_tendency( & + ids,ide, kds,kde, jds,jde, & ! dimensions + ims,ime, kms,kme, jms,jme, & + its,ite, kts,kte, jts,jte, & + grnhfx,grnqfx,canhfx,canqfx, & ! heat fluxes summed up to atm grid + alfg,alfc,z1can, & ! coeffients, properties, geometry + z_at_w,dz8w,mu,c1h,c2h,rho, & + rthfrten,rqvfrten) ! theta and Qv tendencies + + ! This routine is atmospheric physics + + ! --- this routine takes fire generated heat and moisture fluxes and + ! calculates their influence on the theta and water vapor + ! --- note that these tendencies are valid at the Arakawa-A location + + use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT + implicit none + + ! --- incoming variables + + integer, intent (in) :: ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte + + real, intent(in), dimension(ims:ime, jms:jme) :: grnhfx,grnqfx ! w/m^2 + real, intent(in), dimension(ims:ime, jms:jme) :: canhfx,canqfx ! w/m^2 + real, intent(in), dimension(ims:ime, jms:jme) :: mu ! dry air mass (pa) + real, intent(in), dimension(kms:kme) :: c1h, c2h ! hybrid coordinate weights + + real, intent(in), dimension(ims:ime, kms:kme, jms:jme) :: z_at_w ! m abv sealvl + real, intent(in), dimension(ims:ime, kms:kme, jms:jme) :: dz8w ! dz across w-lvl + real, intent(in), dimension(ims:ime, kms:kme, jms:jme) :: rho ! density + + real, intent(in) :: alfg ! extinction depth surface fire heat (m) + real, intent(in) :: alfc ! extinction depth crown fire heat (m) + real, intent(in) :: z1can ! height of crown fire heat release (m) + + ! --- outgoing variables + + real, intent(out), dimension(ims:ime, kms:kme, jms:jme) :: & + rthfrten, & ! theta tendency from fire (in mass units) + rqvfrten ! Qv tendency from fire (in mass units) + ! --- local variables + + integer :: i,j,k + integer :: i_st,i_en, j_st,j_en, k_st,k_en + + real :: cp_i + real :: rho_i + real :: xlv_i + real :: z_w + real :: fact_g, fact_c + real :: alfg_i, alfc_i + + real, dimension( its:ite,kts:kte,jts:jte ) :: hfx,qfx + + + do j=jts,jte + do k=kts,min(kte+1,kde) + do i=its,ite + rthfrten(i,k,j)=0. + rqvfrten(i,k,j)=0. + enddo + enddo + enddo + + ! --- set some local constants + + cp_i = 1./cp ! inverse of specific heat + xlv_i = 1./xlv ! inverse of latent heat + alfg_i = 1./alfg + alfc_i = 1./alfc + + ! --- set loop indicies : note that + + i_st = MAX(its,ids+1) + i_en = MIN(ite,ide-1) + k_st = kts + k_en = MIN(kte,kde-1) + j_st = MAX(jts,jds+1) + j_en = MIN(jte,jde-1) + ! --- distribute fluxes + + do j = j_st,j_en + do k = k_st,k_en + do i = i_st,i_en + + ! --- set z (in meters above ground) + + z_w = z_at_w(i,k,j) - z_at_w(i, 1, j) + + ! --- heat flux + + fact_g = cp_i * EXP( - alfg_i * z_w ) + if ( z_w < z1can ) then + fact_c = cp_i + else + fact_c = cp_i * EXP( - alfc_i * (z_w - z1can) ) + end if + hfx(i,k,j) = fact_g * grnhfx(i,j) + fact_c * canhfx(i,j) + + ! --- vapor flux + + fact_g = xlv_i * EXP( - alfg_i * z_w ) + if (z_w < z1can) then + fact_c = xlv_i + else + fact_c = xlv_i * EXP( - alfc_i * (z_w - z1can) ) + end if + qfx(i,k,j) = fact_g * grnqfx(i,j) + fact_c * canqfx(i,j) + + if ((grnhfx(i,j) >0.) .and. (k == 1)) then + write (OUTPUT_UNIT, *) 'masih: grnhfx, grnqfx', grnhfx(i,j), grnqfx(i,j) + write (OUTPUT_UNIT, *) 'masih: hfx, qfx', hfx(i,1,j), qfx(i,1,j), hfx(i,1,j), qfx(i,1,j) + end if + + end do + end do + end do + ! --- add flux divergence to tendencies + ! + ! multiply by dry air mass (mu) to eliminate the need to + ! call sr. calculate_phy_tend (in dyn_em/module_em.F) + + do j = j_st,j_en + do k = k_st,k_en-1 + do i = i_st,i_en + + rho_i = 1./rho(i,k,j) + + rthfrten(i,k,j) = - (c1h(k)*mu(i,j)+c2h(k)) * rho_i * (hfx(i,k+1,j)-hfx(i,k,j)) / dz8w(i,k,j) + rqvfrten(i,k,j) = - (c1h(k)*mu(i,j)+c2h(k)) * rho_i * (qfx(i,k+1,j)-qfx(i,k,j)) / dz8w(i,k,j) + + end do + end do + end do + + return + + end subroutine Fire_tendency + subroutine Update_atm_state (this, datetime_now) implicit none From 024738b3ff3d7f07b5a7b74bfc3448cd743a5b39 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Tue, 11 Mar 2025 09:09:48 -0600 Subject: [PATCH 33/57] Fixes fire flux averaging to atm + other devels --- io/wrf_mod.F90 | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index c7d02de..4d3a4c6 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -742,6 +742,7 @@ subroutine Provide_atm_feedback (config_flags, & emis_smoke, smoke_tracer, tracer_opt, & fgrnhfx, fgrnqfx, & grnhfx, grnqfx, canhfx, canqfx, & + grnsmk, & alfg, alfc, z1can, & rho, dz8w, z_at_w, & mu, c1h, c2h, & @@ -769,19 +770,19 @@ subroutine Provide_atm_feedback (config_flags, & real, intent(in) :: alfg ! extinction depth surface fire heat (m) real, intent(in) :: alfc ! extinction depth crown fire heat (m) real, intent(in) :: z1can ! height of crown fire heat release (m) - real, dimension(ims:ime, jms:jme), intent (out) :: grnhfx, grnqfx, canhfx, canqfx + real, dimension(ims:ime, jms:jme), intent (out) :: grnhfx, grnqfx, canhfx, canqfx, grnsmk real, intent(out), dimension(ims:ime, kms:kme, jms:jme) :: & rthfrten, & ! theta tendency from fire (in mass units) rqvfrten ! Qv tendency from fire (in mass units) ! Local integer :: i, j, ibase, jbase, i_f, j_f, ioff, joff - real :: avgw + real :: avgw, convert_kg_m2_to_g_kg integer :: isz1, jsz1, isz2, jsz2, ir, jr integer :: ifts, ifte, jfts, jfte, ij - DO ij = 1, num_tiles + Loop_tiles: do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) jfts = j_start(ij) @@ -795,40 +796,40 @@ subroutine Provide_atm_feedback (config_flags, & jr = jsz2 / jsz1 avgw = 1.0 / (ir * jr) + write (OUTPUT_UNIT, *) 'masih: its, ite, jts, jte', its, ite, jts, jte write (OUTPUT_UNIT, *) 'masih: ifts, ifte, jfts, jfte', ifts, ifte, jfts, jfte write (OUTPUT_UNIT, *) 'masih: isz1, jsz1, isz2, jsz2', isz1, jsz1, isz2, jsz2 write (OUTPUT_UNIT, *) 'masih: ir, jz', ir, jr - do j=max(jds+1,jts),min(jte,jde-2) - do i=max(ids+1,its),min(ite,ide-2) - grnhfx(i,j) = 0.0 - grnqfx(i,j) = 0.0 - end do - end do - - do j=max(jds+1,jts),min(jte,jde-2) + do j = max (jds + 1, jts), min (jte, jde - 2) jbase = jfts + jr * (j - jts) - do i=max(ids+1,its),min(ite,ide-2) +! write (OUTPUT_UNIT, *) 'masih: j, jbase', j, jbase + do i = max (ids + 1, its), min (ite, ide - 2) ibase = ifts + ir * (i - its) - do joff=0,jr-1 +! write (OUTPUT_UNIT, *) 'masih: i, ibase', i, ibase + canqfx(i, j) = 0.0 + canhfx(i, j) = 0.0 + grnsmk(i, j) = 0.0 + grnhfx(i, j) = 0.0 + grnqfx(i, j) = 0.0 + convert_kg_m2_to_g_kg = 1000.0 / (rho(i, kts, j) * dz8w(i, kts, j)) + do joff = 0, jr - 1 j_f = joff + jbase - do ioff=0,ir-1 + do ioff = 0, ir - 1 i_f = ioff + ibase - if (tracer_opt == 3) then - smoke_tracer(i,kts,j) = smoke_tracer(i,kts,j) + & - (avgw * emis_smoke(i_f,j_f) * 1000.0/(rho(i,kts,j)*dz8w(i,kts,j))) - end if - grnhfx(i,j) = grnhfx(i,j) + fgrnhfx(i_f,j_f) * config_flags%fire_atm_feedback - grnqfx(i,j) = grnqfx(i,j) + fgrnqfx(i_f,j_f) * config_flags%fire_atm_feedback + grnsmk(i, j) = grnsmk(i, j) + emis_smoke(i_f, j_f) + grnhfx(i, j) = grnhfx(i, j) + fgrnhfx(i_f, j_f) ! * config_flags%fire_atm_feedback + grnqfx(i, j) = grnqfx(i, j) + fgrnqfx(i_f, j_f) ! * config_flags%fire_atm_feedback end do end do + grnhfx(i, j) = grnhfx(i, j) * avgw + grnqfx(i, j) = grnqfx(i, j) * avgw + grnsmk(i, j) = grnsmk(i, j) * convert_kg_m2_to_g_kg * avgw + if (tracer_opt == 3) smoke_tracer(i, kts, j) = smoke_tracer(i, kts, j) + grnsmk(i, j) end do end do - END DO + end do Loop_tiles - canqfx = 0. ! currently no canopy model - canhfx = 0. - ! call Fire_tendency ( & ! ids,ide,kds,kde,jds,jde, & ! dimensions ! ims,ime,kms,kme,jms,jme, & From de5846f8e51a146d98ed86bf9288662d317e89f8 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Tue, 11 Mar 2025 11:21:59 -0600 Subject: [PATCH 34/57] Fixes fire tendencies to the atm --- io/wrf_mod.F90 | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index 4d3a4c6..4c6f8cf 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -830,18 +830,15 @@ subroutine Provide_atm_feedback (config_flags, & end do end do Loop_tiles -! call Fire_tendency ( & -! ids,ide,kds,kde,jds,jde, & ! dimensions -! ims,ime,kms,kme,jms,jme, & -! its,ite,kts,kte,jts,jte, & -! grnhfx,grnqfx,canhfx,canqfx, & ! heat fluxes summed up to atm grid -! alfg,alfc,z1can, & ! coeffients, properties, geometry -! z_at_w,dz8w,mu,c1h,c2h,rho, & -! rthfrten,rqvfrten) ! theta and Qv tendencies - - ! currently the no tendencies - rthfrten = 0. - rqvfrten = 0. + call Fire_tendency ( & + ids,ide - 1,kds,kde,jds,jde - 1, & ! dimensions + ims,ime,kms,kme,jms,jme, & + its,min (ite, ide-1),kts,kte,jts,min (jte, jde - 1), & + grnhfx,grnqfx,canhfx,canqfx, & ! heat fluxes summed up to atm grid + alfg,alfc,z1can, & ! coeffients, properties, geometry + z_at_w,dz8w,mu,c1h,c2h,rho, & + config_flags%fire_atm_feedback, & + rthfrten,rqvfrten) ! theta and Qv tendencies end subroutine Provide_atm_feedback @@ -852,6 +849,7 @@ subroutine Fire_tendency( & grnhfx,grnqfx,canhfx,canqfx, & ! heat fluxes summed up to atm grid alfg,alfc,z1can, & ! coeffients, properties, geometry z_at_w,dz8w,mu,c1h,c2h,rho, & + fire_atm_feedback, & rthfrten,rqvfrten) ! theta and Qv tendencies ! This routine is atmospheric physics @@ -882,6 +880,8 @@ subroutine Fire_tendency( & real, intent(in) :: alfc ! extinction depth crown fire heat (m) real, intent(in) :: z1can ! height of crown fire heat release (m) + real, intent(in) :: fire_atm_feedback + ! --- outgoing variables real, intent(out), dimension(ims:ime, kms:kme, jms:jme) :: & @@ -902,6 +902,10 @@ subroutine Fire_tendency( & real, dimension( its:ite,kts:kte,jts:jte ) :: hfx,qfx + write (OUTPUT_UNIT, *) 'pajm: its, ite, jts, jte, kts, kte = ', its, ite, jts, jte, kts, kte + write (OUTPUT_UNIT, *) 'pajm: ids, ide, jds, jde, kds, kde = ', ids, ide, jds, jde, kds, kde + write (OUTPUT_UNIT, *) 'pajm: alfg,alfc,z1can = ', alfg,alfc,z1can + do j=jts,jte do k=kts,min(kte+1,kde) do i=its,ite @@ -911,6 +915,8 @@ subroutine Fire_tendency( & enddo enddo + if (fire_atm_feedback <= 0.0) return + ! --- set some local constants cp_i = 1./cp ! inverse of specific heat @@ -944,7 +950,7 @@ subroutine Fire_tendency( & else fact_c = cp_i * EXP( - alfc_i * (z_w - z1can) ) end if - hfx(i,k,j) = fact_g * grnhfx(i,j) + fact_c * canhfx(i,j) + hfx(i,k,j) = fact_g * grnhfx(i,j) * fire_atm_feedback+ fact_c * canhfx(i,j) ! --- vapor flux @@ -954,12 +960,12 @@ subroutine Fire_tendency( & else fact_c = xlv_i * EXP( - alfc_i * (z_w - z1can) ) end if - qfx(i,k,j) = fact_g * grnqfx(i,j) + fact_c * canqfx(i,j) + qfx(i,k,j) = fact_g * grnqfx(i,j) * fire_atm_feedback + fact_c * canqfx(i,j) - if ((grnhfx(i,j) >0.) .and. (k == 1)) then - write (OUTPUT_UNIT, *) 'masih: grnhfx, grnqfx', grnhfx(i,j), grnqfx(i,j) - write (OUTPUT_UNIT, *) 'masih: hfx, qfx', hfx(i,1,j), qfx(i,1,j), hfx(i,1,j), qfx(i,1,j) - end if +! if ((grnhfx(i,j) * fire_atm_feedback >0.) .and. (k == 1)) then +! write (OUTPUT_UNIT, *) 'masih: grnhfx, grnqfx', grnhfx(i,j), grnqfx(i,j) +! write (OUTPUT_UNIT, *) 'masih: hfx, qfx', hfx(i,1,j), qfx(i,1,j), hfx(i,1,j), qfx(i,1,j) +! end if end do end do From 2ad759cbbaf2fb8ed89829b371fe4a89aa446858 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 13 Mar 2025 06:21:20 -0600 Subject: [PATCH 35/57] Calculate smoke (PM2.5) AOD at 550 nm --- io/wrf_mod.F90 | 74 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index 4c6f8cf..856cd17 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -58,6 +58,69 @@ module wrf_mod contains + pure function Calc_rh (p, t, qv) result (rh) + + implicit none + + real, intent(in) :: p, t, qv + real :: rh + + real, parameter :: PQ0 = 379.90516, A2 = 17.2693882, A3= 273.16, A4 = 35.86, RHMIN = 1.0 + real :: q, qs + integer :: i, j, k + + + q = qv / (1.0 + qv) + qs = PQ0 / p * exp (A2 * (t - A3) / (t - A4)) + rh = 100.0 * q / qs + + if (rh > 100.0) then + rh = 100.0 + else if (rh .lt. RHMIN) then + rh = rhmin + end if + + end function Calc_rh + + subroutine Calc_smoke_aod (dz8w, p_phy, t_phy, qv, rho, smoke_tracer, aod5502d_smoke, & + ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte) + + implicit none + + integer, intent (in) :: ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte + real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: dz8w, p_phy, t_phy, qv, rho, smoke_tracer + real, dimension(ims:ime, jms:jme), intent (out) :: aod5502d_smoke + + ! [m2 g-1] + real, parameter :: MASS_EXT_COEF = 4.5, RH_CRIT = 0.3, CONVERT_PERCENT_TO_UNITLESS = 0.01 + real :: rh, augm_ext_coef + integer :: i, k, j + + + Loop_j_aod : do j = jts, min (jte, jde - 1) + Loop_i_aod : do i = its, min (ite, ide - 1) + aod5502d_smoke(i, j) = 0.0 + Loop_k_aod : do k = kts, min (kte, kde - 1) + rh = CONVERT_PERCENT_TO_UNITLESS * Calc_rh (p_phy(i, k, j), t_phy(i, k, j), qv(i, k, j)) + if (rh > RH_CRIT) then + augm_ext_coef = MASS_EXT_COEF * ((1.0 - RH_CRIT) / (1.0 - rh)) ** 0.18 + else + augm_ext_coef = MASS_EXT_COEF + end if ! [m2 g-1] [g smoke kg-1 air] [kg air m-3] [m] + aod5502d_smoke(i, j) = aod5502d_smoke(i, j) + augm_ext_coef * smoke_tracer(i, k, j) * rho(i, k, j) * dz8w(i, k, j) + if (i == 31 .and. j == 34) then + write (*, *) k, dz8w(i, k, j), rh, augm_ext_coef, rho(i, k, j), smoke_tracer(i, k, j), aod5502d_smoke(i, j) + end if + end do Loop_k_aod + end do Loop_i_aod + end do Loop_j_aod + + end subroutine Calc_smoke_aod + subroutine Destroy_geopotential_levels (this) implicit none @@ -740,6 +803,8 @@ subroutine Provide_atm_feedback (config_flags, & ims, ime, kms, kme, jms, jme, & its, ite, kts, kte, jts, jte, & emis_smoke, smoke_tracer, tracer_opt, & + p_phy, t_phy, qv, & + aod5502d_smoke, & fgrnhfx, fgrnqfx, & grnhfx, grnqfx, canhfx, canqfx, & grnsmk, & @@ -764,13 +829,13 @@ subroutine Provide_atm_feedback (config_flags, & real, dimension(ims:ime, kms:kme, jms:jme), intent (in out), optional :: smoke_tracer integer, intent (in) :: tracer_opt real, dimension(ifms:ifme, jfms:jfme), intent (in) :: fgrnhfx, fgrnqfx - real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: rho, dz8w, z_at_w + real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: rho, dz8w, z_at_w, p_phy, t_phy, qv real, intent(in), dimension(ims:ime, jms:jme) :: mu ! dry air mass (pa) real, intent(in), dimension(kms:kme) :: c1h, c2h ! hybrid coordinate weights real, intent(in) :: alfg ! extinction depth surface fire heat (m) real, intent(in) :: alfc ! extinction depth crown fire heat (m) real, intent(in) :: z1can ! height of crown fire heat release (m) - real, dimension(ims:ime, jms:jme), intent (out) :: grnhfx, grnqfx, canhfx, canqfx, grnsmk + real, dimension(ims:ime, jms:jme), intent (out) :: grnhfx, grnqfx, canhfx, canqfx, grnsmk, aod5502d_smoke real, intent(out), dimension(ims:ime, kms:kme, jms:jme) :: & rthfrten, & ! theta tendency from fire (in mass units) rqvfrten ! Qv tendency from fire (in mass units) @@ -840,6 +905,11 @@ subroutine Provide_atm_feedback (config_flags, & config_flags%fire_atm_feedback, & rthfrten,rqvfrten) ! theta and Qv tendencies + if (tracer_opt == 3) call Calc_smoke_aod (dz8w, p_phy, t_phy, qv, rho, smoke_tracer, aod5502d_smoke, & + ids, ide, kds, kde, jds, jde, & + ims, ime, kms, kme, jms, jme, & + its, ite, kts, kte, jts, jte) + end subroutine Provide_atm_feedback subroutine Fire_tendency( & From d8912f0ea4bd846d55cd04745a2bc9771cea1571 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 13 Mar 2025 07:56:54 -0600 Subject: [PATCH 36/57] Removes duplicate tile loop for feedback to the atmosphere --- io/wrf_mod.F90 | 74 +++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index 856cd17..8a44b53 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -796,12 +796,12 @@ end subroutine Print_domain subroutine Provide_atm_feedback (config_flags, & ifms, ifme, jfms, jfme, & - i_start, i_end, j_start, j_end, & - num_tiles, & + ifts, ifte, jfts, jfte, & ifps, ifpe, jfps, jfpe, & ids, ide, kds, kde, jds, jde, & ims, ime, kms, kme, jms, jme, & its, ite, kts, kte, jts, jte, & + sr_x, sr_y, & emis_smoke, smoke_tracer, tracer_opt, & p_phy, t_phy, qv, & aod5502d_smoke, & @@ -813,7 +813,6 @@ subroutine Provide_atm_feedback (config_flags, & mu, c1h, c2h, & rthfrten, rqvfrten) - use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT implicit none type (namelist_t), intent (in) :: config_flags @@ -821,9 +820,8 @@ subroutine Provide_atm_feedback (config_flags, & ifps, ifpe, jfps, jfpe, & ids, ide, kds, kde, jds, jde, & ims, ime, kms, kme, jms, jme, & - its, ite, kts, kte, jts, jte, num_tiles - - integer, dimension(num_tiles), intent(in) :: i_start, i_end, j_start, j_end + its, ite, kts, kte, jts, jte, & + ifts, ifte, jfts, jfte, sr_x, sr_y real, dimension(ifms:ifme, jfms:jfme), intent (in) :: emis_smoke real, dimension(ims:ime, kms:kme, jms:jme), intent (in out), optional :: smoke_tracer @@ -840,47 +838,27 @@ subroutine Provide_atm_feedback (config_flags, & rthfrten, & ! theta tendency from fire (in mass units) rqvfrten ! Qv tendency from fire (in mass units) - ! Local + logical, parameter :: DEBUG_LOCAL = .true. integer :: i, j, ibase, jbase, i_f, j_f, ioff, joff real :: avgw, convert_kg_m2_to_g_kg - integer :: isz1, jsz1, isz2, jsz2, ir, jr - integer :: ifts, ifte, jfts, jfte, ij - - Loop_tiles: do ij = 1, num_tiles - ifts = i_start(ij) - ifte = i_end(ij) - jfts = j_start(ij) - jfte = j_end(ij) - isz1 = ite - its + 1 - jsz1 = jte - jts + 1 - isz2 = ifte - ifts + 1 - jsz2 = jfte - jfts + 1 - ir = isz2 / isz1 - jr = jsz2 / jsz1 - avgw = 1.0 / (ir * jr) - - write (OUTPUT_UNIT, *) 'masih: its, ite, jts, jte', its, ite, jts, jte - write (OUTPUT_UNIT, *) 'masih: ifts, ifte, jfts, jfte', ifts, ifte, jfts, jfte - write (OUTPUT_UNIT, *) 'masih: isz1, jsz1, isz2, jsz2', isz1, jsz1, isz2, jsz2 - write (OUTPUT_UNIT, *) 'masih: ir, jz', ir, jr + if (DEBUG_LOCAL) call Check_dims (its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y) + avgw = 1.0 / (sr_x * sr_y) do j = max (jds + 1, jts), min (jte, jde - 2) - jbase = jfts + jr * (j - jts) -! write (OUTPUT_UNIT, *) 'masih: j, jbase', j, jbase + jbase = jfts + sr_y * (j - jts) do i = max (ids + 1, its), min (ite, ide - 2) - ibase = ifts + ir * (i - its) -! write (OUTPUT_UNIT, *) 'masih: i, ibase', i, ibase + ibase = ifts + sr_x * (i - its) canqfx(i, j) = 0.0 canhfx(i, j) = 0.0 grnsmk(i, j) = 0.0 grnhfx(i, j) = 0.0 grnqfx(i, j) = 0.0 convert_kg_m2_to_g_kg = 1000.0 / (rho(i, kts, j) * dz8w(i, kts, j)) - do joff = 0, jr - 1 + do joff = 0, sr_y - 1 j_f = joff + jbase - do ioff = 0, ir - 1 + do ioff = 0, sr_x - 1 i_f = ioff + ibase grnsmk(i, j) = grnsmk(i, j) + emis_smoke(i_f, j_f) grnhfx(i, j) = grnhfx(i, j) + fgrnhfx(i_f, j_f) ! * config_flags%fire_atm_feedback @@ -893,7 +871,6 @@ subroutine Provide_atm_feedback (config_flags, & if (tracer_opt == 3) smoke_tracer(i, kts, j) = smoke_tracer(i, kts, j) + grnsmk(i, j) end do end do - end do Loop_tiles call Fire_tendency ( & ids,ide - 1,kds,kde,jds,jde - 1, & ! dimensions @@ -910,6 +887,35 @@ subroutine Provide_atm_feedback (config_flags, & ims, ime, kms, kme, jms, jme, & its, ite, kts, kte, jts, jte) + contains + + subroutine Check_dims (its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y) + + use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT + + implicit none + + integer, intent (in) :: its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y + + integer :: isz1, jsz1, isz2, jsz2, ir, jr + + + isz1 = ite - its + 1 + jsz1 = jte - jts + 1 + isz2 = ifte - ifts + 1 + jsz2 = jfte - jfts + 1 + ir = isz2 / isz1 + jr = jsz2 / jsz1 + + write (OUTPUT_UNIT, *) 'its, ite, jts, jte =', its, ite, jts, jte + write (OUTPUT_UNIT, *) 'ifts, ifte, jfts, jfte =', ifts, ifte, jfts, jfte + write (OUTPUT_UNIT, *) 'isz1, jsz1, isz2, jsz2 =', isz1, jsz1, isz2, jsz2 + write (OUTPUT_UNIT, *) 'ir, jz =', ir, jr + + if (ir /= sr_x .or. jr /= sr_y) call Stop_simulation ('Tile dims do not preserve fire/atm ratio') + + end subroutine Check_dims + end subroutine Provide_atm_feedback subroutine Fire_tendency( & From 969df9498a3e22b78256e5cb064f04eed5df1a15 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 13 Mar 2025 08:00:28 -0600 Subject: [PATCH 37/57] Formatting of code with no impact on results --- io/wrf_mod.F90 | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index 8a44b53..e222db9 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -846,31 +846,31 @@ subroutine Provide_atm_feedback (config_flags, & if (DEBUG_LOCAL) call Check_dims (its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y) avgw = 1.0 / (sr_x * sr_y) - do j = max (jds + 1, jts), min (jte, jde - 2) - jbase = jfts + sr_y * (j - jts) - do i = max (ids + 1, its), min (ite, ide - 2) - ibase = ifts + sr_x * (i - its) - canqfx(i, j) = 0.0 - canhfx(i, j) = 0.0 - grnsmk(i, j) = 0.0 - grnhfx(i, j) = 0.0 - grnqfx(i, j) = 0.0 - convert_kg_m2_to_g_kg = 1000.0 / (rho(i, kts, j) * dz8w(i, kts, j)) - do joff = 0, sr_y - 1 - j_f = joff + jbase - do ioff = 0, sr_x - 1 - i_f = ioff + ibase - grnsmk(i, j) = grnsmk(i, j) + emis_smoke(i_f, j_f) - grnhfx(i, j) = grnhfx(i, j) + fgrnhfx(i_f, j_f) ! * config_flags%fire_atm_feedback - grnqfx(i, j) = grnqfx(i, j) + fgrnqfx(i_f, j_f) ! * config_flags%fire_atm_feedback - end do - end do - grnhfx(i, j) = grnhfx(i, j) * avgw - grnqfx(i, j) = grnqfx(i, j) * avgw - grnsmk(i, j) = grnsmk(i, j) * convert_kg_m2_to_g_kg * avgw - if (tracer_opt == 3) smoke_tracer(i, kts, j) = smoke_tracer(i, kts, j) + grnsmk(i, j) + do j = max (jds + 1, jts), min (jte, jde - 2) + jbase = jfts + sr_y * (j - jts) + do i = max (ids + 1, its), min (ite, ide - 2) + ibase = ifts + sr_x * (i - its) + canqfx(i, j) = 0.0 + canhfx(i, j) = 0.0 + grnsmk(i, j) = 0.0 + grnhfx(i, j) = 0.0 + grnqfx(i, j) = 0.0 + convert_kg_m2_to_g_kg = 1000.0 / (rho(i, kts, j) * dz8w(i, kts, j)) + do joff = 0, sr_y - 1 + j_f = joff + jbase + do ioff = 0, sr_x - 1 + i_f = ioff + ibase + grnsmk(i, j) = grnsmk(i, j) + emis_smoke(i_f, j_f) + grnhfx(i, j) = grnhfx(i, j) + fgrnhfx(i_f, j_f) ! * config_flags%fire_atm_feedback + grnqfx(i, j) = grnqfx(i, j) + fgrnqfx(i_f, j_f) ! * config_flags%fire_atm_feedback end do end do + grnhfx(i, j) = grnhfx(i, j) * avgw + grnqfx(i, j) = grnqfx(i, j) * avgw + grnsmk(i, j) = grnsmk(i, j) * convert_kg_m2_to_g_kg * avgw + if (tracer_opt == 3) smoke_tracer(i, kts, j) = smoke_tracer(i, kts, j) + grnsmk(i, j) + end do + end do call Fire_tendency ( & ids,ide - 1,kds,kde,jds,jde - 1, & ! dimensions From 8c785cd8f81103625814750ce970404c5c49d4cf Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 13 Mar 2025 08:04:15 -0600 Subject: [PATCH 38/57] use min/max to impoase limits on RH calculation --- io/wrf_mod.F90 | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index e222db9..eaf0081 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -65,7 +65,7 @@ pure function Calc_rh (p, t, qv) result (rh) real, intent(in) :: p, t, qv real :: rh - real, parameter :: PQ0 = 379.90516, A2 = 17.2693882, A3= 273.16, A4 = 35.86, RHMIN = 1.0 + real, parameter :: PQ0 = 379.90516, A2 = 17.2693882, A3= 273.16, A4 = 35.86, RHMIN = 1.0, RHMAX = 100.0 real :: q, qs integer :: i, j, k @@ -73,12 +73,7 @@ pure function Calc_rh (p, t, qv) result (rh) q = qv / (1.0 + qv) qs = PQ0 / p * exp (A2 * (t - A3) / (t - A4)) rh = 100.0 * q / qs - - if (rh > 100.0) then - rh = 100.0 - else if (rh .lt. RHMIN) then - rh = rhmin - end if + rh = max (min (rh, RHMAX), RHMIN) end function Calc_rh From 127b4b5fe40b23fb234832e4e3c2687b90b88ce9 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Thu, 13 Mar 2025 08:16:01 -0600 Subject: [PATCH 39/57] Print AOD profile in debugging mode --- io/wrf_mod.F90 | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index eaf0081..cfc867b 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -90,10 +90,11 @@ subroutine Calc_smoke_aod (dz8w, p_phy, t_phy, qv, rho, smoke_tracer, aod5502d_s real, dimension(ims:ime, kms:kme, jms:jme), intent (in) :: dz8w, p_phy, t_phy, qv, rho, smoke_tracer real, dimension(ims:ime, jms:jme), intent (out) :: aod5502d_smoke - ! [m2 g-1] - real, parameter :: MASS_EXT_COEF = 4.5, RH_CRIT = 0.3, CONVERT_PERCENT_TO_UNITLESS = 0.01 + ! 4.0 abs + 0.5 scattering [m2 g-1] + real, parameter :: MASS_EXT_COEF = 4.5, RH_CRIT = 0.3, RH_MAX = 0.95, CONVERT_PERCENT_TO_UNITLESS = 0.01 real :: rh, augm_ext_coef integer :: i, k, j + logical, parameter :: DEBUG_LOCAL = .true. Loop_j_aod : do j = jts, min (jte, jde - 1) @@ -101,19 +102,36 @@ subroutine Calc_smoke_aod (dz8w, p_phy, t_phy, qv, rho, smoke_tracer, aod5502d_s aod5502d_smoke(i, j) = 0.0 Loop_k_aod : do k = kts, min (kte, kde - 1) rh = CONVERT_PERCENT_TO_UNITLESS * Calc_rh (p_phy(i, k, j), t_phy(i, k, j), qv(i, k, j)) + rh = min (rh, RH_MAX) if (rh > RH_CRIT) then augm_ext_coef = MASS_EXT_COEF * ((1.0 - RH_CRIT) / (1.0 - rh)) ** 0.18 else augm_ext_coef = MASS_EXT_COEF end if ! [m2 g-1] [g smoke kg-1 air] [kg air m-3] [m] aod5502d_smoke(i, j) = aod5502d_smoke(i, j) + augm_ext_coef * smoke_tracer(i, k, j) * rho(i, k, j) * dz8w(i, k, j) - if (i == 31 .and. j == 34) then - write (*, *) k, dz8w(i, k, j), rh, augm_ext_coef, rho(i, k, j), smoke_tracer(i, k, j), aod5502d_smoke(i, j) - end if + if (DEBUG_LOCAL) call Print_profile (i, j) end do Loop_k_aod end do Loop_i_aod end do Loop_j_aod + contains + + subroutine Print_profile (i, j) + + use, intrinsic :: iso_fortran_env, only : OUTPUT_UNIT + + implicit none + + integer, intent (in) :: i, j + integer, parameter :: I_TO_PRINT = 31, J_TO_PRINT = 34 + + + if (i == I_TO_PRINT .and. j == J_TO_PRINT) then + write (OUTPUT_UNIT, *) k, dz8w(i, k, j), rh, augm_ext_coef, rho(i, k, j), smoke_tracer(i, k, j), aod5502d_smoke(i, j) + end if + + end subroutine Print_profile + end subroutine Calc_smoke_aod subroutine Destroy_geopotential_levels (this) From da52251894f558ac2f6adb9082701cfd76252ab1 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Mon, 17 Mar 2025 14:02:41 -0600 Subject: [PATCH 40/57] Option to modulate the smoke emissions by fuel moisture --- CMakeLists.txt | 1 + io/namelist_mod.F90 | 5 +++- physics/fire_physics_mod.F90 | 47 ++++++++++++++++++++++++++++++------ share/emis_mod.F90 | 11 +++++++++ 4 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 share/emis_mod.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index e2b1a39..f757600 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,7 @@ list(APPEND _state_files state/state_mod.F90 list(APPEND _share_files share/proj_lc_mod.F90 share/datetime_mod.F90 + share/emis_mod.F90 share/fuel_mod.F90 share/ros_mod.F90 share/fmc_mod.F90 diff --git a/io/namelist_mod.F90 b/io/namelist_mod.F90 index cc1cdda..c90fa52 100644 --- a/io/namelist_mod.F90 +++ b/io/namelist_mod.F90 @@ -52,6 +52,7 @@ module namelist_mod integer :: fuel_opt = 1 ! Fuel model integer :: ros_opt = 0 ! ROS parameterization integer :: fmc_opt = -1 ! FMC model + integer :: emis_opt = 0 ! Object to be added. 0) WRF-Fire emiss, 1) PM2.5 as a function of FMC ! Ignitions integer :: fire_num_ignitions = 0 ! "number of ignition lines" @@ -182,6 +183,7 @@ subroutine Init_fire_block (this, file_name) integer :: fuel_opt = 1 ! Fuel model integer :: ros_opt = 0 ! ROS parameterization integer :: fmc_opt = -1 ! FMC model + integer :: emis_opt = 0 ! Smoke emissions ! ignitions integer :: fire_num_ignitions = 0 @@ -219,7 +221,7 @@ subroutine Init_fire_block (this, file_name) fire_wind_height, fire_is_real_perim, frac_fburnt_to_smoke, fuelmc_g, & fuelmc_g_live, fuelmc_c, & ! objects - fuel_opt, ros_opt, fmc_opt, & + fuel_opt, ros_opt, fmc_opt, emis_opt, & ! Ignitions fire_num_ignitions, & ! Ignition 1 @@ -279,6 +281,7 @@ subroutine Init_fire_block (this, file_name) this%fuel_opt = fuel_opt this%ros_opt = ros_opt this%fmc_opt = fmc_opt + this%emis_opt = emis_opt this%fire_num_ignitions = fire_num_ignitions diff --git a/physics/fire_physics_mod.F90 b/physics/fire_physics_mod.F90 index f441f6f..480ad60 100644 --- a/physics/fire_physics_mod.F90 +++ b/physics/fire_physics_mod.F90 @@ -4,6 +4,8 @@ module fire_physics_mod use constants_mod, only : XLV, CMBCNST use state_mod, only: state_fire_t use namelist_mod, only: namelist_t + use emis_mod, only : EMIS_WRFFIRE, EMIS_FMC_PM2P5 + use stderrout_mod, only : Stop_simulation private @@ -81,13 +83,44 @@ subroutine Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) integer, intent(in) :: ifts, ifte, jfts, jfte integer :: i, j - - - do j = jfts, jfte - do i = ifts, ifte - grid%emis_smoke(i, j) = config_flags%frac_fburnt_to_smoke * grid%fuel_frac_burnt_dt(i, j) * grid%fuel_load_g(i, j) ! kg/m^2 - end do - end do + real :: emis_pm2p5 + real, parameter :: PERCEN_CARBON_LITTER = 0.5 + + + select case (config_flags%emis_opt) + case (EMIS_WRFFIRE) + write (*, *) 'Smoke WRF-Fire', config_flags%frac_fburnt_to_smoke + do j = jfts, jfte + do i = ifts, ifte + grid%emis_smoke(i, j) = config_flags%frac_fburnt_to_smoke * grid%fuel_frac_burnt_dt(i, j) * grid%fuel_load_g(i, j) ! kg/m^2 + end do + end do + + case (EMIS_FMC_PM2P5) + ! Assuminmg the fuel is litter for the moment + write (*, *) 'Smoke CFBM' + do j = jfts, jfte + do i = ifts, ifte + if (grid%fmc_g(i, j) <= 0.035) then + emis_pm2p5 = 8.1 + else if (grid%fmc_g(i, j) <= 0.1) then + emis_pm2p5 = 8.1 + (160.5 - 8.1) / (0.1 - 0.035) * (grid%fmc_g(i, j) - 0.035) + else if (grid%fmc_g(i, j) <= 0.2) then + emis_pm2p5 = 160.5 + (179.9 - 160.5) / (0.2 - 0.1) * (grid%fmc_g(i, j) - 0.1) + else + emis_pm2p5 = 179.9 + end if + ! 0.001 to convert to Kg which would be later coverted to g, until fixed + emis_pm2p5 = emis_pm2p5 * PERCEN_CARBON_LITTER * 0.001 + grid%emis_smoke(i, j) = emis_pm2p5 * grid%fuel_frac_burnt_dt(i, j) * grid%fuel_load_g(i, j) ! kg/m^2 +! if (grid%fuel_load_g(i, j)>0.0) write (*, *) i, j, grid%fmc_g(i, j), emis_pm2p5, grid%emis_smoke(i, j) + end do + end do + + case default + call Stop_simulation ('The emission option selected does not exist.') + + end select end subroutine Calc_smoke_emissions diff --git a/share/emis_mod.F90 b/share/emis_mod.F90 new file mode 100644 index 0000000..48292de --- /dev/null +++ b/share/emis_mod.F90 @@ -0,0 +1,11 @@ + module emis_mod + + implicit none + + private + + public :: EMIS_WRFFIRE, EMIS_FMC_PM2P5 + + integer, parameter :: EMIS_WRFFIRE = 0, EMIS_FMC_PM2P5 = 1 + + end module emis_mod From 64ce9c570c0554774476a6a89656a042f6be9f37 Mon Sep 17 00:00:00 2001 From: Daniel Rosen Date: Wed, 26 Mar 2025 16:25:48 -0600 Subject: [PATCH 41/57] Fix library links for NetCDF and MPI (#7) * Check CMAKE_PROJECT_NAME for WRF * modify dt_s to fix standalone and NUOPC tests Co-authored-by: Pedro Jimenez Munoz --- CMakeLists.txt | 16 ++++++++++++---- physics/level_set_mod.F90 | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f757600..650cb70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,11 @@ set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mod") install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} DESTINATION ${CMAKE_INSTALL_PREFIX}) # third party libraries -find_package(netCDF-Fortran REQUIRED) +if(${CMAKE_PROJECT_NAME} STREQUAL "WRF") + find_package(netCDF-Fortran REQUIRED) +else() + find_package(NetCDF REQUIRED Fortran) +endif() # turn on DM_PARALLEL preprocessor directive if(DM_PARALLEL) @@ -90,10 +94,14 @@ list(APPEND _driver_files driver/advance_mod.F90 # configure fire behavior library add_library(firelib STATIC ${_state_files} ${_share_files} ${_io_files} ${_wrffire_physics} ${_driver_files}) -# target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) -target_link_libraries(firelib PUBLIC netCDF::netcdff ) +if(${CMAKE_PROJECT_NAME} STREQUAL "WRF") + target_link_libraries(firelib PUBLIC netCDF::netcdff ) +else() + target_link_libraries(firelib PUBLIC $) + target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) +endif() if (DM_PARALLEL) - target_link_libraries( firelib PUBLIC MPI::MPI_Fortran ) + target_link_libraries(firelib PUBLIC $) endif() set_target_properties( firelib diff --git a/physics/level_set_mod.F90 b/physics/level_set_mod.F90 index 1b4d727..2f52545 100644 --- a/physics/level_set_mod.F90 +++ b/physics/level_set_mod.F90 @@ -399,6 +399,8 @@ subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & jfds, jfde, ifts, ifte, jfts, jfte, lfn_s3) dt_s = 0.01 * dx + dt_s = 0.0001 * dx + ! iterate to solve to steady state reinit PDE ! 1 iter each time step is enoguh do nts = 1, fire_lsm_reinit_iter From d0619bfcf0d495217f0bfdf0451632f72ab4667e Mon Sep 17 00:00:00 2001 From: Daniel Rosen Date: Thu, 27 Mar 2025 10:29:25 -0600 Subject: [PATCH 42/57] Change linking back to NetCDF_LIBRARIES --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 650cb70..934afc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,8 +97,8 @@ add_library(firelib STATIC ${_state_files} ${_share_files} ${_io_files} ${_wrffi if(${CMAKE_PROJECT_NAME} STREQUAL "WRF") target_link_libraries(firelib PUBLIC netCDF::netcdff ) else() - target_link_libraries(firelib PUBLIC $) target_include_directories(firelib PUBLIC ${NetCDF_INCLUDE_DIRS}) + target_link_libraries(firelib PUBLIC $) endif() if (DM_PARALLEL) target_link_libraries(firelib PUBLIC $) @@ -113,6 +113,9 @@ set_target_properties( add_executable(fire_behavior.exe driver/fire_behavior.F90) add_dependencies(fire_behavior.exe firelib) target_link_libraries(fire_behavior.exe PUBLIC firelib) +if(NOT ${CMAKE_PROJECT_NAME} STREQUAL "WRF") + target_link_libraries(fire_behavior.exe PUBLIC NetCDF::NetCDF_Fortran) +endif() install(TARGETS fire_behavior.exe DESTINATION bin) if(NUOPC OR ESMX) From 4869d22cbc6e561f88e35777de021759afdb3f52 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 2 Apr 2025 17:03:39 -0600 Subject: [PATCH 43/57] Proper integration of ideal capability --- state/state_mod.F90 | 196 +++++++++++--------------------------------- 1 file changed, 49 insertions(+), 147 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index d428f31..b159760 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -251,52 +251,14 @@ subroutine Init_domain (this, config_flags, geogrid, & real, intent (in), optional :: cen_lat, cen_lon, truelat1, truelat2, stand_lon, dx, dy real, dimension(:, :), intent (in), optional :: nfuel_cat, zsf, dzdxf, dzdyf - integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1, INIT_MODE_WRF = 2 + integer, parameter :: INIT_MODE_NONE = 0, INIT_MODE_GEOGRID = 1, INIT_MODE_WRF = 2, INIT_MODE_IDEAL = 3 type (proj_lc_t) :: proj logical, parameter :: DEBUG_LOCAL = .false. integer :: ids0, ide0, jds0, jde0, i, j, init_mode - logical :: is_ideal_sim - - - if (present (geogrid)) then - is_ideal_sim = .false. - else - is_ideal_sim = .true. - end if - - ! Domain dimensions - Ideal_sim1: if (is_ideal_sim) then - ids0 = 1 - ide0 = config_flags%nx - jds0 = 1 - jde0 = config_flags%ny - - this%dx = config_flags%dx - this%dy = config_flags%dy - - this%cen_lat = config_flags%cen_lat - this%cen_lon = config_flags%cen_lon - - proj = proj_lc_t (cen_lat = this%cen_lat , cen_lon = this%cen_lon, dx = this%dx, dy = this%dy, & - standard_lon = config_flags%stand_lon, true_lat_1 = config_flags%true_lat_1, & - true_lat_2 = config_flags%true_lat_2, nx = config_flags%nx, ny = config_flags%ny) - else - ids0 = geogrid%ifds - ide0 = geogrid%ifde - jds0 = geogrid%jfds - jde0 = geogrid%jfde - - this%dx = geogrid%dx / geogrid%sr_x - this%dy = geogrid%dy / geogrid%sr_y - - this%cen_lat = geogrid%cen_lat - this%cen_lon = geogrid%cen_lon - - proj = geogrid%Get_atm_proj () - end if Ideal_sim1 init_mode = INIT_MODE_NONE + if (config_flags%ideal_opt == 1) init_mode = INIT_MODE_IDEAL if (present (geogrid)) init_mode = INIT_MODE_GEOGRID if (present (ifds) .and. present (ifde) .and. present (ifms) .and. present (ifme) .and. present (ifps) .and. present (ifpe) .and. & present (jfds) .and. present (jfde) .and. present (jfms) .and. present (jfme) .and. present (jfps) .and. present (jfpe) .and. & @@ -312,11 +274,18 @@ subroutine Init_domain (this, config_flags, geogrid, & ! Set dimensions Set_dims: select case (init_mode) - case (INIT_MODE_GEOGRID) - ids0 = geogrid%ifds - ide0 = geogrid%ifde - jds0 = geogrid%jfds - jde0 = geogrid%jfde + case (INIT_MODE_GEOGRID, INIT_MODE_IDEAL) + if (init_mode == INIT_MODE_GEOGRID) then + ids0 = geogrid%ifds + ide0 = geogrid%ifde + jds0 = geogrid%jfds + jde0 = geogrid%jfde + else if (init_mode == INIT_MODE_IDEAL) then + ids0 = 1 + ide0 = config_flags%nx + jds0 = 1 + jde0 = config_flags%ny + end if this%ifds = ids0 this%ifde = ide0 @@ -371,106 +340,6 @@ subroutine Init_domain (this, config_flags, geogrid, & end select Set_dims - allocate (this%uf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%vf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fmc_g(this%ifms:this%ifme, this%jfms:this%jfme)) - this%fmc_g = config_flags%fuelmc_g - - ! Init lfn more than the largest domain side - allocate (this%lfn(this%ifms:this%ifme, this%jfms:this%jfme)) - this%lfn(this%ifds:this%ifde, this%jfds:this%jfde) = 2.0 * & - max ((this%ifde - this%ifds + 1) * this%dx, (this%jfde - this%jfds + 1) * this%dy) - - allocate (this%lfn_hist(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_1(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s1(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_s3(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%lfn_out(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fuel_load_g(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%flame_length(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%ros_front(this%ifms:this%ifme, this%jfms:this%jfme)) - - ! Init tign_g a bit into the future - allocate (this%tign_g(this%ifms:this%ifme, this%jfms:this%jfme)) - this%tign_g(this%ifps:this%ifpe, this%jfps:this%jfpe) = epsilon (this%tign_g) - - allocate (this%fuel_frac(this%ifms:this%ifme, this%jfms:this%jfme)) - this%fuel_frac(this%ifds:this%ifde, this%jfds:this%jfde) = 1.0 - - allocate (this%fire_area(this%ifms:this%ifme, this%jfms:this%jfme)) - this%fire_area(this%ifds:this%ifde, this%jfds:this%jfde) = 0.0 - - allocate (this%fuel_frac_burnt_dt(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fgrnhfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fgrnqfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fcanhfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fcanqfx(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%ros(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fz0(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fuel_time(this%ifms:this%ifme, this%jfms:this%jfme)) - - allocate (this%fire_psfc(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rain(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_t2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_q2(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rh_fire(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_psfc_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_rain_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_t2_old(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%fire_q2_old(this%ifms:this%ifme, this%jfms:this%jfme)) - - this%dt = config_flags%dt - - allocate (this%zsf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%dzdxf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%dzdyf(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%nfuel_cat(this%ifms:this%ifme, this%jfms:this%jfme)) - allocate (this%emis_smoke(this%ifms:this%ifme, this%jfms:this%jfme)) - this%emis_smoke = 0.0 - - Ideal_sim2: if (is_ideal_sim) then - do j = this%jfds, this%jfde - do i = this%ifds, this%ifde - this%zsf(i, j) = config_flags%elevation + & - (i - this%ifds) * config_flags%dz_dx * config_flags%dx + & - (j - this%jfds) * config_flags%dz_dy * config_flags%dy - end do - end do - this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dx - this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dy - this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%fuel_cat - - this%uf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%zonal_wind - this%vf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%meridional_wind - - call this%Init_latlons (proj) - else - this%zsf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%elevations - this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dxs - this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%dz_dys - this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%fuel_cats - - this%uf = 0.0 - this%vf = 0.0 - - call this%Init_latlons (proj, srx = geogrid%sr_x, sry = geogrid%sr_y) - end if Ideal_sim2 - - if (config_flags%fire_is_real_perim .and. .not. is_ideal_sim) then - if (allocated (geogrid%lfn_init)) then - this%lfn_hist(this%ifds:this%ifde, this%jfds:this%jfde) = geogrid%lfn_init - else - Call Stop_simulation ('Attenting to initialize fire from given perimeter but no initialization data present') - end if - end if - - this%unit_fxlat = 2.0 * PI / (360.0 * RERADIUS) ! earth circumference in m / 360 degrees - this%unit_fxlong = cos (this%cen_lat * 2.0 * PI / 360.0) * this%unit_fxlat ! latitude - call this%Init_tiles (config_flags) this%nx = this%ifde @@ -503,6 +372,19 @@ subroutine Init_domain (this, config_flags, geogrid, & this%dx = dx / sr_x this%dy = dy / sr_y + case (INIT_MODE_IDEAL) + this%dx = config_flags%dx + this%dy = config_flags%dy + + this%cen_lat = config_flags%cen_lat + this%cen_lon = config_flags%cen_lon + + proj = proj_lc_t (cen_lat = this%cen_lat , cen_lon = this%cen_lon, dx = this%dx, dy = this%dy, & + standard_lon = config_flags%stand_lon, true_lat_1 = config_flags%true_lat_1, & + true_lat_2 = config_flags%true_lat_2, nx = config_flags%nx, ny = config_flags%ny) + + call this%Init_latlons (proj) + case default call Stop_simulation ('Not ready to complete fire state initialization 2') @@ -536,6 +418,21 @@ subroutine Init_domain (this, config_flags, geogrid, & !this%lfn_hist(this%ifms:this%ifme, this%jfms:this%jfme) = lfn_hist call Stop_simulation ('Not ready to initialize from fire perimeter inside WRF') + case (INIT_MODE_IDEAL) + do j = this%jfds, this%jfde + do i = this%ifds, this%ifde + this%zsf(i, j) = config_flags%elevation + & + (i - this%ifds) * config_flags%dz_dx * config_flags%dx + & + (j - this%jfds) * config_flags%dz_dy * config_flags%dy + end do + end do + this%dzdxf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dx + this%dzdyf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%dz_dy + this%nfuel_cat(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%fuel_cat + + if (config_flags%fire_is_real_perim) & + call Stop_simulation ('Not ready to initialize from fire perimeter in idealized mode') + case default call Stop_simulation ('Not ready to complete fire state initialization 3') @@ -917,8 +814,13 @@ subroutine Set_vars_to_default (this, config_flags) type (namelist_t), intent (in) :: config_flags - this%uf = 0.0 - this%vf = 0.0 + if (config_flags%ideal_opt == 1) then + this%uf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%zonal_wind + this%vf(this%ifds:this%ifde, this%jfds:this%jfde) = config_flags%meridional_wind + else + this%uf = 0.0 + this%vf = 0.0 + end if this%fmc_g = config_flags%fuelmc_g ! Init lfn more than the largest domain side this%lfn(this%ifds:this%ifde, this%jfds:this%jfde) = 2.0 * & From e3d27fbb35267d874e3b98195e044ca3cf88fa4e Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Tue, 10 Jun 2025 18:31:43 -0600 Subject: [PATCH 44/57] Ideal block in the namelist is not mandatory --- io/namelist_mod.F90 | 16 ++++++++++------ tests/test7/namelist.fire | 2 -- tests/test8/namelist.fire | 2 -- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/io/namelist_mod.F90 b/io/namelist_mod.F90 index 7137238..53d91c4 100644 --- a/io/namelist_mod.F90 +++ b/io/namelist_mod.F90 @@ -54,6 +54,8 @@ module namelist_mod integer :: fmoist_freq = 0 ! frequency to run moisture model 0: use fmoist_dt, k>0: every k timesteps real :: fmoist_dt = 600.0 ! moisture model time step [s] + integer :: ideal_opt = IDEAL_OPT_DEFAULT ! 0) real world, 1) ideal + ! Objects integer :: fuel_opt = 1 ! Fuel model integer :: ros_opt = 0 ! ROS parameterization @@ -109,7 +111,6 @@ module namelist_mod real :: fire_ignition_radius5 = 0.0 ! Ideal block - integer :: ideal_opt = IDEAL_OPT_DEFAULT ! 0) real world, 1) ideal real :: dx = DX_DEFAULT real :: dy = DX_DEFAULT integer :: nx = NX_DEFAULT @@ -218,6 +219,8 @@ subroutine Init_fire_block (this, file_name) real :: fuelmc_g_live = 0.30 ! Fuel moisture content ground (Live FMC). 30% Completely cured, treat as dead fuel real :: fuelmc_c = 1.00 ! Fuel moisture content canopy + integer :: ideal_opt = IDEAL_OPT_DEFAULT + ! Objects integer :: fuel_opt = 1 ! Fuel model integer :: ros_opt = 0 ! ROS parameterization @@ -259,6 +262,7 @@ subroutine Init_fire_block (this, file_name) fmoist_freq, fmoist_dt, & fire_wind_height, fire_is_real_perim, frac_fburnt_to_smoke, fuelmc_g, & fuelmc_g_live, fuelmc_c, & + ideal_opt, & ! objects fuel_opt, ros_opt, fmc_opt, emis_opt, & ! Ignitions @@ -317,6 +321,8 @@ subroutine Init_fire_block (this, file_name) this%fuelmc_g_live = fuelmc_g_live this%fuelmc_c = fuelmc_c + this%ideal_opt = ideal_opt + this%fuel_opt = fuel_opt this%ros_opt = ros_opt this%fmc_opt = fmc_opt @@ -380,17 +386,16 @@ subroutine Init_ideal_block (this, file_name) real :: dx, dy, zonal_wind, meridional_wind, cen_lat, cen_lon, stand_lon, true_lat_1, true_lat_2, & dz_dx, dz_dy, elevation - integer :: nx, ny, fuel_cat, ideal_opt + integer :: nx, ny, fuel_cat character (len = :), allocatable :: msg integer :: unit_nml, io_stat - namelist /ideal/ ideal_opt, dx, dy, nx, ny, zonal_wind, meridional_wind, fuel_cat, & + namelist /ideal/ dx, dy, nx, ny, zonal_wind, meridional_wind, fuel_cat, & dz_dx, dz_dy, elevation, cen_lat, cen_lon, stand_lon, true_lat_1, true_lat_2 ! Set default values - ideal_opt = IDEAL_OPT_DEFAULT dx = DX_DEFAULT dy = DX_DEFAULT nx = NX_DEFAULT @@ -419,7 +424,6 @@ subroutine Init_ideal_block (this, file_name) if (io_stat /= 0) call Stop_simulation ('Problems reading namelist ideal block') close (unit_nml) - this%ideal_opt = ideal_opt this%dx = dx this%dy = dy @@ -521,7 +525,7 @@ subroutine Init_namelist (this, file_name) call this%Init_time_block (file_name = trim (file_name)) call this%Init_fire_block (file_name = trim (file_name)) call this%Init_atm_block (file_name = trim (file_name)) - call this%Init_ideal_block (file_name = trim (file_name)) + if (this%ideal_opt > 0) call this%Init_ideal_block (file_name = trim (file_name)) call this%Check_nml () diff --git a/tests/test7/namelist.fire b/tests/test7/namelist.fire index fffaea8..58ce971 100644 --- a/tests/test7/namelist.fire +++ b/tests/test7/namelist.fire @@ -37,5 +37,3 @@ fire_upwinding = 9, ! 0=none, 1=standard, 2=godunov, 3=eno, 4=sethian / - &ideal - / diff --git a/tests/test8/namelist.fire b/tests/test8/namelist.fire index 68cf0ed..ba75bdf 100644 --- a/tests/test8/namelist.fire +++ b/tests/test8/namelist.fire @@ -39,5 +39,3 @@ fmoist_freq = 1, ! Fuel moisture model updated every time step / - &ideal - / From 92477bba6453e37ab382737edbb8ff0440df91fa Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 11:42:08 -0600 Subject: [PATCH 45/57] First version of tmp code for parallelization --- physics/fire_driver_mod.F90 | 28 +++++--- physics/fire_model_mod.F90 | 131 +++++++++++++++++++++++++++++++++--- physics/fmc_wrffire_mod.F90 | 28 ++++++-- state/state_mod.F90 | 32 ++++++--- 4 files changed, 186 insertions(+), 33 deletions(-) diff --git a/physics/fire_driver_mod.F90 b/physics/fire_driver_mod.F90 index 8f66cc8..9691f76 100644 --- a/physics/fire_driver_mod.F90 +++ b/physics/fire_driver_mod.F90 @@ -70,17 +70,30 @@ subroutine Init_fire_components (grid, config_flags) end select call grid%ros_param%Init (grid%ifms, grid%ifme, grid%jfms, grid%jfme) - do ij = 1, grid%num_tiles +!tbf +! do ij = 1, grid%num_tiles +! call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & +! grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & +! grid%lfn) +! +! call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & +! grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & +! grid%tign_g) +! +! call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%i_start(ij), grid%i_end(ij), & +! grid%j_start(ij), grid%j_end(ij), grid%fuels, grid%nfuel_cat, grid%fmc_g) +! end do + do ij = 1, 1 call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & - grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & + grid%jfds, grid%jfde, grid%ifds, grid%ifde, grid%jfds, grid%jfde, & grid%lfn) call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & - grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & + grid%jfds, grid%jfde, grid%ifds, grid%ifde, grid%jfds, grid%jfde, & grid%tign_g) - call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%i_start(ij), grid%i_end(ij), & - grid%j_start(ij), grid%j_end(ij), grid%fuels, grid%nfuel_cat, grid%fmc_g) + call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & + grid%jfds, grid%jfde, grid%fuels, grid%nfuel_cat, grid%fmc_g) end do end subroutine Init_fire_components @@ -106,10 +119,7 @@ subroutine Advance_fire_components (grid, config_flags) grid%fire_rain_old, grid%fire_t2_old, grid%fire_q2_old, grid%fire_psfc_old, grid%fire_rh_fire, config_flags%fuelmc_g, & grid%fmc_g, grid%nfuel_cat, grid%fuels, grid%ros_param) - do ij = 1, grid%num_tiles - call Advance_fire_model (config_flags, grid, & - grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij)) - end do + call Advance_fire_model (config_flags, grid) if (config_flags%fire_print_msg >= PRINT_LEVEL) call Print_summary (config_flags, grid) diff --git a/physics/fire_model_mod.F90 b/physics/fire_model_mod.F90 index cd1cf7e..be751d3 100644 --- a/physics/fire_model_mod.F90 +++ b/physics/fire_model_mod.F90 @@ -32,7 +32,7 @@ pure subroutine Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jf end subroutine Copy_lfnout_to_lfn - subroutine Advance_fire_model (config_flags, grid, i_start, i_end, j_start, j_end) + subroutine Advance_fire_model (config_flags, grid) ! Purpose advance the fire from time_start to time_start + dt @@ -40,25 +40,20 @@ subroutine Advance_fire_model (config_flags, grid, i_start, i_end, j_start, j_en type (namelist_t), intent (in) :: config_flags type (state_fire_t), intent (in out) :: grid - integer, intent (in) :: i_start, i_end, j_start, j_end - integer :: ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme + integer :: ij, ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme real :: tbound, time_start logical, parameter :: DEBUG_LOCAL = .false. if (DEBUG_LOCAL) call Print_message ('Entering Advance_fire_model...') + ifds = grid%ifds ifde = grid%ifde jfds = grid%jfds jfde = grid%jfde - ifts = i_start - ifte = i_end - jfts = j_start - jfte = j_end - ifms = grid%ifms ifme = grid%ifme jfms = grid%jfms @@ -66,46 +61,166 @@ subroutine Advance_fire_model (config_flags, grid, i_start, i_end, j_start, j_en time_start = grid%itimestep * grid%dt +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Prop_level_set...') call Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, time_start, grid%dt, grid%dx, grid%dy, & config_flags%fire_upwinding, config_flags%fire_viscosity, config_flags%fire_viscosity_bg, config_flags%fire_viscosity_band, & config_flags%fire_viscosity_ngp, config_flags%fire_lsm_band_ngp, tbound, grid%lfn, grid%lfn_0, grid%lfn_1, grid%lfn_2, & grid%lfn_out, grid%tign_g, grid%ros, grid%uf, grid%vf, grid%dzdxf, grid%dzdyf, grid%ros_param) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Stop_if_close_to_bdy...') call Stop_if_close_to_bdy (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, grid%lfn_out) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Update_ignition_times...') call Update_ignition_times (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, & time_start, grid%dt, grid%lfn, grid%lfn_out, grid%tign_g) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_flame_length...') call Calc_flame_length (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & grid%ros, grid%ros_param%iboros, grid%flame_length, grid%ros_front, grid%fire_area) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Reinit_level_set...') if (config_flags%fire_lsm_reinit) call Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & ifds, ifde, jfds, jfde, time_start, grid%dt, grid%dx, grid%dy, config_flags%fire_upwinding_reinit, & config_flags%fire_lsm_reinit_iter, config_flags%fire_lsm_band_ngp, grid%lfn, grid%lfn_2, grid%lfn_s0, & grid%lfn_s1, grid%lfn_s2, grid%lfn_s3, grid%lfn_out, grid%tign_g) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Copy_lfnout_to_lfn...') call Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, grid%lfn_out, grid%lfn) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Ignite_prescribed_fires...') call Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_fuel_left...') call Calc_fuel_left (ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, ifts, ifte, jfts, jfte, & grid%lfn,grid%tign_g,grid%fuel_time, time_start + grid%dt, grid%fuel_frac, grid%fire_area, & grid%fuel_frac_burnt_dt) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_fire_fluxes...') call Calc_fire_fluxes (grid%dt, grid, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, & ifts, ifte, jfts, jfte, grid%fuel_load_g, grid%fuel_frac_burnt_dt, grid%fgrnhfx, grid%fgrnqfx) + end do +!tbf + do ij = 1, 1 + ifts = ifds + ifte = ifde + jfts = jfds + jfte = jfde +! do ij = 1, grid%num_tiles +! ifts = grid%i_start(ij) +! ifte = grid%i_end(ij) +! jfts = grid%j_start(ij) +! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_smoke_emissions...') call Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) + end do if (DEBUG_LOCAL) call Print_message ('Leaving Advance_fire_model...') diff --git a/physics/fmc_wrffire_mod.F90 b/physics/fmc_wrffire_mod.F90 index 01d7420..140933f 100644 --- a/physics/fmc_wrffire_mod.F90 +++ b/physics/fmc_wrffire_mod.F90 @@ -176,19 +176,35 @@ subroutine Advance_fmc_model (this, fmoist_freq, fmoist_dt, itimestep, dt, ifms, end if if (this%run_advance_moisture) then - do ij = 1, num_tiles - call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & +!tbf +! do ij = 1, num_tiles +! call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & +! fire_rain, fire_t2, fire_q2, fire_psfc, fire_rain_old, fire_t2_old, fire_q2_old, fire_psfc_old, fire_rh_fire, fuelmc_g) +! end do +! +! do ij = 1, num_tiles +! call this%Average_moisture_classes (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), nfuel_cat, fmc_g) +! end do +! +! do ij = 1, num_tiles +! call ros_param%Set_params (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & +! fuels, nfuel_cat, fmc_g) +! end do + + do ij = 1, 1 + call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, & fire_rain, fire_t2, fire_q2, fire_psfc, fire_rain_old, fire_t2_old, fire_q2_old, fire_psfc_old, fire_rh_fire, fuelmc_g) end do - do ij = 1, num_tiles - call this%Average_moisture_classes (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), nfuel_cat, fmc_g) + do ij = 1, 1 + call this%Average_moisture_classes (ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, nfuel_cat, fmc_g) end do - do ij = 1, num_tiles - call ros_param%Set_params (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & + do ij = 1, 1 + call ros_param%Set_params (ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, & fuels, nfuel_cat, fmc_g) end do + end if end subroutine Advance_fmc_model diff --git a/state/state_mod.F90 b/state/state_mod.F90 index b159760..34a62a3 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -172,11 +172,17 @@ subroutine Convert_scottburgan_to_anderson (this) integer :: i, j, ij, ifts, ifte, jfts, jfte - do ij = 1, this%num_tiles - ifts = this%i_start(ij) - ifte = this%i_end(ij) - jfts = this%j_start(ij) - jfte = this%j_end(ij) +!tbf + do ij = 1, 1 + ifts = this%ifds + ifte = this%ifde + jfts = this%jfds + jfte = this%jfde +! do ij = 1, this%num_tiles +! ifts = this%i_start(ij) +! ifte = this%i_end(ij) +! jfts = this%j_start(ij) +! jfte = this%j_end(ij) do j = jfts, jfte do i = ifts, ifte @@ -456,11 +462,17 @@ subroutine Init_fuel_vars (this) integer :: ij, i, j, ifts, ifte, jfts, jfte, k - do ij = 1, this%num_tiles - ifts = this%i_start(ij) - ifte = this%i_end(ij) - jfts = this%j_start(ij) - jfte = this%j_end(ij) +!tbf + do ij = 1, 1 + ifts = this%ifds + ifte = this%ifde + jfts = this%jfds + jfte = this%jfde +! do ij = 1, this%num_tiles +! ifts = this%i_start(ij) +! ifte = this%i_end(ij) +! jfts = this%j_start(ij) +! jfte = this%j_end(ij) do j = jfts, jfte do i = ifts, ifte k = int (this%nfuel_cat(i, j)) From 03bf335f207ddc2b6774f79949b4ab3a6e4b9ad0 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 11:47:28 -0600 Subject: [PATCH 46/57] state works on tiles --- state/state_mod.F90 | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 34a62a3..7430efb 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -172,17 +172,11 @@ subroutine Convert_scottburgan_to_anderson (this) integer :: i, j, ij, ifts, ifte, jfts, jfte -!tbf - do ij = 1, 1 - ifts = this%ifds - ifte = this%ifde - jfts = this%jfds - jfte = this%jfde -! do ij = 1, this%num_tiles -! ifts = this%i_start(ij) -! ifte = this%i_end(ij) -! jfts = this%j_start(ij) -! jfte = this%j_end(ij) + do ij = 1, this%num_tiles + ifts = this%i_start(ij) + ifte = this%i_end(ij) + jfts = this%j_start(ij) + jfte = this%j_end(ij) do j = jfts, jfte do i = ifts, ifte @@ -462,17 +456,11 @@ subroutine Init_fuel_vars (this) integer :: ij, i, j, ifts, ifte, jfts, jfte, k -!tbf - do ij = 1, 1 - ifts = this%ifds - ifte = this%ifde - jfts = this%jfds - jfte = this%jfde -! do ij = 1, this%num_tiles -! ifts = this%i_start(ij) -! ifte = this%i_end(ij) -! jfts = this%j_start(ij) -! jfte = this%j_end(ij) + do ij = 1, this%num_tiles + ifts = this%i_start(ij) + ifte = this%i_end(ij) + jfts = this%j_start(ij) + jfte = this%j_end(ij) do j = jfts, jfte do i = ifts, ifte k = int (this%nfuel_cat(i, j)) @@ -573,14 +561,12 @@ subroutine Init_tiles (this, config_flags) class (state_fire_t), intent(in out) :: this type (namelist_t), intent (in) :: config_flags - integer :: num_tiles - - num_tiles = config_flags%num_tiles - call Calc_tiles_dims (this%ifps, this%ifpe, this%jfps, this%jfpe, num_tiles, & + this%num_tiles = config_flags%num_tiles + call Calc_tiles_dims (this%ifps, this%ifpe, this%jfps, this%jfpe, this%num_tiles, & this%i_start, this%i_end, this%j_start, this%j_end) - if (num_tiles /= config_flags%num_tiles) then + if (this%num_tiles /= config_flags%num_tiles) then call Stop_simulation ('Not able to use the number of tiles specified') end if From 1bf1a0d00d84e4f76525bbd2527512713c088bba Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 13:25:38 -0600 Subject: [PATCH 47/57] fire_model works on tiles --- physics/fire_model_mod.F90 | 191 ++++++++++------------------- physics/level_set_mod.F90 | 244 +++++++++++++++++++++++++++---------- 2 files changed, 242 insertions(+), 193 deletions(-) diff --git a/physics/fire_model_mod.F90 b/physics/fire_model_mod.F90 index be751d3..7c2e333 100644 --- a/physics/fire_model_mod.F90 +++ b/physics/fire_model_mod.F90 @@ -48,7 +48,6 @@ subroutine Advance_fire_model (config_flags, grid) if (DEBUG_LOCAL) call Print_message ('Entering Advance_fire_model...') - ifds = grid%ifds ifde = grid%ifde jfds = grid%jfds @@ -61,165 +60,101 @@ subroutine Advance_fire_model (config_flags, grid) time_start = grid%itimestep * grid%dt -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Prop_level_set...') - call Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, time_start, grid%dt, grid%dx, grid%dy, & + call Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & + grid%num_tiles, grid%i_start, grid%i_end, grid%j_start, grid%j_end, time_start, grid%dt, grid%dx, grid%dy, & config_flags%fire_upwinding, config_flags%fire_viscosity, config_flags%fire_viscosity_bg, config_flags%fire_viscosity_band, & config_flags%fire_viscosity_ngp, config_flags%fire_lsm_band_ngp, tbound, grid%lfn, grid%lfn_0, grid%lfn_1, grid%lfn_2, & grid%lfn_out, grid%tign_g, grid%ros, grid%uf, grid%vf, grid%dzdxf, grid%dzdyf, grid%ros_param) - end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Stop_if_close_to_bdy...') - call Stop_if_close_to_bdy (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, grid%lfn_out) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Stop_if_close_to_bdy (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, grid%lfn_out) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Update_ignition_times...') - call Update_ignition_times (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, & - time_start, grid%dt, grid%lfn, grid%lfn_out, grid%tign_g) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Update_ignition_times (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, & + time_start, grid%dt, grid%lfn, grid%lfn_out, grid%tign_g) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_flame_length...') - call Calc_flame_length (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & - grid%ros, grid%ros_param%iboros, grid%flame_length, grid%ros_front, grid%fire_area) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Calc_flame_length (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & + grid%ros, grid%ros_param%iboros, grid%flame_length, grid%ros_front, grid%fire_area) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Reinit_level_set...') - if (config_flags%fire_lsm_reinit) call Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & + if (config_flags%fire_lsm_reinit) call Reinit_level_set (grid%num_tiles, grid%i_start, grid%i_end, grid%j_start, grid%j_end, & + ifms, ifme, jfms, jfme, & ifds, ifde, jfds, jfde, time_start, grid%dt, grid%dx, grid%dy, config_flags%fire_upwinding_reinit, & config_flags%fire_lsm_reinit_iter, config_flags%fire_lsm_band_ngp, grid%lfn, grid%lfn_2, grid%lfn_s0, & grid%lfn_s1, grid%lfn_s2, grid%lfn_s3, grid%lfn_out, grid%tign_g) - end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Copy_lfnout_to_lfn...') - call Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, grid%lfn_out, grid%lfn) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, grid%lfn_out, grid%lfn) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Ignite_prescribed_fires...') - call Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_fuel_left...') - call Calc_fuel_left (ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, ifts, ifte, jfts, jfte, & - grid%lfn,grid%tign_g,grid%fuel_time, time_start + grid%dt, grid%fuel_frac, grid%fire_area, & - grid%fuel_frac_burnt_dt) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + call Calc_fuel_left (ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, ifts, ifte, jfts, jfte, & + grid%lfn,grid%tign_g,grid%fuel_time, time_start + grid%dt, grid%fuel_frac, grid%fire_area, & + grid%fuel_frac_burnt_dt) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_fire_fluxes...') - call Calc_fire_fluxes (grid%dt, grid, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, & - ifts, ifte, jfts, jfte, grid%fuel_load_g, grid%fuel_frac_burnt_dt, grid%fgrnhfx, grid%fgrnqfx) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + call Calc_fire_fluxes (grid%dt, grid, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, & + ifts, ifte, jfts, jfte, grid%fuel_load_g, grid%fuel_frac_burnt_dt, grid%fgrnhfx, grid%fgrnqfx) end do -!tbf - do ij = 1, 1 - ifts = ifds - ifte = ifde - jfts = jfds - jfte = jfde -! do ij = 1, grid%num_tiles -! ifts = grid%i_start(ij) -! ifte = grid%i_end(ij) -! jfts = grid%j_start(ij) -! jfte = grid%j_end(ij) if (DEBUG_LOCAL) call Print_message ('calling Calc_smoke_emissions...') - call Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) + do ij = 1, grid%num_tiles + ifts = grid%i_start(ij) + ifte = grid%i_end(ij) + jfts = grid%j_start(ij) + jfte = grid%j_end(ij) + + call Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) end do if (DEBUG_LOCAL) call Print_message ('Leaving Advance_fire_model...') diff --git a/physics/level_set_mod.F90 b/physics/level_set_mod.F90 index 2f52545..d1eedfe 100644 --- a/physics/level_set_mod.F90 +++ b/physics/level_set_mod.F90 @@ -267,7 +267,7 @@ subroutine Calc_fuel_left_at_grid_point (lfn00, lfn01, lfn10, & end subroutine Calc_fuel_left_at_grid_point subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & - ifts, ifte, jfts, jfte, ts, dt, dx, dy, fire_upwinding, fire_viscosity, & + num_tiles, i_start, i_end, j_start, j_end, ts, dt, dx, dy, fire_upwinding, fire_viscosity, & fire_viscosity_bg, fire_viscosity_band, fire_viscosity_ngp, fire_lsm_band_ngp, & tbound, lfn_in, lfn_0, lfn_1, lfn_2, lfn_out, tign, ros, uf, vf, dzdxf, dzdyf, ros_model) @@ -275,8 +275,9 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & implicit none - integer, intent(in) :: ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & + integer, intent(in) :: ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, num_tiles, & fire_upwinding, fire_viscosity_ngp, fire_lsm_band_ngp + integer, dimension (num_tiles), intent (in) :: i_start, i_end, j_start, j_end real, intent(in) :: fire_viscosity, fire_viscosity_bg, fire_viscosity_band real, dimension(ifms:ifme, jfms:jfme), intent (in) :: uf, vf, dzdxf, dzdyf real, dimension(ifms:ifme, jfms:jfme), intent (in out) :: lfn_in, tign, lfn_1, lfn_2, lfn_0 @@ -288,59 +289,107 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & ! to store tendency (rhs of the level set pde) real, dimension(ifms:ifme, jfms:jfme) :: tend real :: tbound2, tbound3 - integer :: i, j + integer :: i, j, ij, ifts, ifte, jfts, jfte character (len = :), allocatable :: msg logical, parameter :: DEBUG_LOCAL = .false. if (DEBUG_LOCAL) call Print_message ('Entering sub Prop_level_set...') - ! Runge-Kutta step 1 - do j = jfts, jfte - do i = ifts, ifte - lfn_0(i, j) = lfn_in(i, j) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + do j = jfts, jfte + do i = ifts, ifte + lfn_0(i, j) = lfn_in(i, j) + end do end do end do + ! Runge-Kutta step 1 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 1...') - call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & - ifms, ifme, jfms, jfme, ts, dt, dx, dy, fire_upwinding, & - fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_0, tbound, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) - do j = jfts, jfte - do i = ifts, ifte - lfn_1(i, j) = lfn_0(i, j) + (dt / 3.0) * tend(i, j) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & + ifms, ifme, jfms, jfme, ts, dt, dx, dy, fire_upwinding, & + fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_0, tbound, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + end do + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + do j = jfts, jfte + do i = ifts, ifte + lfn_1(i, j) = lfn_0(i, j) + (dt / 3.0) * tend(i, j) + end do end do end do ! Runge-Kutta step 2 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 2...') - call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & - ifms,ifme,jfms,jfme, ts + dt, dt, dx, dy, fire_upwinding, & - fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_1, tbound2, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) - do j = jfts, jfte - do i = ifts, ifte - lfn_2(i, j) = lfn_0(i, j) + (dt / 2.0) * tend(i, j) + call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & + ifms,ifme,jfms,jfme, ts + dt, dt, dx, dy, fire_upwinding, & + fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_1, tbound2, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + end do + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + do j = jfts, jfte + do i = ifts, ifte + lfn_2(i, j) = lfn_0(i, j) + (dt / 2.0) * tend(i, j) + end do end do end do ! Runge-Kutta step 3 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 3...') - call Calc_tend_ls (ifds,ifde,jfds,jfde, ifts, ifte, jfts, jfte, & - ifms, ifme, jfms, jfme, ts + dt, dt, dx, dy, fire_upwinding, & - fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_2, tbound3, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) - do j = jfts, jfte - do i = ifts, ifte - lfn_out(i, j) = lfn_0(i, j) + dt * tend(i, j) + call Calc_tend_ls (ifds,ifde,jfds,jfde, ifts, ifte, jfts, jfte, & + ifms, ifme, jfms, jfme, ts + dt, dt, dx, dy, fire_upwinding, & + fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_2, tbound3, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + end do + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + do j = jfts, jfte + do i = ifts, ifte + lfn_out(i, j) = lfn_0(i, j) + dt * tend(i, j) + end do end do - end do + end do ! CFL check, tbound is the max allowed time step tbound = min (tbound, tbound2, tbound3) @@ -356,7 +405,7 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end subroutine Prop_level_set - subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & + subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, ifme, jfms, jfme, & ifds, ifde, jfds, jfde, ts, dt, dx, dy, fire_upwinding_reinit, & fire_lsm_reinit_iter, fire_lsm_band_ngp, lfn_in, lfn_2, lfn_s0, & lfn_s1, lfn_s2, lfn_s3, lfn_out, tign) @@ -373,7 +422,9 @@ subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & implicit none - integer, intent (in) :: ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme + integer, intent (in) :: num_tiles + integer, dimension (num_tiles), intent (in) :: i_start, i_end, j_start, j_end + integer, intent (in) :: ifms, ifme, jfms, jfme integer, intent (in) :: ifds, ifde, jfds, jfde integer, intent (in) :: fire_upwinding_reinit, fire_lsm_reinit_iter, fire_lsm_band_ngp real, dimension (ifms:ifme, jfms:jfme), intent (in out) :: lfn_in, tign @@ -382,62 +433,125 @@ subroutine Reinit_level_set (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & real, intent (in) :: dx, dy, ts, dt real :: dt_s, threshold_hlu - integer :: nts, i, j + integer :: nts, i, j, ij, ifts, ifte, jfts, jfte threshold_hlu = fire_lsm_band_ngp * dx ! Define S0 based on current lfn values - do j = jfts, jfte - do i = ifts, ifte - lfn_s0(i, j) = lfn_out(i,j) / sqrt (lfn_out(i, j) ** 2.0 + dx ** 2.0) - lfn_s3(i, j) = lfn_out(i,j) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + do j = jfts, jfte + do i = ifts, ifte + lfn_s0(i, j) = lfn_out(i,j) / sqrt (lfn_out(i, j) ** 2.0 + dx ** 2.0) + lfn_s3(i, j) = lfn_out(i,j) + end do end do end do + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) - call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & - jfds, jfde, ifts, ifte, jfts, jfte, lfn_s3) + call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & + jfds, jfde, ifts, ifte, jfts, jfte, lfn_s3) + end do dt_s = 0.01 * dx dt_s = 0.0001 * dx ! iterate to solve to steady state reinit PDE ! 1 iter each time step is enoguh - do nts = 1, fire_lsm_reinit_iter + Loop_iter: do nts = 1, fire_lsm_reinit_iter ! Runge-Kutta step 1 - call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & - ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & - lfn_s0, lfn_s3, lfn_s3, lfn_s1, 1.0 / 3.0, & ! sign funcition, initial ls, current stage ls, next stage advanced ls, RK coefficient - fire_upwinding_reinit) - - call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & - jfds, jfde, ifts, ifte, jfts, jfte, lfn_s1) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & + ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & + lfn_s0, lfn_s3, lfn_s3, lfn_s1, 1.0 / 3.0, & ! sign funcition, initial ls, current stage ls, next stage advanced ls, RK coefficient + fire_upwinding_reinit) + end do + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & + jfds, jfde, ifts, ifte, jfts, jfte, lfn_s1) + end do ! Runge-Kutta step 2 - call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & - ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & - lfn_s0, lfn_s3, lfn_s1, lfn_s2, 1.0 / 2.0, & - fire_upwinding_reinit) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & + ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & + lfn_s0, lfn_s3, lfn_s1, lfn_s2, 1.0 / 2.0, & + fire_upwinding_reinit) + end do - call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & - jfds, jfde, ifts, ifte, jfts, jfte, lfn_s2) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & + jfds, jfde, ifts, ifte, jfts, jfte, lfn_s2) + end do ! Runge-Kutta step 3 - call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & - ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & - lfn_s0, lfn_s3, lfn_s2, lfn_s3, 1.0, & - fire_upwinding_reinit) + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + call Advance_ls_reinit (ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde, & + ifts, ifte, jfts, jfte, dx, dy, dt_s, threshold_hlu, & + lfn_s0, lfn_s3, lfn_s2, lfn_s3, 1.0, & + fire_upwinding_reinit) + end do - call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & - jfds,jfde, ifts, ifte, jfts, jfte, lfn_s3) - end do + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) - do j = jfts, jfte - do i = ifts, ifte - ! assing to lfn_out the reinitialized level-set function - lfn_out(i, j) = lfn_s3(i, j) - ! fire area can only increase - lfn_out(i, j) = min (lfn_out(i, j), lfn_in(i, j)) + call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & + jfds,jfde, ifts, ifte, jfts, jfte, lfn_s3) + end do + end do Loop_iter + + do ij = 1, num_tiles + ifts = i_start(ij) + ifte = i_end(ij) + jfts = j_start(ij) + jfte = j_end(ij) + + do j = jfts, jfte + do i = ifts, ifte + ! assing to lfn_out the reinitialized level-set function + lfn_out(i, j) = lfn_s3(i, j) + ! fire area can only increase + lfn_out(i, j) = min (lfn_out(i, j), lfn_in(i, j)) + end do end do end do From 39f3253f18ab3a1cb8c83cdc96cbe2993e7a1c14 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 13:49:00 -0600 Subject: [PATCH 48/57] Tile functionality working with one cpu --- physics/fire_driver_mod.F90 | 23 +++++------------------ physics/fmc_wrffire_mod.F90 | 28 ++++++---------------------- 2 files changed, 11 insertions(+), 40 deletions(-) diff --git a/physics/fire_driver_mod.F90 b/physics/fire_driver_mod.F90 index 9691f76..ce059d2 100644 --- a/physics/fire_driver_mod.F90 +++ b/physics/fire_driver_mod.F90 @@ -70,30 +70,17 @@ subroutine Init_fire_components (grid, config_flags) end select call grid%ros_param%Init (grid%ifms, grid%ifme, grid%jfms, grid%jfme) -!tbf -! do ij = 1, grid%num_tiles -! call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & -! grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & -! grid%lfn) -! -! call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & -! grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & -! grid%tign_g) -! -! call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%i_start(ij), grid%i_end(ij), & -! grid%j_start(ij), grid%j_end(ij), grid%fuels, grid%nfuel_cat, grid%fmc_g) -! end do - do ij = 1, 1 + do ij = 1, grid%num_tiles call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & - grid%jfds, grid%jfde, grid%ifds, grid%ifde, grid%jfds, grid%jfde, & + grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & grid%lfn) call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & - grid%jfds, grid%jfde, grid%ifds, grid%ifde, grid%jfds, grid%jfde, & + grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & grid%tign_g) - call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & - grid%jfds, grid%jfde, grid%fuels, grid%nfuel_cat, grid%fmc_g) + call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%i_start(ij), grid%i_end(ij), & + grid%j_start(ij), grid%j_end(ij), grid%fuels, grid%nfuel_cat, grid%fmc_g) end do end subroutine Init_fire_components diff --git a/physics/fmc_wrffire_mod.F90 b/physics/fmc_wrffire_mod.F90 index 140933f..01d7420 100644 --- a/physics/fmc_wrffire_mod.F90 +++ b/physics/fmc_wrffire_mod.F90 @@ -176,35 +176,19 @@ subroutine Advance_fmc_model (this, fmoist_freq, fmoist_dt, itimestep, dt, ifms, end if if (this%run_advance_moisture) then -!tbf -! do ij = 1, num_tiles -! call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & -! fire_rain, fire_t2, fire_q2, fire_psfc, fire_rain_old, fire_t2_old, fire_q2_old, fire_psfc_old, fire_rh_fire, fuelmc_g) -! end do -! -! do ij = 1, num_tiles -! call this%Average_moisture_classes (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), nfuel_cat, fmc_g) -! end do -! -! do ij = 1, num_tiles -! call ros_param%Set_params (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & -! fuels, nfuel_cat, fmc_g) -! end do - - do ij = 1, 1 - call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, & + do ij = 1, num_tiles + call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & fire_rain, fire_t2, fire_q2, fire_psfc, fire_rain_old, fire_t2_old, fire_q2_old, fire_psfc_old, fire_rh_fire, fuelmc_g) end do - do ij = 1, 1 - call this%Average_moisture_classes (ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, nfuel_cat, fmc_g) + do ij = 1, num_tiles + call this%Average_moisture_classes (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), nfuel_cat, fmc_g) end do - do ij = 1, 1 - call ros_param%Set_params (ifms, ifme, jfms, jfme, ifms+5, ifme-5, jfms+5, jfme-5, & + do ij = 1, num_tiles + call ros_param%Set_params (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & fuels, nfuel_cat, fmc_g) end do - end if end subroutine Advance_fmc_model From 905b9915bf2c1b95925a58e09476bb92c1006edc Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 14:15:07 -0600 Subject: [PATCH 49/57] Remove prints realted to smoke emissions --- physics/fire_physics_mod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/physics/fire_physics_mod.F90 b/physics/fire_physics_mod.F90 index 480ad60..b0b6ab9 100644 --- a/physics/fire_physics_mod.F90 +++ b/physics/fire_physics_mod.F90 @@ -89,7 +89,7 @@ subroutine Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) select case (config_flags%emis_opt) case (EMIS_WRFFIRE) - write (*, *) 'Smoke WRF-Fire', config_flags%frac_fburnt_to_smoke +! write (*, *) 'Smoke WRF-Fire', config_flags%frac_fburnt_to_smoke do j = jfts, jfte do i = ifts, ifte grid%emis_smoke(i, j) = config_flags%frac_fburnt_to_smoke * grid%fuel_frac_burnt_dt(i, j) * grid%fuel_load_g(i, j) ! kg/m^2 @@ -98,7 +98,7 @@ subroutine Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) case (EMIS_FMC_PM2P5) ! Assuminmg the fuel is litter for the moment - write (*, *) 'Smoke CFBM' +! write (*, *) 'Smoke CFBM' do j = jfts, jfte do i = ifts, ifte if (grid%fmc_g(i, j) <= 0.035) then From 606356618d5fce54a02dbdaf16136709d3571db2 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Wed, 16 Jul 2025 18:44:30 -0600 Subject: [PATCH 50/57] Adding OpenMP parallelization --- physics/fire_driver_mod.F90 | 3 ++ physics/fire_model_mod.F90 | 25 +++++++++++++ physics/fmc_wrffire_mod.F90 | 9 +++++ physics/level_set_mod.F90 | 74 +++++++++++++++++++++++++++++++++---- state/state_mod.F90 | 6 +++ 5 files changed, 110 insertions(+), 7 deletions(-) diff --git a/physics/fire_driver_mod.F90 b/physics/fire_driver_mod.F90 index ce059d2..ca57a53 100644 --- a/physics/fire_driver_mod.F90 +++ b/physics/fire_driver_mod.F90 @@ -70,6 +70,8 @@ subroutine Init_fire_components (grid, config_flags) end select call grid%ros_param%Init (grid%ifms, grid%ifme, grid%jfms, grid%jfme) + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij) do ij = 1, grid%num_tiles call Extrapol_var_at_bdys (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%ifds, grid%ifde, & grid%jfds, grid%jfde, grid%i_start(ij), grid%i_end(ij), grid%j_start(ij), grid%j_end(ij), & @@ -82,6 +84,7 @@ subroutine Init_fire_components (grid, config_flags) call grid%ros_param%Set_params (grid%ifms, grid%ifme, grid%jfms, grid%jfme, grid%i_start(ij), grid%i_end(ij), & grid%j_start(ij), grid%j_end(ij), grid%fuels, grid%nfuel_cat, grid%fmc_g) end do + !$OMP END PARALLEL DO end subroutine Init_fire_components diff --git a/physics/fire_model_mod.F90 b/physics/fire_model_mod.F90 index 7c2e333..08a4523 100644 --- a/physics/fire_model_mod.F90 +++ b/physics/fire_model_mod.F90 @@ -68,6 +68,8 @@ subroutine Advance_fire_model (config_flags, grid) grid%lfn_out, grid%tign_g, grid%ros, grid%uf, grid%vf, grid%dzdxf, grid%dzdyf, grid%ros_param) if (DEBUG_LOCAL) call Print_message ('calling Stop_if_close_to_bdy...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -76,8 +78,11 @@ subroutine Advance_fire_model (config_flags, grid) call Stop_if_close_to_bdy (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, grid%lfn_out) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Update_ignition_times...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -87,8 +92,12 @@ subroutine Advance_fire_model (config_flags, grid) call Update_ignition_times (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, jfds, ifde, jfde, & time_start, grid%dt, grid%lfn, grid%lfn_out, grid%tign_g) end do + !$OMP END PARALLEL DO + if (DEBUG_LOCAL) call Print_message ('calling Calc_flame_length...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -98,6 +107,7 @@ subroutine Advance_fire_model (config_flags, grid) call Calc_flame_length (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, & grid%ros, grid%ros_param%iboros, grid%flame_length, grid%ros_front, grid%fire_area) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Reinit_level_set...') if (config_flags%fire_lsm_reinit) call Reinit_level_set (grid%num_tiles, grid%i_start, grid%i_end, grid%j_start, grid%j_end, & @@ -107,6 +117,8 @@ subroutine Advance_fire_model (config_flags, grid) grid%lfn_s1, grid%lfn_s2, grid%lfn_s3, grid%lfn_out, grid%tign_g) if (DEBUG_LOCAL) call Print_message ('calling Copy_lfnout_to_lfn...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -115,8 +127,11 @@ subroutine Advance_fire_model (config_flags, grid) call Copy_lfnout_to_lfn (ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, grid%lfn_out, grid%lfn) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Ignite_prescribed_fires...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -125,8 +140,11 @@ subroutine Advance_fire_model (config_flags, grid) call Ignite_prescribed_fires (grid, config_flags, time_start, ifts, ifte, jfts, jfte, ifms, ifme, jfms, jfme, ifds, ifde, jfds, jfde) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Calc_fuel_left...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -136,8 +154,11 @@ subroutine Advance_fire_model (config_flags, grid) grid%lfn,grid%tign_g,grid%fuel_time, time_start + grid%dt, grid%fuel_frac, grid%fire_area, & grid%fuel_frac_burnt_dt) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Calc_fire_fluxes...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -146,8 +167,11 @@ subroutine Advance_fire_model (config_flags, grid) call Calc_fire_fluxes (grid%dt, grid, ifms, ifme, jfms, jfme, ifts, ifte, jfts, jfte, & ifts, ifte, jfts, jfte, grid%fuel_load_g, grid%fuel_frac_burnt_dt, grid%fgrnhfx, grid%fgrnqfx) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('calling Calc_smoke_emissions...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, grid%num_tiles ifts = grid%i_start(ij) ifte = grid%i_end(ij) @@ -156,6 +180,7 @@ subroutine Advance_fire_model (config_flags, grid) call Calc_smoke_emissions (grid, config_flags, ifts, ifte, jfts, jfte) end do + !$OMP END PARALLEL DO if (DEBUG_LOCAL) call Print_message ('Leaving Advance_fire_model...') diff --git a/physics/fmc_wrffire_mod.F90 b/physics/fmc_wrffire_mod.F90 index 01d7420..7110ac9 100644 --- a/physics/fmc_wrffire_mod.F90 +++ b/physics/fmc_wrffire_mod.F90 @@ -176,19 +176,28 @@ subroutine Advance_fmc_model (this, fmoist_freq, fmoist_dt, itimestep, dt, ifms, end if if (this%run_advance_moisture) then + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij) do ij = 1, num_tiles call this%Advance_moisture_classes (itimestep == 1, ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & fire_rain, fire_t2, fire_q2, fire_psfc, fire_rain_old, fire_t2_old, fire_q2_old, fire_psfc_old, fire_rh_fire, fuelmc_g) end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij) do ij = 1, num_tiles call this%Average_moisture_classes (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), nfuel_cat, fmc_g) end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij) do ij = 1, num_tiles call ros_param%Set_params (ifms, ifme, jfms, jfme, i_start(ij), i_end(ij), j_start(ij), j_end(ij), & fuels, nfuel_cat, fmc_g) end do + !$OMP END PARALLEL DO end if end subroutine Advance_fmc_model diff --git a/physics/level_set_mod.F90 b/physics/level_set_mod.F90 index d1eedfe..a7bdb29 100644 --- a/physics/level_set_mod.F90 +++ b/physics/level_set_mod.F90 @@ -288,14 +288,16 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & ! to store tendency (rhs of the level set pde) real, dimension(ifms:ifme, jfms:jfme) :: tend - real :: tbound2, tbound3 + real :: tbound2, tbound3, tbound_thread, tbound_min integer :: i, j, ij, ifts, ifte, jfts, jfte - character (len = :), allocatable :: msg + character (len = 128) :: msg logical, parameter :: DEBUG_LOCAL = .false. if (DEBUG_LOCAL) call Print_message ('Entering sub Prop_level_set...') + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -307,10 +309,14 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do end do end do + !$OMP END PARALLEL DO ! Runge-Kutta step 1 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 1...') + tbound_min = huge(tbound_min) + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte, tbound_thread) SHARED(tbound_min) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -320,9 +326,15 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & ifms, ifme, jfms, jfme, ts, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_0, tbound, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_0, tbound_thread, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + + tbound_min = min(tbound_min, tbound_thread) end do + !$OMP END PARALLEL DO + tbound = tbound_min + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -335,10 +347,14 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do end do end do + !$OMP END PARALLEL DO ! Runge-Kutta step 2 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 2...') + tbound_min = huge(tbound_min) + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte, tbound_thread) SHARED(tbound_min) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -348,9 +364,15 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & call Calc_tend_ls (ifds, ifde, jfds, jfde, ifts, ifte, jfts, jfte, & ifms,ifme,jfms,jfme, ts + dt, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_1, tbound2, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_1, tbound_thread, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + + tbound_min = min(tbound_min, tbound_thread) end do + !$OMP END PARALLEL DO + tbound2 = tbound_min + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -363,10 +385,14 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do end do end do + !$OMP END PARALLEL DO ! Runge-Kutta step 3 if (DEBUG_LOCAL) call Print_message ('call Calc_tend_ls 3...') + tbound_min = huge(tbound_min) + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte, tbound_thread) SHARED(tbound_min) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -376,9 +402,15 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & call Calc_tend_ls (ifds,ifde,jfds,jfde, ifts, ifte, jfts, jfte, & ifms, ifme, jfms, jfme, ts + dt, dt, dx, dy, fire_upwinding, & fire_viscosity, fire_viscosity_bg, fire_viscosity_band, & - fire_viscosity_ngp, fire_lsm_band_ngp, lfn_2, tbound3, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + fire_viscosity_ngp, fire_lsm_band_ngp, lfn_2, tbound_thread, tend, ros, uf, vf, dzdxf, dzdyf, ros_model) + + tbound_min = min(tbound_min, tbound_thread) end do + !$OMP END PARALLEL DO + tbound3 = tbound_min + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -390,13 +422,14 @@ subroutine Prop_level_set (ifds, ifde, jfds, jfde, ifms, ifme, jfms, jfme, & end do end do end do + !$OMP END PARALLEL DO ! CFL check, tbound is the max allowed time step - tbound = min (tbound, tbound2, tbound3) + tbound = min(min(tbound, tbound2), tbound3) if (dt > tbound) then !$omp critical - write (msg, '(2(a, f10.2))') 'CFL violation: time step ', dt, ' > bound =', tbound + write (msg, '(a, f10.2, a, f10.2)') 'CFL violation: time step ', dt, ' > bound =', tbound call Stop_simulation (msg) !$omp end critical end if @@ -439,6 +472,8 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if threshold_hlu = fire_lsm_band_ngp * dx ! Define S0 based on current lfn values + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -452,7 +487,10 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if end do end do end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -462,6 +500,7 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & jfds, jfde, ifts, ifte, jfts, jfte, lfn_s3) end do + !$OMP END PARALLEL DO dt_s = 0.01 * dx dt_s = 0.0001 * dx @@ -470,6 +509,8 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if ! 1 iter each time step is enoguh Loop_iter: do nts = 1, fire_lsm_reinit_iter ! Runge-Kutta step 1 + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -481,7 +522,10 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if lfn_s0, lfn_s3, lfn_s3, lfn_s1, 1.0 / 3.0, & ! sign funcition, initial ls, current stage ls, next stage advanced ls, RK coefficient fire_upwinding_reinit) end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -491,8 +535,11 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & jfds, jfde, ifts, ifte, jfts, jfte, lfn_s1) end do + !$OMP END PARALLEL DO ! Runge-Kutta step 2 + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -504,7 +551,10 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if lfn_s0, lfn_s3, lfn_s1, lfn_s2, 1.0 / 2.0, & fire_upwinding_reinit) end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -514,8 +564,11 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & jfds, jfde, ifts, ifte, jfts, jfte, lfn_s2) end do + !$OMP END PARALLEL DO ! Runge-Kutta step 3 + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -527,7 +580,10 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if lfn_s0, lfn_s3, lfn_s2, lfn_s3, 1.0, & fire_upwinding_reinit) end do + !$OMP END PARALLEL DO + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -537,8 +593,11 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if call Extrapol_var_at_bdys (ifms, ifme, jfms, jfme, ifds, ifde, & jfds,jfde, ifts, ifte, jfts, jfte, lfn_s3) end do + !$OMP END PARALLEL DO end do Loop_iter + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, num_tiles ifts = i_start(ij) ifte = i_end(ij) @@ -554,6 +613,7 @@ subroutine Reinit_level_set (num_tiles, i_start, i_end, j_start, j_end, ifms, if end do end do end do + !$OMP END PARALLEL DO end subroutine Reinit_level_set diff --git a/state/state_mod.F90 b/state/state_mod.F90 index 7430efb..a8fa021 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -172,6 +172,8 @@ subroutine Convert_scottburgan_to_anderson (this) integer :: i, j, ij, ifts, ifte, jfts, jfte + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, ifts, ifte, jfts, jfte) do ij = 1, this%num_tiles ifts = this%i_start(ij) ifte = this%i_end(ij) @@ -184,6 +186,7 @@ subroutine Convert_scottburgan_to_anderson (this) end do end do end do + !$OMP END PARALLEL DO end subroutine Convert_scottburgan_to_anderson @@ -456,6 +459,8 @@ subroutine Init_fuel_vars (this) integer :: ij, i, j, ifts, ifte, jfts, jfte, k + !$OMP PARALLEL DO & + !$OMP PRIVATE (ij, i, j, k, ifts, ifte, jfts, jfte) do ij = 1, this%num_tiles ifts = this%i_start(ij) ifte = this%i_end(ij) @@ -478,6 +483,7 @@ subroutine Init_fuel_vars (this) end do end do end do + !$OMP END PARALLEL DO end subroutine Init_fuel_vars From 94cfa949f615ea5245b8b8352caa34fbc306550a Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 18 Jul 2025 13:05:36 -0600 Subject: [PATCH 51/57] compiling option to build with OpenMP --- CMakeLists.txt | 8 ++++++++ cmake/modules/FireBuildSettings.cmake | 2 ++ compile.sh | 9 +++++++++ 3 files changed, 19 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 934afc6..92cebf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,11 @@ if(DM_PARALLEL) add_compile_definitions(firelib PUBLIC DM_PARALLEL=1) endif() +if(ENABLE_OPENMP) + find_package(OpenMP REQUIRED) + message(STATUS "OpenMP enabled") +endif() + #------------------------------------------------------------------------------ # Add source files @@ -103,6 +108,9 @@ endif() if (DM_PARALLEL) target_link_libraries(firelib PUBLIC $) endif() +if(ENABLE_OPENMP) + target_link_libraries(firelib PUBLIC $) +endif() set_target_properties( firelib PROPERTIES diff --git a/cmake/modules/FireBuildSettings.cmake b/cmake/modules/FireBuildSettings.cmake index 7fec919..1a6abf7 100644 --- a/cmake/modules/FireBuildSettings.cmake +++ b/cmake/modules/FireBuildSettings.cmake @@ -14,10 +14,12 @@ function(set_fire_cache) set (DM_PARALLEL ${DM_PARALLEL} CACHE BOOL "Turn on MPI build" FORCE) set (NUOPC ${NUOPC} CACHE BOOL "Build NUOPC cap" FORCE) set (ESMX ${ESMX} CACHE BOOL "Build ESMX application" FORCE) + set (ENABLE_OPENMP ${ENABLE_OPENMP} CACHE BOOL "Enable OpenMP parallelization" FORCE) endfunction() function(print_fire_settings) message (STATUS "FIRE BEHAVIOR BUILD SETTINGS\n" + "\tOPENMP: ${ENABLE_OPENMP}\n" "\tDM_PARALLEL: ${DM_PARALLEL}\n" "\tNUOPC: ${NUOPC}\n" "\tESMX: ${ESMX}") diff --git a/compile.sh b/compile.sh index 0ad3459..9be9cc5 100755 --- a/compile.sh +++ b/compile.sh @@ -23,6 +23,8 @@ usage () { printf " build NUOPC library and module\n" printf " --esmx, -x\n" printf " build ESMX application (includes NUOPC)\n" + printf " --openmp-on\n" + printf " enable OpenMP parallelization\n" printf " --prefix=INSTALL_PREFIX\n" printf " installation prefix\n" printf " --verbose, -v\n" @@ -81,6 +83,7 @@ VERBOSE=false TEST=false TEST_NAME="" CLEAN=false +OPENMP=false #------------------------------------------------------------------------------ @@ -129,6 +132,7 @@ while :; do --test=?*|-t=?*) TEST=true; TEST_NAME=${1#*=} ;; --test=) TEST=true ;; --clean) CLEAN=true ;; + --openmp-on) OPENMP=true ;; --clean=?*) printf "ERROR: $1 argument ignored.\n"; usage; exit 1 ;; --clean=) printf "ERROR: $1 argument ignored.\n"; usage; exit 1 ;; -?*) printf "ERROR: Unknown option $1\n"; usage; exit 1 ;; @@ -213,6 +217,11 @@ if [ "${ESMX}" = true ]; then else CMAKE_SETTINGS+=("-DESMX=OFF") fi +if [ "${OPENMP}" = true ]; then + CMAKE_SETTINGS+=("-DENABLE_OPENMP=ON") +else + CMAKE_SETTINGS+=("-DENABLE_OPENMP=OFF") +fi cmake -S${FIRE_DIR} -B${BUILD_DIR} ${CMAKE_SETTINGS[@]} if [ "$?" != "0" ]; then echo "$0 Failed: (cmake)" From afeca1fac00bfdc0c2597f5305578dad17aa8945 Mon Sep 17 00:00:00 2001 From: masih Date: Wed, 11 Jun 2025 13:41:38 -0600 Subject: [PATCH 52/57] adding 10-m wind to fire cap imports --- nuopc/fire_behavior_nuopc.F90 | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/nuopc/fire_behavior_nuopc.F90 b/nuopc/fire_behavior_nuopc.F90 index cc60bf7..bb943ea 100644 --- a/nuopc/fire_behavior_nuopc.F90 +++ b/nuopc/fire_behavior_nuopc.F90 @@ -37,6 +37,9 @@ module fire_behavior_nuopc real(ESMF_KIND_R8), pointer :: ptr_hflx_fire(:,:) real(ESMF_KIND_R8), pointer :: ptr_evap_fire(:,:) real(ESMF_KIND_R8), pointer :: ptr_smoke_fire(:,:) + real(ESMF_KIND_R8), pointer :: ptr_u10(:,:) + real(ESMF_KIND_R8), pointer :: ptr_v10(:,:) + integer :: clb(2), cub(2), clb3(3), cub3(3) logical :: imp_rainrte = .FALSE. logical :: imp_rainacc = .FALSE. @@ -215,6 +218,23 @@ subroutine Advertise(model, rc) file=__FILE__)) & return ! bail out + ! importable field: inst_zonal_wind_height10m + call NUOPC_Advertise(importState, & + StandardName="inst_zonal_wind_height10m", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! importable field: inst_merid_wind_height10m + call NUOPC_Advertise(importState, & + StandardName="inst_merid_wind_height10m", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + #endif !#define WITHEXPORTFIELDS_disable @@ -574,6 +594,44 @@ subroutine Realize(model, rc) file=__FILE__)) & return ! bail out + ! importable field on Grid: inst_zonal_wind_height10m + field = ESMF_FieldCreate(name="inst_zonal_wind_height10m", grid=fire_grid, & + typekind=ESMF_TYPEKIND_R8, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_Realize(importState, field=field, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + ! Get Field memory + call ESMF_FieldGet(field, localDe=0, farrayPtr=ptr_u10, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! importable field on Grid: inst_merid_wind_height10m + field = ESMF_FieldCreate(name="inst_merid_wind_height10m", grid=fire_grid, & + typekind=ESMF_TYPEKIND_R8, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_Realize(importState, field=field, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + ! Get Field memory + call ESMF_FieldGet(field, localDe=0, farrayPtr=ptr_v10, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + #endif ! #ifdef WITHEXPORTFIELDS From 1e3abe9a51b3cb2a0306a5cc2bdaca4a0bb0ee69 Mon Sep 17 00:00:00 2001 From: masih Date: Fri, 20 Jun 2025 14:35:53 -0600 Subject: [PATCH 53/57] adding wind adjustment factor for 10 m wind * modified nuopc to add 10 m wind interpolation * modified fuels to add wind adjustment factors * added namelist option wind_vinterp_opt * update wrf nuopc to add 10 m wind * update tests and field dic. to include 10 m wind --- io/namelist_mod.F90 | 4 +++ nuopc/fire_behavior_nuopc.F90 | 49 ++++++++++++++++++++++------------- nuopc/wrf_nuopc.F90 | 49 ++++++++++++++++++++++++++++++++--- physics/fuel_anderson_mod.F90 | 3 +++ share/fuel_mod.F90 | 35 +++++++++++++++++++++++-- tests/fd_fire.yaml | 10 +++++++ tests/testx/testx.yaml | 2 ++ 7 files changed, 128 insertions(+), 24 deletions(-) diff --git a/io/namelist_mod.F90 b/io/namelist_mod.F90 index 53d91c4..3527749 100644 --- a/io/namelist_mod.F90 +++ b/io/namelist_mod.F90 @@ -42,6 +42,7 @@ module namelist_mod ! for fire_upwinding_reinit=4,5 and fire_upwinding=8,9 options" real :: fire_wind_height = 6.096 ! "height of uah,vah wind in fire spread formula" "m" + integer :: wind_vinterp_opt = 0 ! "wind (adjustment factor) interpolation option" logical :: fire_lsm_zcoupling = .false. ! "flag to activate reference velocity at a different height from fire_wind_height" real :: fire_lsm_zcoupling_ref = 50.0 ! "reference height from wich u at fire_wind_hegiht is calculated using a logarithmic profile" "m" @@ -213,6 +214,7 @@ subroutine Init_fire_block (this, file_name) integer :: fmoist_freq = 0 ! "frequency to run moisture model 0: use fmoist_dt, k>0: every k timesteps" "1" real :: fmoist_dt = 600 ! "moisture model time step" "s" real :: fire_wind_height = 6.096 ! "height of uah,vah wind in fire spread formula" "m" + integer :: wind_vinterp_opt = 0 ! "wind (adjustment factor) interpolation option" logical :: fire_is_real_perim = .false. ! .false. = point/line ignition, .true. = observed perimeter" real :: frac_fburnt_to_smoke = 0.02 ! "parts per unit of burned fuel becoming smoke " "g_smoke/kg_air" real :: fuelmc_g = 0.08 ! Fuel moisture content ground (Dead FMC) @@ -265,6 +267,7 @@ subroutine Init_fire_block (this, file_name) ideal_opt, & ! objects fuel_opt, ros_opt, fmc_opt, emis_opt, & + wind_vinterp_opt, & ! Ignitions fire_num_ignitions, & ! Ignition 1 @@ -327,6 +330,7 @@ subroutine Init_fire_block (this, file_name) this%ros_opt = ros_opt this%fmc_opt = fmc_opt this%emis_opt = emis_opt + this%wind_vinterp_opt = wind_vinterp_opt this%fire_num_ignitions = fire_num_ignitions diff --git a/nuopc/fire_behavior_nuopc.F90 b/nuopc/fire_behavior_nuopc.F90 index bb943ea..2c5365f 100644 --- a/nuopc/fire_behavior_nuopc.F90 +++ b/nuopc/fire_behavior_nuopc.F90 @@ -13,6 +13,7 @@ module fire_behavior_nuopc use initialize_mod, only : Init_fire_state use advance_mod, only : Advance_state use constants_mod, only : G, XLV, CP, FVIRT, R_D + use stderrout_mod, only : Stop_simulation implicit none @@ -821,24 +822,36 @@ subroutine Advance(model, rc) #endif - do j = 1, grid%jfde - do i = 1, grid%ifde - call grid%Interpolate_profile (config_flags, & ! for debug output, <= 0 no output - config_flags%fire_wind_height, & ! interpolation height - grid%kfds, grid%kfde, & ! fire grid dimensions - atm_u3d(i,j,:),atm_v3d(i,j,:), & ! atm grid arrays in - atm_ph(i,j,:), & - grid%uf(i,j),grid%vf(i,j),grid%fz0(i,j)) - - ! avoid arithmatic error - wspd = (grid%uf(i,j) ** 2. + grid%vf(i,j) ** 2.) ** .5 - if (wspd < 0.001) then - grid%uf(i,j) = sign(0.001, grid%uf(i,j)) - grid%vf(i,j) = sign(0.001, grid%vf(i,j)) - endif - - enddo - enddo + select case (config_flags%wind_vinterp_opt) + case (0) + do j = 1, grid%jfde + do i = 1, grid%ifde + call grid%Interpolate_profile (config_flags, & ! for debug output, <= 0 no output + config_flags%fire_wind_height, & ! interpolation height + grid%kfds, grid%kfde, & ! fire grid dimensions + atm_u3d(i,j,:),atm_v3d(i,j,:), & ! atm grid arrays in + atm_ph(i,j,:), & + grid%uf(i,j),grid%vf(i,j),grid%fz0(i,j)) + + ! avoid arithmatic error + wspd = (grid%uf(i,j) ** 2. + grid%vf(i,j) ** 2.) ** .5 + if (wspd < 0.001) then + grid%uf(i,j) = sign(0.001, grid%uf(i,j)) + grid%vf(i,j) = sign(0.001, grid%vf(i,j)) + endif + + enddo + enddo + case (1) + do j = 1, grid%jfde + do i = 1, grid%ifde + grid%uf(i,j) = grid%fuels%waf(int(grid%nfuel_cat(i,j))) * ptr_u10(i,j) + grid%vf(i,j) = grid%fuels%waf(int(grid%nfuel_cat(i,j))) * ptr_v10(i,j) + end do + end do + case default + call Stop_simulation ('Error: wrong wind_vinterp_opt') + end select if (grid%datetime_now == grid%datetime_start) call grid%Save_state () diff --git a/nuopc/wrf_nuopc.F90 b/nuopc/wrf_nuopc.F90 index 3eab1f1..651315d 100644 --- a/nuopc/wrf_nuopc.F90 +++ b/nuopc/wrf_nuopc.F90 @@ -161,6 +161,22 @@ subroutine Advertise(model, rc) ! return ! bail out ! 2D + ! exportable field: inst_zonal_wind_levels + call NUOPC_Advertise(exportState, & + StandardName="inst_zonal_wind_height10m", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! exportable field: inst_merid_wind_levels + call NUOPC_Advertise(exportState, & + StandardName="inst_merid_wind_height10m", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + ! exportable field: inst_surface_roughness call NUOPC_Advertise(exportState, & StandardName="inst_surface_roughness", rc=rc) @@ -293,7 +309,7 @@ subroutine Realize(model, rc) rc=rc) if(ESMF_STDERRORCHECK(rc)) return - grid = ESMF_GridCreate(name='ATM', & + grid = ESMF_GridCreate(name='ATM', & distgrid=distgrid, coordSys = ESMF_COORDSYS_SPH_DEG, & rc = rc) if(ESMF_STDERRORCHECK(rc)) return @@ -617,6 +633,31 @@ subroutine Realize(model, rc) file=__FILE__)) & return ! bail out + ! exportable field on Grid: inst_zonal_wind_height10m + field = ESMF_FieldCreate(name="inst_zonal_wind_height10m", grid=grid, & + typekind=ESMF_TYPEKIND_R8, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_Realize(exportState, field=field, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! exportable field on Grid: inst_merid_wind_height10m + field = ESMF_FieldCreate(name="inst_merid_wind_height10m", grid=grid, & + typekind=ESMF_TYPEKIND_R8, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_Realize(exportState, field=field, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out datetime_now = datetime_t (config_flags%start_year, config_flags%start_month, & config_flags%start_day, config_flags%start_hour, config_flags%start_minute, & @@ -759,7 +800,7 @@ subroutine Advance(model, rc) end subroutine subroutine Update_atm_state (datetime) - + type (datetime_t), intent (in) :: datetime @@ -773,7 +814,7 @@ subroutine Update_atm_state (datetime) call state%Get_phl(datetime) ! call state%Get_pres(datetime) - ! convert m to cm + ! convert m to cm ptr_z0(clb(1):cub(1),clb(2):cub(2))= & state%z0(1:size(state%lats, dim=1),1:size(state%lats, dim=2)) * 100.0 ptr_q2(clb(1):cub(1),clb(2):cub(2))= & @@ -793,7 +834,7 @@ subroutine Update_atm_state (datetime) state%phl(1:size(state%lats, dim=1),1:size(state%lats, dim=2), 1:state%kde - 1) ! ptr_pres(clb3(1):cub3(1),clb3(2):cub3(2),clb3(3):cub3(3))= & ! state%pres(1:size(state%lats, dim=1),1:size(state%lats, dim=2), 1:state%kde - 1) - + end subroutine end module wrf_nuopc diff --git a/physics/fuel_anderson_mod.F90 b/physics/fuel_anderson_mod.F90 index 605cc4a..e9ec224 100644 --- a/physics/fuel_anderson_mod.F90 +++ b/physics/fuel_anderson_mod.F90 @@ -117,6 +117,9 @@ subroutine Init_anderson_fuel_model (this, fuelmc_c) end if end do + ! Initialize wind adjustment factor + call this%Calc_wind_adjustment_factor() + end subroutine Init_anderson_fuel_model end module fuel_anderson_mod diff --git a/share/fuel_mod.F90 b/share/fuel_mod.F90 index 86519dd..529da46 100644 --- a/share/fuel_mod.F90 +++ b/share/fuel_mod.F90 @@ -3,7 +3,7 @@ module fuel_mod implicit none private - + public :: fuel_t, FUEL_ANDERSON, Crosswalk_from_scottburgan_to_anderson integer, parameter :: FUEL_ANDERSON = 1, UNKNOWN_FUEL_CAT = 0 @@ -36,12 +36,15 @@ module fuel_mod real, dimension(:), allocatable :: fuelmce ! fuel loading 1-h, 10-h, 100-h, 1000-h, and live [ton/acre] real, dimension(:), allocatable :: fgi_1h, fgi_10h, fgi_100h, fgi_1000h, fgi_live + ! wind adjustment factor + real, dimension(:), allocatable :: waf contains procedure (Initialization), deferred :: Initialization + procedure, public :: Calc_wind_adjustment_factor => Calc_wind_adjustment_factor end type fuel_t abstract interface - subroutine Initialization (this, fuelmc_c) + subroutine Initialization (this, fuelmc_c) import :: fuel_t class (fuel_t), intent (in out) :: this real, intent(in) :: fuelmc_c @@ -124,4 +127,32 @@ pure function Crosswalk_from_scottburgan_to_anderson (fuel_cat) result (return_v end function Crosswalk_from_scottburgan_to_anderson + subroutine Calc_wind_adjustment_factor (this) + + implicit none + + class (fuel_t), intent (in out) :: this + + ! local + integer :: i + real :: wh, flamelength, h + real :: HF ! extent of the flame above the vegetation + + + allocate (this%waf(this%n_fuel_cat)) + wh = 10.0 ! input wind height in meter + + do i = 1,this%n_fuel_cat + h = this%fueldepthm(i) + flamelength = 2.0 * h ! assume flamelength is double the fuel bed height + if (flamelength > h) then + hf = max(flamelength - h, 0.13 * h) + this%waf(i) = (1.0 + 0.36 * h / hf) / log(((wh-h) + 0.36 * h) / (0.13 * h)) * (log( (hf/h + 0.36)/0.13) - 1.0) + else + this%waf(i) = 0.15 + endif + end do + + end subroutine Calc_wind_adjustment_factor + end module fuel_mod diff --git a/tests/fd_fire.yaml b/tests/fd_fire.yaml index 3480859..148c451 100644 --- a/tests/fd_fire.yaml +++ b/tests/fd_fire.yaml @@ -73,3 +73,13 @@ alias: inst_temp_height_lowest_from_phys canonical_units: K description: atmosphere export - bottom layer temperature + # + - standard_name: Sa_u10m + alias: inst_zonal_wind_height10m + canonical_units: m s-1 + description: atmosphere export - zonal wind height 10m + # + - standard_name: Sa_v10m + alias: inst_merid_wind_height10m + canonical_units: m s-1 + description: atmosphere export - meridional wind height 10m diff --git a/tests/testx/testx.yaml b/tests/testx/testx.yaml index 6f0e829..7752071 100644 --- a/tests/testx/testx.yaml +++ b/tests/testx/testx.yaml @@ -60,3 +60,5 @@ ATMD: inst_pres_height_lowest_from_phys: {dim: 2, val: 85000} inst_spec_humid_height_lowest_from_phys: {dim: 2, val: 0.005} inst_temp_height_lowest_from_phys: {dim: 2, val: 310} + inst_zonal_wind_height10m: {dim: 2, val: 1} + inst_merid_wind_height10m: {dim: 2, val: 3} From 47fed24682bf84f13c61a386dbfb2dfdf37722be Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 25 Jul 2025 12:42:10 -0600 Subject: [PATCH 54/57] Modify naming of var to activate OpenMP in cmake to be consistent with UFS --- CMakeLists.txt | 4 ++-- cmake/modules/FireBuildSettings.cmake | 4 ++-- compile.sh | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 92cebf2..e6d19ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,7 +49,7 @@ if(DM_PARALLEL) add_compile_definitions(firelib PUBLIC DM_PARALLEL=1) endif() -if(ENABLE_OPENMP) +if(OPENMP) find_package(OpenMP REQUIRED) message(STATUS "OpenMP enabled") endif() @@ -108,7 +108,7 @@ endif() if (DM_PARALLEL) target_link_libraries(firelib PUBLIC $) endif() -if(ENABLE_OPENMP) +if(OPENMP) target_link_libraries(firelib PUBLIC $) endif() set_target_properties( diff --git a/cmake/modules/FireBuildSettings.cmake b/cmake/modules/FireBuildSettings.cmake index 1a6abf7..1c05de1 100644 --- a/cmake/modules/FireBuildSettings.cmake +++ b/cmake/modules/FireBuildSettings.cmake @@ -14,12 +14,12 @@ function(set_fire_cache) set (DM_PARALLEL ${DM_PARALLEL} CACHE BOOL "Turn on MPI build" FORCE) set (NUOPC ${NUOPC} CACHE BOOL "Build NUOPC cap" FORCE) set (ESMX ${ESMX} CACHE BOOL "Build ESMX application" FORCE) - set (ENABLE_OPENMP ${ENABLE_OPENMP} CACHE BOOL "Enable OpenMP parallelization" FORCE) + set (OPENMP ${OPENMP} CACHE BOOL "Enable OpenMP parallelization" FORCE) endfunction() function(print_fire_settings) message (STATUS "FIRE BEHAVIOR BUILD SETTINGS\n" - "\tOPENMP: ${ENABLE_OPENMP}\n" + "\tOPENMP: ${OPENMP}\n" "\tDM_PARALLEL: ${DM_PARALLEL}\n" "\tNUOPC: ${NUOPC}\n" "\tESMX: ${ESMX}") diff --git a/compile.sh b/compile.sh index 9be9cc5..4e7fac3 100755 --- a/compile.sh +++ b/compile.sh @@ -218,9 +218,9 @@ else CMAKE_SETTINGS+=("-DESMX=OFF") fi if [ "${OPENMP}" = true ]; then - CMAKE_SETTINGS+=("-DENABLE_OPENMP=ON") + CMAKE_SETTINGS+=("-DOPENMP=ON") else - CMAKE_SETTINGS+=("-DENABLE_OPENMP=OFF") + CMAKE_SETTINGS+=("-DOPENMP=OFF") fi cmake -S${FIRE_DIR} -B${BUILD_DIR} ${CMAKE_SETTINGS[@]} if [ "$?" != "0" ]; then From 256618c0d9f0f9937682cde93c7e6c1c134a0945 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 19 Sep 2025 12:31:06 -0600 Subject: [PATCH 55/57] Reduce prints --- driver/advance_mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/advance_mod.F90 b/driver/advance_mod.F90 index 7b5c39e..352e142 100644 --- a/driver/advance_mod.F90 +++ b/driver/advance_mod.F90 @@ -20,7 +20,7 @@ subroutine Advance_state (grid, config_flags) type (state_fire_t), intent (in out) :: grid type (namelist_t), intent (in) :: config_flags - logical, parameter :: DEBUG_LOCAL = .true. + logical, parameter :: DEBUG_LOCAL = .false. if (DEBUG_LOCAL) call Print_message (' Entering Advance_state... ') From 789047a227e06b8b925a66ba4835ef40ef9765b5 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 19 Sep 2025 12:33:19 -0600 Subject: [PATCH 56/57] Reduce prints in wrf module --- io/wrf_mod.F90 | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/io/wrf_mod.F90 b/io/wrf_mod.F90 index cfc867b..757db4e 100644 --- a/io/wrf_mod.F90 +++ b/io/wrf_mod.F90 @@ -94,7 +94,7 @@ subroutine Calc_smoke_aod (dz8w, p_phy, t_phy, qv, rho, smoke_tracer, aod5502d_s real, parameter :: MASS_EXT_COEF = 4.5, RH_CRIT = 0.3, RH_MAX = 0.95, CONVERT_PERCENT_TO_UNITLESS = 0.01 real :: rh, augm_ext_coef integer :: i, k, j - logical, parameter :: DEBUG_LOCAL = .true. + logical, parameter :: DEBUG_LOCAL = .false. Loop_j_aod : do j = jts, min (jte, jde - 1) @@ -911,6 +911,7 @@ subroutine Check_dims (its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y) integer, intent (in) :: its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y integer :: isz1, jsz1, isz2, jsz2, ir, jr + logical, parameter :: DEBUG_LOCAL = .false. isz1 = ite - its + 1 @@ -920,10 +921,10 @@ subroutine Check_dims (its, ite, jts, jte, ifts, ifte, jfts, jfte, sr_x, sr_y) ir = isz2 / isz1 jr = jsz2 / jsz1 - write (OUTPUT_UNIT, *) 'its, ite, jts, jte =', its, ite, jts, jte - write (OUTPUT_UNIT, *) 'ifts, ifte, jfts, jfte =', ifts, ifte, jfts, jfte - write (OUTPUT_UNIT, *) 'isz1, jsz1, isz2, jsz2 =', isz1, jsz1, isz2, jsz2 - write (OUTPUT_UNIT, *) 'ir, jz =', ir, jr + if (DEBUG_LOCAL) write (OUTPUT_UNIT, *) 'its, ite, jts, jte =', its, ite, jts, jte + if (DEBUG_LOCAL) write (OUTPUT_UNIT, *) 'ifts, ifte, jfts, jfte =', ifts, ifte, jfts, jfte + if (DEBUG_LOCAL) write (OUTPUT_UNIT, *) 'isz1, jsz1, isz2, jsz2 =', isz1, jsz1, isz2, jsz2 + if (DEBUG_LOCAL) write (OUTPUT_UNIT, *) 'ir, jz =', ir, jr if (ir /= sr_x .or. jr /= sr_y) call Stop_simulation ('Tile dims do not preserve fire/atm ratio') @@ -991,9 +992,9 @@ subroutine Fire_tendency( & real, dimension( its:ite,kts:kte,jts:jte ) :: hfx,qfx - write (OUTPUT_UNIT, *) 'pajm: its, ite, jts, jte, kts, kte = ', its, ite, jts, jte, kts, kte - write (OUTPUT_UNIT, *) 'pajm: ids, ide, jds, jde, kds, kde = ', ids, ide, jds, jde, kds, kde - write (OUTPUT_UNIT, *) 'pajm: alfg,alfc,z1can = ', alfg,alfc,z1can +! write (OUTPUT_UNIT, *) 'pajm: its, ite, jts, jte, kts, kte = ', its, ite, jts, jte, kts, kte +! write (OUTPUT_UNIT, *) 'pajm: ids, ide, jds, jde, kds, kde = ', ids, ide, jds, jde, kds, kde +! write (OUTPUT_UNIT, *) 'pajm: alfg,alfc,z1can = ', alfg,alfc,z1can do j=jts,jte do k=kts,min(kte+1,kde) From c7261f27434028b727249d8956be98c6df4ed4a1 Mon Sep 17 00:00:00 2001 From: "Pedro A. Jimenez" Date: Fri, 19 Sep 2025 12:34:27 -0600 Subject: [PATCH 57/57] Tile strategy in agreement with WRF when coupled to WRF --- io/namelist_mod.F90 | 5 +++- state/state_mod.F90 | 60 +++++++++++++++++++++++++++++++++++++++++++-- state/tiles_mod.F90 | 26 +++++++++++++++++--- 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/io/namelist_mod.F90 b/io/namelist_mod.F90 index 3527749..04a32f0 100644 --- a/io/namelist_mod.F90 +++ b/io/namelist_mod.F90 @@ -23,6 +23,7 @@ module namelist_mod real :: dt = 2.0 integer :: num_tiles = 1 + integer :: tile_strategy = 0 integer :: fire_print_msg = 0 ! "write fire statistics, 0 no writes, 1+ for more" "" real :: fire_atm_feedback = 1.0 ! "the heat fluxes to the atmosphere are multiplied by this" "1" @@ -458,7 +459,7 @@ subroutine Init_time_block (this, file_name) integer :: start_year, start_month, start_day, start_hour, start_minute, start_second, & end_year, end_month, end_day, end_hour, end_minute, end_second, interval_output, & - num_tiles + num_tiles, tile_strategy real :: dt character (len = :), allocatable :: msg @@ -484,6 +485,7 @@ subroutine Init_time_block (this, file_name) dt = 2.0 interval_output = 0 num_tiles = 1 + tile_strategy = 0 open (newunit = unit_nml, file = trim (file_name), action = 'read', iostat = io_stat) if (io_stat /= 0) then @@ -511,6 +513,7 @@ subroutine Init_time_block (this, file_name) this%interval_output = interval_output this%num_tiles = num_tiles + this%tile_strategy = tile_strategy end subroutine Init_time_block diff --git a/state/state_mod.F90 b/state/state_mod.F90 index a8fa021..ce9fb9a 100644 --- a/state/state_mod.F90 +++ b/state/state_mod.F90 @@ -101,9 +101,11 @@ module state_mod procedure, public :: Init_ignition_lines => Init_ignition_lines procedure :: Init_latlons => Init_latlons procedure :: Init_tiles => Init_tiles + procedure :: Init_tiles_in_wrf => Init_tiles_in_wrf procedure :: Interpolate_vars_atm_to_fire => Interpolate_vars_atm_to_fire procedure, public :: Interpolate_profile => Interpolate_profile procedure, public :: Print => Print_domain ! private + procedure, public :: Print_tiles => Print_tiles procedure, public :: Save_state => Save_state procedure, public :: Set_vars_to_default => Set_vars_to_default procedure, public :: Set_time_stamps => Set_time_stamps @@ -313,6 +315,8 @@ subroutine Init_domain (this, config_flags, geogrid, & this%kfts = config_flags%kds this%kfte = config_flags%kde + call this%Init_tiles (config_flags) + case (INIT_MODE_WRF) this%ifds = ifds this%ifde = ifde @@ -337,13 +341,15 @@ subroutine Init_domain (this, config_flags, geogrid, & this%kfts = kfts this%kfte = kfte + call this%Init_tiles_in_wrf (config_flags, sr_x, sr_y) + case default call Stop_simulation ('Not ready to complete fire state initialization 1') end select Set_dims - call this%Init_tiles (config_flags) + call this%Print_tiles () this%nx = this%ifde this%ny = this%jfde @@ -569,7 +575,7 @@ subroutine Init_tiles (this, config_flags) this%num_tiles = config_flags%num_tiles - call Calc_tiles_dims (this%ifps, this%ifpe, this%jfps, this%jfpe, this%num_tiles, & + call Calc_tiles_dims (this%ifps, this%ifpe, this%jfps, this%jfpe, this%num_tiles, config_flags%tile_strategy, & this%i_start, this%i_end, this%j_start, this%j_end) if (this%num_tiles /= config_flags%num_tiles) then @@ -578,6 +584,38 @@ subroutine Init_tiles (this, config_flags) end subroutine Init_tiles + subroutine Init_tiles_in_wrf (this, config_flags, sr_x, sr_y) + + implicit none + + class (state_fire_t), intent(in out) :: this + type (namelist_t), intent (in) :: config_flags + integer, intent (in) :: sr_x, sr_y + + integer :: ips, ipe, jps, jpe, ij + + + this%num_tiles = config_flags%num_tiles + ips = (this%ifps - 1) / sr_x + 1 + ipe = this%ifpe / sr_x + jps = (this%jfps - 1) / sr_y + 1 + jpe = this%jfpe / sr_y + call Calc_tiles_dims (ips, ipe, jps, jpe, this%num_tiles, config_flags%tile_strategy, & + this%i_start, this%i_end, this%j_start, this%j_end) + + if (this%num_tiles /= config_flags%num_tiles) then + call Stop_simulation ('Not able to use the number of tiles specified') + end if + + do ij = 1, this%num_tiles + this%i_start(ij) = this%i_start(ij) * sr_x - sr_x + 1 + this%i_end(ij) = this%i_end(ij) * sr_x + this%j_start(ij) = this%j_start(ij) * sr_y - sr_y + 1 + this%j_end(ij) = this%j_end(ij) * sr_y + end do + + end subroutine Init_tiles_in_wrf + subroutine Interpolate_vars_atm_to_fire (this, wrf, config_flags) implicit none @@ -751,6 +789,24 @@ subroutine Print_domain (this) end subroutine Print_domain + subroutine Print_tiles (this) + + implicit none + + class (state_fire_t), intent(in) :: this + + integer :: ij + character (len = 300) :: msg + + + do ij = 1, this%num_tiles + write (msg, '(a10, 1x, i3, a4, i7, a4, i7, a4, i7, a4, i7)') & + 'CFBM TILE', ij, ' IS', this%i_start(ij), ' IE', this%i_end(ij), ' JS', this%j_start(ij), ' JE', this%j_end(ij) + call Print_message (trim (msg)) + end do + + end subroutine Print_tiles + subroutine Save_state (this) implicit none diff --git a/state/tiles_mod.F90 b/state/tiles_mod.F90 index ada8f29..24cf4a9 100644 --- a/state/tiles_mod.F90 +++ b/state/tiles_mod.F90 @@ -1,20 +1,24 @@ module tiles_mod + use stderrout_mod, only : Stop_simulation + implicit none private + integer, parameter :: TILE_NONE = 0, TILE_X = 1, TILE_Y = 2, TILE_XY = 3 + public :: Calc_tiles_dims contains - subroutine Calc_tiles_dims (spx, epx, spy, epy, num_tiles, i_start, i_end, j_start, j_end) + subroutine Calc_tiles_dims (spx, epx, spy, epy, num_tiles, tile_strategy, i_start, i_end, j_start, j_end) ! This code is borrowed from module_tiles.F in WRF, specifically SUBROUTINE set_tiles2 implicit none - integer, intent (in) :: spx, epx, spy, epy + integer, intent (in) :: spx, epx, spy, epy, tile_strategy integer, intent (in out) :: num_tiles integer, parameter :: MIN_TILES_IN_X = 1, MIN_TILES_IN_Y = 1 @@ -37,7 +41,23 @@ subroutine Calc_tiles_dims (spx, epx, spy, epy, num_tiles, i_start, i_end, j_sta allocate (j_end(num_tiles)) ! Calc number of tiles in x and y based on total number of tiles - call least_aspect (num_tiles, MIN_TILES_IN_Y, MIN_TILES_IN_X, num_tiles_y, num_tiles_x) + select case (tile_strategy) + case (TILE_NONE, TILE_Y) + if (num_tiles > (epy - spy + 1)) call Stop_simulation ('Number of tiles is too high for TILE_Y strategy') + num_tiles_x = 1 + num_tiles_y = num_tiles + + case (TILE_X) + num_tiles_x = num_tiles + num_tiles_y = 1 + + case (TILE_XY) + call least_aspect (num_tiles, MIN_TILES_IN_Y, MIN_TILES_IN_X, num_tiles_y, num_tiles_x) + + case default + call Stop_simulation ('The tile strategy selected is not valid.') + + end select ! Calc start and end tile indices nt = 1