Skip to content

Commit 2481382

Browse files
Merge branch 'evasinha/lnd/add_winter_wheat_ylu' (PR #6986)
This feature adds new parameterizations to represent winter wheat crop in ELM. The implementation is based on Yaqiong Lu’s implementation of winter wheat in CLM4.5. https://doi.org/10.5194/gmd-10-1873-2017 The model was calibrated using the methodology used in Sinha et al. 2022. https://doi.org/10.1029/2022MS003171 [non BFB] for Crops
2 parents 3ed0f5a + e99a26d commit 2481382

File tree

9 files changed

+281
-103
lines changed

9 files changed

+281
-103
lines changed

cime_config/tests.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
"ERS_D.f19_f19.IELM.elm-ic_f19_f19_ielm",
7373
"ERS_D.f09_g16.I1850ELMCN",
7474
"ERS_D.ne4pg2_oQU480.I20TRELM.elm-disableDynpftCheck",
75-
"SMS_Ly2_P1x1_D.1x1_smallvilleIA.IELMCNCROP.elm-lulcc_sville",
7675
"ERS_D.f19_g16.I1850GSWCNPRDCTCBC.elm-ctc_f19_g16_I1850GSWCNPRDCTCBC",
7776
"ERS_D.f09_f09.IELM.elm-solar_rad",
7877
"ERS_D.f09_f09.IELM.elm-koch_snowflake",
@@ -87,12 +86,13 @@
8786
"ERS.f19_f19.I1850ELMCN",
8887
"ERS.f19_f19.I20TRELMCN",
8988
"SMS_Ld1.hcru_hcru.I1850CRUELMCN",
90-
"SMS_Ly2_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-force_netcdf_pio",
89+
"SMS_Ly1_P1x1.1x1_smallvilleIA.I20TRGSWCNPCROP.elm-lulcc_sville",
90+
"SMS_Ly5_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-force_netcdf_pio",
9191
"ERS.f19_g16.I1850ELM.elm-betr",
9292
"ERS.f19_g16.I1850ELM.elm-vst",
9393
"ERS.f09_g16.I1850ELMCN.elm-bgcinterface",
9494
"SMS.r05_r05.I1850ELMCN.elm-qian_1948",
95-
"SMS_Ly2_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-per_crop",
95+
"SMS_Ly5_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-per_crop",
9696
"SMS_Ly2_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-fan",
9797
"SMS.r05_r05.IELM.elm-topounit",
9898
"SMS.r05_r05.IELM.elm-topounit_im2",
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
hist_mfilt = 1, 1
2+
hist_nhtfrq = 0, 0
3+
hist_dov2xy = .true., .false.
4+
hist_fincl2 = 'GPP', 'ER', 'NEE', 'NPP', 'NBP', 'TOTSOMC', 'DMYIELD', 'PLANTDAY', 'HARVESTDAY'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
./xmlchange ELM_BLDNML_OPTS="-irrig .true." -append
22
if [ `./xmlquery --value MACH` == chrysalis ]; then ./xmlchange FORCE_BUILD_SMP=TRUE; fi
3+
./xmlchange JOB_WALLCLOCK_TIME=2:00:00

components/elm/cime_config/testdefs/testmods_dirs/elm/lulcc_sville/user_nl_elm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ flanduse_timeseries = '$DIN_LOC_ROOT/lnd/clm2/surfdata_map/landuse.timeseries_1x
22
fsurdat = '$DIN_LOC_ROOT/lnd/clm2/surfdata_map/surfdata_1x1_smallvilleIA_mp50_simyr2000_c230905.nc'
33

44
check_dynpft_consistency = .false.
5+
hist_mfilt = 1, 1
6+
hist_nhtfrq = 0, 0
7+
hist_dov2xy = .true., .false.
8+
hist_fincl2 = 'GPP', 'ER', 'NEE', 'NPP', 'NBP', 'TOTSOMC', 'DMYIELD', 'PLANTDAY', 'HARVESTDAY'
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
fsurdat = '$DIN_LOC_ROOT/lnd/clm2/surfdata_map/surfdata_1x1_smallvilleIA_mp50_simyr2000_miscanthus_c230905.nc'
22
do_budgets = .false.
3+
hist_mfilt = 1, 1
4+
hist_nhtfrq = 0, 0
5+
hist_dov2xy = .true., .false.
6+
hist_fincl2 = 'GPP', 'ER', 'NEE', 'NPP', 'NBP', 'TOTSOMC', 'DMYIELD', 'PLANTDAY', 'HARVESTDAY'

components/elm/src/biogeochem/AllocationMod.F90

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
386386
use elm_varctl , only : carbonphosphorus_only!
387387
use pftvarcon , only: npcropmin, declfact, bfact, aleaff, arootf, astemf, noveg
388388
use pftvarcon , only: arooti, fleafi, allconsl, allconss, grperc, grpnow, nsoybean
389-
use pftvarcon , only: iscft, percrop
389+
use pftvarcon , only: iscft, percrop, nwcereal, nwcerealirrig
390390
use elm_varpar , only: nlevdecomp
391391
use elm_varcon , only: nitrif_n2o_loss_frac, secspday
392392
!
@@ -423,6 +423,8 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
423423
!! Local P variables
424424
real(r8):: cpl,cpfr,cplw,cpdw,cpg !C:N ratios for leaf, fine root, and wood
425425
real(r8):: puptake_prof(bounds%begc:bounds%endc, 1:nlevdecomp)
426+
integer, parameter :: cphase_gf = 3 !Crop phenology phase grain fill
427+
integer, parameter :: max_lai = 1 !Maximum allowed lai
426428

427429

428430
!-----------------------------------------------------------------------
@@ -456,6 +458,8 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
456458

457459
hui => crop_vars%gddplant_patch , & ! Input: [real(r8) (:) ] =gdd since planting (gddplant)
458460
leafout => crop_vars%gddtsoi_patch , & ! Input: [real(r8) (:) ] =gdd from top soil layer temperature
461+
vf => crop_vars%vf_patch , & ! Output: [real(r8) (:) ] vernalization factor
462+
cphase => crop_vars%cphase_patch , & ! Output: [real(r8) (:) ] phenology phase
459463

460464
xsmrpool => veg_cs%xsmrpool , & ! Input: [real(r8) (:) ] (gC/m2) temporary photosynthate C pool
461465
leafc => veg_cs%leafc , & ! Input: [real(r8) (:) ]
@@ -689,7 +693,7 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
689693
! allocation rules for crops based on maturity and linear decrease
690694
! of amount allocated to roots over course of the growing season
691695

692-
if (peaklai(p) == 1) then ! lai at maximum allowed
696+
if (peaklai(p) == max_lai) then ! lai at maximum allowed
693697
arepr(p) = 0._r8
694698
aleaf(p) = 1.e-5_r8
695699
aroot(p) = max(0._r8, min(1._r8, arooti(ivt(p)) - &
@@ -717,6 +721,13 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
717721
aleafi(p) = aleaf(p) ! to reproductive phenology stage begins
718722
grain_flag(p) = 0._r8 ! setting to 0 while in phase 2
719723

724+
! Added based on Yaqiong Lu et al., 2017 in Geosci. Model Dev.
725+
! when peaklai==1, astem=0 and then astemi=0, so the astem in phase 3 will
726+
! equal to 0 and therefore resulted a very large arepr and grainc
727+
if(peaklai(p)==max_lai .and. (ivt(p) == nwcereal .or. ivt(p) == nwcerealirrig)) then
728+
astemi(p)=0.8_r8
729+
end if
730+
720731
! Phase 2 completed:
721732
! ==================
722733
! shift allocation either when enough gdd are accumulated or maximum number
@@ -757,7 +768,7 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
757768
!would be bypassed altogether, not the intended outcome. I checked several of my output files and
758769
!they all seemed to be going through the retranslocation loop for soybean - good news.
759770

760-
if (ivt(p) /= nsoybean .or. astem(p) == astemf(ivt(p)) .or. peaklai(p) == 1._r8) then
771+
if (ivt(p) /= nsoybean .or. astem(p) == astemf(ivt(p)) .or. peaklai(p) == max_lai) then
761772
if (grain_flag(p) == 0._r8) then
762773
t1 = 1 / dt
763774
leafn_to_retransn(p) = t1 * ((leafc(p) / leafcn(ivt(p))) - (leafc(p) / &
@@ -775,6 +786,12 @@ subroutine Allocation1_PlantNPDemand (bounds, num_soilc, filter_soilc, num_soilp
775786

776787
arepr(p) = 1._r8 - aroot(p) - astem(p) - aleaf(p)
777788

789+
! Added based on Yaqiong Lu et al., 2017 in Geosci. Model Dev.
790+
if(cphase(p) == cphase_gf .and. (ivt(p) == nwcereal .or. ivt(p) == nwcerealirrig)) then
791+
arepr(p) = arepr(p) * vf(p)
792+
aroot(p) = 1._r8 - aleaf(p) - astem(p) - arepr(p)
793+
end if
794+
778795
else ! pre emergence
779796
aleaf(p) = 1.e-5_r8 ! allocation coefficients should be irrelevant
780797
astem(p) = 0._r8 ! because crops have no live carbon pools;

components/elm/src/biogeochem/CropType.F90

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ module CropType
3838
logical , pointer :: croplive_patch (:) ! patch Flag, true if planted, not harvested
3939
logical , pointer :: cropplant_patch (:) ! patch Flag, true if planted
4040
integer , pointer :: harvdate_patch (:) ! patch harvest date
41+
real(r8), pointer :: rateh_patch (:) ! increase of tolerance caused by cold hardening index
42+
real(r8), pointer :: rated_patch (:) ! loss of tolerance caused by dehardening
43+
real(r8), pointer :: rates_patch (:) ! loss of tolerance caused by low temperature
44+
real(r8), pointer :: rater_patch (:) ! loss of tolerance caused by respiration under snow
45+
real(r8), pointer :: lt50_patch (:) ! the lethal temperature at which 50% of the individuals are damaged
46+
real(r8), pointer :: fsurv_patch (:) ! winter wheat survival rate
47+
real(r8), pointer :: accfsurv_patch (:) ! accumulated winter wheat survival rate
48+
real(r8), pointer :: countfsurv_patch (:) ! count of accumulated winter wheat survival rate
49+
real(r8), pointer :: wdd_patch (:) ! winter wheat weighted cumulated degree days
50+
real(r8), pointer :: tcrown_patch (:) ! crown temperature
4151
real(r8), pointer :: fertnitro_patch (:) ! patch fertilizer nitrogen
4252
real(r8), pointer :: fertphosp_patch (:) ! patch fertilizer phosphorus
4353
real(r8), pointer :: gddplant_patch (:) ! patch accum gdd past planting date for crop (ddays)
@@ -128,6 +138,16 @@ subroutine InitAllocate(this, bounds)
128138
allocate(this%croplive_patch (begp:endp)) ; this%croplive_patch (:) = .false.
129139
allocate(this%cropplant_patch (begp:endp)) ; this%cropplant_patch (:) = .false.
130140
allocate(this%harvdate_patch (begp:endp)) ; this%harvdate_patch (:) = huge(1)
141+
allocate(this%rateh_patch (begp:endp)) ; this%rateh_patch (:) = spval
142+
allocate(this%rated_patch (begp:endp)) ; this%rated_patch (:) = spval
143+
allocate(this%rates_patch (begp:endp)) ; this%rates_patch (:) = spval
144+
allocate(this%rater_patch (begp:endp)) ; this%rater_patch (:) = spval
145+
allocate(this%lt50_patch (begp:endp)) ; this%lt50_patch (:) = spval
146+
allocate(this%fsurv_patch (begp:endp)) ; this%fsurv_patch (:) = spval
147+
allocate(this%accfsurv_patch (begp:endp)) ; this%accfsurv_patch (:) = spval
148+
allocate(this%countfsurv_patch (begp:endp)) ; this%countfsurv_patch (:) = spval
149+
allocate(this%wdd_patch (begp:endp)) ; this%wdd_patch (:) = spval
150+
allocate(this%tcrown_patch (begp:endp)) ; this%tcrown_patch (:) = spval
131151
allocate(this%fertnitro_patch (begp:endp)) ; this%fertnitro_patch (:) = spval
132152
allocate(this%fertphosp_patch (begp:endp)) ; this%fertphosp_patch (:) = spval
133153
allocate(this%gddplant_patch (begp:endp)) ; this%gddplant_patch (:) = spval
@@ -669,7 +689,8 @@ subroutine UpdateAccVars(this, bounds, temperature_vars)
669689
rbufslp(p) = max(0._r8, min(mxtmp(ivt), &
670690
veg_es%t_ref2m(p)-(SHR_CONST_TKFRZ + baset(ivt)))) &
671691
* dtime/SHR_CONST_CDAY
672-
if (ivt == nwcereal .or. ivt == nwcerealirrig) then
692+
! Modified based on Yaqiong Lu et al., 2017 in Geosci. Model Dev.
693+
if ((ivt == nwcereal .or. ivt == nwcerealirrig) .and. this%cphase_patch(p) > 1) then
673694
rbufslp(p) = rbufslp(p)*this%vf_patch(p)
674695
end if
675696
else
@@ -691,9 +712,9 @@ subroutine UpdateAccVars(this, bounds, temperature_vars)
691712
((col_es%t_soisno(c,1)*col_pp%dz(c,1) + &
692713
col_es%t_soisno(c,2)*col_pp%dz(c,2))/(col_pp%dz(c,1)+col_pp%dz(c,2))) - &
693714
(SHR_CONST_TKFRZ + baset(ivt)))) * dtime/SHR_CONST_CDAY
694-
if (ivt == nwcereal .or. ivt == nwcerealirrig) then
695-
rbufslp(p) = rbufslp(p)*this%vf_patch(p)
696-
end if
715+
! Removed rbufslp modification based on Yaqiong Lu et al., 2017 in Geosci. Model Dev.
716+
! Removed the vf control on gddtsoil, because the vernalization
717+
! occurs after leaf emerge and end at flowering
697718
else
698719
rbufslp(p) = accumResetVal
699720
end if

0 commit comments

Comments
 (0)