Skip to content

Commit 8708d5f

Browse files
authored
Merge pull request #87 from StagPython/xmf
Improve performances when reading tracers and fields with HDF5 output
2 parents 4b762a1 + 2af9a36 commit 8708d5f

File tree

4 files changed

+467
-243
lines changed

4 files changed

+467
-243
lines changed

stagpy/_step.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -367,16 +367,15 @@ def _get_raw_data(self, name: str) -> Tuple[List[str], Any]:
367367
(stem, fvars) for stem, fvars in self._filesh5.items() if name in fvars
368368
]
369369
for filestem, list_fvar in files:
370+
sdat = self.step.sdat
370371
if filestem in phyvars.SFIELD_FILES_H5:
371-
xmff = "Data{}.xmf".format(
372-
"Bottom" if name.endswith("bot") else "Surface"
373-
)
372+
xmff = sdat._botxmf if name.endswith("bot") else sdat._topxmf
374373
header = self._header
375374
else:
376-
xmff = "Data.xmf"
375+
xmff = sdat._dataxmf
377376
header = None
378377
parsed_data = stagyyparsers.read_field_h5(
379-
self.step.sdat.hdf5 / xmff, filestem, self.step.isnap, header
378+
xmff, filestem, self.step.isnap, header
380379
)
381380
if parsed_data is not None:
382381
break
@@ -405,8 +404,9 @@ def _header(self) -> Optional[Dict[str, Any]]:
405404
if binfiles:
406405
header = stagyyparsers.field_header(binfiles.pop())
407406
elif self.step.sdat.hdf5:
408-
xmf = self.step.sdat.hdf5 / "Data.xmf"
409-
header = stagyyparsers.read_geom_h5(xmf, self.step.isnap)[0]
407+
header = stagyyparsers.read_geom_h5(
408+
self.step.sdat._dataxmf, self.step.isnap
409+
)
410410
return header if header else None
411411

412412
@cached_property
@@ -447,14 +447,10 @@ def __getitem__(self, name: str) -> Optional[List[ndarray]]:
447447
self.step.sdat.filename("tra", timestep=self.step.isnap, force_legacy=True)
448448
)
449449
if data is None and self.step.sdat.hdf5:
450-
position = any(axis not in self._data for axis in "xyz")
451-
self._data.update(
452-
stagyyparsers.read_tracers_h5(
453-
self.step.sdat.hdf5 / "DataTracers.xmf",
454-
name,
455-
self.step.isnap,
456-
position,
457-
)
450+
self._data[name] = stagyyparsers.read_tracers_h5(
451+
self.step.sdat._traxmf,
452+
name,
453+
self.step.isnap,
458454
)
459455
elif data is not None:
460456
self._data.update(data)

stagpy/stagyydata.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from . import _helpers, _step, conf, error, parfile, phyvars, stagyyparsers
2323
from ._step import Step
2424
from .datatypes import Rprof, Tseries, Vart
25+
from .stagyyparsers import FieldXmf, TracersXmf
2526

2627
if typing.TYPE_CHECKING:
2728
from os import PathLike
@@ -794,6 +795,34 @@ def hdf5(self) -> Optional[Path]:
794795
h5_folder = self.path / self.par["ioin"]["hdf5_output_folder"]
795796
return h5_folder if (h5_folder / "Data.xmf").is_file() else None
796797

798+
@cached_property
799+
def _dataxmf(self) -> FieldXmf:
800+
assert self.hdf5 is not None
801+
return FieldXmf(
802+
path=self.hdf5 / "Data.xmf",
803+
)
804+
805+
@cached_property
806+
def _topxmf(self) -> FieldXmf:
807+
assert self.hdf5 is not None
808+
return FieldXmf(
809+
path=self.hdf5 / "DataSurface.xmf",
810+
)
811+
812+
@cached_property
813+
def _botxmf(self) -> FieldXmf:
814+
assert self.hdf5 is not None
815+
return FieldXmf(
816+
path=self.hdf5 / "DataBottom.xmf",
817+
)
818+
819+
@cached_property
820+
def _traxmf(self) -> TracersXmf:
821+
assert self.hdf5 is not None
822+
return TracersXmf(
823+
path=self.hdf5 / "DataTracers.xmf",
824+
)
825+
797826
@property
798827
def par(self) -> Namelist:
799828
"""Content of par file.

0 commit comments

Comments
 (0)