25#ifndef COLUMN_VECTOR_H
26#define COLUMN_VECTOR_H
55template<
typename COLUMN,
unsigned D>
66 static constexpr unsigned d = D;
70 _column(meta::make_array_f<COLUMN,D>([count](unsigned iDim) -> std::size_t {
77 _column(std::move(rhs._column)) { }
97 if constexpr (D == 1) {
98 return operator[](0)[i];
101 return operator[](iDim)[i];
104 __builtin_unreachable();
109 for (
unsigned iDim=0; iDim < D; ++iDim) {
110 operator[](iDim)[i] = value[iDim];
116 return ptr(*
this, i);
127 for (
unsigned iDim=0; iDim < D; ++iDim) {
128 _column[iDim].resize(newCount);
137 void swap(std::size_t i, std::size_t j)
139 for (
unsigned iDim=0; iDim < D; ++iDim) {
140 std::swap(_column[iDim][i], _column[iDim][j]);
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) {
189template<
typename COLUMN,
unsigned D>
200 return &_data[iDim][_index];
210 _index(rhs._index) { }
225template<
typename COLUMN,
unsigned D>
236 return &_data[iDim][_index];
240 return &_data[iDim][_index];
250 _index(rhs._index) { }
252 template <
typename U,
typename IMPL>
255 for (
unsigned iDim=0; iDim < D; ++iDim) {
256 this->operator[](iDim) = rhs[iDim];
279template <
typename COLUMN,
unsigned D>
291 std::size_t size = 0;
292 for (
unsigned iD=0; iD < D; ++iD) {
300 std::uint8_t* buffer)
const
303 std::uint8_t* curr = buffer;
304 #ifdef PARALLEL_MODE_OMP
305 #pragma omp parallel for schedule(static,1)
307 for (
unsigned iD=0; iD < D; ++iD) {
315 const std::uint8_t* buffer)
318 const std::uint8_t* curr = buffer;
319 #ifdef PARALLEL_MODE_OMP
320 #pragma omp parallel for schedule(static,1)
322 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.
std::size_t getSize() const
void resize(std::size_t newCount)
Resize columns, potentially invalidates any inbound pointers.
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.
Base of all ColumnVector specializations.
virtual ~ColumnVectorBase()
Generic vector of values supporting basic arithmetic.