48 #include "Teko_DiagnosticPreconditionerFactory.hpp"
50 #include "Teko_PreconditionerInverseFactory.hpp"
53 #include "Teuchos_TimeMonitor.hpp"
59 : outputStream_(Teko::getOutputStream()),
60 invFactory_(Teuchos::null),
61 diagString_(
"<label me!>"),
62 printResidual_(false) {}
68 const Teuchos::RCP<Teko::InverseFactory>& invFactory,
const std::string& label,
69 const Teuchos::RCP<std::ostream>& os,
bool printResidual)
70 : outputStream_(Teko::getOutputStream()),
71 invFactory_(invFactory),
73 printResidual_(printResidual) {
74 initTimers(diagString_);
76 if (os != Teuchos::null) outputStream_ = os;
81 if (buildTimer_ == Teuchos::null || rebuildTimer_ == Teuchos::null) {
88 double initBuildTime = totalInitialBuildTime();
89 int initBuilds = numInitialBuilds();
91 double initRebuildTime = totalRebuildTime();
92 int initRebuilds = numRebuilds();
94 (*outputStream_) <<
"DiagnosticPreconditionerFactory \"" << diagString_ <<
"\":\n";
97 (*outputStream_) <<
" build elapsed = " << initBuildTime <<
", "
98 <<
"num builds = " << initBuilds <<
", ";
100 (*outputStream_) <<
"timer/app = " << initBuildTime / double(initBuilds) <<
"\n";
102 (*outputStream_) <<
"timer/app = "
107 (*outputStream_) <<
" rebuild elapsed = " << initRebuildTime <<
", "
108 <<
"num rebuilds = " << initRebuilds <<
", ";
109 if (initRebuilds > 0)
110 (*outputStream_) <<
"timer/app = " << initRebuildTime / double(initRebuilds) <<
"\n";
112 (*outputStream_) <<
"timer/app = "
117 (*outputStream_) <<
" total elapsed = " << initRebuildTime + initBuildTime <<
", "
118 <<
"num rebuilds = " << initRebuilds + initBuilds <<
", ";
119 if (initBuilds + initRebuilds > 0)
120 (*outputStream_) <<
"timer/app = "
121 << (initRebuildTime + initBuildTime) /
double(initRebuilds + initBuilds)
124 (*outputStream_) <<
"timer/app = "
125 <<
"none" << std::endl;
134 using Teuchos::rcp_dynamic_cast;
136 TEUCHOS_TEST_FOR_EXCEPTION(
137 invFactory_ == Teuchos::null, std::runtime_error,
138 "ERROR: Teko::DiagnosticPreconditionerFactory::buildPreconditionerOperator requires that an "
139 <<
"inverse factory has been set. Currently it is null!");
141 TEUCHOS_TEST_FOR_EXCEPTION(
142 buildTimer_ == Teuchos::null || rebuildTimer_ == Teuchos::null, std::runtime_error,
143 "ERROR: Teko::DiagnosticPreconditionerFactory::buildPreconditionerOperator requires that "
144 <<
"the timers be initialized. Currently they are null! (label = \"" << diagString_
148 ModifiableLinearOp& diagOp_ptr = state.
getModifiableOp(
"diagnosticOp");
150 if (diagOp_ptr == Teuchos::null) {
151 ModifiableLinearOp invOp;
154 Teuchos::TimeMonitor monitor(*buildTimer_,
false);
161 diagOp_ptr = createDiagnosticLinearOp(outputStream_, lo, invOp, diagString_);
163 diagOp_ptr = createDiagnosticLinearOp(outputStream_, invOp, diagString_);
168 if (printResidual_) diagOp->setForwardOp(lo);
170 ModifiableLinearOp invOp = diagOp->getModifiableOp();
173 Teuchos::TimeMonitor monitor(*rebuildTimer_,
false);
179 return diagOp_ptr.getConst();
186 const Teuchos::ParameterList& settings) {
187 TEUCHOS_TEST_FOR_EXCEPTION(
188 not settings.isParameter(
"Inverse Factory"), std::runtime_error,
189 "Parameter \"Inverse Factory\" is required by a Teko::DiagnosticPreconditionerFactory");
190 TEUCHOS_TEST_FOR_EXCEPTION(
191 not settings.isParameter(
"Descriptive Label"), std::runtime_error,
192 "Parameter \"Descriptive Label\" is required by a Teko::DiagnosticPreconditionerFactory");
195 std::string invName = settings.get<std::string>(
"Inverse Factory");
196 diagString_ = settings.get<std::string>(
"Descriptive Label");
200 invFactory_ = il->getInverseFactory(invName);
201 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_ == Teuchos::null, std::runtime_error,
202 "ERROR: \"Inverse Factory\" = " << invName <<
" could not be found");
204 if (settings.isParameter(
"Print Residual")) printResidual_ = settings.get<
bool>(
"Print Residual");
207 initTimers(diagString_);
215 TEUCHOS_TEST_FOR_EXCEPTION(
216 invFactory_ == Teuchos::null, std::runtime_error,
217 "ERROR: Teko::DiagnosticPreconditionerFactory::getRequestedParameters requires that a "
218 <<
"preconditioner factory has been set. Currently it is null!");
220 return invFactory_->getRequestedParameters();
226 TEUCHOS_TEST_FOR_EXCEPTION(
227 invFactory_ == Teuchos::null, std::runtime_error,
228 "ERROR: Teko::DiagnosticPreconditionerFactory::updateRequestedParameters requires that a "
229 <<
"preconditioner factory has been set. Currently it is null!");
231 return invFactory_->updateRequestedParameters(pl);
234 void DiagnosticPreconditionerFactory::initTimers(
const std::string& str) {
235 buildTimer_ = Teuchos::rcp(
new Teuchos::Time(str +
" buildTimer"));
236 rebuildTimer_ = Teuchos::rcp(
new Teuchos::Time(str +
" rebuildTimer"));
void rebuildInverse(const InverseFactory &factory, const LinearOp &A, InverseLinearOp &invA)
virtual Teuchos::RCP< Teuchos::ParameterList > getRequestedParameters() const
Request the additional parameters this preconditioner factory needs.
virtual ~DiagnosticPreconditionerFactory()
default destructor: prints out diagnostic string
DiagnosticPreconditionerFactory()
Default constructor, for use with the AutoClone class.
virtual bool updateRequestedParameters(const Teuchos::ParameterList &pl)
Update this object with the fields from a parameter list.
This linear operator prints diagnostics about operator application and creation times. It is useful for debugging problems and determining bottle necks.
InverseLinearOp buildInverse(const InverseFactory &factory, const LinearOp &A)
Build an inverse operator using a factory and a linear operator.
Teuchos::RCP< const InverseLibrary > getInverseLibrary() const
Get the inverse library used by this preconditioner factory.
virtual void initializeFromParameterList(const Teuchos::ParameterList &settings)
This function builds the internals of the preconditioner factory from a parameter list...
An implementation of a state object preconditioners.
virtual LinearOp buildPreconditionerOperator(LinearOp &lo, PreconditionerState &state) const
Function that is called to build the preconditioner for the linear operator that is passed in...
virtual Teko::ModifiableLinearOp & getModifiableOp(const std::string &name)
Add a named operator to the state object.