Skip to content
Snippets Groups Projects
Select Git revision
  • 9420b74f1337d94a54312618b1dd4367a1273496
  • develop default protected
  • feature/advection
  • feature/composite-scheme-other-fluxes
  • origin/stage/bouguettaia
  • save_clemence
  • feature/local-dt-fsi
  • feature/variational-hydro
  • feature/gmsh-reader
  • feature/reconstruction
  • feature/kinetic-schemes
  • feature/composite-scheme-sources
  • feature/serraille
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • 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

DualConnectivityManager.hpp

Blame
  • DualConnectivityManager.hpp 3.71 KiB
    #ifndef DUAL_CONNECTIVITY_MANAGER_HPP
    #define DUAL_CONNECTIVITY_MANAGER_HPP
    
    #include <mesh/DualMeshType.hpp>
    #include <mesh/IConnectivity.hpp>
    #include <mesh/IConnectivityToDualConnectivityDataMapper.hpp>
    
    #include <memory>
    #include <unordered_map>
    
    template <size_t Dimension>
    class Connectivity;
    
    template <size_t Dimension>
    class ConnectivityToDiamondDualConnectivityDataMapper;
    
    template <size_t Dimension>
    class ConnectivityToMedianDualConnectivityDataMapper;
    
    class DualConnectivityManager
    {
     private:
      class DualConnectivityInfo
      {
       private:
        std::shared_ptr<const IConnectivity> m_dual_connectivity;
        std::shared_ptr<const IConnectivityToDualConnectivityDataMapper> m_connectivity_to_dual_connectivity_data_mapper;
    
       public:
        PUGS_INLINE
        std::shared_ptr<const IConnectivity>
        dualConnectivity() const
        {
          return m_dual_connectivity;
        }
    
        PUGS_INLINE
        std::shared_ptr<const IConnectivityToDualConnectivityDataMapper>
        connectivityToDualConnectivityDataMapper()
        {
          return m_connectivity_to_dual_connectivity_data_mapper;
        }
    
        DualConnectivityInfo& operator=(const DualConnectivityInfo&) = default;
        DualConnectivityInfo& operator=(DualConnectivityInfo&&) = delete;
    
        DualConnectivityInfo()                            = default;
        DualConnectivityInfo(const DualConnectivityInfo&) = default;
        DualConnectivityInfo(DualConnectivityInfo&&)      = delete;
    
        DualConnectivityInfo(const std::shared_ptr<const IConnectivity>& dual_connectivity,
                             const std::shared_ptr<const IConnectivityToDualConnectivityDataMapper>&
                               connectivity_to_dual_connectivity_data_mapper)
          : m_dual_connectivity{dual_connectivity},
            m_connectivity_to_dual_connectivity_data_mapper{connectivity_to_dual_connectivity_data_mapper}
        {}
    
        ~DualConnectivityInfo() = default;
      };
    
      using Key = std::pair<DualMeshType, const IConnectivity*>;
      struct HashKey
      {
        size_t
        operator()(const Key& key) const
        {
          return (std::hash<typename Key::first_type>()(key.first)) ^ (std::hash<typename Key::second_type>()(key.second));
        }
      };
    
      template <typename DualConnectivityBuilderType>
      DualConnectivityInfo _buildDualConnectivity(const Key& key, const IConnectivity& connectivity);
    
      DualConnectivityInfo _getDualConnectivityInfo(const DualMeshType& type, const IConnectivity& connectivity);
    
      std::unordered_map<Key, DualConnectivityInfo, HashKey> m_connectivity_to_dual_connectivity_info_map;
    
      static DualConnectivityManager* m_instance;
    
      DualConnectivityManager(const DualConnectivityManager&) = delete;
      DualConnectivityManager(DualConnectivityManager&&)      = delete;
    
      DualConnectivityManager()  = default;
      ~DualConnectivityManager() = default;
    
     public:
      static void create();
      static void destroy();
    
      PUGS_INLINE
      static DualConnectivityManager&
      instance()
      {
        Assert(m_instance != nullptr, "DualConnectivityManager was not created!");
        return *m_instance;
      }
    
      void deleteConnectivity(const IConnectivity*);
    
      template <size_t Dimension>
      std::shared_ptr<const Connectivity<Dimension>> getMedianDualConnectivity(const Connectivity<Dimension>&);
    
      template <size_t Dimension>
      std::shared_ptr<const ConnectivityToMedianDualConnectivityDataMapper<Dimension>>
      getConnectivityToMedianDualConnectivityDataMapper(const Connectivity<Dimension>&);
    
      template <size_t Dimension>
      std::shared_ptr<const Connectivity<Dimension>> getDiamondDualConnectivity(const Connectivity<Dimension>&);
    
      template <size_t Dimension>
      std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>
      getConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<Dimension>&);
    };
    
    #endif   // DUAL_CONNECTIVITY_MANAGER_HPP