20 #ifndef GEOS_LINEARALGEBRA_UTILITIES_BLOCKOPERATORVIEW_HPP_
21 #define GEOS_LINEARALGEBRA_UTILITIES_BLOCKOPERATORVIEW_HPP_
23 #include "codingUtilities/SFINAE_Macros.hpp"
41 template<
typename VECTOR,
typename OPERATOR = LinearOperator< VECTOR > >
90 Vector & dst )
const override
94 dst.block( i ).zero();
95 VECTOR temp( dst.block( i ) );
98 if( m_operators( i, j ) != nullptr )
100 m_operators( i, j )->apply( src.block( j ), temp );
101 dst.block( i ).axpy( 1.0, temp );
116 template<
typename OP = OPERATOR >
117 std::enable_if_t< traits::VectorBasedTraits< Vector >::template HasMemberFunction_applyTranspose< OP > >
123 dst.
block( j ).zero();
124 VECTOR temp( dst.
block( j ) );
127 if( m_operators( j, i ) != nullptr )
129 m_operators( j, i )->applyTranspose( src.
block( i ), temp );
130 dst.
block( j ).axpy( 1.0, temp );
142 return computeRowSize( []( OPERATOR
const &
block ) {
return block.numGlobalRows(); } );
151 return computeColSize( []( OPERATOR
const &
block ) {
return block.numGlobalCols(); } );
161 return computeRowSize( []( OPERATOR
const &
block ) {
return block.numLocalRows(); } );
171 return computeColSize( []( OPERATOR
const &
block ) {
return block.numLocalCols(); } );
181 virtual MPI_Comm
comm()
const override
183 return m_operators( 0, 0 )->comm();
199 return m_operators.size( 0 );
208 return m_operators.size( 1 );
219 GEOS_LAI_ASSERT( m_operators( blockRowIndex, blockColIndex ) !=
nullptr );
220 return *m_operators( blockRowIndex, blockColIndex );
228 GEOS_LAI_ASSERT( m_operators( blockRowIndex, blockColIndex ) !=
nullptr );
229 return *m_operators( blockRowIndex, blockColIndex );
237 return block( blockRowIndex, blockColIndex );
245 return block( blockRowIndex, blockColIndex );
258 : m_operators( nRows, nCols )
288 m_operators( blockRowIndex, blockColIndex ) = op;
293 template<
typename FUNC >
294 auto computeRowSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) );
296 template<
typename FUNC >
297 auto computeColSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) );
303 template<
typename VECTOR,
typename OPERATOR >
304 template<
typename FUNC >
305 auto BlockOperatorView< VECTOR, OPERATOR >::computeRowSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) )
307 using sizeType = decltype( func( std::declval< OPERATOR const >() ) );
308 sizeType rowSize = 0;
309 for(
localIndex i = 0; i < numBlockRows(); ++i )
311 for(
localIndex j = 0; j < numBlockCols(); ++j )
313 if( m_operators( i, j ) != nullptr )
315 rowSize += func( block( i, j ) );
323 template<
typename VECTOR,
typename OPERATOR >
324 template<
typename FUNC >
325 auto BlockOperatorView< VECTOR, OPERATOR >::computeColSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) )
327 using sizeType = decltype( func( std::declval< OPERATOR const >() ) );
328 sizeType colSize = 0;
329 for(
localIndex j = 0; j < numBlockCols(); j++ )
331 for(
localIndex i = 0; i < numBlockRows(); ++i )
333 if( m_operators( i, j ) != nullptr )
335 colSize += func( block( i, j ) );
Abstract view of a block operator.
BlockOperatorView & operator=(BlockOperatorView &&)=delete
Deleted move assignment.
virtual globalIndex numGlobalCols() const override
Get the number of global columns.
virtual globalIndex numGlobalRows() const override
Get the number of global rows.
virtual MPI_Comm comm() const override
Get the MPI communicator the matrix was created with.
OPERATOR const & operator()(localIndex const blockRowIndex, localIndex const blockColIndex=0) const
Get the operator corresponding to a sub-block.
BlockOperatorView(BlockOperatorView< VECTOR, OPERATOR > &&x)=default
Move constructor.
localIndex numBlockCols() const
Get number of block columns.
virtual void apply(Vector const &src, Vector &dst) const override
Apply operator to a vector.
virtual localIndex numLocalCols() const override
Get the number of local columns.
localIndex numBlockRows() const
Get number of block rows.
typename Base::Vector Vector
Alias for vector type.
BlockOperatorView(localIndex const nRows, localIndex const nCols)
Create an operator with given number of block rows and columns.
OPERATOR & operator()(localIndex const blockRowIndex, localIndex const blockColIndex=0)
Get the operator corresponding to a sub-block.
std::enable_if_t< traits::VectorBasedTraits< Vector >::template HasMemberFunction_applyTranspose< OP > > applyTranspose(BlockVectorView< VECTOR > const &src, BlockVectorView< VECTOR > &dst) const
Apply the transpose of block operator to a block vector.
BlockOperatorView(BlockOperatorView< VECTOR, OPERATOR > const &x)=default
Copy constructor.
BlockOperatorView & operator=(BlockOperatorView const &)=delete
Deleted copy assignment.
void setPointer(localIndex const blockRowIndex, localIndex const blockColIndex, OPERATOR *op)
Set/replace a pointer to a block.
virtual ~BlockOperatorView() override=default
Destructor.
virtual localIndex numLocalRows() const override
Get the number of local rows.
OPERATOR const & block(localIndex const blockRowIndex, localIndex const blockColIndex) const
Get the operator corresponding to a sub-block.
OPERATOR & block(localIndex const blockRowIndex, localIndex const blockColIndex)
Get the operator corresponding to a sub-block.
Abstract view of a block vector.
VECTOR const & block(localIndex const blockIndex) const
Get a reference to the vector corresponding to block blockRowIndex.
Abstract base class for linear operators.
BlockVectorView< VECTOR > Vector
Alias for template parameter.
#define GEOS_LAI_ASSERT_GE(lhs, rhs)
#define GEOS_LAI_ASSERT_GT(lhs, rhs)
#define GEOS_LAI_ASSERT(expr)
Array< T, 2, PERMUTATION > array2d
Alias for 2D array.
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).