A longer gap than biweekly. The remeshing remap from last update merged, and two monthly maintenance rollups (#76, #86) landed either side of it — most of the window went into performance, parallel-loop correctness, and making the code configure its own build and survive a new compiler.

DynEarthSol development

Remeshing remap, merged:

  • PR #74 is on master — the free-surface stress pin, surface-relative reference pressure, Deborah-number remap blend, and untouched-element carry-through described last time.
  • The July rollup #76 carried the robustness work underneath it: a double-deletion bug in delete_points_on_boundary() that detached the top surface into a spurious cliff, restart/output metadata, and boundary-condition and time-stepping fixes.

Performance, 1.55× on the stress path and 2.17× on the yield path (#86):

  • Eigenvalue-only yield pre-filter in elasto_plastic() — skip the full return-mapping where the stress state is safely inside yield.
  • Gated centroid gathers in update_stress, and per-element property means memoized instead of recomputed.
  • Creep-law material terms hoisted out of visc().
  • Both node-support graphs flattened to compressed sparse row.

Parallel-loop correctness and a compiler matrix (#86):

  • The OpenACC barycentric constructor kernels stay async; the waits move to the consumers, with all nine construction sites audited so every host read sits behind a wait.
  • SurfaceTopo::build const scalars move from shared() to firstprivate() — gcc 8 rejects predetermined-shared consts in shared(), gcc 9+ requires them under default(none), and firstprivate satisfies both.
  • New omp-gcc-matrix.yml: a g++ 8–15 compile matrix that hard-errors on version-dependent default(none) violations (it caught the fix above), plus a 1- vs 4-thread run of 2d-ep-irregular.cfg compared with compare.py to flag race-sized divergence.

Build self-configuration (#78, #81):

  • HDF5, libomp, and Boost are auto-detected on Linux and macOS, and the CPU model is read from sysctl on macOS — a fresh clone builds with a plain make.
  • The build now rebuilds when the compiler changes, not only when flags do.

GPU build, two NVHPC 26.5 failures (#90):

  • -gpu=mem:managed rewrites new/delete per translation unit, so libboost and libstdc++ objects allocated from the managed pool were released with glibc free(). A local-symbols.map gives each side one allocator (cross-allocator frees 4515 → 731) while DES’s own managed allocations stay device-accessible.
  • nvc++ 26.5 miscompiles iterator-based STL algorithms inside acc compute regions — they return pointer values where .size() stays correct — so the two affected sites became explicit index loops. Also a knn-bvh submodule bump for CUDA 13+.

CI:

  • #79 shrank the nvhpc build image so jobs start faster; open #94 pins snapshot.debian.org so CI keeps building on end-of-life Debian bases.

Research progress

Up next

  • Turn the referee comments into a revised DynEarthSol v2.0 manuscript.
  • Keep the build and GPU paths green across compilers (CI base pinning in #94).
  • Prepare the GPU and TPF talks for the Korea DES workshop in November.