Plots#

Plot 1D Density#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/1_1_drifting_bunch")

ds = sdfxr.open_dataset(input_dir / "0000.sdf")
ds = ds.epoch.rescale_coords(1e6, "µm", ["X_Grid_mid"])

ds["Derived_Number_Density"].epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "number_density.png", dpi=300)
np.savetxt(input_dir / "number_density_vals.txt", ds["Derived_Number_Density"].values)
np.savetxt(input_dir / "number_density_x.txt", ds["X_Grid_mid"].values)
../_images/eaca928964fde9933c15c634be6105e637254e55d1f80e6c717b21ef13da3f9b.png

Plot 1D Poynting Flux#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/3_3_Gaussian_1d_laser")

ds = sdfxr.open_dataset(input_dir / "0020.sdf")

# Convert the x and y coords to microns
ds = ds.epoch.rescale_coords(1e6, "µm", ["X_Grid_mid"])

# Calculate Poynting flux magnitude
flux_magnitude = np.sqrt(
    ds["Derived_Poynting_Flux_x"] ** 2
    + ds["Derived_Poynting_Flux_y"] ** 2
    + ds["Derived_Poynting_Flux_z"] ** 2
)

# convert to W/cm^2
I_Wcm2 = flux_magnitude * 1e-4
I_Wcm2.attrs["long_name"] = "Poynting Flux Magnitude"
I_Wcm2.attrs["units"] = "W/cm$^2$"

I_Wcm2.epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "intensity.png", dpi=300)
np.savetxt(input_dir / "intensity_vals.txt", I_Wcm2.values)
np.savetxt(input_dir / "intensity_x.txt", ds["X_Grid_mid"].values)
../_images/3ce4a5eb4963c5e07c901b048438f04b79f0005a492b0c50de9eb40af2bc510d.png

Plot 2D Density#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/4_3_basic_target")

ds = sdfxr.open_dataset(input_dir / "0000.sdf")
ds = ds.epoch.rescale_coords(1e6, "µm", ["X_Grid_mid", "Y_Grid_mid"])

ds["Derived_Number_Density"].epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "number_density.png", dpi=300)
np.savetxt(input_dir / "number_density_vals.txt", ds["Derived_Number_Density"].values)
np.savetxt(input_dir / "number_density_x.txt", ds["X_Grid_mid"].values)
../_images/22e6f66a585a01e11eaac08d0ef82a457dff7dd91dfcbe6d898e451ab324f6bc.png

Plot 2D Distribution Function Multispecies#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/2_1_two_stream_instability")
ds = sdfxr.open_dataset(input_dir / "0000.sdf")

ds = ds.epoch.rescale_coords(1e-3, "km", ["X_x_px_Left"])

# Sum phase-space of species "Left" and "Right" in "x_px" distribution function
# NOTE: We only use the values from the right distribution function as if we inherit
# the coords we from the right we end up with 4 coords instead of 2
total_phase_space = ds["dist_fn_x_px_Left"] + ds["dist_fn_x_px_Right"].values
total_phase_space.attrs["long_name"] = "Summed Particle Weight Per Bin"
total_phase_space.attrs["units"] = ""

total_phase_space.epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "phase_space.png", dpi=300)
np.savetxt(input_dir / "phase_space_vals.txt", total_phase_space.values)
np.savetxt(input_dir / "phase_space_x.txt", ds["X_x_px_Left"].values)
np.savetxt(input_dir / "phase_space_y.txt", ds["Px_x_px_Left"].values)
../_images/03029f50494a571c15e64ab544d64884cbbf5d8bdf9be46491b5184542bbc901.png

Plot 2D Poynting Flux#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/3_5_Gaussian_beam")

ds = sdfxr.open_dataset(input_dir / "0001.sdf")

# Convert the x and y coords to microns
ds = ds.epoch.rescale_coords(1e6, "µm", ["X_Grid_mid", "Y_Grid_mid"])

# Calculate Poynting flux magnitude
flux_magnitude = np.sqrt(
    ds["Derived_Poynting_Flux_x"] ** 2
    + ds["Derived_Poynting_Flux_y"] ** 2
    + ds["Derived_Poynting_Flux_z"] ** 2
)

# convert to W/cm^2
I_Wcm2 = flux_magnitude * 1e-4
I_Wcm2.attrs["long_name"] = "Poynting Flux Magnitude"
I_Wcm2.attrs["units"] = "W/cm$^2$"

I_Wcm2.epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "intensity.png", dpi=300)
np.savetxt(input_dir / "intensity_vals.txt", I_Wcm2.values)
np.savetxt(input_dir / "intensity_x.txt", ds["X_Grid_mid"].values)
np.savetxt(input_dir / "intensity_y.txt", ds["Y_Grid_mid"].values)
../_images/661667ec10eb57623e1fb8ab7d07fd6ea99517172b685bccb4c0da75fb5b37eb.png

Plot Time vs Temperature#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

# Constants
kB = 1.380649e-23
q0 = 1.60217663e-19

input_dir = Path("datasets/4_2_self_heating")
ds = sdfxr.open_mfdataset(input_dir)

# Convert the time to femtoseconds
ds = ds.epoch.rescale_coords(1e15, "fs", "time")

# Averate temperature over all spatial cells at each time-step
kB = 1.380649e-23
q0 = 1.60217663e-19

temp_ev = ds["Derived_Temperature"].mean(dim=("X_Grid_mid", "Y_Grid_mid")) * kB / q0

temp_ev.epoch.plot()
plt.tight_layout()

plt.savefig(input_dir / "temperature_time.png", dpi=300)
np.savetxt(input_dir / "temperature_time_time.txt", temp_ev["time"].values)
np.savetxt(input_dir / "temperature_time_temperature.txt", temp_ev.values)
../_images/1c4b700ecab2ad834cd010d0a6960bfc6b71e8f13036082744578287147f41cc.png

Plot X vs Px Scatter#

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np

import sdf_xarray as sdfxr

input_dir = Path("datasets/5_2_subsets")
ds = sdfxr.open_dataset(input_dir / "0000.sdf", keep_particles=True)

ds = ds.epoch.rescale_coords(
    1e6, "µm", ["X_Particles_subset_Refluxers_Electron", "Y_Target_mid"]
)

x = ds["X_Particles_subset_Refluxers_Electron"]
px = ds["Particles_Px_subset_Refluxers_Electron"]

plt.scatter(x, px)
plt.xlabel("x [µm]")
plt.ylabel("Px [kg.m/s]")

plt.savefig(input_dir / "x_px.png", dpi=300)
np.savetxt(input_dir / "x_px_vals.txt", px.values)
np.savetxt(input_dir / "x_px_x.txt", x.values)
../_images/41f1941a2909eb08b2e5c919eeb451cbf09d1fff4bc11ebc097fba58524a7a0b.png