<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>3457841</buildingDurationMillis><executingTimeMillis>3456491</executingTimeMillis><executorUtilization>1.0</executorUtilization><queuingDurationMillis>5226</queuingDurationMillis><queuingTimeMillis>5227</queuingTimeMillis><subTaskCount>1</subTaskCount><totalDurationMillis>3463067</totalDurationMillis><waitingDurationMillis>5189</waitingDurationMillis><waitingTimeMillis>5189</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginclubb_silhs_devel _class='hudson.plugins.git.util.Build'><buildNumber>188</buildNumber><marked><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><branch><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></marked><revision><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><branch><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></revision></refsremotesoriginclubb_silhs_devel></buildsByBranchName><lastBuiltRevision><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><branch><SHA1>6fda8e14438857fdf16e8afb5b32a52302cfd2e9</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/cam.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>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/artifact</artifactsUrl><changesUrl>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/changes</changesUrl><displayUrl>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/stages</displayUrl><testsUrl>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Checkout Externals and Copy Custom Files</restartableStage><restartableStage>Remove Old Output</restartableStage><restartableStage>Running ne3 with OpenACC</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.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.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.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></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.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><building>false</building><displayName>#188</displayName><duration>3457841</duration><estimatedDuration>4137974</estimatedDuration><fullDisplayName>cam_gpu_test #188</fullDisplayName><id>188</id><keepLog>false</keepLog><number>188</number><queueId>10389</queueId><result>SUCCESS</result><timestamp>1791879366511</timestamp><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/physics/cam/clubb_intr.F90</affectedPath><commitId>12892aee4b22b4c8e170df4d7e287591e0a2db1c</commitId><timestamp>1791842299000</timestamp><author><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/ebel</absoluteUrl><fullName>Daniel Ebel</fullName></author><authorEmail>debel@uwm.edu</authorEmail><comment>host model change for clubb PR 1386
</comment><date>2026-10-12 16:58:19 -0500</date><id>12892aee4b22b4c8e170df4d7e287591e0a2db1c</id><msg>host model change for clubb PR 1386</msg><path><editType>edit</editType><file>src/physics/cam/clubb_intr.F90</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>advance_clubb_core_module.F90</affectedPath><affectedPath>advance_windm_edsclrm_module.F90</affectedPath><affectedPath>numerical_check.F90</affectedPath><commitId>9cb7901d3cd05834fa6bb2fd4d70f22eb4ef395e</commitId><timestamp>1791843053000</timestamp><author><absoluteUrl>https://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>9cb7901d3cd05834fa6bb2fd4d70f22eb4ef395e</id><msg>Fix arm97+l do expldiff rtm thlm+set edsclrm f early (#1386)</msg><path><editType>edit</editType><file>numerical_check.F90</file></path><path><editType>edit</editType><file>advance_clubb_core_module.F90</file></path><path><editType>edit</editType><file>advance_windm_edsclrm_module.F90</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName><id>noreply</id></culprit><culprit><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/ebel</absoluteUrl><fullName>Daniel Ebel</fullName><id>ebel</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>5764611</buildingDurationMillis><executingTimeMillis>5763347</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>1</subTaskCount><waitingDurationMillis>7015</waitingDurationMillis><waitingTimeMillis>7015</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginclubb_silhs_devel _class='hudson.plugins.git.util.Build'><buildNumber>189</buildNumber><marked><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><branch><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></marked><revision><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><branch><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></revision></refsremotesoriginclubb_silhs_devel></buildsByBranchName><lastBuiltRevision><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><branch><SHA1>1eca30798f2886be7d8594c8826320737b7a76cd</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/cam.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><building>false</building><displayName>#189</displayName><duration>5764611</duration><estimatedDuration>4137974</estimatedDuration><fullDisplayName>cam_gpu_test #189</fullDisplayName><id>189</id><keepLog>false</keepLog><number>189</number><queueId>10505</queueId><result>SUCCESS</result><timestamp>1791965768414</timestamp><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/189/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>calc_roots.F90</affectedPath><commitId>76464de9f694cb3148b0ae07f9eb0098afc4a4e4</commitId><timestamp>1791911400000</timestamp><author><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Fixed bug in cubic equation solve function. Only relevant if pdf is L… (#1387)

* Fixed bug in cubic equation solve function. Only relevant if pdf is Luhar or iiPDF_type=4

Therefore technically BIT_CHANGING...
The bug existed because the old code used the principal cube root
which has an imaginary part for negative bases.
The fix is to simply calc: -|w|**(1/3) for negative real numbers.

* Replaced determinant with discriminant

Verified via a new Fortran unit test and also manually checked with wolfram alpha.
There is no way to actually run this code :/
would only work for iiPDF_types: iiPDF_3D_Luhar = 3 and iiPDF_3D_Luhar = 3
(and those are currently (Oct 2026) broken )
</comment><date>2026-10-13 12:10:00 -0500</date><id>76464de9f694cb3148b0ae07f9eb0098afc4a4e4</id><msg>Fixed bug in cubic equation solve function. Only relevant if pdf is L… (#1387)</msg><path><editType>edit</editType><file>calc_roots.F90</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><inProgress>false</inProgress><nextBuild><number>190</number><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/190/</url></nextBuild><previousBuild><number>188</number><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/</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='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginclubb_silhs_devel _class='hudson.plugins.git.util.Build'><buildNumber>187</buildNumber><marked><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><branch><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></marked><revision><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><branch><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></revision></refsremotesoriginclubb_silhs_devel></buildsByBranchName><lastBuiltRevision><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><branch><SHA1>268eaf7dcf5cff29fc0de16749b8ebe447c1c521</SHA1><name>refs/remotes/origin/clubb_silhs_devel</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/cam.git</remoteUrl><scmName></scmName></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><building>false</building><displayName>#187</displayName><duration>3472594</duration><estimatedDuration>4137974</estimatedDuration><fullDisplayName>cam_gpu_test #187</fullDisplayName><id>187</id><keepLog>false</keepLog><number>187</number><queueId>9782</queueId><result>SUCCESS</result><timestamp>1791188167325</timestamp><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/187/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>generate_uniform_sample_module.F90</affectedPath><affectedPath>parameters_silhs.F90</affectedPath><affectedPath>latin_hypercube_driver_module.F90</affectedPath><commitId>d0b2c1b6296142cb4af292010557249991c1e714</commitId><timestamp>1791158488000</timestamp><author><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Jax silhs (#1372)

Adding silhs to jax.

To avoid randomness issues I added a silhs flag, l_lh_deterministic_test, that causes samples and random numbers to be generated in a deterministic order that is pretty basic but seems like a fine enough sampling method for a test that only matters for comparing jax to fortran matching. This required changing the fortran to have this deterministic test sample generation.

I added 3 new silhs tests:

rico_silhs with a 60s timestep matches up to 360 timestpes (6 hours)
lba_kk_silhs (lba with kk microphys instead of defauly morrison) passes up to 270ish steps, I set test to 240 steps
lba_silhs (with morrison) passes &lt;80, from past exploration this seems mainly due to morrison being in single precision

* Port SILHS sampling and microphysics coupling to JAX

Add native JAX Latin-hypercube sampling with explicit persistent permutation
state and case-owned initialization. Couple sampled states to KK and Morrison
microphysics in interactive and diagnostic modes, with weighted statistics,
substep averaging, and fatal-path/configuration guards.

Preserve Fortran routine structure, argument grouping, and source comments
throughout SILHS and the microphysics interface layer. Leave Fortran, MT95,
and the KK/Morrison numerical cores unchanged.

Validation: 103 focused sampling/interface/error-path checks and eight real
SILHS driver checks pass. Earlier interface/support validation and the
20-pair disabled-SILHS JAX/Fortran comparison also pass. Enabled SILHS random
stream parity is deferred to a future common-random-input comparison.

* Add deterministic SILHS comparisons and initialize JAX output grids

Add a default-off l_lh_deterministic_test flag to Fortran and JAX. Use
ordered strata and a shared four-value, binary-exact draw cycle in the
high-level LHS and overlap-pool routines, preserving sequence reuse and
leaving the native random generators unchanged. Reject independent
importance sampling and random starts in this comparison mode.

Add interactive RICO, LBA KK and native LBA Morrison configurations to the
JAX/Fortran comparison suite without relaxing the existing tolerances.
Initialize SILHS host statistics from JAX case setup so reduced statistics
files also contain Fortran's lh_zt and lh_sample_number coordinates.

Validation: Fortran build and source checks pass; 581 raw sampling values
match exactly; 59 sampler/contract/forwarding checks and 46 output/support
checks pass. RICO matches through 360 steps at 60s with standard statistics
and with reduced statistics at debug 0.

Document the remaining comparison limits: LBA KK's repeating-cycle Nrp2
difference starts at saved prefix 274, while its configured cap remains
275. Native Morrison's selected scope was verified with midpoint inputs;
the repeating-cycle comparison was not rerun after the requested stop.

* Match Fortran SILHS sampling precision and overlap

Preserve default-real rounding in inverse-normal coefficients before
promotion to the sample dtype. Apply vertical overlap to starting-level
straight Monte Carlo samples and retain source sampling failure status.

Add a live Fortran inverse-normal oracle and regressions for overlap and
the source sample-count check. Keep comparison limits and tolerances.

* Restore SILHS diagnostics and microphysics host error guards

Carry weight-limiter and Kessler diagnostic failures through compiled
returns and ErrInfo. Preserve Fortran debug guards at the host boundaries
so negative-debug tracing can retain per-column failure status.

Write ordered microphysics/SILHS settings and approximate correlations
from initialization into the standalone setup file. Keep report lifetime
and output-name resolution outside the timestep driver.

Add focused failure/report regressions and update the port notes with
repeating-input comparisons and the native Morrison compiler sensitivity.

* Document deterministic SILHS comparison patterns

Explain the ordered permutation, repeating within-stratum offsets and overlap
pool at every Fortran deterministic randomness override. Mirror the explanation
in JAX, including index phases, sequence reuse and independence from RNG state.

Executable statements are unchanged in both implementations; source/AST checks
confirm these changes only add comments.

* Use definition decorators for microphysics JIT boundaries

Move the existing PDF preparation, scheme tendency and hydrometeor transport
JIT boundaries onto their routine definitions with @partial(jax.jit, ...).
Keep the static arguments unchanged and call the source-named routines directly
from the standalone driver.

Update host injection and source-order checks for the canonical routine names.
Lightweight error/feedback fixtures still check eager and compiled routine
bodies; real standalone runs exercise the decorated entry points.

Validation: 140 focused tests; 28 passed, 2435 warnings in 453.39s (0:07:33); unchanged RICO360/LBAKK275
strict comparisons; supported whole-driver and reverse-mode tracing.

* Simplify deterministic SILHS sampling comments

Describe the repeatable-testing branches directly, with their base values and
index offsets. Show the first twelve pool entries for four columns, grouped by
sample, and use the same concise descriptions in the Fortran and JAX mirrors.

Only comments and argument documentation change; executable code is unchanged.

* Exclude E3SM from host compatibility updates

Keep the exclusion visible in shortcut discovery and the host workflow.
Treat sys_admin mappings as synchronization metadata, not the active host list.

* Shortening tests timesteps a bit and adding a space for niceness
</comment><date>2026-10-04 19:01:28 -0500</date><id>d0b2c1b6296142cb4af292010557249991c1e714</id><msg>Jax silhs (#1372)</msg><path><editType>edit</editType><file>latin_hypercube_driver_module.F90</file></path><path><editType>edit</editType><file>generate_uniform_sample_module.F90</file></path><path><editType>edit</editType><file>parameters_silhs.F90</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>src/physics/cam/subcol_SILHS.F90</affectedPath><commitId>e2b31759be72c56545c414b66ae4334e062b4af6</commitId><timestamp>1791158517000</timestamp><author><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Update SILHS initialization for deterministic sampling flag (#232)

Collect the new configuration-default output and pass it to the
initializer, retaining the default false value and host namelists.
Broadcast the new member with the existing configuration fields.

Requires the separate SILHS source synchronization from CLUBB PR 1372.
Validated actual calls against the updated API and preserved defaults;
vendored CLUBB/SILHS paths remain untouched.
</comment><date>2026-10-04 19:01:57 -0500</date><id>e2b31759be72c56545c414b66ae4334e062b4af6</id><msg>Update SILHS initialization for deterministic sampling flag (#232)</msg><path><editType>edit</editType><file>src/physics/cam/subcol_SILHS.F90</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><inProgress>false</inProgress><nextBuild><number>188</number><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/188/</url></nextBuild><previousBuild><number>186</number><url>https://carson.math.uwm.edu/jenkins/job/cam_gpu_test/186/</url></previousBuild></previousBuild></workflowRun>