diff --git a/cime/scripts-acme/update_acme_tests.py b/cime/scripts-acme/update_acme_tests.py index be22d3f3e0f1..547640cddb05 100755 --- a/cime/scripts-acme/update_acme_tests.py +++ b/cime/scripts-acme/update_acme_tests.py @@ -40,6 +40,7 @@ "acme_land_developer" : ("acme_runoff_developer", ("SMS.f19_f19.I1850CLM45CN", + ("SMS_Ly3.1x1_smallvilleIA.ICLM45BGCCROP", "force_netcdf_pio"), "SMS.f09_g16.I1850CLM45CN", "SMS.hcru_hcru.I1850CRUCLM45CN") ), diff --git a/components/clm/bld/namelist_files/namelist_defaults_clm4_5.xml b/components/clm/bld/namelist_files/namelist_defaults_clm4_5.xml index 8903ebb16aee..d52fb9eaea1b 100644 --- a/components/clm/bld/namelist_files/namelist_defaults_clm4_5.xml +++ b/components/clm/bld/namelist_files/namelist_defaults_clm4_5.xml @@ -79,7 +79,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). lnd/clm2/paramdata/clm_params.c160128.nc lnd/clm2/paramdata/clm_params.ED.c140115.nc -lnd/clm2/paramdata/clm_params.c151111.nc +lnd/clm2/paramdata/clm_params_c160303.nc lnd/clm2/paramdata/CNP_parameters_c131108.nc diff --git a/components/clm/src/biogeochem/CNAllocationMod.F90 b/components/clm/src/biogeochem/CNAllocationMod.F90 old mode 100644 new mode 100755 index 6375c17a28f1..1377bde8ce25 --- a/components/clm/src/biogeochem/CNAllocationMod.F90 +++ b/components/clm/src/biogeochem/CNAllocationMod.F90 @@ -856,8 +856,10 @@ subroutine CNAllocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soi if (peaklai(p) == 1) then ! lai at maximum allowed arepr(p) = 0._r8 aleaf(p) = 1.e-5_r8 - astem(p) = 0._r8 - aroot(p) = 1._r8 - arepr(p) - aleaf(p) - astem(p) + aroot(p) = max(0._r8, min(1._r8, arooti(ivt(p)) - & + (arooti(ivt(p)) - arootf(ivt(p))) * & + min(1._r8, hui(p)/gddmaturity(p)))) + astem(p) = 1._r8 - arepr(p) - aleaf(p) - aroot(p) else arepr(p) = 0._r8 aroot(p) = max(0._r8, min(1._r8, arooti(ivt(p)) - & @@ -919,7 +921,7 @@ subroutine CNAllocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soi !would be bypassed altogether, not the intended outcome. I checked several of my output files and !they all seemed to be going through the retranslocation loop for soybean - good news. - if (ivt(p) /= nsoybean .or. astem(p) == astemf(ivt(p))) then + if (ivt(p) /= nsoybean .or. astem(p) == astemf(ivt(p)) .or. peaklai(p) == 1._r8) then if (grain_flag(p) == 0._r8) then t1 = 1 / dt leafn_to_retransn(p) = t1 * ((leafc(p) / leafcn(ivt(p))) - (leafc(p) / & @@ -970,10 +972,11 @@ subroutine CNAllocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soi else if (ivt(p) >= npcropmin) then ! skip generic crops cng = graincn(ivt(p)) + cpg = graincp(ivt(p)) c_allometry(p) = (1._r8+g1)*(1._r8+f1+f5+f3*(1._r8+f2)) n_allometry(p) = 1._r8/cnl + f1/cnfr + f5/cng + (f3*f4*(1._r8+f2))/cnlw + & (f3*(1._r8-f4)*(1._r8+f2))/cndw - p_allometry(p) = 1._r8/cpl + f1/cpfr + (f3*f4*(1._r8+f2))/cplw + & + p_allometry(p) = 1._r8/cpl + f1/cpfr + f5/cpg + (f3*f4*(1._r8+f2))/cplw + & (f3*(1._r8-f4)*(1._r8+f2))/cpdw else @@ -3299,10 +3302,11 @@ subroutine CNAllocation3_PlantCNPAlloc (bounds , & else if (ivt(p) >= npcropmin) then ! skip generic crops cng = graincn(ivt(p)) + cpg = graincp(ivt(p)) c_allometry(p) = (1._r8+g1)*(1._r8+f1+f5+f3*(1._r8+f2)) n_allometry(p) = 1._r8/cnl + f1/cnfr + f5/cng + (f3*f4*(1._r8+f2))/cnlw + & (f3*(1._r8-f4)*(1._r8+f2))/cndw - p_allometry(p) = 1._r8/cpl + f1/cpfr + (f3*f4*(1._r8+f2))/cplw + & + p_allometry(p) = 1._r8/cpl + f1/cpfr + f5/cpg + (f3*f4*(1._r8+f2))/cplw + & (f3*(1._r8-f4)*(1._r8+f2))/cpdw else diff --git a/components/clm/src/biogeochem/CNCropHarvestPoolsMod.F90 b/components/clm/src/biogeochem/CNCropHarvestPoolsMod.F90 old mode 100644 new mode 100755 index e48bc832c107..22f841f293b8 --- a/components/clm/src/biogeochem/CNCropHarvestPoolsMod.F90 +++ b/components/clm/src/biogeochem/CNCropHarvestPoolsMod.F90 @@ -14,6 +14,8 @@ module CNCropHarvestPoolsMod use CNCarbonFluxType , only : carbonflux_type use CNNitrogenStateType , only : nitrogenstate_type use CNNitrogenFluxType , only : nitrogenflux_type + use PhosphorusStateType , only : phosphorusstate_type + use PhosphorusFluxType , only : phosphorusflux_type ! implicit none save @@ -27,8 +29,8 @@ module CNCropHarvestPoolsMod !----------------------------------------------------------------------- subroutine CNCropHarvestPools(num_soilc, filter_soilc, & - carbonstate_vars, c13_carbonstate_vars, c14_carbonstate_vars, nitrogenstate_vars, & - carbonflux_vars, c13_carbonflux_vars, c14_carbonflux_vars, nitrogenflux_vars) + carbonstate_vars, c13_carbonstate_vars, c14_carbonstate_vars, nitrogenstate_vars, phosphorusstate_vars,& + carbonflux_vars, c13_carbonflux_vars, c14_carbonflux_vars, nitrogenflux_vars, phosphorusflux_vars) ! ! !DESCRIPTION: ! Update all loss fluxes from crop harvest pools, and update harvest pool state variables @@ -42,10 +44,12 @@ subroutine CNCropHarvestPools(num_soilc, filter_soilc, & type(carbonstate_type) , intent(in) :: c13_carbonstate_vars type(carbonstate_type) , intent(in) :: c14_carbonstate_vars type(nitrogenstate_type) , intent(in) :: nitrogenstate_vars + type(phosphorusstate_type), intent(in) :: phosphorusstate_vars type(carbonflux_type) , intent(inout) :: carbonflux_vars type(carbonflux_type) , intent(inout) :: c13_carbonflux_vars type(carbonflux_type) , intent(inout) :: c14_carbonflux_vars type(nitrogenflux_type) , intent(inout) :: nitrogenflux_vars + type(phosphorusflux_type), intent(inout) :: phosphorusflux_vars ! ! !LOCAL VARIABLES: integer :: fc ! lake filter indices @@ -75,6 +79,7 @@ subroutine CNCropHarvestPools(num_soilc, filter_soilc, & endif nitrogenflux_vars%prod1n_loss_col(c) = nitrogenstate_vars%prod1n_col(c) * kprod1 + phosphorusflux_vars%prod1p_loss_col(c) = phosphorusstate_vars%prod1p_col(c) * kprod1 end do ! set time steps @@ -100,6 +105,8 @@ subroutine CNCropHarvestPools(num_soilc, filter_soilc, & nitrogenstate_vars%prod1n_col(c) = nitrogenstate_vars%prod1n_col(c) + & nitrogenflux_vars%hrv_cropn_to_prod1n_col(c)*dt + phosphorusstate_vars%prod1p_col(c) = phosphorusstate_vars%prod1p_col(c) + & + phosphorusflux_vars%hrv_cropp_to_prod1p_col(c)*dt ! fluxes out of wood product pools, from decomposition carbonstate_vars%prod1c_col(c) = carbonstate_vars%prod1c_col(c) - & @@ -117,6 +124,8 @@ subroutine CNCropHarvestPools(num_soilc, filter_soilc, & nitrogenstate_vars%prod1n_col(c) = nitrogenstate_vars%prod1n_col(c) - & nitrogenflux_vars%prod1n_loss_col(c)*dt + phosphorusstate_vars%prod1p_col(c) = phosphorusstate_vars%prod1p_col(c) - & + phosphorusflux_vars%prod1p_loss_col(c)*dt end do ! end of column loop diff --git a/components/clm/src/biogeochem/CNEcosystemDynMod.F90 b/components/clm/src/biogeochem/CNEcosystemDynMod.F90 old mode 100644 new mode 100755 index 1f28f3ae3138..ab142622d8e7 --- a/components/clm/src/biogeochem/CNEcosystemDynMod.F90 +++ b/components/clm/src/biogeochem/CNEcosystemDynMod.F90 @@ -808,7 +808,8 @@ subroutine CNEcosystemDynNoLeaching2(bounds, & call CNCropHarvestPools(num_soilc, filter_soilc, & carbonstate_vars, c13_carbonstate_vars, c14_carbonstate_vars, nitrogenstate_vars, & - carbonflux_vars, c13_carbonflux_vars, c14_carbonflux_vars, nitrogenflux_vars) + phosphorusstate_vars, carbonflux_vars, c13_carbonflux_vars, c14_carbonflux_vars, & + nitrogenflux_vars, phosphorusflux_vars) call CNFireArea(bounds, num_soilc, filter_soilc, num_soilp, filter_soilp, & atm2lnd_vars, temperature_vars, energyflux_vars, soilhydrology_vars, waterstate_vars, & diff --git a/components/clm/src/biogeochem/CNPhenologyMod.F90 b/components/clm/src/biogeochem/CNPhenologyMod.F90 old mode 100644 new mode 100755 index 6defd564156e..0679cc0a964d --- a/components/clm/src/biogeochem/CNPhenologyMod.F90 +++ b/components/clm/src/biogeochem/CNPhenologyMod.F90 @@ -248,7 +248,8 @@ subroutine CNPhenology (num_soilc, filter_soilc, num_soilp, filter_soilp, & if (num_pcropp > 0 ) then call CNCropHarvest(num_pcropp, filter_pcropp, & num_soilc, filter_soilc, crop_vars, & - cnstate_vars, carbonstate_vars, carbonflux_vars, nitrogenstate_vars, nitrogenflux_vars) + cnstate_vars, carbonstate_vars, carbonflux_vars, nitrogenstate_vars, & + nitrogenflux_vars, phosphorusstate_vars, phosphorusflux_vars) end if call CNOffsetLitterfall(num_soilp, filter_soilp, & @@ -1527,7 +1528,7 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & dwt_seedn_to_leaf(c) = dwt_seedn_to_leaf(c) + leafn_xfer(p)/dt leafp_xfer(p) = leafc_xfer(p) / leafcp(ivt(p)) ! with onset - dwt_seedp_to_leaf(c) = dwt_seedp_to_leaf(c) + leafn_xfer(p)/dt + dwt_seedp_to_leaf(c) = dwt_seedp_to_leaf(c) + leafp_xfer(p)/dt ! latest possible date to plant winter cereal and after all other ! crops were harvested for that year @@ -1755,6 +1756,7 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & else ! plant never emerged from the ground dwt_seedc_to_leaf(c) = dwt_seedc_to_leaf(c) - leafc_xfer(p)/dt dwt_seedn_to_leaf(c) = dwt_seedn_to_leaf(c) - leafn_xfer(p)/dt + dwt_seedp_to_leaf(c) = dwt_seedp_to_leaf(c) - leafp_xfer(p)/dt leafc_xfer(p) = 0._r8 ! revert planting transfers leafn_xfer(p) = leafc_xfer(p) / leafcn(ivt(p)) leafp_xfer(p) = leafc_xfer(p) / leafcp(ivt(p)) @@ -2161,7 +2163,8 @@ end subroutine CNOnsetGrowth !---------------------------------------------------------------------- subroutine CNCropHarvest (num_pcropp, filter_pcropp, num_soilc, filter_soilc, crop_vars, & - cnstate_vars, carbonstate_vars, carbonflux_vars, nitrogenstate_vars, nitrogenflux_vars) + cnstate_vars, carbonstate_vars, carbonflux_vars, nitrogenstate_vars, nitrogenflux_vars, & + phosphorusstate_vars, phosphorusflux_vars) ! ! !DESCRIPTION: ! This routine handles harvest for agriculture vegetation types, such as @@ -2181,6 +2184,8 @@ subroutine CNCropHarvest (num_pcropp, filter_pcropp, num_soilc, filter_soilc, cr type(carbonflux_type) , intent(inout) :: carbonflux_vars type(nitrogenstate_type), intent(in) :: nitrogenstate_vars type(nitrogenflux_type) , intent(inout) :: nitrogenflux_vars + type(phosphorusstate_type),intent(inout):: phosphorusstate_vars + type(phosphorusflux_type), intent(inout):: phosphorusflux_vars ! ! !LOCAL VARIABLES: ! local pointers to implicit in scalars @@ -2204,19 +2209,27 @@ subroutine CNCropHarvest (num_pcropp, filter_pcropp, num_soilc, filter_soilc, cr leafn => nitrogenstate_vars%leafn_patch , & ! Input: [real(r8) (:) ] (gN/m2) leaf N grainn => nitrogenstate_vars%grainn_patch , & ! Input: [real(r8) (:) ] (gN/m2) grain N livestemn => nitrogenstate_vars%livestemn_patch , & ! Input: [real(r8) (:) ] (gN/m2) livestem N - + leafp => phosphorusstate_vars%leafp_patch , & ! Input: [real(r8) (:) ] (gP/m2) leaf P + grainp => phosphorusstate_vars%grainp_patch , & ! Input: [real(r8) (:) ] (gP/m2) grain P + livestemp => phosphorusstate_vars%livestemp_patch , & ! Input: [real(r8) (:) ] (gP/m2) livestem P cpool_to_grainc => carbonflux_vars%cpool_to_grainc_patch , & ! Input: [real(r8) (:) ] allocation to grain C (gC/m2/s) cpool_to_livestemc => carbonflux_vars%cpool_to_livestemc_patch , & ! Input: [real(r8) (:) ] allocation to live stem C (gC/m2/s) cpool_to_leafc => carbonflux_vars%cpool_to_leafc_patch , & ! Input: [real(r8) (:) ] allocation to leaf C (gC/m2/s) - npool_to_leafn => nitrogenflux_vars%npool_to_leafn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gC/m2/s) - npool_to_livestemn => nitrogenflux_vars%npool_to_livestemn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gC/m2/s) - npool_to_grainn => nitrogenflux_vars%npool_to_grainn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gC/m2/s) + npool_to_leafn => nitrogenflux_vars%npool_to_leafn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gN/m2/s) + npool_to_livestemn => nitrogenflux_vars%npool_to_livestemn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gN/m2/s) + npool_to_grainn => nitrogenflux_vars%npool_to_grainn_patch , & ! Input: [real(r8) (:)] allocation to grain N (gN/m2/s) + ppool_to_leafp => phosphorusflux_vars%ppool_to_leafp_patch , & ! Input: [real(r8) (:)] allocation to grain P (gP/m2/s) + ppool_to_livestemp => phosphorusflux_vars%ppool_to_livestemp_patch, & ! Input: [real(r8) (:)] allocation to grain P (gP/m2/s) + ppool_to_grainp => phosphorusflux_vars%ppool_to_grainp_patch , & ! Input: [real(r8) (:)] allocation to grain P (gP/m2/s) hrv_leafc_to_prod1c => carbonflux_vars%hrv_leafc_to_prod1c_patch , & ! Input: [real(r8) (:)] crop leafc harvested hrv_livestemc_to_prod1c => carbonflux_vars%hrv_livestemc_to_prod1c_patch, & ! Input: [real(r8) (:)] crop stemc harvested hrv_grainc_to_prod1c => carbonflux_vars%hrv_grainc_to_prod1c_patch , & ! Input: [real(r8) (:)] crop grainc harvested hrv_leafn_to_prod1n => nitrogenflux_vars%hrv_leafn_to_prod1n_patch , & ! Input: [real(r8) (:)] crop leafn harvested hrv_livestemn_to_prod1n => nitrogenflux_vars%hrv_livestemn_to_prod1n_patch, & ! Input: [real(r8) (:)] crop stemn harvested hrv_grainn_to_prod1n => nitrogenflux_vars%hrv_grainn_to_prod1n_patch, & ! Input: [real(r8) (:)] crop grainn harvested + hrv_leafp_to_prod1p => phosphorusflux_vars%hrv_leafp_to_prod1p_patch , & ! Input: [real(r8) (:)] crop leafp harvested + hrv_livestemp_to_prod1p => phosphorusflux_vars%hrv_livestemp_to_prod1p_patch, & ! Input: [real(r8) (:)] crop stemp harvested + hrv_grainp_to_prod1p => phosphorusflux_vars%hrv_grainp_to_prod1p_patch, & ! Input: [real(r8) (:)] crop grainp harvested crpyld => crop_vars%crpyld_patch , & ! InOut: [real(r8) ):)] harvested crop (bu/acre) dmyield => crop_vars%dmyield_patch & ! InOut: [real(r8) ):)] dry matter harvested crop (t/ha) ) @@ -2241,10 +2254,14 @@ subroutine CNCropHarvest (num_pcropp, filter_pcropp, num_soilc, filter_soilc, cr hrv_grainc_to_prod1c(p) = t1 * grainc(p) + cpool_to_grainc(p) ! Do the same for Nitrogen - hrv_leafn_to_prod1n(p) = t1 * presharv(ivt(p)) * leafn(p) + npool_to_leafn(p) - hrv_livestemn_to_prod1n(p) = t1 * presharv(ivt(p)) * livestemn(p) + npool_to_livestemn(p) + hrv_leafn_to_prod1n(p) = presharv(ivt(p)) * ((t1 * leafn(p)) + npool_to_leafn(p)) + hrv_livestemn_to_prod1n(p) = presharv(ivt(p)) * ((t1 * livestemn(p)) + npool_to_livestemn(p)) hrv_grainn_to_prod1n(p) = t1 * grainn(p) + npool_to_grainn(p) + ! Do the same for Phosphorus + hrv_leafp_to_prod1p(p) = presharv(ivt(p)) * ((t1 * leafp(p)) + ppool_to_leafp(p)) + hrv_livestemp_to_prod1p(p) = presharv(ivt(p)) * ((t1 * livestemp(p)) + ppool_to_livestemp(p)) + hrv_grainp_to_prod1p(p) = t1 * grainp(p) + ppool_to_grainp(p) end if ! offseddt_counter @@ -2255,7 +2272,7 @@ subroutine CNCropHarvest (num_pcropp, filter_pcropp, num_soilc, filter_soilc, cr ! for C and N inputs call CNCropHarvestPftToColumn(num_soilc, filter_soilc,cnstate_vars, & - carbonstate_vars, nitrogenstate_vars, carbonflux_vars, nitrogenflux_vars) + carbonflux_vars, nitrogenflux_vars, phosphorusflux_vars) end associate end subroutine CNCropHarvest @@ -2371,8 +2388,8 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & frootc_to_litter(p) = t1 * frootc(p) + cpool_to_frootc(p) livestemc_to_litter(p) = (1.0_r8 - presharv(ivt(p))) * ((t1 * livestemc(p)) + cpool_to_livestemc(p)) else - leafc_to_litter(p) = t1 * leafc(p) + cpool_to_leafc(p) - frootc_to_litter(p) = t1 * frootc(p) + cpool_to_frootc(p) + leafc_to_litter(p) = t1 * leafc(p) + cpool_to_leafc(p) + frootc_to_litter(p) = t1 * frootc(p) + cpool_to_frootc(p) end if else t1 = dt * 2.0_r8 / (offset_counter(p) * offset_counter(p)) @@ -2398,7 +2415,6 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & if (ivt(p) >= npcropmin) then livestemn_to_litter(p) = livestemc_to_litter(p) / livewdcn(ivt(p)) livestemp_to_litter(p) = livestemc_to_litter(p) / livewdcp(ivt(p)) - grainp_to_food(p) = grainc_to_food(p) / graincp(ivt(p)) end if else if (offset_counter(p) == dt) then @@ -2406,19 +2422,15 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & if (ivt(p) >= npcropmin) then ! this assumes that offset_counter == dt for crops ! if this were ever changed, we'd need to add code to the "else" - leafn_to_litter(p) = min(((1.0_r8 - presharv(ivt(p))) * ((t1 * leafn(p)) + npool_to_leafn(p))),leafn(p))* 0.38_r8 ! 62% N resorption rate; LEONARDUS VERGUTZ 2012 Ecological Monographs 82(2) 205-220. - leafn_to_retransn(p) = min(((1.0_r8 - presharv(ivt(p))) * ((t1 * leafn(p)) + npool_to_leafn(p))),leafn(p))* 0.62_r8 + leafn_to_litter(p) = (1.0_r8 - presharv(ivt(p))) * ((t1 * leafn(p)) + npool_to_leafn(p)) + leafp_to_litter(p) = (1.0_r8 - presharv(ivt(p))) * ((t1 * leafp(p)) + ppool_to_leafp(p)) - leafp_to_litter(p) = min(((1.0_r8 - presharv(ivt(p))) * ((t1 * leafp(p)) + ppool_to_leafp(p))),leafp(p))* 0.35_r8 ! 65% N resorption rate; LEONARDUS VERGUTZ 2012 Ecological Monographs 82(2) 205-220. - leafp_to_retransp(p) = min(((1.0_r8 - presharv(ivt(p))) * ((t1 * leafp(p)) + ppool_to_leafp(p))),frootp(p))* 0.65_r8 - - frootn_to_litter(p) = min(t1 * frootn(p) + npool_to_frootn(p),frootn(p)) - frootp_to_litter(p) = min(t1 * frootp(p) + ppool_to_frootp(p),frootp(p)) + frootn_to_litter(p) = t1 * frootn(p) + npool_to_frootn(p) + frootp_to_litter(p) = t1 * frootp(p) + ppool_to_frootp(p) - livestemn_to_litter(p) = min((1.0_r8 - presharv(ivt(p))) * ((t1 * livestemn(p)) + npool_to_livestemn(p)),livestemn(p)) - livestemp_to_litter(p) = min((1.0_r8 - presharv(ivt(p))) * ((t1 * livestemp(p)) + ppool_to_livestemp(p)),livestemp(p)) + livestemn_to_litter(p) = (1.0_r8 - presharv(ivt(p))) * ((t1 * livestemn(p)) + npool_to_livestemn(p)) + livestemp_to_litter(p) = (1.0_r8 - presharv(ivt(p))) * ((t1 * livestemp(p)) + ppool_to_livestemp(p)) - !grainp_to_food(p) = grainc_to_food(p) / graincp(ivt(p)) else leafn_to_litter(p) = (t1 * leafn(p) + npool_to_leafn(p))*0.38_r8 leafn_to_retransn(p) = (t1 * leafn(p) + npool_to_leafn(p))*0.62_r8 @@ -2730,13 +2742,13 @@ subroutine CNLitterToColumn (num_soilc, filter_soilc, & leafc_to_litter => carbonflux_vars%leafc_to_litter_patch , & ! Input: [real(r8) (:) ] leaf C litterfall (gC/m2/s) frootc_to_litter => carbonflux_vars%frootc_to_litter_patch , & ! Input: [real(r8) (:) ] fine root N litterfall (gN/m2/s) livestemc_to_litter => carbonflux_vars%livestemc_to_litter_patch , & ! Input: [real(r8) (:) ] live stem C litterfall (gC/m2/s) - grainc_to_food => carbonflux_vars%grainc_to_food_patch , & ! Input: [real(r8) (:) ] grain C to food (gC/m2/s) +! grainc_to_food => carbonflux_vars%grainc_to_food_patch , & ! Input: [real(r8) (:) ] grain C to food (gC/m2/s) phenology_c_to_litr_met_c => carbonflux_vars%phenology_c_to_litr_met_c_col , & ! Output: [real(r8) (:,:) ] C fluxes associated with phenology (litterfall and crop) to litter metabolic pool (gC/m3/s) phenology_c_to_litr_cel_c => carbonflux_vars%phenology_c_to_litr_cel_c_col , & ! Output: [real(r8) (:,:) ] C fluxes associated with phenology (litterfall and crop) to litter cellulose pool (gC/m3/s) phenology_c_to_litr_lig_c => carbonflux_vars%phenology_c_to_litr_lig_c_col , & ! Output: [real(r8) (:,:) ] C fluxes associated with phenology (litterfall and crop) to litter lignin pool (gC/m3/s) livestemn_to_litter => nitrogenflux_vars%livestemn_to_litter_patch , & ! Input: [real(r8) (:) ] livestem N to litter (gN/m2/s) - grainn_to_food => nitrogenflux_vars%grainn_to_food_patch , & ! Input: [real(r8) (:) ] grain N to food (gN/m2/s) +! grainn_to_food => nitrogenflux_vars%grainn_to_food_patch , & ! Input: [real(r8) (:) ] grain N to food (gN/m2/s) leafn_to_litter => nitrogenflux_vars%leafn_to_litter_patch , & ! Input: [real(r8) (:) ] leaf N litterfall (gN/m2/s) frootn_to_litter => nitrogenflux_vars%frootn_to_litter_patch , & ! Input: [real(r8) (:) ] fine root N litterfall (gN/m2/s) phenology_n_to_litr_met_n => nitrogenflux_vars%phenology_n_to_litr_met_n_col , & ! Output: [real(r8) (:,:) ] N fluxes associated with phenology (litterfall and crop) to litter metabolic pool (gN/m3/s) @@ -2744,7 +2756,7 @@ subroutine CNLitterToColumn (num_soilc, filter_soilc, & phenology_n_to_litr_lig_n => nitrogenflux_vars%phenology_n_to_litr_lig_n_col , & ! Output: [real(r8) (:,:) ] N fluxes associated with phenology (litterfall and crop) to litter lignin pool (gN/m3/s) livestemp_to_litter => phosphorusflux_vars%livestemp_to_litter_patch , & ! Input: [real(r8) (:) ] livestem P to litter (gP/m2/s) - grainp_to_food => phosphorusflux_vars%grainp_to_food_patch , & ! Input: [real(r8) (:) ] grain P to food (gP/m2/s) +! grainp_to_food => phosphorusflux_vars%grainp_to_food_patch , & ! Input: [real(r8) (:) ] grain P to food (gP/m2/s) leafp_to_litter => phosphorusflux_vars%leafp_to_litter_patch , & ! Input: [real(r8) (:) ] leaf P litterfall (gP/m2/s) frootp_to_litter => phosphorusflux_vars%frootp_to_litter_patch , & ! Input: [real(r8) (:) ] fine root P litterfall (gP/m2/s) phenology_p_to_litr_met_p => phosphorusflux_vars%phenology_p_to_litr_met_p_col , & ! Output: [real(r8) (:,:) ] P fluxes associated with phenology (litterfall and crop) to litter metabolic pool (gP/m3/s) @@ -2840,30 +2852,6 @@ subroutine CNLitterToColumn (num_soilc, filter_soilc, & phenology_p_to_litr_lig_p(c,j) = phenology_p_to_litr_lig_p(c,j) & + livestemp_to_litter(p) * lf_flig(ivt(p)) * wtcol(p) * leaf_prof(p,j) - ! grain litter carbon fluxes - phenology_c_to_litr_met_c(c,j) = phenology_c_to_litr_met_c(c,j) & - + grainc_to_food(p) * lf_flab(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_c_to_litr_cel_c(c,j) = phenology_c_to_litr_cel_c(c,j) & - + grainc_to_food(p) * lf_fcel(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_c_to_litr_lig_c(c,j) = phenology_c_to_litr_lig_c(c,j) & - + grainc_to_food(p) * lf_flig(ivt(p)) * wtcol(p) * leaf_prof(p,j) - - ! grain litter nitrogen fluxes - phenology_n_to_litr_met_n(c,j) = phenology_n_to_litr_met_n(c,j) & - + grainn_to_food(p) * lf_flab(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_n_to_litr_cel_n(c,j) = phenology_n_to_litr_cel_n(c,j) & - + grainn_to_food(p) * lf_fcel(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_n_to_litr_lig_n(c,j) = phenology_n_to_litr_lig_n(c,j) & - + grainn_to_food(p) * lf_flig(ivt(p)) * wtcol(p) * leaf_prof(p,j) - - ! grain litter phosphorus fluxes - phenology_p_to_litr_met_p(c,j) = phenology_p_to_litr_met_p(c,j) & - + grainp_to_food(p) * lf_flab(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_p_to_litr_cel_p(c,j) = phenology_p_to_litr_cel_p(c,j) & - + grainp_to_food(p) * lf_fcel(ivt(p)) * wtcol(p) * leaf_prof(p,j) - phenology_p_to_litr_lig_p(c,j) = phenology_p_to_litr_lig_p(c,j) & - + grainp_to_food(p) * lf_flig(ivt(p)) * wtcol(p) * leaf_prof(p,j) - end if end if end if @@ -2879,7 +2867,7 @@ end subroutine CNLitterToColumn !----------------------------------------------------------------------- subroutine CNCropHarvestPftToColumn (num_soilc, filter_soilc, & - cnstate_vars, carbonstate_vars, nitrogenstate_vars, carbonflux_vars, nitrogenflux_vars) + cnstate_vars, carbonflux_vars, nitrogenflux_vars, phosphorusflux_vars) ! ! !DESCRIPTION: ! called at the end of CNCropHarvest to gather all pft-level harvest fluxes @@ -2888,10 +2876,9 @@ subroutine CNCropHarvestPftToColumn (num_soilc, filter_soilc, & ! !USES: use clm_varpar, only : maxpatch_pft type(cnstate_type) , intent(in) :: cnstate_vars - type(carbonstate_type) , intent(in) :: carbonstate_vars - type(nitrogenstate_type) , intent(in) :: nitrogenstate_vars type(carbonflux_type) , intent(inout) :: carbonflux_vars type(nitrogenflux_type) , intent(inout) :: nitrogenflux_vars + type(phosphorusflux_type), intent(inout) :: phosphorusflux_vars ! ! !ARGUMENTS: integer, intent(in) :: num_soilc ! number of soil columns in filter @@ -2903,7 +2890,6 @@ subroutine CNCropHarvestPftToColumn (num_soilc, filter_soilc, & associate(& ivt => pft%itype , & ! Input: [integer (:)] pft vegetation type wtcol => pft%wtcol , & ! Input: [real(r8) (:)] pft weight relative to column (0-1) - phrv_leafc_to_prod1c => carbonflux_vars%hrv_leafc_to_prod1c_patch , & ! Input: [real(r8) (:)] crop leafc harvested phrv_livestemc_to_prod1c => carbonflux_vars%hrv_livestemc_to_prod1c_patch, & ! Input: [real(r8) (:)] crop stemc harvested phrv_grainc_to_prod1c => carbonflux_vars%hrv_grainc_to_prod1c_patch , & ! Input: [real(r8) (:)] crop grainc harvested @@ -2912,8 +2898,13 @@ subroutine CNCropHarvestPftToColumn (num_soilc, filter_soilc, & phrv_livestemn_to_prod1n => nitrogenflux_vars%hrv_livestemn_to_prod1n_patch, & ! Input: [real(r8) (:)] crop stemn harvested phrv_grainn_to_prod1n => nitrogenflux_vars%hrv_grainn_to_prod1n_patch , & ! Input: [real(r8) (:)] crop grainn harvested phrv_cropn_to_prod1n => nitrogenflux_vars%hrv_cropn_to_prod1n_patch , & ! InOut: [real(r8) (:)] crop grainn harvested + phrv_leafp_to_prod1p => phosphorusflux_vars%hrv_leafp_to_prod1p_patch , & ! InOut: [real(r8) (:)] crop grainp harvested + phrv_livestemp_to_prod1p => phosphorusflux_vars%hrv_livestemp_to_prod1p_patch, & ! InOut: [real(r8) (:)] column level crop carbon harvested + phrv_grainp_to_prod1p => phosphorusflux_vars%hrv_grainp_to_prod1p_patch , & ! InOut: [real(r8) (:)] column level crop nitrogen harvested + phrv_cropp_to_prod1p => phosphorusflux_vars%hrv_cropp_to_prod1p_patch , & ! InOut: [real(r8) (:)] column level crop phosphorus harvested chrv_cropc_to_prod1c => carbonflux_vars%hrv_cropc_to_prod1c_col , & ! InOut: [real(r8) (:)] column level crop carbon harvested - chrv_cropn_to_prod1n => nitrogenflux_vars%hrv_cropn_to_prod1n_col & ! InOut: [real(r8) (:)] column level crop nitrogen harvested + chrv_cropn_to_prod1n => nitrogenflux_vars%hrv_cropn_to_prod1n_col , & ! InOut: [real(r8) (:)] column level crop nitrogen harvested + chrv_cropp_to_prod1p => phosphorusflux_vars%hrv_cropp_to_prod1p_col & ! InOut: [real(r8) (:)] column level crop phosphorus harvested ) do pi = 1,maxpatch_pft @@ -2935,6 +2926,11 @@ subroutine CNCropHarvestPftToColumn (num_soilc, filter_soilc, & chrv_cropn_to_prod1n(c) = chrv_cropn_to_prod1n(c) + phrv_cropn_to_prod1n(p) * wtcol(p) + phrv_cropp_to_prod1p(p) = phrv_leafp_to_prod1p(p) + phrv_livestemp_to_prod1p(p) + & + phrv_grainp_to_prod1p(p) + + chrv_cropp_to_prod1p(c) = chrv_cropp_to_prod1p(c) + phrv_cropp_to_prod1p(p) * wtcol(p) + end if end if diff --git a/components/clm/src/biogeochem/PStateUpdate2Mod.F90 b/components/clm/src/biogeochem/PStateUpdate2Mod.F90 index 9038d7556459..edcf6bc41fd8 100644 --- a/components/clm/src/biogeochem/PStateUpdate2Mod.F90 +++ b/components/clm/src/biogeochem/PStateUpdate2Mod.F90 @@ -12,6 +12,8 @@ module PStateUpdate2Mod use clm_varctl , only : iulog use PhosphorusStateType , only : phosphorusstate_type use PhosphorusFLuxType , only : phosphorusflux_type + use PatchType , only : pft + use pftvarcon , only : npcropmin !! bgc interface & pflotran: use clm_varctl , only : use_pflotran, pf_cmode ! @@ -143,6 +145,7 @@ subroutine PStateUpdate2h(num_soilc, filter_soilc, num_soilp, filter_soilp, & !----------------------------------------------------------------------- associate( & + ivt => pft%itype , & ! Input: [integer (:) ] pft vegetation type pf => phosphorusflux_vars , & ps => phosphorusstate_vars & ) @@ -188,6 +191,12 @@ subroutine PStateUpdate2h(num_soilc, filter_soilc, num_soilp, filter_soilp, & ps%deadcrootp_patch(p) = ps%deadcrootp_patch(p) - pf%hrv_deadcrootp_to_litter_patch(p) * dt ps%retransp_patch(p) = ps%retransp_patch(p) - pf%hrv_retransp_to_litter_patch(p) * dt + if (ivt(p) >= npcropmin) then ! skip 2 generic crops + ps%livestemp_patch(p)= ps%livestemp_patch(p) - pf%hrv_livestemp_to_prod1p_patch(p) * dt + ps%leafp_patch(p) = ps%leafp_patch(p) - pf%hrv_leafp_to_prod1p_patch(p) * dt + ps%grainp_patch(p) = ps%grainp_patch(p) - pf%hrv_grainp_to_prod1p_patch(p) * dt + end if + ! storage pools ps%leafp_storage_patch(p) = ps%leafp_storage_patch(p) - pf%hrv_leafp_storage_to_litter_patch(p) * dt ps%frootp_storage_patch(p) = ps%frootp_storage_patch(p) - pf%hrv_frootp_storage_to_litter_patch(p) * dt diff --git a/components/clm/src/biogeochem/PhosphorusFluxType.F90 b/components/clm/src/biogeochem/PhosphorusFluxType.F90 old mode 100644 new mode 100755 index 47c1089fef7d..cfc82c7793bc --- a/components/clm/src/biogeochem/PhosphorusFluxType.F90 +++ b/components/clm/src/biogeochem/PhosphorusFluxType.F90 @@ -75,6 +75,13 @@ module PhosphorusFluxType real(r8), pointer :: harvest_p_to_litr_lig_p_col (:,:) ! col P fluxes associated with harvest to litter lignin pool (gP/m3/s) real(r8), pointer :: harvest_p_to_cwdp_col (:,:) ! col P fluxes associated with harvest to CWD pool (gP/m3/s) + ! crop harvest + real(r8), pointer :: hrv_leafp_to_prod1p_patch (:) ! crop leafp harvested (gP/m2/s) + real(r8), pointer :: hrv_livestemp_to_prod1p_patch (:) ! crop stemp harvested (gP/m2/s) + real(r8), pointer :: hrv_grainp_to_prod1p_patch (:) ! crop grain harvested (gP/m2/s) + real(r8), pointer :: hrv_cropp_to_prod1p_patch (:) ! total amount of crop P harvested (gP/m2/s) + real(r8), pointer :: hrv_cropp_to_prod1p_col (:) ! crop P harvest mortality to 1-yr product pool (gP/m2/s) + ! fire P fluxes real(r8), pointer :: m_decomp_ppools_to_fire_vr_col (:,:,:) ! col vertically-resolved decomposing P fire loss (gP/m3/s) real(r8), pointer :: m_decomp_ppools_to_fire_col (:,:) ! col vertically-integrated (diagnostic) decomposing P fire loss (gP/m2/s) @@ -387,6 +394,10 @@ subroutine InitAllocate(this, bounds) allocate(this%hrv_livestemp_to_litter_patch (begp:endp)) ; this%hrv_livestemp_to_litter_patch (:) = nan allocate(this%hrv_deadstemp_to_prod10p_patch (begp:endp)) ; this%hrv_deadstemp_to_prod10p_patch (:) = nan allocate(this%hrv_deadstemp_to_prod100p_patch (begp:endp)) ; this%hrv_deadstemp_to_prod100p_patch (:) = nan + allocate(this%hrv_leafp_to_prod1p_patch (begp:endp)) ; this%hrv_leafp_to_prod1p_patch (:) = nan + allocate(this%hrv_livestemp_to_prod1p_patch (begp:endp)) ; this%hrv_livestemp_to_prod1p_patch (:) = nan + allocate(this%hrv_grainp_to_prod1p_patch (begp:endp)) ; this%hrv_grainp_to_prod1p_patch (:) = nan + allocate(this%hrv_cropp_to_prod1p_patch (begp:endp)) ; this%hrv_cropp_to_prod1p_patch (:) = nan allocate(this%hrv_livecrootp_to_litter_patch (begp:endp)) ; this%hrv_livecrootp_to_litter_patch (:) = nan allocate(this%hrv_deadcrootp_to_litter_patch (begp:endp)) ; this%hrv_deadcrootp_to_litter_patch (:) = nan allocate(this%hrv_retransp_to_litter_patch (begp:endp)) ; this%hrv_retransp_to_litter_patch (:) = nan @@ -486,6 +497,7 @@ subroutine InitAllocate(this, bounds) allocate(this%fert_p_to_sminp_col (begc:endc)) ; this%fert_p_to_sminp_col (:) = nan allocate(this%hrv_deadstemp_to_prod10p_col (begc:endc)) ; this%hrv_deadstemp_to_prod10p_col (:) = nan allocate(this%hrv_deadstemp_to_prod100p_col (begc:endc)) ; this%hrv_deadstemp_to_prod100p_col (:) = nan + allocate(this%hrv_cropp_to_prod1p_col (begc:endc)) ; this%hrv_cropp_to_prod1p_col (:) = nan allocate(this%sminp_to_plant_col (begc:endc)) ; this%sminp_to_plant_col (:) = nan allocate(this%potential_immob_p_col (begc:endc)) ; this%potential_immob_p_col (:) = nan allocate(this%actual_immob_p_col (begc:endc)) ; this%actual_immob_p_col (:) = nan @@ -1413,7 +1425,7 @@ subroutine InitHistory(this, bounds) this%prod1p_loss_col(begc:endc) = spval call hist_addfld1d (fname='PROD1P_LOSS', units='gP/m^2/s', & avgflag='A', long_name='loss from 1-yr crop product pool', & - ptr_col=this%prod100p_loss_col) + ptr_col=this%prod1p_loss_col) this%product_ploss_col(begc:endc) = spval call hist_addfld1d (fname='PRODUCT_PLOSS', units='gP/m^2/s', & @@ -1784,6 +1796,10 @@ subroutine SetValues ( this, & this%hrv_livestemp_to_litter_patch(i) = value_patch this%hrv_deadstemp_to_prod10p_patch(i) = value_patch this%hrv_deadstemp_to_prod100p_patch(i) = value_patch + this%hrv_leafp_to_prod1p_patch(i) = value_patch + this%hrv_livestemp_to_prod1p_patch(i) = value_patch + this%hrv_grainp_to_prod1p_patch(i) = value_patch + this%hrv_cropp_to_prod1p_patch(i) = value_patch this%hrv_livecrootp_to_litter_patch(i) = value_patch this%hrv_deadcrootp_to_litter_patch(i) = value_patch this%hrv_retransp_to_litter_patch(i) = value_patch @@ -1942,6 +1958,7 @@ subroutine SetValues ( this, & this%fert_p_to_sminp_col(i) = value_column this%hrv_deadstemp_to_prod10p_col(i) = value_column this%hrv_deadstemp_to_prod100p_col(i) = value_column + this%hrv_cropp_to_prod1p_col(i) = value_column this%prod10p_loss_col(i) = value_column this%prod100p_loss_col(i) = value_column this%product_ploss_col(i) = value_column @@ -2098,7 +2115,8 @@ subroutine Summary(this, bounds, num_soilc, filter_soilc, num_soilp, filter_soil ! !USES: use clm_varpar , only: nlevdecomp,ndecomp_cascade_transitions,ndecomp_pools use clm_varctl , only: use_nitrif_denitrif - use subgridAveMod , only: p2c + use subgridAveMod , only: p2c + use pftvarcon , only: npcropmin ! pflotran ! use clm_varctl , only: use_pflotran, pf_cmode ! @@ -2128,6 +2146,11 @@ subroutine Summary(this, bounds, num_soilc, filter_soilc, num_soilp, filter_soil this%wood_harvestp_patch(p) = & this%hrv_deadstemp_to_prod10p_patch(p) + & this%hrv_deadstemp_to_prod100p_patch(p) + if ( crop_prog .and. pft%itype(p) >= npcropmin )then + this%wood_harvestp_patch(p) = & + this%wood_harvestp_patch(p) + & + this%hrv_cropp_to_prod1p_patch(p) + end if ! total pft-level fire P losses this%fire_ploss_patch(p) = & @@ -2286,7 +2309,7 @@ subroutine Summary(this, bounds, num_soilc, filter_soilc, num_soilp, filter_soil this%product_ploss_col(c) = & this%prod10p_loss_col(c) + & this%prod100p_loss_col(c) + & - this%prod1p_loss_col(c) + this%prod1p_loss_col(c) end do ! add up all vertical transport tendency terms and calculate total som leaching loss as the sum of these diff --git a/components/clm/src/biogeochem/PhosphorusStateType.F90 b/components/clm/src/biogeochem/PhosphorusStateType.F90 old mode 100644 new mode 100755 index 607e85a6d8ff..60c56819743d --- a/components/clm/src/biogeochem/PhosphorusStateType.F90 +++ b/components/clm/src/biogeochem/PhosphorusStateType.F90 @@ -66,6 +66,7 @@ module PhosphorusStateType ! wood product pools, for dynamic landcover real(r8), pointer :: seedp_col (:) ! col (gP/m2) column-level pool for seeding new Patches + real(r8), pointer :: prod1p_col (:) ! col (gN/m2) crop product N pool, 1-year lifespan real(r8), pointer :: prod10p_col (:) ! col (gP/m2) wood product P pool, 10-year lifespan real(r8), pointer :: prod100p_col (:) ! col (gP/m2) wood product P pool, 100-year lifespan real(r8), pointer :: totprodp_col (:) ! col (gP/m2) total wood product P @@ -233,6 +234,7 @@ subroutine InitAllocate(this, bounds) allocate(this%sminp_col (begc:endc)) ; this%sminp_col (:) = nan allocate(this%ptrunc_col (begc:endc)) ; this%ptrunc_col (:) = nan allocate(this%seedp_col (begc:endc)) ; this%seedp_col (:) = nan + allocate(this%prod1p_col (begc:endc)) ; this%prod1p_col (:) = nan allocate(this%prod10p_col (begc:endc)) ; this%prod10p_col (:) = nan allocate(this%prod100p_col (begc:endc)) ; this%prod100p_col (:) = nan allocate(this%totprodp_col (begc:endc)) ; this%totprodp_col (:) = nan @@ -629,6 +631,11 @@ subroutine InitHistory(this, bounds) avgflag='A', long_name='100-yr wood product P', & ptr_col=this%prod100p_col, default='inactive') + this%prod1p_col(begc:endc) = spval + call hist_addfld1d (fname='PROD1P', units='gP/m^2', & + avgflag='A', long_name='1-yr crop product P', & + ptr_col=this%prod1p_col, default='inactive') + this%totprodp_col(begc:endc) = spval call hist_addfld1d (fname='TOTPRODP', units='gP/m^2', & avgflag='A', long_name='total wood product P', & @@ -832,6 +839,7 @@ subroutine InitCold(this, bounds, & ! dynamic landcover state variables this%seedp_col(c) = 0._r8 + this%prod1p_col(c) = 0._r8 this%prod10p_col(c) = 0._r8 this%prod100p_col(c) = 0._r8 this%totprodp_col(c) = 0._r8 @@ -845,6 +853,7 @@ subroutine InitCold(this, bounds, & c = special_col(fc) this%seedp_col(c) = 0._r8 + this%prod1p_col(c) = 0._r8 this%prod10p_col(c) = 0._r8 this%prod100p_col(c) = 0._r8 this%totprodp_col(c) = 0._r8 @@ -1148,6 +1157,10 @@ subroutine Restart ( this, bounds, ncid, flag, cnstate_vars) dim1name='column', long_name='', units='', & interpinic_flag='interp', readvar=readvar, data=this%prod100p_col) + call restartvar(ncid=ncid, flag=flag, varname='prod1p', xtype=ncd_double, & + dim1name='column', long_name='', units='', & + interpinic_flag='interp', readvar=readvar, data=this%prod1p_col) + ! decomp_cascade_state - the purpose of this is to check to make sure the bgc used ! matches what the restart file was generated with. ! add info about the SOM decomposition cascade @@ -1707,6 +1720,7 @@ subroutine Summary(this, bounds, num_soilc, filter_soilc, num_soilp, filter_soil ! total wood product phosphorus this%totprodp_col(c) = & + this%prod1p_col(c) + & this%prod10p_col(c) + & this%prod100p_col(c) diff --git a/components/clm/src/biogeophys/TemperatureType.F90 b/components/clm/src/biogeophys/TemperatureType.F90 old mode 100644 new mode 100755 index 800303db14b7..dbf492312c4b --- a/components/clm/src/biogeophys/TemperatureType.F90 +++ b/components/clm/src/biogeophys/TemperatureType.F90 @@ -1049,7 +1049,7 @@ subroutine InitAccVars(this, bounds) end if if ( use_ed ) then - write(iulog,*) 'SPM before this one line 1040 ' +! write(iulog,*) 'SPM before this one line 1040 ' call extract_accum_field ('ED_GDD0', rbufslp, nstep) this%gdd0_patch(begp:endp) = rbufslp(begp:endp) end if @@ -1285,7 +1285,7 @@ subroutine UpdateAccVars (this, EDbio_vars, bounds) rbufslp(p) = 0._r8 ! keeps gdd unchanged at other times (eg, through Dec in NH) end if end do - write(iulog,*) 'SPM before this one line 1258 ' +! write(iulog,*) 'SPM before this one line 1258 ' call update_accum_field ('GDD0', rbufslp, nstep) call extract_accum_field ('GDD0', this%gdd0_patch, nstep)