43#include "sillyCgSolve.hpp"
46#include "Thyra_DefaultSpmdVectorSpace.hpp"
55int main(
int argc,
char *argv[])
70 MPI_Comm mpiComm = MPI_COMM_WORLD;
87 double diagScale = 1.001;
88 bool useWithNonEpetraVectors =
false;
89 double tolerance = 1e-4;
90 int maxNumIters = 300;
93 clp.
setOption(
"verbose",
"quiet", &verbose,
"Determines if any output is printed or not." );
94 clp.
setOption(
"global-dim", &globalDim,
"Global dimension of the linear system." );
95 clp.
setOption(
"diag-scale", &diagScale,
"Scaling of the diagonal to improve conditioning." );
96 clp.
setOption(
"use-with-non-epetra-vectors",
"use-with-epetra-vectors", &useWithNonEpetraVectors
97 ,
"Use non-epetra vectors with Epetra operator or not." );
98 clp.
setOption(
"tol", &tolerance,
"Relative tolerance for linear system solve." );
99 clp.
setOption(
"max-num-iters", &maxNumIters,
"Maximum of CG iterations." );
106 if(verbose) *out <<
"\n***\n*** Running CG example using Epetra implementation\n***\n" << std::scientific;
118 if(verbose) *out <<
"\n(1) Constructing tridagonal Epetra matrix A_epetra of global dimension = " << globalDim <<
" ...\n";
125 ,diagScale,verbose,*out
132 b_space =
A->range();
135 Thyra::seed_randomize<double>(0);
136 Thyra::randomize( -1.0, +1.0, b.
ptr() );
139 Thyra::assign( x.
ptr(), 0.0 );
143 result = sillyCgSolve(*
A, *b, maxNumIters, tolerance, x.
ptr(), *out);
144 if(!result) success =
false;
149 Thyra::assign(r.
ptr(),*b);
150 Thyra::apply(*
A,Thyra::NOTRANS,*x,r.
ptr(),-1.0,+1.0);
151 const double r_nrm = Thyra::norm(*r), b_nrm =Thyra:: norm(*b);
152 const double rel_err = r_nrm/b_nrm, relaxTol = 2.0*tolerance;
153 result = rel_err <= relaxTol;
154 if(!result) success =
false;
157 <<
"\n||b-A*x||/||b|| = "<<r_nrm<<
"/"<<b_nrm<<
" = "<<rel_err<<(result?
" <= ":
" > ")
158 <<
"2.0*tolerance = "<<relaxTol<<
": "<<(result?
"passed":
"failed")<<std::endl;
164 if(success) *out <<
"\nCongratulations! All of the tests checked out!\n";
165 else *out <<
"\nOh no! At least one of the tests failed!\n";
168 return success ? 0 : 1;
int main(int argc, char *argv[])
#define TEUCHOS_STANDARD_CATCH_STATEMENTS(VERBOSE, ERR_STREAM, SUCCESS_FLAG)
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
EParseCommandLineReturn parse(int argc, char *argv[], std::ostream *errout=&std::cerr) const
static RCP< FancyOStream > getDefaultOStream()
RCP< const EpetraLinearOp > epetraLinearOp(const RCP< const Epetra_Operator > &op, EOpTransp opTrans=NOTRANS, EApplyEpetraOpAs applyAs=EPETRA_OP_APPLY_APPLY, EAdjointEpetraOp adjointSupport=EPETRA_OP_ADJOINT_SUPPORTED, const RCP< const VectorSpaceBase< double > > &range=Teuchos::null, const RCP< const VectorSpaceBase< double > > &domain=Teuchos::null)
Dynamically allocate a nonconst EpetraLinearOp to wrap a const Epetra_Operator object.
Teuchos::RCP< Epetra_Operator > createTridiagEpetraLinearOp(const int globalDim, const double diagScale, const bool verbose, std::ostream &out)
This function generates a tridiagonal linear operator using Epetra.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)