diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml index 2752f17214..bdd946be8e 100644 --- a/bld/namelist_files/namelist_defaults_ctsm.xml +++ b/bld/namelist_files/namelist_defaults_ctsm.xml @@ -393,8 +393,8 @@ attributes from the config_cache.xml file (with keys converted to upper-case). -lnd/clm2/paramdata/clm5_params.c200402.nc -lnd/clm2/paramdata/clm_params.c200402.nc +lnd/clm2/paramdata/clm5_params.c200519.nc +lnd/clm2/paramdata/clm_params.c200519.nc @@ -781,7 +781,7 @@ lnd/clm2/surfdata_map/release-clm5.0.18/surfdata_4x5_hist_78pfts_CMIP6_simyr2000 lnd/clm2/surfdata_map/release-clm5.0.18/surfdata_1x1_numaIA_hist_78pfts_CMIP6_simyr2000_c190214.nc -lnd/clm2/surfdata_map/release-clm5.0.18/surfdata_1x1_smallvilleIA_hist_78pfts_CMIP6_simyr2000_c190214.nc +lnd/clm2/surfdata_map/ctsm1.0.dev094-2-g633be0eb/surfdata_1x1_smallvilleIA_hist_78pfts_CMIP6_simyr2000_c200521.nc lnd/clm2/surfdata_map/release-clm5.0.18/surfdata_ne30np4_hist_78pfts_CMIP6_simyr2000_c190303.nc diff --git a/cime_config/SystemTests/ssp.py b/cime_config/SystemTests/ssp.py index 892128ba5e..26337d323d 100644 --- a/cime_config/SystemTests/ssp.py +++ b/cime_config/SystemTests/ssp.py @@ -83,7 +83,14 @@ def run_phase(self): rest_path = os.path.join(dout_sr, "rest", "{}-{}".format(refdate, refsec)) for item in glob.glob("{}/*{}*".format(rest_path, refdate)): - os.symlink(item, os.path.join(rundir, os.path.basename(item))) + link_name = os.path.join(rundir, os.path.basename(item)) + if os.path.islink(link_name) and os.readlink(link_name) == item: + # Link is already set up correctly: do nothing + # (os.symlink raises an exception if you try to replace an + # existing file) + pass + else: + os.symlink(item, link_name) for item in glob.glob("{}/*rpointer*".format(rest_path)): shutil.copy(item, rundir) diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml index 7b7e4e060e..938b10be53 100644 --- a/cime_config/testdefs/ExpectedTestFails.xml +++ b/cime_config/testdefs/ExpectedTestFails.xml @@ -33,7 +33,7 @@ FAIL - #158 + #203 diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml index d8e5bf02ff..58a7e4344c 100644 --- a/cime_config/testdefs/testlist_clm.xml +++ b/cime_config/testdefs/testlist_clm.xml @@ -348,7 +348,7 @@ - + @@ -905,13 +905,22 @@ - + - + + + + + + + + + + diff --git a/cime_config/testdefs/testmods_dirs/clm/cropColdStart/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/cropColdStart/include_user_mods deleted file mode 100644 index fe0e18cf88..0000000000 --- a/cime_config/testdefs/testmods_dirs/clm/cropColdStart/include_user_mods +++ /dev/null @@ -1 +0,0 @@ -../default diff --git a/cime_config/testdefs/testmods_dirs/clm/cropColdStart/shell_commands b/cime_config/testdefs/testmods_dirs/clm/cropColdStart/shell_commands deleted file mode 100755 index 2a9f09bd75..0000000000 --- a/cime_config/testdefs/testmods_dirs/clm/cropColdStart/shell_commands +++ /dev/null @@ -1 +0,0 @@ -./xmlchange CLM_FORCE_COLDSTART="on" diff --git a/doc/ChangeLog b/doc/ChangeLog index 469769ba28..ef1b03e5c9 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,4 +1,193 @@ =============================================================== +Tag name: ctsm1.0.dev097 +Originator(s): ycheng (Yanyan Cheng) +Date: Mon May 25 15:14:56 MDT 2020 +One-line Summary: Add two bioenergy crops (switchgrass and miscanthus) + +Purpose of changes +------------------ + +Main change is from Yanyan Cheng: adding parameters and code for two +bioenergy crops, switchgrass and miscanthus. Along with this, there is a +new potential flux from crop leaves and stems to the crop product pool +at harvest, representing biofuel products; a new pft-specific parameter +controls this flux (biofuel_harvfrac). Currently, the out-of-the-box +surface datasets do not specify any area for these crops, but the new +parameter file will allow them to be present if specified on the surface +dataset or landuse_timeseries file. Note that this is only an option for +CLM5.0, NOT for CLM4.5. (See https://github.com/ESCOMP/CTSM/pull/884 for +details.) + +Also, some minor fixes from Bill Sacks: See notes under "bugs fixed" +below. + +Bugs fixed or introduced +------------------------ + +Issues fixed (include CTSM Issue #): +- Resolves ESCOMP/CTSM#203 - Fixes creation of harvest-related variables + on surface datasets created with the all_veg option - smallville, + PTCLM, etc. (documented in https://github.com/ESCOMP/CTSM/pull/1019) +- Resolves ESCOMP/CTSM#930 - Makes gindex_ocn intent(inout) rather than + intent(out) +- Resolves ESCOMP/CTSM#1021 - Changes SSP test to only do symlink if + needed + +Significant changes to scientifically-supported configurations +-------------------------------------------------------------- + +Does this tag change answers significantly for any of the following physics configurations? +(Details of any changes will be given in the "Answer changes" section below.) + + [Put an [X] in the box for any configuration with significant answer changes.] + +[ ] clm5_0 + +[ ] ctsm5_0-nwp + +[ ] clm4_5 + +Notes of particular relevance for users +--------------------------------------- + +Caveats for users (e.g., need to interpolate initial conditions): +- For transient crop cases, now more crops in memory. This creates a + need for interpolation of initial conditions for initial conditions + generated from a transient case. + +Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables): none + +Changes made to namelist defaults (e.g., changed parameter values): +- Changed parameter values for switchgrass and miscanthus (only for clm5.0) +- New pft-specific parameter, biofuel_harvfrac (for both clm4.5 and clm5.0) + +Changes to the datasets (e.g., parameter, surface or initial files): +- New parameter files with the above changes + +Substantial timing or memory changes: none + +Notes of particular relevance for developers: (including Code reviews and testing) +--------------------------------------------- +NOTE: Be sure to review the steps in README.CHECKLIST.master_tags as well as the coding style in the Developers Guide + +Caveats for developers (e.g., code that is duplicated that requires double maintenance): none + +Changes to tests or testing: +- Changed smallville ERS_Lm20 test to be cold start (see comment in + commit 8368f222 for details) +- Added a multi-year smallville test that includes these new crops + +Code reviewed by: Bill Sacks, Danica Lombardozzi + + +CTSM testing: + + [PASS means all tests PASS and OK means tests PASS other than expected fails.] + + build-namelist tests: + + cheyenne - not run + + tools-tests (test/tools): + + cheyenne - ok + + Pass except for expected baseline failures + + Ran on 633be0eb, with comparison against ctsm1.0.dev095; tests pass + except these expected baseline failures: + + 030 blf84 TBLscript_tools.sh PTCLM PTCLMmkdata PTCLM_USUMB_clm4_5^buildtools ....................\c + rc=7 FAIL + + 032 blfc4 TBLscript_tools.sh PTCLM PTCLMmkdata PTCLM_USUMB_Cycle_clm4_5^buildtools ..............\c + rc=7 FAIL + + Diffs for these are just in the harvest-related fields on the surface dataset, as expected. + + PTCLM testing (tools/shared/PTCLM/test): + + cheyenne - not run + + python testing (see instructions in python/README.md; document testing done): + + (any machine) - not run + + regular tests (aux_clm): + + cheyenne ---- ok + izumi ------- pass + + For cheyenne testing: a few tests had baseline failures. The + differences just arise in the h1 (vector) files, due to differences + in dimension sizes. These differences are expected. See below for + details. + + Ran most testing on 8309c213. Reran two SSP tests on 4665c9ce + +If the tag used for baseline comparisons was NOT the previous tag, note that here: + + +Answer changes +-------------- + +Changes answers relative to baseline: YES, but diagnostic only due to +change in dimension sizes - does not change answers in any meaningful +way + + If a tag changes answers relative to baseline comparison the + following should be filled in (otherwise remove this section): + + Summarize any changes to answers, i.e., + - what code configurations: Transient CLM50 cases with crops; just + changes dimensions on vector (h1) history files + - what platforms/compilers: All + - nature of change (roundoff; larger than roundoff/same climate; new climate): + diagnostic change only + + Differences were observed in the following tests: + + ERS_Ly3_Mmpi-serial.1x1_smallvilleIA.IHistClm50BgcCropQianGs.cheyenne_gnu.clm-cropMonthOutput + SMS_Ld5.f10_f10_musgs.ISSP245Clm50BgcCrop.cheyenne_gnu.clm-ciso_dec2050Start + SMS_Ld5.f10_f10_musgs.ISSP370Clm50BgcCrop.cheyenne_gnu.clm-ciso_dec2050Start + ERP_D_Ld10_P36x2.f10_f10_musgs.IHistClm50BgcCrop.cheyenne_intel.clm-ciso_decStart + ERP_D_Ld5.f10_f10_musgs.IHistClm50BgcCrop.cheyenne_intel.clm-allActive + ERP_Ly3_P72x2.f10_f10_musgs.IHistClm50BgcCrop.cheyenne_intel.clm-cropMonthOutput + ERS_D_Ld7_Mmpi-serial.1x1_smallvilleIA.IHistClm50BgcCropGs.cheyenne_intel.clm-decStart1851_noinitial + ERS_Ly3_P72x2.f10_f10_musgs.IHistClm50BgcCropG.cheyenne_intel.clm-cropMonthOutput + ERS_Ly5_P144x1.f10_f10_musgs.IHistClm50BgcCrop.cheyenne_intel.clm-cropMonthOutput + ERS_Ly6_Mmpi-serial.1x1_smallvilleIA.IHistClm50BgcCropQianGs.cheyenne_intel.clm-cropMonthOutput + LCISO_Lm13.f10_f10_musgs.IHistClm50BgcCrop.cheyenne_intel.clm-ciso_monthly + SMS_Ld5.f10_f10_musgs.ISSP585Clm50BgcCrop.cheyenne_intel.clm-ciso_dec2050Start + + The differences just arise in the h1 files, due to differences in + dimension sizes. I reran these tests with a paramfile where I + reverted the mergeToPft variable; then they were all bfb with + master. + + Other than this, there were FIELDLIST differences, as expected. + + If bitwise differences were observed, how did you show they were no worse + than roundoff? N/A + + If this tag changes climate describe the run(s) done to evaluate the new + climate (put details of the simulations in the experiment database) + - casename: N/A + + URL for LMWG diagnostics output used to validate new climate: N/A + + +Detailed list of changes +------------------------ + +List any externals directories updated (cime, rtm, mosart, cism, fates, etc.): none + +Pull Requests that document the changes (include PR ids): +- https://github.com/ESCOMP/CTSM/pull/884 +- https://github.com/ESCOMP/CTSM/pull/1019 + +=============================================================== +=============================================================== Tag name: ctsm1.0.dev096 Originator(s): slevis (Samuel Levis,SLevis Consulting LLC,303-665-1310) Date: Thu May 21 19:18:24 MDT 2020 diff --git a/doc/ChangeSum b/doc/ChangeSum index d5d77f901d..70151ec457 100644 --- a/doc/ChangeSum +++ b/doc/ChangeSum @@ -1,5 +1,6 @@ Tag Who Date Summary ============================================================================================================================ + ctsm1.0.dev097 ycheng 05/25/2020 Add two bioenergy crops (switchgrass and miscanthus) ctsm1.0.dev096 slevis 05/21/2020 Gridcell-level balance checks for carbon and nitrogen ctsm1.0.dev095 sacks 05/21/2020 Update cime and cmeps externals; rework initialization of CNFire object ctsm1.0.dev094 sacks 05/15/2020 Minor bug fixes needed for latest cime diff --git a/doc/source/tech_note/CN_Allocation/CLM50_Tech_Note_CN_Allocation.rst b/doc/source/tech_note/CN_Allocation/CLM50_Tech_Note_CN_Allocation.rst index 25b2215e81..e85a59439f 100644 --- a/doc/source/tech_note/CN_Allocation/CLM50_Tech_Note_CN_Allocation.rst +++ b/doc/source/tech_note/CN_Allocation/CLM50_Tech_Note_CN_Allocation.rst @@ -186,7 +186,15 @@ favorable growth environments (Allen et al., 2005; Vanninen and Makela, +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ | Soybean I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 | +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ - + | Miscanthus R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 | + +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ + | Miscanthus I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 | + +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ + | Switchgrass R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 | + +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ + | Switchgrass I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 | + +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+ + Carbon to nitrogen ratios are defined for different tissue types as follows: diff --git a/doc/source/tech_note/CN_Pools/CLM50_Tech_Note_CN_Pools.rst b/doc/source/tech_note/CN_Pools/CLM50_Tech_Note_CN_Pools.rst index 9bddee21ca..77bd7af415 100644 --- a/doc/source/tech_note/CN_Pools/CLM50_Tech_Note_CN_Pools.rst +++ b/doc/source/tech_note/CN_Pools/CLM50_Tech_Note_CN_Pools.rst @@ -116,5 +116,8 @@ stoichiometry are described in Chapter :numref:`rst_CN Allocation`. +----------------------------------+-------------------+ | Tropical Soybean | 20.00 | +----------------------------------+-------------------+ - + | Miscanthus | 25.00 | + +----------------------------------+-------------------+ + | Switchgrass | 25.00 | + +----------------------------------+-------------------+ diff --git a/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst b/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst index 3b8f07f44c..6fb9da4c55 100644 --- a/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst +++ b/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst @@ -40,9 +40,17 @@ refers to the interactive crop management model and is included as an option wit These updates appear in detail in the sections below. Many also appear in :ref:`Levis et al. (2016) `. + +Available new features since the CLM5 release +^^^^^^^^^^^^^^^^^^^ +- Addition of bioenergy crops + + + + .. _The crop model: -The crop model +The crop model: cash and bioenergy crops ------------------- Introduction @@ -102,18 +110,28 @@ Intercomparison Project (LUMIP), which is part of CMIP6 Land use timeseries (:ref:`Lawrence et al. 2016 `). For more details about how crop distributions are determined, see Chapter :numref:`rst_Transient Landcover Change`. -CLM5 includes eight actively managed crop types +CLM5 includes ten actively managed crop types (temperate soybean, tropical soybean, temperate corn, tropical -corn, spring wheat, cotton, rice, and sugarcane) that are chosen +corn, spring wheat, cotton, rice, sugarcane, miscanthus, and switchgrass) that are chosen based on the availability of corresponding algorithms in AgroIBIS and as developed by :ref:`Badger and Dirmeyer (2015)` and -described by :ref:`Levis et al. (2016)`. The representations of -sugarcane, rice, cotton, tropical corn, and tropical soy are new in CLM5. +described by :ref:`Levis et al. (2016)`, or from available observations +as described by :ref:`Cheng et al. (2019)`. +The representations of sugarcane, rice, cotton, tropical corn, and tropical soy are new in CLM5. +Miscanthus and switchgrass are added after the CLM5 release. Sugarcane and tropical corn are both C4 plants and are therefore represented using the temperate corn functional form. Tropical soybean uses the temperate soybean functional form, while rice and cotton use the wheat functional form. In tropical regions, parameter values were developed for the Amazon Basin, and planting date window is shifted by six months relative to the Northern Hemisphere. +Plantation areas of bioenergy crops are projected to expand throughout the 21st century as a major energy source to +replace fossil fuels and mitigate climate change. Miscanthus and switchgrass are perennial bioenergy crops and +have quite different physiological traits and land management practices than annual crops, +such as longer growing seasons, higher productivity, and lower demands for nutrients and water. +About 70% of biofuel aboveground biomass (leaf & livestem) is removed at harvest. Parameter values were developed by using +observation data collected at the University of Illinois Energy Farm +located in Central Midwestern United States (:ref:`Cheng et al., 2019`). + In addition, CLM’s default list of plant functional types (pfts) includes an irrigated and unirrigated unmanaged C3 crop (:numref:`Table Crop plant functional types`) treated as a second C3 grass. @@ -121,7 +139,7 @@ The unmanaged C3 crop is only used when the crop model is not active and has grid cell coverage assigned from satellite data, and the unmanaged C3 irrigated crop type is currently not used since irrigation requires the crop model to be active. -The default list of pfts also includes twenty-three inactive crop pfts +The default list of pfts also includes twenty-one inactive crop pfts that do not yet have associated parameters required for active management. Each of the inactive crop types is simulated using the parameters of the spatially closest associated crop type that is most similar to the functional type (e.g., C3 or C4), @@ -197,10 +215,10 @@ managed crop types that are using the same parameter set. 68 irrigated sugarcane active irrigated sugarcane 69 rainfed sunflower inactive rainfed spring wheat 70 irrigated sunflower inactive irrigated spring wheat - 71 rainfed miscanthus inactive rainfed tropical corn - 72 irrigated miscanthus inactive irrigated tropical corn - 73 rainfed switchgrass inactive rainfed tropical corn - 74 irrigated switchgrass inactive irrigated tropical corn + 71 rainfed miscanthus active rainfed miscanthus + 72 irrigated miscanthus active irrigated miscanthus + 73 rainfed switchgrass active rainfed switchgrass + 74 irrigated switchgrass active irrigated switchgrass 75 rainfed tropical corn active rainfed tropical corn 76 irrigated tropical corn active irrigated tropical corn 77 rainfed tropical soybean active rainfed tropical soybean @@ -347,27 +365,27 @@ Harvest occurs in one time step using the BGC leaf offset algorithm. .. table:: Crop phenology and morphology parameters for the active crop plant functional types (pfts) in CLM5BGCCROP. Numbers in the first row correspond to the list of pfts in :numref:`Table Crop plant functional types`. - =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== - \ temperate corn spring wheat temperatue soybean cotton rice sugarcane tropical corn tropical soybean - =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== - IVT 17, 18 19, 20 23, 24 41, 42 61, 62 67, 68 75, 76 77, 78 - :math:`Date_{planting}^{min}` April 1 April 1 May 1 April 1 Janurary 1 Janurary 1 March 20 April 15 - :math:`Date_{planting}^{max}` June 15 June 15 June 15 May 31 Feburary 28 March 31 April 15 June 31 - :math:`T_{p}`\(K) 283.15 280.15 286.15 294.15 294.15 294.15 294.15 294.15 - :math:`T_{p}^{ min }`\(K) 279.15 272.15 279.15 283.15 283.15 283.15 283.15 283.15 - :math:`{GDD}_{min}`\(ºdays) 50 50 50 50 50 50 50 50 - base temperature for GDD (ºC) 8 0 10 10 10 10 10 10 - :math:`{GDD}_{mat}`\(ºdays) 950-1850 :math:`\mathrm{\le}`\ 1700 :math:`\mathrm{\le}`\ 1900 :math:`\mathrm{\le}`\ 1700 :math:`\mathrm{\le}`\ 2100 950-1850 950-1850 :math:`\mathrm{\le}`\ 2100 - Phase 2 % :math:`{GDD}_{mat}` 0.03 0.05 0.03 0.03 0.01 0.03 0.03 0.03 - Phase 3 % :math:`{GDD}_{mat}` 0.65 0.6 0.5 0.5 0.4 0.65 0.5 0.5 - Harvest: days past planting :math:`\mathrm{\le}`\ 165 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 160 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 300 :math:`\mathrm{\le}`\ 160 :math:`\mathrm{\le}`\ 150 - :math:`z_{top}^{\max }` (m) 2.5 1.2 0.75 1.5 1.8 4 2.5 1 - SLA (m :sup:`2` leaf g :sup:`-1` C) 0.05 0.035 0.035 0.035 0.035 0.05 0.05 0.035 - :math:`\chi _{L}` index -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 - grperc 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 - flnr 0.293 0.41 0.41 0.41 0.41 0.293 0.293 0.41 - fcur 1 1 1 1 1 1 1 1 - =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== + =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== ========================== ========================== + \ temperate corn spring wheat temperate soybean cotton rice sugarcane tropical corn tropical soybean miscanthus switchgrass + =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== ========================== ========================== + IVT 17, 18 19, 20 23, 24 41, 42 61, 62 67, 68 75, 76 77, 78 71, 72 73, 74 + :math:`Date_{planting}^{min}` April 1 April 1 May 1 April 1 Janurary 1 Janurary 1 March 20 April 15 April 1 April 1 + :math:`Date_{planting}^{max}` June 15 June 15 June 15 May 31 Feburary 28 March 31 April 15 June 31 June 15 June 15 + :math:`T_{p}`\(K) 283.15 280.15 286.15 294.15 294.15 294.15 294.15 294.15 283.15 283.15 + :math:`T_{p}^{ min }`\(K) 279.15 272.15 279.15 283.15 283.15 283.15 283.15 283.15 279.15 279.15 + :math:`{GDD}_{min}`\(ºdays) 50 50 50 50 50 50 50 50 50 50 + base temperature for GDD (ºC) 8 0 10 10 10 10 10 10 8 8 + :math:`{GDD}_{mat}`\(ºdays) 950-1850 :math:`\mathrm{\le}`\ 1700 :math:`\mathrm{\le}`\ 1900 :math:`\mathrm{\le}`\ 1700 :math:`\mathrm{\le}`\ 2100 950-1850 950-1850 :math:`\mathrm{\le}`\ 2100 950-1850 950-1850 + Phase 2 % :math:`{GDD}_{mat}` 0.03 0.05 0.03 0.03 0.01 0.03 0.03 0.03 0.03 0.03 + Phase 3 % :math:`{GDD}_{mat}` 0.65 0.6 0.5 0.5 0.4 0.65 0.5 0.5 0.4 0.4 + Harvest: days past planting :math:`\mathrm{\le}`\ 165 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 160 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 300 :math:`\mathrm{\le}`\ 160 :math:`\mathrm{\le}`\ 150 :math:`\mathrm{\le}`\ 210 :math:`\mathrm{\le}`\ 210 + :math:`z_{top}^{\max }` (m) 2.5 1.2 0.75 1.5 1.8 4 2.5 1 2.5 2.5 + SLA (m :sup:`2` leaf g :sup:`-1` C) 0.05 0.035 0.035 0.035 0.035 0.05 0.05 0.035 0.057 0.049 + :math:`\chi _{L}` index -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 + grperc 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 + flnr 0.293 0.41 0.41 0.41 0.41 0.293 0.293 0.41 0.293 0.293 + fcur 1 1 1 1 1 1 1 1 1 1 + =================================== ========================= ========================== ========================== ========================== ========================== ========================= ========================= ========================== ========================== ========================== Notes: :math:`Date_{planting}^{min}` and :math:`Date_{planting}^{max}` are the minimum and maximum planting date in the Northern Hemisphere, the corresponding dates @@ -535,24 +553,127 @@ fulfill plant nitrogen demands. Harvest '''''''''''''''''''''''''''''' -Variables track the flow of grain C and -N to food and of all other plant pools, including live stem C and N, to litter. Putting live -stem C and N into the litter pool is in contrast to the approach for unmanaged PFTs which -puts live stem C and N into dead stem pools first. Leaf and root C and N pools -are routed to the litter pools in the same manner as natural vegetation. Whereas food C and N -was formerly transferred to the litter pool, CLM5 routes food C and N +Variables track the flow of grain C and N to food and of all other plant pools, including live stem C and N, to litter, and to biofuel feedstock. +A fraction (determined by the :math:`biofuel\_harvfrac`, defined in +:numref:`Table Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production`) of leaf/livestem C and N from bioenergy crops is removed at harvest for biofuels +(Equations :eq:`25.9`, :eq:`25.10`, :eq:`25.12`, and :eq:`25.13`), +with the remaining portions going to the litter pools (Equations :eq:`20.14)`, :eq:`25.11`, and :eq:`25.14`). +Putting live stem C and N into the litter and biofuel pools is in contrast to the approach for unmanaged PFTs which +puts live stem C and N into dead stem pools first. +Biofuel crop leaf C and N pools are routed to the litter and biofuel pools, in contrast to that of unmanaged PFTs and non-biofuel crops, which put leaf C and N into litter pools only. +Root C and N pools are routed to the litter pools in the same manner as natural vegetation. + +.. math:: + :label: 25.9 + + CF_{leaf,biofuel} = \left({CS_{leaf} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * biofuel\_harvfrac + +.. math:: + :label: 25.10 + + CF_{livestem,biofuel} = \left({CS_{livestem} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * biofuel\_harvfrac + +.. math:: + :label: 25.11 + + CF_{livestem,litter} = \left({CS_{livestem} \mathord{\left/ {\vphantom {CS_{livestem} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * \left( 1-biofuel\_harvfrac \right) +CF_{alloc,livestem} + +with corresponding nitrogen fluxes: + +.. math:: + :label: 25.12 + + NF_{leaf,biofuel} = \left({NS_{leaf} \mathord{\left/ {\vphantom {NS_{leaf} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * biofuel\_harvfrac + +.. math:: + :label: 25.13 + + NF_{livestem,biofuel} = \left({NS_{livestem} \mathord{\left/ {\vphantom {NS_{livestem} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * biofuel\_harvfrac + +.. math:: + :label: 25.14 + + NF_{livestem,litter} = \left({NS_{livestem} \mathord{\left/ {\vphantom {NS_{livestem} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} + \right) * \left( 1-biofuel\_harvfrac \right) + +where CF is the carbon flux, CS is stored carbon, NF is the nitrogen flux, +NS is stored nitrogen, and :math:`biofuel\_harvfrac` is the harvested fraction of leaf/livestem for biofuel feedstocks. + +.. _Table Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production: + +.. table:: Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production. + + +----------------------------------+----------------------------+ + | PFT | :math:`biofuel\_harvfrac` | + +==================================+============================+ + | NET Temperate | 0.00 | + +----------------------------------+----------------------------+ + | NET Boreal | 0.00 | + +----------------------------------+----------------------------+ + | NDT Boreal | 0.00 | + +----------------------------------+----------------------------+ + | BET Tropical | 0.00 | + +----------------------------------+----------------------------+ + | BET temperate | 0.00 | + +----------------------------------+----------------------------+ + | BDT tropical | 0.00 | + +----------------------------------+----------------------------+ + | BDT temperate | 0.00 | + +----------------------------------+----------------------------+ + | BDT boreal | 0.00 | + +----------------------------------+----------------------------+ + | BES temperate | 0.00 | + +----------------------------------+----------------------------+ + | BDS temperate | 0.00 | + +----------------------------------+----------------------------+ + | BDS boreal | 0.00 | + +----------------------------------+----------------------------+ + | C\ :sub:`3` arctic grass | 0.00 | + +----------------------------------+----------------------------+ + | C\ :sub:`3` grass | 0.00 | + +----------------------------------+----------------------------+ + | C\ :sub:`4` grass | 0.00 | + +----------------------------------+----------------------------+ + | Temperate Corn | 0.00 | + +----------------------------------+----------------------------+ + | Spring Wheat | 0.00 | + +----------------------------------+----------------------------+ + | Temperate Soybean | 0.00 | + +----------------------------------+----------------------------+ + | Cotton | 0.00 | + +----------------------------------+----------------------------+ + | Rice | 0.00 | + +----------------------------------+----------------------------+ + | Sugarcane | 0.00 | + +----------------------------------+----------------------------+ + | Tropical Corn | 0.00 | + +----------------------------------+----------------------------+ + | Tropical Soybean | 0.00 | + +----------------------------------+----------------------------+ + | Miscanthus | 0.70 | + +----------------------------------+----------------------------+ + | Switchgrass | 0.70 | + +----------------------------------+----------------------------+ + +Whereas food C and N was formerly transferred to the litter pool, CLM5 routes food C and N to a grain product pool where the C and N decay to the atmosphere over one year, similar in structure to the wood product pools. +The biofuel C and N is also routed to the grain product pool and decays to the atmosphere over one year. Additionally, CLM5 accounts for the C and N required for crop seeding by removing the seed C and N from the grain product pool during harvest. The crop seed pool is then used to seed crops in the subsequent year. -Calcuating the crop yields (Equation :eq:`25.9`) requires that you sum the GRAINC_TO_FOOD variable +Calcuating the crop yields (Equation :eq:`25.15`) requires that you sum the GRAINC_TO_FOOD variable for each year, and must account for the proportion of C in the dry crop weight. Here, we assume that grain C is 45% of the total dry weight. Additionally, harvest is not typically 100% efficient, so analysis needs to assume that harvest efficiency is less. We assume a harvest efficiency of 85%. .. math:: - :label: 25.9 + :label: 25.15 Grain\ yield(g.m^{-2})=\frac{\sum(GRAINC\_ TO\_ FOOD)*0.85}{0.45} @@ -561,27 +682,27 @@ efficiency of 85%. .. table:: Crop allocation parameters for the active crop plant functional types (pfts) in CLM5BGCCROP. Numbers in the first row correspond to the list of pfts in :numref:`Table Crop plant functional types`. - =========================================== ============== ============ ================== ====== ====== ========= ============= ================ - \ temperate corn spring wheat temperatue soybean cotton rice sugarcane tropical corn tropical soybean - =========================================== ============== ============ ================== ====== ====== ========= ============= ================ - IVT 17, 18 19, 20 23, 24 41, 42 61, 62 67, 68 75, 76 77, 78 - :math:`a_{leaf}^{i}` 0.6 0.9 0.85 0.85 0.75 0.6 0.6 0.85 - :math:`{L}_{max}` (m :sup:`2` m :sup:`-2`) 5 7 6 6 7 5 5 6 - :math:`a_{froot}^{i}` 0.1 0.05 0.2 0.2 0.1 0.1 0.1 0.2 - :math:`a_{froot}^{f}` 0.05 0 0.2 0.2 0 0.05 0.05 0.2 - :math:`a_{leaf}^{f}` 0 0 0 0 0 0 0 0 - :math:`a_{livestem}^{f}` 0 0.05 0.3 0.3 0.05 0 0 0.3 - :math:`d_{L}` 1.05 1.05 1.05 1.05 1.05 1.05 1.05 1.05 - :math:`d_{alloc}^{stem}` 2 1 5 5 1 2 2 5 - :math:`d_{alloc}^{leaf}` 5 3 2 2 3 5 5 2 - :math:`{CN}_{leaf}` 25 20 20 20 20 25 25 20 - :math:`{CN}_{stem}` 50 50 50 50 50 50 50 50 - :math:`{CN}_{froot}` 42 42 42 42 42 42 42 42 - :math:`CN^f_{leaf}` 65 65 65 65 65 65 65 65 - :math:`CN^f_{stem}` 120 100 130 130 100 120 120 130 - :math:`CN^f_{froot}` 0 40 0 0 40 0 0 0 - :math:`{CN}_{grain}` 50 50 50 50 50 50 50 50 - =========================================== ============== ============ ================== ====== ====== ========= ============= ================ + =========================================== ============== ============ ================== ====== ====== ========= ============= ================ ================ ================ + \ temperate corn spring wheat temperate soybean cotton rice sugarcane tropical corn tropical soybean miscanthus switchgrass + =========================================== ============== ============ ================== ====== ====== ========= ============= ================ ================ ================ + IVT 17, 18 19, 20 23, 24 41, 42 61, 62 67, 68 75, 76 77, 78 71, 72 73, 74 + :math:`a_{leaf}^{i}` 0.6 0.9 0.85 0.85 0.75 0.6 0.6 0.85 0.9 0.7 + :math:`{L}_{max}` (m :sup:`2` m :sup:`-2`) 5 7 6 6 7 5 5 6 10 6.5 + :math:`a_{froot}^{i}` 0.1 0.05 0.2 0.2 0.1 0.1 0.1 0.2 0.11 0.14 + :math:`a_{froot}^{f}` 0.05 0 0.2 0.2 0 0.05 0.05 0.2 0.09 0.09 + :math:`a_{leaf}^{f}` 0 0 0 0 0 0 0 0 0 0 + :math:`a_{livestem}^{f}` 0 0.05 0.3 0.3 0.05 0 0 0.3 0 0 + :math:`d_{L}` 1.05 1.05 1.05 1.05 1.05 1.05 1.05 1.05 1.05 1.05 + :math:`d_{alloc}^{stem}` 2 1 5 5 1 2 2 5 2 2 + :math:`d_{alloc}^{leaf}` 5 3 2 2 3 5 5 2 5 5 + :math:`{CN}_{leaf}` 25 20 20 20 20 25 25 20 25 25 + :math:`{CN}_{stem}` 50 50 50 50 50 50 50 50 50 50 + :math:`{CN}_{froot}` 42 42 42 42 42 42 42 42 42 42 + :math:`CN^f_{leaf}` 65 65 65 65 65 65 65 65 65 65 + :math:`CN^f_{stem}` 120 100 130 130 100 120 120 130 120 120 + :math:`CN^f_{froot}` 0 40 0 0 40 0 0 0 0 0 + :math:`{CN}_{grain}` 50 50 50 50 50 50 50 50 50 50 + =========================================== ============== ============ ================== ====== ====== ========= ============= ================ ================ ================ Notes: Crop growth phases and corresponding variables are described throughout the text. :math:`{CN}_{leaf}`, :math:`{CN}_{stem}`, and :math:`{CN}_{froot}` are @@ -599,7 +720,7 @@ Physical Crop Characteristics '''''''''''''''''''''''''''''' Leaf area index (*L*) is calculated as a function of specific leaf area (SLA, :numref:`Table Crop phenology parameters`) and leaf C. -Stem area index (*S*) is equal to 0.1\ *L* for temperate and tropical corn and sugarcane and 0.2\ *L* for +Stem area index (*S*) is equal to 0.1\ *L* for temperate and tropical corn, sugarcane, switchgrass, and miscanthus and 0.2\ *L* for other crops, as in AgroIBIS. All live C and N pools go to 0 after crop harvest, but the *S* is kept at 0.25 to simulate a post-harvest “stubble” on the ground. @@ -609,7 +730,7 @@ and :math:`{z}_{bot}` (m), come from the AgroIBIS formulation: .. math:: - :label: 25.10 + :label: 25.16 \begin{array}{l} {z_{top} =z_{top}^{\max } \left(\frac{L}{L_{\max } -1} \right)^{2} \ge 0.05{\rm \; where\; }\frac{L}{L_{\max } -1} \le 1} \\ @@ -636,7 +757,10 @@ In transient simulations, annual fertilizer application is specified on the land file by the field FERTNITRO_CFT, which is also in g N/m\ :sup:`2`/yr. The values for both of these fields come from the LUMIP time series for each year. In addition to the industrial fertilizer, background manure fertilizer is specified -on the parameter file by the field 'manunitro'. For the current CLM5BGCCROP, +on the parameter file by the field 'manunitro'. For perennial bioenergy crops, +little fertilizer (56kg/ha/yr) is applied to switchgrass, no fertilizer is applied to Miscanthus. +Note these rates are only based on local land management practices at the University of Illinois Energy Farm +located in Central Midwestern United States :ref:`(Cheng et al., 2019)` rather than the LUMIP timeseries. For the current CLM5BGCCROP, manure N is applied at a rate of 0.002 kg N/m\ :sup:`2`/yr. Because previous versions of CLM (e.g., CLM4) had rapid denitrification rates, fertilizer is applied slowly to minimize N loss (primarily through denitrification) and maximize plant uptake. @@ -651,7 +775,7 @@ counter in seconds, *f*, is set as soon as the leaf emergence phase for crops initiates: .. math:: - :label: 25.11 + :label: 25.17 f = n \times 86400 @@ -682,7 +806,7 @@ the for both rainfed and irrigated spring wheat and sugarcane, the calculation o :math:`GDD_{T_{{\rm 2m}} }` allows for latitudinal variation: .. math:: - :label: 25.12 + :label: 25.18 latitudinal\ variation\ in\ base\ T = \left\{ \begin{array}{lr} @@ -822,4 +946,3 @@ river water storage is maintained above a specified threshold. temperate cereals (wheat, barley, and rye) (:ref:`Portmann et al. 2010 `), available online from *ftp://ftp.rz.uni-frankfurt.de/pub/uni-frankfurt/physische\_geographie/hydrologie/public/data/MIRCA2000/harvested\_area\_grids.* - diff --git a/doc/source/tech_note/Fluxes/CLM50_Tech_Note_Fluxes.rst b/doc/source/tech_note/Fluxes/CLM50_Tech_Note_Fluxes.rst index d967cd5ff0..047d4e6723 100644 --- a/doc/source/tech_note/Fluxes/CLM50_Tech_Note_Fluxes.rst +++ b/doc/source/tech_note/Fluxes/CLM50_Tech_Note_Fluxes.rst @@ -1351,7 +1351,15 @@ plus stem area for which :math:`z_{0m}` reaches its maximum. +----------------------------------+--------------------+------------------+-------------------------+ | Soybean I | 0.120 | 0.68 | 0.04 | +----------------------------------+--------------------+------------------+-------------------------+ - + | Miscanthus R | 0.120 | 0.68 | 0.04 | + +----------------------------------+--------------------+------------------+-------------------------+ + | Miscanthus I | 0.120 | 0.68 | 0.04 | + +----------------------------------+--------------------+------------------+-------------------------+ + | Switchgrass R | 0.120 | 0.68 | 0.04 | + +----------------------------------+--------------------+------------------+-------------------------+ + | Switchgrass I | 0.120 | 0.68 | 0.04 | + +----------------------------------+--------------------+------------------+-------------------------+ + .. _Numerical Implementation: Numerical Implementation diff --git a/doc/source/tech_note/Introduction/CLM50_Tech_Note_Introduction.rst b/doc/source/tech_note/Introduction/CLM50_Tech_Note_Introduction.rst index 7240dfa8d9..face74629b 100644 --- a/doc/source/tech_note/Introduction/CLM50_Tech_Note_Introduction.rst +++ b/doc/source/tech_note/Introduction/CLM50_Tech_Note_Introduction.rst @@ -13,7 +13,7 @@ ***Contributing Authors*** -**Ashehad Ali, Andrew Badger, Gautam Bisht, Patrick Broxton, Michael Brunke, Jonathan Buzan, Martyn Clark, Tony Craig, Kyla Dahlin, Beth Drewniak, Louisa Emmons, Josh Fisher, Mark Flanner, Pierre Gentine, Jan Lenaerts, Sam Levis, +**Ashehad Ali, Andrew Badger, Gautam Bisht, Patrick Broxton, Michael Brunke, Jonathan Buzan, Yanyan Cheng, Martyn Clark, Tony Craig, Kyla Dahlin, Beth Drewniak, Louisa Emmons, Josh Fisher, Mark Flanner, Pierre Gentine, Maoyi Huang, Jan Lenaerts, Sam Levis, L. Ruby Leung, William Lipscomb, Jon Pelletier, Daniel M. Ricciuto, Ben Sanderson, Jacquelyn Shuman, Andrew Slater, Zachary Subin, Jinyun Tang, Ahmed Tawfik, Quinn Thomas, Simone Tilmes, Francis Vitt, Xubin Zeng** @@ -524,11 +524,17 @@ light capture, carboxylation, and respiration are co-limiting. CLM5 applies a fixed allocation scheme for woody vegetation. The decision to use a fixed allocation scheme in CLM5, rather than a dynamic NPP-based allocation scheme, as was used in CLM4 and CLM4.5, was driven by the fact that observations indicate that biomass saturates with increasing productivity, in contrast to the behavior in CLM4 and CLM4.5 where biomass continuously increases with increasing productivity (:ref:`Negron-Juarez et al., 2015`). Soil carbon decomposition processes are unchanged in CLM5, but a new metric for apparent soil carbon turnover times (:ref:`Koven et al., 2017 `) suggested parameter changes that produce a weak intrinsic depth limitation on soil carbon turnover rates (rather than the strong depth limitaiton in CLM4.5) and that the thresholds for soil moisture limitation on soil carbon turnover rates in dry soils should be set at a wetter soil moisture level than that used in CLM4.5. -Representation of human management of the land (agriculture, wood harvest) is augmented in several ways. The CLM4.5 crop model is extended to operate globally through the addition of rice and sugarcane as well as tropical varieties of corn and soybean :ref:`(Badger and Dirmeyer, 2015` and :ref:`Levis et al., 2016)`. These crop types are added to the existing temperate corn, temperature soybean, spring wheat, and cotton crop types. -Fertilization rates and irrigation equipped area updated annually based on crop type and geographic region through an input dataset. The irrigation trigger is updated. Additional minor changes include crop phenological triggers that +Representation of human management of the land (agriculture, wood harvest) is augmented in several ways. +The CLM4.5 crop model is extended to operate globally through the addition of rice, sugarcane, +tropical varieties of corn and soybean :ref:`(Badger and Dirmeyer, 2015` and :ref:`Levis et al., 2016)`, +and perennial bioenergy crops :ref:`(Cheng et al., 2019)`. +These crop types are added to the existing temperate corn, temperate soybean, spring wheat, and cotton crop types. +Fertilization rates and irrigation equipped area updated annually based on crop type and geographic region through an input dataset. +The irrigation trigger is updated. Additional minor changes include crop phenological triggers that vary by latitude for selected crop types, grain C and N is now removed at harvest to a 1-year product pool with -the carbon for the next season's crop seed removed from the grain carbon at harvest. Through the introduction of -the capability to dynamically adjust landunit weights during a simulation, the crop model can now be run coincidentally +the carbon for the next season's crop seed removed from the grain carbon at harvest. +A fraction of leaf/livestem C and N from bioenergy crops is removed at harvest to the biofuel feedstock pools and added to the 1-year product pool. +Through the introduction of the capability to dynamically adjust landunit weights during a simulation, the crop model can now be run coincidentally with prescribed land use, which significantly expands the capabilities of the model. Mass-based rather than area-based wood harvest is applied. Several heat stress indices for both urban and rural areas are calculated and output by default :ref:`(Buzan et al., 2015)`. A more sophisticated and realistic building space heating and air conditioning submodel that prognoses interior building air temperature and includes more realistic space heating and air conditioning wasteheat factors is incorporated. diff --git a/doc/source/tech_note/Photosynthesis/CLM50_Tech_Note_Photosynthesis.rst b/doc/source/tech_note/Photosynthesis/CLM50_Tech_Note_Photosynthesis.rst index f7171f1a10..3f0c4849ae 100644 --- a/doc/source/tech_note/Photosynthesis/CLM50_Tech_Note_Photosynthesis.rst +++ b/doc/source/tech_note/Photosynthesis/CLM50_Tech_Note_Photosynthesis.rst @@ -136,7 +136,11 @@ atmospheric potential temperature (K). +----------------------------------+-------------------+ | Tropical Soybean | 5.79 | +----------------------------------+-------------------+ - + | Miscanthus | 1.79 | + +----------------------------------+-------------------+ + | Switchgrass | 1.79 | + +----------------------------------+-------------------+ + .. _Photosynthesis: Photosynthesis diff --git a/doc/source/tech_note/Photosynthetic_Capacity/CLM50_Tech_Note_Photosynthetic_Capacity.rst b/doc/source/tech_note/Photosynthetic_Capacity/CLM50_Tech_Note_Photosynthetic_Capacity.rst index c4dd5b03f9..c42d7971a8 100755 --- a/doc/source/tech_note/Photosynthetic_Capacity/CLM50_Tech_Note_Photosynthetic_Capacity.rst +++ b/doc/source/tech_note/Photosynthetic_Capacity/CLM50_Tech_Note_Photosynthetic_Capacity.rst @@ -136,6 +136,10 @@ and :math:`\text{LMA}` is the inverse of specific leaf area at the canopy top (: +----------------------------------+--------------------------+--------------------------+ | Tropical Soybean | 0.0350 | 0.4102 | +----------------------------------+--------------------------+--------------------------+ + | Miscanthus | 0.0570 | 0.2930 | + +----------------------------------+--------------------------+--------------------------+ + | Switchgrass | 0.0490 | 0.2930 | + +----------------------------------+--------------------------+--------------------------+ Notes: :math:`SLA_{\text{0}}` is the specific leaf area at the canopy top (m :sup:`2` leaf/g biomass), and :math:`N_{\text{cb}}` is the fraction of leaf nitrogen in Rubisco (g N in Rubisco g :sup:`-1` N) diff --git a/doc/source/tech_note/Plant_Hydraulics/CLM50_Tech_Note_Plant_Hydraulics.rst b/doc/source/tech_note/Plant_Hydraulics/CLM50_Tech_Note_Plant_Hydraulics.rst index 88d09d18a5..f33a6d96b5 100644 --- a/doc/source/tech_note/Plant_Hydraulics/CLM50_Tech_Note_Plant_Hydraulics.rst +++ b/doc/source/tech_note/Plant_Hydraulics/CLM50_Tech_Note_Plant_Hydraulics.rst @@ -93,6 +93,14 @@ distribution parameter adopted from :ref:`Jackson et al. (1996) +----------------------------------+------------------+ | Soybean I | 0.943 | +----------------------------------+------------------+ + | Miscanthus R | 0.943 | + +----------------------------------+------------------+ + | Miscanthus I | 0.943 | + +----------------------------------+------------------+ + | Switchgrass R | 0.943 | + +----------------------------------+------------------+ + | Switchgrass I | 0.943 | + +----------------------------------+------------------+ .. _Root Spacing: diff --git a/doc/source/tech_note/References/CLM50_Tech_Note_References.rst b/doc/source/tech_note/References/CLM50_Tech_Note_References.rst index f5ffc26b95..4bd7a2cf9b 100644 --- a/doc/source/tech_note/References/CLM50_Tech_Note_References.rst +++ b/doc/source/tech_note/References/CLM50_Tech_Note_References.rst @@ -274,6 +274,14 @@ Cao, M., Marshall, S. and Gregson, K., 1996. Global carbon exchange and methane emissions from natural wetlands: Application of a process-based model. J. Geophys. Res. 101(D9):14,399-14,414. +.. _Chengetal2019: + +Cheng, Y. et al., 2019. Parameterizing perennial bioenergy +crops in Version 5 of the Community Land Model Based on Site‐Level +Observations in the Central Midwestern United States. +Journal of Advances in Modeling Earth Systems, +2(2013), 1–24. https://doi.org/10.1029/2019MS001719 + .. _Chuangetal2006: Chuang Y.L., Oren R., Bertozzi A.L, Phillips N., Katul G.G. 2006. The diff --git a/doc/source/tech_note/Surface_Albedos/CLM50_Tech_Note_Surface_Albedos.rst b/doc/source/tech_note/Surface_Albedos/CLM50_Tech_Note_Surface_Albedos.rst index 2770917358..36bebbe56f 100644 --- a/doc/source/tech_note/Surface_Albedos/CLM50_Tech_Note_Surface_Albedos.rst +++ b/doc/source/tech_note/Surface_Albedos/CLM50_Tech_Note_Surface_Albedos.rst @@ -485,6 +485,10 @@ intercepted snow (:numref:`Table Intercepted snow optical properties`) are from +----------------------------------+----------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+ | Tropical Soybean | -0.50 | 0.11 | 0.35 | 0.31 | 0.53 | 0.05 | 0.34 | 0.120 | 0.250 | +----------------------------------+----------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+ + | Miscanthus | -0.50 | 0.11 | 0.35 | 0.31 | 0.53 | 0.05 | 0.34 | 0.120 | 0.250 | + +----------------------------------+----------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+ + | Switchgrass | -0.50 | 0.11 | 0.35 | 0.31 | 0.53 | 0.05 | 0.34 | 0.120 | 0.250 | + +----------------------------------+----------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+ .. _Table Intercepted snow optical properties: diff --git a/doc/source/tech_note/Vegetation_Phenology_Turnover/CLM50_Tech_Note_Vegetation_Phenology_Turnover.rst b/doc/source/tech_note/Vegetation_Phenology_Turnover/CLM50_Tech_Note_Vegetation_Phenology_Turnover.rst index 7ede3405e0..e8b187e1a1 100644 --- a/doc/source/tech_note/Vegetation_Phenology_Turnover/CLM50_Tech_Note_Vegetation_Phenology_Turnover.rst +++ b/doc/source/tech_note/Vegetation_Phenology_Turnover/CLM50_Tech_Note_Vegetation_Phenology_Turnover.rst @@ -132,12 +132,16 @@ periods as: .. math:: :label: 20.14) - CF_{leaf,litter}^{n} =\left\{\begin{array}{l} {CF_{leaf,litter}^{n-1} +r_{xfer\_ off} \left(CS_{leaf} -CF_{leaf,litter}^{n-1} {\kern 1pt} t_{offset} \right)\qquad {\rm for\; }t_{offset} \ne \Delta t} \\ {\left({CS_{leaf} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} \right)+CF_{alloc,leaf} \qquad \qquad \qquad \qquad {\rm for\; }t_{offset} =\Delta t} \end{array}\right. + CF_{leaf,litter}^{n} =\left\{\begin{array}{l} {CF_{leaf,litter}^{n-1} + r_{xfer\_ off} \left(CS_{leaf} -CF_{leaf,litter}^{n-1} {\kern 1pt} t_{offset} \right)\qquad {\rm for\; }t_{offset} \ne \Delta t} + \\ {\left({CS_{leaf} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} \right) + \left( 1-biofuel\_harvfrac \right) + +CF_{alloc,leaf} \qquad {\rm for\; }t_{offset} =\Delta t} \end{array}\right. .. math:: :label: 20.15) - CF_{froot,litter}^{n} =\left\{\begin{array}{l} {CF_{froot,litter}^{n-1} +r_{xfer\_ off} \left(CS_{froot} -CF_{froot,litter}^{n-1} {\kern 1pt} t_{offset} \right)\qquad {\rm for\; }t_{offset} \ne \Delta t} \\ {\left({CS_{froot} \mathord{\left/ {\vphantom {CS_{froot} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} \right)+CF_{alloc,\, froot} \qquad \qquad \qquad {\rm for\; }t_{offset} =\Delta t} \end{array}\right. + CF_{froot,litter}^{n} =\left\{\begin{array}{l} {CF_{froot,litter}^{n-1} + + r_{xfer\_ off} \left(CS_{froot} -CF_{froot,litter}^{n-1} {\kern 1pt} t_{offset} \right)\qquad {\rm for\; }t_{offset} \ne \Delta t} \\ {\left({CS_{froot} \mathord{\left/ {\vphantom {CS_{froot} \Delta t}} \right. \kern-\nulldelimiterspace} \Delta t} \right)+CF_{alloc,\, froot} \qquad \qquad \qquad {\rm for\; }t_{offset} =\Delta t} \end{array}\right. .. math:: :label: 20.16) @@ -146,10 +150,13 @@ periods as: where superscripts *n* and *n-1* refer to fluxes on the current and previous timesteps, respectively. The rate coefficient :math:`{r}_{xfer\_off}` varies with time to produce a linearly -increasing litterfall rate throughout the offset period, and the special -case for fluxes in the final litterfall timestep -(:math:`{t}_{offset}` = :math:`\Delta t`\ ) ensures that all of the -displayed growth is sent to the litter pools for deciduous plant types. +increasing litterfall rate throughout the offset period. +The :math:`biofuel\_harvfrac` (:numref:`Table Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production`) +is the harvested fraction of aboveground biomass (leaf & livestem) for bioenergy crops. +The special case for fluxes in the final litterfall timestep +(:math:`{t}_{offset}` = :math:`\Delta t`\ ) ensures that all of the displayed growth is sent to the litter pools or biofuel feedstock pools. The fraction (:math:`biofuel\_harvfrac`) of leaf biomass going to the biofuel feedstock pools (Equation :eq:`25.9`) is defined in Table 26.3 and is only non-zero for prognostic crops. The remaining fraction of leaf biomass (:math:`1-biofuel\_harvfrac`) for deciduous plant types is sent to the litter pools. +Similar modifications made for livestem carbon pools for prognostic crops +can be found in section :numref:`Harvest to food and seed` in Equations :eq:`25.9`-:eq:`25.14`. Corresponding nitrogen fluxes during litterfall take into account retranslocation of nitrogen out of the displayed leaf pool prior to litterfall (:math:`{NF}_{leaf,retrans}`, gN m\ :sup:`-2` s\ :sup:`-1`). Retranslocation of nitrogen out of fine roots is @@ -865,4 +872,3 @@ fractions used for carbon fluxes: :label: 20.97) NF_{froot,lit3} =\sum _{p=0}^{npfts}NF_{froot,litter} f_{lig\_ froot,p} wcol_{p} . - diff --git a/src/biogeochem/CNCIsoFluxMod.F90 b/src/biogeochem/CNCIsoFluxMod.F90 index 07e693c540..922378b01f 100644 --- a/src/biogeochem/CNCIsoFluxMod.F90 +++ b/src/biogeochem/CNCIsoFluxMod.F90 @@ -404,6 +404,16 @@ subroutine CIsoFlux1(num_soilc, filter_soilc, num_soilp, filter_soilp, & iso_cnveg_cs%grainc_patch , cnveg_cs%grainc_patch, & num_soilp , filter_soilp, 1._r8, 0, isotope) + call CIsoFluxCalc(& + iso_cnveg_cf%leafc_to_biofuelc_patch , cnveg_cf%leafc_to_biofuelc_patch, & + iso_cnveg_cs%leafc_patch , cnveg_cs%leafc_patch, & + num_soilp , filter_soilp, 1._r8, 0, isotope) + + call CIsoFluxCalc(& + iso_cnveg_cf%livestemc_to_biofuelc_patch , cnveg_cf%livestemc_to_biofuelc_patch, & + iso_cnveg_cs%livestemc_patch , cnveg_cs%livestemc_patch, & + num_soilp , filter_soilp, 1._r8, 0, isotope) + call CIsoFluxCalc(& iso_cnveg_cf%grainc_to_seed_patch , cnveg_cf%grainc_to_seed_patch, & iso_cnveg_cs%grainc_patch , cnveg_cs%grainc_patch, & @@ -459,10 +469,17 @@ subroutine CIsoFlux1(num_soilc, filter_soilc, num_soilp, filter_soilp, & iso_cnveg_cs%livestemc_patch , cnveg_cs%livestemc_patch, & num_soilp , filter_soilp, 1._r8, 0, isotope) + do fp = 1,num_soilp + p = filter_soilp(fp) + iso_cnveg_cf%grainc_to_cropprodc_patch(p) = iso_cnveg_cf%leafc_to_biofuelc_patch(p) + & + iso_cnveg_cf%livestemc_to_biofuelc_patch(p) + end do + if (use_grainproduct) then do fp = 1,num_soilp p = filter_soilp(fp) - iso_cnveg_cf%grainc_to_cropprodc_patch(p) = iso_cnveg_cf%grainc_to_food_patch(p) + iso_cnveg_cf%grainc_to_cropprodc_patch(p) = iso_cnveg_cf%grainc_to_cropprodc_patch(p) + & + iso_cnveg_cf%grainc_to_food_patch(p) iso_cnveg_cf%grain_mr_patch(p) = iso_cnveg_cf%grain_xsmr_patch(p) + iso_cnveg_cf%grain_curmr_patch(p) end do endif diff --git a/src/biogeochem/CNCStateUpdate1Mod.F90 b/src/biogeochem/CNCStateUpdate1Mod.F90 index 76d435cce5..c5a717f2bc 100644 --- a/src/biogeochem/CNCStateUpdate1Mod.F90 +++ b/src/biogeochem/CNCStateUpdate1Mod.F90 @@ -277,7 +277,7 @@ subroutine CStateUpdate1( num_soilc, filter_soilc, num_soilp, filter_soilp, & ! phenology: litterfall fluxes cs_veg%leafc_patch(p) = cs_veg%leafc_patch(p) - cf_veg%leafc_to_litter_patch(p)*dt cs_veg%frootc_patch(p) = cs_veg%frootc_patch(p) - cf_veg%frootc_to_litter_patch(p)*dt - + ! livewood turnover fluxes if (woody(ivt(p)) == 1._r8) then cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - cf_veg%livestemc_to_deadstemc_patch(p)*dt @@ -287,6 +287,8 @@ subroutine CStateUpdate1( num_soilc, filter_soilc, num_soilp, filter_soilp, & end if if (ivt(p) >= npcropmin) then ! skip 2 generic crops cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - cf_veg%livestemc_to_litter_patch(p)*dt + cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - cf_veg%livestemc_to_biofuelc_patch(p)*dt + cs_veg%leafc_patch(p) = cs_veg%leafc_patch(p) - cf_veg%leafc_to_biofuelc_patch(p)*dt cs_veg%grainc_patch(p) = cs_veg%grainc_patch(p) & - (cf_veg%grainc_to_food_patch(p) + cf_veg%grainc_to_seed_patch(p))*dt cs_veg%cropseedc_deficit_patch(p) = cs_veg%cropseedc_deficit_patch(p) & diff --git a/src/biogeochem/CNNStateUpdate1Mod.F90 b/src/biogeochem/CNNStateUpdate1Mod.F90 index 996426246a..e04e9dd831 100644 --- a/src/biogeochem/CNNStateUpdate1Mod.F90 +++ b/src/biogeochem/CNNStateUpdate1Mod.F90 @@ -194,6 +194,8 @@ subroutine NStateUpdate1(num_soilc, filter_soilc, num_soilp, filter_soilp, & ns_veg%frootn_patch(p) = ns_veg%frootn_patch(p) - nf_veg%frootn_to_retransn_patch(p)*dt ns_veg%retransn_patch(p) = ns_veg%retransn_patch(p) + nf_veg%frootn_to_retransn_patch(p)*dt ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_litter_patch(p)*dt + ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_biofueln_patch(p)*dt + ns_veg%leafn_patch(p) = ns_veg%leafn_patch(p) - nf_veg%leafn_to_biofueln_patch(p)*dt ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_retransn_patch(p)*dt ns_veg%retransn_patch(p) = ns_veg%retransn_patch(p) + nf_veg%livestemn_to_retransn_patch(p)*dt ns_veg%grainn_patch(p) = ns_veg%grainn_patch(p) & diff --git a/src/biogeochem/CNPhenologyMod.F90 b/src/biogeochem/CNPhenologyMod.F90 index 6f9b004c04..a9fd1449d0 100644 --- a/src/biogeochem/CNPhenologyMod.F90 +++ b/src/biogeochem/CNPhenologyMod.F90 @@ -282,7 +282,7 @@ subroutine CNPhenology (bounds, num_soilc, filter_soilc, num_soilp, & call CNLivewoodTurnover(num_soilp, filter_soilp, & cnveg_carbonstate_inst, cnveg_nitrogenstate_inst, cnveg_carbonflux_inst, cnveg_nitrogenflux_inst) - call CNGrainToProductPools(bounds, num_soilp, filter_soilp, num_soilc, filter_soilc, & + call CNCropHarvestToProductPools(bounds, num_soilp, filter_soilp, num_soilc, filter_soilc, & cnveg_carbonflux_inst, cnveg_nitrogenflux_inst) ! gather all patch-level litterfall fluxes to the column for litter C and N inputs @@ -1394,6 +1394,8 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & use pftconMod , only : ntrp_corn, nsugarcane, ntrp_soybean, ncotton, nrice use pftconMod , only : nirrig_trp_corn, nirrig_sugarcane, nirrig_trp_soybean use pftconMod , only : nirrig_cotton, nirrig_rice + use pftconMod , only : nmiscanthus, nirrig_miscanthus, nswitchgrass, nirrig_switchgrass + use clm_varcon , only : spval, secspday use clm_varctl , only : use_fertilizer use clm_varctl , only : use_c13, use_c14 @@ -1686,9 +1688,12 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & ivt(p) == ntrp_soybean .or. ivt(p) == nirrig_trp_soybean) then gddmaturity(p) = min(gdd1020(p), hybgdd(ivt(p))) end if + if (ivt(p) == ntmp_corn .or. ivt(p) == nirrig_tmp_corn .or. & ivt(p) == ntrp_corn .or. ivt(p) == nirrig_trp_corn .or. & - ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane) then + ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane .or. & + ivt(p) == nmiscanthus .or. ivt(p) == nirrig_miscanthus .or. & + ivt(p) == nswitchgrass .or. ivt(p) == nirrig_switchgrass) then gddmaturity(p) = max(950._r8, min(gdd820(p)*0.85_r8, hybgdd(ivt(p)))) gddmaturity(p) = max(950._r8, min(gddmaturity(p)+150._r8, 1850._r8)) end if @@ -1735,9 +1740,12 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & ivt(p) == ntrp_soybean .or. ivt(p) == nirrig_trp_soybean) then gddmaturity(p) = min(gdd1020(p), hybgdd(ivt(p))) end if + if (ivt(p) == ntmp_corn .or. ivt(p) == nirrig_tmp_corn .or. & ivt(p) == ntrp_corn .or. ivt(p) == nirrig_trp_corn .or. & - ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane) then + ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane .or. & + ivt(p) == nmiscanthus .or. ivt(p) == nirrig_miscanthus .or. & + ivt(p) == nswitchgrass .or. ivt(p) == nirrig_switchgrass) then gddmaturity(p) = max(950._r8, min(gdd820(p)*0.85_r8, hybgdd(ivt(p)))) end if if (ivt(p) == nswheat .or. ivt(p) == nirrig_swheat .or. & @@ -1798,7 +1806,9 @@ subroutine CropPhenology(num_pcropp, filter_pcropp , & if (ivt(p) == ntmp_corn .or. ivt(p) == nirrig_tmp_corn .or. & ivt(p) == ntrp_corn .or. ivt(p) == nirrig_trp_corn .or. & - ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane) then + ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane .or. & + ivt(p) == nmiscanthus .or. ivt(p) == nirrig_miscanthus .or. & + ivt(p) == nswitchgrass .or. ivt(p) == nirrig_switchgrass) then ! the following estimation of crmcorn from gddmaturity is based on a linear ! regression using data from Pioneer-brand corn hybrids (Kucharik, 2003, ! Earth Interactions 7:1-33: fig. 2) @@ -2331,6 +2341,8 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & ! ! !USES: use pftconMod , only : npcropmin + use pftconMod , only : nmiscanthus, nirrig_miscanthus, nswitchgrass, nirrig_switchgrass + use CNSharedParamsMod, only : use_fun use clm_varctl , only : CNratio_floating ! @@ -2355,7 +2367,10 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & associate( & ivt => patch%itype , & ! Input: [integer (:) ] patch vegetation type - leafcn => pftcon%leafcn , & ! Input: leaf C:N (gC/gN) + leafcn => pftcon%leafcn , & ! Input: leaf C:N (gC/gN) + + biofuel_harvfrac => pftcon%biofuel_harvfrac , & ! Input: cut a fraction of leaf & stem for biofuel (-) + lflitcn => pftcon%lflitcn , & ! Input: leaf litter C:N (gC/gN) frootcn => pftcon%frootcn , & ! Input: fine root C:N (gC/gN) graincn => pftcon%graincn , & ! Input: grain C:N (gC/gN) @@ -2382,14 +2397,18 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & leafc_to_litter => cnveg_carbonflux_inst%leafc_to_litter_patch , & ! Output: [real(r8) (:) ] leaf C litterfall (gC/m2/s) frootc_to_litter => cnveg_carbonflux_inst%frootc_to_litter_patch , & ! Output: [real(r8) (:) ] fine root C litterfall (gC/m2/s) livestemc_to_litter => cnveg_carbonflux_inst%livestemc_to_litter_patch , & ! Output: [real(r8) (:) ] live stem C litterfall (gC/m2/s) - grainc_to_food => cnveg_carbonflux_inst%grainc_to_food_patch , & ! Output: [real(r8) (:) ] grain C to food (gC/m2/s) + grainc_to_food => cnveg_carbonflux_inst%grainc_to_food_patch , & ! Output: [real(r8) (:) ] grain C to food (gC/m2/s) grainc_to_seed => cnveg_carbonflux_inst%grainc_to_seed_patch , & ! Output: [real(r8) (:) ] grain C to seed (gC/m2/s) + leafc_to_biofuelc => cnveg_carbonflux_inst%leafc_to_biofuelc_patch , & ! Output: [real(r8) (:) ] leaf C to biofuel C (gC/m2/s) + livestemc_to_biofuelc => cnveg_carbonflux_inst%livestemc_to_biofuelc_patch , & ! Output: [real(r8) (:) ] livestem C to biofuel C (gC/m2/s) leafn => cnveg_nitrogenstate_inst%leafn_patch , & ! Input: [real(r8) (:) ] (gN/m2) leaf N frootn => cnveg_nitrogenstate_inst%frootn_patch , & ! Input: [real(r8) (:) ] (gN/m2) fine root N livestemn_to_litter => cnveg_nitrogenflux_inst%livestemn_to_litter_patch , & ! Output: [real(r8) (:) ] livestem N to litter (gN/m2/s) - grainn_to_food => cnveg_nitrogenflux_inst%grainn_to_food_patch , & ! Output: [real(r8) (:) ] grain N to food (gN/m2/s) + grainn_to_food => cnveg_nitrogenflux_inst%grainn_to_food_patch , & ! Output: [real(r8) (:) ] grain N to food (gN/m2/s) grainn_to_seed => cnveg_nitrogenflux_inst%grainn_to_seed_patch , & ! Output: [real(r8) (:) ] grain N to seed (gN/m2/s) + leafn_to_biofueln => cnveg_nitrogenflux_inst%leafn_to_biofueln_patch , & ! Output: [real(r8) (:) ] leaf N to biofuel N (gN/m2/s) + livestemn_to_biofueln => cnveg_nitrogenflux_inst%livestemn_to_biofueln_patch, & ! Output: [real(r8) (:) ] livestem N to biofuel N (gN/m2/s) leafn_to_litter => cnveg_nitrogenflux_inst%leafn_to_litter_patch , & ! Output: [real(r8) (:) ] leaf N litterfall (gN/m2/s) leafn_to_retransn => cnveg_nitrogenflux_inst%leafn_to_retransn_patch , & ! Input: [real(r8) (:) ] leaf N to retranslocated N pool (gN/m2/s) free_retransn_to_npool=> cnveg_nitrogenflux_inst%free_retransn_to_npool_patch , & ! Input: [real(r8) (:) ] free leaf N to retranslocated N pool (gN/m2/s) @@ -2410,8 +2429,11 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & if (offset_counter(p) == dt) then t1 = 1.0_r8 / dt - leafc_to_litter(p) = t1 * leafc(p) + cpool_to_leafc(p) frootc_to_litter(p) = t1 * frootc(p) + cpool_to_frootc(p) + + ! biofuel_harvfrac is only non-zero for prognostic crops. + leafc_to_litter(p) = t1 * leafc(p)*(1._r8-biofuel_harvfrac(ivt(p))) + cpool_to_leafc(p) + ! this assumes that offset_counter == dt for crops ! if this were ever changed, we'd need to add code to the "else" if (ivt(p) >= npcropmin) then @@ -2424,8 +2446,17 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & ! Send the remaining grain to the food product pool grainc_to_food(p) = t1 * grainc(p) + cpool_to_grainc(p) - grainc_to_seed(p) grainn_to_food(p) = t1 * grainn(p) + npool_to_grainn(p) - grainn_to_seed(p) - - livestemc_to_litter(p) = t1 * livestemc(p) + cpool_to_livestemc(p) + + ! Cut a certain fraction (i.e., biofuel_harvfrac(ivt(p))) (e.g., biofuel_harvfrac(ivt(p)=70% for bioenergy crops) of leaf C + ! and move this fration of leaf C to biofuel C, rather than move it to litter + leafc_to_biofuelc(p) = t1 * leafc(p) * biofuel_harvfrac(ivt(p)) + leafn_to_biofueln(p) = t1 * leafn(p) * biofuel_harvfrac(ivt(p)) + + ! Cut a certain fraction (i.e., biofuel_harvfrac(ivt(p))) (e.g., biofuel_harvfrac(ivt(p)=70% for bioenergy crops) of livestem C + ! and move this fration of leaf C to biofuel C, rather than move it to litter + livestemc_to_litter(p) = t1 * livestemc(p)*(1._r8-biofuel_harvfrac(ivt(p))) + cpool_to_livestemc(p) + livestemc_to_biofuelc(p) = t1 * livestemc(p) * biofuel_harvfrac(ivt(p)) + livestemn_to_biofueln(p) = t1 * livestemn(p) * biofuel_harvfrac(ivt(p)) end if else t1 = dt * 2.0_r8 / (offset_counter(p) * offset_counter(p)) @@ -2507,13 +2538,13 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, & ! NOTE(slevis, 2014-12) results in -ve livestemn and -ve totpftn !X! livestemn_to_litter(p) = livestemc_to_litter(p) / livewdcn(ivt(p)) ! NOTE(slevis, 2014-12) Beth Drewniak suggested this instead - livestemn_to_litter(p) = livestemn(p) / dt + livestemn_to_litter(p) = livestemn(p) / dt * (1 - biofuel_harvfrac(ivt(p))) end if ! save the current litterfall fluxes prev_leafc_to_litter(p) = leafc_to_litter(p) prev_frootc_to_litter(p) = frootc_to_litter(p) - + end if ! end if offset period end do ! end patch loop @@ -2762,12 +2793,12 @@ subroutine CNLivewoodTurnover (num_soilp, filter_soilp, & end subroutine CNLivewoodTurnover !----------------------------------------------------------------------- - subroutine CNGrainToProductPools(bounds, num_soilp, filter_soilp, num_soilc, filter_soilc, & + subroutine CNCropHarvestToProductPools(bounds, num_soilp, filter_soilp, num_soilc, filter_soilc, & cnveg_carbonflux_inst, cnveg_nitrogenflux_inst) ! ! !DESCRIPTION: - ! If using prognostic crop along with use_grainproduct, then move the patch-level - ! grain-to-food fluxes into the column-level grain-to-cropprod fluxes + ! If using prognostic crop, then move any necessary harvested amounts into fluxes + ! destined for the product pools. ! ! !USES: use clm_varctl , only : use_crop @@ -2786,21 +2817,28 @@ subroutine CNGrainToProductPools(bounds, num_soilp, filter_soilp, num_soilc, fil ! !LOCAL VARIABLES: integer :: fp, p - character(len=*), parameter :: subname = 'CNGrainToProductPools' + character(len=*), parameter :: subname = 'CNCropHarvestToProductPools' !----------------------------------------------------------------------- - ! Explicitly checking use_crop is probably unnecessary here (because presumably - ! use_grainproduct is only true if use_crop is true), but we do it for safety because - ! the grain*_to_food_patch fluxes are not set if use_crop is false. - if (use_crop .and. use_grainproduct) then + if (use_crop) then do fp = 1, num_soilp p = filter_soilp(fp) - cnveg_carbonflux_inst%grainc_to_cropprodc_patch(p) = & - cnveg_carbonflux_inst%grainc_to_food_patch(p) - cnveg_nitrogenflux_inst%grainn_to_cropprodn_patch(p) = & - cnveg_nitrogenflux_inst%grainn_to_food_patch(p) + cnveg_carbonflux_inst%grainc_to_cropprodc_patch(p) = cnveg_carbonflux_inst%leafc_to_biofuelc_patch(p) + & + cnveg_carbonflux_inst%livestemc_to_biofuelc_patch(p) + cnveg_nitrogenflux_inst%grainn_to_cropprodn_patch(p) = cnveg_nitrogenflux_inst%leafn_to_biofueln_patch(p) + & + cnveg_nitrogenflux_inst%livestemn_to_biofueln_patch(p) end do + if (use_grainproduct) then + do fp = 1, num_soilp + p = filter_soilp(fp) + cnveg_carbonflux_inst%grainc_to_cropprodc_patch(p) = cnveg_carbonflux_inst%grainc_to_cropprodc_patch(p) + & + cnveg_carbonflux_inst%grainc_to_food_patch(p) + cnveg_nitrogenflux_inst%grainn_to_cropprodn_patch(p) = cnveg_nitrogenflux_inst%grainn_to_cropprodn_patch(p) + & + cnveg_nitrogenflux_inst%grainn_to_food_patch(p) + end do + end if + call p2c (bounds, num_soilc, filter_soilc, & cnveg_carbonflux_inst%grainc_to_cropprodc_patch(bounds%begp:bounds%endp), & cnveg_carbonflux_inst%grainc_to_cropprodc_col(bounds%begc:bounds%endc)) @@ -2808,12 +2846,10 @@ subroutine CNGrainToProductPools(bounds, num_soilp, filter_soilp, num_soilc, fil call p2c (bounds, num_soilc, filter_soilc, & cnveg_nitrogenflux_inst%grainn_to_cropprodn_patch(bounds%begp:bounds%endp), & cnveg_nitrogenflux_inst%grainn_to_cropprodn_col(bounds%begc:bounds%endc)) - end if - ! No else clause: if use_grainproduct is false, then the grain*_to_cropprod fluxes - ! will remain at their initial value (0). + end if - end subroutine CNGrainToProductPools + end subroutine CNCropHarvestToProductPools !----------------------------------------------------------------------- subroutine CNLitterToColumn (bounds, num_soilc, filter_soilc, & @@ -2863,13 +2899,13 @@ subroutine CNLitterToColumn (bounds, num_soilc, filter_soilc, & leafc_to_litter => cnveg_carbonflux_inst%leafc_to_litter_patch , & ! Input: [real(r8) (:) ] leaf C litterfall (gC/m2/s) frootc_to_litter => cnveg_carbonflux_inst%frootc_to_litter_patch , & ! Input: [real(r8) (:) ] fine root N litterfall (gN/m2/s) livestemc_to_litter => cnveg_carbonflux_inst%livestemc_to_litter_patch , & ! Input: [real(r8) (:) ] live stem C litterfall (gC/m2/s) - grainc_to_food => cnveg_carbonflux_inst%grainc_to_food_patch , & ! Input: [real(r8) (:) ] grain C to food (gC/m2/s) + grainc_to_food => cnveg_carbonflux_inst%grainc_to_food_patch , & ! Input: [real(r8) (:) ] grain C to food (gC/m2/s) phenology_c_to_litr_met_c => cnveg_carbonflux_inst%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 => cnveg_carbonflux_inst%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 => cnveg_carbonflux_inst%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 => cnveg_nitrogenflux_inst%livestemn_to_litter_patch , & ! Input: [real(r8) (:) ] livestem N to litter (gN/m2/s) - grainn_to_food => cnveg_nitrogenflux_inst%grainn_to_food_patch , & ! Input: [real(r8) (:) ] grain N to food (gN/m2/s) + grainn_to_food => cnveg_nitrogenflux_inst%grainn_to_food_patch , & ! Input: [real(r8) (:) ] grain N to food (gN/m2/s) leafn_to_litter => cnveg_nitrogenflux_inst%leafn_to_litter_patch , & ! Input: [real(r8) (:) ] leaf N litterfall (gN/m2/s) frootn_to_litter => cnveg_nitrogenflux_inst%frootn_to_litter_patch , & ! Input: [real(r8) (:) ] fine root N litterfall (gN/m2/s) phenology_n_to_litr_met_n => cnveg_nitrogenflux_inst%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) diff --git a/src/biogeochem/CNProductsMod.F90 b/src/biogeochem/CNProductsMod.F90 index 509d186db3..0586815ee1 100644 --- a/src/biogeochem/CNProductsMod.F90 +++ b/src/biogeochem/CNProductsMod.F90 @@ -25,7 +25,7 @@ module CNProductsMod ! ------------------------------------------------------------------------ real(r8), pointer, public :: product_loss_grc(:) ! (g[C or N]/m2/s) total decomposition loss from ALL product pools - real(r8), pointer, public :: cropprod1_grc(:) ! (g[C or N]/m2) grain product pool, 1-year lifespan + real(r8), pointer, public :: cropprod1_grc(:) ! (g[C or N]/m2) crop product pool (grain + biofuel), 1-year lifespan real(r8), pointer, public :: tot_woodprod_grc(:) ! (g[C or N]/m2) total wood product pool ! ------------------------------------------------------------------------ @@ -51,7 +51,7 @@ module CNProductsMod real(r8), pointer :: grain_to_cropprod1_grc(:) ! (g[C or N]/m2/s) grain to 1-year crop product pool ! Fluxes: losses - real(r8), pointer :: cropprod1_loss_grc(:) ! (g[C or N]/m2/s) decomposition loss from 1-yr grain product pool + real(r8), pointer :: cropprod1_loss_grc(:) ! (g[C or N]/m2/s) decomposition loss from 1-yr crop product pool real(r8), pointer :: prod10_loss_grc(:) ! (g[C or N]/m2/s) decomposition loss from 10-yr wood product pool real(r8), pointer :: prod100_loss_grc(:) ! (g[C or N]/m2/s) decomposition loss from 100-yr wood product pool real(r8), pointer :: tot_woodprod_loss_grc(:) ! (g[C or N]/m2/s) decompomposition loss from all wood product pools @@ -181,7 +181,7 @@ subroutine InitHistory(this, bounds) fname = this%species%hist_fname('CROPPROD1'), & units = 'g' // this%species%get_species() // '/m^2', & avgflag = 'A', & - long_name = '1-yr grain product ' // this%species%get_species(), & + long_name = '1-yr crop product (grain+biofuel) ' // this%species%get_species(), & ptr_gcell = this%cropprod1_grc, default=active_if_non_isotope) this%prod10_grc(begg:endg) = spval @@ -245,7 +245,7 @@ subroutine InitHistory(this, bounds) fname = this%species%hist_fname('CROPPROD1', suffix='_LOSS'), & units = 'g' // this%species%get_species() // '/m^2/s', & avgflag = 'A', & - long_name = 'loss from 1-yr grain product pool', & + long_name = 'loss from 1-yr crop product pool', & ptr_gcell = this%cropprod1_loss_grc, default=active_if_non_isotope) this%prod10_loss_grc(begg:endg) = spval @@ -510,17 +510,17 @@ subroutine UpdateProducts(this, bounds, & ! update product state variables do g = bounds%begg, bounds%endg - ! fluxes into wood & grain product pools, from landcover change + ! fluxes into wood & crop product pools, from landcover change this%cropprod1_grc(g) = this%cropprod1_grc(g) + this%dwt_cropprod1_gain_grc(g)*dt this%prod10_grc(g) = this%prod10_grc(g) + this%dwt_prod10_gain_grc(g)*dt this%prod100_grc(g) = this%prod100_grc(g) + this%dwt_prod100_gain_grc(g)*dt - ! fluxes into wood & grain product pools, from harvest + ! fluxes into wood & crop product pools, from harvest this%cropprod1_grc(g) = this%cropprod1_grc(g) + this%grain_to_cropprod1_grc(g)*dt this%prod10_grc(g) = this%prod10_grc(g) + this%hrv_deadstem_to_prod10_grc(g)*dt this%prod100_grc(g) = this%prod100_grc(g) + this%hrv_deadstem_to_prod100_grc(g)*dt - ! fluxes out of wood & grain product pools, from decomposition + ! fluxes out of wood & crop product pools, from decomposition this%cropprod1_grc(g) = this%cropprod1_grc(g) - this%cropprod1_loss_grc(g)*dt this%prod10_grc(g) = this%prod10_grc(g) - this%prod10_loss_grc(g)*dt this%prod100_grc(g) = this%prod100_grc(g) - this%prod100_loss_grc(g)*dt diff --git a/src/biogeochem/CNVegCarbonFluxType.F90 b/src/biogeochem/CNVegCarbonFluxType.F90 index e172122cf2..16b0ada09b 100644 --- a/src/biogeochem/CNVegCarbonFluxType.F90 +++ b/src/biogeochem/CNVegCarbonFluxType.F90 @@ -134,6 +134,9 @@ module CNVegCarbonFluxType real(r8), pointer :: frootc_to_litter_patch (:) ! fine root C litterfall (gC/m2/s) real(r8), pointer :: livestemc_to_litter_patch (:) ! live stem C litterfall (gC/m2/s) real(r8), pointer :: grainc_to_food_patch (:) ! grain C to food for prognostic crop(gC/m2/s) + + real(r8), pointer :: leafc_to_biofuelc_patch (:) ! leaf C to biofuel C (gC/m2/s) + real(r8), pointer :: livestemc_to_biofuelc_patch (:) ! livestem C to biofuel C (gC/m2/s) real(r8), pointer :: grainc_to_seed_patch (:) ! grain C to seed for prognostic crop(gC/m2/s) ! maintenance respiration fluxes @@ -601,6 +604,8 @@ subroutine InitAllocate(this, bounds, carbon_type) allocate(this%cpool_to_grainc_storage_patch (begp:endp)) ; this%cpool_to_grainc_storage_patch (:) = nan allocate(this%livestemc_to_litter_patch (begp:endp)) ; this%livestemc_to_litter_patch (:) = nan allocate(this%grainc_to_food_patch (begp:endp)) ; this%grainc_to_food_patch (:) = nan + allocate(this%leafc_to_biofuelc_patch (begp:endp)) ; this%leafc_to_biofuelc_patch (:) = nan + allocate(this%livestemc_to_biofuelc_patch (begp:endp)) ; this%livestemc_to_biofuelc_patch (:) = nan allocate(this%grainc_to_seed_patch (begp:endp)) ; this%grainc_to_seed_patch (:) = nan allocate(this%grainc_xfer_to_grainc_patch (begp:endp)) ; this%grainc_xfer_to_grainc_patch (:) = nan allocate(this%cpool_grain_gr_patch (begp:endp)) ; this%cpool_grain_gr_patch (:) = nan @@ -832,6 +837,16 @@ subroutine InitHistory(this, bounds, carbon_type) avgflag='A', long_name='grain C to food', & ptr_patch=this%grainc_to_food_patch) + this%leafc_to_biofuelc_patch(begp:endp) = spval + call hist_addfld1d (fname='LEAFC_TO_BIOFUELC', units='gC/m^2/s', & + avgflag='A', long_name='leaf C to biofuel C', & + ptr_patch=this%leafc_to_biofuelc_patch) + + this%livestemc_to_biofuelc_patch(begp:endp) = spval + call hist_addfld1d (fname='LIVESTEMC_TO_BIOFUELC', units='gC/m^2/s', & + avgflag='A', long_name='livestem C to biofuel C', & + ptr_patch=this%livestemc_to_biofuelc_patch) + this%grainc_to_seed_patch(begp:endp) = spval call hist_addfld1d (fname='GRAINC_TO_SEED', units='gC/m^2/s', & avgflag='A', long_name='grain C to seed', & @@ -3518,7 +3533,7 @@ subroutine RestartBulkOnly ( this, bounds, ncid, flag ) dim1name='pft', & long_name='grain C to food', units='gC/m2/s', & interpinic_flag='interp', readvar=readvar, data=this%grainc_to_food_patch) - + call restartvar(ncid=ncid, flag=flag, varname='cpool_to_grainc', xtype=ncd_double, & dim1name='pft', & long_name='allocation to grain C', units='gC/m2/s', & @@ -3855,6 +3870,10 @@ subroutine SetValues ( this, & this%xsmrpool_to_atm_patch(i) = value_patch this%livestemc_to_litter_patch(i) = value_patch this%grainc_to_food_patch(i) = value_patch + + this%leafc_to_biofuelc_patch(i) = value_patch + this%livestemc_to_biofuelc_patch(i) = value_patch + this%grainc_to_seed_patch(i) = value_patch this%grainc_xfer_to_grainc_patch(i) = value_patch this%cpool_to_grainc_patch(i) = value_patch diff --git a/src/biogeochem/CNVegNitrogenFluxType.F90 b/src/biogeochem/CNVegNitrogenFluxType.F90 index f9f2b37215..1da724382b 100644 --- a/src/biogeochem/CNVegNitrogenFluxType.F90 +++ b/src/biogeochem/CNVegNitrogenFluxType.F90 @@ -131,6 +131,8 @@ module CNVegNitrogenFluxType ! litterfall fluxes real(r8), pointer :: livestemn_to_litter_patch (:) ! patch livestem N to litter (gN/m2/s) real(r8), pointer :: grainn_to_food_patch (:) ! patch grain N to food for prognostic crop (gN/m2/s) + real(r8), pointer :: leafn_to_biofueln_patch (:) ! patch leaf N to biofuel N (gN/m2/s) + real(r8), pointer :: livestemn_to_biofueln_patch (:) ! patch livestem N to biofuel N (gN/m2/s) real(r8), pointer :: grainn_to_seed_patch (:) ! patch grain N to seed for prognostic crop (gN/m2/s) real(r8), pointer :: leafn_to_litter_patch (:) ! patch leaf N litterfall (gN/m2/s) real(r8), pointer :: leafn_to_retransn_patch (:) ! patch leaf N to retranslocated N pool (gN/m2/s) @@ -413,6 +415,8 @@ subroutine InitAllocate(this, bounds) allocate(this%npool_to_grainn_storage_patch (begp:endp)) ; this%npool_to_grainn_storage_patch (:) = nan allocate(this%livestemn_to_litter_patch (begp:endp)) ; this%livestemn_to_litter_patch (:) = nan allocate(this%grainn_to_food_patch (begp:endp)) ; this%grainn_to_food_patch (:) = nan + allocate(this%leafn_to_biofueln_patch (begp:endp)) ; this%leafn_to_biofueln_patch (:) = nan + allocate(this%livestemn_to_biofueln_patch (begp:endp)) ; this%livestemn_to_biofueln_patch (:) = nan allocate(this%grainn_to_seed_patch (begp:endp)) ; this%grainn_to_seed_patch (:) = nan allocate(this%grainn_xfer_to_grainn_patch (begp:endp)) ; this%grainn_xfer_to_grainn_patch (:) = nan allocate(this%grainn_storage_to_xfer_patch (begp:endp)) ; this%grainn_storage_to_xfer_patch (:) = nan @@ -1370,7 +1374,7 @@ subroutine Restart (this, bounds, ncid, flag ) long_name='grain N to food', units='gN/m2/s', & interpinic_flag='interp', readvar=readvar, data=this%grainn_to_food_patch) end if - + if (use_crop) then call restartvar(ncid=ncid, flag=flag, varname='npool_to_grainn', xtype=ncd_double, & dim1name='pft', & @@ -1679,6 +1683,8 @@ subroutine SetValues ( this, & i = filter_patch(fi) this%livestemn_to_litter_patch(i) = value_patch this%grainn_to_food_patch(i) = value_patch + this%leafn_to_biofueln_patch(i) = value_patch + this%livestemn_to_biofueln_patch(i) = value_patch this%grainn_to_seed_patch(i) = value_patch this%grainn_xfer_to_grainn_patch(i) = value_patch this%npool_to_grainn_patch(i) = value_patch diff --git a/src/biogeochem/CNVegStructUpdateMod.F90 b/src/biogeochem/CNVegStructUpdateMod.F90 index 6a990ce89a..6f5b19476e 100644 --- a/src/biogeochem/CNVegStructUpdateMod.F90 +++ b/src/biogeochem/CNVegStructUpdateMod.F90 @@ -41,6 +41,8 @@ subroutine CNVegStructUpdate(num_soilp, filter_soilp, & use pftconMod , only : ntmp_corn, nirrig_tmp_corn use pftconMod , only : ntrp_corn, nirrig_trp_corn use pftconMod , only : nsugarcane, nirrig_sugarcane + use pftconMod , only : nmiscanthus, nirrig_miscanthus, nswitchgrass, nirrig_switchgrass + use pftconMod , only : pftcon use clm_varctl , only : spinup_state use clm_time_manager , only : get_rad_step_size @@ -232,7 +234,9 @@ subroutine CNVegStructUpdate(num_soilp, filter_soilp, & if (ivt(p) == ntmp_corn .or. ivt(p) == nirrig_tmp_corn .or. & ivt(p) == ntrp_corn .or. ivt(p) == nirrig_trp_corn .or. & - ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane) then + ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane .or. & + ivt(p) == nmiscanthus .or. ivt(p) == nirrig_miscanthus .or. & + ivt(p) == nswitchgrass .or. ivt(p) == nirrig_switchgrass) then tsai(p) = 0.1_r8 * tlai(p) else tsai(p) = 0.2_r8 * tlai(p) diff --git a/src/main/clm_initializeMod.F90 b/src/main/clm_initializeMod.F90 index dc5e8f8d40..442a77c36b 100644 --- a/src/main/clm_initializeMod.F90 +++ b/src/main/clm_initializeMod.F90 @@ -63,7 +63,12 @@ subroutine initialize1(gindex_ocn) use UrbanParamsType , only: UrbanInput, IsSimpleBuildTemp ! ! !ARGUMENTS - integer, pointer, optional, intent(out) :: gindex_ocn(:) ! If present, this will hold the decomposition of ocean points (which is needed for the nuopc interface); note that this variable is allocated here, and is assumed to start unallocated + ! COMPILER_BUG(wjs, 2020-02-20, intel18.0.3) Although gindex_ocn could be + ! intent(out), intel18.0.3 generates a runtime segmentation fault in runs that don't + ! have this argument present when this is declared intent(out). (It works fine on + ! intel 19.0.2 when declared as intent(out).) See also + ! https://github.com/ESCOMP/CTSM/issues/930. + integer, pointer, optional, intent(inout) :: gindex_ocn(:) ! If present, this will hold the decomposition of ocean points (which is needed for the nuopc interface); note that this variable is allocated here, and is assumed to start unallocated ! ! !LOCAL VARIABLES: integer :: ier ! error status diff --git a/src/main/pftconMod.F90 b/src/main/pftconMod.F90 index 27a61403bc..9b7eefa51b 100644 --- a/src/main/pftconMod.F90 +++ b/src/main/pftconMod.F90 @@ -134,6 +134,7 @@ module pftconMod real(r8), allocatable :: slatop (:) ! SLA at top of canopy [m^2/gC] real(r8), allocatable :: dsladlai (:) ! dSLA/dLAI [m^2/gC] real(r8), allocatable :: leafcn (:) ! leaf C:N [gC/gN] + real(r8), allocatable :: biofuel_harvfrac (:) ! fraction of stem and leaf cut for harvest, sent to biofuels [unitless] real(r8), allocatable :: flnr (:) ! fraction of leaf N in Rubisco [no units] real(r8), allocatable :: woody (:) ! woody lifeform flag (0 or 1) real(r8), allocatable :: lflitcn (:) ! leaf litter C:N (gC/gN) @@ -356,7 +357,8 @@ subroutine InitAllocate (this) allocate( this%fnitr (0:mxpft) ) allocate( this%slatop (0:mxpft) ) allocate( this%dsladlai (0:mxpft) ) - allocate( this%leafcn (0:mxpft) ) + allocate( this%leafcn (0:mxpft) ) + allocate( this%biofuel_harvfrac (0:mxpft) ) allocate( this%flnr (0:mxpft) ) allocate( this%woody (0:mxpft) ) allocate( this%lflitcn (0:mxpft) ) @@ -658,6 +660,9 @@ subroutine InitRead(this) call ncd_io('leafcn', this%leafcn, 'read', ncid, readvar=readv, posNOTonfile=.true.) if ( .not. readv ) call endrun(msg=' ERROR: error in reading in pft data'//errMsg(sourcefile, __LINE__)) + + call ncd_io('biofuel_harvfrac', this%biofuel_harvfrac, 'read', ncid, readvar=readv, posNOTonfile=.true.) + if ( .not. readv ) call endrun(msg=' ERROR: error in reading in pft data'//errMsg(sourcefile, __LINE__)) call ncd_io('flnr', this%flnr, 'read', ncid, readvar=readv, posNOTonfile=.true.) if ( .not. readv ) call endrun(msg=' ERROR: error in reading in pft data'//errMsg(sourcefile, __LINE__)) @@ -1172,6 +1177,10 @@ subroutine InitRead(this) if ( this%pprodharv10(i) > 1.0_r8 .or. this%pprodharv10(i) < 0.0_r8 )then call endrun(msg=' ERROR: pprodharv10 outside of range.'//errMsg(sourcefile, __LINE__)) end if + if (i < npcropmin .and. this%biofuel_harvfrac(i) /= 0._r8) then + call endrun(msg=' ERROR: biofuel_harvfrac non-zero for a non-prognostic crop PFT.'//& + errMsg(sourcefile, __LINE__)) + end if end do end if @@ -1282,6 +1291,7 @@ subroutine Clean(this) deallocate( this%slatop) deallocate( this%dsladlai) deallocate( this%leafcn) + deallocate( this%biofuel_harvfrac) deallocate( this%flnr) deallocate( this%woody) deallocate( this%lflitcn) diff --git a/tools/mksurfdata_map/src/mksurfdat.F90 b/tools/mksurfdata_map/src/mksurfdat.F90 index acba4e8719..236740282c 100644 --- a/tools/mksurfdata_map/src/mksurfdat.F90 +++ b/tools/mksurfdata_map/src/mksurfdat.F90 @@ -93,6 +93,7 @@ program mksurfdat type(pct_pft_type), allocatable :: pctnatpft_max(:) ! % of grid cell maximum PFTs of the time series type(pct_pft_type), allocatable :: pctcft(:) ! % of grid cell that is crop, and breakdown into CFTs type(pct_pft_type), allocatable :: pctcft_max(:) ! % of grid cell maximum CFTs of the time series + real(r8) :: harvest_initval ! initial value for harvest variables real(r8), pointer :: harvest1D(:) ! harvest 1D data: normalized harvesting real(r8), pointer :: harvest2D(:,:) ! harvest 1D data: normalized harvesting real(r8), allocatable :: pctgla(:) ! percent of grid cell that is glacier @@ -568,7 +569,14 @@ program mksurfdat ndiag=ndiag, pctlnd_o=pctlnd_pft, pctnatpft_o=pctnatpft, pctcft_o=pctcft) ! Create harvesting data at model resolution - call mkharvest_init( ns_o, spval, harvdata, mksrf_fhrvtyp ) + if (all_veg) then + ! In this case, we don't call mkharvest, so we want the harvest variables to be + ! initialized reasonably. + harvest_initval = 0._r8 + else + harvest_initval = spval + end if + call mkharvest_init( ns_o, harvest_initval, harvdata, mksrf_fhrvtyp ) if ( .not. all_veg )then call mkharvest( ldomain, mapfname=map_fharvest, datfname=mksrf_fhrvtyp, &