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