Source code for pyrfu.pyrf.poynting_flux
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
# Local imports
from .calc_fs import calc_fs
from .cross import cross
from .dot import dot
from .normalize import normalize
from .resample import resample
from .time_clip import time_clip
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def poynting_flux(e_xyz, b_xyz, b_hat):
r"""Estimates Poynting flux at electric field sampling as
.. math::
S = \frac{E \times B}{\mu_0}
if `b0` is given project the Poynting flux along `b0`
Parameters
----------
e_xyz : xarray.DataArray
Time series of the electric field.
b_xyz : xarray.DataArray
Time series of the magnetic field.
b_hat : xarray.DataArray, Optional
Time series of the direction to project the Pointing flux.
Returns
-------
s : xarray.DataArray
Time series of the Pointing flux.
s_z : xarray.DataArray
Time series of the projection of the Pointing flux (only if b0).
int_s : xarray.DataArray
Time series of the time integral of the Pointing flux
(if b0 integral along b0).
"""
# check which Poynting flux to calculate
flag_s_z, flag_int_s_z, flag_int_s = [False, False, False]
if b_hat is None:
flag_int_s = True
else:
flag_s_z, flag_int_s_z = [True, True]
# interval where both E & B exist
tint = [
np.max([np.min(e_xyz.time.data), np.min(b_xyz.time.data)]),
np.min([np.max(e_xyz.time.data), np.max(b_xyz.time.data)]),
]
tint = [np.datetime_as_string(time, "ns") for time in tint]
e_xyz, b_xyz = [time_clip(e_xyz, tint), time_clip(b_xyz, tint)]
if len(e_xyz) < len(b_xyz):
e_xyz = resample(e_xyz, b_xyz)
f_spl = calc_fs(b_xyz)
elif len(e_xyz) > len(b_xyz):
b_xyz = resample(b_xyz, e_xyz)
f_spl = calc_fs(e_xyz)
else:
f_spl = calc_fs(b_xyz)
# Calculate Poynting flux
s_xyz = cross(e_xyz, b_xyz) / (4 * np.pi / 1e7) * 1e-9
if flag_s_z:
b_m = resample(b_hat, e_xyz)
s_z = dot(normalize(b_m), s_xyz)
else:
s_z = None
# time integral of Poynting flux along ambient magnetic field
res = None
if flag_int_s_z:
s_z[np.isnan(s_z.data)] = 0 # set to zero points where Sz=NaN
int_s_z = np.cumsum(s_z) / f_spl
res = (s_xyz, s_z, int_s_z)
if flag_int_s: # time integral of all Poynting flux components
# set to zero points where Sz=NaN
s_xyz[np.isnan(s_xyz[:, 2].data)] = 0
int_s = np.cumsum(s_xyz) / f_spl
res = (s_xyz, int_s)
return res