25#ifndef COLUMN_VECTOR_H
26#define COLUMN_VECTOR_H
50 virtual void resize(std::size_t newCount) = 0;
57template<
typename COLUMN,
unsigned D>
68 static constexpr unsigned d = D;
72 _column(meta::make_array_f<COLUMN,D>([count](unsigned iDim) -> std::size_t {
79 _column(std::move(rhs._column)) { }
99 if constexpr (D == 1) {
100 return operator[](0)[i];
103 return operator[](iDim)[i];
106 __builtin_unreachable();
111 for (
unsigned iDim=0; iDim < D; ++iDim) {
112 operator[](iDim)[i] = value[iDim];
118 return ptr(*
this, i);
130 void swap(std::size_t i, std::size_t j)
132 for (
unsigned iDim=0; iDim < D; ++iDim) {
133 std::swap(_column[iDim][i], _column[iDim][j]);
137 void resize(std::size_t newCount)
override {
138 for (
unsigned iDim=0; iDim < D; ++iDim) {
139 operator[](iDim).resize(newCount);
149 bool*
getBlock(std::size_t iBlock, std::size_t& sizeBlock,
bool loadingMode)
override;
154template<
typename COLUMN,
unsigned D>
160template<
typename COLUMN,
unsigned D>
166template<
typename COLUMN,
unsigned D>
169 std::size_t currentBlock = 0;
170 bool* dataPtr =
nullptr;
172 for (
unsigned iDim=0; iDim < D; ++iDim) {
173 this->registerSerializableOfConstSize(iBlock, sizeBlock, currentBlock, dataPtr, _column[iDim], loadingMode);
179template<
typename COLUMN,
unsigned D>
182 for (
unsigned iD=0; iD < D; ++iD) {
183 this->operator[](iD).postLoad();
189template<
typename COLUMN,
unsigned D>
206 _index(rhs._index) { }
210 return &_data[iDim][_index];
226template<
typename COLUMN,
unsigned D>
243 _index(rhs._index) { }
247 return &_data[iDim][_index];
252 return &_data[iDim][_index];
255 template <
typename U,
typename IMPL>
258 for (
unsigned iDim=0; iDim < D; ++iDim) {
259 this->operator[](iDim) = rhs[iDim];
282template <
typename COLUMN,
unsigned D>
294 std::size_t size = 0;
295 for (
unsigned iD=0; iD < D; ++iD) {
303 std::uint8_t* buffer)
const
306 std::uint8_t* curr = buffer;
307 #ifdef PARALLEL_MODE_OMP
308 #pragma omp parallel for schedule(static,1)
310 for (
unsigned iD=0; iD < D; ++iD) {
318 const std::uint8_t* buffer)
321 const std::uint8_t* curr = buffer;
322 #ifdef PARALLEL_MODE_OMP
323 #pragma omp parallel for schedule(static,1)
325 for (
unsigned iD=0; iD < D; ++iD) {
Read-only proxy for accessing a column vector entry.
const COLUMN::value_t * getComponentPointer(unsigned iDim) const
void setIndex(std::size_t index)
const_ptr(const ColumnVector< COLUMN, D > &columns, std::size_t index)
const_ptr(const_ptr &&rhs)
std::size_t getIndex() const
Proxy for accessing a column vector entry.
std::size_t getIndex() const
ptr(ColumnVector< COLUMN, D > &columns, std::size_t index)
COLUMN::value_t * getComponentPointer(unsigned iDim)
const COLUMN::value_t * getComponentPointer(unsigned iDim) const
void setIndex(std::size_t index)
ptr & operator=(const GenericVector< U, D, IMPL > &rhs)
COLUMN & operator[](unsigned iDim)
std::size_t getNblock() const override
Number of data blocks for the serializable interface.
void resize(std::size_t newCount) override
std::size_t getSize() const
void swap(std::size_t i, std::size_t j)
Swap contents of row i and row j.
bool * getBlock(std::size_t iBlock, std::size_t &sizeBlock, bool loadingMode) override
Return a pointer to the memory of the current block and its size for the serializable interface.
const_ptr getRowPointer(std::size_t i) const
ColumnVector(ColumnVector &&rhs)
static constexpr unsigned d
auto setRow(std::size_t i, const Vector< typename COLUMN::value_t, D > &value)
std::size_t _count
Number of rows.
auto getRow(std::size_t i) const
Return copy of data at index i.
std::array< COLUMN, D > _column
ptr getRowPointer(std::size_t i)
std::size_t getSerializableSize() const override
Binary size for the serializer.
const COLUMN & operator[](unsigned iDim) const
ColumnVector(std::size_t count)
std::size_t deserialize(ConstSpan< CellID > indices, const std::uint8_t *buffer)
Deserialize data at locations indices to buffer
std::size_t serialize(ConstSpan< CellID > indices, std::uint8_t *buffer) const
Serialize data at locations indices to buffer
ConcreteCommunicatable(ColumnVector< COLUMN, D > &vector)
std::size_t size(ConstSpan< CellID > indices) const
Get serialized size for data at locations indices
std::size_t deserialize(ConstSpan< CellID > indices, const std::uint8_t *buffer) override
Deserialize data at locations indices to buffer
std::size_t serialize(ConstSpan< CellID > indices, std::uint8_t *buffer) const override
Serialize data at locations indices to buffer
std::size_t size(ConstSpan< CellID > indices) const override
Get serialized size for data at locations indices
Base class for serializable objects of constant size. For dynamic size use BufferSerializable.
Top level namespace for all of OpenLB.
Vector(T &&t, Ts &&... ts) -> Vector< std::remove_cvref_t< T >, 1+sizeof...(Ts)>
Base of all ColumnVector specializations.
virtual void resize(std::size_t newCount)=0
virtual ~ColumnVectorBase()
Generic vector of values supporting basic arithmetic.