20#ifndef PAVE_DYNAMIC_SOURCE_DATA_HPP
21#define PAVE_DYNAMIC_SOURCE_DATA_HPP
28#include <unordered_map>
34template <
typename Scalar>
63 using ElmT = std::remove_cv_t<T>;
71 return this->begin_[this->index(i)];
81 template <
typename Ret = SourceDataSpan&>
82 constexpr std::enable_if_t<! std::is_const_v<T>, Ret>
85 this->begin_[this->index(i)] = value;
95 template <
typename U,
typename Ret = SourceDataSpan&>
96 constexpr std::enable_if_t<! std::is_const_v<T>, Ret>
99 std::copy_n(src.begin_, NumItems, this->begin_);
105 static constexpr auto NumItems =
106 static_cast<std::size_t
>(Item::Last_Do_Not_Use);
115 explicit SourceDataSpan(T* begin)
123 constexpr std::size_t index(
const Item i)
const
125 const auto ix =
static_cast<std::size_t
>(i);
126 if (ix >= NumItems) {
127 throw std::invalid_argument {
128 "Index out of bounds"
158 [[nodiscard]] SourceDataSpan<Scalar>
171 [[nodiscard]] SourceDataSpan<const Scalar>
191 [[nodiscard]] SourceDataSpan<Scalar>
192 sourceTerm(
const std::size_t ix, std::vector<Scalar>& src);
203 void reconstruct(
const std::vector<std::size_t>& sourceLocations);
213 return SourceDataSpan<const Scalar>::NumItems;
219 std::unordered_map<std::size_t, typename std::vector<Scalar>::size_type> ix_{};
229 void buildLocationMapping(
const std::vector<std::size_t>& sourceLocations);
236 [[nodiscard]] std::optional<typename std::vector<Scalar>::size_type>
237 index(
const std::size_t source)
const;
248 [[nodiscard]]
virtual typename std::vector<Scalar>::size_type
249 storageIndex(
typename std::vector<Scalar>::size_type elemIndex)
const
constexpr ElmT operator[](const Item i) const
Read-only access to numerical value of specified item.
Definition PAvgDynamicSourceData.hpp:69
constexpr std::enable_if_t<! std::is_const_v< T >, Ret > set(const Item i, const ElmT value)
Assign specified item.
Definition PAvgDynamicSourceData.hpp:83
constexpr std::enable_if_t<! std::is_const_v< T >, Ret > operator=(const SourceDataSpan< U > src)
Assign all items.
Definition PAvgDynamicSourceData.hpp:97
Item
Supported items of dynamic data per source location.
Definition PAvgDynamicSourceData.hpp:52
PAvgDynamicSourceData(const std::vector< std::size_t > &sourceLocations)
Constructor.
Definition PAvgDynamicSourceData.cpp:35
virtual ~PAvgDynamicSourceData()
Destructor.
Definition PAvgDynamicSourceData.hpp:146
SourceDataSpan< Scalar > operator[](const std::size_t source)
Acquire read/write span of data items corresponding to a single source location.
Definition PAvgDynamicSourceData.cpp:43
static constexpr std::size_t numSpanItems() noexcept
Provide number of span items using function syntax.
Definition PAvgDynamicSourceData.hpp:211
void reconstruct(const std::vector< std::size_t > &sourceLocations)
Reconstruct Source Data backing storage and internal mapping tables.
Definition PAvgDynamicSourceData.cpp:79
std::vector< Scalar > src_
Contiguous array of data items for all source locations.
Definition PAvgDynamicSourceData.hpp:179
SourceDataSpan< Scalar > sourceTerm(const std::size_t ix, std::vector< Scalar > &src)
Form mutable data span into non-default backing store.
Definition PAvgDynamicSourceData.cpp:71
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30