Belos Package Browser (Single Doxygen Collection)  Development
cxx_main_complex.cpp
Go to the documentation of this file.
1 //@HEADER
2 // ************************************************************************
3 //
4 // Belos: Block Linear Solvers Package
5 // Copyright 2004 Sandia Corporation
6 //
7 // Under the 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 // This test instantiates the Belos classes using a std::complex scalar type
43 // and checks functionality.
44 //
45 
46 #include "BelosConfigDefs.hpp"
47 #include "BelosMVOPTester.hpp"
48 #include "Teuchos_CommandLineProcessor.hpp"
49 #include "Teuchos_StandardCatchMacros.hpp"
50 #include "BelosOutputManager.hpp"
51 
52 #ifdef HAVE_MPI
53 #include <mpi.h>
54 #endif
55 
56 // I/O for Harwell-Boeing files
57 #ifdef HAVE_BELOS_TRIUTILS
58 #include "Trilinos_Util_iohb.h"
59 #endif
60 
61 #include "MyMultiVec.hpp"
62 #include "MyOperator.hpp"
63 #include "MyBetterOperator.hpp"
64 
65 using namespace Teuchos;
66 
67 int main(int argc, char *argv[])
68 {
69  bool ierr, gerr;
70  gerr = true;
71 
72 #ifdef HAVE_MPI
73  // Initialize MPI and setup an Epetra communicator
74  MPI_Init(&argc,&argv);
75 #endif
76 
77  bool success = false;
78  bool verbose = false;
79  try {
80  int MyPID;
81 #ifdef HAVE_MPI
82  MPI_Comm_rank(MPI_COMM_WORLD, &MyPID);
83 #else
84  MyPID = 0;
85 #endif
86  (void) MyPID; // forestall "set but not used" warnings
87 
88  std::string filename("mhd1280b.cua");
89 
90  // number of global elements
91  int blockSize = 5;
92 
93  CommandLineProcessor cmdp(false,true);
94  cmdp.setOption("verbose","quiet",&verbose,"Print messages and results.");
95  cmdp.setOption("debug","quiet",&verbose,"Print messages and results.");
96  cmdp.setOption("filename",&filename,"Filename for Harwell-Boeing test matrix.");
97  if (cmdp.parse(argc,argv) != CommandLineProcessor::PARSE_SUCCESSFUL) {
98 #ifdef HAVE_MPI
99  MPI_Finalize();
100 #endif
101  return -1;
102  }
103 
104  typedef std::complex<double> ST;
105 
106  // Issue several useful typedefs;
107  typedef Belos::MultiVec<ST> MV;
108  typedef Belos::Operator<ST> OP;
109  typedef Belos::MultiVecTraits<ST,MV> MVT;
110  //typedef Belos::OperatorTraits<ST,MV,OP> OPT;
111 
112  // Create an output manager to handle the I/O from the solver
113  RCP<Belos::OutputManager<ST> > MyOM
114  = rcp( new Belos::OutputManager<ST>() );
115  if (verbose) {
116  MyOM->setVerbosity( Belos::Warnings );
117  }
118 
119 #ifndef HAVE_BELOS_TRIUTILS
120  std::cout << "This test requires Triutils. Please configure with --enable-triutils." << std::endl;
121 #ifdef EPETRA_MPI
122  MPI_Finalize() ;
123 #endif
124  MyOM->print(Belos::Warnings,"End Result: TEST FAILED\n");
125  return -1;
126 #endif
127 
128  // Get the data from the HB file
129  int info;
130  int dim,dim2,nnz;
131  double *dvals;
132  int *colptr,*rowind;
133  nnz = -1;
134  info = readHB_newmat_double(filename.c_str(),&dim,&dim2,&nnz,&colptr,&rowind,&dvals);
135  if (info == 0 || nnz < 0) {
136  MyOM->stream(Belos::Warnings)
137  << "Warning reading '" << filename << "'" << std::endl
138  << "End Result: TEST FAILED" << std::endl;
139 #ifdef HAVE_MPI
140  MPI_Finalize();
141 #endif
142  return -1;
143  }
144  // Convert interleaved doubles to std::complex values
145  std::vector<ST> cvals(nnz);
146  for (int ii=0; ii<nnz; ii++) {
147  cvals[ii] = ST(dvals[ii*2],dvals[ii*2+1]);
148  }
149  // Build the problem matrix
150  RCP< MyBetterOperator<ST> > A1
151  = rcp( new MyBetterOperator<ST>(dim,colptr,nnz,rowind,&cvals[0]) );
152 
153 
154  // Create a MyMultiVec for cloning
155  std::vector<ScalarTraits<ST>::magnitudeType> v(blockSize);
156  RCP< MyMultiVec<ST> > ivec = rcp( new MyMultiVec<ST>(dim,blockSize) );
157  MVT::MvNorm(*ivec,v);
158 
159  // Create a MyOperator for testing against
160  RCP<MyOperator<ST> > A2 = rcp( new MyOperator<ST>(dim) );
161 
162  // test the multivector and its adapter
163  ierr = Belos::TestMultiVecTraits<ST,MV>(MyOM,ivec);
164  gerr &= ierr;
165  if (ierr) {
166  MyOM->print(Belos::Warnings, "*** MyMultiVec<std::complex> PASSED TestMultiVecTraits()\n");
167  }
168  else {
169  MyOM->print(Belos::Warnings, "*** MyMultiVec<std::complex> FAILED TestMultiVecTraits() ***\n\n");
170  }
171 
172  // test the operator and its adapter
173  ierr = Belos::TestOperatorTraits<ST,MV,OP>(MyOM,ivec,A2);
174  gerr &= ierr;
175  if (ierr) {
176  MyOM->print(Belos::Warnings,"*** MyOperator<std::complex> PASSED TestOperatorTraits()\n");
177  }
178  else {
179  MyOM->print(Belos::Warnings,"*** MyOperator<std::complex> FAILED TestOperatorTraits() ***\n\n");
180  }
181 
182  // test the operator and its adapter
183  ierr = Belos::TestOperatorTraits<ST,MV,OP>(MyOM,ivec,A1);
184  gerr &= ierr;
185  if (ierr) {
186  MyOM->print(Belos::Warnings,"*** MyBetterOperator<std::complex> PASSED TestOperatorTraits()\n");
187  }
188  else {
189  MyOM->print(Belos::Warnings,"*** MyBetterOperator<std::complex> FAILED TestOperatorTraits() ***\n\n");
190  }
191 
192  // Clean up.
193  free( dvals );
194  free( colptr );
195  free( rowind );
196 
197  success = gerr;
198  if (success) {
199  MyOM->print(Belos::Warnings,"End Result: TEST PASSED\n");
200  } else {
201  MyOM->print(Belos::Warnings,"End Result: TEST FAILED\n");
202  }
203  }
204  TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
205 
206 #ifdef HAVE_MPI
207  MPI_Finalize();
208 #endif
209 
210  return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
211 }
Belos&#39;s basic output manager for sending information of select verbosity levels to the appropriate ou...
Class which manages the output and verbosity of the Belos solvers.
Traits class which defines basic operations on multivectors.
Simple example of a user&#39;s defined Belos::MultiVec class.
Definition: MyMultiVec.hpp:65
Alternative run-time polymorphic interface for operators.
Test routines for MultiVecTraits and OperatorTraits conformity.
Simple example of a user&#39;s defined Belos::Operator class.
Definition: MyOperator.hpp:65
Interface for multivectors used by Belos&#39; linear solvers.
Belos header file which uses auto-configuration information to include necessary C++ headers...
Simple example of a user&#39;s defined Belos::Operator class.
int main(int argc, char *argv[])