Source code for pyrfu.pyrf.magnetosphere

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party imports
import numpy as np

# Local imports
from .get_omni_data import get_omni_data

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


def _rzero(d_p, b_z):
    return (10.22 + 1.29 * np.tanh(0.184 * (b_z + 8.14))) * d_p ** (-1 / 6.6)


def _alpha(d_p, b_z):
    return (0.58 - 0.007 * b_z) * (1 + 0.024 * np.log(d_p))


[docs]def magnetosphere(model: str = "mp_shue1998", tint: list = None): r"""Returns the location of magnetopause. Parameters ---------- model : str Model to use. Implemented: 'mp_shue1998', 'bs'. Default is 'mp_shue1998'. tint : list Time interval. Returns ------- x_ : ndarray X location of the magnetopause. y_ : ndarray Y location of the magnetopause. Examples -------- >>> from pyrfu.pyrf import magnetosphere >>> x_mp, y_mp = magnetosphere("mp_shue1998", 10, -2) """ if tint is None: d_p = 1.7389104 b_z = 0.012695087 m_a = 4 else: omni_data = get_omni_data(["p", "bzgsm", "ma"], tint) b_z = float(omni_data.bzgsm.mean("time").data) d_p = float(omni_data.p.mean("time").data) m_a = float(omni_data.ma.mean("time").data) if model == "mp_shue1998": theta_ = np.linspace(0, np.pi, int(np.pi / 0.1)) r_zero = _rzero(d_p, b_z) alpha_ = _alpha(d_p, b_z) with np.errstate(divide="ignore"): r_s = r_zero * (2.0 / (1 + np.cos(theta_))) ** alpha_ x_s = r_s * np.cos(theta_) y_s = r_s * np.sin(theta_) y_s = y_s[abs(x_s) < 100] x_s = x_s[abs(x_s) < 100] elif model == "bs": x_mp, _ = magnetosphere("mp_shue1998", tint) gamma_ = 5 / 3 rstandoff = x_mp[0] * ( 1 + 1.1 * ((gamma_ - 1) * m_a**2 + 2) / ((gamma_ + 1) * (m_a**2 - 1)) ) # Smaller increments at the subsolar point x_s = ( rstandoff - np.logspace(np.log10(0.1), np.log10(100 + rstandoff), 300) + 0.1 ) # original F/G model adds rstandoff^2=645 y_s = np.sqrt( 0.04 * (x_s - rstandoff) ** 2 - 45.3 * (x_s - rstandoff), ) else: raise NotImplementedError("This model is not implemented yet!!") return x_s, y_s