49 #include "Teuchos_TimeMonitor.hpp" 51 #include "Thyra_MultiVectorStdOps.hpp" 59 DiagnosticLinearOp::DiagnosticLinearOp(
const Teuchos::RCP<std::ostream> & ostrm,
const ModifiableLinearOp & A,
const std::string & diagnosticString)
60 : outputStream_(ostrm), wrapOpA_(A), diagString_(diagnosticString), timer_(diagnosticString)
68 DiagnosticLinearOp::DiagnosticLinearOp(
const Teuchos::RCP<std::ostream> & ostrm,
const LinearOp & fwdOp,
69 const ModifiableLinearOp & A,
const std::string & diagnosticString)
70 : outputStream_(ostrm),
wrapOpA_(A),
fwdOp_(fwdOp), diagString_(diagnosticString), timer_(diagnosticString)
76 double elapsedTime = totalTime();
77 int applications = numApplications();
79 (*outputStream_) <<
"DiagnosticLinearOp \"" << diagString_ <<
"\": " 80 <<
"elapsed = " << elapsedTime <<
", " 81 <<
"applications = " << applications <<
", ";
83 (*outputStream_) <<
"timer/app = " << elapsedTime / double(applications) << std::endl;
85 (*outputStream_) <<
"timer/app = " <<
"none" << std::endl;
101 const double alpha,
const double beta)
const 103 Teko_DEBUG_SCOPE(
"DiagnosticLinearOp::implicityApply",10);
106 Teuchos::TimeMonitor monitor(timer_,
false);
112 wrapOpA_->apply(Thyra::NOTRANS,*x,y.ptr(),alpha,beta);
115 bool printResidual = (
fwdOp_!=Teuchos::null);
121 fwdOp_->apply(Thyra::NOTRANS,*y,residual.ptr(),-1.0,alpha);
123 fwdOp_->apply(Thyra::NOTRANS,*z,residual.ptr(),beta,1.0);
126 std::vector<double> norms(y->domain()->dim());
127 std::vector<double> rhsNorms(x->domain()->dim());
128 Thyra::norms_2<double>(*residual,Teuchos::arrayViewFromVector(norms));
129 Thyra::norms_2<double>(*x,Teuchos::arrayViewFromVector(rhsNorms));
132 (*outputStream_) <<
"DiagnosticLinearOp \"" << diagString_ <<
"\": residual = [";
133 for(std::size_t i=0;i<norms.size();++i)
134 (*outputStream_) <<
" " << std::scientific << std::setprecision(4) << norms[i]/rhsNorms[i];
135 (*outputStream_) <<
" ]" << std::endl;
137 residualNorm_ = norms[0];
virtual void implicitApply(const MultiVector &x, MultiVector &y, const double alpha=1.0, const double beta=0.0) const
Perform a matrix vector multiply with this operator.
MultiVector deepcopy(const MultiVector &v)
Perform a deep copy of the vector.
virtual ~DiagnosticLinearOp()
Destructor prints out timing information about this operator.
Teko::LinearOp fwdOp_
inverse of
ModifiableLinearOp wrapOpA_
inverse of
BlockedMultiVector deepcopy(const BlockedMultiVector &v)
Perform a deep copy of the blocked vector.