Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_ListedMultiVectorRandomizer.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_LISTED_MULTI_VECTOR_RANDOMIZER_HPP
11#define THYRA_LISTED_MULTI_VECTOR_RANDOMIZER_HPP
12
13#include "Thyra_MultiVectorRandomizerBase.hpp"
14#include "Thyra_MultiVectorStdOps.hpp"
15
16
17namespace Thyra {
18
19
29template<class Scalar>
31public:
32
35 const Teuchos::RCP<const MultiVectorBase<Scalar> > multiVecs[]
36 ,const int numMultiVecs
37 );
38
40 void initialize(
41 const Teuchos::RCP<const MultiVectorBase<Scalar> > multiVecs[]
42 ,const int numMultiVecs
43 );
44
47
49 bool isCompatible( const VectorSpaceBase<Scalar> &space ) const;
50
52
53private:
54
57
59 void randomizeImpl(const Ptr<MultiVectorBase<Scalar> > &mv);
60
62
63private:
64
65 typedef std::vector<Teuchos::RCP<const MultiVectorBase<Scalar> > > multiVecs_t;
66 multiVecs_t multiVecs_;
67 int curr_mv_i_;
68
69};
70
71
72// //////////////////////////////
73// Definitions
74
75
76template<class Scalar>
78 const Teuchos::RCP<const MultiVectorBase<Scalar> > multiVecs[]
79 ,const int numMultiVecs
80 )
81{
82 initialize(multiVecs,numMultiVecs);
83}
84
85
86template<class Scalar>
88 const Teuchos::RCP<const MultiVectorBase<Scalar> > multiVecs[]
89 ,const int numMultiVecs
90 )
91{
92 multiVecs_.resize(numMultiVecs);
93 std::copy( multiVecs, multiVecs + numMultiVecs, multiVecs_.begin() );
94 curr_mv_i_ = 0;
95}
96
97
98// Overridden from MultiVectorRandomizerBase
99
100
101template<class Scalar>
103{
104 return multiVecs_[curr_mv_i_]->range()->isCompatible(space);
105}
106
107
108// Overridded private functions
109
110
111template<class Scalar>
113 const Ptr<MultiVectorBase<Scalar> > &mv)
114{
115#ifdef TEUCHOS_DEBUG
116 TEUCHOS_TEST_FOR_EXCEPT( multiVecs_.size()==0 );
117#endif
118 const Teuchos::RCP<const MultiVectorBase<Scalar> > currMV = multiVecs_[curr_mv_i_];
119#ifdef TEUCHOS_DEBUG
120 THYRA_ASSERT_VEC_SPACES("ListedMultiVectorRandomizer<Scalar>::randomize(mv)", *currMV->range(), *mv->range() );
121 THYRA_ASSERT_VEC_SPACES("ListedMultiVectorRandomizer<Scalar>::randomize(mv)", *currMV->domain(), *mv->domain() );
122#endif
123 Thyra::assign( mv, *currMV );
124 if( curr_mv_i_ == static_cast<int>(multiVecs_.size()) - 1 )
125 curr_mv_i_ = 0;
126 else
127 ++curr_mv_i_;
128}
129
130
131} // namespace Thyra
132
133
134#endif // THYRA_LISTED_MULTI_VECTOR_RANDOMIZER_HPP
MultiVectorRandomizerBase subclass that returns a revolving list of preset MultiVectorBase objects.
bool isCompatible(const VectorSpaceBase< Scalar > &space) const
ListedMultiVectorRandomizer(const Teuchos::RCP< const MultiVectorBase< Scalar > > multiVecs[], const int numMultiVecs)
Calls this->initialize().
void initialize(const Teuchos::RCP< const MultiVectorBase< Scalar > > multiVecs[], const int numMultiVecs)
Interface for a collection of column vectors called a multi-vector.
Base interface for a strategy object for randomizing a multi-vector.
Abstract interface for objects that represent a space for vectors.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
This is a very useful macro that should be used to validate that two vector spaces are compatible.