Skip to content

Add KIM collision-frequency scale#182

Closed
krystophny wants to merge 1 commit into
feat/flux-pumping/wp5-benchmarkfrom
feat/flux-pumping/wp5-collision-scale
Closed

Add KIM collision-frequency scale#182
krystophny wants to merge 1 commit into
feat/flux-pumping/wp5-benchmarkfrom
feat/flux-pumping/wp5-collision-scale

Conversation

@krystophny

@krystophny krystophny commented Jul 12, 2026

Copy link
Copy Markdown
Member

Adds a positive collision_frequency_scale to KIM configuration. It multiplies calculated electron and ion collision frequencies before the Krook argument and Fokker-Planck susceptibility inputs are assembled. The default is 1, so existing collision formulas, profiles, units, and outputs are unchanged. The configured value is displayed and stored in HDF5 provenance.

The periodized-background regression uses a scale of 3 and checks the resulting electron collision frequency against the existing Coulomb-logarithm formula.

Verification

Before: test_periodized_background_feed failed to compile because the configuration value did not exist.

After: the focused regression passes; the full CMake build and all 30 CTest tests pass; bare fo passes Static, Build, Tests, and Lint.

An initial 64-point Krook scout at omega=1e5 overflowed above scale 1. PR 183 traced that result to interpolation of the derived z0 across k_parallel=0, not to the collision-frequency scale. With z0 recomputed from interpolated primitives, scales 1 through 3 remain finite. This PR supplies a controlled sensitivity parameter; it makes no benchmark-acceptance claim.

Relation to Markus's Fokker-Planck periodic branch

This PR provides a controlled sensitivity parameter with a default-preserving implementation. It was used to diagnose the rejected Krook benchmark and is not an FP acceptance mechanism. Keep its provenance and regression independent of the periodic-FP decision in #191.

@marjohma

Copy link
Copy Markdown
Member

Closing: the wp5 flux-pumping stack is retired. The collision_frequency_scale knob is extracted to #225 onto the forced-periodicity lineage, keeping the default-preserving implementation, the positivity check, the config display, and the HDF5 provenance. Its regression is folded into the new test_collision_scale_z0 (self-contained, no dependency on the wp5 rt_fourier_periodic driver). As your PR text asked, it carries no benchmark-acceptance claim — it stays a sensitivity parameter.

@marjohma marjohma closed this Jul 15, 2026
marjohma added a commit that referenced this pull request Jul 15, 2026
)

## Summary

Extracts the two salvageable pieces of the retired wp5 flux-pumping
stack onto the forced-periodicity lineage. The rest of that stack
(#177#181, #184) is closed as superseded.

## Krook argument `z0` (was #183)

`interpolate_plasma_backs` interpolated the **derived** `z0` alongside
the primitives. `z0` carries a `1/|k_parallel|` singularity at the
resonance, so a four-point Lagrange stencil spanning `k_parallel = 0`
returns values that violate its own defining formula. The fix
interpolates primitives only and recomputes

    z0 = -(omega_E - omega - i nu) / (|k_parallel| sqrt(2) v_T)

on the target grid — the same invariant the periodized-background path
already follows.

**Scope:** `z0` is consumed only by `Krook_kernel_plasma_prefacs.f90`.
The Fokker-Planck path recomputes `x1/x2/A1/A2/I^{kl}` after
interpolation and never reads `z0`, so **FP results are bit-unchanged**.
This repairs the Krook hat path, whose nml still marks it `(unstable)` —
plausibly part of why.

## Collision-frequency scale (was #182)

New positive `&KIM_CONFIG` key `collision_frequency_scale` multiplying
the calculated electron and ion collision frequencies before `z0` and
the FP susceptibility inputs are assembled. Default `1.0` leaves every
collision formula, profile, unit, and output unchanged. Non-positive
values are rejected at startup; the value is displayed when it differs
from 1.0 and stored in HDF5 provenance. Same shape as the existing
`ion_flr_scale_factor` knob. No benchmark-acceptance claim — it is a
sensitivity parameter.

## Tests

`test_collision_scale_z0` (new) asserts the `z0` invariant on a stencil
straddling `k_parallel = 0` and away from it, and that the scale reaches
both `nu` and `z0` (including the imaginary part of `z0` tracking it).

Developed red-first: against the pre-fix code the test fails with a
**36% relative `z0` error at k_par = 2e-4** (`got (-0.0983, 0.0129)` vs
`want (-0.4543, 0.0599)`), growing without bound toward the resonance.

## Validation

- `make` — clean build
- `ctest -E
'test_rhs_balance|test_periodic_convergence|test_periodic_vs_global'` —
**32/32 passed**

Known red gates excluded as usual: the pre-existing `test_rhs_balance`
baseline failure, the periodization-deformation gate, and the
periodic-vs-global 5% gate — none touched by this change.

Supersedes #182, #183.
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.

2 participants