parIRL=1 crashed the engine with SIGSEGV (CGI exitCode 139) at both GUI
defaults, so the sputtering path has never actually worked.
The first diagnosis blamed KO(600,MAXNL5,2) being shallower than the
2000-wide recoil lists. That is wrong: enlarging KO to 2000 does not help,
because the cascade overruns all of them. The real cause is parERC=0, which
is the GUI default and what tests/Si_1layer/Si_1layer_E19000.inp carries. The
primary knock-on test is IF(DEN(IV).LE.ERC) GO TO 6, so with no cutoff every
atom receiving any energy is respawned as a recoil on each cascade
generation; the branching ratio exceeds one and NREC1/NREC2 grow
geometrically (81, 153, 269, 455, 773, 1317, ...) instead of draining, so the
list-2/list-1 loop at label 83 never terminates. Forcing a real cutoff
converges, with a peak depth of only 103, so KO was left at 600.
fortran/trimspNL.F:
- Refuse parIRL>=1 with parERC<=0 after readGuiInput, before any transport
work, with a message naming the field to change.
- The IF(NREC2.GT.2000) guard now stops non-zero instead of falling through
into the out-of-bounds write loop, so any future non-convergent cascade
fails cleanly instead of corrupting memory.
TrimSPlib.js / TrimSP.html, so this is caught before the engine is invoked:
- handleRecoilModeChange, wired to the parIRL widget, fills parERC with
TRIMSP_MIN_RECOIL_CUTOFF = 0.02 when recoils are switched on with a cutoff
of 0, and says so.
- A pre-run check refuses the run if the user then insists on parIRL=1 with
parERC=0, reporting via the status bar and a transient warning and focusing
parERC. Deliberately not wired to parERC, so retyping the cutoff is what
insisting means and is not silently overridden; this also covers shared
config links, which assign widget values directly.
- The parIRL tooltip documents the requirement.
Tests: tests/recoil-cutoff-test.js (12 cases) lifts the shipped cutoff code
out of TrimSPlib.js and runs it against a document stub. Verified against a
fresh build: parERC=0/parIRL=1 now exits 1 with the new message instead of
139, parERC=0.02 completes with parIRL=0 or 1, and parERC=0/parIRL=0 output
is unchanged (.rge byte-identical). tests/cgi-tests.sh 18/18.
This patch modularizes the code responsible for selecting the stopping power coefficients. Specifically, it:
- moves the data in `elemPars` to seperate JSON files in the `data/` directory. This makes it easier to modify the existing data or add new data sources. Note that this refactoring does not alter the previous functionality - the contents of each file are simply read and deep-merged into an initially empty `elemPars` object.
- adds the original Varelas-Biersack parameters from Anderson & Ziegler (1977).
- updates the "Other Parameters" tab in the GUI for easy toggling between the different stopping power coefficient data sources.
- use clearer notation for isotope-specific projectiles
- harmonize formatting of GUI labels (consistent naming, add missing units, fix typos, etc.)
- use more verbose/descriptive naming of the function/dictionary handelling the electronic stopping coefficients (for easier extension later).