Source code for cfspopcon.formulas.separatrix_conditions.separatrix_operational_space.sustainment_power

"""Routines to calculate the separatrix power required to reach the LH transition."""

import numpy as np

from ....algorithm_class import Algorithm
from ....unit_handling import Quantity, Unitfull, ureg
from .shared import calc_lambda_q_Eich2020H


[docs] @Algorithm.register_algorithm(return_keys=["sustainment_power_in_ion_channel"]) def calc_power_crossing_separatrix_in_ion_channel( surface_area: Unitfull, separatrix_electron_density: Unitfull, separatrix_electron_temp: Unitfull, alpha_t: Unitfull, poloidal_sound_larmor_radius: Unitfull, ion_heat_diffusivity: Unitfull, temp_scale_length_ratio: float = 1.0, ) -> Unitfull: """Calculate the power crossing the separatrix in the ion channel. This algorithm computes the power required to sustain a particular ion temperature gradient, given a ion heat diffusivity, using the method from section 4.1 in :cite:`Eich_2021`. temp_scale_length_ratio = Ti / Te * lambda_Te / lambda_Ti = L_Te / L_Ti Args: surface_area: :term:`glossary link<surface_area>` separatrix_electron_density: :term:`glossary link<separatrix_electron_density>` separatrix_electron_temp: :term:`glossary link<separatrix_electron_temp>` alpha_t: :term:`glossary link<alpha_t>` poloidal_sound_larmor_radius: :term:`glossary link<poloidal_sound_larmor_radius>` ion_heat_diffusivity: :term:`glossary link<ion_heat_diffusivity>` temp_scale_length_ratio: :term:`glossary link<temp_scale_length_ratio>` Returns: :term:`sustainment_power_in_ion_channel` """ lambda_q = calc_lambda_q_Eich2020H(alpha_t, poloidal_sound_larmor_radius) lambda_Te = 3.5 * lambda_q L_Te = lambda_Te / separatrix_electron_temp L_Ti = L_Te / temp_scale_length_ratio P_SOL_i = surface_area * separatrix_electron_density * ion_heat_diffusivity / L_Ti return P_SOL_i
[docs] @Algorithm.register_algorithm(return_keys=["sustainment_power_in_electron_channel"]) def calc_power_crossing_separatrix_in_electron_channel( separatrix_electron_temp: Unitfull, target_electron_temp: Unitfull, cylindrical_safety_factor: Unitfull, major_radius: Unitfull, minor_radius: Unitfull, B_pol_out_mid: Unitfull, B_t_out_mid: Unitfull, fraction_of_P_SOL_to_divertor: Unitfull, z_effective: Unitfull, alpha_t: Unitfull, poloidal_sound_larmor_radius: Unitfull, ) -> Unitfull: """Calculate the power crossing the separatrix for a given separatrix temperature. Equation 11 from :cite:`Eich_2021`, inverting the Spitzer-Harm power balance. Args: separatrix_electron_temp: :term:`glossary link<separatrix_electron_temp>` target_electron_temp: :term:`glossary link<target_electron_temp>` cylindrical_safety_factor: :term:`glossary link<cylindrical_safety_factor>` major_radius: :term:`glossary link<major_radius>` minor_radius: :term:`glossary link<minor_radius>` B_pol_out_mid: :term:`glossary link<B_pol_out_mid>` B_t_out_mid: :term:`glossary link<B_t_out_mid>` fraction_of_P_SOL_to_divertor: :term:`glossary link<fraction_of_P_SOL_to_divertor>` z_effective: :term:`glossary link<z_effective>` alpha_t: :term:`glossary link<alpha_t>` poloidal_sound_larmor_radius: :term:`glossary link<poloidal_sound_larmor_radius>` Returns: :term:`sustainment_power_in_electron_channel` """ lambda_q = calc_lambda_q_Eich2020H(alpha_t, poloidal_sound_larmor_radius) f_Zeff = 0.672 + 0.076 * np.sqrt(z_effective) + 0.252 * z_effective kappa_0e = Quantity(2600.0, ureg.W / (ureg.eV**3.5 * ureg.m)) / f_Zeff L_parallel = np.pi * cylindrical_safety_factor * major_radius A_SOL = 2.0 * np.pi * (major_radius + minor_radius) * lambda_q * B_pol_out_mid / B_t_out_mid P_SOL_e = ( 2.0 / 7.0 * kappa_0e * A_SOL / (L_parallel * fraction_of_P_SOL_to_divertor) * (separatrix_electron_temp**3.5 - target_electron_temp**3.5) ) return P_SOL_e