diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index 70bc1fa6e5..8fca1346d2 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1431,7 +1431,6 @@ def _e_sub_rho(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose # image is the set { 𝐞ᵨ | ρ=0 }. data["e_rho"] = jnp.array([data["R_r"], data["R"] * data["omega_r"], data["Z_r"]]).T - return data diff --git a/desc/compute/_core.py b/desc/compute/_core.py index e0e8312b9b..7bc6e8acb3 100644 --- a/desc/compute/_core.py +++ b/desc/compute/_core.py @@ -22,12 +22,37 @@ "desc.geometry.core.Surface", "desc.geometry.core.Curve", ], + aliases=["rho_t", "rho_z", "theta_r", "theta_z", "zeta_r", "zeta_t"], ) def _0(params, transforms, profiles, data, **kwargs): data["0"] = jnp.zeros(transforms["grid"].num_nodes) return data +@register_compute_fun( + name="1", + label="1", + units="~", + units_long="None", + description="Ones", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="rtz", + data=[], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.core.Surface", + "desc.geometry.core.Curve", + ], + aliases=["rho_r", "theta_t", "zeta_z"], +) +def _1(params, transforms, profiles, data, **kwargs): + data["1"] = jnp.ones(transforms["grid"].num_nodes) + return data + + @register_compute_fun( name="R", label="R", @@ -2711,6 +2736,10 @@ def _phi(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="rtz", data=["omega_r"], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.core.Surface", + ], ) def _phi_r(params, transforms, profiles, data, **kwargs): data["phi_r"] = data["omega_r"] @@ -2785,6 +2814,10 @@ def _phi_rz(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="rtz", data=["omega_t"], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.core.Surface", + ], ) def _phi_t(params, transforms, profiles, data, **kwargs): data["phi_t"] = data["omega_t"] @@ -2841,6 +2874,10 @@ def _phi_tz(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="rtz", data=["omega_z"], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.core.Surface", + ], ) def _phi_z(params, transforms, profiles, data, **kwargs): data["phi_z"] = 1 + data["omega_z"] @@ -2890,75 +2927,6 @@ def _rho(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="rho_r", - label="\\partial_{\\rho} \\rho", - units="~", - units_long="None", - description="Radial coordinate, proportional to the square root " - + "of the toroidal flux, derivative wrt radial coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="r", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _rho_r(params, transforms, profiles, data, **kwargs): - data["rho_r"] = jnp.ones_like(data["0"]) - return data - - -@register_compute_fun( - name="rho_t", - label="\\partial_{\\theta} \\rho", - units="~", - units_long="None", - description="Radial coordinate, proportional to the square root " - "of the toroidal flux, derivative wrt poloidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="r", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _rho_t(params, transforms, profiles, data, **kwargs): - data["rho_t"] = data["0"] - return data - - -@register_compute_fun( - name="rho_z", - label="\\partial_{\\zeta} \\rho", - units="~", - units_long="None", - description="Radial coordinate, proportional to the square root " - "of the toroidal flux, derivative wrt toroidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="r", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _rho_z(params, transforms, profiles, data, **kwargs): - data["rho_z"] = data["0"] - return data - - @register_compute_fun( name="theta", label="\\theta", @@ -3113,75 +3081,6 @@ def _theta_PEST_zz(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="theta_r", - label="\\partial_{\\rho} \\theta", - units="rad", - units_long="radians", - description="Poloidal angular coordinate (geometric, not magnetic), " - "derivative wrt radial coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="t", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _theta_r(params, transforms, profiles, data, **kwargs): - data["theta_r"] = data["0"] - return data - - -@register_compute_fun( - name="theta_t", - label="\\partial_{\\theta} \\theta", - units="rad", - units_long="radians", - description="Poloidal angular coordinate (geometric, not magnetic), " - "derivative wrt poloidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="t", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _theta_t(params, transforms, profiles, data, **kwargs): - data["theta_t"] = jnp.ones_like(data["0"]) - return data - - -@register_compute_fun( - name="theta_z", - label="\\partial_{\\zeta} \\theta", - units="rad", - units_long="radians", - description="Poloidal angular coordinate (geometric, not magnetic), " - "derivative wrt toroidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="t", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _theta_z(params, transforms, profiles, data, **kwargs): - data["theta_z"] = data["0"] - return data - - @register_compute_fun( name="zeta", label="\\zeta", @@ -3202,69 +3101,3 @@ def _theta_z(params, transforms, profiles, data, **kwargs): def _zeta(params, transforms, profiles, data, **kwargs): data["zeta"] = transforms["grid"].nodes[:, 2] return data - - -@register_compute_fun( - name="zeta_r", - label="\\partial_{\\rho} \\zeta", - units="rad", - units_long="radians", - description="Toroidal angular coordinate derivative, wrt radial coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="z", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _zeta_r(params, transforms, profiles, data, **kwargs): - data["zeta_r"] = data["0"] - return data - - -@register_compute_fun( - name="zeta_t", - label="\\partial_{\\theta} \\zeta", - units="rad", - units_long="radians", - description="Toroidal angular coordinate, derivative wrt poloidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="z", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _zeta_t(params, transforms, profiles, data, **kwargs): - data["zeta_t"] = data["0"] - return data - - -@register_compute_fun( - name="zeta_z", - label="\\partial_{\\zeta} \\zeta", - units="rad", - units_long="radians", - description="Toroidal angular coordinate, derivative wrt toroidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="z", - data=["0"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.core.Surface", - ], -) -def _zeta_z(params, transforms, profiles, data, **kwargs): - data["zeta_z"] = jnp.ones_like(data["0"]) - return data diff --git a/desc/compute/_field.py b/desc/compute/_field.py index eef1354e3d..e53f033464 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -2935,7 +2935,7 @@ def _gradB2(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="|grad(|B|^2)|/2mu0", - label="|\\nabla |B|^{2}/(2\\mu_0)|", + label="|\\nabla |B|^{2}|/(2\\mu_0)", units="N \\cdot m^{-3}", units_long="Newton / cubic meter", description="Magnitude of magnetic pressure gradient", diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index ccb701f072..1cfbc2f23f 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -82,10 +82,10 @@ def _psi_r(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="r", - data=["rho"], + data=["1"], ) def _psi_rr(params, transforms, profiles, data, **kwargs): - data["psi_rr"] = params["Psi"] * jnp.ones_like(data["rho"]) / jnp.pi + data["psi_rr"] = data["1"] * params["Psi"] / jnp.pi return data diff --git a/desc/compute/_surface.py b/desc/compute/_surface.py index 5fb84fa060..d37f82337e 100644 --- a/desc/compute/_surface.py +++ b/desc/compute/_surface.py @@ -118,66 +118,6 @@ def _phi_Surface(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="phi_r", - label="\\partial_{\\rho} \\phi", - units="rad", - units_long="radians", - description="Toroidal angle in lab frame, derivative wrt radial coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho"], - parameterization="desc.geometry.core.Surface", -) -def _phi_r_Surface(params, transforms, profiles, data, **kwargs): - coords_r = data["e_rho"] - data["phi_r"] = coords_r[:, 1] - return data - - -@register_compute_fun( - name="phi_t", - label="\\partial_{\\theta} \\phi", - units="rad", - units_long="radians", - description="Toroidal angle in lab frame, derivative wrt poloidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta"], - parameterization="desc.geometry.core.Surface", -) -def _phi_t_Surface(params, transforms, profiles, data, **kwargs): - coords_t = data["e_theta"] - data["phi_t"] = coords_t[:, 1] - return data - - -@register_compute_fun( - name="phi_z", - label="\\partial_{\\zeta} \\phi", - units="rad", - units_long="radians", - description="Toroidal angle in lab frame, derivative wrt toroidal coordinate", - dim=1, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_zeta"], - parameterization="desc.geometry.core.Surface", -) -def _phi_z_Surface(params, transforms, profiles, data, **kwargs): - coords_z = data["e_zeta"] - data["phi_z"] = coords_z[:, 1] - return data - - @register_compute_fun( name="Z", label="Z", diff --git a/desc/compute/data_index.py b/desc/compute/data_index.py index de4ecf9314..26341ec587 100644 --- a/desc/compute/data_index.py +++ b/desc/compute/data_index.py @@ -132,6 +132,8 @@ def register_compute_fun( # noqa: C901 source_grid_requirement = {} if not isinstance(parameterization, (tuple, list)): parameterization = [parameterization] + if not isinstance(aliases, (tuple, list)): + aliases = [aliases] deps = { "params": params, diff --git a/tests/inputs/master_compute_data_rpz.pkl b/tests/inputs/master_compute_data_rpz.pkl index c787da5046..8a9086d237 100644 Binary files a/tests/inputs/master_compute_data_rpz.pkl and b/tests/inputs/master_compute_data_rpz.pkl differ diff --git a/tests/test_equilibrium.py b/tests/test_equilibrium.py index 834775ecae..52958a6a9b 100644 --- a/tests/test_equilibrium.py +++ b/tests/test_equilibrium.py @@ -15,6 +15,7 @@ from desc.io import InputReader from desc.objectives import ForceBalance, ObjectiveFunction, get_equilibrium_objective from desc.profiles import PowerSeriesProfile +from desc.utils import errorif from .utils import area_difference, compute_coords @@ -55,16 +56,27 @@ def test_map_coordinates(): iota = grid.compress(eq.compute("iota", grid=grid)["iota"]) iota = np.broadcast_to(iota, shape=(n,)) - out_1 = eq.map_coordinates(coords, inbasis=["rho", "alpha", "zeta"], iota=iota) + tol = 1e-5 + out_1 = eq.map_coordinates( + coords, inbasis=["rho", "alpha", "zeta"], iota=iota, tol=tol + ) assert np.isfinite(out_1).all() out_2 = eq.map_coordinates( coords, inbasis=["rho", "alpha", "zeta"], period=(np.inf, 2 * np.pi, np.inf), + tol=tol, ) assert np.isfinite(out_2).all() - diff = (out_1 - out_2) % (2 * np.pi) - assert np.all(np.isclose(diff, 0) | np.isclose(np.abs(diff), 2 * np.pi)) + diff = out_1 - out_2 + errorif( + not np.all( + np.isclose(diff, 0, atol=2 * tol) + | np.isclose(np.abs(diff), 2 * np.pi, atol=2 * tol) + ), + AssertionError, + f"diff: {diff}", + ) eq = get("DSHAPE")