Ohm’s Law#

Author: Louis Richard
Compute the terms in the generalized Ohm’s law equation: Ion convection, Hall, and electron pressure divergence terms. Hall and pressure terms are computed using four-spacecraft methods. The observed electric fields and convection terms are averaged over the four spacecraft. Terms computed in GSE coordinates.
[1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

from scipy import constants
from pyrfu import mms, pyrf
from pyrfu.plot import plot_line, use_pyrfu_style

use_pyrfu_style(usetex=True)
Load IGRF coefficients ...

Define time interval and data path#

[2]:
mms.db_init(local="/Volumes/mms")
tint = ["2015-10-30T05:15:40.000", "2015-10-30T05:15:55.000"]
tint_long = pyrf.extend_tint(tint, [-60, 60])
[12-Mar-24 14:25:53] INFO: Updating MMS data access configuration in /usr/local/lib/python3.11/site-packages/pyrfu/mms/config.json...
[12-Mar-24 14:25:53] INFO: Updating MMS SDC credentials in /Users/louisr/.config/python_keyring...

Load all data#

Load FPI data#

[3]:
n_mms_e = [mms.get_data("ne_fpi_brst_l2", tint, i) for i in range(1, 5)]
v_mms_e = [mms.get_data("ve_gse_fpi_brst_l2", tint, i) for i in range(1, 5)]
p_mms_e = [mms.get_data("pe_gse_fpi_brst_l2", tint, i) for i in range(1, 5)]

n_mms_i = [mms.get_data("ni_fpi_brst_l2", tint, i) for i in range(1, 5)]
v_mms_i = [mms.get_data("vi_gse_fpi_brst_l2", tint, i) for i in range(1, 5)]
[12-Mar-24 14:25:53] INFO: Loading mms1_des_numberdensity_brst...
[12-Mar-24 14:25:53] INFO: Loading mms2_des_numberdensity_brst...
[12-Mar-24 14:25:53] INFO: Loading mms3_des_numberdensity_brst...
[12-Mar-24 14:25:53] INFO: Loading mms4_des_numberdensity_brst...
[12-Mar-24 14:25:53] INFO: Loading mms1_des_bulkv_gse_brst...
[12-Mar-24 14:25:53] INFO: Loading mms2_des_bulkv_gse_brst...
[12-Mar-24 14:25:53] INFO: Loading mms3_des_bulkv_gse_brst...
[12-Mar-24 14:25:53] INFO: Loading mms4_des_bulkv_gse_brst...
[12-Mar-24 14:25:53] INFO: Loading mms1_des_prestensor_gse_brst...
[12-Mar-24 14:25:53] INFO: Loading mms2_des_prestensor_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms3_des_prestensor_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms4_des_prestensor_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms1_dis_numberdensity_brst...
[12-Mar-24 14:25:54] INFO: Loading mms2_dis_numberdensity_brst...
[12-Mar-24 14:25:54] INFO: Loading mms3_dis_numberdensity_brst...
[12-Mar-24 14:25:54] INFO: Loading mms4_dis_numberdensity_brst...
[12-Mar-24 14:25:54] INFO: Loading mms1_dis_bulkv_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms2_dis_bulkv_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms3_dis_bulkv_gse_brst...
[12-Mar-24 14:25:54] INFO: Loading mms4_dis_bulkv_gse_brst...

Load FGM data#

[4]:
b_mms = [mms.get_data("b_gse_fgm_brst_l2", tint, i) for i in range(1, 5)]
[12-Mar-24 14:25:54] INFO: Loading mms1_fgm_b_gse_brst_l2...
[12-Mar-24 14:25:54] INFO: Loading mms2_fgm_b_gse_brst_l2...
[12-Mar-24 14:25:54] INFO: Loading mms3_fgm_b_gse_brst_l2...
[12-Mar-24 14:25:54] INFO: Loading mms4_fgm_b_gse_brst_l2...

Load spacecraft position#

[5]:
r_mms = [mms.get_data("r_gse_mec_srvy_l2", tint_long, i) for i in range(1, 5)]
[12-Mar-24 14:25:54] INFO: Loading mms1_mec_r_gse...
[12-Mar-24 14:25:54] INFO: Loading mms2_mec_r_gse...
[12-Mar-24 14:25:54] INFO: Loading mms3_mec_r_gse...
[12-Mar-24 14:25:54] INFO: Loading mms4_mec_r_gse...

Load electric field#

[6]:
e_mms = [mms.get_data("e_gse_edp_brst_l2", tint, i) for i in range(1, 5)]
[12-Mar-24 14:25:54] INFO: Loading mms1_edp_dce_gse_brst_l2...
[12-Mar-24 14:25:55] INFO: Loading mms2_edp_dce_gse_brst_l2...
[12-Mar-24 14:25:55] INFO: Loading mms3_edp_dce_gse_brst_l2...
[12-Mar-24 14:25:56] INFO: Loading mms4_edp_dce_gse_brst_l2...

Resample and compute the 4 s/c averages#

[7]:
n_mms_e = [pyrf.resample(n_e, n_mms_e[0]) for n_e in n_mms_e]
v_mms_e = [pyrf.resample(v_xyz_e, n_mms_e[0]) for v_xyz_e in v_mms_e]
p_mms_e = [pyrf.resample(p_xyz_e, n_mms_e[0]) for p_xyz_e in p_mms_e]
n_mms_i = [pyrf.resample(n_i, n_mms_e[0]) for n_i in n_mms_i]
v_mms_i = [pyrf.resample(v_xyz_i, n_mms_e[0]) for v_xyz_i in v_mms_i]
r_mms = [pyrf.resample(r_xyz, n_mms_e[0]) for r_xyz in r_mms]
b_mms = [pyrf.resample(b_xyz, n_mms_e[0]) for b_xyz in b_mms]
e_mms = [pyrf.resample(e_xyz, n_mms_e[0]) for e_xyz in e_mms]
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[12-Mar-24 14:25:57] INFO: Using averages in resample
[8]:
n_e = pyrf.avg_4sc(n_mms_e)
b_xyz = pyrf.avg_4sc(b_mms)
e_xyz = pyrf.avg_4sc(e_mms)

Compute convection terms#

Compute ion convection term (MMS average)#

[9]:
evxb_mms_i = [
    1e-3 * pyrf.cross(v_xyz_i, b_xyz) for v_xyz_i, b_xyz in zip(v_mms_i, b_mms)
]
evxb_xyz_i = pyrf.avg_4sc(evxb_mms_i)

Compute electron convection term (MMS average)#

[10]:
evxb_mms_e = [
    1e-3 * pyrf.cross(v_xyz_e, b_xyz) for v_xyz_e, b_xyz in zip(v_mms_e, b_mms)
]
evxb_xyz_e = pyrf.avg_4sc(evxb_mms_e)

Compute pressure divergence term#

[11]:
p_mms_xx = [1e-9 * p_xyz[:, 0, 0] for p_xyz in p_mms_e]
p_mms_yy = [1e-9 * p_xyz[:, 1, 1] for p_xyz in p_mms_e]
p_mms_zz = [1e-9 * p_xyz[:, 2, 2] for p_xyz in p_mms_e]
p_mms_xy = [1e-9 * p_xyz[:, 0, 1] for p_xyz in p_mms_e]
p_mms_xz = [1e-9 * p_xyz[:, 0, 2] for p_xyz in p_mms_e]
p_mms_yz = [1e-9 * p_xyz[:, 1, 2] for p_xyz in p_mms_e]
[12]:
ep_xyz_xx = pyrf.c_4_grad(r_mms, p_mms_xx, "grad")
ep_xyz_yy = pyrf.c_4_grad(r_mms, p_mms_yy, "grad")
ep_xyz_zz = pyrf.c_4_grad(r_mms, p_mms_zz, "grad")
ep_xyz_xy = pyrf.c_4_grad(r_mms, p_mms_xy, "grad")
ep_xyz_xz = pyrf.c_4_grad(r_mms, p_mms_xz, "grad")
ep_xyz_yz = pyrf.c_4_grad(r_mms, p_mms_yz, "grad")
[13]:
ep_x = -(ep_xyz_xx[:, 0] + ep_xyz_xy[:, 1] + ep_xyz_xz[:, 2]) / (
    n_e * 1e6 * constants.elementary_charge
)
ep_y = -(ep_xyz_xy[:, 0] + ep_xyz_yy[:, 1] + ep_xyz_yz[:, 2]) / (
    n_e * 1e6 * constants.elementary_charge
)
ep_z = -(ep_xyz_xz[:, 0] + ep_xyz_yz[:, 1] + ep_xyz_zz[:, 2]) / (
    n_e * 1e6 * constants.elementary_charge
)
[14]:
ep_xyz = pyrf.ts_vec_xyz(
    ep_xyz_xx.time.data, np.vstack([ep_x.data, ep_y.data, ep_z.data]).T
)

Compute Hall term and current density using curlometer#

[15]:
j_xyz, div_b, b_xyz, jxb_xyz, div_t_shear, div_pb = pyrf.c_4_j(r_mms, b_mms)
jxb_xyz.data /= n_e.data[:, None] * constants.elementary_charge * 1e6
jxb_xyz.data *= 1e3
j_xyz.data *= 1e9
b_xyz.data *= 1e9
[16]:
e_lhs = pyrf.ts_vec_xyz(e_xyz.time.data, e_xyz.data - evxb_xyz_i.data)
e_rhs = pyrf.ts_vec_xyz(e_xyz.time.data, jxb_xyz.data + ep_xyz.data);

Plot figure#

[17]:
legend_options = dict(ncol=3, frameon=False)
[18]:
f, axs = plt.subplots(5, sharex="all", figsize=(9, 13))
f.subplots_adjust(hspace=0, left=0.1, right=0.9, bottom=0.05, top=0.95)

plot_line(axs[0], b_xyz)
plot_line(axs[0], pyrf.norm(b_xyz), color="k")
axs[0].set_ylabel("$B$ [nT]")
axs[0].legend(["$B_{x}$", "$B_{y}$", "$B_{z}$"], **legend_options)

plot_line(axs[1], j_xyz)
axs[1].set_ylabel("$J$ [nA m$^{-2}$]")
axs[1].legend(["$J_{x}$", "$J_{y}$", "$J_{z}$"], **legend_options)

plot_line(axs[2], e_xyz)
axs[2].set_ylabel("$E$ [mV m$^{-1}$]")
axs[2].legend(["$E_{x}$", "$E_{y}$", "$E_{z}$"], **legend_options)

plot_line(axs[3], e_xyz[:, 0])
plot_line(axs[3], jxb_xyz[:, 0])
plot_line(axs[3], evxb_xyz_i[:, 0])
plot_line(axs[3], ep_xyz[:, 0])
plot_line(axs[3], evxb_xyz_e[:, 0])
axs[3].set_ylabel("$E_x$ [mV m$^{-1}$]")
labels = [
    "$E$",
    "$J \\times B/q_{e}n$",
    "$-V_{i} \\times B$",
    "$-\\nabla \\cdot P_{e}/q_{e}n$",
    "$-V_{e} \\times B$",
]
axs[3].legend(labels, **legend_options)

plot_line(axs[4], e_lhs[:, 0], color="k")
plot_line(axs[4], e_rhs[:, 0], color="tab:red")
axs[4].set_ylabel("$E_x$ [mV m$^{-1}$]")
labels = ["$E+V_{i} \\times B$", "$J \\times B/q_{e}n - \\nabla \cdot P_{e}/q_{e}n$"]
axs[4].legend(labels, **legend_options)

f.suptitle("MMS - 4 Spacecraft average")
axs[-1].set_xlim(mdates.datestr2num(tint))
[18]:
(16738.219212962962, 16738.219386574074)
../../_images/examples_01_mms_example_mms_ohmslaw_31_1.png
[ ]: