From 42e6112e7d5460c80324d31db2a697e1dd84f7f7 Mon Sep 17 00:00:00 2001 From: unalmis Date: Sun, 30 Jun 2024 20:49:36 -0500 Subject: [PATCH 01/13] Genearlize PEST coordinate system compute funs to genearlized toroidal angle --- desc/compute/_basis_vectors.py | 114 +++++++++++++++++++++++---- desc/compute/_metric.py | 12 ++- tests/inputs/master_compute_data.pkl | Bin 7756094 -> 7868373 bytes tests/test_data_index.py | 15 +++- 4 files changed, 119 insertions(+), 22 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index d260ddee31..2f80757600 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1500,11 +1500,11 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): @register_compute_fun( - name="e_phi", - label="\\mathbf{e}_{\\phi}", + name="e_phi|r,t", + label="\\mathbf{e}_{\\phi} |_{\\rho, \\theta}", units="m", units_long="meters", - description="Covariant cylindrical toroidal basis vector", + description="Covariant toroidal basis vector in (ρ,θ,Φ) coordinates", dim=3, params=[], transforms={}, @@ -1516,12 +1516,41 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], basis="basis", + aliases=["e_phi"], + # Our usual notation implies e_phi = (∂X/∂Φ)|R,Z, but we need to alias e_phi to + # e_phi|r,t = (∂X/∂Φ)|R,Z for compatibility with older versions of the code. + # To instead compute (∂X/∂Φ)|R,Z, look at the quantity "e_phi|R,Z". ) -def _e_sub_phi(params, transforms, profiles, data, **kwargs): - # dX/dphi at const r,t = dX/dz * dz/dphi = dX/dz / (dphi/dz) - data["e_phi"] = (data["e_zeta"].T / data["phi_z"]).T +def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): + # (∂X/∂Φ)|ρ,θ = (∂X/∂ζ)|ρ,θ / (∂Φ/∂ζ)|ρ,θ + data["e_phi|r,t"] = (data["e_zeta"].T / data["phi_z"]).T if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_phi"] = rpz2xyz_vec(data["e_phi"], phi=data["phi"]) + data["e_phi|r,t"] = rpz2xyz_vec(data["e_phi|r,t"], phi=data["phi"]) + return data + + +@register_compute_fun( + name="e_phi|R,Z", + label="\\mathbf{e}_{\\phi} |_{R, Z}", + units="m", + units_long="meters", + description="Tangent vector along increasing cylindrical toroidal angle phi", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="rtz", + data=["R", "0", "phi"], + parameterization=[ + "desc.equilibrium.equilibrium.Equilibrium", + "desc.geometry.surface.FourierRZToroidalSurface", + ], + basis="basis", +) +def _e_sub_phi_RZ(params, transforms, profiles, data, **kwargs): + data["e_phi|R,Z"] = jnp.column_stack([data["0"], data["R"], data["0"]]) + if kwargs.get("basis", "rpz").lower() == "xyz": + data["e_phi|R,Z"] = rpz2xyz_vec(data["e_phi|R,Z"], phi=data["phi"]) return data @@ -2598,23 +2627,76 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="e_theta_PEST", - label="\\mathbf{e}_{\\theta_{PEST}}", + label="\\mathbf{e}_{\\vartheta} |_{\\rho, \\phi} = \\mathbf{e}_{\\theta_{PEST}}", units="m", units_long="meters", - description="Covariant straight field line (PEST) poloidal basis vector", + description="Covariant poloidal basis vector in (ρ,ϑ,Φ) coordinates" + " (Straight field line PEST coordinates. Φ increases counterclockwise" + " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=3, params=[], transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "theta_PEST_t", "phi"], - basis="basis", + data=["e_theta", "theta_PEST_t", "e_zeta", "theta_PEST_z", "phi_t", "phi_z"], + aliases=["e_vartheta"], ) -def _e_sub_theta_pest(params, transforms, profiles, data, **kwargs): - # dX/dv at const r,z = dX/dt * dt/dv / dX/dt / dv/dt - data["e_theta_PEST"] = (data["e_theta"].T / data["theta_PEST_t"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_PEST"] = rpz2xyz_vec(data["e_theta_PEST"], phi=data["phi"]) +def _e_sub_vartheta_rp(params, transforms, profiles, data, **kwargs): + # constant ρ and Φ + e_vartheta = ( + data["e_theta"].T * data["phi_z"] - data["e_zeta"].T * data["phi_t"] + ) / (data["theta_PEST_t"] * data["phi_z"] - data["theta_PEST_z"] * data["phi_t"]) + data["e_theta_PEST"] = e_vartheta.T + return data + + +@register_compute_fun( + name="e_phi|r,v", + label="\\mathbf{e}_{\\phi} |_{\\rho, \\vartheta}", + units="m", + units_long="meters", + description="Covariant toroidal basis vector in (ρ,ϑ,Φ) coordinates" + " (Straight field line PEST coordinates. Φ increases counterclockwise" + " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="rtz", + data=["e_theta", "theta_PEST_t", "e_zeta", "theta_PEST_z", "phi_t", "phi_z"], +) +def _e_sub_phi_rv(params, transforms, profiles, data, **kwargs): + # constant ρ and ϑ + e_phi = ( + data["e_zeta"].T * data["theta_PEST_t"] + - data["e_theta"].T * data["theta_PEST_z"] + ) / (data["theta_PEST_t"] * data["phi_z"] - data["theta_PEST_z"] * data["phi_t"]) + data["e_phi|r,v"] = e_phi.T + return data + + +@register_compute_fun( + name="e_rho|v,p", + label="\\mathbf{e}_{\\rho} |_{\\vartheta, \\phi}", + units="m", + units_long="meters", + description="Covariant radial basis vector in (ρ,ϑ,Φ) coordinates" + " (Straight field line PEST coordinates. Φ increases counterclockwise" + " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="rtz", + data=["e_rho", "e_vartheta", "e_phi|r,v", "theta_PEST_r", "phi_r"], +) +def _e_sub_rho_vp(params, transforms, profiles, data, **kwargs): + # constant ϑ and Φ + data["e_rho|v,p"] = ( + data["e_rho"].T + - data["e_vartheta"].T * data["theta_PEST_r"] + - data["e_phi|r,v"].T * data["phi_r"] + ).T return data diff --git a/desc/compute/_metric.py b/desc/compute/_metric.py index 42dd5c8218..1176c89671 100644 --- a/desc/compute/_metric.py +++ b/desc/compute/_metric.py @@ -40,17 +40,21 @@ def _sqrtg(params, transforms, profiles, data, **kwargs): label="\\sqrt{g}_{PEST}", units="m^{3}", units_long="cubic meters", - description="Jacobian determinant of PEST flux coordinate system", + description="Jacobian determinant of (ρ,ϑ,Φ) coordinate system. " + " (Straight field line PEST coordinates. Φ increases counterclockwise" + " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=1, params=[], transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_theta_PEST", "e_phi"], + data=["sqrt(g)", "theta_PEST_t", "phi_z", "theta_PEST_z", "phi_t"], ) def _sqrtg_pest(params, transforms, profiles, data, **kwargs): - data["sqrt(g)_PEST"] = dot( - data["e_rho"], cross(data["e_theta_PEST"], data["e_phi"]) + # Same as dot(data["e_rho|v,p"], cross(data["e_vartheta"], data["e_phi|r,v"])), but + # more efficient as it avoids computing radial derivatives of the stream functions. + data["sqrt(g)_PEST"] = data["sqrt(g)"] / ( + data["theta_PEST_t"] * data["phi_z"] - data["theta_PEST_z"] * data["phi_t"] ) return data diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index 836a76b534bbe7f51e7455853e46cadf08947e86..bb5714d878bcd019060d8ae6ab687ca50b15c794 100644 GIT binary patch delta 85555 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%0A@T?GYpvpy~f>w$5ncZ4eIA4DdnHu9-T#Pk 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 x=%Pwi^dNN#EO{(su3S!MtL delta 23660 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 EKR(d}yZ`_I diff --git a/tests/test_data_index.py b/tests/test_data_index.py index e3fd65a495..33ecaaafb7 100644 --- a/tests/test_data_index.py +++ b/tests/test_data_index.py @@ -8,6 +8,7 @@ import desc.compute from desc.compute import data_index from desc.compute.data_index import _class_inheritance +from desc.utils import errorif class TestDataIndex: @@ -39,6 +40,11 @@ def get_parameterization(fun, default="desc.equilibrium.equilibrium.Equilibrium" matches.discard("") return matches if matches else {default} + @staticmethod + def _is_function(func): + # JITed functions are not functions according to inspect. + return inspect.isfunction(func) or callable(func) + @pytest.mark.unit def test_data_index_deps(self): """Ensure developers do not add extra (or forget needed) dependencies. @@ -74,7 +80,7 @@ def test_data_index_deps(self): pattern_params = re.compile(r"params\[(.*?)]") for module_name, module in inspect.getmembers(desc.compute, inspect.ismodule): if module_name[0] == "_": - for _, fun in inspect.getmembers(module, inspect.isfunction): + for _, fun in inspect.getmembers(module, self._is_function): # quantities that this function computes names = self.get_matches(fun, pattern_names) # dependencies queried in source code of this function @@ -97,7 +103,6 @@ def test_data_index_deps(self): for p in data_index: for name, val in data_index[p].items(): - print(name) err_msg = f"Parameterization: {p}. Name: {name}." deps = val["dependencies"] data = set(deps["data"]) @@ -111,6 +116,12 @@ def test_data_index_deps(self): assert len(profiles) == len(deps["profiles"]), err_msg assert len(params) == len(deps["params"]), err_msg # assert correct dependencies are queried + errorif( + name not in queried_deps[p], + AssertionError, + "Did you reuse the function name (i.e. def_...) for" + f" '{name}' for some other quantity?", + ) assert queried_deps[p][name]["data"] == data | axis_limit_data, err_msg assert queried_deps[p][name]["profiles"] == profiles, err_msg assert queried_deps[p][name]["params"] == params, err_msg From b65351a48ee1c725d68a44ab972f06693dd00c8c Mon Sep 17 00:00:00 2001 From: unalmis Date: Sun, 30 Jun 2024 21:19:12 -0500 Subject: [PATCH 02/13] BUGFIX: don't change basis to xyz erroneously assuming input is in rpz --- desc/compute/_basis_vectors.py | 153 ++++----------------------------- tests/test_compute_funs.py | 14 +++ 2 files changed, 30 insertions(+), 137 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index 2f80757600..93e0d9a31f 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -27,13 +27,10 @@ transforms={}, profiles=[], coordinates="rtz", - data=["B", "|B|", "phi"], - basis="basis", + data=["B", "|B|"], ) def _b(params, transforms, profiles, data, **kwargs): data["b"] = (data["B"].T / data["|B|"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["b"] = rpz2xyz_vec(data["b"], phi=data["phi"]) return data @@ -48,15 +45,12 @@ def _b(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta/sqrt(g)", "e_zeta", "phi"], - basis="basis", + data=["e_theta/sqrt(g)", "e_zeta"], ) def _e_sup_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"] = cross(data["e_theta/sqrt(g)"], data["e_zeta"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho"] = rpz2xyz_vec(data["e^rho"], phi=data["phi"]) return data @@ -71,9 +65,8 @@ def _e_sup_rho(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_r", "e_zeta_r", "sqrt(g)", "sqrt(g)_r", "phi"], + data=["e_theta", "e_zeta", "e_theta_r", "e_zeta_r", "sqrt(g)", "sqrt(g)_r"], axis_limit_data=["e_theta_rr", "sqrt(g)_rr"], - basis="basis", ) def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): a = cross(data["e_theta_r"], data["e_zeta"]) @@ -94,8 +87,6 @@ def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): - a.T * safediv(data["sqrt(g)_rr"], (2 * data["sqrt(g)_r"] ** 2)) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_r"] = rpz2xyz_vec(data["e^rho_r"], phi=data["phi"]) return data @@ -121,9 +112,7 @@ def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -148,8 +137,6 @@ def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rr"] = rpz2xyz_vec(data["e^rho_rr"], phi=data["phi"]) return data @@ -178,9 +165,7 @@ def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -207,8 +192,6 @@ def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rt"] = rpz2xyz_vec(data["e^rho_rt"], phi=data["phi"]) return data @@ -237,9 +220,7 @@ def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -266,8 +247,6 @@ def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rz"] = rpz2xyz_vec(data["e^rho_rz"], phi=data["phi"]) return data @@ -282,9 +261,8 @@ def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_t", "e_zeta_t", "sqrt(g)", "sqrt(g)_t", "phi"], + data=["e_theta", "e_zeta", "e_theta_t", "e_zeta_t", "sqrt(g)", "sqrt(g)_t"], axis_limit_data=["e_theta_r", "e_theta_rt", "sqrt(g)_r", "sqrt(g)_rt"], - basis="basis", ) def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): data["e^rho_t"] = transforms["grid"].replace_at_axis( @@ -309,8 +287,6 @@ def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): ) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_t"] = rpz2xyz_vec(data["e^rho_t"], phi=data["phi"]) return data @@ -336,9 +312,7 @@ def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -363,8 +337,6 @@ def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_tt"] = rpz2xyz_vec(data["e^rho_tt"], phi=data["phi"]) return data @@ -393,9 +365,7 @@ def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -422,8 +392,6 @@ def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_tz"] = rpz2xyz_vec(data["e^rho_tz"], phi=data["phi"]) return data @@ -438,9 +406,8 @@ def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_z", "e_zeta_z", "sqrt(g)", "sqrt(g)_z", "phi"], + data=["e_theta", "e_zeta", "e_theta_z", "e_zeta_z", "sqrt(g)", "sqrt(g)_z"], axis_limit_data=["e_theta_r", "e_theta_rz", "sqrt(g)_r", "sqrt(g)_rz"], - basis="basis", ) def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): data["e^rho_z"] = transforms["grid"].replace_at_axis( @@ -467,8 +434,6 @@ def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rz"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_z"] = rpz2xyz_vec(data["e^rho_z"], phi=data["phi"]) return data @@ -494,9 +459,7 @@ def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -521,8 +484,6 @@ def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_zz"] = rpz2xyz_vec(data["e^rho_zz"], phi=data["phi"]) return data @@ -537,13 +498,10 @@ def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e^theta*sqrt(g)", "sqrt(g)", "phi"], - basis="basis", + data=["e^theta*sqrt(g)", "sqrt(g)"], ) def _e_sup_theta(params, transforms, profiles, data, **kwargs): data["e^theta"] = (data["e^theta*sqrt(g)"].T / data["sqrt(g)"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta"] = rpz2xyz_vec(data["e^theta"], phi=data["phi"]) return data @@ -558,19 +516,16 @@ def _e_sup_theta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_zeta", "phi"], + data=["e_rho", "e_zeta"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.core.Surface", ], - basis="basis", ) def _e_sup_theta_times_sqrt_g(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose # image is the set { 𝐞^θ √g | ρ=0 }. data["e^theta*sqrt(g)"] = cross(data["e_zeta"], data["e_rho"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta*sqrt(g)"] = rpz2xyz_vec(data["e^theta*sqrt(g)"], phi=data["phi"]) return data @@ -585,8 +540,7 @@ def _e_sup_theta_times_sqrt_g(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_r", "e_rho_r", "sqrt(g)", "sqrt(g)_r", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_r", "e_rho_r", "sqrt(g)", "sqrt(g)_r"], ) def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): data["e^theta_r"] = ( @@ -599,8 +553,6 @@ def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_r"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_r"] = rpz2xyz_vec(data["e^theta_r"], phi=data["phi"]) return data @@ -626,9 +578,7 @@ def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -653,9 +603,6 @@ def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rr"] = rpz2xyz_vec(data["e^theta_rr"], phi=data["phi"]) - return data @@ -684,9 +631,7 @@ def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -713,8 +658,6 @@ def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rt"] = rpz2xyz_vec(data["e^theta_rt"], phi=data["phi"]) return data @@ -743,9 +686,7 @@ def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -772,8 +713,6 @@ def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rz"] = rpz2xyz_vec(data["e^theta_rz"], phi=data["phi"]) return data @@ -789,8 +728,7 @@ def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_t", "e_rho_t", "sqrt(g)", "sqrt(g)_t", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_t", "e_rho_t", "sqrt(g)", "sqrt(g)_t"], ) def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): data["e^theta_t"] = ( @@ -803,8 +741,6 @@ def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_t"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_t"] = rpz2xyz_vec(data["e^theta_t"], phi=data["phi"]) return data @@ -830,9 +766,7 @@ def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -857,8 +791,6 @@ def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_tt"] = rpz2xyz_vec(data["e^theta_tt"], phi=data["phi"]) return data @@ -887,9 +819,7 @@ def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -916,8 +846,6 @@ def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_tz"] = rpz2xyz_vec(data["e^theta_tz"], phi=data["phi"]) return data @@ -933,8 +861,7 @@ def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_z", "e_rho_z", "sqrt(g)", "sqrt(g)_z", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_z", "e_rho_z", "sqrt(g)", "sqrt(g)_z"], ) def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): data["e^theta_z"] = ( @@ -947,8 +874,6 @@ def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_z"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_z"] = rpz2xyz_vec(data["e^theta_z"], phi=data["phi"]) return data @@ -974,9 +899,7 @@ def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -1001,8 +924,6 @@ def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_zz"] = rpz2xyz_vec(data["e^theta_zz"], phi=data["phi"]) return data @@ -1017,15 +938,12 @@ def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_theta/sqrt(g)", "phi"], - basis="basis", + data=["e_rho", "e_theta/sqrt(g)"], ) def _e_sup_zeta(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose # image is the set { 𝐞^ζ | ρ=0 }. data["e^zeta"] = cross(data["e_rho"], data["e_theta/sqrt(g)"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta"] = rpz2xyz_vec(data["e^zeta"], phi=data["phi"]) return data @@ -1040,9 +958,8 @@ def _e_sup_zeta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_r", "e_theta", "e_theta_r", "sqrt(g)", "sqrt(g)_r", "phi"], + data=["e_rho", "e_rho_r", "e_theta", "e_theta_r", "sqrt(g)", "sqrt(g)_r"], axis_limit_data=["e_theta_rr", "sqrt(g)_rr"], - basis="basis", ) def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): b = cross(data["e_rho"], data["e_theta_r"]) @@ -1063,8 +980,6 @@ def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): - b.T * safediv(data["sqrt(g)_rr"], (2 * data["sqrt(g)_r"] ** 2)) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_r"] = rpz2xyz_vec(data["e^zeta_r"], phi=data["phi"]) return data @@ -1090,9 +1005,7 @@ def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1117,8 +1030,6 @@ def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rr"] = rpz2xyz_vec(data["e^zeta_rr"], phi=data["phi"]) return data @@ -1147,9 +1058,7 @@ def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1176,8 +1085,6 @@ def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rt"] = rpz2xyz_vec(data["e^zeta_rt"], phi=data["phi"]) return data @@ -1206,9 +1113,7 @@ def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1235,8 +1140,6 @@ def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rz"] = rpz2xyz_vec(data["e^zeta_rz"], phi=data["phi"]) return data @@ -1252,9 +1155,8 @@ def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_t", "e_theta", "e_theta_t", "sqrt(g)", "sqrt(g)_t", "phi"], + data=["e_rho", "e_rho_t", "e_theta", "e_theta_t", "sqrt(g)", "sqrt(g)_t"], axis_limit_data=["e_theta_r", "e_theta_rt", "sqrt(g)_r", "sqrt(g)_rt"], - basis="basis", ) def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): data["e^zeta_t"] = transforms["grid"].replace_at_axis( @@ -1281,8 +1183,6 @@ def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rt"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_t"] = rpz2xyz_vec(data["e^zeta_t"], phi=data["phi"]) return data @@ -1308,9 +1208,7 @@ def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1335,8 +1233,6 @@ def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_tt"] = rpz2xyz_vec(data["e^zeta_tt"], phi=data["phi"]) return data @@ -1365,9 +1261,7 @@ def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1394,8 +1288,6 @@ def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_tz"] = rpz2xyz_vec(data["e^zeta_tz"], phi=data["phi"]) return data @@ -1411,9 +1303,8 @@ def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_z", "e_theta", "e_theta_z", "sqrt(g)", "sqrt(g)_z", "phi"], + data=["e_rho", "e_rho_z", "e_theta", "e_theta_z", "sqrt(g)", "sqrt(g)_z"], axis_limit_data=["e_theta_r", "e_theta_rz", "sqrt(g)_r", "sqrt(g)_rz"], - basis="basis", ) def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): data["e^zeta_z"] = transforms["grid"].replace_at_axis( @@ -1440,8 +1331,6 @@ def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rz"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_z"] = rpz2xyz_vec(data["e^zeta_z"], phi=data["phi"]) return data @@ -1467,9 +1356,7 @@ def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1494,8 +1381,6 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_zz"] = rpz2xyz_vec(data["e^zeta_zz"], phi=data["phi"]) return data @@ -1510,12 +1395,11 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "phi_z", "phi"], + data=["e_zeta", "phi_z"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], - basis="basis", aliases=["e_phi"], # Our usual notation implies e_phi = (∂X/∂Φ)|R,Z, but we need to alias e_phi to # e_phi|r,t = (∂X/∂Φ)|R,Z for compatibility with older versions of the code. @@ -1524,8 +1408,6 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): # (∂X/∂Φ)|ρ,θ = (∂X/∂ζ)|ρ,θ / (∂Φ/∂ζ)|ρ,θ data["e_phi|r,t"] = (data["e_zeta"].T / data["phi_z"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_phi|r,t"] = rpz2xyz_vec(data["e_phi|r,t"], phi=data["phi"]) return data @@ -2609,9 +2491,8 @@ def _e_sub_theta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "sqrt(g)", "phi"], + data=["e_theta", "sqrt(g)"], axis_limit_data=["e_theta_r", "sqrt(g)_r"], - basis="basis", ) def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose @@ -2620,8 +2501,6 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): safediv(data["e_theta"].T, data["sqrt(g)"]).T, lambda: safediv(data["e_theta_r"].T, data["sqrt(g)_r"]).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta/sqrt(g)"] = rpz2xyz_vec(data["e_theta/sqrt(g)"], phi=data["phi"]) return data diff --git a/tests/test_compute_funs.py b/tests/test_compute_funs.py index 52fab38dbe..12fd0e0f18 100644 --- a/tests/test_compute_funs.py +++ b/tests/test_compute_funs.py @@ -1683,3 +1683,17 @@ def test_surface_equilibrium_geometry(): rtol=3e-13, atol=1e-13, ) + + +@pytest.mark.unit +def test_basis_kwarg(): + """Test that we don't change basis to xyz erroneously assuming input is in rpz.""" + eq = get("W7-X") + names = ["b", "e^rho", "e_theta_PEST", "phi"] + data_rpz = eq.compute(names) + data_xyz = eq.compute(names, basis="xyz") + for name in names: + if name != "phi": + np.testing.assert_allclose( + rpz2xyz_vec(data_rpz[name], phi=data_rpz["phi"]), data_xyz[name] + ) From 4c4553afa7821ad51ae8cd625bea17d542d4531c Mon Sep 17 00:00:00 2001 From: unalmis Date: Sun, 30 Jun 2024 21:19:12 -0500 Subject: [PATCH 03/13] BUGFIX: don't change basis to xyz erroneously assuming input is in rpz --- desc/compute/_basis_vectors.py | 154 ++++----------------------------- tests/test_compute_funs.py | 14 +++ 2 files changed, 30 insertions(+), 138 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index d260ddee31..e984cad2be 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -27,13 +27,10 @@ transforms={}, profiles=[], coordinates="rtz", - data=["B", "|B|", "phi"], - basis="basis", + data=["B", "|B|"], ) def _b(params, transforms, profiles, data, **kwargs): data["b"] = (data["B"].T / data["|B|"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["b"] = rpz2xyz_vec(data["b"], phi=data["phi"]) return data @@ -48,15 +45,12 @@ def _b(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta/sqrt(g)", "e_zeta", "phi"], - basis="basis", + data=["e_theta/sqrt(g)", "e_zeta"], ) def _e_sup_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"] = cross(data["e_theta/sqrt(g)"], data["e_zeta"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho"] = rpz2xyz_vec(data["e^rho"], phi=data["phi"]) return data @@ -71,9 +65,8 @@ def _e_sup_rho(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_r", "e_zeta_r", "sqrt(g)", "sqrt(g)_r", "phi"], + data=["e_theta", "e_zeta", "e_theta_r", "e_zeta_r", "sqrt(g)", "sqrt(g)_r"], axis_limit_data=["e_theta_rr", "sqrt(g)_rr"], - basis="basis", ) def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): a = cross(data["e_theta_r"], data["e_zeta"]) @@ -94,8 +87,6 @@ def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): - a.T * safediv(data["sqrt(g)_rr"], (2 * data["sqrt(g)_r"] ** 2)) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_r"] = rpz2xyz_vec(data["e^rho_r"], phi=data["phi"]) return data @@ -121,9 +112,7 @@ def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -148,8 +137,6 @@ def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rr"] = rpz2xyz_vec(data["e^rho_rr"], phi=data["phi"]) return data @@ -178,9 +165,7 @@ def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -207,8 +192,6 @@ def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rt"] = rpz2xyz_vec(data["e^rho_rt"], phi=data["phi"]) return data @@ -237,9 +220,7 @@ def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -266,8 +247,6 @@ def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_rz"] = rpz2xyz_vec(data["e^rho_rz"], phi=data["phi"]) return data @@ -282,9 +261,8 @@ def _e_sup_rho_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_t", "e_zeta_t", "sqrt(g)", "sqrt(g)_t", "phi"], + data=["e_theta", "e_zeta", "e_theta_t", "e_zeta_t", "sqrt(g)", "sqrt(g)_t"], axis_limit_data=["e_theta_r", "e_theta_rt", "sqrt(g)_r", "sqrt(g)_rt"], - basis="basis", ) def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): data["e^rho_t"] = transforms["grid"].replace_at_axis( @@ -309,8 +287,6 @@ def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): ) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_t"] = rpz2xyz_vec(data["e^rho_t"], phi=data["phi"]) return data @@ -336,9 +312,7 @@ def _e_sup_rho_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -363,8 +337,6 @@ def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_tt"] = rpz2xyz_vec(data["e^rho_tt"], phi=data["phi"]) return data @@ -393,9 +365,7 @@ def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -422,8 +392,6 @@ def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_tz"] = rpz2xyz_vec(data["e^rho_tz"], phi=data["phi"]) return data @@ -438,9 +406,8 @@ def _e_sup_rho_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "e_zeta", "e_theta_z", "e_zeta_z", "sqrt(g)", "sqrt(g)_z", "phi"], + data=["e_theta", "e_zeta", "e_theta_z", "e_zeta_z", "sqrt(g)", "sqrt(g)_z"], axis_limit_data=["e_theta_r", "e_theta_rz", "sqrt(g)_r", "sqrt(g)_rz"], - basis="basis", ) def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): data["e^rho_z"] = transforms["grid"].replace_at_axis( @@ -467,8 +434,6 @@ def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rz"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_z"] = rpz2xyz_vec(data["e^rho_z"], phi=data["phi"]) return data @@ -494,9 +459,7 @@ def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_theta"], data["e_zeta"]) @@ -521,8 +484,6 @@ def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^rho_zz"] = rpz2xyz_vec(data["e^rho_zz"], phi=data["phi"]) return data @@ -537,13 +498,10 @@ def _e_sup_rho_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e^theta*sqrt(g)", "sqrt(g)", "phi"], - basis="basis", + data=["e^theta*sqrt(g)", "sqrt(g)"], ) def _e_sup_theta(params, transforms, profiles, data, **kwargs): data["e^theta"] = (data["e^theta*sqrt(g)"].T / data["sqrt(g)"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta"] = rpz2xyz_vec(data["e^theta"], phi=data["phi"]) return data @@ -558,19 +516,16 @@ def _e_sup_theta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_zeta", "phi"], + data=["e_rho", "e_zeta"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.core.Surface", ], - basis="basis", ) def _e_sup_theta_times_sqrt_g(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose # image is the set { 𝐞^θ √g | ρ=0 }. data["e^theta*sqrt(g)"] = cross(data["e_zeta"], data["e_rho"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta*sqrt(g)"] = rpz2xyz_vec(data["e^theta*sqrt(g)"], phi=data["phi"]) return data @@ -585,8 +540,7 @@ def _e_sup_theta_times_sqrt_g(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_r", "e_rho_r", "sqrt(g)", "sqrt(g)_r", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_r", "e_rho_r", "sqrt(g)", "sqrt(g)_r"], ) def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): data["e^theta_r"] = ( @@ -599,8 +553,6 @@ def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_r"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_r"] = rpz2xyz_vec(data["e^theta_r"], phi=data["phi"]) return data @@ -626,9 +578,7 @@ def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -653,9 +603,6 @@ def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rr"] = rpz2xyz_vec(data["e^theta_rr"], phi=data["phi"]) - return data @@ -684,9 +631,7 @@ def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -713,8 +658,6 @@ def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rt"] = rpz2xyz_vec(data["e^theta_rt"], phi=data["phi"]) return data @@ -743,9 +686,7 @@ def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -772,8 +713,6 @@ def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_rz"] = rpz2xyz_vec(data["e^theta_rz"], phi=data["phi"]) return data @@ -789,8 +728,7 @@ def _e_sup_theta_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_t", "e_rho_t", "sqrt(g)", "sqrt(g)_t", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_t", "e_rho_t", "sqrt(g)", "sqrt(g)_t"], ) def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): data["e^theta_t"] = ( @@ -803,8 +741,6 @@ def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_t"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_t"] = rpz2xyz_vec(data["e^theta_t"], phi=data["phi"]) return data @@ -830,9 +766,7 @@ def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -857,8 +791,6 @@ def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_tt"] = rpz2xyz_vec(data["e^theta_tt"], phi=data["phi"]) return data @@ -887,9 +819,7 @@ def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -916,8 +846,6 @@ def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_tz"] = rpz2xyz_vec(data["e^theta_tz"], phi=data["phi"]) return data @@ -933,8 +861,7 @@ def _e_sup_theta_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "e_rho", "e_zeta_z", "e_rho_z", "sqrt(g)", "sqrt(g)_z", "phi"], - basis="basis", + data=["e_zeta", "e_rho", "e_zeta_z", "e_rho_z", "sqrt(g)", "sqrt(g)_z"], ) def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): data["e^theta_z"] = ( @@ -947,8 +874,6 @@ def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_z"] / data["sqrt(g)"] ** 2 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_z"] = rpz2xyz_vec(data["e^theta_z"], phi=data["phi"]) return data @@ -974,9 +899,7 @@ def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_zeta"], data["e_rho"]) @@ -1001,8 +924,6 @@ def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^theta_zz"] = rpz2xyz_vec(data["e^theta_zz"], phi=data["phi"]) return data @@ -1017,15 +938,12 @@ def _e_sup_theta_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_theta/sqrt(g)", "phi"], - basis="basis", + data=["e_rho", "e_theta/sqrt(g)"], ) def _e_sup_zeta(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose # image is the set { 𝐞^ζ | ρ=0 }. data["e^zeta"] = cross(data["e_rho"], data["e_theta/sqrt(g)"]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta"] = rpz2xyz_vec(data["e^zeta"], phi=data["phi"]) return data @@ -1040,9 +958,8 @@ def _e_sup_zeta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_r", "e_theta", "e_theta_r", "sqrt(g)", "sqrt(g)_r", "phi"], + data=["e_rho", "e_rho_r", "e_theta", "e_theta_r", "sqrt(g)", "sqrt(g)_r"], axis_limit_data=["e_theta_rr", "sqrt(g)_rr"], - basis="basis", ) def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): b = cross(data["e_rho"], data["e_theta_r"]) @@ -1063,8 +980,6 @@ def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): - b.T * safediv(data["sqrt(g)_rr"], (2 * data["sqrt(g)_r"] ** 2)) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_r"] = rpz2xyz_vec(data["e^zeta_r"], phi=data["phi"]) return data @@ -1090,9 +1005,7 @@ def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_r", "sqrt(g)_rr", - "phi", ], - basis="basis", ) def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1117,8 +1030,6 @@ def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_r"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rr"] = rpz2xyz_vec(data["e^zeta_rr"], phi=data["phi"]) return data @@ -1147,9 +1058,7 @@ def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rt", "sqrt(g)_t", - "phi", ], - basis="basis", ) def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1176,8 +1085,6 @@ def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rt"] = rpz2xyz_vec(data["e^zeta_rt"], phi=data["phi"]) return data @@ -1206,9 +1113,7 @@ def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): "sqrt(g)_r", "sqrt(g)_rz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1235,8 +1140,6 @@ def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_r"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_rz"] = rpz2xyz_vec(data["e^zeta_rz"], phi=data["phi"]) return data @@ -1252,9 +1155,8 @@ def _e_sup_zeta_rz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_t", "e_theta", "e_theta_t", "sqrt(g)", "sqrt(g)_t", "phi"], + data=["e_rho", "e_rho_t", "e_theta", "e_theta_t", "sqrt(g)", "sqrt(g)_t"], axis_limit_data=["e_theta_r", "e_theta_rt", "sqrt(g)_r", "sqrt(g)_rt"], - basis="basis", ) def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): data["e^zeta_t"] = transforms["grid"].replace_at_axis( @@ -1281,8 +1183,6 @@ def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rt"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_t"] = rpz2xyz_vec(data["e^zeta_t"], phi=data["phi"]) return data @@ -1308,9 +1208,7 @@ def _e_sup_zeta_t(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_t", "sqrt(g)_tt", - "phi", ], - basis="basis", ) def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1335,8 +1233,6 @@ def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_t"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_tt"] = rpz2xyz_vec(data["e^zeta_tt"], phi=data["phi"]) return data @@ -1365,9 +1261,7 @@ def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): "sqrt(g)_t", "sqrt(g)_tz", "sqrt(g)_z", - "phi", ], - basis="basis", ) def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1394,8 +1288,6 @@ def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_t"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_tz"] = rpz2xyz_vec(data["e^zeta_tz"], phi=data["phi"]) return data @@ -1411,9 +1303,8 @@ def _e_sup_zeta_tz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_rho", "e_rho_z", "e_theta", "e_theta_z", "sqrt(g)", "sqrt(g)_z", "phi"], + data=["e_rho", "e_rho_z", "e_theta", "e_theta_z", "sqrt(g)", "sqrt(g)_z"], axis_limit_data=["e_theta_r", "e_theta_rz", "sqrt(g)_r", "sqrt(g)_rz"], - basis="basis", ) def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): data["e^zeta_z"] = transforms["grid"].replace_at_axis( @@ -1440,8 +1331,6 @@ def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): * safediv(data["sqrt(g)_rz"], data["sqrt(g)_r"] ** 2) ).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_z"] = rpz2xyz_vec(data["e^zeta_z"], phi=data["phi"]) return data @@ -1467,9 +1356,7 @@ def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): "sqrt(g)", "sqrt(g)_z", "sqrt(g)_zz", - "phi", ], - basis="basis", ) def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): temp = cross(data["e_rho"], data["e_theta"]) @@ -1494,8 +1381,6 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): / data["sqrt(g)"] ** 2 + 2 * temp.T * data["sqrt(g)_z"] * data["sqrt(g)_z"] / data["sqrt(g)"] ** 3 ).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e^zeta_zz"] = rpz2xyz_vec(data["e^zeta_zz"], phi=data["phi"]) return data @@ -1510,19 +1395,15 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_zeta", "phi_z", "phi"], + data=["e_zeta", "phi_z"], parameterization=[ "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], - basis="basis", ) def _e_sub_phi(params, transforms, profiles, data, **kwargs): # dX/dphi at const r,t = dX/dz * dz/dphi = dX/dz / (dphi/dz) data["e_phi"] = (data["e_zeta"].T / data["phi_z"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_phi"] = rpz2xyz_vec(data["e_phi"], phi=data["phi"]) - return data @register_compute_fun( @@ -2580,9 +2461,8 @@ def _e_sub_theta(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "sqrt(g)", "phi"], + data=["e_theta", "sqrt(g)"], axis_limit_data=["e_theta_r", "sqrt(g)_r"], - basis="basis", ) def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): # At the magnetic axis, this function returns the multivalued map whose @@ -2591,8 +2471,6 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): safediv(data["e_theta"].T, data["sqrt(g)"]).T, lambda: safediv(data["e_theta_r"].T, data["sqrt(g)_r"]).T, ) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta/sqrt(g)"] = rpz2xyz_vec(data["e_theta/sqrt(g)"], phi=data["phi"]) return data diff --git a/tests/test_compute_funs.py b/tests/test_compute_funs.py index 52fab38dbe..12fd0e0f18 100644 --- a/tests/test_compute_funs.py +++ b/tests/test_compute_funs.py @@ -1683,3 +1683,17 @@ def test_surface_equilibrium_geometry(): rtol=3e-13, atol=1e-13, ) + + +@pytest.mark.unit +def test_basis_kwarg(): + """Test that we don't change basis to xyz erroneously assuming input is in rpz.""" + eq = get("W7-X") + names = ["b", "e^rho", "e_theta_PEST", "phi"] + data_rpz = eq.compute(names) + data_xyz = eq.compute(names, basis="xyz") + for name in names: + if name != "phi": + np.testing.assert_allclose( + rpz2xyz_vec(data_rpz[name], phi=data_rpz["phi"]), data_xyz[name] + ) From a145e6f50de4187ce3d16eb0c130eb0e78c5f1f2 Mon Sep 17 00:00:00 2001 From: unalmis Date: Mon, 1 Jul 2024 00:37:06 -0500 Subject: [PATCH 04/13] Fix issue with merge --- desc/compute/_basis_vectors.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index e984cad2be..150946f98d 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1404,6 +1404,7 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): def _e_sub_phi(params, transforms, profiles, data, **kwargs): # dX/dphi at const r,t = dX/dz * dz/dphi = dX/dz / (dphi/dz) data["e_phi"] = (data["e_zeta"].T / data["phi_z"]).T + return data @register_compute_fun( @@ -2485,14 +2486,11 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="rtz", - data=["e_theta", "theta_PEST_t", "phi"], - basis="basis", + data=["e_theta", "theta_PEST_t"], ) def _e_sub_theta_pest(params, transforms, profiles, data, **kwargs): # dX/dv at const r,z = dX/dt * dt/dv / dX/dt / dv/dt data["e_theta_PEST"] = (data["e_theta"].T / data["theta_PEST_t"]).T - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_theta_PEST"] = rpz2xyz_vec(data["e_theta_PEST"], phi=data["phi"]) return data From 455a9a3bc5f4796abd413c7adeb9d956c39462a4 Mon Sep 17 00:00:00 2001 From: unalmis Date: Mon, 1 Jul 2024 01:36:25 -0500 Subject: [PATCH 05/13] Fix issue with merge --- desc/compute/_basis_vectors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index 93e0d9a31f..a5d0c4ac42 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1402,7 +1402,7 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): ], aliases=["e_phi"], # Our usual notation implies e_phi = (∂X/∂Φ)|R,Z, but we need to alias e_phi to - # e_phi|r,t = (∂X/∂Φ)|R,Z for compatibility with older versions of the code. + # e_phi|r,t = (∂X/∂Φ)|ρ,θ for compatibility with older versions of the code. # To instead compute (∂X/∂Φ)|R,Z, look at the quantity "e_phi|R,Z". ) def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): From 031d29eeaafd87060a911da94201890c3c12f86f Mon Sep 17 00:00:00 2001 From: unalmis Date: Mon, 1 Jul 2024 11:44:54 -0500 Subject: [PATCH 06/13] Add guards to compute funs that should be fixed in GitHub pull request #1027 --- desc/compute/_curve.py | 2 ++ desc/compute/_equil.py | 6 ++++++ desc/compute/_field.py | 4 ++++ desc/compute/_geometry.py | 4 ++++ desc/compute/_surface.py | 5 +++++ 5 files changed, 21 insertions(+) diff --git a/desc/compute/_curve.py b/desc/compute/_curve.py index b68b8f2d99..e50abcf713 100644 --- a/desc/compute/_curve.py +++ b/desc/compute/_curve.py @@ -2,6 +2,7 @@ from desc.backend import jnp +from ..utils import errorif from .data_index import register_compute_fun from .geom_utils import rotation_matrix, rpz2xyz, rpz2xyz_vec, xyz2rpz, xyz2rpz_vec from .utils import cross, dot, safenormalize @@ -156,6 +157,7 @@ def _phi_Curve(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Curve", ) def _Z_Curve(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) data["Z"] = data["x"][:, 2] return data diff --git a/desc/compute/_equil.py b/desc/compute/_equil.py index 8baf22e0a5..25ee0664c4 100644 --- a/desc/compute/_equil.py +++ b/desc/compute/_equil.py @@ -13,6 +13,7 @@ from desc.backend import jnp +from ..utils import errorif from .data_index import register_compute_fun from .utils import cross, dot, safediv, safenorm, surface_averages @@ -231,6 +232,7 @@ def _J_sqrt_g_r(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_R(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["J_R"] = data["J"][:, 0] return data @@ -249,6 +251,7 @@ def _J_R(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_phi(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["J_phi"] = data["J"][:, 1] return data @@ -267,6 +270,7 @@ def _J_phi(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_Z(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) data["J_Z"] = data["J"][:, 2] return data @@ -677,6 +681,7 @@ def _W_B(params, transforms, profiles, data, **kwargs): data=["B", "sqrt(g)"], ) def _W_Bpol(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["W_Bpol"] = jnp.sum( dot(data["B"][:, (0, 2)], data["B"][:, (0, 2)]) * data["sqrt(g)"] @@ -699,6 +704,7 @@ def _W_Bpol(params, transforms, profiles, data, **kwargs): data=["B", "sqrt(g)"], ) def _W_Btor(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["W_Btor"] = jnp.sum( data["B"][:, 1] ** 2 * data["sqrt(g)"] * transforms["grid"].weights ) / (2 * mu_0) diff --git a/desc/compute/_field.py b/desc/compute/_field.py index 6285fd9c92..35e5849350 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -13,6 +13,7 @@ from desc.backend import jnp +from ..utils import errorif from .data_index import register_compute_fun from .utils import ( cross, @@ -140,6 +141,7 @@ def _B(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_R(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["B_R"] = data["B"][:, 0] return data @@ -158,6 +160,7 @@ def _B_R(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_phi(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["B_phi"] = data["B"][:, 1] return data @@ -176,6 +179,7 @@ def _B_phi(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_Z(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) data["B_Z"] = data["B"][:, 2] return data diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index d9d736aa95..813cfe176c 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -11,6 +11,7 @@ from desc.backend import jnp +from ..utils import errorif from .data_index import register_compute_fun from .utils import cross, dot, line_integrals, surface_integrals @@ -48,6 +49,7 @@ def _V(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.surface.FourierRZToroidalSurface", ) def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V"] = jnp.max( # take max in case there are multiple surfaces for some reason jnp.abs( @@ -75,6 +77,7 @@ def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): data=["e_theta", "e_zeta", "Z"], ) def _V_of_r(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V(r)"] = jnp.abs( surface_integrals( @@ -186,6 +189,7 @@ def _A_of_z(params, transforms, profiles, data, **kwargs): parameterization=["desc.geometry.surface.FourierRZToroidalSurface"], ) def _A_of_z_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) # divergence theorem: integral(dA div [0, 0, Z]) = integral(ds n dot [0, 0, Z]) # but we need only the part of n in the R,Z plane n = data["n_rho"] diff --git a/desc/compute/_surface.py b/desc/compute/_surface.py index 2368deab44..94f4d93eb7 100644 --- a/desc/compute/_surface.py +++ b/desc/compute/_surface.py @@ -1,8 +1,11 @@ from desc.backend import jnp +from ..utils import errorif from .data_index import register_compute_fun from .geom_utils import rpz2xyz, xyz2rpz, xyz2rpz_vec +# TODO: review when zeta no longer equals phi + @register_compute_fun( name="x", @@ -26,6 +29,7 @@ def _x_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): R = transforms["R"].transform(params["R_lmn"]) Z = transforms["Z"].transform(params["Z_lmn"]) + # TODO: change when zeta no longer equals phi phi = transforms["grid"].nodes[:, 2] coords = jnp.stack([R, phi, Z], axis=1) if kwargs.get("basis", "rpz").lower() == "xyz": @@ -217,6 +221,7 @@ def _phi_z_Surface(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Surface", ) def _Z_Surface(params, transforms, profiles, data, **kwargs): + errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) data["Z"] = data["x"][:, 2] return data From 571f1875b097fc3a9a4b1831e9f150f23a4d3437 Mon Sep 17 00:00:00 2001 From: unalmis Date: Mon, 1 Jul 2024 21:23:30 -0500 Subject: [PATCH 07/13] add missing basis kwarg to e_phi|R,Z --- desc/compute/_basis_vectors.py | 13 +++++++------ desc/compute/_metric.py | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index ee1eaafb8a..b46b016191 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1427,6 +1427,7 @@ def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): "desc.equilibrium.equilibrium.Equilibrium", "desc.geometry.surface.FourierRZToroidalSurface", ], + basis="basis", ) def _e_sub_phi_RZ(params, transforms, profiles, data, **kwargs): data["e_phi|R,Z"] = jnp.column_stack([data["0"], data["R"], data["0"]]) @@ -2508,8 +2509,8 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\vartheta} |_{\\rho, \\phi} = \\mathbf{e}_{\\theta_{PEST}}", units="m", units_long="meters", - description="Covariant poloidal basis vector in (ρ,ϑ,Φ) coordinates" - " (Straight field line PEST coordinates. Φ increases counterclockwise" + description="Covariant poloidal basis vector in (ρ,ϑ,Φ) coordinates or" + " straight field line PEST coordinates. Φ increases counterclockwise" " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=3, params=[], @@ -2533,8 +2534,8 @@ def _e_sub_vartheta_rp(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\phi} |_{\\rho, \\vartheta}", units="m", units_long="meters", - description="Covariant toroidal basis vector in (ρ,ϑ,Φ) coordinates" - " (Straight field line PEST coordinates. Φ increases counterclockwise" + description="Covariant toroidal basis vector in (ρ,ϑ,Φ) coordinates or" + " straight field line PEST coordinates. Φ increases counterclockwise" " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=3, params=[], @@ -2558,8 +2559,8 @@ def _e_sub_phi_rv(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\rho} |_{\\vartheta, \\phi}", units="m", units_long="meters", - description="Covariant radial basis vector in (ρ,ϑ,Φ) coordinates" - " (Straight field line PEST coordinates. Φ increases counterclockwise" + description="Covariant radial basis vector in (ρ,ϑ,Φ) coordinates or" + " straight field line PEST coordinates. Φ increases counterclockwise" " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=3, params=[], diff --git a/desc/compute/_metric.py b/desc/compute/_metric.py index 1176c89671..16b64edcec 100644 --- a/desc/compute/_metric.py +++ b/desc/compute/_metric.py @@ -40,8 +40,8 @@ def _sqrtg(params, transforms, profiles, data, **kwargs): label="\\sqrt{g}_{PEST}", units="m^{3}", units_long="cubic meters", - description="Jacobian determinant of (ρ,ϑ,Φ) coordinate system. " - " (Straight field line PEST coordinates. Φ increases counterclockwise" + description="Jacobian determinant of (ρ,ϑ,Φ) coordinate system or" + " straight field line PEST coordinates. Φ increases counterclockwise" " when viewed from above (cylindrical R,Φ plane with Z out of page.)", dim=1, params=[], From 7aa74ce54ceb6f0cebad66787a64a6ff74f15adf Mon Sep 17 00:00:00 2001 From: unalmis Date: Tue, 2 Jul 2024 13:54:46 -0500 Subject: [PATCH 08/13] review suggestions --- desc/compute/_curve.py | 4 +++- desc/compute/_equil.py | 4 +++- desc/compute/_field.py | 4 +++- desc/compute/_geometry.py | 8 ++++++-- desc/compute/_surface.py | 4 +++- tests/test_compute_funs.py | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/desc/compute/_curve.py b/desc/compute/_curve.py index e50abcf713..725e4e1e5a 100644 --- a/desc/compute/_curve.py +++ b/desc/compute/_curve.py @@ -157,7 +157,9 @@ def _phi_Curve(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Curve", ) def _Z_Curve(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) data["Z"] = data["x"][:, 2] return data diff --git a/desc/compute/_equil.py b/desc/compute/_equil.py index 25ee0664c4..f09e377eaa 100644 --- a/desc/compute/_equil.py +++ b/desc/compute/_equil.py @@ -270,7 +270,9 @@ def _J_phi(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_Z(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) data["J_Z"] = data["J"][:, 2] return data diff --git a/desc/compute/_field.py b/desc/compute/_field.py index 35e5849350..5a7549c872 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -179,7 +179,9 @@ def _B_phi(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_Z(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) data["B_Z"] = data["B"][:, 2] return data diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index 813cfe176c..0c0b346776 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -49,7 +49,9 @@ def _V(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.surface.FourierRZToroidalSurface", ) def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V"] = jnp.max( # take max in case there are multiple surfaces for some reason jnp.abs( @@ -77,7 +79,9 @@ def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): data=["e_theta", "e_zeta", "Z"], ) def _V_of_r(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V(r)"] = jnp.abs( surface_integrals( diff --git a/desc/compute/_surface.py b/desc/compute/_surface.py index 94f4d93eb7..109b752673 100644 --- a/desc/compute/_surface.py +++ b/desc/compute/_surface.py @@ -221,7 +221,9 @@ def _phi_z_Surface(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Surface", ) def _Z_Surface(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower()[-1] != "z", NotImplementedError) + errorif( + kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError + ) data["Z"] = data["x"][:, 2] return data diff --git a/tests/test_compute_funs.py b/tests/test_compute_funs.py index 12fd0e0f18..0e01d4e174 100644 --- a/tests/test_compute_funs.py +++ b/tests/test_compute_funs.py @@ -1690,7 +1690,7 @@ def test_basis_kwarg(): """Test that we don't change basis to xyz erroneously assuming input is in rpz.""" eq = get("W7-X") names = ["b", "e^rho", "e_theta_PEST", "phi"] - data_rpz = eq.compute(names) + data_rpz = eq.compute(names, basis="rpz") data_xyz = eq.compute(names, basis="xyz") for name in names: if name != "phi": From 4192967002598d11508085c3bcc42c96adc02e3c Mon Sep 17 00:00:00 2001 From: unalmis Date: Wed, 3 Jul 2024 13:22:30 -0500 Subject: [PATCH 09/13] Review requests --- desc/compute/_basis_vectors.py | 35 +++++++++++++++++----------------- desc/compute/_metric.py | 6 +++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index b46b016191..e52dff1962 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1389,7 +1389,7 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\phi} |_{\\rho, \\theta}", units="m", units_long="meters", - description="Covariant toroidal basis vector in (ρ,θ,Φ) coordinates", + description="Covariant toroidal basis vector in (ρ,θ,ϕ) coordinates", dim=3, params=[], transforms={}, @@ -1401,12 +1401,12 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], aliases=["e_phi"], - # Our usual notation implies e_phi = (∂X/∂Φ)|R,Z, but we need to alias e_phi to - # e_phi|r,t = (∂X/∂Φ)|ρ,θ for compatibility with older versions of the code. - # To instead compute (∂X/∂Φ)|R,Z, look at the quantity "e_phi|R,Z". + # Our usual notation implies e_phi = (∂X/∂ϕ)|R,Z, but we need to alias e_phi to + # e_phi|r,t = (∂X/∂ϕ)|ρ,θ for compatibility with older versions of the code. + # To instead compute (∂X/∂ϕ)|R,Z, look at the quantity "e_phi|R,Z". ) def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): - # (∂X/∂Φ)|ρ,θ = (∂X/∂ζ)|ρ,θ / (∂Φ/∂ζ)|ρ,θ + # (∂X/∂ϕ)|ρ,θ = (∂X/∂ζ)|ρ,θ / (∂ϕ/∂ζ)|ρ,θ data["e_phi|r,t"] = (data["e_zeta"].T / data["phi_z"]).T return data @@ -1416,7 +1416,8 @@ def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\phi} |_{R, Z}", units="m", units_long="meters", - description="Tangent vector along increasing cylindrical toroidal angle phi", + description="Tangent vector along increasing cylindrical toroidal angle phi. " + "(Points in the direction of ϕ̂).", dim=3, params=[], transforms={}, @@ -2509,9 +2510,9 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\vartheta} |_{\\rho, \\phi} = \\mathbf{e}_{\\theta_{PEST}}", units="m", units_long="meters", - description="Covariant poloidal basis vector in (ρ,ϑ,Φ) coordinates or" - " straight field line PEST coordinates. Φ increases counterclockwise" - " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + description="Covariant poloidal basis vector in (ρ,ϑ,ϕ) coordinates or" + " straight field line PEST coordinates. ϕ increases counterclockwise" + " when viewed from above (cylindrical R,ϕ plane with Z out of page).", dim=3, params=[], transforms={}, @@ -2521,7 +2522,7 @@ def _e_sub_theta_over_sqrt_g(params, transforms, profiles, data, **kwargs): aliases=["e_vartheta"], ) def _e_sub_vartheta_rp(params, transforms, profiles, data, **kwargs): - # constant ρ and Φ + # constant ρ and ϕ e_vartheta = ( data["e_theta"].T * data["phi_z"] - data["e_zeta"].T * data["phi_t"] ) / (data["theta_PEST_t"] * data["phi_z"] - data["theta_PEST_z"] * data["phi_t"]) @@ -2534,9 +2535,9 @@ def _e_sub_vartheta_rp(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\phi} |_{\\rho, \\vartheta}", units="m", units_long="meters", - description="Covariant toroidal basis vector in (ρ,ϑ,Φ) coordinates or" - " straight field line PEST coordinates. Φ increases counterclockwise" - " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + description="Covariant toroidal basis vector in (ρ,ϑ,ϕ) coordinates or" + " straight field line PEST coordinates. ϕ increases counterclockwise" + " when viewed from above (cylindrical R,ϕ plane with Z out of page).", dim=3, params=[], transforms={}, @@ -2559,9 +2560,9 @@ def _e_sub_phi_rv(params, transforms, profiles, data, **kwargs): label="\\mathbf{e}_{\\rho} |_{\\vartheta, \\phi}", units="m", units_long="meters", - description="Covariant radial basis vector in (ρ,ϑ,Φ) coordinates or" - " straight field line PEST coordinates. Φ increases counterclockwise" - " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + description="Covariant radial basis vector in (ρ,ϑ,ϕ) coordinates or" + " straight field line PEST coordinates. ϕ increases counterclockwise" + " when viewed from above (cylindrical R,ϕ plane with Z out of page).", dim=3, params=[], transforms={}, @@ -2570,7 +2571,7 @@ def _e_sub_phi_rv(params, transforms, profiles, data, **kwargs): data=["e_rho", "e_vartheta", "e_phi|r,v", "theta_PEST_r", "phi_r"], ) def _e_sub_rho_vp(params, transforms, profiles, data, **kwargs): - # constant ϑ and Φ + # constant ϑ and ϕ data["e_rho|v,p"] = ( data["e_rho"].T - data["e_vartheta"].T * data["theta_PEST_r"] diff --git a/desc/compute/_metric.py b/desc/compute/_metric.py index 16b64edcec..3a842e9378 100644 --- a/desc/compute/_metric.py +++ b/desc/compute/_metric.py @@ -40,9 +40,9 @@ def _sqrtg(params, transforms, profiles, data, **kwargs): label="\\sqrt{g}_{PEST}", units="m^{3}", units_long="cubic meters", - description="Jacobian determinant of (ρ,ϑ,Φ) coordinate system or" - " straight field line PEST coordinates. Φ increases counterclockwise" - " when viewed from above (cylindrical R,Φ plane with Z out of page.)", + description="Jacobian determinant of (ρ,ϑ,ϕ) coordinate system or" + " straight field line PEST coordinates. ϕ increases counterclockwise" + " when viewed from above (cylindrical R,ϕ plane with Z out of page).", dim=1, params=[], transforms={}, From 35ec35461ae81c286356ab58b4468def4807df7c Mon Sep 17 00:00:00 2001 From: unalmis Date: Wed, 3 Jul 2024 15:00:03 -0500 Subject: [PATCH 10/13] Remove e_phi|R,Z --- desc/compute/_basis_vectors.py | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index e52dff1962..1bc6917efd 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -1401,9 +1401,8 @@ def _e_sup_zeta_zz(params, transforms, profiles, data, **kwargs): "desc.geometry.surface.FourierRZToroidalSurface", ], aliases=["e_phi"], - # Our usual notation implies e_phi = (∂X/∂ϕ)|R,Z, but we need to alias e_phi to - # e_phi|r,t = (∂X/∂ϕ)|ρ,θ for compatibility with older versions of the code. - # To instead compute (∂X/∂ϕ)|R,Z, look at the quantity "e_phi|R,Z". + # Our usual notation implies e_phi = (∂X/∂ϕ)|R,Z = R ϕ̂, but we need to alias e_phi + # to e_phi|r,t = (∂X/∂ϕ)|ρ,θ for compatibility with older versions of the code. ) def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): # (∂X/∂ϕ)|ρ,θ = (∂X/∂ζ)|ρ,θ / (∂ϕ/∂ζ)|ρ,θ @@ -1411,32 +1410,6 @@ def _e_sub_phi_rt(params, transforms, profiles, data, **kwargs): return data -@register_compute_fun( - name="e_phi|R,Z", - label="\\mathbf{e}_{\\phi} |_{R, Z}", - units="m", - units_long="meters", - description="Tangent vector along increasing cylindrical toroidal angle phi. " - "(Points in the direction of ϕ̂).", - dim=3, - params=[], - transforms={}, - profiles=[], - coordinates="rtz", - data=["R", "0", "phi"], - parameterization=[ - "desc.equilibrium.equilibrium.Equilibrium", - "desc.geometry.surface.FourierRZToroidalSurface", - ], - basis="basis", -) -def _e_sub_phi_RZ(params, transforms, profiles, data, **kwargs): - data["e_phi|R,Z"] = jnp.column_stack([data["0"], data["R"], data["0"]]) - if kwargs.get("basis", "rpz").lower() == "xyz": - data["e_phi|R,Z"] = rpz2xyz_vec(data["e_phi|R,Z"], phi=data["phi"]) - return data - - @register_compute_fun( name="e_rho", label="\\mathbf{e}_{\\rho}", From 449d332600c8f36ab3450c2b8f35630a51e275d2 Mon Sep 17 00:00:00 2001 From: unalmis Date: Fri, 5 Jul 2024 13:19:25 -0500 Subject: [PATCH 11/13] Remove code that merge didn't remove --- tests/test_data_index.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/test_data_index.py b/tests/test_data_index.py index dbdbd6e985..1eb3ea6639 100644 --- a/tests/test_data_index.py +++ b/tests/test_data_index.py @@ -40,11 +40,6 @@ def get_parameterization(fun, default="desc.equilibrium.equilibrium.Equilibrium" matches.discard("") return matches if matches else {default} - @staticmethod - def _is_function(func): - # JITed functions are not functions according to inspect. - return inspect.isfunction(func) or callable(func) - @pytest.mark.unit def test_data_index_deps(self): """Ensure developers do not add extra (or forget needed) dependencies. From 33e1e81ced3e01c508ddd413a014494de3218ee4 Mon Sep 17 00:00:00 2001 From: unalmis Date: Fri, 5 Jul 2024 13:22:30 -0500 Subject: [PATCH 12/13] Use master_compute_data from master --- tests/inputs/master_compute_data.pkl | Bin 7868373 -> 7877183 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index bb5714d878bcd019060d8ae6ab687ca50b15c794..7afbc1d6bee0ce88016470a1a1828d278632d3d3 100644 GIT binary patch delta 20968 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 delta 52672 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 Date: Thu, 11 Jul 2024 16:54:22 -0400 Subject: [PATCH 13/13] Fix merge conflicts from basing branch of now closed basis_bug --- desc/compute/_curve.py | 4 ---- desc/compute/_equil.py | 8 -------- desc/compute/_field.py | 6 ------ desc/compute/_geometry.py | 8 -------- desc/compute/_surface.py | 4 ---- tests/inputs/master_compute_data_xyz.pkl | Bin 7718930 -> 7801900 bytes tests/test_compute_funs.py | 14 -------------- 7 files changed, 44 deletions(-) diff --git a/desc/compute/_curve.py b/desc/compute/_curve.py index f5be424abe..4085a7aa66 100644 --- a/desc/compute/_curve.py +++ b/desc/compute/_curve.py @@ -2,7 +2,6 @@ from desc.backend import jnp -from ..utils import errorif from .data_index import register_compute_fun from .geom_utils import rotation_matrix, rpz2xyz, rpz2xyz_vec, xyz2rpz, xyz2rpz_vec from .utils import cross, dot, safenormalize @@ -143,9 +142,6 @@ def _phi_Curve(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Curve", ) def _Z_Curve(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) data["Z"] = data["x"][:, 2] return data diff --git a/desc/compute/_equil.py b/desc/compute/_equil.py index f09e377eaa..8baf22e0a5 100644 --- a/desc/compute/_equil.py +++ b/desc/compute/_equil.py @@ -13,7 +13,6 @@ from desc.backend import jnp -from ..utils import errorif from .data_index import register_compute_fun from .utils import cross, dot, safediv, safenorm, surface_averages @@ -232,7 +231,6 @@ def _J_sqrt_g_r(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_R(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["J_R"] = data["J"][:, 0] return data @@ -251,7 +249,6 @@ def _J_R(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_phi(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["J_phi"] = data["J"][:, 1] return data @@ -270,9 +267,6 @@ def _J_phi(params, transforms, profiles, data, **kwargs): data=["J"], ) def _J_Z(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) data["J_Z"] = data["J"][:, 2] return data @@ -683,7 +677,6 @@ def _W_B(params, transforms, profiles, data, **kwargs): data=["B", "sqrt(g)"], ) def _W_Bpol(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["W_Bpol"] = jnp.sum( dot(data["B"][:, (0, 2)], data["B"][:, (0, 2)]) * data["sqrt(g)"] @@ -706,7 +699,6 @@ def _W_Bpol(params, transforms, profiles, data, **kwargs): data=["B", "sqrt(g)"], ) def _W_Btor(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["W_Btor"] = jnp.sum( data["B"][:, 1] ** 2 * data["sqrt(g)"] * transforms["grid"].weights ) / (2 * mu_0) diff --git a/desc/compute/_field.py b/desc/compute/_field.py index 5a7549c872..6285fd9c92 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -13,7 +13,6 @@ from desc.backend import jnp -from ..utils import errorif from .data_index import register_compute_fun from .utils import ( cross, @@ -141,7 +140,6 @@ def _B(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_R(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["B_R"] = data["B"][:, 0] return data @@ -160,7 +158,6 @@ def _B_R(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_phi(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) data["B_phi"] = data["B"][:, 1] return data @@ -179,9 +176,6 @@ def _B_phi(params, transforms, profiles, data, **kwargs): data=["B"], ) def _B_Z(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) data["B_Z"] = data["B"][:, 2] return data diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index fb91420b4c..36bb1ac32a 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -11,7 +11,6 @@ from desc.backend import jnp -from ..utils import errorif from .data_index import register_compute_fun from .utils import cross, dot, line_integrals, safenorm, surface_integrals @@ -49,9 +48,6 @@ def _V(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.surface.FourierRZToroidalSurface", ) def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V"] = jnp.max( # take max in case there are multiple surfaces for some reason jnp.abs( @@ -79,9 +75,6 @@ def _V_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): data=["e_theta", "e_zeta", "Z"], ) def _V_of_r(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) # divergence theorem: integral(dV div [0, 0, Z]) = integral(dS dot [0, 0, Z]) data["V(r)"] = jnp.abs( surface_integrals( @@ -195,7 +188,6 @@ def _A_of_z(params, transforms, profiles, data, **kwargs): # FIXME: Add source grid requirement once omega is nonzero. ) def _A_of_z_FourierRZToroidalSurface(params, transforms, profiles, data, **kwargs): - errorif(kwargs.get("basis", "rpz").lower() != "rpz", NotImplementedError) # Denote any vector v = [vᴿ, v^ϕ, vᶻ] with a tuple of its contravariant components. # We use a 2D divergence theorem over constant ϕ toroidal surface (i.e. R, Z plane). # In this geometry, the divergence operator on a polar basis vector is diff --git a/desc/compute/_surface.py b/desc/compute/_surface.py index 1ce3421db6..5fb84fa060 100644 --- a/desc/compute/_surface.py +++ b/desc/compute/_surface.py @@ -1,6 +1,5 @@ from desc.backend import jnp -from ..utils import errorif from .data_index import register_compute_fun from .geom_utils import rpz2xyz @@ -194,9 +193,6 @@ def _phi_z_Surface(params, transforms, profiles, data, **kwargs): parameterization="desc.geometry.core.Surface", ) def _Z_Surface(params, transforms, profiles, data, **kwargs): - errorif( - kwargs.get("basis", "rpz").lower() not in {"rpz", "xyz"}, NotImplementedError - ) data["Z"] = data["x"][:, 2] return data diff --git a/tests/inputs/master_compute_data_xyz.pkl b/tests/inputs/master_compute_data_xyz.pkl index 41faf549882321c2449dde4ac15d9de39f7f692f..89859918fa2fc6055d2dab90d346e05232c5ae43 100644 GIT binary patch delta 120197 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 tW delta 89529 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