Source code for cfspopcon.formulas.metrics.collisionality

"""Calculate the normalized collisionality."""

import numpy as np

from ...algorithm_class import Algorithm
from ...unit_handling import Unitfull, convert_units, ureg, wraps_ufunc


[docs] @wraps_ufunc(input_units=dict(electron_density=ureg.m**-3, electron_temp=ureg.eV), return_units=dict(coulomb_log=ureg.dimensionless)) def calc_coulomb_logarithm(electron_density: float, electron_temp: float) -> float: """Calculate the Coulomb logarithm, for electron-electron or electron-ion collisions. From text on page 6 of :cite:`Verdoolaege_2021` """ return float(30.9 - np.log(electron_density**0.5 * electron_temp**-1.0))
[docs] @Algorithm.register_algorithm(return_keys=["nu_star"]) def calc_normalised_collisionality( average_electron_density: Unitfull, average_electron_temp: Unitfull, average_ion_temp: Unitfull, q_star: Unitfull, major_radius: Unitfull, inverse_aspect_ratio: Unitfull, z_effective: Unitfull, ) -> Unitfull: """Calculate normalized collisionality. Equation 1c from :cite:`Verdoolaege_2021` Extra factor of ureg.e**2, presumably related to electron_temp**-2 for electron_temp in eV Args: average_electron_density: [1e19 m^-3] :term:`glossary link<average_electron_density>` average_electron_temp: [keV] :term:`glossary link<average_electron_temp>` average_ion_temp: [keV] :term:`glossary link<average_ion_temp>` q_star: [~] :term:`glossary link<q_star>` major_radius: [m] :term:`glossary link<major_radius>` inverse_aspect_ratio: [m] :term:`glossary link<inverse_aspect_ratio>` z_effective: [~] :term:`glossary link<z_effective>` Returns: nu_star [~] """ return convert_units( ureg.e**4 / (2.0 * np.pi * 3**1.5 * ureg.epsilon_0**2) * calc_coulomb_logarithm(average_electron_density, average_electron_temp) * average_electron_density * q_star * major_radius * z_effective / (average_ion_temp**2 * inverse_aspect_ratio**1.5), ureg.dimensionless, )
[docs] @Algorithm.register_algorithm(return_keys=["alpha_t"]) def calc_alpha_t( separatrix_electron_density: Unitfull, separatrix_electron_temp: Unitfull, cylindrical_safety_factor: Unitfull, major_radius: Unitfull, average_ion_mass: Unitfull, z_effective: Unitfull, mean_ion_charge_state: Unitfull, ion_to_electron_temp_ratio: float = 1.0, ) -> Unitfull: """Calculate the turbulence parameter alpha_t. Equation 9 from :cite:`Eich_2020`. Compared to this equation, the factor of the ion_to_electron_temp_ratio is added following a discussion with T. Eich. Args: separatrix_electron_density: :term:`glossary link<separatrix_electron_density>` separatrix_electron_temp: :term:`glossary link<separatrix_electron_temp>` cylindrical_safety_factor: :term:`glossary link<cylindrical_safety_factor>` major_radius: :term:`glossary link<major_radius>` average_ion_mass: :term:`glossary link<average_ion_mass>` z_effective: :term:`glossary link<z_effective>` mean_ion_charge_state: :term:`glossary link<mean_ion_charge_state>` ion_to_electron_temp_ratio: :term:`glossary link<ion_to_electron_temp_ratio>` Returns: :term:`alpha_t` """ coulomb_log = calc_coulomb_logarithm(electron_density=separatrix_electron_density, electron_temp=separatrix_electron_temp) ion_sound_speed = np.sqrt(mean_ion_charge_state * separatrix_electron_temp / average_ion_mass) nu_ei = calc_electron_ion_collision_freq( electron_density=separatrix_electron_density, electron_temp=separatrix_electron_temp, coulomb_log=coulomb_log, z_effective=z_effective, ) alpha_t = ( 1.02 * nu_ei / ion_sound_speed * (1.0 * ureg.electron_mass / average_ion_mass) * cylindrical_safety_factor**2 * major_radius * (1.0 + ion_to_electron_temp_ratio / mean_ion_charge_state) ) return convert_units(alpha_t, ureg.dimensionless)
[docs] @Algorithm.register_algorithm(return_keys=["edge_collisionality"]) def calc_edge_collisionality( separatrix_electron_density: Unitfull, separatrix_electron_temp: Unitfull, cylindrical_safety_factor: Unitfull, major_radius: Unitfull, average_ion_mass: Unitfull, z_effective: Unitfull, mean_ion_charge_state: Unitfull, ion_to_electron_temp_ratio: float = 1.0, ) -> Unitfull: """Calculate the edge collisionality. Equation 7 from :cite:`Faitsch_2023`. Args: separatrix_electron_density: :term:`glossary link<separatrix_electron_density>` separatrix_electron_temp: :term:`glossary link<separatrix_electron_temp>` cylindrical_safety_factor: :term:`glossary link<cylindrical_safety_factor>` major_radius: :term:`glossary link<major_radius>` average_ion_mass: :term:`glossary link<average_ion_mass>` z_effective: :term:`glossary link<z_effective>` mean_ion_charge_state: :term:`glossary link<mean_ion_charge_state>` ion_to_electron_temp_ratio: :term:`glossary link<ion_to_electron_temp_ratio>` Returns: :term:`edge_collisionality` """ alpha_t = calc_alpha_t( separatrix_electron_density=separatrix_electron_density, separatrix_electron_temp=separatrix_electron_temp, cylindrical_safety_factor=cylindrical_safety_factor, major_radius=major_radius, average_ion_mass=average_ion_mass, z_effective=z_effective, mean_ion_charge_state=mean_ion_charge_state, ion_to_electron_temp_ratio=ion_to_electron_temp_ratio, ) return 100.0 * alpha_t / cylindrical_safety_factor
def calc_electron_electron_collision_freq(electron_density: Unitfull, electron_temp: Unitfull, coulomb_log: Unitfull) -> Unitfull: """Calculate the electron-electron collision frequency, using equation B1 from from :cite:`Eich_2020`.""" nu_ee = ( (4.0 / 3.0) * np.sqrt(2.0 * np.pi) * electron_density * ureg.e**4 * coulomb_log / ((4.0 * np.pi * ureg.epsilon_0) ** 2 * np.sqrt(1.0 * ureg.electron_mass) * electron_temp**1.5) ) return nu_ee def calc_electron_ion_collision_freq( electron_density: Unitfull, electron_temp: Unitfull, coulomb_log: Unitfull, z_effective: Unitfull ) -> Unitfull: """Calculate the electron-ion collision frequency, using equation B2 from from :cite:`Eich_2020`.""" nu_ee = calc_electron_electron_collision_freq(electron_density, electron_temp, coulomb_log) z_effective_correction = (1.0 - 0.569) * np.exp(-(((z_effective - 1.0) / 3.25) ** 0.85)) + 0.569 return nu_ee * z_effective_correction * z_effective