From 7c0eb7171e16c3bf53158415785afce666e4e934 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Thu, 14 Nov 2024 15:18:02 -0500 Subject: [PATCH 1/9] change FixLambdagauge to fix FSA of lambda to be zero --- desc/objectives/linear_objectives.py | 86 ++++++---------------------- tests/test_linear_objectives.py | 17 ++---- 2 files changed, 23 insertions(+), 80 deletions(-) diff --git a/desc/objectives/linear_objectives.py b/desc/objectives/linear_objectives.py index 6f302f2df0..6c4c630898 100644 --- a/desc/objectives/linear_objectives.py +++ b/desc/objectives/linear_objectives.py @@ -12,7 +12,7 @@ from termcolor import colored from desc.backend import execute_on_cpu, jnp, tree_leaves, tree_map, tree_structure -from desc.basis import zernike_radial, zernike_radial_coeffs +from desc.basis import zernike_radial from desc.geometry import FourierRZCurve from desc.utils import broadcast_tree, errorif, setdefault @@ -774,8 +774,8 @@ def build(self, use_jit=False, verbose=1): super().build(use_jit=use_jit, verbose=verbose) -class FixLambdaGauge(_Objective): - """Fixes gauge freedom for lambda: lambda(theta=0,zeta=0)=0. +class FixLambdaGauge(FixParameters): + """Fixes gauge freedom for lambda, which sets the flux surface avg of lambda to 0. Note: this constraint is automatically applied when needed, and does not need to be included by the user. @@ -793,88 +793,36 @@ class FixLambdaGauge(_Objective): """ - _scalar = False - _linear = True - _fixed = False # not "diagonal", since it is fixing a sum _units = "(rad)" _print_value_fmt = "lambda gauge error: " def __init__( self, eq, + target=0, + bounds=None, + weight=1, normalize=True, normalize_target=True, name="lambda gauge", ): + if eq.sym: + indices = False + else: + indices = np.where( + np.logical_and(eq.L_basis.modes[:, 1] == 0, eq.L_basis.modes[:, 2] == 0) + )[0] super().__init__( - things=eq, - target=0, - bounds=None, - weight=1, + thing=eq, + params={"L_lmn": indices}, + target=target, + bounds=bounds, + weight=weight, normalize=normalize, normalize_target=normalize_target, name=name, ) - def build(self, use_jit=False, verbose=1): - """Build constant arrays. - - Parameters - ---------- - use_jit : bool, optional - Whether to just-in-time compile the objective and derivatives. - verbose : int, optional - Level of output. - - """ - eq = self.things[0] - L_basis = eq.L_basis - - if L_basis.sym: - self._A = np.zeros((0, L_basis.num_modes)) - else: - # l(rho,0,0) = 0 - # at theta=zeta=0, basis for lambda reduces to just a polynomial in rho - # what this constraint does is make all the coefficients of each power - # of rho equal to zero - # i.e. if lambda = (L_200 + 2*L_310) rho**2 + (L_100 + 2*L_210)*rho - # this constraint will make - # L_200 + 2*L_310 = 0 - # L_100 + 2*L_210 = 0 - L_modes = L_basis.modes - mnpos = np.where((L_modes[:, 1:] >= [0, 0]).all(axis=1))[0] - l_lmn = L_modes[mnpos, :] - if len(l_lmn) > 0: - c = zernike_radial_coeffs(l_lmn[:, 0], l_lmn[:, 1]) - else: - c = np.zeros((0, 0)) - - A = np.zeros((c.shape[1], L_basis.num_modes)) - A[:, mnpos] = c.T - self._A = A - - self._dim_f = self._A.shape[0] - super().build(use_jit=use_jit, verbose=verbose) - - def compute(self, params, constants=None): - """Compute lambda gauge freedom errors. - - Parameters - ---------- - params : dict - Dictionary of equilibrium degrees of freedom, eg Equilibrium.params_dict - constants : dict - Dictionary of constant data, eg transforms, profiles etc. Defaults to - self.constants - - Returns - ------- - f : ndarray - gauge freedom errors. - - """ - return jnp.dot(self._A, params["L_lmn"]) - class FixThetaSFL(FixParameters): """Fixes lambda=0 so that poloidal angle is the SFL poloidal angle. diff --git a/tests/test_linear_objectives.py b/tests/test_linear_objectives.py index d0c17f8e39..83f9a32936 100644 --- a/tests/test_linear_objectives.py +++ b/tests/test_linear_objectives.py @@ -2,14 +2,12 @@ import numpy as np import pytest -import scipy.linalg from qsc import Qsc import desc.examples from desc.backend import jnp from desc.equilibrium import Equilibrium from desc.geometry import FourierRZToroidalSurface -from desc.grid import LinearGrid from desc.io import load from desc.magnetic_fields import OmnigenousField from desc.objectives import ( @@ -69,10 +67,10 @@ def test_LambdaGauge_sym(DummyStellarator): eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") with pytest.warns(UserWarning, match="Reducing radial"): eq.change_resolution(L=2, M=1, N=1) - correct_constraint_matrix = np.zeros((0, 5)) lam_con = FixLambdaGauge(eq) lam_con.build() - np.testing.assert_array_equal(lam_con._A, correct_constraint_matrix) + # should have no indices to fix + assert lam_con._params["L_lmn"].size == 0 @pytest.mark.unit @@ -105,13 +103,10 @@ def test_LambdaGauge_asym(): lam_con = FixLambdaGauge(eq) lam_con.build() - # make sure that any lambda in the null space gives lambda==0 at theta=zeta=0 - Z = scipy.linalg.null_space(lam_con._A) - grid = LinearGrid(L=10, theta=[0], zeta=[0]) - for z in Z.T: - eq.L_lmn = z - lam = eq.compute("lambda", grid=grid)["lambda"] - np.testing.assert_allclose(lam, 0, atol=1e-15) + indices = np.where( + np.logical_and(eq.L_basis.modes[:, 1] == 0, eq.L_basis.modes[:, 2] == 0) + )[0] + np.testing.assert_allclose(indices, lam_con._params["L_lmn"]) @pytest.mark.regression From 76fd15e658a76b11e91978811a763d7ac51c2475 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Thu, 14 Nov 2024 19:27:36 -0500 Subject: [PATCH 2/9] add lambda to asym wout from vmec test --- tests/test_vmec.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_vmec.py b/tests/test_vmec.py index 0fef594b3c..c27bdf8c2d 100644 --- a/tests/test_vmec.py +++ b/tests/test_vmec.py @@ -1169,12 +1169,15 @@ def test( # R & Z & lambda test("rmn", "R", use_nyq=False) test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=4e-2) + test( + "lmn", "lambda", use_nyq=False, negate_DESC_quant=True, atol_vmec_desc_wout=4e-2 + ) # |B| test("bmn", "|B|", rtol_desc_desc_wout=7e-4) # B^zeta - test("bsupvmn", "B^zeta") # ,rtol_desc_desc_wout=6e-5) + test("bsupvmn", "B^zeta") # B_zeta test("bsubvmn", "B_zeta", rtol_desc_desc_wout=3e-4) From abb130895372bddc64c4c98a444f5e281174665d Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Thu, 14 Nov 2024 19:28:39 -0500 Subject: [PATCH 3/9] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 931e5621d4..6743861fbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ New Features Bug Fixes - Fixes bug that occurs when taking the gradient of ``root`` and ``root_scalar`` with newer versions of JAX (>=0.4.34) and unpins the JAX version - +- Changes ``FixLambdaGauge`` constraint to now enforce zero flux surface average for lambda, instead of enforcing lambda(rho,0,0)=0 as it was incorrectly doing before. v0.12.3 ------- From ba90e1c985f206537b41067a7ff796ee0b11e851 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Thu, 14 Nov 2024 19:29:44 -0500 Subject: [PATCH 4/9] remove unneeded args --- desc/objectives/linear_objectives.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/desc/objectives/linear_objectives.py b/desc/objectives/linear_objectives.py index 6c4c630898..3e6275d0c9 100644 --- a/desc/objectives/linear_objectives.py +++ b/desc/objectives/linear_objectives.py @@ -799,9 +799,6 @@ class FixLambdaGauge(FixParameters): def __init__( self, eq, - target=0, - bounds=None, - weight=1, normalize=True, normalize_target=True, name="lambda gauge", @@ -815,9 +812,7 @@ def __init__( super().__init__( thing=eq, params={"L_lmn": indices}, - target=target, - bounds=bounds, - weight=weight, + target=0, normalize=normalize, normalize_target=normalize_target, name=name, From 747afd554c2816589f589e3865bd2d4f686eae8f Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Fri, 15 Nov 2024 00:16:48 -0500 Subject: [PATCH 5/9] update .h5 file for asym test --- tests/inputs/HELIO_asym.h5 | Bin 125805 -> 112841 bytes tests/test_vmec.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/inputs/HELIO_asym.h5 b/tests/inputs/HELIO_asym.h5 index c66a6cb1008f62267c190bc0c8e50241702752fb..0d11aa9c14243cf6f89ff32b5ce8e6e80cc30a72 100644 GIT binary patch literal 112841 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 U@5f^=iU+x}zyIzT(ls9c15{je?EnA( literal 125805 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 MI3|X`hUW4A0IZ+b=>Px# diff --git a/tests/test_vmec.py b/tests/test_vmec.py index c27bdf8c2d..6a80604b0c 100644 --- a/tests/test_vmec.py +++ b/tests/test_vmec.py @@ -1166,12 +1166,12 @@ def test( rtol=rtol_vmec_desc_wout, ) - # R & Z & lambda + # R & Z test("rmn", "R", use_nyq=False) test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=4e-2) - test( - "lmn", "lambda", use_nyq=False, negate_DESC_quant=True, atol_vmec_desc_wout=4e-2 - ) + + # don't test lambda because VMEC and DESC find different solutions + # for the SFL poloidal angle, so the lambda are different. # |B| test("bmn", "|B|", rtol_desc_desc_wout=7e-4) From 837571a47cf2fc539ae37cba2d80d809dc177123 Mon Sep 17 00:00:00 2001 From: dpanici Date: Fri, 15 Nov 2024 21:30:33 -0500 Subject: [PATCH 6/9] update eq and test --- tests/inputs/HELIO_asym.h5 | Bin 125805 -> 119424 bytes tests/test_vmec.py | 65 ++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/tests/inputs/HELIO_asym.h5 b/tests/inputs/HELIO_asym.h5 index c66a6cb1008f62267c190bc0c8e50241702752fb..3d57653cb641337dd0baf0c43abb2eec77b5cdca 100644 GIT binary patch delta 14246 zcmeHuXIPU<*DeVly-HJhN05&6Dx!c&l_JtXq)G1rp{R5LBLt<3(tGF

S>p(u+zH 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 sta2t^?~J&Q`HX-M literal 125805 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 MI3|X`hUW4A0IZ+b=>Px# diff --git a/tests/test_vmec.py b/tests/test_vmec.py index c27bdf8c2d..12cb0a0904 100644 --- a/tests/test_vmec.py +++ b/tests/test_vmec.py @@ -1022,7 +1022,7 @@ def test_vmec_save_asym(VMEC_save_asym): vmec.variables["jcurv"][20:100], desc.variables["jcurv"][20:100], rtol=2 ) np.testing.assert_allclose( - vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=3e-2 + vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=6e-2 ) np.testing.assert_allclose( vmec.variables["DCurr"][20:100], @@ -1074,13 +1074,22 @@ def test_vmec_save_asym(VMEC_save_asym): # Next, calculate some quantities and compare # the DESC wout -> DESC (should be very close) # and the DESC wout -> VMEC wout (should be approximately close) + surfs = desc.variables["ns"][:] + s_full = np.linspace(0, 1, surfs) + s_half = s_full[0:-1] + 0.5 / (surfs - 1) + r_full = np.sqrt(s_full) + r_half = np.sqrt(s_half) + vol_grid = LinearGrid( - rho=np.sqrt( - abs( - vmec.variables["phi"][:].filled() - / np.max(np.abs(vmec.variables["phi"][:].filled())) - ) - )[10::10], + rho=r_full[10::10], + M=15, + N=15, + NFP=eq.NFP, + axis=False, + sym=False, + ) + vol_half_grid = LinearGrid( + rho=r_half[10::10], M=15, N=15, NFP=eq.NFP, @@ -1100,12 +1109,13 @@ def test( atol_vmec_desc_wout=1e-5, rtol_vmec_desc_wout=1e-2, grid=vol_grid, + is_half_grid=False, ): """Helper fxn to evaluate Fourier series from wout and compare to DESC.""" xm = desc.variables["xm_nyq"][:] if use_nyq else desc.variables["xm"][:] xn = desc.variables["xn_nyq"][:] if use_nyq else desc.variables["xn"][:] - si = abs(vmec.variables["phi"][:] / np.max(np.abs(vmec.variables["phi"][:]))) + si = np.insert(s_half, 0, 0) if is_half_grid else s_full rho = grid.nodes[:, 0] s = rho**2 # some quantities must be negated before comparison bc @@ -1168,11 +1178,16 @@ def test( # R & Z & lambda test("rmn", "R", use_nyq=False) - test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=4e-2) + test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=1e-2) test( - "lmn", "lambda", use_nyq=False, negate_DESC_quant=True, atol_vmec_desc_wout=4e-2 + "lmn", + "lambda", + use_nyq=False, + atol_vmec_desc_wout=1e-2, + negate_DESC_quant=True, + grid=vol_half_grid, + is_half_grid=True, ) - # |B| test("bmn", "|B|", rtol_desc_desc_wout=7e-4) @@ -1180,7 +1195,7 @@ def test( test("bsupvmn", "B^zeta") # B_zeta - test("bsubvmn", "B_zeta", rtol_desc_desc_wout=3e-4) + test("bsubvmn", "B_zeta", grid=vol_half_grid, is_half_grid=True) # hard to compare to VMEC for the currents, since # VMEC F error is worse and equilibria are not exactly similar @@ -1188,30 +1203,22 @@ def test( test("currumn", "J^theta", atol_vmec_desc_wout=1e4) test("currvmn", "J^zeta", negate_DESC_quant=True, atol_vmec_desc_wout=1e5) - # can only compare lambda, sqrt(g) B_psi B^theta and B_theta at bdry - test( - "lmn", - "lambda", - use_nyq=False, - negate_DESC_quant=True, - grid=bdry_grid, - atol_desc_desc_wout=4e-4, - atol_vmec_desc_wout=5e-2, - ) test( "gmn", "sqrt(g)", convert_sqrt_g_or_B_rho=True, negate_DESC_quant=True, - grid=bdry_grid, - rtol_desc_desc_wout=5e-4, - rtol_vmec_desc_wout=4e-2, + grid=vol_half_grid, + is_half_grid=True, ) + + # Compare B_psi B^theta and B_theta at bdry only test( "bsupumn", "B^theta", negate_DESC_quant=True, grid=bdry_grid, + is_half_grid=True, atol_vmec_desc_wout=6e-4, ) test( @@ -1219,16 +1226,14 @@ def test( "B_theta", negate_DESC_quant=True, grid=bdry_grid, - atol_desc_desc_wout=1e-4, - atol_vmec_desc_wout=4e-4, + is_half_grid=True, ) test( "bsubsmn", "B_rho", - grid=bdry_grid, convert_sqrt_g_or_B_rho=True, - rtol_vmec_desc_wout=6e-2, - atol_vmec_desc_wout=9e-3, + grid=bdry_grid, + atol_vmec_desc_wout=2e-3, ) From c776cb1bb5a2a7b74681d2fe53c01d87efa5585a Mon Sep 17 00:00:00 2001 From: dpanici Date: Fri, 15 Nov 2024 21:33:10 -0500 Subject: [PATCH 7/9] Revert "update eq and test" This reverts commit 837571a47cf2fc539ae37cba2d80d809dc177123. --- tests/inputs/HELIO_asym.h5 | Bin 119424 -> 125805 bytes tests/test_vmec.py | 65 +++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/tests/inputs/HELIO_asym.h5 b/tests/inputs/HELIO_asym.h5 index 3d57653cb641337dd0baf0c43abb2eec77b5cdca..c66a6cb1008f62267c190bc0c8e50241702752fb 100644 GIT binary patch literal 125805 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 MI3|X`hUW4A0IZ+b=>Px# delta 14246 zcmeHuXIPU<*DeVly-HJhN05&6Dx!c&l_JtXq)G1rp{R5LBLt<3(tGF

S>p(u+zH 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 sta2t^?~J&Q`HX-M diff --git a/tests/test_vmec.py b/tests/test_vmec.py index 12cb0a0904..c27bdf8c2d 100644 --- a/tests/test_vmec.py +++ b/tests/test_vmec.py @@ -1022,7 +1022,7 @@ def test_vmec_save_asym(VMEC_save_asym): vmec.variables["jcurv"][20:100], desc.variables["jcurv"][20:100], rtol=2 ) np.testing.assert_allclose( - vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=6e-2 + vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=3e-2 ) np.testing.assert_allclose( vmec.variables["DCurr"][20:100], @@ -1074,22 +1074,13 @@ def test_vmec_save_asym(VMEC_save_asym): # Next, calculate some quantities and compare # the DESC wout -> DESC (should be very close) # and the DESC wout -> VMEC wout (should be approximately close) - surfs = desc.variables["ns"][:] - s_full = np.linspace(0, 1, surfs) - s_half = s_full[0:-1] + 0.5 / (surfs - 1) - r_full = np.sqrt(s_full) - r_half = np.sqrt(s_half) - vol_grid = LinearGrid( - rho=r_full[10::10], - M=15, - N=15, - NFP=eq.NFP, - axis=False, - sym=False, - ) - vol_half_grid = LinearGrid( - rho=r_half[10::10], + rho=np.sqrt( + abs( + vmec.variables["phi"][:].filled() + / np.max(np.abs(vmec.variables["phi"][:].filled())) + ) + )[10::10], M=15, N=15, NFP=eq.NFP, @@ -1109,13 +1100,12 @@ def test( atol_vmec_desc_wout=1e-5, rtol_vmec_desc_wout=1e-2, grid=vol_grid, - is_half_grid=False, ): """Helper fxn to evaluate Fourier series from wout and compare to DESC.""" xm = desc.variables["xm_nyq"][:] if use_nyq else desc.variables["xm"][:] xn = desc.variables["xn_nyq"][:] if use_nyq else desc.variables["xn"][:] - si = np.insert(s_half, 0, 0) if is_half_grid else s_full + si = abs(vmec.variables["phi"][:] / np.max(np.abs(vmec.variables["phi"][:]))) rho = grid.nodes[:, 0] s = rho**2 # some quantities must be negated before comparison bc @@ -1178,16 +1168,11 @@ def test( # R & Z & lambda test("rmn", "R", use_nyq=False) - test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=1e-2) + test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=4e-2) test( - "lmn", - "lambda", - use_nyq=False, - atol_vmec_desc_wout=1e-2, - negate_DESC_quant=True, - grid=vol_half_grid, - is_half_grid=True, + "lmn", "lambda", use_nyq=False, negate_DESC_quant=True, atol_vmec_desc_wout=4e-2 ) + # |B| test("bmn", "|B|", rtol_desc_desc_wout=7e-4) @@ -1195,7 +1180,7 @@ def test( test("bsupvmn", "B^zeta") # B_zeta - test("bsubvmn", "B_zeta", grid=vol_half_grid, is_half_grid=True) + test("bsubvmn", "B_zeta", rtol_desc_desc_wout=3e-4) # hard to compare to VMEC for the currents, since # VMEC F error is worse and equilibria are not exactly similar @@ -1203,22 +1188,30 @@ def test( test("currumn", "J^theta", atol_vmec_desc_wout=1e4) test("currvmn", "J^zeta", negate_DESC_quant=True, atol_vmec_desc_wout=1e5) + # can only compare lambda, sqrt(g) B_psi B^theta and B_theta at bdry + test( + "lmn", + "lambda", + use_nyq=False, + negate_DESC_quant=True, + grid=bdry_grid, + atol_desc_desc_wout=4e-4, + atol_vmec_desc_wout=5e-2, + ) test( "gmn", "sqrt(g)", convert_sqrt_g_or_B_rho=True, negate_DESC_quant=True, - grid=vol_half_grid, - is_half_grid=True, + grid=bdry_grid, + rtol_desc_desc_wout=5e-4, + rtol_vmec_desc_wout=4e-2, ) - - # Compare B_psi B^theta and B_theta at bdry only test( "bsupumn", "B^theta", negate_DESC_quant=True, grid=bdry_grid, - is_half_grid=True, atol_vmec_desc_wout=6e-4, ) test( @@ -1226,14 +1219,16 @@ def test( "B_theta", negate_DESC_quant=True, grid=bdry_grid, - is_half_grid=True, + atol_desc_desc_wout=1e-4, + atol_vmec_desc_wout=4e-4, ) test( "bsubsmn", "B_rho", - convert_sqrt_g_or_B_rho=True, grid=bdry_grid, - atol_vmec_desc_wout=2e-3, + convert_sqrt_g_or_B_rho=True, + rtol_vmec_desc_wout=6e-2, + atol_vmec_desc_wout=9e-3, ) From 8c9b6da9c400d71850a5b6958951df95d38ec81b Mon Sep 17 00:00:00 2001 From: dpanici Date: Fri, 15 Nov 2024 21:33:57 -0500 Subject: [PATCH 8/9] Reapply "update eq and test" This reverts commit c776cb1bb5a2a7b74681d2fe53c01d87efa5585a. --- tests/inputs/HELIO_asym.h5 | Bin 125805 -> 119424 bytes tests/test_vmec.py | 65 ++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/tests/inputs/HELIO_asym.h5 b/tests/inputs/HELIO_asym.h5 index c66a6cb1008f62267c190bc0c8e50241702752fb..3d57653cb641337dd0baf0c43abb2eec77b5cdca 100644 GIT binary patch delta 14246 zcmeHuXIPU<*DeVly-HJhN05&6Dx!c&l_JtXq)G1rp{R5LBLt<3(tGF

S>p(u+zH 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 sta2t^?~J&Q`HX-M literal 125805 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 MI3|X`hUW4A0IZ+b=>Px# diff --git a/tests/test_vmec.py b/tests/test_vmec.py index c27bdf8c2d..12cb0a0904 100644 --- a/tests/test_vmec.py +++ b/tests/test_vmec.py @@ -1022,7 +1022,7 @@ def test_vmec_save_asym(VMEC_save_asym): vmec.variables["jcurv"][20:100], desc.variables["jcurv"][20:100], rtol=2 ) np.testing.assert_allclose( - vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=3e-2 + vmec.variables["DShear"][20:100], desc.variables["DShear"][20:100], rtol=6e-2 ) np.testing.assert_allclose( vmec.variables["DCurr"][20:100], @@ -1074,13 +1074,22 @@ def test_vmec_save_asym(VMEC_save_asym): # Next, calculate some quantities and compare # the DESC wout -> DESC (should be very close) # and the DESC wout -> VMEC wout (should be approximately close) + surfs = desc.variables["ns"][:] + s_full = np.linspace(0, 1, surfs) + s_half = s_full[0:-1] + 0.5 / (surfs - 1) + r_full = np.sqrt(s_full) + r_half = np.sqrt(s_half) + vol_grid = LinearGrid( - rho=np.sqrt( - abs( - vmec.variables["phi"][:].filled() - / np.max(np.abs(vmec.variables["phi"][:].filled())) - ) - )[10::10], + rho=r_full[10::10], + M=15, + N=15, + NFP=eq.NFP, + axis=False, + sym=False, + ) + vol_half_grid = LinearGrid( + rho=r_half[10::10], M=15, N=15, NFP=eq.NFP, @@ -1100,12 +1109,13 @@ def test( atol_vmec_desc_wout=1e-5, rtol_vmec_desc_wout=1e-2, grid=vol_grid, + is_half_grid=False, ): """Helper fxn to evaluate Fourier series from wout and compare to DESC.""" xm = desc.variables["xm_nyq"][:] if use_nyq else desc.variables["xm"][:] xn = desc.variables["xn_nyq"][:] if use_nyq else desc.variables["xn"][:] - si = abs(vmec.variables["phi"][:] / np.max(np.abs(vmec.variables["phi"][:]))) + si = np.insert(s_half, 0, 0) if is_half_grid else s_full rho = grid.nodes[:, 0] s = rho**2 # some quantities must be negated before comparison bc @@ -1168,11 +1178,16 @@ def test( # R & Z & lambda test("rmn", "R", use_nyq=False) - test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=4e-2) + test("zmn", "Z", use_nyq=False, atol_vmec_desc_wout=1e-2) test( - "lmn", "lambda", use_nyq=False, negate_DESC_quant=True, atol_vmec_desc_wout=4e-2 + "lmn", + "lambda", + use_nyq=False, + atol_vmec_desc_wout=1e-2, + negate_DESC_quant=True, + grid=vol_half_grid, + is_half_grid=True, ) - # |B| test("bmn", "|B|", rtol_desc_desc_wout=7e-4) @@ -1180,7 +1195,7 @@ def test( test("bsupvmn", "B^zeta") # B_zeta - test("bsubvmn", "B_zeta", rtol_desc_desc_wout=3e-4) + test("bsubvmn", "B_zeta", grid=vol_half_grid, is_half_grid=True) # hard to compare to VMEC for the currents, since # VMEC F error is worse and equilibria are not exactly similar @@ -1188,30 +1203,22 @@ def test( test("currumn", "J^theta", atol_vmec_desc_wout=1e4) test("currvmn", "J^zeta", negate_DESC_quant=True, atol_vmec_desc_wout=1e5) - # can only compare lambda, sqrt(g) B_psi B^theta and B_theta at bdry - test( - "lmn", - "lambda", - use_nyq=False, - negate_DESC_quant=True, - grid=bdry_grid, - atol_desc_desc_wout=4e-4, - atol_vmec_desc_wout=5e-2, - ) test( "gmn", "sqrt(g)", convert_sqrt_g_or_B_rho=True, negate_DESC_quant=True, - grid=bdry_grid, - rtol_desc_desc_wout=5e-4, - rtol_vmec_desc_wout=4e-2, + grid=vol_half_grid, + is_half_grid=True, ) + + # Compare B_psi B^theta and B_theta at bdry only test( "bsupumn", "B^theta", negate_DESC_quant=True, grid=bdry_grid, + is_half_grid=True, atol_vmec_desc_wout=6e-4, ) test( @@ -1219,16 +1226,14 @@ def test( "B_theta", negate_DESC_quant=True, grid=bdry_grid, - atol_desc_desc_wout=1e-4, - atol_vmec_desc_wout=4e-4, + is_half_grid=True, ) test( "bsubsmn", "B_rho", - grid=bdry_grid, convert_sqrt_g_or_B_rho=True, - rtol_vmec_desc_wout=6e-2, - atol_vmec_desc_wout=9e-3, + grid=bdry_grid, + atol_vmec_desc_wout=2e-3, ) From f944281084429a9133fb12e1365ffb8eece195f6 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Sat, 16 Nov 2024 15:29:40 -0500 Subject: [PATCH 9/9] make scipy reuqirement uniform across requirements files --- devtools/dev-requirements_conda.yml | 2 +- requirements_conda.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/devtools/dev-requirements_conda.yml b/devtools/dev-requirements_conda.yml index 4287079693..45b1260c6a 100644 --- a/devtools/dev-requirements_conda.yml +++ b/devtools/dev-requirements_conda.yml @@ -9,7 +9,7 @@ dependencies: - netcdf4 >= 1.5.4, < 2.0 - numpy >= 1.20.0 - psutil - - scipy >= 1.7.0, < 2.0 + - scipy >= 1.7.0 - termcolor - pip - pip: diff --git a/requirements_conda.yml b/requirements_conda.yml index c43551466b..4c5af7f356 100644 --- a/requirements_conda.yml +++ b/requirements_conda.yml @@ -9,7 +9,7 @@ dependencies: - netcdf4 >= 1.5.4, < 2.0 - numpy >= 1.20.0 - psutil - - scipy >= 1.7.0, < 2.0 + - scipy >= 1.7.0 - termcolor - pip - pip: