Select Git revision
WriteIBoundaryConditionDescriptor.cpp
-
Stéphane Del Pino authored
This is a raw copy from `feature/composite-scheme` Also plug to checkpointing and add related tests
Stéphane Del Pino authoredThis is a raw copy from `feature/composite-scheme` Also plug to checkpointing and add related tests
SubItemValuePerItem.hpp 4.29 KiB
#ifndef SUBITEM_VALUE_PER_ITEM_HPP
#define SUBITEM_VALUE_PER_ITEM_HPP
#include <Kokkos_StaticCrsGraph.hpp>
#include <TypeOfItem.hpp>
#include <PastisAssert.hpp>
#include <ConnectivityMatrix.hpp>
#include <IConnectivity.hpp>
template <typename DataType,
TypeOfItem SubItemType,
TypeOfItem ItemType>
class SubItemValuePerItem
{
private:
ConnectivityMatrix::HostRowType m_host_row_map;
Kokkos::View<DataType*> m_values;
public:
class SubView
{
private:
KOKKOS_RESTRICT DataType* const m_sub_values;
const size_t m_size;
public:
KOKKOS_INLINE_FUNCTION
const DataType& operator[](const size_t& i) const
{
Assert(i<m_size);
return m_sub_values[i];
}
KOKKOS_FORCEINLINE_FUNCTION
DataType& operator[](const size_t& i)
{
Assert(i<m_size);
return m_sub_values[i];
}
KOKKOS_INLINE_FUNCTION
const size_t& size() const
{
return m_size;
}
SubView(const SubView&) = delete;
KOKKOS_INLINE_FUNCTION
SubView(SubView&&) = default;
KOKKOS_INLINE_FUNCTION
SubView(const Kokkos::View<DataType*>& values,
const size_t& begin,
const size_t& end)
: m_sub_values(&(values[begin])),
m_size(end-begin)
{
Assert(begin<=end);
Assert(end<=values.extent(0));
}
};
class SubViewConst
{
private:
KOKKOS_RESTRICT const DataType* const m_sub_values;
const size_t m_size;
public:
KOKKOS_FORCEINLINE_FUNCTION
const DataType& operator[](const size_t& i) const
{
Assert(i<m_size);
return m_sub_values[i];
}
KOKKOS_INLINE_FUNCTION
const size_t& size() const
{
return m_size;
}
SubViewConst(const SubViewConst&) = delete;
KOKKOS_INLINE_FUNCTION
SubViewConst(SubViewConst&&) = default;
KOKKOS_INLINE_FUNCTION
SubViewConst(const Kokkos::View<DataType*>& values,
const size_t& begin,
const size_t& end)
: m_sub_values(&(values[begin])),
m_size(end-begin)
{
Assert(begin<=end);
Assert(end<=values.extent(0));
}
};
SubItemValuePerItem& operator=(const SubItemValuePerItem&) = default;
KOKKOS_FORCEINLINE_FUNCTION
DataType& operator()(const size_t& j, const size_t& r)
{
return m_values[m_host_row_map(j)+r];
}
KOKKOS_FORCEINLINE_FUNCTION
const DataType& operator()(const size_t& j, const size_t& r) const
{
return m_values[m_host_row_map(j)+r];
}
KOKKOS_INLINE_FUNCTION
size_t numberOfValues() const
{
return m_values.extent(0);
}
KOKKOS_FORCEINLINE_FUNCTION
DataType& operator[](const size_t& i)
{
return m_values[i];
}
KOKKOS_FORCEINLINE_FUNCTION
const DataType& operator[](const size_t & i) const
{
return m_values[i];
}
KOKKOS_INLINE_FUNCTION
size_t numberOfItems() const
{
Assert(m_host_row_map.extent(0) != 0>0);
return m_host_row_map.extent(0);
}
KOKKOS_INLINE_FUNCTION
size_t numberOfSubValues(const size_t& i_cell) const
{
return m_host_row_map(i_cell+1)-m_host_row_map(i_cell);
}
KOKKOS_INLINE_FUNCTION
SubView itemValues(const size_t& i_cell)
{
const auto& cell_begin = m_host_row_map(i_cell);
const auto& cell_end = m_host_row_map(i_cell+1);
return SubView(m_values, cell_begin, cell_end);
}
KOKKOS_INLINE_FUNCTION
SubViewConst itemValues(const size_t& i_cell) const
{
const auto& cell_begin = m_host_row_map(i_cell);
const auto& cell_end = m_host_row_map(i_cell+1);
return SubViewConst(m_values, cell_begin, cell_end);
}
SubItemValuePerItem() = default;
SubItemValuePerItem(const IConnectivity& connectivity)
{
ConnectivityMatrix connectivity_matrix
= connectivity.itemToItemMatrix(ItemType,SubItemType);
m_host_row_map = connectivity_matrix.rowsMap();
m_values = Kokkos::View<DataType*>("values", connectivity_matrix.numEntries());
}
~SubItemValuePerItem() = default;
};
template <typename DataType>
using NodeValuePerCell = SubItemValuePerItem<DataType, TypeOfItem::node, TypeOfItem::cell>;
template <typename DataType>
using CellValuePerNode = SubItemValuePerItem<DataType, TypeOfItem::cell, TypeOfItem::node>;
template <typename DataType>
using CellValuePerFace = SubItemValuePerItem<DataType, TypeOfItem::cell, TypeOfItem::face>;
#endif // SUBITEM_VALUE_PER_ITEM_HPP