@@ -103,3 +103,196 @@ loading. Set `ILAMB_OUTPUT_DIR` to point the tests at your output directory.
103103- A known structural discontinuity exists in the underlying LandTrendr input
104104 around 2017-2018 (see the ORNL DAAC documentation); it is preserved as-is in
105105 the converted output rather than adjusted here.
106+
107+ ---
108+
109+ # Multi-Model Benchmarking (CMIP6 and TRENDY)
110+
111+ Building on the conversion pipeline above, these scripts benchmark the PEcAn
112+ reanalysis against two major model intercomparison ensembles, CMIP6 and TRENDY
113+ (Global Carbon Budget), using ILAMB, and score the individual PEcAn ensemble
114+ members so that PEcAn's skill spread can be compared directly with the model
115+ ensembles' spread.
116+
117+ Comparison is over North America for three state variables with established
118+ observational benchmarks: vegetation carbon (` cVeg ` ), soil carbon (` cSoil ` ),
119+ and leaf area index (` lai ` ). Soil moisture is supported by the conversion step
120+ but is not yet included in the multi-model scoring (see Scope below).
121+
122+ ## Pipeline
123+
124+ Run in order; each step writes inputs for the next. The first script is the
125+ conversion tool documented above.
126+
127+ | Step | Script | Purpose |
128+ | ------| --------| ---------|
129+ | 1 | ` convert_geotiff_to_ilamb.py ` | PEcAn GeoTIFF ensemble maps to CF netCDF |
130+ | 2 | ` build_cmip6_ensemble.py ` | Download + regrid CMIP6 historical fields |
131+ | 3 | ` build_cmip6_ssp.py ` | Splice CMIP6 historical + ssp245 for a longer record |
132+ | 4 | ` build_trendy_ensemble.py ` | Download + regrid TRENDY (GCB) fields |
133+ | 5 | ` build_window_ensembles.py ` | Slice all models to an evaluation window; build ensemble means |
134+ | 6 | ` build_pecan_members.py ` | Per-member PEcAn fields for spread analysis |
135+ | 7 | ` make_spread_figures.py ` | Spread figure from ILAMB scores |
136+
137+ All model fields are regridded onto the same 0.5 degree North American grid the
138+ conversion step produces, so PEcAn, the observational benchmarks, and every
139+ model share one grid. LAI is reduced to its July value throughout, to match the
140+ July snapshot of the PEcAn product. The TRENDY ensemble mean is built only from
141+ members that pass a per-variable physical-plausibility screen; the members used
142+ are recorded in ` trendy_ensemble_manifest.json ` .
143+
144+ ## Evaluation windows
145+
146+ The PEcAn reanalysis and the models are compared over two windows, which answer
147+ different questions:
148+
149+ - ** 2012-2014** : a mean-state snapshot using the full set of CMIP6 historical
150+ models (25), the broadest representative model sample.
151+ - ** 2015-2023** : a longer record for interannual variability and trends, using
152+ the CMIP6 models that provide a continuous historical + ssp245 land-carbon
153+ record (14).
154+
155+ Reporting both is deliberate: the longer window supports variability and trend
156+ analysis that three years cannot, while the 2012-2014 window retains the full
157+ model sample. The two windows also differ in CMIP6 composition, and that
158+ difference is itself informative; see the note on soil carbon below.
159+
160+ ## ILAMB configuration
161+
162+ ` pecan_ilamb.cfg ` defines three confrontations:
163+
164+ | Variable | Benchmark | Notes |
165+ | ----------| -----------| -------|
166+ | Biomass (cVeg) | Xu & Saatchi 2021 | RMSE skipped; mass-weighted |
167+ | Leaf Area Index | GIMMS LAI4g | seasonal-cycle and RMSE skipped |
168+ | Soil Carbon | HWSD2 | RMSE skipped; mass-weighted |
169+
170+ The configuration applies no time or region restriction itself; the evaluation
171+ window is set entirely by the windowed input files (step 5), and the North
172+ American extent is set by the grid.
173+
174+ ## Results
175+
176+ ILAMB overall scores (0-1, higher is a closer match to the benchmark). PEcAn is
177+ the reanalysis ensemble mean; CMIP6 and TRENDY are ensemble means.
178+
179+ ** 2012-2014 (25 CMIP6 models)**
180+
181+ | Variable | PEcAn | CMIP6 | TRENDY |
182+ | ----------| -------| -------| --------|
183+ | Biomass | 0.483 | 0.477 | 0.410 |
184+ | Leaf Area Index | 0.510 | 0.448 | 0.453 |
185+ | Soil Carbon | 0.625 | 0.634 | 0.478 |
186+
187+ ** 2015-2023 (14 CMIP6 models)**
188+
189+ | Variable | PEcAn | CMIP6 | TRENDY |
190+ | ----------| -------| -------| --------|
191+ | Biomass | 0.464 | 0.473 | 0.409 |
192+ | Leaf Area Index | 0.513 | 0.448 | 0.454 |
193+ | Soil Carbon | 0.648 | 0.715 | 0.478 |
194+
195+ PEcAn scores above both model ensembles on leaf area index in every window, and
196+ above the TRENDY ensemble on all three variables. On biomass and soil carbon it
197+ is comparable to the CMIP6 ensemble.
198+
199+ The higher CMIP6 soil-carbon score in the 2015-2023 window (0.715) is a
200+ composition effect, not a change in the benchmark: the 14 models with a
201+ continuous ssp245 record happen to be stronger soil-carbon performers. The full
202+ 25-model window (0.634) is the representative figure, where PEcAn and CMIP6 are
203+ close.
204+
205+ ## Ensemble spread
206+
207+ Scoring the 100 individual PEcAn members alongside the individual CMIP6 and
208+ TRENDY models shows that the PEcAn members vary far less in skill than the
209+ models do. Standard deviation of member scores:
210+
211+ | Variable | PEcAn (100) | CMIP6 | TRENDY |
212+ | ----------| -------------| -------| --------|
213+ | Biomass (2012-2014) | 0.003 | 0.057 | 0.086 |
214+ | LAI (2012-2014) | 0.004 | 0.082 | 0.145 |
215+ | Soil Carbon (2012-2014) | 0.003 | 0.166 | 0.137 |
216+ | Biomass (2015-2023) | 0.014 | 0.040 | 0.086 |
217+ | LAI (2015-2023) | 0.002 | 0.085 | 0.147 |
218+ | Soil Carbon (2015-2023) | 0.001 | 0.146 | 0.137 |
219+
220+ The narrow PEcAn spread reflects skill, not identical members: the members
221+ differ in their spatial carbon fields (for soil carbon, on the order of one
222+ percent of the field, member to member) yet match the benchmark about equally
223+ well. Whether that spread is appropriately sized relative to the error, that is,
224+ whether the ensemble is well-calibrated, is a separate question, addressed by
225+ probabilistic scoring in a later contribution.
226+
227+ ` fig_spread_clouds.png ` shows the per-member scores for all three ensembles
228+ across both windows.
229+
230+ ## Scope and caveats
231+
232+ - ** North America only.** The comparison uses the North American PEcAn grid.
233+ - ** Biomass pool mismatch.** PEcAn ` cVeg ` is above-ground wood carbon, while the
234+ Xu & Saatchi benchmark is total live biomass (including roots). PEcAn is
235+ therefore expected to read somewhat low on biomass by construction.
236+ - ** Soil-carbon depth mismatch.** PEcAn soil carbon integrates 0-200 cm, deeper
237+ than the benchmark, so PEcAn reads higher in deep-carbon regions.
238+ - ** Soil moisture deferred.** The conversion step handles soil moisture, but
239+ multi-model soil-moisture scoring is not yet included.
240+ - ** Probabilistic scoring is future work.** The spread results above motivate
241+ ensemble calibration metrics (rank histograms, reliability), which are a
242+ planned follow-on rather than part of this contribution.
243+
244+ ## Reproducing the figure
245+
246+ ` make_spread_figures.py ` reads ILAMB ` scores.csv ` output for the two windows.
247+ Its paths refer to the analysis working tree where the scoring runs were
248+ produced; point them at your own ILAMB build directories to regenerate the
249+ figure.
250+
251+ ## Data sources
252+
253+ - CMIP6: ESGF, via ` intake-esgf ` (historical and ssp245, r1i1p1f1).
254+ - TRENDY: Global Carbon Budget 2024, public download index.
255+ - Benchmarks: Xu & Saatchi 2021 (biomass), GIMMS LAI4g (leaf area index),
256+ HWSD2 (soil carbon).
257+
258+ ## Customizing the benchmark
259+
260+ The benchmark is designed to stay usable as models and datasets evolve. Three
261+ common changes: updating or adding models, adding benchmark datasets, and
262+ adjusting the scoring weights. The per-field meaning of every configuration
263+ option is documented inline in ` pecan_ilamb.cfg ` .
264+
265+ ### Updating or adding a model
266+
267+ Each model is just a directory under the model root (for example
268+ ` ilamb_models_2012_2014/ ` ), containing ` cVeg.nc ` , ` cSoil.nc ` , and ` lai.nc ` on
269+ the analysis grid. ILAMB scores every model directory it finds there, so:
270+
271+ - To add a model, place its directory (with the three variable files, regridded
272+ to the analysis grid) under the model root and re-run ` ilamb-run ` .
273+ - To update a model to a newer version (for example a new CMIP6 or TRENDY
274+ release), regenerate its files with the relevant build script and overwrite
275+ that model's directory. The build scripts take the source and output paths as
276+ arguments, so pointing them at a new data release does not require code edits.
277+
278+ The ensemble means (CMIP6, TRENDY, PEcAn) are rebuilt from the individual
279+ members by ` build_window_ensembles.py ` , so re-run it after changing the set of
280+ member models so the means reflect the new set.
281+
282+ ### Adding a benchmark dataset
283+
284+ Benchmarks are defined in ` pecan_ilamb.cfg ` . To add one for an existing
285+ variable, copy the dataset block under the relevant ` [h2: ...] ` variable, rename
286+ it, and point its ` source ` at the new benchmark netCDF (placed under
287+ ` ILAMB_ROOT/DATA/... ` ). When more than one benchmark is listed under a variable,
288+ their ` weight ` values set how they combine. To score a new variable entirely,
289+ add a new ` [h2: ...] ` block and make sure the model files contain that variable.
290+
291+ ### Adjusting weights
292+
293+ Scoring weights live in ` pecan_ilamb.cfg ` at two levels: the ` weight ` on each
294+ ` [h2: ...] ` variable sets how much that variable counts toward the overall
295+ score relative to the other variables, and the ` weight ` on each dataset block
296+ sets how much that dataset counts within its variable. Both are relative
297+ weights, not percentages. See the inline comments in the config for the full
298+ per-field reference.
0 commit comments