Source code for sunkit_magex.pfss.grid
import functools
import numpy as np
[docs]
class Grid:
r"""
Grid on which the sunkit_magex.pfss solution is calculated.
Notes
-----
The PFSS solution is calculated on a "strumfric" grid defined by
- :math:`\rho = \log (r)`
- :math:`s = \cos (\theta )`
- :math:`\phi`
where :math:`r, \theta, \phi` are spherical coordinates that have ranges
- :math:`1 < r < r_{ss}`
- :math:`0 < \theta < \pi`
- :math:`0 < \phi < 2\pi`
"""
def __init__(self, ns, nphi, nr, rss):
self.ns = ns
self.nphi = nphi
self.nr = nr
self.rss = rss
@property
def ds(self):
"""
Cell size in cos(theta).
"""
return 2.0 / self.ns
@property
def dr(self):
"""
Cell size in log(r).
"""
return np.log(self.rss) / self.nr
@property
def dp(self):
"""
Cell size in phi.
"""
return 2 * np.pi / self.nphi
@property
def rc(self):
"""
Location of the centre of cells in log(r).
"""
return np.linspace(0.5 * self.dr, np.log(self.rss) - 0.5 * self.dr, self.nr)
@property
def sc(self):
"""
Location of the centre of cells in cos(theta).
"""
return np.linspace(-1 + 0.5 * self.ds, 1 - 0.5 * self.ds, self.ns)
@property
def pc(self):
"""
Location of the centre of cells in phi.
"""
return np.linspace(0.5 * self.dp, 2 * np.pi - 0.5 * self.dp, self.nphi)
@property
def rg(self):
"""
Location of the edges of grid cells in log(r).
"""
return np.linspace(0, np.log(self.rss), self.nr + 1)
@property
def sg(self):
"""
Location of the edges of grid cells in cos(theta).
"""
return np.linspace(-1, 1, self.ns + 1)
@property
def pg(self):
"""
Location of the edges of grid cells in phi.
"""
return np.linspace(0, 2 * np.pi, self.nphi + 1)
@property
def _grid_spacing(self):
"""
Return grid spacing as a 3-len list.
"""
return [self.dp, self.ds, self.dr]
@property
@functools.lru_cache
def _sqrtsg_correction(self):
"""
The sqrt(1 - sg**2) correction needed to trace natively. Computed here
once and cached for performance.
"""
# Correct s direction for coordinate system distortion
_, sg, _ = np.meshgrid(self.pg, self.sg, self.rg,
indexing='ij')
return np.sqrt(1 - sg**2)