Skip to content

File measurementssaver.h

File List > code_source > cosmolattice > include > CosmoInterface > measurements > measurementsIO > measurementssaver.h

Go to the documentation of this file

#ifndef COSMOINTERFACE_MEASUREMENTSSAVER_H
#define COSMOINTERFACE_MEASUREMENTSSAVER_H

/* This file is part of CosmoLattice, available at www.cosmolattice.net .
   Copyright Daniel G. Figueroa, Adrien Florio, Francisco Torrenti and Wessel Valkenburg.
   Released under the MIT license, see LICENSE.md. */

// File info: Main contributor(s): Daniel G. Figueroa, Adrien Florio, Francisco Torrenti,  Year: 2019

#include "TempLat/util/conditionaloutput/outputstream.h"
#include <sstream>
#include "CosmoInterface/measurements/measurementsIO/std/measurementssaverstd.h"
#ifdef HAVE_HDF5
#include "CosmoInterface/measurements/measurementsIO/hdf5/measurementssaverhdf5.h"
#endif

namespace TempLat
{
  template <typename T> class MeasurementsSaver
  {
  public:
    // @label:measurementssaver_constructor
    template <size_t NDim>
    MeasurementsSaver(FilesManager<NDim> &fm, std::string fn, bool amIRoot, bool appendMode,
                      const std::vector<std::string> &headers = {}, bool dontCreate = false, bool saveInfreq = false)
        : printHeaders(fm.getPrintHeaders()), useHDF5(fm.getUseHDF5())
    {
      if (!dontCreate) {
        if (!useHDF5)
          ms = std::make_shared<MeasurementsSaverStd<T>>(fm, fn, amIRoot, appendMode, headers);
        else {
#ifdef HAVE_HDF5
          ms5 = std::make_shared<MeasurementsSaverHDF5<T>>(fm, fn, amIRoot, appendMode, headers, saveInfreq);
#else
          throw(UseHDF5ButNotCompiled(
              "Call to use HDF5 for the measurementsIO output, but compiled without HDF5 option."));
#endif
        }
        IExist = true;
      } else
        IExist = false;
    }
    // @endlabel

    template <size_t NDim>
    MeasurementsSaver(FilesManager<NDim> &fm, const Field<T, NDim> &fld, bool amIRoot, bool appendMode,
                      const std::vector<std::string> &headers = {}, bool dontCreate = false, bool saveInfreq = false)
        : printHeaders(fm.getPrintHeaders()), useHDF5(fm.getUseHDF5())
    {
      if (!dontCreate) {
        if (!useHDF5)
          ms = std::make_shared<MeasurementsSaverStd<T>>(fm, fld, amIRoot, appendMode, headers);
        else {
#ifdef HAVE_HDF5
          ms5 = std::make_shared<MeasurementsSaverHDF5<T>>(fm, fld, amIRoot, appendMode, headers, saveInfreq);
#else
          throw(UseHDF5ButNotCompiled(
              "Call to use HDF5 for the measurementsIO output, but compiled without HDF5 option."));
#endif
        }
        IExist = true;
      } else
        IExist = false;
    }

    void addAverage(const T &r)
    {
      if (IExist) {
        if (!useHDF5)
          ms->addAverage(r);
        else {
#ifdef HAVE_HDF5
          ms5->addAverage(r);
#endif
        }
      }
    }

    // @label:measurementssaver_save
    void save(bool lastMeas = false)
    {
      if (IExist) {
        if (!useHDF5)
          ms->save();
        else {
#ifdef HAVE_HDF5
          ms5->save(lastMeas);
#endif
        }
      }
    }
    // @endlabel

  private:
    std::shared_ptr<MeasurementsSaverStd<T>> ms;
#ifdef HAVE_HDF5
    std::shared_ptr<MeasurementsSaverHDF5<T>> ms5;
#endif
    bool IExist;
    bool printHeaders;
    bool useHDF5;
  };

} // namespace TempLat

#endif