Source code for pyro.util.io_pyro
"""This manages the reading of the HDF5 output files for pyro.
"""
import importlib
import h5py
import pyro.mesh.boundary as bnd
from pyro.mesh.patch import Cartesian2d, CellCenterData2d, SphericalPolar
from pyro.particles import particles
[docs]
def read_bcs(f):
"""read in the boundary condition record from the HDF5 file"""
try:
gb = f["BC"]
except KeyError:
return None
BCs = {}
for name in gb:
BCs[name] = gb[name]
return BCs
[docs]
def read(filename):
"""read an HDF5 file and recreate the simulation object that holds the
data and state of the simulation.
"""
if not filename.endswith(".h5"):
filename += ".h5"
with h5py.File(filename, "r") as f:
# read the simulation information -- this only exists if the
# file was created as a simulation object
try:
solver_name = f.attrs["solver"]
problem_name = f.attrs["problem"]
t = f.attrs["time"]
n = f.attrs["nsteps"]
except KeyError:
# this was just a patch written out
solver_name = None
# read in the grid info and create our grid
grid = f["grid"].attrs
try:
coord_type = grid["coord_type"]
except KeyError:
coord_type = 0
if coord_type == 1:
grid_class = SphericalPolar
else:
grid_class = Cartesian2d
myg = grid_class(grid["nx"], grid["ny"], ng=grid["ng"],
xmin=grid["xmin"], xmax=grid["xmax"],
ymin=grid["ymin"], ymax=grid["ymax"])
# sometimes problems define custom BCs -- at the moment, we
# are going to assume that these always map to BC.user. We
# need to read these in now, since the variable creation
# requires it.
custom_bcs = read_bcs(f)
if custom_bcs is not None:
if solver_name in ["compressible_fv4", "compressible_rk", "compressible_sdc"]:
bc_solver = "compressible"
else:
bc_solver = solver_name
bcmod = importlib.import_module(f"pyro.{bc_solver}.BC")
for name, is_solid in custom_bcs.items():
bnd.define_bc(name, bcmod.user, is_solid=is_solid)
# read in the variable info -- start by getting the names
gs = f["state"]
names = []
for n in gs:
names.append(n)
# create the CellCenterData2d object
myd = CellCenterData2d(myg)
for n in names:
grp = gs[n]
bc = bnd.BC(xlb=grp.attrs["xlb"], xrb=grp.attrs["xrb"],
ylb=grp.attrs["ylb"], yrb=grp.attrs["yrb"])
myd.register_var(n, bc)
myd.create()
# auxiliary data
for k in f["aux"].attrs:
myd.set_aux(k, f["aux"].attrs[k])
# restore the variable data
for n in names:
grp = gs[n]
data = grp["data"]
v = myd.get_var(n)
v.v()[:, :] = data[:, :]
# restore the particle data
try:
gparticles = f["particles"]
particle_data = gparticles["particle_positions"]
init_data = gparticles["init_particle_positions"]
my_particles = particles.Particles(myd, None, len(particle_data),
"array", particle_data, init_data)
except KeyError:
my_particles = None
if solver_name is not None:
solver = importlib.import_module(f"pyro.{solver_name}")
sim = solver.Simulation(solver_name, problem_name, None, None)
sim.n = n
sim.cc_data = myd
sim.cc_data.t = t
sim.particles = my_particles
sim.read_extras(f)
# check if there are derived variables
try:
derives = importlib.import_module(f"pyro.{solver_name}.derives")
sim.cc_data.add_derived(derives.derive_primitives)
except ModuleNotFoundError:
pass
if solver_name is not None:
return sim
return myd