Skip to content
Snippets Groups Projects
Select Git revision
  • 97f3bdeaafb82018ef2e69169f9fd98c6141013f
  • develop default protected
  • feature/variational-hydro
  • origin/stage/bouguettaia
  • feature/gmsh-reader
  • feature/reconstruction
  • save_clemence
  • feature/kinetic-schemes
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • 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
  • master protected
  • 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

DiamondDualConnectivityManager.cpp

Blame
  • Stephane Del Pino's avatar
    Stéphane Del Pino authored
    Is is now built while building diamond dual connectivity
    
    Some work is still needed, one has to define mapper structures while
    building connectivity to avoid (future) incoherence and to give it
    flexibility (renumbering an probably helpful for parallelism)
    97f3bdea
    History
    DiamondDualConnectivityManager.cpp 3.85 KiB
    #include <utils/PugsAssert.hpp>
    
    #include <mesh/Connectivity.hpp>
    #include <mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp>
    #include <mesh/DiamondDualConnectivityBuilder.hpp>
    #include <mesh/DiamondDualConnectivityManager.hpp>
    #include <utils/Exceptions.hpp>
    
    #include <sstream>
    
    DiamondDualConnectivityManager* DiamondDualConnectivityManager::m_instance{nullptr};
    
    void
    DiamondDualConnectivityManager::create()
    {
      Assert(m_instance == nullptr, "DiamondDualConnectivityManager is already created");
      m_instance = new DiamondDualConnectivityManager;
    }
    
    void
    DiamondDualConnectivityManager::destroy()
    {
      Assert(m_instance != nullptr, "DiamondDualConnectivityManager was not created!");
    
      if (m_instance->m_connectivity_to_diamond_dual_connectivity_info_map.size() > 0) {
        std::stringstream error;
        error << ": some connectivities are still registered\n";
        for (const auto& [connectivity, diamond_dual_connectivity_info] :
             m_instance->m_connectivity_to_diamond_dual_connectivity_info_map) {
          error << " - connectivity " << rang::fgB::magenta << connectivity << rang::style::reset << '\n';
        }
        throw UnexpectedError(error.str());
      }
      delete m_instance;
      m_instance = nullptr;
    }
    
    void
    DiamondDualConnectivityManager::deleteConnectivity(const IConnectivity* p_connectivity)
    {
      m_connectivity_to_diamond_dual_connectivity_info_map.erase(p_connectivity);
    }
    
    DiamondDualConnectivityManager::DiamondDualConnectivityInfo
    DiamondDualConnectivityManager::_getDiamondDualConnectivityInfo(const IConnectivity& connectivity)
    {
      const IConnectivity* p_connectivity = &connectivity;
    
      if (auto i_connectivity = m_connectivity_to_diamond_dual_connectivity_info_map.find(p_connectivity);
          i_connectivity != m_connectivity_to_diamond_dual_connectivity_info_map.end()) {
        return i_connectivity->second;
      } else {
        DiamondDualConnectivityBuilder builder{connectivity};
    
        DiamondDualConnectivityInfo connectivity_info{builder.connectivity(), builder.mapper()};
    
        m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] = connectivity_info;
    
        return connectivity_info;
      }
    }
    
    template <size_t Dimension>
    std::shared_ptr<const Connectivity<Dimension>>
    DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& connectivity)
    {
      return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
        this->_getDiamondDualConnectivityInfo(connectivity).diamondDualConnectivity());
    }
    
    template <size_t Dimension>
    std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>
    DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(
      const Connectivity<Dimension>& connectivity)
    {
      return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
        this->_getDiamondDualConnectivityInfo(connectivity).connectivityToDiamondDualConnectivityDataMapper());
    }
    
    template std::shared_ptr<const Connectivity<1>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
      const Connectivity<1>& connectivity);
    
    template std::shared_ptr<const Connectivity<2>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
      const Connectivity<2>& connectivity);
    
    template std::shared_ptr<const Connectivity<3>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
      const Connectivity<3>& connectivity);
    
    template std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<1>>
    DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<1>&);
    
    template std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<2>>
    DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<2>&);
    
    template std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<3>>
    DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<3>&);