63 #ifdef HAVE_BELOS_TRIUTILS
64 #include "Trilinos_Util_iohb.h"
71 using namespace Teuchos;
73 int main(
int argc,
char *argv[]) {
76 typedef std::complex<double> ST;
78 typedef std::complex<double> ST;
80 std::cout <<
"Not compiled with std::complex support." << std::endl;
81 std::cout <<
"End Result: TEST FAILED" << std::endl;
86 typedef SCT::magnitudeType MT;
92 ST zero = SCT::zero();
100 bool success =
false;
101 bool verbose =
false;
104 bool norm_failure =
false;
105 bool proc_verbose =
false;
110 int maxrestarts = 15;
112 std::string
filename(
"mhd1280b.cua");
116 cmdp.
setOption(
"verbose",
"quiet",&verbose,
"Print messages and results.");
117 cmdp.
setOption(
"pseudo",
"regular",&pseudo,
"Use pseudo-block GMRES to solve the linear systems.");
118 cmdp.
setOption(
"frequency",&frequency,
"Solvers frequency for printing residuals (#iters).");
119 cmdp.
setOption(
"filename",&filename,
"Filename for Harwell-Boeing test matrix.");
120 cmdp.
setOption(
"tol",&tol,
"Relative residual tolerance used by GMRES solver.");
121 cmdp.
setOption(
"num-rhs",&numrhs,
"Number of right-hand sides to be solved for.");
122 cmdp.
setOption(
"num-restarts",&maxrestarts,
"Maximum number of restarts allowed for the GMRES solver.");
123 cmdp.
setOption(
"blocksize",&blocksize,
"Block size used by GMRES.");
124 cmdp.
setOption(
"subspace-length",&length,
"Maximum dimension of block-subspace used by GMRES solver.");
129 proc_verbose = verbose && (MyPID==0);
136 #ifndef HAVE_BELOS_TRIUTILS
137 std::cout <<
"This test requires Triutils. Please configure with --enable-triutils." << std::endl;
139 std::cout <<
"End Result: TEST FAILED" << std::endl;
150 info = readHB_newmat_double(filename.c_str(),&dim,&dim2,&nnz,
151 &colptr,&rowind,&dvals);
152 if (info == 0 || nnz < 0) {
154 std::cout <<
"Error reading '" << filename <<
"'" << std::endl;
155 std::cout <<
"End Result: TEST FAILED" << std::endl;
161 for (
int ii=0; ii<nnz; ii++) {
162 cvals[ii] = ST(dvals[ii*2],dvals[ii*2+1]);
171 int maxits = dim/blocksize;
174 belosList.
set(
"Num Blocks", length );
175 belosList.
set(
"Block Size", blocksize );
176 belosList.
set(
"Maximum Iterations", maxits );
177 belosList.
set(
"Maximum Restarts", maxrestarts );
178 belosList.
set(
"Convergence Tolerance", tol );
183 belosList.
set(
"Output Frequency", frequency );
194 MVT::MvRandom( *soln );
195 OPT::Apply( *A, *soln, *rhs );
196 MVT::MvInit( *soln, zero );
202 bool set = problem->setProblem();
205 std::cout << std::endl <<
"ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl;
224 solver->setDebugStatusTest(
Teuchos::rcp(&debugTest,
false) );
230 std::cout << std::endl << std::endl;
231 std::cout <<
"Dimension of matrix: " << dim << std::endl;
232 std::cout <<
"Number of right-hand sides: " << numrhs << std::endl;
233 std::cout <<
"Block size used by solver: " << blocksize << std::endl;
234 std::cout <<
"Max number of Gmres iterations: " << maxits << std::endl;
235 std::cout <<
"Relative residual tolerance: " << tol << std::endl;
236 std::cout << std::endl;
246 OPT::Apply( *A, *soln, *temp );
247 MVT::MvAddMv( one, *rhs, -one, *temp, *temp );
248 std::vector<MT> norm_num(numrhs), norm_denom(numrhs);
249 MVT::MvNorm( *temp, norm_num );
250 MVT::MvNorm( *rhs, norm_denom );
251 for (
int i=0; i<numrhs; ++i) {
253 std::cout <<
"Relative residual "<<i<<
" : " << norm_num[i] / norm_denom[i] << std::endl;
254 if ( norm_num[i] / norm_denom[i] > tol ) {
260 const std::vector<MT> residualLog = debugTest.
getLogResNorm();
261 if (numrhs==1 && proc_verbose && residualLog.size())
263 std::cout <<
"Absolute residual 2-norm [ " << residualLog.size() <<
" ] : ";
264 for (
unsigned int i=0; i<residualLog.size(); i++)
265 std::cout << residualLog[i] <<
" ";
266 std::cout << std::endl;
267 std::cout <<
"Final abs 2-norm / rhs 2-norm : " << residualLog[residualLog.size()-1] / norm_denom[0] << std::endl;
279 std::cout <<
"End Result: TEST PASSED" << std::endl;
282 std::cout <<
"End Result: TEST FAILED" << std::endl;
287 return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
std::string Belos_Version()
int main(int argc, char *argv[])
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
const std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > & getLogResNorm() const
Returns the log of the absolute residual norm from the iteration.
A Belos::StatusTest debugging class for storing the absolute residual norms generated during a solve...
Interface to Block GMRES and Flexible GMRES.
Belos::StatusTest debugging class for storing the absolute residual norms generated during a solve...
Traits class which defines basic operations on multivectors.
Simple example of a user's defined Belos::MultiVec class.
Alternative run-time polymorphic interface for operators.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
The Belos::BlockGmresSolMgr provides a solver manager for the BlockGmres linear solver.
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
#define TEUCHOS_STANDARD_CATCH_STATEMENTS(VERBOSE, ERR_STREAM, SUCCESS_FLAG)
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
EParseCommandLineReturn parse(int argc, char *argv[], std::ostream *errout=&std::cerr) const
Interface to standard and "pseudoblock" GMRES.
ReturnType
Whether the Belos solve converged for all linear systems.
Interface for multivectors used by Belos' linear solvers.
Class which defines basic traits for the operator type.
The Belos::PseudoBlockGmresSolMgr provides a solver manager for the BlockGmres linear solver...
Belos header file which uses auto-configuration information to include necessary C++ headers...
Simple example of a user's defined Belos::Operator class.