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>
67 Matrix<Form, Type>(dims.first(), dims.second(),
Zero)
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 NullObjectRef<Matrix<Form, Type>>();
95 template<
class Form,
class Type>
102 template<
class Form,
class Type>
109 template<
class Form,
class Type>
112 return mRows_ * nCols_;
116 template<
class Form,
class Type>
123 template<
class Form,
class Type>
126 return !mRows_ || !nCols_;
130 template<
class Form,
class Type>
133 if (!mRows_ || !nCols_)
136 <<
"Attempt to access element from empty matrix" 139 if (i < 0 || mRows_ <= i)
142 <<
"Index " << i <<
" out of range 0 ... " << mRows_-1
148 template<
class Form,
class Type>
151 if (!mRows_ || !nCols_)
154 <<
"Attempt to access element from empty matrix" 157 if (j < 0 || nCols_ <= j)
160 <<
"index " << j <<
" out of range 0 ... " << nCols_-1
166 template<
class Form,
class Type>
169 if (mRows_ < 0 || nCols_ < 0)
172 <<
"Incorrect size (" << mRows_ <<
", " << nCols_ <<
')' <<
nl 179 template<
class Form,
class Type>
182 const label len = size();
189 for (label idx = 1; idx < len; ++idx)
191 if (v_[0] != v_[idx])
201 template<
class Form,
class Type>
208 template<
class Form,
class Type>
215 template<
class Form,
class Type>
218 return reinterpret_cast<const char*
>(v_);
222 template<
class Form,
class Type>
225 return reinterpret_cast<char*
>(v_);
229 template<
class Form,
class Type>
232 return mRows_*nCols_*
sizeof(Type);
236 template<
class Form,
class Type>
242 return (v_ + irow*nCols_);
246 template<
class Form,
class Type>
252 return (v_ + irow*nCols_);
256 template<
class Form,
class Type>
260 if (idx < 0 || this->size() <= idx)
263 <<
"index " << idx <<
" out of range 0 ... " << this->size()
271 template<
class Form,
class Type>
275 if (idx < 0 || this->size() <= idx)
278 <<
"index " << idx <<
" out of range 0 ... " << this->size()
286 template<
class Form,
class Type>
290 const label colIndex,
291 const label rowIndex,
297 len = mRows_ - rowIndex;
300 return ConstMatrixBlock<mType>
311 template<
class Form,
class Type>
315 const label rowIndex,
316 const label colIndex,
322 len = nCols_ - colIndex;
325 return ConstMatrixBlock<mType>
336 template<
class Form,
class Type>
340 const label rowIndex,
341 const label colIndex,
346 if (szRows < 0) szRows = mRows_ - rowIndex;
347 if (szCols < 0) szCols = nCols_ - colIndex;
360 template<
class Form,
class Type>
361 template<
class VectorSpace>
365 const label rowIndex,
380 template<
class Form,
class Type>
384 const label colIndex,
385 const label rowIndex,
391 len = mRows_ - rowIndex;
394 return MatrixBlock<mType>
405 template<
class Form,
class Type>
409 const label rowIndex,
410 const label colIndex,
416 len = nCols_ - colIndex;
419 return MatrixBlock<mType>
430 template<
class Form,
class Type>
434 const label rowIndex,
435 const label colIndex,
440 if (szRows < 0) szRows = mRows_ - rowIndex;
441 if (szCols < 0) szCols = nCols_ - colIndex;
454 template<
class Form,
class Type>
455 template<
class VectorSpace>
459 const label rowIndex,
474 template<
class Form,
class Type>
481 template<
class Form,
class Type>
489 template<
class Form,
class Type>
495 return this->AmulImpl(
x);
499 template<
class Form,
class Type>
506 return this->AmulImpl(
x);
510 template<
class Form,
class Type>
516 return this->TmulImpl(
x);
520 template<
class Form,
class Type>
527 return this->TmulImpl(
x);
533 template<
class Form,
class Type>
541 template<
class Form,
class Type>
545 return v_ + (mRows_ * nCols_);
549 template<
class Form,
class Type>
557 template<
class Form,
class Type>
561 return v_ + (mRows_ * nCols_);
565 template<
class Form,
class Type>
573 template<
class Form,
class Type>
577 return v_ + (mRows_ * nCols_);
583 template<
class Form,
class Type>
594 return v_[irow*nCols_ + jcol];
598 template<
class Form,
class Type>
609 return v_[irow*nCols_ + jcol];
613 template<
class Form,
class Type>
619 return v_ + irow*nCols_;
623 template<
class Form,
class Type>
629 return v_ + irow*nCols_;
641 template<
class Form,
class Type>
653 template<
class Form,
class Type,
class Addr>
665 template<
class Form,
class Type>
677 template<
class Form,
class Type,
class Addr>
678 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)
label n() const noexcept
The number of columns.
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...
static const Matrix< Form, Type > & null()
Return a null Matrix.
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...
label m() const noexcept
The number of rows.
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.
static constexpr const zero Zero
Global zero (0)
void checkSize() const
Check that dimensions are positive, non-zero.