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