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