Anasazi  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TsqrRandomizer.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Anasazi: Block Eigensolvers Package
5 // Copyright 2004 Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef __TSQR_Trilinos_Randomizer_hpp
43 #define __TSQR_Trilinos_Randomizer_hpp
44 
45 #include "AnasaziConfigDefs.hpp"
46 #include "TsqrTypeAdaptor.hpp"
47 #include "TsqrCommFactory.hpp"
48 
49 #include "Tsqr_ScalarTraits.hpp"
50 #include "Tsqr_Random_GlobalMatrix.hpp"
51 
52 #include <string>
53 
56 
57 namespace TSQR {
58  namespace Trilinos {
70  template< class S, class LO, class GO, class MV, class Gen >
71  class Randomizer {
72  public:
73  typedef S scalar_type;
74  typedef LO local_ordinal_type;
75  typedef GO global_ordinal_type;
76  typedef MV multivector_type;
77  typedef Gen normalgen_type;
79  typedef TSQR::Random::MatrixGenerator< S, LO, Gen > matgen_type;
80 
81  typedef typename TSQR::ScalarTraits< S >::magnitude_type magnitude_type;
82 
83  typedef TsqrTypeAdaptor< S, LO, GO, MV > type_adaptor;
84  typedef typename type_adaptor::comm_type comm_type;
85  typedef typename type_adaptor::comm_ptr comm_ptr;
88 
89  virtual ~Randomizer() {}
90 
100  virtual void
101  randomMultiVector (multivector_type& A,
102  const magnitude_type singularValues[])
103  {
104  using TSQR::Random::randomGlobalMatrix;
105  using Teuchos::ArrayRCP;
106  typedef MatView< local_ordinal_type, scalar_type > matview_type;
107 
108  local_ordinal_type nrowsLocal, ncols, LDA;
109  fetchDims (A, nrowsLocal, ncols, LDA);
110  ArrayRCP< scalar_type > A_ptr = fetchNonConstView (A);
111  matview_type A_view (nrowsLocal, ncols, A_ptr.get(), LDA);
112 
113  randomGlobalMatrix (pGen_.get(), A_view, singularValues,
114  pOrdinalMessenger_.get(), pScalarMessenger_.get());
115  }
116 
117  protected:
126  void
127  init (const multivector_type& mv,
128  const normalgen_ptr& pGen)
129  {
130  pGen_ = pGen;
131  // This is done in a multivector type - dependent way.
132  fetchMessengers (mv, pScalarMessenger_, pOrdinalMessenger_);
133  }
134 
135  private:
151  virtual void
152  fetchDims (const multivector_type& A,
153  local_ordinal_type& nrowsLocal,
154  local_ordinal_type& ncols,
155  local_ordinal_type& LDA) const = 0;
156 
165  fetchNonConstView (multivector_type& A) const = 0;
166 
169  virtual void
170  fetchMessengers (const multivector_type& mv,
171  scalar_messenger_ptr& pScalarMessenger,
172  ordinal_messenger_ptr& pOrdinalMessenger) const = 0;
173 
174  normalgen_ptr pGen_;
175  ordinal_messenger_ptr pOrdinalMessenger_;
176  scalar_messenger_ptr pScalarMessenger_;
177  };
178 
179  } // namespace Trilinos
180 } // namespace TSQR
181 
182 #endif // __TSQR_Trilinos_Randomizer_hpp
T * get() const
Generates random test problems for TSQR.
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
virtual void randomMultiVector(multivector_type &A, const magnitude_type singularValues[])
Fill A with a (pseudo)random (distributed) matrix.
void init(const multivector_type &mv, const normalgen_ptr &pGen)