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

Simplify access to connectivity matrices

- access is now provided only through template function of item types
- removed connectivity interface class
- add ConnectivityUtils.hpp which provides a getConnectivityMatrix access
  template function. This avoids the use of switches
parent 228ec9dd
Branches
Tags
1 merge request!6Feature/crs
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
#include <tuple> #include <tuple>
#include <algorithm> #include <algorithm>
#include <IConnectivity.hpp>
template <size_t Dimension> template <size_t Dimension>
class Connectivity; class Connectivity;
...@@ -221,8 +219,7 @@ class ConnectivityFace<3> ...@@ -221,8 +219,7 @@ class ConnectivityFace<3>
}; };
template <size_t Dimension> template <size_t Dimension>
class Connectivity final class Connectivity
: public IConnectivity
{ {
private: private:
constexpr static auto& itemId = ItemId<Dimension>::itemId; constexpr static auto& itemId = ItemId<Dimension>::itemId;
...@@ -269,13 +266,18 @@ class Connectivity final ...@@ -269,13 +266,18 @@ class Connectivity final
CellValuePerNode<unsigned short> m_node_to_cell_local_node; CellValuePerNode<unsigned short> m_node_to_cell_local_node;
template <TypeOfItem SubItemType, template <TypeOfItem item_type_0,
TypeOfItem ItemType> TypeOfItem item_type_1>
const ConnectivityMatrix& itemToItemMatrix() const = delete; const ConnectivityMatrix& itemToItemMatrix() const
{
const auto& item0_to_item1_matrix
= m_item_to_item_matrix[itemId(item_type_0)][itemId(item_type_1)];
return item0_to_item1_matrix;
};
KOKKOS_INLINE_FUNCTION KOKKOS_INLINE_FUNCTION
const ConnectivityMatrix& itemToItemMatrix(const TypeOfItem& item_type_0, const ConnectivityMatrix& itemToItemMatrix(const TypeOfItem& item_type_0,
const TypeOfItem& item_type_1) const final; const TypeOfItem& item_type_1) const;
private: private:
ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1]; ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1];
...@@ -415,241 +417,8 @@ private: ...@@ -415,241 +417,8 @@ private:
} }
}; };
using Connectivity3D = Connectivity<3>; using Connectivity3D = Connectivity<3>;
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<3>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::face>() const
{
const auto& cell_to_face_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
return cell_to_face_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<3>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::node>() const
{
const auto& cell_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
return cell_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::cell>() const
{
const auto& face_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
return face_to_cell_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::node>() const
{
const auto& face_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
return face_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<3>::itemToItemMatrix<TypeOfItem::node,
TypeOfItem::cell>() const
{
const auto& node_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
return node_to_cell_matrix;
}
using Connectivity2D = Connectivity<2>; using Connectivity2D = Connectivity<2>;
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<2>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::face>() const
{
const auto& cell_to_face_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
return cell_to_face_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<2>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::node>() const
{
const auto& cell_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
return cell_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::cell>() const
{
const auto& face_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
return face_to_cell_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::node>() const
{
const auto& face_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
return face_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<2>::itemToItemMatrix<TypeOfItem::node,
TypeOfItem::cell>() const
{
const auto& node_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
return node_to_cell_matrix;
}
using Connectivity1D = Connectivity<1>; using Connectivity1D = Connectivity<1>;
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<1>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::node>() const
{
const auto& cell_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
return cell_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<1>::itemToItemMatrix<TypeOfItem::cell,
TypeOfItem::face>() const
{
const auto& cell_to_face_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
return cell_to_face_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::cell>() const
{
const auto& face_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
return face_to_cell_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
TypeOfItem::node>() const
{
#warning in 1d, faces and node are the same
const auto& face_to_node_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
return face_to_node_matrix;
}
template <>
template <>
inline const ConnectivityMatrix&
Connectivity<1>::itemToItemMatrix<TypeOfItem::node,
TypeOfItem::cell>() const
{
const auto& node_to_cell_matrix
= m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
return node_to_cell_matrix;
}
template <size_t Dimension>
const ConnectivityMatrix&
Connectivity<Dimension>::
itemToItemMatrix(const TypeOfItem& item_type_0,
const TypeOfItem& item_type_1) const
{
switch (item_type_0) {
case TypeOfItem::cell: {
switch (item_type_1) {
case TypeOfItem::node: {
return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::node>();
}
case TypeOfItem::face: {
return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::face>();
}
default: {
std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
std::exit(1);
}
}
}
case TypeOfItem::face: {
switch (item_type_1) {
case TypeOfItem::cell: {
return itemToItemMatrix<TypeOfItem::face, TypeOfItem::cell>();
}
case TypeOfItem::node: {
return itemToItemMatrix<TypeOfItem::face, TypeOfItem::node>();
}
default: {
std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
std::exit(1);
}
}
}
case TypeOfItem::node: {
switch (item_type_1) {
case TypeOfItem::cell: {
return itemToItemMatrix<TypeOfItem::node, TypeOfItem::cell>();
}
default: {
std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
std::exit(1);
}
}
}
default: {
std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_0) << "\n";
std::exit(1);
}
}
}
#endif // CONNECTIVITY_HPP #endif // CONNECTIVITY_HPP
#ifndef CONNECTIVITY_UTILS_HPP
#define CONNECTIVITY_UTILS_HPP
#include <TypeOfItem.hpp>
#include <ConnectivityMatrix.hpp>
template <TypeOfItem item_type_0,
TypeOfItem item_type_1,
typename ConnectivityType>
const ConnectivityMatrix& getConnectivityMatrix(const ConnectivityType& connectivity)
{
return connectivity.template itemToItemMatrix<item_type_0, item_type_1>();
}
#endif // CONNECTIVITY_UTILS_HPP
#ifndef ICONNECTIVITY_HPP
#define ICONNECTIVITY_HPP
#include <TypeOfItem.hpp>
#include <ConnectivityMatrix.hpp>
struct IConnectivity
{
virtual const ConnectivityMatrix&
itemToItemMatrix(const TypeOfItem& item_type_0,
const TypeOfItem& item_type_1) const = 0;
IConnectivity() = default;
IConnectivity(const IConnectivity&) = delete;
virtual ~IConnectivity() = default;
};
#endif // ICONNECTIVITY_HPP
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include <PastisAssert.hpp> #include <PastisAssert.hpp>
#include <ConnectivityMatrix.hpp> #include <ConnectivityMatrix.hpp>
#include <IConnectivity.hpp> #include <ConnectivityUtils.hpp>
template <typename DataType, template <typename DataType,
TypeOfItem SubItemType, TypeOfItem SubItemType,
...@@ -130,10 +130,12 @@ class SubItemValuePerItem ...@@ -130,10 +130,12 @@ class SubItemValuePerItem
SubItemValuePerItem() = default; SubItemValuePerItem() = default;
SubItemValuePerItem(const IConnectivity& connectivity) template <typename ConnectivityType>
SubItemValuePerItem(const ConnectivityType& connectivity)
{ {
ConnectivityMatrix connectivity_matrix ConnectivityMatrix connectivity_matrix
= connectivity.itemToItemMatrix(ItemType,SubItemType); = getConnectivityMatrix<ItemType,SubItemType>(connectivity);
m_host_row_map = connectivity_matrix.rowsMap(); m_host_row_map = connectivity_matrix.rowsMap();
m_values = Kokkos::View<DataType*>("values", connectivity_matrix.numEntries()); m_values = Kokkos::View<DataType*>("values", connectivity_matrix.numEntries());
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment