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 > >
85 Vector & dst )
const override
89 dst.block( i ).zero();
90 VECTOR temp( dst.block( i ) );
93 if( m_operators( i, j ) != nullptr )
95 m_operators( i, j )->apply( src.block( j ), temp );
96 dst.block( i ).axpy( 1.0, temp );
111 template<
typename OP = OPERATOR >
112 std::enable_if_t< traits::VectorBasedTraits< Vector >::template HasMemberFunction_applyTranspose< OP > >
118 dst.
block( j ).zero();
119 VECTOR temp( dst.
block( j ) );
122 if( m_operators( j, i ) != nullptr )
124 m_operators( j, i )->applyTranspose( src.
block( i ), temp );
125 dst.
block( j ).axpy( 1.0, temp );
137 return computeRowSize( []( OPERATOR
const &
block ) {
return block.numGlobalRows(); } );
146 return computeColSize( []( OPERATOR
const &
block ) {
return block.numGlobalCols(); } );
156 return computeRowSize( []( OPERATOR
const &
block ) {
return block.numLocalRows(); } );
166 return computeColSize( []( OPERATOR
const &
block ) {
return block.numLocalCols(); } );
176 virtual MPI_Comm
comm()
const override
178 return m_operators( 0, 0 )->comm();
194 return m_operators.size( 0 );
203 return m_operators.size( 1 );
214 GEOS_LAI_ASSERT( m_operators( blockRowIndex, blockColIndex ) !=
nullptr );
215 return *m_operators( blockRowIndex, blockColIndex );
223 GEOS_LAI_ASSERT( m_operators( blockRowIndex, blockColIndex ) !=
nullptr );
224 return *m_operators( blockRowIndex, blockColIndex );
232 return block( blockRowIndex, blockColIndex );
240 return block( blockRowIndex, blockColIndex );
253 : m_operators( nRows, nCols )
283 m_operators( blockRowIndex, blockColIndex ) = op;
288 template<
typename FUNC >
289 auto computeRowSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) );
291 template<
typename FUNC >
292 auto computeColSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) );
298 template<
typename VECTOR,
typename OPERATOR >
299 template<
typename FUNC >
300 auto BlockOperatorView< VECTOR, OPERATOR >::computeRowSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) )
302 using sizeType = decltype( func( std::declval< OPERATOR const >() ) );
303 sizeType rowSize = 0;
304 for(
localIndex i = 0; i < numBlockRows(); ++i )
306 for(
localIndex j = 0; j < numBlockCols(); ++j )
308 if( m_operators( i, j ) != nullptr )
310 rowSize += func( block( i, j ) );
318 template<
typename VECTOR,
typename OPERATOR >
319 template<
typename FUNC >
320 auto BlockOperatorView< VECTOR, OPERATOR >::computeColSize( FUNC func )
const -> decltype( func( std::declval< OPERATOR const >() ) )
322 using sizeType = decltype( func( std::declval< OPERATOR const >() ) );
323 sizeType colSize = 0;
324 for(
localIndex j = 0; j < numBlockCols(); j++ )
326 for(
localIndex i = 0; i < numBlockRows(); ++i )
328 if( m_operators( i, j ) != nullptr )
330 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 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).