Select Git revision
WriterBase.hpp
-
Stéphane Del Pino authored
Replace instances of -std::numeric_limits<T>::max() by std::numeric_limits<T>::lowest() which is more generic
Stéphane Del Pino authoredReplace instances of -std::numeric_limits<T>::max() by std::numeric_limits<T>::lowest() which is more generic
WriterBase.hpp 4.51 KiB
#ifndef WRITER_BASE_HPP
#define WRITER_BASE_HPP
#include <output/IWriter.hpp>
#include <utils/PugsAssert.hpp>
#include <limits>
#include <optional>
#include <string>
class MeshVariant;
class OutputNamedItemDataSet;
class NamedDiscreteFunction;
class WriterBase : public IWriter
{
public:
class PeriodManager
{
private:
const double m_time_period;
mutable double m_next_time;
mutable std::vector<double> m_saved_times;
public:
double
timePeriod() const
{
return m_time_period;
}
double
nextTime() const
{
return m_next_time;
}
void
setNextTime(double next_time)
{
m_next_time = next_time;
}
size_t
nbSavedTimes() const
{
return m_saved_times.size();
}
double
savedTime(size_t i) const
{
Assert(i < m_saved_times.size());
return m_saved_times[i];
}
double
getLastTime() const
{
if (m_saved_times.size() > 0) {
return m_saved_times[m_saved_times.size() - 1];
} else {
return std::numeric_limits<double>::lowest();
}
}
void
setSaveTime(double time) const
{
if (m_saved_times.size() == 0) {
m_next_time = time;
}
m_next_time += m_time_period;
m_saved_times.push_back(time);
}
PeriodManager(const PeriodManager&) = default;
PeriodManager(PeriodManager&&) = default;
PeriodManager(double time_period) : m_time_period{time_period}, m_next_time{std::numeric_limits<double>::lowest()}
{}
};
protected:
const std::string m_base_filename;
std::optional<PeriodManager> m_period_manager;
mutable std::optional<std::string> m_signature;
private:
void _checkSignature(const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const;
template <typename DiscreteFunctionType>
static void _registerDiscreteFunction(const std::string& name, const DiscreteFunctionType&, OutputNamedItemDataSet&);
protected:
void _checkConnectivity(const std::shared_ptr<const MeshVariant>& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const;
void _checkMesh(const std::shared_ptr<const MeshVariant>& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const;
std::shared_ptr<const MeshVariant> _getMesh(
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const;
OutputNamedItemDataSet _getOutputNamedItemDataSet(
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const;
virtual void _writeAtTime(const MeshVariant& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list,
double time) const = 0;
virtual void _write(const MeshVariant& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const = 0;
virtual void _writeMesh(const MeshVariant& mesh_v) const = 0;
public:
void write(const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const final;
void writeIfNeeded(const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list,
double time) const final;
void writeForced(const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list,
double time) const final;
void writeOnMesh(const std::shared_ptr<const MeshVariant>& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list) const final;
void writeOnMeshIfNeeded(const std::shared_ptr<const MeshVariant>& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list,
double time) const final;
void writeOnMeshForced(const std::shared_ptr<const MeshVariant>& mesh_v,
const std::vector<std::shared_ptr<const INamedDiscreteData>>& named_discrete_data_list,
double time) const final;
void writeMesh(const std::shared_ptr<const MeshVariant>& mesh_v) const final;
void writeMesh(const MeshVariant& mesh_v) const final;
WriterBase() = delete;
WriterBase(const std::string& base_filename, const double& time_period);
WriterBase(const std::string& base_filename);
virtual ~WriterBase() = default;
};
#endif // WRITER_BASE_HPP