Source code for xgc_analysis.DiffusionProfiles

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)