diff --git a/src/Equilibrium/Sources/GFile.jl b/src/Equilibrium/Sources/GFile.jl index 84027a6676..c1c8ddf1b4 100644 --- a/src/Equilibrium/Sources/GFile.jl +++ b/src/Equilibrium/Sources/GFile.jl @@ -40,6 +40,20 @@ function _read_1d_gfile_format(lines_block::Vector{String}, num_values::Int) return parsed_values end +""" + gfile_fpol_single_precision(filename) -> Bool + +Whether the g-file's FPOL column was written in single precision: every value lies within 1e-8 +(relative) of its Float32 rounding. Double-precision values printed to the format's ten digits +sit about 1.5e-8 from it on average, so a whole column below 1e-8 is single precision. +""" +function gfile_fpol_single_precision(filename::AbstractString) + lines = readlines(filename) + nw = parse(Int, split(lines[1])[end-1]) + fpol = _read_1d_gfile_format(lines[6:(5+cld(nw, 5))], nw) + return all(f -> abs(Float64(Float32(f)) - f) <= 1e-8 * abs(f), fpol) +end + """ _read_efit(equil_in) diff --git a/src/GeneralizedPerturbedEquilibrium.jl b/src/GeneralizedPerturbedEquilibrium.jl index ba3701c3b9..43f6bd980f 100755 --- a/src/GeneralizedPerturbedEquilibrium.jl +++ b/src/GeneralizedPerturbedEquilibrium.jl @@ -243,6 +243,12 @@ function main_from_inputs( resolve_mode_space!(intr, ctrl) equil = Equilibrium.PlasmaEquilibrium(eq_config, additional_input) + # GPEC differentiates the spline of F, so single-precision FPOL rounding becomes noise in Δ′. + if eq_config.eq_type in Equilibrium.EFIT_KINDS && ctrl.integrator in ("riccati", "galerkin") && + Equilibrium.gfile_fpol_single_precision(eq_config.eq_filename) + @warn "The g-file's FPOL is single precision. Its rounding puts noise of order ±2–3 on Δ′ at 257 radial " * + "nodes; regenerate the file in double precision for converged Δ′." file = eq_config.eq_filename + end kf_ctrl, kinetic_profiles, kf_species = load_kinetic_context(inputs, intr, ctrl, equil) equil = maybe_reform_equilibrium(equil, intr, ctrl, kinetic_profiles; kf_ctrl=kf_ctrl, kf_species=kf_species) diff --git a/test/runtests_equil.jl b/test/runtests_equil.jl index bb04846ad2..f8afac63c4 100644 --- a/test/runtests_equil.jl +++ b/test/runtests_equil.jl @@ -22,6 +22,13 @@ using TOML @test 6.5 < plasma_eq_efit.ro < 7.5 # Physical sanity check end + @testset "Single-precision g-file FPOL is detected" begin + single_precision = GeneralizedPerturbedEquilibrium.Equilibrium.gfile_fpol_single_precision + @test single_precision(joinpath(@__DIR__, "..", "examples", "DIIID-like_ideal_example", "TkMkr_D3Dlike_Hmode.geqdsk")) + @test !single_precision(joinpath(@__DIR__, "test_data", "TokaMaker_ifile", "g65.geqdsk")) + @test !single_precision(joinpath(data_dir, "EQDSK_COCOS_02")) + end + @testset "Load EFIT Data (arclength)" begin arclength_config = GeneralizedPerturbedEquilibrium.Equilibrium.EquilibriumConfig(; eq_filename=joinpath(data_dir, "EQDSK_COCOS_02"),