10 #include "Teko_GaussSeidelPreconditionerFactory.hpp"
12 #include "Teko_BlockUpperTriInverseOp.hpp"
13 #include "Teko_BlockLowerTriInverseOp.hpp"
14 #include "Teuchos_CompilerCodeTweakMacros.hpp"
22 const LinearOp& invD0,
23 const LinearOp& invD1)
27 TriSolveType solveType,
const RCP<const BlockInvDiagonalStrategy>& strategy)
28 : invOpsStrategy_(strategy), solveType_(solveType) {}
31 : solveType_(GS_UseLowerTriangle) {}
35 int rows = blockRowCount(blo);
36 int cols = blockColCount(blo);
38 TEUCHOS_ASSERT(rows == cols);
41 std::vector<LinearOp> invDiag;
43 TEUCHOS_ASSERT(rows == (
int)invDiag.size());
45 if (solveType_ == GS_UseUpperTriangle) {
47 BlockedLinearOp U = getUpperTriBlocks(blo);
49 return createBlockUpperTriInverseOp(U, invDiag,
"Gauss Seidel");
50 }
else if (solveType_ == GS_UseLowerTriangle) {
52 BlockedLinearOp L = getLowerTriBlocks(blo);
54 return createBlockLowerTriInverseOp(L, invDiag,
"Gauss Seidel");
57 TEUCHOS_ASSERT(
false);
58 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
63 const Teuchos::ParameterList& pl) {
64 Teko_DEBUG_SCOPE(
"GaussSeidelPreconditionerFactory::initializeFromParameterList", 10);
65 Teko_DEBUG_MSG_BEGIN(9);
66 DEBUG_STREAM <<
"Parameter list: " << std::endl;
67 pl.print(DEBUG_STREAM);
70 const std::string inverse_type =
"Inverse Type";
71 const std::string preconditioner_type =
"Preconditioner Type";
72 std::vector<RCP<InverseFactory> > inverses;
73 std::vector<RCP<InverseFactory> > preconditioners;
78 std::string invStr =
"";
79 #if defined(Teko_ENABLE_Amesos)
81 #elif defined(Teko_ENABLE_Amesos2)
84 std::string precStr =
"None";
85 if (pl.isParameter(inverse_type)) invStr = pl.get<std::string>(inverse_type);
86 if (pl.isParameter(preconditioner_type)) precStr = pl.get<std::string>(preconditioner_type);
87 if (pl.isParameter(
"Use Upper Triangle"))
88 solveType_ = pl.get<
bool>(
"Use Upper Triangle") ? GS_UseUpperTriangle : GS_UseLowerTriangle;
90 Teko_DEBUG_MSG(
"GSPrecFact: Building default inverse \"" << invStr <<
"\"", 5);
91 RCP<InverseFactory> defaultInverse = invLib->getInverseFactory(invStr);
92 RCP<InverseFactory> defaultPrec;
93 if (precStr !=
"None") defaultPrec = invLib->getInverseFactory(precStr);
96 Teuchos::ParameterList::ConstIterator itr;
97 for (itr = pl.begin(); itr != pl.end(); ++itr) {
98 std::string fieldName = itr->first;
99 Teko_DEBUG_MSG(
"GSPrecFact: checking fieldName = \"" << fieldName <<
"\"", 9);
102 if (fieldName.compare(0, inverse_type.length(), inverse_type) == 0 &&
103 fieldName != inverse_type) {
105 std::string inverse, type;
108 std::stringstream ss(fieldName);
109 ss >> inverse >> type >> position;
112 Teko_DEBUG_MSG(
"Gauss-Seidel \"Inverse Type\" must be a (strictly) positive integer", 1);
116 std::string invStr2 = pl.get<std::string>(fieldName);
117 Teko_DEBUG_MSG(
"GSPrecFact: Building inverse " << position <<
" \"" << invStr2 <<
"\"", 5);
118 if (position > (
int)inverses.size()) {
119 inverses.resize(position, defaultInverse);
120 inverses[position - 1] = invLib->getInverseFactory(invStr2);
122 inverses[position - 1] = invLib->getInverseFactory(invStr2);
123 }
else if (fieldName.compare(0, preconditioner_type.length(), preconditioner_type) == 0 &&
124 fieldName != preconditioner_type) {
126 std::string preconditioner, type;
129 std::stringstream ss(fieldName);
130 ss >> preconditioner >> type >> position;
133 Teko_DEBUG_MSG(
"Gauss-Seidel \"Preconditioner Type\" must be a (strictly) positive integer",
138 std::string precStr2 = pl.get<std::string>(fieldName);
140 "GSPrecFact: Building preconditioner " << position <<
" \"" << precStr2 <<
"\"", 5);
141 if (position > (
int)preconditioners.size()) {
142 preconditioners.resize(position, defaultPrec);
143 preconditioners[position - 1] = invLib->getInverseFactory(precStr2);
145 preconditioners[position - 1] = invLib->getInverseFactory(precStr2);
150 if (inverses.size() == 0) inverses.push_back(defaultInverse);
An implementation of a state object for block preconditioners.
Teuchos::RCP< const BlockInvDiagonalStrategy > invOpsStrategy_
some members
LinearOp buildPreconditionerOperator(BlockedLinearOp &blo, BlockPreconditionerState &state) const
Create the Gauss-Seidel preconditioner operator.
GaussSeidelPreconditionerFactory()
Teuchos::RCP< const InverseLibrary > getInverseLibrary() const
Get the inverse library used by this preconditioner factory.
virtual void initializeFromParameterList(const Teuchos::ParameterList &pl)
Initialize from a parameter list.