Skip to content

Commit

Permalink
Add support for urban tiles
Browse files Browse the repository at this point in the history
  • Loading branch information
marcadella committed Feb 7, 2025
1 parent 2d03d33 commit 1bb2add
Show file tree
Hide file tree
Showing 4 changed files with 244 additions and 177 deletions.
35 changes: 22 additions & 13 deletions R/run_biomee_f_bysite.R
Original file line number Diff line number Diff line change
Expand Up @@ -379,17 +379,14 @@ build_params_siml <- function(params_siml, forcing_years, makecheck){
}

# Types of mortality formulations
if (params_siml$method_mortality == "cstarvation"){
params_siml$code_method_mortality <- 1
} else if (params_siml$method_mortality == "growthrate"){
params_siml$code_method_mortality <- 2
} else if (params_siml$method_mortality == "dbh"){
params_siml$code_method_mortality <- 3
} else if (params_siml$method_mortality == "const_selfthin"){
params_siml$code_method_mortality <- 4
} else if (params_siml$method_mortality == "bal"){
params_siml$code_method_mortality <- 5
} else {
params_siml$code_method_mortality <- switch(params_siml$method_mortality,
"cstarvation" = 1,
"growthrate" = 2,
"dbh" = 3,
"const_selfthin" = 4,
"bal" = 5
)
if (is.null(params_siml$code_method_mortality)) {
stop(
paste("run_biomee_f_bysite: params_siml$method_mortality not recognised:",
params_siml$method_mortality))
Expand Down Expand Up @@ -431,15 +428,27 @@ prepare_params_siml <- function(params_siml){
build_init_lu <- function(init_lu){
# If init_lu is null, we create a dummy LU initial state containing only one state (with a fraction of 1)
if (is.null(init_lu))
init_lu <- data.frame(name=c('primary'), fraction=c(1.0))
init_lu <- data.frame(name=c('primary'), fraction=c(1.0), type=c('unmanaged'))

return(init_lu)
}

prepare_init_lu <- function(init_lu){
if(!'type' %in% names(init_lu)) {
init_lu <- init_lu %>% add_column('type' = 'unmanaged')
}
init_lu <- init_lu %>% mutate(
'type' = case_match(
type,
"urban" ~ 1,
.default = 0
)
)
init_lu <- init_lu %>% select(
'fraction'
'fraction',
'type'
)

return(init_lu)
}

Expand Down
73 changes: 45 additions & 28 deletions src/biomee.mod.f90
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ subroutine biomee_f( &

! Local variables
type(vegn_tile_type), dimension(n_lu) :: vegn_tiles ! One tile per LU
real :: lu_state(n_lu) ! Current LU fractions
type(lu_state) :: lu_states(n_lu) ! Current LU fractions
real(kind=c_double) :: nan

integer :: yr, idx, idx_daily_start, idx_daily_end, lu_idx
Expand All @@ -101,7 +101,13 @@ subroutine biomee_f( &
output_annual_cohorts = nan

! LULUC initializations
lu_state = real(init_lu(:, 1))
do lu_idx = 1, n_lu
lu_states(lu_idx) = lu_state( &
real(init_lu(lu_idx, 1)), &
int(init_lu(lu_idx, 2)) &
)

end do
output_annual_luluc_tile = 0

! Allocate climate array
Expand All @@ -115,7 +121,7 @@ subroutine biomee_f( &

! Initialize tiles
do lu_idx = 1, n_lu
if (lu_state(lu_idx) > 0.0) call vegn_tiles(lu_idx)%initialize_vegn_tile()
if (lu_states(lu_idx)%non_empty()) call vegn_tiles(lu_idx)%initialize_vegn_tile()
end do

!----------------------------------------------------------------
Expand Down Expand Up @@ -144,31 +150,42 @@ subroutine biomee_f( &
idx_daily_start = (state%year - inputs%params_siml%steering%spinupyears - 1) * ndayyear + 1
idx_daily_end = idx_daily_start + ndayyear - 1

! For each LU (land unit) whose fraction is > 0
! For each non-empty LU (land unit)
do lu_idx = 1, n_lu
if (lu_state(lu_idx) > 0.0) then

!----------------------------------------------------------------
! Call biosphere (wrapper for all modules, contains time loops)
!----------------------------------------------------------------
if (state%spinup) then
! If spinup, we do not pass the daily and cohort output arrays
call biosphere_annual( &
state, &
climate, &
vegn_tiles(lu_idx), &
output_annual_tile(state%year, :, lu_idx) &
)
if (lu_states(lu_idx)%non_empty()) then

! If it is not of type urban
if (lu_states(lu_idx)%type /= LU_TYPE_URBAN) then

!----------------------------------------------------------------
! Call biosphere (wrapper for all modules, contains time loops)
!----------------------------------------------------------------
if (state%spinup) then
! If spinup, we do not pass the daily and cohort output arrays
call biosphere_annual( &
state, &
climate, &
vegn_tiles(lu_idx), &
output_annual_tile(state%year, :, lu_idx) &
)
else
idx = state%year - inputs%params_siml%steering%spinupyears
call biosphere_annual( &
state, &
climate, &
vegn_tiles(lu_idx), &
output_annual_tile(state%year, :, lu_idx), &
output_daily_tile(idx_daily_start:idx_daily_end, :, lu_idx), &
output_annual_cohorts(:, idx,:, lu_idx) &
)
end if

else
idx = state%year - inputs%params_siml%steering%spinupyears
call biosphere_annual( &
state, &
climate, &
vegn_tiles(lu_idx), &
output_annual_tile(state%year, :, lu_idx), &
output_daily_tile(idx_daily_start:idx_daily_end, :, lu_idx), &
output_annual_cohorts(:, idx,:, lu_idx) &
)
! If it is a urban LU, we fill the annual diagnostics manually
! Even if it does not have cohorts, we do not want to run processes which act at the tile level (example psoil_sl respiration)
vegn_tiles(lu_idx)%age = vegn_tiles(lu_idx)%age + 1
call vegn_tiles(lu_idx)%annual_diagnostics(state%year, &
output_annual_tile(state%year, :, lu_idx))
end if

end if
Expand All @@ -180,10 +197,10 @@ subroutine biomee_f( &
!----------------------------------------------------------------
if ((.not.state%spinup) .and. (state%forcingyear_idx <= n_lu_tr_years)) then

call update_lu_state(lu_state, real(luc_forcing(:,:,state%forcingyear_idx)), vegn_tiles)
call update_lu_fractions(lu_states(:)%fraction, real(luc_forcing(:,:,state%forcingyear_idx)), vegn_tiles)

end if
call populate_outarray_annual_land_use(state%year, lu_state, output_annual_luluc_tile(state%year,:,:))
call populate_outarray_annual_land_use(state%year, lu_states(:)%fraction, output_annual_luluc_tile(state%year,:,:))

end do yearloop

Expand Down
Loading

0 comments on commit 1bb2add

Please sign in to comment.