ECCO-Darwin parameter inventory (Carroll 2020 build)¶
A verified count of biogeochemistry parameters in the ECCO-Darwin v04 LLC270 JAMES paper configuration (Carroll et al. 2020, Darwin 1). Captured here so DarwinDiff scoping arguments rest on real numbers rather than estimates.
Note (2026-05-09): Carroll 2022 (v05, Darwin 3) inherits Carroll 2020's six calibrated values bit-for-bit — verified directly by reading
v04/llc270_JAMES_paper/code_darwin/{darwin_init_fixed.F, darwin_generate_phyto.F}andv05/llc270/input/data.darwin. The numbers in this doc are therefore current for both Carroll 2020 and Carroll 2022 setups. The DarwinDiff project's active recovery target is Carroll 2022 / v05 (publicly-accessible), but the underlying parameter inventory is unchanged. Seedocs/findings/2026_05_09.mdfinding 8 anddocs/research_log.md§F1.
Method¶
Read three files line-by-line from a fresh clone of MITgcm-contrib/ecco_darwin at master, scoped to v04/llc270_JAMES_paper/code_darwin/:
DARWIN_OPTIONS.h(111 lines), to determine which#ifdefblocks are active in the compiled binary.darwin_init_fixed.F(390 lines), with every parameter assignment classified.darwin_generate_phyto.F(782 lines), grep-confirmed as mostly mechanical derivation from theinit_fixed.Fscalars.darwin_plankton.F(1711 lines), the dynamics integrator. It uses parameters defined elsewhere; no new independent parameters introduced.
Active compile-time flags (Carroll 2020 build)¶
From DARWIN_OPTIONS.h:
- Active:
ALLOW_CARBON,GEIDER,DYNAMIC_CHL,MINFE,IRON_SED_SOURCE,IRON_SED_SOURCE_VARIABLE,PART_SCAV,NINE_SPECIES_SETUP,TEMP_VERSION 2,USE_QSW,USE_EXFWIND,USE_EXFCO2,PORT_RAND,CALC_RATE_TOTALS - Inactive:
WAVEBANDS,OASIM,OLD_GRAZE,ALLOW_DIAZ,ALLOW_DENIT,ALLOW_MUTANTS, allDAR_DIAG_*,RELAX_NUTS,FLUX_NUTS
Denitrification, diazotrophy, spectral radiative transfer, and most diagnostics are not in the compiled binary for this run.
Model dimensions (DARWIN_SIZE.h)¶
- 5 phytoplankton functional types (
npmax = 5; theNINE_SPECIES_SETUPflag name is historical) - 2 zooplankton functional types (
nzmax = 2) - 4 elemental components per zooplankton (
nCompZooMax = 4: P, N, Fe, Si) - 39 prognostic tracers total, matching Carroll 2020 §2.3
Verified parameter counts¶
| Class | Count | Source file |
|---|---|---|
| Independent active tunable scalars | 103 | darwin_init_fixed.F |
Derived equalities (Kpremin_N = Kpremin_P, wn_sink = wp_sink, etc.) |
6 | darwin_init_fixed.F |
| Dead in this build (#ifdef inactive: denit, diaz, mutants, diagnostics) | 11 | darwin_init_fixed.F |
Unit conversions (parconv, permil, Pa2Atm) |
3 | darwin_init_fixed.F |
Hardcoded per-phyto identity traits (physize, phyto_esd, phyto_vol, diacoc, diazotroph, nsource, ap_type × 5 types) |
35 (7 traits × 5 phyto types, exact) | darwin_generate_phyto.F |
| New independent parameters | 0 | darwin_plankton.F |
The 35 hardcoded per-phyto traits are classifications (small vs large, diatom vs cocco vs other, etc.) that define the identity of each phytoplankton type, not adjustable knobs. The kinetic per-phyto arrays (mu, ksatPO4, R_NP, wsink, ...) are derived from the 103 init_fixed.F scalars by simple assignment or arithmetic (for example ksatNO3(np) = ksatPO4(np) * R_NP(np)).
Headline: ~103 independent tunable scalar knobs.
Parameters tuned via Green's functions in Carroll 2020¶
Six. Source values verified directly in the Carroll 2020 build, with paper Table 1 cross-reference:
| # | Source variable | File:line | Optimized value | Paper Table 1 name |
|---|---|---|---|---|
| 1 | alpfe |
init_fixed.F:83 |
0.92831 | Iron dust solubility |
| 2 | scav_rat |
init_fixed.F:101 |
10.41124 × 0.005 / 86400 | Iron scavenging rate |
| 3 | Smallgrow |
init_fixed.F:161 |
0.66098 | Small phytoplankton growth rate |
| 4 | Biggrow |
init_fixed.F:162 |
0.43148 | Large phytoplankton growth rate |
| 5 | diatomgraz |
init_fixed.F:272 |
0.83003 | Diatom palatability |
| 6 | R_PICPOC |
generate_phyto.F:484 |
0.04245 | PIC/POC ratio |
Each parameter has its pre-optimization default visible in a commented-out line nearby (for example cswd scav_rat=0.005 _d 0/(86400.0 _d 0) at line 99). The Green's functions workflow literally edits these constants in source and recompiles per experiment — the "labor-intensive" cycle this project replaces with autograd.
What this means for DarwinDiff¶
Calibration coverage gap: 6 / 103 ≈ 5.8 %. The other ~94 % of independently tunable knobs sit at expert or literature defaults applied uniformly across the global ocean. Many are single global scalars: Kdop = 2 / (100 × 86400) controls DOC remineralization rate everywhere on Earth, kgrazesat = 0.085 is one number for grazing half-saturation across all ocean conditions, phytoTempOptimum is one curve per phytoplankton class with no spatial variation. Replacing such scalars with MLP-predicted spatial fields, which is what DarwinDiff's parameter-learner does, is a structurally cheap upgrade per parameter that reaches well past the Green's functions ceiling of "a handful at a time."
Savelli et al. 2026 explicitly flagged the 100-day fixed DOC remineralization (Kdop in the source) as a real limitation. Other parameters in the 94 % likely sit in the same shape: known to be uncertain, plausibly important, but unreached by Green's functions because Green's functions cannot afford them.
Darwin 3 (v06/llc270) — also audited¶
Darwin 3 is the version used in the repo's v05 and v06 setups. It is a major architectural rework of Darwin 1: most parameters are now exposed via namelist files in input_darwin/ rather than hardcoded in local code_darwin/ source. The code_darwin/ directory in v06/llc270 contains only headers (DARWIN_OPTIONS.h, DARWIN_SIZE.h, etc.); the kinetic source lives upstream in MITgcm/pkg/darwin/.
Model dimensions (v06/llc270/code_darwin/DARWIN_SIZE.h)¶
nplank = 10— total plankton types (was 5 phyto + 2 zoo = 7 in Darwin 1)nGroup = 7— functional groups: PicoCyano, PicoEuk, Cocco, Diazo, Diatom, Dino, ZoonPhoto = 6— phototroph typesnopt = 12— optical typesnlam = 1— wavebands (RADTRANS not active in this build)
Active compile-time flags¶
From v06/llc270/code_darwin/DARWIN_OPTIONS.h (174 lines):
- Active (21 flags):
DARWIN_ALLOW_CHLQUOTA,DARWIN_ALLOW_CDOM,DARWIN_ALLOW_CARBON,DARWIN_ALLOW_DENIT,DARWIN_BOTTOM_SINK,DARWIN_ALLOW_GEIDER,DARWIN_GEIDER_RHO_SYNTH,DARWIN_DIAG_IOP,DARWIN_TEMP_VERSION 4,DARWIN_MINFE,DARWIN_PART_SCAV,DARWIN_IRON_SED_SOURCE_VARIABLE,DARWIN_DIAG_PERTYPE,DARWIN_ALLOW_CONS,DARWIN_DIAG_TENDENCIES,DARWIN_ALLOW_RADIv2,DARWIN_NUTRIENT_RUNOFF,DARWIN_SOLVESAPHE,DARWIN_TOTALPHSCALE,DARWIN_ALLOW_HYDROTHERMAL_VENTS,DARWIN_CDOM_UNITS_CARBON - Inactive (21 flags):
DARWIN_ALLOW_NQUOTA,PQUOTA,FEQUOTA,SIQUOTA,EXUDE,NITRATE_FELIMIT,AVPAR,CHL_INIT_LEGACY,SCATTER_CHL,GRAZING_SWITCH,ALLOMETRIC_PALAT,NOZOOTEMP,NOTEMP,TEMP_RANGE,IRON_SED_SOURCE_POP,DEBUG,PART_SCAV_POP,RANDOM_TRAITS,TWO_SPECIES_SETUP,NINE_SPECIES_SETUP,ALLOW_DIAZ
Notable: denitrification is on in Darwin 3 (was off in Carroll 2020), diazotrophy is still off, the Darwin 1 random-trait code path is fully replaced by the new allometric trait machinery.
Verified tunable parameter counts (from namelists)¶
Read in full: data.darwin (267 lines) and data.traits (93 lines). Each namelist counted by listing every distinct LHS name.
| Namelist | Tunable parameter names | Total names | Notes |
|---|---|---|---|
&DARWIN_FORCING_PARAMS |
20 | 71 | 12 input scaling factors (darwin_inscal_*) + 8 stoichiometric ratios for runoff (R_*_runoff). Excludes file paths, dates, periods, 3 boolean toggles. |
&DARWIN_INTERP_PARAMS |
0 | 28 | Interpolation grid metadata only. |
&DARWIN_PARAMS (kinetic core) |
29 | 37 | iron (8: alpfe, freefemax, depthfesed, scav_tau, ligand_tot, scav_POC_wgt, scav_PSi_wgt, scav_PIC_wgt), DOM remin (4: kdoc/kdop/kdon/kdofe), POM remin (5: kPOC/kPOP/kPON/kPOFe/kPOSi), sinking (6: wC_sink/wN_sink/wP_sink/wFe_sink/wSi_sink/wPIC_sink), plus phygrazmin, hollexp, tempCoeffArr, PARmin, SURFDICMIN, SURFALKMIN. Excludes 5 numerical-config (darwin_chlIter0, darwin_pickupSuff, darwin_chlInitBalanced, darwin_seed, darwin_disscSelect) and 1 dead (diaz_ini_fac, ALLOW_DIAZ undef). 2 more (selectPHsolver, selectK1K2const) are commented out. |
&DARWIN_CDOM_PARAMS |
5 | 5 active | fracCDOM, cdomdegrd, CDOMbleach, PARCDOM, CDOMcoeff. 3 more (R_NP_CDOM, R_FeP_CDOM, R_CP_CDOM) commented out. |
&DARWIN_RADTRANS_PARAMS |
10 (7 scalars + 3 array names) | 14 | scalar tunables: darwin_Sdom, darwin_aCDOM_fac, darwin_part_size_P, darwin_rCDOM, darwin_RPOC, darwin_absorpSlope, darwin_bbbSlope. 3 spectral arrays of 13 values each: darwin_scatSwitchSizeLog, darwin_scatSlopeSmall, darwin_scatSlopeLarge. Excludes 3 file paths and 1 boolean (darwin_allomSpectra). |
&DARWIN_RANDOM_PARAMS |
0 | 0 | empty namelist |
&DARWIN_TRAIT_PARAMS |
28 | 48 | excludes grp_names (identity), 16 group classification flags (grp_nplank, grp_photo, grp_pred, grp_prey, grp_hasSi, grp_hasPIC, grp_DIAZO, grp_useNH4, grp_useNO2, grp_useNO3, grp_combNO, grp_bacttype, grp_aerobic, grp_denit, grp_tempMort, grp_tempMort2, grp_aptype), and 2 boolean/select configs (darwin_effective_ksat, darwin_select_kn_allom). Most tunables are arrays at size nGroup=7, nPhoto=6, or nplank=10; some (e.g. a_PCmax(1..6)) are set per index. |
data.traits &DARWIN_TRAITS |
8 | 8 | EXPORTFRACMORT, EXPORTFRACMORT2, PALAT (10×10 matrix), ASSEFF (10×10), GRAZEMAX, EXPORTFRACPREYPRED (10×10), MORT, MORT2. |
Darwin 3 distinct tunable parameter names: exactly 100.
| Counting basis | Count |
|---|---|
Distinct tunable parameter names (across all namelists in data.darwin + data.traits) |
100 |
| Individual tunable values, arrays expanded over plankton, groups, and matrix dimensions | 657 |
Breakdown of the 657 individual values:
| Source | Values | How counted |
|---|---|---|
&DARWIN_FORCING_PARAMS |
20 | 20 scalars × 1 |
&DARWIN_PARAMS |
29 | 29 scalars × 1 |
&DARWIN_CDOM_PARAMS |
5 | 5 scalars × 1 |
&DARWIN_RADTRANS_PARAMS |
46 | 7 scalars + 3 arrays × 13 |
&DARWIN_TRAIT_PARAMS |
207 | sum of array sizes per name (10+6+6+6+6+6+1+1+7+7+7+6+6+7+7+7+6+1+1+1+7+7+7+7+7+7+7+49) |
&DARWIN_TRAITS |
350 | 10+10+100+100+10+100+10+10 |
| Total | 657 |
Architectural difference that matters for DarwinDiff¶
Darwin 1: parameters hardcoded in source (code_darwin/); each Green's functions experiment recompiles a different binary. Tunable knobs ≈ 103 scalars in init_fixed.F.
Darwin 3: parameters exposed via namelist files (input_darwin/data.darwin, data.traits). Tunable knobs ≈ 101 distinct names at the namelist level, with most being arrays. No recompile needed to vary them.
This means Darwin 3 is structurally a better target for DarwinDiff. Spatially-varying parameter learning (the DarwinDiff approach) would write per-cell parameter fields rather than per-class scalars; the namelist-driven architecture makes it cheaper to plug in MLP-predicted values without source modifications.
Darwin 3 caveats not yet verified¶
- Default values for parameters NOT explicitly overridden in v06/llc270 namelists live upstream in
MITgcm/pkg/darwin/source; that code is not inMITgcm-contrib/ecco_darwinand was not audited here. There may be additional parameters with literature defaults that the v06 setup inherits silently. - The
&DARWIN_RADTRANS_PARAMSnamelist is read even though the active flag set does not includeALLOW_RADTRANSper the readme. Worth checking whether those parameters affect the v06 binary or are dead.
Caveats¶
- Darwin 1 numbers are exact for the Carroll 2020 build (
v04/llc270_JAMES_paper). All three key source files read line-by-line. - Darwin 3 numbers are exact for the namelist content of v06/llc270 (
data.darwin,data.traits). The upstream MITgcmpkg/darwin/source (where defaults live for unset parameters) was not audited. - "Independent tunable" excludes derived equalities, dead-code parameters, unit conversions, identity classifications, file-path and date strings, and pure numerical-config parameters.
- "Tunable" is partly a judgment call. Stricter or looser definitions could shift the counts by ±10–20.
Provenance¶
Audit performed 2026-05-02 via shallow clone of MITgcm-contrib/ecco_darwin (master branch).
- Darwin 1 (
v04/llc270_JAMES_paper/code_darwin/):DARWIN_OPTIONS.h(111 lines),DARWIN_SIZE.h(131 lines),darwin_init_fixed.F(390 lines),darwin_generate_phyto.F(782 lines) all read in full.darwin_plankton.F(1711 lines) grep-scanned for top-level assignments. - Darwin 3 (
v06/llc270/):code_darwin/DARWIN_OPTIONS.h(174 lines),code_darwin/DARWIN_SIZE.h(34 lines),input_darwin/data.darwin(267 lines),input_darwin/data.traits(93 lines) all read in full.
Classifications cross-checked against DARWIN_OPTIONS.h #ifdef flags in each version. Temp clone deleted after audit; all numbers are reproducible by anyone running the same procedure.
Appendix A — Darwin 1 (darwin_init_fixed.F) full parameter list¶
123 distinct named parameters total. Categories below sum to that.
A.1 Independent active tunable scalars (103)
Light + attenuation (6): k0, kc, parfrac, chlpmax, chlpmin, istar
Iron cycle (11): alpfe ★, scav, ligand_tot, ligand_stab, freefemax, depthfesed, fesedflux, fesedflux_pcm, scav_rat ★, scav_inter, scav_exp
Nitrification + O₂ (4): O2crit, Knita, Knitb, PAR0
GEIDER growth scalars (4): Smallgrow ★, Biggrow ★, Smallgrowrange, Biggrowrange
GEIDER chlorophyll + quantum yield (8): smallchl2cmax, smallchl2cmaxrange, Bigchl2cmax, Bigchl2cmaxrange, smallmQyield, smallmQyieldrange, BigmQyield, BigmQyieldrange
Other phyto (2): aphy_chl_ave, inhibcoef_geid_val
Dynamic chlorophyll (1): acclimtimescl
Mortality + sinking scalars (8): Smallmort, Bigmort, Smallmortrange, Bigmortrange, Smallexport, Bigexport, SmallSink, BigSink
Temperature (8): tempcoeff1, tempcoeff2_small, tempcoeff2_big, tempcoeff3, tempmax, temprange, tempnorm, tempdecay
Phosphate half-saturation per phyto class (8): SmallPsat, BigPsat, ProcPsat, UniDzPsat, SmallPsatrange, BigPsatrange, ProcPsatrange, UniDzPsatrange
Other nutrient (8): ksatNH4fac, ksatNO2fac, sig1, sig2, sig3, ngrowfac, ilight, val_ksatsi
Elemental ratios — active (5): val_R_SiP_diatom, val_R_NP, val_RFeP, val_R_PC, val_R_PICPOC
Grazing (14): kgrazesat, phygrazmin, GrazeFast, GrazeSlow, GrazeEfflow, GrazeEffmod, GrazeEffhi, palathi, palatlo, diatomgraz ★, coccograz, olargegraz, ExGrazfracbig, ExGrazfracsmall
Zooplankton mortality + export (4): ZoomortSmall, ZoomortBig, ZooexfacSmall, ZooexfacBig
Phyto biomass threshold (1): phymin
DOM remineralisation (3): Kdop, Kdon, KdoFe
POM remineralisation + sinking, independent (3): Kpremin_P, Kpremin_Si, wp_sink
Carbon system, ALLOW_CARBON active (5): R_OP, Kdoc, Kpremin_C, Kdissc, wpic_sink
★ = tuned by Carroll 2020 Green's functions (5 of 103 in init_fixed.F; the 6th R_PICPOC override lives in generate_phyto.F:484).
A.2 Derived equalities (6)
Kpremin_N (= Kpremin_P), Kpremin_Fe (= Kpremin_P), wn_sink (= wp_sink), wfe_sink (= wp_sink), wsi_sink (= wp_sink), wc_sink (= wp_sink).
A.3 Dead in this build (11)
ALLOW_DENITundef:depthdenit,denit_npALLOW_DIAZundef:diaz_growfac,val_R_NP_diaz,val_RFeP_diazALLOW_MUTANTSundef:prochlPsat(commented "used only for mutants")DAR_DIAG_DIVERundef:diver_thresh0,diver_thresh1,diver_thresh2,diver_thresh3,diver_thresh4
A.4 Unit conversions / physical constants (3)
parconv (W/m² → µEin), permil (1/1024.5, density conversion), Pa2Atm (Pa → atm).
Appendix B — Darwin 1 (darwin_generate_phyto.F) hardcoded per-phyto identity traits¶
7 distinct trait arrays × 5 phyto types = 35 individual values:
physize(np), phyto_esd(np), phyto_vol(np), diacoc(np), diazotroph(np), nsource(np), ap_type(np).
Plus one inline Green's-functions override at line 484: R_PICPOC(np) = 0.04245 for np = 2, 3, 8 (only np = 2, 3 valid since npmax = 5).
Appendix C — Darwin 3 (v06/llc270 namelists) full parameter list¶
100 distinct tunable parameter names total.
C.1 &DARWIN_FORCING_PARAMS (20)
darwin_inscal_iron, darwin_inscal_ventHe3, darwin_inscal_DOCrunoff, darwin_inscal_DONrunoff, R_DOFe_DOP_runoff, darwin_inscal_DOPrunoff, R_NO3_DIN_runoff, R_NO2_DIN_runoff, R_NH4_DIN_runoff, darwin_inscal_DINrunoff, R_DFe_DIP_runoff, R_DIP_IP_runoff, darwin_inscal_IPrunoff, darwin_inscal_DSirunoff, darwin_inscal_POCrunoff, R_POFe_POP_runoff, darwin_inscal_POPrunoff, darwin_inscal_PONrunoff, R_ALK_DIC_runoff, darwin_inscal_DICrunoff.
C.2 &DARWIN_PARAMS (29)
tempCoeffArr, PARmin, alpfe, freefemax, depthfesed, scav_tau, ligand_tot, scav_POC_wgt, scav_PSi_wgt, scav_PIC_wgt, kdoc, kdop, kdon, kdofe, kPOC, kPOP, kPON, kPOFe, kPOSi, phygrazmin, hollexp, wC_sink, wN_sink, wP_sink, wFe_sink, wSi_sink, wPIC_sink, SURFDICMIN, SURFALKMIN.
C.3 &DARWIN_CDOM_PARAMS (5)
fracCDOM, cdomdegrd, CDOMbleach, PARCDOM, CDOMcoeff.
C.4 &DARWIN_RADTRANS_PARAMS (10)
Scalars (7): darwin_Sdom, darwin_aCDOM_fac, darwin_part_size_P, darwin_rCDOM, darwin_RPOC, darwin_absorpSlope, darwin_bbbSlope.
Spectral arrays of 13 values each (3): darwin_scatSwitchSizeLog, darwin_scatSlopeSmall, darwin_scatSlopeLarge.
C.5 &DARWIN_TRAIT_PARAMS (28)
a_R_PICPOC, a_Xmin, a_phytoTempAe, a_mQyield, a_chl2cmax, a_acclimtimescl, logvolbase, logvolinc, logvol0ind, a_biosink, b_biosink, a_PCmax, a_PCmax_denom, b_PCmax, a_Qpmin, a_Qpmax, grp_ExportFracPreyPred, a_R_ChlC, a_grazemax, b_grazemax, a_phytoTempExp2, a_R_PC, a_R_FeC, a_R_NC, a_R_SiC, a_kgrazesat, b_kgrazesat, grp_ass_eff.
C.6 &DARWIN_TRAITS from data.traits (8)
EXPORTFRACMORT, EXPORTFRACMORT2, PALAT, ASSEFF, GRAZEMAX, EXPORTFRACPREYPRED, MORT, MORT2.
C.7 Excluded from the 100 tunables (for the record)
- File paths, dates, periods (51 in
&DARWIN_FORCING_PARAMS):ironFile,ironPeriod,pCO2File,pCO2startdate1,pCO2startdate2,pCO2period,ventHe3File,ventHe3Period, the 12 runoff*file/*startdate1/*startdate2/*periodquartets (48 names),darwin_useEXFwind,darwin_useQsw,darwin_useSEAICE(3 booleans). - Interpolation grid metadata (28 in
&DARWIN_INTERP_PARAMS): 10*_interpMethodflags, 18lon0/lon_inc/lat0/lat_inc/nlon/nlatfor ventHe3, iron, pCO2. - Numerical config in
&DARWIN_PARAMS(8):darwin_chlIter0,darwin_pickupSuff,darwin_chlInitBalanced,diaz_ini_fac(dead,ALLOW_DIAZundef),darwin_seed,darwin_disscSelect, plus 2 commented-out:selectPHsolver,selectK1K2const. - Commented-out CDOM stoichiometric ratios (3):
R_NP_CDOM,R_FeP_CDOM,R_CP_CDOM. - RADTRANS file paths + boolean (4):
darwin_waterabsorbFile,darwin_phytoabsorbFile,darwin_particleabsorbFile,darwin_allomSpectra. - TRAIT_PARAMS identity + classification (20):
grp_names,grp_nplank,grp_photo,grp_pred,grp_prey,grp_hasSi,grp_hasPIC,grp_DIAZO,grp_useNH4,grp_useNO2,grp_useNO3,grp_combNO,grp_bacttype,grp_aerobic,grp_denit,grp_tempMort,grp_tempMort2,grp_aptype,darwin_effective_ksat,darwin_select_kn_allom.