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).