Ifpack2 Templated Preconditioning Package  Version 1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ifpack2_Details_OneLevelFactory_def.hpp
1 /*@HEADER
2 // ***********************************************************************
3 //
4 // Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
5 // Copyright (2009) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 //@HEADER
41 */
42 
43 #ifndef IFPACK2_DETAILS_ONELEVELFACTORY_DEF_HPP
44 #define IFPACK2_DETAILS_ONELEVELFACTORY_DEF_HPP
45 
46 #include "Ifpack2_Factory.hpp"
47 #include "Ifpack2_Utilities.hpp"
48 #include "Ifpack2_Chebyshev.hpp"
49 #include "Ifpack2_Details_DenseSolver.hpp"
50 #include "Ifpack2_Diagonal.hpp"
51 #include "Ifpack2_IdentitySolver.hpp"
52 #include "Ifpack2_ILUT.hpp"
53 #include "Ifpack2_Relaxation.hpp"
54 #include "Ifpack2_RILUK.hpp"
55 #include "Ifpack2_Experimental_RBILUK.hpp"
56 #include "Ifpack2_BlockRelaxation.hpp"
57 #include "Ifpack2_BandedContainer.hpp"
58 #include "Ifpack2_DenseContainer.hpp"
59 #include "Ifpack2_SparseContainer.hpp"
60 #include "Ifpack2_TriDiContainer.hpp"
61 #include "Ifpack2_LocalSparseTriangularSolver.hpp"
62 
63 #ifdef HAVE_IFPACK2_SHYLU_NODEFASTILU
64 #include "Ifpack2_Details_Fic.hpp"
65 #include "Ifpack2_Details_Fildl.hpp"
66 #include "Ifpack2_Details_Filu.hpp"
67 #endif // HAVE_IFPACK2_SHYLU_NODEFASTILU
68 
69 #ifdef HAVE_IFPACK2_AMESOS2
70 # include "Ifpack2_Details_Amesos2Wrapper.hpp"
71 #endif // HAVE_IFPACK2_AMESOS2
72 
73 namespace Ifpack2 {
74 namespace Details {
75 
76 template<class MatrixType>
78 OneLevelFactory<MatrixType>::create (const std::string& precType,
79  const Teuchos::RCP<const row_matrix_type>& matrix) const
80 {
81  using Teuchos::RCP;
82  using Teuchos::rcp;
83 
84  RCP<prec_type> prec;
85 
86  // precTypeUpper is the upper-case version of precType.
87  std::string precTypeUpper = canonicalize(precType);
88 
89  if (precTypeUpper == "CHEBYSHEV") {
90  // We have to distinguish Ifpack2::Chebyshev from its
91  // implementation class Ifpack2::Details::Chebyshev.
92  prec = rcp (new ::Ifpack2::Chebyshev<row_matrix_type> (matrix));
93  }
94  else if (precTypeUpper == "DENSE" || precTypeUpper == "LAPACK") {
95  prec = rcp (new Details::DenseSolver<row_matrix_type> (matrix));
96  }
97  else if (precTypeUpper == "AMESOS2") {
98 #ifdef HAVE_IFPACK2_AMESOS2
99  prec = rcp (new Details::Amesos2Wrapper<row_matrix_type> (matrix));
100 #else
102  true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory: "
103  "You may not ask for the preconditioner \"AMESOS2\" unless "
104  "you have built Trilinos with the Amesos2 package enabled.");
105 #endif // HAVE_IFPACK2_AMESOS2
106  }
107  else if (precTypeUpper == "DIAGONAL") {
108  prec = rcp (new Diagonal<row_matrix_type> (matrix));
109  }
110  else if (precTypeUpper == "ILUT") {
111  prec = rcp (new ILUT<row_matrix_type> (matrix));
112  }
113  else if (precTypeUpper == "RELAXATION") {
114  prec = rcp (new Relaxation<row_matrix_type> (matrix));
115  }
116  else if (precTypeUpper == "RILUK") {
117  prec = rcp (new RILUK<row_matrix_type> (matrix));
118  }
119  else if (precTypeUpper == "RBILUK") {
120  prec = rcp (new Experimental::RBILUK<row_matrix_type>(matrix));
121  }
122  else if (precTypeUpper == "FAST_IC" || precTypeUpper == "FAST_ILU" || precTypeUpper == "FAST_ILDL") {
123  #ifdef HAVE_IFPACK2_SHYLU_NODEFASTILU
124  {
125  if(precTypeUpper == "FAST_IC")
127  else if(precTypeUpper == "FAST_ILU")
129  else if(precTypeUpper == "FAST_ILDL")
131  }
132  #else
133  {
134  throw std::invalid_argument("The Ifpack2 FastIC, FastILU and FastILDL preconditioners require the FastILU subpackage of ShyLU to be enabled\n"
135  "To enable FastILU, set the CMake option Trilinos_ENABLE_ShyLU_NodeFastILU=ON");
136  }
137  #endif
138  }
139  else if (precTypeUpper == "KRYLOV") {
141  (true, std::invalid_argument, "The \"KRYLOV\" preconditioner option has "
142  "been deprecated and removed. If you want a Krylov solver, use the "
143  "Belos package.");
144  }
145  else if (precTypeUpper == "BLOCK_RELAXATION" ||
146  precTypeUpper == "BLOCK RELAXATION" ||
147  precTypeUpper == "BLOCKRELAXATION" ||
148  precTypeUpper == "DENSE_BLOCK_RELAXATION" ||
149  precTypeUpper == "DENSE BLOCK RELAXATION" ||
150  precTypeUpper == "DENSEBLOCKRELAXATION" ) {
151  // NOTE (mfh 12 Aug 2016) Choice of "container type" is now a
152  // run-time parameter. The "ContainerType" template parameter is
153  // now always Container<row_matrix_type>.
154  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
155  Teuchos::ParameterList params;
156  params.set ("relaxation: container", "Dense");
157  prec->setParameters (params);
158  }
159  else if (precTypeUpper == "SPARSE_BLOCK_RELAXATION" ||
160  precTypeUpper == "SPARSE BLOCK RELAXATION" ||
161  precTypeUpper == "SPARSEBLOCKRELAXATION" ) {
162  // FIXME (mfh 22 May 2014) We would prefer to have the choice of
163  // dense or sparse blocks (the "container type") be a run-time
164  // decision. This will require refactoring BlockRelaxation so
165  // that the "container type" is not a template parameter. For
166  // now, we default to use dense blocks.
167  //typedef SparseContainer<row_matrix_type, ILUT<row_matrix_type>> container_type;
168 #ifdef HAVE_IFPACK2_AMESOS2
169  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
170  Teuchos::ParameterList params;
171  params.set ("relaxation: container", "SparseAmesos2");
172  prec->setParameters (params);
173 #else
175  (true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory: "
176  "\"SPARSE BLOCK RELAXATION\" requires building Trilinos with Amesos2 enabled.");
177 #endif
178  }
179  else if (precTypeUpper == "TRIDI_RELAXATION" ||
180  precTypeUpper == "TRIDI RELAXATION" ||
181  precTypeUpper == "TRIDIRELAXATION" ||
182  precTypeUpper == "TRIDIAGONAL_RELAXATION" ||
183  precTypeUpper == "TRIDIAGONAL RELAXATION" ||
184  precTypeUpper == "TRIDIAGONALRELAXATION") {
185  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
186  Teuchos::ParameterList params;
187  params.set ("relaxation: container", "TriDi");
188  prec->setParameters (params);
189  }
190  else if (precTypeUpper == "BANDED_RELAXATION" ||
191  precTypeUpper == "BANDED RELAXATION" ||
192  precTypeUpper == "BANDEDRELAXATION") {
193  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
194  Teuchos::ParameterList params;
195  params.set ("relaxation: container", "Banded");
196  prec->setParameters (params);
197  }
198  else if (precTypeUpper == "IDENTITY" || precTypeUpper == "IDENTITY_SOLVER") {
199  prec = rcp (new IdentitySolver<row_matrix_type> (matrix));
200  }
201 
202  else if (precTypeUpper == "LOCAL SPARSE TRIANGULAR SOLVER" ||
203  precTypeUpper == "LOCAL_SPARSE_TRIANGULAR_SOLVER" ||
204  precTypeUpper == "LOCALSPARSETRIANGULARSOLVER" ||
205  precTypeUpper == "SPARSE TRIANGULAR SOLVER" ||
206  precTypeUpper == "SPARSE_TRIANGULAR_SOLVER" ||
207  precTypeUpper == "SPARSETRIANGULARSOLVER") {
209  }
210  else {
212  true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory::create: "
213  "Invalid preconditioner type \"" << precType << "\".");
214  }
215 
217  prec.is_null (), std::logic_error, "Ifpack2::Details::OneLevelFactory::"
218  "create: Return value is null right before return. This should never "
219  "happen. Please report this bug to the Ifpack2 developers.");
220  return prec;
221 }
222 
223 template<class MatrixType>
224 bool
225 OneLevelFactory<MatrixType>::isSupported (const std::string& precType) const
226 {
227  // precTypeUpper is the upper-case version of precType.
228  std::string precTypeUpper = canonicalize(precType);
229  std::vector<std::string> supportedNames = {
230  "CHEBYSHEV", "DENSE", "LAPACK",
231 #ifdef HAVE_IFPACK2_AMESOS2
232  "AMESOS2",
233 #endif
234  "DIAGONAL", "ILUT", "RELAXATION", "RILUK", "RBILUK",
235 #ifdef HAVE_IFPACK2_SHYLU_NODEFASTILU
236  "FAST_IC", "FAST_ILU", "FAST_ILDL",
237 #endif
238  "BLOCK_RELAXATION", "BLOCK RELAXATION", "BLOCKRELAXATION", "DENSE_BLOCK_RELAXATION", "DENSE BLOCK RELAXATION", "DENSEBLOCKRELAXATION",
239 #ifdef HAVE_IFPACK2_AMESOS2
240  "SPARSE_BLOCK_RELAXATION", "SPARSE BLOCK RELAXATION", "SPARSEBLOCKRELAXATION",
241 #endif
242  "TRIDI_RELAXATION", "TRIDI RELAXATION", "TRIDIRELAXATION", "TRIDIAGONAL_RELAXATION", "TRIDIAGONAL RELAXATION", "TRIDIAGONALRELAXATION",
243  "BANDED_RELAXATION", "BANDED RELAXATION", "BANDEDRELAXATION",
244  "IDENTITY", "IDENTITY_SOLVER",
245  "LOCAL SPARSE TRIANGULAR SOLVER", "LOCAL_SPARSE_TRIANGULAR_SOLVER", "LOCALSPARSETRIANGULARSOLVER", "SPARSE TRIANGULAR SOLVER", "SPARSE_TRIANGULAR_SOLVER", "SPARSETRIANGULARSOLVER"
246  };
247  // const size_t numSupportedNames = supportedNames.size();
248  // const auto end = supportedNames + numSupportedNames;
249  auto it = std::find(std::begin(supportedNames), std::end(supportedNames), precTypeUpper);
250  return it != std::end(supportedNames);
251 }
252 
253 } // namespace Details
254 } // namespace Ifpack2
255 
256 #define IFPACK2_DETAILS_ONELEVELFACTORY_INSTANT(S,LO,GO,N) \
257  template class Ifpack2::Details::OneLevelFactory< Tpetra::RowMatrix<S, LO, GO, N> >;
258 
259 #endif // IFPACK2_DETAILS_ONELEVELFACTORY_DEF_HPP
Teuchos::RCP< prec_type > create(const std::string &precType, const Teuchos::RCP< const row_matrix_type > &matrix) const
Create an instance of Preconditioner given the string name of the preconditioner type.
Definition: Ifpack2_Details_OneLevelFactory_def.hpp:78
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
ILU(k) factorization of a given Tpetra::RowMatrix.
Definition: Ifpack2_RILUK_decl.hpp:243
&quot;Preconditioner&quot; that uses LAPACK&#39;s dense LU.
Definition: Ifpack2_Details_DenseSolver_decl.hpp:75
The Ifpack2 wrapper to the ILDL preconditioner of ShyLU FastILU.
Definition: Ifpack2_Details_Fildl_decl.hpp:62
The Ifpack2 wrapper to the ILU preconditioner of ShyLU FastILU.
Definition: Ifpack2_Details_Filu_decl.hpp:62
ILUT (incomplete LU factorization with threshold) of a Tpetra sparse matrix.
Definition: Ifpack2_ILUT_decl.hpp:91
Block relaxation preconditioners (or smoothers) for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse ma...
Definition: Ifpack2_BlockRelaxation_decl.hpp:83
&quot;Identity&quot; preconditioner.
Definition: Ifpack2_IdentitySolver_decl.hpp:60
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Wrapper class for direct solvers in Amesos2.
Definition: Ifpack2_Details_Amesos2Wrapper_decl.hpp:102
&quot;Preconditioner&quot; that solves local sparse triangular systems.
Definition: Ifpack2_LocalSparseTriangularSolver_decl.hpp:77
File for utility functions.
ParameterList & setParameters(const ParameterList &source)
The Ifpack2 wrapper to the incomplete Chebyshev preconditioner of ShyLU FastILU.
Definition: Ifpack2_Details_Fic_decl.hpp:62
&quot;Factory&quot; for creating single-level preconditioners.
Definition: Ifpack2_Details_OneLevelFactory_decl.hpp:123
Relaxation preconditioners for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse matrices.
Definition: Ifpack2_Relaxation_decl.hpp:236
ILU(k) factorization of a given Tpetra::BlockCrsMatrix.
Definition: Ifpack2_Experimental_RBILUK_decl.hpp:128