Skip to content
Snippets Groups Projects
Select Git revision
  • f10255b1fdc0af8aca93cca46797d9d9ec45b530
  • develop default protected
  • feature/kinetic-schemes
  • feature/reconstruction
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/variational-hydro
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • feature/escobar-smoother
  • feature/hypoelasticity-clean
  • feature/hypoelasticity
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

WriterBase.hpp

Blame
  • 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