[us-commits] [ehb54/ultrascan3] 68384f: somo/grpy: wire shell reduction into SOMO with a H...

emre brookes noreply at github.com
Thu Aug 6 15:12:38 MDT 2026


  Branch: refs/heads/ehb54-issue-984
  Home:   https://github.com/ehb54/ultrascan3
  Commit: 68384f0bed49388d107ce8e4ae046097a44a8fba
      https://github.com/ehb54/ultrascan3/commit/68384f0bed49388d107ce8e4ae046097a44a8fba
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-08-06 (Thu, 06 Aug 2026)

  Changed paths:
    M us_somo/develop/grpy/grpy_shell.hpp
    M us_somo/develop/grpy/tests/test_shell.cpp
    M us_somo/develop/include/us_hydrodyn.h
    M us_somo/develop/include/us_hydrodyn_hydro.h
    M us_somo/develop/src/us_hydrodyn_grpy.cpp
    M us_somo/develop/src/us_hydrodyn_hydro.cpp
    M us_somo/develop/src/us_hydrodyn_settings.cpp

  Log Message:
  -----------
  somo/grpy: wire shell reduction into SOMO with a Hydrodynamics Options control

Adds the GUI control, settings persistence, and the call-site integration for the
shell-reduction layer, plus two fixes that only an end-to-end run exposed.

GUI: a "GRPY Shell Reduction" groupbox in the SOMO Hydrodynamic Calculation
Options window, below GRPY Numerical Precision and alongside the buried-bead
exclusion it generalizes. Off / On, a target-accuracy field, and a "require
intrinsic viscosity" checkbox. Backed by hydro.grpy_shell{,_tol,_require_eta},
persisted in settings save/load/default and display_default_differences,
mirroring grpy_single. gui_script `global grpy_shell` / `grpy_shell_tol` /
`grpy_shell_require_eta` and GRPY_SHELL still override, for headless work.

Intrinsic viscosity: when it was not required to converge (or was and did not),
it is WITHHELD from the reported results rather than propagated with a caveat --
a value carrying a warning is still a value that gets used downstream. Withheld
together with it is the GRPY Einstein radius: both are parsed from the same
report line ("Zero frequency intrinsic viscosity eta 0", fields 1 and 2) and the
radius is viscosity-derived, so it inherits the identical unreliability. Guarded
at all three sites -- the per-model assignments and the cross-model accumulator.
The values remain in the results file, annotated, for the record.

Note the cross-model mean divides by the TOTAL model count, not a per-observable
count, so a run mixing contributing and non-contributing models would silently
corrupt it. That is safe only because this is a run-level setting: every model in
a run either requires viscosity convergence or none does. Commented at the site.

Two fixes found by running it, not by the unit tests:

1. When the ladder cannot meet the tolerance it runs out onto its final rung,
   which is the unreduced model -- so the result is exact. It was still reporting
   the last inter-rung gap as the error bar (1.68% on a 246-bead test), which
   describes the coarser rung just discarded, not the answer returned. Honest,
   since it bounds a true error of zero, but plainly misleading. A ShellReport
   ::unreduced flag now zeroes the bars and the annotation states that the result
   is exact.

2. The same path wrongly marked viscosity unreliable. An unreduced solve has
   nothing to converge, so viscosity is exact regardless of what was requested;
   withholding it would have discarded a perfectly good value. viscosity_ok()
   now short-circuits on unreduced.

Six assertions cover both in tests/test_shell.cpp.

Verified end to end on a bead model via gui_script: the annotation reports
"98 of 98" beads (SOMO's ASA buried-bead exclusion having already reduced 246 ->
98, which is exactly why a model this size has nothing left to give), zero
estimated error, no viscosity warning, and every observable bit-identical to the
unreduced baseline. Clean libus_somo + app builds, no new warnings.

Fixes ehb54/ultrascan-tickets#984

Co-Authored-By: Claude Opus 5 <noreply at anthropic.com>



To unsubscribe from these emails, change your notification settings at https://github.com/ehb54/ultrascan3/settings/notifications


More information about the us-commits mailing list