Skip to content

Releases: Ghoniem/RadCluster

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 22:52
Immutable release. Only release title and notes can be modified.

RadCluster v2.2.0 — distribution and packaging

This release changes what you get when you check the repository out, and
how you can run it without building anything. The solver's physics and
numerics are identical to v2.1.2.

A published image carries the compiled solver, the Python layer and the
EUROFER-97 input workbook, so a working installation no longer requires
SUNDIALS, CMake and a C++17 toolchain:

docker run --rm -it ghcr.io/ghoniem/radcluster:v2.2.0

Inside, solver is on PATH and /work holds py_utils/, input/ and
codes/ with PYTHONPATH set. The image builds SUNDIALS 7.1.1 from
source rather than taking Ubuntu's 6.4.1, because this solver uses the
v7 context API. Its solver is compiled for x86-64-v2, not for the
machine that built it, so it runs on any x86-64 CPU from roughly 2009
onward; for sustained production runs, build from source with the
default -march=native instead.

Output written inside a container is lost when it exits. Mount a host
directory for anything worth keeping.

No longer tracked: the five archived modules under archive/, the
assistant's local session state under .claude/, a scratch drop at
Claude outputs/.

Nothing was deleted — every file remains in the history:

git checkout e9f92c3 -- archive/
git checkout 12965a5 -- radcluster_code/output/

e9f92c3 is deliberate: it is the last commit in which the archived
modules sat under archive/. The tags v2.0.0 and eurofer_cd-final
predate the archiving moves, so at those refs the same modules are at
the repository root instead.

Note that digital_twin/verification/runs.py and make_tables.py read
the reference run by name, so restore it before running the
verification campaign on a fresh clone.

This does not make a clone smaller to download: git still fetches the
full history, which retains every removed file.

  • h2jupynb, the UCLA Hoffman2 Jupyter launcher, moved from the
    repository root to scripts/. The in-repo copy carries UTF-8 decoding
    and Windows Ctrl-C fixes that a fresh download would discard.
  • scripts/link-memory.sh deleted; the scheme it served is retired.
  • cpp_utils/CMakeLists.txt gains RADCLUSTER_ARCH_FLAGS, so a
    redistributable build can opt out of -march=native. Default unchanged.
  • .github/workflows/release.yml builds and publishes the image and
    opens the release whenever a v* tag is pushed.

Rebuilt and re-gated on Windows (MSVC, SUNDIALS 7.1.1, Woodbury and KLU
both enabled):

  • graph declaration and state layout — pass (24 edges, 24 kernels, N_eq = 69)
  • Frenkel-pair conservation through the C++ solver with
    half-<111> to <100> conversion on — pass, final delta_FP = 1.7e-15
  • helium conservation across 4 physics options x 2 He-kinetics modes —
    all 8 pass, max delta_He <= 9.3e-12

Container image

docker pull ghcr.io/ghoniem/radcluster:v2.2.0
docker run --rm -it ghcr.io/ghoniem/radcluster

RadCluster v2.1.2: Frenkel-pair conservation correction

Choose a tag to compare

@Ghoniem Ghoniem released this 01 Oct 12:57
Immutable release. Only release title and notes can be modified.

RadCluster v2.1.2: Frenkel-pair conservation correction

The problem

The regression case im5vm2 had a Frenkel-pair residual δ_FP = 1.24×10⁻² at t = 10⁻² s. That is above the 10⁻³ level that signals a coding error.

Cause

In all three C++ right-hand sides (rhs_case2, rhs_case1, rhs_bin_moment in radcluster_code/cpp_utils/materials/eurofer97/rate_kernels.cpp), SIA thermal emission I₍ₙ₊₁₎ → Iₙ + I₁ moved the emitting cluster down one size. It never added the emitted monomer to I₁; vacancy emission does this, through emit_mono. One SIA was lost per emission event, and this is the whole residual:

  • the vacancy arm of δ_FP closed to 10⁻¹²;
  • the time integral of the emitted-monomer flux equals the SIA arm's deficit at every output time.

Fix

The monomer is now returned to I₁. On im5vm2 at 10⁻² s:

before (v2.1.1) v2.1.2
δ_FP 1.24×10⁻² 2.9×10⁻⁷
δ_He 1.0×10⁻¹⁵ 1.9×10⁻¹⁴
C_SIA_tot (m⁻³) 2.0648×10¹⁸ 2.0754×10¹⁸ (+0.5 %)
C_VAC_tot, C_He_tot, mean sizes, swelling unchanged to 2×10⁻⁶

Reproducing earlier results. Set sim.input_data.reactions["sia_emission_monomer"] = "dropped" (the default is "returned"). This restores the arithmetic before v2.1.2 bit for bit: im5vm2 then gives δ_FP = 0.012442841061051264 exactly. In the solver parameter file the key is sia_emission_monomer; it is 0 when absent.

A second residual remains in long loop-coarsening runs. There, the loop distribution can outgrow the size axis, and content leaves through the upper boundary. Check δ_FP against the axis length.

The correction was found in the migration of RadCluster into GSD (v2.0.0, Stage 5). GSD's declared equations cannot lose content, and they match this C++ kernel at round-off. See README §2.9.

v2.0.0

Choose a tag to compare

@Ghoniem Ghoniem released this 01 Oct 11:16
Immutable release. Only release title and notes can be modified.

RadCluster 2.0.0 — graph-based cluster dynamics baseline

This release marks RadCluster_2_0/, the stable two-layer, graph-based cluster dynamics framework for radiation-induced defect evolution, with EUROFER-97 as the reference host material. It is the implementation described in:

N. M. Ghoniem, A Generalized Graph-Based Cluster Dynamics Framework for Irradiated Materials, Journal of Nuclear Materials (submitted, 2026) — docs/Formulation/cluster_dynamics_framework/Generalized_Cluster_Dynamics.pdf

What is in RadCluster_2_0

  • Reaction Admissibility Graph (RAG). The master equation is assembled by walking a graph of admissible elementary reactions drawn from ten abstract edge classes, rather than hand-written per material.
  • Two-layer architecture. A host-independent abstract core (py_utils/core/, cpp_utils/core/) and a EUROFER-97 material declaration (materials/eurofer97/) with the P1–P8 rate kernels.
  • Two equation formulations. Discrete per-size ODEs, or a logarithmic bin-moment grouping with piecewise-constant, hat-function, or log-normal intra-bin closures.
  • Fission and fusion cascade sources, with the corresponding helium–vacancy state-space reductions (decoupled inventory or mean-field loading).
  • Two SIA loop populations, ½⟨111⟩ and ⟨100⟩, coupled through loop-character conversion.
  • Solute trapping and mixed 1D/3D transport for EUROFER-97.
  • C++17 SUNDIALS/CVODE BDF solver with dense, banded, GMRES, or KLU linear solvers, a Woodbury preconditioner, full_system and active_window modes, and an adaptive cluster-size domain.
  • Conservation diagnostics (Frenkel-pair and helium residuals) reported on every run.
  • Driver notebooks and tests: codes/Notebooks/RadCluster_2_0.ipynb, EuroferExperiments.ipynb, and the conservation, convergence, and sweep scripts in codes/Python_Testing/.

Notes

  • The tag snapshots the whole repository at commit 771c787. The tree also contains RadCluster_2_1/, which is under active development and is not part of this release's scope.
  • After this release, RadCluster_2_0/ moves to archive/RadCluster_2_0/ on main as a read-only reference. Check out tag v2.0.0 to get it at its original path.
  • See the repository README.md for installation, inputs, outputs, and how to cite.

Released under the MIT License.