Running Ecosystem Simulations Using PEcAn

Authors

Aritra Dey

David LeBauer

1 Introduction

Welcome to this PEcAn workflow notebook! This notebook will guide you through running an ecosystem model using PEcAn’s programmatic interface.

1.1 What Is PEcAn?

PEcAn (Predictive Ecosystem Analyzer) is a scientific workflow system designed to make ecosystem modeling more transparent, repeatable, and accessible. It helps researchers:

  • Run ecosystem models with standardized inputs and outputs
  • Perform uncertainty analysis on model parameters
  • Compare model predictions with observations
  • Share and reproduce scientific workflows

1.2 What This Notebook Does

This notebook demonstrates how to:

  1. Set up and configure a PEcAn workflow
  2. Run an ecosystem model simulation
  3. Analyze and visualize the results

1.2.1 The Scenario Being Modeled:

We are modeling carbon and productivity dynamics at the Niwot Ridge Forest AmeriFlux site (US-NR1, a high-elevation temperate coniferous forest in Colorado. The model configuration uses the SIPNET process-based ecosystem model, parameterized with a temperate coniferous plant functional type (PFT).

The simulation is run for the full year 2004 (January 1 – December 31) using AmeriFlux LBL meteorological drivers from the Niwot Ridge site. The ensemble setup specifies a small ten member ensemble focusing on net primary productivity (NPP) as the target output variable, so the plots later on show the spread across members rather than a single line.

This scenario is designed to be a minimal, reproducible example to demonstrate how to run SIPNET within the PEcAn workflow. In later steps, this same framework can be extended to include more ensemble members, additional PFTs, longer time periods, or alternative meteorological inputs.

This run is based on a study by Moore et. al. (2007) that uses SIPNET to understand the relationship between water and carbon balance at this site.

1.3 Prerequisites

Before running this notebook, make sure you have:

  • All the PEcAn packages installed. You can install all PEcAn packages and their dependencies by running the following command in the root of your PEcAn repository:

# Enable repository from pecanproject
options(repos = c(
  pecanproject = 'https://pecanproject.r-universe.dev',
  CRAN = 'https://cloud.r-project.org'))
# Download and install PEcAn.all in R
install.packages(c('PEcAn.all', 'PEcAn.SIPNET'))

Note: This notebook uses the SIPNET model for demonstration purposes.

  • A valid pecan.xml configuration file or use the example provided: pecan/documentation/tutorials/Demo_1_Basic_Run/pecan.xml

1.4 How to Use This Notebook

  1. Each section is clearly marked with a heading
  2. Code chunks are provided with explanations
  3. You can run the code chunks sequentially
  4. Once you have successfully run the demo, you can modify parameters to configure new runs and analyses

Objective:

This demo illustrates how to run a basic PEcAn workflow using an R-based Quarto notebook. It will cover loading settings, writing model configuration files, and running model simulations. This approach provides a programmatic alternative to the web-based PEcAn interface for executing ecosystem models.

2 Session Info

This section prints your R session information for reproducibility. Having this information at the beginning helps with debugging even if the notebook encounters errors later.

PEcAn.all::pecan_version()
 package               v1.10.0 installed   source              
 PEcAn.all             1.10.0  1.10.0.9000 local (/pecan/bas...
 PEcAn.allometry       1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.assim.batch     1.9.1   1.9.1.9000  local (/pecan/mod...
 PEcAn.BASGRA          1.8.2   1.8.2.9000  local (/pecan/mod...
 PEcAn.benchmark       1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.BIOCRO          1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.CABLE           1.7.5   NA          NA                  
 PEcAn.CLM45           1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.DALEC           1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.data.atmosphere 1.9.1   1.9.1.9000  local (/pecan/mod...
 PEcAn.data.land       1.9.0   1.9.0.9000  local (/pecan/mod...
 PEcAn.data.mining     1.7.5   NA          NA                  
 PEcAn.data.remote     1.9.1   1.9.1.9000  local (/pecan/mod...
 PEcAn.DB              1.8.2   1.8.2.9000  local (/pecan/bas...
 PEcAn.dvmdostem       1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.ED2             1.8.2   1.8.2.9000  local (/pecan/mod...
 PEcAn.emulator        1.8.2   1.8.2.9000  local (/pecan/mod...
 PEcAn.FATES           1.8.1   1.8.1.9000  local (/pecan/mod...
 PEcAn.GDAY            1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.JULES           1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.LDNDC           1.0.2   1.0.2.9000  local (/pecan/mod...
 PEcAn.LINKAGES        1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.logger          1.8.4   1.8.4.9000  local (/pecan/bas...
 PEcAn.LPJGUESS        1.9.0   1.9.0.9000  local (/pecan/mod...
 PEcAn.MA              1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.MAAT            1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.MAESPA          1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.ModelName       0.0.1   0.0.1.9000  local (/pecan/mod...
 PEcAn.PEPRMT          <NA>    0.1.0.9000  local (/pecan/mod...
 PEcAn.photosynthesis  1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.PRELES          1.7.5   NA          NA                  
 PEcAn.priors          1.7.5   1.7.5.9000  local (/pecan/mod...
 PEcAn.qaqc            1.7.5   1.7.5.9000  local (/pecan/bas...
 PEcAn.remote          1.9.1   1.9.1.9000  local (/pecan/bas...
 PEcAn.RothC           <NA>    0.0.0.9000  local (/pecan/mod...
 PEcAn.settings        1.9.1   1.9.1.9000  local (/pecan/bas...
 PEcAn.SIBCASA         0.0.3   0.0.3.9000  local (/pecan/mod...
 PEcAn.SIPNET          1.10.0  1.10.9000   local (/pecan/mod...
 PEcAn.STICS           1.8.2   1.8.2.9000  local (/pecan/mod...
 PEcAn.uncertainty     1.9.0   1.9.0.9000  local (/pecan/mod...
 PEcAn.utils           1.8.2   1.8.2.9000  local (/pecan/bas...
 PEcAn.visualization   1.8.2   1.8.2.9000  local (/pecan/bas...
 PEcAn.workflow        1.10.0  1.10.0.9000 local (/pecan/bas...
 PEcAnAssimSequential  1.10.0  1.10.0.9000 local (/pecan/mod...
 PEcAnRTM              1.9.1   1.9.1.9000  local (/pecan/mod...

3 Install SIPNET v1.3.0

If you haven’t already installed the SIPNET binary, you can do so by running the following code. This will download the SIPNET binary to demo_outdir/sipnet and make it executable.

Note: The demo_outdir directory will be created in the root of your PEcAn installation (i.e., at pecan/demo_outdir/). This directory will contain the SIPNET binary as well as the output generated by PEcAn in this demo.

# Download and install SIPNET v1.3.0
source(
  here::here(
    "documentation/tutorials/Demo_1_Basic_Run/download_sipnet.R"
  )
)

Note: You can find the most recent version of the SIPNET binary at: SIPNET GitHub Releases, but this notebook is designed to work with SIPNET v1.3.0.

4 Load PEcAn Packages

First, we need to load the PEcAn R packages. These packages provide all the functions we’ll use to run the workflow.

# Load the PEcAn.all package, which includes all necessary PEcAn functionality
library("PEcAn.all")
Loading required package: PEcAn.DB
Loading required package: PEcAn.settings
Loading required package: PEcAn.MA
Loading required package: PEcAn.logger
Loading required package: PEcAn.utils
Loading required package: PEcAn.uncertainty
Loading required package: PEcAn.data.atmosphere
Loading required package: PEcAn.data.land
Loading required package: PEcAn.data.remote
Loading required package: PEcAn.assim.batch
Loading required package: PEcAn.emulator
Loading required package: PEcAn.priors
Loading required package: PEcAn.benchmark
Loading required package: PEcAn.remote
Loading required package: PEcAn.workflow
set.seed(20260325)

5 Load PEcAn Settings File

PEcAn uses an XML-based settings file (pecan.xml) to configure model runs. This file defines key information about the run including: PFT(s), site location, time period of the run, the location of input files and where outputs will be saved. Other settings outside the scope of this demo include the types of analyses that will be performed, how to connect to a database, and how to run it on a high performance computing cluster (we are using the default single model run on a single computer).

You can read more about the settings file in the “PEcAn XML” chapter of the documentation.

There is an example pecan.xml that has been configured for this demonstration. You can find it at pecan/documentation/tutorials/Demo_1_Basic_Run/pecan.xml.

This is how PEcAn loads the settings file:

settings_path <- here::here("documentation/tutorials/Demo_1_Basic_Run/pecan.xml")

6 Prepare and Validate Settings

After specifying the path to the pecan.xml file, the next step involves reading and preparing these settings. PEcAn provides utilities to process and validate the configurations before execution begins.

  • PEcAn.settings::read.settings(settings_path): Reads the pecan.xml file and converts it to an R list object.
  • PEcAn.settings::prepare.settings(settings): Prepares and validates settings. It sets defaults for missing fields, changes file paths to absolute paths, and generally ensures consistency.
# Read the settings from the pecan.xml file
settings <- PEcAn.settings::read.settings(settings_path)

# Prepare and validate the settings
settings <- PEcAn.settings::prepare.settings(settings)

7 Explore the Settings Object

Once the settings have been read and prepared, it is useful to inspect the structure of the settings object. This object is an R list containing all parameters and configurations for the PEcAn workflow.

  • str(settings) displays the internal structure of the settings object. This shows how the settings are represented in R and is useful for debugging and verifying settings.
str(settings)
List of 11
 $ info         :List of 4
  ..$ notes   : NULL
  ..$ userid  : chr "-1"
  ..$ username: NULL
  ..$ date    : chr "2025-06-19-15-34-01"
 $ outdir       : chr "/work/documentation/tutorials/Demo_1_Basic_Run/demo_outdir"
 $ pfts         :List of 1
  ..$ pft:List of 3
  .. ..$ name           : chr "temperate.coniferous"
  .. ..$ posterior.files: chr "pft/temperate.coniferous/prior.distns.Rdata"
  .. ..$ outdir         : chr "pft/temperate.coniferous"
 $ ensemble     :List of 5
  ..$ size         : chr "10"
  ..$ variable     : chr "NPP"
  ..$ start.year   : num 2004
  ..$ end.year     : num 2004
  ..$ samplingspace:List of 2
  .. ..$ parameters:List of 1
  .. .. ..$ method: chr "uniform"
  .. ..$ met       :List of 1
  .. .. ..$ method: chr "sampling"
 $ model        :List of 5
  ..$ type      : chr "SIPNET"
  ..$ revision  : chr "git"
  ..$ delete.raw: chr "FALSE"
  ..$ binary    : chr "demo_outdir/sipnet"
  ..$ id        : num -1
 $ run          :List of 4
  ..$ site      :List of 6
  .. ..$ met.start: chr "2004/01/01"
  .. ..$ met.end  : chr "2004/12/31"
  .. ..$ name     : chr "Niwot Ridge Forest/LTER NWT1 (US-NR1)"
  .. ..$ lat      : chr "40.0329"
  .. ..$ lon      : chr "-105.546"
  .. ..$ id       : num -1
  ..$ inputs    :List of 1
  .. ..$ met:List of 4
  .. .. ..$ source  : chr "AmerifluxLBL"
  .. .. ..$ output  : chr "SIPNET"
  .. .. ..$ username: chr "Aritra_2004"
  .. .. ..$ path    :List of 1
  .. .. .. ..$ path1: chr "dbfiles/AMF_US-NR1_BASE_HH_23-5.2004-01-01.2004-12-31.clim"
  ..$ start.date: chr "2004/01/01"
  ..$ end.date  : chr "2004/12/31"
 $ host         :List of 3
  ..$ name  : chr "localhost"
  ..$ rundir: chr "/work/documentation/tutorials/Demo_1_Basic_Run/demo_outdir/run"
  ..$ outdir: chr "/work/documentation/tutorials/Demo_1_Basic_Run/demo_outdir/out"
 $ settings.info:List of 3
  ..$ deprecated.settings.fixed: logi TRUE
  ..$ settings.updated         : logi TRUE
  ..$ checked                  : logi TRUE
 $ workflow     :List of 1
  ..$ id: chr "2026-08-14-17-55-22"
 $ rundir       : chr "/work/documentation/tutorials/Demo_1_Basic_Run/demo_outdir/run"
 $ modeloutdir  : chr "/work/documentation/tutorials/Demo_1_Basic_Run/demo_outdir/out"
 - attr(*, "class")= chr [1:3] "Settings" "SafeList" "list"

Your turn: explore the settings object further using the following commands: * names(settings) to list the top-level keys in the settings object * Once you know the names, you can look at each component in detail, for example: * settings$run to access the run-specific settings, such as start and end dates, model type, and output directory * settings$pfts to explore the Plant Functional Types settings

Now you can update each of these settings. Here is a simple example:

settings$info <- list(
  author = "Aritra Dey",
  date = Sys.Date(),
  description = "Demo run of PEcAn using SIPNET"
)

Editing the more interesting settings to change the PFT (settings$pfts) or extend the run (settings$run$end.date) is beyond the scope of this demo. You could change the pft or the end date, but you would need a new file containing parameters for that PFT (settings$pfts$pft$posterior.files), or a climate file (settings$run$met$path$path1) that extends to the desired simulation period.

The directory structure created by PEcAn for this demo run will look like this:

demo_outdir/               # Root output directory
├── run/                   # Configuration & execution metadata
│   ├── runs.txt           # List of run IDs (one per model realization)
│   ├── <runid>/           # Model-specific config copies (sometimes)
│   └── config.*           # Generated model configs (e.g., SIPNET)
├── out/                   # Raw model outputs by run ID
│   └── <runid>/           # E.g., daily or sub-daily SIPNET output files

The root output directory is defined here as demo_outdir/ by settings$outdir. This directory contains log and record files from the PEcAn workflow. They provide a detailed record of how data was generated and are key components of the analysis metadata and provenance. These can be useful for debugging as well as for downstream analysis.

Key subdirectories include run/ and out/ that contain files used to configure and run the model, files generated by the underlying ecosystem model, and PEcAn standard outputs used in downstream analyses. These are described in subsequent sections.

Additional outputs include logs, a STATUS file that records the steps of the workflow along with timestamps and whether each step was successful, and a copy of the pecan.*.xml file.

8 Write Model Configuration Files

This step decides which model runs to do, then writes the configuration files for them.

generate_joint_ensemble_design() builds the design: one row per run, holding indices that say which parameter draw and which input file each run uses. It returns those samples alongside the design, since the indices only mean anything together with the samples they point into.

runModule.run.write.configs() then takes that whole object and writes the SIPNET configuration files.

design <- PEcAn.uncertainty::generate_joint_ensemble_design(
  settings,
  ensemble_size = settings$ensemble$size
)

settings <- PEcAn.workflow::runModule.run.write.configs(
  settings,
  input_design = design
)
Loading required package: PEcAn.SIPNET

You can call runModule.run.write.configs() without a design and it will build one for itself, but that path is deprecated and will warn. Generating the design yourself also lets you inspect it before any runs happen: design$design_matrix is the table of runs, and design$samples holds the parameter draws behind it.

9 Run Model Simulations and Fetch Results

This section executes the actual model simulations and retrieves the results. The process is managed by PEcAn’s workflow system, which handles the execution of your chosen ecosystem model.

  • runModule_start_model_runs(settings): This function initiates the model runs based on your configuration. It manages the execution of your chosen ecosystem model, using the configuration files generated in the previous step.
PEcAn.workflow::runModule_start_model_runs(settings)

  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |======================================================================| 100%

This step generates raw model outputs in model-specific format (in this case, sipnet.out) as well as log files.

10 Extract Model Results and Prepare for Analysis

After the model simulation completes, we need to extract the results and prepare them for analysis. This involves:

  1. Reading the run IDs
  2. Setting up output paths
  3. Defining time period
  4. Loading model output
  5. Convert to a standard format
runids <- as.character(read.table(paste(settings$outdir, "/run/", "runs.txt", sep = ""))[, 1])
start.year <- lubridate::year(settings$run$start.date)
end.year <- lubridate::year(settings$run$end.date)

# one entry per ensemble member, keyed by run id
ensemble_output <- lapply(runids, function(runid) {
  PEcAn.utils::read.output(
    runid,
    file.path(settings$outdir, "/out/", runid),
    start.year,
    end.year,
    variables = NULL,
    dataframe = TRUE,
    verbose = FALSE
  )
})
names(ensemble_output) <- runids

# the members share a variable set, so the first one describes them all
model_output <- ensemble_output[[1]]
available_vars <- names(model_output)[!names(model_output) %in% c("posix", "time_bounds")]

# sub-daily fluxes are too spiky to read as ten overlaid lines, so keep a
# daily-averaged copy of each member for those plots
daily_output <- lapply(ensemble_output, function(member) {
  day <- as.Date(member$posix)
  vars <- setdiff(names(member), c("posix", "time_bounds"))
  averaged <- lapply(member[vars], function(x) as.numeric(tapply(x, day, mean, na.rm = TRUE)))
  names(averaged) <- vars
  c(list(posix = as.POSIXct(sort(unique(day)), tz = "UTC")), averaged)
})

# draw one line per ensemble member, so the spread across the ensemble is visible
plot_ensemble <- function(vars, cols, ylab, main, labels = vars, data = ensemble_output) {
  yrange <- range(
    unlist(lapply(data, function(member) unlist(member[vars]))),
    na.rm = TRUE
  )
  # empty plot drawn off the real time axis, so the x axis stays dates
  plot(
    data[[1]]$posix,
    data[[1]][[vars[1]]],
    type = "n",
    ylim = yrange,
    xlab = "Date",
    ylab = ylab,
    main = main
  )
  for (i in seq_along(vars)) {
    for (member in data) {
      lines(member$posix, member[[vars[i]]], col = adjustcolor(cols[i], alpha.f = 0.4))
    }
  }
  legend("topright", legend = labels, col = cols, lty = 1)
}

Running this code will convert model specific output files into a standardized netCDF ([year].nc) that can be downloaded for visualization and analysis (R, Matlab, ncview, panoply, etc). This is a key step, because this standardization enables PEcAn to apply downstream analyses to outputs from different ecosystem models.

11 Display Available Model Variables

This section shows all the variables that are available in the model output. These variables represent different ecosystem processes and states that the model has simulated.

Model Output Variables and Descriptions
Variable Description
GPP Gross Primary Productivity
NEE Net Ecosystem Exchange
TotalResp Total Respiration
AutoResp Autotrophic Respiration
HeteroResp Heterotrophic Respiration
SoilResp Soil Respiration
NPP Net Primary Productivity
TotLivBiom Total living biomass
AGB Total aboveground biomass
LAI Leaf Area Index
leaf_carbon_content Leaf Carbon Content
fine_root_carbon_content Fine Root Carbon Content
coarse_root_carbon_content Coarse Root Carbon Content
AbvGrndWood Above ground woody biomass
TotSoilCarb Total Soil Carbon
litter_carbon_content Litter Carbon Content
Qle Latent heat
Transp Total transpiration
SoilMoist Average Layer Soil Moisture
SoilMoistFrac Average Layer Fraction of Saturation
SWE Snow Water Equivalent
litter_mass_content_of_water Average layer litter moisture
year Year
year Year

12 Visualize Model Results

This section provides examples of how to create time series plots of different model variables. The examples cover various ecosystem processes including carbon fluxes, carbon pools, water variables, and structural variables like Leaf Area Index (LAI).

Each plot draws one line per ensemble member. The members differ only in their parameter draws, so the spread between the lines is the parameter uncertainty carried through the model.

12.1 Plot Carbon Fluxes

Some members run negative NPP even in the growing season. That happens when the drawn respiration parameters outweigh photosynthesis, and it shows up here because this demo samples from priors rather than from a meta-analysis, so the spread is wide. Demo 3 shows what constraining these parameters with data does to that spread.

GPP and NPP are sub-daily fluxes, so ten overlaid members would just fill the panel. These are averaged to daily values first, which is enough to see the members apart.

plot_ensemble(
  vars = c("GPP", "NPP"),
  cols = c("green", "blue"),
  ylab = "Carbon Flux (kg C m-2 s-1)",
  main = "Carbon Fluxes Over Time (daily average)",
  data = daily_output
)

12.2 Plot Carbon Pools

plot_ensemble(
  vars = c("TotLivBiom", "TotSoilCarb"),
  cols = c("darkgreen", "brown"),
  labels = c("Total Live Biomass", "Total Soil Carbon"),
  ylab = "Carbon Pool (kg C m-2)",
  main = "Carbon Pools Over Time"
)

12.3 Plot Water Variables

Soil moisture separates into ten lines once the growing season starts, but snow water equivalent stays a single line. That is expected: snow is driven by the met input, which is the same file for every member, while soil moisture responds to the sampled parameters.

plot_ensemble(
  vars = c("SoilMoist", "SWE"),
  cols = c("blue", "lightblue"),
  labels = c("Soil Moisture", "Snow Water Equivalent"),
  ylab = "Water (kg m-2)",
  main = "Soil Moisture and Snow Water Equivalent Over Time"
)

12.4 Plot LAI and Above Ground Wood

plot_ensemble(
  vars = "LAI",
  cols = "darkgreen",
  ylab = "LAI (m2 m-2)",
  main = "Leaf Area Index Over Time"
)

plot_ensemble(
  vars = "AbvGrndWood",
  cols = "brown",
  labels = "Above Ground Wood",
  ylab = "Wood (kg C m-2)",
  main = "Above Ground Wood Over Time"
)

13 Conclusion

This notebook demonstrated how to set up, run, and analyze a PEcAn ecosystem model workflow programmatically. You can now modify parameters, try different models, or extend the analysis as needed.

Try editing the pecan.xml file. Give it a new name and update the settings_path variable at the beginning of this Demo to point to the new file. See how the changes affect the model output!

14 Clean Up Workflow Output (Optional)

If you want to remove all files and directories created by this workflow and start fresh, you can run the following code. This will delete the entire output directory specified in your settings. Use with caution!

# WARNING: This will permanently delete all workflow output files!
# Uncomment the line below to enable cleanup.
# fs::dir_delete(settings$outdir)

15 Session Info

This section prints your R session information for reproducibility.

sessionInfo()
R version 4.4.3 (2025-02-28)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Etc/UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] PEcAn.SIPNET_1.10.9000           PEcAn.all_1.10.0.9000           
 [3] PEcAn.workflow_1.10.0.9000       PEcAn.remote_1.9.1.9000         
 [5] PEcAn.benchmark_1.7.5.9000       PEcAn.priors_1.7.5.9000         
 [7] PEcAn.emulator_1.8.2.9000        PEcAn.assim.batch_1.9.1.9000    
 [9] PEcAn.data.remote_1.9.1.9000     PEcAn.data.land_1.9.0.9000      
[11] PEcAn.data.atmosphere_1.9.1.9000 PEcAn.uncertainty_1.9.0.9000    
[13] PEcAn.utils_1.8.2.9000           PEcAn.logger_1.8.4.9000         
[15] PEcAn.MA_1.7.5.9000              PEcAn.settings_1.9.1.9000       
[17] PEcAn.DB_1.8.2.9000             

loaded via a namespace (and not attached):
 [1] PEcAn.qaqc_1.7.5.9000            DBI_1.2.3                       
 [3] PEcAn.allometry_1.7.5.9000       rlang_1.1.5                     
 [5] magrittr_2.0.3                   furrr_0.3.1                     
 [7] e1071_1.7-16                     compiler_4.4.3                  
 [9] vctrs_0.6.5                      stringr_1.5.1                   
[11] pkgconfig_2.0.3                  PEcAn.MAESPA_1.7.5.9000         
[13] fastmap_1.2.0                    PEcAn.ED2_1.8.2.9000            
[15] PEcAn.dvmdostem_1.7.5.9000       PEcAn.ModelName_0.0.1.9000      
[17] rmarkdown_2.29                   pracma_2.4.4                    
[19] sessioninfo_1.2.3                purrr_1.0.4                     
[21] xfun_0.52                        PEcAn.JULES_1.7.5.9000          
[23] jsonlite_2.0.0                   PEcAn.LINKAGES_1.7.5.9000       
[25] PEcAn.SIBCASA_0.0.3.9000         parallel_4.4.3                  
[27] R6_2.6.1                         PEcAn.DALEC_1.7.5.9000          
[29] stringi_1.8.7                    PEcAn.CLM45_1.7.5.9000          
[31] parallelly_1.43.0                numDeriv_2016.8-1.1             
[33] lubridate_1.9.4                  Rcpp_1.0.14                     
[35] iterators_1.0.14                 knitr_1.50                      
[37] PEcAnAssimSequential_1.10.0.9000 igraph_2.1.4                    
[39] timechange_0.3.0                 tidyselect_1.2.1                
[41] abind_1.4-8                      yaml_2.3.10                     
[43] PEcAn.LPJGUESS_1.9.0.9000        codetools_0.2-20                
[45] listenv_0.9.1                    lattice_0.22-6                  
[47] tibble_3.2.1                     withr_3.0.2                     
[49] coda_0.19-4.1                    evaluate_1.0.3                  
[51] future_1.34.0                    sf_1.0-20                       
[53] units_0.8-7                      proxy_0.4-27                    
[55] PEcAn.BASGRA_1.8.2.9000          pillar_1.10.2                   
[57] PEcAn.BIOCRO_1.7.5.9000          KernSmooth_2.23-26              
[59] foreach_1.5.2                    PEcAn.RothC_0.0.0.9000          
[61] ncdf4_1.24                       generics_0.1.3                  
[63] nimble_1.3.0                     rprojroot_2.0.4                 
[65] ggplot2_3.5.2                    munsell_0.5.1                   
[67] scales_1.3.0                     globals_0.16.3                  
[69] PEcAn.MAAT_1.7.5.9000            PEcAn.STICS_1.8.2.9000          
[71] class_7.3-23                     glue_1.8.0                      
[73] tools_4.4.3                      data.table_1.17.0               
[75] XML_3.99-0.18                    grid_4.4.3                      
[77] PEcAn.visualization_1.8.2.9000   PEcAn.photosynthesis_1.7.5.9000 
[79] colorspace_2.1-1                 PEcAn.PEPRMT_0.1.0.9000         
[81] cli_3.6.4                        PEcAnRTM_1.9.1.9000             
[83] dplyr_1.1.4                      PEcAn.GDAY_1.7.5.9000           
[85] gtable_0.3.6                     PEcAn.FATES_1.8.1.9000          
[87] digest_0.6.37                    classInt_0.4-11                 
[89] PEcAn.LDNDC_1.0.2.9000           rjson_0.2.23                    
[91] htmlwidgets_1.6.4                htmltools_0.5.8.1               
[93] lifecycle_1.0.4                  here_1.0.1