48 #include "Teko_DiagonallyScaledPreconditionerFactory.hpp"
50 #include "Teko_PreconditionerInverseFactory.hpp"
56 : invFactory_(Teuchos::null), scalingType_(ROW_SCALING), diagonalType_(AbsRowSum) {}
62 const Teuchos::RCP<Teko::InverseFactory>& invFactory, ScalingType scalingType,
63 DiagonalType diagonalType)
64 : invFactory_(invFactory), scalingType_(scalingType), diagonalType_(diagonalType) {}
74 using Teuchos::rcp_dynamic_cast;
75 Teko_DEBUG_SCOPE(
"DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator", 10);
77 TEUCHOS_TEST_FOR_EXCEPTION(
78 invFactory_ == Teuchos::null, std::runtime_error,
79 "ERROR: Teko::DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator requires "
81 <<
"inverse factory has been set. Currently it is null!");
84 LinearOp invD = getInvDiagonalOp(lo, diagonalType_);
88 if (scalingType_ == COLUMN_SCALING)
89 M = explicitMultiply(lo, invD, M);
91 M = explicitMultiply(invD, lo, M);
95 if (invM == Teuchos::null)
101 if (scalingType_ == COLUMN_SCALING)
102 return multiply(invD, invM.getConst());
104 return multiply(invM.getConst(), invD);
111 const Teuchos::ParameterList& settings) {
112 TEUCHOS_TEST_FOR_EXCEPTION(
113 not settings.isParameter(
"Inverse Factory"), std::runtime_error,
114 "Parameter \"Inverse Factory\" is required by a Teko::DiagonallyScaledPreconditionerFactory");
117 std::string invName = settings.get<std::string>(
"Inverse Factory");
121 invFactory_ = il->getInverseFactory(invName);
122 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_ == Teuchos::null, std::runtime_error,
123 "ERROR: \"Inverse Factory\" = " << invName <<
" could not be found");
126 const std::string defaultScaleType =
"Row";
127 const std::string scalingTypeString =
"Scaling Type";
128 std::string scaleType = defaultScaleType;
129 if (settings.isParameter(scalingTypeString))
130 scaleType = settings.get<std::string>(scalingTypeString);
132 if (defaultScaleType == scaleType)
133 scalingType_ = ROW_SCALING;
135 scalingType_ = COLUMN_SCALING;
137 if (settings.isParameter(
"Diagonal Type"))
138 diagonalType_ = Teko::getDiagonalType(settings.get<std::string>(
"Diagonal Type"));
void rebuildInverse(const InverseFactory &factory, const LinearOp &A, InverseLinearOp &invA)
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 void initializeFromParameterList(const Teuchos::ParameterList &settings)
This function builds the internals of the preconditioner factory from a parameter list...
virtual ~DiagonallyScaledPreconditionerFactory()
default destructor: prints out diagnostic string
DiagonallyScaledPreconditionerFactory()
Default constructor, for use with the AutoClone class.
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.
An implementation of a state object preconditioners.
virtual Teko::ModifiableLinearOp & getModifiableOp(const std::string &name)
Add a named operator to the state object.