51#include "Teuchos_CommandLineProcessor.hpp"
52#include "Teuchos_ParameterList.hpp"
53#include "Teuchos_StandardCatchMacros.hpp"
60#ifdef HAVE_BELOS_TRIUTILS
61#include "Trilinos_Util_iohb.h"
68using namespace Teuchos;
70int main(
int argc,
char *argv[]) {
72 typedef std::complex<double> ST;
73 typedef ScalarTraits<ST> SCT;
74 typedef SCT::magnitudeType MT;
80 ST zero = SCT::zero();
83 bool norm_failure =
false;
85 Teuchos::GlobalMPISession session(&argc, &argv, NULL);
87 int MyPID = session.getRank();
95 bool proc_verbose =
false;
98 std::string filename(
"mhd1280b.cua");
101 CommandLineProcessor cmdp(
false,
true);
102 cmdp.setOption(
"verbose",
"quiet",&verbose,
"Print messages and results.");
103 cmdp.setOption(
"frequency",&frequency,
"Solvers frequency for printing residuals (#iters).");
104 cmdp.setOption(
"filename",&filename,
"Filename for Harwell-Boeing test matrix.");
105 cmdp.setOption(
"tol",&tol,
"Relative residual tolerance used by TFQMR solver.");
106 cmdp.setOption(
"num-rhs",&numrhs,
"Number of right-hand sides to be solved for.");
107 if (cmdp.parse(argc,argv) != CommandLineProcessor::PARSE_SUCCESSFUL) {
111 proc_verbose = verbose && (MyPID==0);
119#ifndef HAVE_BELOS_TRIUTILS
120 std::cout <<
"This test requires Triutils. Please configure with --enable-triutils." << std::endl;
122 std::cout <<
"End Result: TEST FAILED" << std::endl;
133 info = readHB_newmat_double(filename.c_str(),&dim,&dim2,&nnz,
134 &colptr,&rowind,&dvals);
135 if (info == 0 || nnz < 0) {
137 std::cout <<
"Error reading '" << filename <<
"'" << std::endl;
138 std::cout <<
"End Result: TEST FAILED" << std::endl;
144 for (
int ii=0; ii<nnz; ii++) {
145 cvals[ii] = ST(dvals[ii*2],dvals[ii*2+1]);
148 RCP< MyBetterOperator<ST> > A
156 ParameterList belosList;
157 belosList.set(
"Maximum Iterations", maxits );
158 belosList.set(
"Convergence Tolerance", tol );
163 belosList.set(
"Output Frequency", frequency );
172 RCP<MyMultiVec<ST> > soln = rcp(
new MyMultiVec<ST>(dim,numrhs) );
174 MVT::MvRandom( *soln );
175 OPT::Apply( *A, *soln, *rhs );
176 MVT::MvInit( *soln, zero );
180 RCP<Belos::LinearProblem<ST,MV,OP> > problem =
182 bool set = problem->setProblem();
185 std::cout << std::endl <<
"ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl;
199 std::cout << std::endl << std::endl;
200 std::cout <<
"Dimension of matrix: " << dim << std::endl;
201 std::cout <<
"Number of right-hand sides: " << numrhs << std::endl;
202 std::cout <<
"Max number of TFQMR iterations: " << maxits << std::endl;
203 std::cout <<
"Relative residual tolerance: " << tol << std::endl;
204 std::cout << std::endl;
213 RCP<MyMultiVec<ST> > temp = rcp(
new MyMultiVec<ST>(dim,numrhs) );
214 OPT::Apply( *A, *soln, *temp );
215 MVT::MvAddMv( one, *rhs, -one, *temp, *temp );
216 std::vector<MT> norm_num(numrhs), norm_denom(numrhs);
217 MVT::MvNorm( *temp, norm_num );
218 MVT::MvNorm( *rhs, norm_denom );
219 for (
int i=0; i<numrhs; ++i) {
221 std::cout <<
"Relative residual "<<i<<
" : " << norm_num[i] / norm_denom[i] << std::endl;
222 if ( norm_num[i] / norm_denom[i] > tol ) {
236 std::cout <<
"End Result: TEST PASSED" << std::endl;
239 std::cout <<
"End Result: TEST FAILED" << std::endl;
242 TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
244 return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
Belos header file which uses auto-configuration information to include necessary C++ headers.
Class which describes the linear problem to be solved by the iterative solver.
The Belos::TFQMRSolMgr provides a solver manager for the TFQMR linear solver.
A linear system to solve, and its associated information.
Traits class which defines basic operations on multivectors.
Interface for multivectors used by Belos' linear solvers.
Class which defines basic traits for the operator type.
Alternative run-time polymorphic interface for operators.
The Belos::TFQMRSolMgr provides a powerful and fully-featured solver manager over the TFQMR linear so...
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
Simple example of a user's defined Belos::Operator class.
Simple example of a user's defined Belos::MultiVec class.
ReturnType
Whether the Belos solve converged for all linear systems.
std::string Belos_Version()
int main(int argc, char *argv[])