/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2004-2010, 2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2016 OpenFOAM Foundation ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . Class Foam::MatrixBlock Description A templated block of an (m x n) matrix of type \. Foam::ConstMatrixBlock: block of a const matrix Foam::MatrixBlock: block of a non-const matrix The block may be assigned to a block of another matrix or to a VectorSpace or MatrixSpace e.g. \c tensor. Conversion of a column block to a \c Field is also provide. SourceFiles MatrixBlock.C MatrixBlockI.H \*---------------------------------------------------------------------------*/ #ifndef MatrixBlock_H #define MatrixBlock_H #include "Matrix.H" #include "MatrixSpace.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class ConstMatrixBlock Declaration \*---------------------------------------------------------------------------*/ template class ConstMatrixBlock { // Private Data //- Const reference to the parent matrix const MatrixType& matrix_; //- Block size const label mRows_; const label nCols_; //- Block location in parent matrix const label rowStart_; const label colStart_; // Private Member Functions //- Error message for failed sanity checks during matrix construction label disallow(const char *what) const; public: typedef typename MatrixType::cmptType cmptType; // Constructors //- Construct block for matrix, size and location inline ConstMatrixBlock ( const MatrixType& matrix, const label m, const label n, const label mStart, const label nStart ); // Member Functions //- Return the number of rows in the block inline label m() const; //- Return the number of columns in the block inline label n() const; //- Return row/column sizes inline labelPair sizes() const; //- (i, j) const element access operator inline const cmptType& operator() ( const label i, const label j ) const; //- Convert a column of a matrix to a Field operator Field() const; //- Check if (i, j) is within range of row-column limits void checkIndex(const label i, const label j) const; }; /*---------------------------------------------------------------------------*\ Class MatrixBlock Declaration \*---------------------------------------------------------------------------*/ template class MatrixBlock { // Private Data //- Reference to the parent matrix MatrixType& matrix_; //- Block size const label mRows_; const label nCols_; //- Block location in parent matrix const label rowStart_; const label colStart_; // Private Member Functions //- Error message for failed sanity checks during matrix construction label disallow(const char *what) const; public: typedef typename MatrixType::cmptType cmptType; // Constructors //- Construct block for matrix, size and location inline MatrixBlock ( MatrixType& matrix, const label m, const label n, const label mStart, const label nStart ); // Member Functions //- Return the number of rows in the block inline label m() const; //- Return the number of columns in the block inline label n() const; //- Return row/column sizes inline labelPair sizes() const; //- (i, j) const element access operator inline const cmptType& operator() ( const label i, const label j ) const; //- (i, j) element access operator inline cmptType& operator()(const label i, const label j); //- Convert a column of a matrix to a Field operator Field() const; //- Check if (i, j) is within range of row-column limits void checkIndex(const label i, const label j) const; // Member Operators //- Assignment to a compatible matrix template void operator=(const Matrix&); //- Assignment to a compatible const block void operator=(const ConstMatrixBlock&); //- Assignment to a compatible block void operator=(const MatrixBlock&); //- Assignment to a compatible const block template void operator=(const ConstMatrixBlock&); //- Assignment to a compatible block template void operator=(const MatrixBlock&); //- Assignment to a compatible MatrixSpace template void operator=(const MatrixSpace&); //- Assignment to a compatible MatrixSpace block template < template class Block, class SubTensor, direction BRowStart, direction BColStart > void operator=(const Block&); //- Assignment to a compatible VectorSpace (column-vector) template void operator=(const VectorSpace&); //- Assignment to a compatible VectorSpace (column-vector) block template < template class Block, class SubVector, direction BStart > void operator=(const Block&); //- Assignment to a Field (column-vector) void operator=(const Field&); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "MatrixBlockI.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository #include "MatrixBlock.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //