Source code for cfspopcon.formulas.plasma_profiles.density_peaking

"""Estimate the density peaking based on scaling from C. Angioni."""

import numpy as np
import xarray as xr

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


[docs] def calc_density_peaking(effective_collisionality: Unitfull, beta_toroidal: Unitfull, nu_noffset: Unitfull) -> Unitfull: """Calculate the density peaking (peak over volume average). Equation 3 from p1334 of Angioni et al, "Scaling of density peaking in H-mode plasmas based on a combined database of AUG and JET observations" :cite:`angioni_scaling_2007` Args: effective_collisionality: [~] :term:`glossary link <effective_collisionality>` beta_toroidal: :term:`glossary link <beta_toroidal>` [~] nu_noffset: scalar offset added to peaking factor [~] Returns: nu_n [~] """ nu_n = (1.347 - 0.117 * np.log(effective_collisionality) - 4.03 * beta_toroidal) + nu_noffset if isinstance(nu_n, xr.DataArray): return nu_n.clip(1.0, float("inf")) else: return max(nu_n, 1.0 * ureg.dimensionless)
[docs] @Algorithm.register_algorithm(return_keys=["ion_density_peaking", "peak_fuel_ion_density"]) def calc_ion_density_peaking( effective_collisionality: Unitfull, beta_toroidal: Unitfull, ion_density_peaking_offset: Unitfull, average_electron_density: Unitfull, dilution: Unitfull, ) -> tuple[Unitfull, ...]: """Calculate the ion density peaking. Args: effective_collisionality: [~] :term:`glossary link <effective_collisionality>` beta_toroidal: :term:`glossary link <beta_toroidal>` [~] ion_density_peaking_offset: :term:`glossary link<ion_density_peaking_offset>` [~] average_electron_density: :term:`glossary link<average_electron_density>` dilution: :term:`glossary link<dilution>` Returns: :term:`ion_density_peaking`, :term:`peak_fuel_ion_density` """ ion_density_peaking = calc_density_peaking(effective_collisionality, beta_toroidal, nu_noffset=ion_density_peaking_offset) peak_fuel_ion_density = average_electron_density * dilution * ion_density_peaking return ion_density_peaking, peak_fuel_ion_density
[docs] @Algorithm.register_algorithm(return_keys=["electron_density_peaking", "peak_electron_density"]) def calc_electron_density_peaking( effective_collisionality: Unitfull, beta_toroidal: Unitfull, electron_density_peaking_offset: Unitfull, average_electron_density: Unitfull, ) -> tuple[Unitfull, ...]: """Calculate the electron density peaking. Args: effective_collisionality: [~] :term:`glossary link <effective_collisionality>` beta_toroidal: :term:`glossary link <beta_toroidal>` [~] electron_density_peaking_offset: :term:`glossary link<electron_density_peaking_offset>` [~] average_electron_density: :term:`glossary link<average_electron_density>` Returns: :term:`electron_density_peaking`, :term:`peak_electron_density` """ electron_density_peaking = calc_density_peaking(effective_collisionality, beta_toroidal, nu_noffset=electron_density_peaking_offset) peak_electron_density = average_electron_density * electron_density_peaking return electron_density_peaking, peak_electron_density
[docs] @Algorithm.register_algorithm(return_keys=["effective_collisionality"]) @wraps_ufunc( return_units=dict(effective_collisionality=ureg.dimensionless), input_units=dict( average_electron_density=ureg.n19, average_electron_temp=ureg.keV, major_radius=ureg.m, z_effective=ureg.dimensionless ), ) def calc_effective_collisionality( average_electron_density: float, average_electron_temp: float, major_radius: float, z_effective: float ) -> float: """Calculate the effective collisionality. From p1327 of Angioni et al, "Scaling of density peaking in H-mode plasmas based on a combined database of AUG and JET observations" :cite:`angioni_scaling_2007` Args: average_electron_density: [1e19 m^-3] :term:`glossary link<average_electron_density>` average_electron_temp: [keV] :term:`glossary link<average_electron_temp>` major_radius: [m] :term:`glossary link<major_radius>` z_effective: [~] :term:`glossary link<z_effective>` Returns: :term:`effective_collisionality` [~] """ return float((0.1 * z_effective * average_electron_density * major_radius) / (average_electron_temp**2.0))