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"
68 using namespace Teuchos;
70 int main(
int argc,
char *argv[]) {
73 typedef std::complex<double> ST;
75 typedef std::complex<double> ST;
77 std::cout <<
"Not compiled with std::complex support." << std::endl;
78 std::cout <<
"End Result: TEST FAILED" << std::endl;
82 typedef ScalarTraits<ST> SCT;
83 typedef SCT::magnitudeType MT;
89 ST zero = SCT::zero();
92 bool norm_failure =
false;
94 Teuchos::GlobalMPISession session(&argc, &argv, NULL);
96 int MyPID = session.getRank();
101 bool success =
false;
102 bool verbose =
false;
104 bool proc_verbose =
false;
108 std::string filename(
"mhd1280b.cua");
111 CommandLineProcessor cmdp(
false,
true);
112 cmdp.setOption(
"verbose",
"quiet",&verbose,
"Print messages and results.");
113 cmdp.setOption(
"frequency",&frequency,
"Solvers frequency for printing residuals (#iters).");
114 cmdp.setOption(
"filename",&filename,
"Filename for Harwell-Boeing test matrix.");
115 cmdp.setOption(
"tol",&tol,
"Relative residual tolerance used by pseudo-block TFQMR solver.");
116 cmdp.setOption(
"num-rhs",&numrhs,
"Number of right-hand sides to be solved for.");
117 if (cmdp.parse(argc,argv) != CommandLineProcessor::PARSE_SUCCESSFUL) {
121 proc_verbose = verbose && (MyPID==0);
129 #ifndef HAVE_BELOS_TRIUTILS
130 std::cout <<
"This test requires Triutils. Please configure with --enable-triutils." << std::endl;
132 std::cout <<
"End Result: TEST FAILED" << std::endl;
143 info = readHB_newmat_double(filename.c_str(),&dim,&dim2,&nnz,
144 &colptr,&rowind,&dvals);
145 if (info == 0 || nnz < 0) {
147 std::cout <<
"Error reading '" << filename <<
"'" << std::endl;
148 std::cout <<
"End Result: TEST FAILED" << std::endl;
154 for (
int ii=0; ii<nnz; ii++) {
155 cvals[ii] = ST(dvals[ii*2],dvals[ii*2+1]);
158 RCP< MyBetterOperator<ST> > A
164 int maxits = dim/blocksize;
166 ParameterList belosList;
167 belosList.set(
"Maximum Iterations", maxits );
168 belosList.set(
"Convergence Tolerance", tol );
173 belosList.set(
"Output Frequency", frequency );
182 RCP<MyMultiVec<ST> > soln = rcp(
new MyMultiVec<ST>(dim,numrhs) );
184 MVT::MvRandom( *soln );
185 OPT::Apply( *A, *soln, *rhs );
186 MVT::MvInit( *soln, zero );
190 RCP<Belos::LinearProblem<ST,MV,OP> > problem =
192 bool set = problem->setProblem();
195 std::cout << std::endl <<
"ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl;
209 std::cout << std::endl << std::endl;
210 std::cout <<
"Dimension of matrix: " << dim << std::endl;
211 std::cout <<
"Number of right-hand sides: " << numrhs << std::endl;
212 std::cout <<
"Block size used by solver: " << blocksize << std::endl;
213 std::cout <<
"Max number of pseudo-block TFQMR iterations: " << maxits << std::endl;
214 std::cout <<
"Relative residual tolerance: " << tol << std::endl;
215 std::cout << std::endl;
224 RCP<MyMultiVec<ST> > temp = rcp(
new MyMultiVec<ST>(dim,numrhs) );
225 OPT::Apply( *A, *soln, *temp );
226 MVT::MvAddMv( one, *rhs, -one, *temp, *temp );
227 std::vector<MT> norm_num(numrhs), norm_denom(numrhs);
228 MVT::MvNorm( *temp, norm_num );
229 MVT::MvNorm( *rhs, norm_denom );
230 for (
int i=0; i<numrhs; ++i) {
232 std::cout <<
"Relative residual "<<i<<
" : " << norm_num[i] / norm_denom[i] << std::endl;
233 if ( norm_num[i] / norm_denom[i] > tol ) {
247 std::cout <<
"End Result: TEST PASSED" << std::endl;
250 std::cout <<
"End Result: TEST FAILED" << std::endl;
253 TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
255 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::PseudoBlockTFQMRSolMgr provides a solver manager for the pseudo-block 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::PseudoBlockTFQMRSolMgr provides a powerful and fully-featured solver manager over the pseu...
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[])