[us-commits] [ehb54/ultrascan3] e0d57b: somo/grpy: add self-contained in-process GRPY modu...

emre brookes noreply at github.com
Thu Aug 6 13:46:52 MDT 2026


  Branch: refs/heads/somo-dev
  Home:   https://github.com/ehb54/ultrascan3
  Commit: e0d57bc99cd1ff7d35f3b5a0a03c310b4fd4745d
      https://github.com/ehb54/ultrascan3/commit/e0d57bc99cd1ff7d35f3b5a0a03c310b4fd4745d
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-18 (Sat, 18 Jul 2026)

  Changed paths:
    A us_somo/develop/grpy/INTEGRATION.md
    A us_somo/develop/grpy/README.md
    A us_somo/develop/grpy/grpy_api.hpp
    A us_somo/develop/grpy/grpy_core.hpp
    A us_somo/develop/grpy/grpy_report.hpp
    A us_somo/develop/grpy/linalg.hpp
    A us_somo/develop/grpy/parallel_qt.hpp
    A us_somo/develop/grpy/parallel_std.hpp
    A us_somo/develop/grpy/tests/data/1znf.bead_model
    A us_somo/develop/grpy/tests/data/1znf_golden.txt
    A us_somo/develop/grpy/tests/data/dumbbell_golden.txt
    A us_somo/develop/grpy/tests/qt_proof.cpp
    A us_somo/develop/grpy/tests/run.sh
    A us_somo/develop/grpy/tests/test_api.cpp
    A us_somo/develop/grpy/tests/test_assemble.cpp
    A us_somo/develop/grpy/tests/test_linalg.cpp
    A us_somo/develop/grpy/tests/test_ooc.cpp
    A us_somo/develop/grpy/tests/test_threaded.cpp
    M us_somo/develop/libus_somo.pro

  Log Message:
  -----------
  somo/grpy: add self-contained in-process GRPY module (Eigen)

Adds us_somo/develop/grpy/: a C++ port of GRPY (generalized Rotne-Prager-Yamakawa
hydrodynamics) callable in-process, to replace the external Fortran binary run via
QProcess with stdout scraping.

The module is self-contained and isolated from the SOMO god classes:
- header-only, own namespace (grpy), dependency-injected threading (la::Parallel;
  QtParallel over QThreadPool for SOMO, std::thread for the CLI/tests);
- memory-lean tiled Cholesky (solve M X = T instead of forming the full inverse;
  upper-triangle, factored in place) with single-precision and out-of-core (mmap)
  options for large systems, and fine-grained in-inversion progress via callback;
- grpy::Solver::run(beads, params, progressCb) returns structured scalars AND the
  full report text, so the on-disk results file is preserved as before.
- tests/ validate against the captured GRPY golden (report + scalars) and prove the
  Qt in-process path; run standalone via tests/run.sh.

Wires the qmake build (QT += concurrent, INCLUDEPATH += include grpy, HEADERS).
No US_Hydrodyn changes yet; the QProcess call-site swap is a follow-up commit.

Refs ehb54/ultrascan-tickets#972

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


  Commit: d3e4bc90e410221103f9e57d5f1aa0c0f5a0d8d7
      https://github.com/ehb54/ultrascan3/commit/d3e4bc90e410221103f9e57d5f1aa0c0f5a0d8d7
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-18 (Sat, 18 Jul 2026)

  Changed paths:
    M us_somo/develop/grpy/grpy_api.hpp
    A us_somo/develop/grpy/tests/data/dumbbell.grpy
    M us_somo/develop/grpy/tests/test_api.cpp
    M us_somo/develop/src/us_hydrodyn_grpy.cpp

  Log Message:
  -----------
  somo/grpy: run GRPY in-process, drop external binary + Docker path

Wire the self-contained grpy module into US_Hydrodyn::calc_grpy_hydro /
grpy_process_next: read the .grpy file SOMO already writes via
grpy::read_native_file(), run grpy::Solver over a QtParallel backend on
SOMO's thread pool, and fill grpy_stdout from Results::report so the
existing grpy_finished() parsing and .grpy_res preservation are unchanged.

Removes the QProcess launch, the US_Container_Grpy selection, and the
Docker/parallel-image plumbing -- in-process is now the sole path. Progress
is driven by the Solver callback (processEvents keeps the GUI painting).

Adds grpy::read_native_file() + a native-reader test case (dumbbell.grpy)
that reproduces the dumbbell golden.

Refs ehb54/ultrascan-tickets#972

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


  Commit: 3647e4575c4e7785585ed676e543c891f0d3c98d
      https://github.com/ehb54/ultrascan3/commit/3647e4575c4e7785585ed676e543c891f0d3c98d
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-18 (Sat, 18 Jul 2026)

  Changed paths:
    R us_somo/develop/include/us_container_grpy.h
    M us_somo/develop/include/us_hydrodyn.h
    M us_somo/develop/include/us_hydrodyn_misc.h
    M us_somo/develop/libus_somo.pro
    R us_somo/develop/src/us_container_grpy.cpp
    M us_somo/develop/src/us_hydrodyn.cpp
    M us_somo/develop/src/us_hydrodyn_grpy.cpp
    M us_somo/develop/src/us_hydrodyn_misc.cpp
    M us_somo/develop/src/us_hydrodyn_settings.cpp

  Log Message:
  -----------
  somo/grpy: remove dead external/Docker GRPY plumbing

Now that GRPY runs in-process (the external binary + Docker path is gone),
delete the symbols that only served the old QProcess path:

- US_Container_Grpy class (src/us_container_grpy.cpp, include/us_container_grpy.h)
  and its libus_somo.pro SOURCES/HEADERS entries; the us_container_grpy member,
  its includes/init, and grpy_parallel_pulled.
- cb_parallel_grpy checkbox + set_parallel_grpy() slot and the misc.parallel_grpy
  field, incl. its settings save/load/default (old saved values are simply ignored).
- the grpy QProcess* member, grpy_prog, and the grpy_readFromStdout/Stderr/started
  slots. stop_calc()'s process-terminate block is replaced by a note: cancellation
  now flows through stopFlag, honored by the Solver progress callback and
  grpy_finished().

Objects rebuild cleanly (us_hydrodyn, us_hydrodyn_grpy, us_hydrodyn_misc,
us_hydrodyn_settings).

Refs ehb54/ultrascan-tickets#972

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


  Commit: 7a83b64352e047e10fe6bc46d68e4e6a05bd9aee
      https://github.com/ehb54/ultrascan3/commit/7a83b64352e047e10fe6bc46d68e4e6a05bd9aee
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-19 (Sun, 19 Jul 2026)

  Changed paths:
    M us_somo/develop/src/us_hydrodyn_grpy.cpp

  Log Message:
  -----------
  somo/grpy: fix in-process finish hand-off + resolve input path

Two fixes found while validating the in-process path end-to-end via the
batch gui_script on a real bead model:

1. grpy_finished() was never invoked. It was posted with
   QMetaObject::invokeMethod(..., Qt::QueuedConnection, Q_ARG(QProcess::
   ExitStatus, ...)), but QProcess::ExitStatus is not a registered
   queued-connection metatype, so the invoke silently failed
   ("Unable to handle unregistered datatype 'QProcess::ExitStatus'").
   grpy_running then never cleared and the batch's
   while(grpy_running) processEvents() loop hung forever. Replaced both
   call sites with QTimer::singleShot(0, this, lambda) which defers to the
   event loop (still no deep recursion through the model batch) but calls
   grpy_finished() directly, needing no metatype registration.

2. read_native_file() read grpy_last_processed (a bare filename) relative
   to the process CWD. The old QProcess set its working directory to
   get_somo_dir(); resolve the path against get_somo_dir() to match, and
   guard a missing file with a clear error instead of a silent empty solve.

Validated: gui_script batch run on a 165-bead model produces a .grpy_res
whose every physical observable (rotational diffusion, sedimentation,
intrinsic viscosities, all 8 relaxation times, diagonal diffusion tensor)
matches the Fortran GRPY_osx10.11 binary on the same .grpy input exactly;
only the documented eigenvector sign-gauge and ~1e-9 coupling noise differ.

Refs ehb54/ultrascan-tickets#972

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


  Commit: 89f4a3ddd7aa11db5166a243e2d5260aa746ccb4
      https://github.com/ehb54/ultrascan3/commit/89f4a3ddd7aa11db5166a243e2d5260aa746ccb4
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-19 (Sun, 19 Jul 2026)

  Changed paths:
    M us_somo/develop/src/us_hydrodyn_grpy.cpp

  Log Message:
  -----------
  somo/grpy: expose single-precision + out-of-core options

Wire grpy::Options.single and .ooc_dir at the in-process call site. These
matter only for very large bead models (memory-bound; run via batch/cluster),
so they are surfaced through the lightweight, no-UI mechanisms rather than
new god-class dialog controls:

  - gui_script `global grpy_single 1` / `global grpy_ooc_dir <dir>`
  - GRPY_SINGLE / GRPY_OOC_DIR environment-variable fallback (matches the
    standalone CLI's env knobs)

Default off = in-core double precision, byte-identical to prior behavior. A
"GRPY options: ..." editor message is emitted when either is active.

Validated: gui_script run with `global grpy_single 1` on the 165-bead model
completes and reproduces every labeled observable of the double-precision /
Fortran-golden result (single matches to 4 sig figs by design). The module's
single-precision and out-of-core paths themselves are covered by the grpy
unit tests (test_linalg float, test_ooc).

Refs ehb54/ultrascan-tickets#972

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


  Commit: f17026f45075de36cb25ba4601f2fa662255683c
      https://github.com/ehb54/ultrascan3/commit/f17026f45075de36cb25ba4601f2fa662255683c
  Author: ehb54 <brookes at uthscsa.edu>
  Date:   2026-07-19 (Sun, 19 Jul 2026)

  Changed paths:
    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: add GRPY precision (double/float) control to Hydro Options

Per review, surface the single-precision option as a proper control in the
SOMO Hydrodynamic Calculation Options window rather than script/env only.

Adds a "GRPY Numerical Precision:" group with "Double (default)" / "Float
(for large systems)" radios to US_Hydrodyn_Hydro, right below the existing
"Inclusion of Buried Beads (for GRPY)" group and mirroring its idiom. Backed
by hydro.grpy_single (default false = double), persisted in the SOMO settings
(save/load/default) and reported in display_default_differences() like the
sibling GRPY setting.

The in-process call site now reads hydro.grpy_single as the primary source;
the gui_script `global grpy_single` param and GRPY_SINGLE env var still
override for headless/batch automation. Out-of-core stays script/env only
(a cluster-scale knob, no GUI control).

Validated: full libus_somo rebuild clean (0 errors); default-double gui_script
run reproduces the Fortran-golden scalars (no regression).

Refs ehb54/ultrascan-tickets#972

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


  Commit: 2144ac85955171f354fcd3edd5402d67e4e4f4f5
      https://github.com/ehb54/ultrascan3/commit/2144ac85955171f354fcd3edd5402d67e4e4f4f5
  Author: emre brookes <ehb54 at users.noreply.github.com>
  Date:   2026-08-06 (Thu, 06 Aug 2026)

  Changed paths:
    A us_somo/develop/grpy/INTEGRATION.md
    A us_somo/develop/grpy/README.md
    A us_somo/develop/grpy/grpy_api.hpp
    A us_somo/develop/grpy/grpy_core.hpp
    A us_somo/develop/grpy/grpy_report.hpp
    A us_somo/develop/grpy/linalg.hpp
    A us_somo/develop/grpy/parallel_qt.hpp
    A us_somo/develop/grpy/parallel_std.hpp
    A us_somo/develop/grpy/tests/data/1znf.bead_model
    A us_somo/develop/grpy/tests/data/1znf_golden.txt
    A us_somo/develop/grpy/tests/data/dumbbell.grpy
    A us_somo/develop/grpy/tests/data/dumbbell_golden.txt
    A us_somo/develop/grpy/tests/qt_proof.cpp
    A us_somo/develop/grpy/tests/run.sh
    A us_somo/develop/grpy/tests/test_api.cpp
    A us_somo/develop/grpy/tests/test_assemble.cpp
    A us_somo/develop/grpy/tests/test_linalg.cpp
    A us_somo/develop/grpy/tests/test_ooc.cpp
    A us_somo/develop/grpy/tests/test_threaded.cpp
    R us_somo/develop/include/us_container_grpy.h
    M us_somo/develop/include/us_hydrodyn.h
    M us_somo/develop/include/us_hydrodyn_hydro.h
    M us_somo/develop/include/us_hydrodyn_misc.h
    M us_somo/develop/libus_somo.pro
    R us_somo/develop/src/us_container_grpy.cpp
    M us_somo/develop/src/us_hydrodyn.cpp
    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_misc.cpp
    M us_somo/develop/src/us_hydrodyn_settings.cpp

  Log Message:
  -----------
  Merge pull request #487 from ehb54/ehb54-issue-972

somo: in-process GRPY (C++/Eigen), replacing the external binary


Compare: https://github.com/ehb54/ultrascan3/compare/bf1c7305fc74...2144ac859551

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