ROL
Loading...
Searching...
No Matches
ROL_BlockDiagonalOperator_Def.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Rapid Optimization Library (ROL) Package
4//
5// Copyright 2014 NTESS and the ROL contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef ROL_BLOCKDIAGONALOPERATOR_DEF_H
11#define ROL_BLOCKDIAGONALOPERATOR_DEF_H
12
14
15namespace ROL {
16
17template<class Real>
19 : diag_(diag), numOp_(diag.size()) {}
20
21template<class Real>
22const Ptr<LinearOperator<Real>> BlockDiagonalOperator<Real>::get(unsigned i) const {
23 ROL_TEST_FOR_EXCEPTION( (i >= numOp_), std::invalid_argument,
24 ">>> ERROR (ROL_BlockDiagonalOperator, get): "
25 "Input exceeds number of blocks.");
26 return diag_[i];
27}
28
29template<class Real>
30void BlockDiagonalOperator<Real>::apply( Vector<Real> &Hv, const Vector<Real> &v, Real &tol ) const {
31 // Downcast to Partitioned Vectors
32 PartitionedVector<Real> &Hv_part = dynamic_cast<PartitionedVector<Real>&>(Hv);
33 const PartitionedVector<Real> &v_part = dynamic_cast<const PartitionedVector<Real>&>(v);
34
35 unsigned nvec1 = v_part.numVectors();
36 unsigned nvec2 = Hv_part.numVectors();
37
38 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
39 ">>> ERROR (ROL_BlockDiagonalOperator, apply): "
40 "Mismatch between input and output number of subvectors.");
41
42 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
43 ">>> ERROR (ROL_BlockDiagonalOperator, apply): "
44 "Block operator dimension mismatch.");
45
46 for (unsigned i=0; i<numOp_; ++i)
47 diag_[i]->apply(*(Hv_part.get(i)), *(v_part.get(i)), tol);
48}
49
50template<class Real>
52 // Downcast to Partitioned Vectors
53 PartitionedVector<Real> &Hv_part = dynamic_cast<PartitionedVector<Real>&>(Hv);
54 const PartitionedVector<Real> &v_part = dynamic_cast<const PartitionedVector<Real>&>(v);
55
56 unsigned nvec1 = v_part.numVectors();
57 unsigned nvec2 = Hv_part.numVectors();
58
59 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
60 ">>> ERROR (ROL_BlockDiagonalOperator, applyInverse): "
61 "Mismatch between input and output number of subvectors.");
62
63 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
64 ">>> ERROR (ROL_BlockDiagonalOperator, applyInverse): "
65 "Block operator dimension mismatch.");
66
67 for (unsigned i=0; i<numOp_; ++i)
68 diag_[i]->applyInverse(*(Hv_part.get(i)), *(v_part.get(i)), tol);
69}
70
71template<class Real>
73 // Downcast to Partitioned Vectors
74 PartitionedVector<Real> &Hv_part = dynamic_cast<PartitionedVector<Real>&>(Hv);
75 const PartitionedVector<Real> &v_part = dynamic_cast<const PartitionedVector<Real>&>(v);
76
77 unsigned nvec1 = v_part.numVectors();
78 unsigned nvec2 = Hv_part.numVectors();
79
80 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
81 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjoint): "
82 "Mismatch between input and output number of subvectors.");
83
84 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
85 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjoint): "
86 "Block operator dimension mismatch.");
87
88 for (unsigned i=0; i<numOp_; ++i)
89 diag_[i]->applyAdjoint(*(Hv_part.get(i)), *(v_part.get(i)), tol);
90}
91
92template<class Real>
94 // Downcast to Partitioned Vectors
95 PartitionedVector<Real> &Hv_part = dynamic_cast<PartitionedVector<Real>&>(Hv);
96 const PartitionedVector<Real> &v_part = dynamic_cast<const PartitionedVector<Real>&>(v);
97
98 unsigned nvec1 = v_part.numVectors();
99 unsigned nvec2 = Hv_part.numVectors();
100
101 ROL_TEST_FOR_EXCEPTION( (nvec1 != nvec2), std::invalid_argument,
102 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjointInverse): "
103 "Mismatch between input and output number of subvectors.");
104
105 ROL_TEST_FOR_EXCEPTION( (numOp_ != nvec2 ) , std::invalid_argument,
106 ">>> ERROR (ROL_BlockDiagonalOperator, applyAdjointInverse): "
107 "Block operator dimension mismatch.");
108
109 for (unsigned i=0; i<numOp_; ++i)
110 diag_[i]->applyAdjointInverse(*(Hv_part.get(i)), *(v_part.get(i)), tol);
111}
112
113} // namespace ROL
114
115#endif // ROL_BLOCKDIAGONALOPERATOR_DEF_H
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
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