Skip to content

PE toroidal torque changes sign under grid refinement while its magnitude stays stable to ~1% #370

Description

@d-burg

Summary

perturbed_equilibrium/energies/toroidal_torque on the DIII-D-like ideal example changes sign under small, benign changes to the discretization, while its magnitude stays stable to about 1%. Radial refinement, poloidal refinement, and (independently reported) a dependency update all flip it. A physical torque should not behave this way: the sign is being set by something arbitrary rather than by the physics.

Measured after #350, so the coil-forcing fixes in that PR (b2ec04c3, 8dab0ed9) do not resolve it.

Evidence

All runs use examples/DIIID-like_ideal_example unchanged except for the grid controls named.

Radial refinement on a fixed ldp grid, post-#350 (grid_type="ldp", mpsi as shown; mpsi=0 is the deck's auto grid):

grid torque
auto (561 knots) +0.050865
ldp 512 +0.050892
ldp 1024 −0.050645
ldp 2048 +0.050876

Same scan before #350:

mpsi 128 256 512 1024 2048
torque −0.0507289 −0.0506007 +0.0508128 −0.0510857 +0.0509140

Poloidal refinement at fixed mpsi = 1024 (pre-#350) — changing only mtheta:

mtheta torque
256 −0.0510857
512 +0.0513171

Across every configuration above the magnitude sits in 0.0506–0.0513, a spread of ~1.4%, while the sign takes both values.

It is deterministic, not noise

Re-running mpsi = 1024 and 2048 with the Euler-Lagrange tolerance tightened from 1e-10 to 1e-12 reproduces each value — including its sign — to 1.8e-10 or better:

quantity mpsi el_tol=1e-10 el_tol=1e-12 rel diff
pe_torque 1024 −0.051085748 −0.051085748 4.6e-11
pe_torque 2048 +0.0509139592 +0.0509139592 1.8e-10

So the sign is a reproducible function of the grid, not run-to-run instability, and not integration error.

Independent report of the same symptom

In #338, @matt-pharr reported a set of package updates that "flip the sign of the torque in the d3d ideal example". That is a third, unrelated trigger producing the same signature — sign inverts, magnitude survives.

Why this looks like a convention rather than a convergence problem

A quantity that is converging would show its magnitude settling and its sign fixed. Here the magnitude is already stable to ~1% across an 8× radial refinement, a 2× poloidal refinement, and a code change — while the sign is not stable under any of them. That pattern fits a sign carried by something with an arbitrary choice in it (an eigenvector phase or normalization convention, or a branch selection somewhere in the torque assembly) rather than a physical quantity that has not yet converged.

Worth checking whether the torque is computed from an expression that is genuinely phase-invariant. Quantities built as Im(a* b) are invariant to a global phase on the mode; anything effectively linear in the eigenvector's sign is not.

Why it matters now

The regression harness tracks this quantity (pe_toroidal_torque in regression-harness/cases/diiid_n1.toml, noise_threshold = 1e-12). Any run that lands on the other sign reports a ~200% regression — which is exactly the 200.47% torque "regression" quoted in #338's original table. Until this is resolved the quantity cannot carry a golden value, and it will keep generating false regressions whose cause is invisible to whoever is reading the report.

Reproducing

# in a copy of examples/DIIID-like_ideal_example, set Equilibrium.grid_type="ldp"
# and Equilibrium.mpsi to each of 512, 1024, 2048, then:
julia --project=. -e 'using GeneralizedPerturbedEquilibrium; GeneralizedPerturbedEquilibrium.main(["<deck>"])'
# read perturbed_equilibrium/energies/toroidal_torque from gpec.h5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions