%load_ext autoreload
%autoreload 2
Analysis
import matplotlib.pyplot as plt
import yt
from rich import print
from icecream import ic
import panel as pn
from yt.data_objects.time_series import SimulationTimeSeries
from yt.data_objects.static_output import Dataset
from utils.plot import *
from main import setup
= 1
dim = 0.25
beta = 60.0
theta = 10.0
eta
= setup(dim, beta, theta, eta) meta
Fields
from utils import load_ts_all
= load_ts_all(meta) ts_field, ts_part
len(ts_field))
ic(= ts_field[-1]
ds_field: Dataset = ts_part[0] ds_part: Dataset
ic| len(ts_field): 101
ds_part.field_list
[('all', 'particle_cpu'),
('all', 'particle_id'),
('all', 'particle_momentum_x'),
('all', 'particle_momentum_y'),
('all', 'particle_momentum_z'),
('all', 'particle_position_x'),
('all', 'particle_weight'),
('ions', 'particle_cpu'),
('ions', 'particle_id'),
('ions', 'particle_momentum_x'),
('ions', 'particle_momentum_y'),
('ions', 'particle_momentum_z'),
('ions', 'particle_position_x'),
('ions', 'particle_weight'),
('nbody', 'particle_cpu'),
('nbody', 'particle_id'),
('nbody', 'particle_momentum_x'),
('nbody', 'particle_momentum_y'),
('nbody', 'particle_momentum_z'),
('nbody', 'particle_position_x'),
('nbody', 'particle_weight')]
= "ions"
ps = (ps, "particle_weight")
_part_weight_field
= yt.ParticlePlot(
p 'ions', 'particle_position_x'), [('ions', 'particle_momentum_y'), ("ions", "particle_momentum_z")],
ds_part, (=_part_weight_field
z_fields
)= 'all', log=False) p.set_log(field
Archive
yt
= yt.load('diags/diag1??????')
ts: SimulationTimeSeries # ts = yt.load('./diags/diag???0032')
def plot(ds, normalize = True, **kwargs):
= ds.all_data()
ad = ["Bx", "By", "Bz"]
fields
match meta["dim"]:
case 1: pos = "x"
case 2: pos = "y"
= ad[pos]
pos
if normalize:
= pos / meta['d_i']
pos
for field in fields:
=field, **kwargs)
plt.plot(pos, ad[field], label
"x ($d_i$)") plt.xlabel(
for i, part_df in enumerate(ts):
= (i + 1) / (len(ts)+1)
alpha =alpha)
plot(part_df, alpha# Show each plot separately plt.show()
= 4
i = ts[0:i]
_ts for i, part_df in enumerate(_ts):
= (i + 1) / (len(_ts)+1)
alpha =alpha)
plot(part_df, alpha# Show each plot separately plt.show()
"z", ("boxlib", "Bz")) yt.SlicePlot(part_df,
part_df.all_data()
= [
fields "Bx"),
("By"),
("Bz"),
("mesh", "magnetic_field_strength"),
( ]
for part_df in ts.piter():
= yt.plot_2d(part_df, fields=fields)
p False)
p.set_log(fields, = p.export_to_mpl_figure((2, 2))
fig
fig.tight_layout()f"figures/{part_df}_magnetic_field.png") fig.savefig(
Average magnetic field
def plot_avg(ds):
= [
fields "Bx"),
("By"),
("Bz"),
(
]
= ds.all_data()
ad = ad.to_dataframe(fields + ["x", zaxis])
df # compute the magnetic field strength
= df.assign(B=lambda x: (x.Bx**2 + x.By**2 + x.Bz**2) ** 0.5)
df
= df.groupby(zaxis).mean().plot(y=fields + ["B"], subplots=True)
axes return axes[0].figure
def plot_avg_ts(i):
return plot_avg(ts[i])
= pn.widgets.IntSlider(name="Time", value=1, start=0, end=len(ts)-1)
time_widget = pn.bind(plot_avg_ts, i=time_widget)
bound_plot
pn.Column(time_widget, bound_plot)
NameError: name 'ts' is not defined
for part_df in ts.piter():
plot_avg(part_df)
part_df.print_stats()print(part_df.field_list)
= part_df.r[:,:,:]
grid = grid.to_xarray(fields=fields) obj