From 01adcb9713f24cfe92a4aa3e6d6bb7ad373184bf Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 29 Aug 2023 11:17:12 -0600 Subject: [PATCH 01/16] iota vacuum and current contributions --- desc/compute/_profiles.py | 91 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 8eaea6c343..2dde7ab2f3 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -607,6 +607,97 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): return data +@register_compute_fun( + name="iota_current", + label="\\iota_{\\mathrm{current}}", + units="~", + units_long="None", + description="Rotational transform (normalized by 2pi), current contribution", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="r", + data=["iota_den", "iota_current_num"], +) +def _iota_current(params, transforms, profiles, data, **kwargs): + data["iota_current"] = transforms["grid"].replace_at_axis( + data["iota_current_num"] / data["iota_den"], 0 + ) + return data + + +@register_compute_fun( + name="iota_vacuum", + label="\\iota_{\\mathrm{vacuum}}", + units="~", + units_long="None", + description="Rotational transform (normalized by 2pi), vacuum contribution", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="r", + data=["iota_den", "iota_vacuum_num"], + axis_limit_data=["iota_den_r", "iota_num_r"], +) +def _iota_vacuum(params, transforms, profiles, data, **kwargs): + data["iota_vacuum"] = transforms["grid"].replace_at_axis( + data["iota_vacuum_num"] / data["iota_den"], + lambda: data["iota_num_r"] / data["iota_den_r"], + ) + return data + + +@register_compute_fun( + name="iota_current_num", + label="\\iota_{\\mathrm{current, numerator}}", + units="m^{-1}", + units_long="inverse meters", + description="Numerator of rotational transform formula, current contribution", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="r", + data=["current", "psi_r"], +) +def _iota_current_num(params, transforms, profiles, data, **kwargs): + """Current contribution to the numerator of rotational transform formula.""" + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + data["iota_current_num"] = 2 * jnp.pi * mu_0 * data["current"] / data["psi_r"] + data["iota_current_num"] = transforms["grid"].replace_at_axis( + data["iota_current_num"], 0 + ) + return data + + +@register_compute_fun( + name="iota_vacuum_num", + label="\\iota_{\\mathrm{vacuum, numerator}}", + units="m^{-1}", + units_long="inverse meters", + description="Numerator of rotational transform formula, vacuum contribution", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="r", + data=["lambda_z", "g_tt", "lambda_t", "g_tz", "sqrt(g)"], +) +def _iota_vacuum_num(params, transforms, profiles, data, **kwargs): + """Vacuum contribution to the numerator of rotational transform formula.""" + data["iota_vacuum_num"] = surface_integrals( + transforms["grid"], + (data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"]) + / data["sqrt(g)"], + ) + data["iota_vacuum_num"] = transforms["grid"].replace_at_axis( + data["iota_vacuum_num"], 0 + ) + return data + + @register_compute_fun( name="iota_num", label="\\iota_{\\mathrm{numerator}}", From c1a7f1048705e8858dc8a138f293561eb1edb327 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 29 Aug 2023 18:55:45 -0600 Subject: [PATCH 02/16] fixing axis limits; work in progress --- desc/compute/_profiles.py | 112 ++++++++++++++++++++++++++++++++++---- 1 file changed, 102 insertions(+), 10 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 2dde7ab2f3..de2492f411 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -618,11 +618,13 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=[], coordinates="r", - data=["iota_den", "iota_current_num"], + data=["iota_current_num", "iota_den"], + axis_limit_data=["iota_current_num_r", "iota_den_r"], ) def _iota_current(params, transforms, profiles, data, **kwargs): data["iota_current"] = transforms["grid"].replace_at_axis( - data["iota_current_num"] / data["iota_den"], 0 + data["iota_current_num"] / data["iota_den"], + data["iota_current_num_r"] / data["iota_den_r"], ) return data @@ -639,12 +641,12 @@ def _iota_current(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="r", data=["iota_den", "iota_vacuum_num"], - axis_limit_data=["iota_den_r", "iota_num_r"], + axis_limit_data=["iota_den_r", "iota_vacuum_num_r"], ) def _iota_vacuum(params, transforms, profiles, data, **kwargs): data["iota_vacuum"] = transforms["grid"].replace_at_axis( data["iota_vacuum_num"] / data["iota_den"], - lambda: data["iota_num_r"] / data["iota_den_r"], + data["iota_vacuum_num_r"] / data["iota_den_r"], ) return data @@ -661,13 +663,14 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="r", data=["current", "psi_r"], + axis_limit_data=["current_r", "psi_rr"], ) def _iota_current_num(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current data["iota_current_num"] = 2 * jnp.pi * mu_0 * data["current"] / data["psi_r"] data["iota_current_num"] = transforms["grid"].replace_at_axis( - data["iota_current_num"], 0 + data["iota_current_num"], 2 * jnp.pi * mu_0 * data["current_r"] / data["psi_rr"] ) return data @@ -684,17 +687,106 @@ def _iota_current_num(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="r", data=["lambda_z", "g_tt", "lambda_t", "g_tz", "sqrt(g)"], + axis_limit_data=["g_tt_r", "g_tz_r", "lambda_rt", "lambda_rz", "sqrt(g)_r"], ) def _iota_vacuum_num(params, transforms, profiles, data, **kwargs): """Vacuum contribution to the numerator of rotational transform formula.""" - data["iota_vacuum_num"] = surface_integrals( - transforms["grid"], + iota_vacuum_num = transforms["grid"].replace_at_axis( (data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"]) / data["sqrt(g)"], + ( + data["lambda_rz"] * data["g_tt"] + + data["lambda_z"] * data["g_tt_r"] + - data["lambda_rt"] * data["g_tz"] + - (1 + data["lambda_t"]) * data["g_tz_r"] + ) + / data["sqrt(g)_r"], ) - data["iota_vacuum_num"] = transforms["grid"].replace_at_axis( - data["iota_vacuum_num"], 0 + data["iota_vacuum_num"] = surface_integrals(transforms["grid"], iota_vacuum_num) + return data + + +@register_compute_fun( + name="iota_current_num_r", + label="\\partial_{\\rho} \\iota_{\\mathrm{current, numerator}}", + units="m^{-1}", + units_long="inverse meters", + description="Numerator of rotational transform formula, current contribution, " + + "first radial derivative", + dim=1, + params=["c_l"], + transforms={"grid": []}, + profiles=["current"], + coordinates="r", + data=["current", "current_r", "psi_r", "psi_rr"], + axis_limit_data=["current_rr"], +) +def _iota_current_num_r(params, transforms, profiles, data, **kwargs): + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + data["iota_current_num_r"] = ( + jnp.pi + * mu_0 + * transforms["grid"].replace_at_axis( + 2 + * (data["current_r"] * data["psi_r"] - data["current"] * data["psi_rr"]) + / data["psi_r"] ** 2, + data["current_rr"] / data["psi_rr"], # FIXME + ) + ) + return data + + +@register_compute_fun( + name="iota_vacuum_num_r", + label="\\partial_{\\rho} \\iota_{\\mathrm{vacuum, numerator}}", + units="m^{-1}", + units_long="inverse meters", + description="Numerator of rotational transform formula, vacuum contribution, " + + "first radial derivative", + dim=1, + params=["c_l"], + transforms={"grid": []}, + profiles=["current"], + coordinates="r", + data=[ + "iota_vacuum_num", + "lambda_t", + "lambda_rt", + "lambda_z", + "lambda_rz", + "g_tt", + "g_tt_r", + "g_tz", + "g_tz_r", + "sqrt(g)", + "sqrt(g)_r", + ], + axis_limit_data=["g_tt_rr", "g_tz_rr", "sqrt(g)_rr"], +) +def _iota_vacuum_num_r(params, transforms, profiles, data, **kwargs): + iota_vacuum_num_r = transforms["grid"].replace_at_axis( + ( + data["lambda_rz"] * data["g_tt"] + + data["lambda_z"] * data["g_tt_r"] + - data["lambda_rt"] * data["g_tz"] + - (1 + data["lambda_t"]) * data["g_tz_r"] + - data["iota_vacuum_num"] * data["sqrt(g)_r"] + ) + / data["sqrt(g)"], + ( + (1 + data["lambda_t"]) + * data["g_tz_r"] + * data["sqrt(g)_rr"] + / (2 * data["sqrt(g)_r"] ** 2) + + ( + data["lambda_z"] * data["g_tt_rr"] + - 2 * data["lambda_rt"] * data["g_tz_r"] + - (1 + data["lambda_t"]) * data["g_tz_rr"] + ) + / (2 * data["sqrt(g)_r"]) # FIXME + ), ) + data["iota_vacuum_num_r"] = surface_integrals(transforms["grid"], iota_vacuum_num_r) return data @@ -792,7 +884,7 @@ def _iota_num_r(params, transforms, profiles, data, **kwargs): / data["psi_r"] ** 2, lambda: ( profiles["current"].compute(params["c_l"], dr=2) * data["psi_rr"] - - current_r * data["psi_rrr"] + - current_r * data["psi_rrr"] # FIXME: psi_rrr=0 ) / data["psi_rr"] ** 2, ) From 5682278590e007bd720e093013023a63aa00254f Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 29 Aug 2023 19:07:59 -0600 Subject: [PATCH 03/16] formatting change --- desc/compute/_profiles.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index de2492f411..116d243c01 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -668,9 +668,9 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): def _iota_current_num(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - data["iota_current_num"] = 2 * jnp.pi * mu_0 * data["current"] / data["psi_r"] + iota_current_num = 2 * jnp.pi * mu_0 * data["current"] / data["psi_r"] data["iota_current_num"] = transforms["grid"].replace_at_axis( - data["iota_current_num"], 2 * jnp.pi * mu_0 * data["current_r"] / data["psi_rr"] + iota_current_num, 2 * jnp.pi * mu_0 * data["current_r"] / data["psi_rr"] ) return data From b4732e23c75a47f7d98bee8331a12363d993bc16 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Thu, 31 Aug 2023 16:34:09 -0600 Subject: [PATCH 04/16] replace current profile with references to 'I' --- desc/compute/_profiles.py | 45 +++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 116d243c01..4cd29fb07b 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -662,15 +662,14 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=[], coordinates="r", - data=["current", "psi_r"], - axis_limit_data=["current_r", "psi_rr"], + data=["I", "psi_r"], + axis_limit_data=["I_r", "psi_rr"], ) def _iota_current_num(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - iota_current_num = 2 * jnp.pi * mu_0 * data["current"] / data["psi_r"] data["iota_current_num"] = transforms["grid"].replace_at_axis( - iota_current_num, 2 * jnp.pi * mu_0 * data["current_r"] / data["psi_rr"] + 4 * jnp.pi**2 * data["I"] / data["psi_r"], + 4 * jnp.pi**2 * data["I_r"] / data["psi_rr"], ) return data @@ -714,23 +713,21 @@ def _iota_vacuum_num(params, transforms, profiles, data, **kwargs): description="Numerator of rotational transform formula, current contribution, " + "first radial derivative", dim=1, - params=["c_l"], + params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", - data=["current", "current_r", "psi_r", "psi_rr"], - axis_limit_data=["current_rr"], + data=["I", "I_r", "psi_r", "psi_rr"], + axis_limit_data=["I_rr"], ) def _iota_current_num_r(params, transforms, profiles, data, **kwargs): - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current data["iota_current_num_r"] = ( - jnp.pi - * mu_0 + 4 + * jnp.pi**2 * transforms["grid"].replace_at_axis( - 2 - * (data["current_r"] * data["psi_r"] - data["current"] * data["psi_rr"]) + (data["I_r"] * data["psi_r"] - data["I"] * data["psi_rr"]) / data["psi_r"] ** 2, - data["current_rr"] / data["psi_rr"], # FIXME + data["I_rr"] / (2 * data["psi_rr"]), # XXX: this factor of 2 not in Eq. 48 ) ) return data @@ -744,12 +741,11 @@ def _iota_current_num_r(params, transforms, profiles, data, **kwargs): description="Numerator of rotational transform formula, vacuum contribution, " + "first radial derivative", dim=1, - params=["c_l"], + params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", data=[ - "iota_vacuum_num", "lambda_t", "lambda_rt", "lambda_z", @@ -764,26 +760,29 @@ def _iota_current_num_r(params, transforms, profiles, data, **kwargs): axis_limit_data=["g_tt_rr", "g_tz_rr", "sqrt(g)_rr"], ) def _iota_vacuum_num_r(params, transforms, profiles, data, **kwargs): + iota_vacuum_num = ( + data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] + ) / data["sqrt(g)"] iota_vacuum_num_r = transforms["grid"].replace_at_axis( ( data["lambda_rz"] * data["g_tt"] + data["lambda_z"] * data["g_tt_r"] - data["lambda_rt"] * data["g_tz"] - (1 + data["lambda_t"]) * data["g_tz_r"] - - data["iota_vacuum_num"] * data["sqrt(g)_r"] + - iota_vacuum_num * data["sqrt(g)_r"] ) / data["sqrt(g)"], ( (1 + data["lambda_t"]) * data["g_tz_r"] * data["sqrt(g)_rr"] - / (2 * data["sqrt(g)_r"] ** 2) + / (2 * data["sqrt(g)_r"] ** 2) # XXX: this factor of 2 not in Eq. 48 + ( data["lambda_z"] * data["g_tt_rr"] - 2 * data["lambda_rt"] * data["g_tz_r"] - (1 + data["lambda_t"]) * data["g_tz_rr"] ) - / (2 * data["sqrt(g)_r"]) # FIXME + / (2 * data["sqrt(g)_r"]) # XXX: this factor of 2 not in Eq. 48 ), ) data["iota_vacuum_num_r"] = surface_integrals(transforms["grid"], iota_vacuum_num_r) @@ -1248,13 +1247,13 @@ def _iota_den_r(params, transforms, profiles, data, **kwargs): data["omega_t"] * data["g_tz_r"] * data["sqrt(g)_rr"] - / (2 * data["sqrt(g)_r"] ** 2) + / (2 * data["sqrt(g)_r"] ** 2) # XXX: this factor of 2 not in Eq. 48 + ( (1 + data["omega_z"]) * data["g_tt_rr"] - 2 * data["omega_rt"] * data["g_tz_r"] - data["omega_t"] * data["g_tz_rr"] ) - / (2 * data["sqrt(g)_r"]) + / (2 * data["sqrt(g)_r"]) # XXX: this factor of 2 not in Eq. 48 ), ) gamma_r = surface_integrals(transforms["grid"], gamma_r) From 7f319aa0f6767d11a28c5c7b483895ba60b9c460 Mon Sep 17 00:00:00 2001 From: Kaya Unalmis Date: Mon, 4 Sep 2023 23:09:52 -0400 Subject: [PATCH 05/16] Add lambda functions and simplify limit --- desc/compute/_profiles.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 4cd29fb07b..dd101821ca 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -624,7 +624,7 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): def _iota_current(params, transforms, profiles, data, **kwargs): data["iota_current"] = transforms["grid"].replace_at_axis( data["iota_current_num"] / data["iota_den"], - data["iota_current_num_r"] / data["iota_den_r"], + lambda: data["iota_current_num_r"] / data["iota_den_r"], ) return data @@ -646,7 +646,7 @@ def _iota_current(params, transforms, profiles, data, **kwargs): def _iota_vacuum(params, transforms, profiles, data, **kwargs): data["iota_vacuum"] = transforms["grid"].replace_at_axis( data["iota_vacuum_num"] / data["iota_den"], - data["iota_vacuum_num_r"] / data["iota_den_r"], + lambda: data["iota_vacuum_num_r"] / data["iota_den_r"], ) return data @@ -667,9 +667,12 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): ) def _iota_current_num(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" - data["iota_current_num"] = transforms["grid"].replace_at_axis( - 4 * jnp.pi**2 * data["I"] / data["psi_r"], - 4 * jnp.pi**2 * data["I_r"] / data["psi_rr"], + data["iota_current_num"] = ( + 4 + * jnp.pi**2 + * transforms["grid"].replace_at_axis( + data["I"] / data["psi_r"], lambda: data["I_r"] / data["psi_rr"] + ) ) return data @@ -686,20 +689,14 @@ def _iota_current_num(params, transforms, profiles, data, **kwargs): profiles=[], coordinates="r", data=["lambda_z", "g_tt", "lambda_t", "g_tz", "sqrt(g)"], - axis_limit_data=["g_tt_r", "g_tz_r", "lambda_rt", "lambda_rz", "sqrt(g)_r"], + axis_limit_data=["g_tz_r", "sqrt(g)_r"], ) def _iota_vacuum_num(params, transforms, profiles, data, **kwargs): """Vacuum contribution to the numerator of rotational transform formula.""" iota_vacuum_num = transforms["grid"].replace_at_axis( (data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"]) / data["sqrt(g)"], - ( - data["lambda_rz"] * data["g_tt"] - + data["lambda_z"] * data["g_tt_r"] - - data["lambda_rt"] * data["g_tz"] - - (1 + data["lambda_t"]) * data["g_tz_r"] - ) - / data["sqrt(g)_r"], + lambda: -(1 + data["lambda_t"]) * data["g_tz_r"] / data["sqrt(g)_r"], ) data["iota_vacuum_num"] = surface_integrals(transforms["grid"], iota_vacuum_num) return data @@ -727,7 +724,8 @@ def _iota_current_num_r(params, transforms, profiles, data, **kwargs): * transforms["grid"].replace_at_axis( (data["I_r"] * data["psi_r"] - data["I"] * data["psi_rr"]) / data["psi_r"] ** 2, - data["I_rr"] / (2 * data["psi_rr"]), # XXX: this factor of 2 not in Eq. 48 + lambda: data["I_rr"] + / (2 * data["psi_rr"]), # XXX: this factor of 2 not in Eq. 48 ) ) return data @@ -772,7 +770,7 @@ def _iota_vacuum_num_r(params, transforms, profiles, data, **kwargs): - iota_vacuum_num * data["sqrt(g)_r"] ) / data["sqrt(g)"], - ( + lambda: ( (1 + data["lambda_t"]) * data["g_tz_r"] * data["sqrt(g)_rr"] From 6e9b9e2a68cbbf8053664985ce96eca7392a11b7 Mon Sep 17 00:00:00 2001 From: Kaya Unalmis Date: Mon, 4 Sep 2023 23:23:35 -0400 Subject: [PATCH 06/16] Remove guard to return jnp.nan in computation of `iota_den` on equilibrium with fixed iota profiles. This is needed so that quantities like iota_current and iota_vacuum can be computed on equilibrium with fixed iota profiles. --- desc/compute/_profiles.py | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index dd101821ca..0aae186d46 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -1167,9 +1167,9 @@ def _iota_num_rrr(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", - data=["0", "g_tt", "g_tz", "sqrt(g)", "omega_t", "omega_z"], + data=["g_tt", "g_tz", "sqrt(g)", "omega_t", "omega_z"], ) def _iota_den(params, transforms, profiles, data, **kwargs): """Denominator of rotational transform formula. @@ -1177,10 +1177,6 @@ def _iota_den(params, transforms, profiles, data, **kwargs): Computes 𝛾 as defined in the document attached to the description of GitHub pull request #556. """ - if profiles["current"] is None: - data["iota_den"] = jnp.nan * data["0"] - return data - gamma = ( (1 + data["omega_z"]) * data["g_tt"] - data["omega_t"] * data["g_tz"] ) / data["sqrt(g)"] @@ -1202,10 +1198,9 @@ def _iota_den(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", data=[ - "0", "g_tt", "g_tt_r", "g_tz", @@ -1225,10 +1220,6 @@ def _iota_den_r(params, transforms, profiles, data, **kwargs): Computes d𝛾/d𝜌 as defined in the document attached to the description of GitHub pull request #556. """ - if profiles["current"] is None: - data["iota_den_r"] = jnp.nan * data["0"] - return data - gamma = ( (1 + data["omega_z"]) * data["g_tt"] - data["omega_t"] * data["g_tz"] ) / data["sqrt(g)"] @@ -1268,10 +1259,9 @@ def _iota_den_r(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", data=[ - "0", "g_tt", "g_tt_r", "g_tt_rr", @@ -1296,10 +1286,6 @@ def _iota_den_rr(params, transforms, profiles, data, **kwargs): Computes d2𝛾/d𝜌2 as defined in the document attached to the description of GitHub pull request #556. """ - if profiles["current"] is None: - data["iota_den_rr"] = jnp.nan * data["0"] - return data - gamma = ( (1 + data["omega_z"]) * data["g_tt"] - data["omega_t"] * data["g_tz"] ) / data["sqrt(g)"] @@ -1361,10 +1347,9 @@ def _iota_den_rr(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={"grid": []}, - profiles=["current"], + profiles=[], coordinates="r", data=[ - "0", "g_tt", "g_tt_r", "g_tt_rr", @@ -1393,10 +1378,6 @@ def _iota_den_rrr(params, transforms, profiles, data, **kwargs): Computes d3𝛾/d𝜌3 as defined in the document attached to the description of GitHub pull request #556. """ - if profiles["current"] is None: - data["iota_den_rrr"] = jnp.nan * data["0"] - return data - gamma = ( (1 + data["omega_z"]) * data["g_tt"] - data["omega_t"] * data["g_tz"] ) / data["sqrt(g)"] From 8c02327f8ee8e915d3fbb1ae76d733f5abe28981 Mon Sep 17 00:00:00 2001 From: Kaya Unalmis Date: Mon, 4 Sep 2023 23:29:13 -0400 Subject: [PATCH 07/16] Add iota_den to axis limit tests for fixed iota equilibrium --- tests/test_axis_limits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_axis_limits.py b/tests/test_axis_limits.py index a953e5bfc1..1a8d6c2a0e 100644 --- a/tests/test_axis_limits.py +++ b/tests/test_axis_limits.py @@ -102,7 +102,7 @@ def _skip_this(eq, name): or (eq.electron_density is None and "ne" in name) or (eq.ion_temperature is None and "Ti" in name) or (eq.pressure is not None and " Redl" in name) - or (eq.current is None and ("iota_num" in name or "iota_den" in name)) + or (eq.current is None and "iota_num" in name) ) From 3a358eca24ccb1c90193d47f36aa0b65615ef634 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Thu, 14 Sep 2023 11:49:37 -0600 Subject: [PATCH 08/16] refactoring --- desc/compute/_profiles.py | 212 ++++++++++++++------------------------ 1 file changed, 77 insertions(+), 135 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 9f783b29e7..d74f09d6c4 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -608,8 +608,8 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): @register_compute_fun( - name="iota_current", - label="\\iota_{\\mathrm{current}}", + name="iota current", + label="\\iota~\\mathrm{from~current}", units="~", units_long="None", description="Rotational transform (normalized by 2pi), current contribution", @@ -618,20 +618,20 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=[], coordinates="r", - data=["iota_current_num", "iota_den"], - axis_limit_data=["iota_current_num_r", "iota_den_r"], + data=["iota_den", "iota_num current"], + axis_limit_data=["iota_den_r", "iota_num_r current"], ) def _iota_current(params, transforms, profiles, data, **kwargs): - data["iota_current"] = transforms["grid"].replace_at_axis( - data["iota_current_num"] / data["iota_den"], - lambda: data["iota_current_num_r"] / data["iota_den_r"], + data["iota current"] = transforms["grid"].replace_at_axis( + data["iota_num current"] / data["iota_den"], + lambda: data["iota_num_r current"] / data["iota_den_r"], ) return data @register_compute_fun( - name="iota_vacuum", - label="\\iota_{\\mathrm{vacuum}}", + name="iota vacuum", + label="\\iota~\\mathrm{in~vacuum}", units="~", units_long="None", description="Rotational transform (normalized by 2pi), vacuum contribution", @@ -640,46 +640,53 @@ def _iota_current(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=[], coordinates="r", - data=["iota_den", "iota_vacuum_num"], - axis_limit_data=["iota_den_r", "iota_vacuum_num_r"], + data=["iota_den", "iota_num vacuum"], + axis_limit_data=["iota_den_r", "iota_num_r vacuum"], ) def _iota_vacuum(params, transforms, profiles, data, **kwargs): - data["iota_vacuum"] = transforms["grid"].replace_at_axis( - data["iota_vacuum_num"] / data["iota_den"], - lambda: data["iota_vacuum_num_r"] / data["iota_den_r"], + data["iota vacuum"] = transforms["grid"].replace_at_axis( + data["iota_num vacuum"] / data["iota_den"], + lambda: data["iota_num_r vacuum"] / data["iota_den_r"], ) return data @register_compute_fun( - name="iota_current_num", - label="\\iota_{\\mathrm{current, numerator}}", + name="iota_num current", + label="\\iota_{\\mathrm{numerator}}~\\mathrm{from~current}", units="m^{-1}", units_long="inverse meters", description="Numerator of rotational transform formula, current contribution", dim=1, - params=[], + params=["c_l"], transforms={"grid": []}, - profiles=[], + profiles=["current"], coordinates="r", - data=["I", "psi_r"], - axis_limit_data=["I_r", "psi_rr"], + data=["0", "psi_r"], + axis_limit_data=["psi_rr"], ) -def _iota_current_num(params, transforms, profiles, data, **kwargs): +def _iota_num_current(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" - data["iota_current_num"] = ( - 4 - * jnp.pi**2 + if profiles["current"] is None: + data["iota_num current"] = jnp.nan * data["0"] + return data + + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + data["iota_num current"] = ( + 2 + * jnp.pi + * mu_0 * transforms["grid"].replace_at_axis( - data["I"] / data["psi_r"], lambda: data["I_r"] / data["psi_rr"] + profiles["current"].compute(params["c_l"], dr=0) / data["psi_r"], + lambda: profiles["current"].compute(params["c_l"], dr=1) / data["psi_rr"], ) ) return data @register_compute_fun( - name="iota_vacuum_num", - label="\\iota_{\\mathrm{vacuum, numerator}}", + name="iota_num vacuum", + label="\\iota_{\\mathrm{numerator}}~\\mathrm{in~vacuum}", units="m^{-1}", units_long="inverse meters", description="Numerator of rotational transform formula, vacuum contribution", @@ -691,49 +698,57 @@ def _iota_current_num(params, transforms, profiles, data, **kwargs): data=["lambda_z", "g_tt", "lambda_t", "g_tz", "sqrt(g)"], axis_limit_data=["g_tz_r", "sqrt(g)_r"], ) -def _iota_vacuum_num(params, transforms, profiles, data, **kwargs): +def _iota_num_vacuum(params, transforms, profiles, data, **kwargs): """Vacuum contribution to the numerator of rotational transform formula.""" - iota_vacuum_num = transforms["grid"].replace_at_axis( + iota_num_vacuum = transforms["grid"].replace_at_axis( (data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"]) / data["sqrt(g)"], lambda: -(1 + data["lambda_t"]) * data["g_tz_r"] / data["sqrt(g)_r"], ) - data["iota_vacuum_num"] = surface_integrals(transforms["grid"], iota_vacuum_num) + data["iota_num vacuum"] = surface_integrals(transforms["grid"], iota_num_vacuum) return data @register_compute_fun( - name="iota_current_num_r", - label="\\partial_{\\rho} \\iota_{\\mathrm{current, numerator}}", + name="iota_num_r current", + label="\\partial_{\\rho} \\iota_{\\mathrm{numerator}}~\\mathrm{from~current}", units="m^{-1}", units_long="inverse meters", description="Numerator of rotational transform formula, current contribution, " + "first radial derivative", dim=1, - params=[], + params=["c_l"], transforms={"grid": []}, - profiles=[], + profiles=["current"], coordinates="r", - data=["I", "I_r", "psi_r", "psi_rr"], - axis_limit_data=["I_rr"], + data=["0", "psi_r", "psi_rr"], ) -def _iota_current_num_r(params, transforms, profiles, data, **kwargs): - data["iota_current_num_r"] = ( - 4 - * jnp.pi**2 +def _iota_num_r_current(params, transforms, profiles, data, **kwargs): + if profiles["current"] is None: + data["iota_num_r current"] = jnp.nan * data["0"] + return data + + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + data["iota_num_r current"] = ( + 2 + * jnp.pi + * mu_0 * transforms["grid"].replace_at_axis( - (data["I_r"] * data["psi_r"] - data["I"] * data["psi_rr"]) + ( + profiles["current"].compute(params["c_l"], dr=1) * data["psi_r"] + - profiles["current"].compute(params["c_l"], dr=0) * data["psi_rr"] + ) / data["psi_r"] ** 2, - lambda: data["I_rr"] - / (2 * data["psi_rr"]), # XXX: this factor of 2 not in Eq. 48 + lambda: profiles["current"].compute(params["c_l"], dr=2) + / (2 * data["psi_rr"]), ) ) return data @register_compute_fun( - name="iota_vacuum_num_r", - label="\\partial_{\\rho} \\iota_{\\mathrm{vacuum, numerator}}", + name="iota_num_r vacuum", + label="\\partial_{\\rho} \\iota_{\\mathrm{numerator}}~\\mathrm{in~vacuum}", units="m^{-1}", units_long="inverse meters", description="Numerator of rotational transform formula, vacuum contribution, " @@ -757,33 +772,33 @@ def _iota_current_num_r(params, transforms, profiles, data, **kwargs): ], axis_limit_data=["g_tt_rr", "g_tz_rr", "sqrt(g)_rr"], ) -def _iota_vacuum_num_r(params, transforms, profiles, data, **kwargs): - iota_vacuum_num = ( +def _iota_num_r_vacuum(params, transforms, profiles, data, **kwargs): + iota_num_vacuum = ( data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] ) / data["sqrt(g)"] - iota_vacuum_num_r = transforms["grid"].replace_at_axis( + iota_num_r_vacuum = transforms["grid"].replace_at_axis( ( data["lambda_rz"] * data["g_tt"] + data["lambda_z"] * data["g_tt_r"] - data["lambda_rt"] * data["g_tz"] - (1 + data["lambda_t"]) * data["g_tz_r"] - - iota_vacuum_num * data["sqrt(g)_r"] + - iota_num_vacuum * data["sqrt(g)_r"] ) / data["sqrt(g)"], lambda: ( (1 + data["lambda_t"]) * data["g_tz_r"] * data["sqrt(g)_rr"] - / (2 * data["sqrt(g)_r"] ** 2) # XXX: this factor of 2 not in Eq. 48 + / (2 * data["sqrt(g)_r"] ** 2) + ( data["lambda_z"] * data["g_tt_rr"] - 2 * data["lambda_rt"] * data["g_tz_r"] - (1 + data["lambda_t"]) * data["g_tz_rr"] ) - / (2 * data["sqrt(g)_r"]) # XXX: this factor of 2 not in Eq. 48 + / (2 * data["sqrt(g)_r"]) ), ) - data["iota_vacuum_num_r"] = surface_integrals(transforms["grid"], iota_vacuum_num_r) + data["iota_num_r vacuum"] = surface_integrals(transforms["grid"], iota_num_r_vacuum) return data @@ -794,11 +809,11 @@ def _iota_vacuum_num_r(params, transforms, profiles, data, **kwargs): units_long="inverse meters", description="Numerator of rotational transform formula", dim=1, - params=["c_l"], - transforms={"grid": []}, + params=[], + transforms={}, profiles=["current"], coordinates="r", - data=["0", "lambda_z", "g_tt", "lambda_t", "g_tz", "sqrt(g)", "psi_r"], + data=["0", "iota_num current", "iota_num vacuum"], ) def _iota_num(params, transforms, profiles, data, **kwargs): """Numerator of rotational transform formula. @@ -811,20 +826,7 @@ def _iota_num(params, transforms, profiles, data, **kwargs): data["iota_num"] = jnp.nan * data["0"] return data - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - alpha = ( - 2 - * jnp.pi - * mu_0 - * profiles["current"].compute(params["c_l"], dr=0) - / data["psi_r"] - ) - beta = surface_integrals( - transforms["grid"], - (data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"]) - / data["sqrt(g)"], - ) - data["iota_num"] = transforms["grid"].replace_at_axis(alpha + beta, 0) + data["iota_num"] = data["iota_num current"] + data["iota_num vacuum"] return data @@ -835,26 +837,11 @@ def _iota_num(params, transforms, profiles, data, **kwargs): units_long="inverse meters", description="Numerator of rotational transform formula, first radial derivative", dim=1, - params=["c_l"], - transforms={"grid": []}, + params=[], + transforms={}, profiles=["current"], coordinates="r", - data=[ - "0", - "lambda_t", - "lambda_rt", - "lambda_z", - "lambda_rz", - "g_tt", - "g_tt_r", - "g_tz", - "g_tz_r", - "sqrt(g)", - "sqrt(g)_r", - "psi_r", - "psi_rr", - ], - axis_limit_data=["g_tt_rr", "g_tz_rr", "sqrt(g)_rr", "psi_rrr"], + data=["0", "iota_num_r current", "iota_num_r vacuum"], ) def _iota_num_r(params, transforms, profiles, data, **kwargs): """Numerator of rotational transform formula, first radial derivative. @@ -867,52 +854,7 @@ def _iota_num_r(params, transforms, profiles, data, **kwargs): data["iota_num_r"] = jnp.nan * data["0"] return data - current_r = profiles["current"].compute(params["c_l"], dr=1) - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - alpha_r = ( - jnp.pi - * mu_0 - * transforms["grid"].replace_at_axis( - 2 - * ( - current_r * data["psi_r"] - - profiles["current"].compute(params["c_l"], dr=0) * data["psi_rr"] - ) - / data["psi_r"] ** 2, - lambda: ( - profiles["current"].compute(params["c_l"], dr=2) * data["psi_rr"] - - current_r * data["psi_rrr"] # FIXME: psi_rrr=0 - ) - / data["psi_rr"] ** 2, - ) - ) - beta = ( - data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] - ) / data["sqrt(g)"] - beta_r = transforms["grid"].replace_at_axis( - ( - data["lambda_rz"] * data["g_tt"] - + data["lambda_z"] * data["g_tt_r"] - - data["lambda_rt"] * data["g_tz"] - - (1 + data["lambda_t"]) * data["g_tz_r"] - - beta * data["sqrt(g)_r"] - ) - / data["sqrt(g)"], - lambda: ( - (1 + data["lambda_t"]) - * data["g_tz_r"] - * data["sqrt(g)_rr"] - / (2 * data["sqrt(g)_r"] ** 2) - + ( - data["lambda_z"] * data["g_tt_rr"] - - 2 * data["lambda_rt"] * data["g_tz_r"] - - (1 + data["lambda_t"]) * data["g_tz_rr"] - ) - / (2 * data["sqrt(g)_r"]) - ), - ) - beta_r = surface_integrals(transforms["grid"], beta_r) - data["iota_num_r"] = alpha_r + beta_r + data["iota_num_r"] = data["iota_num_r current"] + data["iota_num_r vacuum"] return data @@ -1236,13 +1178,13 @@ def _iota_den_r(params, transforms, profiles, data, **kwargs): data["omega_t"] * data["g_tz_r"] * data["sqrt(g)_rr"] - / (2 * data["sqrt(g)_r"] ** 2) # XXX: this factor of 2 not in Eq. 48 + / (2 * data["sqrt(g)_r"] ** 2) + ( (1 + data["omega_z"]) * data["g_tt_rr"] - 2 * data["omega_rt"] * data["g_tz_r"] - data["omega_t"] * data["g_tz_rr"] ) - / (2 * data["sqrt(g)_r"]) # XXX: this factor of 2 not in Eq. 48 + / (2 * data["sqrt(g)_r"]) ), ) gamma_r = surface_integrals(transforms["grid"], gamma_r) From 2dd0285f495880709f41ce1886feeb88fb7359c1 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Thu, 14 Sep 2023 12:05:52 -0600 Subject: [PATCH 09/16] update profile compute syntax --- desc/compute/_profiles.py | 43 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index d74f09d6c4..5e5f2ce7eb 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -672,13 +672,15 @@ def _iota_num_current(params, transforms, profiles, data, **kwargs): return data # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) data["iota_num current"] = ( 2 * jnp.pi * mu_0 * transforms["grid"].replace_at_axis( - profiles["current"].compute(params["c_l"], dr=0) / data["psi_r"], - lambda: profiles["current"].compute(params["c_l"], dr=1) / data["psi_rr"], + current / data["psi_r"], + lambda: current_r / data["psi_rr"], ) ) return data @@ -729,18 +731,16 @@ def _iota_num_r_current(params, transforms, profiles, data, **kwargs): return data # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) data["iota_num_r current"] = ( 2 * jnp.pi * mu_0 * transforms["grid"].replace_at_axis( - ( - profiles["current"].compute(params["c_l"], dr=1) * data["psi_r"] - - profiles["current"].compute(params["c_l"], dr=0) * data["psi_rr"] - ) - / data["psi_r"] ** 2, - lambda: profiles["current"].compute(params["c_l"], dr=2) - / (2 * data["psi_rr"]), + (current_r * data["psi_r"] - current * data["psi_rr"]) / data["psi_r"] ** 2, + lambda: current_rr / (2 * data["psi_rr"]), ) ) return data @@ -903,9 +903,11 @@ def _iota_num_rr(params, transforms, profiles, data, **kwargs): data["iota_num_rr"] = jnp.nan * data["0"] return data - current_r = profiles["current"].compute(params["c_l"], dr=1) - current_rr = profiles["current"].compute(params["c_l"], dr=2) # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) + current_rrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=3) alpha_rr = ( jnp.pi * mu_0 @@ -913,12 +915,10 @@ def _iota_num_rr(params, transforms, profiles, data, **kwargs): 2 * current_rr / data["psi_r"] - 4 * current_r * data["psi_rr"] / data["psi_r"] ** 2 + 2 - * profiles["current"].compute(params["c_l"], dr=0) + * current * (2 * data["psi_rr"] ** 2 - data["psi_rrr"] * data["psi_r"]) / data["psi_r"] ** 3, - lambda: 2 - * profiles["current"].compute(params["c_l"], dr=3) - / (3 * data["psi_rr"]) + lambda: 2 * current_rrr / (3 * data["psi_rr"]) - current_rr * data["psi_rrr"] / data["psi_rr"] ** 2 + current_r * data["psi_rrr"] ** 2 / data["psi_rr"] ** 3, ) @@ -1024,9 +1024,11 @@ def _iota_num_rrr(params, transforms, profiles, data, **kwargs): data["iota_num_rrr"] = jnp.nan * data["0"] return data - current_r = profiles["current"].compute(params["c_l"], dr=1) - current_rr = profiles["current"].compute(params["c_l"], dr=2) - current_rrr = profiles["current"].compute(params["c_l"], dr=3) + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) + current_rrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=3) + current_rrrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=4) # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current alpha_rrr = ( jnp.pi @@ -1042,11 +1044,10 @@ def _iota_num_rrr(params, transforms, profiles, data, **kwargs): ) / data["psi_r"] ** 4 + 12 - * profiles["current"].compute(params["c_l"], dr=0) + * current * (data["psi_rrr"] * data["psi_rr"] * data["psi_r"] - data["psi_rr"] ** 3) / data["psi_r"] ** 4, - lambda: profiles["current"].compute(params["c_l"], dr=4) - / (2 * data["psi_rr"]) + lambda: current_rrrr / (2 * data["psi_rr"]) - current_rrr * data["psi_rrr"] / data["psi_rr"] ** 2 + 3 * current_rr * data["psi_rrr"] ** 2 / (2 * data["psi_rr"] ** 3) - 3 * current_r * data["psi_rrr"] ** 3 / (2 * data["psi_rr"] ** 4), From 389e86653c9ac3a06c85e72af4046d1de3ffdc26 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 26 Sep 2023 19:17:09 -0600 Subject: [PATCH 10/16] workaround for eq with iota profiles --- desc/compute/_profiles.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 353b4177c2..aca4a65257 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -644,18 +644,22 @@ def _iota_rr(params, transforms, profiles, data, **kwargs): units_long="None", description="Rotational transform (normalized by 2pi), current contribution", dim=1, - params=[], + params=["i_l"], transforms={"grid": []}, - profiles=[], + profiles=["iota", "current"], coordinates="r", - data=["iota_den", "iota_num current"], + data=["iota vacuum", "iota_den", "iota_num current"], axis_limit_data=["iota_den_r", "iota_num_r current"], ) def _iota_current(params, transforms, profiles, data, **kwargs): - data["iota current"] = transforms["grid"].replace_at_axis( - data["iota_num current"] / data["iota_den"], - lambda: data["iota_num_r current"] / data["iota_den_r"], - ) + if profiles["iota"] is not None: + iota = profiles["iota"].compute(transforms["grid"], params["i_l"], dr=0) + data["iota current"] = iota - data["iota vacuum"] + elif profiles["current"] is not None: + data["iota current"] = transforms["grid"].replace_at_axis( + data["iota_num current"] / data["iota_den"], + lambda: data["iota_num_r current"] / data["iota_den_r"], + ) return data From 953c8db7bdb9c8706863eaf9f5c78b71fb9cc3bc Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 26 Sep 2023 19:17:44 -0600 Subject: [PATCH 11/16] add tests for iota components --- tests/test_compute_funs.py | 48 ++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/tests/test_compute_funs.py b/tests/test_compute_funs.py index 233950472c..da34adad67 100644 --- a/tests/test_compute_funs.py +++ b/tests/test_compute_funs.py @@ -18,6 +18,7 @@ ZernikeRZToroidalSection, ) from desc.grid import LinearGrid, QuadratureGrid +from desc.io import load # convolve kernel is reverse of FD coeffs FD_COEF_1_2 = np.array([-1 / 2, 0, 1 / 2])[::-1] @@ -46,9 +47,7 @@ def myconvolve_2d(arr_1d, stencil, shape): @pytest.mark.unit def test_total_volume(DummyStellarator): """Test that the volume enclosed by the LCFS is equal to the total volume.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") grid = LinearGrid(M=12, N=12, NFP=eq.NFP, sym=eq.sym) # rho = 1 lcfs_volume = eq.compute("V(r)", grid=grid)["V(r)"] @@ -176,9 +175,7 @@ def test_elongation(): @pytest.mark.unit def test_magnetic_field_derivatives(DummyStellarator): """Test that the derivatives of B and |B| are close to numerical derivatives.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") # partial derivatives wrt rho rtol = 1e-3 @@ -958,9 +955,7 @@ def test_magnetic_field_derivatives(DummyStellarator): @pytest.mark.unit def test_metric_derivatives(DummyStellarator): """Compare analytic formula for metric derivatives with finite differences.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") metric_components = ["g^rr", "g^rt", "g^rz", "g^tt", "g^tz", "g^zz"] @@ -1020,9 +1015,7 @@ def test_metric_derivatives(DummyStellarator): @pytest.mark.unit def test_magnetic_pressure_gradient(DummyStellarator): """Test that the components of grad(|B|^2)) match with numerical gradients.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") # partial derivatives wrt rho num_rho = 110 @@ -1087,9 +1080,7 @@ def test_currents(DSHAPE_current): @pytest.mark.unit def test_BdotgradB(DummyStellarator): """Test that the components of grad(B*grad(|B|)) match with numerical gradients.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") def test_partial_derivative(name): cases = { @@ -1293,9 +1284,7 @@ def test_compute_averages(): @pytest.mark.unit def test_covariant_basis_vectors(DummyStellarator): """Test calculation of covariant basis vectors by comparing to finite diff of x.""" - eq = Equilibrium.load( - load_from=str(DummyStellarator["output_path"]), file_format="hdf5" - ) + eq = load(load_from=str(DummyStellarator["output_path"]), file_format="hdf5") keys = [ "e_rho", "e_rho_r", @@ -1572,3 +1561,26 @@ def test_contravariant_basis_vectors(): atol=atol, err_msg=key, ) + + +@pytest.mark.unit +@pytest.mark.solve +def test_iota_components(HELIOTRON_vac): + """Test that iota components are computed correctly.""" + # axisymmetric, so all rotational transform should be from the current + eq_i = get("DSHAPE") # iota profile assigned + eq_c = get("DSHAPE_CURRENT") # current profile assigned + grid = LinearGrid(L=100, M=max(eq_i.M_grid, eq_c.M_grid), N=0, NFP=1, axis=True) + data_i = eq_i.compute(["iota", "iota current", "iota vacuum"], grid) + data_c = eq_c.compute(["iota", "iota current", "iota vacuum"], grid) + np.testing.assert_allclose(data_i["iota"], data_i["iota current"]) + np.testing.assert_allclose(data_c["iota"], data_c["iota current"]) + np.testing.assert_allclose(data_i["iota vacuum"], 0) + np.testing.assert_allclose(data_c["iota vacuum"], 0) + + # vacuum stellarator, so all rotational transform should be from the external field + eq = load(load_from=str(HELIOTRON_vac["desc_h5_path"]), file_format="hdf5")[-1] + grid = LinearGrid(L=100, M=eq.M_grid, N=eq.N_grid, NFP=eq.NFP, axis=True) + data = eq.compute(["iota", "iota current", "iota vacuum"], grid) + np.testing.assert_allclose(data["iota"], data["iota vacuum"]) + np.testing.assert_allclose(data["iota current"], 0) From e0257c526288de9f0c94d06532505f7b87c8ef81 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Wed, 27 Sep 2023 04:36:57 -0600 Subject: [PATCH 12/16] update master compute data with 'iota_den' not NaN --- tests/inputs/master_compute_data.pkl | Bin 4237167 -> 4269248 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 f6161659b6da9c1a75925ae2a65f1da8782f9015..48aa575c285d7643958cbe7d6caf9127ee2a9fcc 100644 GIT binary patch delta 127053 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 S*ULhQ$Rl_jE)}%6qcf6 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 delta 85756 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 K=DB}g=>G$Rgvr|g From ed4ac368ef9ad37f41a5379ea68e6448614c1ce2 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Mon, 2 Oct 2023 15:01:50 -0600 Subject: [PATCH 13/16] reformatting to use consistent profile logic --- desc/compute/_profiles.py | 362 ++++++++++++++++++++------------------ 1 file changed, 186 insertions(+), 176 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index aca4a65257..4bbbd6eef8 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -701,22 +701,21 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): ) def _iota_num_current(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num current"] = jnp.nan * data["0"] - return data - - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) - current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) - data["iota_num current"] = ( - 2 - * jnp.pi - * mu_0 - * transforms["grid"].replace_at_axis( - current / data["psi_r"], - lambda: current_r / data["psi_rr"], + elif profiles["current"] is not None: + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + data["iota_num current"] = ( + 2 + * jnp.pi + * mu_0 + * transforms["grid"].replace_at_axis( + current / data["psi_r"], + lambda: current_r / data["psi_rr"], + ) ) - ) return data @@ -760,23 +759,25 @@ def _iota_num_vacuum(params, transforms, profiles, data, **kwargs): data=["0", "psi_r", "psi_rr"], ) def _iota_num_r_current(params, transforms, profiles, data, **kwargs): - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num_r current"] = jnp.nan * data["0"] - return data - - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) - current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) - current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) - data["iota_num_r current"] = ( - 2 - * jnp.pi - * mu_0 - * transforms["grid"].replace_at_axis( - (current_r * data["psi_r"] - current * data["psi_rr"]) / data["psi_r"] ** 2, - lambda: current_rr / (2 * data["psi_rr"]), + elif profiles["current"] is not None: + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=2 + ) + data["iota_num_r current"] = ( + 2 + * jnp.pi + * mu_0 + * transforms["grid"].replace_at_axis( + (current_r * data["psi_r"] - current * data["psi_rr"]) + / data["psi_r"] ** 2, + lambda: current_rr / (2 * data["psi_rr"]), + ) ) - ) return data @@ -856,11 +857,10 @@ def _iota_num(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num"] = jnp.nan * data["0"] - return data - - data["iota_num"] = data["iota_num current"] + data["iota_num vacuum"] + elif profiles["current"] is not None: + data["iota_num"] = data["iota_num current"] + data["iota_num vacuum"] return data @@ -884,11 +884,10 @@ def _iota_num_r(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num_r"] = jnp.nan * data["0"] - return data - - data["iota_num_r"] = data["iota_num_r current"] + data["iota_num_r vacuum"] + elif profiles["current"] is not None: + data["iota_num_r"] = data["iota_num_r current"] + data["iota_num_r vacuum"] return data @@ -933,79 +932,82 @@ def _iota_num_rr(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num_rr"] = jnp.nan * data["0"] - return data - - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) - current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) - current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) - current_rrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=3) - alpha_rr = ( - jnp.pi - * mu_0 - * transforms["grid"].replace_at_axis( - 2 * current_rr / data["psi_r"] - - 4 * current_r * data["psi_rr"] / data["psi_r"] ** 2 - + 2 - * current - * (2 * data["psi_rr"] ** 2 - data["psi_rrr"] * data["psi_r"]) - / data["psi_r"] ** 3, - lambda: 2 * current_rrr / (3 * data["psi_rr"]) - - current_rr * data["psi_rrr"] / data["psi_rr"] ** 2 - + current_r * data["psi_rrr"] ** 2 / data["psi_rr"] ** 3, + elif profiles["current"] is not None: + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=2 ) - ) - beta = ( - data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] - ) / data["sqrt(g)"] - beta_r = ( - data["lambda_rz"] * data["g_tt"] - + data["lambda_z"] * data["g_tt_r"] - - data["lambda_rt"] * data["g_tz"] - - (1 + data["lambda_t"]) * data["g_tz_r"] - - beta * data["sqrt(g)_r"] - ) / data["sqrt(g)"] - beta_rr = transforms["grid"].replace_at_axis( - ( - data["lambda_rrz"] * data["g_tt"] - + 2 * data["lambda_rz"] * data["g_tt_r"] - + data["lambda_z"] * data["g_tt_rr"] - - data["lambda_rrt"] * data["g_tz"] - - 2 * data["lambda_rt"] * data["g_tz_r"] - - (1 + data["lambda_t"]) * data["g_tz_rr"] - - 2 * beta_r * data["sqrt(g)_r"] - - beta * data["sqrt(g)_rr"] + current_rrr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=3 ) - / data["sqrt(g)"], - lambda: ( - 2 - * data["sqrt(g)_r"] ** 2 - * ( - 3 * data["g_tt_rr"] * data["lambda_rz"] - + data["g_tt_rrr"] * data["lambda_z"] - - 3 * data["g_tz_rr"] * data["lambda_rt"] - - 3 * data["g_tz_r"] * data["lambda_rrt"] - - data["g_tz_rrr"] * (1 + data["lambda_t"]) + alpha_rr = ( + jnp.pi + * mu_0 + * transforms["grid"].replace_at_axis( + 2 * current_rr / data["psi_r"] + - 4 * current_r * data["psi_rr"] / data["psi_r"] ** 2 + + 2 + * current + * (2 * data["psi_rr"] ** 2 - data["psi_rrr"] * data["psi_r"]) + / data["psi_r"] ** 3, + lambda: 2 * current_rrr / (3 * data["psi_rr"]) + - current_rr * data["psi_rrr"] / data["psi_rr"] ** 2 + + current_r * data["psi_rrr"] ** 2 / data["psi_rr"] ** 3, ) - + data["sqrt(g)_r"] - * ( - 3 - * data["sqrt(g)_rr"] + ) + beta = ( + data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] + ) / data["sqrt(g)"] + beta_r = ( + data["lambda_rz"] * data["g_tt"] + + data["lambda_z"] * data["g_tt_r"] + - data["lambda_rt"] * data["g_tz"] + - (1 + data["lambda_t"]) * data["g_tz_r"] + - beta * data["sqrt(g)_r"] + ) / data["sqrt(g)"] + beta_rr = transforms["grid"].replace_at_axis( + ( + data["lambda_rrz"] * data["g_tt"] + + 2 * data["lambda_rz"] * data["g_tt_r"] + + data["lambda_z"] * data["g_tt_rr"] + - data["lambda_rrt"] * data["g_tz"] + - 2 * data["lambda_rt"] * data["g_tz_r"] + - (1 + data["lambda_t"]) * data["g_tz_rr"] + - 2 * beta_r * data["sqrt(g)_r"] + - beta * data["sqrt(g)_rr"] + ) + / data["sqrt(g)"], + lambda: ( + 2 + * data["sqrt(g)_r"] ** 2 + * ( + 3 * data["g_tt_rr"] * data["lambda_rz"] + + data["g_tt_rrr"] * data["lambda_z"] + - 3 * data["g_tz_rr"] * data["lambda_rt"] + - 3 * data["g_tz_r"] * data["lambda_rrt"] + - data["g_tz_rrr"] * (1 + data["lambda_t"]) + ) + + data["sqrt(g)_r"] * ( - 2 * data["g_tz_r"] * data["lambda_rt"] - - data["g_tt_rr"] * data["lambda_t"] - + data["g_tz_rr"] * (1 + data["lambda_t"]) + 3 + * data["sqrt(g)_rr"] + * ( + 2 * data["g_tz_r"] * data["lambda_rt"] + - data["g_tt_rr"] * data["lambda_t"] + + data["g_tz_rr"] * (1 + data["lambda_t"]) + ) + + 2 * data["sqrt(g)_rrr"] * data["g_tz_r"] * (1 + data["lambda_t"]) ) - + 2 * data["sqrt(g)_rrr"] * data["g_tz_r"] * (1 + data["lambda_t"]) + - 3 * data["sqrt(g)_rr"] ** 2 * data["g_tz_r"] * (1 + data["lambda_t"]) ) - - 3 * data["sqrt(g)_rr"] ** 2 * data["g_tz_r"] * (1 + data["lambda_t"]) + / (6 * data["sqrt(g)_r"] ** 3), ) - / (6 * data["sqrt(g)_r"] ** 3), - ) - beta_rr = surface_integrals(transforms["grid"], beta_rr) - data["iota_num_rr"] = alpha_rr + beta_rr + beta_rr = surface_integrals(transforms["grid"], beta_rr) + data["iota_num_rr"] = alpha_rr + beta_rr return data @@ -1054,84 +1056,92 @@ def _iota_num_rrr(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["current"] is None: + if profiles["iota"] is not None: data["iota_num_rrr"] = jnp.nan * data["0"] - return data - - current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) - current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) - current_rr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=2) - current_rrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=3) - current_rrrr = profiles["current"].compute(transforms["grid"], params["c_l"], dr=4) - # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current - alpha_rrr = ( - jnp.pi - * mu_0 - * transforms["grid"].replace_at_axis( - 2 * current_rrr / data["psi_r"] - - 6 * current_rr * data["psi_rr"] / data["psi_r"] ** 2 - + 6 - * current_r - * ( - 2 * data["psi_r"] * data["psi_rr"] ** 2 - - data["psi_rrr"] * data["psi_r"] ** 2 + elif profiles["current"] is not None: + current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) + current_r = profiles["current"].compute(transforms["grid"], params["c_l"], dr=1) + current_rr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=2 + ) + current_rrr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=3 + ) + current_rrrr = profiles["current"].compute( + transforms["grid"], params["c_l"], dr=4 + ) + # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current + alpha_rrr = ( + jnp.pi + * mu_0 + * transforms["grid"].replace_at_axis( + 2 * current_rrr / data["psi_r"] + - 6 * current_rr * data["psi_rr"] / data["psi_r"] ** 2 + + 6 + * current_r + * ( + 2 * data["psi_r"] * data["psi_rr"] ** 2 + - data["psi_rrr"] * data["psi_r"] ** 2 + ) + / data["psi_r"] ** 4 + + 12 + * current + * ( + data["psi_rrr"] * data["psi_rr"] * data["psi_r"] + - data["psi_rr"] ** 3 + ) + / data["psi_r"] ** 4, + lambda: current_rrrr / (2 * data["psi_rr"]) + - current_rrr * data["psi_rrr"] / data["psi_rr"] ** 2 + + 3 * current_rr * data["psi_rrr"] ** 2 / (2 * data["psi_rr"] ** 3) + - 3 * current_r * data["psi_rrr"] ** 3 / (2 * data["psi_rr"] ** 4), ) - / data["psi_r"] ** 4 - + 12 - * current - * (data["psi_rrr"] * data["psi_rr"] * data["psi_r"] - data["psi_rr"] ** 3) - / data["psi_r"] ** 4, - lambda: current_rrrr / (2 * data["psi_rr"]) - - current_rrr * data["psi_rrr"] / data["psi_rr"] ** 2 - + 3 * current_rr * data["psi_rrr"] ** 2 / (2 * data["psi_rr"] ** 3) - - 3 * current_r * data["psi_rrr"] ** 3 / (2 * data["psi_rr"] ** 4), ) - ) - beta = ( - data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] - ) / data["sqrt(g)"] - beta_r = ( - data["lambda_rz"] * data["g_tt"] - + data["lambda_z"] * data["g_tt_r"] - - data["lambda_rt"] * data["g_tz"] - - (1 + data["lambda_t"]) * data["g_tz_r"] - - beta * data["sqrt(g)_r"] - ) / data["sqrt(g)"] - beta_rr = ( - data["lambda_rrz"] * data["g_tt"] - + 2 * data["lambda_rz"] * data["g_tt_r"] - + data["lambda_z"] * data["g_tt_rr"] - - data["lambda_rrt"] * data["g_tz"] - - 2 * data["lambda_rt"] * data["g_tz_r"] - - (1 + data["lambda_t"]) * data["g_tz_rr"] - - 2 * beta_r * data["sqrt(g)_r"] - - beta * data["sqrt(g)_rr"] - ) / data["sqrt(g)"] - beta_rrr = transforms["grid"].replace_at_axis( - ( - data["lambda_rrrz"] * data["g_tt"] - + 3 * data["lambda_rrz"] * data["g_tt_r"] - + 3 * data["lambda_rz"] * data["g_tt_rr"] - + data["lambda_z"] * data["g_tt_rrr"] - - data["lambda_rrrt"] * data["g_tz"] - - 3 * data["lambda_rrt"] * data["g_tz_r"] - - 3 * data["lambda_rt"] * data["g_tz_rr"] - - (1 + data["lambda_t"]) * data["g_tz_rrr"] - - 3 * beta_rr * data["sqrt(g)_r"] - - 3 * beta_r * data["sqrt(g)_rr"] - - beta * data["sqrt(g)_rrr"] + beta = ( + data["lambda_z"] * data["g_tt"] - (1 + data["lambda_t"]) * data["g_tz"] + ) / data["sqrt(g)"] + beta_r = ( + data["lambda_rz"] * data["g_tt"] + + data["lambda_z"] * data["g_tt_r"] + - data["lambda_rt"] * data["g_tz"] + - (1 + data["lambda_t"]) * data["g_tz_r"] + - beta * data["sqrt(g)_r"] + ) / data["sqrt(g)"] + beta_rr = ( + data["lambda_rrz"] * data["g_tt"] + + 2 * data["lambda_rz"] * data["g_tt_r"] + + data["lambda_z"] * data["g_tt_rr"] + - data["lambda_rrt"] * data["g_tz"] + - 2 * data["lambda_rt"] * data["g_tz_r"] + - (1 + data["lambda_t"]) * data["g_tz_rr"] + - 2 * beta_r * data["sqrt(g)_r"] + - beta * data["sqrt(g)_rr"] + ) / data["sqrt(g)"] + beta_rrr = transforms["grid"].replace_at_axis( + ( + data["lambda_rrrz"] * data["g_tt"] + + 3 * data["lambda_rrz"] * data["g_tt_r"] + + 3 * data["lambda_rz"] * data["g_tt_rr"] + + data["lambda_z"] * data["g_tt_rrr"] + - data["lambda_rrrt"] * data["g_tz"] + - 3 * data["lambda_rrt"] * data["g_tz_r"] + - 3 * data["lambda_rt"] * data["g_tz_rr"] + - (1 + data["lambda_t"]) * data["g_tz_rrr"] + - 3 * beta_rr * data["sqrt(g)_r"] + - 3 * beta_r * data["sqrt(g)_rr"] + - beta * data["sqrt(g)_rrr"] + ) + / data["sqrt(g)"], + # Todo: axis limit of beta_rrr + # Computed with four applications of l’Hôpital’s rule. + # Requires sqrt(g)_rrrr and fourth derivatives of basis vectors. + jnp.nan, + ) + beta_rrr = surface_integrals(transforms["grid"], beta_rrr) + # force limit to nan until completed because integration replaces nan with 0 + data["iota_num_rrr"] = alpha_rrr + transforms["grid"].replace_at_axis( + beta_rrr, jnp.nan ) - / data["sqrt(g)"], - # Todo: axis limit of beta_rrr - # Computed with four applications of l’Hôpital’s rule. - # Requires sqrt(g)_rrrr and fourth derivatives of basis vectors. - jnp.nan, - ) - beta_rrr = surface_integrals(transforms["grid"], beta_rrr) - # force limit to nan until completed because integration replaces nan with 0 - data["iota_num_rrr"] = alpha_rrr + transforms["grid"].replace_at_axis( - beta_rrr, jnp.nan - ) return data From 0203775039fa8a4022139ecb0dcb9d93e9e40878 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Mon, 2 Oct 2023 15:05:12 -0600 Subject: [PATCH 14/16] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba8baa0a0..47fb97f90e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Changelog ========= +- Adds new compute quantities `"iota current"` and `"iota vacuum"` to compute the +rotational transform contributions from the toroidal current and background field. + v0.10.1 ------- From 11fdac2ddf759114ab408b258cebf74c4e5ee434 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Mon, 2 Oct 2023 15:54:12 -0600 Subject: [PATCH 15/16] implementing some more things that used to be NaN --- desc/compute/_profiles.py | 34 +++++++++++++-------------- tests/inputs/master_compute_data.pkl | Bin 4269248 -> 4269248 bytes 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index 4bbbd6eef8..d154b95835 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -692,17 +692,18 @@ def _iota_vacuum(params, transforms, profiles, data, **kwargs): units_long="inverse meters", description="Numerator of rotational transform formula, current contribution", dim=1, - params=["c_l"], + params=["c_l", "i_l"], transforms={"grid": []}, - profiles=["current"], + profiles=["current", "iota"], coordinates="r", - data=["0", "psi_r"], + data=["psi_r", "iota_den", "iota_num vacuum"], axis_limit_data=["psi_rr"], ) def _iota_num_current(params, transforms, profiles, data, **kwargs): """Current contribution to the numerator of rotational transform formula.""" if profiles["iota"] is not None: - data["iota_num current"] = jnp.nan * data["0"] + iota = profiles["iota"].compute(transforms["grid"], params["i_l"], dr=0) + data["iota_num current"] = iota * data["iota_den"] - data["iota_num vacuum"] elif profiles["current"] is not None: # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) @@ -752,15 +753,18 @@ def _iota_num_vacuum(params, transforms, profiles, data, **kwargs): description="Numerator of rotational transform formula, current contribution, " + "first radial derivative", dim=1, - params=["c_l"], + params=["c_l", "i_l"], transforms={"grid": []}, - profiles=["current"], + profiles=["current", "iota"], coordinates="r", - data=["0", "psi_r", "psi_rr"], + data=["psi_r", "psi_rr", "iota_den_r", "iota_num_r vacuum"], ) def _iota_num_r_current(params, transforms, profiles, data, **kwargs): if profiles["iota"] is not None: - data["iota_num_r current"] = jnp.nan * data["0"] + iota_r = profiles["iota"].compute(transforms["grid"], params["i_l"], dr=1) + data["iota_num_r current"] = ( + iota_r * data["iota_den_r"] - data["iota_num_r vacuum"] + ) elif profiles["current"] is not None: # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) @@ -846,7 +850,7 @@ def _iota_num_r_vacuum(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={}, - profiles=["current"], + profiles=[], coordinates="r", data=["0", "iota_num current", "iota_num vacuum"], ) @@ -857,10 +861,7 @@ def _iota_num(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["iota"] is not None: - data["iota_num"] = jnp.nan * data["0"] - elif profiles["current"] is not None: - data["iota_num"] = data["iota_num current"] + data["iota_num vacuum"] + data["iota_num"] = data["iota_num current"] + data["iota_num vacuum"] return data @@ -873,7 +874,7 @@ def _iota_num(params, transforms, profiles, data, **kwargs): dim=1, params=[], transforms={}, - profiles=["current"], + profiles=[], coordinates="r", data=["0", "iota_num_r current", "iota_num_r vacuum"], ) @@ -884,10 +885,7 @@ def _iota_num_r(params, transforms, profiles, data, **kwargs): of GitHub pull request #556. 𝛼 supplements the rotational transform with an additional term to account for the enclosed net toroidal current. """ - if profiles["iota"] is not None: - data["iota_num_r"] = jnp.nan * data["0"] - elif profiles["current"] is not None: - data["iota_num_r"] = data["iota_num_r current"] + data["iota_num_r vacuum"] + data["iota_num_r"] = data["iota_num_r current"] + data["iota_num_r vacuum"] return data diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index 48aa575c285d7643958cbe7d6caf9127ee2a9fcc..36422ced3dcfe9755d8e2ecd7c47054eb245ea18 100644 GIT binary patch delta 21347 zcmeI4e^3(=R%95dqj`XHonK0cmDGhCnl_r`Hf(8Fb|h{6ds)jL z|HYEy4cC0yOLB?UC8cQtaf3m%N zoVHFXO0S>&y~i5s8u!R`3xq?F`Q&H20 z+myNmg-uePI(RN^gJ+r5V}+xm^00_JF%g zny0wO4az`SohkE!Ip0n=If{0lr}ZE`YHdo(0TXUs&=q2Ed+P>sG;1=fr`+R z$1kc{%S)y3U|&~C?V7H47`g_6?_WVY-Xpt5CgVzdy; zp30WR#bqo)43vDnNyb*B=52`NJ7Y(64oh=hN3mzf`? zg7VnR)UFHXp#|QK1Tq#OhEep@v@V)G3oJdw4kLYe(in>ngP=agV`|;cL&=o>Ghmaywrp7(A$=jLUNd%77qcBf%i>}YN9wO&=#}(x44?myD+)1u4va;JA@0zN zv7>q{V-aHL>qmjcNze z^x4WV-Zn!=bvwi$nl4kzFpJ}%MQGWEnANYuGZrC+_^Vw!mb~^D#v;Uk%VCTi)kn)% zgtppl^^3=n)2?*{v$V};e8E#cb=?l?iM@+X)_!16{o-j@6ex zyZVtgO!8t3+}(Y+eaiiFs2-H^GK(B;!vGy_(fP>9GnQsfzB&0u>o1*tl2qrMd=u6= zr@lGk65;rgI*w#YG#FZ0B{t{IbsLochM{DV{s|=H%PW=Ud6> z*Gs~oqAM3vt+6m8WMuWLP4lD@*f$}^l`VVyRA0QR{ky*u_WG&*;ibRTZtC~?haA`ozE|9TEc@KbJU`V-SHX!Fi}U>? z2Mny<;JMm#&up?k^vzw*diE9gsV+hbcI>HaSsaIL3|bavLJK6;RJJTGnlT^khnHaJ zVW6^QaU`~;XMl?sIP9rxS)7Qm2r)2*@tm=vx{0v}G2F;=#*XTA#v;VP&+CLS79oZN z<*|sd2rZcVaw=OEM`SEQ48p!UF^q+XN6}X&qpJo>Uq0467BLnf2F8--31BQj48wI; z)JL1^wU=CmXs6O_t z8fZf=R%WSAPGcAzelvDdw__<7W^)k(k3F>vv$!#K)j-bYu`?DShLK@6l`V@SGZrBR z!Bi?yj75lH>{F+abmg%pq%TBGt&+o7gc!tAse~{VAqM+tF=gr`8dl%Pcb1+!2kQO#gM#6Vo_ipSKt-^^Hq7+7Eu84s?8aS*TLu6nUDOZCRb8k?q1 zk_Nw~8I-0ju@g^mRA>=gv=!VF&ht>u=V~?P)zJhpDdo(5LNc_k?L))>$Yy*=E~$TKhojw$n*cJ4Y7hbdp%( zoNRNlZE)z~)Hce9k~)H9aZYWcOa!d8%)0H=HdeE!?$kD?w(+Ll*6gxwJK09fG8X4# z+y7;@X?qJ*{hCiYtLkf8WUWFEe=HyM1<(7W41HI&>o2N)wluY8@VkC`Wxo8Ds-JQx z`2UlDf`@E7>grZKO=-i+WqRQ=QopL#eB#D^zda?LQRQuo`pgNb=T*J(vht3q=WdD| zJoCTGIaTj%Qr=c|^#$p)sy{MG#@El*x{vzw(*^E7scDxd4lTjy@8zamRrUQR@jaE) z^&7q$>~$$?LeG8uN2=cZ1Rmv*H*XAWJ@W>Bj4#W0MrjNFR^cpt!eMtv)${hcdsLUQ zcB9_A!-ePRekgLD6FXcTKE1Bn^%`D$CcAj3m+%U+`doeZ5$=mz=ffo~{2(j7@5YwP zFH3kcwqA^UwAU)64xjtmzrici*KL#juIdBlWo$2B?)tgU)3lVmV{jUNX8fAuWc}Y$ zBJa^v=02x}o-f2V+HNR#Q^KA2!-)ExJ0iE^qpf(dAl`nr{;f9^4Egx|$n8JekLOhe zPxa^?`CYtKRZ6eAvt?x}Y8)yJ9A!-4t2vv+K zK`lfrLY1QKL@h?$g<67IiYn7vR+e|w1{<2orw1QzE}tPaYYo!0oo&tKs0zKUdD)yA Qsd{Jcz%spez<;gmf1bxnnE(I) delta 1027 zcmXZZe@LBG7zgm3AMf?mY1(|2?%M9=a$C3NubFr1yjL>|Ya2}|FHvw;WL&nzESF=& z$XY0b5O%!0gEA6gYf|gR3wwwLDHXX9&I?U*%ei5)VzJsNSVGYEy?1|n9?pBtdCv2k z^Nyc=M~;K;(}}DhT`xuF(8HhFCkHMBXl{G+(9NKUSs^p8ZPO>K%r0S@FLcO|d{M?X zng#vH%5AS59PSt%RMA+sDHUt%&OiKZy{8%`jF5%KFKT4G!aOM+H|44^o!+hM#9p&j z?-V^|p9<&nWb$Q4m6vXQl9YF6$`_5b96aEpB7)3rQDGdb1^K_rF!E2Ty6iif zMKqn>YL%EN5s~p8*Y(en$(6SI{LB(@&KuSxa*tI`5(nDUMRNDF_C?IMPKc-a)hTkX zyuC=~#AlU!zF&P#?$L=Ul8IWUIbRl;$FA4#UpJIXiCR&e*}#RX#T;?dH#!;2Ju;lR zLsn<(Rj0H~m2pqGc8QmN)4vi&^W_ENveRCCH=!>PTlI2=ti8{Q6)QL^&v%t{dU);? z^&^TFrHk^v=j6}Cx4ss$B%kVXhW7Y2WSZdP{c48z=A6R%?dQCBtJHUy_v+)o{c-^xp0eb)x;fM9hhJIq#M2>Pikzp%biwJU zo+UnZNFsi`wSkP|OuCSy)aj$YhX{eflDCds0o36y2u!nf3h92lzYu-6s}Wd$dNOVAq&;*)3%f zadDRy;{k=U{U^jE4UF#aK^EAM4LPt9av=}yf_x}|yI~a+f|t7*?tvmGhBe@a61W%E zLIBpmdMJera37SxM%V-^s+4w(|Vw1K2 From 07fdb4914cbd6a66005d88ec91b56a91e2fb2de4 Mon Sep 17 00:00:00 2001 From: daniel-dudt Date: Tue, 3 Oct 2023 21:40:02 -0600 Subject: [PATCH 16/16] fixing formula for 'iota_num_r current' --- desc/compute/_profiles.py | 14 +++++++------- tests/inputs/master_compute_data.pkl | Bin 4269248 -> 4269248 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/desc/compute/_profiles.py b/desc/compute/_profiles.py index d154b95835..a35822c199 100644 --- a/desc/compute/_profiles.py +++ b/desc/compute/_profiles.py @@ -757,14 +757,14 @@ def _iota_num_vacuum(params, transforms, profiles, data, **kwargs): transforms={"grid": []}, profiles=["current", "iota"], coordinates="r", - data=["psi_r", "psi_rr", "iota_den_r", "iota_num_r vacuum"], + data=["psi_r", "psi_rr", "iota_den", "iota_den_r", "iota_num", "iota_num_r vacuum"], ) def _iota_num_r_current(params, transforms, profiles, data, **kwargs): if profiles["iota"] is not None: iota_r = profiles["iota"].compute(transforms["grid"], params["i_l"], dr=1) data["iota_num_r current"] = ( - iota_r * data["iota_den_r"] - data["iota_num_r vacuum"] - ) + iota_r * data["iota_den"] ** 2 + data["iota_num"] * data["iota_den_r"] + ) / data["iota_den"] - data["iota_num_r vacuum"] elif profiles["current"] is not None: # 4π^2 I = 4π^2 (mu_0 current / 2π) = 2π mu_0 current current = profiles["current"].compute(transforms["grid"], params["c_l"], dr=0) @@ -852,7 +852,7 @@ def _iota_num_r_vacuum(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="r", - data=["0", "iota_num current", "iota_num vacuum"], + data=["iota_num current", "iota_num vacuum"], ) def _iota_num(params, transforms, profiles, data, **kwargs): """Numerator of rotational transform formula. @@ -876,7 +876,7 @@ def _iota_num(params, transforms, profiles, data, **kwargs): transforms={}, profiles=[], coordinates="r", - data=["0", "iota_num_r current", "iota_num_r vacuum"], + data=["iota_num_r current", "iota_num_r vacuum"], ) def _iota_num_r(params, transforms, profiles, data, **kwargs): """Numerator of rotational transform formula, first radial derivative. @@ -898,7 +898,7 @@ def _iota_num_r(params, transforms, profiles, data, **kwargs): dim=1, params=["c_l"], transforms={"grid": []}, - profiles=["current"], + profiles=["current", "iota"], coordinates="r", data=[ "0", @@ -1018,7 +1018,7 @@ def _iota_num_rr(params, transforms, profiles, data, **kwargs): dim=1, params=["c_l"], transforms={"grid": []}, - profiles=["current"], + profiles=["current", "iota"], coordinates="r", data=[ "0", diff --git a/tests/inputs/master_compute_data.pkl b/tests/inputs/master_compute_data.pkl index 36422ced3dcfe9755d8e2ecd7c47054eb245ea18..4dc0c698284db2d63b8657a0f63f50ccb5aa1ac7 100644 GIT binary patch delta 10753 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