Skip to content

QL: guard source-only non-axisymmetric execution#125

Open
krystophny wants to merge 9 commits into
mainfrom
fix/flux-pumping/zero-source-guard
Open

QL: guard source-only non-axisymmetric execution#125
krystophny wants to merge 9 commits into
mainfrom
fix/flux-pumping/zero-source-guard

Conversation

@krystophny

Copy link
Copy Markdown
Member

Closes #122. This child is stacked on #119, #121, and #124 and remains open against main.

Summary

  • reject a fileless non-axisymmetric solve when neither a perturbation file nor an active, nonzero helical drive supplies the source
  • use the production helical-source predicate shared with the drive implementation
  • cover rejected zero-source and accepted driven-source configurations through the public initialization and validation path

Invariants

The guard runs before Arnoldi assembly. It does not change the numerical algorithm, discretization, convergence criteria, generated code, ABI, storage layout, Fourier convention, CGS units, source signs, boundary conditions, or switch-off response. A valid nonzero helical source passes unchanged; an identically zero source terminates before zero-norm normalization can create NaNs.

No branch in this stack is authorized to merge before the programme-wide gate.

Verification

Driven case fails on parent

The two process-level tests were applied without the production change at parent 7a868ae:

$ ctest --test-dir build -R '^ntv_(zero|driven)_source_guard_test$' --output-on-failure
50% tests passed, 1 tests failed out of 2
ntv_zero_source_guard_test   Passed
ntv_driven_source_guard_test Failed
ERROR: non-axisymmetric solve has no source.

The parent incorrectly rejected isw_hel_drive=1 with nonzero hel_phim_re.

Both cases pass after fix

$ fo
Static: OK
Build: OK
Tests: OK
Lint: OK
All stages passed

$ make test
100% tests passed, 0 tests failed out of 9

$ ctest --test-dir build -R '^ntv_(zero|driven)_source_guard_test$' --output-on-failure
100% tests passed, 0 tests failed out of 2

The zero-source test emitted the single expected diagnostic and returned in under five seconds. The driven test emitted Driven source accepted!. Neither output contained NaN or zhseqr.

$ git diff --check
<no output>

The 16 separately managed external-data regressions remain registered under regression;external-data; this branch does not mark that unavailable-data gate passed.

isw_qflux_NA=1 with in_file_pert='none' assembles an identically zero
non-axisymmetric source. That zero vector is the Arnoldi seed, so its
normalization divides by zero (0/0 -> NaN) and zhseqr then fails to
converge at every step, spinning without qflux output. Reject the
configuration in check() with a clear message instead.
Add an optional right-hand side to the non-axisymmetric solve: the
drive of a single-helicity perturbation given by a radial corrugation
field (delta B^s/B_0^phi)_mn and an electrostatic potential harmonic
Phi_mn. The vpar corrugation piece enters the A1/A2 force channels
with velocity weights a3m and x^2 (sigma-odd), the ExB piece with
weights x^-1 and a1m (sigma-even); the two new velocity moments are
computed in compute_sources. Input via new &ntv_input variables
(isw_hel_drive, m_theta_hel, hel_brad_re/im, hel_phim_re/im), default
off. Band profiles, moments and dimensional prefactors follow a
CAS-checked derivation (see issue #118).

Off by default: golden-record QL summary.h5 is reproduced to 1e-15
against a main build.
Review findings on the drive commit: fold the x^(3k-4) weight into a
single power so the x=0 quadrature node stays finite; skip the moment
quadrature on the precomputed-matrix-element path and reject
isw_hel_drive at run time when the moments are unavailable; reject the
unvalidated relativistic branch, reconstruction mode and unset species
data; deallocate asource_hel in collop_unload.
The zero-source guard added upstream rejects isw_qflux_NA=1 with
in_file_pert='none'. With the misalignment drive, that configuration is
valid: the drive supplies the non-axisymmetric source. Relax the guard
so it fires only when the drive is off or all its amplitudes are zero.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

QL: source-only in_file_pert='none' feeds a zero source to the Arnoldi eigensolver (NaN, endless zhseqr failures)

1 participant