<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>443828</buildingDurationMillis><executingTimeMillis>441726</executingTimeMillis><executorUtilization>1.0</executorUtilization><queuingDurationMillis>9590</queuingDurationMillis><queuingTimeMillis>9591</queuingTimeMillis><subTaskCount>1</subTaskCount><totalDurationMillis>453418</totalDurationMillis><waitingDurationMillis>9587</waitingDurationMillis><waitingTimeMillis>9587</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>583</buildNumber><marked><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><branch><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><branch><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><branch><SHA1>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/clubb.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/artifact</artifactsUrl><changesUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/changes</changesUrl><displayUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/pipeline-overview</displayUrl><testsUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Update sys_admin Repo</restartableStage><restartableStage>Run Python Test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#583</displayName><duration>443828</duration><estimatedDuration>486675</estimatedDuration><fullDisplayName>clubb_BFB_e3sm_flags_gfortran_test #583</fullDisplayName><id>583</id><keepLog>false</keepLog><number>583</number><queueId>10293</queueId><result>SUCCESS</result><timestamp>1791533770837</timestamp><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/clubb_driver.F90</affectedPath><commitId>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</commitId><timestamp>1791488049000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Always do idiot-proofing of flags in check_clubb_settings_api

Changed debug level check from 1 to 0 for parameter sanity checks.
</comment><date>2026-10-08 14:34:09 -0500</date><id>9429ba2f18a79e7b17ef53bccc8f17af6649c3fd</id><msg>Always do idiot-proofing of flags in check_clubb_settings_api</msg><path><editType>edit</editType><file>src/clubb_driver.F90</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName><id>noreply</id></culprit><inProgress>false</inProgress><nextBuild><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>615217</buildingDurationMillis><executingTimeMillis>614076</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>1</subTaskCount><waitingDurationMillis>5211</waitingDurationMillis><waitingTimeMillis>5211</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>584</buildNumber><marked><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><branch><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><branch><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><branch><SHA1>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/clubb.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#584</displayName><duration>615217</duration><estimatedDuration>486675</estimatedDuration><fullDisplayName>clubb_BFB_e3sm_flags_gfortran_test #584</fullDisplayName><id>584</id><keepLog>false</keepLog><number>584</number><queueId>10388</queueId><result>SUCCESS</result><timestamp>1791879366475</timestamp><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/584/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.agents/skills/clubb-change-messages/SKILL.md</affectedPath><affectedPath>LLM_prompts/SHORTCUTS.md</affectedPath><affectedPath>AGENTS.md</affectedPath><affectedPath>LLM_prompts/change_messages.md</affectedPath><commitId>fc9087d1a7a4a8f71c74f5763ece34f18328d200</commitId><timestamp>1791830025000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Add CLUBB commit and PR writing guidance (#1391)

* Add CLUBB commit and PR writing guidance

Add a canonical workflow and historical examples for writing specific titles
and explaining purpose, motivation, results and testing. Scope BFB claims to
their comparisons and distinguish tolerance matches from bitwise equality.
A thin repo skill, shortcut and AGENTS link make the workflow discoverable.

This addresses generated messages that bury the reason for a change or
overstate what testing establishes. Six historical PR/commit drafting pairs
passed independent review. Skill format, 20 local links, canonical-text
consistency and git diff --check passed. BFB is not applicable to these
documentation-only changes.

* Keep only the final commit and PR writing workflow

Remove the worked historical examples and their references. The repository
should contain the final reusable guidance; the research and evaluation
artifacts stay outside it. The shortcut and repo skill still point to one
canonical workflow.

Skill-format validation, all 19 local guidance links and git diff --check
passed. BFB is not applicable to these documentation-only changes.
</comment><date>2026-10-12 13:33:45 -0500</date><id>fc9087d1a7a4a8f71c74f5763ece34f18328d200</id><msg>Add CLUBB commit and PR writing guidance (#1391)</msg><path><editType>edit</editType><file>AGENTS.md</file></path><path><editType>add</editType><file>.agents/skills/clubb-change-messages/SKILL.md</file></path><path><editType>add</editType><file>LLM_prompts/change_messages.md</file></path><path><editType>edit</editType><file>LLM_prompts/SHORTCUTS.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_advance_core_subs.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_xp2_xpyp.py</affectedPath><affectedPath>clubb_jax/src/Benchmark_cases/cobra.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_wp2_wp3.py</affectedPath><affectedPath>clubb_python_api/clubb_python/prescribe_forcings.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/advance_windm_edsclrm_module.py</affectedPath><affectedPath>src/Benchmark_cases/time_dependent_input.F90</affectedPath><affectedPath>clubb_python_api/clubb_python/CLUBB_core/parameters_tunable.py</affectedPath><affectedPath>clubb_python_api/clubb_python/CLUBB_core/numerical_check.py</affectedPath><affectedPath>src/CLUBB_core/advance_windm_edsclrm_module.F90</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_driver_lifecycle.py</affectedPath><affectedPath>clubb_python_driver/advance_clubb_core.py</affectedPath><affectedPath>clubb_jax/src/Benchmark_cases/time_dependent_input.py</affectedPath><affectedPath>utilities/pytests/auto_llm_generated_pytests/test_expldiff_settings_rules.py</affectedPath><affectedPath>clubb_python_api/f2py_fortran_wrappers/advance_windm_edsclrm_module_wrapper.F90</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/advance_clubb_core_module.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_expldiff_edsclrm_forcing.py</affectedPath><affectedPath>clubb_python_api/clubb_python/CLUBB_core/advance_windm_edsclrm.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_pressure_coord_forcing.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_init_sequence.py</affectedPath><affectedPath>clubb_jax/src/clubb_case_initalization.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_windm_edsclrm.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_windm_edsclrm_scalar_indices.py</affectedPath><affectedPath>experimental/experimental_pdfs/python/dash_additions/misc_labs/sam_lscale.py</affectedPath><affectedPath>src/CLUBB_core/numerical_check.F90</affectedPath><affectedPath>clubb_python_api/clubb_python/derived_types/nu_vert_res_dep.py</affectedPath><affectedPath>clubb_python_driver/advance_clubb_to_end.py</affectedPath><affectedPath>clubb_python_driver/clubb_case_initalization.py</affectedPath><affectedPath>src/CLUBB_core/advance_clubb_core_module.F90</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_cobra_sfclyr.py</affectedPath><affectedPath>clubb_jax/src/Benchmark_cases/prescribe_forcings.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_core.py</affectedPath><affectedPath>src/clubb_driver.F90</affectedPath><affectedPath>utilities/clubb_settings_validation.py</affectedPath><affectedPath>tests/run_clubb_settings_validation_test.py</affectedPath><affectedPath>src/Benchmark_cases/prescribe_forcings.F90</affectedPath><affectedPath>clubb_python_api/clubb_f2py.pyf</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/numerical_check.py</affectedPath><affectedPath>clubb_jax/src/advance_clubb_to_end.py</affectedPath><affectedPath>src/Benchmark_cases/cobra.F90</affectedPath><affectedPath>clubb_python_api/f2py_fortran_wrappers/numerical_check_wrapper.F90</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_forcing_port_structure.py</affectedPath><affectedPath>clubb_python_api/f2py_fortran_wrappers/prescribe_forcings_module_wrapper.F90</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/err_info_codes.py</affectedPath><affectedPath>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_xm_wpxp.py</affectedPath><commitId>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</commitId><timestamp>1791843053000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Fix arm97+l do expldiff rtm thlm+set edsclrm f early (#1386)

* Do not force the thlm/rtm copies in the expldiff eddy-scalar solve

With l_do_expldiff_rtm_thlm, advance_windm_edsclrm copies thlm into
edsclrm(:,:,edsclr_dim-1) and rtm into edsclrm(:,:,edsclr_dim), advances all
eddy scalars, and copies those two slots back into thlm and rtm. The solve
added edsclrm_forcing of each slot to the copies, but thlm and rtm are
already advanced with thlm_forcing and rtm_forcing in advance_xm_wpxp.

In the standalone driver the slots are filled by iiedsclr_thl/iiedsclr_rt:
- arm_97 (iiedsclr_rt = 1, iiedsclr_thl = 2) put thlm_forcing [K/s] on rtm,
  so rtm &lt; 0 at ~5.5-8.8 km within the first steps (flag11 / expldiff).
- With the slots in expldiff order, rtm_forcing was applied twice and arm_97
  still hit rtm &lt; 0 near 12 km after 1379 of 5580 steps.

The copies now get no forcing. Mirrored in the JAX port.

Only changes runs with l_do_expldiff_rtm_thlm = .true. and non-zero
edsclrm_forcing in the last two eddy scalars, therefore BIT_CHANGING for
those. Default runs are bit-for-bit identical (arm_97, 1076 variables).

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;

* not hardwire the thlm and rtm edsclrm variables to be the last two; instead use sclr_idx%iiedsclr_thlm and sclr_idx%iiedsclr_rtm

Previously l_do_expldiff_rtm_thlm = true forced the last slot to be rtm and the one before that to be thlm.
If in the ..._model.in file iiedsclr_rt     = 1 ! Location in the edsclrm array to place total water
and iiedsclr_thl    = 2 ! Location in the edsclrm array to place a scalar like thetal
a switcheroo happens.
But if we use a not hardcoded indexing we need to check for out of bounds and distinctness of the 2 indices.

* Zero edsclrm_forcings early in apply_time_dependent_forcings_from_array

Check edsclrm_forcings != 0 instead of zeroing in advance_windm_edsclrm
BIT_CHANGING for l_do_expldiff_rtm_thlm = .true. for arm_97 and for cobra.

Python changes include: clubb_jax, clubb_python (+f2py) + tests

* Check l_do_expldiff_rtm_thlm eddy scalars in check_clubb_settings_api

1. Move the eddy-scalar checks into check_clubb_settings_api

check_clubb_settings_api now takes edsclr_dim and sclr_idx.
With l_do_expldiff_rtm_thlm = .true. it stops the run if
- edsclr_dim &lt;= 1, since the copies of thlm and rtm need two eddy
  scalars, or
- iiedsclr_thl and iiedsclr_rt are not distinct indices in
  1:edsclr_dim.
The index check moved to check_clubb_settings_api from advance_windm_edsclrm.
The check that edsclrm_forcing is zero for the thlm/rtm copies stays in
advance_windm_edsclrm, because prescribe_forcings sets edsclrm_forcing
every time step, after the settings check has run.

Callers in Fortran and mirrors (clubb-jax, python api) are updated

Behavior change: l_do_expldiff_rtm_thlm = .true. with fewer than two
eddy scalars used to skip explicit diffusion silently and now stops at
setup. This affects flag sets that turn the flag on for every case,
e.g. flag11 in input/flag_sets/run_bindiff_w_flags_config_core_flags.json.
Host models must pass the new arguments; CAM must also set
sclr_idx%iiedsclr_thl/iiedsclr_rt when clubb_l_do_expldiff_rtm_thlm is
on, since it leaves them at -1.

2. Fix the Python API

- calc_derived_params now requires nu_vert_res_dep and always pushes
  it to the F2PY storage (new helper NuVertResDep.zeros(ngrdcol)).
  Before, nu_vert_res_dep=None kept the previous call's stored arrays,
  and calc_derived_params only allocates them when unallocated. So a
  call with more columns than an earlier one in the same process wrote
  out of bounds. This crashed the in-process Python API pytest suite
  once the windm tests used two columns.
- clubb_f2py.pyf was missing l_do_expldiff_rtm_thlm for
  f2py_prescribe_forcings, so the Python driver failed on every case.

3. Gate the JAX rerun settings check at debug level 0

set_case_initial_conditions in the JAX driver now runs
check_clubb_settings at debug level &gt;= 0, matching clubb_driver.F90
since 9429ba2f1.

Also: put l_do_expldiff_rtm_thlm on its own line in the
time_dependent_input/prescribe_forcings argument lists.

Bit-for-bit: default-flag output is unchanged, and arm_97 with
l_do_expldiff_rtm_thlm = .true. matches the previous commit exactly.

Tested: debug + Python build and source checks; settings parity test;
Python API pytests (237 passed in one process); JAX pytests (791
passed); utilities settings-rule pytests; python-vs-fortran and
jax-vs-fortran bomex/atex; bomex and cobra with the flag stop at setup
in the Fortran, Python and JAX drivers.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;

* Do not apply surface fluxes to the expldiff thlm/rtm eddy-scalar copies

With l_do_expldiff_rtm_thlm, advance_windm_edsclrm copies thlm and rtm into
the iiedsclr_thl and iiedsclr_rt eddy scalars, solves all eddy scalars with
their surface flux wpedsclrp(:,gr%k_lb_zm,:) (from wpedsclrp_sfc) and copies
the two slots back. thlm and rtm already get wpthlp_sfc and wprtp_sfc in
advance_xm_wpxp, so a non-zero surface flux on the copies applies it twice.

Same approach as the edsclrm_forcing fix:

1. cobra_sfclyr (the only case that sets these fluxes) takes
   l_do_expldiff_rtm_thlm and sets wpedsclrp_sfc of the thlm/rtm copies to
   zero when it is on. set_sclr_sfc_rtm_thlm already zeroes all eddy-scalar
   surface fluxes.
2. advance_windm_edsclrm stops with a fatal error if the surface flux of
   either copy is non-zero, after the edsclrm_forcing check.

Mirrored in the JAX port (new reason code
ERR_WINDM_EDSCLRM_SFC_FLUX_EXPLDIFF_COPY; marks the columns fatal without
returning early, like the forcing check). No Python API wrapper changes.
CAM zeroes all eddy-scalar surface fluxes, so it is unaffected.

Default cobra output is unchanged. But technically BIT_CHANGING for cobra + l_use_expldiff_rtm_thlm

* Compute cobra's CO2 surface flux per column

cobra_sfclyr converted the CO2 surface flux with each column's surface
density inside the column loop, but stored it in the scalar CO2_flx2, and
the later loops gave every column that one value:

- CPU: every column got the last column's CO2 flux. Standalone columns
  currently share one density profile, so results were unaffected.
- OpenACC: the scalar was private to the device loop, and the later loops
  copied the never-set host value (implicit firstprivate). In the GPU
  build cobra's CO2 surface flux was 0 at every step.

CO2_flx2 is now a per-column array (enter/exit data create/delete like
other case routines). The JAX port already computes it per column.

Bit-for-bit: CPU cobra output is unchanged (1 and 2 columns, standard
stats incl. the CO2 scalars). GPU cobra output changes: before, the CO2
surface flux was 0 and CO2 differed from the CPU run by up to 10%;
now the CO2 scalars match the CPU run to ~1e-11 relative, like the other
fields.

Tested: gfortran debug build and source checks; standalone check of
cobra_sfclyr with two columns of different density (before: column 1 got
column 2's flux); nvhpc 24.3 OpenACC build and cobra on a Quadro P4000.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;

* removed the idiot proofing

* fully removed idiot proofing for l_do_expldiff_rtm_thlm+esclrdim

---------

Co-authored-by: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-10-12 17:10:53 -0500</date><id>4292a70f53a6b6c4eab864fe27b8fd9af5d86909</id><msg>Fix arm97+l do expldiff rtm thlm+set edsclrm f early (#1386)</msg><path><editType>edit</editType><file>clubb_python_api/clubb_python/CLUBB_core/advance_windm_edsclrm.py</file></path><path><editType>edit</editType><file>clubb_jax/src/Benchmark_cases/cobra.py</file></path><path><editType>edit</editType><file>clubb_jax/src/Benchmark_cases/prescribe_forcings.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_driver_lifecycle.py</file></path><path><editType>edit</editType><file>clubb_python_api/clubb_f2py.pyf</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_cobra_sfclyr.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/err_info_codes.py</file></path><path><editType>edit</editType><file>clubb_python_api/clubb_python/prescribe_forcings.py</file></path><path><editType>edit</editType><file>clubb_python_api/f2py_fortran_wrappers/advance_windm_edsclrm_module_wrapper.F90</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_xp2_xpyp.py</file></path><path><editType>edit</editType><file>utilities/clubb_settings_validation.py</file></path><path><editType>edit</editType><file>clubb_python_api/f2py_fortran_wrappers/prescribe_forcings_module_wrapper.F90</file></path><path><editType>edit</editType><file>clubb_python_driver/advance_clubb_to_end.py</file></path><path><editType>edit</editType><file>src/Benchmark_cases/cobra.F90</file></path><path><editType>edit</editType><file>tests/run_clubb_settings_validation_test.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/numerical_check.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_case_initalization.py</file></path><path><editType>edit</editType><file>src/Benchmark_cases/time_dependent_input.F90</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_core.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_pressure_coord_forcing.py</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_init_sequence.py</file></path><path><editType>edit</editType><file>clubb_python_driver/advance_clubb_core.py</file></path><path><editType>edit</editType><file>src/Benchmark_cases/prescribe_forcings.F90</file></path><path><editType>edit</editType><file>clubb_jax/src/advance_clubb_to_end.py</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_xm_wpxp.py</file></path><path><editType>edit</editType><file>clubb_python_driver/clubb_case_initalization.py</file></path><path><editType>add</editType><file>utilities/pytests/auto_llm_generated_pytests/test_expldiff_settings_rules.py</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_windm_edsclrm.py</file></path><path><editType>edit</editType><file>clubb_jax/src/Benchmark_cases/time_dependent_input.py</file></path><path><editType>edit</editType><file>src/CLUBB_core/numerical_check.F90</file></path><path><editType>edit</editType><file>src/clubb_driver.F90</file></path><path><editType>edit</editType><file>src/CLUBB_core/advance_clubb_core_module.F90</file></path><path><editType>edit</editType><file>clubb_python_api/clubb_python/derived_types/nu_vert_res_dep.py</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_expldiff_edsclrm_forcing.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_forcing_port_structure.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/advance_windm_edsclrm_module.py</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_windm_edsclrm_scalar_indices.py</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_call_tree_advance_wp2_wp3.py</file></path><path><editType>edit</editType><file>src/CLUBB_core/advance_windm_edsclrm_module.F90</file></path><path><editType>edit</editType><file>clubb_python_api/f2py_fortran_wrappers/numerical_check_wrapper.F90</file></path><path><editType>edit</editType><file>experimental/experimental_pdfs/python/dash_additions/misc_labs/sam_lscale.py</file></path><path><editType>edit</editType><file>clubb_python_api/clubb_python/CLUBB_core/numerical_check.py</file></path><path><editType>edit</editType><file>clubb_python_api/clubb_python/CLUBB_core/parameters_tunable.py</file></path><path><editType>edit</editType><file>clubb_python_api/pytests/auto_llm_generated_pytests/test_advance_core_subs.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/advance_clubb_core_module.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><inProgress>false</inProgress><nextBuild><number>585</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/585/</url></nextBuild><previousBuild><number>583</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/</url></previousBuild></nextBuild><previousBuild><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>1</buildableTimeMillis><buildingDurationMillis>422308</buildingDurationMillis><executingTimeMillis>420177</executingTimeMillis><executorUtilization>0.99</executorUtilization><subTaskCount>1</subTaskCount><waitingDurationMillis>9255</waitingDurationMillis><waitingTimeMillis>9255</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>582</buildNumber><marked><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><branch><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><branch><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><branch><SHA1>e92c2f24486a32610935ff4eede3512c67e313ea</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/clubb.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#582</displayName><duration>422308</duration><estimatedDuration>486675</estimatedDuration><fullDisplayName>clubb_BFB_e3sm_flags_gfortran_test #582</fullDisplayName><id>582</id><keepLog>false</keepLog><number>582</number><queueId>10213</queueId><result>SUCCESS</result><timestamp>1791447370624</timestamp><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/582/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tuner/loss_backend.py</affectedPath><affectedPath>tuner/job_runtime.py</affectedPath><affectedPath>tuner/pytests/auto_llm_generated_pytests/test_tuner_top_overrides.py</affectedPath><affectedPath>jenkins_tests/clubb_tuner/Jenkinsfile</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</affectedPath><affectedPath>dash_app/pytests/auto_llm_generated_pytests/test_tune_replay_completion.py</affectedPath><affectedPath>run_scripts/README.md</affectedPath><affectedPath>dash_app/shared/activity.py</affectedPath><affectedPath>dash_app/pytests/test_jax_device.py</affectedPath><affectedPath>clubb_jax/run_jax.py</affectedPath><affectedPath>dash_app/README.md</affectedPath><affectedPath>tuner/pytests/auto_llm_generated_pytests/test_jax_launch_errors.py</affectedPath><affectedPath>tuner/request.py</affectedPath><affectedPath>dash_app/compile_tab/callbacks.py</affectedPath><affectedPath>dash_app/shared/actions.py</affectedPath><affectedPath>dash_app/shared/jax_device.py</affectedPath><affectedPath>utilities/create_case_namelist.py</affectedPath><affectedPath>dash_app/profile_tab/runtime.py</affectedPath><affectedPath>dash_app/tune_tab/runtime.py</affectedPath><affectedPath>tuner/tune_clubb.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</affectedPath><affectedPath>dash_app/run_tab/runtime.py</affectedPath><affectedPath>tuner/pytests/auto_llm_generated_pytests/test_runtime_device_settings.py</affectedPath><affectedPath>tuner/tuning_worker.py</affectedPath><affectedPath>tuner/status.py</affectedPath><affectedPath>clubb_jax/backends/cuda.py</affectedPath><affectedPath>dash_app/services/models.py</affectedPath><affectedPath>dash_app/pytests/test_agent_services.py</affectedPath><affectedPath>dash_app/pytests/auto_llm_generated_pytests/test_jax_tuning_runtime.py</affectedPath><affectedPath>dash_app/tune_tab/callbacks_runs.py</affectedPath><affectedPath>dash_app/DEVELOPMENT.md</affectedPath><affectedPath>tuner/tuning_scheduler.py</affectedPath><affectedPath>dash_app/pytests/test_run_broker_simplification.py</affectedPath><affectedPath>dash_app/compile_tab/build_selector.py</affectedPath><affectedPath>tuner/README.md</affectedPath><affectedPath>tuner/pytests/auto_llm_generated_pytests/test_jax_backend.py</affectedPath><affectedPath>clubb_jax/README.md</affectedPath><affectedPath>run_scripts/run_tuner_job.py</affectedPath><commitId>9a1b8b23408d3a5abe78ebae7dd1390755fa4fec</commitId><timestamp>1791407526000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Use JAX in tuner (#1383)

This makes the JAX work through the new tuner, same sort of way the fortran does. Probably needs a little more testing but seems to be working properly now.

* Support reusable JAX driver state and runtime batches

* Add standalone JAX loss evaluation and consistency coverage

* Keep standalone loss CLI coverage separate from tuning

* Integrate JAX with managed tuner jobs and add bounded Jenkins coverage

* Remove trailing whitespace from extracted loss CLI tests

* Run JAX loss help checks in the JAX pytest suite

* Keep JAX lifecycle coverage with native driver tests and document its origins

* Document loss test scenarios, native counterparts and JAX extensions

* Keep the native loss executable path intact in the test description

* Explain managed tuning test ownership and native backend contracts

* Mirror the native driver lifecycle test and compare complete JAX statistics

* Run JAX driver extensions as an independent step in the lifecycle stage

* Update the C8 comparison mutation for indexed parameter loading

* Refresh JAX tuner integration for merged loss frontends

Use the relocated standalone loss entry point and retain CLI checks only in their shared owner. Give each Jenkins tuning run a separate job directory so repeated builds can succeed.

* Record invalid direct tuner requests as terminal errors

Let the existing request and launcher error handlers report malformed JSON and non-string JAX options instead of crashing during bootstrap before writing job results.

* Preserve winning parameter columns in tuner reruns

Retain request physics overrides while excluding initialized values for tuned parameters. Window and full-case reruns now use the winning candidate values, including multiple columns and grouped override names.

* Use the selected JAX runtime throughout Dash tuning

Persist backend and per-job device settings through native and typed broker requests, saved revisions, continuation and result reruns. Reuse the launcher, shared device controls and rerun override resolver; supervise browser replay processes in the broker.

* Allow run IDs in broker replay completion metadata

Avoid a selector argument collision that killed the replay watcher before recording terminal state. Preserve run IDs and cancellation metadata while reporting completed jobs accurately.

* Keep JAX device setup inside the launcher and backends

Expose a standard-library selection interface and forward per-job device and preallocation settings through the SCM and tuner launch paths. Use the same backend configuration for discovery, provenance, and execution; remove GPU environment handling from Dash and the tuner.

Validate with Dash/shared suites, focused launcher checks, a CPU tuning and replay workflow, and synthetic two-GPU discovery.

* Forward device settings through the existing JAX selection option

Extend the launcher-owned -options grammar with device=UUID and prealloc_gpu_mem=true|false, while retaining xla_prealloc compatibility. Remove the transient device-specific options from SCM and tuner scripts so they forward one opaque -jax value.

Validate saved settings, discovery and replays through the same public interface; verify CPU tuning metrics remain identical.
</comment><date>2026-10-07 16:12:06 -0500</date><id>9a1b8b23408d3a5abe78ebae7dd1390755fa4fec</id><msg>Use JAX in tuner (#1383)</msg><path><editType>edit</editType><file>dash_app/shared/actions.py</file></path><path><editType>edit</editType><file>dash_app/README.md</file></path><path><editType>add</editType><file>dash_app/pytests/auto_llm_generated_pytests/test_jax_tuning_runtime.py</file></path><path><editType>edit</editType><file>tuner/README.md</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</file></path><path><editType>edit</editType><file>dash_app/tune_tab/runtime.py</file></path><path><editType>edit</editType><file>tuner/job_runtime.py</file></path><path><editType>edit</editType><file>clubb_jax/README.md</file></path><path><editType>edit</editType><file>clubb_jax/run_jax.py</file></path><path><editType>delete</editType><file>dash_app/shared/jax_device.py</file></path><path><editType>add</editType><file>tuner/pytests/auto_llm_generated_pytests/test_jax_launch_errors.py</file></path><path><editType>edit</editType><file>dash_app/run_tab/runtime.py</file></path><path><editType>edit</editType><file>clubb_jax/backends/cuda.py</file></path><path><editType>edit</editType><file>dash_app/tune_tab/callbacks_runs.py</file></path><path><editType>add</editType><file>tuner/pytests/auto_llm_generated_pytests/test_runtime_device_settings.py</file></path><path><editType>edit</editType><file>dash_app/DEVELOPMENT.md</file></path><path><editType>edit</editType><file>run_scripts/run_tuner_job.py</file></path><path><editType>add</editType><file>dash_app/pytests/auto_llm_generated_pytests/test_tune_replay_completion.py</file></path><path><editType>edit</editType><file>dash_app/profile_tab/runtime.py</file></path><path><editType>edit</editType><file>dash_app/compile_tab/build_selector.py</file></path><path><editType>edit</editType><file>tuner/status.py</file></path><path><editType>add</editType><file>tuner/pytests/auto_llm_generated_pytests/test_tuner_top_overrides.py</file></path><path><editType>edit</editType><file>utilities/create_case_namelist.py</file></path><path><editType>edit</editType><file>dash_app/services/models.py</file></path><path><editType>edit</editType><file>run_scripts/README.md</file></path><path><editType>edit</editType><file>dash_app/pytests/test_run_broker_simplification.py</file></path><path><editType>edit</editType><file>dash_app/compile_tab/callbacks.py</file></path><path><editType>edit</editType><file>jenkins_tests/clubb_tuner/Jenkinsfile</file></path><path><editType>edit</editType><file>tuner/tuning_scheduler.py</file></path><path><editType>edit</editType><file>tuner/tune_clubb.py</file></path><path><editType>add</editType><file>tuner/loss_backend.py</file></path><path><editType>edit</editType><file>tuner/request.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</file></path><path><editType>edit</editType><file>dash_app/pytests/test_agent_services.py</file></path><path><editType>add</editType><file>tuner/pytests/auto_llm_generated_pytests/test_jax_backend.py</file></path><path><editType>edit</editType><file>dash_app/shared/activity.py</file></path><path><editType>edit</editType><file>tuner/tuning_worker.py</file></path><path><editType>edit</editType><file>dash_app/pytests/test_jax_device.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>run_scripts/run_tuner.py</affectedPath><affectedPath>dash_app/run_tab/tab.py</affectedPath><affectedPath>dash_app/persistence.py</affectedPath><affectedPath>utilities/README.md</affectedPath><affectedPath>.gitignore</affectedPath><affectedPath>dash_app/run_tab/callbacks_selection.py</affectedPath><affectedPath>dash_app/run_tab/layout.py</affectedPath><affectedPath>utilities/case_json_to_namelist.py</affectedPath><affectedPath>dash_app/pytests/auto_llm_generated_pytests/test_case_editor.py</affectedPath><affectedPath>dash_app/README.md</affectedPath><affectedPath>input/case_setups/case_definitions.json</affectedPath><affectedPath>dash_app/assets/34_case_editor.js</affectedPath><affectedPath>dash_app/shared/actions.py</affectedPath><affectedPath>utilities/pytests/auto_llm_generated_pytests/test_case_json_to_namelist.py</affectedPath><affectedPath>run_scripts/run_scm_loss.py</affectedPath><affectedPath>dash_app/run_tab/discovery.py</affectedPath><affectedPath>dash_app/assets/12_case_editor.css</affectedPath><affectedPath>dash_app/assets/11_tab_run_theme.css</affectedPath><affectedPath>utilities/create_case_namelist.py</affectedPath><affectedPath>tuner/case_defaults.py</affectedPath><affectedPath>dash_app/profile_tab/runtime.py</affectedPath><affectedPath>input/case_setups/README</affectedPath><affectedPath>dash_app/run_tab/cases.py</affectedPath><commitId>5f8b57f69c01c59fc3c4457178ae85d57894c1d9</commitId><timestamp>1791415324000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Add JSON case definitions and Dash case editor (#1389)

This is mainly a dash update right now, but it adds json versions of our model files. Basically just 2 new files for that - each json stores default values then one entry for each case with overrides it is not default yet and the current system of defining cases is unchanged.


* Add JSON case definitions and Dash case editor

* Simplify named case lookup and remove queued snapshots

* Remove model validation from JSON case conversion
</comment><date>2026-10-07 18:22:04 -0500</date><id>5f8b57f69c01c59fc3c4457178ae85d57894c1d9</id><msg>Add JSON case definitions and Dash case editor (#1389)</msg><path><editType>edit</editType><file>dash_app/run_tab/tab.py</file></path><path><editType>edit</editType><file>run_scripts/run_tuner.py</file></path><path><editType>add</editType><file>dash_app/assets/12_case_editor.css</file></path><path><editType>add</editType><file>dash_app/pytests/auto_llm_generated_pytests/test_case_editor.py</file></path><path><editType>edit</editType><file>dash_app/shared/actions.py</file></path><path><editType>add</editType><file>input/case_setups/case_definitions.json</file></path><path><editType>edit</editType><file>dash_app/run_tab/layout.py</file></path><path><editType>add</editType><file>dash_app/assets/34_case_editor.js</file></path><path><editType>edit</editType><file>dash_app/run_tab/callbacks_selection.py</file></path><path><editType>edit</editType><file>dash_app/README.md</file></path><path><editType>edit</editType><file>tuner/case_defaults.py</file></path><path><editType>add</editType><file>utilities/pytests/auto_llm_generated_pytests/test_case_json_to_namelist.py</file></path><path><editType>edit</editType><file>dash_app/profile_tab/runtime.py</file></path><path><editType>edit</editType><file>dash_app/run_tab/discovery.py</file></path><path><editType>edit</editType><file>dash_app/assets/11_tab_run_theme.css</file></path><path><editType>edit</editType><file>dash_app/persistence.py</file></path><path><editType>add</editType><file>utilities/case_json_to_namelist.py</file></path><path><editType>edit</editType><file>utilities/create_case_namelist.py</file></path><path><editType>edit</editType><file>input/case_setups/README</file></path><path><editType>edit</editType><file>run_scripts/run_scm_loss.py</file></path><path><editType>add</editType><file>dash_app/run_tab/cases.py</file></path><path><editType>edit</editType><file>utilities/README.md</file></path><path><editType>edit</editType><file>.gitignore</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/README.md</affectedPath><affectedPath>tests/pytests/auto_llm_generated_pytests/test_run_stats_output_consistency.py</affectedPath><affectedPath>jenkins_tests/clubb_stats_output_consistency/Jenkinsfile</affectedPath><affectedPath>tests/run_stats_output_consistency.py</affectedPath><commitId>166ec211468128c37d8bb4b917ffac337bf80247</commitId><timestamp>1791416548000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Run JAX statistics consistency with an explicit rounding tolerance (#1385)

This adds a jax jenkins stage for the statistics consistency test. This is the test that runs clubb with different batches sizes and averaging methods, e.g
- start by: run once with 60s output intervals all the way through
- test: running with 300s output intervals should give the same stats as manually averaging 5 steps of 60s output
- test: outputing only a "window" of stats data (like from timesteps 100-200 instead of whole run), should produce a window idendical to the 60s full output run
- test: running 16 columns at once should produce the same as running 16 columns in batches of 4 at a time

In fortran these comparisons should be BFB (other than the manually averaging one, which is only close), but in jax, changing things like the batch size can cause optimizations to happen differently, which breaks BFBness and seems to cause differences larger than expected by fortran. For example, the threshold for the manual averaging test in fortran is 1e-12, but for the jax we need 1e-9 even for the batch test. I added a tolerance, `jax_tolerance`, that I left named after jax for now since that is the only current reason that flag exists. 

This difficulty with jax wasn't unexpected - we also have to compile the fortran with `-O0` to get this test working, also to disable optimizations. There just seems to be less control over how jax does that, so I went with a "relax the tolerance for this specific instance" approach.

* Support reusable JAX driver state and runtime batches

* Expose JAX in the strict statistics consistency workflow

* Keep JAX lifecycle coverage with native driver tests and document its origins

* Reference native driver and statistics owners in the JAX test workflow

* Keep full Fortran statistics source paths in the test description

* Mirror the native driver lifecycle test and compare complete JAX statistics

* Run JAX driver extensions as an independent step in the lifecycle stage

* Update the C8 comparison mutation for indexed parameter loading

* Keep statistics windows within the capped native case duration

* Allow explicit JAX statistics tolerance for JIT rounding differences
</comment><date>2026-10-07 18:42:28 -0500</date><id>166ec211468128c37d8bb4b917ffac337bf80247</id><msg>Run JAX statistics consistency with an explicit rounding tolerance (#1385)</msg><path><editType>add</editType><file>tests/pytests/auto_llm_generated_pytests/test_run_stats_output_consistency.py</file></path><path><editType>edit</editType><file>jenkins_tests/clubb_stats_output_consistency/Jenkinsfile</file></path><path><editType>edit</editType><file>tests/run_stats_output_consistency.py</file></path><path><editType>edit</editType><file>tests/README.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/run_timestep_tests.py</affectedPath><affectedPath>tests/README.md</affectedPath><affectedPath>jenkins_tests/clubb_timestep/Jenkinsfile</affectedPath><affectedPath>clubb_jax/README.md</affectedPath><affectedPath>clubb_jax/run_jax.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_compilation_cache.py</affectedPath><affectedPath>tests/run_timestep_sweep.py</affectedPath><affectedPath>tests/pytests/auto_llm_generated_pytests/test_run_timestep_sweep.py</affectedPath><commitId>341cac040a0d352fd5a4da6a5938a86d7d06e332</commitId><timestamp>1791417082000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Run timestep sweep tests with JAX (#1384)

Adding a jax run to the timestep test (now renamed timestep sweep because it's more descriptive).

This was really slow on JAX at first - one trick was to add a compilation cache, so that different runs that only use different timesteps didn't need to be recompiled. From my undestanding this is super easy with jax, basically just set `JAX_COMPILATION_CACHE_DIR` to a directory the process can save compiled parts is all it takes, then the compiled parts can live there even after the processes dies, and future ones can reuse it.

* Run existing timestep sweeps with the JAX runner

* Explain the shared native and JAX timestep sweep behavior

* Keep timestep checks aligned with current launcher and CLI conventions

Select CPU explicitly in the bounded JAX stage and resolve optional output roots through the shared owner. Support standard single-dash help, reject ambiguous option abbreviations, and cover opaque runtime forwarding while preserving native defaults and exploratory status.

Validate with 373 shared checks and four eight-step BOMEX/ATEX runs per backend at 60 and 600 seconds.

* Rename the timestep sweep and run shared JAX cases at native defaults

Select the 18 cases shared by the native sweep and JAX/Fortran comparison list. Remove Jenkins timestep and iteration overrides, update stage names and documentation, and preserve the sweep's stability-reporting behavior.

Validate the selection and rename with 374 shared checks before live branch testing.

* Reuse JAX compilations and parallelize case timestep sweeps

Keep a backend-specific persistent cache outside the checkout and preserve explicit cache overrides. Run four isolated case sweeps, prioritize measured expensive cases, and print each completed report as a block while preserving timestep order and first-failure semantics.

Validate cache reuse across fresh processes and cache clearing, scheduling/overlap/interruption contracts, 379 shared checks, and full 90-run cold-cache JAX/native matrices.
</comment><date>2026-10-07 18:51:22 -0500</date><id>341cac040a0d352fd5a4da6a5938a86d7d06e332</id><msg>Run timestep sweep tests with JAX (#1384)</msg><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_compilation_cache.py</file></path><path><editType>edit</editType><file>clubb_jax/README.md</file></path><path><editType>edit</editType><file>jenkins_tests/clubb_timestep/Jenkinsfile</file></path><path><editType>delete</editType><file>tests/run_timestep_tests.py</file></path><path><editType>add</editType><file>tests/run_timestep_sweep.py</file></path><path><editType>add</editType><file>tests/pytests/auto_llm_generated_pytests/test_run_timestep_sweep.py</file></path><path><editType>edit</editType><file>clubb_jax/run_jax.py</file></path><path><editType>edit</editType><file>tests/README.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>jenkins_tests/clubb_plots/Jenkinsfile</affectedPath><affectedPath>LLM_prompts/jenkins_workflow.md</affectedPath><commitId>e92c2f24486a32610935ff4eede3512c67e313ea</commitId><timestamp>1791427833000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/huebler</absoluteUrl><fullName>Gunther Huebler</fullName></author><authorEmail>huebler@uwm.edu</authorEmail><comment>Add JAX comparison plots
</comment><date>2026-10-07 21:50:33 -0500</date><id>e92c2f24486a32610935ff4eede3512c67e313ea</id><msg>Add JAX comparison plots</msg><path><editType>edit</editType><file>LLM_prompts/jenkins_workflow.md</file></path><path><editType>edit</editType><file>jenkins_tests/clubb_plots/Jenkinsfile</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/huebler</absoluteUrl><fullName>Gunther Huebler</fullName></culprit><inProgress>false</inProgress><nextBuild><number>583</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/583/</url></nextBuild><previousBuild><number>581</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_e3sm_flags_gfortran_test/581/</url></previousBuild></previousBuild></workflowRun>