From c790611ef85d3607f84ee555d67cdc7f08271958 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Mon, 17 Nov 2025 17:55:20 -0700 Subject: [PATCH 1/9] Consolidate docs deployment workflows: remove deprecated deploy.yml add PR preview to publish-docs.yml --- .github/workflows/deploy.yml | 37 ------------------------------ .github/workflows/publish-docs.yml | 26 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 39 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 77f6e98e..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Deploy production docs -on: - push: - branches: [master] - -permissions: - contents: write - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install system deps - run: | - sudo apt-get update - sudo apt-get install -y doxygen graphviz - python3 -m pip install --upgrade pip - python3 -m pip install mkdocs mkdocs-material pymdown-extensions - - - name: Build docs - run: | - make clean document - - - name: Ensure .nojekyll in site root - run: touch site/.nojekyll - - - name: Deploy to gh-pages - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages - folder: site - # Keep PR previews published under pr-preview/ - clean: true - clean-exclude: pr-preview/ - force: false diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 208c9e7a..9b52b162 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -1,10 +1,11 @@ -name: Docs production build and deploy +name: Docs build and deploy on: push: branches: [ master ] pull_request: branches: [ master ] + types: [opened, synchronize, reopened, closed] permissions: contents: read # needed for checkout @@ -17,6 +18,7 @@ concurrency: jobs: build: + name: docs-build runs-on: ubuntu-latest steps: - name: Checkout @@ -39,8 +41,28 @@ jobs: with: path: site + deploy_preview: + # Deploy a preview for open PRs targeting master + if: | + github.event_name == 'pull_request' && + github.event.action != 'closed' + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + steps: + - name: Deploy PR preview to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + with: + preview: true + deploy: - # Only deploy on push to master, NOT on pull_request + # Deploy on push to master (after PR merge) if: github.event_name == 'push' && github.ref == 'refs/heads/master' needs: build environment: From 0dccfe46ccc85055308209b9612e9c97cf89ab86 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 16:03:32 -0700 Subject: [PATCH 2/9] fix preview, create comment w/ URL --- .github/workflows/publish-docs.yml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 9b52b162..319678a2 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -48,8 +48,8 @@ jobs: github.event.action != 'closed' needs: build environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} + name: pr-${{ github.event.pull_request.number }} + url: ${{ steps.deployment.outputs.preview_url }} runs-on: ubuntu-latest permissions: pages: write @@ -60,6 +60,21 @@ jobs: uses: actions/deploy-pages@v4 with: preview: true + - name: Comment preview URL + if: ${{ steps.deployment.outputs.preview_url != '' }} + uses: actions/github-script@v7 + permissions: + issues: write + with: + script: | + const url = '${{ steps.deployment.outputs.preview_url }}'; + core.info(`Preview: ${url}`); + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: `Docs preview ready: ${url}` + }); deploy: # Deploy on push to master (after PR merge) From 3ae955f58fb7a26142386aa742345e7e5aa6716c Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 16:10:21 -0700 Subject: [PATCH 3/9] fix preview, create comment w/ URL [again] --- .github/workflows/publish-docs.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 319678a2..e806cef7 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -54,6 +54,7 @@ jobs: permissions: pages: write id-token: write + issues: write steps: - name: Deploy PR preview to GitHub Pages id: deployment @@ -63,8 +64,6 @@ jobs: - name: Comment preview URL if: ${{ steps.deployment.outputs.preview_url != '' }} uses: actions/github-script@v7 - permissions: - issues: write with: script: | const url = '${{ steps.deployment.outputs.preview_url }}'; From 414d600669e31063ed404fcdceaff245e61bb2a5 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 16:14:17 -0700 Subject: [PATCH 4/9] fix preview, create comment w/ URL [again] --- .github/workflows/publish-docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index e806cef7..c5c3636f 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -49,7 +49,7 @@ jobs: needs: build environment: name: pr-${{ github.event.pull_request.number }} - url: ${{ steps.deployment.outputs.preview_url }} + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest permissions: pages: write @@ -62,11 +62,11 @@ jobs: with: preview: true - name: Comment preview URL - if: ${{ steps.deployment.outputs.preview_url != '' }} + if: ${{ steps.deployment.outputs.page_url != '' }} uses: actions/github-script@v7 with: script: | - const url = '${{ steps.deployment.outputs.preview_url }}'; + const url = '${{ steps.deployment.outputs.page_url }}'; core.info(`Preview: ${url}`); await github.rest.issues.createComment({ owner: context.repo.owner, From 6967b85f8c7b857848eeab9b8904fee1a09af2a0 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 19:00:01 -0700 Subject: [PATCH 5/9] fix preview again --- .github/workflows/publish-docs.yml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index c5c3636f..a2becdfb 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -49,31 +49,17 @@ jobs: needs: build environment: name: pr-${{ github.event.pull_request.number }} - url: ${{ steps.deployment.outputs.page_url }} + url: ${{ steps.deployment.outputs.preview_url }} runs-on: ubuntu-latest permissions: pages: write id-token: write - issues: write steps: - name: Deploy PR preview to GitHub Pages id: deployment uses: actions/deploy-pages@v4 with: preview: true - - name: Comment preview URL - if: ${{ steps.deployment.outputs.page_url != '' }} - uses: actions/github-script@v7 - with: - script: | - const url = '${{ steps.deployment.outputs.page_url }}'; - core.info(`Preview: ${url}`); - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: `Docs preview ready: ${url}` - }); deploy: # Deploy on push to master (after PR merge) From edb68a71724d42a749e4359ede33780bfc0a4ca3 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 19:49:04 -0700 Subject: [PATCH 6/9] fix preview again --- .github/workflows/publish-docs.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index a2becdfb..4c97d2e7 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -54,12 +54,25 @@ jobs: permissions: pages: write id-token: write + issues: write steps: - name: Deploy PR preview to GitHub Pages id: deployment uses: actions/deploy-pages@v4 with: preview: true + - name: Comment preview URL + if: ${{ steps.deployment.outputs.preview_url != '' }} + uses: actions/github-script@v7 + with: + script: | + const url = '${{ steps.deployment.outputs.preview_url }}'; + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: `Docs preview ready: ${url}` + }); deploy: # Deploy on push to master (after PR merge) From f1dc8fd709e4da5d9766228b4fabaad679371416 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Tue, 18 Nov 2025 19:54:42 -0700 Subject: [PATCH 7/9] remove preview action --- .github/workflows/publish-docs.yml | 33 ------------------------------ 1 file changed, 33 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 4c97d2e7..993d9f05 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -41,39 +41,6 @@ jobs: with: path: site - deploy_preview: - # Deploy a preview for open PRs targeting master - if: | - github.event_name == 'pull_request' && - github.event.action != 'closed' - needs: build - environment: - name: pr-${{ github.event.pull_request.number }} - url: ${{ steps.deployment.outputs.preview_url }} - runs-on: ubuntu-latest - permissions: - pages: write - id-token: write - issues: write - steps: - - name: Deploy PR preview to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - with: - preview: true - - name: Comment preview URL - if: ${{ steps.deployment.outputs.preview_url != '' }} - uses: actions/github-script@v7 - with: - script: | - const url = '${{ steps.deployment.outputs.preview_url }}'; - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: `Docs preview ready: ${url}` - }); - deploy: # Deploy on push to master (after PR merge) if: github.event_name == 'push' && github.ref == 'refs/heads/master' From e10480faa6415fd1457d3848b0ecf2d119113fbe Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Wed, 19 Nov 2025 09:58:28 -0700 Subject: [PATCH 8/9] remove publish on pr merge from list of tasks required for PR, so it doesn't show up as skipped by splitting docs build and publish workflows; renamed files for clarity and sorting --- .github/workflows/docs-build.yml | 42 +++++++++++++++++++ .../{publish-docs.yml => docs-publish.yml} | 16 +++---- 2 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/docs-build.yml rename .github/workflows/{publish-docs.yml => docs-publish.yml} (71%) diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml new file mode 100644 index 00000000..f504b4a7 --- /dev/null +++ b/.github/workflows/docs-build.yml @@ -0,0 +1,42 @@ +name: Build and Upload Docs + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + types: [opened, synchronize, reopened, closed] + +permissions: + contents: read # needed for checkout + pages: write # to deploy to GitHub Pages + id-token: write # to authenticate with GitHub Pages + +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + build: + name: docs-build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install system deps + run: | + sudo apt-get update + sudo apt-get install -y doxygen graphviz + python3 -m pip install --upgrade pip + python3 -m pip install mkdocs mkdocs-material pymdown-extensions + + - name: Build docs (MkDocs + Doxygen) + run: | + make clean document + touch site/.nojekyll + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/docs-publish.yml similarity index 71% rename from .github/workflows/publish-docs.yml rename to .github/workflows/docs-publish.yml index 993d9f05..7bd3b47f 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/docs-publish.yml @@ -1,19 +1,16 @@ -name: Docs build and deploy +name: Publish Docs on: push: branches: [ master ] - pull_request: - branches: [ master ] - types: [opened, synchronize, reopened, closed] permissions: - contents: read # needed for checkout - pages: write # to deploy to GitHub Pages - id-token: write # to authenticate with GitHub Pages + contents: read + pages: write + id-token: write concurrency: - group: "pages" + group: "pages-prod" cancel-in-progress: true jobs: @@ -42,8 +39,7 @@ jobs: path: site deploy: - # Deploy on push to master (after PR merge) - if: github.event_name == 'push' && github.ref == 'refs/heads/master' + name: deploy-pages needs: build environment: name: github-pages From ce1425e06baa00d0c2eae0fc8e66f405a9bbf07f Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Wed, 19 Nov 2025 21:00:27 -0700 Subject: [PATCH 9/9] add parameterizations documentation with detailed SIPNET parameter values and origins --- docs/parameterizations.md | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 docs/parameterizations.md diff --git a/docs/parameterizations.md b/docs/parameterizations.md new file mode 100644 index 00000000..f2ce179c --- /dev/null +++ b/docs/parameterizations.md @@ -0,0 +1,64 @@ +--- +format: + html: + engine: katex + pdf: + geometry: margin=0.5in + header-includes: + - \usepackage{longtable} + - \usepackage{amsmath} +--- + +# SIPNET Parameter Values and Origins + +Notes and usage: +- The table below compiles SIPNET parameter names, mathematical notation, values used in key studies (Braswell 2005; Sacks 2006, 2007; Zobitz 2008, 2014, 2021), and .param files from the SIPNET test suite (niwot.param, russell_1.param) and PEcAn template (template.param). +- It is intended as a reference and provenance record—not as an exhaustive catalogue. Calibrated parameter posteriors from PEcAn (MCMC chains) are not included here; those are archived separately. +- Many entries duplicate across rows to preserve historical reporting; consider moving this wide table to an appendix or a downloadable CSV for readability and responsive rendering in HTML/PDF tables. + +| **sipnet-name** | **parameter-name** | **math-notation** | **Braswell 2005** | **Sacks 2006** | **Sacks 2007** | **Zobitz 2008** | **Zobitz 2014** | **Zobitz 2021** | **niwot.param** | **russell_1.param** | **template.param** | **rationale** | **calibration-type** | **notes** | +| ---------------------- | ----------------------------------------- | ------------------------------ | ------------------------ | ----------------------------- | ---------------------------- | ---------------------------------- | ---------------------------- | ---------------------------- | -------------------------------- | ----------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| plantWoodInit | Initial wood carbon content (g C m⁻²) | $C_{\text{wood},0}$ | 11000 | 9600 (measured) | 9600 (measured) | 9600 (assumed same as Sacks 07) | 9600 (no change) | 9600 (no change) | 9600 (from field data) | 9600 (same as Niwot) | 110 (generic crop) | From site biomass inventory (Niwot Ridge evergreen forest); Harvard deciduous forest higher (11 000) | literature | Niwot value from Monson et al. (unpub.); template uses a much lower value appropriate for annual crops (minimal wood). | +| laiInit | Initial leaf area index (m² m⁻²) | $LAI_{0}$ | 0 | 4.2 (measured) | 4.2 (measured) | 4.2 (same as Sacks 07) | 4.2 (no change) | 4.2 (no change) | 4.2 (from field data) | 4.2 (same as Niwot) | 0 | Based on site leaf area index measurements (Niwot Ridge conifer forest); deciduous stands start leafless | literature | Niwot LAI corresponds to evergreen needle area; template assumes no initial foliage (e.g. bare field before crop emergence). | +| soilInit | Initial soil organic C (g C m⁻²) | $C_{\text{soil},0}$ | 6300 | 16000 (organic layer) | 16000 (organic layer) | 16000 (same as Sacks 07) | 16000 (no change) | 16000 (no change) | 16000 (surface organic layer C) | 16000 (same as Niwot) | 7000 | High soil C at Niwot (subalpine forest floor); Harvard forest soil had lower C (6.3 kg m⁻²) | literature | Niwot soil C from Scott-Denton et al. 2003; template uses a moderate default (7 kg m⁻²) for generic sites. | +| microbeInit | Initial microbe biomass (mg C g⁻¹ soil C) | $C_{B,0}$ | — | — | — | 0.5 (assumed) | — | — | 0.5 (not used, microbes off) | 0.5 (not used) | 0.5 (not used) | Assumed small initial microbial C (~0.5 mg C per g soil C) in multi-pool model, based on literature values (quality model) | literature | Microbial pool used only in “Quality” model variant; not active in standard runs (value read but ignored when microbes off). | +| fineRootFrac | Initial fine-root fraction of wood C | $f_{\text{fine root},0}$ | — | — | — | 0.2 (assumed) | 0.025 (optimized) | 0.025 (no change) | 0.2 (default) | 0.2 (same as Niwot) | 0.2 (default) | Assumed 20% of initial wood C is fine roots in absence of data; Niwot data assimilation later suggested only ~2.5% | literature | Fine roots initially lumped with wood in earlier models; 0.2 was a nominal assumption, revised down by data fusion in 2014. | +| coarseRootFrac | Initial coarse-root fraction of wood C | $f_{\text{coarse root},0}$ | — | — | — | 0.2 (assumed) | 0.025 (optimized) | 0.025 (no change) | 0.2 (default) | 0.2 (same as Niwot) | 0.2 (default) | Assumed 20% of wood C in coarse roots; data assimilation indicated a very low root fraction at Niwot (~2.5%) | literature | Coarse roots were initially included in wood pool; nominal 20% split used for root-enabled model, adjusted by later calibration. | +| aMax | Leaf-level max net assimilation rate | $A_{\max}$ | 112 nmol g⁻¹ s⁻¹ | 7.66 nmol g⁻¹ s⁻¹ (posterior) | 7.7 nmol g⁻¹ s⁻¹ (≈Sacks 06) | 7.7 nmol g⁻¹ s⁻¹ (used from Sacks) | 7.8 nmol g⁻¹ s⁻¹ (no change) | 7.8 nmol g⁻¹ s⁻¹ (no change) | 7.7 nmol g⁻¹ s⁻¹ (Niwot default) | 7.7 nmol g⁻¹ s⁻¹ (same) | 95 nmol g⁻¹ s⁻¹ (generic) | Controls potential GPP; much lower at Niwot (evergreen, high elevation) than at Harvard Forest (deciduous; ~112) | calibrated | Braswell 2005 estimated Amax via MCMC but used prior ~112; Niwot optimizations found ~7.7 (constrained by flux data). | +| aMaxFrac | Daily max GPP as fraction of Amax | $F_{A\max}$ | 0.76 | 0.76 (fixed) | 0.76 (fixed) | 0.76 (same) | 0.76 (no change) | 0.76 (no change) | 0.76 (fixed default) | 0.76 (same) | 0.85 (assumed) | Fraction of instantaneous Amax realized as daily average; adopted from PnET literature (~0.75) and held fixed in calibrations | literature | Value originally from Aber 1996; Sacks kept FAmax fixed to improve identifiability. Template uses a slightly higher value 0.85 (crop-specific). | +| attenuation | Canopy light extinction coefficient | $k$ | 0.58 | 0.58 (PnET default) | 0.50 | 0.50 (same as Sacks 07) | 0.50 (no change) | 0.50 (no change) | 0.50 (Niwot evergreen) | 0.50 (same) | 0.50 (default) | Canopy PAR attenuation factor; ~0.58 for deciduous forests, ~0.5 used for conifers (more clumped foliage) | literature | Braswell used PnET value 0.58; Niwot runs adopted Sellers 1996 value 0.5 appropriate for needleleaf canopies. | +| baseCoarseRootResp | Coarse-root maint. resp. @ 0 °C (yr⁻¹) | $K_{\text{CR}}$ | — | — | — | (tied to wood) | 0.14 yr⁻¹ (est.) | 0.14 yr⁻¹ (no change) | 0.03 yr⁻¹ (default guess) | 0.03 yr⁻¹ (same) | 0.03 yr⁻¹ (default) | Base respiration rate of coarse roots (fraction of C per year at 0 °C). Not separately constrained in early studies (combined with wood); later assumed ~0.14 yr⁻¹ by data fusion. | calibrated? | Introduced in root-extended model. Niwot 2014 assimilation suggests coarse roots respire ~14% of their C per year at 0 °C (similar to fine roots). Value in defaults was ~3–6% by analogy to wood. | +| baseFineRootResp | Fine-root maint. resp. @ 0 °C (yr⁻¹) | $K_{\text{FR}}$ | — | — | — | (tied to wood) | 0.14 yr⁻¹ (est.) | 0.14 yr⁻¹ (no change) | 0.03 yr⁻¹ (default guess) | 0.03 yr⁻¹ (same) | 0.03 yr⁻¹ (default) | Base respiration rate of fine roots. Not in original SIPNET (roots in wood pool); estimated ~0.14 yr⁻¹ in Niwot root model (faster than wood). | calibrated | Fine roots have higher metabolic activity than wood; Niwot data-fusion retrieved ~0.14 yr⁻¹ at 0 °C (with Q₁₀) for fine roots. Defaults assumed similar to soil/wood (~0.03–0.06 yr⁻¹). | +| baseFolRespFrac | Foliar maint. resp. fraction of Amax | $K_{F}$ | 0.10 | ~0.10 (est.) | ~0.10 (est.) | ~0.10 (assumed) | 0.01 (posterior) | 0.01 (no change) | 0.10 (default) | 0.10 (same) | 0.10 (default) | Fraction of Amax used for leaf maintenance respiration. Initially assumed ~0.1; Niwot optimization suggests a very low effective value in winter (near 0 when soil frozen). | calibrated | Set as canonical 0.1 in early models. Sacks (2007) effectively reduced foliar respiration to ~0 in sub-freezing conditions, consistent with low retrieved KF. | +| baseSoilResp | Soil heterotrophic resp. @ 0 °C (yr⁻¹) | $K_{H}$ | 0.03 yr⁻¹ | ~0.03 yr⁻¹ (est.) | ~0.03 yr⁻¹ (est.) | ~0.03 yr⁻¹ (assumed) | 0.056 yr⁻¹ (posterior) | 0.056 yr⁻¹ (no change) | 0.03 yr⁻¹ (default) | 0.03 yr⁻¹ (same) | 0.03 yr⁻¹ (default) | Base (maximum) soil microbial respiration rate at 0 °C (moisture-saturated). Literature ~0.03 yr⁻¹; Niwot data fusion yielded ~0.056 yr⁻¹ (with a larger soil C pool). | calibrated | Raich 1991 provided canonical soil respiration rates. Higher soil C at Niwot meant a somewhat lower K_H was needed to fit fluxes (strong C–K_H tradeoff); 2014 data assimilation gave ~0.06 yr⁻¹ with updated pools. | +| baseVegResp | Wood (veg.) maint. resp. @ 0 °C (yr⁻¹) | $K_{A}$ | 0.006 yr⁻¹ | ~0.006 yr⁻¹ (est.) | ~0.006 yr⁻¹ (est.) | ~0.006 yr⁻¹ (assumed) | 0.087 yr⁻¹ (posterior) | 0.087 yr⁻¹ (no change) | 0.006 yr⁻¹ (default) | 0.006 yr⁻¹ (same) | 0.006 yr⁻¹ (default) | Base maintenance respiration rate of wood (at 0 °C). Inferred ~0.006 yr⁻¹ for temperate forests; Niwot data fusion suggests higher (~0.087 yr⁻¹) if fine roots are lumped with wood in a model scenario. | calibrated? | Braswell 2005 treated wood respiration implicitly (growth+maint); initial guess ~0.006 yr⁻¹. Niwot assimilation attributes more respiration to wood+roots combined, effectively raising K_A (coarse roots separated in newer model). | +| coarseRootAllocation | NPP fraction to coarse roots | $\alpha_{\text{CR}}$ | — | — | — | 0.20 (assumed) | 0.20 (posterior) | 0.20 (no change) | 0.10 (default guess) | 0.10 (same) | 0.00? (unused) | Fraction of net primary production allocated to coarse root growth. Not used in original model (roots in wood pool); assumed ~0.2 in root-enabled model, confirmed ~0.20 by joint data assimilation. | literature | Zobitz 2008 assumed total ~40% NPP to roots (20% coarse, 20% fine). Zobitz 2014 posterior mean α_CR ≈0.20 (±0.03) of NPP. Template allocates less to roots by default (10% each). | +| coarseRootExudation | GPP fraction to coarse root exudates | $\beta_{\text{CR}}$ | — | — | — | — | 0.05 (posterior) | 0.05 (no change) | 0.00 (default) | 0.00 (same) | 0.00 (default) | Fraction of gross production shunted to coarse root exudation (root exudates to soil). Negligible in earlier models; estimated ~5% in microbial model runs. | calibrated | Introduced with microbial pool. Niwot data fusion (quality model) found coarse root exudation ~5% of GPP (with microbes on). Default assumes zero when microbes off. | +| coarseRootQ10 | Coarse root respiration Q₁₀ factor | $Q_{10,\text{CR}}$ | — | — | — | 2.0 (assumed) | 2.0 (assumed) | 2.0 (assumed) | 2.0 (default) | 2.0 (same) | 2.0 (default) | Temperature sensitivity of coarse root respiration. Set equal to other respiration Q₁₀ values (~2.0) by model assumption. | literature | No evidence for different Q₁₀ for coarse roots; model uses canonical value 2.0 for all respiration components. | +| coarseRootTurnoverRate | Coarse root turnover rate (yr⁻¹) | $\delta_{\text{CR}}$ | — | — | — | — | 0.056 yr⁻¹ (posterior) | 0.056 yr⁻¹ (no change) | 0.03 yr⁻¹ (default) | 0.03 yr⁻¹ (same) | 0.003 yr⁻¹? (unused) | Turnover (loss) rate of coarse root biomass. Not explicit in older models (in wood turnover); Niwot assimilation ~5.6% yr⁻¹ (∼18 yr lifespan) for coarse roots. | calibrated | Coarse roots persist longer than fine (estimated ~18-year half-life at Niwot). Default values were small (few % per year) like wood. | +| dVpdExp | VPD response exponent | – (used in formula) | 2.0 (fixed) | 2.0 (fixed) | 2.0 (fixed) | 2.0 (fixed) | 2.0 (fixed) | 2.0 (fixed) | 2.0 (default) | 2.0 (same) | 2.0 (default) | Exponent in VPD limitation function. Held at 2 in original formulation. | literature | All studies use a quadratic VPD effect (exponent 2) as in Braswell 2005. | +| dVpdSlope | VPD sensitivity coefficient (kPa⁻¹) | $K_{\text{VPD}}$ | 0.05 | ~0.05 (est.) | 0.05 (fixed) | 0.05 (same) | 0.05 (no change) | 0.05 (no change) | 0.05 (default) | 0.05 (same) | 0.05 (default) | Slope of VPD effect on GPP (controls curvature of high-VPD suppression). Literature ~0.05 kPa⁻¹; kept fixed in Niwot runs. | literature | From Aber 1996/PnET model; Sacks found optimizations insensitive to K_VPD, so left at prior ~0.05. | +| fineRootAllocation | NPP fraction to fine roots | $\alpha_{\text{FR}}$ | — | — | — | 0.20 (assumed) | 0.20 (posterior) | 0.20 (no change) | 0.10 (default guess) | 0.10 (same) | 0.00? (unused) | Fraction of NPP allocated to fine root growth. ~0.2 assumed in root-enabled model; Niwot data assimilation confirms ~0.20 on average (±0.03) of NPP. | literature | Zobitz 2008 assumed 20% NPP to fine roots; posterior mean α_FR ≈0.20 (±0.03) at Niwot. Template default allocates less (10%). | +| fineRootExudation | GPP fraction to fine root exudates | $\beta_{\text{FR}}$ | — | — | — | — | 0.05 (posterior) | 0.05 (no change) | 0.00 (default) | 0.00 (same) | 0.00 (default) | Fraction of GPP allocated to fine root exudation (root excretions to soil). Only relevant with an active microbial pool; estimated ~5% when modeled. | calibrated | Added in models with an explicit microbial pool. Niwot “Quality” model found β_FR ≈0.05 of GPP. Default is zero when microbial processes are off. | +| fineRootFrac | Initial fine-root fraction of wood C | *(see **fineRootFrac** above)* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see **fineRootFrac** above* | *see above* | | +| fineRootQ10 | Fine root respiration Q₁₀ factor | $Q_{10,\text{FR}}$ | — | — | — | 2.0 (assumed) | 2.0 (assumed) | 2.0 (assumed) | 2.0 (default) | 2.0 (same) | 2.0 (default) | Temperature sensitivity for fine root respiration. Assumed equal to other respiration Q₁₀ (~2.0). | literature | No evidence to differentiate fine root Q₁₀ – assumed ~2 like other components. | +| fineRootTurnoverRate | Fine root turnover rate (yr⁻¹) | $\delta_{\text{FR}}$ | — | — | — | — | 0.137 yr⁻¹ (posterior) | 0.137 yr⁻¹ (no change) | 0.15 yr⁻¹ (default guess) | 0.15 yr⁻¹ (same) | 0.00? yr⁻¹ (unused) | Turnover rate of fine root biomass (fraction lost per year). Not explicit in earlier model (in wood pool); Niwot assimilation ~13.7% yr⁻¹ (≈7 yr lifespan) for fine roots. | calibrated | Fine roots likely short-lived; Niwot data fusion suggests ~7-year lifespan. Default assumed faster turnover (~15–20% yr⁻¹) if used. | +| immedEvapFrac | Fraction of rain evaporated immediately | $f_E$ | — (PnET ignored) | 0.10 (Sellers 1996) | 0.10 | 0.10 (same) | 0.10 (no change) | 0.10 (no change) | 0.10 (default) | 0.10 (same) | 0.10 (default) | Rain interception fraction that evaporates immediately. Incorporated in Niwot model (Sellers et al. 1996) at ~10%; not used in original SIPNET (lumped in ET). | literature | Fixed ~0.1 based on land-surface model (SiB2) for forest canopies. Braswell model had no separate interception parameter. | +| laiInit | Initial leaf area index (m² m⁻²) | *see **laiInit** above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see **laiInit** above* | *see above* | | +| leafAllocation | NPP fraction to leaves | $\alpha_{\text{leaf}}$ | (implicit via phenology) | *0.10–0.15 (est.)* | *0.10 (est.)* | 0.30 (assumed) | 0.40 (posterior) | 0.40 (no change) | 0.40 (default guess) | 0.40 (same) | 0.50 (default) | Fraction of NPP allocated to new leaf growth. Deciduous model determined leaf gain via phenology rather than fixed $\alpha_L$; Niwot evergreen optimizations suggest a low leaf allocation (~10%) rising when fAPAR is assimilated (~40%). | calibrated | Braswell’s deciduous model used a 5-day NPP-average for leaf-out instead of a constant $\alpha_L$. Sacks (2007) found only ~10% of NPP to leaves (evergreen steady state). Joint assimilation with fAPAR increased $\alpha_L$ to ~0.4. | +| leafCSpWt | Specific leaf C mass (g C m⁻² leaf) | SLW$_C$ | 70 | 270 | 270 | 270 (same) | 270 (no change) | 270 (no change) | 270 (Niwot evergreen) | 270 (same) | 70 (deciduous/crop) | Carbon per unit leaf area (leaf mass per area * C fraction). ~70 g m⁻² for deciduous leaves; much higher (~270) for long-lived conifer needles at Niwot. | literature | Niwot needle carbon density from J. Sparks (pers. comm.). Template reverts to ~70 for crops/deciduous canopies (thin leaves). | +| leafTurnoverRate | Leaf turnover rate (yr⁻¹) | $\delta_{\text{leaf}}$ | 1.0 (annual drop) | 0.13 yr⁻¹ (evergreen) | 0.13 yr⁻¹ | 0.13 (same) | 0.087 yr⁻¹ (posterior) | 0.087 yr⁻¹ (no change) | 0.13 yr⁻¹ (evergreen default) | 0.13 yr⁻¹ (same) | 1.0 yr⁻¹ (annual crop) | Fraction of leaf biomass turning over per year. Deciduous (annual) = 1.0 yr⁻¹; Niwot evergreen ~0.13 yr⁻¹ (7–8 year needle longevity); Niwot data assimilation suggests slightly longer retention (~0.09 yr⁻¹). | literature | Harvard Forest model used deciduous phenology (effectively δ_leaf ≈1). Niwot evergreen δ_leaf from field data; assimilation indicated ~11-year longevity (δ_leaf ≈0.09). | +| microbeInit | Initial microbe biomass (mg C g⁻¹ soil C) | *see **microbeInit** above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see **microbeInit** above* | *see above* | | +| plantWoodInit | Initial wood carbon content (g C m⁻²) | *see **plantWoodInit** above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see **plantWoodInit** above* | *see above* | | +| psnTMin | Minimum T for photosynthesis (°C) | $T_{\min}$ | 4 °C | 4 °C (fixed) | 4 °C (fixed) | 4 °C (same) | 4 °C (no change) | 4 °C (no change) | 4 °C (default) | 4 °C (same) | 4 °C (default) | Below this temperature, GPP is zero. Set to ~4 °C for temperate forests; unchanged for Niwot (evergreen activity can occur above ~–3 °C, so 4 °C is conservative). | literature | Adopted from Aber 1996/PnET model. Niwot winter photosynthesis is negligible below 0 °C, so original T_min ≈4 °C was kept. | +| psnTOpt | Optimum T for photosynthesis (°C) | $T_{\text{opt}}$ | 24 °C | 24 °C (fixed) | 24 °C (fixed) | 24 °C (same) | 24 °C (no change) | 24 °C (no change) | 24 °C (default) | 24 °C (same) | 24 °C (default) | Temperature at which GPP is maximal. ~24 °C from literature for temperate deciduous trees; Niwot (subalpine evergreen) uses same default (rarely reached). | literature | From Aber 1996. Actual Niwot summertime T_opt may be lower, but flux data alone couldn’t constrain it, so default 24 °C retained. | +| snowInit | Initial snowpack (cm water equiv.) | $W_{P,0}$ | — (not modeled) | 0 cm (Nov 1 start) | 0 cm | 0 cm (same) | 0 cm (no change) | 0 cm (no change) | 0 cm (default) | 0 cm (same) | 0 cm (default) | Snowpack water content at model start. Not applicable to Harvard (simulation spans snow-free seasons); Niwot run began with no snow on ground. | literature | Niwot simulation initialized post-melt (DOY 120) so WP,0 = 0. Template likewise assumes no initial snow. | +| snowMelt | Snow melt coefficient (cm H₂O °C⁻¹ day⁻¹) | – (K_S) | — (not modeled) | 0.15 | 0.15 | 0.15 (same) | 0.15 (no change) | 0.15 (no change) | 0.15 (default) | 0.15 (same) | — (no snow model) | Snowpack melt rate per °C above freezing (from SiB2). Incorporated for Niwot (~0.15 cm °C⁻¹ day⁻¹); not used in Braswell’s original model. | literature | Taken from Sellers 1996 (SiB2) for Niwot application. Template omits snow model for simplicity (or uses default 0.15 if enabled). | +| soilInit | Initial soil organic C (g C m⁻²) | *see **soilInit** above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see above* | *see **soilInit** above* | *see above* | | +| soilRespQ10 | Soil respiration Q₁₀ factor | $Q_{10,\text{soil}}$ | 2.0 | 2.0 (fixed) | 2.0 (fixed) | 2.0 (same) | 2.0 (no change) | 2.0 (no change) | 2.0 (default) | 2.0 (same) | 2.0 (default) | Temperature sensitivity of soil (heterotrophic) respiration. Set ~2.0 universally and held fixed in all calibrations. | literature | Value from Raich & Schlesinger 1992 (Q₁₀ ~2 for soil microbes). All SIPNET versions use Q₁₀ ≈2 for soil respiration. | +| soilWHC | Soil water holding capacity (cm H₂O) | $W_{S,\text{c}}$ | 12 cm | 12 cm (fixed) | 12 cm (fixed) | 12 cm (same) | 36 cm (est.) | 36 cm (no change) | 12 cm (default) | 12 cm (same) | 36 cm (tuned) | Plant-available soil moisture capacity. Set ~12 cm by Braswell (Harvard forest). Niwot model allowed deeper effective rooting (~36 cm) as optimized by data. | calibrated | Sacks 2006 treated rooting zone and surface layer separately; Sacks 2007 single-layer model initially kept 12 cm, but later assimilation indicated ~36 cm for Niwot. | +| soilWFracInit | Initial soil moisture fraction (–) | $W_{\text{soil},0}/W_{S,c}$ | — (n/a) | ~0.76 (est.) | *n/a* (not reported) | *n/a* | 0.10 (optimized) | 0.10 (no change) | 0.60 (default guess) | 0.60 (same) | 0.10 (tuned) | Initial fraction of WHC filled with water. Not applicable in Braswell’s parameter set. Niwot runs treated it as a free initial condition (~10% fitted for Jan 2003); default guess ~0.5–0.6 for moderate conditions. | calibrated | Sacks 2007 included soil moisture state in spin-up; Niwot 2014 optimization yielded a very dry start (~10% of WHC). Template uses ~50–60% as a generic starting guess. | +| waterRemoveFrac | Daily fraction of soil water removable | $f_D$ | 0.04 | 0.04 (est.) | 0.04 (fixed) | 0.04 (same) | 0.087 (posterior) | 0.087 (no change) | 0.04 (default) | 0.04 (same) | 0.04 (default) | Fraction of soil water that can drain or evaporate per day. Estimated ~0.04 (4%) by Braswell; Niwot data fusion suggested a higher effective value (~0.087 day⁻¹) with revised water model. | calibrated | Braswell set f_D = 0.04 day⁻¹ based on soil hydraulic considerations. Sacks 2007 retained this. A later unified soil resistance formulation yielded f ≈0.087 day⁻¹ for Niwot. | +| wueConst | VPD–WUE constant (mg CO₂ kPa⁻¹ g⁻¹ H₂O) | $K_{\text{WUE}}$ | 10.9 | 10.9 (fixed) | 10.9 (fixed) | 10.9 (same) | 10.9 (no change) | 10.9 (no change) | 10.9 (default) | 10.9 (same) | 10.9 (default) | Water-use efficiency constant relating GPP to transpiration demand. Set ~10.9 (from literature) in all cases. | literature | From Aber 1995/Aber 1997 (PnET model). All SIPNET versions use this canonical WUE parameter (not typically estimated from flux data). | +| woodAllocation | NPP fraction to wood (stem+branches) | $\alpha_{\text{wood}}$ | (implicit as remainder) | *~0.90 (est.)* | *~0.90 (est.)* | 0.30 (assumed) | 0.20 (posterior) | 0.20 (no change) | 0.50 (default guess) | 0.50 (same) | 0.50 (default) | Fraction of NPP allocated to wood (including coarse roots in older models). In evergreen Niwot, ~90% of NPP went to wood+root combined (leaf ~10%) before fAPAR data; joint optimization indicates ~20% to woody stems when roots are accounted separately. | calibrated | In Braswell’s model, non-leaf NPP (the remainder) went to wood+roots. Sacks found $\alpha_W\approx0.9$ (with roots included in that) for Niwot. Zobitz 2014, separating roots, found stems ~20% of NPP. | +| woodTurnoverRate | Wood turnover rate (yr⁻¹) | $\delta_{\text{wood}}$ | 0.03 yr⁻¹ | 0.014 yr⁻¹ | 0.014 yr⁻¹ | 0.014 yr⁻¹ (same) | 0.010 yr⁻¹ (posterior) | 0.010 yr⁻¹ (no change) | 0.014 yr⁻¹ (evergreen default) | 0.014 yr⁻¹ (same) | 0.03 yr⁻¹ (annual crop) | Turnover (loss) rate of woody biomass. Deciduous stands: effectively ~0 (all wood persists) but some coarse litterfall ~3% yr⁻¹ for mature forests. Niwot evergreen used ~1.4% yr⁻¹; assimilation suggests even slower (~1% yr⁻¹) wood turnover. | literature | Aber 1996 assumed ~3% yr⁻¹ woody turnover for mature hardwoods. Niwot’s sparse coarse litterfall gave ~1.4% yr⁻¹. Posterior mean ~1% yr⁻¹ indicates very slow wood turnover (long-lived stems). |