From 428ac622c9edc83593c2d8a81a2dfdf4db79ec7c Mon Sep 17 00:00:00 2001 From: unalmis Date: Mon, 18 May 2026 17:49:33 -0700 Subject: [PATCH 1/4] Fix bugs in compute quantities --- desc/compute/_basis_vectors.py | 49 ++++++++++++++++------------------ desc/compute/_bootstrap.py | 11 +++++--- desc/compute/_equil.py | 20 +++++++------- desc/compute/_field.py | 8 +++--- desc/compute/_geometry.py | 4 +-- desc/compute/_metric.py | 36 ++++++++++++------------- desc/compute/_omnigenity.py | 3 ++- desc/compute/_profiles.py | 22 ++++++++++----- desc/compute/_stability.py | 2 +- tests/test_bootstrap.py | 8 +++--- 10 files changed, 88 insertions(+), 75 deletions(-) diff --git a/desc/compute/_basis_vectors.py b/desc/compute/_basis_vectors.py index a273b5c03a..ca173b6eff 100644 --- a/desc/compute/_basis_vectors.py +++ b/desc/compute/_basis_vectors.py @@ -94,7 +94,7 @@ def _e_sup_rho_r(params, transforms, profiles, data, **kwargs): name="e^rho_rr", label="\\partial_{\\rho\\rho} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, 2nd derivative" " wrt radial coordinate", dim=3, @@ -144,7 +144,7 @@ def _e_sup_rho_rr(params, transforms, profiles, data, **kwargs): name="e^rho_rt", label="\\partial_{\\rho\\theta} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, derivative" " wrt radial and poloidal coordinate", dim=3, @@ -199,7 +199,7 @@ def _e_sup_rho_rt(params, transforms, profiles, data, **kwargs): name="e^rho_rz", label="\\partial_{\\rho\\zeta} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, derivative" " wrt radial and toroidal coordinate", dim=3, @@ -337,7 +337,7 @@ def _e_sup_rho_p_PEST(params, transforms, profiles, data, **kwargs): name="e^rho_tt", label="\\partial_{\\theta\\theta} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, 2nd derivative" " wrt poloidal coordinate", dim=3, @@ -387,7 +387,7 @@ def _e_sup_rho_tt(params, transforms, profiles, data, **kwargs): name="e^rho_tz", label="\\partial_{\\theta\\zeta} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, derivative" " wrt poloidal and toroidal coordinate", dim=3, @@ -484,7 +484,7 @@ def _e_sup_rho_z(params, transforms, profiles, data, **kwargs): name="e^rho_zz", label="\\partial_{\\zeta\\zeta} \\mathbf{e}^{\\rho}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Radial basis vector, 2nd derivative" " wrt toroidal coordinate", dim=3, @@ -731,7 +731,7 @@ def _e_sup_theta_r(params, transforms, profiles, data, **kwargs): name="e^theta_rr", label="\\partial_{\\rho\\rho} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, 2nd derivative" " wrt radial coordinate", dim=3, @@ -781,7 +781,7 @@ def _e_sup_theta_rr(params, transforms, profiles, data, **kwargs): name="e^theta_rt", label="\\partial_{\\rho\\theta} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, derivative" " wrt radial and poloidal coordinate", dim=3, @@ -836,7 +836,7 @@ def _e_sup_theta_rt(params, transforms, profiles, data, **kwargs): name="e^theta_rz", label="\\partial_{\\rho\\zeta} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, derivative" " wrt radial and toroidal coordinate", dim=3, @@ -919,7 +919,7 @@ def _e_sup_theta_t(params, transforms, profiles, data, **kwargs): name="e^theta_tt", label="\\partial_{\\theta\\theta} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, 2nd derivative" " wrt poloidal coordinate", dim=3, @@ -969,7 +969,7 @@ def _e_sup_theta_tt(params, transforms, profiles, data, **kwargs): name="e^theta_tz", label="\\partial_{\\theta\\zeta} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, derivative" " wrt poloidal and toroidal coordinate", dim=3, @@ -1052,7 +1052,7 @@ def _e_sup_theta_z(params, transforms, profiles, data, **kwargs): name="e^theta_zz", label="\\partial_{\\zeta\\zeta} \\mathbf{e}^{\\theta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Poloidal basis vector, 2nd derivative" " wrt toroidal coordinate", dim=3, @@ -1158,7 +1158,7 @@ def _e_sup_zeta_r(params, transforms, profiles, data, **kwargs): name="e^zeta_rr", label="\\partial_{\\rho\\rho} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, 2nd derivative" " wrt radial coordinate", dim=3, @@ -1208,7 +1208,7 @@ def _e_sup_zeta_rr(params, transforms, profiles, data, **kwargs): name="e^zeta_rt", label="\\partial_{\\rho\\theta} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, derivative" " wrt radial and poloidal coordinate", dim=3, @@ -1263,7 +1263,7 @@ def _e_sup_zeta_rt(params, transforms, profiles, data, **kwargs): name="e^zeta_rz", label="\\partial_{\\rho\\zeta} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, derivative" " wrt radial and toroidal coordinate", dim=3, @@ -1404,7 +1404,7 @@ def _e_sup_zeta_p_PEST(params, transforms, profiles, data, **kwargs): name="e^zeta_tt", label="\\partial_{\\theta\\theta} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, 2nd derivative" " wrt poloidal coordinate", dim=3, @@ -1454,7 +1454,7 @@ def _e_sup_zeta_tt(params, transforms, profiles, data, **kwargs): name="e^zeta_tz", label="\\partial_{\\theta\\zeta} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, derivative" " wrt poloidal and toroidal coordinate", dim=3, @@ -1552,7 +1552,7 @@ def _e_sup_zeta_z(params, transforms, profiles, data, **kwargs): name="e^zeta_zz", label="\\partial_{\\zeta\\zeta} \\mathbf{e}^{\\zeta}", units="m^{-1}", - units_long="inverse square meters", + units_long="inverse meters", description="Contravariant Toroidal basis vector, 2nd derivative" " wrt toroidal coordinate", dim=3, @@ -1769,7 +1769,7 @@ def _e_sub_rho_rrr(params, transforms, profiles, data, **kwargs): 4 * data["R_rrr"] * data["omega_r"] + 6 * data["R_rr"] * data["omega_rr"] - 4 * data["R_r"] * (data["omega_r"] ** 3 - data["omega_rrr"]) - + data["R_r"] + + data["R"] * (data["omega_rrrr"] - 6 * data["omega_r"] ** 2 * data["omega_rr"]), data["Z_rrrr"], ] @@ -2624,8 +2624,8 @@ def _e_sub_theta(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="e_theta/sqrt(g)", label="\\mathbf{e}_{\\theta} / \\sqrt{g}", - units="m", - units_long="meters", + units="m^{-2}", + units_long="inverse square meters", description="Covariant Poloidal basis vector divided by 3-D volume Jacobian", dim=3, params=[], @@ -2778,7 +2778,7 @@ def _e_sub_theta_rtt(params, transforms, profiles, data, **kwargs): data["R_r"] * data["omega_tt"] + data["R_tt"] * data["omega_r"] + 2 * data["R_t"] * data["omega_rt"] - + data["R"] * data["omega_rt"] + + data["R"] * data["omega_rtt"] ) - data["omega_r"] * (3 * data["R_t"] * data["omega_tt"] + data["R"] * data["omega_ttt"]) @@ -3336,10 +3336,7 @@ def _e_sub_zeta_rzz(params, transforms, profiles, data, **kwargs): - data["omega_zzz"] ) - data["R"] - * ( - 3 * data["omega_rz"] * (1 + data["omega_z"] * (1 + data["omega_z"])) - - data["omega_rzzz"] - ) + * (3 * data["omega_rz"] * (1 + data["omega_z"]) ** 2 - data["omega_rzzz"]) + data["omega_r"] * ( -3 * data["R_z"] * (1 + data["omega_z"]) ** 2 diff --git a/desc/compute/_bootstrap.py b/desc/compute/_bootstrap.py index 68a36da2ed..19d311e5c5 100644 --- a/desc/compute/_bootstrap.py +++ b/desc/compute/_bootstrap.py @@ -118,17 +118,19 @@ def compute_J_dot_B_Redl(geom_data, profile_data, helicity_N=None): Dictionary containing the data described above. profile_data : dict Dictionary containing the data described above. - helicity_N : int + helicity_N : int, optional Set to 0 for quasi-axisymmetry, or +/- NFP for quasi-helical symmetry. This quantity is used to apply the quasisymmetry isomorphism to map the collisionality and bootstrap current from the tokamak expressions to - quasi-helical symmetry. + quasi-helical symmetry. Defaults to 0. Returns ------- J_dot_B_data : dict Dictionary containing the computed data listed above. """ + helicity_N = 0 if helicity_N is None else helicity_N + G = geom_data["G"] R = geom_data["R"] iota = geom_data["iota"] @@ -147,6 +149,7 @@ def compute_J_dot_B_Redl(geom_data, profile_data, helicity_N=None): # problem is avoided by adding a tiny number here: Zeff = jnp.maximum(1 + 1.0e-14, profile_data["Zeff"]) d_ne_d_s = profile_data["ne_r"] / (2 * rho) + d_ni_d_s = profile_data["ni_r"] / (2 * rho) d_Te_d_s = profile_data["Te_r"] / (2 * rho) d_Ti_d_s = profile_data["Ti_r"] / (2 * rho) @@ -254,9 +257,8 @@ def compute_J_dot_B_Redl(geom_data, profile_data, helicity_N=None): dnds_term = ( -G * elementary_charge - * (ne * Te + ni * Ti) * L31 - * (d_ne_d_s / ne) + * (Te * d_ne_d_s + Ti * d_ni_d_s) / (psi_edge * (iota - helicity_N)) ) dTeds_term = ( @@ -288,6 +290,7 @@ def compute_J_dot_B_Redl(geom_data, profile_data, helicity_N=None): J_dot_B_data["Te"] = Te J_dot_B_data["Ti"] = Ti J_dot_B_data["d_ne_d_s"] = d_ne_d_s + J_dot_B_data["d_ni_d_s"] = d_ni_d_s J_dot_B_data["d_Te_d_s"] = d_Te_d_s J_dot_B_data["d_Ti_d_s"] = d_Ti_d_s J_dot_B_data["ln_Lambda_e"] = ln_Lambda_e diff --git a/desc/compute/_equil.py b/desc/compute/_equil.py index 7353c25692..20b9b921a7 100644 --- a/desc/compute/_equil.py +++ b/desc/compute/_equil.py @@ -205,7 +205,7 @@ def _J_sup_zeta_v_PEST(params, transforms, profiles, data, **kwargs): # TODO: Generalize for a general zeta before #568 @register_compute_fun( name="(J^zeta_p)|PEST", - label="\\partial_{\\phi}|_{\\rho, \\phi} J^{\\zeta}", + label="\\partial_{\\phi}|_{\\rho, \\vartheta} J^{\\zeta}", units="A \\cdot m^{-3}", units_long="Amperes / cubic meter", description="Contravariant PEST toroidal component of plasma current density" @@ -253,7 +253,7 @@ def _J_sup_theta_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="J^theta_z", - label="\\partial_{\\theta} J^{\\theta}", + label="\\partial_{\\zeta} J^{\\theta}", units="A \\cdot m^{-3}", units_long="Amperes / cubic meter", description="Derivative of Contravariant poloidal component of plasma current" @@ -825,7 +825,7 @@ def _Fmag_vol(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="e^helical", - label="B^{\\theta} \\nabla \\zeta - B^{\\zeta} \\nabla \\theta", + label="B^{\\zeta} \\nabla \\theta - B^{\\theta} \\nabla \\zeta", units="T \\cdot m^{-2}", units_long="Tesla / square meter", description="Helical basis vector", @@ -845,9 +845,9 @@ def _e_sup_helical(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="e^helical*sqrt(g)", - label="\\sqrt{g}(B^{\\theta} \\nabla \\zeta - B^{\\zeta} \\nabla \\theta)", - units="T \\cdot m^{2}", - units_long="Tesla * square meter", + label="\\sqrt{g}(B^{\\zeta} \\nabla \\theta - B^{\\theta} \\nabla \\zeta)", + units="T \\cdot m", + units_long="Tesla * meter", description="Helical basis vector weighted by 3-D volume Jacobian", dim=3, params=[], @@ -866,7 +866,7 @@ def _e_sup_helical_times_sqrt_g(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="|e^helical|", - label="|B^{\\theta} \\nabla \\zeta - B^{\\zeta} \\nabla \\theta|", + label="|B^{\\zeta} \\nabla \\theta - B^{\\theta} \\nabla \\zeta|", units="T \\cdot m^{-2}", units_long="Tesla / square meter", description="Magnitude of helical basis vector", @@ -884,9 +884,9 @@ def _e_sup_helical_mag(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="|e^helical*sqrt(g)|", - label="|\\sqrt{g}(B^{\\theta} \\nabla \\zeta - B^{\\zeta} \\nabla \\theta)|", - units="T \\cdot m^{2}", - units_long="Tesla * square meter", + label="|\\sqrt{g}(B^{\\zeta} \\nabla \\theta - B^{\\theta} \\nabla \\zeta)|", + units="T \\cdot m", + units_long="Tesla * meter", description="Magnitude of helical basis vector weighted by 3-D volume Jacobian", dim=1, params=[], diff --git a/desc/compute/_field.py b/desc/compute/_field.py index 1d91b44342..24d0c914fd 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -3485,7 +3485,7 @@ def _B_dot_grad_B_mag_vol(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="B*grad(|B|)", - label="\\mathbf{B} \\cdot \\nabla B", + label="\\mathbf{B} \\cdot \\nabla |\\mathbf{B}|", units="T^2 \\cdot m^{-1}", units_long="Tesla squared / meters", description="", @@ -3505,7 +3505,7 @@ def _B_dot_gradB(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="(B*grad(|B|))_r", - label="\\partial_{\\theta} (\\mathbf{B} \\cdot \\nabla B)", + label="\\partial_{\\rho} (\\mathbf{B} \\cdot \\nabla |\\mathbf{B}|)", units="T^2 \\cdot m^{-1}", units_long="Tesla squared / meters", description="", @@ -3537,7 +3537,7 @@ def _B_dot_gradB_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="(B*grad(|B|))_t", - label="\\partial_{\\theta} (\\mathbf{B} \\cdot \\nabla B)", + label="\\partial_{\\theta} (\\mathbf{B} \\cdot \\nabla |\\mathbf{B}|)", units="T^2 \\cdot m^{-1}", units_long="Tesla squared / meters", description="", @@ -3569,7 +3569,7 @@ def _B_dot_gradB_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="(B*grad(|B|))_z", - label="\\partial_{\\zeta} (\\mathbf{B} \\cdot \\nabla B)", + label="\\partial_{\\zeta} (\\mathbf{B} \\cdot \\nabla |\\mathbf{B}|)", units="T^2 \\cdot m^{-1}", units_long="Tesla squared / meters", description="", diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index f828b868d9..fa8a07feee 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -1195,7 +1195,7 @@ def _curvature_H_zeta(params, transforms, profiles, data, **kwargs): " \\frac{d\\zeta}{|B^{\\zeta}|}", units="m / T", units_long="Meter / tesla", - description="(Mean) proper length of field line(s)", + description="Mean field-line transit integral in toroidal coordinate", dim=1, params=[], transforms={"grid": []}, @@ -1224,7 +1224,7 @@ def _fieldline_length(data, transforms, profiles, **kwargs): " \\frac{d\\zeta}{|B^{\\zeta} \\sqrt g|}", units="1 / Wb", units_long="inverse webers", - description="(Mean) proper length over volume of field line(s)", + description="Mean field-line transit integral over volume Jacobian", dim=1, params=[], transforms={"grid": []}, diff --git a/desc/compute/_metric.py b/desc/compute/_metric.py index 123d39b4ea..a82600290a 100644 --- a/desc/compute/_metric.py +++ b/desc/compute/_metric.py @@ -1422,7 +1422,7 @@ def _g_sup_tz(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rr_r", label="\\partial_{\\rho} g^{\\rho \\rho}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Radial element of contravariant metric tensor, " + "first radial derivative", @@ -1441,7 +1441,7 @@ def _g_sup_rr_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rr_t", label="\\partial_{\\theta} g^{\\rho \\rho}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Radial element of contravariant metric tensor, " + "first poloidal derivative", @@ -1460,7 +1460,7 @@ def _g_sup_rr_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rr_z", label="\\partial_{\\zeta} g^{\\rho \\rho}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Radial element of contravariant metric tensor, " + "first toroidal derivative", @@ -1479,7 +1479,7 @@ def _g_sup_rr_z(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rt_r", label="\\partial_{\\rho} g^{\\rho \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Poloidal element of contravariant metric tensor, " + "first radial derivative", @@ -1500,7 +1500,7 @@ def _g_sup_rt_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rz_r", label="\\partial_{\\rho} g^{\\rho \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Toroidal element of contravariant metric tensor, " + "first radial derivative", @@ -1521,7 +1521,7 @@ def _g_sup_rz_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tt_r", label="\\partial_{\\rho} g^{\\theta \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Poloidal element of contravariant metric tensor, " + "first radial derivative", @@ -1540,7 +1540,7 @@ def _g_sup_tt_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tz_r", label="\\partial_{\\rho} g^{\\theta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Toroidal element of contravariant metric tensor, " + "first radial derivative", @@ -1561,7 +1561,7 @@ def _g_sup_tz_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^zz_r", label="\\partial_{\\rho} g^{\\zeta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Toroidal/Toroidal element of contravariant metric tensor, " + "first radial derivative", @@ -1580,7 +1580,7 @@ def _g_sup_zz_r(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rt_t", label="\\partial_{\\theta} g^{\\rho \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Poloidal element of contravariant metric tensor, " + "first poloidal derivative", @@ -1601,7 +1601,7 @@ def _g_sup_rt_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rz_t", label="\\partial_{\\theta} g^{\\rho \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Toroidal element of contravariant metric tensor, " + "first poloidal derivative", @@ -1622,7 +1622,7 @@ def _g_sup_rz_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tt_t", label="\\partial_{\\theta} g^{\\theta \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Poloidal element of contravariant metric tensor, " + "first poloidal derivative", @@ -1641,7 +1641,7 @@ def _g_sup_tt_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tz_t", label="\\partial_{\\theta} g^{\\theta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Toroidal element of contravariant metric tensor, " + "first poloidal derivative", @@ -1662,7 +1662,7 @@ def _g_sup_tz_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^zz_t", label="\\partial_{\\theta} g^{\\zeta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Toroidal/Toroidal element of contravariant metric tensor, " + "first poloidal derivative", @@ -1681,7 +1681,7 @@ def _g_sup_zz_t(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rt_z", label="\\partial_{\\zeta} g^{\\rho \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Poloidal element of contravariant metric tensor, " + "first toroidal derivative", @@ -1702,7 +1702,7 @@ def _g_sup_rt_z(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^rz_z", label="\\partial_{\\zeta} g^{\\rho \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Radial/Toroidal element of contravariant metric tensor, " + "first toroidal derivative", @@ -1723,7 +1723,7 @@ def _g_sup_rz_z(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tt_z", label="\\partial_{\\zeta} g^{\\theta \\theta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Poloidal element of contravariant metric tensor, " + "first toroidal derivative", @@ -1742,7 +1742,7 @@ def _g_sup_tt_z(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^tz_z", label="\\partial_{\\zeta} g^{\\theta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Poloidal/Toroidal element of contravariant metric tensor, " + "first toroidal derivative", @@ -1763,7 +1763,7 @@ def _g_sup_tz_z(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="g^zz_z", label="\\partial_{\\zeta} g^{\\zeta \\zeta}", - units="m^-2", + units="m^{-2}", units_long="inverse square meters", description="Toroidal/Toroidal element of contravariant metric tensor, " + "first toroidal derivative", diff --git a/desc/compute/_omnigenity.py b/desc/compute/_omnigenity.py index 3ff2708eec..c7612e7767 100644 --- a/desc/compute/_omnigenity.py +++ b/desc/compute/_omnigenity.py @@ -363,7 +363,8 @@ def _zeta_B(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="sqrt(g)_Boozer_DESC", - label="\\frac{\\partial(\\theta_B,\\zeta_B)}{\\theta_{DESC},\\zeta_{DESC}}", + label="\\frac{\\partial(\\theta_B,\\zeta_B)}" + "{\\partial(\\theta_{DESC},\\zeta_{DESC})}", units="~", units_long="None", description="Jacobian determinant from Boozer coordinates (rho, theta_B, zeta_B)" diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index a34ee4a40e..fd054717c1 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -539,10 +539,15 @@ def _p_r(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=["pressure"], coordinates="rtz", - data=[], + data=["0"], ) def _p_t(params, transforms, profiles, data, **kwargs): - data["p_t"] = profiles["pressure"].compute(transforms["grid"], params["p_l"], dt=1) + if profiles["pressure"] is not None: + data["p_t"] = profiles["pressure"].compute( + transforms["grid"], params["p_l"], dt=1 + ) + else: + data["p_t"] = data["0"] return data @@ -557,10 +562,15 @@ def _p_t(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=["pressure"], coordinates="rtz", - data=[], + data=["0"], ) def _p_z(params, transforms, profiles, data, **kwargs): - data["p_z"] = profiles["pressure"].compute(transforms["grid"], params["p_l"], dz=1) + if profiles["pressure"] is not None: + data["p_z"] = profiles["pressure"].compute( + transforms["grid"], params["p_l"], dz=1 + ) + else: + data["p_z"] = data["0"] return data @@ -754,7 +764,7 @@ def _beta_a_z(params, transforms, profiles, data, **kwargs): def _gradbeta_a(params, transforms, profiles, data, **kwargs): data["grad(beta_a)"] = ( data["beta_a_r"] * data["e^rho"].T - + data["beta_a_t"] * data["e^theta"].T + + data["beta_a_t"] * jnp.where(data["beta_a_t"] == 0, 0, data["e^theta"].T) + data["beta_a_z"] * data["e^zeta"].T ).T return data @@ -1245,7 +1255,7 @@ def _iota_num_rr(params, transforms, profiles, data, **kwargs): * data["sqrt(g)_rr"] * ( 2 * data["g_tz_r"] * data["lambda_rt"] - - data["g_tt_rr"] * data["lambda_t"] + - data["g_tt_rr"] * data["lambda_z"] + data["g_tz_rr"] * (1 + data["lambda_t"]) ) + 2 * data["sqrt(g)_rrr"] * data["g_tz_r"] * (1 + data["lambda_t"]) diff --git a/desc/compute/_stability.py b/desc/compute/_stability.py index 9ab5f866a6..21f6a3395a 100644 --- a/desc/compute/_stability.py +++ b/desc/compute/_stability.py @@ -375,7 +375,7 @@ def _g_balloon(params, transforms, profiles, data, **kwargs): @register_compute_fun( name="ideal ballooning lambda", - label="\\lambda_{\\mathrm{ballooning}}=\\gamma^2", + label="\\lambda_{\\mathrm{ballooning}}=a^2\\gamma^2/v_A^2", units="~", units_long="None", description="Normalized squared ideal ballooning growth rate", diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index 27af2f88dc..2107b2cf59 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -232,7 +232,7 @@ def test_Redl_second_pass(self): """ # Make up some arbitrary functions to use for input: ne = PowerSeriesProfile(1.0e20 * np.array([1, -0.8]), modes=[0, 4]) - ni = PowerSeriesProfile(0.9e20 * np.array([1, -0.8]), modes=[0, 4]) + ni = PowerSeriesProfile(0.9e20 * np.array([1, -0.3]), modes=[0, 2]) Te = PowerSeriesProfile(25e3 * np.array([1, -0.9]), modes=[0, 2]) Ti = PowerSeriesProfile(20e3 * np.array([1, -0.9]), modes=[0, 2]) Zeff = PowerSeriesProfile(np.array([1.5, 0.5]), modes=[0, 2]) @@ -255,8 +255,8 @@ def test_Redl_second_pass(self): Te_rho = Te(rho) Ti_rho = Ti(rho) Zeff_rho = Zeff(rho) - ni_rho = ne_rho / Zeff_rho d_ne_d_s = ne(rho, dr=1) / (2 * rho) + d_ni_d_s = ni(rho, dr=1) / (2 * rho) d_Te_d_s = Te(rho, dr=1) / (2 * rho) d_Ti_d_s = Ti(rho, dr=1) / (2 * rho) @@ -377,7 +377,6 @@ def test_Redl_second_pass(self): pi = ni_rho * Ti_J p = pe + pi Rpe = pe / p - d_ni_d_s = d_ne_d_s / Zeff_rho d_p_d_s = ( ne_rho * d_Te_d_s_J + Te_J * d_ne_d_s @@ -435,6 +434,9 @@ def test_Redl_second_pass(self): np.testing.assert_allclose( J_dot_B_data["nu_i_star"], nu_i, atol=atol, rtol=rtol ) + np.testing.assert_allclose( + J_dot_B_data["d_ni_d_s"], d_ni_d_s, atol=atol, rtol=rtol + ) np.testing.assert_allclose(J_dot_B_data["X31"], X31, atol=atol, rtol=rtol) np.testing.assert_allclose(J_dot_B_data["L31"], L31, atol=atol, rtol=rtol) np.testing.assert_allclose(J_dot_B_data["X32e"], X32e, atol=atol, rtol=rtol) From 345384da3b6036c97b32bc3119d1df03771a2844 Mon Sep 17 00:00:00 2001 From: Kaya Unalmis Date: Mon, 18 May 2026 18:07:36 -0700 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Kaya Unalmis --- desc/compute/_geometry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index fa8a07feee..99fadd1a2e 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -1195,7 +1195,7 @@ def _curvature_H_zeta(params, transforms, profiles, data, **kwargs): " \\frac{d\\zeta}{|B^{\\zeta}|}", units="m / T", units_long="Meter / tesla", - description="Mean field-line transit integral in toroidal coordinate", + description="(Mean) proper length of field line(s)", dim=1, params=[], transforms={"grid": []}, @@ -1224,7 +1224,7 @@ def _fieldline_length(data, transforms, profiles, **kwargs): " \\frac{d\\zeta}{|B^{\\zeta} \\sqrt g|}", units="1 / Wb", units_long="inverse webers", - description="Mean field-line transit integral over volume Jacobian", + description="(Mean) proper length over volume of field line(s)" dim=1, params=[], transforms={"grid": []}, From 508663cb5a520d7b0365873de6463154ab9710e7 Mon Sep 17 00:00:00 2001 From: Kaya Unalmis Date: Mon, 18 May 2026 18:08:39 -0700 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Kaya Unalmis --- desc/compute/_geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desc/compute/_geometry.py b/desc/compute/_geometry.py index 99fadd1a2e..f828b868d9 100644 --- a/desc/compute/_geometry.py +++ b/desc/compute/_geometry.py @@ -1224,7 +1224,7 @@ def _fieldline_length(data, transforms, profiles, **kwargs): " \\frac{d\\zeta}{|B^{\\zeta} \\sqrt g|}", units="1 / Wb", units_long="inverse webers", - description="(Mean) proper length over volume of field line(s)" + description="(Mean) proper length over volume of field line(s)", dim=1, params=[], transforms={"grid": []}, From f8528ba812add55d72fde7cf2c45cf610cbde29f Mon Sep 17 00:00:00 2001 From: unalmis Date: Sat, 30 May 2026 17:39:41 -0700 Subject: [PATCH 4/4] . --- tests/test_bootstrap.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index a117af32c5..d6dd0b7568 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -532,6 +532,7 @@ def test_Redl_figures_2_3(self): "Ti": Ti(rho), "Zeff": Zeff_rho, "ne_r": ne(rho, dr=1), + "ni_r": ni(rho, dr=1), "Te_r": Te(rho, dr=1), "Ti_r": Ti(rho, dr=1), } @@ -671,6 +672,7 @@ def test_Redl_figures_4_5(self): "Ti": Ti(rho), "Zeff": Zeff_rho, "ne_r": ne(rho, dr=1), + "ni_r": ni(rho, dr=1), "Te_r": Te(rho, dr=1), "Ti_r": Ti(rho, dr=1), }