Source code for pyrfu.pyrf.c_4_v
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
from scipy import interpolate
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
def _get_vol_ten(r_xyz, time):
if len(time) == 1:
time = np.array([time, time, time, time])
tckr_x, tckr_y, tckr_z = [[], [], []]
for i in range(4):
tckr_x.append(
interpolate.interp1d(r_xyz[i].time.data, r_xyz[i].data[:, 0]),
)
tckr_y.append(
interpolate.interp1d(r_xyz[i].time.data, r_xyz[i].data[:, 1]),
)
tckr_z.append(
interpolate.interp1d(r_xyz[i].time.data, r_xyz[i].data[:, 2]),
)
r_xyz[i] = np.array(
[tckr_x[i](time[0]), tckr_y[i](time[0]), tckr_z[i](time[0])],
)
# Volumetric tensor with SC1 as center.
dr_mat = (np.vstack(r_xyz[1:]) - np.tile(r_xyz[0], (3, 1))).T
return dr_mat
[docs]def c_4_v(r_xyz, time):
r"""Calculates velocity or time shift of discontinuity as in [6]_.
Parameters
----------
r_xyz : list
Time series of the positions of the 4 spacecraft.
time : list
Crossing times or time and velocity.
Returns
-------
out : ndarray
Discontinuity velocity or time shift with respect to mms1.
References
----------
.. [6] Vogt, J., Haaland, S., and Paschmann, G. (2011) Accuracy
of multi-point boundary crossing time analysis, Ann.
Geophys., 29, 2239-2252, doi :
https://doi.org/10.5194/angeo-29-2239-2011
"""
if isinstance(time, np.ndarray) and time.dtype == np.datetime64:
flag = "v_from_t"
time = time.view("i8") * 1e-9
elif time[1] > 299792.458:
flag = "v_from_t"
else:
flag = "dt_from_v"
if flag.lower() == "v_from_t":
# Time input, velocity output
dr_mat = _get_vol_ten(r_xyz, time)
tau = np.array(time[1:]) - time[0]
slowness = np.linalg.solve(dr_mat, tau)
# "1/v vector"
out = slowness / np.linalg.norm(slowness) ** 2
elif flag.lower() == "dt_from_v":
# Time and velocity input, time output
time_center = time[0] # center time
velocity = np.array(time[1:]) # Input velocity
slowness = velocity / np.linalg.norm(velocity) ** 2
dr_mat = _get_vol_ten(r_xyz, time_center)
delta_t = np.matmul(dr_mat, slowness)
out = np.hstack([0, delta_t])
else:
raise ValueError("Invalid flag")
return out