From c9bbd52901cecfe46b7673d2691b525be1ed7aee Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Fri, 14 Oct 2022 11:54:48 +0200 Subject: [PATCH 01/11] First version of DOC production in BGC mode --- src/biogeochem/CNCStateUpdate1Mod.F90 | 2 +- .../SoilBiogeochemCarbonFluxType.F90 | 140 +++++++++++++++++- .../SoilBiogeochemDecompCascadeBGCMod.F90 | 100 ++++++++++++- .../SoilBiogeochemDecompMod.F90 | 20 ++- .../SoilBiogeochemPotentialMod.F90 | 7 +- 5 files changed, 250 insertions(+), 19 deletions(-) diff --git a/src/biogeochem/CNCStateUpdate1Mod.F90 b/src/biogeochem/CNCStateUpdate1Mod.F90 index 843754f3cd..1ee4b45c13 100644 --- a/src/biogeochem/CNCStateUpdate1Mod.F90 +++ b/src/biogeochem/CNCStateUpdate1Mod.F90 @@ -244,7 +244,7 @@ subroutine CStateUpdate1( num_soilc, filter_soilc, num_soilp, filter_soilp, & if (.not. use_soil_matrixcn) then cf_soil%decomp_cpools_sourcesink_col(c,j,cascade_donor_pool(k)) = & cf_soil%decomp_cpools_sourcesink_col(c,j,cascade_donor_pool(k)) & - - ( cf_soil%decomp_cascade_hr_vr_col(c,j,k) + cf_soil%decomp_cascade_ctransfer_vr_col(c,j,k)) *dt + - ( cf_soil%decomp_cascade_hr_vr_col(c,j,k) + cf_soil%decomp_cascade_doc_vr_col(c,j,k) + cf_soil%decomp_cascade_ctransfer_vr_col(c,j,k)) *dt end if !not use_soil_matrixcn end do end do diff --git a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 index 114019a3d7..5507913d6b 100644 --- a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 +++ b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 @@ -33,14 +33,18 @@ module SoilBiogeochemCarbonFluxType real(r8), pointer :: c_overflow_vr (:,:,:) ! vertically-resolved C rejected by microbes that cannot process it (gC/m3/s) real(r8), pointer :: decomp_cascade_hr_vr_col (:,:,:) ! vertically-resolved het. resp. from decomposing C pools (gC/m3/s) real(r8), pointer :: decomp_cascade_hr_col (:,:) ! vertically-integrated (diagnostic) het. resp. from decomposing C pools (gC/m2/s) + real(r8), pointer :: decomp_cascade_doc_vr_col (:,:,:) ! vertically-resolved DOC production from decomposing C pools (gC/m3/s) + real(r8), pointer :: decomp_cascade_doc_col (:,:) ! vertically-integrated DOC from decomposing C pools (gC/m2/s) real(r8), pointer :: decomp_cascade_ctransfer_vr_col (:,:,:) ! vertically-resolved C transferred along deomposition cascade (gC/m3/s) real(r8), pointer :: decomp_cascade_ctransfer_col (:,:) ! vertically-integrated (diagnostic) C transferred along decomposition cascade (gC/m2/s) real(r8), pointer :: cn_col (:,:) ! (gC/gN) C:N ratio by pool real(r8), pointer :: litr_lig_c_to_n_col (:) ! (gC/gN) Average of leaf, fine root, and CWD lignin C:N ratio real(r8), pointer :: rf_decomp_cascade_col (:,:,:) ! (frac) respired fraction in decomposition step + real(r8), pointer :: df_decomp_cascade_col (:,:,:) ! (frac) doc fraction in decomposition step real(r8), pointer :: pathfrac_decomp_cascade_col (:,:,:) ! (frac) what fraction of C passes from donor to receiver pool through a given transition real(r8), pointer :: decomp_k_col (:,:,:) ! rate coefficient for decomposition (1./sec) real(r8), pointer :: hr_vr_col (:,:) ! (gC/m3/s) total vertically-resolved het. resp. from decomposing C pools + real(r8), pointer :: doc_vr_col (:,:) ! (gC/m3/s) total vertically-resolved DOC from decomposing C pools real(r8), pointer :: o_scalar_col (:,:) ! fraction by which decomposition is limited by anoxia real(r8), pointer :: w_scalar_col (:,:) ! fraction by which decomposition is limited by moisture availability real(r8), pointer :: t_scalar_col (:,:) ! fraction by which decomposition is limited by temperature @@ -53,6 +57,9 @@ module SoilBiogeochemCarbonFluxType real(r8), pointer :: fphr_col (:,:) ! fraction of potential heterotrophic respiration real(r8), pointer :: hr_col (:) ! (gC/m2/s) total heterotrophic respiration + real(r8), pointer :: doc_col (:) ! (gC/m2/s) total DOC prduction + real(r8), pointer :: Ldoc_col (:) ! (gC/m2/s) Labile DOC: definition based on donor pool + real(r8), pointer :: Rdoc_col (:) ! (gC/m2/s) Recalcitrant DOC: definition based on donor pool real(r8), pointer :: michr_col (:) ! (gC/m2/s) microbial heterotrophic respiration: donor-pool based definition, so expect it to be zero with MIMICS; microbial decomposition is responsible for heterotrophic respiration of donor pools (litter and soil), but in the accounting we assign it to the donor pool for consistency with CENTURY real(r8), pointer :: cwdhr_col (:) ! (gC/m2/s) coarse woody debris heterotrophic respiration: donor-pool based definition real(r8), pointer :: lithr_col (:) ! (gC/m2/s) litter heterotrophic respiration: donor-pool based definition @@ -119,6 +126,7 @@ subroutine InitAllocate(this, bounds) allocate(this%som_c_leached_col (begc:endc)) ; this%som_c_leached_col (:) =nan allocate(this%somc_fire_col (begc:endc)) ; this%somc_fire_col (:) =nan allocate(this%hr_vr_col (begc:endc,1:nlevdecomp_full)); this%hr_vr_col (:,:) =nan + allocate(this%doc_vr_col (begc:endc,1:nlevdecomp_full)); this%doc_vr_col (:,:) =nan allocate(this%decomp_cpools_sourcesink_col(begc:endc,1:nlevdecomp_full,1:ndecomp_pools)) this%decomp_cpools_sourcesink_col(:,:,:)= nan @@ -132,6 +140,12 @@ subroutine InitAllocate(this, bounds) allocate(this%decomp_cascade_hr_col(begc:endc,1:ndecomp_cascade_transitions)) this%decomp_cascade_hr_col(:,:)= nan + allocate(this%decomp_cascade_doc_vr_col(begc:endc,1:nlevdecomp_full,1:ndecomp_cascade_transitions)) + this%decomp_cascade_doc_vr_col(:,:,:)= spval + + allocate(this%decomp_cascade_doc_col(begc:endc,1:ndecomp_cascade_transitions)) + this%decomp_cascade_doc_col(:,:)= nan + allocate(this%decomp_cascade_ctransfer_vr_col(begc:endc,1:nlevdecomp_full,1:ndecomp_cascade_transitions)) this%decomp_cascade_ctransfer_vr_col(:,:,:)= nan @@ -144,6 +158,9 @@ subroutine InitAllocate(this, bounds) allocate(this%rf_decomp_cascade_col(begc:endc,1:nlevdecomp_full,1:ndecomp_cascade_transitions)) this%rf_decomp_cascade_col(:,:,:) = nan + allocate(this%df_decomp_cascade_col(begc:endc,1:nlevdecomp_full,1:ndecomp_cascade_transitions)) + this%df_decomp_cascade_col(:,:,:) = nan + allocate(this%pathfrac_decomp_cascade_col(begc:endc,1:nlevdecomp_full,1:ndecomp_cascade_transitions)) this%pathfrac_decomp_cascade_col(:,:,:) = nan @@ -157,6 +174,9 @@ subroutine InitAllocate(this, bounds) this%decomp_cpools_transport_tendency_col(:,:,:)= nan allocate(this%hr_col (begc:endc)) ; this%hr_col (:) = nan + allocate(this%doc_col (begc:endc)) ; this%doc_col (:) = nan + allocate(this%Ldoc_col (begc:endc)) ; this%Ldoc_col (:) = nan + allocate(this%Rdoc_col (begc:endc)) ; this%Rdoc_col (:) = nan allocate(this%michr_col (begc:endc)) ; this%michr_col (:) = nan allocate(this%cwdhr_col (begc:endc)) ; this%cwdhr_col (:) = nan allocate(this%lithr_col (begc:endc)) ; this%lithr_col (:) = nan @@ -237,6 +257,21 @@ subroutine InitHistory(this, bounds, carbon_type) avgflag='A', long_name='total heterotrophic respiration', & ptr_col=this%hr_col) + this%doc_col(begc:endc) = spval + call hist_addfld1d (fname='DOC', units='gC/m^2/s', & + avgflag='A', long_name='total DOC production', & + ptr_col=this%doc_col) + + this%Ldoc_col(begc:endc) = spval + call hist_addfld1d (fname='LAB_DOC', units='gC/m^2/s', & + avgflag='A', long_name='Labile DOC production', & + ptr_col=this%Ldoc_col) + + this%Rdoc_col(begc:endc) = spval + call hist_addfld1d (fname='REC_DOC', units='gC/m^2/s', & + avgflag='A', long_name='Recalcitrant DOC production', & + ptr_col=this%Rdoc_col) + if (decomp_method == mimics_decomp) then this%michr_col(begc:endc) = spval call hist_addfld1d (fname='MICC_HR', units='gC/m^2/s', & @@ -283,10 +318,13 @@ subroutine InitHistory(this, bounds, carbon_type) this%decomp_cascade_hr_col(begc:endc,:) = spval this%decomp_cascade_hr_vr_col(begc:endc,:,:) = spval + this%decomp_cascade_doc_col(begc:endc,:) = spval + this%decomp_cascade_doc_vr_col(begc:endc,:,:) = spval this%decomp_cascade_ctransfer_col(begc:endc,:) = spval this%decomp_cascade_ctransfer_vr_col(begc:endc,:,:) = spval this%pathfrac_decomp_cascade_col(begc:endc,:,:) = spval this%rf_decomp_cascade_col(begc:endc,:,:) = spval + this%df_decomp_cascade_col(begc:endc,:,:) = spval do l = 1, ndecomp_cascade_transitions ! output the vertically integrated fluxes only as default @@ -311,6 +349,27 @@ subroutine InitHistory(this, bounds, carbon_type) avgflag='A', long_name=longname, & ptr_col=data1dptr, default='inactive') + !-- DOC fluxes + data1dptr => this%decomp_cascade_doc_col(:,l) + ! check to see if there are multiple pathways that include doc production, and if so, note that in the history file + ii = 0 + do jj = 1, ndecomp_cascade_transitions + if ( decomp_cascade_con%cascade_donor_pool(jj) == decomp_cascade_con%cascade_donor_pool(l) ) ii = ii+1 + end do + if ( ii == 1 ) then + fieldname = & + trim(decomp_cascade_con%decomp_pool_name_history(decomp_cascade_con%cascade_donor_pool(l)))//'_DOC' + else + fieldname = & + trim(decomp_cascade_con%decomp_pool_name_history(decomp_cascade_con%cascade_donor_pool(l)))//'_DOC_'//& + trim(decomp_cascade_con%decomp_pool_name_short(decomp_cascade_con%cascade_receiver_pool(l))) + endif + longname = 'DOC production from '//& + trim(decomp_cascade_con%decomp_pool_name_long(decomp_cascade_con%cascade_donor_pool(l))) + call hist_addfld1d (fname=fieldname, units='gC/m^2/s', & + avgflag='A', long_name=longname, & + ptr_col=data1dptr, default='active') + !-- transfer fluxes (none from terminal pool, if present) if ( decomp_cascade_con%cascade_receiver_pool(l) /= 0 ) then data1dptr => this%decomp_cascade_ctransfer_col(:,l) @@ -347,7 +406,30 @@ subroutine InitHistory(this, bounds, carbon_type) trim(decomp_cascade_con%decomp_pool_name_long(decomp_cascade_con%cascade_donor_pool(l))) call hist_addfld_decomp (fname=fieldname, units='gC/m^3/s', type2d='levdcmp', & avgflag='A', long_name=longname, & - ptr_col=data2dptr, default='inactive') + ptr_col=data2dptr, default='active') + + !-- DOC fluxes + data2dptr => this%decomp_cascade_doc_vr_col(:,:,l) + ! check to see if there are multiple pathways that include DOC production, and if so, note that in the history file + ii = 0 + do jj = 1, ndecomp_cascade_transitions + if ( decomp_cascade_con%cascade_donor_pool(jj) == decomp_cascade_con%cascade_donor_pool(l) ) ii = ii+1 + end do + if ( ii == 1 ) then + fieldname = & + trim(decomp_cascade_con%decomp_pool_name_history(decomp_cascade_con%cascade_donor_pool(l)))& + //'_DOC'//trim(vr_suffix) + else + fieldname = & + trim(decomp_cascade_con%decomp_pool_name_history(decomp_cascade_con%cascade_donor_pool(l)))//'_DOC_'//& + trim(decomp_cascade_con%decomp_pool_name_short(decomp_cascade_con%cascade_receiver_pool(l)))& + //trim(vr_suffix) + endif + longname = 'DOC production from '//& + trim(decomp_cascade_con%decomp_pool_name_long(decomp_cascade_con%cascade_donor_pool(l))) + call hist_addfld_decomp (fname=fieldname, units='gC/m^3/s', type2d='levdcmp', & + avgflag='A', long_name=longname, & + ptr_col=data2dptr, default='active') !-- transfer fluxes (none from terminal pool, if present) if ( decomp_cascade_con%cascade_receiver_pool(l) /= 0 ) then @@ -443,6 +525,11 @@ subroutine InitHistory(this, bounds, carbon_type) call hist_addfld2d (fname='HR_vr', units='gC/m^3/s', type2d='levsoi', & avgflag='A', long_name='total vertically resolved heterotrophic respiration', & ptr_col=data2dptr) + + data2dptr => this%doc_vr_col(begc:endc,1:nlevsoi) + call hist_addfld2d (fname='DOC_vr', units='gC/m^3/s', type2d='levsoi', & + avgflag='A', long_name='total vertically resolved DOC production', & + ptr_col=data2dptr) endif end if @@ -757,12 +844,15 @@ subroutine SetValues ( this, num_column, filter_column, value_column) do fi = 1,num_column i = filter_column(fi) this%decomp_cascade_hr_col(i,l) = value_column + this%decomp_cascade_doc_col(i,l) = value_column this%c_overflow_vr(i,j,l) = value_column this%decomp_cascade_hr_vr_col(i,j,l) = value_column + this%decomp_cascade_doc_vr_col(i,j,l) = value_column this%decomp_cascade_ctransfer_col(i,l) = value_column this%decomp_cascade_ctransfer_vr_col(i,j,l) = value_column this%pathfrac_decomp_cascade_col(i,j,l) = value_column this%rf_decomp_cascade_col(i,j,l) = value_column + this%df_decomp_cascade_col(i,j,l) = value_column end do end do end do @@ -791,12 +881,16 @@ subroutine SetValues ( this, num_column, filter_column, value_column) do fi = 1,num_column i = filter_column(fi) this%hr_vr_col(i,j) = value_column + this%doc_vr_col(i,j) = value_column end do end do do fi = 1,num_column i = filter_column(fi) this%hr_col(i) = value_column + this%doc_col(i) = value_column + this%Ldoc_col(i) = value_column + this%Rdoc_col(i) = value_column this%somc_fire_col(i) = value_column this%som_c_leached_col(i) = value_column this%somhr_col(i) = value_column @@ -855,7 +949,7 @@ subroutine Summary(this, bounds, & this%som_c_leached_col(c) = 0._r8 end do - ! vertically integrate HR and decomposition cascade fluxes + ! vertically integrate HR, DOC and decomposition cascade fluxes do k = 1, ndecomp_cascade_transitions do j = 1,nlevdecomp do fc = 1,num_soilc @@ -864,6 +958,10 @@ subroutine Summary(this, bounds, & this%decomp_cascade_hr_col(c,k) + & this%decomp_cascade_hr_vr_col(c,j,k) * dzsoi_decomp(j) + this%decomp_cascade_doc_col(c,k) = & + this%decomp_cascade_doc_col(c,k) + & + this%decomp_cascade_doc_vr_col(c,j,k) * dzsoi_decomp(j) + this%decomp_cascade_ctransfer_col(c,k) = & this%decomp_cascade_ctransfer_col(c,k) + & this%decomp_cascade_ctransfer_vr_col(c,j,k) * dzsoi_decomp(j) @@ -871,11 +969,12 @@ subroutine Summary(this, bounds, & end do end do - ! total heterotrophic respiration, vertically resolved (HR) + ! total heterotrophic respiration, vertically resolved (HR) & DOC prod. do j = 1,nlevdecomp do fc = 1,num_soilc c = filter_soilc(fc) this%hr_vr_col(c,j) = 0._r8 + this%doc_vr_col(c,j) = 0._r8 end do end do do k = 1, ndecomp_cascade_transitions @@ -885,6 +984,9 @@ subroutine Summary(this, bounds, & this%hr_vr_col(c,j) = & this%hr_vr_col(c,j) + & this%decomp_cascade_hr_vr_col(c,j,k) + this%doc_vr_col(c,j) = & + this%doc_vr_col(c,j) + & + this%decomp_cascade_doc_vr_col(c,j,k) end do end do end do @@ -908,7 +1010,7 @@ subroutine Summary(this, bounds, & end do end do - ! soil organic matter heterotrophic respiration + ! soil organic matter heterotrophic respiration (SOMHR) associate(is_soil => decomp_cascade_con%is_soil) ! TRUE => pool is a soil pool do k = 1, ndecomp_cascade_transitions if ( is_soil(decomp_cascade_con%cascade_donor_pool(k)) ) then @@ -956,7 +1058,32 @@ subroutine Summary(this, bounds, & end do end associate - ! total heterotrophic respiration (HR) + ! Labile dissolved organic carbon (Ldoc) + associate(is_litter => decomp_cascade_con%is_litter ,& + is_cwd => decomp_cascade_con%is_cwd) + do k = 1, ndecomp_cascade_transitions + if ( is_litter(decomp_cascade_con%cascade_donor_pool(k)) ) then + do fc = 1,num_soilc + c = filter_soilc(fc) + this%Ldoc_col(c) = this%Ldoc_col(c) + this%decomp_cascade_doc_col(c,k) + end do + end if + end do + end associate + + ! Recalcitrant dissolved organic carbon (Rdoc) + associate(is_soil => decomp_cascade_con%is_soil) ! TRUE => pool is a soil pool + do k = 1, ndecomp_cascade_transitions + if ( is_soil(decomp_cascade_con%cascade_donor_pool(k)) ) then + do fc = 1,num_soilc + c = filter_soilc(fc) + this%Rdoc_col(c) = this%Rdoc_col(c) + this%decomp_cascade_doc_col(c,k) + end do + end if + end do + end associate + + ! total heterotrophic respiration (HR) & total DOC do fc = 1,num_soilc c = filter_soilc(fc) @@ -965,6 +1092,9 @@ subroutine Summary(this, bounds, & this%cwdhr_col(c) + & this%lithr_col(c) + & this%somhr_col(c) + this%doc_col(c) = & + this%Ldoc_col(c) + & + this%Rdoc_col(c) + & end do diff --git a/src/soilbiogeochem/SoilBiogeochemDecompCascadeBGCMod.F90 b/src/soilbiogeochem/SoilBiogeochemDecompCascadeBGCMod.F90 index b65fc5f17f..bd95ab1461 100644 --- a/src/soilbiogeochem/SoilBiogeochemDecompCascadeBGCMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemDecompCascadeBGCMod.F90 @@ -63,6 +63,17 @@ module SoilBiogeochemDecompCascadeBGCMod real(r8), private :: f_s2s1 real(r8), private :: f_s2s3 + real(r8) :: df_l1s1 + real(r8) :: df_l2s1 + real(r8) :: df_l3s2 + real(r8) :: df_s1s2 + real(r8) :: df_s1s3 + real(r8) :: df_s2s1 + real(r8) :: df_s2s3 + real(r8) :: df_s3s1 + real(r8) :: df_cwdl2 + real(r8) :: df_cwdl3 + integer, private :: i_l1s1 integer, private :: i_l2s1 integer, private :: i_l3s2 @@ -88,6 +99,17 @@ module SoilBiogeochemDecompCascadeBGCMod real(r8):: rf_cwdl3_bgc + real(r8) :: df_l1s1_bgc + real(r8) :: df_l2s1_bgc + real(r8) :: df_l3s2_bgc + real(r8) :: df_s1s2_bgc + real(r8) :: df_s1s3_bgc + real(r8) :: df_s2s1_bgc + real(r8) :: df_s2s3_bgc + real(r8) :: df_s3s1_bgc + real(r8) :: df_cwdl2_bgc + real(r8) :: df_cwdl3_bgc + real(r8):: tau_l1_bgc ! 1/turnover time of litter 1 from Century (l/18.5) (1/yr) real(r8):: tau_l2_l3_bgc ! 1/turnover time of litter 2 and litter 3 from Century (1/4.9) (1/yr) real(r8):: tau_s1_bgc ! 1/turnover time of SOM 1 from Century (1/7.3) (1/yr) @@ -220,6 +242,56 @@ subroutine readParams ( ncid ) if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) params_inst%bgc_initial_Cstocks_depth=tempr + tString='bgc_df_l1s1' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_l1s1_bgc=tempr + + tString='bgc_df_l2s1' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_l2s1_bgc=tempr + + tString='bgc_df_l3s2' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_l3s2_bgc=tempr + + tString='bgc_df_s1s2' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_s1s2_bgc=tempr + + tString='bgc_df_s1s3' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_s1s3_bgc=tempr + + tString='bgc_df_s2s1' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_s2s1_bgc=tempr + + tString='bgc_df_s2s3' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_s2s3_bgc=tempr + + tString='bgc_df_s3s1' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_s3s1_bgc=tempr + + tString='bgc_df_cwdl2' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_cwdl2_bgc=tempr + + tString='bgc_df_cwdl3' + call ncd_io(trim(tString),tempr, 'read', ncid, readvar=readv) + if ( .not. readv ) call endrun(msg=trim(errCode)//trim(tString)//errMsg(sourcefile, __LINE__)) + params_inst%df_cwdl3_bgc=tempr + end subroutine readParams !----------------------------------------------------------------------- @@ -287,6 +359,18 @@ subroutine init_decompcascade_bgc(bounds, soilbiogeochem_state_inst, soilstate_i rf_cwdl3 = params_inst%rf_cwdl3_bgc + ! set doc fractions for fluxes between compartments + df_l1s1 = params_inst%df_l1s1_bgc + df_l2s1 = params_inst%df_l2s1_bgc + df_l3s2 = params_inst%df_l3s2_bgc + df_s1s2 = params_inst%df_s1s2_bgc + df_s1s3 = params_inst%df_s1s3_bgc + df_s2s1 = params_inst%df_s2s1_bgc + df_s2s3 = params_inst%df_s2s3_bgc + df_s3s1 = params_inst%df_s3s1_bgc + df_cwdl2 = params_inst%df_cwdl2_bgc + df_cwdl3 = params_inst%df_cwdl3_bgc + ! set the cellulose and lignin fractions for coarse woody debris cwd_fcel = params_inst%cwd_fcel_bgc @@ -579,8 +663,9 @@ subroutine decomp_rate_constants_bgc(bounds, num_soilc, filter_soilc, & o2stress_sat => ch4_inst%o2stress_sat_col , & ! Input: [real(r8) (:,:) ] Ratio of oxygen available to that demanded by roots, aerobes, & methanotrophs (nlevsoi) o2stress_unsat => ch4_inst%o2stress_unsat_col , & ! Input: [real(r8) (:,:) ] Ratio of oxygen available to that demanded by roots, aerobes, & methanotrophs (nlevsoi) finundated => ch4_inst%finundated_col , & ! Input: [real(r8) (:) ] fractional inundated area - rf_decomp_cascade => soilbiogeochem_carbonflux_inst%rf_decomp_cascade_col , & ! Output: [real(r8) (:,:,:) ] respired fraction in decomposition step (frac) - pathfrac_decomp_cascade => soilbiogeochem_carbonflux_inst%pathfrac_decomp_cascade_col , & ! Output: [real(r8) (:,:,:) ] what fraction of C passes from donor to receiver pool through a given transition (frac) + rf_decomp_cascade => soilbiogeochem_carbonflux_inst%rf_decomp_cascade_col , & ! Output: [real(r8) (:,:,:) ] respired fraction in decomposition step (frac) + df_decomp_cascade => soilbiogeochem_carbonflux_inst%df_decomp_cascade_col , & ! Output: [real(r8) (:,:,:) ] doc fraction in decomposition step (frac) + pathfrac_decomp_cascade => soilbiogeochem_carbonflux_inst%pathfrac_decomp_cascade_col , & ! Output: [real(r8) (:,:,:) ] what fraction of C passes from donor to receiver pool through a given transition (frac) t_scalar => soilbiogeochem_carbonflux_inst%t_scalar_col , & ! Output: [real(r8) (:,:) ] soil temperature scalar for decomp w_scalar => soilbiogeochem_carbonflux_inst%w_scalar_col , & ! Output: [real(r8) (:,:) ] soil water scalar for decomp o_scalar => soilbiogeochem_carbonflux_inst%o_scalar_col , & ! Output: [real(r8) (:,:) ] fraction by which decomposition is limited by anoxia @@ -917,6 +1002,8 @@ subroutine decomp_rate_constants_bgc(bounds, num_soilc, filter_soilc, & pathfrac_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_cwdl3) = cwd_flig rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_cwdl2) = rf_cwdl2 rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_cwdl3) = rf_cwdl3 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_cwdl2) = df_cwdl2 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_cwdl3) = df_cwdl3 end if rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_l1s1) = rf_l1s1 rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_l2s1) = rf_l2s1 @@ -927,6 +1014,15 @@ subroutine decomp_rate_constants_bgc(bounds, num_soilc, filter_soilc, & rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s2s3) = rf_s2s3 rf_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s3s1) = rf_s3s1 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_l1s1) = df_l1s1 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_l2s1) = df_l2s1 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_l3s2) = df_l3s2 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s1s2) = df_s1s2 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s1s3) = df_s1s3 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s2s1) = df_s2s1 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s2s3) = df_s2s3 + df_decomp_cascade(bounds%begc:bounds%endc,1:nlevdecomp,i_s3s1) = df_s3s1 + end associate end subroutine decomp_rate_constants_bgc diff --git a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 index a46f999143..18dafd360d 100644 --- a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 @@ -113,6 +113,7 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, fpi_vr => soilbiogeochem_state_inst%fpi_vr_col , & ! Input: [real(r8) (:,:) ] fraction of potential immobilization (no units) rf_decomp_cascade => soilbiogeochem_carbonflux_inst%rf_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] respired fraction in decomposition step (frac) + rf_decomp_cascade => soilbiogeochem_carbonflux_inst%df_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] doc fraction in decomposition step (frac) decomp_npools_vr => soilbiogeochem_nitrogenstate_inst%decomp_npools_vr_col , & ! Input: [real(r8) (:,:,:) ] (gC/m3) vertically-resolved decomposing (litter, cwd, soil) N pools decomp_cpools_vr => soilbiogeochem_carbonstate_inst%decomp_cpools_vr_col , & ! Input: [real(r8) (:,:,:) ] (gC/m3) vertically-resolved decomposing (litter, cwd, soil) c pools @@ -129,6 +130,7 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, w_scalar => soilbiogeochem_carbonflux_inst%w_scalar_col , & ! Input: [real(r8) (:,:) ] fraction by which decomposition is limited by moisture availability c_overflow_vr => soilbiogeochem_carbonflux_inst%c_overflow_vr , & ! Input: [real(r8) (:,:,:) ] vertically-resolved C rejected by microbes that cannot process it (gC/m3/s) decomp_cascade_hr_vr => soilbiogeochem_carbonflux_inst%decomp_cascade_hr_vr_col , & ! Output: [real(r8) (:,:,:) ] vertically-resolved het. resp. from decomposing C pools (gC/m3/s) + decomp_cascade_doc_vr => soilbiogeochem_carbonflux_inst%decomp_cascade_doc_vr_col , & ! Output: [real(r8) (:,:,:) ] vertically-resolved DOC prod. from decomposing C pools (gC/m3/s) decomp_cascade_ctransfer_vr => soilbiogeochem_carbonflux_inst%decomp_cascade_ctransfer_vr_col , & ! Output: [real(r8) (:,:,:) ] vertically-resolved het. resp. from decomposing C pools (gC/m3/s) phr_vr => soilbiogeochem_carbonflux_inst%phr_vr_col , & ! Input: [real(r8) (:,:) ] potential HR (gC/m3/s) fphr => soilbiogeochem_carbonflux_inst%fphr_col & ! Output: [real(r8) (:,:) ] fraction of potential SOM + LITTER heterotrophic @@ -187,13 +189,14 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, sminn_to_denit_decomp_cascade_vr(c,j,k) = -params_inst%dnp * pmnf_decomp_cascade(c,j,k) end if end if - decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) - decomp_cascade_ctransfer_vr(c,j,k) = (1._r8 - rf_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * (1._r8 -df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_doc_vr(c,j,k) = df_decomp_cascade(c,j,k) * (1._r8 - rf_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_ctransfer_vr(c,j,k) = (1._r8 - rf_decomp_cascade(c,j,k) - df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) if (decomp_method == mimics_decomp) then decomp_cascade_hr_vr(c,j,k) = min( & - p_decomp_cpool_loss(c,j,k), & + p_decomp_cpool_loss(c,j,k) - decomp_cascade_doc_vr(c,j,k), & decomp_cascade_hr_vr(c,j,k) + c_overflow_vr(c,j,k)) - decomp_cascade_ctransfer_vr(c,j,k) = max(0.0_r8, p_decomp_cpool_loss(c,j,k) - decomp_cascade_hr_vr(c,j,k)) + decomp_cascade_ctransfer_vr(c,j,k) = max(0.0_r8, p_decomp_cpool_loss(c,j,k) - decomp_cascade_hr_vr(c,j,k) - decomp_cascade_doc_vr(c,j,k)) end if if (decomp_npools_vr(c,j,cascade_donor_pool(k)) > 0._r8 .and. cascade_receiver_pool(k) /= i_atm) then decomp_cascade_ntransfer_vr(c,j,k) = p_decomp_cpool_loss(c,j,k) / cn_decomp_pools(c,j,cascade_donor_pool(k)) @@ -227,13 +230,14 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, do fc = 1,num_soilc c = filter_soilc(fc) ! - decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) - decomp_cascade_ctransfer_vr(c,j,k) = (1._r8 - rf_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * (1._r8 - df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_doc_vr(c,j,k) = df_decomp_cascade(c,j,k) * (1._r8 - rf_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_ctransfer_vr(c,j,k) = (1._r8 - rf_decomp_cascade(c,j,k)- df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) if (decomp_method == mimics_decomp) then decomp_cascade_hr_vr(c,j,k) = min( & - p_decomp_cpool_loss(c,j,k), & + p_decomp_cpool_loss(c,j,k) - decomp_cascade_doc_vr(c,j,k), & decomp_cascade_hr_vr(c,j,k) + c_overflow_vr(c,j,k)) - decomp_cascade_ctransfer_vr(c,j,k) = max(0.0_r8, p_decomp_cpool_loss(c,j,k) - decomp_cascade_hr_vr(c,j,k)) + decomp_cascade_ctransfer_vr(c,j,k) = max(0.0_r8, p_decomp_cpool_loss(c,j,k) - decomp_cascade_hr_vr(c,j,k) - decomp_cascade_doc_vr(c,j,k)) end if ! end do diff --git a/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 b/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 index da46e178b7..07e0db060b 100644 --- a/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 @@ -124,6 +124,7 @@ subroutine SoilBiogeochemPotential (bounds, num_soilc, filter_soilc, & nue_decomp_cascade => soilbiogeochem_state_inst%nue_decomp_cascade_col , & ! Input: [real(r8) (:) ] N use efficiency for a given transition (gN going into microbe / gN decomposed) rf_decomp_cascade => soilbiogeochem_carbonflux_inst%rf_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] respired fraction in decomposition step (frac) + df_decomp_cascade => soilbiogeochem_carbonflux_inst%df_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] doc prod. fraction in decomposition step (frac) pathfrac_decomp_cascade => soilbiogeochem_carbonflux_inst%pathfrac_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] what fraction of C passes from donor to receiver pool through a given transition (frac) decomp_npools_vr => soilbiogeochem_nitrogenstate_inst%decomp_npools_vr_col , & ! Input: [real(r8) (:,:,:) ] (gC/m3) vertically-resolved decomposing (litter, cwd, soil) N pools @@ -190,7 +191,7 @@ subroutine SoilBiogeochemPotential (bounds, num_soilc, filter_soilc, & ratio = cn_decomp_pools(c,j,cascade_receiver_pool(k))/cn_decomp_pools(c,j,cascade_donor_pool(k)) endif - pmnf_decomp_cascade(c,j,k) = (p_decomp_cpool_loss(c,j,k) * (1.0_r8 - rf_decomp_cascade(c,j,k) - ratio) & + pmnf_decomp_cascade(c,j,k) = (p_decomp_cpool_loss(c,j,k) * (1.0_r8 - rf_decomp_cascade(c,j,k) - df_decomp_cascade(c,j,k) - ratio) & / cn_decomp_pools(c,j,cascade_receiver_pool(k)) ) else ! 100% respiration @@ -212,7 +213,7 @@ subroutine SoilBiogeochemPotential (bounds, num_soilc, filter_soilc, & ! diff between p_decomp_npool_loss (pertains to ! donor) and p_decomp_npool_gain (receiver) p_decomp_cpool_gain(c,j,k) = & - p_decomp_cpool_loss(c,j,k) * (1.0_r8 - rf_decomp_cascade(c,j,k)) + p_decomp_cpool_loss(c,j,k) * (1.0_r8 - rf_decomp_cascade(c,j,k) - df_decomp_cascade(c,j,k)) p_decomp_npool_gain(c,j,k) = & p_decomp_npool_loss * nue_decomp_cascade(k) p_decomp_npool_to_din(c,j,k) = & @@ -346,7 +347,7 @@ subroutine SoilBiogeochemPotential (bounds, num_soilc, filter_soilc, & do j = 1,nlevdecomp do fc = 1,num_soilc c = filter_soilc(fc) - phr_vr(c,j) = phr_vr(c,j) + rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) + phr_vr(c,j) = phr_vr(c,j) + rf_decomp_cascade(c,j,k) * (1 - df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) end do end do end do From 3ed5bdb80ecdd22ce4ff0ec42e13c9e3ae8eb05d Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Fri, 14 Oct 2022 15:05:44 +0200 Subject: [PATCH 02/11] minor corrections --- src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 | 2 +- src/soilbiogeochem/SoilBiogeochemDecompMod.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 index 5507913d6b..f18f449d62 100644 --- a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 +++ b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 @@ -1094,7 +1094,7 @@ subroutine Summary(this, bounds, & this%somhr_col(c) this%doc_col(c) = & this%Ldoc_col(c) + & - this%Rdoc_col(c) + & + this%Rdoc_col(c) end do diff --git a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 index 18dafd360d..dd23930082 100644 --- a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 @@ -113,7 +113,7 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, fpi_vr => soilbiogeochem_state_inst%fpi_vr_col , & ! Input: [real(r8) (:,:) ] fraction of potential immobilization (no units) rf_decomp_cascade => soilbiogeochem_carbonflux_inst%rf_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] respired fraction in decomposition step (frac) - rf_decomp_cascade => soilbiogeochem_carbonflux_inst%df_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] doc fraction in decomposition step (frac) + df_decomp_cascade => soilbiogeochem_carbonflux_inst%df_decomp_cascade_col , & ! Input: [real(r8) (:,:,:) ] doc fraction in decomposition step (frac) decomp_npools_vr => soilbiogeochem_nitrogenstate_inst%decomp_npools_vr_col , & ! Input: [real(r8) (:,:,:) ] (gC/m3) vertically-resolved decomposing (litter, cwd, soil) N pools decomp_cpools_vr => soilbiogeochem_carbonstate_inst%decomp_cpools_vr_col , & ! Input: [real(r8) (:,:,:) ] (gC/m3) vertically-resolved decomposing (litter, cwd, soil) c pools From 3f40bc3d160b28c35d60e04e10cca12993df774d Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Mon, 17 Oct 2022 11:48:39 +0200 Subject: [PATCH 03/11] Corrections --- .../SoilBiogeochemCarbonFluxType.F90 | 35 ++++++++++--------- .../SoilBiogeochemDecompMod.F90 | 9 +++-- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 index f18f449d62..525aad04d7 100644 --- a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 +++ b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 @@ -58,8 +58,8 @@ module SoilBiogeochemCarbonFluxType real(r8), pointer :: hr_col (:) ! (gC/m2/s) total heterotrophic respiration real(r8), pointer :: doc_col (:) ! (gC/m2/s) total DOC prduction - real(r8), pointer :: Ldoc_col (:) ! (gC/m2/s) Labile DOC: definition based on donor pool - real(r8), pointer :: Rdoc_col (:) ! (gC/m2/s) Recalcitrant DOC: definition based on donor pool + real(r8), pointer :: ldoc_col (:) ! (gC/m2/s) Labile DOC: definition based on donor pool + real(r8), pointer :: rdoc_col (:) ! (gC/m2/s) Recalcitrant DOC: definition based on donor pool real(r8), pointer :: michr_col (:) ! (gC/m2/s) microbial heterotrophic respiration: donor-pool based definition, so expect it to be zero with MIMICS; microbial decomposition is responsible for heterotrophic respiration of donor pools (litter and soil), but in the accounting we assign it to the donor pool for consistency with CENTURY real(r8), pointer :: cwdhr_col (:) ! (gC/m2/s) coarse woody debris heterotrophic respiration: donor-pool based definition real(r8), pointer :: lithr_col (:) ! (gC/m2/s) litter heterotrophic respiration: donor-pool based definition @@ -175,8 +175,8 @@ subroutine InitAllocate(this, bounds) allocate(this%hr_col (begc:endc)) ; this%hr_col (:) = nan allocate(this%doc_col (begc:endc)) ; this%doc_col (:) = nan - allocate(this%Ldoc_col (begc:endc)) ; this%Ldoc_col (:) = nan - allocate(this%Rdoc_col (begc:endc)) ; this%Rdoc_col (:) = nan + allocate(this%ldoc_col (begc:endc)) ; this%ldoc_col (:) = nan + allocate(this%rdoc_col (begc:endc)) ; this%rdoc_col (:) = nan allocate(this%michr_col (begc:endc)) ; this%michr_col (:) = nan allocate(this%cwdhr_col (begc:endc)) ; this%cwdhr_col (:) = nan allocate(this%lithr_col (begc:endc)) ; this%lithr_col (:) = nan @@ -262,15 +262,15 @@ subroutine InitHistory(this, bounds, carbon_type) avgflag='A', long_name='total DOC production', & ptr_col=this%doc_col) - this%Ldoc_col(begc:endc) = spval + this%ldoc_col(begc:endc) = spval call hist_addfld1d (fname='LAB_DOC', units='gC/m^2/s', & avgflag='A', long_name='Labile DOC production', & - ptr_col=this%Ldoc_col) + ptr_col=this%ldoc_col) - this%Rdoc_col(begc:endc) = spval + this%rdoc_col(begc:endc) = spval call hist_addfld1d (fname='REC_DOC', units='gC/m^2/s', & avgflag='A', long_name='Recalcitrant DOC production', & - ptr_col=this%Rdoc_col) + ptr_col=this%rdoc_col) if (decomp_method == mimics_decomp) then this%michr_col(begc:endc) = spval @@ -889,8 +889,8 @@ subroutine SetValues ( this, num_column, filter_column, value_column) i = filter_column(fi) this%hr_col(i) = value_column this%doc_col(i) = value_column - this%Ldoc_col(i) = value_column - this%Rdoc_col(i) = value_column + this%ldoc_col(i) = value_column + this%rdoc_col(i) = value_column this%somc_fire_col(i) = value_column this%som_c_leached_col(i) = value_column this%somhr_col(i) = value_column @@ -1058,26 +1058,27 @@ subroutine Summary(this, bounds, & end do end associate - ! Labile dissolved organic carbon (Ldoc) + ! Labile dissolved organic carbon (ldoc) associate(is_litter => decomp_cascade_con%is_litter ,& is_cwd => decomp_cascade_con%is_cwd) do k = 1, ndecomp_cascade_transitions - if ( is_litter(decomp_cascade_con%cascade_donor_pool(k)) ) then + if ( is_litter(decomp_cascade_con%cascade_donor_pool(k)) .or. & + is_cwd(decomp_cascade_con%cascade_donor_pool(k))) then do fc = 1,num_soilc c = filter_soilc(fc) - this%Ldoc_col(c) = this%Ldoc_col(c) + this%decomp_cascade_doc_col(c,k) + this%ldoc_col(c) = this%ldoc_col(c) + this%decomp_cascade_doc_col(c,k) end do end if end do end associate - ! Recalcitrant dissolved organic carbon (Rdoc) + ! Recalcitrant dissolved organic carbon (rdoc) associate(is_soil => decomp_cascade_con%is_soil) ! TRUE => pool is a soil pool do k = 1, ndecomp_cascade_transitions if ( is_soil(decomp_cascade_con%cascade_donor_pool(k)) ) then do fc = 1,num_soilc c = filter_soilc(fc) - this%Rdoc_col(c) = this%Rdoc_col(c) + this%decomp_cascade_doc_col(c,k) + this%rdoc_col(c) = this%Rroc_col(c) + this%decomp_cascade_doc_col(c,k) end do end if end do @@ -1093,8 +1094,8 @@ subroutine Summary(this, bounds, & this%lithr_col(c) + & this%somhr_col(c) this%doc_col(c) = & - this%Ldoc_col(c) + & - this%Rdoc_col(c) + this%ldoc_col(c) + & + this%rdoc_col(c) end do diff --git a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 index dd23930082..39adccbba9 100644 --- a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 @@ -189,8 +189,13 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, sminn_to_denit_decomp_cascade_vr(c,j,k) = -params_inst%dnp * pmnf_decomp_cascade(c,j,k) end if end if - decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * (1._r8 -df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) - decomp_cascade_doc_vr(c,j,k) = df_decomp_cascade(c,j,k) * (1._r8 - rf_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + if (rf_decomp_cascade(c,j,k)+df_decomp_cascade(c,j,k) >= 1._r8) then + write(iulog,*) 'Decomposition fractions too large: c:',c,'j',j,'k', & + k,'rf_decomp_cascade',rf_decomp_cascade(c,j,k),"rf_decomp_cascade",df_decomp_cascade(c,j,k) + call endrun('ecomposition fractions too large') + end if + decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) + decomp_cascade_doc_vr(c,j,k) = df_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) decomp_cascade_ctransfer_vr(c,j,k) = (1._r8 - rf_decomp_cascade(c,j,k) - df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) if (decomp_method == mimics_decomp) then decomp_cascade_hr_vr(c,j,k) = min( & From 09500b9cb0cce88ab2873583976b44468407c146 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Mon, 17 Oct 2022 14:30:53 +0200 Subject: [PATCH 04/11] correction --- src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 index 525aad04d7..107f9bf77f 100644 --- a/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 +++ b/src/soilbiogeochem/SoilBiogeochemCarbonFluxType.F90 @@ -1078,7 +1078,7 @@ subroutine Summary(this, bounds, & if ( is_soil(decomp_cascade_con%cascade_donor_pool(k)) ) then do fc = 1,num_soilc c = filter_soilc(fc) - this%rdoc_col(c) = this%Rroc_col(c) + this%decomp_cascade_doc_col(c,k) + this%rdoc_col(c) = this%rdoc_col(c) + this%decomp_cascade_doc_col(c,k) end do end if end do From 77cdc13169ace483a90130170c17c40e8030b41b Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Mon, 17 Oct 2022 15:26:56 +0200 Subject: [PATCH 05/11] corrections --- src/soilbiogeochem/SoilBiogeochemDecompMod.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 index 39adccbba9..7ef4aecf6f 100644 --- a/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemDecompMod.F90 @@ -75,6 +75,7 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, ! ! !USES: use SoilBiogeochemDecompCascadeConType, only : i_atm + use abortutils , only: endrun ! ! !ARGUMENT: type(bounds_type) , intent(in) :: bounds @@ -192,7 +193,7 @@ subroutine SoilBiogeochemDecomp (bounds, num_soilc, filter_soilc, if (rf_decomp_cascade(c,j,k)+df_decomp_cascade(c,j,k) >= 1._r8) then write(iulog,*) 'Decomposition fractions too large: c:',c,'j',j,'k', & k,'rf_decomp_cascade',rf_decomp_cascade(c,j,k),"rf_decomp_cascade",df_decomp_cascade(c,j,k) - call endrun('ecomposition fractions too large') + call endrun(msg='Decomposition fractions too large'//errMsg(sourcefile, __LINE__)) end if decomp_cascade_hr_vr(c,j,k) = rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) decomp_cascade_doc_vr(c,j,k) = df_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) From 9da2715a026af2322cd0d841c7ac5bbbeac3edb3 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Mon, 17 Oct 2022 16:05:06 +0200 Subject: [PATCH 06/11] corrections --- src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 b/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 index 07e0db060b..94fbf98fa4 100644 --- a/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 +++ b/src/soilbiogeochem/SoilBiogeochemPotentialMod.F90 @@ -347,7 +347,7 @@ subroutine SoilBiogeochemPotential (bounds, num_soilc, filter_soilc, & do j = 1,nlevdecomp do fc = 1,num_soilc c = filter_soilc(fc) - phr_vr(c,j) = phr_vr(c,j) + rf_decomp_cascade(c,j,k) * (1 - df_decomp_cascade(c,j,k)) * p_decomp_cpool_loss(c,j,k) + phr_vr(c,j) = phr_vr(c,j) + rf_decomp_cascade(c,j,k) * p_decomp_cpool_loss(c,j,k) end do end do end do From 3db028c1d1ab11297fd4dc2f7f8beacdf95ade97 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Mon, 17 Oct 2022 17:02:29 +0200 Subject: [PATCH 07/11] correction --- src/biogeochem/CNCStateUpdate1Mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/biogeochem/CNCStateUpdate1Mod.F90 b/src/biogeochem/CNCStateUpdate1Mod.F90 index 1ee4b45c13..843754f3cd 100644 --- a/src/biogeochem/CNCStateUpdate1Mod.F90 +++ b/src/biogeochem/CNCStateUpdate1Mod.F90 @@ -244,7 +244,7 @@ subroutine CStateUpdate1( num_soilc, filter_soilc, num_soilp, filter_soilp, & if (.not. use_soil_matrixcn) then cf_soil%decomp_cpools_sourcesink_col(c,j,cascade_donor_pool(k)) = & cf_soil%decomp_cpools_sourcesink_col(c,j,cascade_donor_pool(k)) & - - ( cf_soil%decomp_cascade_hr_vr_col(c,j,k) + cf_soil%decomp_cascade_doc_vr_col(c,j,k) + cf_soil%decomp_cascade_ctransfer_vr_col(c,j,k)) *dt + - ( cf_soil%decomp_cascade_hr_vr_col(c,j,k) + cf_soil%decomp_cascade_ctransfer_vr_col(c,j,k)) *dt end if !not use_soil_matrixcn end do end do From d62b019b5a28fcb2f27980b91c8c2bdfd677e001 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Tue, 1 Nov 2022 10:28:27 +0100 Subject: [PATCH 08/11] Changes to send DOC_COL to mosart through nuopc, as a tracer into qsur --- src/biogeophys/Waterlnd2atmType.F90 | 5 +++++ src/cpl/nuopc/lnd_import_export.F90 | 7 +++++++ src/main/clm_driver.F90 | 2 +- src/main/lnd2atmMod.F90 | 8 +++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/biogeophys/Waterlnd2atmType.F90 b/src/biogeophys/Waterlnd2atmType.F90 index 54972e9b00..fe95c009d0 100644 --- a/src/biogeophys/Waterlnd2atmType.F90 +++ b/src/biogeophys/Waterlnd2atmType.F90 @@ -36,6 +36,7 @@ module Waterlnd2atmType real(r8), pointer :: qflx_rofice_grc (:) ! rof ice forcing, grc level real(r8), pointer :: qflx_liq_from_ice_col(:) ! liquid runoff from converted ice runoff real(r8), pointer :: qirrig_grc (:) ! irrigation flux + real(r8), pointer :: qflx_rofdom_grc (:) ! rof DOM contains @@ -136,6 +137,10 @@ subroutine InitAllocate(this, bounds, tracer_vars) container = tracer_vars, & bounds = bounds, subgrid_level = subgrid_level_gridcell, & ival=ival) + call AllocateVar1d(var = this%qflx_rofdom_grc, name = 'qflx_rofdom_grc', & + container = tracer_vars, & + bounds = bounds, subgrid_level = subgrid_level_gridcell, & + ival=ival) end subroutine InitAllocate diff --git a/src/cpl/nuopc/lnd_import_export.F90 b/src/cpl/nuopc/lnd_import_export.F90 index 0e7a5e2eef..8c783d6575 100644 --- a/src/cpl/nuopc/lnd_import_export.F90 +++ b/src/cpl/nuopc/lnd_import_export.F90 @@ -133,6 +133,7 @@ module lnd_import_export character(*), parameter :: Fall_voc = 'Fall_voc' character(*), parameter :: Fall_fire = 'Fall_fire' character(*), parameter :: Sl_fztop = 'Sl_fztop' + character(*), parameter :: Flrl_rofdom = 'Flrl_rofdom' character(*), parameter :: Flrl_rofsur = 'Flrl_rofsur' character(*), parameter :: Flrl_rofsub = 'Flrl_rofsub' character(*), parameter :: Flrl_rofgwl = 'Flrl_rofgwl' @@ -293,6 +294,7 @@ subroutine advertise_fields(gcomp, flds_scalar_name, glc_present, cism_evolve, r ! export to rof if (rof_prognostic) then + call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofdom) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofsur) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofgwl) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofsub) @@ -863,6 +865,11 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & ! waterlnd2atmbulk_inst%qflx_rofliq_h2osfc_grc(g) ! end do + if (fldchk(exportState, Flrl_rofdom)) then + call state_setexport_1d(exportState, Flrl_rofdom, waterlnd2atmbulk_inst%qflx_rofdom_grc(begg:), & + init_spval=.true., rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + end if if (fldchk(exportState, Flrl_rofsur)) then call state_setexport_1d(exportState, Flrl_rofsur, waterlnd2atmbulk_inst%qflx_rofliq_qsur_grc(begg:), & init_spval=.true., rc=rc) diff --git a/src/main/clm_driver.F90 b/src/main/clm_driver.F90 index ae178b226c..a6adc725a5 100644 --- a/src/main/clm_driver.F90 +++ b/src/main/clm_driver.F90 @@ -1305,7 +1305,7 @@ subroutine clm_drv(doalb, nextsw_cday, declinp1, declin, rstwr, nlend, rdate, ro water_inst, & energyflux_inst, solarabs_inst, drydepvel_inst, & vocemis_inst, fireemis_inst, dust_inst, ch4_inst, glc_behavior, & - lnd2atm_inst, & + lnd2atm_inst, soilbiogeochem_carbonflux_inst, & net_carbon_exchange_grc = net_carbon_exchange_grc(bounds_proc%begg:bounds_proc%endg)) deallocate(net_carbon_exchange_grc) call t_stopf('lnd2atm') diff --git a/src/main/lnd2atmMod.F90 b/src/main/lnd2atmMod.F90 index 27769a69de..4ccc3442b2 100644 --- a/src/main/lnd2atmMod.F90 +++ b/src/main/lnd2atmMod.F90 @@ -37,6 +37,7 @@ module lnd2atmMod use LandunitType , only : lun use GridcellType , only : grc use landunit_varcon , only : istice + use SoilBiogeochemCarbonFluxType , only : soilbiogeochem_carbonflux_type ! ! !PUBLIC TYPES: implicit none @@ -151,7 +152,7 @@ subroutine lnd2atm(bounds, & water_inst, & energyflux_inst, solarabs_inst, drydepvel_inst, & vocemis_inst, fireemis_inst, dust_inst, ch4_inst, glc_behavior, & - lnd2atm_inst, & + lnd2atm_inst, soilbiogeochem_carbonflux_inst, & net_carbon_exchange_grc) ! ! !DESCRIPTION: @@ -177,6 +178,7 @@ subroutine lnd2atm(bounds, & type(glc_behavior_type) , intent(in) :: glc_behavior type(lnd2atm_type) , intent(inout) :: lnd2atm_inst real(r8) , intent(in) :: net_carbon_exchange_grc( bounds%begg: ) ! net carbon exchange between land and atmosphere, positive for source (gC/m2/s) + type(soilbiogeochem_carbonflux_type) , intent(in) :: soilbiogeochem_carbonflux_inst ! ! !LOCAL VARIABLES: integer :: c, g ! indices @@ -335,6 +337,10 @@ subroutine lnd2atm(bounds, & !---------------------------------------------------- ! lnd -> rof !---------------------------------------------------- + call c2g( bounds, & + soilbiogeochem_carbonflux_inst%doc_col (bounds%begc:bounds%endc), & + water_inst%waterlnd2atmbulk_inst%qflx_rofdom_grc (bounds%begg:bounds%endg), & + c2l_scale_type= 'urbanf', l2g_scale_type='unity' ) call c2g( bounds, & water_inst%waterfluxbulk_inst%qflx_surf_col (bounds%begc:bounds%endc), & From b2c7a8c1169c01722ef862b86373cecf4dd4d8ce Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Tue, 1 Nov 2022 15:06:04 +0100 Subject: [PATCH 09/11] move Flrl_rofdoc --- src/cpl/nuopc/lnd_import_export.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cpl/nuopc/lnd_import_export.F90 b/src/cpl/nuopc/lnd_import_export.F90 index 8c783d6575..7e4bdac1c0 100644 --- a/src/cpl/nuopc/lnd_import_export.F90 +++ b/src/cpl/nuopc/lnd_import_export.F90 @@ -294,12 +294,12 @@ subroutine advertise_fields(gcomp, flds_scalar_name, glc_present, cism_evolve, r ! export to rof if (rof_prognostic) then - call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofdom) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofsur) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofgwl) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofsub) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofi ) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_irrig ) + call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofdom) end if ! export to glc if appropriate @@ -865,10 +865,6 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & ! waterlnd2atmbulk_inst%qflx_rofliq_h2osfc_grc(g) ! end do - if (fldchk(exportState, Flrl_rofdom)) then - call state_setexport_1d(exportState, Flrl_rofdom, waterlnd2atmbulk_inst%qflx_rofdom_grc(begg:), & - init_spval=.true., rc=rc) - if (ChkErr(rc,__LINE__,u_FILE_u)) return end if if (fldchk(exportState, Flrl_rofsur)) then call state_setexport_1d(exportState, Flrl_rofsur, waterlnd2atmbulk_inst%qflx_rofliq_qsur_grc(begg:), & @@ -901,6 +897,10 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & call state_setexport_1d(exportState, Flrl_rofsub, data1d(begg:), init_spval=.true., rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if + if (fldchk(exportState, Flrl_rofdom)) then + call state_setexport_1d(exportState, Flrl_rofdom, waterlnd2atmbulk_inst%qflx_rofdom_grc(begg:), & + init_spval=.true., rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return ! ----------------------- ! output to glc From ca4eefbdfa92663d89c0952c8d2982f02c5a9250 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Tue, 1 Nov 2022 15:15:24 +0100 Subject: [PATCH 10/11] correction endif misplaced --- src/cpl/nuopc/lnd_import_export.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpl/nuopc/lnd_import_export.F90 b/src/cpl/nuopc/lnd_import_export.F90 index 7e4bdac1c0..fdb76e423c 100644 --- a/src/cpl/nuopc/lnd_import_export.F90 +++ b/src/cpl/nuopc/lnd_import_export.F90 @@ -865,7 +865,6 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & ! waterlnd2atmbulk_inst%qflx_rofliq_h2osfc_grc(g) ! end do - end if if (fldchk(exportState, Flrl_rofsur)) then call state_setexport_1d(exportState, Flrl_rofsur, waterlnd2atmbulk_inst%qflx_rofliq_qsur_grc(begg:), & init_spval=.true., rc=rc) @@ -901,6 +900,7 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & call state_setexport_1d(exportState, Flrl_rofdom, waterlnd2atmbulk_inst%qflx_rofdom_grc(begg:), & init_spval=.true., rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return + end if ! ----------------------- ! output to glc From e4a8655d7c2f8ca3649dbb50d85b6d1623f35156 Mon Sep 17 00:00:00 2001 From: Marius Lambert Date: Fri, 18 Nov 2022 11:22:28 +0100 Subject: [PATCH 11/11] DOC to river mosart --- src/biogeophys/Waterlnd2atmType.F90 | 4 ++-- src/cpl/nuopc/lnd_import_export.F90 | 8 ++++---- src/main/lnd2atmMod.F90 | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/biogeophys/Waterlnd2atmType.F90 b/src/biogeophys/Waterlnd2atmType.F90 index fe95c009d0..d9b608f285 100644 --- a/src/biogeophys/Waterlnd2atmType.F90 +++ b/src/biogeophys/Waterlnd2atmType.F90 @@ -36,7 +36,7 @@ module Waterlnd2atmType real(r8), pointer :: qflx_rofice_grc (:) ! rof ice forcing, grc level real(r8), pointer :: qflx_liq_from_ice_col(:) ! liquid runoff from converted ice runoff real(r8), pointer :: qirrig_grc (:) ! irrigation flux - real(r8), pointer :: qflx_rofdom_grc (:) ! rof DOM + real(r8), pointer :: qflx_rofdoc_grc (:) ! rof DOC contains @@ -137,7 +137,7 @@ subroutine InitAllocate(this, bounds, tracer_vars) container = tracer_vars, & bounds = bounds, subgrid_level = subgrid_level_gridcell, & ival=ival) - call AllocateVar1d(var = this%qflx_rofdom_grc, name = 'qflx_rofdom_grc', & + call AllocateVar1d(var = this%qflx_rofdoc_grc, name = 'qflx_rofdoc_grc', & container = tracer_vars, & bounds = bounds, subgrid_level = subgrid_level_gridcell, & ival=ival) diff --git a/src/cpl/nuopc/lnd_import_export.F90 b/src/cpl/nuopc/lnd_import_export.F90 index fdb76e423c..c7ddab2700 100644 --- a/src/cpl/nuopc/lnd_import_export.F90 +++ b/src/cpl/nuopc/lnd_import_export.F90 @@ -133,7 +133,7 @@ module lnd_import_export character(*), parameter :: Fall_voc = 'Fall_voc' character(*), parameter :: Fall_fire = 'Fall_fire' character(*), parameter :: Sl_fztop = 'Sl_fztop' - character(*), parameter :: Flrl_rofdom = 'Flrl_rofdom' + character(*), parameter :: Flrl_rofdoc = 'Flrl_rofdoc' character(*), parameter :: Flrl_rofsur = 'Flrl_rofsur' character(*), parameter :: Flrl_rofsub = 'Flrl_rofsub' character(*), parameter :: Flrl_rofgwl = 'Flrl_rofgwl' @@ -299,7 +299,7 @@ subroutine advertise_fields(gcomp, flds_scalar_name, glc_present, cism_evolve, r call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofsub) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofi ) call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_irrig ) - call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofdom) + call fldlist_add(fldsFrLnd_num, fldsFrlnd, Flrl_rofdoc) end if ! export to glc if appropriate @@ -896,8 +896,8 @@ subroutine export_fields( gcomp, bounds, glc_present, rof_prognostic, & call state_setexport_1d(exportState, Flrl_rofsub, data1d(begg:), init_spval=.true., rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if - if (fldchk(exportState, Flrl_rofdom)) then - call state_setexport_1d(exportState, Flrl_rofdom, waterlnd2atmbulk_inst%qflx_rofdom_grc(begg:), & + if (fldchk(exportState, Flrl_rofdoc)) then + call state_setexport_1d(exportState, Flrl_rofdoc, waterlnd2atmbulk_inst%qflx_rofdoc_grc(begg:), & init_spval=.true., rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if diff --git a/src/main/lnd2atmMod.F90 b/src/main/lnd2atmMod.F90 index 4ccc3442b2..d72106b250 100644 --- a/src/main/lnd2atmMod.F90 +++ b/src/main/lnd2atmMod.F90 @@ -339,7 +339,7 @@ subroutine lnd2atm(bounds, & !---------------------------------------------------- call c2g( bounds, & soilbiogeochem_carbonflux_inst%doc_col (bounds%begc:bounds%endc), & - water_inst%waterlnd2atmbulk_inst%qflx_rofdom_grc (bounds%begg:bounds%endg), & + water_inst%waterlnd2atmbulk_inst%qflx_rofdoc_grc (bounds%begg:bounds%endg), & c2l_scale_type= 'urbanf', l2g_scale_type='unity' ) call c2g( bounds, &