Skip to content
Snippets Groups Projects
Commit 97f3bdea authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Build data mapper once for all

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)
parent df93a364
No related branches found
No related tags found
1 merge request!42Feature/diamond dual mesh manager
......@@ -3,6 +3,7 @@
#include <mesh/Connectivity.hpp>
#include <mesh/ConnectivityDescriptor.hpp>
#include <mesh/ConnectivityDispatcher.hpp>
#include <mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp>
#include <mesh/ItemValueUtils.hpp>
#include <mesh/Mesh.hpp>
#include <mesh/RefId.hpp>
......@@ -481,6 +482,11 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
}
m_connectivity = ConnectivityType::build(diamond_descriptor);
m_mapper =
std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
dynamic_cast<const ConnectivityType&>(
*m_connectivity));
}
DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity)
......
......@@ -9,9 +9,13 @@ template <size_t>
class Connectivity;
class ConnectivityDescriptor;
class IConnectivityToDiamondDualConnectivityDataMapper;
class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
{
private:
std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> m_mapper;
template <size_t Dimension>
void _buildDiamondConnectivityDescriptor(const Connectivity<Dimension>&, ConnectivityDescriptor&);
......@@ -22,6 +26,12 @@ class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
DiamondDualConnectivityBuilder(const IConnectivity&);
public:
std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper>
mapper() const
{
return m_mapper;
}
~DiamondDualConnectivityBuilder() = default;
};
......
......@@ -41,30 +41,31 @@ DiamondDualConnectivityManager::deleteConnectivity(const IConnectivity* p_connec
m_connectivity_to_diamond_dual_connectivity_info_map.erase(p_connectivity);
}
template <size_t Dimension>
std::shared_ptr<const Connectivity<Dimension>>
DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& 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()) {
auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
diamond_dual_connectivity_info.diamondDualConnectivity());
return i_connectivity->second;
} else {
DiamondDualConnectivityBuilder builder{connectivity};
std::shared_ptr diamond_connectivity =
std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
DiamondDualConnectivityInfo connectivity_info{builder.connectivity(), builder.mapper()};
m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
DiamondDualConnectivityInfo{diamond_connectivity, mapper};
m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] = connectivity_info;
return diamond_connectivity;
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>
......@@ -72,26 +73,8 @@ std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>
DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(
const Connectivity<Dimension>& 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()) {
auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
diamond_dual_connectivity_info.connectivityToDiamondDualConnectivityDataMapper());
} else {
DiamondDualConnectivityBuilder builder{connectivity};
std::shared_ptr diamond_connectivity =
std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
DiamondDualConnectivityInfo{diamond_connectivity, mapper};
return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(mapper);
}
this->_getDiamondDualConnectivityInfo(connectivity).connectivityToDiamondDualConnectivityDataMapper());
}
template std::shared_ptr<const Connectivity<1>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
......
......@@ -56,6 +56,8 @@ class DiamondDualConnectivityManager
~DiamondDualConnectivityInfo() = default;
};
DiamondDualConnectivityInfo _getDiamondDualConnectivityInfo(const IConnectivity& connectivity);
std::unordered_map<const IConnectivity*, DiamondDualConnectivityInfo>
m_connectivity_to_diamond_dual_connectivity_info_map;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment