33 template<
class Form,
class Type>
36 const label len = size();
48 template<
class Form,
class Type>
57 template<
class Form,
class Type>
60 Matrix<Form, Type>(dims.first(), dims.second())
64 template<
class Form,
class Type>
71 template<
class Form,
class Type>
74 Matrix<Form, Type>(dims.first(), dims.second(), val)
78 template<
class Form,
class Type>
88 template<
class Form,
class Type>
91 return mRows_ * nCols_;
95 template<
class Form,
class Type>
102 template<
class Form,
class Type>
105 return !mRows_ || !nCols_;
109 template<
class Form,
class Type>
112 if (!mRows_ || !nCols_)
115 <<
"Attempt to access element from empty matrix" 118 if (i < 0 || mRows_ <= i)
121 <<
"Index " << i <<
" out of range 0 ... " << mRows_-1
127 template<
class Form,
class Type>
130 if (!mRows_ || !nCols_)
133 <<
"Attempt to access element from empty matrix" 136 if (j < 0 || nCols_ <= j)
139 <<
"index " << j <<
" out of range 0 ... " << nCols_-1
145 template<
class Form,
class Type>
148 if (mRows_ < 0 || nCols_ < 0)
151 <<
"Incorrect size (" << mRows_ <<
", " << nCols_ <<
')' <<
nl 158 template<
class Form,
class Type>
161 const label len = size();
169 for (label idx = 1; idx < len; ++idx)
171 if (v_[0] != v_[idx])
181 template<
class Form,
class Type>
188 template<
class Form,
class Type>
195 template<
class Form,
class Type>
198 return reinterpret_cast<const char*
>(v_);
202 template<
class Form,
class Type>
205 return reinterpret_cast<char*
>(v_);
209 template<
class Form,
class Type>
212 return mRows_*nCols_*
sizeof(Type);
216 template<
class Form,
class Type>
222 return (v_ + irow*nCols_);
226 template<
class Form,
class Type>
232 return (v_ + irow*nCols_);
236 template<
class Form,
class Type>
240 if (idx < 0 || this->size() <= idx)
243 <<
"index " << idx <<
" out of range 0 ... " << this->size()
251 template<
class Form,
class Type>
255 if (idx < 0 || this->size() <= idx)
258 <<
"index " << idx <<
" out of range 0 ... " << this->size()
266 template<
class Form,
class Type>
270 const label colIndex,
271 const label rowIndex,
277 len = mRows_ - rowIndex;
280 return ConstMatrixBlock<mType>
291 template<
class Form,
class Type>
295 const label rowIndex,
296 const label colIndex,
302 len = nCols_ - colIndex;
305 return ConstMatrixBlock<mType>
316 template<
class Form,
class Type>
320 const label rowIndex,
321 const label colIndex,
326 if (szRows < 0) szRows = mRows_ - rowIndex;
327 if (szCols < 0) szCols = nCols_ - colIndex;
340 template<
class Form,
class Type>
341 template<
class VectorSpace>
345 const label rowIndex,
360 template<
class Form,
class Type>
364 const label colIndex,
365 const label rowIndex,
371 len = mRows_ - rowIndex;
374 return MatrixBlock<mType>
385 template<
class Form,
class Type>
389 const label rowIndex,
390 const label colIndex,
396 len = nCols_ - colIndex;
399 return MatrixBlock<mType>
410 template<
class Form,
class Type>
414 const label rowIndex,
415 const label colIndex,
420 if (szRows < 0) szRows = mRows_ - rowIndex;
421 if (szCols < 0) szCols = nCols_ - colIndex;
434 template<
class Form,
class Type>
435 template<
class VectorSpace>
439 const label rowIndex,
454 template<
class Form,
class Type>
461 template<
class Form,
class Type>
469 template<
class Form,
class Type>
475 return this->AmulImpl(
x);
479 template<
class Form,
class Type>
486 return this->AmulImpl(
x);
490 template<
class Form,
class Type>
496 return this->TmulImpl(
x);
500 template<
class Form,
class Type>
507 return this->TmulImpl(
x);
513 template<
class Form,
class Type>
521 template<
class Form,
class Type>
525 return v_ + (mRows_ * nCols_);
529 template<
class Form,
class Type>
537 template<
class Form,
class Type>
541 return v_ + (mRows_ * nCols_);
545 template<
class Form,
class Type>
553 template<
class Form,
class Type>
557 return v_ + (mRows_ * nCols_);
563 template<
class Form,
class Type>
574 return v_[irow*nCols_ + jcol];
578 template<
class Form,
class Type>
589 return v_[irow*nCols_ + jcol];
593 template<
class Form,
class Type>
599 return v_ + irow*nCols_;
603 template<
class Form,
class Type>
609 return v_ + irow*nCols_;
621 template<
class Form,
class Type>
633 template<
class Form,
class Type,
class Addr>
645 template<
class Form,
class Type>
657 template<
class Form,
class Type,
class Addr>
658 inline tmp<Field<Type>>
operator*
void shallowResize(const label m, const label n)
Resize Matrix without reallocating storage (unsafe)
ConstMatrixBlock< mType > subColumn(const label colIndex, const label rowIndex=0, label len=-1) const
Return const column or column's subset of Matrix.
ConstMatrixBlock< mType > subRow(const label rowIndex, const label colIndex=0, label len=-1) const
Return const row or const row's subset of Matrix.
autoPtr< mType > clone() const
Clone.
patchWriters resize(patchIds.size())
tmp< Field< Type > > Tmul(const UList< Type > &x) const
Left-multiply Matrix by a row vector (x * A)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
constexpr char nl
The newline '\n' character (0x0a)
tmp< Field< Type > > Amul(const UList< Type > &x) const
Right-multiply Matrix by a column vector (A * x)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
A templated block of an (m x n) matrix of type <MatrixType>.
void setSize(const label m, const label n)
Change Matrix dimensions, preserving the elements.
const Type * operator[](const label irow) const
Return const pointer to data in the specified row - rowData().
iterator begin() noexcept
Return an iterator to begin traversing a Matrix.
Base for lists with indirect addressing, templated on the list contents type and the addressing type...
bool empty() const noexcept
Return true if Matrix is empty (i.e., size() is zero)
ConstMatrixBlock< mType > subMatrix(const label rowIndex, const label colIndex, label szRows=-1, label szCols=-1) const
Return const sub-block of Matrix.
char * data_bytes() noexcept
Return pointer to the underlying array serving as data storage, reinterpreted as byte data...
label size() const
The number of elements in Matrix (m*n)
const Type & at(const label idx) const
Linear addressing const element access.
Type * iterator
Random access iterator for traversing a Matrix.
labelPair sizes() const
Return row/column sizes.
bool uniform() const
True if all entries have identical values, and Matrix is non-empty.
iterator end() noexcept
Return an iterator to end traversing a Matrix.
errorManip< error > abort(error &err)
const Type * cdata() const noexcept
Return const pointer to the first data element, which can also be used to address into Matrix content...
void checki(const label irow) const
Check index i is within valid range [0, m)
A templated (m x n) matrix of objects of <T>. The layout is (mRows x nCols) - row-major order: ...
std::streamsize size_bytes() const noexcept
Number of contiguous bytes for the Matrix data, no runtime check that the type is actually contiguous...
Pair< label > labelPair
A pair of labels.
const char * cdata_bytes() const noexcept
Return pointer to the underlying array serving as data storage, reinterpreted as byte data...
const Type * const_iterator
Random access iterator for traversing a Matrix.
const_iterator cend() const noexcept
Return const_iterator to end traversing a constant Matrix.
const Type * rowData(const label irow) const
Return const pointer to data in the specified row.
void checkj(const label jcol) const
Check index j is within valid range [0, n)
Matrix() noexcept
Default construct (empty matrix)
Type * data() noexcept
Return pointer to the first data element, which can also be used to address into Matrix contents...
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
const_iterator cbegin() const noexcept
Return const_iterator to begin traversing a constant Matrix.
A class for managing temporary objects.
ConstMatrixBlock< mType > block(const label rowIndex, const label colIndex) const
Access Field as a ConstMatrixBlock.
void checkSize() const
Check that dimensions are positive, non-zero.