From 16eacddbf543d4e9534d03b08986238e314bc339 Mon Sep 17 00:00:00 2001 From: unalmis Date: Sat, 22 Jun 2024 22:55:41 -0500 Subject: [PATCH 1/4] Partial derivatives (of the same coordinate system) commute. Removing junk... --- desc/compute/_basis_vectors.py | 1274 +++----------------------------- desc/compute/_geometry.py | 2 +- 2 files changed, 123 insertions(+), 1153 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index e3cd6ae457..46be50e30e 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1811,59 +1811,43 @@ def _e_sub_rho_rrt(params, transforms, profiles, data, **kwargs): def _e_sub_rho_rrz(params, transforms, profiles, data, **kwargs): data["e_rho_rrz"] = jnp.array( [ - -2 * data["omega_rz"] * data["R_r"] * data["omega_r"] - - 2 - * (1 + data["omega_z"]) + -3 * data["R"] * data["omega_rrz"] * data["omega_r"] + - 3 + * data["omega_rz"] + * (2 * data["R_r"] * data["omega_r"] + data["R"] * data["omega_rr"]) + - 3 + * data["omega_z"] * (data["R_rr"] * data["omega_r"] + data["R_r"] * data["omega_rr"]) - - data["R_rz"] * data["omega_r"] ** 2 - - 2 * data["R_z"] * data["omega_r"] * data["omega_rr"] - - 2 * data["R_r"] * data["omega_r"] * data["omega_rz"] - - 2 + - (1 + data["omega_z"]) * data["R"] + * (data["omega_rrr"] - data["omega_r"] ** 3) + - 3 + * data["omega_r"] * ( - data["omega_rr"] * data["omega_rz"] - + data["omega_r"] * data["omega_rrz"] + data["R_rz"] * data["omega_r"] + + data["R_z"] * data["omega_rr"] + + data["R_rr"] ) - - data["R_r"] * (1 + data["omega_z"]) * data["omega_rr"] - - data["R"] + - 3 * data["R_r"] * data["omega_rr"] + + data["R_rrrz"], + 3 + * data["R_r"] + * (data["omega_rrz"] - (1 + data["omega_z"]) * data["omega_r"] ** 2) + + 3 * data["omega_rz"] * data["R_rr"] + + data["R"] * ( - data["omega_rz"] * data["omega_rr"] - + (1 + data["omega_z"]) * data["omega_rrr"] + data["omega_rrrz"] + - 3 + * data["omega_r"] + * ( + data["omega_rz"] * data["omega_r"] + + (1 + data["omega_z"]) * data["omega_rr"] + ) ) - + data["R_rrrz"] - - data["omega_r"] - * ( - 2 * data["omega_r"] * data["R_rz"] - + 2 * data["R_r"] * data["omega_rz"] - + (1 + data["omega_z"]) * data["R_rr"] - + data["R_z"] * data["omega_rr"] - - data["R"] - * ((1 + data["omega_z"]) * data["omega_r"] ** 2 - data["omega_rrz"]) - ), - 2 * data["omega_rr"] * data["R_rz"] - + 2 * data["omega_r"] * data["R_rrz"] - + 2 * data["R_rr"] * data["omega_rz"] - + 2 * data["R_r"] * data["omega_rrz"] - + data["omega_rz"] * data["R_rr"] + (1 + data["omega_z"]) * data["R_rrr"] - + data["R_rz"] * data["omega_rr"] - + data["R_z"] * data["omega_rrr"] - - data["R_r"] - * ((1 + data["omega_z"]) * data["omega_r"] ** 2 - data["omega_rrz"]) - - data["R"] - * ( - data["omega_rz"] * data["omega_r"] ** 2 - + 2 * (1 + data["omega_z"]) * data["omega_r"] * data["omega_rr"] - - data["omega_rrrz"] - ) - + data["omega_r"] - * ( - -2 * (1 + data["omega_z"]) * data["R_r"] * data["omega_r"] - - data["R_z"] * data["omega_r"] ** 2 - - 2 * data["R"] * data["omega_r"] * data["omega_rz"] - - data["R"] * (1 + data["omega_z"]) * data["omega_rr"] - + data["R_rrz"] - ), + + 3 * data["R_rrz"] * data["omega_r"] + + 3 * data["R_rz"] * data["omega_rr"] + + data["R_z"] * (data["omega_rrr"] - data["omega_r"] ** 3), data["Z_rrrz"], ] ).T @@ -2325,6 +2309,8 @@ def _e_sub_rho_rzz(params, transforms, profiles, data, **kwargs): basis="basis", ) def _e_sub_rho_t(params, transforms, profiles, data, **kwargs): + # At the magnetic axis, this function returns the multivalued map whose + # image is the set { ∂ᵨ 𝐞_θ | ρ=0 } data["e_rho_t"] = jnp.array( [ -data["R"] * data["omega_t"] * data["omega_r"] + data["R_rt"], @@ -2632,27 +2618,14 @@ def _e_sub_theta_pest(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["R", "R_r", "R_rt", "R_t", "Z_rt", "omega_r", "omega_rt", "omega_t", "phi"], + data=["e_rho_t"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.ZernikeRZToroidalSection", ], - basis="basis", ) def _e_sub_theta_r(params, transforms, profiles, data, **kwargs): - # At the magnetic axis, this function returns the multivalued map whose - # image is the set { ∂ᵨ 𝐞_θ | ρ=0 } - data["e_theta_r"] = jnp.array( - [ - -data["R"] * data["omega_t"] * data["omega_r"] + data["R_rt"], - data["omega_t"] * data["R_r"] - + data["R_t"] * data["omega_r"] - + data["R"] * data["omega_rt"], - data["Z_rt"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_r"] = rpz2xyz_vec(data["e_theta_r"], phi=data["phi"]) + data["e_theta_r"] = data["e_rho_t"] return data @@ -2670,45 +2643,14 @@ def _e_sub_theta_r(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rr", - "R_rrt", - "R_rt", - "R_t", - "Z_rrt", - "omega_r", - "omega_rr", - "omega_rrt", - "omega_rt", - "omega_t", - "phi", - ], + data=["e_rho_rt"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.ZernikeRZToroidalSection", ], - basis="basis", ) def _e_sub_theta_rr(params, transforms, profiles, data, **kwargs): - data["e_theta_rr"] = jnp.array( - [ - -data["R_t"] * data["omega_r"] ** 2 - - 2 * data["R"] * data["omega_r"] * data["omega_rt"] - - data["omega_t"] - * (2 * data["R_r"] * data["omega_r"] + data["R"] * data["omega_rr"]) - + data["R_rrt"], - 2 * data["omega_r"] * data["R_rt"] - + 2 * data["R_r"] * data["omega_rt"] - + data["omega_t"] * data["R_rr"] - + data["R_t"] * data["omega_rr"] - + data["R"] * (-data["omega_t"] * data["omega_r"] ** 2 + data["omega_rrt"]), - data["Z_rrt"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rr"] = rpz2xyz_vec(data["e_theta_rr"], phi=data["phi"]) + data["e_theta_rr"] = data["e_rho_rt"] return data @@ -2725,70 +2667,14 @@ def _e_sub_theta_rr(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_t", - "R_rr", - "R_rt", - "R_rrr", - "R_rrt", - "R_rrrt", - "Z_rrrt", - "omega_r", - "omega_t", - "omega_rr", - "omega_rt", - "omega_rrr", - "omega_rrt", - "omega_rrrt", - "phi", - ], + data=["e_rho_rrt"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.ZernikeRZToroidalSection", ], - basis="basis", ) def _e_sub_theta_rrr(params, transforms, profiles, data, **kwargs): - data["e_theta_rrr"] = jnp.array( - [ - -3 * data["omega_rrt"] * data["R"] * data["omega_r"] - - 3 - * data["omega_rt"] - * (2 * data["R_r"] * data["omega_r"] + data["R"] * data["omega_rr"]) - - data["omega_t"] - * ( - 3 * data["R_rr"] * data["omega_r"] - + 3 * data["R_r"] * data["omega_rr"] - + data["R"] * data["omega_rrr"] - - data["R"] * data["omega_r"] ** 3 - ) - - 3 - * data["omega_r"] - * (data["R_rt"] * data["omega_r"] + data["R_t"] * data["omega_rr"]) - + data["R_rrrt"], - 3 * data["omega_rrt"] * data["R_r"] - + 3 * data["omega_rt"] * data["R_rr"] - + data["R"] - * ( - data["omega_rrrt"] - - 3 - * data["omega_r"] - * ( - data["omega_rt"] * data["omega_r"] - + data["omega_t"] * data["omega_rr"] - ) - ) - + data["omega_t"] * (data["R_rrr"] - 3 * data["R_r"] * data["omega_r"] ** 2) - + 3 * data["R_rrt"] * data["omega_r"] - + 3 * data["R_rt"] * data["omega_rr"] - + data["R_t"] * (data["omega_rrr"] - data["omega_r"] ** 3), - data["Z_rrrt"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rrr"] = rpz2xyz_vec(data["e_theta_rrr"], phi=data["phi"]) + data["e_theta_rrr"] = data["e_rho_rrt"] return data @@ -2806,95 +2692,14 @@ def _e_sub_theta_rrr(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rr", - "R_rt", - "R_rrt", - "R_rtt", - "R_rrtt", - "R_t", - "R_tt", - "Z_rrtt", - "omega_r", - "omega_rr", - "omega_rt", - "omega_rrt", - "omega_rtt", - "omega_rrtt", - "omega_t", - "omega_tt", - "phi", - ], + data=["e_rho_rtt"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.ZernikeRZToroidalSection", ], - basis="basis", ) def _e_sub_theta_rrt(params, transforms, profiles, data, **kwargs): - data["e_theta_rrt"] = jnp.array( - [ - -2 * data["omega_t"] * data["omega_rt"] * data["R_r"] - - data["omega_t"] ** 2 * data["R_rr"] - - data["R_r"] * data["omega_tt"] * data["omega_r"] - - data["R"] - * ( - data["omega_rtt"] * data["omega_r"] - + data["omega_tt"] * data["omega_rr"] - ) - - 2 - * data["omega_rt"] - * (data["R_t"] * data["omega_r"] + data["R"] * data["omega_rt"]) - - 2 - * data["omega_t"] - * ( - data["R_rt"] * data["omega_r"] - + data["R_r"] * data["omega_rt"] - + data["R_t"] * data["omega_rr"] - + data["R"] * data["omega_rrt"] - ) - + data["R_rrtt"] - - data["omega_r"] - * ( - data["omega_tt"] * data["R_r"] - + data["R_tt"] * data["omega_r"] - + 2 * data["omega_t"] * data["R_rt"] - + 2 * data["R_t"] * data["omega_rt"] - + data["R"] - * (-data["omega_t"] ** 2 * data["omega_r"] + data["omega_rtt"]) - ), - data["omega_rtt"] * data["R_r"] - + data["omega_tt"] * data["R_rr"] - + data["R_rtt"] * data["omega_r"] - + data["R_tt"] * data["omega_rr"] - + 2 * data["omega_rt"] * data["R_rt"] - + 2 * data["omega_t"] * data["R_rrt"] - + 2 * data["R_rt"] * data["omega_rt"] - + 2 * data["R_t"] * data["omega_rrt"] - + data["R_r"] - * (-data["omega_t"] ** 2 * data["omega_r"] + data["omega_rtt"]) - + data["R"] - * ( - -2 * data["omega_t"] * data["omega_rt"] * data["omega_r"] - - data["omega_t"] ** 2 * data["omega_rr"] - + data["omega_rrtt"] - ) - + data["omega_r"] - * ( - -data["omega_t"] ** 2 * data["R_r"] - - data["R"] * data["omega_tt"] * data["omega_r"] - - 2 - * data["omega_t"] - * (data["R_t"] * data["omega_r"] + data["R"] * data["omega_rt"]) - + data["R_rtt"] - ), - data["Z_rrtt"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rrt"] = rpz2xyz_vec(data["e_theta_rrt"], phi=data["phi"]) + data["e_theta_rrt"] = data["e_rho_rtt"] return data @@ -2912,214 +2717,62 @@ def _e_sub_theta_rrt(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", + data=["e_rho_rtz"], +) +def _e_sub_theta_rrz(params, transforms, profiles, data, **kwargs): + data["e_theta_rrz"] = data["e_rho_rtz"] + return data + + +@register_compute_fun( + name="e_theta_rt", + label="\\partial_{\\rho \\theta} \\mathbf{e}_{\\theta}", + units="m", + units_long="meters", + description=( + "Covariant Poloidal basis vector, second derivative wrt radial and poloidal" + " coordinates" + ), + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="rtz", + data=["e_rho_tt"], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.surface.ZernikeRZToroidalSection", + ], +) +def _e_sub_theta_rt(params, transforms, profiles, data, **kwargs): + data["e_theta_rt"] = data["e_rho_tt"] + return data + + +@register_compute_fun( + name="e_theta_rtt", + label="\\partial_{\\rho \\theta \\theta} \\mathbf{e}_{\\theta}", + units="m", + units_long="meters", + description=( + "Covariant Poloidal basis vector, third derivative wrt radial coordinate" + " once and poloidal twice" + ), + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="rtz", data=[ "R", "R_r", - "R_rr", - "R_rt", - "R_rrt", - "R_rtz", - "R_rrtz", - "R_rz", - "R_rrz", "R_t", - "R_tz", - "R_z", - "Z_rrtz", - "omega_r", - "omega_rr", - "omega_rt", - "omega_rrt", - "omega_rtz", - "omega_rrtz", - "omega_rz", - "omega_rrz", - "omega_t", - "omega_tz", - "omega_z", - "phi", - ], - basis="basis", -) -def _e_sub_theta_rrz(params, transforms, profiles, data, **kwargs): - data["e_theta_rrz"] = jnp.array( - [ - -data["omega_rz"] * data["R_t"] * data["omega_r"] - - (1 + data["omega_z"]) - * (data["R_rt"] * data["omega_r"] + data["R_t"] * data["omega_rr"]) - - data["R_r"] * data["omega_tz"] * data["omega_r"] - - data["R"] - * ( - data["omega_rtz"] * data["omega_r"] - + data["omega_tz"] * data["omega_rr"] - ) - - data["omega_rt"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["omega_t"] - * ( - data["omega_rz"] * data["R_r"] - + (1 + data["omega_z"]) * data["R_rr"] - + data["R_rz"] * data["omega_r"] - + data["R_z"] * data["omega_rr"] - + data["R_r"] * data["omega_rz"] - + data["R"] * data["omega_rrz"] - ) - - data["R_r"] * (1 + data["omega_z"]) * data["omega_rt"] - - data["R"] - * ( - data["omega_rz"] * data["omega_rt"] - + (1 + data["omega_z"]) * data["omega_rrt"] - ) - + data["R_rrtz"] - - data["omega_r"] - * ( - data["omega_tz"] * data["R_r"] - + data["R_tz"] * data["omega_r"] - + data["omega_t"] * data["R_rz"] - + data["R_t"] * data["omega_rz"] - + data["R_rt"] - + data["omega_z"] * data["R_rt"] - + data["R_z"] * data["omega_rt"] - + data["R"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ) - ), - data["omega_rtz"] * data["R_r"] - + data["omega_tz"] * data["R_rr"] - + data["R_rtz"] * data["omega_r"] - + data["R_tz"] * data["omega_rr"] - + data["omega_rt"] * data["R_rz"] - + data["omega_t"] * data["R_rrz"] - + data["R_rt"] * data["omega_rz"] - + data["R_t"] * data["omega_rrz"] - + data["R_rrt"] - + data["omega_rz"] * data["R_rt"] - + data["omega_z"] * data["R_rrt"] - + data["R_rz"] * data["omega_rt"] - + data["R_z"] * data["omega_rrt"] - + data["R_r"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ) - + data["R"] - * ( - -data["omega_rz"] * data["omega_t"] * data["omega_r"] - - (1 + data["omega_z"]) - * ( - data["omega_rt"] * data["omega_r"] - + data["omega_t"] * data["omega_rr"] - ) - + data["omega_rrtz"] - ) - + data["omega_r"] - * ( - -(1 + data["omega_z"]) * data["R_t"] * data["omega_r"] - - data["R"] * data["omega_tz"] * data["omega_r"] - - data["omega_t"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["R"] * (1 + data["omega_z"]) * data["omega_rt"] - + data["R_rtz"] - ), - data["Z_rrtz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rrz"] = rpz2xyz_vec(data["e_theta_rrz"], phi=data["phi"]) - return data - - -@register_compute_fun( - name="e_theta_rt", - label="\\partial_{\\rho \\theta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, second derivative wrt radial and poloidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=[ - "R", - "R_r", - "R_rt", - "R_rtt", - "R_t", - "R_tt", - "Z_rtt", - "omega_r", - "omega_rt", - "omega_rtt", - "omega_t", - "omega_tt", - "phi", - ], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], - basis="basis", -) -def _e_sub_theta_rt(params, transforms, profiles, data, **kwargs): - data["e_theta_rt"] = jnp.array( - [ - -data["omega_t"] ** 2 * data["R_r"] - - data["R"] * data["omega_tt"] * data["omega_r"] - - 2 - * data["omega_t"] - * (data["R_t"] * data["omega_r"] + data["R"] * data["omega_rt"]) - + data["R_rtt"], - data["omega_tt"] * data["R_r"] - + data["R_tt"] * data["omega_r"] - + 2 * data["omega_t"] * data["R_rt"] - + 2 * data["R_t"] * data["omega_rt"] - + data["R"] * (-data["omega_t"] ** 2 * data["omega_r"] + data["omega_rtt"]), - data["Z_rtt"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rt"] = rpz2xyz_vec(data["e_theta_rt"], phi=data["phi"]) - return data - - -@register_compute_fun( - name="e_theta_rtt", - label="\\partial_{\\rho \\theta \\theta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, third derivative wrt radial coordinate" - " once and poloidal twice" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=[ - "R", - "R_r", - "R_t", - "R_rt", - "R_tt", - "R_rtt", - "R_ttt", - "R_rttt", - "Z_rttt", + "R_rt", + "R_tt", + "R_rtt", + "R_ttt", + "R_rttt", + "Z_rttt", "omega_r", "omega_t", "omega_rt", @@ -3301,57 +2954,10 @@ def _e_sub_theta_rtz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rt", - "R_rtz", - "R_rz", - "R_t", - "R_tz", - "R_z", - "Z_rtz", - "omega_r", - "omega_rt", - "omega_rtz", - "omega_rz", - "omega_t", - "omega_tz", - "omega_z", - "phi", - ], - basis="basis", + data=["e_rho_tz"], ) def _e_sub_theta_rz(params, transforms, profiles, data, **kwargs): - data["e_theta_rz"] = jnp.array( - [ - -(1 + data["omega_z"]) * data["R_t"] * data["omega_r"] - - data["R"] * data["omega_tz"] * data["omega_r"] - - data["omega_t"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["R"] * (1 + data["omega_z"]) * data["omega_rt"] - + data["R_rtz"], - data["omega_tz"] * data["R_r"] - + data["R_tz"] * data["omega_r"] - + data["omega_t"] * data["R_rz"] - + data["R_t"] * data["omega_rz"] - + data["R_rt"] - + data["omega_z"] * data["R_rt"] - + data["R_z"] * data["omega_rt"] - + data["R"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ), - data["Z_rtz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_rz"] = rpz2xyz_vec(data["e_theta_rz"], phi=data["phi"]) + data["e_theta_rz"] = data["e_rho_tz"] return data @@ -3728,21 +3334,10 @@ def _e_sub_zeta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["R", "R_r", "R_rz", "R_z", "Z_rz", "omega_r", "omega_rz", "omega_z", "phi"], - basis="basis", + data=["e_rho_z"], ) def _e_sub_zeta_r(params, transforms, profiles, data, **kwargs): - data["e_zeta_r"] = jnp.array( - [ - -data["R"] * (1 + data["omega_z"]) * data["omega_r"] + data["R_rz"], - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"], - data["Z_rz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_r"] = rpz2xyz_vec(data["e_zeta_r"], phi=data["phi"]) + data["e_zeta_r"] = data["e_rho_z"] return data @@ -3760,42 +3355,11 @@ def _e_sub_zeta_r(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rr", - "R_rrz", - "R_rz", - "R_z", - "Z_rrz", - "omega_r", - "omega_rr", - "omega_rrz", - "omega_rz", - "omega_z", - "phi", - ], + data=["e_rho_rz"], basis="basis", ) def _e_sub_zeta_rr(params, transforms, profiles, data, **kwargs): - data["e_zeta_rr"] = jnp.array( - [ - -2 * (1 + data["omega_z"]) * data["R_r"] * data["omega_r"] - - data["R_z"] * data["omega_r"] ** 2 - - 2 * data["R"] * data["omega_r"] * data["omega_rz"] - - data["R"] * data["omega_rr"] * (1 + data["omega_z"]) - + data["R_rrz"], - 2 * data["omega_r"] * data["R_rz"] - + 2 * data["R_r"] * data["omega_rz"] - + data["R_rr"] * (1 + data["omega_z"]) - + data["R_z"] * data["omega_rr"] - - data["R"] - * ((1 + data["omega_z"]) * data["omega_r"] ** 2 - data["omega_rrz"]), - data["Z_rrz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rr"] = rpz2xyz_vec(data["e_zeta_rr"], phi=data["phi"]) + data["e_zeta_rr"] = data["e_rho_rz"] return data @@ -3812,72 +3376,10 @@ def _e_sub_zeta_rr(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_z", - "R_rr", - "R_rz", - "R_rrr", - "R_rrz", - "R_rrrz", - "Z_rrrz", - "omega_r", - "omega_z", - "omega_rr", - "omega_rz", - "omega_rrr", - "omega_rrz", - "omega_rrrz", - "phi", - ], - basis="basis", + data=["e_rho_rrz"], ) def _e_sub_zeta_rrr(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrr"] = jnp.array( - [ - -3 * data["R"] * data["omega_rrz"] * data["omega_r"] - - 3 - * data["omega_rz"] - * (2 * data["R_r"] * data["omega_r"] + data["R"] * data["omega_rr"]) - - 3 - * data["omega_z"] - * (data["R_rr"] * data["omega_r"] + data["R_r"] * data["omega_rr"]) - - (1 + data["omega_z"]) - * data["R"] - * (data["omega_rrr"] - data["omega_r"] ** 3) - - 3 - * data["omega_r"] - * ( - data["R_rz"] * data["omega_r"] - + data["R_z"] * data["omega_rr"] - + data["R_rr"] - ) - - 3 * data["R_r"] * data["omega_rr"] - + data["R_rrrz"], - 3 - * data["R_r"] - * (data["omega_rrz"] - (1 + data["omega_z"]) * data["omega_r"] ** 2) - + 3 * data["omega_rz"] * data["R_rr"] - + data["R"] - * ( - data["omega_rrrz"] - - 3 - * data["omega_r"] - * ( - data["omega_rz"] * data["omega_r"] - + (1 + data["omega_z"]) * data["omega_rr"] - ) - ) - + (1 + data["omega_z"]) * data["R_rrr"] - + 3 * data["R_rrz"] * data["omega_r"] - + 3 * data["R_rz"] * data["omega_rr"] - + data["R_z"] * (data["omega_rrr"] - data["omega_r"] ** 3), - data["Z_rrrz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rrr"] = rpz2xyz_vec(data["e_zeta_rrr"], phi=data["phi"]) + data["e_zeta_rrr"] = data["e_rho_rrz"] return data @@ -3895,130 +3397,10 @@ def _e_sub_zeta_rrr(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rr", - "R_rt", - "R_rrt", - "R_rtz", - "R_rrtz", - "R_rz", - "R_rrz", - "R_t", - "R_tz", - "R_z", - "Z_rrtz", - "omega_r", - "omega_rr", - "omega_rt", - "omega_rrt", - "omega_rtz", - "omega_rrtz", - "omega_rz", - "omega_rrz", - "omega_t", - "omega_tz", - "omega_z", - "phi", - ], - basis="basis", + data=["e_rho_rtz"], ) def _e_sub_zeta_rrt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrt"] = jnp.array( - [ - -(data["omega_rz"] * data["R_t"] * data["omega_r"]) - - (1 + data["omega_z"]) - * (data["R_rt"] * data["omega_r"] + data["R_t"] * data["omega_rr"]) - - data["R_r"] * data["omega_tz"] * data["omega_r"] - - data["R"] - * ( - data["omega_rtz"] * data["omega_r"] - + data["omega_tz"] * data["omega_rr"] - ) - - data["omega_rt"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["omega_t"] - * ( - data["omega_rz"] * data["R_r"] - + (1 + data["omega_z"]) * data["R_rr"] - + data["R_rz"] * data["omega_r"] - + data["R_z"] * data["omega_rr"] - + data["R_r"] * data["omega_rz"] - + data["R"] * data["omega_rrz"] - ) - - data["R_r"] * (1 + data["omega_z"]) * data["omega_rt"] - - data["R"] - * ( - data["omega_rz"] * data["omega_rt"] - + (1 + data["omega_z"]) * data["omega_rrt"] - ) - + data["R_rrtz"] - - data["omega_r"] - * ( - data["omega_tz"] * data["R_r"] - + data["R_tz"] * data["omega_r"] - + data["omega_t"] * data["R_rz"] - + data["R_t"] * data["omega_rz"] - + data["R_rt"] - + data["omega_z"] * data["R_rt"] - + data["R_z"] * data["omega_rt"] - + data["R"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ) - ), - data["omega_rtz"] * data["R_r"] - + data["omega_tz"] * data["R_rr"] - + data["R_rtz"] * data["omega_r"] - + data["R_tz"] * data["omega_rr"] - + data["omega_rt"] * data["R_rz"] - + data["omega_t"] * data["R_rrz"] - + data["R_rt"] * data["omega_rz"] - + data["R_t"] * data["omega_rrz"] - + data["R_rrt"] - + data["omega_rz"] * data["R_rt"] - + data["omega_z"] * data["R_rrt"] - + data["R_rz"] * data["omega_rt"] - + data["R_z"] * data["omega_rrt"] - + data["R_r"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ) - + data["R"] - * ( - -data["omega_rz"] * data["omega_t"] * data["omega_r"] - - (1 + data["omega_z"]) - * ( - data["omega_rt"] * data["omega_r"] - + data["omega_t"] * data["omega_rr"] - ) - + data["omega_rrtz"] - ) - + data["omega_r"] - * ( - -(1 + data["omega_z"]) * data["R_t"] * data["omega_r"] - - data["R"] * data["omega_tz"] * data["omega_r"] - - data["omega_t"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["R"] * (1 + data["omega_z"]) * data["omega_rt"] - + data["R_rtz"] - ), - data["Z_rrtz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rrt"] = rpz2xyz_vec(data["e_zeta_rrt"], phi=data["phi"]) + data["e_zeta_rrt"] = data["e_rho_rtz"] return data @@ -4036,92 +3418,10 @@ def _e_sub_zeta_rrt(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rr", - "R_rz", - "R_rrz", - "R_rzz", - "R_rrzz", - "R_z", - "R_zz", - "Z_rrzz", - "omega_r", - "omega_rr", - "omega_rz", - "omega_rrz", - "omega_rzz", - "omega_rrzz", - "omega_z", - "omega_zz", - "phi", - ], - basis="basis", + data=["e_rho_rzz"], ) def _e_sub_zeta_rrz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrz"] = jnp.array( - [ - -2 * ((1 + data["omega_z"]) * data["omega_rz"]) * data["R_r"] - - ((1 + data["omega_z"]) ** 2) * data["R_rr"] - - 2 * data["R_rz"] * (1 + data["omega_z"]) * data["omega_r"] - - 2 - * data["R_z"] - * ( - data["omega_rz"] * data["omega_r"] - + (1 + data["omega_z"]) * data["omega_rr"] - ) - - data["R_r"] * data["omega_zz"] * data["omega_r"] - - data["R"] - * ( - data["omega_rzz"] - * data["omega_r"] - * data["omega_zz"] - * data["omega_rr"] - ) - - 2 * data["R_r"] * (1 + data["omega_z"]) * data["omega_rz"] - - 2 - * data["R"] - * (data["omega_rz"] ** 2 + (1 + data["omega_z"]) * data["omega_rrz"]) - + data["R_rrzz"] - - data["omega_r"] - * ( - data["omega_zz"] * data["R_r"] - + data["R_zz"] * data["omega_r"] - + 2 * (1 + data["omega_z"]) * data["R_rz"] - + 2 * data["R_z"] * data["omega_rz"] - - data["R"] - * ((1 + data["omega_z"]) ** 2 * data["omega_r"] - data["omega_rzz"]) - ), - data["omega_rzz"] * data["R_r"] - + data["omega_zz"] * data["R_rr"] - + data["R_rzz"] * data["omega_r"] - + data["R_zz"] * data["omega_rr"] - + 2 * data["omega_rz"] * data["R_rz"] - + 2 * (1 + data["omega_z"]) * data["R_rrz"] - + 2 * data["R_rz"] * data["omega_rz"] - + 2 * data["R_z"] * data["omega_rrz"] - - data["R_r"] - * ((1 + data["omega_z"]) ** 2 * data["omega_r"] - data["omega_rzz"]) - - data["R"] - * ( - 2 * (1 + data["omega_z"]) * data["omega_rz"] * data["omega_r"] - + (1 + data["omega_z"]) ** 2 * data["omega_rr"] - - data["omega_rrzz"] - ) - + data["omega_r"] - * ( - -((1 + data["omega_z"]) ** 2) * data["R_r"] - - 2 * data["R_z"] * (1 + data["omega_z"]) * data["omega_r"] - - data["R"] * data["omega_zz"] * data["omega_r"] - - 2 * data["R"] * (1 + data["omega_z"]) * data["omega_rz"] - + data["R_rzz"] - ), - data["Z_rrzz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rrz"] = rpz2xyz_vec(data["e_zeta_rrz"], phi=data["phi"]) + data["e_zeta_rrz"] = data["e_rho_rzz"] return data @@ -4139,57 +3439,11 @@ def _e_sub_zeta_rrz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rt", - "R_rtz", - "R_rz", - "R_t", - "R_tz", - "R_z", - "Z_rtz", - "omega_r", - "omega_rt", - "omega_rtz", - "omega_rz", - "omega_t", - "omega_tz", - "omega_z", - "phi", - ], + data=["e_rho_tz"], basis="basis", ) def _e_sub_zeta_rt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rt"] = jnp.array( - [ - -(1 + data["omega_z"]) * data["R_t"] * data["omega_r"] - - data["R"] * data["omega_tz"] * data["omega_r"] - - data["omega_t"] - * ( - (1 + data["omega_z"]) * data["R_r"] - + data["R_z"] * data["omega_r"] - + data["R"] * data["omega_rz"] - ) - - data["R"] * (1 + data["omega_z"]) * data["omega_rt"] - + data["R_rtz"], - data["omega_tz"] * data["R_r"] - + data["R_tz"] * data["omega_r"] - + data["omega_t"] * data["R_rz"] - + data["R_t"] * data["omega_rz"] - + data["R_rt"] - + data["omega_z"] * data["R_rt"] - + data["R_z"] * data["omega_rt"] - + data["R"] - * ( - -(1 + data["omega_z"]) * data["omega_t"] * data["omega_r"] - + data["omega_rtz"] - ), - data["Z_rtz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rt"] = rpz2xyz_vec(data["e_zeta_rt"], phi=data["phi"]) + data["e_zeta_rt"] = data["e_rho_tz"] return data @@ -4203,100 +3457,14 @@ def _e_sub_zeta_rt(params, transforms, profiles, data, **kwargs): " once and poloidal twice" ), dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=[ - "R", - "R_r", - "R_t", - "R_rt", - "R_tt", - "R_rtt", - "R_ttz", - "R_rttz", - "R_tz", - "R_rtz", - "R_z", - "R_rz", - "Z_rttz", - "omega_r", - "omega_t", - "omega_rt", - "omega_tt", - "omega_rtt", - "omega_ttz", - "omega_rttz", - "omega_tz", - "omega_rtz", - "omega_z", - "omega_rz", - "phi", - ], - basis="basis", + params=[], + transforms={}, + profiles=[], + coordinates="rtz", + data=["e_theta_rtz"], ) def _e_sub_zeta_rtt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rtt"] = jnp.array( - [ - -2 * data["omega_rz"] * data["R_t"] * data["omega_t"] - - 2 - * (1 + data["omega_z"]) - * (data["R_rt"] * data["omega_t"] + data["R_t"] * data["omega_rt"]) - - data["R_rz"] * data["omega_t"] ** 2 - - data["R_z"] * 2 * data["omega_t"] * data["omega_rt"] - - 2 * data["R_r"] * data["omega_t"] * data["omega_tz"] - - 2 - * data["R"] - * ( - data["omega_rt"] * data["omega_tz"] - + data["omega_t"] * data["omega_rtz"] - ) - - data["R_r"] * (1 + data["omega_z"]) * data["omega_tt"] - - data["R"] - * ( - data["omega_rz"] * data["omega_tt"] - + (1 + data["omega_z"]) * data["omega_rtt"] - ) - + data["R_rttz"] - - data["omega_r"] - * ( - 2 * data["omega_t"] * data["R_tz"] - + 2 * data["R_t"] * data["omega_tz"] - + (1 + data["omega_z"]) * data["R_tt"] - + data["R_z"] * data["omega_tt"] - - data["R"] - * ((1 + data["omega_z"]) * data["omega_t"] ** 2 - data["omega_ttz"]) - ), - 2 * data["omega_rt"] * data["R_tz"] - + 2 * data["omega_t"] * data["R_rtz"] - + 2 * data["R_rt"] * data["omega_tz"] - + 2 * data["R_t"] * data["omega_rtz"] - + data["omega_rz"] * data["R_tt"] - + (1 + data["omega_z"]) * data["R_rtt"] - + data["R_rz"] * data["omega_tt"] - + data["R_z"] * data["omega_rtt"] - - data["R_r"] - * ((1 + data["omega_z"]) * data["omega_t"] ** 2 - data["omega_ttz"]) - - data["R"] - * ( - data["omega_rz"] * data["omega_t"] ** 2 - + (1 + data["omega_z"]) * 2 * data["omega_t"] * data["omega_rt"] - - data["omega_rttz"] - ) - + data["omega_r"] - * ( - -2 * (1 + data["omega_z"]) * data["R_t"] * data["omega_t"] - - data["R_z"] * data["omega_t"] ** 2 - - 2 * data["R"] * data["omega_t"] * data["omega_tz"] - - data["R"] * (1 + data["omega_z"]) * data["omega_tt"] - + data["R_ttz"] - ), - data["Z_rttz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rtt"] = rpz2xyz_vec(data["e_zeta_rtt"], phi=data["phi"]) + data["e_zeta_rtt"] = data["e_theta_rtz"] return data @@ -4314,101 +3482,10 @@ def _e_sub_zeta_rtt(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_t", - "R_rt", - "R_tz", - "R_rtz", - "R_tzz", - "R_rtzz", - "R_z", - "R_rz", - "R_zz", - "R_rzz", - "Z_rtzz", - "omega_r", - "omega_t", - "omega_rt", - "omega_tz", - "omega_rtz", - "omega_tzz", - "omega_rtzz", - "omega_z", - "omega_rz", - "omega_zz", - "omega_rzz", - "phi", - ], - basis="basis", + data=["e_theta_rzz"], ) def _e_sub_zeta_rtz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rtz"] = jnp.array( - [ - -2 * (1 + data["omega_z"]) * data["omega_rz"] * data["R_t"] - - (1 + data["omega_z"]) ** 2 * data["R_rt"] - - 2 * data["R_rz"] * (1 + data["omega_z"]) * data["omega_t"] - - 2 - * data["R_z"] - * ( - data["omega_rz"] * data["omega_t"] - + (1 + data["omega_z"]) * data["omega_rt"] - ) - - data["R_r"] * data["omega_zz"] * data["omega_t"] - - data["R"] - * ( - data["omega_rzz"] - * data["omega_t"] - * data["omega_zz"] - * data["omega_rt"] - ) - - 2 * data["R_r"] * (1 + data["omega_z"]) * data["omega_tz"] - - 2 - * data["R"] - * ( - data["omega_rz"] * data["omega_tz"] - + (1 + data["omega_z"]) * data["omega_rtz"] - ) - + data["R_rtzz"] - - data["omega_r"] - * ( - data["omega_zz"] * data["R_t"] - + data["R_zz"] * data["omega_t"] - + 2 * (1 + data["omega_z"]) * data["R_tz"] - + 2 * data["R_z"] * data["omega_tz"] - - data["R"] - * ((1 + data["omega_z"]) ** 2 * data["omega_t"] - data["omega_tzz"]) - ), - data["omega_rzz"] * data["R_t"] - + data["omega_zz"] * data["R_rt"] - + data["R_rzz"] * data["omega_t"] - + data["R_zz"] * data["omega_rt"] - + 2 * data["omega_rz"] * data["R_tz"] - + 2 * (1 + data["omega_z"]) * data["R_rtz"] - + 2 * data["R_rz"] * data["omega_tz"] - + 2 * data["R_z"] * data["omega_rtz"] - - data["R_r"] - * ((1 + data["omega_z"]) ** 2 * data["omega_t"] - data["omega_tzz"]) - - data["R"] - * ( - 2 * (1 + data["omega_z"]) * data["omega_rz"] * data["omega_t"] - + (1 + data["omega_z"]) ** 2 * data["omega_rt"] - - data["omega_rtzz"] - ) - + data["omega_r"] - * ( - -((1 + data["omega_z"]) ** 2) * data["R_t"] - - 2 * data["R_z"] * (1 + data["omega_z"]) * data["omega_t"] - - data["R"] * data["omega_zz"] * data["omega_t"] - - 2 * data["R"] * (1 + data["omega_z"]) * data["omega_tz"] - + data["R_tzz"] - ), - data["Z_rtzz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rtz"] = rpz2xyz_vec(data["e_zeta_rtz"], phi=data["phi"]) + data["e_zeta_rtz"] = data["e_theta_rzz"] return data @@ -4426,42 +3503,10 @@ def _e_sub_zeta_rtz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_r", - "R_rz", - "R_rzz", - "R_z", - "R_zz", - "Z_rzz", - "omega_r", - "omega_rz", - "omega_rzz", - "omega_z", - "omega_zz", - "phi", - ], - basis="basis", + data=["e_rho_zz"], ) def _e_sub_zeta_rz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rz"] = jnp.array( - [ - -((1 + data["omega_z"]) ** 2) * data["R_r"] - - 2 * data["R_z"] * (1 + data["omega_z"]) * data["omega_r"] - - data["R"] * data["omega_zz"] * data["omega_r"] - - 2 * data["R"] * (1 + data["omega_z"]) * data["omega_rz"] - + data["R_rzz"], - data["omega_zz"] * data["R_r"] - + data["R_zz"] * data["omega_r"] - + 2 * (1 + data["omega_z"]) * data["R_rz"] - + 2 * data["R_z"] * data["omega_rz"] - - data["R"] - * ((1 + data["omega_z"]) ** 2 * data["omega_r"] - data["omega_rzz"]), - data["Z_rzz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_rz"] = rpz2xyz_vec(data["e_zeta_rz"], phi=data["phi"]) + data["e_zeta_rz"] = data["e_rho_zz"] return data @@ -4568,25 +3613,14 @@ def _e_sub_zeta_rzz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["R", "R_t", "R_tz", "R_z", "Z_tz", "omega_t", "omega_tz", "omega_z", "phi"], + data=["e_theta_z"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], - basis="basis", ) def _e_sub_zeta_t(params, transforms, profiles, data, **kwargs): - data["e_zeta_t"] = jnp.array( - [ - -data["R"] * (1 + data["omega_z"]) * data["omega_t"] + data["R_tz"], - (1 + data["omega_z"]) * data["R_t"] - + data["R_z"] * data["omega_t"] - + data["R"] * data["omega_tz"], - data["Z_tz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_t"] = rpz2xyz_vec(data["e_zeta_t"], phi=data["phi"]) + data["e_zeta_t"] = data["e_theta_z"] return data @@ -4604,46 +3638,14 @@ def _e_sub_zeta_t(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_t", - "R_tt", - "R_ttz", - "R_tz", - "R_z", - "Z_ttz", - "omega_t", - "omega_tt", - "omega_ttz", - "omega_tz", - "omega_z", - "phi", - ], + data=["e_theta_tz"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], - basis="basis", ) def _e_sub_zeta_tt(params, transforms, profiles, data, **kwargs): - data["e_zeta_tt"] = jnp.array( - [ - -2 * (1 + data["omega_z"]) * data["R_t"] * data["omega_t"] - - data["R_z"] * data["omega_t"] ** 2 - - 2 * data["R"] * data["omega_t"] * data["omega_tz"] - - data["R"] * (1 + data["omega_z"]) * data["omega_tt"] - + data["R_ttz"], - 2 * data["omega_t"] * data["R_tz"] - + 2 * data["R_t"] * data["omega_tz"] - + (1 + data["omega_z"]) * data["R_tt"] - + data["R_z"] * data["omega_tt"] - - data["R"] - * ((1 + data["omega_z"]) * data["omega_t"] ** 2 - data["omega_ttz"]), - data["Z_ttz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_tt"] = rpz2xyz_vec(data["e_zeta_tt"], phi=data["phi"]) + data["e_zeta_tt"] = data["e_theta_tz"] return data @@ -4661,46 +3663,14 @@ def _e_sub_zeta_tt(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=[ - "R", - "R_t", - "R_tz", - "R_tzz", - "R_z", - "R_zz", - "Z_tzz", - "omega_t", - "omega_tz", - "omega_tzz", - "omega_z", - "omega_zz", - "phi", - ], + data=["e_theta_zz"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], - basis="basis", ) def _e_sub_zeta_tz(params, transforms, profiles, data, **kwargs): - data["e_zeta_tz"] = jnp.array( - [ - -((1 + data["omega_z"]) ** 2) * data["R_t"] - - 2 * data["R_z"] * (1 + data["omega_z"]) * data["omega_t"] - - data["R"] * data["omega_zz"] * data["omega_t"] - - 2 * data["R"] * (1 + data["omega_z"]) * data["omega_tz"] - + data["R_tzz"], - data["omega_zz"] * data["R_t"] - + data["R_zz"] * data["omega_t"] - + 2 * (1 + data["omega_z"]) * data["R_tz"] - + 2 * data["R_z"] * data["omega_tz"] - - data["R"] - * ((1 + data["omega_z"]) ** 2 * data["omega_t"] - data["omega_tzz"]), - data["Z_tzz"], - ] - ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_zeta_tz"] = rpz2xyz_vec(data["e_zeta_tz"], phi=data["phi"]) + data["e_zeta_tz"] = data["e_theta_zz"] return data diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index 270c6f6612..d9d736aa95 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -164,7 +164,7 @@ def _V_rrr_of_r(params, transforms, profiles, data, **kwargs): def _A_of_z(params, transforms, profiles, data, **kwargs): data["A(z)"] = surface_integrals( transforms["grid"], - jnp.abs(data["|e_rho x e_theta|"]), + data["|e_rho x e_theta|"], surface_label="zeta", expand_out=True, ) From a90854de6d762c3c3905c1c9556084988af1e4bf Mon Sep 17 00:00:00 2001 From: unalmis Date: Sun, 23 Jun 2024 20:36:56 -0500 Subject: [PATCH 2/4] generalize auto-aliasing to basis vectors --- desc/compute/_basis_vectors.py | 441 ++------------------------- desc/compute/_surface.py | 154 +--------- desc/compute/data_index.py | 38 ++- tests/inputs/master_compute_data.pkl | Bin 6466979 -> 7343881 bytes tests/test_compute_funs.py | 3 +- 5 files changed, 60 insertions(+), 576 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index 46be50e30e..d260ddee31 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1728,6 +1728,7 @@ def _e_sub_rho_rrr(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.ZernikeRZToroidalSection", ], basis="basis", + aliases=["e_theta_rrr"], ) def _e_sub_rho_rrt(params, transforms, profiles, data, **kwargs): data["e_rho_rrt"] = jnp.array( @@ -1807,6 +1808,7 @@ def _e_sub_rho_rrt(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_zeta_rrr"], ) def _e_sub_rho_rrz(params, transforms, profiles, data, **kwargs): data["e_rho_rrz"] = jnp.array( @@ -1885,7 +1887,7 @@ def _e_sub_rho_rrz(params, transforms, profiles, data, **kwargs): "omega_t", "phi", ], - aliases=["x_rrt", "x_rtr", "x_trr"], + aliases=["x_rrt", "x_rtr", "x_trr", "e_theta_rr"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.ZernikeRZToroidalSection", @@ -1953,6 +1955,7 @@ def _e_sub_rho_rt(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.ZernikeRZToroidalSection", ], basis="basis", + aliases=["e_theta_rrt"], ) def _e_sub_rho_rtt(params, transforms, profiles, data, **kwargs): data["e_rho_rtt"] = jnp.array( @@ -2039,6 +2042,7 @@ def _e_sub_rho_rtt(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_theta_rrz", "e_zeta_rrt"], ) def _e_sub_rho_rtz(params, transforms, profiles, data, **kwargs): data["e_rho_rtz"] = jnp.array( @@ -2166,6 +2170,7 @@ def _e_sub_rho_rtz(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_zeta_rr"], ) def _e_sub_rho_rz(params, transforms, profiles, data, **kwargs): data["e_rho_rz"] = jnp.array( @@ -2225,6 +2230,7 @@ def _e_sub_rho_rz(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_zeta_rrz"], ) def _e_sub_rho_rzz(params, transforms, profiles, data, **kwargs): data["e_rho_rzz"] = jnp.array( @@ -2307,6 +2313,7 @@ def _e_sub_rho_rzz(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.ZernikeRZToroidalSection", ], basis="basis", + aliases=["e_theta_r"], ) def _e_sub_rho_t(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose @@ -2359,6 +2366,7 @@ def _e_sub_rho_t(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.ZernikeRZToroidalSection", ], basis="basis", + aliases=["e_theta_rt"], ) def _e_sub_rho_tt(params, transforms, profiles, data, **kwargs): data["e_rho_tt"] = jnp.array( @@ -2416,6 +2424,7 @@ def _e_sub_rho_tt(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_theta_rz", "e_zeta_rt"], ) def _e_sub_rho_tz(params, transforms, profiles, data, **kwargs): data["e_rho_tz"] = jnp.array( @@ -2462,6 +2471,7 @@ def _e_sub_rho_tz(params, transforms, profiles, data, **kwargs): coordinates="rtz", data=["R", "R_r", "R_rz", "R_z", "Z_rz", "omega_r", "omega_rz", "omega_z", "phi"], basis="basis", + aliases=["e_zeta_r"], ) def _e_sub_rho_z(params, transforms, profiles, data, **kwargs): data["e_rho_z"] = jnp.array( @@ -2508,6 +2518,7 @@ def _e_sub_rho_z(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_zeta_rz"], ) def _e_sub_rho_zz(params, transforms, profiles, data, **kwargs): data["e_rho_zz"] = jnp.array( @@ -2607,148 +2618,6 @@ def _e_sub_theta_pest(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="e_theta_r", - label="\\partial_{\\rho} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description="Covariant Poloidal basis vector, derivative wrt radial coordinate", - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_t"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], -) -def _e_sub_theta_r(params, transforms, profiles, data, **kwargs): - data["e_theta_r"] = data["e_rho_t"] - return data - - -@register_compute_fun( - name="e_theta_rr", - label="\\partial_{\\rho \\rho} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, second derivative wrt radial and radial" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rt"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], -) -def _e_sub_theta_rr(params, transforms, profiles, data, **kwargs): - data["e_theta_rr"] = data["e_rho_rt"] - return data - - -@register_compute_fun( - name="e_theta_rrr", - label="\\partial_{\\rho \\rho \\rho} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, third derivative wrt radial coordinate" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rrt"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], -) -def _e_sub_theta_rrr(params, transforms, profiles, data, **kwargs): - data["e_theta_rrr"] = data["e_rho_rrt"] - return data - - -@register_compute_fun( - name="e_theta_rrt", - label="\\partial_{\\rho \\rho \\theta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, third derivative wrt radial coordinate" - " twice and poloidal once" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rtt"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], -) -def _e_sub_theta_rrt(params, transforms, profiles, data, **kwargs): - data["e_theta_rrt"] = data["e_rho_rtt"] - return data - - -@register_compute_fun( - name="e_theta_rrz", - label="\\partial_{\\rho \\rho \\zeta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, third derivative wrt radial coordinate" - " twice and toroidal once" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rtz"], -) -def _e_sub_theta_rrz(params, transforms, profiles, data, **kwargs): - data["e_theta_rrz"] = data["e_rho_rtz"] - return data - - -@register_compute_fun( - name="e_theta_rt", - label="\\partial_{\\rho \\theta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, second derivative wrt radial and poloidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_tt"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.ZernikeRZToroidalSection", - ], -) -def _e_sub_theta_rt(params, transforms, profiles, data, **kwargs): - data["e_theta_rt"] = data["e_rho_tt"] - return data - - @register_compute_fun( name="e_theta_rtt", label="\\partial_{\\rho \\theta \\theta} \\mathbf{e}_{\\theta}", @@ -2787,6 +2656,7 @@ def _e_sub_theta_rt(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.ZernikeRZToroidalSection", ], basis="basis", + aliases=["e_rho_ttt"], ) def _e_sub_theta_rtt(params, transforms, profiles, data, **kwargs): data["e_theta_rtt"] = jnp.array( @@ -2875,6 +2745,7 @@ def _e_sub_theta_rtt(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_rho_ttz", "e_zeta_rtt"], ) def _e_sub_theta_rtz(params, transforms, profiles, data, **kwargs): data["e_theta_rtz"] = jnp.array( @@ -2940,27 +2811,6 @@ def _e_sub_theta_rtz(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="e_theta_rz", - label="\\partial_{\\rho \\zeta} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description=( - "Covariant Poloidal basis vector, second derivative wrt radial and toroidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_tz"], -) -def _e_sub_theta_rz(params, transforms, profiles, data, **kwargs): - data["e_theta_rz"] = data["e_rho_tz"] - return data - - @register_compute_fun( name="e_theta_rzz", label="\\partial_{\\rho \\zeta \\zeta} \\mathbf{e}_{\\theta}", @@ -3003,6 +2853,7 @@ def _e_sub_theta_rz(params, transforms, profiles, data, **kwargs): "phi", ], basis="basis", + aliases=["e_rho_tzz", "e_zeta_rtz"], ) def _e_sub_theta_rzz(params, transforms, profiles, data, **kwargs): data["e_theta_rzz"] = jnp.array( @@ -3183,6 +3034,7 @@ def _e_sub_theta_tt(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], basis="basis", + aliases=["e_zeta_tt"], ) def _e_sub_theta_tz(params, transforms, profiles, data, **kwargs): data["e_theta_tz"] = jnp.array( @@ -3223,6 +3075,7 @@ def _e_sub_theta_tz(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], basis="basis", + aliases=["e_zeta_t"], ) def _e_sub_theta_z(params, transforms, profiles, data, **kwargs): data["e_theta_z"] = jnp.array( @@ -3273,6 +3126,7 @@ def _e_sub_theta_z(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], basis="basis", + aliases=["e_zeta_tz"], ) def _e_sub_theta_zz(params, transforms, profiles, data, **kwargs): data["e_theta_zz"] = jnp.array( @@ -3323,193 +3177,6 @@ def _e_sub_zeta(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="e_zeta_r", - label="\\partial_{\\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant Toroidal basis vector, derivative wrt radial coordinate", - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_z"], -) -def _e_sub_zeta_r(params, transforms, profiles, data, **kwargs): - data["e_zeta_r"] = data["e_rho_z"] - return data - - -@register_compute_fun( - name="e_zeta_rr", - label="\\partial_{\\rho \\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, second derivative wrt radial and radial" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rz"], - basis="basis", -) -def _e_sub_zeta_rr(params, transforms, profiles, data, **kwargs): - data["e_zeta_rr"] = data["e_rho_rz"] - return data - - -@register_compute_fun( - name="e_zeta_rrr", - label="\\partial_{\\rho \\rho \\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, third derivative wrt radial coordinate" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rrz"], -) -def _e_sub_zeta_rrr(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrr"] = data["e_rho_rrz"] - return data - - -@register_compute_fun( - name="e_zeta_rrt", - label="\\partial_{\\rho \\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, third derivative wrt radial coordinate" - " twice and poloidal once" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rtz"], -) -def _e_sub_zeta_rrt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrt"] = data["e_rho_rtz"] - return data - - -@register_compute_fun( - name="e_zeta_rrz", - label="\\partial_{\\rho \\rho \\zeta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, third derivative wrt radial coordinate" - " twice and toroidal once" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_rzz"], -) -def _e_sub_zeta_rrz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rrz"] = data["e_rho_rzz"] - return data - - -@register_compute_fun( - name="e_zeta_rt", - label="\\partial_{\\rho \\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, second derivative wrt radial and poloidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_tz"], - basis="basis", -) -def _e_sub_zeta_rt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rt"] = data["e_rho_tz"] - return data - - -@register_compute_fun( - name="e_zeta_rtt", - label="\\partial_{\\rho \\theta \\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, third derivative wrt radial coordinate" - " once and poloidal twice" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta_rtz"], -) -def _e_sub_zeta_rtt(params, transforms, profiles, data, **kwargs): - data["e_zeta_rtt"] = data["e_theta_rtz"] - return data - - -@register_compute_fun( - name="e_zeta_rtz", - label="\\partial_{\\rho \\theta \\zeta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, third derivative wrt radial, poloidal," - " and toroidal coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta_rzz"], -) -def _e_sub_zeta_rtz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rtz"] = data["e_theta_rzz"] - return data - - -@register_compute_fun( - name="e_zeta_rz", - label="\\partial_{\\rho \\zeta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, second derivative wrt radial and toroidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_rho_zz"], -) -def _e_sub_zeta_rz(params, transforms, profiles, data, **kwargs): - data["e_zeta_rz"] = data["e_rho_zz"] - return data - - @register_compute_fun( name="e_zeta_rzz", label="\\partial_{\\rho \\zeta \\zeta} \\mathbf{e}_{\\zeta}", @@ -3602,78 +3269,6 @@ def _e_sub_zeta_rzz(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="e_zeta_t", - label="\\partial_{\\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant Toroidal basis vector, derivative wrt poloidal coordinate", - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta_z"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.FourierRZToroidalSurface", - ], -) -def _e_sub_zeta_t(params, transforms, profiles, data, **kwargs): - data["e_zeta_t"] = data["e_theta_z"] - return data - - -@register_compute_fun( - name="e_zeta_tt", - label="\\partial_{\\theta \\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, second derivative wrt poloidal and poloidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta_tz"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.FourierRZToroidalSurface", - ], -) -def _e_sub_zeta_tt(params, transforms, profiles, data, **kwargs): - data["e_zeta_tt"] = data["e_theta_tz"] - return data - - -@register_compute_fun( - name="e_zeta_tz", - label="\\partial_{\\theta \\zeta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description=( - "Covariant Toroidal basis vector, second derivative wrt poloidal and toroidal" - " coordinates" - ), - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["e_theta_zz"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.FourierRZToroidalSurface", - ], -) -def _e_sub_zeta_tz(params, transforms, profiles, data, **kwargs): - data["e_zeta_tz"] = data["e_theta_zz"] - return data - - @register_compute_fun( name="e_zeta_z", label="\\partial_{\\zeta} \\mathbf{e}_{\\zeta}", diff --git a/desc/compute/_surface.py b/desc/compute/_surface.py index 1ccb989da1..2368deab44 100644 --- a/desc/compute/_surface.py +++ b/desc/compute/_surface.py @@ -307,6 +307,7 @@ def _e_rho_rr_FourierRZToroidalSurface(params, transforms, profiles, data, **kwa data=[], parameterization="desc.geometry.surface.FourierRZToroidalSurface", basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", + aliases=["e_theta_r"], ) def _e_rho_t_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): coords = jnp.zeros((transforms["grid"].num_nodes, 3)) @@ -328,8 +329,12 @@ def _e_rho_t_FourierRZToroidalSurface(params, transforms, profiles, data, **kwar profiles=[], coordinates="tz", data=[], - parameterization="desc.geometry.surface.FourierRZToroidalSurface", + parameterization=[ + "desc.geometry.surface.FourierRZToroidalSurface", + "desc.geometry.surface.ZernikeRZToroidalSection", + ], basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", + aliases=["e_zeta_r"], ) def _e_rho_z_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): coords = jnp.zeros((transforms["grid"].num_nodes, 3)) @@ -337,29 +342,6 @@ def _e_rho_z_FourierRZToroidalSurface(params, transforms, profiles, data, **kwar return data -@register_compute_fun( - name="e_theta_r", - label="\\partial_{\\rho} \\mathbf{e}_{\\theta}", - units="m", - units_long="meters", - description="Covariant poloidal basis vector, derivative wrt radial coordinate", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="tz", - data=[], - parameterization="desc.geometry.surface.FourierRZToroidalSurface", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_theta_r_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_theta_r"] = coords - return data - - @register_compute_fun( name="e_theta_rr", label="\\partial_{\\rho \\rho} \\mathbf{e}_{\\theta}", @@ -377,6 +359,7 @@ def _e_theta_r_FourierRZToroidalSurface(params, transforms, profiles, data, **kw data=[], parameterization="desc.geometry.surface.FourierRZToroidalSurface", basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", + aliases=["e_rho_rt"], ) def _e_theta_rr_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): coords = jnp.zeros((transforms["grid"].num_nodes, 3)) @@ -384,29 +367,6 @@ def _e_theta_rr_FourierRZToroidalSurface(params, transforms, profiles, data, **k return data -@register_compute_fun( - name="e_zeta_r", - label="\\partial_{\\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant toroidal basis vector, derivative wrt radial coordinate", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="tz", - data=[], - parameterization="desc.geometry.surface.FourierRZToroidalSurface", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_zeta_r_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_zeta_r"] = coords - return data - - @register_compute_fun( name="e_zeta_rr", label="\\partial_{\\rho \\rho} \\mathbf{e}_{\\zeta}", @@ -422,8 +382,12 @@ def _e_zeta_r_FourierRZToroidalSurface(params, transforms, profiles, data, **kwa profiles=[], coordinates="tz", data=[], - parameterization="desc.geometry.surface.FourierRZToroidalSurface", + parameterization=[ + "desc.geometry.surface.FourierRZToroidalSurface", + "desc.geometry.surface.ZernikeRZToroidalSection", + ], basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", + aliases=["e_rho_rz"], ) def _e_zeta_rr_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): coords = jnp.zeros((transforms["grid"].num_nodes, 3)) @@ -649,29 +613,6 @@ def _e_zeta_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwarg return data -@register_compute_fun( - name="e_rho_z", - label="\\partial_{\\zeta} \\mathbf{e}_{\\rho}", - units="m", - units_long="meters", - description="Covariant radial basis vector, derivative wrt toroidal angle", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="rt", - data=[], - parameterization="desc.geometry.surface.ZernikeRZToroidalSection", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_rho_z_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_rho_z"] = coords - return data - - @register_compute_fun( name="e_theta_z", label="\\partial_{\\zeta} \\mathbf{e}_{\\theta}", @@ -688,6 +629,7 @@ def _e_rho_z_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwar data=[], parameterization="desc.geometry.surface.ZernikeRZToroidalSection", basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", + aliases=["e_zeta_t"], ) def _e_theta_z_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwargs): coords = jnp.zeros((transforms["grid"].num_nodes, 3)) @@ -695,76 +637,6 @@ def _e_theta_z_ZernikeRZToroidalSection(params, transforms, profiles, data, **kw return data -@register_compute_fun( - name="e_zeta_r", - label="\\partial_{\\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant toroidal basis vector, derivative wrt radial coordinate", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="rt", - data=[], - parameterization="desc.geometry.surface.ZernikeRZToroidalSection", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_zeta_r_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_zeta_r"] = coords - return data - - -@register_compute_fun( - name="e_zeta_rr", - label="\\partial_{\\rho \\rho} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant toroidal basis vector," - " second derivative wrt radial coordinate", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="rt", - data=[], - parameterization="desc.geometry.surface.ZernikeRZToroidalSection", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_zeta_rr_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_zeta_rr"] = coords - return data - - -@register_compute_fun( - name="e_zeta_t", - label="\\partial_{\\theta} \\mathbf{e}_{\\zeta}", - units="m", - units_long="meters", - description="Covariant toroidal basis vector, derivative wrt poloidal angle", - dim=3, - params=[], - transforms={ - "grid": [], - }, - profiles=[], - coordinates="rt", - data=[], - parameterization="desc.geometry.surface.ZernikeRZToroidalSection", - basis="{'rpz', 'xyz'}: Basis for returned vectors, Default 'rpz'", -) -def _e_zeta_t_ZernikeRZToroidalSection(params, transforms, profiles, data, **kwargs): - coords = jnp.zeros((transforms["grid"].num_nodes, 3)) - data["e_zeta_t"] = coords - return data - - @register_compute_fun( name="e_zeta_z", label="\\partial_{\\zeta} \\mathbf{e}_{\\zeta}", diff --git a/desc/compute/data_index.py b/desc/compute/data_index.py index 5252c33adc..e410ec99ad 100644 --- a/desc/compute/data_index.py +++ b/desc/compute/data_index.py @@ -8,8 +8,7 @@ def find_permutations(primary, separator="_"): """Finds permutations of quantity names for aliases.""" - split_name = primary.split(separator) - primary_permutation = split_name[-1] + prefix, primary_permutation = primary.rsplit(separator, 1) primary_permutation = deque(primary_permutation) new_permutations = [] @@ -18,10 +17,7 @@ def find_permutations(primary, separator="_"): new_permutations.append(list(primary_permutation)) # join new permutation to form alias keys - aliases = [ - "".join(split_name[:-1]) + separator + "".join(perm) - for perm in new_permutations - ] + aliases = [prefix + separator + "".join(perm) for perm in new_permutations] aliases = np.unique(aliases) aliases = np.delete(aliases, np.where(aliases == primary)) @@ -63,7 +59,7 @@ def register_compute_fun( profiles, coordinates, data, - aliases=[], + aliases=None, parameterization="desc.equilibrium.equilibrium.Equilibrium", grid_type=None, axis_limit_data=None, @@ -98,7 +94,7 @@ def register_compute_fun( a flux function, etc. data : list of str Names of other items in the data index needed to compute qty. - aliases : list + aliases : list of str Aliases of `name`. Will be stored in the data dictionary as a copy of `name`s data. parameterization : str or list of str @@ -114,6 +110,8 @@ def register_compute_fun( Should only list *direct* dependencies. The full dependencies will be built recursively at runtime using each quantity's direct dependencies. """ + if aliases is None: + aliases = [] if not isinstance(parameterization, (tuple, list)): parameterization = [parameterization] @@ -127,9 +125,27 @@ def register_compute_fun( } for kw in kwargs: allowed_kwargs.add(kw) - permutable_names = ["R_", "Z_", "phi_", "lambda_", "omega_"] - if not aliases and "".join(name.split("_")[:-1]) + "_" in permutable_names: - aliases = find_permutations(name) + permutable_names = [ + "R_", + "Z_", + "phi_", + "lambda_", + "omega_", + "e_rho_", + "e_theta_", + "e_zeta_", + ] + splits = name.rsplit("_", 1) + if ( + len(splits) > 1 + and splits[0] + "_" in permutable_names + # Only look for permutations of partial derivatives of same coordinate system. + and {"r", "t", "z"}.issuperset(splits[-1]) + ): + aliases_temp = np.append(np.array(aliases), find_permutations(name)) + for alias in aliases: + aliases_temp = np.append(aliases_temp, find_permutations(alias)) + aliases = aliases_temp def _decorator(func): d = { diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index 3b3da05f7798595901abdea308adee9a56bbc751..daff3e906ac455717587568053f0ba2bd934031b 100644 GIT binary patch delta 106347 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%0Ab?x}0ZKh{;KwDL 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

-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

JQP=uqQ7L|hUD22ieq zYd+3ozy#~$ts(Aaurg9}uf5g`Gb|k)K9`%pV)xa_mm_pIPfweFDaC-$o@%EpQDhR{ z0Y~~z(lVvQ{1qpfA;}_WDK)tn#vjiB$}!QxM$vn6x~eYvncZ&ov2UBJ>0rEKrvA-$I{8(jZI7(Ubo^eZWPr{cKGPs*hMH|Hp6olC zL8h2L#4M8zp6ch>hPp`lZTBu`Z(;z0*fGkZkk0_c6P9wdTbm*G_1(3;Qq530I_$eI zl@8AzFPw;IqeHfD^+{a;GMhF19p7AJKxTS_%R7l?I8?OZ#%t6rU`>l zKkw2(=q!c9PJ;pNr|%wp*Uo^ekMhl;J}_YYJQV9lGeG2>$HjhAIuOda=MHMu(m}oG zd20%pYz%#h{d6k>HhqyRN*pHt0)yqS1i2g?UKr`>(cz}W@P&Zubhtlx>XqkK2Cy3F ze>~d60PCG+=YRJz;H;gH;~_x?96WdRZ2fjR*lyo35OACeh(TTBhrdr3^UlH;)si7!Y#YIcYnY zwe!PmAB4!&k+%LsZy-AzoOW?OmG-AYk@eB|2yzuj=|r>k#4zCYd9HvjXBZH8Zw6k! zphJel=g5_lG;n}4Cv{6Y7;-0c&h`*=7~&mS>?U_I#?0yf{I8u%+V1TzoesOFdAamn z(LjD6%<==!!6k6lc@?C?oThJl_C6Arf|roFCj(wMb)`(+phGwBo3;EMG$_`#&EKm) zhdQ%;o&7iI5b$lUYyuey(I1=7)2$eAOK_aRmrsZFyK407i3c?J{r=z(?-n{-no~Od zlXR{8lL`NMavi7EGMp}$GN8=y(cmi5g^b<)Ebn*FV40psr@>a9cI_Vv?uy8OF>AAM;8#e8x!}LV)m(2q-=xl!8fA1$1 zN*1)GbXL${);XOeB!mXdeqw}t*EkJQE!vtDsdeNAa$Ig+sEP*eSDE{FJ)y#(@Xg+l15`-CrD0=w zG}v~8mHav}4P3&UbJ|E?t0|7I@fT@8Rr@k#)JO$XC4Nscw^1R8r8HbYkp@>kuKHdf-dvi^W@x0(95@v}^AW*jhNp zRh6i4ZVlc0wjUL?bEQiCA{E*$=V79GBFF`a^DS9J0V%DUPIFBNp~gQt%7m%FlTI{E z*pjZ^clW%RIu)KM1_#yZB5dfq`_=4g69H_c=hGEWBjkp==Wvsjv#BO>3+j=K-$5Wl zoC>G?UUS}BkMP!_%k%leCMbHudpN@n!M63dm&g}{^l7CR1`1S2=r=o8zlsWuuJ8HB zrYW$-bxHfswI-;yQhQ1>K-kBVfTZ zrW2Y#E_P9UmpqBkJd#uP4nhTA^TnmyR7ks1ByeW{!Bn7TUtB!}3QE=+t?+FEk?U;l zc*GIv#tYT9Rv^TR<#1+`A!*yUQqcPef_8zRFfL zhFF5YBe%50^bG}=&Qz?e=Apo~6%Ul!-Zes9(`9WJ{zjPD1?jeZ6nHnYV%~I-0;~g~ zE;27DU_F>9T+c~?S(X|#j@OM~u(Cnp5lx{c}^gabXefV|2;S&X>ZdC>uwo)K} zW2%jZ{1fxf#!nM-ZO(u zz}}a>YVvj?)YKMP;)ezZewp2AolF5=iI=n8B%Mr}Ow+UDq{8zlH+MBPfzo?-fBURP z7%NN`uV`t2EN+onX-5jURlFDrNTL9TVwJX;GX+kqohPQl&on{Gg~;W#K8N6hwjzvH~A=__cnhr&$tN&Idf-X#T!9?S59`JO#}Q^lZ$a*Yy#Ii z#M!5!q7)bmvQaKrXoB4G_+dxoCWzVP!uZ712veT!GqunF(~Bq*`nw4d=>rO`>nUJ& z!9-^E8!4D;^_D1E5)l2TL*vp$*tk*tMw)5^+`WIRDzu3L@n{jcFP#Fp*_`=LUo}CC zbXvpN=0>>U+SvDLxB-q3!NKOl?gX#3NY=LQX6{cC?xI6s8| zsev=UXroPV%QjeNct;b2h@Rw~k!%DyFMjGJ7A$OfkYz-hYaZ}rB;2x|RSU5gags@3c_|;M_1m?Jb$#^mekD4=ztEHPj z+eDx*WVjJty)gX7YuN<7Wy4wJ`3QwKMp|AjLwMOSjz-vI|Kqv- zt|o9c>`UngLg*XllkV)N08h~I?JwUo!HTB$HYa8q!9Q!+?)s`mm^?G}wUE@eUuB0f z`KtX$kxBx|QJL@PZ3H8(eRs8T8X?Z+(Mt+*6O3WLQjyM zxNCF&2b*^z>|Dj1z$(!QkIQzgc#_))M+JAcx{%APrNY$BM3Mqq4$_O4sgSvG=D?O) zrj0Oh00d_^8bNzo@9@v)Mi_DQo13{sfo|75HR6I4koZoFCm!6=1Om>5ajd%=LD4+P zlyjj0M(^rG#Q8RY=cbokS6@-#*xac(RkG^ggin+@6BRD@rm#z1LU6j7ti0_dS)5u8 zy*aJPGX1V#xzTefh~*3&neifT@%z@YQQ#NC);ALIZ^<&8mHu<>n;rzQXCsQ8=2Uo2 z@Z6V8@1%mmhmSSkj#SvOygTvSdxXgA|7G+mff6&(o{%#m!9r$mI{8hYSP(KRM>4_zUf#j z$q<_`q)(P%e_Q1jD{T=zj%QbW=cU4AUdMQAJQZ>p)K&(rp+ZJ?N13=endP(r(}F1q z*z#Ggpei7&OAgk4PkK&Pq<{Ek0C|v+7M`FmQ3*I|GurGdhcL3^-f+xga;rSz7^O}w zr@@55`N`J^DceG7ik+yiwoI~!e-xpu{aDI{H3+ZM3~w}6k;{#1-ry#wXnyClv<1>r z?MrW^NRS5^t{$UwmKO+J64W^Qas-!kG6swi3fQ-4en=gnz}@Bxyp6SF{SPQ%x4ZR` zJVaK1o!LatKsnXVy>S-}SWf?V^%Ka$sf@qp%rWv<{c1I_ZZjQ1FEYIsc~1k`gU6~{a4X(G?0$aii;H`+j8NMUysPMp>O$x*^|LEU@cu% z>#&Um7w%_ioh8Uar}{G42K#Ut+)Ix9u|S?`ll-+)3fswJ^ZC!U?ankf{P528ZV?*P zZPTZ-k%vzEwVHQRJ;=jn-P^Ng*yu28^!ClRdK!40I zw8TE+>34n-`S#I0T`6hgdEd4}+>ZoeD!^hD`i=@GzS76*hN!UQL5Vkyt)EydRl_}5< zdeUGx=V7(#Zz_DT5q;D_X1VQRP@5>7JPn^?Q(nPFh9=Bni+M5WiCMq1Z=7gw(kkfN zDiUyLWvX?41KB66>ow^i{~Dc4N@roFk$mi`U#`)B%Wldq{0SW@!6w`sz<;nCU*F|v3zWRe6Lkj#>w_DwZ4v)Rlb8=G1?srCe%Zs1n z(5Y}^-pwau-#$Fmt9p@~fV41`1$ofHt~FF-j%>-&GigIxL&#>5v-Rcd5FLK`#x8wx zkDLLmm*^Krq(km>{_Tn2&Uy_9ACBR)(9X zKYi&CJ@d?Ur79hsj78NymY~B+rP4#FLx)rLE>zztI;>!Gb?ZoBz{&;p>$j}vaJ^2# zL5j@s>*l(uzsO#({^(`jUt3AOv0`QW%XE;uuwg%UFoWC=qVx9XlT9j@+K)AB=&<2> z5Ze?p-5NTo0(F*cqQiX4sC9Z4+0VN&L{>R7fct%YajzEX@((5JM7hXVWn8XFo2S9k ziiw(I{AB;0eyKw_o3y;oZ<81~hWqE7^X!{Ct5#;6vt{*G$b7EO`>vHL3-hM4R~oG3 znZ4?sG*}T!n3LHod`{(tuEcf0?Ax8G}s!a@T{>$Z6Pt&cjML8|lNzCp`0@LIPzb%t;n$i6u= z#T%zN-_r(-`(p8V>R1>{&ZB3Lv2*60G|XRac-*@O^B;UP)odZ=*H;vL{sQw4iK&pQ zak`|cqoE;$b9G5V_l>~}rkTXfHwLmy)xdv)PZgMHPoIzj`s#vlz_(a@p(F-I%|^rIY&v=0E8a z{V)gf%h%06S%~>xY*C+)hWU9x;LKah-&k?2ZV~1;>U1E^38xX#MFxEHn8db6PQ{jn zvaD|J$4nw!d5aq@(jf2#$Kj(`Xp;BdFHKnJ0>YxmKvLN3{Baj?Og`OZw`MseR|Y6< z5yZNH^ew{cj>($LEjEy3Wzr#p@ER{;O);9 zn6D&d&pf>zaI^cmX3o_fkn@=xdRm$adm<+Boqa+DjV<}H$C|q#b-DoxRPUj{?z^RJ zjnchP9dP*Jn_Io`(oXZk#S@*7+9vIOrJxIfg!CII!QBweH|bTz%^nEYeEju-vR+_u z)qefbxep8%$H;Hc>;NXtZgtm7olrE*pDog|8>E_;4XYb^K=#LUJpsEu2#B?q)x**c zYK`8noi4OP{qazz<;|21&^js@5jnRTjJqG(UYgwtQz@N4-oNbwC*D<3rAzxEH@zxf zL%SXNfF@+z-2whg;ZKtLsPN%D+j9k{UWl9%oyx+|5A&C3BEzZu@bJ}ctKgOGu+sg5 zb>GQO$Xv7JqSRX|Y*=p#=IL2Fel`Gc;5{jCD%=yJ!#-Lc;m{Ig*|Yx z&*F5mdk<_mQ$tJe?tu+*Epf*+sSuTaN{*b>4Z5P1NC7KI$y3r7uj_%^Y07$6{d+;D zXm98V9OCa&4W>xBcS62-wZze0Gb+HBB;O|nG&u0WvFGEFUNDPUBXgYSgQ>*MCIeXt zuI3)%bLfYJC0Y;7+xkF^ZL5j=>~=^2eXg6nopATK&=%vwZdfJ3AFyJu7cQM(`QF#q z4~EmMjhD{D{mi>vZ0g#eb!$tnz`jnnowc>raBnwU*I+ZV{MHMK@^@8vb1{Eixqhoq zKgi6^sT#D2ESIPWgt3|4D@(LjYelO9Drc-;@g>uFYy)&pxR*UgyH*b9!{2Tu^Y+QHB- z>*U~0Doopq54exI;Oiy3NSiZ*@agNOd!=`~q14w~mAz2}0H)!57YR|S*M?%fk@^h`VGUi;x>W77qG+IrM&cusn@i>oUx?*lUjekJ`Tyu@}_ zO!{`d4@B#pADiOc2HBSqj!+&sbiyTW6%TK9y#EYPRim-%mkd;0O5fWLCcJ{2_GNug zEwTCiJL5KB*Sc|%kEatvHYs1Q8SIAS`Zf4%j6S$D-&FLYb3ZVbiiKH;_QT0rrM|B+ z+aM}o&!um=oly2raq6UnH0bBv8nwZ-50*WCxERBB5Y^^Q$(KId50iM(_N=vThXU{9 z`zmr>uq-d}Onxy9Ha_v1k+!W5B8P6s&Dh%mlOh> zr;oZpEVViH8c6O3H>dIejJFy~ zpHb|ECS_keDZeg=*33*~TSLWvKk7p_*FHQ+4oL9qoR4R92~pT?AW6|$J!9pGd@8hL zuDx;fDh=|_2t_@e-wy@UMD_Zx9#B8V^=(F5HyClYZz%fM4F-L!?;NVSq42#{qRi`V z2vEv-bu|k|NknOZeJ1|R^@exFN31<=u7ht;QAhYEN77(tnEdti zbu^HbU&qRn+X)RqZS1wPsi3v7^uc|6bAL`QI7r|u<*|2_vsWGs?rWX>7~MdFZ3_-f zlDyFYNB31EX{K~Rbz@868`*9^=DQYzBvWV*UuMvEw1|d_063{z*9ylO=1wIaS!yav&P0r8`HBFm`G7P)G zm@7jlJDdu~12T8(M$=%H{E>1#KfJ*P?sttb>4tMQ{eur(+u>V-?4%PE&Mvs98<}GM ziV9_Q4~$4n8eB6xT%)_N7bV*6L#txBr&DS>JS?_t<~rU9hgUkSYaXORlHm%a zNC6s9c=jbfGwTH{?$hdTY;hhnL%v}_Y&#TR(tlpJwH@r_I{kg3s8CRBXGMnL0mg~9 z*k$y<;fHf#h?Y)+@A#8B5!ut$cEGv}-mNXOsK8A0cNuJ9dO@tE8oXdSNAPyz)x5Aq zIqU{A75oXUZoJeV5PQ1~ws181Ze4Ml;VM%PW7Ag0_Jwk$pJ2w!z!~d%w+-Ue_e*4*gx3_yAq%7Zent3w~4s%P;Bv#O1 z(VOG&7H{z8OPOZ~<0bCqcUJ$48m3P_Bqxmb!vs5x&`)gLu(3DUF-5Z*o}4p{x}Vk! z@%+{~vL-apF!5Y3_>l(k^_AC+R`$S!2ZhBag1SJ`{7v)cjZ~-#QT`-m-c5nQj>}Xr zUmCF7u@Ad*u?IHoUN#Uc+zY*u&T5$f9q@DD^n$wXPSD*WJ7wAwoau(SxP(^HK&PpD zjqJ2uXyaBpipk3B#6%XXJE!5%Ox^4QYo-3#wh zlnA8U2WqR=ZfRRdX@l!}N*g?b+TlTZL`1VL6{en2-4uj(0q%kwqCs=}V88Nh7qN4F zkkQqTur+g|Tw`rZb|Pb91V$m{~kId9?P#eeC7_52bG)vT$|6lLc10dEh2w{9;u5kP}r zrR0Gf_{@+!c;4xnY%esIzo&=|&FloWu(t03!d>98SW0Hi$|xt9YmTREfFp50L`{sSE(2(uxlq9oLkWYn>lJ(nsGuGYufPY z$^1SH_u6ie#F=T_ho7(34Yq@lL#WZNV^o-R1DQ(_J-}&ADUR&D-3P~Sux>qMfKMei zTs@z^YXgnNFP6yPZwH4#svg0Sc}*hJYI{9R34y#gxFd&pm_Dya zWNhODhG2Qp=c&=2Ul29+Wl)Vo9SDal-}y!>8f`I7e*Tp;1Pr~Fh;#78BK{`o%|1n6 z&{ch$HaA8e?zI_PwO%*|{Ke~fz4{Vh)eV{nqAaOLHm^1inxPNSd7hhBny2}I%Ci}A z7SdIa^7{RI@GD2{MLP9z4{G$AneEb!=*yFEQSyTx@^h&8lGk$-ks1NF z2817?Bh$Q5QgIUsjDA`3+@lH!7KO99Eo?;md;eGiy&WoYNLw*o`KeZ{NBss{pR+&vB;eb-?#f%#Cv8ePHV;E%cl<15yseH*tEPip{PnnT;K(occz8Fa>UKTx^T!fx+%Nn1G`kjZ{1Z$w zWBI6`nuFRY3+pV4#lw-iR>|pmyHe0(i`*lrvGMTk;4ZGUX%V3KF!}$v{jZ6Sz*RVKS}TLgqXxMAhLfrWc46x#}DUN{7QzI`dis_Xf^gK zYWw~iNq#u9g=qzXLY{`bZRhWyLP^Bsi{BT}RW%D7=+K4R-?`_!czzacGzg#GG{cYr zNm5gvUT<+mEa7FJJ%4B-x3BBm->cLi-O{F(T$vB>(S7sAUE&oeG}VLlL$wTU49*oY ziYh`*&(tnF$Bzsew~4v$(~3uB%isKvpB0Fn^=vzAoD&Ht?RGovu1!Tg`vkT$b3}rp zfzH<_>$6a#QEa1dZ#e9?W%ejkpxlF)8`AUF-VTKLf%4^p5d^djH4bsT_eD=iwP%ZY zgn~!YO15p90f@RnZq}mhyP)Z0%!wf60UPXY$EBOBL+|dYOw!jq2u6V!*EjtrLi{1U zWNvO9q^}mgqSjr3wpnO?aVz0 z)E>!jf00ns$z`3KqD_F?WbVVyO5#9dfYT=^z7ToF+z4m3+=jLd(2|OouOrDPY&RA} zr$OzG=hHrRW#AXxLv&V@#(|Nji?>JSBeZyZMNEFQ4@8G$7Mq+3LdTeQo@g<-1V2gx z>#wdcM~=^*N>f_34nZ%M`_Q9^gQ(PPsdxyb7|agb+YtV&4pEQY=Dp2a39+`9P8G`3 zqC)pN=}kx9LB*NH$*%YwG1*Epz(F|zDo)QkxxB|4@qc*6WXg97Vs9Pi68?G-5^U20 zRHi*fhW^p6-fBglB|mABMCnZ=EP1V3+Rz*1B%CRQoTg7uJ%{*>4ZgUDVjJ_GYbD|6 zy|Z8a_H|)U4Vsh1j_yXSeUE&ub9q7i_MrJ2raGa5r<1+gq}IZgn8fLZx<`@M^_s8k z>l9FH)3Qtrp8KG+Z)sqZR~`Q5gZR>N(>g?4ugUOmEr)oe-Jz*&MabA+wC)P72sQ$W zYnDS&6gs=Go%ve21$ag`@O5-X!q8{$&9C?PBGk0<=;T!-Y!;{voA)Rg-3#cN(W74g zPYJ80svjhhwtRWshjJf9*6vpQ5_uaaH#e@Ya!f>r?7d8X!kOp2}zX4O9buozZ@$d?i9ztAiI%3c$uk(KzNO z0ntxaD=ux0gfsc)mxP?%4+=K51FW_9J)Q^NM_Y6okd@6tt}8k3fwCa6y)=Ll2u@0{ zrMM~;#blLTo_aDBk{Tq9l{Au3=9aV_G4fupHz!qV;pqct?Ugfcc{DFU&IUC*{fe{b z2y5pcXX-}e=(gue(z>JQ;T64P``$|EWD3we$XkMn^-M1ZLO!~EOZ$qCR1VrU?aU?( zs|NV=ZQ1AVZ%ZjCV(adx9Jv?p`r^sfRW&bA^0b@pDL0D1%{KH@9^fbb(dSR8o_Pga z`-iS=URMm(y{kF)`If*WlUvK3Pqm@;^XJsR9j=8{T{{E5o_&i}uHDD|NwgSdp@!tM z!cUO>q2hpM%Lt^g{9U$jdI)S#bdB`LF@xS0d)s{cCN{V08P2RfjfhSbK3(=@&>08P<{0>*X|$Q zNGvW_v-qQ_C zUjj?VDx>PW7sx}-{61&geLy;$=@kFyC}@sb-k5#&7J9#O(}2d}c=(`h&#l`O2}OyO zTY{IxLFq%08KO%FG?dok^I{+gc`1Jqopkse3e{Q^H+TA5IOK1A!@__>FD5Z7^6k`y z1BO%G=8+U+A~8j?YyCyYESDK{O~9YVY5YrXB&?{}TUn?IDpNk{uh`)T>!u&&ys|U`Xo>@m>|1J)0CDVFZRUH# z*Sl!tCBJu&rN6YbP3bKp+|s`_=+O5)mq0( zAvh1T98(`n4Sj{*yVHNzv@r#xY*$Xp++2iaG$ih*Q7lHuLr0}$j+LOy!sP)M!ajqq z@N4I`7sbeGEARHCmq~EVR;$_ZdJg)bzI-Y3qa^%ZmGq>CgAouPa8%C2{XWuI$E~ou z@E}k$Crhp_we?1}w`#-_mR$wic^aEPnnxf~%~4$POE!e^eil4tUkM(w=6TJT_Zg{s zT4_pbE`ocDjZM{XRi~_)(glfvcj&~En#6Z2O2IjLQFz6U0wmP1$#QB_5PEu8IP*%u zP2};##{FvIHL$;(c3o(>KUll?FKAb-qrjON7scH2s*tY=i{ZSr57EhJNxnV1ajCFi zM*8l_=}4qOKFfVq8Ytcrm_2z$2&%1VES)1LjYOvEc<`M*h+GX=CSQMi5yXUI{JFgs zAz`T+662re3e5o#mFx_ z##Je!4l3-NzMC*tBCe1C4WgwMzO7E(cHX@N-Bh>`$oeK5oQqse@VyB{q0-3%bA!+0 z*YtzM?-mB36Z68l5{*58nPY42*_L?7G7@9v<$Z(73i~}MFRmQ`owUTGXcGi8b3H=~Cr{&iQoA@TyVb%C=!?zw{wxySSwwVs6! zGau#Db{e9JJp0aVA%{WIPo{IH>n>#I^(4G&TQNk%JYkJat3#!{OlNA@a6S<-koopj zE!tCkhmyB>Y6lK z9xsJDq!&cOCC$pL8Otu9l>ILyWUl!@S`|g$%aV7;(EJb22AXJkAQ8{Bj}w2hsc}Za zlT}BI;Gyb?BTr`pz`{<4RUL=wfTODHBoqF$;#=#MW%p{!AwS(}u4wFA#AoA@uK6<$ zLe*>Ua)>4)<~avBHyYoD$`t-ho0{$ekL)}DGa4a?->Le8SKbpa`4koV{cQp|L^1hn zy}&jPI%L#szWXF1kE*>!zLjCfIlTIvfQB1z5epBy&W=Hw78ZT3OO6D7&A6cVC!!Fy z#gJz}b`Z?!xW@c?t2I)%siNlGa}j+oTDrrQX#?^jf*Nmx%J!_+b2QyL|Lo?f9Adnia5ts%y@Dy&Oq$mwWQwD*(k) zjj6>Y{*X84sAM1|6spzgdxJR+qtNM-3fe`z5cAK6O>;NZqgZi)`1wWEaPN?ac2WL) z5Xckza(M?rlq1)krWW9WTylQHV*L~}O$br09PooyAD)`E7)3!XW}S=U^Ui?#k8^Rc zqBxdP-)=jHNW+DNTR4S}J0kOg;aLYyRm0&c5iQ4i-r=vR8FX$vScpoEH?q~=dw~KE z_Fkwt^AU8Tt+UI&RHLVpz6&db6#!H9jW8#JJoIko!;sTlZ{T(2>(15GXYg*7EW72U zLSU|tiH|kI+3vX*w#n=oB`_4NZRhu`1vQ#2D%@{gflCB8*oi;LL%a3fuAb%d3KY(~ zV!Qe>8GZ9Da$i{=f#%OrdUwg}9!#o3w;DKhpy-c{-ZqO)f%`|D_xJAFfl#NyM*($D z(7m1DTFX`i&i5}U7q!)aaf0d3`2F=@$P>eInPNSFiVF8!@$09-oq0>!LY1E*fn~mB zF8lAJr`@|Ub^242EP%DT}I?gg7Ru4>y$jXp$|==>?bC37%rk56}^1u#q1)qJ0hxl6Gu6k!tP~Ix-=io zyDo_0;Y@}lqG4Hz)Fwpk++oLLUk635=?kl$;&+!qv=grPlt7rTo2g;W3pnBx{{4wl zD$2PU+W$WO0_t_}zRp%T13pZBNwVwkd+UEU3E$aAF3JB|T zJ-gbSgAxvD?G8WH2muF%x>hy!ASGvwPOg+j_#oG4*d0{`D{3Xq1f=tWdLg`7>4;8Io4`*1-o17qM`Xjra>533r5VX{kYZsc8 znY6p)>Sfeumu$AK^cbQlR0r2ahrkD$B%z?~A!v)Cfq!n{W0dZ&MwoqiCb%pL%89)m z0j0zhPD4qGP3YJ6dpyEXFUWuP2#E!kZQ4=$txBNaqYnG+#|dB<(%ZR`{|P+Oa4s7X zEJ9Va>&43ln!$7bz`(pSE$EqD%UqkTdT5Nc`BHcVZzoCuXH+(qqQ2az%ce%QohAgd6`F;~X&6&8cgCj|vAl2VBb zpX434I8YCY!L!BZYn7s`CFf0UWhcN9PwgL%gwjAS(TE_@DEKqeXEZmwGy=tFX-}R& zXDI!)mieaPCA93UM9%eNE|4d!sAVDT544k(o(F#1M;ngymsU>;2BqA5ncJRm=;Q&8 z_dS`3a6Nlt2Uiuo$wqsc3sIWhf$xBl$BLmML=BHBZxYXhNlF_^MLs5@*g0#Agjb(L z+a4d<==LQFeMo7soAxddBrl7YpH+B^(&Ur)wrnkgP)oL@oRt~KKKs=nUY;V24C$&S&F=*7qA*{fOPZ;dVaJWkWVM-3@n4g1s1feW1CPxD zF)MDrLA_VZDO;yzzl8yXg;(FnzD9G|n3y6WU%*~(LPsF=2HKlg*0yh55=!yRXFcK^ zjQp3be^*WtC`V&~e$VSApe_=0rTvjDq%J)GTa|6V_-E))d;gtXMs# z)$7Z^vUgkG;h`Orb92`5pwKl@>f3WI`a6bAF3kRV4b# ze`I-VyC=lPRHn_^>WgU4o}ZL0aRImUgjOYgGLqmgOc4sm1t)9&IXd|T$VJ*+EX$|} z6t=URn6)Pl9WJ|lVa}Eu@cYgovU{r!GTT*F6?r%oIS0iZ{lOQ9stwBz@M@VOD#fy9 z6^HO?cpWL;vn0VDd>2}u-{pP)ob(+k?G9W*>n?`Q;WF6=UOqy*4(+`SwtGr7ezb+6 zRs2N#Hu0MDAAf$bxx?yQCYFW0uxwNJR4z&qOs8_s4&q`*5e$#sotvu@oejLd{dX>R_FUyh< z_ocN}30n@La2=_^I;PvmXWRFFzwR_#Or}9OKdS(ln4^QAN?yU{(_ij5beAFD@)~_e zuY+WC^hc*Kr3A%lD!#r`7Z3Jb?`|e9AYqlpqwKS;+u)c}9oy8yr_tn7$2dwZ9=ODO3w3)KiVRc8n;SF}(3jfwXa0*4VV%ZZ-TNzZ z!DZix%Y9WPXz{A;Gk?6o`^@dG4SM%l(JCX2WJyX<5qhYbKTxEYh)lMnulu+p7TDD^ z4HDm%fUQg4TWR6Pu-0AZwJ-jVK#@Vch@(~o%FO&|{-U%ESmv(gkEm%w^8zNnI>OWd zCse48UnE{&XezWieV`P5c)Go9=U@p`v~U==?JY%nH^inyHiv;{?SVD4_JcsqPHCm^ z2cCr8BREGrZSC$`TJi941_cz!L>4!=*JoTU>TP=*S@h2bs$j_YpHa2;c(iKvJxK|ukGvd zb#H^4))y*sf6Ua@_LuioI2n(gok-r1wde+VDI?zQanAy5CwXOPC!Ix4OQ$XIvAu(u zPk!tFTAv8*Mqg{D&UuN%+Kck$rBndPnX!>3mJjaxJ>O1Fo1D%YNd)j2%5W_IxpMJB z#eP&u6!77D;*;F?$~zUkD73XKN5Yv3(maC3ijKwL^ws>LU_}$iJ+I2FVZQ@3H__4q z%MesdJ~F@ZbvWV=KJ!Al>ky*3NTepVxq2ra9A}x1?jDiGBRBL9KH_v zzIoA^jq*R5`KtTX!Nr1QGwfu#(bMJv)y;Ob6sT@1T(j8hJv^y$-KY@K1pdcfhO#MS zp+&E{%#QGsqall6;j63OB0aD9z5PBfQH%B~g|6UKII-)%vi8T#NX3#Z!Tuyo}OnbJPn`eC`exa({@*#IC@a50S*l6kiwDa#u^R^kH*$F$hhlJzr zxyUVzl)AG01d9B=FNjxaFPeoCHq3GJ$A5;Wr>;UG5M3|+K}`&Nf?~f`*?Z{ZgN9u4 zEj_LTbWG&#n-j^Y=#2f-uZpKXfX`>SL#j90@P~-q2=$$X$ocN(d%h_iNITtDMzJCe zl=cL-?M{9NR&KgUg@dsm^x*ZBNtDxJ;ImfZO6BZyq~q47nO|QIk=Z*k?`1WkGp|%~ z4btl&KFs@u>z!QmB@@&;A4ySE3g4jURfA!E zt~J2nIYbRbk)k@(hO87!dWKMeR>N+4)&ytq93d-QJenMhW?21w>xaDrc_48?BhebgnF z2)u&xAMD+hfpdRO3c2H{8|Wu&2@Z%@43mb|lnn$q;rEi`C!KuijzW2LA9xM9!rUhd znhnhYAbQuq(2t%`=u!H8?u8Qfp(Hi>J*Q9-QvK;p6FE>OMEKvj!e5EVx+Ymy6OR5~?G*i}8N? z{d<c4bdIpNVz}Z?Il+)_|QNQ5ierkBvi)5D3T~~Lv?=wDx%6#^L{V`8aZCSA}$}bSR7U` z{tQD2b%`qMbMArJLc?~$Bi;~Ka7AA8Xeg4-kt*r-H$t)Z_fNg-e-?k6hwX{v|*`bCIzrJwn)$0DGS94Nxzb-!?RZ=AnQaP zff}{XFE-y7juy5CmaJI#1gT2i{&Yv~CLCItdFfya1-Qk|Ic2=r3$f-G4_ci&j9=Ct zyxRho(C&32Rde@J?4X{iCsnFIzySsAO#|QW;7{IO+J1G$NjQ4$n*g!kE)sRKOVo9Z z0QI8}v<_OmLazSXRgyG|VfVW=S=G7)NH)|?gJ;82aM}3a$wIFrv?^Y#*ZcKBV6%BJ z)BFL6qPN~}zY&uO!Nk(|%#2dh)Nmzm>$zgs!f1ToH4sV(zgZ# z(h^rv4sWSO^@$4u6K_?)I#tWsuxSz#?z{>K(eUE0T9ND^54M7o1M4d5czA*tmM`ih~y6 z^&yX0x6zH5jTEa`g9ku6(Yi`kjFx$&^TkG zbss2OxvN<2-$jz`mm8zVhlqP7{-cH2I>;$&K|o9UJ6y(l;ZlA=HFCM8?Br(J0D4jG zZNA%Dkz|qaDv{zM*ajWbxzHQ}Q7_VoRv7plYvm{hJQ-DgJ@_)i3q%P_Q{x)+P@{y{LI6P{7-ed`$6Ejtm(7Tx%0JPZt-?Vi_N^BFdJ=Gu`CUyw%F?(O}dt#IZ5@5>*%N@2DY!SeKI z6BP7uppR_{rG_!xjFBor33^5EmsqADVc&c$NB<-!PHkX)zNs0td=Q`C zgKNysm7LY-n%swctad9$ho``F<7c}al*$8(&ToVo#(rjTZno;s>)1Uc;jdtde=7nf*Xban(oQVSjAOcxt%Z6SNO=$c zgMHHFs5tbhVui#zR57(vX}akf^sTP?xg`F81p5@RUGi?t=v1$XObJszyzpo1s>`MH zqm%O4L!pi@;n`dvN3S(i5ZUqM!J0WO@U&Ejy2EKRi0r`cUtI7+EUHy%&tgu%0=uj6 zeJ`C*rflUmK7q~1CbXm^>C-K^$v3^&G0G3^h)!f)o0@{SE5eRbRNuhn)t`QmJAJjc~5ThOE z+a{-|zd(!mx!V%j-wpp=1Rp&nrb)y9jsAgzQ@2JwAV#hcGyJrFvM0+<%T+h^%A`n> ztA^16%pW*N_Pd4^0!%4neX?Pr0P_M)GPl4meID~?R`ODx;Tu-wZ`_2EkkK6C%zm}w!A@zzX;44G!c$IPw#yX%PQ;zZSSBSv#Z1~HdF{6^8g2XRZlC~5cy z-G2IriU8}P2pWa|HIibkv9VdwRTEe>52-lAh?SXZ=WqSHez)1MmObl%Yf4A|F zw?vJ;F$wuJG5;Amr(sD%Jh!>{i1=J_EPmKY9L!D^7`lIv9HU=jpwFK@Y>v-wbNoiy zrg7tO8A=-^aRvWwy35eCWG-%s`rQ;g+$4B2n0X4pD`Oc1i+PI$}XQA`}BLkh!wnJ7#= zEzH-sarjmB*V z+t-Xx=nHE8+CO4Bx*_naGm4ooNW5h0IwO{U3Xh6~JUL_`MPwNmi8HYf^#(Y4uNrOm39W21HfG1A zBa}skM*KI;SunwOn6QA`X^-TuozijD2#cSgkpR06edl&O^-In$>D&m3q?3G&j0Bi; z$kRA*aa#d4=4eTBcb}0K8{gRA`A3K9VY^X~ ztMIqD(*)lm+Zlw_4wGqQOpq-vqr(D!w{a3Ys>bXj^}a0&o2*X|`?$S(OwG;7bdTbH z!bvQ69iysSMDcAap%FW=IDtP^jkLv@PA3cUZCTkQMsMm)W5UCyj0%q!5mm=y!cPXT zHkM#i6Gv|w4znbqh9~sFkX8vM5{%@h4BX;lsxp78Di|FRVV!9!OzgL}6(tMz84EJ1 zES*@k_=uG_R)S<8X)H#MmGeF;$-j(K7~!Oc(8Am357!JbSSU4SAv4>kGgkh#Rgper zXOll;?W7s)s~xs)9_dg1>8Y&W_KA{37me@oll#sYyD$yUC}eCbMM%9i=Kf38reCJU znw}%KYM2B}VOU{1M%v<}jCn{AZ4*&J37^U->Ci-CKlS8&9VuIXbV%a(A-O07bOhnn3MLCC8u^h?EV=uwT zCH;%bXtq5+8-4#^agwL=&L+hJO%@0;t8YiF-+j$ENo>ekMjLi=65Z33=aYVICac&O956zcC$1e=mL&H# z7)y<7EN)&bPlQ}o7M-XOOOz*K!Y1yC8yAzOIZT(0lc=;uZ9+3JU7p-K(-g+>^Q}~q zC+b?&CbVF<6VdroZ9>~|<1Y)=j|H`zWppk#{l3~UvSHx{)zKB`w2gg~Z}0Cb?5q_c zdzKO6Cf0Hz>*`NW(i?-bm$Q?Lw8oEv#EoYeXV>M4#IloOv-gbm09`EX9?>bpMi8Iv zr~j>(q<*$v$EZN$_gJvqdLgD-gk`ZhJE8qdea1w=EOxcF7#S4963F<=$l>7;noF#u z{=ot3h~U%KV*k(x#A$sicJdYP&Si|2){NIezVR?!H*OwaF90Fcx|7v6S&o(Pa#xvf zLePDMJ;6<$p8KbgZ4B-pu{%zUlaEPD33^YdNK-XN^9IM8N8n(vlX0=*V>~iDhGh_+ zTj%^s`&bEWb_Z4>&Ow@$EP9R?34_xQ{GN_GImubMrpFi?Z!iplz%g4%Sn117s0ue~ z4g337q!<*eEh?IlVRY8mBVC9aig{*u9<%3_=<`V3$t zrsn+P1Y!ts9h25S>0CA(Dt7V%vl%dY=jAx>XpPR83FVB2oSpp1XZA-3j{jx$@XRC2 z=Q~fhIEQT^f_7{DlMm_EGK8FXX1(;6MGU^W$`E$~$DKYM*$HP03*nJmf`NC%?;G*R z;{L_EX`b}I9O;-1f2+?LH|7x+6S}4UJHsMR>*7fKy(hYpRBgINe+5e?y)Kxgs&0Y8(48MrSX2P9oOaWe(z>u{$B9iHx*?cx; zKc?Y(y)0ShXU4-OmG=AoTfjWJm}-7s)lDTawz80oJ4ax&F;{@0JKtFMHzOS6P_UUI zn~>9;-#4XuzppOQ4-*8=GWp04erCLE++*GGi4SKEa%6Ih88;jESnAFrGOSL9?0syu zjTfI`hmRv8>2T*(2b_gmJ!ipAo+~iZWMifY53|aVt#5}#I7p9XAm8Y8DKciKg8(C) zl`dL}>~#KW{3|$i+|B9hsJ}Nv))*uiOssSJ-#XP8bTU}?^_NWUG3%U0Nn;^N z{hM^?ZxV~>uzkuS2Tx|6KYn58j-K#tnreIW@sLHp6oxs2F$a2*ti}E(y_{oYybP=j zzerqTGwu_^z!;)oF><7!M`PH>_#m%2dWPq9u@D`_7`0t2G(?%>=MwmUEJAucvo2?0 zzBQNJd()y{h#8-cS43IK5g|7%GDv(r-pX_{PGsi4b2WS@4#lUAef(tgV~dY0#QsR& z;0l~OI{7yZ2h@?=uVa0Tg-AEH<`xY9-9}FrmM z=hLt^@F6kZqKt)mY)@3=AkSQ}Xk?M_X`VE0a~fmP;2eA&~9_0y}|kWH1cVg^md>{ckgw zA#m)R!#?j}83vbzZ-M0LYgT_mP@KfE!n;cT@7u$U5eoMh1p`o6hz$8=hs|piW_eB$ zOFGOoj5=i;wP|PJUM4$w+gm|zbH)JE*gV4k(|9&BMq?PP#Th)Gf}$R&JPV#V~B6bf07j|sig<#Npl zCF)&XqDOkou^u0NOqVB}=lmrM)8~^xverMx1%4PLB;w*#SP9(e7iKkqSUQ`=dKGSR znxb{rI2m-EcnXXkz_3mN>*O9rs#HhrV1I^^ZdLH|zpUb0iLIi?g1(>s*@+mQv!Ae)YPGRhu? zQrQWNdH$1(W%%zuPplmS3vv_f2>2w=h;;tFCP)l2sIdMSnz8X$Us}anTz?kREzhuyX&run47YzfS1O`6;Faz3Pv%{S$`!jBa`_T(m6rTu@KUc&VRx23+beDFvORRbTT+=1nDF((m62E zZ228uI>;Y9-eGjOb5!XlhDV1x|DK6-xO0?uY%p}Va{?PiImT@GCPn>CO8A?EvAU5Qd8{MG>VBP;K1~~US{h@@ z7GccHU;pu|?2lg`7=JO*G0qtz2A+(#7!rMqanj9THpA6}`8a1B&w!!J5j)L(r~DYB z98bbv|z zQay~6*#su2Vv(W4(j&P4_*###5+zAChUXFV<$Z3^A9YGw87m3?&(2$sQOg3?q@edluwhDY^8J6;&C~%^O zpI+cZzoI{}qF>RU3(>FWk6q|j^v4$Tt6wMn|H1;N@nZku0w>7{st8D&n*UwfG%6b> ztc)lAiK^KCv9@Vc20gw1Z>w!$)big}+w@Dxf1s&4eyI9v_)FH2tjp|)vM4))MU!PWmpZPUnp)ixf8 z{A0fwcT66xZ~GU;PNPbU)DC^{F$+~iQa*JaHn7WJGD(ND;;>*m>r}EeA<^JrP9oX z-(J}NyMAe0(USlh>oMF$o+`klemqWRfAjrcQ2&Ips>I*+Fw{WtV?&?)ZeS>f!X0vc z(-~@_@E{8@oy5PRf(q7w#H~|Z1GVlG%8Isdgk1j zxevA)lTCco{F*su=FIGwZ|ClQd(KHkacSy$@Uw**#MJ*NDPMHelMxd&HDu4wbb}KZ zg`!F=deqTTU(HS|E*zN}Bfng196I~`#Db4l^{siM*v?lLTfD6>F*jmfEMrq9Cg%Jf znTdVTr-zw%xP&V4%5%;`?2Gn>hp+3pV!p={815g!pz5*n8>gKru4_H|s<=d>&D zx&uZ{$VK`JkZpHXQ{!UCe(8Mr6!ae^iZ#P>c44iBMy6$V4cUYST{%6Ctjyy+!}|!4a=6<-BTCPHL(rGw8>mlS!F`C5-PH{r=tdo}80 ziA|{j%pP;Olh>l&th4D+$}x6YE@6Uw{Z(Q3rUda!831S19>LW}e|cNQDBHJ_z}|`D-|8 zj7=?{JB0q!u4S#S50D+&)eI$URR%(={#)2D%67SuvIbmW(|54VY>QEh#+FVL;J7fG zU++kbvIZ7OaPvPJ*3fe0TUlI* zbO#TkE>Gy3idQ5&+$2oMvOOd@^t~`KPMeUWdq{VrS&Vk7T+!|uet`XkQ`(C9>oVB) z)Jb~h7+ey5r}|=5$6>9mD%Ob|mGQUg1gtki8MNw?@G_g!g2T|C)H%}vE6pY4{5K!Wd~gkSLah&}r=>uHboV9SY#&JB zcc{&dPljc{#_)IlfO;<^y>NZ=vcOt)xK><6T@bEs|0yQ8;Pe8w>My@e)&xV~b{N)V zeKzVO{)PkA>sso;Fui+w+VOBEb-_k!rXJ(L_4zIsZB~`@8(mOjXn;p|l)T zO=wWJOG^(T@4_vJn*!<`x1p4kcSA-%ojT+Hg(foJf(p1+2tv=02PBpExo-a{Oy6w-QE>Gy3>p=+X@{@5>A)Q7o l2n!2mv;~QD(j6KuMoa(FcE=VZGYak~X!RhST`NqM-UDmq)CB+l diff --git a/tests/test_compute_funs.py b/tests/test_compute_funs.py index 53728cb180..52fab38dbe 100644 --- a/tests/test_compute_funs.py +++ b/tests/test_compute_funs.py @@ -68,8 +68,9 @@ def test_aliases(): # manual case primary_data = eq.compute("e_rho_rt") - alias_data = eq.compute("x_rrt") + alias_data = eq.compute(["x_rrt", "e_theta_rr"]) np.testing.assert_allclose(primary_data["e_rho_rt"], alias_data["x_rrt"]) + np.testing.assert_allclose(primary_data["e_rho_rt"], alias_data["e_theta_rr"]) @pytest.mark.unit From 02abf547afbf47068e9e268d337fdc58d99c2b8a Mon Sep 17 00:00:00 2001 From: unalmis Date: Sun, 23 Jun 2024 21:00:55 -0500 Subject: [PATCH 3/4] Add np.unique() before alias --- desc/compute/data_index.py | 2 +- tests/inputs/master_compute_data.pkl | Bin 7343881 -> 7343881 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/desc/compute/data_index.py b/desc/compute/data_index.py index e410ec99ad..0f09b089fc 100644 --- a/desc/compute/data_index.py +++ b/desc/compute/data_index.py @@ -145,7 +145,7 @@ def register_compute_fun( aliases_temp = np.append(np.array(aliases), find_permutations(name)) for alias in aliases: aliases_temp = np.append(aliases_temp, find_permutations(alias)) - aliases = aliases_temp + aliases = np.unique(aliases_temp) def _decorator(func): d = { diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index daff3e906ac455717587568053f0ba2bd934031b..bca18e29403139b143d562a4d48d64102484d94a 100644 GIT binary patch delta 3214 zcmcJRdr(x@8Nj`dU9P+Yxjf{ti@O-u%K1-)cWYlpb zqeZ;Cd?rp9NUCORs${5qX^54~#Kts?pazUaBNUxU>{LmNjnlE2es?cg$BA`1Y5(}0 zJ@cJ&zSsG_bGNCjmun*UM&6}q;nR4o$d=WT@wU)Y|HWI@*PNLxcTFr)D335xJU(&` z>clJQ@={Ke-{5A+Wt<=vu$AuLKz24`mEUJ)de$Ut-Qry4+{Y9shvbEvP9A1b&?a!ZB0k=MzK`2eB=(9(eoSob$v3s;vgWSFd8MYVO`+Gsu4}cUVps0; zFU78vAKntt=PEZW;)NdOir95#=j)Oz4T-EP$mP$(!4loF*seE+YE5veDqAn-&(of= zFqs8-e1N$s;z>Ih!QtO%XnduBsV?AL-}}OWxtbunf0X$`L@tdT6tS$6yDVbdHqCVr zAO4v=VdB`AEAfJfxg=s#H+xltj&f}@w2x}cUHzI3BAmIw2I4#4v27+8t5_g_-w(Wi zVe9!06YJuzd9LQ12@jsv^q8=%T>H6*f4jqx2bsyrcrIFVR+PoR`r+qG*dY;*?BU4M zowpQsvWs}yT~tLoSeF$@Q81SMgE=pHHaKHyLig5$H8^of6nk65z4h#6kv+&_#Xfda zs8zP&+z0`&mT0Do_nPn?b>me`%=VDH!6{Y<|yNzI69}=U+_RP zD&oWgiqcpgCGe}Ww4bVG`&|5ph%?V}pOAW;qCNz9gO(DI@wH-jF0G)@6j@4W>e9zN;6Y zu21Kd=WmD5jp36azaz{84C{k~xU9gi4fl%=7G7H5t9oZE9BwYLPG++;jdE^ z4#K+^BMKqEVj7Qi{<>HR%bgK<5;W%N!lBb8g~5Q}DS)+NnxASlBYAajYnjg^JfG`* z-vaHWKAtePUl$E0vTXXN7LXQFCD!Gscx_a+8Nsi_W_+~m?-n)UhdKIhsv$qxW`XkM z(PkXmr2i)^In8O^36cJ!AVpCy75thE613-f3-H_KsqSqV64)-Jl7AnhhC;71!dp3; zEk^E0>N6mcw-~T|=~Qp2)ju{H4rE(+7&ty7RFU1aaIRnaDrzHvGM9zqS+t}~pYTlC zm@OeWwdbaK5AJ;Dn4-3Bhv_$?mgDekW1!?XeI$yQM!bNhk3{>*tajYvhw+gDn$u!P zHKoM@jg`qdHQv+pF;9dcptR9scKe+Uy*?#EcX!OMwu3#-8V2p2aal_CcxcQ5`Q6-0pibX;Fp4BWG-=v7tk7Ug;x2UzaSfsC5<4yaLKp2~0 z7jSKD@%u(57pJup_uo@0@dcnf&4$FGl5iZ@v+~UVtlPD69mBfHpv7}-C^Y(%%u_C$ zs`}l4;HUPz!r|3B}a`9C>d8{%Vtmn#iV`QnVVj>*KlM8~+6OqbG^$K$X$0%+!(M7>xJB;LP-aSLnA8)j69puVUny7YfdfbyE0 zT!3|3em?)!^HVU?x7IP#w+@H;);~W5H&fNyw^r3Y%7I(t&Ve#}ZVr@pVa;a8g@Bjw RLO`8IIhER#&2@=~{{=Cv9e$KR$QP z{?0kS$M^is*)6*|xh(|m;yrvlpTRPv^*ING(+!{M#0!(M>;Gnwg85A81S3eLsw^f! z`W2U<{MyT=ONER^TA+%Nbgbx`uzFR)^9@^>9BBnRQhJM-?&};jLH&obMQJ&wmWo*| z)a?-bq<-E^z80}r%w&0e`0=%u_GJI2A*W$gLtR6nGir-7+Brd*&SbLAc@n3ZNsDLk z7J08A^>CTK(onQACE6NJFI{KN%mgWn%VC|8w3W9EC&U&*X!O*lpz~CbrZJy2;i)2K zxd;VL#vd%{xxO8VQ!a@ee_nP)>{uJsZtCDF2E-1>dpoTir#IddrGGsXVN*?E!VxRe zWYT!F!HkcO59I8r4F{Jm7l!{dF*!xpeVnN&0)7V*ih058MX_V^!HXhh)-m+$y3Jh> zv3LxBM$~#Dl>I(FN|BqL(RB?Sjj9VG%x&fb96Oo6A!1xS`>BZ9F7BL&;X7mx5oP>& zk=@PUmrM8oF>p7f;4PnhaRFSf;tGdqs$I*9nAXZtxI+&1pb4*h$hMeRj{(wjTqJ(x z;;)Ffpjl4m%9|7w3l^&WD57e+JpRiC?vjYcbt+nOKb<`<;=ly;2O=y#kR?FdyDFjM zEx0D))>q{1_%3Y;`YsWn)b^6JTa_RcPEld^+x#w(^#psPt~teD7SaD3o+9nyN!^_7~?5CY*#_!0g@01-$8 z5y3xbXnNvrw_NX9;LE4X!ls7p-=D=AbVay2=*4};;eE3 zYJ4zFKUnjmJYV0=)Ono`zNF7x&w5g1fhr;3wkZ|K^uY4?4jyc0)5-UV^r1u_Uy}&I z%O7z_*(#yATe0VBSpRfcjo8N>3ea8?pM=Rv1i-FT$&z z$E{xPKDjrZNFYYz$-TxPX(;y!9G#JvOuEy7gMQ^40bX;Cjlz(li60z;hj$W{9;O?;9pU`!su;+-v(|jwTM7C^H^h#ddEGlHDtz z3ZF?yx;QLh1ukkx8cGA}dXiJEXe&rQxgPB9lqevnGVl-mNugHG!zq%N0EOpaz3&`7 z7KSDV55?*XtP~WD_uE3ro08JZ9P4Q8EJ*gI80T(rrx0U^RN`sEOr#NGiE+d;#CT!? zF_B0oGKgo1Nkk@LA*@6ekxk?flZoeuDa2IbXGAVBjmRUW6EldJ#4IA8C?E=n*~Ifi z5m8K(5T)4SF3av^mcsSY@^K6&)iWbtOj)^(nXU|b1{_+jp03ic&LYLoR8}qu-v3$W z9Pbj@GEez`aL$)4jpgMclYp)pj#=R_nC1|0@v`z`aZDa2)R*_(fkF(_;qwhE*8xT2ob|Ccwt}_$ppS{gwe?l+g@+&HhE03E9c_lz z4b>6Q*ES~96HN$=Yvh(bn|Cdo7xSDL0xO)YK!+>$N zb-~JGh~q15w+vwZ#+Ii%xCbBDM`GVdyJILPb9ME2pf~TQ%P9hNb+!%BPwKL$-L}*p zwtsAo8Gh13&9Fqy|Wf zaQum*2Eb5*=&B6XCJ9^T=Vyyy<$?%UKuH8Z^TJajy?{#RL50+@39-Px5UxK zVXwupX0P|IBnK?sNxkH4`~P%pbj**uFmAdqbZK6=oAN*05dTQjwO26H+>I~KCl+Ai z%M0)PVCUzIRjNO#t9fUr@fC|wyfXS; Date: Sun, 23 Jun 2024 21:34:20 -0500 Subject: [PATCH 4/4] generalize alias to work with all derivatives of same coordinate system --- desc/compute/data_index.py | 11 ----------- tests/inputs/master_compute_data.pkl | Bin 7343881 -> 7756094 bytes 2 files changed, 11 deletions(-) diff --git a/desc/compute/data_index.py b/desc/compute/data_index.py index 0f09b089fc..328007c6f6 100644 --- a/desc/compute/data_index.py +++ b/desc/compute/data_index.py @@ -125,20 +125,9 @@ def register_compute_fun( } for kw in kwargs: allowed_kwargs.add(kw) - permutable_names = [ - "R_", - "Z_", - "phi_", - "lambda_", - "omega_", - "e_rho_", - "e_theta_", - "e_zeta_", - ] splits = name.rsplit("_", 1) if ( len(splits) > 1 - and splits[0] + "_" in permutable_names # Only look for permutations of partial derivatives of same coordinate system. and {"r", "t", "z"}.issuperset(splits[-1]) ): diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index bca18e29403139b143d562a4d48d64102484d94a..836a76b534bbe7f51e7455853e46cadf08947e86 100644 GIT binary patch delta 24814 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 delta 22024 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