From 30fa4e7a15855f3697fa6dd1714489bf1106a7e9 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 19 Aug 2024 18:47:07 -0400 Subject: [PATCH 1/8] fix some plot issues when NFP differs from one for objects, or when passed-in phi exceeds 2pi/nfp --- desc/plotting.py | 32 ++++++++++++++++-- .../test_plot_comparison_different_NFPs.png | Bin 0 -> 83694 bytes tests/test_plotting.py | 12 +++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/baseline/test_plot_comparison_different_NFPs.png diff --git a/desc/plotting.py b/desc/plotting.py index fdcb9a393c..9e1bbbdd3e 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -1607,9 +1607,15 @@ def plot_surfaces(eq, rho=8, theta=8, phi=None, ax=None, return_data=False, **kw phi = np.atleast_1d(phi) nphi = len(phi) + # do not need NFP supplied to these grids as + # the above logic takes care of the correct phi range + # if defaults are requested. Setting NFP here instead + # can create reshaping issues when phi is supplied and gets + # truncated by 2pi/NFP. See PR # + # TODO: put PR number grid_kwargs = { "rho": rho, - "NFP": nfp, + "NFP": 1, "theta": np.linspace(0, 2 * np.pi, NT, endpoint=True), "zeta": phi, } @@ -1628,7 +1634,7 @@ def plot_surfaces(eq, rho=8, theta=8, phi=None, ax=None, return_data=False, **kw ) grid_kwargs = { "rho": np.linspace(0, 1, NR), - "NFP": nfp, + "NFP": 1, "theta": theta, "zeta": phi, } @@ -2263,6 +2269,28 @@ def plot_comparison( ) """ + NFPs = np.array([thing.NFP for thing in eqs]) + Ns = np.array([thing.N for thing in eqs]) + if not np.allclose(NFPs, NFPs[0]) and np.any(Ns == 0): + # if all NFPs are not equal, maybe there are some axisymmetric + # objects. We can try to change those to match the NFP of the first + # of the nonaxisymmetric objects + eqs = [thing.copy() for thing in eqs] # make copy so we dont modify originals + NFP_nonax = int(NFPs[NFPs > 1][0]) + [ + thing.change_resolution(NFP=NFP_nonax if thing.N == 0 else thing.NFP) + for thing in eqs + ] + # if after above, the NFPs are still not all equal, means there are multiple + # nonaxisymmetric objects with differing NFPs, which it is not clear + # how to choose the phis for by default, so we will throw an error. + errorif( + not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP), + ValueError, + "supplied objects must have the same number of field periods, " + "or if there are differing field periods, the ones which differ must be" + " axisymmetric.", + ) phi = parse_argname_change(phi, kwargs, "zeta", "phi") color = parse_argname_change(color, kwargs, "colors", "color") ls = parse_argname_change(ls, kwargs, "linestyles", "ls") diff --git a/tests/baseline/test_plot_comparison_different_NFPs.png b/tests/baseline/test_plot_comparison_different_NFPs.png new file mode 100644 index 0000000000000000000000000000000000000000..96a140648f7c546c1ab44d9cc5ab56681290aa93 GIT binary patch literal 83694 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 literal 0 HcmV?d00001 diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 1351b46c93..04bd6c78e3 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -551,6 +551,18 @@ def test_plot_comparison_no_theta(self): fig, ax = plot_comparison(eqf, theta=0) return fig + @pytest.mark.unit + @pytest.mark.mpl_image_compare(remove_text=True, tolerance=tol_2d) + def test_plot_comparison_different_NFPs(self): + """Test plotting comparison of flux surfaces with differing NFPs.""" + eq = get("SOLOVEV") + eq_nonax = get("HELIOTRON") + eq_nonax2 = get("ESTELL") + with pytest.raises(ValueError, match="differing field periods"): + fig, ax = plot_comparison([eq_nonax, eq_nonax2], theta=0) + fig, ax = plot_comparison([eq, eq_nonax], theta=0) + return fig + class TestPlotGrid: """Tests for the plot_grid function.""" From 8df3025f802320bd4fb4b97659cca5f430359109 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 19 Aug 2024 18:48:09 -0400 Subject: [PATCH 2/8] finish comment --- desc/plotting.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/desc/plotting.py b/desc/plotting.py index 9e1bbbdd3e..5d47df9852 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -1611,8 +1611,7 @@ def plot_surfaces(eq, rho=8, theta=8, phi=None, ax=None, return_data=False, **kw # the above logic takes care of the correct phi range # if defaults are requested. Setting NFP here instead # can create reshaping issues when phi is supplied and gets - # truncated by 2pi/NFP. See PR # - # TODO: put PR number + # truncated by 2pi/NFP. See PR #1204 grid_kwargs = { "rho": rho, "NFP": 1, From 184df173eee8615d54717ab69db8949e0c601296 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 19 Aug 2024 19:12:11 -0400 Subject: [PATCH 3/8] add fix for plot_boundary and plot_section as well --- desc/plotting.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/desc/plotting.py b/desc/plotting.py index 5d47df9852..aa1bf2930f 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -1349,10 +1349,9 @@ def plot_section( phi = np.atleast_1d(phi) nphi = len(phi) if grid is None: - nfp = eq.NFP grid_kwargs = { "L": 25, - "NFP": nfp, + "NFP": 1, "axis": False, "theta": np.linspace(0, 2 * np.pi, 91, endpoint=True), "zeta": phi, @@ -1962,7 +1961,7 @@ def plot_boundary(eq, phi=None, plot_axis=True, ax=None, return_data=False, **kw plot_axis = plot_axis and eq.L > 0 rho = np.array([0.0, 1.0]) if plot_axis else np.array([1.0]) - grid_kwargs = {"NFP": eq.NFP, "rho": rho, "theta": 100, "zeta": phi} + grid_kwargs = {"NFP": 1, "rho": rho, "theta": 100, "zeta": phi} grid = _get_grid(**grid_kwargs) nr, nt, nz = grid.num_rho, grid.num_theta, grid.num_zeta grid = Grid( From 99d0e5e83d1075f1406fc16d2ed26153f17d0a94 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 19 Aug 2024 19:21:20 -0400 Subject: [PATCH 4/8] add fix to plot_boundaries --- desc/plotting.py | 31 ++++++++++++++++++++++++++++++- tests/test_plotting.py | 3 +++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/desc/plotting.py b/desc/plotting.py index aa1bf2930f..9e3d021633 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -2031,6 +2031,13 @@ def plot_boundaries( ): """Plot stellarator boundaries at multiple toroidal coordinates. + NOTE: supplied objects must have either all the same NFP, or if + there are differing NFPs, the non-axisymmetric objects must have the + same NFP and the rest of the objects must be axisymmetric. i.e + can plot a tokamak and an NFP=2 stellarator, but cannot plot + a NFP=2 and NFP=3 stellarator as there is some ambiguity on the + choice of phi + Parameters ---------- eqs : array-like of Equilibrium, Surface or EquilibriaFamily @@ -2086,6 +2093,28 @@ def plot_boundaries( fig, ax = plot_boundaries((eq1, eq2, eq3)) """ + NFPs = np.array([thing.NFP for thing in eqs]) + Ns = np.array([thing.N for thing in eqs]) + if not np.allclose(NFPs, NFPs[0]) and np.any(Ns == 0): + # if all NFPs are not equal, maybe there are some axisymmetric + # objects. We can try to change those to match the NFP of the first + # of the nonaxisymmetric objects + eqs = [thing.copy() for thing in eqs] # make copy so we dont modify originals + NFP_nonax = int(NFPs[NFPs > 1][0]) + [ + thing.change_resolution(NFP=NFP_nonax if thing.N == 0 else thing.NFP) + for thing in eqs + ] + # if after above, the NFPs are still not all equal, means there are multiple + # nonaxisymmetric objects with differing NFPs, which it is not clear + # how to choose the phis for by default, so we will throw an error. + errorif( + not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP), + ValueError, + "supplied objects must have the same number of field periods, " + "or if there are differing field periods, the ones which differ must be" + " axisymmetric.", + ) phi = parse_argname_change(phi, kwargs, "zeta", "phi") figsize = kwargs.pop("figsize", None) @@ -2130,7 +2159,7 @@ def plot_boundaries( plot_axis_i = plot_axis and eqs[i].L > 0 rho = np.array([0.0, 1.0]) if plot_axis_i else np.array([1.0]) - grid_kwargs = {"NFP": eqs[i].NFP, "theta": 100, "zeta": phi, "rho": rho} + grid_kwargs = {"NFP": 1, "theta": 100, "zeta": phi, "rho": rho} grid = _get_grid(**grid_kwargs) nr, nt, nz = grid.num_rho, grid.num_theta, grid.num_zeta grid = Grid( diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 04bd6c78e3..92d6223247 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -514,6 +514,9 @@ def test_plot_boundaries(self): eq1 = get("SOLOVEV") eq2 = get("DSHAPE") eq3 = get("W7-X") + eq4 = get("ESTELL") + with pytest.raises(ValueError, match="differing field periods"): + fig, ax = plot_boundaries([eq3, eq4], theta=0) fig, ax, data = plot_boundaries((eq1, eq2, eq3), return_data=True) assert "R" in data.keys() assert "Z" in data.keys() From 416444baea1cd8c4be94e9dd8d306dd5b1ca1607 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 19 Aug 2024 19:26:55 -0400 Subject: [PATCH 5/8] add missing note to docstring --- desc/plotting.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/desc/plotting.py b/desc/plotting.py index 9e3d021633..6b0c93ec83 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -2228,6 +2228,13 @@ def plot_comparison( ): """Plot comparison between flux surfaces of multiple equilibria. + NOTE: supplied objects must have either all the same NFP, or if + there are differing NFPs, the non-axisymmetric objects must have the + same NFP and the rest of the objects must be axisymmetric. i.e + can plot a tokamak and an NFP=2 stellarator, but cannot plot + a NFP=2 and NFP=3 stellarator as there is some ambiguity on the + choice of phi + Parameters ---------- eqs : array-like of Equilibrium or EquilibriaFamily From 7b6b5a35bf40e41ff37600920c886a47e95b79bd Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Thu, 22 Aug 2024 12:04:55 -0400 Subject: [PATCH 6/8] simplify fix --- desc/plotting.py | 68 +++++++++++------------------------------- tests/test_plotting.py | 12 ++++++-- 2 files changed, 28 insertions(+), 52 deletions(-) diff --git a/desc/plotting.py b/desc/plotting.py index 6b0c93ec83..5dbbeead72 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -2031,12 +2031,8 @@ def plot_boundaries( ): """Plot stellarator boundaries at multiple toroidal coordinates. - NOTE: supplied objects must have either all the same NFP, or if - there are differing NFPs, the non-axisymmetric objects must have the - same NFP and the rest of the objects must be axisymmetric. i.e - can plot a tokamak and an NFP=2 stellarator, but cannot plot - a NFP=2 and NFP=3 stellarator as there is some ambiguity on the - choice of phi + NOTE: If attempting to plot objects with differing NFP, `phi` must + be given explicitly. Parameters ---------- @@ -2093,29 +2089,17 @@ def plot_boundaries( fig, ax = plot_boundaries((eq1, eq2, eq3)) """ - NFPs = np.array([thing.NFP for thing in eqs]) - Ns = np.array([thing.N for thing in eqs]) - if not np.allclose(NFPs, NFPs[0]) and np.any(Ns == 0): - # if all NFPs are not equal, maybe there are some axisymmetric - # objects. We can try to change those to match the NFP of the first - # of the nonaxisymmetric objects - eqs = [thing.copy() for thing in eqs] # make copy so we dont modify originals - NFP_nonax = int(NFPs[NFPs > 1][0]) - [ - thing.change_resolution(NFP=NFP_nonax if thing.N == 0 else thing.NFP) - for thing in eqs - ] - # if after above, the NFPs are still not all equal, means there are multiple - # nonaxisymmetric objects with differing NFPs, which it is not clear - # how to choose the phis for by default, so we will throw an error. + # if NFPs are not all equal, means there are + # objects with differing NFPs, which it is not clear + # how to choose the phis for by default, so we will throw an error + # unless phi was given. + phi = parse_argname_change(phi, kwargs, "zeta", "phi") errorif( - not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP), + not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP) and phi is None, ValueError, "supplied objects must have the same number of field periods, " - "or if there are differing field periods, the ones which differ must be" - " axisymmetric.", + "or if there are differing field periods, `phi` must be given explicitly.", ) - phi = parse_argname_change(phi, kwargs, "zeta", "phi") figsize = kwargs.pop("figsize", None) cmap = kwargs.pop("cmap", "rainbow") @@ -2228,12 +2212,8 @@ def plot_comparison( ): """Plot comparison between flux surfaces of multiple equilibria. - NOTE: supplied objects must have either all the same NFP, or if - there are differing NFPs, the non-axisymmetric objects must have the - same NFP and the rest of the objects must be axisymmetric. i.e - can plot a tokamak and an NFP=2 stellarator, but cannot plot - a NFP=2 and NFP=3 stellarator as there is some ambiguity on the - choice of phi + NOTE: If attempting to plot objects with differing NFP, `phi` must + be given explicitly. Parameters ---------- @@ -2303,29 +2283,17 @@ def plot_comparison( ) """ - NFPs = np.array([thing.NFP for thing in eqs]) - Ns = np.array([thing.N for thing in eqs]) - if not np.allclose(NFPs, NFPs[0]) and np.any(Ns == 0): - # if all NFPs are not equal, maybe there are some axisymmetric - # objects. We can try to change those to match the NFP of the first - # of the nonaxisymmetric objects - eqs = [thing.copy() for thing in eqs] # make copy so we dont modify originals - NFP_nonax = int(NFPs[NFPs > 1][0]) - [ - thing.change_resolution(NFP=NFP_nonax if thing.N == 0 else thing.NFP) - for thing in eqs - ] - # if after above, the NFPs are still not all equal, means there are multiple - # nonaxisymmetric objects with differing NFPs, which it is not clear - # how to choose the phis for by default, so we will throw an error. + # if NFPs are not all equal, means there are + # objects with differing NFPs, which it is not clear + # how to choose the phis for by default, so we will throw an error + # unless phi was given. + phi = parse_argname_change(phi, kwargs, "zeta", "phi") errorif( - not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP), + not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP) and phi is None, ValueError, "supplied objects must have the same number of field periods, " - "or if there are differing field periods, the ones which differ must be" - " axisymmetric.", + "or if there are differing field periods, `phi` must be given explicitly.", ) - phi = parse_argname_change(phi, kwargs, "zeta", "phi") color = parse_argname_change(color, kwargs, "colors", "color") ls = parse_argname_change(ls, kwargs, "linestyles", "ls") lw = parse_argname_change(lw, kwargs, "lws", "lw") diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 92d6223247..affb069171 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -517,7 +517,11 @@ def test_plot_boundaries(self): eq4 = get("ESTELL") with pytest.raises(ValueError, match="differing field periods"): fig, ax = plot_boundaries([eq3, eq4], theta=0) - fig, ax, data = plot_boundaries((eq1, eq2, eq3), return_data=True) + fig, ax, data = plot_boundaries( + (eq1, eq2, eq3), + phi=np.linspace(0, 2 * np.pi / eq3.NFP, 4, endpoint=False), + return_data=True, + ) assert "R" in data.keys() assert "Z" in data.keys() assert len(data["R"]) == 3 @@ -563,7 +567,11 @@ def test_plot_comparison_different_NFPs(self): eq_nonax2 = get("ESTELL") with pytest.raises(ValueError, match="differing field periods"): fig, ax = plot_comparison([eq_nonax, eq_nonax2], theta=0) - fig, ax = plot_comparison([eq, eq_nonax], theta=0) + fig, ax = plot_comparison( + [eq, eq_nonax], + phi=np.linspace(0, 2 * np.pi / eq_nonax.NFP, 6, endpoint=False), + theta=0, + ) return fig From 71eeefde4ef9f1ee01fcb79b02bb84ac5b4c6423 Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Mon, 26 Aug 2024 23:40:41 -0400 Subject: [PATCH 7/8] allow kwargs in from_input_file --- desc/geometry/curve.py | 6 +++++- desc/geometry/surface.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/desc/geometry/curve.py b/desc/geometry/curve.py index e2c583ea6f..2e141710fb 100644 --- a/desc/geometry/curve.py +++ b/desc/geometry/curve.py @@ -203,13 +203,16 @@ def Z_n(self, new): ) @classmethod - def from_input_file(cls, path): + def from_input_file(cls, path, **kwargs): """Create a axis curve from Fourier coefficients in a DESC or VMEC input file. Parameters ---------- path : Path-like or str Path to DESC or VMEC input file. + **kwargs : dict, optional + keyword arguments to pass to the constructor of the + FourierRZCurve being created. Returns ------- @@ -227,6 +230,7 @@ def from_input_file(cls, path): inputs["axis"][:, 0].astype(int), inputs["NFP"], inputs["sym"], + **kwargs, ) return curve diff --git a/desc/geometry/surface.py b/desc/geometry/surface.py index 79f1b871a9..2f74200aaa 100644 --- a/desc/geometry/surface.py +++ b/desc/geometry/surface.py @@ -298,13 +298,16 @@ def set_coeffs(self, m, n=0, R=None, Z=None): self.Z_lmn = put(self.Z_lmn, idxZ, ZZ) @classmethod - def from_input_file(cls, path): + def from_input_file(cls, path, **kwargs): """Create a surface from Fourier coefficients in a DESC or VMEC input file. Parameters ---------- path : Path-like or str Path to DESC or VMEC input file. + **kwargs : dict, optional + keyword arguments to pass to the constructor of the + FourierRZToroidalSurface being created. Returns ------- @@ -328,6 +331,7 @@ def from_input_file(cls, path): inputs["surface"][:, 1:3].astype(int), inputs["NFP"], inputs["sym"], + **kwargs, ) return surf From 0412130d401132a69294de18d7947c96a5cb557c Mon Sep 17 00:00:00 2001 From: Dario Panici Date: Tue, 27 Aug 2024 10:32:30 -0400 Subject: [PATCH 8/8] update error message --- desc/plotting.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/desc/plotting.py b/desc/plotting.py index 6d4dedac0e..55fac468f3 100644 --- a/desc/plotting.py +++ b/desc/plotting.py @@ -2101,7 +2101,11 @@ def plot_boundaries( not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP) and phi is None, ValueError, "supplied objects must have the same number of field periods, " - "or if there are differing field periods, `phi` must be given explicitly.", + "or if there are differing field periods, `phi` must be given explicitly." + f" Instead, supplied objects have NFPs {[t.NFP for t in eqs]}." + " If attempting to plot an axisymmetric object with non-axisymmetric objects," + " you must use the `change_resolution` method to make the axisymmetric " + "object have the same NFP as the non-axisymmetric objects.", ) figsize = kwargs.pop("figsize", None) @@ -2295,7 +2299,11 @@ def plot_comparison( not np.allclose([thing.NFP for thing in eqs], eqs[0].NFP) and phi is None, ValueError, "supplied objects must have the same number of field periods, " - "or if there are differing field periods, `phi` must be given explicitly.", + "or if there are differing field periods, `phi` must be given explicitly." + f" Instead, supplied objects have NFPs {[t.NFP for t in eqs]}." + " If attempting to plot an axisymmetric object with non-axisymmetric objects," + " you must use the `change_resolution` method to make the axisymmetric " + "object have the same NFP as the non-axisymmetric objects.", ) color = parse_argname_change(color, kwargs, "colors", "color") ls = parse_argname_change(ls, kwargs, "linestyles", "ls")