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_Chebyshev.hpp"
47 #include "Ifpack2_Details_DenseSolver.hpp"
48 #include "Ifpack2_Diagonal.hpp"
49 #include "Ifpack2_IdentitySolver.hpp"
50 #include "Ifpack2_ILUT.hpp"
51 #include "Ifpack2_Relaxation.hpp"
52 #include "Ifpack2_RILUK.hpp"
53 #include "Ifpack2_Experimental_RBILUK.hpp"
54 #include "Ifpack2_BlockRelaxation.hpp"
55 #include "Ifpack2_BandedContainer.hpp"
56 #include "Ifpack2_DenseContainer.hpp"
57 #include "Ifpack2_SparseContainer.hpp"
58 #include "Ifpack2_TriDiContainer.hpp"
59 #include "Ifpack2_LocalSparseTriangularSolver.hpp"
60 
61 #ifdef HAVE_IFPACK2_SHYLU_NODEFASTILU
62 #include "Ifpack2_Details_Fic.hpp"
63 #include "Ifpack2_Details_Fildl.hpp"
64 #include "Ifpack2_Details_Filu.hpp"
65 #endif // HAVE_IFPACK2_SHYLU_NODEFASTILU
66 
67 #ifdef HAVE_IFPACK2_AMESOS2
68 # include "Ifpack2_Details_Amesos2Wrapper.hpp"
69 #endif // HAVE_IFPACK2_AMESOS2
70 
71 namespace Ifpack2 {
72 namespace Details {
73 
74 template<class MatrixType>
76 OneLevelFactory<MatrixType>::create (const std::string& precType,
77  const Teuchos::RCP<const row_matrix_type>& matrix) const
78 {
79  using Teuchos::RCP;
80  using Teuchos::rcp;
81 
82  RCP<prec_type> prec;
83 
84  // precTypeUpper is the upper-case version of precType.
85  std::string precTypeUpper (precType);
86  if (precTypeUpper.size () > 0) {
87  std::locale locale;
88  for (size_t k = 0; k < precTypeUpper.size (); ++k) {
89  precTypeUpper[k] = std::toupper<char> (precTypeUpper[k], locale);
90  }
91  }
92 
93  if (precTypeUpper == "CHEBYSHEV") {
94  // We have to distinguish Ifpack2::Chebyshev from its
95  // implementation class Ifpack2::Details::Chebyshev.
96  prec = rcp (new ::Ifpack2::Chebyshev<row_matrix_type> (matrix));
97  }
98  else if (precTypeUpper == "DENSE" || precTypeUpper == "LAPACK") {
99  prec = rcp (new Details::DenseSolver<row_matrix_type> (matrix));
100  }
101  else if (precTypeUpper == "AMESOS2") {
102 #ifdef HAVE_IFPACK2_AMESOS2
103  prec = rcp (new Details::Amesos2Wrapper<row_matrix_type> (matrix));
104 #else
106  true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory: "
107  "You may not ask for the preconditioner \"AMESOS2\" unless "
108  "you have built Trilinos with the Amesos2 package enabled.");
109 #endif // HAVE_IFPACK2_AMESOS2
110  }
111  else if (precTypeUpper == "DIAGONAL") {
112  prec = rcp (new Diagonal<row_matrix_type> (matrix));
113  }
114  else if (precTypeUpper == "ILUT") {
115  prec = rcp (new ILUT<row_matrix_type> (matrix));
116  }
117  else if (precTypeUpper == "RELAXATION") {
118  prec = rcp (new Relaxation<row_matrix_type> (matrix));
119  }
120  else if (precTypeUpper == "RILUK") {
121  prec = rcp (new RILUK<row_matrix_type> (matrix));
122  }
123  else if (precTypeUpper == "RBILUK") {
124  prec = rcp (new Experimental::RBILUK<row_matrix_type>(matrix));
125  }
126  else if (precTypeUpper == "FAST_IC" || precTypeUpper == "FAST_ILU" || precTypeUpper == "FAST_ILDL") {
127  #ifdef HAVE_IFPACK2_SHYLU_NODEFASTILU
128  {
129  if(precTypeUpper == "FAST_IC")
131  else if(precTypeUpper == "FAST_ILU")
133  else if(precTypeUpper == "FAST_ILDL")
135  }
136  #else
137  {
138  throw std::invalid_argument("The Ifpack2 FastIC, FastILU and FastILDL preconditioners require the FastILU subpackage of ShyLU to be enabled\n"
139  "To enable FastILU, set the CMake option Trilinos_ENABLE_ShyLU_NodeFastILU=ON");
140  }
141  #endif
142  }
143  else if (precTypeUpper == "KRYLOV") {
145  (true, std::invalid_argument, "The \"KRYLOV\" preconditioner option has "
146  "been deprecated and removed. If you want a Krylov solver, use the "
147  "Belos package.");
148  }
149  else if (precTypeUpper == "BLOCK_RELAXATION" ||
150  precTypeUpper == "BLOCK RELAXATION" ||
151  precTypeUpper == "BLOCKRELAXATION" ||
152  precTypeUpper == "DENSE_BLOCK_RELAXATION" ||
153  precTypeUpper == "DENSE BLOCK RELAXATION" ||
154  precTypeUpper == "DENSEBLOCKRELAXATION" ) {
155  // NOTE (mfh 12 Aug 2016) Choice of "container type" is now a
156  // run-time parameter. The "ContainerType" template parameter is
157  // now always Container<row_matrix_type>.
158  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
159  Teuchos::ParameterList params;
160  params.set ("relaxation: container", "Dense");
161  prec->setParameters (params);
162  }
163  else if (precTypeUpper == "SPARSE_BLOCK_RELAXATION" ||
164  precTypeUpper == "SPARSE BLOCK RELAXATION" ||
165  precTypeUpper == "SPARSEBLOCKRELAXATION" ) {
166  // FIXME (mfh 22 May 2014) We would prefer to have the choice of
167  // dense or sparse blocks (the "container type") be a run-time
168  // decision. This will require refactoring BlockRelaxation so
169  // that the "container type" is not a template parameter. For
170  // now, we default to use dense blocks.
171  //typedef SparseContainer<row_matrix_type, ILUT<row_matrix_type>> container_type;
172 #ifdef HAVE_IFPACK2_AMESOS2
173  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
174  Teuchos::ParameterList params;
175  params.set ("relaxation: container", "SparseAmesos2");
176  prec->setParameters (params);
177 #else
179  (true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory: "
180  "\"SPARSE BLOCK RELAXATION\" requires building Trilinos with Amesos2 enabled.");
181 #endif
182  }
183  else if (precTypeUpper == "TRIDI_RELAXATION" ||
184  precTypeUpper == "TRIDI RELAXATION" ||
185  precTypeUpper == "TRIDIRELAXATION" ||
186  precTypeUpper == "TRIDIAGONAL_RELAXATION" ||
187  precTypeUpper == "TRIDIAGONAL RELAXATION" ||
188  precTypeUpper == "TRIDIAGONALRELAXATION") {
189  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
190  Teuchos::ParameterList params;
191  params.set ("relaxation: container", "TriDi");
192  prec->setParameters (params);
193  }
194  else if (precTypeUpper == "BANDED_RELAXATION" ||
195  precTypeUpper == "BANDED RELAXATION" ||
196  precTypeUpper == "BANDEDRELAXATION") {
197  prec = rcp (new BlockRelaxation<row_matrix_type> (matrix));
198  Teuchos::ParameterList params;
199  params.set ("relaxation: container", "Banded");
200  prec->setParameters (params);
201  }
202  else if (precTypeUpper == "IDENTITY" || precTypeUpper == "IDENTITY_SOLVER") {
203  prec = rcp (new IdentitySolver<row_matrix_type> (matrix));
204  }
205 
206  else if (precTypeUpper == "LOCAL SPARSE TRIANGULAR SOLVER" ||
207  precTypeUpper == "LOCAL_SPARSE_TRIANGULAR_SOLVER" ||
208  precTypeUpper == "LOCALSPARSETRIANGULARSOLVER" ||
209  precTypeUpper == "SPARSE TRIANGULAR SOLVER" ||
210  precTypeUpper == "SPARSE_TRIANGULAR_SOLVER" ||
211  precTypeUpper == "SPARSETRIANGULARSOLVER") {
213  }
214  else {
216  true, std::invalid_argument, "Ifpack2::Details::OneLevelFactory::create: "
217  "Invalid preconditioner type \"" << precType << "\".");
218  }
219 
221  prec.is_null (), std::logic_error, "Ifpack2::Details::OneLevelFactory::"
222  "create: Return value is null right before return. This should never "
223  "happen. Please report this bug to the Ifpack2 developers.");
224  return prec;
225 }
226 
227 } // namespace Details
228 } // namespace Ifpack2
229 
230 #define IFPACK2_DETAILS_ONELEVELFACTORY_INSTANT(S,LO,GO,N) \
231  template class Ifpack2::Details::OneLevelFactory< Tpetra::RowMatrix<S, LO, GO, N> >;
232 
233 #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:76
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:73
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:59
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
ParameterList & setParameters(const ParameterList &source)
The Ifpack2 wrapper to the incomplete Chebyshev preconditioner of ShyLU FastILU.
Definition: Ifpack2_Details_Fic_decl.hpp:62
Relaxation preconditioners for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse matrices.
Definition: Ifpack2_Relaxation_decl.hpp:223
ILU(k) factorization of a given Tpetra::BlockCrsMatrix.
Definition: Ifpack2_Experimental_RBILUK_decl.hpp:128