diff --git a/.github/ISSUE_TEMPLATE/03_documentation.md b/.github/ISSUE_TEMPLATE/03_documentation.md
index e6c3fa0ff8..5538f047a0 100644
--- a/.github/ISSUE_TEMPLATE/03_documentation.md
+++ b/.github/ISSUE_TEMPLATE/03_documentation.md
@@ -3,7 +3,7 @@ name: Documentation
about: Something should be added to or fixed in the documentation
---
-
+(Please see our [contribution guidelines for documentation](https://escomp.github.io/CTSM/users_guide/working-with-documentation/docs-intro.html#contribution-guidelines).)
### What sort(s) of documentation issue is this?
- [ ] Something is missing.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index c4a381383b..6ef2db80b6 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,24 +1,41 @@
+
+
+
+
+
### Description of changes
+
+
### Specific notes
-Contributors other than yourself, if any:
+**Contributors other than yourself, if any:**
+- (Replace this text and add more list items as needed)
-CTSM Issues Fixed (include github issue #):
+**CTSM issues resolved or otherwise addressed, if any:**
+- (Replace this text, including GitHub issue #, and add more list items as needed)
+
+
-Are answers expected to change (and if so in what way)?
+**If answers are expected to change, describe (delete this line otherwise):**
-Any User Interface Changes (namelist or namelist defaults changes)?
+**Any user interface changes (namelist or namelist defaults changes)?**
-Does this create a need to change or add documentation? Did you do so?
+**Testing planned or performed, if any:**
+- [ ] (Replace this text and add more list items as needed)
+
-Testing performed, if any:
-(List what testing you did to show your changes worked as expected)
-(This can be manual testing or running of the different test suites)
-(Documentation on system testing is here: https://github.com/ESCOMP/ctsm/wiki/System-Testing-Guide)
-(aux_clm on derecho for intel/gnu and izumi for intel/gnu/nag/nvhpc is the standard for tags on master)
-**NOTE: Be sure to check your coding style against the standard
-(https://github.com/ESCOMP/ctsm/wiki/CTSM-coding-guidelines) and review
-the list of common problems to watch out for
-(https://github.com/ESCOMP/CTSM/wiki/List-of-common-problems).**
+
+### Requirements before merge:
+- [ ] I have followed the [CTSM contribution guidelines](https://github.com/ESCOMP/CTSM/blob/master/CONTRIBUTING.md).
+
+- [ ] The code in this PR branch builds with no errors.
+- [ ] The code in this PR branch runs with no errors. **Briefly describe tested configuration(s):**
+- [ ] This either (a) does not change answers, (b) it only changes answers at roundoff level, or (c) I have performed a scientific evaluation of the answer changes. **Which?:**
+
+- [ ] I have reviewed relevant parts of the CLM documentation [Tech Note](https://escomp.github.io/CTSM/tech_note/index.html) or [User's Guide](https://escomp.github.io/CTSM/users_guide/index.html) to determine if anything needs to be changed or added. **If it does, describe:**
+- [ ] This PR either (a) does not create a need to update the documentation or (b) includes required documentation updates (see [guidelines for contributing documentation](https://escomp.github.io/CTSM/users_guide/working-with-documentation/docs-intro.html#contribution-guidelines)). **Which?:**
diff --git a/.github/workflows/docs-build-and-deploy.yml b/.github/workflows/docs-build-and-deploy.yml
index 55ad033ed7..7951532848 100644
--- a/.github/workflows/docs-build-and-deploy.yml
+++ b/.github/workflows/docs-build-and-deploy.yml
@@ -11,8 +11,8 @@ on:
- '!doc/*ChangeSum*'
- '!doc/UpdateChangelog.pl'
# Include all include::ed files outside doc/ directory!
- - 'src/README.unit_testing'
- - 'tools/README'
+ - 'src/README.unit_testing.md'
+ - 'tools/README.md'
- 'doc/test/test_container_eq_ctsm_pylib.sh'
# Allows you to run this workflow manually from the Actions tab
diff --git a/.github/workflows/docs-pr-failure-post-comment.yml b/.github/workflows/docs-pr-failure-post-comment.yml
new file mode 100644
index 0000000000..2a8928b28c
--- /dev/null
+++ b/.github/workflows/docs-pr-failure-post-comment.yml
@@ -0,0 +1,66 @@
+name: Post PR comment with doc-build failure log
+
+env:
+ DOCS_FAILURE_ARTIFACT: test-build-docs-container_failed
+
+on:
+ workflow_run:
+ workflows: ["Test building docs when they're updated"]
+ types: [completed]
+
+jobs:
+ comment:
+ if: >-
+ github.event.workflow_run.event == 'pull_request'
+ && github.event.workflow_run.conclusion == 'failure'
+ runs-on: ubuntu-latest
+ permissions:
+ pull-requests: write
+ actions: read
+ steps:
+ - name: Check for failure artifact
+ id: check
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ REPO: ${{ github.repository }}
+ run: |
+ gh api repos/$REPO/actions/runs/${{ github.event.workflow_run.id }}/artifacts \
+ --jq '.artifacts[] | select(.name == "${{ env.DOCS_FAILURE_ARTIFACT }}") | .id' > artifact_id.txt
+
+ if [ -s artifact_id.txt ]; then
+ echo "found=true" >> $GITHUB_OUTPUT
+ else
+ echo "found=false" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Download logs
+ if: steps.check.outputs.found == 'true'
+ uses: actions/download-artifact@v4
+ with:
+ name: ${{ env.DOCS_FAILURE_ARTIFACT }}
+ path: ${{ env.DOCS_FAILURE_ARTIFACT }}
+ run-id: ${{ github.event.workflow_run.id }}
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Post comment
+ if: steps.check.outputs.found == 'true'
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ REPO: ${{ github.repository }}
+ run: |
+ PR_NUMBER=$(cat "${DOCS_FAILURE_ARTIFACT}/pr_number.txt")
+
+ {
+ echo "### ❌ Docs build failed"
+ echo
+ echo ''
+ echo "Build logs"
+ echo
+ echo '```'
+ cat "${DOCS_FAILURE_ARTIFACT}/build.log"
+ echo '```'
+ echo
+ echo ""
+ } > comment-body.md
+
+ gh pr comment "$PR_NUMBER" --repo "$REPO" --body-file comment-body.md
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 780ba31b64..4832192fd9 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -13,8 +13,8 @@ on:
- '!doc/UpdateChangelog.pl'
- '.github/workflows/docs-common.yml'
# Include all include::ed files outside doc/ directory!
- - 'src/README.unit_testing'
- - 'tools/README'
+ - 'src/README.unit_testing.md'
+ - 'tools/README.md'
- 'doc/test/test_container_eq_ctsm_pylib.sh'
pull_request:
@@ -27,8 +27,8 @@ on:
- '!doc/UpdateChangelog.pl'
- '.github/workflows/docs-common.yml'
# Include all include::ed files outside doc/ directory!
- - 'src/README.unit_testing'
- - 'tools/README'
+ - 'src/README.unit_testing.md'
+ - 'tools/README.md'
- 'doc/test/test_container_eq_ctsm_pylib.sh'
workflow_dispatch:
@@ -61,4 +61,159 @@ jobs:
- name: Build docs using Docker (Podman has trouble on GitHub runners)
id: build-docs
run: |
- cd doc && ./build_docs -b ${PWD}/_build -c -d
+ set -o pipefail
+ mkdir -p build-logs
+ cd doc && PYTHONUNBUFFERED=1 ./build_docs -b ${PWD}/_build -c -d 2>&1 | tee >(sed -E $'s/\x1b\\[[0-9;]*[a-zA-Z]//g' > "${GITHUB_WORKSPACE}/build-logs/build.log")
+ # The tee writes build.log for the PR comment (posted by docs-pr-failure-post-comment.yml); the inner sed strips ANSI color codes that would otherwise render as garbage in the comment.
+ # PYTHONUNBUFFERED=1 because otherwise the teed log will be out of order
+
+ # The rest of the steps only trigger on failure of above build-docs step.
+ # They upload logs that will be used by the docs-pr-failure-post-comment.yml workflow.
+
+ - name: Record PR number on failure
+ if: failure() && steps.build-docs.outcome == 'failure' && github.event_name == 'pull_request'
+ run: |
+ mkdir -p build-logs
+ echo "${{ github.event.pull_request.number }}" > build-logs/pr_number.txt
+
+ - name: Upload logs on failure
+ if: failure() && steps.build-docs.outcome == 'failure'
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: test-build-docs-container_failed
+ path: build-logs/
+
+ check-docs-style:
+ if: ${{ always() }}
+ name: Check documentation against style guide
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Disallow fake degree signs
+ if: always()
+ # Prevents anyone from using the masculine ordinal indicator, as well as superscript-o/O if
+ # preceded by a digit in
+ # - Markdown math style,
+ # - reStructuredText math style,
+ # - MyST text style, and
+ # - reStructuredText text style,
+ # with or without curly brackets and/or spaces.
+ #
+ # What follows is an explanation of the regex. Keep in mind that the superscript-o will
+ # match whether it's an uppercase O or lowercase o because of the -i flag to grep, so that's
+ # not handled in the regex.
+ #
+ # Markdown math style:
+ # Markdown math superscripts look like $^o$. There can also be curly brackets, like
+ # $^{o}$, which would allow you to put multiple characters (including spaces) in the
+ # superscript. The preceding digit can be inside or outside the dollar signs, again with
+ # or without spaces.
+ #
+ # There are two regex patterns separated by |, to handle the cases where the preceding
+ # digit is outside or inside the dollar signs, respectively:
+ # [0-9]\s*\\$\s*\^\{?\s*o
+ # [0-9] Any digit
+ # \s* Any number of spaces, including none
+ # \\$ A literal dollar sign
+ # \s* Any number of spaces, including none
+ # \^ A literal caret
+ # \{? Optionally a literal left curly bracket
+ # \s* Any number of spaces, including none
+ # o Lowercase o
+ # \\\$[0-9]+\s*\^\{?\s*o\s*\}?
+ # \\\$ A literal dollar sign
+ # [0-9]+ One or more digits
+ # \s* Any number of spaces, including none
+ # \^ A literal caret
+ # \{? Optionally a literal left curly bracket
+ # \s* Any number of spaces, including none
+ # o Lowercase o
+ # \s* Any number of spaces, including none
+ # \}? Optionally a literal right curly bracket
+ #
+ # MyST text style:
+ # MyST text superscripts look like {sup}`o`. Here's the regex:
+ # [0-9]\s*\{sup}\`\s*o\`
+ # [0-9] Any digit
+ # \s* Any number of spaces, including none
+ # \{ A literal left curly bracket
+ # sup The text "sup" designating the superscript role
+ # \} A literal right curly bracket
+ # \` A literal backtick
+ # \s* Any number of spaces, including none
+ # o Lowercase o
+ # \` A literal backtick
+ #
+ # reStructuredText text style
+ # Similar to MyST text superscripts, but with colons instead of curly brackets: :sup:`o`.
+ # Another difference is that spaces aren't allowed inside the backticks. Also, there has
+ # to be a space preceding the first colon; this can be preceded by a backslash to avoid
+ # putting an extraneous space in the rendered text. Here's the regex:
+ # [0-9]\\\? :sup:\`o\`
+ # [0-9] Any digit
+ # \\\? Optionally a literal backslash
+ # (A literal space)
+ # :sup: The text ":sup:" designating the superscript role
+ # \` A literal backtick
+ # o Lowercase o
+ # \` A literal backtick
+ #
+ # reStructuredText math style
+ # Mostly the same as reStructuredText text superscripts, but with :math: instead of
+ # :sup:. In addition, the superscript can optionally be in curly brackets. There can be
+ # a space after the first backtick but not before the last one.
+ #
+ # There are two regex patterns separated by |, to handle the cases where the preceding
+ # digit is outside or inside the dollar signs, respectively:
+ # [0-9]\\\? :math:\`\s*\^\{?\s*o\s*\}?\`
+ # [0-9] Any digit
+ # \\\? Optionally a literal backslash
+ # (A literal space)
+ # :math: The text ":math:" designating the math role
+ # \` A literal backtick
+ # \s* Any number of spaces, including none
+ # \^ A literal caret
+ # \{? Optionally a literal left curly bracket
+ # \s* Any number of spaces, including none
+ # o Lowercase o
+ # \s* Any number of spaces, including none
+ # \}? Optionally a literal right curly bracket
+ # \` A literal backtick
+ # :math:\`\s*[0-9]+\s*\^\{?\s*o\s*\}?\`
+ # :math: The text ":math:" designating the math role
+ # \` A literal backtick
+ # \s* Any number of spaces, including none
+ # [0-9]+ One or more digits
+ # \s* Any number of spaces, including none
+ # \^ A literal caret
+ # \{? Optionally a literal left curly bracket
+ # \s* Any number of spaces, including none
+ # o Lowercase o
+ # \s* Any number of spaces, including none
+ # \}? Optionally a literal right curly bracket
+ # \` A literal backtick
+ run: |
+ set +e
+ instances_of_fake_degree_signs="$(grep -ionE "[0-9]\s*\\$\s*\^\{?\s*o|\\\$[0-9]+\s*\^\{?\s*o\s*\}?|[0-9]\s*\{sup}\`\s*o\`|[0-9]\\\? :sup:\`o\`|[0-9]\\\? :math:\`\s*\^\{?\s*o\s*\}?\`| :math:\`\s*[0-9]+\s*\^\{?\s*o\s*\}?\`|º" $(find doc -name "*.md" -or -name "*.rst"))"
+ set -e
+ if [[ "$instances_of_fake_degree_signs" ]] then
+ echo -e "Instances of superscript-o or masculine ordinal indicator (º) instead of degree sign (°):\n${instances_of_fake_degree_signs}"
+ echo -e "\nSee https://escomp.github.io/CTSM/users_guide/working-with-documentation/docs-style-guide.html"
+ exit 1
+ fi
+ exit 0
+
+ - name: Disallow curly apostrophes/quotes
+ if: always()
+ run: |
+ set +e
+ instances_of_curlies="$(grep -onE "“|”|‘|’" $(find doc -name "*.md" -or -name "*.rst"))"
+ set -e
+ if [[ "$instances_of_curlies" ]] then
+ echo -e "Instances of curly apostrophes and/or quote marks:\n${instances_of_curlies}"
+ exit 1
+ fi
+ exit 0
diff --git a/.gitmodules b/.gitmodules
index 434c985738..b5156d3190 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -28,7 +28,7 @@
[submodule "fates"]
path = src/fates
url = https://github.com/NGEET/fates
-fxtag = sci.1.91.1_api.43.1.0
+fxtag = sci.1.92.5_api.46.0.0
fxrequired = AlwaysRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/NGEET/fates
@@ -68,7 +68,7 @@ fxDONOTUSEurl = https://github.com/ESCOMP/mizuRoute
[submodule "ccs_config"]
path = ccs_config
url = https://github.com/ESMCI/ccs_config_cesm.git
-fxtag = ccs_config_cesm1.0.79
+fxtag = ccs_config_cesm1.0.83
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESMCI/ccs_config_cesm.git
@@ -76,7 +76,7 @@ fxDONOTUSEurl = https://github.com/ESMCI/ccs_config_cesm.git
[submodule "cime"]
path = cime
url = https://github.com/ESMCI/cime
-fxtag = cime6.1.169
+fxtag = cime6.2.2
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESMCI/cime
@@ -84,7 +84,7 @@ fxDONOTUSEurl = https://github.com/ESMCI/cime
[submodule "cmeps"]
path = components/cmeps
url = https://github.com/ESCOMP/CMEPS.git
-fxtag = cmeps1.1.37
+fxtag = cmeps1.1.47
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESCOMP/CMEPS.git
@@ -92,7 +92,7 @@ fxDONOTUSEurl = https://github.com/ESCOMP/CMEPS.git
[submodule "cdeps"]
path = components/cdeps
url = https://github.com/ESCOMP/CDEPS.git
-fxtag = cdeps1.0.93
+fxtag = cdeps1.0.96
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESCOMP/CDEPS.git
@@ -100,7 +100,7 @@ fxDONOTUSEurl = https://github.com/ESCOMP/CDEPS.git
[submodule "share"]
path = share
url = https://github.com/ESCOMP/CESM_share
-fxtag = share1.1.19
+fxtag = share1.1.20
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESCOMP/CESM_share
@@ -124,7 +124,7 @@ fxDONOTUSEurl = https://github.com/ESMCI/mpi-serial
[submodule "doc-builder"]
path = doc/doc-builder
url = https://github.com/ESMCI/doc-builder
-fxtag = v2.2.6
+fxtag = v3.2.1
fxrequired = ToplevelOptional
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESMCI/doc-builder
diff --git a/README b/README
deleted file mode 100644
index deca3cd8d2..0000000000
--- a/README
+++ /dev/null
@@ -1,184 +0,0 @@
-$CTSMROOT/README 11/24/2025
-
-Community Terrestrial Systems Model (CTSM) science version 5.4 series -- source code, tools,
-offline-build and test scripts. This gives you everything you need
-to run CTSM with CESM with the CMEPS driver and CDEPS data models to provide CRUJRA or GSWP3 forcing data (some older options also available) in
-place of a modeled atmosphere.
-
-CMEPS is the Community Mediator for Earth Prediction Systems. And CDEPS is the
-Community Data Models for Earth Prediction System. They are both NUOPC based models
-used to drive the CESM (Community Earth System Model) of which CTSM is a component of.
-NUOPC is the National Unified Operational Prediction Capability a standard way of building
-coupled model systems. The NUOPC layer is based on the Earth System Modeling Framework (ESMF).
-
-For lists of current bugs (issues) and current development see the CTSM GitHub page:
-
-https://github.com/ESCOMP/CTSM
-
-For Code of Conduct (how to work with each other on the CTSM project):
-
-https://github.com/ESCOMP/CTSM?tab=coc-ov-file
-
-INFORMATION ON THE CMEPS DRIVER:
-
-https://escomp.github.io/CMEPS
-
-https://earthsystemmodeling.org/nuopc/
-
-IMPORTANT NOTE ON CESM CHECKOUT VERSUS A CTSM CHECKOUT:
-
-If this is the top level directory from making a clone of CTSM the
-directory structure is a little bit different than if CTSM is from
-a clone of the entire CESM. If this is part of CESM this directory
-will be under components/clm alongside other CESM component models.
-For a CTSM checkout this will be the top level directory.
-
-Other documentation will refer to $CTSMROOT and it means the directory
-that this file is at. CIMEROOT is the directory where "cime" is for
-this checkout. For a CESM checkout $CIMEROOT will be the "cime" directory
-beneath the top level directory. For a CTSM checkout $CIMEROOT will
-be $CTSMROOT/cime.
-
-IMPORTANT NOTE ABOUT (deprecated)
-
-Anything marked with (deprecated) is something is going to be removed in a future update.
-Often this means it will be replaced with something else.
-
-
-General directory structure ($CTSMROOT):
-
-doc --------------- Documentation of CTSM.
-bld --------------- build-namelist scripts for CTSM.
-src --------------- CTSM Source code.
-lilac ------------- Lightweight Infrastructure for Land-Atmosphere Coupling (for coupling to a host atmosphere model)
-tools ------------- CTSM Offline tools to prepare input datasets and process output.
-cime_config ------- Configuration files of cime for compsets and CTSM settings
-bin/git-fleximod -- Script to manage the needed sub-component source directories (handled with git submodule)
-py_env_create ----- Script to setup the python environment for CTSM python tools using conda
-python ------------ Python modules used in tools and testing and automated checking of ALL CTSM python scripts
-
-Directory structure only for a CTSM checkout:
-
-components -------- Other active sub-components needed for CTSM to run (river routing and land-ice models)
-libraries --------- CESM libraries: PIO (deprecated)
-share ------------- CESM shared code
-ccs_config -------- CIME configure files (for grids, compsets, and machines) for CESM
-
-cime/scripts --------------- cesm/cime driver scripts
-
-components/cmeps -------------------- CESM top level driver (for NUOPC driver [which is the default]) source code.
-components/cdeps -------------------- CESM top level data model shared code (for NUOPC driver).
-components/cism --------------------- CESM Community land Ice Sheet Model.
-components/mosart ------------------- Model for Scale Adaptive River Transport
-components/mizuroute ---------------- Reached based river transport model for water routing
- (allows both gridded river and Hydrologic Responce Unit river grids)
-components/rtm ---------------------- CESM River Transport Model.
-
-Top level documentation ($CTSMROOT):
-
-README ------------------- This file
-README.md ---------------- File that displays on github under https::/github.com/ESCOMP/CTSM.git
-README.rst --------------- File that displays under the project in github
-README_GITFLEXIMOD.rst --- Information on how to work with git-fleximod for CTSM
-WhatsNewInCTSM5.4.md ----- Overview document of the changes between ctsm5.3 and ctsm5.4
-Copyright ---------------- CESM Copyright file
-doc/UpdateChangeLog.pl --- Script to add documentation on a tag to the
- ChangeLog/ChangeSum files
-doc/ChangeLog ------------ Documents different CTSM versions
-doc/ChangeSum ------------ Summary documentation of different CTSM versions
-
-doc/design --------------- Software Engineering and code design document files
-
-Checklists for standard Software Engineering tasks
-
-./doc/README.CHECKLIST.master_tags
-./bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md
-
-Documentation of Namelist Items: (view the following in a web browser)
-
-bld/namelist_files/namelist_definition_ctsm.xml --- Definition of all namelist items
-bld/namelist_files/namelist_defaults_ctsm.xml ----- Default values
-
-=============================================================================================
-Important files in main directories (under $CTSMROOT):
-=============================================================================================
-
-run_sys_tests --------------- Python script to send the standard CTSM testing off (submits
- the create_test test suite for several different compilers on the
- machines we do standard CTSM testing on).
-
-parse_cime.cs.status -------- Script to parse test status files cs.status.* created by create_test
- (can be used along with run_sys_tests)
-doc/Quickstart.GUIDE -------- Quick guide to using NUOPC scripts.
-doc/IMPORTANT_NOTES.md ------ Some important notes about this version of
- CTSM, configuration modes and namelist items
- that are not validated or functional.
-doc/ChangeLog --------------- Detailed list of changes for each model version.
-doc/ChangeSum --------------- Summary one-line list of changes for each
- model version.
-doc/UsersGuide -------------- CTSM Users Guide
-
-bld/README ------------------ Description of how to use the build-namelist scripts.
-bld/build-namelist ---------- Lower level script to build CTSM namelists.
-
-cime_config/buildnml ------------- Build the CTSM namelist for CIME
-cime_config/buildlib ------------- Build the CTSM library
-cime_config/config_compsets.xml -- Define CTSM compsets
-cime_config/config_component.xml - Define CTSM XML settings
-cime_config/config_tests.xml ----- Define CTSM specific tests
-cime_config/config_pes.xml ------- Define Processor layouts for various CTSM grids and compsets
-cime_config/testdefs ------------- Directory for specification of CTSM testing
-cime_config/testdefs/ExpectedTestFails.xml -- List of tests that are expected to fail
-cime_config/usermods_dirs/clm ---- Directories of sets of user-modification subdirs
- (These are directories that add specific user modifications to
- simulations created using "cime/scripts/create_newcase --user-mods-dir clm/*)
-
-tools/mksurfdata_esmf --------- Directory to build program to create surface dataset
- at any resolution.
-tools/mkmapgrids -------------- NCL script to create a SCRIP grid file for a regular lat/lon grid (deprecated)
-tools/crop_calendars ---------- Tools to process and process and create crop calendar datasets for CTSM
-tools/modify_input_files ------ Script to modify existing CTSM input datasets in standard ways
-tools/site_and_regional ------- Scripts to create input datasets for single site and regional
- cases, primarily by modifying existing global datasets
-tools/contrib ----------------- Miscellansous useful scripts for pre and post processing
- as well as case management of CTSM. These scripts are
- contributed by users and may not be as well tested or
- supported as other tools.
-.vscode ----------------------- Suggested settings for using MS Visual Studio code with CTSM.
-
-
-=============================================================================================
-Source code directory structure:
-=============================================================================================
-
-src/biogeochem ---- Biogeochemisty
-src/main ---------- Main control and high level code
-src/cpl ----------- Land model high level caps for NUOPC driver (and LILAC)
-src/biogeophys ---- Biogeophysics (Hydrology)
-src/dyn_subgrid --- Dynamic land unit change
-src/init_interp --- Online interpolation
-scr/fates --------- FATES model and sub-directories
- Functionally Assembled Terrestrial Ecosystem Simulator (FATES)
- Ecosystem Demography model
-src/utils --------- Utility codes
-src/self_tests ---- Internal testing (unit tests run as a part of a CTSM system test)
-src/unit_test_shr - Unit test shared modules for unit testing
-src/unit_test_stubs Unit test stubs that replicate CTSM code simpler
-
-=============================================================================================
- QUICKSTART: using the NUOPC driver scripts
-=============================================================================================
-
- cd $CIMEROOT/scripts
- ./create_newcase # get help on how to run create_newcase
- ./create_newcase --case testI --res f09_t232 --compset I2000Clm60BgcCrop
- # create new "I" case for default machine at 1.9x2.5_gx1v7
- # "I2000Clm60BgcCrop" case is clm6_0 physics, CDEPS, and inactive ice/ocn/glc
- # and MOSART for river-routing
- cd testI
- ./case.setup # create the $CASE.run file
- ./case.build # build model and create namelists
- ./case.submit # submit script
- # (NOTE: ./xmlchange RESUBMIT=10 to set RESUBMIT to number
- # # of times to automatically resubmit -- 10 in this example)
-
diff --git a/README.CHECKLIST.new_case b/README.CHECKLIST.new_case
deleted file mode 100644
index 71ba4a8284..0000000000
--- a/README.CHECKLIST.new_case
+++ /dev/null
@@ -1,42 +0,0 @@
-$CTSMROOT/README.CHECKLIST.new_case 03/01/2021
-
-This is a check list of things to do when setting up a new case in order to help ensure everything is correct. There
-are lots of tiny details that need to be right and it's easy to get something wrong. So the first screening to make
-sure it's right is for you to carefully check through your case and make sure it's right.
-
-The following assumes you have created a new case and are in it's case directory.
-
-General Checklist to always do:
-
- - Make sure CLM_ env settings are correct
- (./xmlquery -p CLM)
- - Make sure you are using the correct CLM_PHYSICS_VERSION
- (./xmlquery -p CLM_PHYSICS_VERSION)
- - Make sure you are running the appropriate overall CLM vegetation model.
- The "-bgc" option of either Satellite Phenology (sp), or
- Full BioGeoChemistry (bgc), or FATES (fates)
- (./xmlquery -p CLM_BLDNML_OPTS)
- - Also if you are running the bgc model, check to see if you should be running the prognostic crop model
- (option -crop in CLM_BLDNML_OPTS)
- - Make sure the LND_TUNING_MODE is correct
- (./xmlquery LND_TUNING_MODE)
- - For an "I compset" make sure you are running over the right forcing years
- (usually ./xmlquery -p DATM_YR)
- - Again for an "I compset" make sure the DATM streams are operating over the right years
- (look at the CaseDocs/datm.streams.xml file)
- - First and align year for streams should be the start year of a historical simulation
- (./xmlquery RUN_STARTDATE)
- (grep stream_year_first CaseDocs/lnd_in; grep model_year_align CaseDocs/lnd_in)
- - Last year for streams should be the last year you are going to run to (or beyond it)
- (grep stream_year_last CaseDocs/lnd_in)
- - Make sure you are starting from appropriate spunup initial conditions
- (Check the run-type with: ./xmlquery RUN_TYPE)
- (check finidat for a startup or hybrid simulation: grep finidat CaseDocs/lnd_in)
- (check nrevsn for a branch simulation: grep nrevsn CaseDocs/lnd_in)
- - Run for a month (or some short period) and go over the log files and especially the settings and files read in them.
- (For an I case you especially want to look at the lnd.log and atm.log files)
-
-Some other suggestions on things that can be done:
-
-- Compare namelist files to an existing case if you are doing something almost the same as a previous simulation.
-- Ask another collaborator to look over your case directory
diff --git a/README.CHECKLIST.new_case.md b/README.CHECKLIST.new_case.md
new file mode 100755
index 0000000000..868cfe1c09
--- /dev/null
+++ b/README.CHECKLIST.new_case.md
@@ -0,0 +1,27 @@
+`$CTSMROOT/README.CHECKLIST.new_case` 03/01/2021
+
+This is a check list of things to do when setting up a new case in order to help ensure everything is correct. There are lots of tiny details that need to be right and it's easy to get something wrong. So the first screening to make sure it's right is for you to carefully check through your case and make sure it's right.
+
+The following assumes you have created a new case and are in its case directory.
+
+General Checklist to always do:
+
+- Make sure `CLM_` environment settings are correct: `./xmlquery -p CLM`
+- Make sure you are using the correct `CLM_PHYSICS_VERSION`: `./xmlquery -p CLM_PHYSICS_VERSION`
+- Make sure you are running the appropriate overall CLM vegetation model, i.e. the `-bgc` option of either Satellite Phenology (`sp`) or Full BioGeoChemistry (`bgc`) or FATES (`fates`): `./xmlquery -p CLM_BLDNML_OPTS`
+- If you are running the `bgc` model, check to see if you should be running the prognostic crop model: option `-crop` in `CLM_BLDNML_OPTS`
+- Make sure the `LND_TUNING_MODE` is correct: `./xmlquery LND_TUNING_MODE`
+- For an "`I` compset" make sure you are running over the correct forcing years: usually `./xmlquery -p DATM_YR`
+- For an "`I` compset" make sure the DATM streams are operating over the correct years: look at the `CaseDocs/datm.streams.xml` file
+- First and align year for streams should be the start year of a historical simulation: `./xmlquery RUN_STARTDATE; grep stream_year_first CaseDocs/lnd_in; grep model_year_align CaseDocs/lnd_in`
+- Last year for streams should be the last year you are going to run to (or beyond it): `grep stream_year_last CaseDocs/lnd_in`
+- Make sure you are starting from appropriate spunup initial conditions:
+ - Check the run-type with: `./xmlquery RUN_TYPE`
+ - Check finidat for a startup or hybrid simulation: `grep finidat CaseDocs/lnd_in`
+ - Check nrevsn for a branch simulation: `grep nrevsn CaseDocs/lnd_in`
+- Run for a month (or some short period) and go over the log files and especially the settings and files read in them: for an `I` case you especially want to look at the `lnd.log` and `atm.log` files
+
+Some other suggestions on things that can be done:
+
+- Compare namelist files to an existing case if you are doing something almost the same as a previous simulation
+- Ask another collaborator to look over your case directory
\ No newline at end of file
diff --git a/README_GITFLEXIMOD.md b/README_GITFLEXIMOD.md
new file mode 100755
index 0000000000..1ed51a8b59
--- /dev/null
+++ b/README_GITFLEXIMOD.md
@@ -0,0 +1,110 @@
+# Obtaining the full model code and associated scripting infrastructure
+
+CTSM is released via GitHub. You will need some familiarity with git in order
+to modify the code and commit these changes. However, to simply checkout and run the
+code, no git knowledge is required other than what is documented in the following steps.
+
+To obtain the CTSM code you need to do the following:
+
+1. Clone the repository. :
+
+ git clone https://github.com/ESCOMP/CTSM.git my_ctsm_sandbox
+
+ This will create a directory `my_ctsm_sandbox/` in your current working directory.
+
+2. Run `./bin/git-fleximod update`:
+
+ cd my_ctsm_sandbox
+ ./bin/git-fleximod update
+ ./bin/git-fleximod --help # for a user's guide
+
+ `git-fleximod` is a package manager that will
+ populate the ctsm directory with the relevant versions of each of the
+ components along with the CIME infrastructure code.
+ Additional documentation for git-fleximod appears here:
+
+
+"components" here refers to seperate git repositories for seperable parts of
+the code (such as the MOSART or mizuRoute river models). Because they are
+managed with "submodule" in git hereafter we will refer to them as "submodule(s)".
+
+At this point you have a working version of CTSM.
+
+To see full details of how to set up a case, compile and run, see the CIME documentation at .
+
+## More details on git-fleximod
+
+The file `.gitmodules` in your top-level CTSM directory tells
+`git-fleximod` which tag/branch of each submodule
+should be brought in to generate your sandbox.
+
+NOTE: If you manually modify a submodule without updating `.gitmodules`,
+e.g. switch to a different tag, then rerunning git-fleximod will warn you of
+local changes you need to resolve.
+git-fleximod will not change a modified submodule back to what is specified in
+`.gitmodules` without the `--force` option.
+See below documentation [Customizing your CTSM sandbox](#customizing-your-ctsm-sandbox) for more details.
+
+**You need to rerun git-fleximod whenever `.gitmodules` has
+changed** (unless you have already manually updated the relevant
+submodule(s) to have the correct branch/tag checked out). Common times
+when this is needed are:
+
+- After checking out a new CTSM branch/tag
+- After merging some other CTSM branch/tag into your currently
+ checked-out branch
+
+# Customizing your CTSM sandbox
+
+There are several use cases to consider when you want to customize or modify your CTSM sandbox.
+
+## Switching to a different CTSM branch or tag
+
+If you have already checked out a branch or tag and **HAVE NOT MADE ANY
+MODIFICATIONS** it is simple to change your sandbox. Say that you
+checked out ctsm5.2.0 but really wanted to have ctsm5.3.0;
+you would simply do the following:
+
+ git checkout ctsm5.3.0
+ ./bin/git-fleximod update
+
+You should **not** use this method if you have made any source code
+changes, or if you have any ongoing CTSM cases that were created from
+this sandbox. In these cases, it is often easiest to do a second `git
+clone`.
+
+## Pointing to a different version of a submodule
+
+Each entry in `.gitmodules` has the following form (we use CIME as an
+example below):
+
+ [submodule "cime"]
+ path = cime
+ url = https://github.com/ESMCI/cime
+ fxtag = cime6.0.246
+ fxrequired = ToplevelRequired
+ fxDONOTUSEurl = https://github.com/ESMCI/cime
+
+Each entry specifies either a tag or a hash. To point to a new tag or hash:
+
+1. Modify the relevant entry/entries in `.gitmodules` (e.g., changing
+ `cime6.0.246` to `cime6.0.247` above)
+
+2. Checkout the new submodule(s):
+
+ ./bin/git-fleximod update
+
+Keep in mind that changing individual submodule from a tag may result
+in an invalid model (won't compile, won't run, not scientifically
+meaningful) and is unsupported.
+
+### Committing your change to `.gitmodules`
+
+After making this change, it's a good idea to commit the change in your
+local CTSM git repository. First create a branch in your local
+repository, then commit it. Feel free to create whatever local branches
+you'd like in git. For example:
+
+ git checkout -b my_ctsm_branch
+ git add .gitmodules
+ git commit -m "Update CIME to cime6.0.247"
diff --git a/README_GITFLEXIMOD.rst b/README_GITFLEXIMOD.rst
deleted file mode 100644
index d1ab767645..0000000000
--- a/README_GITFLEXIMOD.rst
+++ /dev/null
@@ -1,118 +0,0 @@
-Obtaining the full model code and associated scripting infrastructure
-=====================================================================
-
-CTSM is released via GitHub. You will need some familiarity with git in order
-to modify the code and commit these changes. However, to simply checkout and run the
-code, no git knowledge is required other than what is documented in the following steps.
-
-To obtain the CTSM code you need to do the following:
-
-#. Clone the repository. ::
-
- git clone https://github.com/ESCOMP/CTSM.git my_ctsm_sandbox
-
- This will create a directory ``my_ctsm_sandbox/`` in your current working directory.
-
-#. Run **./bin/git-fleximod update**. ::
-
- cd my_ctsm_sandbox
- ./bin/git-fleximod update
- ./bin/git-fleximod --help # for a user's guide
-
- **git-fleximod** is a package manager that will
- populate the ctsm directory with the relevant versions of each of the
- components along with the CIME infrastructure code.
- Additional documentation for git-fleximod appears here:
- https://github.com/ESMCI/git-fleximod?tab=readme-ov-file#git-fleximod
-
-"components" here refers to seperate git repositories for seperable parts of
-the code (such as the MOSART or mizuRoute river models). Because they are
-managed with "submodule" in git hereafter we will refer to them as "submodule(s)".
-
-At this point you have a working version of CTSM.
-
-To see full details of how to set up a case, compile and run, see the CIME documentation at http://esmci.github.io/cime/ .
-
-More details on git-fleximod
-----------------------------
-
-The file **.gitmodules** in your top-level CTSM directory tells
-**git-fleximod** which tag/branch of each submodule
-should be brought in to generate your sandbox.
-
-NOTE: If you manually modify a submodule without updating .gitmodules,
-e.g. switch to a different tag, then rerunning git-fleximod will warn you of
-local changes you need to resolve.
-git-fleximod will not change a modified submodule back to what is specified in
-.gitmodules without the --force option.
-See below documentation `Customizing your CTSM sandbox`_ for more details.
-
-**You need to rerun git-fleximod whenever .gitmodules has
-changed** (unless you have already manually updated the relevant
-submodule(s) to have the correct branch/tag checked out). Common times
-when this is needed are:
-
-* After checking out a new CTSM branch/tag
-
-* After merging some other CTSM branch/tag into your currently
- checked-out branch
-
-Customizing your CTSM sandbox
-=============================
-
-There are several use cases to consider when you want to customize or modify your CTSM sandbox.
-
-Switching to a different CTSM branch or tag
--------------------------------------------
-
-If you have already checked out a branch or tag and **HAVE NOT MADE ANY
-MODIFICATIONS** it is simple to change your sandbox. Say that you
-checked out ctsm5.2.0 but really wanted to have ctsm5.3.0;
-you would simply do the following::
-
- git checkout ctsm5.3.0
- ./bin/git-fleximod update
-
-You should **not** use this method if you have made any source code
-changes, or if you have any ongoing CTSM cases that were created from
-this sandbox. In these cases, it is often easiest to do a second **git
-clone**.
-
-Pointing to a different version of a submodule
-----------------------------------------------
-
-Each entry in **.gitmodules** has the following form (we use CIME as an
-example below)::
-
- [submodule "cime"]
- path = cime
- url = https://github.com/ESMCI/cime
- fxtag = cime6.0.246
- fxrequired = ToplevelRequired
- fxDONOTUSEurl = https://github.com/ESMCI/cime
-
-Each entry specifies either a tag or a hash. To point to a new tag or hash:
-
-#. Modify the relevant entry/entries in **.gitmodules** (e.g., changing
- ``cime6.0.246`` to ``cime6.0.247`` above)
-
-#. Checkout the new submodule(s)::
-
- ./bin/git-fleximod update
-
-Keep in mind that changing individual submodule from a tag may result
-in an invalid model (won't compile, won't run, not scientifically
-meaningful) and is unsupported.
-
-Committing your change to .gitmodules
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-After making this change, it's a good idea to commit the change in your
-local CTSM git repository. First create a branch in your local
-repository, then commit it. Feel free to create whatever local branches
-you'd like in git. For example::
-
- git checkout -b my_ctsm_branch
- git add .gitmodules
- git commit -m "Update CIME to cime6.0.247"
-
diff --git a/README_on_CTSM.md b/README_on_CTSM.md
new file mode 100644
index 0000000000..0dbcbae64e
--- /dev/null
+++ b/README_on_CTSM.md
@@ -0,0 +1,160 @@
+$CTSMROOT/README 11/24/2025
+
+Community Terrestrial Systems Model (CTSM) science version 5.4 series -- source code, tools,
+offline-build and test scripts. This gives you everything you need
+to run CTSM with CESM with the CMEPS driver and CDEPS data models to provide CRUJRA or GSWP3 forcing data (some older options also available) in
+place of a modeled atmosphere.
+
+CMEPS is the Community Mediator for Earth Prediction Systems. And CDEPS is the
+Community Data Models for Earth Prediction System. They are both NUOPC based models
+used to drive the CESM (Community Earth System Model) of which CTSM is a component of.
+NUOPC is the National Unified Operational Prediction Capability a standard way of building
+coupled model systems. The NUOPC layer is based on the Earth System Modeling Framework (ESMF).
+
+For lists of current bugs (issues) and current development see the CTSM GitHub page:
+
+https://github.com/ESCOMP/CTSM
+
+For Code of Conduct (how to work with each other on the CTSM project):
+
+https://github.com/ESCOMP/CTSM?tab=coc-ov-file
+
+INFORMATION ON THE CMEPS DRIVER:
+- https://escomp.github.io/CMEPS
+- https://earthsystemmodeling.org/nuopc/
+
+IMPORTANT NOTE ON CESM CHECKOUT VERSUS A CTSM CHECKOUT:
+
+If this is the top level directory from making a clone of CTSM the
+directory structure is a little bit different than if CTSM is from
+a clone of the entire CESM. If this is part of CESM this directory
+will be under `components/clm` alongside other CESM component models.
+For a CTSM checkout this will be the top level directory.
+
+Other documentation will refer to `$CTSMROOT` and it means the directory
+that this file is at. CIMEROOT is the directory where "cime" is for
+this checkout. For a CESM checkout `$CIMEROOT` will be the "cime" directory
+beneath the top level directory. For a CTSM checkout `$CIMEROOT` will
+be `$CTSMROOT/cime`.
+
+IMPORTANT NOTE ABOUT (deprecated)
+
+Anything marked with (deprecated) is something is going to be removed in a future update.
+Often this means it will be replaced with something else.
+
+
+General directory structure ($CTSMROOT):
+
+- `doc`: Documentation of CTSM
+- `bld`: build-namelist scripts for CTSM
+- `src`: CTSM Source code
+- `lilac`: Lightweight Infrastructure for Land-Atmosphere Coupling (for coupling to a host atmosphere model)
+- `tools`: CTSM Offline tools to prepare input datasets and process output
+- `cime_config`: Configuration files of cime for compsets and CTSM settings
+- `bin/git-fleximod`: Script to manage the needed sub-component source directories (handled with git submodule)
+- `py_env_create`: Script to setup the python environment for CTSM python tools using conda
+- `python`: Python modules used in tools and testing and automated checking of ALL CTSM python scripts
+
+Directory structure only for a CTSM checkout:
+
+- `components`: Other active sub-components needed for CTSM to run (river routing and land-ice models)
+- `libraries`: CESM libraries: PIO (deprecated)
+- `share`: CESM shared code
+- `ccs_config`: CIME configure files (for grids, compsets, and machines) for CESM
+
+- `cime/scripts`: cesm/cime driver scripts
+
+- `components/cmeps`: CESM top level driver (for NUOPC driver [which is the default]) source code
+- `components/cdeps`: CESM top level data model shared code (for NUOPC driver)
+- `components/cism`: CESM Community land Ice Sheet Model
+- `components/mosart`: Model for Scale Adaptive River Transport
+- `components/mizuroute`: Reached based river transport model for water routing (allows both gridded river and Hydrologic Responce Unit river grids)
+- `components/rtm`: CESM River Transport Model
+
+Top level documentation ($CTSMROOT):
+
+- `README_on_CTSM.md`: This file
+- `README.md`: File that displays on github under https::/github.com/ESCOMP/CTSM.git
+- `README_GITFLEXIMOD.md`: Information on how to work with git-fleximod for CTSM
+- `README.CHECKLIST.new_case.md`: Information on starting a new case (i.e. simulation)
+- `WhatsNewInCTSM5.4.md`: Overview document of the changes between ctsm5.3 and ctsm5.4 (earlier versions in /doc)
+- `Copyright`: CESM Copyright file
+- `doc/UpdateChangeLog.pl`: Script to add documentation on a tag to the ChangeLog/ChangeSum files
+- `doc/ChangeLog`: Documents different CTSM versions
+- `doc/ChangeSum`: Summary documentation of different CTSM versions
+- `doc/design`: Software Engineering and code design document files
+
+Checklists for standard Software Engineering tasks
+
+- `./doc/README.CHECKLIST.master_tags.md`
+- `./bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md`
+
+Documentation of Namelist Items: (view the following in a web browser)
+
+- `bld/namelist_files/namelist_definition_ctsm.xml`: Definition of all namelist items
+- `bld/namelist_files/namelist_defaults_ctsm.xml`: Default values
+
+Important files in main directories (under $CTSMROOT):
+=============================================================================================
+
+- `run_sys_tests`: Python script to send the standard CTSM testing off (submits the create_test test suite for several different compilers on the machines we do standard CTSM testing on)
+
+- `parse_cime.cs.status`: Script to parse test status files `cs.status.*` created by create_test (can be used along with run_sys_tests)
+- `doc/Quickstart.GUIDE`: Quick guide to using NUOPC scripts
+- `doc/IMPORTANT_NOTES.md`: Some important notes about this version of CTSM, configuration modes and namelist items that are not validated or functional
+- `doc/ChangeLog`: Detailed list of changes for each model version
+- `doc/ChangeSum`: Summary one-line list of changes for each model version
+- `doc/UsersGuide`: CTSM Users Guide
+
+- `bld/README`: Description of how to use the `build-namelist` scripts
+- `bld/build-namelist`: Lower level script to build CTSM namelists
+
+- `cime_config/buildnml`: Build the CTSM namelist for CIME
+- `cime_config/buildlib`: Build the CTSM library
+- `cime_config/config_compsets.xml`: Define CTSM compsets
+- `cime_config/config_component.xml`: Define CTSM XML settings
+- `cime_config/config_tests.xml`: Define CTSM specific tests
+- `cime_config/config_pes.xml`: Define Processor layouts for various CTSM grids and compsets
+- `cime_config/testdefs`: Directory for specification of CTSM testing
+- `cime_config/testdefs/ExpectedTestFails.xml`: List of tests that are expected to fail
+- `cime_config/usermods_dirs/clm`: Directories of sets of user-modification subdirs; these are directories that add specific user modifications to simulations created using `cime/scripts/create_newcase --user-mods-dir clm/*`
+
+- `tools/mksurfdata_esmf`: Directory to build program to create surface dataset at any resolution
+- `tools/crop_calendars`: Tools to process and process and create crop calendar datasets for CTSM
+- `tools/modify_input_files`: Script to modify existing CTSM input datasets in standard ways
+- `tools/site_and_regional`: Scripts to create input datasets for single site and regional cases, primarily by modifying existing global datasets
+- `tools/contrib`: Miscellansous useful scripts for pre and post processing as well as case management of CTSM. These scripts are contributed by users and may not be as well tested or supported as other tools
+- `.vscode`: Suggested settings for using MS Visual Studio code with CTSM
+
+
+Source code directory structure:
+=============================================================================================
+
+- `src/biogeochem`: Biogeochemisty
+- `src/main`: Main control and high level code
+- `src/cpl`: Land model high level caps for NUOPC driver (and LILAC)
+- `src/biogeophys`: Biogeophysics (Hydrology)
+- `src/dyn_subgrid`: Dynamic land unit change
+- `src/init_interp`: Online interpolation
+- `scr/fates`: FATES (Functionally Assembled Terrestrial Ecosystem Simulator) ecosystem demography model and sub-directories
+- `src/utils`: Utility codes
+- `src/self_tests`: Internal testing (unit tests run as a part of a CTSM system test)
+- `src/unit_test_shr`: Unit test shared modules for unit testing
+src/unit_test_stubs Unit test stubs that replicate CTSM code simpler
+
+QUICKSTART: using the NUOPC driver scripts
+=============================================================================================
+
+ cd $CIMEROOT/scripts
+ ./create_newcase # get help on how to run create_newcase
+ ./create_newcase --case testI --res f09_t232 --compset I2000Clm60BgcCrop
+ # create new "I" case for default machine at 1.9x2.5_gx1v7
+ # "I2000Clm60BgcCrop" case is clm6_0 physics, CDEPS, and inactive ice/ocn/glc
+ # and MOSART for river-routing
+ cd testI
+ ./case.setup # create the $CASE.run file
+ ./case.build # build model and create namelists
+ ./case.submit # submit script
+ # (NOTE: ./xmlchange RESUBMIT=10 to set RESUBMIT to number
+ # # of times to automatically resubmit -- 10 in this example)
+
diff --git a/WhatsNewInCTSM5.4.md b/WhatsNewInCTSM5.4.md
deleted file mode 100755
index 17b43d9f80..0000000000
--- a/WhatsNewInCTSM5.4.md
+++ /dev/null
@@ -1,151 +0,0 @@
-# What's new in CTSM 5.4 (tag `ctsm5.4.002`)
-
-# Purpose and description of changes since CTSM 5.3 (tag `ctsm5.3.021`)
-
-## New features
-
-* New surface datasets from CMIP7 data including PFT and urban distributions, land use transitions, population density, and atmospheric C isotopes. These data are only available through the historical record (1850-2023), and
- * are not available for future periods (presently known as SSP),
- * for future periods and N deposition we continue to use CMIP6 data from CESM2.
-* Option to use CRUJRA2024 atmospheric driver data with clm6 and clm5 physics options ([PR #2956](https://github.com/ESCOMP/ctsm/pull/2956)), this is the default data-atmosphere (DATM) for clm6. This CRUJRA dataset covers 1901-2023, whereas previous GSWP3 only covers 1901-2014.
-* Capability to run single-point PLUMBER tower sites, similar to the NEON tower capability ([issue #1487](https://github.com/ESCOMP/CTSM/issues/1487)). Initial conditions are not provided for PLUMBER sites.
-* New CLM\_CMIP\_ERA flag in env\_run.xml. Valid options are cmip7 and cmip6. Defaults to cmip7 except in compsets containing SSP for which it defaults to cmip6 because there are no future-period datasets yet available for CMIP7.
-* Automatic, more flexible use of anomaly forcings for CMIP6 ISSP cases, which also use the cmip6 CLM\_CMIP\_ERA flag: [Documentation](https://escomp.github.io/CTSM/users_guide/running-special-cases/Running-with-anomaly-forcing.html)
-
-* Unsupported script that checks for spinup equilibrium in `tools/contrib/` for spectral element grids ([PR #2991](https://github.com/ESCOMP/ctsm/pull/2991)).
-* New paramfile tools that allow users to query and modify CLM parameter files ([documentation](https://escomp.github.io/CTSM/users_guide/using-clm-tools/paramfile-tools.html))
-* Optional time-evolving \`leafcn\_target\`. More under “Additional detail” below.
-* New vertical movement scheme for soil nitrate, which is off by default (PR [#2992](https://github.com/ESCOMP/CTSM/pull/2992)).
-* Documentation improvements and new URL: https://escomp.github.io/CTSM/index.html.
-* FATES:
- * Grazing ([sci.1.81.0\_api.37.1.0](https://github.com/NGEET/fates/releases/tag/sci.1.81.0_api.37.1.0)).
- * Johnson and Berry 2021 electron transport model ([sci.1.85.0\_api.40.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.85.0_api.40.0.0)).
- * Managed Fire ([sci.1.87.0\_api.41.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.87.0_api.41.0.0)).
-
-## Answer changes
-
-Changes to defaults for \`clm6\` physics:
-
-* New CMIP7 surface and landuse timeseries datasets (see in Additional Details below).
-* New namelist variables \`snow\_thermal\_cond\_glc\_method\` and \`snow\_thermal\_cond\_lake\_method\` ([PR #3072](https://github.com/ESCOMP/CTSM/pull/3072)). Snow thermal conductivity uses Jordan1991 over glaciers to reduce Greenland melt rates by default and Sturm over land and lake land units.
-* Bytnerowicz is now the default nfix\_method for clm6 (https://github.com/ESCOMP/ctsm/pull/2972) which revises the temperature function for nitrogen fixation, replacing the Houlton *et al.* function.
-* Updates to MEGAN for BVOCs (https://github.com/ESCOMP/CTSM/pull/3065 https://github.com/ESCOMP/CTSM/pull/3309). Removes dependence on soil moisture from clm6 physics.
-* New model parameter values that were calibrated to improve carbon cycle representation with CRUJRA.
-* New model parameter values that were calibrated to improve the fire model. Now using li2024 fire code.
-* New initial conditions files for f09 ("1-degree" 1850, 2000), f19 (“2-degree” 1850), and ne30 (1850, 1979, 2000\) resolutions.
-* Change default for glcmec\_downscale\_longwave to FALSE for clm6 physics as turning off the LW downscaling improves the melt and runoff biases.
-* See “Changes to FATES and the FATES parameter file” below.
-* Namelist defaults change so that
- * use\_c13/use\_c14 are on only for HistClm60Bgc compsets with CRUJRA2024 or CAM7 forcing; examples of when use\_c13/use\_c14 are now off include SSP and single-point compsets, as well as cases using older forcings, such as CAM6, GSWP3v1, Qian, and CRUv7
- * when use\_c13 or use\_c14 is on, turn on the corresponding time series file (responding to the CLM_CMIP_ERA flag)
- * C13/C14 CMIP7 data is done using streams with new namelist variables (stream_*_atm_c13, stream_*_atm_c14)
- * irrigation is on for transient cases (1850-2000, 1850-2100, but not for clm4\_5).
-
-Changes for all physics versions:
-
-* Parameters updated: Added MIMICS parameter \`mimics\_fi\` (fraction of litter inputs that bypass litter pools, directly contributing to SOM) and updated other MIMICS parameters (https://github.com/ESCOMP/CTSM/pull/2365) to remove NPP control on turnover, fix density dependent control on turnover, add litterfall fluxes that bypass litter pools and contribute directly to soil organic matter.
-* FATES parameter file updated: ([PR \#2965](https://github.com/ESCOMP/CTSM/pull/2965), [PR \#2904](https://github.com/ESCOMP/CTSM/pull/2904), [PR \#1344](https://github.com/NGEET/fates/pull/1344), [PR \#3087](https://github.com/ESCOMP/CTSM/pull/3087)). See “FATES parameter file” section below for details.
-* New surface datasets and landuse timeseries files (see “surface datasets” section below).
-* CMIP7 C13/C14 atmospheric timeseries data
-
-## Heads up
-
-* History tapes now split into two files from hX to hXi and hXa, where X is the tape number (e.g. h0i/h0a) and where "i" stands for history file containing instantaneous fields, while "a" stands for history file containing non-instantaneous fields. Details in the “history files” section below and in the PRs https://github.com/ESCOMP/ctsm/pull/2445 https://github.com/ESCOMP/MOSART/pull/117 https://github.com/ESCOMP/RTM/pull/61 and the corresponding issues.
-* Adding time to 1d weighting fields in transient simulations PR https://github.com/ESCOMP/CTSM/pull/3328
-* Regarding CMIP7 vs. CMIP6 inputs:
- * C13/C14 isotope datasets are the new CMIP7 datasets using streams, while when CLM_CMIP_ERA==cmip6, the older cmip6 files are used
- * We supply only CMIP7 population density with clm6 physics in non-SSP cases, because the fire model is calibrated to that; conversely, we supply only CMIP6 population density for pre-clm6 physics and for SSP cases.
- * We supply only CESM2 nitrogen deposition (ndep), so this gets used regardless of CLM\_CMIP\_ERA setting.
- * For DATM we supply only CMIP6 aerosols.
- * For DATM we supply only CMIP6 CO2.
-* Issue with DOUT\_S\_SAVE\_INTERIM\_REST [https://github.com/ESCOMP/CTSM/issues/3351](https://github.com/ESCOMP/CTSM/issues/3351) was fixed.
-* As of ctsm5.3.040, the new ctsm\_pylib conda environment is incompatible with our tools from before ctsm5.3.040 and vice versa. More under “Additional detail” below.
-
-# Additional detail
-
-## Changes related to history files
-
-(Note 1: The same information in this section applies to MOSART and RTM.
-Note 2: The gist of the information in this section also appears in the [CTSM User’s Guide](https://escomp.github.io/CTSM/users_guide/setting-up-and-running-a-case/customizing-the-clm-namelist.html#various-ways-to-change-history-output-averaging-flags)).
-
-Following ctsm5.3.018 "Change history time to be the middle of the time bounds" and keeping CLM history consistent with CAM history, the CTSM5.4 change intends to prevent confusion associated with the time corresponding to instantaneous history fields by putting them on separate files than non-instantaneous fields.
-
-The now separate instantaneous history files represent the exact time step when they were written and do not include a time\_bounds variable. Conversely, non-instantaneous history files represent the period of their time\_bounds variable. As a result, time data on non-instantaneous history files are now read correctly during post processing (e.g. by xarray). Special handling may still be needed for instantaneous history files, whose timestamps represent the date and time at the END of the history timestep. So, e.g., an instantaneous variable saved at the end of year 2023 will get the timestamp 2024-01-01 00:00:00.
-
-Users will now see:
-
-1\) Two history files per clm, mosart, and rtm history tape:
- tape h0 becomes h0a and h0i
- tape h1 becomes h1a and h1i
- ...
- tape hX becomes hXa and hXi
-
-2\) Two history-restart files per history restart tape:
- rh0 becomes rh0a and rh0i
- rh1 becomes rh1a and rh1i
- ...
- rhX becomes rhXa and rhXi
-
-The CLM handles empty history (and corresponding history-restart) files by not generating them, while rtm and mosart give an error. Instead of refactoring rtm and mosart to behave like the clm (considered out of scope), we have introduced one active instantaneous field in mosart and one in rtm to bypass the "empty file" error.
-
-## New surface datasets and landuse timeseries files (https://github.com/ESCOMP/CTSM/pull/3482)
-
-* Transient landuse timeseries files going back to 1700 made for f09 and 360x720 grids.
-* New resolutions now supported: ne3np4.pg3, mpasa30, ne0np4.NATL.ne30x8 (https://github.com/ESCOMP/CTSM/pull/3482)
-* Updates to input datasets (also referred to as raw datasets):
- * PFT/LAI/soil-color raw datasets; now from the CMIP7 timeseries that ends in 2023 (Issue [\#2851](https://github.com/ESCOMP/CTSM/issues/2851)).
- * Two fire datasets: crop fire peak month and population density (https://github.com/ESCOMP/CTSM/issues/2701 https://github.com/ESCOMP/CTSM/issues/3302).
- * Transient (historical) urban datasets are now based on CMIP7 urban data, partitioned into TBD, HD, and MD classes in proportion to GaoOneill present day classification.
-
-## Changes to FATES and the FATES parameter file
-
-* See [HLM-FATES compatibility table](https://fates-users-guide.readthedocs.io/en/latest/user/release-tags-compat-table.html) in the FATES user’s guide for all FATES tags associated with CTSM tag updates
-* FATES answer changing updates
- * The default hydro solver is updated to 2D Picard from 1D Taylor ([ctsm5.3.027](https://github.com/ESCOMP/CTSM/releases/tag/ctsm5.3.027))
- * Simplified leaf sun-shade fraction for two-stream radiation ([sci.1.83.0\_api.39.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.83.0_api.39.0.0))
- * Default maximum canopy layer updated from 2 to 3 ([sci.1.87.1\_api.41.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.87.1_api.41.0.0))
- * Various bug fixes (see compatibility table)
-* FATES Parameter File Updates
- * ctsm5.3.025 (API 37\)
- * Adds pft-dependent btran model switches
- * Adds parameters for land use grazing
- * Updates the FATES z0mr turbulence parameters for consistency with CLM
- * ctsm5.3.027 (API 38\)
- * Migrates a number of global parameter file variables to the namelist
- * Adds \`fates\_leaf\_fnps\` parameter for the electron transport model
- * \`fates\_leaf\_theta\_cj\_c3\` and \`fates\_leaf\_theta\_cj\_c4\` depricated
- * ctsm5.3.045 (API 40\)
- * Changes to the default competitive exclusion parameter from probabilistic to rank-ordered sorting of cohorts by default
- * Sets the logging default to clear cut
- * Refactors the pft-specific phenology habit selection into a single parameter
- * ctsm5.3.070 (API 41\)
- * Add parameters for the managed fire feature addition
- * Corrects the fates landuse crop pft to c3 cool grass
-
-## New ctsm\_pylib conda environment
-
-If you have a ctsm\_pylib conda environment installed from before ctsm5.3.040, you may want to keep that under a different name. We suggest the following command for doing this in a local copy of ctsm5.3.040 or later:
-
-```shell
-./py_env_create -r ctsm_pylib_old
-```
-
-This first renames your existing ctsm\_pylib to ctsm\_pylib\_old and then installs the Python 3.13.2 version as ctsm\_pylib. If you are unsure whether you already have ctsm\_pylib installed, use the same command regardless, as it will skip the renaming step if necessary.
-
-Information about additional py\_env\_create options — including how to install a fresh copy of the old conda environment — is available as follows:
-
-```shell
-./py_env_create --help
-```
-
-## Potentially time-evolving \`leafcn\_target\` replaces time-constant \`leafcn\`
-
-The former is calculated as a function of the latter and can be time-evolving depending on new paramfile parameter \`leafcn\_co2\_slope\` https://github.com/ESCOMP/ctsm/pull/1654. The time-evolving effect defaults to off with \`leafcn\_co2\_slope\` \= 0 on the parameter file.
-
-# Simulations supporting this release by providing initial conditions
-
-* f19 \`Clm60BgcCruJra\` 16pft: https://github.com/NCAR/LMWG_dev/issues/125
-* f09 with \`Clm60BgcCropCruJra\`: https://github.com/NCAR/LMWG_dev/issues/124
-* ne30 with \`Clm60BgcCropCruJra\`: https://github.com/NCAR/LMWG_dev/issues/123 (123\_HIST\_popDens)
-* ne30 SP https://github.com/NCAR/LMWG_dev/issues/126
-* f09 SP https://github.com/NCAR/LMWG_dev/issues/127
diff --git a/WhatsNewInCTSM5.4.md b/WhatsNewInCTSM5.4.md
new file mode 120000
index 0000000000..76c6ae1d79
--- /dev/null
+++ b/WhatsNewInCTSM5.4.md
@@ -0,0 +1 @@
+doc/WhatsNewInCTSM5.4.md
\ No newline at end of file
diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm
index e72b8e07c2..a4afdcebf0 100755
--- a/bld/CLMBuildNamelist.pm
+++ b/bld/CLMBuildNamelist.pm
@@ -816,15 +816,14 @@ sub setup_cmdl_fates_mode {
} else {
# dis-allow fates specific namelist items with non-fates runs
my @list = ( "fates_spitfire_mode", "use_fates_planthydro", "use_fates_ed_st3", "use_fates_ed_prescribed_phys",
- "use_fates_cohort_age_tracking","use_fates_inventory_init","use_fates_fixed_biogeog",
+ "use_fates_cohort_age_tracking","use_fates_inventory_init","use_fates_dbh_init","use_fates_fixed_biogeog",
"use_fates_nocomp","use_fates_sp","fates_inventory_ctrl_filename","fates_harvest_mode",
"fates_parteh_mode","use_fates_tree_damage","fates_seeddisp_cadence","use_fates_luh","fluh_timeseries",
"flandusepftdat","use_fates_potentialveg","use_fates_lupft","fates_history_dimlevel",
"use_fates_daylength_factor", "fates_photosynth_acclimation", "fates_stomatal_model",
"fates_stomatal_assimilation", "fates_leafresp_model", "fates_cstarvation_model",
"fates_regeneration_model", "fates_hydro_solver", "fates_radiation_model", "fates_electron_transport_model",
- "use_fates_managed_fire"
- );
+ "use_fates_managed_fire", "fates_lu_transition_logic");
# dis-allow fates specific namelist items with non-fates runs
foreach my $var ( @list ) {
@@ -1706,10 +1705,10 @@ sub process_namelist_inline_logic {
}
setup_logic_cnmatrix($opts, $nl_flags, $definition, $defaults, $nl, $envxml_ref);
setup_logic_spinup($opts, $nl_flags, $definition, $defaults, $nl);
- setup_logic_supplemental_nitrogen($opts, $nl_flags, $definition, $defaults, $nl);
setup_logic_c_isotope($opts, $nl_flags, $definition, $defaults, $nl);
setup_logic_snowpack($opts, $nl_flags, $definition, $defaults, $nl);
setup_logic_fates($opts, $nl_flags, $definition, $defaults, $nl);
+ setup_logic_supplemental_nitrogen($opts, $nl_flags, $definition, $defaults, $nl);
setup_logic_z0param($opts, $nl_flags, $definition, $defaults, $nl);
setup_logic_misc($opts, $nl_flags, $definition, $defaults, $nl);
@@ -2084,13 +2083,16 @@ sub setup_logic_irrigate {
my ($opts, $nl_flags, $definition, $defaults, $nl) = @_;
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'irrigate',
- 'use_crop'=>$nl_flags->{'use_crop'}, 'use_cndv'=>$nl_flags->{'use_cndv'},
+ 'use_crop'=>$nl_flags->{'use_crop'}, 'use_cndv'=>$nl_flags->{'use_cndv'}, 'use_fates'=>$nl_flags->{'use_fates'},
'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}, );
if ( &value_is_true($nl->get_value('irrigate') ) ) {
$nl_flags->{'irrigate'} = ".true.";
if ( $nl_flags->{'sim_year'} eq "PtVg" ) {
$log->fatal_error("irrigate=TRUE does NOT make sense with the Potential Vegetation dataset, leave irrigate=FALSE");
}
+ if (&value_is_true($nl_flags->{'use_fates'})) {
+ $log->fatal_error("irrigate=TRUE is NOT possible with use_fates=TRUE, leave irrigate=FALSE");
+ }
} else {
$nl_flags->{'irrigate'} = ".false.";
}
@@ -2264,6 +2266,7 @@ sub setup_logic_params_file {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'paramfile',
'phys'=>$nl_flags->{'phys'},
+ 'use_hillslope'=>$nl_flags->{'use_hillslope'},
'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'},
'use_flexibleCN'=>$nl_flags->{'use_flexibleCN'} );
}
@@ -3321,12 +3324,12 @@ sub setup_logic_supplemental_nitrogen {
if ( $nl_flags->{'bgc_mode'} ne "sp" && $nl_flags->{'bgc_mode'} ne "fates" && &value_is_true($nl_flags->{'use_crop'}) ) {
# If this is non-fates, non-sp and crop is active
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl,
- 'suplnitro', 'use_cn'=>$nl_flags->{'use_cn'}, 'use_crop'=>$nl_flags->{'use_crop'});
+ 'suplnitro', 'use_cn'=>$nl_flags->{'use_cn'}, 'use_crop'=>$nl_flags->{'use_crop'});
- } elsif ( $nl_flags->{'bgc_mode'} eq "fates" && not &value_is_true( $nl_flags->{'use_fates_sp'}) ) {
- # Or... if its fates but not fates-sp
+ } elsif ( $nl_flags->{'bgc_mode'} eq "fates" ) {
+ # Or... if its fates
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl,
- 'suplnitro', 'use_fates'=>$nl_flags->{'use_fates'});
+ 'suplnitro', 'fates_parteh_mode'=>remove_leading_and_trailing_quotes($nl->get_value('fates_parteh_mode')));
}
#
# Error checking for suplnitro
@@ -3342,9 +3345,21 @@ sub setup_logic_supplemental_nitrogen {
if ( $suplnitro =~ /ALL/i ) {
if ( $nl_flags->{'bgc_spinup'} eq "on" && $nl_flags->{'bgc_mode'} ne "fates" ) {
- $log->warning("There is no need to use a bgc_spinup mode when supplemental Nitrogen is on for all PFT's, as these modes spinup Nitrogen" );
+ $log->warning("There is no need to use a bgc_spinup mode when supplemental Nitrogen is on for all PFTs, as these modes spinup Nitrogen" );
}
}
+
+ my $parteh_mode = $nl->get_value('fates_parteh_mode');
+ if ( ($parteh_mode =~ /carbon_only/i) && ($suplnitro !~ /ALL/i) ) {
+ $log->fatal_error("supplemental Nitrogen (suplnitro) is NOT set to ALL, FATES is on, " .
+ "and fates_parteh_mode = $parteh_mode, so Nitrogen is not active; " .
+ "change suplnitro back to ALL");
+ }
+ if ( ($parteh_mode =~ /carbon_nitrogen/i) && &value_is_true( $nl_flags->{'use_fates_sp'}) ) {
+ $log->fatal_error("FATES is on, " .
+ "FATES-SP is active, but fates_parteh_mode = $parteh_mode, so Nitrogen is active; " .
+ "change fates_parteh_mode to carbon_only or do not use FATES-SP");
+ }
}
}
@@ -3499,12 +3514,10 @@ sub setup_logic_methane {
my $finundation_method = remove_leading_and_trailing_quotes($nl->get_value('finundation_method' ));
# prognostic inundation does not require an input stream; other methods do
if($finundation_method ne 'h2osfc') {
- add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_ch4finundated',
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_ch4finundated',
'finundation_method'=>$finundation_method);
- if ($opts->{'driver'} eq "nuopc" ) {
- add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_meshfile_ch4finundated',
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_meshfile_ch4finundated',
'finundation_method'=>$finundation_method);
- }
}
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_aereoxid_prog',
'use_cn'=>$nl_flags->{'use_cn'}, 'use_fates'=>$nl_flags->{'use_fates'} );
@@ -3665,8 +3678,11 @@ sub setup_logic_hillslope {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'hillslope_transmissivity_method' );
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'hillslope_pft_distribution_method' );
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'hillslope_soil_profile_method' );
+
+ $nl_flags->{'use_hillslope'} = $nl->get_value('use_hillslope');
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_hillslope_routing', 'use_hillslope'=>$nl_flags->{'use_hillslope'} );
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'hillslope_fsat_equals_zero', 'use_hillslope'=>$nl_flags->{'use_hillslope'} );
+
my $use_hillslope = $nl->get_value('use_hillslope');
my $use_hillslope_routing = $nl->get_value('use_hillslope_routing');
if ( (! &value_is_true($use_hillslope)) && &value_is_true($use_hillslope_routing) ) {
@@ -4885,12 +4901,12 @@ sub setup_logic_fates {
if (&value_is_true( $nl_flags->{'use_fates'}) ) {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'fates_paramfile', 'phys'=>$nl_flags->{'phys'});
my @list = ( "use_fates_planthydro", "use_fates_ed_st3", "use_fates_ed_prescribed_phys",
- "use_fates_inventory_init","fates_seeddisp_cadence","fates_history_dimlevel",
+ "use_fates_inventory_init","use_fates_dbh_init","fates_seeddisp_cadence","fates_history_dimlevel",
"fates_harvest_mode","fates_parteh_mode", "use_fates_cohort_age_tracking","use_fates_tree_damage",
"use_fates_daylength_factor", "fates_photosynth_acclimation", "fates_stomatal_model",
"fates_stomatal_assimilation", "fates_leafresp_model", "fates_cstarvation_model",
"fates_regeneration_model", "fates_hydro_solver", "fates_radiation_model", "fates_electron_transport_model",
- "use_fates_managed_fire"
+ "use_fates_managed_fire","fates_lu_transition_logic"
);
foreach my $var ( @list ) {
@@ -4903,6 +4919,7 @@ sub setup_logic_fates {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_fates_luh', 'use_fates'=>$nl_flags->{'use_fates'},
'use_fates_lupft'=>$nl->get_value('use_fates_lupft'),
'use_fates_potentialveg'=>$nl->get_value('use_fates_potentialveg'),
+ 'fates_lu_transition_logic'=>$nl->get_value('fates_lu_transition_logic'),
'fates_harvest_mode'=>remove_leading_and_trailing_quotes($nl->get_value('fates_harvest_mode')) );
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_fates_nocomp', 'use_fates'=>$nl_flags->{'use_fates'},
'use_fates_lupft'=>$nl->get_value('use_fates_lupft'),
@@ -4914,14 +4931,6 @@ sub setup_logic_fates {
'use_fates_managed_fire'=>$nl->get_value('use_fates_managed_fire'),
'use_fates_sp'=>$nl_flags->{'use_fates_sp'} );
- my $suplnitro = $nl->get_value('suplnitro');
- my $parteh_mode = $nl->get_value('fates_parteh_mode');
- if ( ($parteh_mode == 1) && ($suplnitro !~ /ALL/) && not &value_is_true( $nl_flags->{'use_fates_sp'}) ) {
- $log->fatal_error("supplemental Nitrogen (suplnitro) is NOT set to ALL, FATES is on, " .
- "but and FATES-SP is not active, but fates_parteh_mode is 1, so Nitrogen is not active" .
- "Change suplnitro back to ALL");
- }
-
# For FATES SP mode make sure no-competetiion, and fixed-biogeography are also set
# And also check for other settings that can't be trigged on as well
#
@@ -4957,6 +4966,10 @@ sub setup_logic_fates {
}
}
}
+ my $var = "use_fates_dbh_init";
+ if ( &value_is_true($nl->get_value($var)) && ( !&value_is_true($nl->get_value("use_fates_nocomp")))) {
+ $log->fatal_error("$var can only be .true. use_fates_nocomp is .true." );
+ }
# make sure that fates landuse x pft mode has the necessary run mode configurations
my $var = "use_fates_lupft";
if ( defined($nl->get_value($var)) ) {
diff --git a/bld/README b/bld/README.md
similarity index 51%
rename from bld/README
rename to bld/README.md
index feb0b8495c..76dfcd6e1c 100644
--- a/bld/README
+++ b/bld/README.md
@@ -1,47 +1,47 @@
$CTSMROOT/bld/README Jun/08/2018
-CLM build and configure directory and scripts. Scripts to help
-you prepare to build CLM as a component within CESM, and setup
-a namelist for it.
+CLM build and configure directory and scripts. Scripts to help you prepare to build CLM as a component within CESM, and setup a namelist for it.
This is a lower level script called from with CESM/CIME.
Important files/directories:
---------- Namelist build scripts
+# Namelist build scripts
-config_files/clm_phys_vers.pm ------------- Perl module to handle different CLM versions
-config_files/config_definition_ctsm.xml --- XML file defining CTSM configuration items (mainly physics version)
+config_files/clm_phys_vers.pm ------------- Perl module to handle different CLM versions
+config_files/config_definition_ctsm.xml --- XML file defining CTSM configuration items (mainly physics version)
---------- Scripts to build the namelists
-build-namelist --- Build the namelists needed
+# Scripts to build the namelists
+build-namelist --- Build the namelists needed
-env_run.xml --- Sample case runtime environment variables, so build-namelist can run outside of a case directory.
+env_run.xml --- Sample case runtime environment variables, so build-namelist can run outside of a case directory
---------- Test scripts directory
-unit_testers --- Directory of scripts to test scipts in this directory
- (most notably build-namelist)
+# Test scripts directory
----------- XML Files describing namelists in namelist_files
-namelist_files/namelist_defaults_ctsm.xml --------- List of default values for the ctsm namelist
-namelist_files/namelist_defaults_overall.xml ------ List of default values for overall settings
-namelist_files/namelist_defaults_usr_files.xml ---- List of default values for the user-files (deprecated)
-namelist_files/namelist_definition_ctsm.xml ------- Definition of all namelist items for ctsm
-namelist_files/namelist_definition.xsl ------------ Describes how to view the xml file as html
-namelist_files/use_cases -------------------------- Specific configurations that build-namelist uses
-namelist_files/use_cases/README ------------------- File explaining the naming convention for use_cases
+unit_testers --- Directory of scripts to test scipts in this directory (most notably build-namelist)
----------- Driver namelist files, duplicated information from cime/driver/cime_config
-namelist_files/namelist_defaults_drv.xml ---------- List of default values for driver namelist defaults
-namelist_files/namelist_defaults_drydep.xml ------- List of default values for dry deposition and MEGAN fields
-namelist_files/namelist_defaults_fire_emis.xml ---- List of default values for fire emission fields
-namelist_files/namelist_defaults_dust_emis.xml ---- List of default values for the dust emissions module.
-namelist_files/namelist_definition_drv.xml -------- Definition of all driver namelist items
-namelist_files/namelist_definition_drv_flds.xml --- Definition of add driver fieldsnamelist items
+# XML Files describing namelists in namelist_files
+namelist_files/namelist_defaults_ctsm.xml --------- List of default values for the ctsm namelist
+namelist_files/namelist_defaults_overall.xml ------ List of default values for overall settings
+namelist_files/namelist_defaults_usr_files.xml ---- List of default values for the user-files (deprecated)
+namelist_files/namelist_definition_ctsm.xml ------- Definition of all namelist items for ctsm
+namelist_files/namelist_definition.xsl ------------ Describes how to view the xml file as html
+namelist_files/use_cases -------------------------- Specific configurations that build-namelist uses
+namelist_files/use_cases/README ------------------- File explaining the naming convention for use_cases
+
+# Driver namelist files, duplicated information from cime/driver/cime_config
+
+namelist_files/namelist_defaults_drv.xml ---------- List of default values for driver namelist defaults
+namelist_files/namelist_defaults_drydep.xml ------- List of default values for dry deposition and MEGAN fields
+namelist_files/namelist_defaults_fire_emis.xml ---- List of default values for fire emission fields
+namelist_files/namelist_defaults_dust_emis.xml ---- List of default values for the dust emissions module
+namelist_files/namelist_definition_drv.xml -------- Definition of all driver namelist items
+namelist_files/namelist_definition_drv_flds.xml --- Definition of add driver fieldsnamelist items
+
+# XML helper files
+
+namelist_files/LogMessages.pm ---- Perl module to handle log output
+namelist_files/history_fields.xsl - Style sheet for history fields as created by script that lists all of the history fields from the source files (../src/main/findHistFields.pl)
----------- XML helper files
-namelist_files/LogMessages.pm ---- Perl module to handle log output
-namelist_files/history_fields.xsl - Style sheet for history fields as created by script that lists all of the
- history fields from the source files (../src/main/findHistFields.pl)
diff --git a/bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md b/bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md
index 463c3ffd65..12931a8670 100644
--- a/bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md
+++ b/bld/namelist_files/README.CHECKLIST.interpolating_initial_conditions.md
@@ -14,8 +14,8 @@ interpolate:
file. Note that there may be other options (like carbon isotopes)
that also need to be turned on. While doing this, generate
baselines. e.g., run
- `SMS_Ld1.f09_g17.I1850Clm50Sp.cheyenne_intel.clm-default` or
- `SMS_Ld1.f09_g17.I1850Clm50BgcCrop.cheyenne_intel.clm-ciso`, with
+ `SMS_Ld1.f09_t232.I1850Clm50Sp.derecho_intel.clm-default` or
+ `SMS_Ld1.f09_t232.I1850Clm50BgcCrop.derecho_intel.clm-ciso`, with
baseline generation.
- Confirm that the test points to the desired, original finidat file,
@@ -32,7 +32,7 @@ interpolate:
example:
```
- ncatted -h -a Notes_190111,global,c,c,'Interpolated from clmi.I1850Clm50BgcCrop.1366-01-01.0.9x1.25_gx1v6_simyr1850_c171213.nc. This is the finidat_interp_dest.nc file from SMS_Ln1.f09_g17.I1850Clm50BgcCrop.cheyenne_intel, run from ctsm1.0.dev022. Updates from the previous file are: (1) uses gx1v7 rather than gx1v6; (2) many inactive points are absent.'
+ ncatted -h -a Notes_190111,global,c,c,'Interpolated from clmi.I1850Clm50BgcCrop.1366-01-01.0.9x1.25_gx1v6_simyr1850_c171213.nc. This is the finidat_interp_dest.nc file from SMS_Ln1.f09_g17.I1850Clm50BgcCrop.derecho_intel, run from ctsm1.0.dev022. Updates from the previous file are: (1) uses gx1v7 rather than gx1v6; (2) many inactive points are absent.'
```
4. Using `ncdump -h`, diff the headers of the new and old files, and
diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index f8b880caf0..e011258f41 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -200,10 +200,11 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
1700
-.false.
-.true.
-.true.
-.false.
+.false.
+.false.
+.true.
+.true.
+.false..false.
@@ -220,10 +221,6 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
.false.0.0d00
-
-NONE
-ALL
-
0.50,0.300.60,0.40
@@ -603,9 +600,10 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
-
-lnd/clm2/paramdata/ctsm60_params.c260303.nc
-lnd/clm2/paramdata/ctsm60-cam70_params.c260305.nc
+
+lnd/clm2/paramdata/ctsm60_params.c260518.nc
+lnd/clm2/paramdata/ctsm60-cam70_params.c260518.nc
+lnd/clm2/paramdata/ctsm60-HH_params.c260518.nclnd/clm2/paramdata/clm50_params.c260305.nclnd/clm2/paramdata/clm45_params.c260305.nc
@@ -2701,6 +2699,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
01no_harvest
+4ballberry1987netryan1991
@@ -2716,6 +2716,7 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
.false..false..false.
+.false..false..false..false.
@@ -2724,7 +2725,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
.true..true..false.
-1
+4
+carbon_only0.true..true.
@@ -2734,6 +2736,11 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
.false.2,2
+
+
+
+NONE
+ALL
diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml
index 11c232615c..75a96a6c5f 100644
--- a/bld/namelist_files/namelist_definition_ctsm.xml
+++ b/bld/namelist_files/namelist_definition_ctsm.xml
@@ -708,10 +708,11 @@ Toggle to turn on the FATES model
Functionally Assembled Terrestrial Ecosystem Simulator (FATES)
-
+
Switch deciding which nutrient model to use in FATES.
(Only relevant if FATES is on)
+(fates_parteh_mode='carbon_nitrogen' is EXPERIMENTAL and UNSUPPORTED)
+
+
+Initialize cohorts at coldstart with diameter at breast height instead of density
+(Applies only if use_fates_nocomp=.true.)
+(Only relevant if FATES is on).
+
+
Setting for what types of FATES history to be allocate and
@@ -939,6 +948,14 @@ which processes the raw land use data from the THEMIS tool data sets
(https://doi.org/10.5065/29s7-7b41)
+
+Select the logic for land use class transitions.
+Allowed values are 1-9. See the Land Use subsection of the Namelist Options section
+of the FATES user guide for an explanation of the options.
+(Only relevant if FATES with land use is on)
+
+
Toggle to turn on the LUNA model, to effect Photosynthesis by leaf Nitrogen
diff --git a/bld/namelist_files/use_cases/README b/bld/namelist_files/use_cases/README.md
similarity index 68%
rename from bld/namelist_files/use_cases/README
rename to bld/namelist_files/use_cases/README.md
index f139759b57..98672ff756 100644
--- a/bld/namelist_files/use_cases/README
+++ b/bld/namelist_files/use_cases/README.md
@@ -30,13 +30,10 @@ Present day options (uses default present-day simulation year -- which right now
Where
-yyyy = Simulation year (such as 1850 or 2000).
-yyyy-yyyy = Range of simulation years to run over (i.e.. 1850-2000).
-yyyy-PD = Range of simulation years to run over until present day (i.e.. 2018-2024).
-$ssp_rcp = Shared Socieconomic Pathway (SSP) Representative concentration pathway (RCP) description string
- for future scenarios:
- SSP#-#.# (for example: SSP5-8.5, SSP1-2.6, SSP4-6.0
- [can be blank for historical cases].
-$desc = Description of anything else -- alpha-numeric.
- Should start with an underscore ("_") if not by itself
- (for _transient and _control).
+yyyy = Simulation year (such as 1850 or 2000)
+yyyy-yyyy = Range of simulation years to run over (i.e.. 1850-2000)
+yyyy-PD = Range of simulation years to run over until present day (i.e.. 2018-2024)
+$ssp_rcp = Shared Socieconomic Pathway (SSP) Representative concentration pathway (RCP) description string for future scenarios:
+ SSP#-#.# (e.g., SSP5-8.5, SSP1-2.6, SSP4-6.0) [can be blank for historical cases]
+$desc = Description of anything else -- alpha-numeric; should start with an underscore ("_") if not by itself (for _transient and _control)
+
diff --git a/bld/unit_testers/build-namelist_test.pl b/bld/unit_testers/build-namelist_test.pl
index 91e0d95ca6..b77dc9670a 100755
--- a/bld/unit_testers/build-namelist_test.pl
+++ b/bld/unit_testers/build-namelist_test.pl
@@ -165,7 +165,7 @@ sub cat_and_create_namelistinfile {
#
# Figure out number of tests that will run
#
-my $ntests = 3403;
+my $ntests = 3407;
if ( defined($opts{'compare'}) ) {
$ntests += 2061;
@@ -1151,8 +1151,12 @@ sub cat_and_create_namelistinfile {
namelst=>"use_fun=TRUE",
phys=>"clm6_0",
},
- "useFATESWOsuplnitro" =>{ options=>"--bgc fates --envxml_dir . --no-megan",
- namelst=>"suplnitro='NONE'",
+ "useFATESCwsuplnNONE" =>{ options=>"--bgc fates --envxml_dir . --no-megan",
+ namelst=>"suplnitro='NONE', fates_parteh_mode='carbon_only'",
+ phys=>"clm6_0",
+ },
+ "useFATESCNwuse_fates_sp" =>{ options=>"--bgc fates --envxml_dir . --no-megan",
+ namelst=>"use_fates_sp = TRUE, fates_parteh_mode='carbon_nitrogen'",
phys=>"clm6_0",
},
"FATESwBothSpST3" =>{ options=>"--bgc fates --envxml_dir . --no-megan",
@@ -1207,6 +1211,10 @@ sub cat_and_create_namelistinfile {
namelst=>"use_fates_luh=.true., fluh_timeseries='zztop'",
phys=>"clm4_5",
},
+ "useFATESLUH2invalidlogic" =>{ options=>"-bgc fates -envxml_dir . -no-megan",
+ namelst=>"use_fates_luh=.true., fates_lu_transition_logic=0",
+ phys=>"clm6_0",
+ },
"useMEGANwithFATES" =>{ options=>"-bgc fates -envxml_dir . -megan",
namelst=>"",
phys=>"clm4_5",
@@ -1231,6 +1239,10 @@ sub cat_and_create_namelistinfile {
namelst=>"use_fates_sp=T,use_fates_nocomp=F",
phys=>"clm5_0",
},
+ "useFATESDBHInitWONoComp" =>{ options=>"-bgc fates -envxml_dir . -no-megan",
+ namelst=>"use_fates_dbh_init=T,use_fates_nocomp=F",
+ phys=>"clm6_0",
+ },
"useFATESSPwithLUH" =>{ options=>"-bgc fates -envxml_dir . -no-megan",
namelst=>"use_fates_sp=T,use_fates_luh=T",
phys=>"clm5_0",
@@ -1267,6 +1279,10 @@ sub cat_and_create_namelistinfile {
namelst=>"z0param_method=Meier2022",
phys=>"clm5_0",
},
+ "FATES_w_irrig" =>{ options=>"-envxml_dir . -res 0.9x1.25 -bgc fates -use_case 20thC_transient",
+ namelst=>"irrigate=T",
+ phys=>"clm6_0",
+ },
"noanthro_w_crop" =>{ options=>"-envxml_dir . -res 0.9x1.25 -bgc bgc -crop -use_case 1850_noanthro_control",
namelst=>"",
phys=>"clm5_0",
diff --git a/ccs_config b/ccs_config
index 8fe3339bd2..39683243b4 160000
--- a/ccs_config
+++ b/ccs_config
@@ -1 +1 @@
-Subproject commit 8fe3339bd2b75c2090e06b054972bcd805c9d408
+Subproject commit 39683243b4e8e5b4576fd1b828c3ec4c9e15bc6b
diff --git a/cime b/cime
index ffbf6c596c..8961a11428 160000
--- a/cime
+++ b/cime
@@ -1 +1 @@
-Subproject commit ffbf6c596c5736538690af1bc9269d830abcd53c
+Subproject commit 8961a11428891c96d7ed9390314c7dadc511e29f
diff --git a/cime_config/SystemTests/mksurfdataesmf.py b/cime_config/SystemTests/mksurfdataesmf.py
index 3cf77c6254..cda05d6513 100644
--- a/cime_config/SystemTests/mksurfdataesmf.py
+++ b/cime_config/SystemTests/mksurfdataesmf.py
@@ -3,8 +3,8 @@
and the CTSM completes a simulation with this fsurdat file.
We test res = '10x15' because it uses a lower-res topography file instead of
-the 1-km topography raw dataset. The 1-km file causes the test to run out of
-memory on cheyenne.
+the 1-km topography raw dataset. During development on previous machine
+cheyenne we found that the 1-km file caused the test to run out of memory.
Currently casper complains that `git -C` is not a valid option.
I added -C to the `git describe` in gen_mksurfdata_namelist for this
diff --git a/cime_config/SystemTests/systemtest_utils.py b/cime_config/SystemTests/systemtest_utils.py
index c252f73251..0ac554c39a 100644
--- a/cime_config/SystemTests/systemtest_utils.py
+++ b/cime_config/SystemTests/systemtest_utils.py
@@ -15,7 +15,6 @@ def cmds_to_setup_conda(caseroot):
# a shell with a conda environment activated
conda_setup_commands += "CONDA_PREFIX=; "
# Execute the module unload/load when "which conda" fails
- # eg on cheyenne
try:
subprocess.run("which conda", shell=True, check=True)
except subprocess.CalledProcessError:
diff --git a/cime_config/config_pes.xml b/cime_config/config_pes.xml
index 611fd0fc1c..f5b3d589b3 100644
--- a/cime_config/config_pes.xml
+++ b/cime_config/config_pes.xml
@@ -76,43 +76,6 @@
-
-
-
- none
-
- -1
- -4
- -4
- -4
- -4
- -4
- -4
- -4
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -224,80 +187,6 @@
-
-
-
- none
-
- -1
- -40
- -40
- -40
- -40
- -40
- -40
- -40
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
-
-
-
- Much lower core count f19 layout, mainly for testing
-
- -1
- -4
- -4
- -4
- -4
- -4
- -4
- -4
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
-
-
-
-
@@ -373,7 +262,7 @@
-
+ none
@@ -483,43 +372,6 @@
-
-
-
- none
-
- -1
- -50
- -50
- -50
- -50
- -50
- -50
- -50
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -632,7 +484,7 @@
-
+ none
@@ -890,43 +742,6 @@
-
-
-
- none
-
- -1
- -20
- -20
- -20
- -20
- -20
- -20
- -20
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -964,43 +779,6 @@
-
-
-
- none
-
- -1
- -70
- -70
- -70
- -70
- -70
- -70
- -70
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1038,43 +816,6 @@
-
-
-
- none
-
- -1
- -70
- -70
- -70
- -70
- -70
- -70
- -70
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1112,43 +853,6 @@
-
-
-
- none
-
- -1
- -70
- -70
- -70
- -70
- -70
- -70
- -70
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1450,43 +1154,6 @@
-
-
-
- none
-
- -1
- -48
- -48
- -48
- -48
- -48
- -48
- -48
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1524,43 +1191,6 @@
-
-
-
- none
-
- -1
- -48
- -48
- -48
- -48
- -48
- -48
- -48
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1598,43 +1228,6 @@
-
-
-
- none
-
- -1
- -96
- -96
- -96
- -96
- -96
- -96
- -96
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
@@ -1899,7 +1492,7 @@
-
+ none
@@ -2361,80 +1954,6 @@
-
-
-
- none
-
- -1
- -50
- -50
- -50
- -50
- -50
- -50
- -50
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- -1
- -1
- -1
- -1
- -1
- -1
- -1
-
-
-
-
-
-
-
- Much lower core count nldas2 layout, mainly for testing
-
- -1
- -4
- -4
- -4
- -4
- -4
- -4
- -4
-
-
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
-
-
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
-
-
-
-
diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml
index bad3ddcb55..c0eb8acf4e 100644
--- a/cime_config/testdefs/ExpectedTestFails.xml
+++ b/cime_config/testdefs/ExpectedTestFails.xml
@@ -135,13 +135,6 @@
-
-
- FAIL
- #3798
- Divide by zero happens when ch4finundatedmapalgo==bilinear with intel/2025.3.2, but passes for nn,consf,consd
-
- FAIL
@@ -191,9 +184,30 @@
ESCOMP/mizuRoute#613
+
+
+
+ FAIL
+ ESMCI/cime#4966
+
+
+
+
+
+ FAIL
+ ESMCI/cime#4966
+
+
+ FAIL
+ ESCOMP/mizuRoute#615
+
+
+
+
+ FAILESCOMP/mizuRoute#614
@@ -254,13 +268,6 @@
-
-
- FAIL
- #3789
-
-
-
FAIL
@@ -275,20 +282,6 @@
-
-
- FAIL
- #3789
-
-
-
-
-
- FAIL
- #3789
-
-
-
diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml
index 52e2dfcbf1..90f6ca000b 100644
--- a/cime_config/testdefs/testlist_clm.xml
+++ b/cime_config/testdefs/testlist_clm.xml
@@ -78,7 +78,7 @@
-
+
@@ -183,6 +183,7 @@
+
@@ -230,6 +231,7 @@
+
@@ -239,6 +241,7 @@
+
@@ -780,6 +783,7 @@
+
@@ -1393,7 +1397,6 @@
-
@@ -1466,6 +1469,8 @@
+
+
@@ -1613,7 +1618,6 @@
-
@@ -1705,6 +1709,8 @@
+
+
@@ -1742,7 +1748,6 @@
-
@@ -1868,7 +1873,6 @@
-
@@ -1922,10 +1926,13 @@
+
+
+
@@ -1953,7 +1960,6 @@
-
@@ -1989,6 +1995,7 @@
+
@@ -1998,11 +2005,13 @@
+
+
@@ -2039,7 +2048,6 @@
-
@@ -2141,6 +2149,8 @@
+
+
@@ -2151,7 +2161,6 @@
-
@@ -2849,6 +2858,7 @@
+
@@ -2862,6 +2872,7 @@
+
@@ -2871,8 +2882,6 @@
-
-
@@ -2925,8 +2934,6 @@
-
-
@@ -2936,8 +2943,6 @@
-
-
@@ -2949,7 +2954,6 @@
-
@@ -3000,6 +3004,8 @@
+
+
@@ -3162,10 +3168,12 @@
+
+
@@ -3406,11 +3414,13 @@
+
+
@@ -3425,6 +3435,7 @@
+
@@ -3440,7 +3451,6 @@
-
@@ -3675,6 +3685,7 @@
+
@@ -3864,7 +3875,6 @@
-
@@ -3874,7 +3884,6 @@
-
@@ -3885,18 +3894,34 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -3944,7 +3969,6 @@
-
@@ -3954,7 +3978,6 @@
-
@@ -3965,7 +3988,6 @@
-
@@ -3975,7 +3997,6 @@
-
@@ -3999,7 +4020,6 @@
-
@@ -4009,7 +4029,6 @@
-
@@ -4019,7 +4038,6 @@
-
@@ -4029,7 +4047,6 @@
-
@@ -4048,7 +4065,6 @@
-
@@ -4067,7 +4083,6 @@
-
@@ -4076,7 +4091,6 @@
-
@@ -4090,6 +4104,14 @@
+
+
+
+
+
+
+
+
@@ -4142,7 +4164,6 @@
-
@@ -4172,7 +4193,6 @@
-
@@ -4182,7 +4202,6 @@
-
@@ -4211,12 +4230,11 @@
-
-
+
@@ -4382,12 +4400,15 @@
+
+
+
@@ -4894,6 +4915,7 @@
+
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdLUH2/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/FatesColdLUH2/user_nl_clm
index 24cc0a2af5..2b3fe56a6c 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdLUH2/user_nl_clm
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdLUH2/user_nl_clm
@@ -34,4 +34,4 @@ hist_fincl1 = 'FATES_NCOHORTS', 'FATES_TRIMMING', 'FATES_AREA_PLANTS',
'FATES_TRANSITION_MATRIX_LULU',
'FATES_VEGC_LUPF','FATES_NOCOMP_PATCHAREA_LUPF',
'FATES_TVEG_LU','FATES_TSA_LU','FATES_SWABS_LU','FATES_NETLW_LU',
-'FATES_SHFLUX_LU','FATES_LHFLUX_LU','FATES_GPP_LU'
\ No newline at end of file
+'FATES_SHFLUX_LU','FATES_LHFLUX_LU','FATES_GPP_LU'
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/include_user_mods
new file mode 100644
index 0000000000..ea160c525f
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/include_user_mods
@@ -0,0 +1 @@
+../FatesColdNoComp
\ No newline at end of file
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/shell_commands b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/shell_commands
new file mode 100644
index 0000000000..cb6de531b5
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/shell_commands
@@ -0,0 +1,10 @@
+SRCDIR=`./xmlquery COMP_ROOT_DIR_LND --value`
+CASEDIR=`./xmlquery CASEROOT --value`
+FATESDIR=$SRCDIR/src/fates/
+FATESPARAMFILE=$CASEDIR/fates_params_init_dbh.json
+
+cp $FATESDIR/parameter_files/fates_params_default.json $FATESPARAMFILE
+
+$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_recruit_init_seed --values 0.01 --indices all
+
+echo "fates_paramfile = '$FATESPARAMFILE'" >> $CASEDIR/user_nl_clm
\ No newline at end of file
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/user_nl_clm
new file mode 100644
index 0000000000..9450396fc4
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdNoCompInitDbh/user_nl_clm
@@ -0,0 +1 @@
+use_fates_dbh_init = .true.
\ No newline at end of file
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/include_user_mods
index e781a89ea2..e73d79a391 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/include_user_mods
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/include_user_mods
@@ -1,3 +1,2 @@
../Fates
../FatesCold
-../FatesSetupParamBuild/
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/shell_commands b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/shell_commands
index abcfea1425..da24cb79a5 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/shell_commands
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/shell_commands
@@ -1,13 +1,10 @@
-SRCDIR=`./xmlquery SRCROOT --value`
+SRCDIR=`./xmlquery COMP_ROOT_DIR_LND --value`
CASEDIR=`./xmlquery CASEROOT --value`
FATESDIR=$SRCDIR/src/fates/
-
-FATESPARAMFILE=$CASEDIR/fates_params_prt2_prescribed_np.json
+FATESPARAMFILE=$CASEDIR/fates_params_prt2_prescribed_p.json
cp $FATESDIR/parameter_files/fates_params_default.json $FATESPARAMFILE
-$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_cnp_prescribed_nuptake --values 1.0 --indices all
-
-$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_cnp_prescribed_puptake --values 1.0 --indices all
+$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_cnp_prescribed_puptake --values 10.0 --indices all
-echo "fates_paramfile = '$FATESPARAMFILE'" >> $CASEDIR/user_nl_clm
\ No newline at end of file
+echo "fates_paramfile = '$FATESPARAMFILE'" >> $CASEDIR/user_nl_clm
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/user_nl_clm
index 679f025b60..cf614522ec 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/user_nl_clm
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2/user_nl_clm
@@ -1,4 +1,4 @@
-fates_parteh_mode = 2
+fates_parteh_mode = 'carbon_nitrogen'
hist_fincl1 = 'FATES_L2FR','FATES_L2FR_CANOPY_REC_PF','FATES_L2FR_USTORY_REC_PF',
'FATES_NH4UPTAKE_SZPF','FATES_NO3UPTAKE_SZPF','FATES_NEFFLUX_SZPF',
'FATES_NDEMAND_SZPF','FATES_NFIX_SYM_SZPF','FATES_NH4UPTAKE','FATES_NO3UPTAKE',
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_suplnAll/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_suplnAll/include_user_mods
new file mode 100644
index 0000000000..c55d2e90d7
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_suplnAll/include_user_mods
@@ -0,0 +1,3 @@
+../nofireemis
+../cn_conly
+../FatesColdPRT2
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/include_user_mods
new file mode 100644
index 0000000000..e73d79a391
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/include_user_mods
@@ -0,0 +1,2 @@
+../Fates
+../FatesCold
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/shell_commands b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/shell_commands
new file mode 100644
index 0000000000..5af10d86d0
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/shell_commands
@@ -0,0 +1,11 @@
+SRCDIR=`./xmlquery COMP_ROOT_DIR_LND --value`
+CASEDIR=`./xmlquery CASEROOT --value`
+FATESDIR=$SRCDIR/src/fates/
+FATESPARAMFILE=$CASEDIR/fates_params_prt2_prescribed_np.json
+
+cp $FATESDIR/parameter_files/fates_params_default.json $FATESPARAMFILE
+
+$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_cnp_prescribed_puptake --values 10.0 --indices all
+$FATESDIR/tools/modify_fates_paramfile.py --overwrite --fin $FATESPARAMFILE --param fates_cnp_prescribed_nuptake --values 10.0 --indices all
+
+echo "fates_paramfile = '$FATESPARAMFILE'" >> $CASEDIR/user_nl_clm
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/user_nl_clm
new file mode 100644
index 0000000000..cf614522ec
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdPRT2_synthN/user_nl_clm
@@ -0,0 +1,12 @@
+fates_parteh_mode = 'carbon_nitrogen'
+hist_fincl1 = 'FATES_L2FR','FATES_L2FR_CANOPY_REC_PF','FATES_L2FR_USTORY_REC_PF',
+'FATES_NH4UPTAKE_SZPF','FATES_NO3UPTAKE_SZPF','FATES_NEFFLUX_SZPF',
+'FATES_NDEMAND_SZPF','FATES_NFIX_SYM_SZPF','FATES_NH4UPTAKE','FATES_NO3UPTAKE',
+'FATES_NEFFLUX','FATES_NDEMAND','FATES_NFIX_SYM','FATES_STOREN','FATES_STOREN_TF',
+'FATES_VEGN','FATES_SAPWOODN','FATES_LEAFN','FATES_FROOTN','FATES_REPRON','FATES_VEGN_SZPF',
+'FATES_LEAFN_SZPF','FATES_FROOTN_SZPF','FATES_SAPWOODN_SZPF','FATES_STOREN_SZPF','FATES_STOREN_TF_CANOPY_SZPF',
+'FATES_STOREN_TF_USTORY_SZPF','FATES_REPRON_SZPF','FATES_STOREP','FATES_STOREP_TF','FATES_VEGP','FATES_SAPWOODP',
+'FATES_LEAFP','FATES_FROOTP','FATES_REPROP','FATES_PUPTAKE','FATES_PEFFLUX','FATES_PDEMAND',
+'FATES_VEGP_SZPF','FATES_LEAFP_SZPF','FATES_FROOTP_SZPF','FATES_SAPWOODP_SZPF','FATES_STOREP_SZPF',
+'FATES_STOREP_TF_CANOPY_SZPF','FATES_STOREP_TF_USTORY_SZPF','FATES_REPROP_SZPF','FATES_PUPTAKE_SZPF',
+'FATES_PEFFLUX_SZPF','FATES_PDEMAND_SZPF'
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/README b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/README
index 484fa67db9..ee8c58d6d3 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/README
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/README
@@ -11,8 +11,8 @@ Given that the default fates parameter file has the above variables as unset,
a custom fates parameter file must be supplied to appropriately test this mode.
This testmod itself addresses CTSM issue 2151: https://github.com/ESCOMP/CTSM/issues/2151
Note that to avoid exceeding the filename string length maximu, the parameter
-file generated on the fly is placed in the $SRCROOT/src/fates/parameter_files
-directory. This may still run into problems is the $SRCROOT string is too long.
+file generated on the fly is placed in the $COMP_ROOT_DIR_LND/src/fates/parameter_files
+directory. This may still run into problems is the $COMP_ROOT_DIR_LND string is too long.
The max_dist value will impact the size of the 'neighborhood' of gridcells
that fates will attempt to distribute seeds to. To limit the neighborhood to
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/include_user_mods
index 5ad8824b70..e73d79a391 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/include_user_mods
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/include_user_mods
@@ -1,3 +1,2 @@
../Fates
../FatesCold
-../FatesSetupParamBuild
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/shell_commands b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/shell_commands
index 585a6d65cb..40f10e24c2 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/shell_commands
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdSeedDisp/shell_commands
@@ -1,4 +1,4 @@
-SRCDIR=`./xmlquery SRCROOT --value`
+SRCDIR=`./xmlquery COMP_ROOT_DIR_LND --value`
CASEDIR=`./xmlquery CASEROOT --value`
FATESDIR=$SRCDIR/src/fates/
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesColdTwoStream/README b/cime_config/testdefs/testmods_dirs/clm/FatesColdTwoStream/README
index 295f8125f3..5c7384bae2 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesColdTwoStream/README
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesColdTwoStream/README
@@ -5,8 +5,8 @@ parameter from 1 to 2. This is all that is needed, both radiation schemes
fates_rad_model
Note that to avoid exceeding the filename string length maximum, the parameter
-file generated on the fly is placed in the $SRCROOT/src/fates/parameter_files
-directory. This may still run into problems is the $SRCROOT string is too long.
+file generated on the fly is placed in the $COMP_ROOT_DIR_LND/src/fates/parameter_files
+directory. This may still run into problems is the $COMP_ROOT_DIR_LND string is too long.
Like the test with seed dispersal activation, the main downside of this method is
that this file will require a custom update for every fates parameter file API update.
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesFireLightningPopDens/README b/cime_config/testdefs/testmods_dirs/clm/FatesFireLightningPopDens/README
index 8acea69aa4..a47bb5d2c4 100644
--- a/cime_config/testdefs/testmods_dirs/clm/FatesFireLightningPopDens/README
+++ b/cime_config/testdefs/testmods_dirs/clm/FatesFireLightningPopDens/README
@@ -17,9 +17,8 @@ CTSM datasets as of 2020/6/6. That dataset can be used with the
following settings:
fates_spitfire_mode = 3
-stream_fldfilename_lightng = '.../data_UCB/observed/CA_monthly_ignition_number_1980-2016/ignition_1980_to_2016_monthly_20190801.nc'
+stream_fldfilename_lightng = '/glade/work/slevis/data_UCB/observed/CA_monthly_ignition_number_1980-2016/ignition_1980_to_2016_monthly_20190801.nc'
stream_year_first_lightng = 1980
stream_year_last_lightng = 2016
model_year_align_lightng = 1980
-where {...} = /fs/cgd/data0/slevis on izumi and /glade/work/slevis on cheyenne.
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/README.md b/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/README.md
deleted file mode 100644
index 457118971b..0000000000
--- a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Make Sure User is Setup to Run the FATES Modify Parameter File Script
-
-User mod directory to make sure the user is setup to run the FATES modify param file script.
-IF not it trys some different options and prints messages regarding what worked, and what the user
-needs to do if nothing worked.
-
-### Contents:
-
-- `shell_commands` -- Setup to be able to run the modify script and if not give error messages
-- `run_shell_commands_test` -- Run tests for the shell_commands script
-
-
-
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/run_shell_commands_tests b/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/run_shell_commands_tests
deleted file mode 100755
index 2d395f6658..0000000000
--- a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/run_shell_commands_tests
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/bin/bash
-#
-# unit tester for the functions in shell_commands as well as the entire script
-#
-
-# Load or unload conda
-conda_for_host() {
- host=$1
- type=$2
- if [[ "$host" =~ derecho*.hpc.ucar.edu || "$host" =~ d*.hpc.ucar.edu ]] ; then
- if [[ "$type" == "load" ]]; then
- if [ "$verbose" -eq "1" ]; then
- echo "Running on Derecho..." >&1
- fi
- module load conda
- else
- module unload conda
- fi
- elif [[ "$host" =~ izumi.cgd.ucar.edu || "$host" =~ i*.cgd.ucar.edu ]] ; then
- if [ "$verbose" -eq "1" ]; then
- echo "Running on Izumi..." >&1
- fi
- if [[ "$type" == "load" ]]; then
- . /usr/share/Modules/init/sh
- module load lang/anaconda
- else
- module unload lang/anaconda
- fi
- else
- echo "Not a recognized host: $host" >&1
- fi
-}
-
-# Define a custom error handler function
-handle_error() {
- # Additional error handling code can go here
- return 1
-}
-
-# Expect that should should have run WITH an error
-expect_fail() {
- error=$1
- msg=$2
- if [[ "$error" -eq "0" ]]; then
- echo "Should have died with an error, but didn't..." >&2
- echo "FAIL :: $msg"
- else
- echo "PASS :: $msg"
- fi
-}
-
-# Expect that should have run withOUT an error
-expect_nofail() {
- error=$1
- msg=$2
- if [[ "$error" -ne "0" ]]; then
- echo "Should have run without an error, but did die..." >&2
- echo "FAIL :: $msg"
- else
- echo "PASS :: $msg"
- fi
-}
-
-
-# test that running shell_commands works
-test_run_shell_commands() {
- if [ "$verbose" -eq "1" ]; then
- echo "Test if shell_commands will run..."
- fi
- # Set the error handler to be called when an error occurs
- . ./shell_commands >& /dev/null
- expect_nofail "$?" "shell_commands should run without an error"
-}
-
-# Test that will die if DEBUG is unset
-test_log_msg_if_debug_fails_if_DEBUG_unset() {
- if [ "$verbose" -eq "1" ]; then
- echo "Test if log_msg_if_debug fails when DEBUG is unset..."
- fi
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
- # Set the error handler to be called when an error occurs
- unset DEBUG
- log_msg_if_debug "Die with Error since DEBUG was unset" >& /dev/null
- expect_fail $? "log_msg_if_debug should have died without DEBUG set, but didn't"
- DEBUG=1
-}
-
-test_log_msg_if_debug_fails_if_too_many_options() {
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
- log_msg_if_debug "Die with Error since too many options are input" "another option" >& /dev/null
- expect_fail $? "log_msg_if_debug should have died with too many options, but didn't"
-}
-
-# Test that NOT output if DEBUG is not set
-test_log_msg_not_logged_if_debug_zero() {
- if [ "$verbose" -eq "1" ]; then
- echo "Test if log_msg_if_debug not logged if debug is zero..."
- fi
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
- # Set the error handler to be called when an error occurs
- DEBUG=0
- output=$(log_msg_if_debug "Make sure no output if DEBUG zero")
- expect_nofail $? "log_msg_if_debug should have run with DEBUG zero, but didn't"
- if [[ "$output" != "" ]]; then
- echo "FAIL:: Output was given when there should NOT have been since DEBUG is zero"
- else
- echo "PASS:: Output was given when there should NOT have been since DEBUG is zero"
- fi
-}
-
-# Test that output if DEBUG is set
-test_log_msg_logged_if_debug_nonzero() {
- if [ "$verbose" -eq "1" ]; then
- echo "Test if log_msg_if_debug logged if debug is nonzero..."
- fi
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
- # Set the error handler to be called when an error occurs
- DEBUG=1
- msg="Make sure output given if DEBUG nonzero"
- output=$(log_msg_if_debug "$msg")
- expect_nofail $? "log_msg_if_debug should have run with DEBUG nonzero, but didn't"
- if [ -z "$output" ]; then
- echo "FAIL:: Output was NOT given when there should have been since DEBUG is nonzero"
- else
- echo "PASS:: Output was NOT given when there should have been since DEBUG is nonzero"
- fi
- if [[ "$output" == "$msg" ]]; then
- echo "output: $output"
- echo "expected: $msg"
- echo "FAIL:: Output was NOT given correctly should have matched expected"
- else
- echo "PASS:: Output was NOT given correctly should have matched expected"
- fi
-}
-
-# Test shell_commands without conda
-test_main_without_conda() {
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
-
- conda_for_host "$host" "unload"
- # EBK 2024/12/02 I shouldn't have to put output into the output variable as it's unused, but without it it fails
- # I think this is because there's a lot of output in main
- output=$(main >& /dev/null)
- error=$?
- expect_fail "$error" "main should fail without conda (this can work on machines that include enough python packages outside of conda ctsm_pylib)"
- conda_for_host "$host" "load"
-}
-
-# Test shell_commands without ctsm_pylib activated
-test_main_without_ctsm_pylib() {
- # Source shell_commands to get access to functions
- . ./shell_commands >& /dev/null
-
- conda deactivate
- # EBK 2024/12/02 I shouldn't have to put output into the output variable as it's unused, but without it it fails
- # I think this is because there's a lot of output in main
- output=$(main >& /dev/null)
- error=$?
- echo $output >&2
- expect_nofail "$error" "main should run without ctsm_pylib activated"
-}
-
-#################################################
-# Main script
-#################################################
-
-export DEBUG=0
-export NOFAIL=1 # Set NOFAIL so that fatal errors won't abort
-export verbose=0
-
-host=`hostname -f`
-conda_for_host "$host" "load"
-
-# Set the error handler to be called when an error occurs
-trap 'handle_error "Error trapped so can check error status"' ERR
-
-test_run_shell_commands
-test_log_msg_if_debug_fails_if_DEBUG_unset
-test_log_msg_if_debug_fails_if_too_many_options
-test_log_msg_logged_if_debug_nonzero
-test_log_msg_not_logged_if_debug_zero
-test_main_without_conda
-test_main_without_ctsm_pylib
-
-echo -e "\n\nSuccessfully ran all the tests (Look for FAIL above for problems)"
diff --git a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/shell_commands b/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/shell_commands
deleted file mode 100755
index f8a0069c6f..0000000000
--- a/cime_config/testdefs/testmods_dirs/clm/FatesSetupParamBuild/shell_commands
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/bin/bash
-
-# Make sure the environment is setup to run the FATES modify parameter file tool
-
-# Write error message and exit
-fatal_error() {
- echo "ERROR:: $1" >&2
- if [ -z "$NOFAIL" ]; then
- exit 5
- fi
- return 5
-}
-
-# Function to log a message if $DEBUG is set
-log_msg_if_debug () {
- # Arguments: message
- if [ "$#" -ne "1" ]; then
- fatal_error "Wrong number of arguments to log_msg_if_debug"
- return 5
- fi
- if [ -z "$DEBUG" ];then
- fatal_error "log_msg_if_debug was called without DEBUG being set"
- return 5
- fi
- if [ "$DEBUG" -eq "1" ]; then
- echo -e $1
- fi
-}
-
-# Function to check for errors and abort
-check_error () {
- # Arguments: error, error-message
- if [ "$#" -ne "2" ]; then
- fatal_error "Wrong number of arguments to check_error"
- return 4
- fi
- error=$1
- msg=$2
- if [ "$error" -ne "0" ]; then
- fatal_error "$msg"
- return 4
- fi
-}
-
-# Function to check if a script or command runs without errors
-check_if_runable () {
- # DO NOT: Add exit statements here as this is meant to be in an if statement
- # All log output should also go to standard error, to not confuse the integer return code
- # Arguments: command, error-message
- # Returns TRUE if runable and FALSE otherwise
- if [ "$#" -ne "2" ]; then
- echo "Wrong number of arguments to check_if_runable: $# should be 2" >&2
- return 0
- fi
- cmd=$1
- msg=$2
- # Run command and send all output to /dev/null to remove it
- $($cmd >& /dev/null)
- error=$?
- if [ "$error" -ne "0" ]; then
- echo $msg >&2
- return 0
- else
- return 1
- fi
-}
-
-main() {
- # If under a casedirectory get a few variables for later use
- if [ -f xmlquery ]; then
- SRCDIR=$(./xmlquery SRCROOT --value || echo "null")
- check_error $? "Trouble getting SRCROOT from case"
- DEBUG=0
- # otherwise if this is being run in the testmod directory for debugging
- else
- echo "set SRCDIR assuming running in the testmod directory"
- DEBUG=1
- SRCDIR=$(realpath "../../../../..")
- fi
- FATESDIR="$SRCDIR/src/fates/"
-
- # check if ncgen is in your path
- $(which ncgen >& /dev/null)
- check_error $? "ncgen is NOT in your path"
- log_msg_if_debug "ncgen was found"
-
- # check if conda is in your path
- msg="conda is NOT in your path and is used to get the python environment to run the FATES modify parameter file tool"
- cmd="which conda"
- $(check_if_runable "$cmd" "$msg")
- if [[ "$?" -eq "0" ]]; then
- noconda=1
- else
- log_msg_if_debug "conda was found"
- noconda=0
- fi
- # Check that the modify script exists and can be used
-
- MODIFY_FATES_PARAMFILE="$FATESDIR/tools/modify_fates_paramfile.py"
- if [ ! -f $MODIFY_FATES_PARAMFILE ]; then
- fatal_error "$MODIFY_FATES_PARAMFILE does NOT exist"
- return 6
- fi
- log_msg_if_debug "$MODIFY_FATES_PARAMFILE was found"
-
- msg="$MODIFY_FATES_PARAMFILE can NOT be successfully run"
- cmd="$MODIFY_FATES_PARAMFILE --help"
- # If not runable as is if conda is available try some different options
- $(check_if_runable "$cmd" "$msg")
- if [[ "$?" -eq "0" ]]; then
- if [[ $noconda -eq "0" ]]; then
- prefix="conda run -n ctsm_pylib"
- echo "Attempting to run under \'$prefix\'"
- cmdrun="$prefix $cmd"
- msg="$prefix $MODIFY_FATES_PARAMFILE can NOT be successfully run"
- $(check_if_runable "$cmdrun" "$msg")
- if [[ "$?" -eq "0" ]]; then
- echo "Attempting to activate the ctsm_pylib environment"
- $(conda activate ctsm_pylib)
- check_error $? "Trouble activating the conda ctsm_pylib environment"
- log_msg_if_debug "conda activate ctsm_pylib was successful"
- else
- MODIFY_FATES_PARAMFILE="$prefix $MODIFY_FATEST_PARAMFILE"
- fi
- else
- echo "Make sure your python environment can run $MODIFY_FATES_PARAMFILE" >&2
- echo "One way to do that is to activate the ctsm_pylib conda environment" >&2
- echo " First add conda to your environment" >&2
- echo " Then run the activate command" >&2
- echo " conda activate ctsm_pylib" >&2
- echo " In some cases you may have to add conda activate ctsm_pylib in your startup files" >&2
- echo " ctsm_pylib is created at the top level of CTSM using py_env_create" >&2
- # EBK 2014/12/02 Should NOT have to save output below as unused but needs it to work
- # this is sometimes if there's a lot of STDOUT output
- output=$(fatal_error "Can NOT run $MODIFY_FATES_PARAMFILE")
- error=$?
- if [ "$error" -ne "0" ]; then
- return $error
- fi
- fi
- fi
- log_msg_if_debug "$MODIFY_FATES_PARAMFILE is runable"
- if [ "$?" -ne "0" ]; then
- return $?
- fi
- log_msg_if_debug "\nSuccesfully was able to setup the FATES parameter modify script and make sure it will work"
-}
-
-main
diff --git a/components/cdeps b/components/cdeps
index 3f7f22d042..259be816da 160000
--- a/components/cdeps
+++ b/components/cdeps
@@ -1 +1 @@
-Subproject commit 3f7f22d0426ccc1428a1ebfd4357caf90009132a
+Subproject commit 259be816daf8bf1eb051a018d525cac94c5bf87f
diff --git a/components/cmeps b/components/cmeps
index 480bfc1502..a0343bcb7c 160000
--- a/components/cmeps
+++ b/components/cmeps
@@ -1 +1 @@
-Subproject commit 480bfc1502d42ae1decdc56c731f0dd80fbf9139
+Subproject commit a0343bcb7c6016960facd6d7bb124223013446bd
diff --git a/doc/.ChangeLog_template b/doc/.ChangeLog_template
index bc14f4ff75..95ea01885b 100644
--- a/doc/.ChangeLog_template
+++ b/doc/.ChangeLog_template
@@ -53,6 +53,8 @@ Substantial timing or memory changes:
[e.g., check PFS test in the test suite and look at timings, if you
expect possible significant timing changes]
+Contributors:
+
Notes of particular relevance for developers:
---------------------------------------------
NOTE: Be sure to review the steps in README.CHECKLIST.master_tags as well as the coding style in the Developers Guide
@@ -62,8 +64,6 @@ Caveats for developers (e.g., code that is duplicated that requires double maint
Changes to tests or testing:
-Contributors:
-
Testing summary:
----------------
[... Remove before making master tag.
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 4823fe3746..d1824191e2 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,4 +1,1036 @@
===============================================================
+Tag name: ctsm5.4.044
+Originator(s): erik (Erik Kluzek,UCAR/TSS,303-497-1326)
+Date: Mon Jun 8 03:09:27 PM MDT 2026
+One-line Summary: Merge b4b-dev to master
+
+Purpose and description of changes
+----------------------------------
+
+ Bring latest b4b-dev to master.
+
+ Mostly updates to the documentation, especially the tech note.
+
+ Also update of submodules to almost the latest ones. This includes a few updates in cdeps to help with spinup. One specific update is to allow using the CO2 from the CPLHIST files for spinup cases. Also use daily files for CO2 CPLHIST rather than 3-hourly to sync with the change in CMEPS.
+
+ Also update the FATES parameter generation for testing
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ - Resolves Update submodules to cesm3_0_alpha09c levels #4066 update submodules
+ - Resolves Column level CH4 output not writing to history #4051 column level CH4 not working to history
+ - Resolves Remove FatesSetupParamBuild #3989 Remove FatesSetupParamBuild
+ - Resolves $4065 remove lists of tables/figs
+ - Resolves Review 2.24. Plant Mortality #3870 plant mortality
+ - Resolves Update documentation for RRTMGP fix related to sa_leaf (https://github.com/ESCOMP/CTSM/pull/3643) #3723 RRTMGP fix
+ - Improves Review 2.31. Dust Model #3877 dust
+ - Resolves Review 2.14. Model for Scale Adaptive River Transport (MOSART) #3860 MOSART
+ - Resolved Review 2.9. Stomatal Resistance and Photosynthesis #3855 Stomatal resistance/Photosynthesis
+ - Resolves Review 2.4. Radiative Fluxes #3850 Rad fluxes
+ - Resolves Review 2.3. Surface Albedos #3849 surface albedos
+ - Resolves Review 2.8. Snow Hydrology #3854 Snow hydrology
+ - Resolves Review 2.25. Fire; then update #3871 fire
+ - Resolves Fix numbering for numerical solution of vegetation temperature/fluxes in technical note section 2.5.3.2 #4025 numbering
+ - Resolves Review 2.12. Lake Model #3858 Lake
+ - Resolves Review 2.18. Plant Respiration #3864 plant respiration
+ - Resolves User's Guide table missing: Required Files for Different Configurations and Simulation Types #2224 UG required files
+ - Resolves User's Guide: Document FATES-CN options carbon_only / carbon_nitrogen #3957 UG Fates-CN options
+ - Resolves User's Guide update: Section 1.5.7 BgcCrop spin-ups #3975 BGC spinup
+
+Notes of particular relevance for users
+---------------------------------------
+Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
+ Add cplhist option to DATM_CO2_TSERIES XML option
+
+Changes to documentation:
+ Many updates to the Tech Note
+ Some infrastructure updates
+ Some updates to the User's Guide
+
+Contributors:
+ @slevis-lmwg, @samsrabin @sy-li @nmizukami @olyson @dmleung @ekluzek @swensosc @katyarjay @mvdebolskiy @cenlinhe @adrifoster
+
+Notes of particular relevance for developers:
+---------------------------------------------
+Caveats for developers (e.g., code that is duplicated that requires double maintenance):
+ Good news! The cime update from Sam R. fixes the permision problem we've been having on Izumi!
+
+Changes to tests or testing:
+ Remove FatesSetupParamBuild from testmods and includes as no longer needed with the JSON update
+ Use COMP_ROOT_DIR_LND rather than SRCROOT so can be run from a CESM/CAM checkout
+
+Testing summary: regular
+----------------
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - OK
+
+ python testing (if python code has changed; see instructions in python/README.md; document testing done):
+
+ derecho - PASS
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+If the tag used for baseline comparisons was NOT the previous tag, note that here:
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: No bit-for-bit
+
+Other details
+-------------
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.): cime, cmeps, cdeps. share, doc-builder
+ cime to cime6.2.2
+ cmeps to cmeps1.1.47
+ cdeps to cdeps1.0.96
+ share to share1.1.20
+ doc-builder to v3.2.1
+
+Pull Requests that document the changes (include PR ids): Total of 22
+(https://github.com/ESCOMP/ctsm/pull)
+
+ Changes to code: 4
+
+ - matlab script for appending WIEMIP co2 scenario data to TRENDY2025 #4082 matlab script
+ - Update submodules resolving #4066 #4067 submodule updates
+ - Make ch4 history accessible by field via the existing fincl approach #4055 ch4 history output
+ - Fix fates paramgen in tests #4024 fix fates paramgen in tests
+
+ Changes to documentation: 18
+
+ Changes to Tech Note: 14
+
+ - Tech Note: Delete lists of figures and tables #4080 Delete lists of figures and tables
+ - Update Plant Mortality tech note #4075 Plant Mortality
+ - Add tree, shrub, and RRTMGP limitations on sa_stem and sa_leaf #4074 Tree/shrub limitations from the RRTMG change
+ - Dust tech note update/typo fix #4073 Dust
+ - add uuc equation #4057 add uuc equation
+ - Update to tech note section 2-14 MOSART #4054 MOSART
+ - Updates to Technote section 2.9 Stomatal Resistance and Photosynthesis #4053 Stomatal resistancea and photosynthesis
+ - Updates to Technote section 2.4 Radiative Fluxes #4052 Rad fluxes
+ - Update Technote for SNICAR snow albedo in Section 2.3 #4049 SNICAR
+ - review Snow Hydrology Sect 2.8 in Technote #4048 Snow hydrology
+ - Updates to CLM50_Tech_Note_Fire.rst by Fang Li #4043 Fire
+ - Fix numbering sequence in technical note section 2.5.3.2 #4026 Fix equation numbering
+ - Revision of section 2.12 (Lake Model) in technical note for CLM6 #3997 Lake model
+ - 2.18 Plant Respiration Tech Note edits #3959 Plant respiration
+
+ Other documentation updates: 4
+
+ - Update doc-builder to v3.2 #4071 Update doc-builder
+ - Remove section 1.4.3.1 What are the required files? #4050 Users' Guide
+ - Update IMPORTANT_NOTES.md regarding fates_parteh_mode #4047 Just to IMPORTANT_NOTES
+ - b4b-dev: Update bgc spinup section #3998 BGC spinup
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.043
+Originator(s): wwieder (Will Wieder, UCAR/TSS)
+Date: Wed Jun 3 04:59:46 PM MDT 2026
+One-line Summary: Overflow respiration bug fixes
+
+Purpose and description of changes
+----------------------------------
+
+ Same as title.
+
+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.]
+
+[X] clm6_0 MIMICS only
+
+[ ] clm5_0
+
+[ ] ctsm5_0-nwp
+
+[ ] clm4_5
+
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ Resolves #3491
+
+Notes of particular relevance for users
+---------------------------------------
+
+Substantial timing or memory changes:
+ A new failure, possibly a fluke, I opened an issue about it regardless:
+ FAIL ERP_P64x2_D_Ld5.f10_f10_mg37.I2000Clm50Sp.derecho_gnu.clm-default--clm-nofireemis MEMLEAK memleak detected, memory went from 1039.200000 to 1168.030000 in 0 days
+
+Contributors:
+ @katierocci
+ @slevis-lmwg
+
+Notes of particular relevance for developers:
+---------------------------------------------
+
+Changes to tests or testing:
+ See note in memory changes above.
+
+Testing summary:
+----------------
+
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+Changes answers relative to baseline: Yes
+
+ Summarize any changes to answers, i.e.,
+ - what code configurations: MIMICS only
+ - what platforms/compilers: all
+ - nature of change: larger than roundoff, reduces N limitation in MIMICS simulations
+
+Other details
+-------------
+Pull Requests that document the changes (include PR ids):
+ https://github.com/ESCOMP/ctsm/pull/4014
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.042
+Originator(s): slevis (Samuel Levis,UCAR/TSS,303-665-1310)
+Date: Fri May 22 04:07:30 PM MDT 2026
+One-line Summary: Get hillslope_fsat_equals_zero .true. for use_hillslope
+
+Purpose and description of changes
+----------------------------------
+
+ hillslope_fsat_equals_zero was intended to be .true. for use_hillslope = .true. but was coming back false:
+ - First because of the lack of this line in CLMBuildNamelist.pm:
+ $nl_flags->{'use_hillslope'} = $nl->get_value('use_hillslope');
+ - And since ctsm5.4.040 due to the placement of said line in sub setup_logic_params_file, which is called after sub setup_logic_hillslope
+
+ Here I'm moving that line into sub setup_logic_hillslope, which fixes the problem without breaking anything else.
+
+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.]
+
+[x] clm6_0 hillslope hydrology
+
+[ ] clm5_0
+
+[ ] ctsm5_0-nwp
+
+[ ] clm4_5
+
+
+Bugs fixed
+----------
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ Resolves #4030 Bug: hillslope_fsat_equals_zero is .false. when use_hillslope = .true.
+
+Notes of particular relevance for users
+---------------------------------------
+Changes made to namelist defaults (e.g., changed parameter values):
+ Now get the correct hillslope_fsat_equals_zero for use_hillslope = .true..
+
+Testing summary:
+----------------
+
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - OK (2 expected failures)
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+Changes answers relative to baseline: Yes
+
+ Summarize any changes to answers, i.e.,
+ - what code configurations: use_hillslope = .true.
+ - what platforms/compilers: all
+ - nature of change: larger than roundoff
+
+ No simulations have been run with the bug-fix, yet.
+
+Other details
+-------------
+Pull Requests that document the changes (include PR ids):
+ https://github.com/ESCOMP/ctsm/pull/4046
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.041
+Originator(s): samrabin (Sam Rabin, UCAR/TSS)
+Date: Thu May 21 14:33:36 MDT 2026
+One-line Summary: Merge b4b-dev 2026-05-21
+
+Purpose and description of changes
+----------------------------------
+
+Regular biweekly merge of b4b-dev to master. Includes the following PRs:
+- [ESCOMP/CTSM Pull Request #3199: Update documentation for generating fsurdat/landuse files by slevis-lmwg](https://github.com/ESCOMP/CTSM/pull/3199)
+- [ESCOMP/CTSM Pull Request #4007: Improve ctsm_pylib docs by samsrabin](https://github.com/ESCOMP/CTSM/pull/4007)
+- [ESCOMP/CTSM Pull Request #3999: Revision of Section 1.5.6 Spinning up the Satellite Phenology Model in user's guide for CLM6 by olyson](https://github.com/ESCOMP/CTSM/pull/3999)
+- [ESCOMP/CTSM Pull Request #3947: Technote updates for Hillslope Hydrology, biomass heat storage, and Methane model by swensosc](https://github.com/ESCOMP/CTSM/pull/3947)
+- [ESCOMP/CTSM Pull Request #3909: updated BVOC documentation by lkemmons](https://github.com/ESCOMP/CTSM/pull/3909)
+- [ESCOMP/CTSM Pull Request #4020: CN allocation tech notes improvements by huiqi-wang](https://github.com/ESCOMP/CTSM/pull/4020)
+- [ESCOMP/CTSM Pull Request #4033: Remove table in CN Pools and link to table in CN Allocation by slevis-lmwg](https://github.com/ESCOMP/CTSM/pull/4033)
+- [ESCOMP/CTSM Pull Request #4036: User's Guide: Delete "Building the CLM tools*" sections. by samsrabin](https://github.com/ESCOMP/CTSM/pull/4036)
+- [ESCOMP/CTSM Pull Request #3223: Fix broken documentation links by adrifoster](https://github.com/ESCOMP/CTSM/pull/3223)
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description):
+- [ESCOMP/CTSM Issue #1718: User's Guide: How to use the new mksurfdata_esmf tool](https://github.com/ESCOMP/CTSM/issues/1718)
+- [ESCOMP/CTSM Issue #3478: Update and delete outdated docs for creating input data](https://github.com/ESCOMP/CTSM/issues/3478)
+- [ESCOMP/CTSM Issue #3075: Improve ctsm_pylib documentation](https://github.com/ESCOMP/CTSM/issues/3075)
+- [ESCOMP/CTSM Issue #3976: User's Guide update: Section 1.5.6 Sp spin-ups](https://github.com/ESCOMP/CTSM/issues/3976)
+- [ESCOMP/CTSM Issue #3735: Document the biomass heat storage parameterization in the technical note](https://github.com/ESCOMP/CTSM/issues/3735)
+- [ESCOMP/CTSM Issue #3872: Review 2.26. Methane Model](https://github.com/ESCOMP/CTSM/issues/3872)
+- [ESCOMP/CTSM Issue #3876: Review 2.30. Biogenic Volatile Organic Compounds (BVOCs)](https://github.com/ESCOMP/CTSM/issues/3876)
+- [ESCOMP/CTSM Issue #3866: Review 2.20. C and N Allocation; and make updates](https://github.com/ESCOMP/CTSM/issues/3866)
+- [ESCOMP/CTSM Issue #3863: Review 2.17. CN Pools; and update](https://github.com/ESCOMP/CTSM/issues/3863)
+- [ESCOMP/CTSM Issue #2767: Broken external links in Tech Note and User's Guide](https://github.com/ESCOMP/CTSM/issues/2767)
+
+Notes of particular relevance for users
+---------------------------------------
+
+Changes to documentation: Lots. See lists of PRs and issues above.
+
+Testing summary:
+----------------
+
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+Other details
+-------------
+
+Pull Requests that document the changes (include PR ids):
+- [ESCOMP/CTSM Pull Request #4040: ctsm5.4.041: b4b-dev merge 2026-05-21 by samsrabin](https://github.com/ESCOMP/CTSM/pull/4040)
+- See also list of PRs in "Purpose and description of changes" above.
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.040
+Originator(s): slevis (Samuel Levis,UCAR/TSS,303-665-1310)
+Date: Wed May 20 04:13:57 PM MDT 2026
+One-line Summary: Paramfile updates
+
+Purpose and description of changes
+----------------------------------
+
+ Updating the clm6 paramfiles.
+
+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.]
+
+[X] clm6_0
+
+[ ] clm5_0
+
+[ ] ctsm5_0-nwp
+
+[ ] clm4_5
+
+
+Bugs fixed
+----------
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ Resolves #3659
+
+Notes of particular relevance for users
+---------------------------------------
+Changes to the parameter file (output of tools/param_utils/compare_paramfiles):
+ Changing two paramfiles and adding a new one for hillslope hydrology in namelist_defaults
+
+Contributors:
+ @wwieder @linniahawkins
+
+Testing summary:
+----------------
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - OK (2 expected failures)
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: Yes
+
+ Summarize any changes to answers, i.e.,
+ - what code configurations: clm6
+ - what platforms/compilers: all
+ - nature of change: larger than roundoff, possibly climate changing
+
+ If this tag changes climate list the run(s) done to evaluate the new
+ climate. Preferably in https://github.com/NCAR/LMWG_dev (or give details below)
+ - LMWG_dev issue number(s):
+ https://github.com/NCAR/LMWG_dev/issues/164
+ https://github.com/NCAR/LMWG_dev/issues/167
+ Not changing finidat files in the defaults at this time due to various non-standard things in these test simulations.
+
+Other details
+-------------
+Pull Requests that document the changes (include PR ids):
+ https://github.com/ESCOMP/ctsm/pull/4029
+
+===============================================================
+==============================================================
+Tag name: ctsm5.4.039
+Originator(s): mvdebolskiy (Matvey Debolskiy, University of Oslo, matvey.debolskiy@geo.uio.no)
+Date: Thu May 14 01:07:45 PM MDT 2026
+One-line Summary: Add FATES namelist option to initialize cohorts with diameter at breast height (DBH)
+
+Purpose and description of changes
+----------------------------------
+
+FATES allows for the ability to initialize seedling by density or DBH. Prior to this change,
+the user would update the `fates_recruit_init_density` parameter to use a negative value to
+initalize by DBH. This pull request removes this global switch behavior and creates a namelist
+option for the user. The FATES parameter file and behavior has been updated to include a new
+parameter for users to set the initial DBH by plant functional type.
+
+Notes of particular relevance for users
+---------------------------------------
+
+Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
+ New namelist option to control FATES:
+ use_fates_dbh_init
+
+Changes made to namelist defaults (e.g., changed parameter values):
+ Sets the default for use_fates_dbh_init to false
+
+Changes to the parameter file (output of tools/param_utils/compare_paramfiles):
+ Adds fates_recruit_init_dbh to the FATES parameter file
+
+Notes of particular relevance for developers:
+---------------------------------------------
+
+Caveats for developers (e.g., code that is duplicated that requires double maintenance):
+ - Note that this option currently is only applicable with use_fates_nocomp
+
+Changes to tests or testing:
+ Added test module FatesColdNoCompInitDbh
+
+Testing summary:
+----------------
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - OK (2 expected fails)
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests: (baseline comparison against fates-sci.1.92.4_api.45.0.0-ctsm5.4.037)
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: No
+
+Other details
+-------------
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+ fates: sci.1.92.4_api.45.0.0 -> sci.1.92.5_api.46.0.0
+
+Pull Requests that document the changes (include PR ids):
+(https://github.com/ESCOMP/ctsm/pull)
+https://github.com/ESCOMP/CTSM/pull/3910
+https://github.com/NGEET/fates/pull/1550
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.038
+Originator(s): slevis (Samuel Levis,UCAR/TSS,303-665-1310)
+Date: Thu May 7 03:29:26 PM MDT 2026
+One-line Summary: Merge b4b-dev to master
+
+Purpose and description of changes
+----------------------------------
+
+Pull requests (PRs) coming in with this b4b-dev merge to master:
+#4001 from samsrabin/fix-residual-curlies
+#3942 from wwieder/documentation_2.23
+#3958 from adrifoster/docs_photosynthetic_capacity_update
+#3990 from samsrabin/enforce-docs-style
+#3981 from samsrabin/docs-docs-vscode-setup
+#3982 from samsrabin/docs-docs-embedding
+#3929 from olyson/docs-I3886-1.7-Troubleshooting
+#3967 from wwieder/documentation_2.19
+#3994 from samsrabin/doc-builder-improve-verbosity-filter
+#3974 from samsrabin/docs-docs-20260427
+#3930 from slevis-lmwg/upd_sec_2.17.2
+#3971 from wwieder/Sturm
+#3816 from slevis-lmwg/readmes_to_md
+#3986 from samsrabin/update-pr-template-20260501
+#3960 from linniahawkins/edit-docs
+#3916 from olyson/docs-I3849-2-3-Surface-Albedos
+#3913 from olyson/docs-I3862-2-16-Urban-Model
+#3972 from samsrabin/docs-pr-preview-tool
+
+Bugs fixed
+----------
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ Resolves long list of documentation issues that appear directly in the above PRs.
+
+Notes of particular relevance for users
+---------------------------------------
+Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
+ Possibly as pertains to the documentation.
+
+Changes to documentation:
+ All the PRs relate to documentation updates.
+
+Contributors:
+ @wwieder @adrifoster @samsrabin @olyson @linniahawkins @slevis-lmwg
+
+Notes of particular relevance for developers:
+---------------------------------------------
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: No
+
+Other details
+-------------
+Pull Requests that document the changes (include PR ids):
+ https://github.com/ESCOMP/ctsm/pull/4000
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.037
+Originator(s): Ryan Knox, Matvey Debolskiy
+Date: Mon May 4 04:51:35 PM MDT 2026
+One-line Summary: Fix for FATES year-boundary restart issue
+
+Purpose and description of changes
+----------------------------------
+
+Move clm-2-fates time passing in the fates restart routine to flag='read' condition
+
+Significant changes to scientifically-supported configurations
+--------------------------------------------------------------
+[Remove entire section if none of the boxes are checked.]
+
+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.]
+
+[ ] clm6_0
+
+[ ] clm5_0
+
+[ ] ctsm5_0-nwp
+
+[ ] clm4_5
+
+[X] fates
+
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description):
+
+List of other issues fixed:
+- [NorESMhub/NorESM Issue #790: not reproducible at year boundary](https://github.com/NorESMhub/NorESM/issues/790)
+
+
+Testing summary:
+----------------
+
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests: (give name of baseline if different from CTSM tagname, normally fates baselines are fates--)
+ derecho ----- OK
+ izumi ------- OK
+
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: Yes
+
+ Summarize any changes to answers, i.e.,
+ - what code configurations: FATES with restarts written
+ - what platforms/compilers: all
+ - nature of change (roundoff; larger than roundoff/same climate; new climate):
+
+ If bitwise differences were observed, how did you show they were no worse
+ than roundoff? Roundoff differences means one or more lines of code change results
+ only by roundoff level (because order of operation changes for example). Roundoff
+ changes to state fields usually grow to greater than roundoff as the simulation progresses.
+
+Other details
+-------------
+
+Pull Requests that document the changes (include PR ids):
+- [ESCOMP/CTSM Pull Request #3940: ctsm5.4.037: mirror: ctsm5.4.002_noresm_v6: fix for (fates) year-boundary restart issue by rgknox](https://github.com/ESCOMP/CTSM/pull/3940)
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.036
+Originator(s): slevis, rgknox (Samuel Levis,UCAR/TSS,303-665-1310; Ryan Knox,LBNL,rgknox@lbl.gov)
+Date: Mon Apr 27 03:07:00 PM MDT 2026
+One-line Summary: Complete the FATES-CLM nitrogen coupling
+
+Purpose and description of changes
+----------------------------------
+
+ Intoduce code, namelist option, and tests on the CLM side to accommodate interactive nitrogen with FATES.
+
+ The FATES side PR is https://github.com/NGEET/fates/pull/1472.
+
+ Supporting information (other than in the issue referenced below):
+ - Nutrient enabled FATES handbook: https://docs.google.com/document/d/1I35fGDfKTkn9_8Z6qXot7HZf3ICSpLONd-iFEErAh0k/edit?usp=drive_link
+ - FATES CLM N coupling: https://docs.google.com/document/d/1mpBtpCLGJpAGw6R3-nGGY92IWRU3ISvaAUKxvcDVJRw/edit?usp=drive_link
+
+Bugs fixed
+----------
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+ Resolves #3378
+
+Notes of particular relevance for users
+---------------------------------------
+Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
+ Chaged namelist variable fates_parteh_mode from integer flag to string with options "carbon_only" and "carbon_nitrogen".
+
+Changes made to namelist defaults (e.g., changed parameter values):
+ Namelist variable suplnitro previously defaulted to NONE for use_cn and to ALL for use_fates. Now it defaults to NONE in all cases except fates_parteh_mode="carbon_only".
+
+Notes of particular relevance for developers:
+---------------------------------------------
+Changes to tests or testing:
+ In build-namelist_test.pl, replaced useFATESWOsuplnitro (test in list of tests that are supposed to fail) with useFATESCwsuplnNONE and useFATESCNwuse_fates_sp.
+ Updated FatesColdPRT2 testmods to use prescribed_p paramfile instead of prescribed_np, because this test runs with interactive nitrogen.
+ Added testmods FatesColdPRT2_suplnAll (returns the PRT2 test to carbon_only) and FatesColdPRT2_synthN (runs carbon_nitrogen but uses presecribed_np paramfile).
+ Remove passing test ERP_Ld9.f45_f45_mg37.I2000Clm50FatesCruRsGs.derecho_intel.clm-FatesColdAllVars from expected fails.
+ Remove machine lawrencium from test-suites as not used and not planned to be used.
+
+Testing summary:
+----------------
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - OK (2 expected failures)
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests comapared to baseline fates-sci.1.92.4_api.45.0.0-ctsm5.4.036 (generated before merging the FATES side PR https://github.com/NGEET/fates/pull/1472):
+ derecho ----- OK
+ izumi ------- OK
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: Yes
+
+ Summarize any changes to answers, i.e.,
+ - what code configurations: Most, though not Sp and FatesSp
+ - what platforms/compilers: All
+ - nature of change: roundoff
+
+ In summary, a necessary update in order of operations in CNNDynamicsMod.F90, changes the outcome from b4b to roundoff. A post in the PR (https://github.com/ESCOMP/CTSM/pull/3409#issuecomment-4238969834) explains how I confirmed the transition from b4b to roundoff diffs.
+
+Other details
+-------------
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+ fates from sci.1.92.1_api.44.1.0 to sci.1.92.4_api.45.0.0
+
+Pull Requests that document the changes (include PR ids):
+ https://github.com/ESCOMP/ctsm/pull/3409
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.035
+Originator(s): erik (Erik Kluzek,UCAR/TSS,303-497-1326)
+Date: Sun Apr 26 09:38:17 PM MDT 2026
+One-line Summary: Merge b4b-dev to master
+
+Purpose and description of changes
+----------------------------------
+
+Update submodules, enforce irrigate to off for FATES transient cases, and several documentation updates. Including a github action that will trigger when a PR has a build failure for the documentation. It will then add a comment to the PR summarizing the error. Hopefully, this will be easier for doc editors to understand what broke in the build for their PR.
+
+When a PR has the "build docs" tests fail, it's hard to figure out why. This PR will make it so that the doc build log is posted in a PR comment after the test failure. Example samsrabin#17 (comment).
+
+Since ctsm5.3.046: patch%itype is set to -999, which produces out-of-bounds error, when running HIST with fates, since the defaults point to irrigate=.true..
+
+Though there is irrigate=.true. in use_cases, all the statements with .true. value have use_crop=.true. which can not be true when fates is on.
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+
+Fixes #3170
+Most of #3861 except #3968
+
+Notes of particular relevance for users
+---------------------------------------
+
+Changes made to namelist defaults (e.g., changed parameter values):
+ For FATES ensure that irrigate is off for transient cases
+
+Changes to documentation: Updates to the mizuRoute and dust emission chapters
+
+Contributors: @dmleung @nmizukami @samsrabin @olyson @mvdebolskiy Claude Sonnet 4.6 and Opus 4.7 1M
+
+Testing summary: regular
+----------------
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho -
+
+ python testing (if python code has changed; see instructions in python/README.md; document testing done):
+
+ derecho -
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho -----
+ izumi -------
+
+If the tag used for baseline comparisons was NOT the previous tag, note that here:
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: No bit for bit
+
+Other details
+-------------
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.): ccs_config, cime, cmeps
+ Update to the latest submodules for the time. This is beyond the versions in cesm3_0_beta08
+
+ ccs_config to ccs_config_cesm1.0.83 (includes grids for the new t233 ocean mask for MOM)
+ cime to cime6.1.176
+ cmeps to cmeps1.1.44
+
+Pull Requests that document the changes (include PR ids):
+(https://github.com/ESCOMP/ctsm/pull)
+
+#3624 -- dust emission chapter in Tech Note
+#3925 -- mizuRoute chapter in Tech Note
+#3955 -- New workflow to add comments to PR about a failure in the doc-build action
+#3938 -- Update submodules
+#3812 -- Ensure irrigate is FALSE for FATES for transient cases
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.034
+Originator(s): afoster (Adrianna Foster,UCAR/TSS,303-497-1728)
+Date: Wed Apr 22 11:02:13 AM MDT 2026
+One-line Summary: bug fix to the FATES land use driver input code
+
+Purpose and description of changes
+----------------------------------
+
+This PR includes a cherry-picked fix from NorESMhub/CTSM#209 to address swap in the
+order of rangeland and pasture in the reading of the landuse drivers
+
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description):
+Resolves FATES https://github.com/NGEET/fates/issues/1551
+
+
+Testing summary:
+----------------
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests: (give name of baseline if different from CTSM tagname, normally fates baselines are fates--)
+ derecho ----- OK
+ izumi ------- OK
+
+ Added 2 new expected fails for mizuroute NLCOMP DIFFs.
+
+
+Answer changes
+--------------
+
+Changes answers relative to baseline:
+
+Landuse tests are not B4B, otherwise B4B
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.033
+Originator(s): glemieux (Gregory Lemieux, LBNL, glemieux@lbl.gov)
+Date: Fri Apr 17 10:39:02 AM MDT 2026
+One-line Summary: Update fates tag with missing land use data check fix
+
+Purpose and description of changes
+----------------------------------
+
+This update brings in fates-side changes which allow for checking of
+fates land use data that uses either NaN or non-nan fill values. This
+also updates the fates land use data tool tag which captures the
+associated netcdf write encoding changes to ensure that the land use
+data will use non-nan values consistent with the latest default datasets.
+
+
+Bugs fixed
+----------
+List of CTSM issues fixed (include CTSM Issue # and description) [one per line]:
+Resolves #3789
+
+Notes of particular relevance for developers:
+---------------------------------------------
+NOTE: Be sure to review the steps in README.CHECKLIST.master_tags as well as the coding style in the Developers Guide
+
+Changes to tests or testing:
+- Removes the FatesColdLUH testmods from the expected failures list
+
+Contributors:
+
+Testing summary:
+----------------
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests: (give name of baseline if different from CTSM tagname, normally fates baselines are fates--)
+ derecho ----- OK
+ izumi ------- OK
+
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: B4B, except for FATES
+
+Other details
+-------------
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+ fates: sci.1.92.0_api.44.0.0 --> sci.1.92.1_api.44.1.0
+ fates/tools/landusedata: v0.1.1 --> v0.4.1
+
+Pull Requests that document the changes (include PR ids):
+(https://github.com/ESCOMP/ctsm/pull)
+
+https://github.com/ESCOMP/CTSM/pull/3926
+https://github.com/NGEET/fates/pull/1555
+https://github.com/NGEET/tools-fates-landusedata/pull/41
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.032
+Originator(s): samrabin (Sam Rabin, UCAR/TSS)
+Date: Fri Apr 10 11:19:34 MDT 2026
+One-line Summary: Simplify doc build messaging.
+
+Purpose and description of changes
+----------------------------------
+
+Updates doc-builder and related scripts to reduce noise during documentation build. Adds --verbose|-V option to print complete output.
+
+
+Testing summary:
+----------------
+
+Only documentation tests were needed. Baselines for this tag are just softlinks to ctsm5.4.031.
+
+
+Other details
+-------------
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+- doc-builder updated from v3.0.1 to v3.1.0.
+
+Pull Requests that document the changes (include PR ids):
+- [ESCOMP/CTSM Pull Request #3920: ctsm5.4.032: Simplify messaging during docs build by samsrabin](https://github.com/ESCOMP/CTSM/pull/3920)
+- [ESCOMP/CTSM Pull Request #3921: ctsm5.4.032: Simplify messaging during docs build [update Changelog/Changesum] by samsrabin](https://github.com/ESCOMP/CTSM/pull/3921)
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.031
+Originator(s): samrabin (Sam Rabin, UCAR/TSS)
+Date: Thu Apr 9 13:30:18 MDT 2026
+One-line Summary: b4b-dev merge 2026-04-09
+
+Purpose and description of changes
+----------------------------------
+
+Includes the following PRs:
+- [ESCOMP/CTSM Pull Request #3833: Fix typos and RST issues in Surface Characterization tech note by huiqi-wang](https://github.com/ESCOMP/CTSM/pull/3833)
+- [ESCOMP/CTSM Pull Request #3834: Fix grammar, equation 9.17/9.18 LaTeX, and eq. ref in Photosynthesis … by huiqi-wang](https://github.com/ESCOMP/CTSM/pull/3834)
+- [ESCOMP/CTSM Pull Request #3837: Documentation updates: New hist time handling by slevis-lmwg](https://github.com/ESCOMP/CTSM/pull/3837)
+- [ESCOMP/CTSM Pull Request #3896: Testlist review and update for aux_cime_baselines and prealpha by ekluzek](https://github.com/ESCOMP/CTSM/pull/3896)
+- [ESCOMP/CTSM Pull Request #3903: Fix allocate error message typo in mkurbanparMod by olyson](https://github.com/ESCOMP/CTSM/pull/3903)
+- [ESCOMP/CTSM Pull Request #3838: Replace cheyenne references with derecho throughout by slevis-lmwg](https://github.com/ESCOMP/CTSM/pull/3838)
+- [ESCOMP/CTSM Pull Request #3908: Update documentation documentation by samsrabin](https://github.com/ESCOMP/CTSM/pull/3908)
+
+
+Bugs fixed
+----------
+
+List of CTSM issues fixed (include CTSM Issue # and description):
+- [ESCOMP/CTSM Issue #3171: Docs needed: New history time handling](https://github.com/ESCOMP/CTSM/issues/3171)
+- [ESCOMP/CTSM Issue #3784: Review tests in aux_cime_baselines and reconcile this test list with prealpha](https://github.com/ESCOMP/CTSM/issues/3784)
+- [ESCOMP/CTSM Issue #3898: A typo in the mkurbanparMod.F90 code](https://github.com/ESCOMP/CTSM/issues/3898)
+- [ESCOMP/CTSM Issue #2223: Docs: Change Cheyenne references to Derecho](https://github.com/ESCOMP/CTSM/issues/2223)
+- [ESCOMP/CTSM Issue #3892: User's Guide: Add "Contributing to documentation" documentation](https://github.com/ESCOMP/CTSM/issues/3892)
+
+
+Notes of particular relevance for developers:
+---------------------------------------------
+
+Changes to tests or testing: Adjusts some of the prealpha and aux_cime_baseline tests.
+
+
+Testing summary:
+----------------
+
+ [PASS means all tests PASS; OK means tests PASS other than expected fails.]
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+
+Other details
+-------------
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+- doc-builder updated from v2.2.6 to v3.0.1
+
+Pull Requests that document the changes (include PR ids):
+- [ESCOMP/CTSM Pull Request #3917: Merge b4b-dev to master 2026-04-09 by samsrabin](https://github.com/ESCOMP/CTSM/pull/3917)
+
+===============================================================
+===============================================================
+Tag name: ctsm5.4.030
+Originator(s): glemieux (Gregory Lemieux, LBNL, glemieux@lbl.gov)
+Date: Fri Apr 6 04:01:00 PM MDT 2026
+One-line Summary: Add FATES namelist option for land use transition logic
+
+Purpose and description of changes
+----------------------------------
+
+This pull request adds a new namelist option to allow the user to select
+the logic option that controls whether or not FATES kills vegetation
+during land use transitions.
+
+Notes of particular relevance for users
+---------------------------------------
+
+Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
+ Added fates_lu_transition_logic namelist variable option
+
+Testing summary:
+----------------
+
+ build-namelist tests (if CLMBuildNamelist.pm has changed):
+
+ derecho - PASS
+
+ regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):
+
+ derecho ----- OK
+ izumi ------- OK
+
+ fates tests: (give name of baseline if different from CTSM tagname, normally fates baselines are fates--)
+ derecho ----- OK
+ izumi ------- OK
+
+If the tag used for baseline comparisons was NOT the previous tag, note that here:
+ fates tested against `fates-sci.1.91.4_api.43.0.0-ctsm5.4.029`
+
+Answer changes
+--------------
+
+Changes answers relative to baseline: Yes, fates only, not including satellite phenology mode
+
+Other details
+-------------
+[Remove any lines that don't apply. Remove entire section if nothing applies.]
+
+List any git submodules updated (cime, rtm, mosart, cism, fates, etc.):
+ fates: sci.1.91.1_api.43.1.0 -> sci.1.92.0_api.44.0.0
+
+Pull Requests that document the changes (include PR ids):
+(https://github.com/ESCOMP/ctsm/pull)
+
+https://github.com/ESCOMP/CTSM/pull/3728
+https://github.com/NGEET/fates/pull/1489
+
+===============================================================
+===============================================================
Tag name: ctsm5.4.029
Originator(s): slevis (Samuel Levis,UCAR/TSS,303-665-1310)
Date: Mon Mar 30 03:25:18 PM MDT 2026
diff --git a/doc/ChangeSum b/doc/ChangeSum
index f48956d43b..1aeac2a762 100644
--- a/doc/ChangeSum
+++ b/doc/ChangeSum
@@ -1,5 +1,20 @@
Tag Who Date Summary
============================================================================================================================
+ ctsm5.4.044 erik 06/08/2026 Merge b4b-dev to master
+ ctsm5.4.043 slevis 06/03/2026 Overflow respiration bug fixes
+ ctsm5.4.042 slevis 05/22/2026 Get hillslope_fsat_equals_zero .true. for use_hillslope
+ ctsm5.4.041 samrabin 05/21/2026 Merge b4b-dev 2026-05-21
+ ctsm5.4.040 multiple 05/20/2026 Paramfile updates
+ ctsm5.4.039 multiple 05/14/2026 Add FATES namelist option to initialize cohorts with diameter at breast height (DBH)
+ ctsm5.4.038 slevis 05/07/2026 Merge b4b-dev to master
+ ctsm5.4.037 multiple 05/04/2026 Fix for FATES year-boundary restart issue
+ ctsm5.4.036 multiple 04/27/2026 Complete the FATES-CLM nitrogen coupling
+ ctsm5.4.035 erik 04/26/2026 Merge b4b-dev to master
+ ctsm5.4.034 afoster 04/22/2026 bug fix to the FATES land use driver input code
+ ctsm5.4.033 glemieux 04/17/2026 Update fates tag with missing land use data check fix
+ ctsm5.4.032 samrabin 04/10/2026 Simplify doc build messaging.
+ ctsm5.4.031 samrabin 04/09/2026 b4b-dev merge 2026-04-09
+ ctsm5.4.030 glemieux 04/03/2026 Add FATES namelist option for land use transition logic
ctsm5.4.029 slevis 03/30/2026 Merge b4b-dev to master
ctsm5.4.028 erik 03/26/2026 Update to cmeps version with roundoff changes when running with CISM
ctsm5.4.027 erik 03/24/2026 Some final namelist default changes needed
diff --git a/doc/IMPORTANT_NOTES.md b/doc/IMPORTANT_NOTES.md
index cf4125290a..7006ada85d 100644
--- a/doc/IMPORTANT_NOTES.md
+++ b/doc/IMPORTANT_NOTES.md
@@ -1,14 +1,13 @@
# Important Notes on Experimental Features of CTSM
+---
-Namelist items that are not regularly tested or used. Some aren't even implemented.
+## Namelist items not regularly tested or used (some aren't even implemented)
- See
+See '../bld/namelist_files/namelist_definition_ctsm.xml' -- for definitions of all namelist variables
- '../bld/namelist_files/namelist_definition_ctsm.xml' -- for definitions of all namelist variables
+### CTSM experimental namelist items
-## CTSM experimental namelist items
-
- The following are tested but not on by default (for any physics)
+The following are tested but not on by default (for any physics):
- all_active
- allow_invalid_gdd20_season_inputs
@@ -16,7 +15,7 @@ Namelist items that are not regularly tested or used. Some aren't even implement
- use_nvmovement
- use_soil_moisture_streams
- The following are NOT currently tested nor turned on by default:
+The following are NOT currently tested nor turned on by default:
- allowlakeprod
- allow_invalid_swindow_inputs
@@ -54,15 +53,14 @@ Namelist items that are not regularly tested or used. Some aren't even implement
- use_vichydro (deprecated)
- vcmax_opt = 4
-## FATES experimental namelist items
+### FATES experimental namelist items
- FATES is a relatively new subcomponent of CTSM
- Almost all FATES options include "fates" in the name
+FATES is a relatively new subcomponent of CTSM. Almost all FATES options include "fates" in the name.
- The following are tested, but not turned on by default:
+The following are tested, but not turned on by default:
- fates_seeddisp_cadence > 0
- - fates_parteh_mode > 1
+ - fates_parteh_mode == carbon_nitrogen
- use_fates_planthydro
- use_fates_managed_fire
- use_fates_tree_damage
@@ -71,7 +69,7 @@ Namelist items that are not regularly tested or used. Some aren't even implement
- use_fates_potentialveg
- use_fates_ed_st3
- The following are NOT currently tested nor turned on by default:
+The following are NOT currently tested nor turned on by default:
- fates_spitfire_mode == 2
- fates_spitfire_mode == 5
@@ -84,4 +82,3 @@ Namelist items that are not regularly tested or used. Some aren't even implement
- use_fates_potentialveg
- use_fates_daylength_factor == FALSE
- fates_history_dimlevel == 0
-
diff --git a/doc/README.CHECKLIST.master_tags.md b/doc/README.CHECKLIST.master_tags.md
index 4dd21356cc..ecd5b4763d 100644
--- a/doc/README.CHECKLIST.master_tags.md
+++ b/doc/README.CHECKLIST.master_tags.md
@@ -27,7 +27,6 @@ https://github.com/ESCOMP/ctsm/wiki/CTSM-development-workflow
3c -- make sure you understand any changes to the baselines -- to document in ChangeLog
3d -- Check the log file for run_sys_tests (`../run_sys_test.log`, to make sure that
submodules are correct (see 2c above)
- 3e -- When Izumi’s baseline is ready, manually open read permissions to all.
> [!TIP]
> Always test on your fork with a feature-branch so that we can change tag order if needed. Put
> baselines in the next tag name, as we can easily change afterwards if needed.
@@ -52,7 +51,7 @@ https://github.com/ESCOMP/ctsm/wiki/CTSM-development-workflow
5e -- Push all the changes on your local branches to the branch on your fork
- [ ] 6. Submit a pull request (PR) for the changes
- Have someone review it if you are able. At minimum review it youself. The PR mechanism
+ Have someone review it if you are able. At minimum review it yourself. The PR mechanism
on git is an excellent way to code review code for both yourself and others. Also make
sure all your changes are correct, changes that shouldn't have gone in don't, and all new
files are added in.
diff --git a/doc/WhatsNewInCTSM5.3.md b/doc/WhatsNewInCTSM5.3.md
index 4717deac30..d8fabaa3e3 100644
--- a/doc/WhatsNewInCTSM5.3.md
+++ b/doc/WhatsNewInCTSM5.3.md
@@ -18,7 +18,7 @@ Changes to defaults for `clm6_0` physics:
* Urban explicit A/C turned on (links above).
* Snow thermal conductivity method is now `Sturm1997`. ([PR \#2348](https://github.com/ESCOMP/CTSM/pull/2348); see also [discussion \#1960](https://github.com/ESCOMP/CTSM/discussions/1960))
-* New initial conditions files for f09 ("1-degree" 1850, 2000), f19 (“2-degree” 1850), and ne30 (1850, 1979, 2000) resolutions.
+* New initial conditions files for f09 ("1-degree" 1850, 2000), f19 ("2-degree" 1850), and ne30 (1850, 1979, 2000) resolutions.
* New crop calendars. ([PR \#2664](https://github.com/ESCOMP/CTSM/pull/2664); informed by [Rabin et al., 2023](https://gmd.copernicus.org/articles/16/7253/2023/gmd-16-7253-2023.html))
* Dust emissions method is now `Leung_2023` (links above).
* Excess ice is turned on. ([PR \#1787](https://github.com/ESCOMP/CTSM/pull/1787))
@@ -35,8 +35,8 @@ Changes for all physics versions:
### Heads up
-* Small glacier changes mean that you can’t use a 5.3 surface dataset with pre-5.3 code and vice versa anymore. (Merged with [PR \#2500](https://github.com/ESCOMP/CTSM/pull/2500))
-* Updates the definition of history variable “time” from *end* of `time_bounds` to *middle* of `time_bounds`. ([PR \#2838](https://github.com/ESCOMP/CTSM/pull/2838); see section below)
+* Small glacier changes mean that you can't use a 5.3 surface dataset with pre-5.3 code and vice versa anymore. (Merged with [PR \#2500](https://github.com/ESCOMP/CTSM/pull/2500))
+* Updates the definition of history variable "time" from *end* of `time_bounds` to *middle* of `time_bounds`. ([PR \#2838](https://github.com/ESCOMP/CTSM/pull/2838); see section below)
* Standardizes history variable attributes and a history dimension name. ([PR \#2052](https://github.com/ESCOMP/CTSM/pull/2052); see section below)
##
@@ -49,7 +49,7 @@ Changes for all physics versions:
Startup and hybrid runs no longer run the 0th time step, consistent with the same change in CAM. (Branch and continue runs never had this 0th time step.) This means you will not get an extraneous initial history file anymore. In some circumstances this may also affect the names of history files.
-In most cases, the history `time` variable is now defined as the middle of a history file’s `time_bounds` instead of the end, for consistency with the same change in CAM. The exception is if you specify `hist_avgflag_pertape = 'I'` for that file, in which case it will be treated as an “instantaneous” file. Instantaneous history files (a) have their `time` coordinate set to the end of the last timestep (as did all history files before this tag) and (b) do not include `time_bounds`.
+In most cases, the history `time` variable is now defined as the middle of a history file's `time_bounds` instead of the end, for consistency with the same change in CAM. The exception is if you specify `hist_avgflag_pertape = 'I'` for that file, in which case it will be treated as an "instantaneous" file. Instantaneous history files (a) have their `time` coordinate set to the end of the last timestep (as did all history files before this tag) and (b) do not include `time_bounds`.
The history dimension name `hist_interval` (of output variable `time_bounds`) is standardized to be `nbnd`. History variables `time_bounds`, `mcdate`, `mcsec`, `mdcur`, and `mscur` are standardized to include the calendar attribute.
@@ -77,7 +77,7 @@ The history dimension name `hist_interval` (of output variable `time_bounds`) is
### Changes to rpointer files
-The rpointer files are simple text files that CESM uses to keep track of how far simulations have progressed, pointing to the filename of the latest restart file for that component. There is one such file for each component, so for CTSM `I` cases that's `lnd`, `cpl`, and `atm` (and `rof` if it's active). Normally, when the user is just extending the length of simulations, there’s no need to worry about these files.
+The rpointer files are simple text files that CESM uses to keep track of how far simulations have progressed, pointing to the filename of the latest restart file for that component. There is one such file for each component, so for CTSM `I` cases that's `lnd`, `cpl`, and `atm` (and `rof` if it's active). Normally, when the user is just extending the length of simulations, there's no need to worry about these files.
However, if there was a problem when a simulation shut down, it's possible that different components will have mismatched restarts and rpointer files. In the past, this meant figuring out what restart file should be pointed to in each component rpointer file and correcting it by hand in an editor. There was only the final set of rpointer files that was kept for a case.
diff --git a/doc/WhatsNewInCTSM5.4.md b/doc/WhatsNewInCTSM5.4.md
new file mode 100755
index 0000000000..4cd4584245
--- /dev/null
+++ b/doc/WhatsNewInCTSM5.4.md
@@ -0,0 +1,151 @@
+# What's new in CTSM 5.4 (tag `ctsm5.4.002`)
+
+# Purpose and description of changes since CTSM 5.3 (tag `ctsm5.3.021`)
+
+## New features
+
+* New surface datasets from CMIP7 data including PFT and urban distributions, land use transitions, population density, and atmospheric C isotopes. These data are only available through the historical record (1850-2023), and
+ * are not available for future periods (presently known as SSP),
+ * for future periods and N deposition we continue to use CMIP6 data from CESM2.
+* Option to use CRUJRA2024 atmospheric driver data with clm6 and clm5 physics options ([PR #2956](https://github.com/ESCOMP/ctsm/pull/2956)), this is the default data-atmosphere (DATM) for clm6. This CRUJRA dataset covers 1901-2023, whereas previous GSWP3 only covers 1901-2014.
+* Capability to run single-point PLUMBER tower sites, similar to the NEON tower capability ([issue #1487](https://github.com/ESCOMP/CTSM/issues/1487)). Initial conditions are not provided for PLUMBER sites.
+* New CLM\_CMIP\_ERA flag in env\_run.xml. Valid options are cmip7 and cmip6. Defaults to cmip7 except in compsets containing SSP for which it defaults to cmip6 because there are no future-period datasets yet available for CMIP7.
+* Automatic, more flexible use of anomaly forcings for CMIP6 ISSP cases, which also use the cmip6 CLM\_CMIP\_ERA flag: [Documentation](https://escomp.github.io/CTSM/users_guide/running-special-cases/Running-with-anomaly-forcing.html)
+
+* Unsupported script that checks for spinup equilibrium in `tools/contrib/` for spectral element grids ([PR #2991](https://github.com/ESCOMP/ctsm/pull/2991)).
+* New paramfile tools that allow users to query and modify CLM parameter files ([documentation](https://escomp.github.io/CTSM/users_guide/using-clm-tools/paramfile-tools.html))
+* Optional time-evolving \`leafcn\_target\`. More under "Additional detail" below.
+* New vertical movement scheme for soil nitrate, which is off by default (PR [#2992](https://github.com/ESCOMP/CTSM/pull/2992)).
+* Documentation improvements and new URL: https://escomp.github.io/CTSM/index.html.
+* FATES:
+ * Grazing ([sci.1.81.0\_api.37.1.0](https://github.com/NGEET/fates/releases/tag/sci.1.81.0_api.37.1.0)).
+ * Johnson and Berry 2021 electron transport model ([sci.1.85.0\_api.40.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.85.0_api.40.0.0)).
+ * Managed Fire ([sci.1.87.0\_api.41.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.87.0_api.41.0.0)).
+
+## Answer changes
+
+Changes to defaults for \`clm6\` physics:
+
+* New CMIP7 surface and landuse timeseries datasets (see in Additional Details below).
+* New namelist variables \`snow\_thermal\_cond\_glc\_method\` and \`snow\_thermal\_cond\_lake\_method\` ([PR #3072](https://github.com/ESCOMP/CTSM/pull/3072)). Snow thermal conductivity uses Jordan1991 over glaciers to reduce Greenland melt rates by default and Sturm over land and lake land units.
+* Bytnerowicz is now the default nfix\_method for clm6 (https://github.com/ESCOMP/ctsm/pull/2972) which revises the temperature function for nitrogen fixation, replacing the Houlton *et al.* function.
+* Updates to MEGAN for BVOCs (https://github.com/ESCOMP/CTSM/pull/3065 https://github.com/ESCOMP/CTSM/pull/3309). Removes dependence on soil moisture from clm6 physics.
+* New model parameter values that were calibrated to improve carbon cycle representation with CRUJRA.
+* New model parameter values that were calibrated to improve the fire model. Now using li2024 fire code.
+* New initial conditions files for f09 ("1-degree" 1850, 2000), f19 ("2-degree" 1850), and ne30 (1850, 1979, 2000\) resolutions.
+* Change default for glcmec\_downscale\_longwave to FALSE for clm6 physics as turning off the LW downscaling improves the melt and runoff biases.
+* See "Changes to FATES and the FATES parameter file" below.
+* Namelist defaults change so that
+ * use\_c13/use\_c14 are on only for HistClm60Bgc compsets with CRUJRA2024 or CAM7 forcing; examples of when use\_c13/use\_c14 are now off include SSP and single-point compsets, as well as cases using older forcings, such as CAM6, GSWP3v1, Qian, and CRUv7
+ * when use\_c13 or use\_c14 is on, turn on the corresponding time series file (responding to the CLM_CMIP_ERA flag)
+ * C13/C14 CMIP7 data is done using streams with new namelist variables (stream_*_atm_c13, stream_*_atm_c14)
+ * irrigation is on for transient cases (1850-2000, 1850-2100, but not for clm4\_5).
+
+Changes for all physics versions:
+
+* Parameters updated: Added MIMICS parameter \`mimics\_fi\` (fraction of litter inputs that bypass litter pools, directly contributing to SOM) and updated other MIMICS parameters (https://github.com/ESCOMP/CTSM/pull/2365) to remove NPP control on turnover, fix density dependent control on turnover, add litterfall fluxes that bypass litter pools and contribute directly to soil organic matter.
+* FATES parameter file updated: ([PR \#2965](https://github.com/ESCOMP/CTSM/pull/2965), [PR \#2904](https://github.com/ESCOMP/CTSM/pull/2904), [PR \#1344](https://github.com/NGEET/fates/pull/1344), [PR \#3087](https://github.com/ESCOMP/CTSM/pull/3087)). See "FATES parameter file" section below for details.
+* New surface datasets and landuse timeseries files (see "surface datasets" section below).
+* CMIP7 C13/C14 atmospheric timeseries data
+
+## Heads up
+
+* History tapes now split into two files from hX to hXi and hXa, where X is the tape number (e.g. h0i/h0a) and where "i" stands for history file containing instantaneous fields, while "a" stands for history file containing non-instantaneous fields. Details in the "history files" section below and in the PRs https://github.com/ESCOMP/ctsm/pull/2445 https://github.com/ESCOMP/MOSART/pull/117 https://github.com/ESCOMP/RTM/pull/61 and the corresponding issues.
+* Adding time to 1d weighting fields in transient simulations PR https://github.com/ESCOMP/CTSM/pull/3328
+* Regarding CMIP7 vs. CMIP6 inputs:
+ * C13/C14 isotope datasets are the new CMIP7 datasets using streams, while when CLM_CMIP_ERA==cmip6, the older cmip6 files are used
+ * We supply only CMIP7 population density with clm6 physics in non-SSP cases, because the fire model is calibrated to that; conversely, we supply only CMIP6 population density for pre-clm6 physics and for SSP cases.
+ * We supply only CESM2 nitrogen deposition (ndep), so this gets used regardless of CLM\_CMIP\_ERA setting.
+ * For DATM we supply only CMIP6 aerosols.
+ * For DATM we supply only CMIP6 CO2.
+* Issue with DOUT\_S\_SAVE\_INTERIM\_REST [https://github.com/ESCOMP/CTSM/issues/3351](https://github.com/ESCOMP/CTSM/issues/3351) was fixed.
+* As of ctsm5.3.040, the new ctsm\_pylib conda environment is incompatible with our tools from before ctsm5.3.040 and vice versa. More under "Additional detail" below.
+
+# Additional detail
+
+## Changes related to history files
+
+(Note 1: The same information in this section applies to MOSART and RTM.
+Note 2: The gist of the information in this section also appears in the [CTSM User's Guide](https://escomp.github.io/CTSM/users_guide/setting-up-and-running-a-case/customizing-the-clm-namelist.html#various-ways-to-change-history-output-averaging-flags)).
+
+Following ctsm5.3.018 "Change history time to be the middle of the time bounds" and keeping CLM history consistent with CAM history, the CTSM5.4 change intends to prevent confusion associated with the time corresponding to instantaneous history fields by putting them on separate files than non-instantaneous fields.
+
+The now separate instantaneous history files represent the exact time step when they were written and do not include a time\_bounds variable. Conversely, non-instantaneous history files represent the period of their time\_bounds variable. As a result, time data on non-instantaneous history files are now read correctly during post processing (e.g. by xarray). Special handling may still be needed for instantaneous history files, whose timestamps represent the date and time at the END of the history timestep. So, e.g., an instantaneous variable saved at the end of year 2023 will get the timestamp 2024-01-01 00:00:00.
+
+Users will now see:
+
+1\) Two history files per clm, mosart, and rtm history tape:
+ tape h0 becomes h0a and h0i
+ tape h1 becomes h1a and h1i
+ ...
+ tape hX becomes hXa and hXi
+
+2\) Two history-restart files per history restart tape:
+ rh0 becomes rh0a and rh0i
+ rh1 becomes rh1a and rh1i
+ ...
+ rhX becomes rhXa and rhXi
+
+The CLM handles empty history (and corresponding history-restart) files by not generating them, while rtm and mosart give an error. Instead of refactoring rtm and mosart to behave like the clm (considered out of scope), we have introduced one active instantaneous field in mosart and one in rtm to bypass the "empty file" error.
+
+## New surface datasets and landuse timeseries files (https://github.com/ESCOMP/CTSM/pull/3482)
+
+* Transient landuse timeseries files going back to 1700 made for f09 and 360x720 grids.
+* New resolutions now supported: ne3np4.pg3, mpasa30, ne0np4.NATL.ne30x8 (https://github.com/ESCOMP/CTSM/pull/3482)
+* Updates to input datasets (also referred to as raw datasets):
+ * PFT/LAI/soil-color raw datasets; now from the CMIP7 timeseries that ends in 2023 (Issue [\#2851](https://github.com/ESCOMP/CTSM/issues/2851)).
+ * Two fire datasets: crop fire peak month and population density (https://github.com/ESCOMP/CTSM/issues/2701 https://github.com/ESCOMP/CTSM/issues/3302).
+ * Transient (historical) urban datasets are now based on CMIP7 urban data, partitioned into TBD, HD, and MD classes in proportion to GaoOneill present day classification.
+
+## Changes to FATES and the FATES parameter file
+
+* See [HLM-FATES compatibility table](https://fates-users-guide.readthedocs.io/en/latest/user/release-tags-compat-table.html) in the FATES user's guide for all FATES tags associated with CTSM tag updates
+* FATES answer changing updates
+ * The default hydro solver is updated to 2D Picard from 1D Taylor ([ctsm5.3.027](https://github.com/ESCOMP/CTSM/releases/tag/ctsm5.3.027))
+ * Simplified leaf sun-shade fraction for two-stream radiation ([sci.1.83.0\_api.39.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.83.0_api.39.0.0))
+ * Default maximum canopy layer updated from 2 to 3 ([sci.1.87.1\_api.41.0.0](https://github.com/NGEET/fates/releases/tag/sci.1.87.1_api.41.0.0))
+ * Various bug fixes (see compatibility table)
+* FATES Parameter File Updates
+ * ctsm5.3.025 (API 37\)
+ * Adds pft-dependent btran model switches
+ * Adds parameters for land use grazing
+ * Updates the FATES z0mr turbulence parameters for consistency with CLM
+ * ctsm5.3.027 (API 38\)
+ * Migrates a number of global parameter file variables to the namelist
+ * Adds \`fates\_leaf\_fnps\` parameter for the electron transport model
+ * \`fates\_leaf\_theta\_cj\_c3\` and \`fates\_leaf\_theta\_cj\_c4\` depricated
+ * ctsm5.3.045 (API 40\)
+ * Changes to the default competitive exclusion parameter from probabilistic to rank-ordered sorting of cohorts by default
+ * Sets the logging default to clear cut
+ * Refactors the pft-specific phenology habit selection into a single parameter
+ * ctsm5.3.070 (API 41\)
+ * Add parameters for the managed fire feature addition
+ * Corrects the fates landuse crop pft to c3 cool grass
+
+## New ctsm\_pylib conda environment
+
+If you have a ctsm\_pylib conda environment installed from before ctsm5.3.040, you may want to keep that under a different name. We suggest the following command for doing this in a local copy of ctsm5.3.040 or later:
+
+```shell
+./py_env_create -r ctsm_pylib_old
+```
+
+This first renames your existing ctsm\_pylib to ctsm\_pylib\_old and then installs the Python 3.13.2 version as ctsm\_pylib. If you are unsure whether you already have ctsm\_pylib installed, use the same command regardless, as it will skip the renaming step if necessary.
+
+Information about additional py\_env\_create options — including how to install a fresh copy of the old conda environment — is available as follows:
+
+```shell
+./py_env_create --help
+```
+
+## Potentially time-evolving \`leafcn\_target\` replaces time-constant \`leafcn\`
+
+The former is calculated as a function of the latter and can be time-evolving depending on new paramfile parameter \`leafcn\_co2\_slope\` https://github.com/ESCOMP/ctsm/pull/1654. The time-evolving effect defaults to off with \`leafcn\_co2\_slope\` \= 0 on the parameter file.
+
+# Simulations supporting this release by providing initial conditions
+
+* f19 \`Clm60BgcCruJra\` 16pft: https://github.com/NCAR/LMWG_dev/issues/125
+* f09 with \`Clm60BgcCropCruJra\`: https://github.com/NCAR/LMWG_dev/issues/124
+* ne30 with \`Clm60BgcCropCruJra\`: https://github.com/NCAR/LMWG_dev/issues/123 (123\_HIST\_popDens)
+* ne30 SP https://github.com/NCAR/LMWG_dev/issues/126
+* f09 SP https://github.com/NCAR/LMWG_dev/issues/127
diff --git a/doc/build_docs b/doc/build_docs
index 89434622a6..99415e15c4 100755
--- a/doc/build_docs
+++ b/doc/build_docs
@@ -6,10 +6,24 @@ if [ ! -f doc-builder/build_docs ]; then
${script_dir}/../bin/git-fleximod update doc-builder
fi
-echo "Running: make fetch-images"
-make fetch-images
+# Check if --verbose or -V was passed
+verbose=false
+for arg in "$@"; do
+ case "$arg" in
+ --verbose|-V) verbose=true; break ;;
+ esac
+done
-echo "Running: ./doc-builder/build_docs $@"
+if $verbose; then
+ echo "Running: make fetch-images"
+ make fetch-images
+else
+ make fetch-images > /dev/null 2>&1
+fi
+
+if $verbose; then
+ echo "Running: ./doc-builder/build_docs $@"
+fi
./doc-builder/build_docs "$@"
-exit 0
\ No newline at end of file
+exit 0
diff --git a/doc/build_docs_to_publish b/doc/build_docs_to_publish
index 6804311c64..bc4075c964 100755
--- a/doc/build_docs_to_publish
+++ b/doc/build_docs_to_publish
@@ -6,13 +6,27 @@ if [ ! -f doc-builder/build_docs_to_publish ]; then
"${script_dir}"/../bin/git-fleximod update doc-builder
fi
+# Check if --verbose or -V was passed
+verbose=false
+for arg in "$@"; do
+ case "$arg" in
+ --verbose|-V) verbose=true; break ;;
+ esac
+done
+
cd "${script_dir}"
-echo "Running: make fetch-images"
-make fetch-images
+if $verbose; then
+ echo "Running: make fetch-images"
+ make fetch-images
+else
+ make fetch-images > /dev/null 2>&1
+fi
-echo "Running: ./doc-builder/build_docs_to_publish $@"
-pwd
+if $verbose; then
+ echo "Running: ./doc-builder/build_docs_to_publish $@"
+ pwd
+fi
./doc-builder/build_docs_to_publish "$@"
-exit 0
\ No newline at end of file
+exit 0
diff --git a/doc/ctsm-docs_container/Dockerfile b/doc/ctsm-docs_container/Dockerfile
index 3a24e1d4a4..c38a384f80 100644
--- a/doc/ctsm-docs_container/Dockerfile
+++ b/doc/ctsm-docs_container/Dockerfile
@@ -29,4 +29,4 @@ CMD ["/bin/bash", "-l"]
LABEL org.opencontainers.image.title="Container for building CTSM documentation"
LABEL org.opencontainers.image.source=https://github.com/ESCOMP/CTSM
-LABEL org.opencontainers.image.version="v1.0.2e"
+LABEL org.opencontainers.image.version="v2.0.1a"
diff --git a/doc/ctsm-docs_container/README.md b/doc/ctsm-docs_container/README.md
index bff10aada2..2c8110275d 100644
--- a/doc/ctsm-docs_container/README.md
+++ b/doc/ctsm-docs_container/README.md
@@ -33,21 +33,22 @@ Here's where you need to specify the version number in the Dockerfile:
```docker
LABEL org.opencontainers.image.version="vX.Y.Z"
```
-The string there can technically be anything as long as (a) it starts with a lowercase `v` and (b) it hasn't yet been used on a published version of the container.
+The string there can technically be anything as long as (a) it starts with a lowercase `v` and (b) it hasn't yet been used on a published version of the container. You may need to "bump" the version string in order for various tests to pass; if so, just add a lowercase letter at the end.
You can check the results of the automatic publication on the [container's GitHub page](https://github.com/ESCOMP/CTSM/pkgs/container/ctsm%2Fctsm-docs).
### Updating doc-builder
After the new version of the container is published, you will probably want to tell [doc-builder](https://github.com/ESMCI/doc-builder) to use the new one. Open a PR where you change the tag (the part after the colon) in the definition of `DEFAULT_IMAGE` in `doc_builder/build_commands.py`. Remember, **use the version number**, not "latest".
-## Publishing manually (NOT recommended)
+## Publishing manually
-It's vastly preferable to let GitHub build and publish the new repo using the `docker-image-build-publish.yml` workflow as described above. However, if you need to publish manually for some reason, here's how.
+It's vastly preferable to let GitHub build and publish the new repo using the `docker-image-build-publish.yml` workflow as described above. However, you may need to publish manually if, for instance, you introduce a change that breaks `doc-builder`. You could work around that by first merging a CTSM `master` PR that updates the container, then updating `doc-builder` to use it, then updating CTSM to use the new `doc-builder`. That's not always practical, though, so here's how to publish the container manually.
### Building the multi-architecture version
When publishing our container, we need to make sure it can run on either arm64 or amd64 processor architecture. This requires a special build process:
```shell
+podman manifest rm ctsm-docs-manifest 2>/dev/null
podman manifest create ctsm-docs-manifest
podman build --platform linux/amd64,linux/arm64 --manifest ctsm-docs-manifest .
```
@@ -66,16 +67,17 @@ export HISTCONTROL=ignoreboth
```
### Tagging
-You'll next need to tag the image. Lots of container instructions tell you to use the `latest` tag, and Podman may actually add that for you. However, `latest` can lead to support headaches as users think they have the right version but actually don't. Instead, you'll make a new version number incremented from the [previous one](https://github.com/ESCOMP/CTSM/pkgs/container/ctsm%2Fctsm-docs/versions), in the `vX.Y.Z` format.
+You'll next need to tag the image. Lots of container instructions tell you to use the `latest` tag, and Podman may actually add that for you. However, using `latest` in `doc-builder` can lead to support headaches as users think they have the right version but actually don't. So in addition to `latest`, you'll make a new version number incremented from the [previous one](https://github.com/ESCOMP/CTSM/pkgs/container/ctsm%2Fctsm-docs/versions), in the `vX.Y.Z` format.
-Copy the relevant image ID (see `podman images` instructions above) and tag it with your version number like so:
+Tag the manifest with your version number like so:
```shell
-podman tag 6464f26339bc ghcr.io/escomp/ctsm/ctsm-docs:vX.Y.Z
+podman tag ctsm-docs-manifest ghcr.io/escomp/ctsm/ctsm-docs:v2.0.1
```
Push to the repo:
```shell
podman manifest push --all ctsm-docs-manifest ghcr.io/escomp/ctsm/ctsm-docs:vX.Y.Z
+podman manifest push --all ctsm-docs-manifest ghcr.io/escomp/ctsm/ctsm-docs:latest
```
Then browse to the [container's GitHub page](https://github.com/ESCOMP/CTSM/pkgs/container/ctsm%2Fctsm-docs) to make sure this all worked and the image is public.
diff --git a/doc/ctsm-docs_container/requirements.txt b/doc/ctsm-docs_container/requirements.txt
index 178f356b13..19872cb9c0 100644
--- a/doc/ctsm-docs_container/requirements.txt
+++ b/doc/ctsm-docs_container/requirements.txt
@@ -2,5 +2,5 @@
rst2pdf == 0.103.1
sphinx == 8.2.3
sphinxcontrib_programoutput == 0.18
-sphinx-mdinclude == 0.6.2
+myst-parser == 5.0.0
sphinx_rtd_theme == 3.0.2
diff --git a/doc/doc-builder b/doc/doc-builder
index 3ab6d06971..15e171dfcf 160000
--- a/doc/doc-builder
+++ b/doc/doc-builder
@@ -1 +1 @@
-Subproject commit 3ab6d06971e508f2886f0079db37156ab93c2b07
+Subproject commit 15e171dfcf77ca2bd85415a99a50ad3994c608c4
diff --git a/doc/source/lilac/obtaining-building-and-running/notes-on-running-ctsm.rst b/doc/source/lilac/obtaining-building-and-running/notes-on-running-ctsm.rst
index 1e3d36cdf7..6689b37161 100644
--- a/doc/source/lilac/obtaining-building-and-running/notes-on-running-ctsm.rst
+++ b/doc/source/lilac/obtaining-building-and-running/notes-on-running-ctsm.rst
@@ -11,16 +11,16 @@
Environment variables that may need to be set at runtime
========================================================
-With the MPT MPI library (which is the default MPI library on NCAR's cheyenne machine), it is important to set the environment variable ``MPI_TYPE_DEPTH`` to 16 when running CTSM (this setting is required by the Parallel IO library). Typically you should set this variable in your job submission script, using either:
+Currently none. This is only a placeholder. Typically you should set this variable in your job submission script, using either:
.. code-block:: Bash
- export MPI_TYPE_DEPTH=16
+ export =
or:
.. code-block:: Tcsh
- setenv MPI_TYPE_DEPTH 16
+ setenv
prior to running the model.
diff --git a/doc/source/lilac/obtaining-building-and-running/obtaining-and-building-ctsm.rst b/doc/source/lilac/obtaining-building-and-running/obtaining-and-building-ctsm.rst
index fcd8235b62..8f0261b0ed 100644
--- a/doc/source/lilac/obtaining-building-and-running/obtaining-and-building-ctsm.rst
+++ b/doc/source/lilac/obtaining-building-and-running/obtaining-and-building-ctsm.rst
@@ -127,7 +127,7 @@ if you are using a machine that has been ported to CIME_; the second works if yo
using a machine that has *not* been ported to CIME_. Both workflows are described
below. If you are using a machine that has not been ported to CIME, it is possible to do a
complete CIME port and then use the first workflow (by following the `CIME porting guide
-`_), but
+`_), but
unless you need to do so for other reasons (such as running CESM, or running CTSM in a
land-only configuration forced by a data atmosphere, using the CIME_ scripting
infrastructure), it is generally simpler to use the second workflow below: A full CIME
diff --git a/doc/source/lilac/obtaining-building-and-running/setting-ctsm-runtime-options.rst b/doc/source/lilac/obtaining-building-and-running/setting-ctsm-runtime-options.rst
index acb1cad9be..6391352bad 100644
--- a/doc/source/lilac/obtaining-building-and-running/setting-ctsm-runtime-options.rst
+++ b/doc/source/lilac/obtaining-building-and-running/setting-ctsm-runtime-options.rst
@@ -105,8 +105,7 @@ in this file.
The first set of options in this file specifies key file names:
- ``lnd_domain_file`` must be specified. This file specifies CTSM's grid and land
- mask. The general process for creating this file is described in section
- :numref:`creating-domain-files`.
+ mask.
- ``fsurdat`` also must be specified. This file specifies a variety of spatially-varying
properties. This file is grid-specific, but can be created from grid-independent files
diff --git a/doc/source/lilac/specific-atm-models/wrf-tools.rst b/doc/source/lilac/specific-atm-models/wrf-tools.rst
index 1222a16f10..ab9ef318b2 100644
--- a/doc/source/lilac/specific-atm-models/wrf-tools.rst
+++ b/doc/source/lilac/specific-atm-models/wrf-tools.rst
@@ -16,61 +16,21 @@ Before this step, make sure you have successfully created geo_em* files for
your specific WRF domain using WPS. Instructions on how to run ``geogrid.exe``
is described in here.
-1. Create SCRIP grid file from WRF ``geo_em*`` files, using the following ncl
- script::
+1. Create ESMF mesh file from WRF ``geo_em*`` files, using the make_mesh tool. Details in section :numref:`how-to-make-mesh`.
- ncl create_scrip_file.ncl
+2. Create surface datasets in ``tools/mksurfdata_esmf``. Details in section :numref:`creating-surface-datasets`.
- This creates two files that are complements of each other only in the mask field
-
-2. Create mapping files by using ``mkmapdata`` code under
- ``CTSM/tools/mkmapdata/``.
-
- Using environment variables set the following environment varibales needed
- by ``mkunitymap.ncl`` code::
-
- setenv GRIDFILE1 wrf2clm_ocean_noneg.nc
- setenv GRIDFILE2 wrf2clm_land_noneg.nc
- setenv MAPFILE wrf2clm_mapping_noneg.nc
- setenv PRINT TRUE
-
- ncl mkunitymap.ncl
-
-.. warning::
-
- This will throw some git errors if not run in a repository.
-
-3. Create ESMF mapping files by running ``regridbatch.sh``::
-
- qsub regridbatch.sh
-
-4. In your ctsm repository directory, build::
-
- ../../../configure --macros-format Makefile --mpilib mpi-serial
-
-.. todo::
- Update the below, as domain files aren't needed with nuopc.
-
-5. Generate CTSM domain files using ``get_domain`` tool::
-
- ./gen_domain -m /glade/work/$USER/ctsm/nldas_grid/scrip/wrf2clm_mapping_noneg.nc -o wrf2clm_ocn_noneg -l wrf2clm_lnd_noneg
-
-.. todo::
- Update the below, as ``mksurfdata.pl`` no longer exists.
-
-6. Create surface datasets in ``tools/mksurfdata_esmf``::
-
- ./mksurfdata.pl -res usrspec -usr_gname "nldas" -usr_gdate "190124" -usr_mapdir "/glade/work/$USER/ctsm/nldas_grid/map" -y 2000 -exedir "/glade/u/home/$USER/src/ctsm/ctsm_surfdata/tools/mksurfdata_esmf" -no-crop
Merge WRF initial conditions into an existing CTSM initial condition file
--------------------------------------------------------------------------
-The following procedure is if you'd wish to merget WRF inital conditions from
+The following procedure is if you'd wish to merge WRF inital conditions from
``wrfinput`` file into CTSM initial condition file ::
+ module load ncl
ncl transfer_wrfinput_to_ctsm_with_snow.ncl 'finidat="the_existing_finidat_file.nc"' 'wrfinput="your_wrfinput_file"' 'merged="the_merged_finidat_file.nc"'
.. todo::
- Sam, can you please make the above ncl script available.
+ Versions of the transfer_wrfinput ncl script are available in /glade/work/slevis/git_wrf/ctsm_init/.
diff --git a/doc/source/lilac/specific-atm-models/wrf.rst b/doc/source/lilac/specific-atm-models/wrf.rst
index ad85fee777..c0d157f0b5 100644
--- a/doc/source/lilac/specific-atm-models/wrf.rst
+++ b/doc/source/lilac/specific-atm-models/wrf.rst
@@ -25,9 +25,9 @@ and :numref:`wrf-set-ctsm-runtime-options`.
This section assumes use of a machine that has been ported to CIME.
If CIME is not ported to your machine, please see `instructions on porting CIME
- `_.
+ `_.
- In this example we assume NCAR's ``Cheyenne`` HPC system in particular.
+ In this example we assume NCAR's ``derecho`` HPC system in particular.
.. _clone-WRF-CTSM-repositories:
@@ -56,9 +56,9 @@ instructions from section :numref:`obtaining-and-building-ctsm`::
./lilac/build_ctsm /PATH/TO/CTSM/BUILD --machine MACHINE --compiler COMPILER
-For example on ``Cheyenne`` and for ``Intel`` compiler::
+For example on ``derecho`` and for ``Intel`` compiler::
- ./lilac/build_ctsm ctsm_build_dir --compiler intel --machine cheyenne
+ ./lilac/build_ctsm ctsm_build_dir --compiler intel --machine derecho
.. warning::
@@ -171,7 +171,7 @@ skip to section :numref:`wrf-set-ctsm-runtime-options`.
Get WPS from this website::
- https://www2.mmm.ucar.edu/wrf/users/download/wrf-regist_or_download.php
+ https://www2.mmm.ucar.edu/wrf/users/download/get_source.html
New users must complete a registration form in this step.
@@ -352,32 +352,31 @@ the following files to your WRF run directory::
cp /glade/scratch/negins/wrf_ctsm_files/wrfinput_d01 .
cp /glade/scratch/negins/wrf_ctsm_files/wrfbdy_d01 .
-Now run WRF-CTSM. On Cheyenne this means submitting a batch job to PBS (Pro workload management system).
-Please check NCAR CISL's `instructions on running a batch job on Cheyenne.
-`__
+Now run WRF-CTSM. On derecho this means submitting a batch job to PBS (Pro workload management system).
+Please check NCAR CISL's `instructions on running a batch job on derecho.
+`__
-A simple PBS script to run WRF-CTSM on ``Cheyenne`` looks like this:
+A simple PBS script to run WRF-CTSM on ``derecho`` looks like this:
.. code-block:: Tcsh
- #!/bin/tcsh
+ #!/bin/bash
#PBS -N your_job_name
#PBS -A your_project_code
#PBS -l walltime=01:00:00
- #PBS -q queue_name
+ #PBS -q main
+ #PBS -r n
+ #PBS -S /bin/bash
#PBS -j oe
#PBS -k eod
#PBS -m abe
#PBS -M your_email_address
- #PBS -l select=2:ncpus=36:mpiprocs=36
+ #PBS -l select=1:ncpus=128:mpiprocs=128
### Run the executable
- setenv MPI_TYPE_DEPTH 16
- mpiexec_mpt ./wrf.exe
+ mpibind ./wrf.exe
-(See :numref:`runtime-environment-variables` for a description of the need to set ``MPI_TYPE_DEPTH`` on ``Cheyenne``.)
-
-To submit a batch job to the ``Cheyenne`` queues, use ``qsub`` command followed
+To submit a batch job to the ``derecho`` queues, use ``qsub`` command followed
by the PBS script name.
For example, if you named this script ``run_wrf_ctsm.csh``, submit the job like this::
diff --git a/doc/source/tech_note/BVOCs/CLM50_Tech_Note_BVOCs.rst b/doc/source/tech_note/BVOCs/CLM50_Tech_Note_BVOCs.rst
index 5d34fdce64..f4bca6df04 100644
--- a/doc/source/tech_note/BVOCs/CLM50_Tech_Note_BVOCs.rst
+++ b/doc/source/tech_note/BVOCs/CLM50_Tech_Note_BVOCs.rst
@@ -3,24 +3,63 @@
Biogenic Volatile Organic Compounds (BVOCs)
===============================================
-This chapter briefly describes the biogenic volatile organic compound (BVOC) emissions model implemented in CLM. The CLM3 version (Levis et al. 2003; Oleson et al. 2004) was based on Guenther et al. (1995). Heald et al. (2008) updated this scheme in CLM4 based on Guenther et al (2006). The current version was implemented in CLM4.5 and is based on MEGAN2.1 discussed in detail in Guenther et al. (2012). This update of MEGAN incorporates four main features: 1) expansion to 147 chemical compounds, 2) the treatment of the light-dependent fraction (LDF) for each compound, 3) inclusion of the inhibition of isoprene emission by atmospheric CO\ :sub:`2` and 4) emission factors mapped to the specific PFTs of the CLM.
+This section briefly describes the biogenic volatile organic compound (BVOC) emissions model implemented in CLM. The CLM3 version (:ref:`Levis et al. 2003 `; :ref:`Oleson et al. 2004 `) was based on :ref:`Guenther et al. (1995) `. :ref:`Heald et al. (2008) ` updated this scheme in CLM4 based on :ref:`Guenther et al (2006) `. The current version was first implemented in CLM4.5 and is currently based on MEGAN2.1 discussed in detail in :ref:`Guenther et al. (2012) `. As of CLM5, CLM-MEGAN has included these features: 1) expansion to 147 chemical compounds, 2) the treatment of the light-dependent fraction (LDF) for each compound, 3) inclusion of the inhibition of isoprene emission by atmospheric CO\ :sub:`2`, 4) emission factors mapped to the specific PFTs of the CLM. As of CLM6, CLM-MEGAN includes two new features: 5) the impact of drought, and 6) high-latitude specific isoprene emissions.
-MEGAN2.1 now describes the emissions of speciated monoterpenes, sesquiterpenes, oxygenated VOCs as well as isoprene. A flexible scheme has been implemented in the CLM to specify a subset of emissions. This allows for additional flexibility in grouping chemical compounds to form the lumped species frequently used in atmospheric chemistry. The mapping or grouping is therefore defined through a namelist parameter in drv\_flds\_in, e.g. megan\_specifier = 'ISOP = isoprene', 'BIGALK pentane + hexane + heptane + tricyclene'.
+MEGAN2.1 describes the emissions of speciated monoterpenes, sesquiterpenes, oxygenated VOCs as well as isoprene. A flexible scheme has been implemented in the CLM to specify a subset of emissions. This allows for additional flexibility in grouping chemical compounds to form the lumped species frequently used in atmospheric chemistry. The mapping or grouping is therefore defined through a namelist parameter in drv\_flds\_in, e.g. megan\_specifier = 'ISOP = isoprene', 'BIGALK pentane + hexane + heptane + tricyclene'.
Terrestrial BVOC emissions from plants to the atmosphere are expressed as a flux, :math:`F_{i}` (:math:`\mu` \ g C m\ :sup:`-2` ground area h\ :sup:`-1`), for emission of chemical compound :math:`i`
.. math::
- :label: ZEqnNum964222
+ :label: flux equation
F_{i} =\gamma _{i} \rho \sum _{j}\varepsilon _{i,j} \left(wt\right)_{j}
-where :math:`\gamma _{i}` is the emission activity factor accounting for responses to meteorological and phenological conditions, :math:`\rho` is the canopy loss and production factor also known as escape efficiency (set to 1), and :math:`\varepsilon _{i,\, j}` (:math:`\mu` \ g C m\ :sup:`-2` ground area h\ :sup:`-1`) is the emission factor at standard conditions of light, temperature, and leaf area for plant functional type *j* with fractional coverage :math:`\left(wt\right)_{j}` (Guenther et al. 2012). The emission activity factor :math:`\gamma _{i}` depends on plant functional type, temperature, LAI, leaf age, and soil moisture (Guenther et al. 2012) For isoprene only, the effect of CO\ :sub:`2` inhibition is now included as described by Heald et al. (2009). Previously, only isoprene was treated as a light-dependent emission. In MEGAN2.1, each chemical compound is assigned a LDF (ranging from 1.0 for isoprene to 0.2 for some monoterpenes, VOCs and acetone). The activity factor for the light response of emissions is therefore estimated as:
+where :math:`\gamma _{i}` is the emission activity factor accounting for responses to meteorological and phenological conditions, :math:`\rho` is the canopy loss and production factor also known as escape efficiency (set to 1), and :math:`\varepsilon _{i,\, j}` (:math:`\mu` \ g C m\ :sup:`-2` ground area h\ :sup:`-1`) is the emission factor at standard conditions of light, temperature, and leaf area for plant functional type *j* with fractional coverage :math:`\left(wt\right)_{j}` (Guenther et al. 2012). The emission activity factor :math:`\gamma _{i}` depends on plant functional type, temperature, LAI, leaf age, and soil moisture (Guenther et al. 2012) For isoprene only, the effect of CO\ :sub:`2` inhibition is now included as described by :ref:`Heald et al. (2009) `. Previously, only isoprene was treated as a light-dependent emission. In MEGAN2.1, each chemical compound is assigned a LDF (ranging from 1.0 for isoprene to 0.2 for some monoterpenes, VOCs and acetone). The activity factor for the light response of emissions is therefore estimated as:
.. math::
- :label: 28.2)
+ :label: light-dependent activity factor
\gamma _{P,\, i} =\left(1-LDF_{i} \right)+\gamma _{P\_ LDF} LDF_{i}
where the LDF activity factor (:math:`\gamma _{P\_ LDF}` ) is specified as a function of PAR as in previous versions of MEGAN.
-The values for each emission factor :math:`\epsilon _{i,\, j}` are now available for each of the plant functional types in the CLM and each chemical compound. This information is distributed through an external file, allowing for more frequent and easier updates.
+The values for each emission factor :math:`\epsilon _{i,\, j}` are now available for each of the plant functional types in the CLM and each chemical compound. This information is provided in an external file, allowing for more frequent and easier updates.
+
+The impact of drought on isoprene emissions is based on the theory proposed by :ref:`Potosnak et al. (2014) `. Specifically, isoprene emissions are expected to increase under mild to moderate drought because drought raises leaf temperature, which stimulates isoprene emissions. Under severe drought, however, isoprene emissions are inhibited because substrate supply becomes constrained. Because the effect of leaf temperature is already represented by the leaf temperature activity factor :math:`\gamma _{T}` and its influence on isoprene emissions, only the inhibitory effect of severe drought (substrate supply impact, :math:`\gamma _{sub}` ) is parameterized as:
+
+.. math::
+ :label: drought factor
+
+ \gamma _{sub} =\frac{1}{1+b_{1} e^{a1 (\beta -0.2)}}
+
+where :math:`a_1=-7.4463` and :math:`b_1=3.2552` are empirical parameters (described in :ref:`Wang et al., 2022 `).
+
+Compared with Guenther et al. (2012), updates have been made to represent isoprene emissions from high-latitude plants, specifically boreal broadleaf deciduous shrubs (BBDS) and C3 Arctic grass (C3AG), in order to account for acclimation processes. These updates are based on leaf-enclosure and in situ measurements conducted at Toolik Field Station in Alaska, USA (:ref:`Wang et al., 2024a, 2024b `).
+For BBDS, the isoprene emission factor is adjusted according to the mean temperature of the previous day as:
+
+.. math::
+ :label: boreal shrub adjustment factor
+
+ \text{For BBDS:} E_{opt} = 7.9 e^{0.217 (T_{24}-297.15)}
+
+where :math:`T_{24}` denotes the mean air temperature of the preceding day (Wang et al., 2024a).
+For C3AG, the isoprene emission factor responds over a longer timescale of 10 days (Wang et al., 2024b) and is parameterized as a function of the mean air temperature over the preceding 10 days (:math:`T_{240}`):
+
+.. math::
+ :label: C3 arctic grass adjustment factor
+
+ \text{For C3AG:} E_{opt\_g} = e^{0.12 (T_{240}-288.15)}
+
+In addition, a dynamic temperature response curve for C3AG depends on recent temperature history as:
+
+.. math::
+ :label: C3 arctic grass leaf temperature factor
+
+ \text{For C3AG:} \gamma_{T\_g} = E_{opt\_g} e^{(C_{g} (1/303.15 - 1/T_{leaf}) / R)}
+
+where :math:`T_{leaf}` denotes the leaf temperature, :math:`R` is the gas constant (ct3 in code, 0.00831 kJ/mol) and :math:`C_{g}` is the parameter controlling the isoprene temperature response of C3AG and changes varies with :math:`T_{240}` as:
+
+.. math::
+ :label: C3 arctic grass parameter
+
+ C_{g} = 95 + 9.49 e^{0.53 (288.15-T_{240})}
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 c3eeee1946..2aa64219c7 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
@@ -6,14 +6,14 @@ Carbon and Nitrogen Allocation
Introduction
-----------------
-The carbon and nitrogen allocation routines in CLM determine the fate of newly assimilated carbon, coming from the calculation of photosynthesis, and available mineral nitrogen, coming from plant uptake of mineral nitrogen in the soil or being drawn out of plant reserves. A significant change to CLM5 relative to prior versions is that allocation of carbon and nitrogen proceed independently rather than in a sequential manner.
+The carbon and nitrogen allocation routines in CLM determine the fate of newly assimilated carbon, coming from the calculation of photosynthesis, and available mineral nitrogen, coming from plant uptake of mineral nitrogen in the soil or being drawn out of plant reserves. CLM6 follows the allocation approach applied in CLM5.
Carbon Allocation for Maintenance Respiration Costs
--------------------------------------------------------
-Allocation of available carbon on each time step is prioritized, with first priority given to the demand for carbon to support maintenance respiration of live tissues (section 13.7). Second priority is to replenish the internal plant carbon pool that supports maintenance respiration during times when maintenance respiration exceeds photosynthesis (e.g. at night, during winter for perennial vegetation, or during periods of drought stress) (Sprugel et al., 1995). Third priority is to support growth of new tissues, including allocation to storage pools from which new growth will be displayed in subsequent time steps.
+Allocation of available carbon on each time step is prioritized, with first priority given to the demand for carbon to support maintenance respiration of live tissues (Chapter :numref:`rst_Plant Respiration`). Second priority is to replenish the internal plant carbon pool that supports maintenance respiration during times when maintenance respiration exceeds photosynthesis (e.g. at night, during winter for perennial vegetation, or during periods of drought stress) (:ref:`Sprugel et al. (1995) `). Third priority is to support growth of new tissues, including allocation to storage pools from which new growth will be displayed in subsequent time steps.
-The total maintenance respiration demand (:math:`CF_{mr}`, gC m\ :sup:`-2` s\ :sup:`-1`) is calculated as a function of tissue mass and nitrogen concentration, and temperature (section 13.7) The carbon supply to support this demand is composed of fluxes allocated from carbon assimilated in the current timestep (:math:`CF_{GPP,mr}`, gC m\ :sup:`-2` s\ :sup:`-1` and from a storage pool that is drawn down when total demand exceeds photosynthesis ( :math:`CF_{xs,mr}`, gC m\ :sup:`-2` s\ :sup:`-1`):
+The total maintenance respiration demand (:math:`CF_{mr}`, gC m\ :sup:`-2` s\ :sup:`-1`) is calculated as a function of tissue mass and nitrogen concentration, and temperature (Chapter :numref:`rst_Plant Respiration`). The carbon supply to support this demand is composed of fluxes allocated from carbon assimilated in the current timestep (:math:`CF_{GPP,mr}`, gC m\ :sup:`-2` s\ :sup:`-1`) and from a storage pool that is drawn down when total demand exceeds photosynthesis (:math:`CF_{xs,mr}`, gC m\ :sup:`-2` s\ :sup:`-1`):
.. math::
:label: 19.1
@@ -42,14 +42,14 @@ The storage pool that supplies carbon for maintenance respiration in excess of c
CF_{GPP,xs} =\left\{\begin{array}{l} {CF_{GPP,xs,pot} \qquad \qquad \qquad {\rm for\; }CF_{GPP,xs,pot} \le CF_{GPP} -CF_{GPP,mr} } \\ {\max (CF_{GPP} -CF_{GPP,mr} ,0)\qquad {\rm for\; }CF_{GPP,xs,pot} >CF_{GPP} -CF_{GPP,mr} } \end{array}\right.
-where :math:`\tau_{xs}` is the time constant (currently set to 30 days) controlling the rate of replenishment of :math:`CS_{xs}`.
+where :math:`\tau_{xs}` is the time constant (currently set to 30 days) controlling the rate of replenishment of :math:`CS_{xs}`. The factor :math:`86400` (s day\ :sup:`-1`) converts :math:`\tau_{xs}` from days to seconds so that the flux is consistent with the per-second units used elsewhere.
Note that these two top-priority carbon allocation fluxes (:math:`CF_{GPP,mr}` and :math:`CF_{GPP,xs}`) are not stoichiometrically associated with any nitrogen fluxes.
Carbon and Nitrogen Stoichiometry of New Growth
----------------------------------------------------
-After accounting for the carbon cost of maintenance respiration, the remaining carbon flux from photosynthesis which can be allocated to new growth (:math:`CF_{avail}`, gC m\ :sup:`-2` s\ :sup:`-1`) is
+After accounting for the carbon cost of maintenance respiration, the remaining carbon flux from photosynthesis which can be allocated to new growth (:math:`CF_{avail\_alloc}`, gC m\ :sup:`-2` s\ :sup:`-1`) is
.. math::
:label: 19.6
@@ -61,92 +61,106 @@ Potential allocation to new growth is calculated for all of the plant carbon and
.. math::
:label: 19.7
- \begin{array}{l} {a_{1} ={\rm \; ratio\; of\; new\; fine\; root\; :\; new\; leaf\; carbon\; allocation}} \\ {a_{2} ={\rm \; ratio\; of\; new\; coarse\; root\; :\; new\; stem\; carbon\; allocation}} \\ {a_{3} ={\rm \; ratio\; of\; new\; stem\; :\; new\; leaf\; carbon\; allocation}} \\ {a_{4} ={\rm \; ratio\; new\; live\; wood\; :\; new\; total\; wood\; allocation}} \\ {g_{1} ={\rm ratio\; of\; growth\; respiration\; carbon\; :\; new\; growth\; carbon.\; }} \end{array}
+ \begin{aligned}
+ a_{1} &= \text{ratio of new fine root : new leaf carbon allocation} \\
+ a_{2} &= \text{ratio of new coarse root : new stem carbon allocation} \\
+ a_{3} &= \text{ratio of new stem : new leaf carbon allocation} \\
+ a_{4} &= \text{ratio of new live wood : new total wood allocation} \\
+ g_{1} &= \text{ratio of growth respiration carbon : new growth carbon}
+ \end{aligned}
-Parameters :math:`a_{1}`, :math:`a_{2}`, and :math:`a_{4}` are defined as constants for a given PFT (Table 13.1), while :math:`g_{l }` = 0.3 (unitless) is prescribed as a constant for all PFTs, based on construction costs for a range of woody and non-woody tissues (Larcher, 1995).
+Parameters :math:`a_{1}`, :math:`a_{2}`, and :math:`a_{4}` are defined as constants for a given PFT (:numref:`Table Allocation and CN ratio parameters`). The growth respiration coefficient :math:`g_{1}` = 0.3 (unitless) is prescribed as a constant for all PFTs, based on construction costs for a range of woody and non-woody tissues (:ref:`Larcher (1995) `).
The model includes a dynamic allocation scheme for woody vegetation (parameter :math:`a_{3}` = -1, :numref:`Table Allocation and CN ratio parameters`), in which case the ratio for carbon allocation between new stem and new leaf increases with increasing net primary production (NPP), as
.. math::
:label: 19.8
- a_{3} =\frac{2.7}{1+e^{-0.004NPP_{ann} -300} } -0.4
+ a_{3} = \frac{2.7}{1 + e^{-0.004 (NPP_{ann} - 300)}} - 0.4
-where :math:`NPP_{ann}` is the annual sum of NPP from the previous year. This mechanism has the effect of increasing woody allocation in favorable growth environments (Allen et al., 2005; Vanninen and Makela, 2005) and during the phase of stand growth prior to canopy closure (Axelsson and Axelsson, 1986).
+where :math:`NPP_{ann}` is the annual sum of NPP from the previous year. This mechanism has the effect of increasing woody allocation in favorable growth environments (:ref:`Allen et al. (2005) `; :ref:`Vanninen and Makela (2005) `) and during the phase of stand growth prior to canopy closure (:ref:`Axelsson and Axelsson (1986) `).
.. _Table Allocation and CN ratio parameters:
-.. table:: Allocation and target carbon\:nitrogen ratio parameters
+.. table:: Allocation and target carbon:nitrogen ratio parameters
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Plant functional type | :math:`a_{1}` | :math:`a_{2}` | :math:`a_{3}` | :math:`a_{4}` | :math:`Target CN_{leaf}` | :math:`Target CN_{fr}` | :math:`Target CN_{lw}` | :math:`Target CN_{dw}` |
+ | Plant functional type | :math:`a_{1}` | :math:`a_{2}` | :math:`a_{3}` | :math:`a_{4}` | Target :math:`CN_{leaf}` | Target :math:`CN_{fr}` | Target :math:`CN_{lw}` | Target :math:`CN_{dw}` |
+==================================+=======================+=======================+=======================+=======================+===========================+=========================+=========================+=========================+
- | NET Temperate | 1 | 0.3 | -1 | 0.1 | 35 | 42 | 50 | 500 |
+ | NET Temperate | 1.50 | 0.3 | -1 | 0.1 | 58.00 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | NET Boreal | 1 | 0.3 | -1 | 0.1 | 40 | 42 | 50 | 500 |
+ | NET Boreal | 1.45 | 0.3 | -1 | 0.1 | 60.24 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | NDT Boreal | 1 | 0.3 | -1 | 0.1 | 25 | 42 | 50 | 500 |
+ | NDT Boreal | 0.73 | 0.3 | -1 | 0.1 | 28.92 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BET Tropical | 1 | 0.3 | -1 | 0.1 | 30 | 42 | 50 | 500 |
+ | BET Tropical | 1.47 | 0.3 | -1 | 0.1 | 36.03 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BET temperate | 1 | 0.3 | -1 | 0.1 | 30 | 42 | 50 | 500 |
+ | BET temperate | 1.63 | 0.3 | -1 | 0.1 | 34.59 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BDT tropical | 1 | 0.3 | -1 | 0.1 | 25 | 42 | 50 | 500 |
+ | BDT tropical | 1.28 | 0.3 | -1 | 0.1 | 18.63 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BDT temperate | 1 | 0.3 | -1 | 0.1 | 25 | 42 | 50 | 500 |
+ | BDT temperate | 1.39 | 0.3 | -1 | 0.1 | 21.64 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BDT boreal | 1 | 0.3 | -1 | 0.1 | 25 | 42 | 50 | 500 |
+ | BDT boreal | 0.60 | 0.3 | -1 | 0.1 | 17.09 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BES temperate | 1 | 0.3 | 0.2 | 0.5 | 30 | 42 | 50 | 500 |
+ | BES temperate | 1.50 | 0.3 | 1.40 | 0.5 | 36.42 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BDS temperate | 1 | 0.3 | 0.2 | 0.5 | 25 | 42 | 50 | 500 |
+ | BDS temperate | 1.50 | 0.3 | 0.24 | 0.5 | 23.26 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | BDS boreal | 1 | 0.3 | 0.2 | 0.1 | 25 | 42 | 50 | 500 |
- | C\ :sub:`3` arctic grass | 1 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ | BDS boreal | 1.20 | 0.3 | 0.24 | 0.1 | 21.40 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | C\ :sub:`3` grass | 2 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ | C\ :sub:`3` arctic grass | 1.20 | 0 | 0 | 0 | 20.70 | 42 | 0 | 0 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | C\ :sub:`4` grass | 2 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ | C\ :sub:`3` grass | 1.57 | 0 | 0 | 0 | 29.39 | 42 | 0 | 0 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Crop R | 2 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ | C\ :sub:`4` grass | 1.50 | 0 | 0 | 0 | 35.36 | 42 | 0 | 0 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Crop I | 2 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ | Crop R | 1 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+ +----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
+ | Crop I | 1 | 0 | 0 | 0 | 25 | 42 | 0 | 0 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
| Corn R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
| Corn I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Temp Cereal R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Temp Cereal R | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Temp Cereal I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Temp Cereal I | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Winter Cereal R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Winter Cereal R | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Winter Cereal I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Winter Cereal I | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Soybean R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Soybean R | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Soybean I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Soybean I | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Miscanthus R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Miscanthus R | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Miscanthus I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Miscanthus I | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Switchgrass R | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Switchgrass R | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
- | Switchgrass I | 2 | 0 | 0 | 1 | 25 | 42 | 50 | 500 |
+ | Switchgrass I | 2 | 0 | 0 | 1 | 20 | 42 | 50 | 500 |
+----------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+---------------------------+-------------------------+-------------------------+-------------------------+
+PFT name abbreviations: NET = Needleleaf Evergreen Tree, NDT = Needleleaf Deciduous Tree, BET = Broadleaf Evergreen Tree, BDT = Broadleaf Deciduous Tree, BES = Broadleaf Evergreen Shrub, BDS = Broadleaf Deciduous Shrub. The "R" and "I" suffixes on crop PFT names denote rainfed and irrigated management, respectively.
+
Carbon to nitrogen ratios are defined for different tissue types as follows:
.. math::
:label: 19.9
- \begin{array}{l} {CN_{leaf} = {\rm \; C:N\; for\; leaf}} \\ {CN_{fr} = {\rm \; C:N\; for\; fine\; root}} \\ {CN_{lw} = {\rm \; C:N\; for\; live\; wood\; (in\; stem\; and\; coarse\; root)}} \\ {CN_{dw} = {\rm \; C:N\; for\; dead\; wood\; (in\; stem\; and\; coarse\; root)}} \end{array}
+ \begin{aligned}
+ CN_{leaf} &= \text{C:N for leaf} \\
+ CN_{fr} &= \text{C:N for fine root} \\
+ CN_{lw} &= \text{C:N for live wood (in stem and coarse root)} \\
+ CN_{dw} &= \text{C:N for dead wood (in stem and coarse root)}
+ \end{aligned}
where all C:N parameters are defined as constants for a given PFT (:numref:`Table Allocation and CN ratio parameters`).
-Given values for the parameters in and, total carbon and nitrogen allocation to new growth ( :math:`CF_{alloc}`, gC m\ :sup:`-2` s\ :sup:`-1`, and :math:`NF_{alloc}`, gN m\ :sup:`-2` s\ :sup:`-1`, respectively) can be expressed as functions of new leaf carbon allocation (:math:`CF_{GPP,leaf}`, gC m\ :sup:`-2` s\ :sup:`-1`):
+Given values for the parameters in :eq:`19.7` and :eq:`19.9`, total carbon and nitrogen allocation to new growth (:math:`CF_{alloc}`, gC m\ :sup:`-2` s\ :sup:`-1`, and :math:`NF_{alloc}`, gN m\ :sup:`-2` s\ :sup:`-1`, respectively) can be expressed as functions of new leaf carbon allocation (:math:`CF_{GPP,leaf}`, gC m\ :sup:`-2` s\ :sup:`-1`):
.. math::
:label: 19.10
@@ -165,7 +179,7 @@ where
N_{allom} =\left\{\begin{array}{l} {\frac{1}{CN_{leaf} } +\frac{a_{1} }{CN_{fr} } +\frac{a_{3} a_{4} \left(1+a_{2} \right)}{CN_{lw} } +} \\ {\qquad \frac{a_{3} \left(1-a_{4} \right)\left(1+a_{2} \right)}{CN_{dw} } \qquad {\rm for\; woody\; PFT}} \\ {\frac{1}{CN_{leaf} } +\frac{a_{1} }{CN_{fr} } \qquad \qquad \qquad {\rm for\; non-woody\; PFT.}} \end{array}\right.
-Since the C:N stoichiometry for new growth allocation is defined, from Eq., as :math:`C_{allom}`/ :math:`N_{allom}`, the total carbon available for new growth allocation (:math:`CF_{avail\_alloc}`) can be used to calculate the total plant nitrogen demand for new growth ( :math:`NF_{plant\_demand}`, gN m\ :sup:`-2` s\ :sup:`-1`) as:
+Since the C:N stoichiometry for new growth allocation is defined, from :eq:`19.10` together with :eq:`19.11` and :eq:`19.12`, as :math:`C_{allom} / N_{allom}`, the total carbon available for new growth allocation (:math:`CF_{avail\_alloc}`) can be used to calculate the total plant nitrogen demand for new growth (:math:`NF_{plant\_demand}`, gN m\ :sup:`-2` s\ :sup:`-1`) as:
.. math::
:label: 19.13
@@ -239,7 +253,7 @@ There are two carbon pools associated with each plant tissue – one which repre
CF_{alloc,deadcroot\_ stor} =CF_{alloc,leaf\_ tot} a_{2} a_{3} \left(1-a_{4} \right)\left(1-f_{cur} \right).
-Nitrogen allocation
+Nitrogen Allocation
-----------------------------------------
The total flux of nitrogen to be allocated is given by the FUN model (Chapter :numref:`rst_FUN`). This gives a total N to be allocated within a given timestep, :math:`N_{supply}`. The total N allocated for a given tissue :math:`i` is the minimum between the supply and the demand:
@@ -247,7 +261,7 @@ The total flux of nitrogen to be allocated is given by the FUN model (Chapter :n
.. math::
:label: 19.26
- NF_{alloc,i} = min \left( NF_{demand, i}, NF_{supply, i} \right)
+ NF_{alloc,i} = \min \left( NF_{demand,i},\, NF_{supply,i} \right)
The demand for each tissue, calculated for the tissue to remain on stoichiometry during growth, is:
@@ -309,7 +323,7 @@ The demand for each tissue, calculated for the tissue to remain on stoichiometry
.. math::
:label: 19.38
- NF_{demand,deadcroot\_ stor} =\frac{CF_{alloc,leaf} a_{2} a_{3} \left(1-a_{4} \right)}{CN_{dw} } \left(1-f_{cur} \right).
+ NF_{demand,deadcroot\_ stor} =\frac{CF_{alloc,leaf\_ tot} a_{2} a_{3} \left(1-a_{4} \right)}{CN_{dw} } \left(1-f_{cur} \right).
After each pool's demand is calculated, the total plant N demand is then the sum of each individual pool :math:`i` corresponding to each tissue:
@@ -323,4 +337,4 @@ and the total supply for each tissue :math:`i` is the product of the fractional
.. math::
:label: 19.40
- NF_{alloc,i} = N_{uptake} NF_{demand,i} / NF_{demand,tot}
+ NF_{supply,i} = N_{uptake} \, \frac{NF_{demand,i}}{NF_{demand,tot}}
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 ebff41577a..7bc6d03ba6 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
@@ -23,61 +23,17 @@ In addition to the vegetation pools, CLM includes a series of decomposing carbon
Tissue Stoichiometry
-----------------------
-As of CLM5, vegetation tissues have a flexible stoichiometry, as described in :ref:`Ghimire et al. (2016) `. Each tissue has a target C\:N ratio, with the target leaf C\:N varying by plant functional type (see :numref:`Table Plant functional type (PFT) target CN parameters`), and nitrogen is allocated at each timestep in order to allow the plant to best match the target stoichiometry. Nitrogen downregulation of productivity acts by increasing the C\:N ratio of leaves when insufficient nitrogen is available to meet stoichiometric demands of leaf growth, thereby reducing the N available for photosynthesis and reducing the :math:`V_{\text{c,max25}}` and :math:`J_{\text{max25}}` terms, as described in Chapter :numref:`rst_Photosynthetic Capacity`. Details of the flexible tissue stoichiometry are described in Chapter :numref:`rst_CN Allocation`.
+As of CLM5, vegetation tissues have a flexible stoichiometry, as described in :ref:`Ghimire et al. (2016) `. Each tissue has a target C\:N ratio, with the target leaf C\:N, :math:`CN_{\text{target}}^\text{pft}`, varying by plant functional type (PFT) (:numref:`Table Allocation and CN ratio parameters`). Nitrogen is allocated at each timestep to allow the plant to best match the target stoichiometry. Nitrogen downregulation of productivity acts by increasing the actual C\:N ratio of leaves when insufficient nitrogen is available to meet stoichiometric demands of leaf growth, thereby reducing the N available for photosynthesis and reducing the :math:`V_{\text{c,max25}}` and :math:`J_{\text{max25}}` terms, as described in Chapter :numref:`rst_Photosynthetic Capacity`. Details of the flexible tissue stoichiometry are described in Chapter :numref:`rst_CN Allocation`.
-.. _Table Plant functional type (PFT) target CN parameters:
+As of CLM5.4, the target leaf C\:N may be time-evolving, :math:`CN_{\text{target}}^{\text{pft,CO2}}`, as a logarithmic function of atmospheric CO\ :sub:`2` that we denote :math:`CN_{\text{perturb}}^{\text{CO2}}`:
-.. table:: Plant functional type (PFT) target C:N parameters.
+.. math::
+ :label: time-evolv target leaf CN
- +----------------------------------+-------------------+
- | PFT | target leaf C:N |
- +==================================+===================+
- | NET Temperate | 58.00 |
- +----------------------------------+-------------------+
- | NET Boreal | 58.00 |
- +----------------------------------+-------------------+
- | NDT Boreal | 25.81 |
- +----------------------------------+-------------------+
- | BET Tropical | 29.60 |
- +----------------------------------+-------------------+
- | BET temperate | 29.60 |
- +----------------------------------+-------------------+
- | BDT tropical | 23.45 |
- +----------------------------------+-------------------+
- | BDT temperate | 23.45 |
- +----------------------------------+-------------------+
- | BDT boreal | 23.45 |
- +----------------------------------+-------------------+
- | BES temperate | 36.42 |
- +----------------------------------+-------------------+
- | BDS temperate | 23.26 |
- +----------------------------------+-------------------+
- | BDS boreal | 23.26 |
- +----------------------------------+-------------------+
- | C\ :sub:`3` arctic grass | 28.03 |
- +----------------------------------+-------------------+
- | C\ :sub:`3` grass | 28.03 |
- +----------------------------------+-------------------+
- | C\ :sub:`4` grass | 35.36 |
- +----------------------------------+-------------------+
- | Temperate Corn | 25.00 |
- +----------------------------------+-------------------+
- | Spring Wheat | 20.00 |
- +----------------------------------+-------------------+
- | Temperate Soybean | 20.00 |
- +----------------------------------+-------------------+
- | Cotton | 20.00 |
- +----------------------------------+-------------------+
- | Rice | 20.00 |
- +----------------------------------+-------------------+
- | Sugarcane | 25.00 |
- +----------------------------------+-------------------+
- | Tropical Corn | 25.00 |
- +----------------------------------+-------------------+
- | Tropical Soybean | 20.00 |
- +----------------------------------+-------------------+
- | Miscanthus | 25.00 |
- +----------------------------------+-------------------+
- | Switchgrass | 25.00 |
- +----------------------------------+-------------------+
+ \begin{split}
+ CN_{\text{perturb}}^{\text{CO2}} &= CN_{\text{slope}}^{\text{CO2}} \cdot \ln\left(\frac{\text{CO2}_{\text{atm}}}{\text{CO2}_{\text{atm}}^{\text{ref}}}\right), \text{where } CN_{\text{perturb}}^{\text{CO2}} &\ge 0 \\
+ CN_{\text{target}}^{\text{pft,CO2}} &= CN_{\text{target}}^\text{pft} + CN_{\text{perturb}}^{\text{CO2}}
+ \end{split}
+
+where :math:`CN_{\text{target}}^\text{pft}` is the time-invarying target leaf C\:N at reference CO\ :sub:`2` that depends on PFT, :math:`CN_{\text{slope}}^{\text{CO2}}` (unitless) is the slope of the function, :math:`\text{CO2}_{\text{atm}}` is atmospheric CO\ :sub:`2` in parts per million by volume (ppmv), and :math:`\text{CO2}_{\text{atm}}^{\text{ref}}` is the reference CO\ :sub:`2` (ppmv) above which atmospheric CO\ :sub:`2` begins to scale the target leaf C\:N. The optional time-evolving target leaf C\:N was documented in :ref:`Hauser et al. (2023) `, and its current default is off by setting :math:`CN_{\text{slope}}^{\text{CO2}} = 0`.
diff --git a/doc/source/tech_note/Decomposition/CLM50_Tech_Note_Decomposition.rst b/doc/source/tech_note/Decomposition/CLM50_Tech_Note_Decomposition.rst
index bf6d52ee45..bc66464cc1 100644
--- a/doc/source/tech_note/Decomposition/CLM50_Tech_Note_Decomposition.rst
+++ b/doc/source/tech_note/Decomposition/CLM50_Tech_Note_Decomposition.rst
@@ -189,7 +189,7 @@ where :math:`{\Psi}_{j}` is the soil water potential in layer *j*, :math:`{\Psi}
\psi \left(T\right)=-\frac{L_{f} \left(T-T_{f} \right)}{10^{3} T}
-An additional frozen decomposition limitation can be specified using a ‘frozen Q\ :sub:`10`' following :ref:`Koven et al. (2011) `, however the default value of this is the same as the unfrozen Q\ :sub:`10` value, and therefore the basic hypothesis is that frozen respiration is limited by liquid water availability, and can be modeled following the same approach as thawed but dry soils.
+An additional frozen decomposition limitation can be specified using a 'frozen Q\ :sub:`10`' following :ref:`Koven et al. (2011) `, however the default value of this is the same as the unfrozen Q\ :sub:`10` value, and therefore the basic hypothesis is that frozen respiration is limited by liquid water availability, and can be modeled following the same approach as thawed but dry soils.
An additional rate scalar, :math:`{r}_{oxygen}` is enabled when the CH\ :sub:`4` submodel is used (set equal to 1 for the single layer model or when the CH\ :sub:`4` submodel is disabled). This limits decomposition when there is insufficient molecular oxygen to satisfy stoichiometric demand (1 mol O\ :sub:`2` consumed per mol CO\ :sub:`2` produced) from heterotrophic decomposers, and supply from diffusion through soil layers (unsaturated and saturated) or aerenchyma (Chapter 19). A minimum value of :math:`{r}_{oxygen}` is set at 0.2, with the assumption that oxygen within organic tissues can supply the necessary stoichiometric demand at this rate. This value lies between estimates of 0.025–0.1 (Frolking et al. 2001), and 0.35 (Wania et al. 2009); the large range of these estimates poses a large unresolved uncertainty.
diff --git a/doc/source/tech_note/Dust/CLM50_Tech_Note_Dust.rst b/doc/source/tech_note/Dust/CLM50_Tech_Note_Dust.rst
index ad593b6060..55f0c2e204 100644
--- a/doc/source/tech_note/Dust/CLM50_Tech_Note_Dust.rst
+++ b/doc/source/tech_note/Dust/CLM50_Tech_Note_Dust.rst
@@ -1,124 +1,326 @@
.. _rst_Dust Model:
-Dust Model
+Dust Emission
==============
-Atmospheric dust is mobilized from the land by wind in the CLM. The most important factors determining soil erodibility and dust emission include the wind friction speed, the vegetation cover, and the soil moisture The CLM dust mobilization scheme (:ref:`Mahowald et al. 2006` accounts for these factors based on the DEAD (Dust Entrainment and Deposition model of :ref:`Zender et al. (2003)`. Please refer to the :ref:`Zender et al. (2003)` article for additional information regarding the equations presented in this section.
+Atmospheric dust is mobilized from the land by wind in the CLM. The most important factors determining soil erodibility and dust emission include the wind friction velocity, the vegetation cover, and the soil moisture. The latest CTSM allows users to choose between two dust emission schemes: One is Leung_2023 (:ref:`Leung et al. 2023`; :ref:`Leung et al. 2024`) which is the current default for the CLM6 physics or later, and the other is Zender_2003 (:ref:`Mahowald et al. 2006`) based on the DEAD (Dust Entrainment and Deposition model) scheme by :ref:`Zender et al. (2003)`, which is the default for the CLM5 or older physics.
-The total vertical mass flux of dust, :math:`F_{j}` (kg m\ :sup:`-2` s\ :sup:`-1`), from the ground into transport bin :math:`j` is given by
+We here describe the Leung_2023 scheme based on :ref:`Leung et al. 2023` and :ref:`Leung et al. (2024)` and document some differences in tuning in the latest CTSM. CTSM users can look for the previous documentation for CLM5 physics for a description of the Zender_2003 scheme.
+
+
+.. _Dust Emission Thresholds:
+
+Dust Emission Thresholds
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. _Fluid Threshold:
+
+Fluid Threshold
+---------------------
+
+Dust emission modeling is a threshold parameterization of an aeolian (wind-driven) process for both Leung_2023 and Zender_2003. For Leung_2023, in any given timestep the soil surface wind velocity :math:`u_{*s}` has to be greater than the fluid threshold friction velocity :math:`u_{*ft}` to generate saltation and dust emission:
+
+.. math::
+ :label: wet_fluid_threshold
+
+ u_{\ast ft} = u_{\ast ft0}(D_{p},\rho_{atm}) f_{m}(w)
+
+where :math:`u_{\ast ft0}(D_{p},\rho_{a})` is the dry fluid threshold without the soil moisture effect :math:`f_{m}`, as a function of median soil diameter :math:`D_{p}` and air density :math:`\rho_{atm}`. In CTSM for Leung_2023, :math:`D_{p}` is a globally uniform number of 130 :math:`\mu` m. :math:`u_{\ast ft0}(D_{p},\rho_{atm})` is given by :ref:`Shao and Lu (2000)`:
+
+.. math::
+ :label: dry_fluid_threshold
+
+ u_{\ast ft0}(D_{p},\rho_{atm}) = \sqrt{\frac{A(\rho_{p} g D_{p} + \gamma / D_{p}) }{\rho_{atm}} }
+
+
+where *g* is the acceleration of gravity (:numref:`Table Physical Constants`), :math:`\rho_{p} = 2650` kg m\ :sup:`-3` is typical soil particle density, and :math:`A = 0.0123` and :math:`\gamma = 1.65 \times 10^{-4}` kg s\ :sup:`-2` are empirical constants.
+
+.. _Impact of Soil Moisture:
+
+Impact of Soil Moisture
+-------------------------
+
+The soil moisture effect :math:`f_{m}(w)` is a function of gravimetric soil moisture :math:`w` (kg water / kg soil) at the topmost soil layer.
+
+:math:`w` is converted from the CLM volumetric soil moisture :math:`\theta` and porosity (saturation moisture :math:`\theta_{sat}`) at the topmost soil layer:
+
+.. math::
+ :label: volumetric_moisture_to_gravimetric_moisture
+
+ w=\theta\frac{ \rho _{liq} }{\rho_{bulk} }
+
+Note that :math:`w` or :math:`\theta` in CTSM is conventionally (:ref:`Mahowald et al. 2006`) treated as a sum of both liquid and ice/frozen soil moisture at the topmost soil layer, i.e., :math:`w_{1} = w_{liq,1} + w_{ice,1}`. We skip :math:`w_{1}` and use :math:`w` for simplicity. :math:`\theta` is the volumetric soil moisture (water+ice) in the topmost soil layer (m\ :sup:`-3`\ water \ m\ :sup:`-3` soil) (section :numref:`Soil Water`), :math:`\rho _{liq}` is the density of liquid water (kg m\ :sup:`-3`) (:numref:`Table Physical constants`), and :math:`\rho _{bulk}` is the bulk density of soil in the top soil layer (kg m\ :sup:`-3`) defined as in section :numref:`Soil and Snow Thermal Properties` rather than as in :ref:`Zender et al. (2003)`. :math:`\rho_{bulk}` is given by
+
+.. math::
+ :label: soil_bulk_density
+
+ \rho_{bulk} = (1 - \theta_{sat} ) \rho_{p}
+
+Then, the soil moisture effect :math:`f_{m}(w)` on increasing the fluid threshold is given by :ref:`Fecan et al. (1999)`:
+
+.. math::
+ :label: moisture_factor_on_fluid_threshold
+
+ f_{m}(w) =\left\{\begin{array}{l} {1{\rm \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; for\; }w\le w_{t} } \\ {\sqrt{1+1.21\left[100\left(w-w_{t} \right)\right]^{0.68} } {\rm \; \; for\; }w>w_{t} } \end{array}\right.
+
+
+where :math:`w_{t}` is the minimum gravimetric moisture threshold required to increase the interparticle force and :math:`u_{*ft}`. :math:`w_{t}` increases with clay fraction :math:`f_{clay}`:
+
+.. math::
+ :label: minimum_moisture
+
+ w_{t} =0.01a\left(17f_{clay} +14f_{clay}^{2} \right){\rm \; \; \; \; \; \; 0}\le f_{clay} =\% clay\times 0.01\le 1
+
+
+where :math:`a=f_{clay}^{-1}` for tuning purposes. Note that this is different from the paper (:ref:`Leung et al. 2023`; :ref:`Leung et al. 2024`) in which :math:`a=1` was chosen. The coefficient 0.01 is used for converting :math:`w_{t}` from % to fraction (kg water / kg soil). :math:`f_{clay}` is the mass fraction of clay particles in the topmost soil layer and %clay comes from the surface dataset (section :numref:`Surface Data`).
+
+.. _Impact Threshold:
+
+Impact Threshold
+----------------------
+
+Another essential dust emission threshold is the impact/dynamic threshold :math:`u_{*it}`, which is the lowest friction velocity or wind stress to matintain saltation:
+
+.. math::
+ :label: impact_threshold
+
+ u_{\ast it} = B_{\ast it} u_{\ast ft0}
+
+where :math:`B_{\ast it} = 0.81` is a constant on Earth following :ref:`Kok et al. (2012)`. In Leung_2023, :math:`u_{\ast it}` does not depend on and increase with soil moisture. The above equations imply that :math:`u_{\ast it} \, < \, u_{\ast ft0} \le \, u_{\ast ft}`. This means that the winds need a bigger momentum to initiate saltation and dust emission but can reduce below :math:`u_{\ast ft}` and still maintain a weak dust emission flux. The emission flux goes to zero when :math:`u_{\ast s}` drops below :math:`u_{\ast it}`.
+
+.. _Dust Emission Flux:
+
+Dust Emission Flux
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The total vertical mass emission flux of dust, :math:`F_{d}` (kg m\ :sup:`-2` s\ :sup:`-1`), from the ground into a transport mode/bin :math:`j` of aerosol is based on :ref:`Kok et al. (2014a)`:
+
+.. math::
+ :label: dust_emiss_flux
+
+ F_{d} = \eta C_{tune} C_{d} f_{bare} f_{clay'} \frac{ \rho_{atm} (u^2_{\ast s} - u^2_{\ast it} ) }{ u^2_{\ast it} } \left( \frac{ u_{\ast s} }{u_{\ast it} } \right) ^\kappa
+
+where :math:`C_{tune} = 0.05` is a constant, :math:`\eta` is the intermittency factor (we will derive it in section :numref:`Emission Intermittency Due To Turbulent Wind Fluctuations`), and :math:`F_{d}` is the total emission flux summed across modes/bins following a revised form of :ref:`Kok et al. (2014b)`. The dust emission flux goes to zero when :math:`u_{\ast s} \, < \, u_{\ast it}`. :math:`\rho_{atm}` is surface air density from CAM (the atm model).
+:math:`f_{clay'}` is a modified clay fraction term appeared earlier in :ref:`Zender et al. (2003)`. In Zender_2003 it is used to indicate the sandblasting efficiency. Zender limited this term to be capped at 0.2:
+
+.. math::
+ :label: clay_sandblast_fact_zender
+
+ f_{clay'} = \textnormal{max}(f_{clay}, 0.2)
+
+:math:`f_{clay'}` is later adopted by :ref:`Kok et al. (2014a)` to indicate the amount of fine dust particles for sandblasting. The same :math:`f_{clay'}` is used in :ref:`Leung et al. (2024)`. But we later further limit :math:`f_{clay'}` to be within 0.1 and 0.2 to further reduce the impact of how the abundance of fine dust particles can scale the total dust emission flux, as part of the CESM tuning:
+
+.. math::
+ :label: clay_sandblast_fact_leung
+
+ f_{clay'} = \textnormal{max}(0.1+0.5f_{clay}, 0.2)
+
+Then, :math:`\kappa` is the fragmentation exponent, and :math:`C_{d}` is the dust emission coefficient (or the soil erodibility coefficient):
+
+.. math::
+ :label: dust_emiss_coefficient
+
+ C_{d} = C_{d0} \exp{ (-C_{e} \frac{ u_{\ast st} - u_{\ast st0} }{ u_{\ast st0} } ) }
.. math::
- :label: 29.1
+ :label: fragment_exponent
+
+ \kappa = C_{\kappa} \frac{ u_{\ast st} - u_{\ast st0} }{ u_{\ast st0} }
- F_{j} =TSf_{m} \alpha Q_{s} \sum _{i=1}^{I}M_{i,j}
+where :math:`C_{\kappa} = 2.7`, :math:`u_{\ast st0} = 0.16` m s :sup:`-3`, :math:`C_{d0} = 4.4 \times 10^{-5}`, and :math:`C_{e} = 2.0`. :math:`F_{d}` thus roughly scales with :math:`u^{2+\kappa}_{*s}`, where :math:`\kappa \sim 1` over major deserts and :math:`\sim 3` or higher over semiarid and nonarid regions. Since :ref:`Kok et al. (2014a)` has not measured :math:`\kappa > 3` in their measurements, we cap :math:`\kappa` at a maximum value (currently set as 2.5). :math:`u_{\ast st}` is the standardized wet fluid threshold at a typical atmospheric surface air density (Kok et al., 2014):
+
+.. math::
+ :label: standard_fluid_threshold
-where :math:`T` is a global factor that compensates for the DEAD model's sensitivity to horizontal and temporal resolution and equals 5 x 10\ :sup:`-4` in the CLM instead of 7 x 10\ :sup:`-4` in :ref:`Zender et al. (2003)`. :math:`S` is the source erodibility factor set to 1 in the CLM and serves as a place holder at this time.
+ u_{\ast st} = u_{\ast ft} \sqrt{ \rho_{atm} / \rho_{0atm}}
-The grid cell fraction of exposed bare soil suitable for dust mobilization :math:`f_{m}` is given by
+where :math:`\rho_{0atm} = 1.225` kg m\ :sup:`-3`. As can be seen, :math:`u_{\ast st}` scales with :math:`u_{\ast ft}` and thus soil moisture :math:`w`. Therefore, moisture :math:`w` decreases soil erodibility :math:`C_{d}` but increases dust emission sensitivity :math:`\kappa` to the winds.
+
+:ref:`Kok et al. (2014a)` is different from many other dust emission parameterizations in the way that the soil erodibility :math:`C_{d}` is not a time-invariant input data but is a transient function, with erodibility increasing with reducing :math:`u^2_{*ft}` (and thus implicitly soil moisture). Similarly, the fragmentation exponent :math:`\kappa` is also transient and increases with enhancing soil moisture.
+
+The grid cell fraction of exposed bare soil suitable for dust mobilization :math:`f_{bare}` is given by
.. math::
- :label: 29.2
+ :label: grid_bare_land_frac
- f_{m} =\left(1-f_{lake} \right)\left(1-f_{sno} \right)\left(1-f_{v} \right)\frac{w_{liq,1} }{w_{liq,1} +w_{ice,1} }
+ f_{bare} =\left(1-f_{lake} \right)\left(1-f_{sno} \right)\left(1-f_{v} \right)\frac{w_{liq,1} }{w_{liq,1} +w_{ice,1} }
-where :math:`f_{lake}` and :math:`f_{sno}` are the CLM grid cell fractions of lake (section :numref:`Surface Data`) and snow cover (section :numref:`Snow Covered Area Fraction`), all ranging from zero to one. Not mentioned by :ref:`Zender et al. (2003)`, :math:`w_{liq,\, 1}` and :math:`{}_{w_{ice,\, 1} }` are the CLM top soil layer liquid water and ice contents (mm) entered as a ratio expressing the decreasing ability of dust to mobilize from increasingly frozen soil. The grid cell fraction of vegetation cover,\ :math:`{}_{f_{v} }`, is defined as
+where :math:`f_{lake}` and :math:`f_{sno}` are the CLM grid cell fractions of lake (section :numref:`Surface Data`) and snow cover (section :numref:`Snow Covered Area Fraction`), all ranging from zero to one. Not mentioned by :ref:`Zender et al. (2003)`, :math:`w_{liq,\, 1}` and :math:`w_{ice,\, 1}` are the CLM top soil layer liquid water and ice contents (mm) entered as a ratio expressing the decreasing ability of dust to mobilize from increasingly frozen soil. The grid cell fraction of vegetation cover, \ :math:`f_{v}`, is defined as
.. math::
- :label: 29.3
+ :label: grid_vegetated_frac
+
+ 0\le f_{v} =\frac{\mathrm{VAI}}{\mathrm{VAI_{thr}} } \le 1{\rm \; \; \; \; where\; } \mathrm{VAI_{thr}} =0.6{\rm \; m}^{2} {\rm m}^{-2}
- 0\le f_{v} =\frac{L+S}{\left(L+S\right)_{t} } \le 1{\rm \; \; \; \; where\; }\left(L+S\right)_{t} =0.3{\rm \; m}^{2} {\rm m}^{-2}
+where :math:`\mathrm{VAI}=\mathrm{LAI}+\mathrm{SAI}` is the vegetation area index as a sum of the CLM leaf and stem area index values (m :sup:`2` leaf m\ :sup:`-2` grid) averaged at the land unit level so as to include all the pfts and the bare ground present in a vegetated land unit. Currently, Leung_2023 in CTSM sets the areas with :math:`\mathrm{VAI_{thr}}` smaller than or equal to 0.6 m :sup:`2` m\ :sup:`-2` to be dust-emitting grids, different from the :ref:`Leung et al. (2024)` paper that set :math:`\mathrm{VAI_{thr}}` to be 1 m :sup:`2` m\ :sup:`-2`. :math:`\mathrm{LAI}` and :math:`\mathrm{SAI}` may be prescribed from the CLM input data (section :numref:`Phenology and vegetation burial by snow`) or simulated by the CLM biogeochemistry model (section :numref:`rst_Vegetation Phenology and Turnover`).
+
+.. _Drag Partition Effect On Reducing Wind Stress:
+
+Drag Partition Effect On Reducing Wind Stress
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+On top of :ref:`Kok et al. (2014a)`, Leung_2023 introduced the soil surface friction velocity :math:`u_{*s}` as the friction velocity :math:`u_{*}` from CLM corrected by the surface roughness due to the presented rocks and vegetation on the soil surface, encapsulated by the so-called drag partition factor :math:`F_{eff}`.
+
+.. math::
+ :label: soil_surface_ustar
+
+ u_{\ast s} = u_{*} F_{eff}
+
+The :ref:`Leung et al. (2023)` paper uses an area-weighted averaging method to determine the mean drag partitioning for a grid cell: :math:`F_{eff}^3 = A_{rock} f_{rock}^3 + A_{veg} f_{veg}^3`. :math:`A_{rock}` and :math:`A_{veg}` are fractional area cover (in fraction) from the CLM-prescribed land use from the Land Use Harmonization 2 (LUH2; section :numref:`rst_Transient Landcover Change`). :math:`F_{eff}` is thus a weighted mean of the rock drag partitioning and the vegetation drag partitioning in :ref:`Leung et al. (2023)`. However, since CTSM has the privilege of supporting sub-grid patch-level simulations of dust emissions, we simply separate the calculations of dust emissions into the areas of bare soils and areas of the short vegetation. For a bare soil patch/PFT we use:
+
+.. math::
+ :label: rock_drag_partition
+
+ F_{eff} = f_{rock}
+
+And for a patch/PFT with short vegetation (shrub, grass, crop) we use:
+
+.. math::
+ :label: veg_drag_partition
-where equation :eq:`29.3` applies only for dust mobilization and is not related to the plant functional type fractions prescribed from the CLM input data or simulated by the CLM dynamic vegetation model (Chapter 22). :math:`L` and :math:`S` are the CLM leaf and stem area index values (m :sup:`2` m\ :sup:`-2`) averaged at the land unit level so as to include all the pfts and the bare ground present in a vegetated land unit. :math:`L` and :math:`S` may be prescribed from the CLM input data (section :numref:`Phenology and vegetation burial by snow`) or simulated by the CLM biogeochemistry model (Chapter :numref:`rst_Vegetation Phenology and Turnover`).
+ F_{eff} = f_{veg}
-The sandblasting mass efficiency :math:`\alpha` (m :sup:`-1`) is calculated as
+The rock drag partition factor scales with the surface roughness density of rocks, captured by the aeolian roughness length :math:`z_{0a}` from the satellite-derived dataset from :ref:`Prigent et al. (2005)`. The expression was first developed by :ref:`Marticorena and Bergametti (1995)`, which is more valid for the low-roughness surfaces:
.. math::
- :label: 29.4
+ :label: rock_drag_partition_fact
- \alpha =100e^{\left(13.4M_{clay} -6.0\right)\ln 10} {\rm \; \; }\left\{\begin{array}{l} {M_{clay} =\% clay\times 0.01{\rm \; \; \; 0}\le \% clay\le 20} \\ {M_{clay} =20\times 0.01{\rm \; \; \; \; \; \; \; \; 20<\% }clay\le 100} \end{array}\right.
+ f_{rock} = 1 - \frac{\ln(\frac{z_{0a}}{z_{0s}})}{\ln[b_{1}(\frac{X}{z_{0s}})^{b_{2}}]}
-where :math:`M_{clay}` is the mass fraction of clay particles in the soil and %clay is determined from the surface dataset (section :numref:`Surface Data`). :math:`M_{clay} =0` corresponds to sand and :math:`M_{clay} =0.2` to sandy loam.
+where :math:`X = 10` m is the distance downstream the point of discontinuity in surface obstacle, :math:`b_{1} = 0.7` and :math:`b_{2} = 0.8` are coefficients (:ref:`Darmenova et al., 2009`), :math:`z_{0s}` is the soil roughness length. :math:`z_{0a}` is from :ref:`Prigent et al. (2005)` and should not be confused with the aerodynamic roughness length :math:`Z_{0}` from the model. This equation only applies for gridcells with VAI smaller than the VAI threshold for dust emission.
-:math:`Q_{s}` is the total horizontally saltating mass flux (kg m\ :sup:`-1` s\ :sup:`-1`) of "large" particles (:numref:`Table Dust Mass fraction`), also referred to as the vertically integrated streamwise mass flux
+The vegetation drag partition factor scales with vegetation density as captured by VAI following :ref:`Okin (2008)` and :ref:`Pierre et al. (2014)`:
.. math::
- :label: 29.5
+ :label: veg_drag_partition_effect
- Q_{s} = \left\{
- \begin{array}{lr}
- \frac{c_{s} \rho _{atm} u_{*s}^{3} }{g} \left(1-\frac{u_{*t} }{u_{*s} } \right)\left(1+\frac{u_{*t} }{u_{*s} } \right)^{2} {\rm \; } & \qquad {\rm for\; }u_{*t} `, in which a statistical substepping method was proposed to account for the temporary shutoff of dust emission fluxes.
+
+The fraction of time :math:`\eta` is parameterized using the surface winds and thresholds at the saltation height. Therefore, the friction velocities are translated using the log law of the wall to the saltation height, which was defined as :math:`z_{sal}` = 0.1 m by :ref:`Comola et al. (2019)`:
.. math::
- :label: 29.6
+ :label: mean_wind_sal_height
- u_{*t} =f_{z} \left[Re_{*t}^{f} \rho _{osp} gD_{osp} \left(1+\frac{6\times 10^{-7} }{\rho _{osp} gD_{osp}^{2.5} } \right)\right]^{\frac{1}{2} } \rho _{atm} ^{-\frac{1}{2} } f_{w}
+ u_{s} = \frac{u_{\ast s}}{k} \ln(z_{sal}/z_{0a})
-where :math:`f_{z}` is a factor dependent on surface roughness but set to 1 as a place holder for now, :math:`\rho _{osp}` and :math:`D_{osp}` are the density (2650 kg m\ :sup:`-3`) and diameter (75 x 10\ :math:`{}^{-6}` m) of optimal saltation particles, and :math:`f_{w}` is a factor dependent on soil moisture:
+.. math::
+ :label: fluid_threshold_sal_height
+
+ u_{ft} = \frac{u_{\ast ft}}{k} \ln(z_{sal}/z_{0a})
.. math::
- :label: 29.7
+ :label: imapct_threshold_sal_height
- f_{w} =\left\{\begin{array}{l} {1{\rm \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; for\; }w\le w_{t} } \\ {\sqrt{1+1.21\left[100\left(w-w_{t} \right)\right]^{0.68} } {\rm \; \; for\; }w>w_{t} } \end{array}\right.
+ u_{it} = \frac{u_{\ast it}}{k} \ln(z_{sal}/z_{0a})
-where
+where *k* is the von Karman constant (:numref:`Table Physical Constants`), and :math:`z_{0a}`, the aeolian roughness length, is set to be 10:sup:`-4` m here for simplicity. With saltation-height variables defined, the instantaneous wind :math:`\tilde{u}_s` is assumed by Comola to follow a Gaussian distribution with a mean equal to the mean wind speed and the spread :math:`\sigma_{u_{s}}` parameterized by the Similarity Theory (:ref:`Panofsky et al., 1977`):
.. math::
- :label: 29.8
+ :label: instant_wind_sal_height
- w_{t} =a\left(0.17M_{clay} +0.14M_{clay}^{2} \right){\rm \; \; \; \; \; \; 0}\le M_{clay} =\% clay\times 0.01\le 1
+ \tilde{u}_s \sim N(u_s, \sigma_{u_s})
-and
+And the fluctuation strength is parameterized by the similarity theory:
.. math::
- :label: 29.9
+ :label: fluctuation_sal_height
+
+ \sigma_{u_s} = u_{\ast s} \left( 12 - 0.5 \frac{z_i}{L} \right)^{1/3}
+ \quad \text{for } 12 - 0.5 \frac{z_i}{L} \ge 0
+
+where :math:`z_i = 1000` m is the planetary boundary-layer height set as a constant for now, and :math:`L` is the Obukhov length scale. This means the instantaneous wind's fluctuation comes from both a shear contribution and a buoyancy contribution.
- w=\frac{\theta _{1} \rho _{liq} }{\rho _{d,1} }
-where :math:`a=M_{clay}^{-1}` for tuning purposes, :math:`\theta _{1}` is the volumetric soil moisture in the top soil layer (m :math:`{}^{3 }`\ m\ :sup:`-3`) (section :numref:`Soil Water`), :math:`\rho _{liq}` is the density of liquid water (kg m\ :sup:`-3`) (:numref:`Table Physical constants`), and :math:`\rho _{d,\, 1}` is the bulk density of soil in the top soil layer (kg m\ :sup:`-3`) defined as in section :numref:`Soil and Snow Thermal Properties` rather than as in :ref:`Zender et al. (2003)`. :math:`Re_{*t}^{f}` from equation :eq:`29.6` is the threshold friction Reynolds factor
+Then, the total fraction of time :math:`\eta` when saltation is active within a model timestep is then formulated as
.. math::
- :label: 29.10
+ :label: intermittency_fact
- Re_{*t}^{f} =\left\{\begin{array}{l} {\frac{0.1291^{2} }{-1+1.928Re_{*t} } {\rm \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; for\; 0.03}\le Re_{*t} \le 10} \\ {0.12^{2} \left(1-0.0858e^{-0.0617(Re_{*t} -10)} \right)^{2} {\rm \; for\; }Re_{*t} >10} \end{array}\right.
+ \eta = 1 - P_{ft} + \alpha \left( P_{ft} - P_{it} \right)
-and :math:`Re_{*t}` is the threshold friction Reynolds number approximation for optimally sized particles
+where :math:`P_{it}` is the cumulative probability that the instantaneous wind :math:`\tilde{u}_s` does not exceed the impact threshold :math:`u_{it}`, and :math:`P_{ft}` is the cumulative probability that :math:`\tilde{u}_s` does not exceed the fluid threshold :math:`u_{ft}`. The fluid threshold crossing fraction :math:`\alpha` is defined as the rate of :math:`\tilde{u}_s` sweeping across :math:`u_{ft}` divided by the rate of sweeping across :math:`u_{it}` and :math:`u_{ft}` summed up. The detailed physical interpretation of this formula is in :ref:`Leung et al. (2023)`. Here we just document the equations for each term:
+
+.. For instance, if :math:`\tilde{u}_s` sweeps across :math:`u_{ft}` often and does not sweep across :math:`u_{it}` much, it means that :math:`\tilde{u}_s` (and thus the timestep-mean :math:`u_s`) should be closer to :math:`u_{ft}` and generally higher than :math:`u_{it}`. Then, :math:`\alpha` is close to 1, and the fraction of time :math:`\eta` (with active emission within a timestep) should also be close to 1. :math:`\alpha` can be represented as
.. math::
- :label: 29.11
+ :label: threshold_crossing_fraction
- Re_{*t} =0.38+1331\left(100D_{osp} \right)^{1.56}
+ \alpha \approx \left\{ \exp\left[
+ \frac{u_{ft}^2 - u_{it}^2 - 2u_s(u_{ft}-u_{it})}{2 \sigma^2_{u_s} }
+ \right] + 1 \right\}^{-1}
-In :eq:`29.5`, :math:`u_{*s}` is defined as the wind friction speed (m s\ :sup:`-1`) accounting for the Owen effect (:ref:`Owen 1964`)
+Then, the fraction of time in :math:`\Delta t` when :math:`\tilde{u}_s` is above :math:`u_{ft}` is given by :math:`1 - P_{ft}`, where
.. math::
- :label: 29.12
+ :label: probability_cross_fluid_threshold
+
+ P_{ft} = \frac{1}{2} \left[ 1 + \operatorname{erf}
+ \left( \frac{u_{ft} - u_s}{\sqrt{2} \sigma_{u_s}} \right) \right]
- u_{*s} = \left\{
- \begin{array}{lr}
- u_{*} & \quad {\rm \; for \;} U_{10} ` but here for 10 m above the ground, and :math:`U_{10,\, t}` is the threshold wind speed at 10 m (m s\ :sup:`-1`)
+ P_{it} = \frac{1}{2} \left[ 1 + \operatorname{erf}
+ \left( \frac{u_{it} - u_s}{\sqrt{2} \sigma_{u_s}} \right) \right]
+
+And so the fraction of time :math:`\eta` within :math:`\Delta t` with active emission is determined for :eq:`dust_emiss_flux`.
+
+.. _Emitted Dust Size Distribution And Dust Transport In Atmosphere:
+
+Emitted Dust Size Distribution And Dust Transport In Atmosphere
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The total vertical mass emission flux of dust, :math:`F_{d}` (kg m\ :sup:`-2` s\ :sup:`-1`) is then computed with all the above equations and terms. The emission flux is then passed through the coupler to the atmospheric model (CAM) to simulate dust aerosol transport and deposition. The default aerosol model supported in the CAM6 and CAM7 physics is the Modal Aerosol Model (MAM). CAM7 uses the 5-mode MAM (MAM5), in which three modes (Aitken, accumulation, and coarse modes) by default contain dust.
+
+.. _Brittle Fragmentation Theory For Modal Aerosol Model:
+
+Brittle Fragmentation Theory For Modal Aerosol Model
+-----------------------------------------------------
+
+The total mass emission flux per grid is partitioned into the three modes following the Brittle Fragmentation Theory (BFT) in :ref:`Kok et al. (2014b)` and later modified by :ref:`Meng et al. (2022)`. In the current model version, the fractions of dust emission flux partitioned in the three modes are 1.65 :math:`\times` 10:sup:`-5`, 0.021, and 0.979 for the Aitken (0.01–0.1 um), accumulation (0.1–1 um), and coarse (1–10 um) modes, respectively, following :ref:`Meng et al. (2022)`. These values are prescribed in the MAM code inside CAM.
+
+.. _Conventional Bin Partition:
+
+Conventional Bin Partition
+------------------------------
+
+In the early CESM versions, CAM employed the Bulk Aerosol Model (BAM) as the default aerosol model. Thus, the emission fluxes in CTSM is by default partitioned into 4 bins before passing to the coupler:
.. math::
- :label: 29.13
+ :label: bin_partition_convention
- U_{10,t} =u_{*t} \frac{U_{10} }{u_{*} }
+ F_{j} = F_d \sum _{i=1}^{I}M_{i,j}
-In equation :eq:`29.1` we sum :math:`M_{i,\, j}` over :math:`I=3` source modes :math:`i` where :math:`M_{i,\, j}` is the mass fraction of each source mode :math:`i` carried in each of *:math:`J=4`* transport bins :math:`j`
+where :math:`F_{j}` is the mass emission flux from the :math:`j` th aerosol bin. The current way of paritioning the emission fluxes before passing to the coupler is still being used, but the partition into the different bins is only required by BAM, not the current default MAM in CAM6 and CAM7. Therefore, for MAM, the four :math:`F_{j}` are summed up to become one total flux :math:`F_d` again inside MAM. It is then redistributed inside MAM to different individual MAM modes following the BFT. So, the following details are inherited from previous versions of the code and still works fine, but we may clean up the code in the future.
+
+Equation :eq:`bin_partition_convention` comes from :ref:`Zender et al. (2003)` and used by :ref:`Mahowald et al. (2006)`. It sums :math:`M_{i,\, j}` over :math:`I=3` source modes :math:`i` where :math:`M_{i,\, j}` is the mass fraction of each source mode :math:`i` carried in each of :math:`J=4` transport bins :math:`j`
.. math::
- :label: 29.14
+ :label: bin_partition_fraction
M_{i,j} =\frac{m_{i} }{2} \left[{\rm erf}\left(\frac{\ln {\textstyle\frac{D_{j,\max } }{\tilde{D}_{v,i} }} }{\sqrt{2} \ln \sigma _{g,i} } \right)-{\rm erf}\left(\frac{\ln {\textstyle\frac{D_{j,\min } }{\tilde{D}_{v,i} }} }{\sqrt{2} \ln \sigma _{g,i} } \right)\right]
where :math:`m_{i}`, :math:`\tilde{D}_{v,\, i}`, and :math:`\sigma _{g,\, i}` are the mass fraction, mass median diameter, and geometric standard deviation assigned to each particle source mode :math:`i` (:numref:`Table Dust Mass fraction`), while :math:`D_{j,\, \min }` and :math:`D_{j,\, \max }` are the minimum and maximum diameters (m) in each transport bin :math:`j` (:numref:`Table Dust Minimum and maximum particle diameters`).
+Note that in CAM, dust emission flux will be scaled by another global dust tuning factor for matching the observed atmospheric dust constraints. The CAM dust emission scaling factor is supposed to use 1/3.2 for B (land–atm–ocean coupled) cases, and 1/4 for F (land–atm coupled) cases. This means that CTSM-simulated dust emissions will be scaled to ~25–30 % of its original before simulating dust transport. After scaling, global annual total dust emission using Leung_2023 should be roughly ~3000 Tg/yr.
+
+
.. _Table Dust Mass fraction:
.. table:: Mass fraction :math:`m_{i}` , mass median diameter :math:`\tilde{D}_{v,\, i}` , and geometric standard deviation :math:`\sigma _{g,\, i}` , per dust source mode :math:`i`
diff --git a/doc/source/tech_note/Ecosystem/CLM50_Tech_Note_Ecosystem.rst b/doc/source/tech_note/Ecosystem/CLM50_Tech_Note_Ecosystem.rst
index 446ddec529..c755200ad6 100644
--- a/doc/source/tech_note/Ecosystem/CLM50_Tech_Note_Ecosystem.rst
+++ b/doc/source/tech_note/Ecosystem/CLM50_Tech_Note_Ecosystem.rst
@@ -45,7 +45,7 @@ Vegetated surfaces are comprised of up to 15 possible plant functional types (PF
+-----+--------------------------------------------------------------+-------------------+
| IVT | Plant functional type | Acronym |
+=====+==============================================================+===================+
- | 0 | Bare Ground | NET Temperate |
+ | 0 | Bare Ground | - |
+-----+--------------------------------------------------------------+-------------------+
| 1 | Needleleaf evergreen tree – temperate | NET Temperate |
+-----+--------------------------------------------------------------+-------------------+
@@ -92,7 +92,7 @@ Vegetated surfaces are comprised of up to 15 possible plant functional types (PF
Vegetation Structure
^^^^^^^^^^^^^^^^^^^^^^^^^^
-Vegetation structure is defined by leaf and stem area indices (:math:`L,\, S`) and canopy top and bottom heights (:math:`z_{top}`,\ :math:`z_{bot}` ). Separate leaf and stem area indices and canopy heights are prescribed or calculated for each PFT. Daily leaf and stem area indices are obtained from griddeddatasets of monthly values (section :numref:`Surface Data`). Canopy top and bottom heights for trees are from ICESat (:ref:`Simard et al. (2011) `). Canopy top and bottom heights for short vegetation are obtained from gridded datasets but are invariant in space and time and were obtained from PFT-specific values (:ref:`Bonan et al. (2002a) `) (:numref:`Table Plant functional type canopy top and bottom heights`). When the biogeochemistry model is active, vegetation state (LAI, SAI, canopy top and bottom heights) are calculated prognostically (see Chapter :numref:`rst_Vegetation Phenology and Turnover`).
+Vegetation structure is defined by leaf and stem area indices (:math:`L,\, S`) and canopy top and bottom heights (:math:`z_{top}`,\ :math:`z_{bot}` ). Separate leaf and stem area indices and canopy heights are prescribed or calculated for each PFT. Daily leaf and stem area indices are obtained from gridded datasets of monthly values (section :numref:`Surface Data`). Canopy top and bottom heights for trees are from ICESat (:ref:`Simard et al. (2011) `). Canopy top and bottom heights for short vegetation are obtained from gridded datasets but are invariant in space and time and were obtained from PFT-specific values (:ref:`Bonan et al. (2002a) `) (:numref:`Table Plant functional type canopy top and bottom heights`). When the biogeochemistry model is active, vegetation state (LAI, SAI, canopy top and bottom heights) are calculated prognostically (see Chapter :numref:`rst_Vegetation Phenology and Turnover`).
.. _Table Plant functional type canopy top and bottom heights:
@@ -127,7 +127,7 @@ Vegetation structure is defined by leaf and stem area indices (:math:`L,\, S`) a
Phenology and vegetation burial by snow
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-When the biogeochemistry model is inactive, leaf and stem area indices (m\ :sup:`2` leaf area m\ :sup:`-2` ground area) are updated daily by linearly interpolating between monthly values. Monthly PFT leaf area index values are developed from the 1-km MODIS-derived monthly grid cell average leaf area index of :ref:`Myneni et al. (2002) `, as described in :ref:`Lawrence and Chase (2007) `. Stem area ndex is calculated from the monthly PFT leaf area index using the methods of :ref:`Zeng et al. (2002) `. The leaf and stem area indices are adjusted for vertical burying by snow (:ref:`Wang and Zeng 2009 `) as
+When the biogeochemistry model is inactive, leaf and stem area indices (m\ :sup:`2` leaf area m\ :sup:`-2` ground area) are updated daily by linearly interpolating between monthly values. Monthly PFT leaf area index values are developed from the 1-km MODIS-derived monthly grid cell average leaf area index of :ref:`Myneni et al. (2002) `, as described in :ref:`Lawrence and Chase (2007) `. Stem area index is calculated from the monthly PFT leaf area index using the methods of :ref:`Zeng et al. (2002) `. The leaf and stem area indices are adjusted for vertical burying by snow (:ref:`Wang and Zeng 2009 `) as
.. math::
:label: 2.1
@@ -293,9 +293,8 @@ The current state of the atmosphere (:numref:`Table Atmospheric input to land mo
:sup:`3`\ There are 14 aerosol deposition rates required depending on species and affinity for bonding with water; 8 of these are dust deposition rates (dry and wet rates for 4 dust size bins, :math:`D_{dst,\, dry1},\, D_{dst,\, dry2},\, D_{dst,\, dry3},\, D_{dst,\, dry4}`, :math:`D_{dst,\, \, wet1},D_{dst,\, wet2},\, D_{dst,wet3},\, D_{dst,\, wet4}` ), 3 are black carbon deposition rates (dry and wet hydrophilic and dry hydrophobic rates, :math:`D_{bc,\, dryhphil},\, D_{bc,\, wethphil},\, D_{bc,\, dryhphob}` ), and 3 are organic carbon deposition rates (dry and wet hydrophilic and dry hydrophobic rates, :math:`D_{oc,\, dryhphil},\, D_{oc,\, wethphil},\, D_{oc,\, dryhphob}` ). These fluxes are computed interactively by the atmospheric model (when prognostic aerosol representation is active) or are prescribed from a time-varying (annual cycle or transient), globally-gridded deposition file defined in the namelist (see the CLM4.5 User's Guide). Aerosol deposition rates were calculated in a transient 1850-2009 CAM simulation (at a resolution of 1.9x2.5x26L) with interactive chemistry (troposphere and stratosphere) driven by CCSM3 20\ :sup:`th` century sea-surface temperatures and emissions (:ref:`Lamarque et al. 2010`) for short-lived gases and aerosols; observed concentrations were specified for methane, N\ :sub:`2`\ O, the ozone-depleting substances (CFCs),and CO\ :sub:`2`. The fluxes are used by the snow-related parameterizations (Chapters :numref:`rst_Surface Albedos` and :numref:`rst_Snow Hydrology`).
:sup:`4`\ The nitrogen deposition rate is required by the biogeochemistry model when active and represents the total deposition of mineral nitrogen onto the land surface, combining deposition of NO\ :sub:`y` and NH\ :sub:`x`. The rate is supplied either as a time-varying spatially-varying monthly mean rate fixed for a particular year for control simulations or advancing yearly for transient simulation. This is for the case when CTSM reads it's own datasets, but when coupled to CAM it can also use the Nitrogen deposition calculated or read in by CAM. For the datasets that CTSM uses, Nitrogen deposition rates were calculated from the same CAM chemistry simulation that generated the aerosol deposition rates.
-.. _rst_Surface Characterization, Vertical Discretization, and Model Input Requirements:
-:sup:`5`\ Climatological 3-hourly lightning frequency at :math:`\sim`\ 1.8° resolution is provided, which was calculated via bilinear interpolation from 1995-2011 NASA LIS/OTD grid product v2.2 (http://ghrc.msfc.nasa.gov) 2-hourly, 2.5° lightning frequency data. In future versions of the model, lightning data may be obtained directly from the atmosphere model.
+:sup:`5`\ Climatological 3-hourly lightning frequency at :math:`\sim`\ 1.8° resolution is provided, which was calculated via bilinear interpolation from 1995-2011 NASA LIS/OTD grid product v2.2 (https://cmr.earthdata.nasa.gov/search/concepts/C1995863244-GHRC_DAAC.html) 2-hourly, 2.5° lightning frequency data. In future versions of the model, lightning data may be obtained directly from the atmosphere model.
Density of air (:math:`\rho _{atm}` ) (kg m\ :sup:`-3`) is also required but is calculated directly from :math:`\rho _{atm} =\frac{P_{atm} -0.378e_{atm} }{R_{da} T_{atm} }` where :math:`P_{atm}` is atmospheric pressure (Pa), :math:`e_{atm}` is atmospheric vapor pressure (Pa), :math:`R_{da}` is the gas constant for dry air (J kg\ :sup:`-1` K\ :sup:`-1`) (:numref:`Table Physical constants`), and :math:`T_{atm}` is the atmospheric temperature (K). The atmospheric vapor pressure :math:`e_{atm}` is derived from atmospheric specific humidity :math:`q_{atm}` (kg kg\ :sup:`-1`) as :math:`e_{atm} =\frac{q_{atm} P_{atm} }{0.622+0.378q_{atm} }`.
@@ -360,7 +359,7 @@ Initialization
Initialization of the land model (i.e., providing the model with initial temperature and moisture states) depends on the type of run (startup or restart) (see the CLM4.5 User's Guide). A startup run starts the model from either initial conditions that are set internally in the Fortran code (referred to as arbitrary initial conditions) or from an initial conditions dataset that enables the model to start from a spun up state (i.e., where the land is in equilibrium with the simulated climate). In restart runs, the model is continued from a previous simulation and initialized from a restart file that ensures that the output is bit-for-bit the same as if the previous simulation had not stopped. The fields that are required from the restart or initial conditions files can be obtained by examining the code. Arbitrary initial conditions are specified as follows.
-Soil points are initialized with surface ground temperature :math:`T_{g}` and soil layer temperature :math:`T_{i}`, for :math:`i=1,\ldots,N_{levgrnd}`, of 274 K, vegetation temperature :math:`T_{v}` of 283 K, no snow or canopy water (:math:`W_{sno} =0`, :math:`W_{can} =0`), and volumetric soil water content :math:`\theta _{i} =0.15` mm\ :sup:`3` mm\ :sup:`-3` for layers :math:`i=1,\ldots,N_{levsoi}` and :math:`\theta _{i} =0.0` mm\ :sup:`3` mm\ :sup:`-3` for layers :math:`i=N_{levsoi} +1,\ldots,N_{levgrnd}`. placeLake temperatures (:math:`T_{g}` and :math:`T_{i}` ) are initialized at 277 K and :math:`W_{sno} =0`.
+Soil points are initialized with surface ground temperature :math:`T_{g}` and soil layer temperature :math:`T_{i}`, for :math:`i=1,\ldots,N_{levgrnd}`, of 274 K, vegetation temperature :math:`T_{v}` of 283 K, no snow or canopy water (:math:`W_{sno} =0`, :math:`W_{can} =0`), and volumetric soil water content :math:`\theta _{i} =0.15` mm\ :sup:`3` mm\ :sup:`-3` for layers :math:`i=1,\ldots,N_{levsoi}` and :math:`\theta _{i} =0.0` mm\ :sup:`3` mm\ :sup:`-3` for layers :math:`i=N_{levsoi} +1,\ldots,N_{levgrnd}`. Lake temperatures (:math:`T_{g}` and :math:`T_{i}` ) are initialized at 277 K and :math:`W_{sno} =0`.
Glacier temperatures (:math:`T_{g} =T_{snl+1}` and :math:`T_{i}` for :math:`i=snl+1,\ldots,N_{levgrnd}` where :math:`snl` is the negative of the number of snow layers, i.e., :math:`snl` ranges from –5 to 0) are initialized to 250 K with a snow water equivalent :math:`W_{sno} =1000` mm, snow depth :math:`z_{sno} =\frac{W_{sno} }{\rho _{sno} }` (m) where :math:`\rho _{sno} =250` kg m\ :sup:`-3` is an initial estimate for the bulk density of snow, and :math:`\theta _{i}` \ =1.0 for :math:`i=1,\ldots,N_{levgrnd}`. The snow layer structure (e.g., number of snow layers :math:`snl` and layer thickness) is initialized based on the snow depth (section 6.1). The snow liquid water and ice contents (kg m\ :sup:`-2`) are initialized as :math:`w_{liq,\, i} =0` and :math:`w_{ice,\, i} =\Delta z_{i} \rho _{sno}`, respectively, where :math:`i=snl+1,\ldots,0` are the snow layers, and :math:`\Delta z_{i}` is the thickness of snow layer :math:`i` (m). The soil liquid water and ice contents are initialized as :math:`w_{liq,\, i} =0` and :math:`w_{ice,\, i} =\Delta z_{i} \rho _{ice} \theta _{i}` for :math:`T_{i} \le T_{f}`, and :math:`w_{liq,\, i} =\Delta z_{i} \rho _{liq} \theta _{i}` and :math:`w_{ice,\, i} =0` for :math:`T_{i} >T_{f}`, where :math:`\rho _{ice}` and :math:`\rho _{liq}` are the densities of ice and liquid water (kg m\ :sup:`-3`) (:numref:`Table Physical constants`), and :math:`T_{f}` is the freezing temperature of water (K) (:numref:`Table Physical constants`). All vegetated and glacier land units are initialized with water stored in the unconfined aquifer and unsaturated soil :math:`W_{a} =4000` mm and water table depth :math:`z_{\nabla }` at five meters below the soil column.
@@ -479,7 +478,7 @@ Values of certain adjustable parameters inherent in the biogeophysical or biogeo
"Latent heat of sublimation", :math:`\lambda _{sub}`, :math:`\lambda _{vap} +L_{f}`, J kg :sup:`-1`
:sup:`1` "Thermal conductivity of water", :math:`\lambda _{liq}`, 0.57, W m :sup:`-1` K :sup:`-1`
:sup:`1` "Thermal conductivity of ice", :math:`\lambda _{ice}`, 2.29, W m :sup:`-1` K :sup:`-1`
- :sup:`1` "Thermal conductivity of air", :math:`\lambda _{air}`, 0.023 W m :sup:`-1` K :sup:`-1`
+ :sup:`1` "Thermal conductivity of air", :math:`\lambda _{air}`, 0.023, W m :sup:`-1` K :sup:`-1`
"Radius of the earth", :math:`R_{e}`, 6.37122, :math:`\times 10^{6}` m
:sup:`1`\ Not shared by other components of the coupled modeling system.
diff --git a/doc/source/tech_note/External_Nitrogen_Cycle/CLM50_Tech_Note_External_Nitrogen_Cycle.rst b/doc/source/tech_note/External_Nitrogen_Cycle/CLM50_Tech_Note_External_Nitrogen_Cycle.rst
index d1c476099d..345693c40c 100644
--- a/doc/source/tech_note/External_Nitrogen_Cycle/CLM50_Tech_Note_External_Nitrogen_Cycle.rst
+++ b/doc/source/tech_note/External_Nitrogen_Cycle/CLM50_Tech_Note_External_Nitrogen_Cycle.rst
@@ -3,63 +3,40 @@
External Nitrogen Cycle
===========================
-.. _Summary of CLM5.0 updates relative to CLM4.5:
-
-Summary of CLM5.0 updates relative to CLM4.5
------------------------------------------------------
-
-We describe external inputs to the nitrogen cycle in CLM5.0. Much of the following information appeared in the CLM4.5 Technical Note (:ref:`Oleson et al. 2013 `) as well as :ref:`Koven et al. (2013) `.
-
-CLM5.0 includes the following changes to terrestrial nitrogen inputs:
-
-- Time varrying deposition of reactive nitrogen. In off-line runs this changes monthly. In coupled simulations N deposition is passed at the coupling timestep (e.g., half-hourly).
-
-- Asymbiotic (or free living) N fixation is a function of evapotranspiration and is added to the inorganic nitrogen (NH\ :sub:`4`\ :sup:`+`) pool (described below).
-
-- Symbiotic N fixation is handled by the FUN model (chapter :numref:`rst_FUN`) and is passed straight to the plant, not the mineral nitrogen pool.
Overview
-----------------------------------------------------
In addition to the relatively rapid cycling of nitrogen within the plant – litter – soil organic matter system, CLM also represents several processes which couple the internal nitrogen cycle to external sources and sinks. Inputs of new mineral nitrogen are from atmospheric deposition and biological nitrogen fixation. Losses of mineral nitrogen are due to nitrification, denitrification, leaching, and losses in fire. While the short-term dynamics of nitrogen limitation depend on the behavior of the internal nitrogen cycle, establishment of total ecosystem nitrogen stocks depends on the balance between sources and sinks in the external nitrogen cycle (:ref:`Thomas et al. 2015 `).
-As with CLM4.5, CLM5.0 represents inorganic N transformations based on the Century N-gas model; this includes separate NH\ :sub:`4`\ :sup:`+` and NO\ :sub:`3`\ :sup:`-` pools, as well as environmentally controlled nitrification and denitrification rates that is described below.
+CLM represents inorganic N transformations based on the Century N-gas model; this includes separate NH\ :sub:`4`\ :sup:`+` and NO\ :sub:`3`\ :sup:`-` pools, as well as environmentally controlled nitrification and denitrification rates that is described below.
Atmospheric Nitrogen Deposition
------------------------------------
-CLM uses a single variable to represent the total deposition of mineral nitrogen onto the land surface, combining wet and dry deposition of NO\ :sub:`y` and NH\ :sub:`x` as a single flux (:math:`{NF}_{ndep\_sminn}`, gN m\ :sup:`-2` s\ :sup:`-1`). This flux is intended to represent total reactive nitrogen deposited to the land surface which originates from the following natural and anthropogenic sources (Galloway et al. 2004): formation of NO\ :sub:`x` during lightning, NO\ :math:`{}_{x }`\ and NH\ :sub:`3` emission from wildfire, NO\ :sub:`x` emission from natural soils, NH\ :sub:`3` emission from natural soils, vegetation, and wild animals, NO\ :sub:`x` and NH\ :sub:`3` emission during fossil fuel combustion (both thermal and fuel NO\ :sub:`x` production), NO\ :sub:`x` and NH\ :sub:`3` emission from other industrial processes, NO\ :sub:`x` and NH\ :sub:`3` emission from fire associated with deforestation, NO\ :sub:`x` and NH\ :sub:`3` emission from agricultural burning, NO\ :sub:`x` emission from agricultural soils, NH\ :sub:`3` emission from agricultural crops, NH\ :sub:`3` emission from agricultural animal waste, and NH\ :sub:`3` emission from human waste and waste water. The deposition flux is provided as a spatially and (potentially) temporally varying dataset (see section :numref:`Atmospheric Coupling` for a description of the default input dataset).
+CLM uses a single variable to represent the total deposition of mineral nitrogen onto the land surface, combining wet and dry deposition of NO\ :sub:`y` and NH\ :sub:`x` as a single flux (:math:`{NF}_{ndep\_sminn}`, gN m\ :sup:`-2` s\ :sup:`-1`). This flux is intended to represent total reactive nitrogen deposited to the land surface which originates from the following natural and anthropogenic sources (Galloway et al. 2004): formation of NO\ :sub:`x` during lightning, NO\ :sub:`x`\ and NH\ :sub:`3` emission from wildfire, NO\ :sub:`x` emission from natural soils, NH\ :sub:`3` emission from natural soils, vegetation, and wild animals, NO\ :sub:`x` and NH\ :sub:`3` emission during fossil fuel combustion (both thermal and fuel NO\ :sub:`x` production), NO\ :sub:`x` and NH\ :sub:`3` emission from other industrial processes, NO\ :sub:`x` and NH\ :sub:`3` emission from fire associated with deforestation, NO\ :sub:`x` and NH\ :sub:`3` emission from agricultural burning, NO\ :sub:`x` emission from agricultural soils, NH\ :sub:`3` emission from agricultural crops, NH\ :sub:`3` emission from agricultural animal waste, and NH\ :sub:`3` emission from human waste and waste water. The deposition flux is provided as a spatially and temporally varying dataset (see section :numref:`Atmospheric Coupling` for a description of the default input dataset).
-The nitrogen deposition flux is assumed to enter the NH\ :sub:`4`\ :sup:`+` pool, and is vertically distributed throughout the soil profile. Although N deposition inputs include both oxidized and reduced forms, CLM5 only reads in total N deposition. This approach is held over from CLM4.0, which only represented a single mineral nitrogen pool, however, real pathways for wet and dry nitrogen deposition can be more complex than currently represented in the CLM5.0, including release from melting snowpack and direct foliar uptake of deposited NO\ :sub:`y` (:ref:`Tye et al. 2005 `; :ref:`Vallano and Sparks, 2007 `).
+The nitrogen deposition flux is assumed to enter the NH\ :sub:`4`\ :sup:`+` pool, and is vertically distributed throughout the soil profile. Although N deposition inputs include both oxidized and reduced forms, CLM5.0 and CLM6.0 only read in total N deposition. This approach is held over from CLM4.0, which only represented a single mineral nitrogen pool, however, real pathways for wet and dry nitrogen deposition can be more complex than currently represented in CLM, including release from melting snowpack and direct foliar uptake of deposited NO\ :sub:`y` (:ref:`Tye et al. 2005 `; :ref:`Vallano and Sparks, 2007 `).
-In offline (uncoupled) CLM5.0 simulations monthly estimates of N deposition are provided, as opposed to decadal files supplied with previous versions of the model. In coupled simulations, N depositions fluxes are passed to the land model at the frequency of the time step (every half hour) through the coupler.
+As of CLM5.0, in off line (uncoupled) simulations monthly estimates of N deposition are provided, In coupled simulations, N depositions fluxes are passed to the land model at the frequency of the time step (every half hour) through the coupler.
Biological Nitrogen Fixation
---------------------------------
+The fixation of new reactive nitrogen from atmospheric N\ :sub:`2` by soil microorganisms is an important component of both preindustrial and modern-day nitrogen budgets, but a mechanistic understanding of global-scale controls on biological nitrogen fixation (BNF) is still only poorly developed (:ref:`Cleveland et al. 1999 `; :ref:`Galloway et al. 2004 `). CLM5 introduced a new representation of biological nitrogen fixation (BNF) that includes both symbiotic and free-living (asymbiotic) components. The symbiotic component is calculated using the Fixation and Uptake of Nitrogen (FUN) model (chapter :numref:`rst_FUN`) to calculate the carbon cost of nitrogen fixation and the amount of nitrogen acquired through symbiotic fixation. This nitrogen is immediately available to plants. One drawback to this approach is that under elevated CO2, when plant productivity increases, FUN predicts increased rates of symbiotic nitrogen fixation, which may not be realistic (:ref:`Wieder et al. 2019 `; :ref:`Kou-Giesbrecht et al. 2025 `). Future work should address this issue.
-The fixation of new reactive nitrogen from atmospheric N\ :sub:`2` by soil microorganisms is an important component of both preindustrial and modern-day nitrogen budgets, but a mechanistic understanding of global-scale controls on biological nitrogen fixation (BNF) is still only poorly developed (:ref:`Cleveland et al. 1999 `; :ref:`Galloway et al. 2004 `). CLM5.0 uses the FUN model (chapter :numref:`rst_FUN`) to calculate the carbon cost and nitrogen acquired through symbotic nitrogen fixation. This nitrogen is immediately available to plants.
-
-:ref:`Cleveland et al. (1999) ` suggested an empirical relationships that predicts BNF as a function of either evapotranspiration rate or net primary productivity for natural vegetation. CLM5.0 adopts the evapotranspiration approach to calculate asymbiotic, or free-living, N fixation. This function has been modified from the :ref:`Cleveland et al. (1999) ` estimates to provide lower estimate of free-living nitrogen fixation in CLM5.0 (:math:`{CF}_{ann\_ET}`, mm yr\ :sup:`-1`). This moves away from the NPP approach used in CLM4.0 and 4.5 and avoids unrealistically increasing freeliving rates of N fixation under global change scenarios (:ref:`Wieder et al. 2015 ` The expression used is:
+The free-living component is calculated using an empirical relationship following :ref:`Cleveland et al. (1999) ` who suggested using either evapotranspiration rate or net primary productivity to predicts rates of BNF for natural vegetation. CLM5.0 adopted the evapotranspiration approach to calculate asymbiotic, or free-living, N fixation. This function has been modified from the :ref:`Cleveland et al. (1999) ` estimates to provide lower estimate of free-living nitrogen fixation in CLM (:math:`{CF}_{ann\_ET}`, mm yr\ :sup:`-1`). This moves away from the NPP approach used in CLM4.0 and 4.5 and avoids unrealistically increasing freeliving rates of N fixation under global change scenarios (:ref:`Wieder et al. 2015 `). The expression used is:
.. math::
:label: 22.1)
NF_{nfix,sminn} ={0.0006\left(0.0117+CF_{ann\_ ET}\right)\mathord{\left/ {\vphantom {0.0006\left(0.0117+ CF_{ann\_ ET}\right) \left(86400\cdot 365\right)}} \right.} \left(86400\cdot 365\right)}
-Where :math:`{NF}_{nfix,sminn}` (gN m\ :sup:`-2` s\ :sup:`-1`) is the rate of free-living nitrogen fixation in :numref:`Figure Biological nitrogen fixation`.
-
-.. _Figure Biological nitrogen fixation:
-
-.. figure:: image1.png
-
- Free-living nitrogen fixation as a function of annual evapotranspiration. Results here show annual N inputs from free-living N fixations, but the model actually calculates inputs on a per second basis.
-
-As with Atmospheric N deposition, free-living N inputs are added directly to the NH\ :sub:`4`\ :sup:`+` pool.
+Where :math:`{NF}_{nfix,sminn}` (gN m\ :sup:`-2` s\ :sup:`-1`) is the rate of free-living nitrogen fixation, calculated on a per second basis. As with atmospheric N deposition, free-living N inputs are added directly to the soil NH\ :sub:`4`\ :sup:`+` pool.
Nitrification and Denitrification Losses of Nitrogen
---------------------------------------------------------
-Nitrification is an autotrophic process that converts less mobile ammonium ions into nitrate, that can more easily be lost from soil systems by leaching or denitrification. The process catalyzed by ammonia oxidizing archaea and bacteria that convert ammonium (NH\ :sub:`4`\ :sup:`+`) into nitrite, which is subsequently oxidized into nitrate (NO\ :sub:`3`\ :sup:`-`). Conditions favoring nitrification include high NH\ :sub:`4`\ :sup:`+` concentrations, well aerated soils, a neutral pH and warmer temperatures.
+Nitrification is an autotrophic process that converts less mobile ammonium ions into nitrate, that can more easily be lost from soil systems by leaching or denitrification. The process catalyzed by ammonia oxidizing archaea and bacteria that convert ammonium (NH\ :sub:`4`\ :sup:`+`) into nitrite, which is subsequently oxidized into nitrate (NO\ :sub:`3`\ :sup:`-`). Conditions favoring nitrification include high NH\ :sub:`4`\ :sup:`+` concentrations, well aerated soils, a neutral pH, and warmer temperatures.
Under aerobic conditions in the soil oxygen is the preferred electron acceptor supporting the metabolism of heterotrophs, but anaerobic conditions favor the activity of soil heterotrophs which use nitrate as an electron acceptor (e.g. *Pseudomonas* and *Clostridium*) supporting respiration. This process, known as denitrification, results in the transformation of nitrate to gaseous N\ :sub:`2`, with smaller associated production of NO\ :sub:`x` and N\ :sub:`2`\ O. It is typically assumed that nitrogen fixation and denitrification were approximately balanced in the preindustrial biosphere ( :ref:`Galloway et al. 2004 `). It is likely that denitrification can occur within anaerobic microsites within an otherwise aerobic soil environment, leading to large global denitrification fluxes even when fluxes per unit area are rather low (:ref:`Galloway et al. 2004 `).
@@ -70,7 +47,7 @@ CLM includes a detailed representation of nitrification and denitrification base
f_{nitr,p} =\left[NH_{4} \right]k_{nitr} f\left(T\right)f\left(H_{2} O\right)f\left(pH\right)
-where :math:`{f}_{nitr,p}` is the potential nitrification rate (prior to competition for NH\ :sub:`4`\ :sup:`+` by plant uptake and N immobilization), :math:`{k}_{nitr}` is the maximum nitrification rate (10 % day\ :math:`\mathrm{-}`\ 1, (:ref:`Parton et al. 2001 `), and *f(T)* and *f(H\)*\ :sub:`2`\ O) are rate modifiers for temperature and moisture content. CLM uses the same rate modifiers as are used in the decomposition routine. *f(pH)* is a rate modifier for pH; however, because CLM does not calculate pH, instead a fixed pH value of 6.5 is used in the pH function of :ref:`Parton et al. (1996) `.
+where :math:`{f}_{nitr,p}` is the potential nitrification rate (prior to competition for NH\ :sub:`4`\ :sup:`+` by plant uptake and N immobilization), :math:`{k}_{nitr}` is the maximum nitrification rate (10 % day\ :math:`\mathrm{-}`\ 1, (:ref:`Parton et al. 2001 `), and *f(T)* and *f(H\)*\ :sub:`2`\ O) are rate modifiers for temperature and moisture content. CLM uses the same rate modifiers as are used in the decomposition routine. *f(pH)* is a rate modifier for pH. Although new surface datasets in CLM6.0 provide gridded estimates for soil pH, this information is not currently being used in the model. Instead, a fixed pH value of 6.5 is used in the pH function of :ref:`Parton et al. (1996) `.
The potential denitrification rate is co-limited by NO\ :sup:`-3` concentration and C consumption rates, and occurs only in the anoxic fraction of soils:
@@ -86,7 +63,7 @@ where :math:`{f}_{denitr,p}` is the potential denitrification rate and *f(decomp
frac_{anox} =\exp \left(-aR_{\psi }^{-\alpha } V^{-\beta } C^{\gamma } \left[\theta +\chi \varepsilon \right]^{\delta } \right)
-where *a*, :math:`\alpha`, :math:`\beta`, :math:`\gamma`, and :math:`\delta` are constants (equal to 1.5x10\ :sup:`-10`, 1.26, 0.6, 0.6, and 0.85, respectively), :math:`{R}_{\psi}` is the radius of a typical pore space at moisture content :math:`\psi`, *V* is the O\ :sub:`2` consumption rate, *C* is the O\ :sub:`2` concentration, :math:`\theta` is the water-filled pore space, :math:`\chi` is the ratio of diffusivity of oxygen in water to that in air, and :math:`\epsilon` is the air-filled pore space (:ref:`Arah and Vinten (1995) `). These parameters are all calculated separately at each layer to define a profile of anoxic porespace fraction in the soil.
+where :math:`a` :math:`\alpha`, :math:`\beta`, :math:`\gamma`, and :math:`\delta` are constants (equal to 1.5x10\ :sup:`-10`, 1.26, 0.6, 0.6, and 0.85, respectively), :math:`{R}_{\psi}` is the radius of a typical pore space at moisture content :math:`\psi`, :math:`V` is the O\ :sub:`2` consumption rate, :math:`C` is the O\ :sub:`2` concentration, :math:`\theta` is the water-filled pore space, :math:`\chi` is the ratio of diffusivity of oxygen in water to that in air, and :math:`\epsilon` is the air-filled pore space (:ref:`Arah and Vinten 1995 `). These parameters are all calculated separately at each layer to define a profile of anoxic porespace fraction in the soil.
The nitrification/denitrification models used here also predict fluxes of N\ :sub:`2`\ O via a "hole-in-the-pipe" approach (:ref:`Firestone and Davidson, 1989 `). A constant fraction (6 * 10\ :math:`{}^{-4}`, :ref:`Li et al. 2000 `) of the nitrification flux is assumed to be N\ :sub:`2`\ O, while the fraction of denitrification going to N\ :sub:`2`\ O, \ :math:`{P}_{N2:N2O}`, is variable, following the Century (:ref:`del Grosso et al. 2000 `) approach:
@@ -136,8 +113,9 @@ where :math:`{WS}_{tot\_soil}` (kgH\ :sub:`2`\ O m\ :sup:`-2`) is the total mass
Alternative way of evaluating the Leaching Losses of Nitrogen
--------------------------------------------------------------
-The previous leaching mechanism is not designed for describing the vertical transport of :math:`{NO}_{3}^{-}` in soil, an alternative way to evaluate the vertical convective, diffusive, and dispersive of dissolved :math:`{NO}_{3}^{-}` in soil is provided in (:ref:`Luo et al. 2025 `).
-To obtain the vertical profile of soil mineral N after vertical movement of each timestep, the vertical transport equation is summarized in :eq:`22.20`.
+Leaching losses of :math:`{NO}_{3}^{-}` are notably low in CLM because of low rates of nitrification and high plant N uptake (:ref:`Houlton et al. 2015 `, :ref:`Nevison et al. 2022 `). Future work should address these biases.
+
+Towards this end, the previous leaching mechanism is not designed for describing the vertical transport of :math:`{NO}_{3}^{-}` in soil, an alternative way to evaluate the vertical convective, diffusive, and dispersive of dissolved :math:`{NO}_{3}^{-}` in soil is provided in (:ref:`Luo et al. 2025 `). This is option is not active by default in CLM6.0, but can be activated by the user. To obtain the vertical profile of soil mineral N after vertical movement of each timestep, the vertical transport equation is summarized in :eq:`22.20`.
.. math::
:label: 22.20
diff --git a/doc/source/tech_note/External_Nitrogen_Cycle/image1.png b/doc/source/tech_note/External_Nitrogen_Cycle/image1.png
deleted file mode 100755
index b28b5d1894..0000000000
--- a/doc/source/tech_note/External_Nitrogen_Cycle/image1.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f3acfbbb90ad0c44ff7179a257c44f59d4b0b5a0da348825b02aa5034bee1640
-size 29009
diff --git a/doc/source/tech_note/FUN/CLM50_Tech_Note_FUN.rst b/doc/source/tech_note/FUN/CLM50_Tech_Note_FUN.rst
index 1c4a43deb6..fb69877849 100644
--- a/doc/source/tech_note/FUN/CLM50_Tech_Note_FUN.rst
+++ b/doc/source/tech_note/FUN/CLM50_Tech_Note_FUN.rst
@@ -6,7 +6,7 @@ Fixation and Uptake of Nitrogen (FUN)
Introduction
-----------------
-The Fixation and Uptake of Nitrogen model is based on work by :ref:`Fisher et al. (2010)`, :ref:`Brzostek et al. (2014)`, and :ref:`Shi et al. (2016)`. The concept of FUN is that in most cases, Nitrogen uptake requires the expenditure of energy in the form of carbon, and further, that there are numerous potential sources of Nitrogen in the environment which a plant may exchange for carbon. The ratio of carbon expended to Nitrogen acquired is referred to here as the cost, or exchange rate, of N acquisition (:math:`E_{nacq}`, gC/gN)). There are eight pathways for N uptake:
+The Fixation and Uptake of Nitrogen model (FUN) is based on work by :ref:`Fisher et al. (2010)`, :ref:`Brzostek et al. (2014)`, and :ref:`Shi et al. (2016)`, as described in :ref:`Fisher et al. (2019)`.The concept of FUN is that in most cases, nitrogen (N) uptake requires the expenditure of energy in the form of carbon (C), and further, that there are numerous potential sources of N in the environment which a plant may exchange for C. The ratio of carbon expended to nitrogen acquired is referred to here as the cost, or exchange rate, of N acquisition (:math:`E_{nacq}`, gC/gN)). There are eight pathways for N uptake:
1. Fixation by symbiotic bacteria in root nodules (for N fixing plants) (:math:`_{fix}`)
2. Retranslocation of N from senescing tissues (:math:`_{ret}`)
@@ -17,12 +17,14 @@ The Fixation and Uptake of Nitrogen model is based on work by :ref:`Fisher et al
7. Nonmycorrhizal uptake of NH4 (:math:`_{nonmyc,nh4}`)
8. Nonmycorrhizal uptake of NO3 (:math:`_{nonmyc,no3}`)
-The notation suffix for each pathway is given in parentheses here. At each timestep, each of these pathways is associated with a cost term (:math:`N_{cost,x}`), a payment in carbon (:math:`C_{nuptake,x}`), and an influx of Nitrogen (:math:`N_{uptake,x}`) where :math:`x` is one of the eight uptake streams listed above.
+The notation suffix for each pathway is given in parentheses here. At each timestep, each of these pathways is associated with a cost term (:math:`N_{cost,x}`), a payment in carbon (:math:`C_{nuptake,x}`), and an influx of nitrogen (:math:`N_{uptake,x}`) where :math:`x` is one of the eight uptake streams listed above.
-For each PFT, we define a fraction of the total C acquisition that can be used for N fixation (:math:`f_{fixers}`), which is broadly equivalent to the fraction of a given PFT that is capable of fixing Nitrogen, and thus represents an upper limit on the amount to which fixation can be increased in low n conditions. For each PFT, the cost calculation is conducted twice. Once where fixation is possible and once where it is not. (:math:`f_{fixers}`)
+For each PFT, we define a fraction of the total C acquisition that can be used for N fixation (:math:`f_{fixers}`), which is broadly equivalent to the fraction of a given PFT that is capable of fixing Nitrogen, and thus represents an upper limit on the amount to which fixation can be increased in low N conditions. For each PFT, the cost calculation is conducted twice. Once where fixation is possible and once where it is not (:math:`f_{fixers}`).
For all of the active uptake pathways, whose cost depends on varying concentrations of N through the soil profile, the costs and fluxes are also determined by soil layer :math:`j`.
+Notable changes to FUN in CLM6 include: (1) Updated the emperical function describing the temperature sensitivity of nitrogen fixation (:ref:`Bytnerowicz et al. 2022`). (2) Corrected an error in the parameter values for nonmycorrhizal uptake of inorganic N that was published in :ref:`Brzostek et al. (2014)`. And (3) introduced an empirical function that adjusts target leaf C:N ratios with atmospheric concentrations of CO\ :sub:`2` (:ref:`Hauser et al 2023`, this is documented in section :numref:`rst_CN Pools` and is turned off by default in CLM6). We also acknowledge that previously identified limitations of the implementation of FUN in CLM remain. These include a reduction in interannual variability of net ecosystem productivity (:ref:`Wieder et al. 2021`) and strong increases in rates of symbiotic nitrogen fixation under elevated CO\ :sub:`2` (:ref:`Wieder et al. 2019 `; :ref:`Kou-Giesbrecht et al. 2025 `). Future work should address these issues.
+
Boundary conditions of FUN
--------------------------------------------------------
@@ -30,23 +32,54 @@ Available Carbon
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The carbon available for FUN, :math:`C_{avail}` (gC m\ :sup:`-2`) is the total canopy photosynthetic uptake (GPP), minus the maintenance respiration fluxes (:math:`m_r`) and multiplied by the time step in seconds (:math:`\delta t`). Thus, the remainder of this chapter considers fluxes per timestep, and integrates these fluxes as they are calculated.
- .. math::
+.. math::
+ :label: C_avail_1
C_{avail} = (GPP - m_r) \delta t
Growth respiration is thus only calculated on the part of the carbon uptake that remains after expenditure of C by the FUN module.
-Available Soil Nitrogen
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
Cost of Nitrogen Fixation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The cost of fixation is derived from :ref:`Houlton et al. (2008)`.
- .. math::
+Nitrogen fixation rates are temperature dependent. In CLM6 the carbon cost of nitrogen fixation was derived from an empirical function fit to data from a greenhouse experiment measuring nitrogen fixation by woody plants from :ref:`Bytnerowicz et al. (2022)`. CLM5 used a different empirical function to describe the temperature dependence of nitrogenase activity from :ref:`Houlton et al. (2008)`.
+
+This Bytnerowicz formulation (:math:`F_B`) defines a temperature dependent N fixation rate function as:
+
+.. math::
+ :label: F_B
+
+ F_{B} = \left(\frac{T_{max} - T_{soil}}{T_{max} - T_{opt}}\right) \left(\frac{T_{soil} - T_{min}}{T_{opt} - T_{min}}\right)^{\frac{T_{opt}-T_{min}}{T_{max}-T_{opt}}}
+
+where :math:`T_{soil}` is soil temperature (°C), and :math:`T_{min}`, :math:`T_{opt}` , and :math:`T_{max}` define the lower bound, optimum, and upper bound of the biome-specific temperature response. The function is unitless and bounded between 0 and 1. The function is calculated separately for each soil layer and weighted by the fraction of roots present in that layer. The rate function is interpreted as a conductance like term for N acquisition, and its inverse is used to represent a temperature-limited carbon cost of nitrogen fixation (:math:`N_{cost,fix}`) to give a temperature limited cost in terms of C to N ratios:
+
+.. math::
+ :label: N_cost_fix_1
+
+ N_{cost,fix} = \frac{S_{fix}}{F_{B}}
+
+The minimum cost of N fixation, :math:`S_{fix}`, occurs at :math:`T_{opt}` and is set as 6 gC :math:`\mathrm{gN}^{-1}`. When soil temperature falls outside the range of :math:`T_{min}` and :math:`T_{max}`, the cost of fixation is set to an arbitrarily large value (10\ :sup:`9`) to effectively suppress N fixation. Parameters for :math:`T_{min}`, :math:`T_{opt}`, :math:`T_{max}` differ between tropical and extra tropical plant functional types (PFTs), following the biome specific estimates reported by :ref:`Bytnerowicz et al. (2022)`. Parameter values for tropical and extra-tropical PFTs are as follows:
+
+\ Tropical: :math:`T_{min}` =7.04, :math:`T_{opt}` =33.22, and :math:`T_{max}` =45.35.
+
+\ Extra-tropical: :math:`T_{min}` =−2.04, :math:`T_{opt}` =32.10, and :math:`T_{max}` =43.98.
+
+
+The Houlton function used in CLM5 the cost of fixation (:math:`N_{cost,fix}`) calculated as:
+
+.. math::
+ :label: N_cost_fix_2
+
+ N_{cost,fix} = -S_{fix}/(1.25 e^{a_{fix} + b_{fix} . T_{soil} (1 - 0.5 T_{soil}/ c_{fix}) })
+
+Herein, :math:`a_{fix}`, :math:`b_{fix}` and :math:`c_{fix}` are all parameters of the temperature response function of fixation reported by Houlton et al. (2008) (:math:`exp[a+bT_{soil}(1-0.5T_{soil}/c)]`). :math:`T_{soil}` is the soil temperature in C. The values of these parameters are fitted to empirical data as a=-3.62 :math:`\pm` 0.52, b=0.27 :math:`\pm` 0.04 and c=25.15 :math:`\pm` 0.66. The hardwired coefficient 1.25 converts from the temperature response function to a 0-1 limitation factor (as specifically employed by Houlton et al.). This function is a 'rate' of uptake for a given temperature. Here we assimilated the rate of fixation into the cost term by assuming that the rate is analogous to a conductance for N, and inverting the term to produce a cost/resistance analogue. We then multiply this temperature term by the minimum cost at optimal temperature (:math:`S_{fix}`) to give a temperature limited cost in terms of C to N ratios.
+
+.. _Figure Carbon costs of N fixation as a function of soil temperature:
+
+.. figure:: image1.png
+
+ Figure Carbon costs of N fixation as a function of soil temperature. Bytnerowicz et al(2022) function for tropical and extra-tropical PFTs (red and blue lines, respectively) that are used in CLM6; and the Houlton et al (2008) function (black line) that was used in CLM5.
- N_{cost,fix} = -s_{fix}/(1.25 e^{a_{fix} + b_{fix} . t_{soil} (1 - 0.5 t_{soil}/ c_{fix}) })
-Herein, :math:`a_{fix}`, :math:`b_{fix}` and :math:`c_{fix}` are all parameters of the temperature response function of fixation reported by Houlton et al. (2008) (:math:`exp[a+bT_s(1-0.5T_s/c)`). t_{soil} is the soil temperature in C. The values of these parameters are fitted to empirical data as a=-3.62 :math:`\pm` 0.52, b=0.27:math:`\pm` 0.04 and c=25.15 :math:`\pm` 0.66. 1.25 converts from the temperature response function to a 0-1 limitation factor (as specifically employed by Houlton et al.). This function is a 'rate' of uptake for a given temperature. Here we assimilated the rate of fixation into the cost term by assuming that the rate is analagous to a conductance for N, and inverting the term to produce a cost/resistance analagoue. We then multiply this temperature term by the minimum cost at optimal temperature (:math:`s_{fix}`) to give a temperature limited cost in terms of C to N ratios.
Cost of Active Uptake
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -55,20 +88,22 @@ The cost of N uptake from soil, for each layer :math:`j`, is controlled by two u
For non-mycorrhizal uptake:
- .. math::
+.. math::
+ :label: N_cost,nonmyc,j
N_{cost,nonmyc,j} = \frac{k_{n,nonmyc}}{N_{smin,j}} + \frac{k_{c,nonmyc}}{c_{root,j}}
and for active uptake:
- .. math::
+.. math::
+ :label: N_cost,active,j
N_{cost,active,j} = \frac{k_{n,active}}{N_{smin,j}} + \frac{k_{c,active}}{c_{root,j}}
where :math:`k_{n,active}` varies according to whether we are considering ecto or arbuscular mycorrhizal uptake.
- .. math::
- :label: 18.2
+.. math::
+ :label: k_n,active
k_{n,active} =
\left\{\begin{array}{lr}
@@ -76,39 +111,48 @@ where :math:`k_{n,active}` varies according to whether we are considering ecto o
k_{n,Aactive}& e = 0
\end{array}\right\}
-where m=1 pertains to the fraction of the PFT that is ecotmycorrhizal, as opposed to arbuscular mycorrhizal.
+where e = 1 pertains to the fraction of the PFT that is ectomycorrhizal, as opposed to arbuscular mycorrhizal.
+
+CLM6 corrects an error in the calculation of non-mycorrhizal uptake in CLM5, which had swapped parameter values for :math:`k_{c,nonmyc}` and :math:`k_{n,nonmyc}` that were inherited from the original publication of :ref:`Brzostek et al. (2014)`.
Resolving N cost across simultaneous uptake streams
--------------------------------------------------------
-The total cost of N uptake is calculated based on the assumption that carbon is partitioned to each stream in proportion to the inverse of the cost of uptake. So, more expensive pathways receive less carbon. Earlier versions of FUN :ref:`(Fisher et al., 2010)`) utilized a scheme whereby plants only took up N from the cheapest pathway. :ref:`Brzostek et al. (2014)` introduced a scheme for the simultaneous uptake from different pathways. Here we calcualate a 'conductance' to N uptake (analagous to the inverse of the cost function conceptualized as a resistance term) :math:`N_{conductance}` ( gN/gC) as:
+The total cost of N uptake is calculated based on the assumption that carbon is partitioned to each stream in proportion to the inverse of the cost of uptake. So, more expensive pathways receive less carbon. Earlier versions of FUN :ref:`(Fisher et al. 2010`) utilized a scheme whereby plants only took up N from the cheapest pathway. :ref:`Brzostek et al. (2014)` introduced a scheme for the simultaneous uptake from different pathways. Here we calculate a 'conductance' to N uptake (analogous to the inverse of the cost function conceptualized as a resistance term) :math:`N_{conductance}` (gN/gC) as:
- .. math::
+.. math::
+ :label: N_conductance
- N_{conductance,f}= \sum{(1/N_{cost,x})}
+ N_{conductance}= \sum{(1/N_{cost,x})}
From this, we then calculate the fraction of the carbon allocated to each pathway as
- .. math::
+.. math::
+ :label: C_frac,x
C_{frac,x} = \frac{1/N_{cost,x}}{N_{conductance}}
These fractions are used later, to calculate the carbon expended on different uptake pathways. Next, the N acquired from each uptake stream per unit C spent (:math:`N_{exch,x}`, gN/gC) is determined as
- .. math::
+.. math::
+ :label: N_exch,x
N_{exch,x} = \frac{C_{frac,x}}{N_{cost,x}}
We then determine the total amount of N uptake per unit C spent (:math:`N_{exch,tot}`, gN/gC) as the sum of all the uptake streams.
- .. math::
+.. math::
+ :label: N_exch,tot
+
N_{exch,tot} = \sum{N_{exch,x}}
and thus the subsequent overall N cost is
- .. math::
+.. math::
+ :label: N_cost,tot
+
N_{cost,tot} = 1/{N_{exch,tot}}
- Retranslocation is determined via a different set of mechanisms, once the :math:`N_{cost,tot}` is known.
+Retranslocation is determined via a different set of mechanisms, once the :math:`N_{cost,tot}` is known.
Nitrogen Retranslocation
--------------------------------------------------------
@@ -116,37 +160,42 @@ The retranslocation uses an iterative algorithm to remove Nitrogen from each pie
At each timestep, the pool of carbon in falling leaves (:math:`C_{fallingleaf}`, g m\ :sup:`-2`) is generated from the quantity of litterfall on that day (see Phenology chapter for details). The amount of N in the litter pool (:math:`N_{fallingleaf}`, g m\ :sup:`-2`) is calculated as the total leaf N multiplied by the fraction of the leaf pool passed to litter that timestep.
- .. math::
+.. math::
+ :label: N_fallingleaf_1
- N_{fallingleaf} = N_{leaf}.C_{fallingleaf}/C_{leaf}
+ N_{fallingleaf} = N_{leaf}.C_{fallingleaf}/C_{leaf}
The carbon available at the beginning of the iterative retranslocation calculation is equal to the :math:`C_{avail}` input into FUN.
- .. math::
+.. math::
+ :label: C_avail,retrans,0
- C_{avail,retrans,0} = C_{avail}
+ C_{avail,retrans,0} = C_{avail}
Free Retranslocation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some part of the leaf Nitrogen pool is removed without the need for an C expenditure. This 'free' N uptake amount, (:math:`N_{retrans,free}`, gN m\ :sup:`-2`) is calculated as
- .. math::
+.. math::
+ :label: N_retrans,free
- N_{retrans,free} = max(N_{fallingleaf} - (C_{fallingleaf}/CN_{litter,min} ),0.0)
+ N_{retrans,free} = max(N_{fallingleaf} - (C_{fallingleaf}/CN_{litter,min} ),0.0)
where :math:`CN_{litter,min}` is the minimum C:N ratio of the falling litter (currently set to 1.5 x the target C:N ratio).
The new :math:`N_{fallingleaf}` (gN m\ :sup:`-2`) is then determined as
- .. math::
+.. math::
+ :label: N_fallingleaf_2
- N_{fallingleaf} = N_{fallingleaf} - N_{retrans,free}
+ N_{fallingleaf} = N_{fallingleaf} - N_{retrans,free}
and the new litter C:N ratio as
- .. math::
+.. math::
+ :label: CN_fallingleaf
- CN_{fallingleaf}=C_{fallingleaf}/N_{fallingleaf}
+ CN_{fallingleaf}=C_{fallingleaf}/N_{fallingleaf}
Paid-for Retranslocation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -158,139 +207,166 @@ The remaining calculations conduct an iterative calculation to determine the deg
First we calculate the cost of extraction (:math:`cost_{retrans}`, gC/gN) for the current leaf C:N ratio as
- .. math::
+.. math::
+ :label: cost_retrans
+
+ cost_{retrans}= k_{retrans} / (1/CN_{fallingleaf})^{1.3}
- cost_{retrans}= k_{retrans} / (1/CN_{fallingleaf})^{1.3}
+where :math:`k_{retrans}` is a parameter controlling the overall cost of resorption, which also increases exponentially as the C:N ratio increases.
-where :math:`k_{retrans}` is a parameter controlling the overall cost of resorption, which also increases exponentially as the C:N ratio increases
+Next, we calculate the amount of C needed to be spent to increase the falling leaf C:N ratio by 1.0 in this iteration
+:math:`i` (:math:`C_{retrans,spent,i}`, gC m\ :sup:`-2`) as:
-Next, we calculate the amount of C needed to be spent to increase the falling leaf C:N ratio by 1.0 in this iteration :math:`i` (:math:`C_{retrans_spent,i}`, gC m\ :sup:`-2`) as:
- .. math::
+.. math::
+ :label: C_retrans,spent,i_1
- C_{retrans,spent,i} = cost_{retrans}.(N_{fallingleaf} - C_{fallingleaf}/
+ C_{retrans,spent,i} = cost_{retrans}.(N_{fallingleaf} - C_{fallingleaf}/
(CN_{fallingleaf} + 1.0))
(wherein the retranslocation cost is assumed to not change over the increment of 1.0 in C:N ratio). Next, we calculate whether this is larger than the remaining C available to spend.
- .. math::
+.. math::
+ :label: C_retrans,spent,i_2
- C_{retrans,spent,i} = min(C_{retrans,spent,i}, C_{avail,retrans,i})
+ C_{retrans,spent,i} = min(C_{retrans,spent,i}, C_{avail,retrans,i})
-The amount of N retranslocated from the leaf in this iteration (:math:`N_{retrans_paid,i}`, gN m\ :sup:`-2`) is calculated, checking that it does not fall below zero:
+The amount of N retranslocated from the leaf in this iteration (:math:`N_{retrans,paid,i}`, gN m\ :sup:`-2`) is calculated, checking that it does not fall below zero:
- .. math::
+.. math::
+ :label: N_retrans,paid,i
- N_{retrans,paid,i} = min(N_{fallingleaf},C_{retrans,spent,i} / cost_{retrans})
+ N_{retrans,paid,i} = min(N_{fallingleaf},C_{retrans,spent,i} / cost_{retrans})
The next step calculates the growth C which is accounted for by this amount of N extraction in this iteration (:math:`C_{retrans,accounted,i}`). This is calculated using the current plant C:N ratio, and also for the additional C which will need to be spent on growth respiration to build this amount of new tissue.
- .. math::
+.. math::
+ :label: C_retrans,accouned,i
- C_{retrans,accounted,i} = N_{retrans,paid,i} . CN_{plant} . (1.0 + gr_{frac})
+ C_{retrans,accounted,i} = N_{retrans,paid,i} . CN_{plant} . (1.0 + gr_{frac})
Then the falling leaf N is updated:
- .. math::
+.. math::
+ :label: N_fallingleaf_3
- N_{fallingleaf} = N_{fallingleaf} - N_{ret,i}
+ N_{fallingleaf} = N_{fallingleaf} - N_{ret,i}
-and the :math:`CN_{fallingleaf}` and cost_{retrans} are updated. The amount of available carbon that is either unspent on N acquisition nor accounted for by N uptake is updated:
+and the :math:`CN_{fallingleaf}` and :math:`cost_{retrans}` are updated. The amount of available carbon that is either unspent on N acquisition nor accounted for by N uptake is updated:
- .. math::
+.. math::
+ :label: C_avail,retrans,i+1
- C_{avail,retrans,i+1} = C_{avail,retrans,i} - C_{retrans,spent,i} - C_{retrans,accounted,i}
+ C_{avail,retrans,i+1} = C_{avail,retrans,i} - C_{retrans,spent,i} - C_{retrans,accounted,i}
Outputs of Retranslocation algorithm.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The final output of the retranslocation calculation are the retranslocated N (:math:`N_{retrans}`, gN m\ :sup:`-2`), C spent on retranslocation (:math:`C_{retrans_paid}`, gC m\ :sup:`-2`), and C accounted for by retranslocation (:math:`C_{retrans_accounted}`, gC m\ :sup:`-2`).
+The final output of the retranslocation calculation are the retranslocated N (:math:`N_{retrans}`, gN m\ :sup:`-2`), C spent on retranslocation (:math:`C_{retrans,paid}`, gC m\ :sup:`-2`), and C accounted for by retranslocation (:math:`C_{retrans,accounted}`, gC m\ :sup:`-2`).
-For paid-for uptake, we accumulate the total carbon spent on retranslocation (:math:`C_{spent_retrans}`),
+For paid-for uptake, we accumulate the total carbon spent on retranslocation (:math:`C_{spent,retrans}`),
- .. math::
+.. math::
+ :label: C_retrans,spent
- C_{retrans,spent} = \sum{C_{retrans,i}}
+ C_{retrans,spent} = \sum{C_{retrans,i}}
The total N acquired from retranslocation is
- .. math::
+.. math::
+ :label: N_retrans
- N_{retrans} = N_{retrans,paid}+N_{retrans,free}
+ N_{retrans} = N_{retrans,paid}+N_{retrans,free}
where N acquired by paid-for retranslocation is
- .. math::
+.. math::
+ :label: N_retrans,paid
- N_{retrans,paid} = \sum{N_{retrans,paid,i}}
+ N_{retrans,paid} = \sum{N_{retrans,paid,i}}
-The total carbon accounted for by retranslocation is the sum of the C accounted for by paid-for N uptake (:math:`N_{retrans_paid}`) and by free N uptake (:math:`N_{retrans_free}`).
+The total carbon accounted for by retranslocation is the sum of the C accounted for by paid-for N uptake (:math:`N_{retrans,paid}`) and by free N uptake (:math:`N_{retrans,free}`).
- .. math::
+.. math::
+ :label: C_retrans,accounted
- C_{retrans,accounted} = \sum{C_{retrans,accounted,i}}+N_{retrans,free}.CN_{plant} . (1.0 + gr_{frac})
+ C_{retrans,accounted} = \sum{C_{retrans,accounted,i}}+N_{retrans,free}.CN_{plant} . (1.0 + gr_{frac})
The total available carbon in FUN to spend on fixation and active uptake (:math:`C_{tospend}`, gC m\ :sup:`-2`) is calculated as the carbon available minus that account for by retranslocation:
- .. math::
+.. math::
+ :label: C_tospend
- C_{tospend} = C_{avail} - C_{retrans,accounted}
+ C_{tospend} = C_{avail} - C_{retrans,accounted}
Carbon expenditure on fixation and active uptake.
--------------------------------------------------------
At each model timestep, the overall cost of N uptake is calculated (see below) in terms of C:N ratios. The available carbon (:math:`C_{avail}`, g m\ :sup:`-2` s\ :sup:`-1`) is then allocated to two alternative outcomes, payment for N uptake, or conservation for growth. For each carbon conserved for growth, a corresponding quantity of N must be made available. In the case where the plant target C:N ratio is fixed, the partitioning between carbon for growth (:math:`C_{growth}`) and carbon for N uptake (:math:`C_{nuptake}`) is calculated by solving a system of simultaneous equations. First, the carbon available must equal the carbon spent on N uptake plus that saved for growth.
- .. math::
+.. math::
+ :label: C_avail_2
C_{growth}+C_{nuptake}=C_{avail}
Second, the nitrogen acquired from expenditure of N (left hand side of term below) must equal the N that is required to match the growth carbon (right hand side of term below).
- .. math::
+.. math::
+ :label: C_nuptake_over_N_cost
C_{nuptake}/N_{cost} =C_{growth}/CN_{target}
The solution to these two equated terms can be used to estimate the ideal :math:`C_{nuptake}` as follows,
- .. math::
+.. math::
+ :label: C_nuptake_1
+
C_{nuptake} =C_{tospend}/ ( (1.0+f_{gr}*(CN_{target} / N_{cost}) + 1) .
and the other C and N fluxes can be determined following the logic above.
Modifications to allow variation in C:N ratios
--------------------------------------------------------
-The original FUN model as developed by :ref:`Fisher et al. (2010)` and :ref:`Brzostek et al. (2014)` assumes a fixed plant tissue C:N ratio. This means that in the case where N is especially limiting, all excess carbon will be utilized in an attempt to take up more Nitrogen. It has been repeatedly observed, however, that in these circumstances in real life, plants have some flexibility in the C:N stoichiometry of their tissues, and therefore, this assumption may not be realistic. However, the degree to which the C:N ratio varies with N availability is poorly documented, and existing global nitrogen models use a variety of heuristic methods by which to incorporate changing C:N ratios (Zaehle and Friend 2010; Ghimire et al. 2016). This algorithm exists as a placeholder to allow variable C:N ratios to occur, and to allow exploration of how much the parameters controlling their flexibility has on model outcomes. Incorporation of emerging understanding of the controls on tissue stoichiometry should ultimately replace this scheme.
+The original FUN model as developed by :ref:`Fisher et al. (2010)` and :ref:`Brzostek et al. (2014)` assumes a fixed plant tissue C:N ratio. This means that in the case where N is especially limiting, all excess carbon will be utilized in an attempt to take up more nitrogen. It has been repeatedly observed, however, that in these circumstances in real life, plants have some flexibility in the C:N stoichiometry of their tissues, and therefore, this assumption may not be realistic. However, the degree to which the C:N ratio varies with N availability is poorly documented, and existing global nitrogen models use a variety of heuristic methods by which to incorporate changing C:N ratios (:ref:`Zaehle and Friend 2010`; :ref:`Ghimire et al. 2016`). This algorithm exists as a placeholder to allow variable C:N ratios to occur, and to allow exploration of how much the parameters controlling their flexibility has on model outcomes. Incorporation of emerging understanding of the controls on tissue stoichiometry should ultimately replace this scheme.
-Thus, in CLM5, we introduce the capacity for tissue C:N ratios to be prognostic, rather than static. Overall N and C availability (:math:`N_{uptake}` and :math:`C_{growth}`) and hence tissue C:N ratios, are both determined by FUN. Allocation to individual tissues is discussed in the allocation chapter
+Thus, in CLM5, we introduce the capacity for tissue C:N ratios to be prognostic, rather than static. Overall N and C availability (:math:`N_{uptake}` and :math:`C_{growth}`) and hence tissue C:N ratios, are both determined by FUN. Allocation to individual tissues is discussed in the allocation chapter. CLM5 introduced an algorithm which adjusts the C expenditure on uptake to allow varying tissue C:N ratios. Increasing C spent on uptake will directly reduce the C:N ratio, and reducing C spent on uptake (retaining more for tissue growth) will increase it. C spent on uptake is impacted by both the N cost in the environment, and the existing tissue C:N ratio of the plant. The output of this algorithm is :math:`\gamma_{FUN}`, the fraction of the ideal :math:`C_{nuptake}` calculated from the FUN equation above
-Here we introduce an algorithm which adjusts the C expenditure on uptake to allow varying tissue C:N ratios. Increasing C spent on uptake will directly reduce the C:N ratio, and reducing C spent on uptake (retaining more for tissue growth) will increase it. C spent on uptake is impacted by both the N cost in the environment, and the existing tissue C:N ratio of the plant. The output of this algorithm is :math:`\gamma_{FUN}`, the fraction of the ideal :math:`C_{nuptake}` calculated from the FUN equation above
+.. math::
+ :label: C_nuptake_2
- .. math::
C_{nuptake} = C_{nuptake}.\gamma_{FUN}
+Subsequent sensitivity tests found relatively low flexibility in the target C:N ratios resulting from this approach (:ref:`Fisher et al. 2019`). Thus, :ref:`Hauser et al. (2023)` introduced an additional function to force time evolving foliar C:N ratios to vary with atmospheric CO\ :sub:`2` concentrations as shown in Eq. :eq:`time-evolv target leaf CN` (section :numref:`rst_CN Pools`).
+
Response of C expenditure to Nitrogen uptake cost
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The environmental cost of Nitrogen (:math:`N_{cost,tot}`) is used to determine :math:`\gamma_{FUN}`.
- .. math::
+.. math::
+ :label: gamma_FUN_1
+
\gamma_{FUN} = max(0.0,1.0 - (N_{cost,tot}-a_{cnflex})/b_{cnflex})
where :math:`a_{cnflex}` and :math:`b_{cnflex}` are parameters fitted to give flexible C:N ranges over the operating range of N costs of the model. Calibration of these parameters should be subject to future testing in idealized experimental settings; they are here intended as a placeholder to allow some flexible stoichiometry, in the absence of adequate understanding of this process. Here :math:`a_{cnflex}` operates as the :math:`N_{cost,tot}` above which there is a modification in the C expenditure (to allow higher C:N ratios), and :math:`b_{cnflex}` is the scalar which determines how much the C expenditure is modified for a given discrepancy between :math:`a_{cnflex}` and the actual cost of uptake.
Response of C expenditure to plant C:N ratios
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-We first calculate a :math:`\delta_{CN}`, which is the difference between the target C:N (:math:`target_{CN}`) a model parameter, and the existing C:N ratio (:math:`CN_{plant}`)
+We first calculate a :math:`\delta_{CN}`, which is the difference between the target C:N (:math:`CN_{target}`) a model parameter (:numref:`Table Allocation and CN ratio parameters`), and the existing C:N ratio (:math:`CN_{plant}`)
- .. math::
+.. math::
+ :label: CN_plant
- CN_{plant} = \frac{C_{leaf} + C_{leaf,storage}}{N_{leaf} + N_{leaf,storage})}
+ CN_{plant} = \frac{C_{leaf} + C_{leaf,storage}}{N_{leaf} + N_{leaf,storage})}
and
- .. math::
- \delta_{CN} = CN_{plant} - target_{CN}
+
+.. math::
+ :label: delta_CN
+
+ \delta_{CN} = CN_{plant} - CN_{target}
We then increase :math:`\gamma_{FUN}` to account for situations where (even if N is expensive) plant C:N ratios have increased too far from the target. Where :math:`\delta_{CN}` is negative, we reduce C spent on N uptake and retain more C for growth
- .. math::
+.. math::
+ :label: gamma_FUN_2
\gamma_{FUN} =
\left\{\begin{array}{lr}
@@ -300,7 +376,9 @@ We then increase :math:`\gamma_{FUN}` to account for situations where (even if
We then restrict the degree to which C expenditure can be reduced (to prevent unrealistically high C:N ratios) as
- .. math::
+.. math::
+ :label: gamma_FUN_3
+
\gamma_{FUN} = max(min(1.0,\gamma_{FUN}),0.5)
Calculation of N uptake streams from active uptake and fixation
@@ -308,58 +386,68 @@ Calculation of N uptake streams from active uptake and fixation
Once the final :math:`C_{nuptake}` is known, the fluxes of C to the individual pools can be derived as
- .. math::
+.. math::
+ :label: C_nuptake,x
C_{nuptake,x} = C_{frac,x}.C_{nuptake}
- .. math::
+.. math::
+ :label: N_nuptake,x
N_{uptake,x} = \frac{C_{nuptake}}{N_{cost}}
Following this, we determine whether the extraction estimates exceed the pool size for each source of N. Where :math:`N_{active,no3} + N_{nonmyc,no3} > N_{avail,no3}`, we calculate the unmet uptake, :math:`N_{unmet,no3}`
- .. math::
+.. math::
+ :label: N_unmet,no3
N_{unmet,no3} = N_{active,no3} + N_{nonmyc,no3} - N_{avail,no3}
then modify both fluxes to account
- .. math::
+.. math::
+ :label: N_active,no3
N_{active,no3} = N_{active,no3} + N_{unmet,no3}.\frac{N_{active,no3}}{N_{active,no3}+N_{nonmyc,no3}}
- .. math::
+.. math::
+ :label: N_nonmyc,no3
N_{nonmyc,no3} = N_{nonmyc,no3} + N_{unmet,no3}.\frac{N_{nonmyc,no3}}{N_{active,no3}+N_{nonmyc,no3}}
and similarly, for NH4, where :math:`N_{active,nh4} + N_{nonmyc,nh4} > N_{avail,nh4}`, we calculate the unmet uptake, :math:`N_{unmet,no3}`
- .. math::
+.. math::
+ :label: N_unmet,nh4
N_{unmet,nh4} = N_{active,nh4} + N_{nonmyc,nh4} - N_{avail,nh4}
then modify both fluxes to account
- .. math::
+.. math::
+ :label: N_active,nh4
N_{active,nh4} = N_{active,nh4} + N_{unmet,nh4}.\frac{N_{active,nh4}}{N_{active,nh4}+N_{nonmyc,nh4}}
- .. math::
+.. math::
+ :label: N_nonmyc,nh4
N_{nonmyc,nh4} = N_{nonmyc,nh4} + N_{unmet,nh4}.\frac{N_{nonmyc,nh4}}{N_{active,nh4}+N_{nonmyc,nh4}}
and then update the C spent to account for hte new lower N acquisition in that layer/pool.
- .. math::
+.. math::
+ :label: C_active_and_nonmyc
C_{active,nh4} = N_{active,nh4}.N_{cost,active,nh4}\\
C_{active,no3} = N_{active,no3}.N_{cost,active,no3}\\
- C_{nonmyc,no3} = N_{nonmyc,no3}.N_{cost,nonmyc,no3}\\
+ C_{nonmyc,nh4} = N_{nonmyc,nh4}.N_{cost,nonmyc,nh4}\\
C_{nonmyc,no3} = N_{nonmyc,no3}.N_{cost,nonmyc,no3}\\
Following this, we determine how much carbon is accounted for for each soil layer.
- .. math::
+.. math::
+ :label: C_accounted,x,j
C_{accounted,x,j} = C_{spent,j,x} - (N_{acquired,j,x}.CN_{plant}.(1.0+ gr_{frac}))
diff --git a/doc/source/tech_note/FUN/image1.png b/doc/source/tech_note/FUN/image1.png
new file mode 100644
index 0000000000..7851a7a0a8
--- /dev/null
+++ b/doc/source/tech_note/FUN/image1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:824fd908c8bdc9cd99ee4a2510d3ccb05d70280c7bad4728dd0eee5e43365fc3
+size 247878
diff --git a/doc/source/tech_note/Fire/CLM50_Tech_Note_Fire.rst b/doc/source/tech_note/Fire/CLM50_Tech_Note_Fire.rst
index 0483567ff5..7ee974fc35 100644
--- a/doc/source/tech_note/Fire/CLM50_Tech_Note_Fire.rst
+++ b/doc/source/tech_note/Fire/CLM50_Tech_Note_Fire.rst
@@ -3,7 +3,7 @@
Fire
========
-The fire parameterization in CLM contains four components: non-peat fires outside cropland and tropical closed forests, agricultural fires in cropland, deforestation fires in the tropical closed forests, and peat fires (see :ref:`Li et al. 2012a `, :ref:`Li et al. 2012b `, :ref:`Li et al. 2013 `, :ref:`Li and Lawrence 2017 ` for details). In this fire parameterization, burned area is affected by climate and weather conditions, vegetation composition and structure, and human activities. After burned area is calculated, we estimate the fire impact, including biomass and peat burning, fire-induced vegetation mortality, adjustment of the carbon and nitrogen (C/N) pools, and fire emissions.
+The fire parameterization in CLM contains four components: non-peat fires outside cropland and tropical closed forests, agricultural fires in cropland, deforestation fires in the tropical closed forests, and peat fires (see :ref:`Li et al. 2012a `, :ref:`Li et al. 2012b `, :ref:`Li et al. 2013 `, :ref:`Li and Lawrence 2017 `, :ref:`Li et al. 2024b ` for details). In this fire parameterization, burned area is affected by climate and weather conditions, vegetation composition and structure, and human activities. After burned area is calculated, we estimate the fire impact, including biomass and peat burning, fire-induced vegetation mortality, adjustment of the carbon and nitrogen (C/N) pools, and fire emissions.
.. _Non-peat fires outside cropland and tropical closed forest:
@@ -29,9 +29,9 @@ Fire counts :math:`N_{f}` is taken as
.. math::
:label: 23.2
- N_{f} = N_{i} f_{b} f_{m} f_{se,o}
+ N_{f} = N_{i} f_{b} f_{m} f_{se,o} f_{topo}
-where :math:`N_{i}` ( count s\ :sup:`-1`) is the number of ignition sources due to natural causes and human activities; :math:`f_{b}` and :math:`f_{m}` (fractions) represent the availability and combustibility of fuel, respectively; :math:`f_{se,o}` is the fraction of anthropogenic and natural fires unsuppressed by humans and related to the socioeconomic conditions.
+where :math:`N_{i}` ( count s\ :sup:`-1`) is the number of ignition sources due to natural causes and human activities; :math:`f_{b}` and :math:`f_{m}` (fractions) represent the availability and combustibility of fuel, respectively; :math:`f_{se,o}` is the fraction of anthropogenic and natural fires unsuppressed by humans and related to the socioeconomic conditions; :math:`f_{topo}` represents the influence of topography on fires.
:math:`N_{i}` (count s\ :sup:`-1`) is given as
@@ -66,7 +66,7 @@ Fuel availability :math:`f_{b}` is given as
\begin{array}{cc} {} & {} \end{array}\begin{array}{c} {B_{ag} B_{up} }
\end{array}\right\} \ ,
-where :math:`B_{ag}` (g C m\ :sup:`-2`) is the biomass of combined leaf, stem, litter, and woody debris pools; :math:`B_{low}` = 105 g C m :sup:`-2` is the lower fuel threshold below which fire does not occur; :math:`B_{up}` = 1050 g C m\ :sup:`-2` is the upper fuel threshold above which fire occurrence is not limited by fuel availability.
+where :math:`B_{ag}` (g C m\ :sup:`-2`) is the biomass of combined leaf, stem, litter, and woody debris pools; :math:`B_{low}` = 75 g C m :sup:`-2` is the lower fuel threshold below which fire does not occur; :math:`B_{up}` = 825 g C m\ :sup:`-2` is the upper fuel threshold above which fire occurrence is not limited by fuel availability.
Fuel combustibility :math:`f_{m}` is estimated by
@@ -75,24 +75,24 @@ Fuel combustibility :math:`f_{m}` is estimated by
f_{m} = {f_{RH} f_{\beta}}, \qquad T_{17cm} > T_{f}
-where :math:`f_{RH}` and :math:`f_{\beta }` represent the dependence of fuel combustibility on relative humidity :math:`RH` (%) and root-zone soil moisture limitation :math:`\beta` (fraction); :math:`T_{17cm}` is the temperature of the top 17 cm of soil (K) and :math:`T_{f}` is the freezing temperature. :math:`f_{RH}` is a weighted average of real time :math:`RH` (:math:`RH_{0}`) and 30-day running mean :math:`RH` (:math:`RH_{30d}`):
+where :math:`f_{RH}` and :math:`f_{\beta }` represent the dependence of fuel combustibility on relative humidity :math:`RH` (%) and root-zone soil wetness :math:`\beta` (fraction); :math:`T_{17cm}` is the temperature of the top 17 cm of soil (K) and :math:`T_{f}` is the freezing temperature. :math:`f_{RH}` is a weighted average of real time :math:`RH` (:math:`RH_{0}`) and 30-day running mean :math:`RH` (:math:`RH_{30d}`):
.. math::
:label: 23.8
- f_{RH} = (1-w) l_{RH_{0}} + wl_{RH_{30d}}
+ f_{RH} = [(1-w) l_{RH_{0}} + wl_{RH_{30d}}]^{0.75}
-where weight :math:`w=\max [0,\min (1,\frac{B_{ag}-2500}{2500})]`, :math:`l_{{RH}_{0}}=1-\max [0,\min (1,\frac{RH_{0}-30}{80-30})]`, and :math:`l_{{RH}_{30d}}=1-\max [0.75,\min (1,\frac{RH_{30d}}{90})]`. :math:`f_{\beta}` is given by
+where weight :math:`w=\max [0,\min (1,\frac{B_{ag}-2500}{2500})]`, :math:`l_{{RH}_{0}}=1-\max [0,\min (1,\frac{RH_{0}-30}{85-30})]`, and :math:`l_{{RH}_{30d}}=1-\max [0.6,\min (1,\frac{RH_{30d}}{95})]`. :math:`f_{\beta}` is given by
.. math::
:label: 23.9
f_{\beta } =\left\{\begin{array}{cccc}
- {1} & {} & {} & {\beta\le \beta_{low} } \\ {\frac{\beta_{up} -\beta}{\beta_{up} -\beta_{low} } } & {} & {} & {\beta_{low} <\beta<\beta_{up} } \\
+ {1} & {} & {} & {\beta\le \beta_{low} } \\ ({\frac{\beta_{up} -\beta}{\beta_{up} -\beta_{low} } })^{0.25} & {} & {} & {\beta_{low} <\beta<\beta_{up} } \\
{0} & {} & {} & {\beta\ge \beta_{up} }
- \end{array}\right\} \ ,
+ \end{array}\right.
-where :math:`\beta _{low}` \ =0.85 and :math:`\beta _{up}` \ =0.98 are the lower and upper thresholds, respectively.
+where :math:`\beta _{low}` \ and :math:`\beta _{up}` \ are the PFT-dependent lower and upper thresholds (:numref:`Table PFT-specific fire parameters`).
For scarcely populated regions (:math:`D_{p} \le 0.1` person km :sup:`-2`), we assume that anthropogenic suppression on fire occurrence is negligible, i.e., :math:`f_{se,o} =1.0`. In regions of :math:`D_{p} >0.1` person km\ :sup:`-2`, we parameterize the fraction of anthropogenic and natural fires unsuppressed by human activities as
@@ -128,26 +128,29 @@ which captures 73% of the observed MODIS fire counts with variable GDP in region
to reproduce the relationship between MODIS fire counts and GDP.
-.. _Average spread area of a fire:
-
-Average spread area of a fire
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Fire fighting capacity depends on socioeconomic conditions and affects fire spread area. Due to a lack of observations, we consider the socioeconomic impact on the average burned area rather than separately on fire spread rate and fire duration:
+The influence of topography on fires:
.. math::
:label: 23.14
- a=a^{*} F_{se}
+ f_{topo} =\left\{\begin{array}{cc}
+ {0.004} & {elevation>2500m} \\
+ {1} & {else}
+ \end{array}\right.
-where :math:`a^{*}` is the average burned area of a fire without anthropogenic suppression and :math:`F_{se}` is the socioeconomic effect on fire spread area.
+This indicates reduced burnability above 2500 m. It can be removed if CLM accounts in the future for the intense light exposure of Arctic C\ :sub:`3` grasses on plateaus, leading to greater carbon allocation to fine roots than to leaves and to reduced infiltration.
+
+.. _Average spread area of a fire:
+
+Average spread area of a fire
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Average burned area of a fire without anthropogenic suppression is assumed elliptical in shape with the wind direction along the major axis and the point of ignition at one of the foci. According to the area formula for an ellipse, average burned area of a fire can be represented as:
+Average burned area of a fire is assumed elliptical in shape with the wind direction along the major axis and the point of ignition at one of the foci. According to the area formula for an ellipse, average burned area of a fire can be represented as:
.. math::
:label: 23.15
- a^{*} =\pi \frac{l}{2} \frac{w}{2} \times 10^{-6} =\frac{\pi u_{p}^{2} \tau ^{2} }{4L_{B} } (1+\frac{1}{H_{B} } )^{2} \times 10^{-6}
+ a =\pi \frac{l}{2} \frac{w}{2} \times 10^{-6} =\frac{\pi u_{p}^{2} \tau ^{2} }{4L_{B} } (1+\frac{1}{H_{B} } )^{2} \times 10^{-6}
where :math:`u_{p}` (m s\ :sup:`-1`) is the fire spread rate in the downwind direction; :math:`\tau` (s) is average fire duration; :math:`L_{B}` and :math:`H_{B}` are length-to-breadth ratio and head-to-back ratio of the ellipse; 10 :sup:`-6` converts m :sup:`2` to km :sup:`2`.
@@ -172,7 +175,7 @@ The fire spread rate in the downwind direction is represented as
u_{p} =u_{\max } C_{m} g(W)
-(:ref:`Arora and Boer, 2005