10#ifndef ROL_BLOCKDIAGONALOPERATOR_DEF_H
11#define ROL_BLOCKDIAGONALOPERATOR_DEF_H
19 : diag_(diag), numOp_(diag.size()) {}
23 ROL_TEST_FOR_EXCEPTION( (i >= numOp_), std::invalid_argument,
24 ">>> ERROR (ROL_BlockDiagonalOperator, get): "
25 "Input exceeds number of blocks.");
38 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
39 ">>> ERROR (ROL_BlockDiagonalOperator, apply): "
40 "Mismatch between input and output number of subvectors.");
42 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
43 ">>> ERROR (ROL_BlockDiagonalOperator, apply): "
44 "Block operator dimension mismatch.");
46 for (
unsigned i=0; i<numOp_; ++i)
47 diag_[i]->
apply(*(Hv_part.
get(i)), *(v_part.
get(i)), tol);
59 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
60 ">>> ERROR (ROL_BlockDiagonalOperator, applyInverse): "
61 "Mismatch between input and output number of subvectors.");
63 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
64 ">>> ERROR (ROL_BlockDiagonalOperator, applyInverse): "
65 "Block operator dimension mismatch.");
67 for (
unsigned i=0; i<numOp_; ++i)
80 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
81 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjoint): "
82 "Mismatch between input and output number of subvectors.");
84 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
85 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjoint): "
86 "Block operator dimension mismatch.");
88 for (
unsigned i=0; i<numOp_; ++i)
89 diag_[i]->applyAdjoint(*(Hv_part.
get(i)), *(v_part.
get(i)), tol);
101 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
102 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjointInverse): "
103 "Mismatch between input and output number of subvectors.");
105 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
106 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjointInverse): "
107 "Block operator dimension mismatch.");
109 for (
unsigned i=0; i<numOp_; ++i)
110 diag_[i]->applyAdjointInverse(*(Hv_part.
get(i)), *(v_part.
get(i)), tol);
void applyAdjoint(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const override
Apply adjoint of linear operator.
void apply(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const override
Apply linear operator.
void applyAdjointInverse(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const override
Apply adjoint of the inverse linear operator.
BlockDiagonalOperator(const std::vector< Ptr< LinearOperator< Real > > > &diag)
void applyInverse(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const override
Apply inverse of linear operator.
const Ptr< LinearOperator< Real > > get(unsigned i) const
Provides the interface to apply a linear operator.
Defines the linear algebra of vector space on a generic partitioned vector.
ROL::Ptr< const Vector< Real > > get(size_type i) const
size_type numVectors() const
Defines the linear algebra or vector space interface.
ROL::BlockOperator2Diagonal BlockOperator2 apply(V &Hv, const V &v, Real &tol) const
void applyInverse(V &Hv, const V &v Real &tol) const