47 #include "Teko_JacobiPreconditionerFactory.hpp"
54 const LinearOp& invD1)
58 const RCP<const BlockInvDiagonalStrategy>& strategy)
59 : invOpsStrategy_(strategy) {}
67 int rows = blo->productRange()->numBlocks();
68 int cols = blo->productDomain()->numBlocks();
70 TEUCHOS_ASSERT(rows == cols);
73 std::vector<LinearOp> invDiag;
75 TEUCHOS_ASSERT(rows == (
int)invDiag.size());
78 BlockedLinearOp precond = createBlockedOp();
80 ss <<
"Jacobi Preconditioner ( ";
83 beginBlockFill(precond, rows, rows);
86 for (
int i = 0; i < rows; i++) {
87 ss <<
" op" << i <<
" = " << invDiag[i]->description() <<
", ";
88 precond->setBlock(i, i, invDiag[i]);
92 endBlockFill(precond);
96 precond->setObjectLabel(
"Jacobi");
105 RCP<const InverseLibrary> invLib = getInverseLibrary();
108 std::string invStr = pl.get<std::string>(
"Inverse Type");
109 #if defined(Teko_ENABLE_Amesos)
110 if(invStr==
"") invStr =
"Amesos";
111 #elif defined(Teko_ENABLE_Amesos2)
112 if(invStr==
"") invStr=
"Amesos2";
120 Teko_DEBUG_SCOPE(
"JacobiPreconditionerFactory::initializeFromParameterList", 10);
121 Teko_DEBUG_MSG_BEGIN(9);
122 DEBUG_STREAM <<
"Parameter list: " << std::endl;
123 pl.print(DEBUG_STREAM);
124 Teko_DEBUG_MSG_END();
126 const std::string inverse_type =
"Inverse Type";
127 const std::string preconditioner_type =
"Preconditioner Type";
128 std::vector<RCP<InverseFactory> > inverses;
129 std::vector<RCP<InverseFactory> > preconditioners;
131 RCP<const InverseLibrary> invLib = getInverseLibrary();
134 std::string invStr =
"";
135 #if defined(Teko_ENABLE_Amesos)
137 #elif defined(Teko_ENABLE_Amesos2)
141 std::string precStr =
"None";
142 if (pl.isParameter(inverse_type)) invStr = pl.get<std::string>(inverse_type);
143 RCP<InverseFactory> defaultPrec;
144 if (precStr !=
"None") defaultPrec = invLib->getInverseFactory(precStr);
146 Teko_DEBUG_MSG(
"JacobiPrecFact: Building default inverse \"" << invStr <<
"\"", 5);
147 RCP<InverseFactory> defaultInverse = invLib->getInverseFactory(invStr);
150 Teuchos::ParameterList::ConstIterator itr;
151 for (itr = pl.begin(); itr != pl.end(); ++itr) {
152 std::string fieldName = itr->first;
153 Teko_DEBUG_MSG(
"JacobiPrecFact: checking fieldName = \"" << fieldName <<
"\"", 9);
156 if (fieldName.compare(0, inverse_type.length(), inverse_type) == 0 &&
157 fieldName != inverse_type) {
159 std::string inverse, type;
162 std::stringstream ss(fieldName);
163 ss >> inverse >> type >> position;
166 Teko_DEBUG_MSG(
"Jacobi \"Inverse Type\" must be a (strictly) positive integer", 1);
170 std::string invStr2 = pl.get<std::string>(fieldName);
171 Teko_DEBUG_MSG(
"JacobiPrecFact: Building inverse " << position <<
" \"" << invStr2 <<
"\"",
173 if (position > (
int)inverses.size()) {
174 inverses.resize(position, defaultInverse);
175 inverses[position - 1] = invLib->getInverseFactory(invStr2);
177 inverses[position - 1] = invLib->getInverseFactory(invStr2);
178 }
else if (fieldName.compare(0, preconditioner_type.length(), preconditioner_type) == 0 &&
179 fieldName != preconditioner_type) {
181 std::string preconditioner, type;
184 std::stringstream ss(fieldName);
185 ss >> preconditioner >> type >> position;
188 Teko_DEBUG_MSG(
"Jacobi \"Preconditioner Type\" must be a (strictly) positive integer", 1);
192 std::string precStr2 = pl.get<std::string>(fieldName);
194 "JacobiPrecFact: Building preconditioner " << position <<
" \"" << precStr2 <<
"\"", 5);
195 if (position > (
int)preconditioners.size()) {
196 preconditioners.resize(position, defaultPrec);
197 preconditioners[position - 1] = invLib->getInverseFactory(precStr2);
199 preconditioners[position - 1] = invLib->getInverseFactory(precStr2);
204 if (inverses.size() == 0) inverses.push_back(defaultInverse);
208 rcp(
new InvFactoryDiagStrategy(inverses, preconditioners, defaultInverse, defaultPrec));
JacobiPreconditionerFactory()
An implementation of a state object for block preconditioners.
Teuchos::RCP< const BlockInvDiagonalStrategy > invOpsStrategy_
some members
virtual void initializeFromParameterList(const Teuchos::ParameterList &pl)
Initialize from a parameter list.
LinearOp buildPreconditionerOperator(BlockedLinearOp &blo, BlockPreconditionerState &state) const
Create the Jacobi preconditioner operator.