Skip to content

File hdf5timeseries.h

File List > code_source > templat > include > TempLat > lattice > IO > HDF5 > helpers > hdf5timeseries.h

Go to the documentation of this file

#ifndef TEMPLAT_LATTICE_IO_HDF5_HELPERS_HDF5TIMESERIES_H
#define TEMPLAT_LATTICE_IO_HDF5_HELPERS_HDF5TIMESERIES_H

/* This file is part of TempLat, available at https://cosmolattice.github.io/templat .
   Copyright 2021-2026 The TempLat authors, see AUTHORS.md.
   Released under the MIT license, see LICENSE.md. */

// File info: Main contributor(s): Adrien Florio, Year: 2025

#ifdef HAVE_HDF5

#include "TempLat/lattice/IO/HDF5/helpers/hdf5dataset.h"
#include "TempLat/util/flattenstd.h"

namespace TempLat
{

  template <typename T> class HDF5TimeSeries : public HDF5Dataset
  {
  public:
    HDF5TimeSeries() : HDF5Dataset(), count(0), curOffset(0) {}

    HDF5TimeSeries(const hid_t &id) : HDF5Dataset(id), count(0), curOffset(0) {}

    HDF5TimeSeries(hid_t &&id) : HDF5Dataset(std::move(id)), count(0), curOffset(0) {}

    void push(const T &elem)
    {
      cache.emplace_back(elem);
      ++count;
    }

    template <typename U> void push(const std::vector<U> &elem)
    {
      std::vector<T> flat = flatten(elem);
      cache.insert(cache.end(), flat.begin(), flat.end());
      count += 1;
    }

    void flush(bool amIRoot)
    {
      std::vector<hsize_t> curSizes = getSizes();
      std::vector<hsize_t> subDims(curSizes);
      std::vector<hsize_t> offsets(curSizes.size());

      subDims[0] = count;
      offsets[0] = curOffset;

      writeSlices(cache, subDims, offsets, amIRoot);
      cache.clear();
      curOffset += count;
      count = 0;
    }

    void extend(hsize_t extra)
    {
      std::vector<hsize_t> curSizes = getSizes();
      std::vector<hsize_t> newSizes(curSizes);
      newSizes[0] += extra;

      H5Dset_extent(mId, newSizes.data());
    }

    void setOffset(hsize_t o) { curOffset = o; }

  private:
    std::vector<T> cache;
    hsize_t count, curOffset;
  };

} // namespace TempLat

#endif

#endif