Source code for disco._axes
from dataclasses import dataclass
from typing import Any
import cupy as cp
from disco._dimensionalization import dim_space, dim_time
[docs]
class Axes:
"""Coordinates of a Rectilinear Grid in SM Coordinates."""
def __init__(self, x, y, z, t, r_inner):
"""Initialize instance that is dimensionalized and stored
on the GPU.
Parameters
----------
x: array with units
x axis coordinates
y: array with units
y axis coordinates
z: array with units
z axis coordinates
t: numpy array with units
time axis coordinates
r_inner: scalar with units
inner boundary
"""
assert len(x.shape) == 1
assert len(y.shape) == 1
assert len(z.shape) == 1
assert len(t.shape) == 1
self.t = t
self.x = x
self.y = y
self.z = z
self.r_inner = r_inner
[docs]
def dimensionalize(self):
"""Convert to a `DimensionalizedAxes` instance.
Returns
-------
instance of `DimensionalizedAxes`
"""
return DimensionalizedAxes(self)
class DimensionalizedAxes:
"""
1D arrays of uniform grid axes
Stored in dimensionalized form on the GPU.
"""
def __init__(self, axes):
self.x = cp.array(dim_space(axes.x))
self.y = cp.array(dim_space(axes.y))
self.z = cp.array(dim_space(axes.z))
self.t = cp.array(dim_time(axes.t))
self.r_inner = dim_space(axes.r_inner)
def get_neighbors(self, t, y):
"""Get instance of _Neighbors specifying surrounding
cell through indeces of upper corner
Returns instance of _Neighbors
"""
field_i = cp.searchsorted(self.x, y[:, 0])
field_j = cp.searchsorted(self.y, y[:, 1])
field_k = cp.searchsorted(self.z, y[:, 2])
field_l = cp.searchsorted(self.t, t, side="right")
return Neighbors(
field_i=field_i,
field_j=field_j,
field_k=field_k,
field_l=field_l,
)
@dataclass
class Neighbors:
"""Neighbors of given particles, used for interpolation"""
field_i: Any
field_j: Any
field_k: Any
field_l: Any