From 3fdb328829ff933e86c9980292e4cef374d45559 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Tue, 22 Oct 2024 14:14:16 +0100 Subject: [PATCH 01/26] First implementation of ARIES bootstrap model without tests --- .../plasma_current/bootstrap_current.md | 29 +++++++-- process/physics.py | 62 ++++++++++++++++++- source/fortran/current_drive_variables.f90 | 3 + source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 1 + 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index e3c4472200..a88508fb9e 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -7,7 +7,7 @@ Some more info can be found [here](https://wiki.fusion.ciemat.es/wiki/Bootstrap_ The fraction of the plasma current provided by the bootstrap effect can be either input into the code directly, or calculated using one of five -methods, as summarised here. Note that methods `i_bootstrap_current = 1-3 & 5` do not take into account the +methods, as summarised here. Note that methods `i_bootstrap_current = 1-3 & 5-6` do not take into account the existence of pedestals, whereas the Sauter et al. scaling (`i_bootstrap_current = 4`) allows general profiles to be used. @@ -460,7 +460,7 @@ The $-1$ subscript in this case refers to the value of the variable in the previ ### Sakai Scaling | `bootstrap_fraction_sakai()` -Is selected by setting `i_bootstrap_current = 5`[^5] +Is selected by setting `i_bootstrap_current = 5`[^6] $$ f_{\text{BS}} = 10^{0.951 \epsilon - 0.948} \cdot \beta_p^{1.226 \epsilon + 1.584} \cdot l_i^{-0.184\epsilon - 0.282} \cdot \left(\frac{q_{95}}{q_0}\right)^{-0.042 \epsilon - 0.02} \\ @@ -469,6 +469,28 @@ $$ The model includes the toroidal diamagnetic current in the calculation due to the dataset, so `i_diamagnetic_current = 0` can only be used with it +------------------- + +### ARIES Scaling | `bootstrap_fraction_aries()` + +Is selected by setting `i_bootstrap_current = 6`[^8] + +$$ +a_1 = 1.10-1.165l_{\text{i}}+0.47l_{\text{i}}^2 +$$ + +$$ +b_1 = 0.806-0.885l_{\text{i}}+0.297l_{\text{i}}^2 +$$ + +$$ +C_{\text{BS}} = a_1+b_1\left(\frac{n(0)}{\langle n \rangle}\right) +$$ + +$$ +f_{\text{BS}} = C_{\text{BS}} \sqrt{\epsilon}\beta_{\text{p}} +$$ + --------------------- ## Setting of maximum desirable bootstrap current fraction @@ -500,5 +522,4 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^5]: O. Sauter, C. Angioni, Y. R. Lin-Liu; Erratum: “Neoclassical conductivity and bootstrap current formulas for general axisymmetric equilibria and arbitrary collisionality regime” [Phys. Plasmas 6, 2834 (1999)]. Phys. Plasmas 1 December 2002; 9 (12): 5140. https://doi.org/10.1063/1.1517052 [^6]: Ryosuke Sakai, Takaaki Fujita, Atsushi Okamoto, Derivation of bootstrap current fraction scaling formula for 0-D system code analysis, Fusion Engineering and Design, Volume 149, 2019, 111322, ISSN 0920-3796, https://doi.org/10.1016/j.fusengdes.2019.111322. [^7]: T.C.Hender et.al., 'Physics Assesment of the European Reactor Study', AEA FUS 172, 1992 - - +[^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. \ No newline at end of file diff --git a/process/physics.py b/process/physics.py index fb794f3541..72a8e48f93 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1718,6 +1718,17 @@ def physics(self): ) ) + current_drive_variables.bscf_aries = ( + current_drive_variables.cboot + * self.bootstrap_fraction_aries( + betap=physics_variables.betap, + rli=physics_variables.rli, + core_density=physics_variables.ne0, + average_desnity=physics_variables.dene, + inverse_aspect=physics_variables.eps, + ) + ) + if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( current_drive_variables.bootstrap_current_fraction_max @@ -1748,6 +1759,10 @@ def physics(self): current_drive_variables.bootstrap_current_fraction = ( current_drive_variables.bscf_sakai ) + elif physics_variables.i_bootstrap_current == 6: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_sauter + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -4837,7 +4852,6 @@ def outplas(self): current_drive_variables.bscf_wilson, "OP ", ) - po.ovarrf( self.outfile, "Bootstrap fraction (Sakai)", @@ -4845,6 +4859,14 @@ def outplas(self): current_drive_variables.bscf_sakai, "OP ", ) + po.ovarrf( + self.outfile, + "Bootstrap fraction (ARIES)", + "(bscf_aries)", + current_drive_variables.bscf_aries, + "OP ", + ) + po.ovarrf( self.outfile, "Diamagnetic fraction (Hender)", @@ -5536,6 +5558,7 @@ def bootstrap_fraction_sakai( alphan (float): Density profile index alphat (float): Temperature profile index eps (float): Inverse aspect ratio. + rli (float): Internal Inductance Returns: float: The calculated bootstrap fraction. @@ -5565,6 +5588,43 @@ def bootstrap_fraction_sakai( * alphat ** (0.502 * eps - 0.273) ) + @staticmethod + def bootstrap_fraction_aries( + betap: float, + rli: float, + core_density: float, + average_desnity: float, + inverse_aspect: float, + ) -> float: + """ + Calculate the bootstrap fraction using the ARIES formula. + + Parameters: + betap (float): Plasma poloidal beta. + rli (float): Plasma normalized internal inductance. + core_density (float): Core plasma density. + average_density (float): Average plasma density. + inverse_aspect (float): Inverse aspect ratio.o. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + + References: + - Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants,” + Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, + doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. + + """ + # Using the standard variable naming from the ARIES paper + a_1 = 1.10-1.165*rli+0.47*rli**2 + b_1 = 0.806 - 0.885*rli + 0.297*rli**2 + + c_bs = a_1+b_1*(core_density/average_desnity) + + return c_bs * np.sqrt(inverse_aspect) * betap + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index d68e097db7..7524ac1ab0 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -45,6 +45,9 @@ module current_drive_variables real(dp) :: bscf_sakai !! Bootstrap current fraction, Sakai et al model + real(dp) :: bscf_aries + !! Bootstrap current fraction, ARIES model + real(dp) :: cboot !! bootstrap current fraction multiplier (`i_bootstrap_current=1`) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index 7f884432fe..94d732bd84 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 5, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 6, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index fdc06965da..ca496ea741 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -250,6 +250,7 @@ module physics_variables !! - =3 for Wilson et al numerical scaling !! - =4 for Sauter et al scaling !! - =5 for Sakai et al scaling + !! - =6 for ARIES scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) From 3ebb9872e85516691661c494c50bb5387a6e910b Mon Sep 17 00:00:00 2001 From: mn3981 Date: Tue, 22 Oct 2024 15:27:17 +0100 Subject: [PATCH 02/26] Update plasma_profiles.md and physics.py - Add calculation of volume averaged pressure in plasma_profiles.md. This also add the core pressure and volume averaged pressure to the output. Assuming a parabolic profile - Implement bootstrap fraction calculation using Andrade et al formula in physics.py. This is currently implemented and exported with no tests and notes of applicability regimes --- .../profiles/plasma_profiles.md | 7 ++ process/physics.py | 79 ++++++++++++++++++- process/plasma_profiles.py | 4 + source/fortran/current_drive_variables.f90 | 3 + source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 4 + 6 files changed, 94 insertions(+), 5 deletions(-) diff --git a/documentation/proc-pages/physics-models/profiles/plasma_profiles.md b/documentation/proc-pages/physics-models/profiles/plasma_profiles.md index 7c26247223..e211f3d223 100644 --- a/documentation/proc-pages/physics-models/profiles/plasma_profiles.md +++ b/documentation/proc-pages/physics-models/profiles/plasma_profiles.md @@ -407,10 +407,17 @@ $$ With the coefficients used to turn the temperature from $\text{keV}$ back to Joules. Since we multiply the density and temperature profiles together to get the pressure we can find the pressure profile factor by adding the profile factors for temperature and density. + $$ \alpha_p = \alpha_n + \alpha_T $$ +The volume averaged pressure can then be set if we assume the pressure also has a parabolic profile. Using the standard relation used for both density and temeprature we can set the volume averaged pressure as: + +$$ +\langle p \rangle = \frac{p_0}{\alpha_p+1} +$$ + ???+ note "Pressure profile factor" The calculation of $\alpha_p$ is only valid assuming a parabolic profile case. The calculatio of $p_0$ is still true as the core values are calculated independantly for each profile type. diff --git a/process/physics.py b/process/physics.py index 72a8e48f93..6fdbbdd4a1 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1729,6 +1729,16 @@ def physics(self): ) ) + current_drive_variables.bscf_andrade = ( + current_drive_variables.cboot + * self.bootstrap_fraction_andrade( + betap=physics_variables.betap, + core_pressure=physics_variables.p0, + average_pressure=physics_variables.vol_avg_pressure, + inverse_aspect=physics_variables.eps, + ) + ) + if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( current_drive_variables.bootstrap_current_fraction_max @@ -1761,8 +1771,12 @@ def physics(self): ) elif physics_variables.i_bootstrap_current == 6: current_drive_variables.bootstrap_current_fraction = ( - current_drive_variables.bscf_sauter - ) + current_drive_variables.bscf_aries + ) + elif physics_variables.i_bootstrap_current == 7: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_andrade + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -3596,6 +3610,20 @@ def outplas(self): physics_variables.dnla, "OP ", ) + po.ovarre( + self.outfile, + "Plasma pressure on axis (Pa)", + "(p0)", + physics_variables.p0, + "OP ", + ) + po.ovarre( + self.outfile, + "Volume averaged plasma pressure (Pa)", + "(vol_avg_pressure)", + physics_variables.vol_avg_pressure, + "OP ", + ) if stellarator_variables.istell == 0: po.ovarre( @@ -4866,7 +4894,14 @@ def outplas(self): current_drive_variables.bscf_aries, "OP ", ) - + po.ovarrf( + self.outfile, + "Bootstrap fraction (Andrade)", + "(bscf_andrade)", + current_drive_variables.bscf_andrade, + "OP ", + ) + po.ovarrf( self.outfile, "Diamagnetic fraction (Hender)", @@ -5604,7 +5639,7 @@ def bootstrap_fraction_aries( rli (float): Plasma normalized internal inductance. core_density (float): Core plasma density. average_density (float): Average plasma density. - inverse_aspect (float): Inverse aspect ratio.o. + inverse_aspect (float): Inverse aspect ratio. Returns: float: The calculated bootstrap fraction. @@ -5625,6 +5660,42 @@ def bootstrap_fraction_aries( return c_bs * np.sqrt(inverse_aspect) * betap + @staticmethod + def bootstrap_fraction_andrade( + betap: float, + core_pressure: float, + average_pressure: float, + inverse_aspect: float, + ) -> float: + """ + Calculate the bootstrap fraction using the Andrade et al formula. + + Parameters: + betap (float): Plasma poloidal beta. + core_pressure (float): Core plasma pressure. + average_pressure (float): Average plasma pressure. + inverse_aspect (float): Inverse aspect ratio. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + + References: + - M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” + Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, + doi: https://doi.org/10.1088/0741-3335/50/6/065001. + + """ + + # Using the standard variable naming from the Andrade et.al. paper + c_p = core_pressure / average_pressure + + # Error +- 0.0007 + c_bs = 0.2340 + + return c_bs * np.sqrt(inverse_aspect) * betap * c_p**0.8 + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/process/plasma_profiles.py b/process/plasma_profiles.py index ea804c24ae..787afec6a9 100644 --- a/process/plasma_profiles.py +++ b/process/plasma_profiles.py @@ -264,6 +264,10 @@ def calculate_profile_factors(self) -> None: physics_variables.alphap = physics_variables.alphan + physics_variables.alphat + # Shall assume that the pressure profile is parabolic. Can this find volume average from + # profile index and core value the same as for density and temperature + physics_variables.vol_avg_pressure = physics_variables.p0 / (physics_variables.alphap+1) + @staticmethod def calculate_parabolic_profile_factors() -> None: """ diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index 7524ac1ab0..896091394c 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -48,6 +48,9 @@ module current_drive_variables real(dp) :: bscf_aries !! Bootstrap current fraction, ARIES model + real(dp) :: bscf_andrade + !! Bootstrap current fraction, Andrade et al model + real(dp) :: cboot !! bootstrap current fraction multiplier (`i_bootstrap_current=1`) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index 94d732bd84..99c6d48536 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 6, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 7, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index ca496ea741..7886853ff6 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -251,6 +251,7 @@ module physics_variables !! - =4 for Sauter et al scaling !! - =5 for Sakai et al scaling !! - =6 for ARIES scaling + !! - =7 for Andrade et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) @@ -551,6 +552,9 @@ module physics_variables real(dp) :: p0 !! central total plasma pressure (Pa) + real(dp) :: vol_avg_pressure + !! Volume average plasma pressure (Pa) + real(dp) :: palppv !! alpha power per volume (MW/m3) From e79d052bf9b9ffcd8e93a2d5ff08643fd732ea25 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Tue, 22 Oct 2024 15:27:17 +0100 Subject: [PATCH 03/26] Update plasma_profiles.md and physics.py - Add calculation of volume averaged pressure in plasma_profiles.md. This also add the core pressure and volume averaged pressure to the output. Assuming a parabolic profile - Implement bootstrap fraction calculation using Andrade et al formula in physics.py. This is currently implemented and exported with no tests and notes of applicability regimes --- .../plasma_current/bootstrap_current.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index a88508fb9e..ea17c0157d 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -493,6 +493,24 @@ $$ --------------------- +### Andrade Scaling | `bootstrap_fraction_andrade()` + +Is selected by setting `i_bootstrap_current = 7`[^9] + +$$ +C_{\text{BS}} = 0.2340 \pm 0.0007 +$$ + +$$ +c_p = \frac{p_0}{\langle p \rangle} +$$ + +$$ +f_{\text{BS}} = C_{\text{BS}} \sqrt{\epsilon}\beta_{\text{p}}c_p^{0.8} +$$ + +--------------------- + ## Setting of maximum desirable bootstrap current fraction The variable `bootstrap_current_fraction_max` can be set to the value of maximum desirable bootstrap current fraction for a specific design. When optimising if the value of the calculated `bootstrap_current_fraction` for the model selected with `i_bootstrap_current` exceeds this value, then `bootstrap_current_fraction` is set to the value of `bootstrap_current_fraction_max`. @@ -522,4 +540,5 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^5]: O. Sauter, C. Angioni, Y. R. Lin-Liu; Erratum: “Neoclassical conductivity and bootstrap current formulas for general axisymmetric equilibria and arbitrary collisionality regime” [Phys. Plasmas 6, 2834 (1999)]. Phys. Plasmas 1 December 2002; 9 (12): 5140. https://doi.org/10.1063/1.1517052 [^6]: Ryosuke Sakai, Takaaki Fujita, Atsushi Okamoto, Derivation of bootstrap current fraction scaling formula for 0-D system code analysis, Fusion Engineering and Design, Volume 149, 2019, 111322, ISSN 0920-3796, https://doi.org/10.1016/j.fusengdes.2019.111322. [^7]: T.C.Hender et.al., 'Physics Assesment of the European Reactor Study', AEA FUS 172, 1992 -[^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. \ No newline at end of file +[^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. +[^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. \ No newline at end of file From 374345c3049bbfc28b9a506e11e1d9bc22e7d807 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 23 Oct 2024 12:01:18 +0100 Subject: [PATCH 04/26] Add new bootstrap scaling distribution plot to plot_proc.py --- process/io/plot_proc.py | 103 +++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 17 deletions(-) diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index d04a6d858e..192f85a30a 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -1876,14 +1876,14 @@ def plot_tf_wp(axis, mfile_data, scan: int) -> None: ) ) - plt.minorticks_on() - plt.xlim(0.0, r_tf_inboard_out * 1.1) - plt.ylim((y14[-1] * 1.25), (-y14[-1] * 1.25)) + axis.minorticks_on() + axis.set_xlim(0.0, r_tf_inboard_out * 1.1) + axis.set_ylim((y14[-1] * 1.25), (-y14[-1] * 1.25)) - plt.title("Top-down view of inboard TF coil at midplane") - plt.xlabel("Radial distance [m]") - plt.ylabel("Toroidal distance [m]") - plt.legend(bbox_to_anchor=(0.0, -0.25), loc="upper left") + axis.set_title("Top-down view of inboard TF coil at midplane") + axis.set_xlabel("Radial distance [m]") + axis.set_ylabel("Toroidal distance [m]") + axis.legend(bbox_to_anchor=(0.0, -0.25), loc="upper left") def plot_tf_turn(axis, mfile_data, scan: int) -> None: @@ -1974,8 +1974,8 @@ def plot_tf_turn(axis, mfile_data, scan: int) -> None: edgecolor="black", ), ) - plt.xlim(-turn_width * 0.05, turn_width * 1.05) - plt.ylim(-turn_width * 0.05, turn_width * 1.05) + axis.set_xlim(-turn_width * 0.05, turn_width * 1.05) + axis.set_ylim(-turn_width * 0.05, turn_width * 1.05) # Non square turns elif integer_turns == 1: @@ -2026,14 +2026,14 @@ def plot_tf_turn(axis, mfile_data, scan: int) -> None: ), ) - plt.xlim(-turn_width * 0.05, turn_width * 1.05) - plt.ylim(-turn_height * 0.05, turn_height * 1.05) + axis.set_xlim(-turn_width * 0.05, turn_width * 1.05) + axis.set_ylim(-turn_height * 0.05, turn_height * 1.05) - plt.minorticks_on() - plt.title("WP Turn Structure") - plt.xlabel("X [mm]") - plt.ylabel("Y [mm]") - plt.legend(bbox_to_anchor=(0.0, -0.25), loc="upper left") + axis.minorticks_on() + axis.set_title("WP Turn Structure") + axis.set_xlabel("X [mm]") + axis.set_ylabel("Y [mm]") + axis.legend(loc="upper right", bbox_to_anchor=(1.0, -0.25)) def plot_pf_coils(axis, mfile_data, scan, colour_scheme): @@ -2898,10 +2898,72 @@ def plot_current_drive_info(axis, mfile_data, scan): plot_info(axis, data, mfile_data, scan) +def plot_bootstrap_comparison(axis, mfile_data, scan): + """Function to plot a scatter box plot of bootstrap current fractions. + + Arguments: + axis --> axis object to plot to + mfile_data --> MFILE data object + scan --> scan number to use + """ + + boot_ipdg = mfile_data.data["bscf_iter89"].get_scan(scan) + boot_sauter = mfile_data.data["bscf_sauter"].get_scan(scan) + boot_nenins = mfile_data.data["bscf_nevins"].get_scan(scan) + boot_wilson = mfile_data.data["bscf_wilson"].get_scan(scan) + boot_sakai = mfile_data.data["bscf_sakai"].get_scan(scan) + boot_aries = mfile_data.data["bscf_aries"].get_scan(scan) + boot_andrade = mfile_data.data["bscf_andrade"].get_scan(scan) + + # Data for the box plot + data = [ + boot_ipdg, + boot_sauter, + boot_nenins, + boot_wilson, + boot_sakai, + boot_aries, + boot_andrade, + ] + labels = [ + "IPDG", + "Sauter", + "Nevins", + "Wilson", + "Sakai", + "ARIES", + "Andrade", + ] + + x = np.ones(len(data)) + + # Labels for the box plot + plt.scatter(x, data, color="black") + # Create the box plot + axis.boxplot(data) + # Calculate average and standard deviation + avg_bootstrap = np.mean(data) + std_bootstrap = np.std(data) + + # Plot average and standard deviation as text + axis.text( + 1.1, 0.9, f"Average: {avg_bootstrap:.2f}", transform=axis.transAxes, fontsize=10 + ) + axis.text( + 1.1, 0.8, f"Std Dev: {std_bootstrap:.2f}", transform=axis.transAxes, fontsize=10 + ) + axis.set_xticks([]) + for i, value in enumerate(data): + axis.text(x[i] + 0.1, value, labels[i], fontsize=8, verticalalignment="center") + axis.set_title("Bootstrap Current Fraction Comparison") + axis.set_ylabel("Bootstrap Current Fraction") + + def main_plot( fig1, fig2, fig3, + fig4, m_file_data, scan, imp="../data/lz_non_corona_14_elements/", @@ -2988,7 +3050,7 @@ def main_plot( plot_current_drive_info(plot_6, m_file_data, scan) fig1.subplots_adjust(wspace=0.25, hspace=0.25) - # Can only plot WP and turn sturcutre if superconducting coil at the moment + # Can only plot WP and turn structure if superconducting coil at the moment if m_file_data.data["i_tf_sup"].get_scan(scan) == 1: # TF coil with WP plot_7 = fig3.add_subplot(321) @@ -2998,6 +3060,9 @@ def main_plot( plot_8 = fig3.add_subplot(322, aspect="equal") plot_tf_turn(plot_8, m_file_data, scan) + plot_9 = fig4.add_subplot(221) + plot_bootstrap_comparison(plot_9, m_file_data, scan) + def main(args=None): # TODO The use of globals here isn't ideal, but is required to get main() @@ -3252,12 +3317,14 @@ def main(args=None): page1 = plt.figure(figsize=(12, 9), dpi=80) page2 = plt.figure(figsize=(12, 9), dpi=80) page3 = plt.figure(figsize=(12, 9), dpi=80) + page4 = plt.figure(figsize=(12, 9), dpi=80) # run main_plot main_plot( page1, page2, page3, + page4, m_file, scan=scan, demo_ranges=demo_ranges, @@ -3269,6 +3336,7 @@ def main(args=None): pdf.savefig(page1) pdf.savefig(page2) pdf.savefig(page3) + pdf.savefig(page4) # show fig if option used if args.show: @@ -3277,6 +3345,7 @@ def main(args=None): plt.close(page1) plt.close(page2) plt.close(page3) + plt.close(page4) if __name__ == "__main__": From 19faafed47c9a09e3641e02e0c5442e78942e0c2 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 23 Oct 2024 15:27:37 +0100 Subject: [PATCH 05/26] Add basics of Hoang bootstrap model and add to plot_proc output, no test added --- .../plasma_current/bootstrap_current.md | 17 ++++- process/io/plot_proc.py | 3 + process/physics.py | 76 ++++++++++++++++++- process/plasma_profiles.py | 4 +- source/fortran/current_drive_variables.f90 | 3 + source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 1 + 7 files changed, 100 insertions(+), 6 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index ea17c0157d..ed61cd1ef8 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -511,6 +511,20 @@ $$ --------------------- +### Hoang Scaling | `bootstrap_fraction_hoang()` + +Is selected by setting `i_bootstrap_current = 8`[^10] + +$$ +C_{\text{BS}} = \sqrt{\frac{\alpha_{\text{p}}}{\alpha_{\text{j}}}} +$$ + +$$ +f_{\text{BS}} = 0.4C_{\text{BS}} \sqrt{\epsilon}\beta_{\text{p}}^{0.9} +$$ + +--------------------- + ## Setting of maximum desirable bootstrap current fraction The variable `bootstrap_current_fraction_max` can be set to the value of maximum desirable bootstrap current fraction for a specific design. When optimising if the value of the calculated `bootstrap_current_fraction` for the model selected with `i_bootstrap_current` exceeds this value, then `bootstrap_current_fraction` is set to the value of `bootstrap_current_fraction_max`. @@ -541,4 +555,5 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^6]: Ryosuke Sakai, Takaaki Fujita, Atsushi Okamoto, Derivation of bootstrap current fraction scaling formula for 0-D system code analysis, Fusion Engineering and Design, Volume 149, 2019, 111322, ISSN 0920-3796, https://doi.org/10.1016/j.fusengdes.2019.111322. [^7]: T.C.Hender et.al., 'Physics Assesment of the European Reactor Study', AEA FUS 172, 1992 [^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. -[^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. \ No newline at end of file +[^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. +[^10]: G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, Jan. 1997, doi: https://doi.org/10.1063/1.53414. \ No newline at end of file diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 192f85a30a..373b02948f 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2914,6 +2914,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_sakai = mfile_data.data["bscf_sakai"].get_scan(scan) boot_aries = mfile_data.data["bscf_aries"].get_scan(scan) boot_andrade = mfile_data.data["bscf_andrade"].get_scan(scan) + boot_hoang = mfile_data.data["bscf_hoang"].get_scan(scan) # Data for the box plot data = [ @@ -2924,6 +2925,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_sakai, boot_aries, boot_andrade, + boot_hoang, ] labels = [ "IPDG", @@ -2933,6 +2935,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): "Sakai", "ARIES", "Andrade", + "Hoang", ] x = np.ones(len(data)) diff --git a/process/physics.py b/process/physics.py index 6fdbbdd4a1..35287b44d0 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1739,6 +1739,16 @@ def physics(self): ) ) + current_drive_variables.bscf_hoang = ( + current_drive_variables.cboot + * self.bootstrap_fraction_hoang( + betap=physics_variables.betap, + pressure_index=physics_variables.alphap, + current_index=physics_variables.alphaj, + inverse_aspect=physics_variables.eps, + ) + ) + if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( current_drive_variables.bootstrap_current_fraction_max @@ -1777,6 +1787,10 @@ def physics(self): current_drive_variables.bootstrap_current_fraction = ( current_drive_variables.bscf_andrade ) + elif physics_variables.i_bootstrap_current == 8: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_hoang + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -4901,6 +4915,13 @@ def outplas(self): current_drive_variables.bscf_andrade, "OP ", ) + po.ovarrf( + self.outfile, + "Bootstrap fraction (Hoang)", + "(bscf_hoang)", + current_drive_variables.bscf_hoang, + "OP ", + ) po.ovarrf( self.outfile, @@ -4958,6 +4979,21 @@ def outplas(self): self.outfile, " (Sakai et al bootstrap current fraction model used)", ) + elif physics_variables.i_bootstrap_current == 6: + po.ocmmnt( + self.outfile, + " (ARIES bootstrap current fraction model used)", + ) + elif physics_variables.i_bootstrap_current == 7: + po.ocmmnt( + self.outfile, + " (Andrade et al bootstrap current fraction model used)", + ) + elif physics_variables.i_bootstrap_current == 8: + po.ocmmnt( + self.outfile, + " (Hoang et al bootstrap current fraction model used)", + ) if physics_variables.i_diamagnetic_current == 0: po.ocmmnt( @@ -5653,10 +5689,10 @@ def bootstrap_fraction_aries( """ # Using the standard variable naming from the ARIES paper - a_1 = 1.10-1.165*rli+0.47*rli**2 - b_1 = 0.806 - 0.885*rli + 0.297*rli**2 + a_1 = 1.10 - 1.165 * rli + 0.47 * rli**2 + b_1 = 0.806 - 0.885 * rli + 0.297 * rli**2 - c_bs = a_1+b_1*(core_density/average_desnity) + c_bs = a_1 + b_1 * (core_density / average_desnity) return c_bs * np.sqrt(inverse_aspect) * betap @@ -5696,6 +5732,40 @@ def bootstrap_fraction_andrade( return c_bs * np.sqrt(inverse_aspect) * betap * c_p**0.8 + @staticmethod + def bootstrap_fraction_hoang( + betap: float, + pressure_index: float, + current_index: float, + inverse_aspect: float, + ) -> float: + """ + Calculate the bootstrap fraction using the Hoang et al formula. + + Parameters: + betap (float): Plasma poloidal beta. + pressure_index (float): Pressure profile index. + current_index (float): Current profile index. + inverse_aspect (float): Inverse aspect ratio. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + + References: + - G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, + Jan. 1997, doi: https://doi.org/10.1063/1.53414. + ‌ + """ + + # Using the standard variable naming from the Hoang et.al. paper + # These terms do not equal the profile indexes, though are closely linked + + c_bs = np.sqrt(pressure_index / current_index) + + return 0.4 * np.sqrt(inverse_aspect) * betap**0.9 * c_bs + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/process/plasma_profiles.py b/process/plasma_profiles.py index 787afec6a9..6f5c3d2fba 100644 --- a/process/plasma_profiles.py +++ b/process/plasma_profiles.py @@ -266,7 +266,9 @@ def calculate_profile_factors(self) -> None: # Shall assume that the pressure profile is parabolic. Can this find volume average from # profile index and core value the same as for density and temperature - physics_variables.vol_avg_pressure = physics_variables.p0 / (physics_variables.alphap+1) + physics_variables.vol_avg_pressure = physics_variables.p0 / ( + physics_variables.alphap + 1 + ) @staticmethod def calculate_parabolic_profile_factors() -> None: diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index 896091394c..b96ad80ea8 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -51,6 +51,9 @@ module current_drive_variables real(dp) :: bscf_andrade !! Bootstrap current fraction, Andrade et al model + real(dp) :: bscf_hoang + !! Bootstrap current fraction, Hoang et al model + real(dp) :: cboot !! bootstrap current fraction multiplier (`i_bootstrap_current=1`) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index 99c6d48536..dbdb1e9fb0 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 7, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 8, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index 7886853ff6..efaafd3055 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -252,6 +252,7 @@ module physics_variables !! - =5 for Sakai et al scaling !! - =6 for ARIES scaling !! - =7 for Andrade et al scaling + !! - =8 for Hoang et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) From 29e5ed8965415bb1cb12e0ff66249346f4c8bf44 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 23 Oct 2024 17:32:50 +0100 Subject: [PATCH 06/26] Implement the Wong bootstrap model. No test added, Details added to docs --- .../plasma_current/bootstrap_current.md | 29 +++++- process/physics.py | 89 ++++++++++++++++--- source/fortran/current_drive_variables.f90 | 3 + source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 1 + 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index ed61cd1ef8..a9f154cd6a 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -525,6 +525,32 @@ $$ --------------------- +### Wong Scaling | `bootstrap_fraction_wong()` + +Is selected by setting `i_bootstrap_current = 9`[^11] + +$$ +C_{\text{BS}} = 0.773+0.019\kappa +$$ + +$$ +f_{\text{peak}} = \left(\int_0^1 \left(1-\rho^2 \right)^{\alpha_{\text{T}}} \left(1-\rho^2 \right)^{\alpha_{\text{n}}} \ \ \mathrm{d\rho}\right)^{-1} +$$ + +The integral above is set by the definite solution below + +$$ +\frac{\operatorname{B}\left(\frac{1}{2},{\alpha}_{n} + {\alpha}_{T} + 1\right)}{2} +$$ + +Assuming that $\alpha_{\text{n}} + \alpha_{\text{T}} > 0, \alpha_{\text{n}} + \alpha_{\text{T}} + 1 > 0$ + +$$ +f_{\text{BS}} = C_{\text{BS}} f_{\text{peak}}^{0.25}\beta_{\text{p}}\sqrt{\epsilon} +$$ + +--------------------- + ## Setting of maximum desirable bootstrap current fraction The variable `bootstrap_current_fraction_max` can be set to the value of maximum desirable bootstrap current fraction for a specific design. When optimising if the value of the calculated `bootstrap_current_fraction` for the model selected with `i_bootstrap_current` exceeds this value, then `bootstrap_current_fraction` is set to the value of `bootstrap_current_fraction_max`. @@ -556,4 +582,5 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^7]: T.C.Hender et.al., 'Physics Assesment of the European Reactor Study', AEA FUS 172, 1992 [^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. [^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. -[^10]: G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, Jan. 1997, doi: https://doi.org/10.1063/1.53414. \ No newline at end of file +[^10]: G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, Jan. 1997, doi: https://doi.org/10.1063/1.53414. +[^11]: C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. \ No newline at end of file diff --git a/process/physics.py b/process/physics.py index 35287b44d0..8f93275d1f 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1,6 +1,7 @@ import math from typing import Tuple import numpy as np +import scipy import numba as nb from scipy.optimize import root_scalar from process.utilities.f2py_string_patch import f2py_compatible_to_string @@ -1749,6 +1750,17 @@ def physics(self): ) ) + current_drive_variables.bscf_wong = ( + current_drive_variables.cboot + * self.bootstrap_fraction_wong( + betap=physics_variables.betap, + density_index=physics_variables.alphan, + temperature_index=physics_variables.alphat, + inverse_aspect=physics_variables.eps, + elongation=physics_variables.kappa, + ) + ) + if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( current_drive_variables.bootstrap_current_fraction_max @@ -1791,6 +1803,10 @@ def physics(self): current_drive_variables.bootstrap_current_fraction = ( current_drive_variables.bscf_hoang ) + elif physics_variables.i_bootstrap_current == 9: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_wong + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -4922,6 +4938,14 @@ def outplas(self): current_drive_variables.bscf_hoang, "OP ", ) + + po.ovarrf( + self.outfile, + "Bootstrap fraction (Wong)", + "(bscf_wong)", + current_drive_variables.bscf_wong, + "OP ", + ) po.ovarrf( self.outfile, @@ -4994,6 +5018,12 @@ def outplas(self): self.outfile, " (Hoang et al bootstrap current fraction model used)", ) + elif physics_variables.i_bootstrap_current == 9: + po.ocmmnt( + self.outfile, + " (Wong et al bootstrap current fraction model used)", + ) + if physics_variables.i_diamagnetic_current == 0: po.ocmmnt( @@ -5740,23 +5770,22 @@ def bootstrap_fraction_hoang( inverse_aspect: float, ) -> float: """ - Calculate the bootstrap fraction using the Hoang et al formula. + Calculate the bootstrap fraction using the Hoang et al formula. - Parameters: - betap (float): Plasma poloidal beta. - pressure_index (float): Pressure profile index. - current_index (float): Current profile index. - inverse_aspect (float): Inverse aspect ratio. + Parameters: + betap (float): Plasma poloidal beta. + pressure_index (float): Pressure profile index. + current_index (float): Current profile index. + inverse_aspect (float): Inverse aspect ratio. - Returns: - float: The calculated bootstrap fraction. + Returns: + float: The calculated bootstrap fraction. - Notes: + Notes: - References: - - G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, - Jan. 1997, doi: https://doi.org/10.1063/1.53414. - ‌ + References: + - G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, + Jan. 1997, doi: https://doi.org/10.1063/1.53414. """ # Using the standard variable naming from the Hoang et.al. paper @@ -5766,6 +5795,40 @@ def bootstrap_fraction_hoang( return 0.4 * np.sqrt(inverse_aspect) * betap**0.9 * c_bs + @staticmethod + def bootstrap_fraction_wong( + betap: float, + density_index: float, + temperature_index: float, + inverse_aspect: float, + elongation: float, + ) -> float: + """ + Calculate the bootstrap fraction using the Wong et al formula. + + Parameters: + betap (float): Plasma poloidal beta. + density_index (float): Density profile index. + temperature_index (float): Temperature profile index. + inverse_aspect (float): Inverse aspect ratio. + elongation (float): Plasma elongation. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + + References: + - C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” + vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. + """ + # Using the standard variable naming from the Wong et.al. paper + f_peak = 2.0/scipy.special.beta(0.5, density_index + temperature_index + 1) + + c_bs = 0.773 + 0.019 * elongation + + return c_bs * f_peak**0.25 * betap * np.sqrt(inverse_aspect) + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index b96ad80ea8..b0cd7f1d42 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -54,6 +54,9 @@ module current_drive_variables real(dp) :: bscf_hoang !! Bootstrap current fraction, Hoang et al model + real(dp) :: bscf_wong + !! Bootstrap current fraction, Wong et al model + real(dp) :: cboot !! bootstrap current fraction multiplier (`i_bootstrap_current=1`) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index dbdb1e9fb0..a629224e00 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 8, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 9, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index efaafd3055..c609fb418d 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -253,6 +253,7 @@ module physics_variables !! - =6 for ARIES scaling !! - =7 for Andrade et al scaling !! - =8 for Hoang et al scaling + !! - =9 for Wong et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) From 3f04b9110c5bd1a426937d8bec058ac0d784cb6e Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 23 Oct 2024 17:33:16 +0100 Subject: [PATCH 07/26] Update bootstrap comparison model with new violin plot --- process/io/plot_proc.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 373b02948f..606200a076 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2915,6 +2915,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_aries = mfile_data.data["bscf_aries"].get_scan(scan) boot_andrade = mfile_data.data["bscf_andrade"].get_scan(scan) boot_hoang = mfile_data.data["bscf_hoang"].get_scan(scan) + boot_wong = mfile_data.data["bscf_wong"].get_scan(scan) # Data for the box plot data = [ @@ -2926,6 +2927,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_aries, boot_andrade, boot_hoang, + boot_wong, ] labels = [ "IPDG", @@ -2936,30 +2938,42 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): "ARIES", "Andrade", "Hoang", + "Wong", ] x = np.ones(len(data)) - # Labels for the box plot - plt.scatter(x, data, color="black") + # Create the violin plot + axis.violinplot(data, showextrema=False) + # Create the box plot - axis.boxplot(data) - # Calculate average and standard deviation + axis.boxplot(data, showfliers=True) + + # Scatter plot for each data point + colors = plt.cm.plasma(np.linspace(0, 1, len(data))) + for i, value in enumerate(data): + axis.scatter(x[i], value, color=colors[i], label=labels[i], alpha=1.0) + axis.legend(loc='upper left', bbox_to_anchor=(1, 1)) + + # Calculate average, standard deviation, and median avg_bootstrap = np.mean(data) std_bootstrap = np.std(data) + median_bootstrap = np.median(data) - # Plot average and standard deviation as text + # Plot average, standard deviation, and median as text axis.text( - 1.1, 0.9, f"Average: {avg_bootstrap:.2f}", transform=axis.transAxes, fontsize=10 + 0.6, 0.9, f"Average: {avg_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 ) axis.text( - 1.1, 0.8, f"Std Dev: {std_bootstrap:.2f}", transform=axis.transAxes, fontsize=10 + 0.6, 0.85, f"Standard Dev: {std_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 ) - axis.set_xticks([]) - for i, value in enumerate(data): - axis.text(x[i] + 0.1, value, labels[i], fontsize=8, verticalalignment="center") + axis.text(0.6, 0.8, f"Median: {median_bootstrap:.4f}", transform=axis.transAxes, fontsize=9) + axis.set_title("Bootstrap Current Fraction Comparison") axis.set_ylabel("Bootstrap Current Fraction") + axis.set_xlim([0.5, 1.5]) + axis.set_xticks([]) + axis.set_xticklabels([]) def main_plot( From caebdda8d87a9cc85783d67b1b01f175c9b40703 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 23 Oct 2024 17:33:16 +0100 Subject: [PATCH 08/26] Update bootstrap comparison model with new violin plot --- process/io/plot_proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 606200a076..02c414b211 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2947,7 +2947,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): axis.violinplot(data, showextrema=False) # Create the box plot - axis.boxplot(data, showfliers=True) + axis.boxplot(data, showfliers=True, showmeans=True, meanline=True, widths=0.3) # Scatter plot for each data point colors = plt.cm.plasma(np.linspace(0, 1, len(data))) From b434c08b5335090bcc8a5568a4fac1657536f0b6 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 24 Oct 2024 09:35:10 +0100 Subject: [PATCH 09/26] Add new Gi bootstrap scaling formula and add to docs, no tests --- .../plasma_current/bootstrap_current.md | 17 ++++- process/io/plot_proc.py | 19 ++++- process/physics.py | 75 +++++++++++++++++-- source/fortran/current_drive_variables.f90 | 5 +- source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 1 + 6 files changed, 107 insertions(+), 12 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index a9f154cd6a..7c36f3e70e 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -551,6 +551,20 @@ $$ --------------------- +### Gi Scaling | `bootstrap_fraction_gi()` + +Is selected by setting `i_bootstrap_current = 10`[^12] + +$$ +C_{\text{BS}} = 0.474 \epsilon^{-0.1} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} \left(\frac{q_{95}}{q_0}\right)^{-0.133} +$$ + +$$ +f_{\text{BS}} = C_{\text{BS}} \beta_{\text{p}}\sqrt{\epsilon} +$$ + +--------------------- + ## Setting of maximum desirable bootstrap current fraction The variable `bootstrap_current_fraction_max` can be set to the value of maximum desirable bootstrap current fraction for a specific design. When optimising if the value of the calculated `bootstrap_current_fraction` for the model selected with `i_bootstrap_current` exceeds this value, then `bootstrap_current_fraction` is set to the value of `bootstrap_current_fraction_max`. @@ -583,4 +597,5 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^8]: Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants, ”Fusion Engineering and Design, vol. 85, no. 2, pp. 243–265, Apr. 2010, doi: https://doi.org/10.1016/j.fusengdes.2010.02.015. [^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. [^10]: G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, Jan. 1997, doi: https://doi.org/10.1063/1.53414. -[^11]: C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. \ No newline at end of file +[^11]: C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. +[^12]: K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. \ No newline at end of file diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 02c414b211..5e54401379 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2916,6 +2916,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_andrade = mfile_data.data["bscf_andrade"].get_scan(scan) boot_hoang = mfile_data.data["bscf_hoang"].get_scan(scan) boot_wong = mfile_data.data["bscf_wong"].get_scan(scan) + boot_gi = mfile_data.data["bscf_gi"].get_scan(scan) # Data for the box plot data = [ @@ -2928,6 +2929,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_andrade, boot_hoang, boot_wong, + boot_gi, ] labels = [ "IPDG", @@ -2939,6 +2941,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): "Andrade", "Hoang", "Wong", + "Gi", ] x = np.ones(len(data)) @@ -2953,7 +2956,7 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): colors = plt.cm.plasma(np.linspace(0, 1, len(data))) for i, value in enumerate(data): axis.scatter(x[i], value, color=colors[i], label=labels[i], alpha=1.0) - axis.legend(loc='upper left', bbox_to_anchor=(1, 1)) + axis.legend(loc="upper left", bbox_to_anchor=(1, 1)) # Calculate average, standard deviation, and median avg_bootstrap = np.mean(data) @@ -2965,9 +2968,19 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): 0.6, 0.9, f"Average: {avg_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 ) axis.text( - 0.6, 0.85, f"Standard Dev: {std_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 + 0.6, + 0.85, + f"Standard Dev: {std_bootstrap:.4f}", + transform=axis.transAxes, + fontsize=9, + ) + axis.text( + 0.6, + 0.8, + f"Median: {median_bootstrap:.4f}", + transform=axis.transAxes, + fontsize=9, ) - axis.text(0.6, 0.8, f"Median: {median_bootstrap:.4f}", transform=axis.transAxes, fontsize=9) axis.set_title("Bootstrap Current Fraction Comparison") axis.set_ylabel("Bootstrap Current Fraction") diff --git a/process/physics.py b/process/physics.py index 8f93275d1f..41088f88db 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1739,7 +1739,6 @@ def physics(self): inverse_aspect=physics_variables.eps, ) ) - current_drive_variables.bscf_hoang = ( current_drive_variables.cboot * self.bootstrap_fraction_hoang( @@ -1749,7 +1748,6 @@ def physics(self): inverse_aspect=physics_variables.eps, ) ) - current_drive_variables.bscf_wong = ( current_drive_variables.cboot * self.bootstrap_fraction_wong( @@ -1760,6 +1758,18 @@ def physics(self): elongation=physics_variables.kappa, ) ) + current_drive_variables.bscf_gi = ( + current_drive_variables.cboot + * self.bootstrap_fraction_gi( + betap=physics_variables.betap, + pressure_index=physics_variables.alphap, + temperature_index=physics_variables.alphat, + inverse_aspect=physics_variables.eps, + effective_charge=physics_variables.zeff, + q95=physics_variables.q95, + q0=physics_variables.q0, + ) + ) if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( @@ -1806,7 +1816,11 @@ def physics(self): elif physics_variables.i_bootstrap_current == 9: current_drive_variables.bootstrap_current_fraction = ( current_drive_variables.bscf_wong - ) + ) + elif physics_variables.i_bootstrap_current == 10: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_gi + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -4938,7 +4952,6 @@ def outplas(self): current_drive_variables.bscf_hoang, "OP ", ) - po.ovarrf( self.outfile, "Bootstrap fraction (Wong)", @@ -4946,6 +4959,13 @@ def outplas(self): current_drive_variables.bscf_wong, "OP ", ) + po.ovarrf( + self.outfile, + "Bootstrap fraction (Gi)", + "(bscf_gi)", + current_drive_variables.bscf_gi, + "OP ", + ) po.ovarrf( self.outfile, @@ -5022,8 +5042,12 @@ def outplas(self): po.ocmmnt( self.outfile, " (Wong et al bootstrap current fraction model used)", - ) - + ) + elif physics_variables.i_bootstrap_current == 10: + po.ocmmnt( + self.outfile, + " (Gi et al bootstrap current fraction model used)", + ) if physics_variables.i_diamagnetic_current == 0: po.ocmmnt( @@ -5829,6 +5853,45 @@ def bootstrap_fraction_wong( return c_bs * f_peak**0.25 * betap * np.sqrt(inverse_aspect) + @staticmethod + def bootstrap_fraction_gi( + betap: float, + pressure_index: float, + temperature_index: float, + inverse_aspect: float, + effective_charge: float, + q95: float, + q0: float, + ) -> float: + """ + Calculate the bootstrap fraction using the Gi et al formula. + + Parameters: + betap (float): Plasma poloidal beta. + pressure_index (float): Pressure profile index. + temperature_index (float): Temperature profile index. + inverse_aspect (float): Inverse aspect ratio. + effective_charge (float): Plasma effective charge. + q95 (float): Safety factor at 95% of the plasma radius. + q0 (float): Safety factor at the magnetic axis. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + + References: + - K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” + Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, + doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. + """ + + # Using the standard variable naming from the Gi et.al. paper + + c_bs = 0.474 * inverse_aspect**-0.1 * pressure_index**0.974 * temperature_index**-0.416 * effective_charge**0.178 * (q95/q0)**-0.133 + + return c_bs * np.sqrt(inverse_aspect) * betap + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index b0cd7f1d42..683bc4b7a2 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -57,8 +57,11 @@ module current_drive_variables real(dp) :: bscf_wong !! Bootstrap current fraction, Wong et al model + real(dp) :: bscf_gi + !! Bootstrap current fraction, Gi et al model + real(dp) :: cboot - !! bootstrap current fraction multiplier (`i_bootstrap_current=1`) + !! bootstrap current fraction multiplier real(dp) :: cnbeam !! neutral beam current (A) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index a629224e00..40d2dc9c3c 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 9, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 10, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index c609fb418d..41d4a8334a 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -254,6 +254,7 @@ module physics_variables !! - =7 for Andrade et al scaling !! - =8 for Hoang et al scaling !! - =9 for Wong et al scaling + !! - =10 for Gi et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) From 9e57e4c90b4749139402de689776d9a70f6f32bb Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 24 Oct 2024 10:17:07 +0100 Subject: [PATCH 10/26] Add tests and notes for the ARIES bootstrap model --- .../plasma_current/bootstrap_current.md | 2 + process/physics.py | 5 +- tests/unit/test_physics.py | 48 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 7c36f3e70e..ce5438c936 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -475,6 +475,8 @@ The model includes the toroidal diamagnetic current in the calculation due to th Is selected by setting `i_bootstrap_current = 6`[^8] +The source reference[^8] does not provide any info about the derivation of the formula. It is only stated like that shown below. + $$ a_1 = 1.10-1.165l_{\text{i}}+0.47l_{\text{i}}^2 $$ diff --git a/process/physics.py b/process/physics.py index 41088f88db..63029c6e87 100644 --- a/process/physics.py +++ b/process/physics.py @@ -5718,7 +5718,7 @@ def bootstrap_fraction_aries( betap: float, rli: float, core_density: float, - average_desnity: float, + average_density: float, inverse_aspect: float, ) -> float: """ @@ -5735,6 +5735,7 @@ def bootstrap_fraction_aries( float: The calculated bootstrap fraction. Notes: + - The source reference does not provide any info about the derivation of the formula. It is only stated References: - Zoran Dragojlovic et al., “An advanced computational algorithm for systems analysis of tokamak power plants,” @@ -5746,7 +5747,7 @@ def bootstrap_fraction_aries( a_1 = 1.10 - 1.165 * rli + 0.47 * rli**2 b_1 = 0.806 - 0.885 * rli + 0.297 * rli**2 - c_bs = a_1 + b_1 * (core_density / average_desnity) + c_bs = a_1 + b_1 * (core_density / average_density) return c_bs * np.sqrt(inverse_aspect) * betap diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index 402a67322f..2832702eff 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -564,6 +564,54 @@ def test_bootstrap_fraction_sakai(bootstrapfractionsakaiparam, monkeypatch, phys assert bfs == pytest.approx(bootstrapfractionsakaiparam.expected_bfs) +class BootstrapFractionAriesParam(NamedTuple): + betap: Any = None + + rli: Any = None + + core_density: Any = None + + average_density: Any = None + + inverse_aspect: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractionariesparam", + ( + BootstrapFractionAriesParam( + betap=1.2708883332338736, + rli=1.4279108047138775, + core_density=1.0695994460047332E+20, + average_density=8.1317358967210131E+19, + inverse_aspect=1 / 3, + expected_bfs=4.3237405809568441E-01, + ), + ), +) +def test_bootstrap_fraction_aries(bootstrapfractionariesparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_aries. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_aries( + betap=bootstrapfractionariesparam.betap, + rli=bootstrapfractionariesparam.rli, + core_density=bootstrapfractionariesparam.core_density, + average_density=bootstrapfractionariesparam.average_density, + inverse_aspect=bootstrapfractionariesparam.inverse_aspect, + ) + + assert bfs == pytest.approx(bootstrapfractionariesparam.expected_bfs) + + class PlasmaCurrentParam(NamedTuple): normalised_total_beta: Any = None From 4c6871f8dc634b045b2a9553f051a27cfffd797a Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 6 Nov 2024 14:41:51 +0000 Subject: [PATCH 11/26] Enhance documentation and add regression tests for bootstrap current models --- .../plasma_current/bootstrap_current.md | 14 ++ process/io/plot_proc.py | 2 +- process/physics.py | 26 ++- tests/unit/test_physics.py | 198 +++++++++++++++++- 4 files changed, 231 insertions(+), 9 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index ce5438c936..b4413a441b 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -499,6 +499,20 @@ $$ Is selected by setting `i_bootstrap_current = 7`[^9] +Based off plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak. + +| Parameter | Value || Parameter | Value | +|-----------------------|-----------||-----------------------|-----------| +| $A$ | 1.5 || $\alpha_{\text{T}_e}$ | 0.02 | +| $R_0$ | 0.3 || $\alpha_{\text{T}_i}$ | 2 | +| $p(0)$ | 15 kPa || $\kappa(a)$ | 2 | +| $T_{\text{e,i}}(0)$ | 1 keV || $\delta$ | 0.3 | +| $T_{\text{e,i}}(a)$ | 0.1 keV || $I_{\text{p}}$ | 200 kA | +| $\alpha_{\text{p}}$ | 3 || $B_0$ | 0.4 T | +| $\beta$ | 4-10% || $Z_{\text{eff}}$ | 1 | + + + $$ C_{\text{BS}} = 0.2340 \pm 0.0007 $$ diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 5e54401379..6f82bf4a00 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2404,7 +2404,7 @@ def plot_physics_info(axis, mfile_data, scan): data = [ ("powfmw", "Fusion power", "MW"), ("bigq", "$Q_{p}$", ""), - ("plasma_current_MA", "$I_p$", "MA"), + ("plasma_current_ma", "$I_p$", "MA"), ("bt", "Vacuum $B_T$ at $R_0$", "T"), ("q95", r"$q_{\mathrm{95}}$", ""), ("normalised_thermal_beta", r"$\beta_N$, thermal", "% m T MA$^{-1}$"), diff --git a/process/physics.py b/process/physics.py index 63029c6e87..d88505a8c2 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1725,7 +1725,7 @@ def physics(self): betap=physics_variables.betap, rli=physics_variables.rli, core_density=physics_variables.ne0, - average_desnity=physics_variables.dene, + average_density=physics_variables.dene, inverse_aspect=physics_variables.eps, ) ) @@ -1820,7 +1820,7 @@ def physics(self): elif physics_variables.i_bootstrap_current == 10: current_drive_variables.bootstrap_current_fraction = ( current_drive_variables.bscf_gi - ) + ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current error_handling.report_error(75) @@ -3919,6 +3919,12 @@ def outplas(self): "(tbeta)", physics_variables.tbeta, ) + po.ovarrf( + self.outfile, + "Pressure profile index", + "(alphap)", + physics_variables.alphap, + ) if stellarator_variables.istell == 0: po.osubhd(self.outfile, "Density Limit using different models :") @@ -5771,6 +5777,9 @@ def bootstrap_fraction_andrade( float: The calculated bootstrap fraction. Notes: + - Based off plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak + - A = 1.5, R_0 = 0.3m, I_p = 200kA, B_0=0.4T, beta = 4-10%. Profiles taken as Gaussian shaped functions. + References: - M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” @@ -5848,7 +5857,7 @@ def bootstrap_fraction_wong( vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. """ # Using the standard variable naming from the Wong et.al. paper - f_peak = 2.0/scipy.special.beta(0.5, density_index + temperature_index + 1) + f_peak = 2.0 / scipy.special.beta(0.5, density_index + temperature_index + 1) c_bs = 0.773 + 0.019 * elongation @@ -5882,14 +5891,21 @@ def bootstrap_fraction_gi( Notes: References: - - K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” + - K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. """ # Using the standard variable naming from the Gi et.al. paper - c_bs = 0.474 * inverse_aspect**-0.1 * pressure_index**0.974 * temperature_index**-0.416 * effective_charge**0.178 * (q95/q0)**-0.133 + c_bs = ( + 0.474 + * inverse_aspect**-0.1 + * pressure_index**0.974 + * temperature_index**-0.416 + * effective_charge**0.178 + * (q95 / q0) ** -0.133 + ) return c_bs * np.sqrt(inverse_aspect) * betap diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index 2832702eff..efd1fdf7b5 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -584,10 +584,10 @@ class BootstrapFractionAriesParam(NamedTuple): BootstrapFractionAriesParam( betap=1.2708883332338736, rli=1.4279108047138775, - core_density=1.0695994460047332E+20, - average_density=8.1317358967210131E+19, + core_density=1.0695994460047332e20, + average_density=8.1317358967210131e19, inverse_aspect=1 / 3, - expected_bfs=4.3237405809568441E-01, + expected_bfs=4.3237405809568441e-01, ), ), ) @@ -612,6 +612,198 @@ def test_bootstrap_fraction_aries(bootstrapfractionariesparam, physics): assert bfs == pytest.approx(bootstrapfractionariesparam.expected_bfs) +class BootstrapFractionAndradeParam(NamedTuple): + betap: Any = None + + core_pressure: Any = None + + average_pressure: Any = None + + inverse_aspect: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractionandradeparam", + ( + BootstrapFractionAndradeParam( + betap=1.2708883332338736, + core_pressure=8.3049163275475602e05, + average_pressure=2.4072221239268288e05, + inverse_aspect=1 / 3, + expected_bfs=4.6240007834873120e-01, + ), + ), +) +def test_bootstrap_fraction_andrade(bootstrapfractionandradeparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_andrade. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_andrade( + betap=bootstrapfractionandradeparam.betap, + core_pressure=bootstrapfractionandradeparam.core_pressure, + average_pressure=bootstrapfractionandradeparam.average_pressure, + inverse_aspect=bootstrapfractionandradeparam.inverse_aspect, + ) + + assert bfs == pytest.approx(bootstrapfractionandradeparam.expected_bfs) + + +class BootstrapFractionHoangParam(NamedTuple): + betap: Any = None + + pressure_index: Any = None + + current_index: Any = None + + inverse_aspect: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractionhoangparam", + ( + BootstrapFractionHoangParam( + betap=1.2708883332338736, + pressure_index=2.4500000000000002e00, + current_index=2.8314361644755763e00, + inverse_aspect=1 / 3, + expected_bfs=2.6654814984459324e-01, + ), + ), +) +def test_bootstrap_fraction_hoang(bootstrapfractionhoangparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_hoang. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_hoang( + betap=bootstrapfractionhoangparam.betap, + pressure_index=bootstrapfractionhoangparam.pressure_index, + current_index=bootstrapfractionhoangparam.current_index, + inverse_aspect=bootstrapfractionhoangparam.inverse_aspect, + ) + + assert bfs == pytest.approx(bootstrapfractionhoangparam.expected_bfs) + + +class BootstrapFractionWongParam(NamedTuple): + betap: Any = None + + density_index: Any = None + + temperature_index: Any = None + + inverse_aspect: Any = None + + elongation: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractionwongparam", + ( + BootstrapFractionWongParam( + betap=1.2708883332338736, + density_index=1.0000000000000000e00, + temperature_index=1.4500000000000000e00, + inverse_aspect=1 / 3, + elongation=1.8500000000000001e00, + expected_bfs=7.0706527916080808e-01, + ), + ), +) +def test_bootstrap_fraction_wong(bootstrapfractionwongparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_wong. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_wong( + betap=bootstrapfractionwongparam.betap, + density_index=bootstrapfractionwongparam.density_index, + temperature_index=bootstrapfractionwongparam.temperature_index, + inverse_aspect=bootstrapfractionwongparam.inverse_aspect, + elongation=bootstrapfractionwongparam.elongation, + ) + + assert bfs == pytest.approx(bootstrapfractionwongparam.expected_bfs) + + +class BootstrapFractionGiParam(NamedTuple): + betap: Any = None + + pressure_index: Any = None + + temperature_index: Any = None + + inverse_aspect: Any = None + + effective_charge: Any = None + + q95: Any = None + + q0: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractiongiparam", + ( + BootstrapFractionGiParam( + betap=1.2708883332338736, + pressure_index=2.4500000000000002e00, + temperature_index=1.4500000000000000e00, + inverse_aspect=1 / 3, + effective_charge=2.5368733516769737e00, + q95=3.4656394133756647e00, + q0=1.0, + expected_bfs=7.9639753138719782e-01, + ), + ), +) +def test_bootstrap_fraction_gi(bootstrapfractiongiparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_gi. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_gi( + betap=bootstrapfractiongiparam.betap, + pressure_index=bootstrapfractiongiparam.pressure_index, + temperature_index=bootstrapfractiongiparam.temperature_index, + inverse_aspect=bootstrapfractiongiparam.inverse_aspect, + effective_charge=bootstrapfractiongiparam.effective_charge, + q95=bootstrapfractiongiparam.q95, + q0=bootstrapfractiongiparam.q0, + ) + + assert bfs == pytest.approx(bootstrapfractiongiparam.expected_bfs) + + class PlasmaCurrentParam(NamedTuple): normalised_total_beta: Any = None From 2f5a9d0f7ef2db0c34bfeeaf3729e2652fdb764d Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 6 Nov 2024 15:54:45 +0000 Subject: [PATCH 12/26] Add full description of Hoang model --- .../plasma_current/bootstrap_current.md | 42 +++++++++++++++---- process/physics.py | 17 +++++++- process/plasma_profiles.py | 2 +- tests/unit/test_physics.py | 2 +- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index b4413a441b..d5f81683b5 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -503,12 +503,12 @@ Based off plasma profiles from Experimento Tokamak Esferico (ETE) spherical toka | Parameter | Value || Parameter | Value | |-----------------------|-----------||-----------------------|-----------| -| $A$ | 1.5 || $\alpha_{\text{T}_e}$ | 0.02 | -| $R_0$ | 0.3 || $\alpha_{\text{T}_i}$ | 2 | -| $p(0)$ | 15 kPa || $\kappa(a)$ | 2 | -| $T_{\text{e,i}}(0)$ | 1 keV || $\delta$ | 0.3 | -| $T_{\text{e,i}}(a)$ | 0.1 keV || $I_{\text{p}}$ | 200 kA | -| $\alpha_{\text{p}}$ | 3 || $B_0$ | 0.4 T | +| $A$ | 1.5 || $\alpha_{\text{T_e}}$ | 0.02 | +| $R_0$ | 0.3 $\text{[m]}$ || $\alpha_{\text{T_i}}$ | 2 | +| $p(0)$ | 15 $\text{[kPa]}$ || $\kappa(a)$ | 2 | +| $T_{\text{e,i}}(0)$ | 1 $\text{[keV]}$ || $\delta$ | 0.3 | +| $T_{\text{e,i}}(a)$ | 0.1 $\text{[keV]}$ || $I_{\text{p}}$ | 200 $\text{[kA]}$ | +| $\alpha_{\text{p}}$ | 3 || $B_0$ | 0.4 $\text{[T]}$ | | $\beta$ | 4-10% || $Z_{\text{eff}}$ | 1 | @@ -531,8 +531,36 @@ $$ Is selected by setting `i_bootstrap_current = 8`[^10] +This scaling is based off of 170 discharges from TFTR with the neoclassical bootstrap current being calculated by the TRANSP plasma analysis code. +The plasma parameters of the discharges can be seen in the table below: + +| Parameter | Value | +|-----------------------|-----------| +| $I_{\text{p}}$ | 0.6 - 2.7 $\text{[MA]}$ | +| $q(a)$ | 2.8 - 11.0 | +| $P_{\text{NBI}}$ | 2.0 - 35.0 $\text{[MW]}$ | +| $P_{\text{ICRH}}$ | 1.5 - 6.0 $\text{[MW]}$ | +| $B_{\text{T}}$ | 1.9 - 5.7 $\text{[T]}$ | +| $n_{\text{e,0}}$ | 0.2 - 1.2 $[10^{20} \text{m}^{-3}]$ | + +I wide variety of discharge regimes are included, such as: L-mode supershots, discharges +with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. +Discharges with both monotonic $q$ profiles and with reversed shear are included in the dataset. + +For an example ERS discharge the bootstrap current is driven by the thermal particles surpasses 1 MA ($f_{\text{boot}}$ = 63%). Some ERS discharges in TFTR achieved $f_{\text{boot}}$ greater than 100% transiently. + + +!!! note "Change of profile index definition" + + Hoang et.al uses a different definition for the profile indexes such that + $\alpha_{\text{p}}$ is defined as the ratio of the central and the volume-averaged values, and the peakedness of the density of the total plasma current (defined as ratio of the central value and $I_{\text{p}}$), $\alpha_{\text{J}}$ + + Assuming that the pressure and current profile is parabolic we can represent these ratios as $\frac{p_0}{\langle p \rangle}= \alpha_{\text{p}}+1$ + + **This could lead to large changes in the value depending on interpretation of the profile index** + $$ -C_{\text{BS}} = \sqrt{\frac{\alpha_{\text{p}}}{\alpha_{\text{j}}}} +C_{\text{BS}} = \sqrt{\frac{\alpha_{\text{p}}+1}{\alpha_{\text{j}}+1}} $$ $$ diff --git a/process/physics.py b/process/physics.py index d88505a8c2..92522029e7 100644 --- a/process/physics.py +++ b/process/physics.py @@ -5816,6 +5816,12 @@ def bootstrap_fraction_hoang( float: The calculated bootstrap fraction. Notes: + - Based off of TFTR data calculated using the TRANSP plasma analysis code + - 170 discharges which was assembled to study the tritium influx and transport in discharges with D-only neutral beam + injection (NBI) + - Contains L-mode, supershots, reversed shear, enhanced reversed shear and increased li discharges + - Discharges with monotonic flux profiles with reversed shear are also included + - Is applied to circular cross-section plasmas References: - G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, @@ -5823,9 +5829,16 @@ def bootstrap_fraction_hoang( """ # Using the standard variable naming from the Hoang et.al. paper - # These terms do not equal the profile indexes, though are closely linked + # Hoang et.al uses a different definition for the profile indexes such that + # alpha_p is defined as the ratio of the central and the volume-averaged values, and the peakedness of the density of the total plasma current + # (defined as ratio of the central value and I_p), alpha_j$ - c_bs = np.sqrt(pressure_index / current_index) + # We assume the pressure and current profile is parabolic and use the (profile_index +1) term in lieu + # The term represent the ratio of the the core to volume averaged value + + # This could lead to large changes in the value depending on interpretation of the profile index + + c_bs = np.sqrt(pressure_index + 1 / current_index + 1) return 0.4 * np.sqrt(inverse_aspect) * betap**0.9 * c_bs diff --git a/process/plasma_profiles.py b/process/plasma_profiles.py index 6f5c3d2fba..64a8bb098f 100644 --- a/process/plasma_profiles.py +++ b/process/plasma_profiles.py @@ -264,7 +264,7 @@ def calculate_profile_factors(self) -> None: physics_variables.alphap = physics_variables.alphan + physics_variables.alphat - # Shall assume that the pressure profile is parabolic. Can this find volume average from + # Shall assume that the pressure profile is parabolic. Can find volume average from # profile index and core value the same as for density and temperature physics_variables.vol_avg_pressure = physics_variables.p0 / ( physics_variables.alphap + 1 diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index 4d71671d5f..bb419f5481 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -676,7 +676,7 @@ class BootstrapFractionHoangParam(NamedTuple): pressure_index=2.4500000000000002e00, current_index=2.8314361644755763e00, inverse_aspect=1 / 3, - expected_bfs=2.6654814984459324e-01, + expected_bfs=0.5588166329771835, ), ), ) From 92f5ce860536ced27b0393c86553747c6c9f8415 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Wed, 6 Nov 2024 16:49:40 +0000 Subject: [PATCH 13/26] Add full documentation for the wong bootstrap scaling --- .../plasma_current/bootstrap_current.md | 26 +++++++++++++++++-- process/physics.py | 9 +++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index d5f81683b5..245c4d5759 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -573,10 +573,31 @@ $$ Is selected by setting `i_bootstrap_current = 9`[^11] +This scaling data is based off of equilibria from Miller et.al.[^12]. +The equilibria from Miller et.al. are in the range of $A$ = 1.2 - 3 that are stable to infinite $n$ ballooning and low $n$ kink modes at a bootstrap fraction of 99% for $\kappa$ = 2, 2.5, 3.0. The results were parameterized as a function of aspect ratio and elongation. + +The parametric dependency of $\beta_{\text{p}}$ and $\beta_{\text{T}}$ are based on fitting of the DIII-D high equivalent DT yield results. + +$$ +\beta_{\text{N}}=\frac{\left(3.09+\frac{3.35}{A}+\frac{3.87}{A^{0.5}}\right)\left(\frac{\kappa}{3}\right)^{0.5}}{f_{\text{peak}}^{0.5}} +$$ + +$$ +\beta_{\text{T}}=\frac{25}{\beta_p}\left(\frac{1+\kappa^2}{2}\right)\left(\frac{\beta_N}{100}\right)^2 +$$ + +Here $\beta_{\text{p}}$ is given by + +$$ +\beta_p=f_{b s} \frac{\sqrt{A}}{C_{b s} f_{\text{peak}}^{0.25}} +$$ + $$ C_{\text{BS}} = 0.773+0.019\kappa $$ +Parabolic profiles should be used for best results as the pressure peaking value is calculated as the product of a parabolic temperature and density profile. + $$ f_{\text{peak}} = \left(\int_0^1 \left(1-\rho^2 \right)^{\alpha_{\text{T}}} \left(1-\rho^2 \right)^{\alpha_{\text{n}}} \ \ \mathrm{d\rho}\right)^{-1} $$ @@ -597,7 +618,7 @@ $$ ### Gi Scaling | `bootstrap_fraction_gi()` -Is selected by setting `i_bootstrap_current = 10`[^12] +Is selected by setting `i_bootstrap_current = 10`[^13] $$ C_{\text{BS}} = 0.474 \epsilon^{-0.1} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} \left(\frac{q_{95}}{q_0}\right)^{-0.133} @@ -642,4 +663,5 @@ Fusion Engineering and Design, Volume 89, Issue 11, 2014, Pages 2709-2715, ISSN [^9]: M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” Plasma Physics and Controlled Fusion, vol. 50, no. 6, pp. 065001–065001, Apr. 2008, doi: https://doi.org/10.1088/0741-3335/50/6/065001. [^10]: G. T. Hoang and R. V. Budny, “The bootstrap fraction in TFTR,” AIP conference proceedings, Jan. 1997, doi: https://doi.org/10.1063/1.53414. [^11]: C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. -[^12]: K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. \ No newline at end of file +[^12]: Miller, R L, "Stable bootstrap-current driven equilibria for low aspect ratio tokamaks". Switzerland: N. p., 1996. Web.https://fusion.gat.com/pubs-ext/MISCONF96/A22433.pdf +[^13]: K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. \ No newline at end of file diff --git a/process/physics.py b/process/physics.py index 92522029e7..0998a170db 100644 --- a/process/physics.py +++ b/process/physics.py @@ -5864,10 +5864,19 @@ def bootstrap_fraction_wong( float: The calculated bootstrap fraction. Notes: + - Data is based off of equilibria from Miller et al. + - A: 1.2 - 3.0 and stable to n ballooning and low n kink modes at a bootstrap fraction of 99% for kappa = 2, 2.5 and 3 + - The results were parameterized as a function of aspect ratio and elongation + - The parametric dependency of beta_p and beta_T are based on fitting of the DIII-D high equivalent DT yield results + - Parabolic profiles should be used for best results as the pressure peaking value is calculated as the product of a parabolic + temperature and density profile References: - C.-P. Wong, J. C. Wesley, R. D. Stambaugh, and E. T. Cheng, “Toroidal reactor designs as a function of aspect ratio and elongation,” vol. 42, no. 5, pp. 547–556, May 2002, doi: https://doi.org/10.1088/0029-5515/42/5/307. + + - Miller, R L, "Stable bootstrap-current driven equilibria for low aspect ratio tokamaks". + Switzerland: N. p., 1996. Web.https://fusion.gat.com/pubs-ext/MISCONF96/A22433.pdf """ # Using the standard variable naming from the Wong et.al. paper f_peak = 2.0 / scipy.special.beta(0.5, density_index + temperature_index + 1) From 07cf1e84032009a6c74f551382ce5da63b3462e8 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 7 Nov 2024 09:41:24 +0000 Subject: [PATCH 14/26] Add all docs about the Gi models --- .../plasma_current/bootstrap_current.md | 51 ++++++++- process/io/plot_proc.py | 15 +-- process/physics.py | 102 ++++++++++++++++-- source/fortran/current_drive_variables.f90 | 14 ++- source/fortran/input.f90 | 2 +- source/fortran/physics_variables.f90 | 3 +- tests/integration/ref_dicts.json | 21 ++++ tests/unit/test_physics.py | 74 ++++++++++--- 8 files changed, 248 insertions(+), 34 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 245c4d5759..2ede92c24c 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -616,9 +616,42 @@ $$ --------------------- -### Gi Scaling | `bootstrap_fraction_gi()` +### Gi Scaling's -Is selected by setting `i_bootstrap_current = 10`[^13] +This scaling is found by solving the Hirshman-Sigmar bootstrap current model using the matrix inversion method to create bootstrap current scalings with variables given explicitly in the TPC systems code[^13]. +A 8800 point database for the bootstrap current fraction using the bootstrap current density calculation module in the ACCOME code is used, using the variable ranges in the table below: + +The fitting of the variable exponents is done using the least squares method with a $R^2$ value of > 0.98 for [scaling one](#scaling-1--bootstrap_fraction_gi_i) and > 0.96 for [scaling two](#scaling-2--bootstrap_fraction_gi_ii) compared to the ACCOME data. + + +| Parameter | Range | Points | +|----------------------------|----------------|--------| +| Major radius $R$ | 5.0 | 1 | +| Aspect ratio $A$ | 1.3, 1.5, 1.7, 2.0, 2.2, 2.5, 3.0, 3.5, 4.0, 5.0 | 10 | +| Elongation $\kappa$ | $\sim$ 2 | 1 | +| Triangularity $\delta$ | $\sim$ 0.3 | 1 | +| Density profile index $a_{\text{n}}$ | 0.1-0.8 | 8 | +| Temperature profile index $a_{\text{T}}$ | 1.0-3.0 | 11 | +| Effective charge $Z_{\text{eff}}$ | 1.2-3.0 | 10 | + +The plasma parameters for each point in the aspect ratio scan can be seen in the table below: + +| Aspect ratio A | 1.3 | 1.5 | 1.7 | 2.0 | 2.2 | 2.5 | 3.0 | 3.5 | 4.0 | 5.0 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| Electron density at axis, $n_{\text{e0}}\left[10^{20} \mathrm{~m}^{-3}\right]$ | 1.0 | 1.0 | 1.5 | 1.5 | 1.5 | 2.0 | 2.0 | 2.0 | 2.0 | 1.0 | +| Electron temperature at axis, $T_{\text{e0}}[\mathrm{keV}]$ | 40 | 20 | 30 | 30 | 30 | 40 | 20 | 40 | 20 | 30 | +| Plasma current, $I_p$ $[\mathrm{MA}]$ | 20 | 15 | 20 | 15 | 15 | 15 | 10 | 15 | 10 | 5 | +| Toroidal magnetic field at axis, $B_{\text{T}}$ $[\mathrm{T}]$ | 3.0 | 2.0 | 3.0 | 2.0 | 4.0 | 2.0 | 2.0 | 6.0 | 2.0 | 5.0 | +| Poloidal beta, $\beta_{\text{p}}$ | 0.9-2.6 | 0.6-1.8 | 0.6-1.8 | 0.8-1.9 | 0.7-2.0 | 0.9-2.7 | 0.7-2.2 | 0.5-1.4 | 0.4-1.2 | 0.8-2.3 | + + + +#### Scaling 1 | `bootstrap_fraction_gi_I()` + +Is selected by setting `i_bootstrap_current = 10` + +Scaling 1 has better accuracy than Scaling 2. However, Scaling 1 overestimated the $f_{\text{BS}}$ +value for reversed shear equilibrium. Although Scaling 2 does not have internal current profile term, it can predict the $f_{\text{BS}}$ values to a certain extent for the high-$f_{\text{BS}}$ equilibria which are expected for next fusion devices. $$ C_{\text{BS}} = 0.474 \epsilon^{-0.1} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} \left(\frac{q_{95}}{q_0}\right)^{-0.133} @@ -628,6 +661,20 @@ $$ f_{\text{BS}} = C_{\text{BS}} \beta_{\text{p}}\sqrt{\epsilon} $$ +#### Scaling 2 | `bootstrap_fraction_gi_II()` + +Is selected by setting `i_bootstrap_current = 11` + +This scaling has the $q$ profile dependance removed to obtain a scaling formula with much more flexible variables than that by a single profile factor for internal current profile. + +$$ +C_{\text{BS}} = 0.382 \epsilon^{-0.242} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} +$$ + +$$ +f_{\text{BS}} = C_{\text{BS}} \beta_{\text{p}}\sqrt{\epsilon} +$$ + --------------------- ## Setting of maximum desirable bootstrap current fraction diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 6f82bf4a00..12836eea13 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2916,7 +2916,8 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_andrade = mfile_data.data["bscf_andrade"].get_scan(scan) boot_hoang = mfile_data.data["bscf_hoang"].get_scan(scan) boot_wong = mfile_data.data["bscf_wong"].get_scan(scan) - boot_gi = mfile_data.data["bscf_gi"].get_scan(scan) + boot_gi_I = mfile_data.data["bscf_gi_i"].get_scan(scan) + boot_gi_II = mfile_data.data["bscf_gi_ii"].get_scan(scan) # Data for the box plot data = [ @@ -2929,7 +2930,8 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_andrade, boot_hoang, boot_wong, - boot_gi, + boot_gi_I, + boot_gi_II, ] labels = [ "IPDG", @@ -2941,7 +2943,8 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): "Andrade", "Hoang", "Wong", - "Gi", + "Gi-I", + "Gi-II", ] x = np.ones(len(data)) @@ -2965,17 +2968,17 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): # Plot average, standard deviation, and median as text axis.text( - 0.6, 0.9, f"Average: {avg_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 + 0.65, 0.9, f"Average: {avg_bootstrap:.4f}", transform=axis.transAxes, fontsize=9 ) axis.text( - 0.6, + 0.65, 0.85, f"Standard Dev: {std_bootstrap:.4f}", transform=axis.transAxes, fontsize=9, ) axis.text( - 0.6, + 0.65, 0.8, f"Median: {median_bootstrap:.4f}", transform=axis.transAxes, diff --git a/process/physics.py b/process/physics.py index 0998a170db..6a29787c14 100644 --- a/process/physics.py +++ b/process/physics.py @@ -1758,9 +1758,9 @@ def physics(self): elongation=physics_variables.kappa, ) ) - current_drive_variables.bscf_gi = ( + current_drive_variables.bscf_gi_I = ( current_drive_variables.cboot - * self.bootstrap_fraction_gi( + * self.bootstrap_fraction_gi_I( betap=physics_variables.betap, pressure_index=physics_variables.alphap, temperature_index=physics_variables.alphat, @@ -1771,6 +1771,17 @@ def physics(self): ) ) + current_drive_variables.bscf_gi_II = ( + current_drive_variables.cboot + * self.bootstrap_fraction_gi_II( + betap=physics_variables.betap, + pressure_index=physics_variables.alphap, + temperature_index=physics_variables.alphat, + inverse_aspect=physics_variables.eps, + effective_charge=physics_variables.zeff, + ) + ) + if current_drive_variables.bootstrap_current_fraction_max < 0.0e0: current_drive_variables.bootstrap_current_fraction = abs( current_drive_variables.bootstrap_current_fraction_max @@ -1819,7 +1830,11 @@ def physics(self): ) elif physics_variables.i_bootstrap_current == 10: current_drive_variables.bootstrap_current_fraction = ( - current_drive_variables.bscf_gi + current_drive_variables.bscf_gi_I + ) + elif physics_variables.i_bootstrap_current == 11: + current_drive_variables.bootstrap_current_fraction = ( + current_drive_variables.bscf_gi_II ) else: error_handling.idiags[0] = physics_variables.i_bootstrap_current @@ -4967,9 +4982,16 @@ def outplas(self): ) po.ovarrf( self.outfile, - "Bootstrap fraction (Gi)", - "(bscf_gi)", - current_drive_variables.bscf_gi, + "Bootstrap fraction (Gi I)", + "(bscf_gi_I)", + current_drive_variables.bscf_gi_I, + "OP ", + ) + po.ovarrf( + self.outfile, + "Bootstrap fraction (Gi II)", + "(bscf_gi_II)", + current_drive_variables.bscf_gi_II, "OP ", ) @@ -5052,7 +5074,12 @@ def outplas(self): elif physics_variables.i_bootstrap_current == 10: po.ocmmnt( self.outfile, - " (Gi et al bootstrap current fraction model used)", + " (Gi-I et al bootstrap current fraction model used)", + ) + elif physics_variables.i_bootstrap_current == 11: + po.ocmmnt( + self.outfile, + " (Gi-II et al bootstrap current fraction model used)", ) if physics_variables.i_diamagnetic_current == 0: @@ -5886,7 +5913,7 @@ def bootstrap_fraction_wong( return c_bs * f_peak**0.25 * betap * np.sqrt(inverse_aspect) @staticmethod - def bootstrap_fraction_gi( + def bootstrap_fraction_gi_I( betap: float, pressure_index: float, temperature_index: float, @@ -5896,7 +5923,7 @@ def bootstrap_fraction_gi( q0: float, ) -> float: """ - Calculate the bootstrap fraction using the Gi et al formula. + Calculate the bootstrap fraction using the first scaling from the Gi et al formula. Parameters: betap (float): Plasma poloidal beta. @@ -5911,6 +5938,14 @@ def bootstrap_fraction_gi( float: The calculated bootstrap fraction. Notes: + - Scaling found by solving the Hirshman-Sigmar bootstrap modelusing the matrix inversion method + - Method was done to put the scaling into parameters compatible with the TPC systems code + - Uses the ACCOME code to create bootstrap current fractions without using the itrative calculations of the + curent drive and equilibrium models in the scan + - R = 5.0 m, A = 1.3 - 5.0, kappa = 2, traing = 0.3, alpha_n = 0.1 - 0.8, alpha_t = 1.0 - 3.0, Z_eff = 1.2 - 3.0 + - Uses parabolic plasma profiles only. + - Scaling 1 has better accuracy than Scaling 2. However, Scaling 1 overestimated the f_BS value for reversed shear + equilibrium. References: - K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” @@ -5931,6 +5966,55 @@ def bootstrap_fraction_gi( return c_bs * np.sqrt(inverse_aspect) * betap + @staticmethod + def bootstrap_fraction_gi_II( + betap: float, + pressure_index: float, + temperature_index: float, + inverse_aspect: float, + effective_charge: float, + ) -> float: + """ + Calculate the bootstrap fraction using the second scaling from the Gi et al formula. + + Parameters: + betap (float): Plasma poloidal beta. + pressure_index (float): Pressure profile index. + temperature_index (float): Temperature profile index. + inverse_aspect (float): Inverse aspect ratio. + effective_charge (float): Plasma effective charge. + + Returns: + float: The calculated bootstrap fraction. + + Notes: + - Scaling found by solving the Hirshman-Sigmar bootstrap modelusing the matrix inversion method + - Method was done to put the scaling into parameters compatible with the TPC systems code + - Uses the ACCOME code to create bootstrap current fractions without using the itrative calculations of the + curent drive and equilibrium models in the scan + - R = 5.0 m, A = 1.3 - 5.0, kappa = 2, traing = 0.3, alpha_n = 0.1 - 0.8, alpha_t = 1.0 - 3.0, Z_eff = 1.2 - 3.0 + - Uses parabolic plasma profiles only. + - This scaling has the q profile dependance removed to obtain a scaling formula with much more flexible variables than + that by a single profile factor for internal current profile. + + References: + - K. Gi, M. Nakamura, Kenji Tobita, and Y. Ono, “Bootstrap current fraction scaling for a tokamak reactor design study,” + Fusion Engineering and Design, vol. 89, no. 11, pp. 2709–2715, Aug. 2014, + doi: https://doi.org/10.1016/j.fusengdes.2014.07.009. + """ + + # Using the standard variable naming from the Gi et.al. paper + + c_bs = ( + 0.382 + * inverse_aspect**-0.242 + * pressure_index**0.974 + * temperature_index**-0.416 + * effective_charge**0.178 + ) + + return c_bs * np.sqrt(inverse_aspect) * betap + def fhfac(self, is_): """Function to find H-factor for power balance author: P J Knight, CCFE, Culham Science Centre diff --git a/source/fortran/current_drive_variables.f90 b/source/fortran/current_drive_variables.f90 index 683bc4b7a2..1e50aaead3 100644 --- a/source/fortran/current_drive_variables.f90 +++ b/source/fortran/current_drive_variables.f90 @@ -57,8 +57,11 @@ module current_drive_variables real(dp) :: bscf_wong !! Bootstrap current fraction, Wong et al model - real(dp) :: bscf_gi - !! Bootstrap current fraction, Gi et al model + real(dp) :: bscf_gi_I + !! Bootstrap current fraction, first Gi et al model + + real(dp) :: bscf_gi_II + !! Bootstrap current fraction, second Gi et al model real(dp) :: cboot !! bootstrap current fraction multiplier @@ -258,6 +261,13 @@ subroutine init_current_drive_variables bscf_nevins = 0.0D0 bscf_sauter = 0.0D0 bscf_wilson = 0.0D0 + bscf_sakai = 0.0D0 + bscf_aries = 0.0D0 + bscf_andrade = 0.0D0 + bscf_hoang = 0.0D0 + bscf_wong = 0.0D0 + bscf_gi_I = 0.0D0 + bscf_gi_II = 0.0D0 cboot = 1.0D0 cnbeam = 0.0D0 diacf_hender = 0.0D0 diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index 40d2dc9c3c..e179aae553 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -621,7 +621,7 @@ subroutine parse_input_file(in_file,out_file,show_changes) call parse_real_variable('taumax', taumax, 0.1D0, 100.0D0, & 'Maximum allowed energy confinement time (s)') case ('i_bootstrap_current') - call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 10, & + call parse_int_variable('i_bootstrap_current', i_bootstrap_current, 1, 11, & 'Switch for bootstrap scaling') case ('iculbl') call parse_int_variable('iculbl', iculbl, 0, 3, & diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index 41d4a8334a..f45f6fc6df 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -254,7 +254,8 @@ module physics_variables !! - =7 for Andrade et al scaling !! - =8 for Hoang et al scaling !! - =9 for Wong et al scaling - !! - =10 for Gi et al scaling + !! - =10 for Gi-I et al scaling + !! - =10 for Gi-II et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) diff --git a/tests/integration/ref_dicts.json b/tests/integration/ref_dicts.json index ffa54347a2..58b67624bb 100644 --- a/tests/integration/ref_dicts.json +++ b/tests/integration/ref_dicts.json @@ -1162,6 +1162,13 @@ "bscf_nevins": 0.0, "bscf_sauter": 0.0, "bscf_wilson": 0.0, + "bscf_sakai": 0.0, + "bscf_aries": 0.0, + "bscf_andrade": 0.0, + "bscf_hoang": 0.0, + "bscf_wong": 0.0, + "bscf_gi_I": 0.0, + "bscf_gi_II": 0.0, "bootstrap_current_fraction_max": 0.9, "bt": 5.68, "btot": 0.0, @@ -8941,6 +8948,13 @@ "bscf_nevins": "bootstrap current fraction, Nevins et al model", "bscf_sauter": "bootstrap current fraction, Sauter et al model", "bscf_wilson": "bootstrap current fraction, Wilson et al model", + "bscf_sakai": "bootstrap current fraction, Sakai model", + "bscf_aries": "bootstrap current fraction, ARIES model", + "bscf_andrade": "bootstrap current fraction, Andrade model", + "bscf_hoang": "bootstrap current fraction, Hoang model", + "bscf_wong": "bootstrap current fraction, Wong model", + "bscf_gi_I": "bootstrap current fraction, GI model I", + "bscf_gi_II": "bootstrap current fraction, GI model II", "bootstrap_current_fraction_max": "maximum fraction of plasma current from bootstrap; if `bootstrap_current_fraction_max < 0`,\n bootstrap fraction = abs(bootstrap_current_fraction_max)", "bt": "toroidal field on axis (T) (`iteration variable 2`)", "btot": "total toroidal + poloidal field (T)", @@ -17762,6 +17776,13 @@ "bscf_nevins", "bscf_sauter", "bscf_wilson", + "bscf_sakai", + "bscf_aries", + "bscf_andrade", + "bscf_hoang", + "bscf_wong", + "bscf_gi_I", + "bscf_gi_II", "cboot", "cnbeam", "diacf_hender", diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index bb419f5481..c1325c807e 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -748,7 +748,7 @@ def test_bootstrap_fraction_wong(bootstrapfractionwongparam, physics): assert bfs == pytest.approx(bootstrapfractionwongparam.expected_bfs) -class BootstrapFractionGiParam(NamedTuple): +class BootstrapFractionGiIParam(NamedTuple): betap: Any = None pressure_index: Any = None @@ -767,9 +767,9 @@ class BootstrapFractionGiParam(NamedTuple): @pytest.mark.parametrize( - "bootstrapfractiongiparam", + "bootstrapfractiongiiparam", ( - BootstrapFractionGiParam( + BootstrapFractionGiIParam( betap=1.2708883332338736, pressure_index=2.4500000000000002e00, temperature_index=1.4500000000000000e00, @@ -781,7 +781,7 @@ class BootstrapFractionGiParam(NamedTuple): ), ), ) -def test_bootstrap_fraction_gi(bootstrapfractiongiparam, physics): +def test_bootstrap_fraction_gi_I(bootstrapfractiongiiparam, physics): """ Automatically generated Regression Unit Test for bootstrap_fraction_gi. @@ -791,17 +791,65 @@ def test_bootstrap_fraction_gi(bootstrapfractiongiparam, physics): :type bootstrapfractionsauterparam: bootstrapfractionsauterparam """ - bfs = physics.bootstrap_fraction_gi( - betap=bootstrapfractiongiparam.betap, - pressure_index=bootstrapfractiongiparam.pressure_index, - temperature_index=bootstrapfractiongiparam.temperature_index, - inverse_aspect=bootstrapfractiongiparam.inverse_aspect, - effective_charge=bootstrapfractiongiparam.effective_charge, - q95=bootstrapfractiongiparam.q95, - q0=bootstrapfractiongiparam.q0, + bfs = physics.bootstrap_fraction_gi_I( + betap=bootstrapfractiongiiparam.betap, + pressure_index=bootstrapfractiongiiparam.pressure_index, + temperature_index=bootstrapfractiongiiparam.temperature_index, + inverse_aspect=bootstrapfractiongiiparam.inverse_aspect, + effective_charge=bootstrapfractiongiiparam.effective_charge, + q95=bootstrapfractiongiiparam.q95, + q0=bootstrapfractiongiiparam.q0, ) - assert bfs == pytest.approx(bootstrapfractiongiparam.expected_bfs) + assert bfs == pytest.approx(bootstrapfractiongiiparam.expected_bfs) + + +class BootstrapFractionGiIIParam(NamedTuple): + betap: Any = None + + pressure_index: Any = None + + temperature_index: Any = None + + inverse_aspect: Any = None + + effective_charge: Any = None + + expected_bfs: Any = None + + +@pytest.mark.parametrize( + "bootstrapfractiongiiiparam", + ( + BootstrapFractionGiIIParam( + betap=1.2708883332338736, + pressure_index=2.4500000000000002e00, + temperature_index=1.4500000000000000e00, + inverse_aspect=1 / 3, + effective_charge=2.5368733516769737e00, + expected_bfs=8.8502865710180589e-01, + ), + ), +) +def test_bootstrap_fraction_gi_II(bootstrapfractiongiiiparam, physics): + """ + Automatically generated Regression Unit Test for bootstrap_fraction_gi. + + This test was generated using data from tests/regression/input_files/large_tokamak.IN.DAT. + + :param bootstrapfractionsauterparam: the data used to mock and assert in this test. + :type bootstrapfractionsauterparam: bootstrapfractionsauterparam + """ + + bfs = physics.bootstrap_fraction_gi_II( + betap=bootstrapfractiongiiiparam.betap, + pressure_index=bootstrapfractiongiiiparam.pressure_index, + temperature_index=bootstrapfractiongiiiparam.temperature_index, + inverse_aspect=bootstrapfractiongiiiparam.inverse_aspect, + effective_charge=bootstrapfractiongiiiparam.effective_charge, + ) + + assert bfs == pytest.approx(bootstrapfractiongiiiparam.expected_bfs) class PlasmaCurrentParam(NamedTuple): From 6eee4fa5cf0771e43426f2a3af205f2c9ff3325f Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 7 Nov 2024 11:11:34 +0000 Subject: [PATCH 15/26] Update documentation for bootstrap current models and enhance PDF summary utility --- .../proc-pages/images/plot_proc_3.PNG | Bin 81320 -> 42232 bytes .../proc-pages/images/plot_proc_4.PNG | Bin 0 -> 26889 bytes documentation/proc-pages/io/utilities.md | 2 +- .../plasma_current/bootstrap_current.md | 41 +++++++++++++----- documentation/proc-pages/usage/plotting.md | 5 +++ process/physics.py | 5 ++- source/fortran/physics_variables.f90 | 2 +- 7 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 documentation/proc-pages/images/plot_proc_4.PNG diff --git a/documentation/proc-pages/images/plot_proc_3.PNG b/documentation/proc-pages/images/plot_proc_3.PNG index e026084ca25b987b9236424d0f83e69782b18df8..d50faea82f52a0f8c79fdd34eb37e8343b67120e 100644 GIT binary patch literal 42232 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 APyhe` literal 81320 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 diff --git a/documentation/proc-pages/images/plot_proc_4.PNG b/documentation/proc-pages/images/plot_proc_4.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0504ef94d7170d2fc336202ee6ba0086b2c63dd3 GIT binary patch literal 26889 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 ` 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 `process/io/plot_proc.py` -A utility to produce a three-page PDF summary of the output from PROCESS, including the major parameters, poloidal and toroidal cross-sections, temperature and density profiles and TF coil layout and turn strucuture. +A utility to produce a four-page PDF summary of the output from PROCESS, including the major parameters, poloidal and toroidal cross-sections, temperature and density profiles and TF coil layout and turn strucuture. ### Usage diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 2ede92c24c..b499a84fa1 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -495,23 +495,42 @@ $$ --------------------- -### Andrade Scaling | `bootstrap_fraction_andrade()` +### Andrade Scaling Is selected by setting `i_bootstrap_current = 7`[^9] -Based off plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak. +Based off of 350 plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak. +Profiles were taken to be Gaussian shaped functions. -| Parameter | Value || Parameter | Value | -|-----------------------|-----------||-----------------------|-----------| -| $A$ | 1.5 || $\alpha_{\text{T_e}}$ | 0.02 | -| $R_0$ | 0.3 $\text{[m]}$ || $\alpha_{\text{T_i}}$ | 2 | -| $p(0)$ | 15 $\text{[kPa]}$ || $\kappa(a)$ | 2 | -| $T_{\text{e,i}}(0)$ | 1 $\text{[keV]}$ || $\delta$ | 0.3 | -| $T_{\text{e,i}}(a)$ | 0.1 $\text{[keV]}$ || $I_{\text{p}}$ | 200 $\text{[kA]}$ | -| $\alpha_{\text{p}}$ | 3 || $B_0$ | 0.4 $\text{[T]}$ | -| $\beta$ | 4-10% || $Z_{\text{eff}}$ | 1 | +The range of parameters from the discharges in ETE can be found in the table below: +| Parameter | Value | Parameter | Value | +|-----------------------|-----------|-----------------------|-----------| +| $A$ | 1.5 | $\alpha_{\text{T}_\text{e}}$ | 0.02 | +| $R_0$ | 0.3 $\text{[m]}$ | $\alpha_{\text{T}_\text{i}}$ | 2 | +| $p(0)$ | 15 $\text{[kPa]}$ | $\kappa(a)$ | 2 | +| $T_{\text{e,i}}(0)$ | 1 $\text{[keV]}$ | $\delta$ | 0.3 | +| $T_{\text{e,i}}(a)$ | 0.1 $\text{[keV]}$ | $I_{\text{p}}$ | 200 $\text{[kA]}$ | +| $\alpha_{\text{p}}$ | 3 | $B_0$ | 0.4 $\text{[T]}$ | +| $\beta$ | 4-10% | $Z_{\text{eff}}$ | 1 | +Errors mostly up to the order of 10% are obtained when both expressions are compared with the equilibrium estimates for the bootstrap current in ETE. + +#### Scaling 1 + +!!! note "Applicability of 1st scaling" + + Andrade et.al[^9] actually presents two scalings, the first is: + + $$ + \frac{I_{\text{BS}}}{I_\text{p}}5C_{\text{bs}}c_{\text{p}}^{\lambda}\frac{\beta_{\text{N}}q_{\text{cyl}}}{\epsilon^{1/2}l_i^{\gamma}}\frac{R_0}{R_{\text{m}}} + $$ + + $R_{\text{m}}$ in this case is the major radius of the magnetic axis which `PROCESS` does not have as it does not currently calculate the [Shafranov shift](https://wiki.fusion.ciemat.es/wiki/Shafranov_shift). If this is implemented then the first Andrade scaling can be properly implemented. + +#### Scaling 2 | `bootstrap_fraction_andrade()` + +This form of the Andrade scaling in terms of $\beta_{\text{p}}$ found using a least-square fit to 347 of the equilibria points. $$ C_{\text{BS}} = 0.2340 \pm 0.0007 diff --git a/documentation/proc-pages/usage/plotting.md b/documentation/proc-pages/usage/plotting.md index 79074c509f..703ff7ae7e 100644 --- a/documentation/proc-pages/usage/plotting.md +++ b/documentation/proc-pages/usage/plotting.md @@ -29,6 +29,11 @@ process -i path/to/IN.DAT --plot --mfile path/to/MFILE.DAT

Figure 3: plot_proc TF coil and turn structure page
+
+![plot_proc_4](../images/plot_proc_4.PNG){ width="100%"} +
Figure 4: plot_proc bootstrap current model comparison page
+
+

Scan files

`plot_scans` is a tool to show the change in variables as a scan variable is varied. diff --git a/process/physics.py b/process/physics.py index 6a29787c14..2c9a490bae 100644 --- a/process/physics.py +++ b/process/physics.py @@ -5804,9 +5804,10 @@ def bootstrap_fraction_andrade( float: The calculated bootstrap fraction. Notes: - - Based off plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak + - Based off 350 plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak - A = 1.5, R_0 = 0.3m, I_p = 200kA, B_0=0.4T, beta = 4-10%. Profiles taken as Gaussian shaped functions. - + - Errors mostly up to the order of 10% are obtained when both expressions are compared with the equilibrium estimates for the + bootstrap current in ETE References: - M. C. R. Andrade and G. O. Ludwig, “Scaling of bootstrap current on equilibrium and plasma profile parameters in tokamak plasmas,” diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index f45f6fc6df..efde08a954 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -255,7 +255,7 @@ module physics_variables !! - =8 for Hoang et al scaling !! - =9 for Wong et al scaling !! - =10 for Gi-I et al scaling - !! - =10 for Gi-II et al scaling + !! - =11 for Gi-II et al scaling integer :: iculbl !! switch for beta limit scaling (`constraint equation 24`) From 2362cf7c4b3e09aa77390701d6917e3e36d6e772 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Thu, 7 Nov 2024 11:15:39 +0000 Subject: [PATCH 16/26] Update bootstrap current documentation to reflect eleven calculation methods --- .../physics-models/plasma_current/bootstrap_current.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index b499a84fa1..041d1b17f9 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -6,10 +6,8 @@ Some more info can be found [here](https://wiki.fusion.ciemat.es/wiki/Bootstrap_ ## Selection The fraction of the plasma current provided by the bootstrap effect -can be either input into the code directly, or calculated using one of five -methods, as summarised here. Note that methods `i_bootstrap_current = 1-3 & 5-6` do not take into account the -existence of pedestals, whereas the Sauter et al. scaling -(`i_bootstrap_current = 4`) allows general profiles to be used. +can be either input into the code directly, or calculated using one of eleven +methods, as summarized below: -------------- From cc6698e9cdeee32971b4b2480b5c4dd04d3e37cc Mon Sep 17 00:00:00 2001 From: Christopher Ashe <91618944+chris-ashe@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:24:41 +0000 Subject: [PATCH 17/26] Update documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md Co-authored-by: Jonathan Matthews <115085094+kj5248@users.noreply.github.com> --- .../physics-models/plasma_current/bootstrap_current.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 041d1b17f9..90974ca017 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -560,7 +560,7 @@ The plasma parameters of the discharges can be seen in the table below: | $B_{\text{T}}$ | 1.9 - 5.7 $\text{[T]}$ | | $n_{\text{e,0}}$ | 0.2 - 1.2 $[10^{20} \text{m}^{-3}]$ | -I wide variety of discharge regimes are included, such as: L-mode supershots, discharges +A wide variety of discharge regimes are included, such as: L-mode supershots, discharges with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. Discharges with both monotonic $q$ profiles and with reversed shear are included in the dataset. From dd705df2f99c02a2e27ae3b911b37f2f6561a571 Mon Sep 17 00:00:00 2001 From: Christopher Ashe <91618944+chris-ashe@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:25:18 +0000 Subject: [PATCH 18/26] Update documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md Co-authored-by: Jonathan Matthews <115085094+kj5248@users.noreply.github.com> --- .../physics-models/plasma_current/bootstrap_current.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 90974ca017..91df7028f5 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -668,7 +668,7 @@ The plasma parameters for each point in the aspect ratio scan can be seen in the Is selected by setting `i_bootstrap_current = 10` Scaling 1 has better accuracy than Scaling 2. However, Scaling 1 overestimated the $f_{\text{BS}}$ -value for reversed shear equilibrium. Although Scaling 2 does not have internal current profile term, it can predict the $f_{\text{BS}}$ values to a certain extent for the high-$f_{\text{BS}}$ equilibria which are expected for next fusion devices. +value for reversed shear equilibrium. Although Scaling 2 does not have an internal current profile term, it can predict the $f_{\text{BS}}$ values to a certain extent for the high-$f_{\text{BS}}$ equilibria which are expected for next fusion devices. $$ C_{\text{BS}} = 0.474 \epsilon^{-0.1} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} \left(\frac{q_{95}}{q_0}\right)^{-0.133} From 841862525fd5a3ef9178bdd4bc8fa18b77326653 Mon Sep 17 00:00:00 2001 From: Christopher Ashe <91618944+chris-ashe@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:26:18 +0000 Subject: [PATCH 19/26] Update documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md Co-authored-by: Jonathan Matthews <115085094+kj5248@users.noreply.github.com> --- .../physics-models/plasma_current/bootstrap_current.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 91df7028f5..b5691111dd 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -593,7 +593,7 @@ Is selected by setting `i_bootstrap_current = 9`[^11] This scaling data is based off of equilibria from Miller et.al.[^12]. The equilibria from Miller et.al. are in the range of $A$ = 1.2 - 3 that are stable to infinite $n$ ballooning and low $n$ kink modes at a bootstrap fraction of 99% for $\kappa$ = 2, 2.5, 3.0. The results were parameterized as a function of aspect ratio and elongation. -The parametric dependency of $\beta_{\text{p}}$ and $\beta_{\text{T}}$ are based on fitting of the DIII-D high equivalent DT yield results. +The parametric dependency of $\beta_{\text{p}}$ and $\beta_{\text{T}}$ are based on the fitting of the DIII-D high equivalent DT yield results. $$ \beta_{\text{N}}=\frac{\left(3.09+\frac{3.35}{A}+\frac{3.87}{A^{0.5}}\right)\left(\frac{\kappa}{3}\right)^{0.5}}{f_{\text{peak}}^{0.5}} From 1716d8f2c3060441d797ccc776a75547e4c2872d Mon Sep 17 00:00:00 2001 From: Christopher Ashe <91618944+chris-ashe@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:28:25 +0000 Subject: [PATCH 20/26] Update documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md Co-authored-by: Jonathan Matthews <115085094+kj5248@users.noreply.github.com> --- .../physics-models/plasma_current/bootstrap_current.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index b5691111dd..6f75d58ae4 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -561,7 +561,7 @@ The plasma parameters of the discharges can be seen in the table below: | $n_{\text{e,0}}$ | 0.2 - 1.2 $[10^{20} \text{m}^{-3}]$ | A wide variety of discharge regimes are included, such as: L-mode supershots, discharges -with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. +with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. Discharges with both monotonic $q$ profiles and with reversed shear are included in the dataset. For an example ERS discharge the bootstrap current is driven by the thermal particles surpasses 1 MA ($f_{\text{boot}}$ = 63%). Some ERS discharges in TFTR achieved $f_{\text{boot}}$ greater than 100% transiently. From 10c2f1a416920668748faa142934c24e0aa4e91c Mon Sep 17 00:00:00 2001 From: Christopher Ashe <91618944+chris-ashe@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:31:01 +0000 Subject: [PATCH 21/26] Update documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md Co-authored-by: Jonathan Matthews <115085094+kj5248@users.noreply.github.com> --- .../physics-models/plasma_current/bootstrap_current.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 6f75d58ae4..2786de6197 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -564,7 +564,7 @@ A wide variety of discharge regimes are included, such as: L-mode supershots, d with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. Discharges with both monotonic $q$ profiles and with reversed shear are included in the dataset. -For an example ERS discharge the bootstrap current is driven by the thermal particles surpasses 1 MA ($f_{\text{boot}}$ = 63%). Some ERS discharges in TFTR achieved $f_{\text{boot}}$ greater than 100% transiently. +For an example ERS discharge the bootstrap current is driven by when the thermal particles surpasses 1 MA ($f_{\text{boot}}$ = 63%). Some ERS discharges in TFTR achieved $f_{\text{boot}}$ greater than 100% transiently. !!! note "Change of profile index definition" From 8ffde12e0eb67021942229c411f5ec94ef713ac7 Mon Sep 17 00:00:00 2001 From: chris-ashe Date: Thu, 7 Nov 2024 17:59:35 +0000 Subject: [PATCH 22/26] Refine plasma current documentation and improve data visualization in bootstrap comparison --- .../plasma_current/bootstrap_current.md | 43 +++++++------ process/io/plot_proc.py | 61 ++++++++----------- process/physics.py | 2 +- 3 files changed, 46 insertions(+), 60 deletions(-) diff --git a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md index 2786de6197..13ac886a03 100644 --- a/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md +++ b/documentation/proc-pages/physics-models/plasma_current/bootstrap_current.md @@ -504,13 +504,13 @@ The range of parameters from the discharges in ETE can be found in the table bel | Parameter | Value | Parameter | Value | |-----------------------|-----------|-----------------------|-----------| -| $A$ | 1.5 | $\alpha_{\text{T}_\text{e}}$ | 0.02 | -| $R_0$ | 0.3 $\text{[m]}$ | $\alpha_{\text{T}_\text{i}}$ | 2 | -| $p(0)$ | 15 $\text{[kPa]}$ | $\kappa(a)$ | 2 | -| $T_{\text{e,i}}(0)$ | 1 $\text{[keV]}$ | $\delta$ | 0.3 | -| $T_{\text{e,i}}(a)$ | 0.1 $\text{[keV]}$ | $I_{\text{p}}$ | 200 $\text{[kA]}$ | -| $\alpha_{\text{p}}$ | 3 | $B_0$ | 0.4 $\text{[T]}$ | -| $\beta$ | 4-10% | $Z_{\text{eff}}$ | 1 | +| Aspect ratio, $A$ | 1.5 | Electron temperature profile index, $\alpha_{\text{T}_\text{e}}$ | 0.02 | +| Major radius, $R_0$ | 0.3 $\text{[m]}$ | Ion temperature profile index, $\alpha_{\text{T}_\text{i}}$ | 2 | +| Core plasma pressure, $p(0)$ | 15 $\text{[kPa]}$ | Elongation, $\kappa(a)$ | 2 | +| Core electron/ion temperature, $T_{\text{e,i}}(0)$ | 1 $\text{[keV]}$ | Triangularity, $\delta$ | 0.3 | +| Edge electron/ion temperature $T_{\text{e,i}}(a)$ | 0.1 $\text{[keV]}$ | Plasma Current, $I_{\text{p}}$ | 200 $\text{[kA]}$ | +| Pressure profile index, $\alpha_{\text{p}}$ | 3 | Toroidal field on-axis, $B_0$ | 0.4 $\text{[T]}$ | +| Plasma total beta, $\beta$ | 4-10% | Plasma effective charge, $Z_{\text{eff}}$ | 1 | Errors mostly up to the order of 10% are obtained when both expressions are compared with the equilibrium estimates for the bootstrap current in ETE. @@ -553,12 +553,12 @@ The plasma parameters of the discharges can be seen in the table below: | Parameter | Value | |-----------------------|-----------| -| $I_{\text{p}}$ | 0.6 - 2.7 $\text{[MA]}$ | -| $q(a)$ | 2.8 - 11.0 | -| $P_{\text{NBI}}$ | 2.0 - 35.0 $\text{[MW]}$ | -| $P_{\text{ICRH}}$ | 1.5 - 6.0 $\text{[MW]}$ | -| $B_{\text{T}}$ | 1.9 - 5.7 $\text{[T]}$ | -| $n_{\text{e,0}}$ | 0.2 - 1.2 $[10^{20} \text{m}^{-3}]$ | +| Plasma Current, $I_{\text{p}}$ | 0.6 - 2.7 $\text{[MA]}$ | +| Edge safety factor, $q(a)$ | 2.8 - 11.0 | +| Injected NBI power, $P_{\text{NBI}}$ | 2.0 - 35.0 $\text{[MW]}$ | +| Injected ICRH power, $P_{\text{ICRH}}$ | 1.5 - 6.0 $\text{[MW]}$ | +| Toroidal field on-axis, $B_{\text{T}}$ | 1.9 - 5.7 $\text{[T]}$ | +| Core electron density, $n_{\text{e,0}}$ | 0.2 - 1.2 $[10^{20} \text{m}^{-3}]$ | A wide variety of discharge regimes are included, such as: L-mode supershots, discharges with reversed shear (RS) and enhanced reversed shear (ERS), and discharges with increased-$l_i$. @@ -643,13 +643,13 @@ The fitting of the variable exponents is done using the least squares method wit | Parameter | Range | Points | |----------------------------|----------------|--------| -| Major radius $R$ | 5.0 | 1 | -| Aspect ratio $A$ | 1.3, 1.5, 1.7, 2.0, 2.2, 2.5, 3.0, 3.5, 4.0, 5.0 | 10 | -| Elongation $\kappa$ | $\sim$ 2 | 1 | -| Triangularity $\delta$ | $\sim$ 0.3 | 1 | -| Density profile index $a_{\text{n}}$ | 0.1-0.8 | 8 | -| Temperature profile index $a_{\text{T}}$ | 1.0-3.0 | 11 | -| Effective charge $Z_{\text{eff}}$ | 1.2-3.0 | 10 | +| Major radius, $R$ | 5.0 $[\mathrm{m}]$ | 1 | +| Aspect ratio, $A$ | 1.3, 1.5, 1.7, 2.0, 2.2, 2.5, 3.0, 3.5, 4.0, 5.0 | 10 | +| Elongation, $\kappa$ | $\sim$ 2 | 1 | +| Triangularity, $\delta$ | $\sim$ 0.3 | 1 | +| Density profile index, $a_{\text{n}}$ | 0.1-0.8 | 8 | +| Temperature profile index, $a_{\text{T}}$ | 1.0-3.0 | 11 | +| Effective charge, $Z_{\text{eff}}$ | 1.2-3.0 | 10 | The plasma parameters for each point in the aspect ratio scan can be seen in the table below: @@ -667,8 +667,7 @@ The plasma parameters for each point in the aspect ratio scan can be seen in the Is selected by setting `i_bootstrap_current = 10` -Scaling 1 has better accuracy than Scaling 2. However, Scaling 1 overestimated the $f_{\text{BS}}$ -value for reversed shear equilibrium. Although Scaling 2 does not have an internal current profile term, it can predict the $f_{\text{BS}}$ values to a certain extent for the high-$f_{\text{BS}}$ equilibria which are expected for next fusion devices. +Scaling 1 has better accuracy than Scaling 2. However, Scaling 1 overestimated the $f_{\text{BS}}$ value for reversed shear equilibrium. Although Scaling 2 does not have an internal current profile term, it can predict the $f_{\text{BS}}$ values to a certain extent for the high-$f_{\text{BS}}$ equilibria which are expected for next fusion devices. $$ C_{\text{BS}} = 0.474 \epsilon^{-0.1} \alpha_{\text{p}}^{0.974} \alpha_{\text{T}}^{-0.416} Z_{\text{eff}}^{0.178} \left(\frac{q_{95}}{q_0}\right)^{-0.133} diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index 12836eea13..8afba751a3 100755 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -2920,51 +2920,38 @@ def plot_bootstrap_comparison(axis, mfile_data, scan): boot_gi_II = mfile_data.data["bscf_gi_ii"].get_scan(scan) # Data for the box plot - data = [ - boot_ipdg, - boot_sauter, - boot_nenins, - boot_wilson, - boot_sakai, - boot_aries, - boot_andrade, - boot_hoang, - boot_wong, - boot_gi_I, - boot_gi_II, - ] - labels = [ - "IPDG", - "Sauter", - "Nevins", - "Wilson", - "Sakai", - "ARIES", - "Andrade", - "Hoang", - "Wong", - "Gi-I", - "Gi-II", - ] - - x = np.ones(len(data)) - + data = { + "IPDG": boot_ipdg, + "Sauter": boot_sauter, + "Nevins": boot_nenins, + "Wilson": boot_wilson, + "Sakai": boot_sakai, + "ARIES": boot_aries, + "Andrade": boot_andrade, + "Hoang": boot_hoang, + "Wong": boot_wong, + "Gi-I": boot_gi_I, + "Gi-II": boot_gi_II, + } # Create the violin plot - axis.violinplot(data, showextrema=False) + axis.violinplot(data.values(), showextrema=False) # Create the box plot - axis.boxplot(data, showfliers=True, showmeans=True, meanline=True, widths=0.3) + axis.boxplot( + data.values(), showfliers=True, showmeans=True, meanline=True, widths=0.3 + ) # Scatter plot for each data point - colors = plt.cm.plasma(np.linspace(0, 1, len(data))) - for i, value in enumerate(data): - axis.scatter(x[i], value, color=colors[i], label=labels[i], alpha=1.0) + colors = plt.cm.plasma(np.linspace(0, 1, len(data.values()))) + for index, (key, value) in enumerate(data.items()): + axis.scatter(1, value, color=colors[index], label=key, alpha=1.0) axis.legend(loc="upper left", bbox_to_anchor=(1, 1)) # Calculate average, standard deviation, and median - avg_bootstrap = np.mean(data) - std_bootstrap = np.std(data) - median_bootstrap = np.median(data) + data_values = list(data.values()) + avg_bootstrap = np.mean(data_values) + std_bootstrap = np.std(data_values) + median_bootstrap = np.median(data_values) # Plot average, standard deviation, and median as text axis.text( diff --git a/process/physics.py b/process/physics.py index 2c9a490bae..508ec129cc 100644 --- a/process/physics.py +++ b/process/physics.py @@ -5806,7 +5806,7 @@ def bootstrap_fraction_andrade( Notes: - Based off 350 plasma profiles from Experimento Tokamak Esferico (ETE) spherical tokamak - A = 1.5, R_0 = 0.3m, I_p = 200kA, B_0=0.4T, beta = 4-10%. Profiles taken as Gaussian shaped functions. - - Errors mostly up to the order of 10% are obtained when both expressions are compared with the equilibrium estimates for the + - Errors mostly up to the order of 10% are obtained when both expressions are compared with the equilibrium estimates for the bootstrap current in ETE References: From 48eb81a37b5a026f2e59ff322ef127bf02b4c035 Mon Sep 17 00:00:00 2001 From: Jonathan Maddock <78556175+jonmaddock@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:52:42 +0000 Subject: [PATCH 23/26] Remove developer group from docs Covered in CITATION.cff and README.md. --- documentation/proc-pages/index.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/documentation/proc-pages/index.md b/documentation/proc-pages/index.md index 7202d84789..07937b069a 100644 --- a/documentation/proc-pages/index.md +++ b/documentation/proc-pages/index.md @@ -65,20 +65,6 @@ itself to ensure that the documentation remains consistent with the latest versi It is to be hoped that it will be of assistance not only to users of PROCESS, but to anyone using PROCESS outputs or models based on them. -## Developer Group - -- [James Morris](mailto:james.morris2@ukaea.uk) -- [Michael Kovari](mailto:michael.kovari@ukaea.uk) -- [Stuart Muldrew](mailto:stuart.muldrew@ukaea.uk) -- [Alex Pearce](mailto:alexander.pearce@ukaea.uk) -- [Jonathan Maddock](mailto:jonathan.maddock@ukaea.uk) -- [Timothy Nunn](mailto:timothy.nunn@ukaea.uk) -- [Christopher Ashe](mailto:christopher.ashe@ukaea.uk) -- [Georgina Graham](mailto:georgina.graham@ukaea.uk) -- [Jack Foster](mailto:jack.foster@ukaea.uk) -- [Graeme Turkington](mailto:graeme.turkington@ukaea.uk) -- [Jonathan Matthews](mailto:jonathan.matthews@ukaea.uk) - ## References Below is a list of PROCESS publications describing the models: From 9baa160204facc88a431d526a050190a16e1aaea Mon Sep 17 00:00:00 2001 From: clmould <86794332+clmould@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:55:01 +0000 Subject: [PATCH 24/26] allow process version to be printed to terminal (#3379) * allow process version to be printed to terminal * add version monkeypatch to test_run_mode --- process/__init__.py | 3 +++ process/main.py | 9 +++++++++ tests/unit/test_main.py | 1 + 3 files changed, 13 insertions(+) diff --git a/process/__init__.py b/process/__init__.py index e69de29bb2..da0ebfd4be 100644 --- a/process/__init__.py +++ b/process/__init__.py @@ -0,0 +1,3 @@ +from importlib.metadata import version + +__version__ = version("process") diff --git a/process/main.py b/process/main.py index 67e5bb77cb..284bea9566 100644 --- a/process/main.py +++ b/process/main.py @@ -74,6 +74,7 @@ from process.impurity_radiation import initialise_imprad from process.caller import write_output_files +import process from pathlib import Path import os @@ -191,6 +192,11 @@ def parse_args(self, args): action="store_true", help="Produce a filled json from --mfile arg in working dir", ) + parser.add_argument( + "--version", + action="store_true", + help="Print the version of PROCESS to the terminal", + ) # If args is not None, then parse the supplied arguments. This is likely # to come from the test suite when testing command-line arguments; the @@ -202,6 +208,9 @@ def parse_args(self, args): def run_mode(self): """Determine how to run Process.""" + if self.args.version: + print(process.__version__) + return # Store run object: useful for testing if self.args.varyiterparams: self.run = VaryRun(self.args.varyiterparamsconfig, self.args.solver) diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py index 1b775f8070..858886cf67 100644 --- a/tests/unit/test_main.py +++ b/tests/unit/test_main.py @@ -101,6 +101,7 @@ def test_run_mode(process_obj, monkeypatch): # Mock the args attributes for --varyiterparams and --varyiterparamsconfig monkeypatch.setattr(process_obj, "args", argparse.Namespace(), raising=False) monkeypatch.setattr(process_obj.args, "varyiterparams", True, raising=False) + monkeypatch.setattr(process_obj.args, "version", False, raising=False) monkeypatch.setattr( process_obj.args, "varyiterparamsconfig", "file.conf", raising=False ) From 9138151f4c215519717cd385cf78fc9d78e501dc Mon Sep 17 00:00:00 2001 From: mn3981 Date: Fri, 8 Nov 2024 14:39:12 +0000 Subject: [PATCH 25/26] Add volume averaged plasma pressure variable to physics_variables module --- source/fortran/physics_variables.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/fortran/physics_variables.f90 b/source/fortran/physics_variables.f90 index 7b0577f35c..69dbdf09f8 100644 --- a/source/fortran/physics_variables.f90 +++ b/source/fortran/physics_variables.f90 @@ -559,6 +559,9 @@ module physics_variables real(dp) :: p0 !! central total plasma pressure (Pa) + real(dp) :: vol_avg_pressure + !! Volume averaged plasma pressure (Pa) + real(dp) :: f_dd_branching_trit !! branching ratio for DD -> T From 75ffc9c10189221517693fda06f3ca6482f8bb98 Mon Sep 17 00:00:00 2001 From: mn3981 Date: Mon, 11 Nov 2024 16:29:09 +0000 Subject: [PATCH 26/26] Fix calculation of bootstrap fraction by correcting the formula for core to volume averaged value ratio --- process/physics.py | 4 ++-- tests/unit/test_physics.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/process/physics.py b/process/physics.py index 1c15708bd4..7bedecbf45 100644 --- a/process/physics.py +++ b/process/physics.py @@ -6049,11 +6049,11 @@ def bootstrap_fraction_hoang( # (defined as ratio of the central value and I_p), alpha_j$ # We assume the pressure and current profile is parabolic and use the (profile_index +1) term in lieu - # The term represent the ratio of the the core to volume averaged value + # The term represents the ratio of the the core to volume averaged value # This could lead to large changes in the value depending on interpretation of the profile index - c_bs = np.sqrt(pressure_index + 1 / current_index + 1) + c_bs = np.sqrt((pressure_index + 1) / (current_index + 1)) return 0.4 * np.sqrt(inverse_aspect) * betap**0.9 * c_bs diff --git a/tests/unit/test_physics.py b/tests/unit/test_physics.py index a0a7a4b7b4..e94a44fdd5 100644 --- a/tests/unit/test_physics.py +++ b/tests/unit/test_physics.py @@ -678,7 +678,7 @@ class BootstrapFractionHoangParam(NamedTuple): pressure_index=2.4500000000000002e00, current_index=2.8314361644755763e00, inverse_aspect=1 / 3, - expected_bfs=0.5588166329771835, + expected_bfs=0.27190974213794156, ), ), )