import numpy as np
from adios2 import FileReader
[docs]
class DiffusionProfiles:
"""
Reads diffusion profile data from an Adios BP file (directory) "xgc.diffusion_profiles.bp".
The file has the following structure:
double density n_steps*{n_species, n_samples, n_surf}
double flow n_steps*{n_species, n_samples, n_surf}
double temp n_steps*{n_species, n_samples, n_surf}
int32_t n_samples n_steps*scalar
int32_t n_species n_steps*scalar
int32_t n_surf n_steps*scalar
double psi n_steps*{n_surf}
int32_t steps n_steps*{n_samples}
double time n_steps*{n_samples}
That is, there are (for example) n_steps steps recorded in the BP file. The constructor of this class
reads only the last step (i.e. the most recent one).
Attributes:
density : A 3D array (shape (n_species, n_samples, n_surf)) of the diffusion density.
flow : A 3D array (shape (n_species, n_samples, n_surf) of the parallel mean flow.
temp : A 3D array (shape (n_species, n_samples, n_surf)) of temperature (in eV).
n_samples : An integer (n_samples) representing the number of time samples.
n_species : An integer (default 2) representing the number of particle species.
n_surf : An integer (n_surf) representing the number of ψ-surfaces.
psi : A 1D array (shape (n_surf,)) containing the poloidal magnetic flux values.
steps : A 1D array (shape (n_samples,)) of time step indices.
time : A 1D array (shape (n_samples,)) of simulation times (in seconds).
"""
def __init__(self, filename="xgc.diffusion_profiles.bp"):
with FileReader(filename) as reader:
# Access the variable information to determine the total number of steps.
vars_info = reader.available_variables()
# Assuming 'density' is present (and is of type `double), its AvailableStepsCount indicates the number of steps.
n_steps = int(vars_info["density"]["AvailableStepsCount"])
last_step = n_steps - 1
# Read only the last step for each variable.
# The step_selection parameter is given as [start_step, num_steps].
self.density = reader.read("density", step_selection=[last_step, 1])
self.flow = reader.read("flow", step_selection=[last_step, 1])
self.n_samples = int(reader.read("n_samples", step_selection=[last_step, 1]).item())
self.n_species = int(reader.read("n_species", step_selection=[last_step, 1]).item())
self.n_surf = int(reader.read("n_surf", step_selection=[last_step, 1]).item())
self.psi = reader.read("psi", step_selection=[last_step, 1])
self.steps = reader.read("steps", step_selection=[last_step, 1])
self.temp = reader.read("temp", step_selection=[last_step, 1])
self.time = reader.read("time", step_selection=[last_step, 1])
def __repr__(self):
return (f"DiffusionProfiles(n_species={self.n_species}, n_samples={self.n_samples}, "
f"n_surf={self.n_surf}, density.shape={self.density.shape}, "
f"psi.shape={self.psi.shape})")
# ------------------------------------------------------------------------------
# Example usage:
# ------------------------------------------------------------------------------
if __name__ == "__main__":
# Create an instance of DiffusionProfiles from xgc.diffusion_profiles.bp.
diff_profiles = DiffusionProfiles("xgc.diffusion_profiles.bp")
# Print some details.
print("DiffusionProfiles read from file:")
print(diff_profiles)
# For example, check the shape of the temperature array.
print("Temperature data shape:", diff_profiles.temp.shape)
# Check simulation time values.
print("Time steps:", diff_profiles.time)