From 10960364ef7b51133db50a169e2429de642a71f7 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 6 Nov 2025 11:08:30 +0000 Subject: [PATCH 1/5] Add method to calculate normalized internal inductance using ITER-3 scaling --- process/physics.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/process/physics.py b/process/physics.py index 0a86b2a5b5..6fd24d2cdc 100644 --- a/process/physics.py +++ b/process/physics.py @@ -3657,6 +3657,47 @@ def phyaux( f_alpha_energy_confinement, ) + def calculate_normalised_internal_inductance_iter_3( + self, + beta_poloidal_average: float, + c_plasma: float, + vol_plasma: float, + rmajor: float, + ) -> float: + """ + Calculate the normalised internal inductance using ITER-3 scaling li(3). + + :param beta_poloidal_average: Average poloidal beta. + :type beta_poloidal_average: float + :param c_plasma: Plasma current (A). + :type c_plasma: float + :param vol_plasma: Plasma volume (m^3). + :type vol_plasma: float + :param rmajor: Plasma major radius (m). + :type rmajor: float + + :returns: The li(3) normalised internal inductance. + :rtype: float + + :references: + - T. C. Luce, D. A. Humphreys, G. L. Jackson, and W. M. Solomon, + “Inductive flux usage and its optimization in tokamak operation,” + Nuclear Fusion, vol. 54, no. 9, p. 093005, Jul. 2014, + doi: https://doi.org/10.1088/0029-5515/54/9/093005. + + - G. L. Jackson et al., “ITER startup studies in the DIII-D tokamak,” + Nuclear Fusion, vol. 48, no. 12, p. 125002, Nov. 2008, + doi: https://doi.org/10.1088/0029-5515/48/12/125002. + ‌ + """ + + return ( + 2 + * vol_plasma + * beta_poloidal_average**2 + / (constants.RMU0**2 * c_plasma**2 * rmajor) + ) + @staticmethod def plasma_ohmic_heating( f_c_plasma_inductive: float, From f5632ea6d37fe602d3037ab75bd20bd924c74888 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 6 Nov 2025 11:10:14 +0000 Subject: [PATCH 2/5] Add ITER-3 normalized internal inductance variable and initialization --- process/data_structure/physics_variables.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/process/data_structure/physics_variables.py b/process/data_structure/physics_variables.py index 547377a5a4..219b52e951 100644 --- a/process/data_structure/physics_variables.py +++ b/process/data_structure/physics_variables.py @@ -1132,6 +1132,9 @@ ind_plasma_internal_norm: float = None """Plasma normalised internal inductance""" +ind_plasma_internal_norm_iter_3: float = None +"""Plasma normalised internal inductance (ITER type 3)""" + ind_plasma_internal_norm_wesson: float = None """Wesson-like plasma normalised internal inductance""" @@ -1583,6 +1586,7 @@ def init_physics_variables(): global ind_plasma_internal_norm global ind_plasma_internal_norm_wesson global ind_plasma_internal_norm_menard + global ind_plasma_internal_norm_iter_3 global i_ind_plasma_internal_norm global ind_plasma global rmajor @@ -1840,6 +1844,7 @@ def init_physics_variables(): ind_plasma_internal_norm = 0.9 ind_plasma_internal_norm_wesson = 0.0 ind_plasma_internal_norm_menard = 0.0 + ind_plasma_internal_norm_iter_3 = 0.0 i_ind_plasma_internal_norm = 0 ind_plasma = 0.0 rmajor = 8.14 From 884421f73025b53485a83308fe4073471d4a4862 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 6 Nov 2025 11:26:02 +0000 Subject: [PATCH 3/5] Add ITER-3 normalized internal inductance calculation and output --- process/io/plot_proc.py | 2 +- process/physics.py | 67 ++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 17cbe646f5..d13beededb 100644 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2674,7 +2674,7 @@ def plot_main_plasma_information( f"$V_{{\\text{{loop}}}}$: {mfile_data.data['v_plasma_loop_burn'].get_scan(scan):.4f} V\n" f"$\\Omega_{{\\text{{p}}}}$: {mfile_data.data['res_plasma'].get_scan(scan):.4e} $\\Omega$\n" f"Plasma resistive diffusion time: {mfile_data.data['t_plasma_res_diffusion'].get_scan(scan):,.4f} s\n" - f"Plasma inductance: {mfile_data.data['ind_plasma'].get_scan(scan):.4e} H\n" + f"Plasma inductance: {mfile_data.data['ind_plasma'].get_scan(scan):.4e} H | ITER $l_i(3)$: {mfile_data.data['ind_plasma_internal_norm_iter_3'].get_scan(scan):.4f}\n" f"Plasma stored magnetic energy: {mfile_data.data['e_plasma_magnetic_stored'].get_scan(scan) / 1e9:.4f} GJ\n" f"Plasma normalised internal inductance: {mfile_data.data['ind_plasma_internal_norm'].get_scan(scan):.4f}" ) diff --git a/process/physics.py b/process/physics.py index 6fd24d2cdc..f2eabc451b 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1680,6 +1680,15 @@ def physics(self): self.calculate_internal_inductance_menard(kappa=physics_variables.kappa) ) + physics_variables.ind_plasma_internal_norm_iter_3 = ( + self.calculate_normalised_internal_inductance_iter_3( + b_plasma_poloidal_vol_avg=physics_variables.b_plasma_poloidal_average, + c_plasma=physics_variables.plasma_current, + vol_plasma=physics_variables.vol_plasma, + rmajor=physics_variables.rmajor, + ) + ) + # Map calculation methods to a dictionary ind_plasma_internal_norm_calculations = { 0: physics_variables.ind_plasma_internal_norm, @@ -3659,42 +3668,42 @@ def phyaux( def calculate_normalised_internal_inductance_iter_3( self, - beta_poloidal_average: float, + b_plasma_poloidal_vol_avg: float, c_plasma: float, vol_plasma: float, rmajor: float, ) -> float: """ - Calculate the normalised internal inductance using ITER-3 scaling li(3). - - :param beta_poloidal_average: Average poloidal beta. - :type beta_poloidal_average: float - :param c_plasma: Plasma current (A). - :type c_plasma: float - :param vol_plasma: Plasma volume (m^3). - :type vol_plasma: float - :param rmajor: Plasma major radius (m). - :type rmajor: float - - :returns: The li(3) normalised internal inductance. - :rtype: float - - :references: - - T. C. Luce, D. A. Humphreys, G. L. Jackson, and W. M. Solomon, - “Inductive flux usage and its optimization in tokamak operation,” - Nuclear Fusion, vol. 54, no. 9, p. 093005, Jul. 2014, - doi: https://doi.org/10.1088/0029-5515/54/9/093005. - - - G. L. Jackson et al., “ITER startup studies in the DIII-D tokamak,” - Nuclear Fusion, vol. 48, no. 12, p. 125002, Nov. 2008, - doi: https://doi.org/10.1088/0029-5515/48/12/125002. + Calculate the normalised internal inductance using ITER-3 scaling li(3). + + :param b_plasma_poloidal_vol_avg: Volume-averaged poloidal magnetic field (T). + :type b_plasma_poloidal_vol_avg: float + :param c_plasma: Plasma current (A). + :type c_plasma: float + :param vol_plasma: Plasma volume (m^3). + :type vol_plasma: float + :param rmajor: Plasma major radius (m). + :type rmajor: float + + :returns: The li(3) normalised internal inductance. + :rtype: float + + :references: + - T. C. Luce, D. A. Humphreys, G. L. Jackson, and W. M. Solomon, + “Inductive flux usage and its optimization in tokamak operation,” + Nuclear Fusion, vol. 54, no. 9, p. 093005, Jul. 2014, + doi: https://doi.org/10.1088/0029-5515/54/9/093005. + + - G. L. Jackson et al., “ITER startup studies in the DIII-D tokamak,” + Nuclear Fusion, vol. 48, no. 12, p. 125002, Nov. 2008, + doi: https://doi.org/10.1088/0029-5515/48/12/125002. ‌ """ return ( 2 * vol_plasma - * beta_poloidal_average**2 + * b_plasma_poloidal_vol_avg**2 / (constants.RMU0**2 * c_plasma**2 * rmajor) ) @@ -4452,6 +4461,14 @@ def outplas(self): physics_variables.ind_plasma_internal_norm_menard, "OP ", ) + po.ovarrf( + self.outfile, + "ITER li(3) plasma normalised internal inductance", + "(ind_plasma_internal_norm_iter_3)", + physics_variables.ind_plasma_internal_norm_iter_3, + "OP ", + ) + else: po.ovarrf( self.outfile, From 24364e0afcb69e779ff3c2d8734b885bdf15711f Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 6 Nov 2025 13:24:16 +0000 Subject: [PATCH 4/5] Add static method to calculate normalized internal inductance for ITER-3 and corresponding unit test --- process/physics.py | 2 +- tests/unit/test_physics.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/process/physics.py b/process/physics.py index f2eabc451b..c3d91fce18 100644 --- a/process/physics.py +++ b/process/physics.py @@ -3666,8 +3666,8 @@ def phyaux( f_alpha_energy_confinement, ) + @staticmethod def calculate_normalised_internal_inductance_iter_3( - self, b_plasma_poloidal_vol_avg: float, c_plasma: float, vol_plasma: float, diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index 49e2e59fb2..407387851c 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -3459,3 +3459,11 @@ def test_calculate_beta_norm_max_stambaugh(): f_c_plasma_bootstrap, kappa, aspect ) assert result == pytest.approx(3.840954484207041, abs=0.00001) + + +def test_calculate_internal_inductance_iter_3(): + """Test calculate_normalised_internal_inductance_iter_3.""" + result = Physics.calculate_normalised_internal_inductance_iter_3( + b_plasma_poloidal_vol_avg=1.0, c_plasma=1.5e7, vol_plasma=1000.0, rmajor=6.2 + ) + assert result == pytest.approx(0.9078959099585583, abs=0.00001) From f2a302427ec61f06122004fad9cf364de28ae316 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 6 Nov 2025 13:45:05 +0000 Subject: [PATCH 5/5] Update plasma inductance documentation with ITER definitions and Menard relation details --- .../plasma_current/plasma_inductance.md | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/documentation/physics-models/plasma_current/plasma_inductance.md b/documentation/physics-models/plasma_current/plasma_inductance.md index 99d55ebaaf..8644e6de00 100644 --- a/documentation/physics-models/plasma_current/plasma_inductance.md +++ b/documentation/physics-models/plasma_current/plasma_inductance.md @@ -42,7 +42,7 @@ This is only recommended for high aspect ratio tokamaks[^2]. --------- -#### Menard Inductance Relation +### Menard Inductance Relation This can be activated by stating `ind_plasma_internal_norm = 2` in the input file. @@ -60,9 +60,43 @@ This relation is based off of data from NSTX for $l_i$ in the range of 0.4-0.85. **It is recommended to use this switch with [`i_beta_norm_max = 3`](../plasma_beta/plasma_beta.md#menard-beta-relation) as they are self-consistent with each other.** +-------------- + +## ITER Definitions + +The generally agreed definition of $l_i$ is: + +$$ +l_i = \frac{\langle B_{\text{p}}^2 \rangle}{B_{\text{p}}(a)^2} +$$ + +where $B_{\text{p}}(a)^2$ is the square of the average poloidal field at the plasma edge. In the second term, the average on the +boundary is made explicit, with Lp the line integral of the poloidal circumference of the last closed flux surface. + +In the unpublished ITER Physics Guidelines document[^4], different approximations for the denominator are used. + +Although the motivation for these approximations is not explicitly stated, it is likely due to the challenges involved in generating free-boundary equilibria that include an X-point at that time[^5][^6]. + +### ITER Version 3 | `calculate_normalised_internal_inductance_iter_3()` + +$$ +\overbrace{l_i(3)}^{\texttt{ind_plasma_internal_norm_iter_3}} = \frac{2V\langle B_{\text{p}}^2 \rangle}{\mu_0^2I_{\text{p}}^2R_0} +$$ + + + + + [^1]: T. T. S et al., “Profile Optimization and High Beta Discharges and Stability of High Elongation Plasmas in the DIII-D Tokamak,” Osti.gov, Oct. 1990. https://www.osti.gov/biblio/6194284 (accessed Dec. 19, 2024). [^2]: Tokamaks 4th Edition, Wesson, page 116 [^3]: J. E. Menard et al., “Fusion nuclear science facilities and pilot plants based on the spherical tokamak,” Nuclear Fusion, vol. 56, no. 10, p. 106023, Aug. 2016, doi: https://doi.org/10.1088/0029-5515/56/10/106023. +[^4]: N. A. Uckan, International Atomic Energy Agency, Vienna (Austria) and ITER Physics Group, "ITER physics design guidelines: 1989", no. No. 10. Feb. 1990 + +[^5]: T. C. Luce, D. A. Humphreys, G. L. Jackson, and W. M. Solomon, “Inductive flux usage and its optimization in tokamak operation,” +Nuclear Fusion, vol. 54, no. 9, p. 093005, Jul. 2014, doi: https://doi.org/10.1088/0029-5515/54/9/093005. + +[^6]: G. L. Jackson et al., “ITER startup studies in the DIII-D tokamak,” Nuclear Fusion, vol. 48, no. 12, p. 125002, Nov. 2008, doi: https://doi.org/10.1088/0029-5515/48/12/125002. +