30 #ifdef HAVE_BELOS_TRIUTILS
31 #include "Trilinos_Util_iohb.h"
38 using namespace Teuchos;
40 int main(
int argc,
char *argv[]) {
42 typedef std::complex<double> ST;
44 typedef SCT::magnitudeType MT;
50 ST zero = SCT::zero();
62 bool norm_failure =
false;
63 bool proc_verbose =
false;
64 bool userandomrhs =
true;
72 std::string outersolver(
"Block Gmres");
73 std::string
filename(
"mhd1280b.cua");
74 std::string polyType(
"Arnoldi");
79 cmdp.
setOption(
"verbose",
"quiet",&verbose,
"Print messages and results.");
80 cmdp.
setOption(
"use-random-rhs",
"use-rhs",&userandomrhs,
"Use linear system RHS or random RHS to generate polynomial.");
81 cmdp.
setOption(
"frequency",&frequency,
"Solvers frequency for printing residuals (#iters).");
82 cmdp.
setOption(
"filename",&filename,
"Filename for test matrix. Acceptable file extensions: *.hb,*.mtx,*.triU,*.triS");
83 cmdp.
setOption(
"outersolver",&outersolver,
"Name of outer solver to be used with GMRES poly");
84 cmdp.
setOption(
"tol",&tol,
"Relative residual tolerance used by GMRES solver.");
85 cmdp.
setOption(
"poly-tol",&polytol,
"Relative residual tolerance used to construct the GMRES polynomial.");
86 cmdp.
setOption(
"poly-type",&polyType,
"Polynomial type (Roots, Arnoldi, or Gmres).");
87 cmdp.
setOption(
"num-rhs",&numrhs,
"Number of right-hand sides to be solved for.");
88 cmdp.
setOption(
"block-size",&blocksize,
"Block size used by GMRES.");
89 cmdp.
setOption(
"max-iters",&maxiters,
"Maximum number of iterations per linear system (-1 = adapted to problem/block size).");
90 cmdp.
setOption(
"max-degree",&maxdegree,
"Maximum degree of the GMRES polynomial.");
91 cmdp.
setOption(
"max-subspace",&maxsubspace,
"Maximum number of blocks the solver can use for the subspace.");
92 cmdp.
setOption(
"max-restarts",&maxrestarts,
"Maximum number of restarts allowed for GMRES solver.");
97 proc_verbose = verbose && (MyPID==0);
104 #ifndef HAVE_BELOS_TRIUTILS
105 std::cout <<
"This test requires Triutils. Please configure with --enable-triutils." << std::endl;
107 std::cout <<
"End Result: TEST FAILED" << std::endl;
118 info = readHB_newmat_double(filename.c_str(),&dim,&dim2,&nnz,
119 &colptr,&rowind,&dvals);
120 if (info == 0 || nnz < 0) {
122 std::cout <<
"Error reading '" << filename <<
"'" << std::endl;
123 std::cout <<
"End Result: TEST FAILED" << std::endl;
129 for (
int ii=0; ii<nnz; ii++) {
130 cvals[ii] = ST(dvals[ii*2],dvals[ii*2+1]);
142 MVT::MvRandom( *soln );
143 OPT::Apply( *A, *soln, *rhs );
144 MVT::MvInit( *soln, zero );
150 problem->setInitResVec( rhs );
151 bool set = problem->setProblem();
154 std::cout << std::endl <<
"ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl;
162 maxiters = dim/blocksize - 1;
165 belosList.
set(
"Num Blocks", maxsubspace);
166 belosList.
set(
"Block Size", blocksize );
167 belosList.
set(
"Maximum Iterations", maxiters );
168 belosList.
set(
"Maximum Restarts", maxrestarts );
169 belosList.
set(
"Convergence Tolerance", tol );
174 belosList.
set(
"Output Frequency", frequency );
176 belosList.
set(
"Verbosity", verbosity );
179 polyList.
set(
"Maximum Degree", maxdegree );
180 polyList.
set(
"Polynomial Tolerance", polytol );
181 polyList.
set(
"Polynomial Type", polyType );
182 polyList.
set(
"Verbosity", verbosity );
183 polyList.
set(
"Random RHS", userandomrhs );
184 if ( outersolver !=
"" ) {
185 polyList.
set(
"Outer Solver", outersolver );
186 polyList.
set(
"Outer Solver Params", belosList );
207 std::cout << std::endl << std::endl;
208 std::cout <<
"Dimension of matrix: " << dim << std::endl;
209 std::cout <<
"Number of right-hand sides: " << numrhs << std::endl;
210 std::cout <<
"Block size used by solver: " << blocksize << std::endl;
211 std::cout <<
"Max number of Gmres iterations: " << maxiters << std::endl;
212 std::cout <<
"Relative residual tolerance: " << tol << std::endl;
213 std::cout << std::endl;
220 std::cout <<
"Belos::GmresPolySolMgr returned achievedTol: " << solver->achievedTol() << std::endl << std::endl;
224 OPT::Apply( *A, *soln, *temp );
225 MVT::MvAddMv( one, *rhs, -one, *temp, *temp );
226 std::vector<MT> norm_num(numrhs), norm_denom(numrhs);
227 MVT::MvNorm( *temp, norm_num );
228 MVT::MvNorm( *rhs, norm_denom );
229 for (
int i=0; i<numrhs; ++i) {
231 std::cout <<
"Relative residual "<<i<<
" : " << norm_num[i] / norm_denom[i] << std::endl;
232 if ( norm_num[i] / norm_denom[i] > tol ) {
238 const std::vector<MT> residualLog = debugTest.
getLogResNorm();
239 if (numrhs==1 && proc_verbose && residualLog.size())
241 std::cout <<
"Absolute residual 2-norm [ " << residualLog.size() <<
" ] : ";
242 for (
unsigned int i=0; i<residualLog.size(); i++)
243 std::cout << residualLog[i] <<
" ";
244 std::cout << std::endl;
245 std::cout <<
"Final abs 2-norm / rhs 2-norm : " << residualLog[residualLog.size()-1] / norm_denom[0] << std::endl;
257 std::cout <<
"End Result: TEST PASSED" << std::endl;
260 std::cout <<
"End Result: TEST FAILED" << std::endl;
265 return ( success ? EXIT_SUCCESS : EXIT_FAILURE );
std::string Belos_Version()
int main(int argc, char *argv[])
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...
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
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)
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
Declaration and definition of Belos::GmresPolySolMgr (hybrid block GMRES linear solver).
#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
The GMRES polynomial can be created in conjunction with any standard preconditioner.
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.
Belos header file which uses auto-configuration information to include necessary C++ headers...
Simple example of a user's defined Belos::Operator class.