Source code for torx.analysis.lineouts.omp_map_m

"""Functions for parameterizing a lineout curve."""
import numpy as np
from scipy.interpolate import make_interp_spline

from torx import make_xarray
from torx.grid.grid_2d_m import Grid2D
from torx.equilibrium.equilibrium_m import EquilibriumBaseClass
from torx.normalization.normalization_m import Normalization
from torx.analysis.lineouts.chord_lineouts_m import outboard_zaxis_chord
from torx import Quantity, Dimensionless
from torx.autodoc_decorators_m import autodoc_class

[docs] @autodoc_class class OutboardMidplaneMap: """ Interpolates rho from an arbitrary line to the equivalent distance on omp. This is useful for accounting for flux expansion when comparing fall-off lengths at different positions. """
[docs] def __init__( self, grid: Grid2D, equi: EquilibriumBaseClass, norm: Normalization, separatrix_index: int = 0, ): """Initialize the omp map interpolator.""" lineout = outboard_zaxis_chord(grid, equi) self.rho_points = equi.normalized_flux_surface_label( lineout.r_points, lineout.z_points, grid=False ) self.arc_points = lineout.poloidal_arc_length(norm=norm) omp_map = make_interp_spline(self.rho_points, self.arc_points) # Call again to make the separatrix have a value of '0.0' self.separatrix_arc = omp_map(1.0) omp_map = make_interp_spline( self.rho_points, self.arc_points - self.separatrix_arc ) self.equi = equi self.omp_map = omp_map
[docs] def __call__(self, r_points: np.array, z_points: np.array): """ Map points back to omp and calculate the equiv. distance to the sep. If the curve includes points in the private flux region, the rho < 1.0 (private flux region) or equivalently omp_mapped_distance < 0.0 is mapped to the core, which may have significantly different flux-surface expansion. """ rho_points = self.equi.normalized_flux_surface_label( r_points, z_points, grid=False ) return self.convert_rho_to_distance(rho_points=rho_points)
[docs] def convert_rho_to_distance(self, rho_points: np.array): """Map an array of rho to omp equivalent distance to the separatrix.""" return make_xarray( self.omp_map(rho_points), norm=self.arc_points.norm, name="OMP-mapped distance to sep.", )
[docs] def convert_distance_to_rho(self, arc_points: Quantity): """Invert the omp map.""" omp_inv = make_interp_spline( self.arc_points - self.separatrix_arc, self.rho_points ) arc_norm = (arc_points / self.arc_points.norm).to("") return make_xarray( omp_inv(arc_norm), norm=Dimensionless, name="Normalized flux-surface label" )