From 24cb54896379f94c0e4369767e8052755adcc275 Mon Sep 17 00:00:00 2001 From: "Alex R. Saperstein" Date: Mon, 27 Apr 2026 14:54:14 -0400 Subject: [PATCH 1/9] updated to match dev --- disruption_py/machine/mast/physics.py | 53 ++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 11f772ce..aa68cfc8 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -10,7 +10,7 @@ from disruption_py.core.physics_method.decorator import physics_method from disruption_py.core.physics_method.errors import CalculationError from disruption_py.core.physics_method.params import PhysicsMethodParams -from disruption_py.core.utils.math import interp1 +from disruption_py.core.utils.math import interp1, causal_boxcar_smooth from disruption_py.machine.mast.util import MastUtilMethods from disruption_py.machine.tokamak import Tokamak @@ -216,7 +216,7 @@ def _get_densities(times, n_e, t_n, ip, t_ip, a_minor, t_a): Calculate electron density, its time derivative, and the Greenwald fraction. Parameters - ---------- + ----------causal_boxcar_smooth times : array_like Time points at which to interpolate the densities. n_e : array_like @@ -331,3 +331,52 @@ def get_dalpha(params: PhysicsMethodParams): times = params.times dalpha_data = MastUtilMethods.interpolate_1d(dalpha_time, dalpha_data, times) return {"d_alpha": dalpha_data} + + @staticmethod + @physics_method( + columns=["p_oh"], + tokamak=Tokamak.MAST, + ) + def get_ohmic_parameters(params: PhysicsMethodParams): + """Get Ohmic parameters + + Parameters + ---------- + params : PhysicsMethodParams + The parameters containing the Xarray connection, shot id and more. + + Returns + ------- + dict + A dictionary containing the total Ohmic heating power (`p_oh`). + """ + + # load relevant parameters + conn = params.data_conn + r0 = conn.get_data("equilibrium/magnetic_axis_r") + li = conn.get_data("equilibrium/li") + v_loop = conn.get_data( "equilibrium/vloop_dynamic") + ip = conn.get_data("summary/ip") + summary_time = conn.get_data("summary/time") + equilibrium_time = conn.get_data("equilibrium/time") + + # compute derived quantities + dip_dt = np.gradient(ip, summary_time) + dip_smoothed = causal_boxcar_smooth(dip_dt, 6) + inductance = 4.0 * np.pi * 1.0e-7 * r0 * li / 2.0 + + # interpolate to consistent time-base + v_loop = interp1(equilibrium_time, v_loop, params.times) + inductance = interp1(equilibrium_time, inductance, params.times) + dip_smoothed = interp1(summary_time, dip_smoothed, params.times) + ip = interp1(summary_time, ip, params.times) + + # calculate p_oh + v_inductive = inductance * dip_smoothed + v_resistive = v_loop - v_inductive + p_oh = ip * v_resistive + + # Set negative p_ohm values to 0 + p_oh = np.clip(p_oh, 0, None) + + return {"p_oh": p_oh} From 90070cce769207719e1756db277431bf47765cf9 Mon Sep 17 00:00:00 2001 From: "Alex R. Saperstein" Date: Tue, 28 Apr 2026 09:15:42 -0400 Subject: [PATCH 2/9] added p_oh attributres to MAST config --- disruption_py/machine/mast/config.toml | 5 +++++ disruption_py/machine/mast/physics.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/disruption_py/machine/mast/config.toml b/disruption_py/machine/mast/config.toml index a0ffdbfb..78aa1fdc 100644 --- a/disruption_py/machine/mast/config.toml +++ b/disruption_py/machine/mast/config.toml @@ -97,6 +97,11 @@ description = "Core electron density measurement" imas = "/thomson_scattering/channel(i1)/n_e" units = "m^-3" +[mast.physics.attributes.p_oh] +description = "Total Ohmic heating power." +imas = "/summary/global_quantities/power_ohm" +units = "W" + [mast.physics.attributes.p_nbi] description = "NBI heating power." imas = "/summary/heating_current_drive/power_nbi" diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index aa68cfc8..0b119b91 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -216,7 +216,7 @@ def _get_densities(times, n_e, t_n, ip, t_ip, a_minor, t_a): Calculate electron density, its time derivative, and the Greenwald fraction. Parameters - ----------causal_boxcar_smooth + ---------- times : array_like Time points at which to interpolate the densities. n_e : array_like From 832b20b20b9f35ab08591c7f3b0566e5abd8aa2b Mon Sep 17 00:00:00 2001 From: gtrevisan Date: Tue, 28 Apr 2026 09:28:33 -0400 Subject: [PATCH 3/9] lint! disruption_py/machine/mast/physics.py --- disruption_py/machine/mast/physics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 0b119b91..2082de46 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -10,7 +10,7 @@ from disruption_py.core.physics_method.decorator import physics_method from disruption_py.core.physics_method.errors import CalculationError from disruption_py.core.physics_method.params import PhysicsMethodParams -from disruption_py.core.utils.math import interp1, causal_boxcar_smooth +from disruption_py.core.utils.math import causal_boxcar_smooth, interp1 from disruption_py.machine.mast.util import MastUtilMethods from disruption_py.machine.tokamak import Tokamak @@ -355,7 +355,7 @@ def get_ohmic_parameters(params: PhysicsMethodParams): conn = params.data_conn r0 = conn.get_data("equilibrium/magnetic_axis_r") li = conn.get_data("equilibrium/li") - v_loop = conn.get_data( "equilibrium/vloop_dynamic") + v_loop = conn.get_data("equilibrium/vloop_dynamic") ip = conn.get_data("summary/ip") summary_time = conn.get_data("summary/time") equilibrium_time = conn.get_data("equilibrium/time") @@ -375,7 +375,7 @@ def get_ohmic_parameters(params: PhysicsMethodParams): v_inductive = inductance * dip_smoothed v_resistive = v_loop - v_inductive p_oh = ip * v_resistive - + # Set negative p_ohm values to 0 p_oh = np.clip(p_oh, 0, None) From c887b75d42427cf3a38f0987146f0a511387ff46 Mon Sep 17 00:00:00 2001 From: gtrevisan Date: Tue, 28 Apr 2026 09:28:33 -0400 Subject: [PATCH 4/9] lint! disruption_py/machine/mast/config.toml --- disruption_py/machine/mast/config.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/disruption_py/machine/mast/config.toml b/disruption_py/machine/mast/config.toml index 78aa1fdc..1b3b44f0 100644 --- a/disruption_py/machine/mast/config.toml +++ b/disruption_py/machine/mast/config.toml @@ -97,16 +97,16 @@ description = "Core electron density measurement" imas = "/thomson_scattering/channel(i1)/n_e" units = "m^-3" -[mast.physics.attributes.p_oh] -description = "Total Ohmic heating power." -imas = "/summary/global_quantities/power_ohm" -units = "W" - [mast.physics.attributes.p_nbi] description = "NBI heating power." imas = "/summary/heating_current_drive/power_nbi" units = "W" +[mast.physics.attributes.p_oh] +description = "Total Ohmic heating power." +imas = "/summary/global_quantities/power_ohm" +units = "W" + [mast.physics.attributes.p_rad] description = "Radiated power measured by the 2pi diode." imas = "/bolometer/power_radiated_total" From ab488d284bb2d91730c8743716eebdbf55153a8e Mon Sep 17 00:00:00 2001 From: AlexSaperstein Date: Wed, 29 Apr 2026 09:51:46 -0400 Subject: [PATCH 5/9] Update disruption_py/machine/mast/physics.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- disruption_py/machine/mast/physics.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 2082de46..07af0101 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -362,7 +362,10 @@ def get_ohmic_parameters(params: PhysicsMethodParams): # compute derived quantities dip_dt = np.gradient(ip, summary_time) - dip_smoothed = causal_boxcar_smooth(dip_dt, 6) + if len(dip_dt) >= 6: + dip_smoothed = causal_boxcar_smooth(dip_dt, 6) + else: + dip_smoothed = dip_dt inductance = 4.0 * np.pi * 1.0e-7 * r0 * li / 2.0 # interpolate to consistent time-base From e049d17627fb61c92d8462c96106a46c93603afe Mon Sep 17 00:00:00 2001 From: yumouwei <46117079+yumouwei@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:38:43 -0400 Subject: [PATCH 6/9] Update docstring --- disruption_py/machine/mast/physics.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 07af0101..990b7597 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -338,7 +338,9 @@ def get_dalpha(params: PhysicsMethodParams): tokamak=Tokamak.MAST, ) def get_ohmic_parameters(params: PhysicsMethodParams): - """Get Ohmic parameters + """ + Calculate the ohmic heating power from the dynamic loop voltage, + inductive voltage, and plasma current Parameters ---------- @@ -349,6 +351,10 @@ def get_ohmic_parameters(params: PhysicsMethodParams): ------- dict A dictionary containing the total Ohmic heating power (`p_oh`). + + References + ------ + - pull requests: #[553](https://github.com/MIT-PSFC/disruption-py/pull/553) """ # load relevant parameters From f370f39539830a11d63c2e11e3367ba9baba39ce Mon Sep 17 00:00:00 2001 From: "Alex R. Saperstein" Date: Mon, 4 May 2026 13:51:22 -0400 Subject: [PATCH 7/9] increased smoothing window for dip in p_oh calculation --- disruption_py/machine/mast/physics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 990b7597..1dfc1cf2 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -369,7 +369,7 @@ def get_ohmic_parameters(params: PhysicsMethodParams): # compute derived quantities dip_dt = np.gradient(ip, summary_time) if len(dip_dt) >= 6: - dip_smoothed = causal_boxcar_smooth(dip_dt, 6) + dip_smoothed = causal_boxcar_smooth(dip_dt, 30) else: dip_smoothed = dip_dt inductance = 4.0 * np.pi * 1.0e-7 * r0 * li / 2.0 From b8417a208ee297d2effa95445a7296d597cbf912 Mon Sep 17 00:00:00 2001 From: "Alex R. Saperstein" Date: Mon, 4 May 2026 15:19:29 -0400 Subject: [PATCH 8/9] updated len(dip_dt) check to new window size --- disruption_py/machine/mast/physics.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 1dfc1cf2..6e76a8b1 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -367,9 +367,10 @@ def get_ohmic_parameters(params: PhysicsMethodParams): equilibrium_time = conn.get_data("equilibrium/time") # compute derived quantities + smooth_window_size = 30 dip_dt = np.gradient(ip, summary_time) - if len(dip_dt) >= 6: - dip_smoothed = causal_boxcar_smooth(dip_dt, 30) + if len(dip_dt) >= smooth_window_size: + dip_smoothed = causal_boxcar_smooth(dip_dt, smooth_window_size) else: dip_smoothed = dip_dt inductance = 4.0 * np.pi * 1.0e-7 * r0 * li / 2.0 From f306d835650856f8d4f9ae64a176042501cb2406 Mon Sep 17 00:00:00 2001 From: "Alex R. Saperstein" Date: Thu, 14 May 2026 13:51:17 -0400 Subject: [PATCH 9/9] updated get_data syntax --- disruption_py/machine/mast/physics.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/disruption_py/machine/mast/physics.py b/disruption_py/machine/mast/physics.py index 82528617..b4ff686d 100644 --- a/disruption_py/machine/mast/physics.py +++ b/disruption_py/machine/mast/physics.py @@ -345,13 +345,12 @@ def get_ohmic_parameters(params: PhysicsMethodParams): """ # load relevant parameters - conn = params.data_conn - r0 = conn.get_data("equilibrium/magnetic_axis_r") - li = conn.get_data("equilibrium/li") - v_loop = conn.get_data("equilibrium/vloop_dynamic") - ip = conn.get_data("summary/ip") - summary_time = conn.get_data("summary/time") - equilibrium_time = conn.get_data("equilibrium/time") + r0 = params.get_data("equilibrium/magnetic_axis_r") + li = params.get_data("equilibrium/li") + v_loop = params.get_data("equilibrium/vloop_dynamic") + ip = params.get_data("summary/ip") + summary_time = params.get_data("summary/time") + equilibrium_time = params.get_data("equilibrium/time") # compute derived quantities smooth_window_size = 30