Equilibrium - BUGFIX - Converge PEST Δ′ in the radial grid

未关闭
#524 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 3 天内回复

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
6/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
活跃
技术栈
julia
领域
compilers

调研方向

The defect sits in the Jacobian formula in DirectEquilibrium.jl (equilibrium_solver), with the same check needed in arclength_fieldline_int in DirectEquilibriumArcLength.jl. Start by reproducing the mpsi 256 vs 1024 table for PEST and hamada on the Solovev case. Done means PEST and hamada Δ′ agree to 1e-3 relative and are flat in mpsi, with the harness re-pinned.

由索引模型根据 Issue 内容生成。

描述

Problem

On a direct (traced) equilibrium, Δ′ in PEST coordinates does not converge as mpsi grows. The same equilibrium in hamada coordinates does. Δ′ at Mercier index α is sensitive to coefficient error at the surface, amplified by roughly x^(−2α), so a small geometry error that is invisible in the energies shows up in Δ′.

Solovev, q0 = 1.2 (one rational at q = 2, α = 0.886), wall a = 0.05, etol 1e-10, eulerlagrange_tolerance 1e-12, Riccati, ldp grid. Run on #398's head (81006c3a6):

mpsi hamada PEST PEST + direct J
256 −148.86 −151.76 −151.90
1024 −149.81 −129.21 −135.20
  • Hamada moves 0.6% from 256 to 1024. PEST moves 15%, in the wrong direction.
  • et₁ agrees across all six runs to 2e-6, so this is a Δ′-only defect.
  • The exact-coefficient reference for this case is −150.73 (local analytic patch, settings differ slightly).

Likely sources

  1. J from a spline θ-derivative. PEST forms the Jacobian as (1 + ff_deriv_val[4]) * y_out[end, 2] * 2π * psio (DirectEquilibrium.jl, equilibrium_solver), i.e. by differentiating a periodic cubic spline of ∫dl/B_p. Hamada does not need that derivative. Before #398, ⟨∂J/∂ψ⟩ from this formula was off by 88% rms against the exact Solovev value.
  2. θ resolution of the traced surface. After #398 each surface is sampled only at the mtheta + 1 straight-fieldline nodes. A prototype that fixed this case to ≤1e-4 across mpsi 128–2048 in both PEST and hamada used 2048 field-line points per surface plus direct J. On #398, direct J alone recovers about a third of the gap at mpsi 1024.

Suggested approach

  • Compute J directly at each θ node from the field there: J = 2π ψ₀ ∮(w dl/B_p) / w(θ), where w is the Jacobian weight (power_bp, power_b, power_r, power_rc). Snippet below; it is a drop-in replacement for the one line above.
  • Then find the remaining error: rerun the table with mtheta doubled and quadrupled, and with a tighter dense-output tolerance on the field-line solve. Whichever closes the PEST/hamada gap at mpsi 1024 is the second half of the fix.
  • Check arclength_fieldline_int (DirectEquilibriumArcLength.jl) gets the same J.
rfac_j = sqrt(max(ff_val[1], 0.0)); eta_j = 2π * (theta + ff_val[2])
r_j = ro + rfac_j * cos(eta_j); z_j = zo + rfac_j * sin(eta_j)
direct_get_bfield!(bf_j, r_j, z_j, raw_profile.psi_in, raw_profile.sq_in, sqd_j, psio; derivs=1)
bp_j = sqrt(bf_j.br^2 + bf_j.bz^2); b_j = sqrt(bp_j^2 + (bf_j.f / r_j)^2)
w_j = bp_j^equil_params.power_bp * b_j^equil_params.power_b / (r_j^equil_params.power_r * rfac_j^equil_params.power_rc)
rzphi_nodes[ipsi, itheta, 4] = y_out[end, 5] / w_j * 2π * psio

(bf_j = DirectBField() and sqd_j = deriv1(raw_profile.sq_in) are allocated once before the ψ loop.)

Acceptance

  • Solovev α 0.89: PEST and hamada Δ′ agree to ≤1e-3 relative at mpsi 256 and 1024, and each is flat in mpsi to the same level.
  • DIII-D-like n = 1 Riccati: PEST and hamada Δ′ agree on all five surfaces once #506's profiles are in.
  • Every direct-equilibrium PEST result moves, so the PR takes ! and re-pins the harness.

Dependencies

  • Stacks on #398 (common straight-fieldline sampling; approved, needs its conflicts resolved). #398 removes the sparse-sampling noise that dominated before; this issue is what is left.
  • Independent of #506 (#504), #517 and the crossing work (#481).
主要语言
Julia
星标
11
派生
7
平均合并
3 天 2 小时
30 天内合并 PR
66

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 有 Pull Request 模板
  • 没有贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

OpenFUSIONToolkit/GPEC 的其他 Issue

查看 OpenFUSIONToolkit/GPEC 的全部 Issue

相似的 Issue

更多 Julia Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。