Select Git revision
Connectivity.cpp
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>&);