Source code for torx.analysis.lineouts.curve_lineouts_m
"""Provides functionality of curved lineouts."""
import xarray as xr
from pathlib import Path
from warnings import warn
import matplotlib.pyplot as plt
from torx.grid.grid_2d_m import Grid2D
from torx.analysis.lineouts.lineout_m import Lineout
from torx.analysis.contour_finding_m import find_contours
from torx.equilibrium.equilibrium_m import EquilibriumBaseClass
from torx.equilibrium.numerical_m import NumericalEquilibrium
from torx.autodoc_decorators_m import autodoc_function
[docs]
@autodoc_function
def penalization_contour(
grid: Grid2D,
equi: EquilibriumBaseClass,
penalization_characteristic: xr.DataArray,
level: float,
contour_index: int = None,
epsilon: float = 1e-10,
smoothing: float = 0.1,
n_samples: int = 500,
grid_epsilon: float = 1e-6,
shift_inward: int = 0,
):
"""
Return a lineout along a contour of the penalization characteristic.
Should use filled_penalization_characteristic to get the
penalization_characteristic filled to include ghost points.
Smoothing is recommended, since this removes the grid staircase pattern
of the contour.
"""
assert (
"R" in penalization_characteristic.dims
and "Z" in penalization_characteristic.dims
), "Call vector_to_matrix on\
penalization_characteristic before calling penalization_contour"
# Shift the level slightly in from [0, 1] to ensure a clear contour
level = max(level, epsilon)
level = min(level, 1.0 - epsilon)
contours = find_contours(
grid.r_s, grid.z_s, penalization_characteristic, level=level
)
if isinstance(equi, NumericalEquilibrium) and equi._flipped_Z:
# Reverse the contour list is using flipped_Z, since contours are returned from bottom to top
contours.reverse()
if contour_index is None:
plt.pcolormesh(
grid.r_s, grid.z_s, penalization_characteristic, shading="nearest"
)
for i, contour in enumerate(contours):
r_points, z_points = contour.T
plt.plot(r_points, z_points, label=f"contour_index = {i}")
plt.legend()
plt.show()
warn("Select a contour index for penalization_contour")
else:
r_points, z_points = contours[contour_index].T
if shift_inward != 0:
r_points = r_points[shift_inward : -shift_inward]
z_points = z_points[shift_inward : -shift_inward]
lineout = Lineout(r_points, z_points, smoothing=smoothing)
lineout.find_points_on_grid(grid, n_samples=n_samples, epsilon=grid_epsilon)
return lineout