78 using Teuchos::rcp_dynamic_cast;
79 Teko_DEBUG_SCOPE(
"DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator",10);
81 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_==Teuchos::null,std::runtime_error,
82 "ERROR: Teko::DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator requires that an "
83 <<
"inverse factory has been set. Currently it is null!");
86 LinearOp invD = getInvDiagonalOp(lo,diagonalType_);
89 ModifiableLinearOp & M = state.getModifiableOp(
"op_M");
90 if(scalingType_==COLUMN_SCALING)
91 M = explicitMultiply(lo,invD,M);
93 M = explicitMultiply(invD,lo,M);
96 ModifiableLinearOp & invM = state.getModifiableOp(
"op_invM");
97 if(invM==Teuchos::null)
103 if(scalingType_==COLUMN_SCALING)
104 return multiply(invD,invM.getConst());
106 return multiply(invM.getConst(),invD);
114 TEUCHOS_TEST_FOR_EXCEPTION(not settings.isParameter(
"Inverse Factory"),std::runtime_error,
115 "Parameter \"Inverse Factory\" is required by a Teko::DiagonallyScaledPreconditionerFactory");
118 std::string invName = settings.get<std::string>(
"Inverse Factory");
122 invFactory_ = il->getInverseFactory(invName);
123 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_==Teuchos::null,std::runtime_error,
124 "ERROR: \"Inverse Factory\" = " << invName
125 <<
" could not be found");
128 const std::string defaultScaleType =
"Row";
129 const std::string scalingTypeString =
"Scaling Type";
130 std::string scaleType = defaultScaleType;
131 if(settings.isParameter(scalingTypeString))
132 scaleType = settings.get<std::string>(scalingTypeString);
134 if(defaultScaleType==scaleType)
135 scalingType_ = ROW_SCALING;
137 scalingType_ = COLUMN_SCALING;
139 if(settings.isParameter(
"Diagonal Type"))
140 diagonalType_ = Teko::getDiagonalType(settings.get<std::string>(
"Diagonal Type"));