Source code for torx.grid.mesh_m
"""Low-level interface to the PARALLAX mesh."""
import xarray as xr
import numpy as np
from inspect import getmodule
import torx.grid.multigrid_operations_m as operators
from torx.autodoc_decorators_m import autodoc_class
[docs]
@autodoc_class
class Mesh:
"""Represents a PARALLAX mesh type (2D)."""
[docs]
def __init__(self, dataset: xr.Dataset):
"""Initialize the mesh object."""
self._dataset = dataset.rename(
n_points="points",
n_points_inner="points_inner",
n_points_boundary="points_boundary",
n_points_ghost="points_ghost",
)
@property
def r_u(self) -> np.ndarray:
"""Unstructured Cartesian radial coordinate."""
return operators.calc_r_u(self).values
@property
def r_s(self) -> np.ndarray:
"""Structured Cartesian radial coordinate."""
return operators.calc_r_s(self)
@property
def z_u(self) -> np.ndarray:
"""Unstructured Cartesian vertical coordinate."""
return operators.calc_z_u(self).values
@property
def z_s(self) -> np.ndarray:
"""Structured Cartesian vertical coordinate."""
return operators.calc_z_s(self)
[docs]
def vector_to_matrix(self, unstructured_data: xr.DataArray) -> xr.DataArray:
"""Perform vector to matrix operation on the mesh."""
return operators.vector_to_matrix(self, unstructured_data)
[docs]
def matrix_to_vector(self, structured_data: xr.DataArray) -> xr.DataArray:
"""Perform matrix to vector operation on the mesh."""
return operators.matrix_to_vector(self, structured_data)
[docs]
def inner_to_full(self) -> xr.DataArray:
"""Perform inner to full operation on the mesh."""
return operators.inner_to_full(self)
@property
def points(self) -> int:
"""Total number of points."""
return self._dataset.sizes["points"]
@property
def points_inner(self) -> int:
"""Number of inner points."""
return self._dataset.sizes["points_inner"]
@property
def points_boundary(self) -> int:
"""Number of boundary points."""
return self._dataset.sizes["points_boundary"]
@property
def points_ghost(self) -> int:
"""Number of ghost points."""
return self._dataset.sizes["points_ghost"]
@property
def size_neighbor(self) -> int:
"""Number of neighboring points in each direction."""
# Check that dx and dy is the same so it does not matter which one
# we return (if they are not, the mesh is most likely corrupt)
assert self._dataset.index_neighbor.sizes["dx"] \
== self._dataset.index_neighbor.sizes["dy"]
return self._dataset.index_neighbor.sizes["dx"]
@property
def phi(self) -> float:
"""Toroidal position of this mesh."""
return self._dataset.phi
@property
def lvl(self) -> int:
"""Multigrid level."""
return self._dataset.lvl
@property
def lvst(self) -> int:
"""Discrete grid distance."""
return self._dataset.lvst
@property
def spacing_f(self) -> float:
"""Grid spacing on finest multigrid level."""
return self._dataset.spacing_f
@property
def spacing_c(self) -> float:
"""Grid spacing on this multigrid level."""
return self._dataset.spacing_c
@property
def xmin(self) -> float:
"""Minimum x value (used for grid construction)."""
return self._dataset.xmin
@property
def ymin(self) -> float:
"""Minimum y value (used for grid construction)."""
return self._dataset.ymin
@property
def nx_f(self) -> int:
"""x-dimension of rectangular Cartesian unmasked grid (finest level)."""
return self._dataset.nx_f
@property
def ny_f(self) -> int:
"""y-dimension of rectangular Cartesian unmasked grid (finest level)."""
return self._dataset.ny_f
@property
def size_ghost_layer(self) -> int:
"""Number of perpendicular ghost points."""
return self._dataset.size_ghost_layer
@property
def yperiodic(self) -> int:
"""Return periodicity in SLAB equi, y-direction."""
return self._dataset.yperiodic
@property
def n_points_red(self) -> int:
"""Number of 'red' points for red-black Gauss-Seidel."""
return self._dataset.n_points_red
@property
def n_points_black(self) -> int:
"""Number of 'black' points for red-black Gauss-Seidel."""
return self._dataset.n_points_black
@property
def cart_i(self) -> xr.DataArray:
"""Horizontal integer position of each point."""
return self._dataset.cart_i
@property
def cart_j(self) -> xr.DataArray:
"""Vertical integer position of each point."""
return self._dataset.cart_j
@property
def pinfo(self) -> xr.DataArray:
"""
Grid descriptor.
1 for inner, 2 for boundary, 3 for ghost.
"""
return self._dataset.pinfo
@property
def district(self) -> xr.DataArray:
"""District of point."""
return self._dataset.district
@property
def inner_indices(self) -> xr.DataArray:
"""Indices of inner points."""
return self._dataset.inner_indices
@property
def boundary_indices(self) -> xr.DataArray:
"""Indices of boundary points."""
return self._dataset.boundary_indices
@property
def ghost_indices(self) -> xr.DataArray:
"""Indices of ghost points."""
return self._dataset.ghost_indices
@property
def index_neighbor(self) -> xr.DataArray:
"""Indices of perpendicular neighbors."""
return self._dataset.index_neighbor
@property
def redblack_indices(self) -> xr.DataArray:
"""
Index list of redblack points.
Eventually needed for red-black Gauss Seidel smoother.
First number of red entries are indices of red points.
Following number of black entries are indices of black points.
Final number of boundary + number of ghost entries are indices of
boundary and ghost points.
"""
return self._dataset.redblack_indices
@property
def size(self) -> int:
"""
Return the number of points in the mesh.
Enables interchanging 'mesh' with 'grid'.
"""
return self.points