Ifpack2 Templated Preconditioning Package  Version 1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ifpack2_SparseContainer_decl.hpp
Go to the documentation of this file.
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_SPARSECONTAINER_DECL_HPP
44 #define IFPACK2_SPARSECONTAINER_DECL_HPP
45 
48 
49 #include "Ifpack2_Container.hpp"
51 #include "Tpetra_MultiVector.hpp"
52 #include "Tpetra_Map.hpp"
53 #include "Tpetra_RowMatrix.hpp"
54 #include "Tpetra_CrsMatrix.hpp"
56 #include "Ifpack2_ILUT_decl.hpp"
57 #include <vector>
58 #ifdef HAVE_IFPACK2_AMESOS2
59 #include "Ifpack2_Details_Amesos2Wrapper.hpp"
60 #endif
61 
62 namespace Ifpack2 {
63 
133 template<typename MatrixType, typename InverseType>
134 class SparseContainer : public Container<MatrixType> {
136 
137 private:
144  typedef MatrixType matrix_type;
150  typedef InverseType inverse_type;
151 
152  typedef typename Container<MatrixType>::scalar_type scalar_type;
153  typedef typename Container<MatrixType>::local_ordinal_type local_ordinal_type;
154  typedef typename Container<MatrixType>::global_ordinal_type global_ordinal_type;
155  typedef typename Container<MatrixType>::node_type node_type;
156 
157  typedef typename Container<MatrixType>::mv_type mv_type;
158  typedef typename Container<MatrixType>::map_type map_type;
159  typedef typename Container<MatrixType>::vector_type vector_type;
161  typedef typename Container<MatrixType>::import_type import_type;
162 
163  typedef typename InverseType::scalar_type InverseScalar;
164  typedef typename InverseType::local_ordinal_type InverseLocalOrdinal;
165  typedef typename InverseType::global_ordinal_type InverseGlobalOrdinal;
166  typedef typename InverseType::node_type InverseNode;
167 
168  typedef typename Tpetra::MultiVector<InverseScalar, InverseLocalOrdinal, InverseGlobalOrdinal, InverseNode> inverse_mv_type;
169  typedef typename Tpetra::CrsMatrix<InverseScalar, InverseLocalOrdinal, InverseGlobalOrdinal, InverseNode> InverseCrs;
170  typedef typename Tpetra::Map<InverseLocalOrdinal, InverseGlobalOrdinal, InverseNode> InverseMap;
171 
172  typedef typename Container<MatrixType>::HostView HostView;
173  typedef typename inverse_mv_type::dual_view_type::t_host HostViewInverse;
174 
175  static_assert(std::is_same<MatrixType,
176  Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type>>::value, "Ifpack2::SparseContainer: Please use MatrixType = Tpetra::RowMatrix.");
177 
186  typedef typename Container<MatrixType>::row_matrix_type row_matrix_type;
188 
189 public:
191 
192 
202  const Teuchos::RCP<const import_type>& importer,
203  int OverlapLevel,
204  scalar_type DampingFactor);
205 
207  const Teuchos::Array<local_ordinal_type>& localRows);
208 
210  virtual ~SparseContainer();
211 
213 
215 
217  virtual bool isInitialized() const;
218 
220  virtual bool isComputed() const;
221 
223  virtual void setParameters(const Teuchos::ParameterList& List);
224 
226 
228 
230  virtual void initialize();
231 
233  virtual void compute ();
234 
238  void clearBlocks ();
239 
241  virtual void
242  apply (HostView& X,
243  HostView& Y,
244  int blockIndex,
245  int stride,
247  scalar_type alpha = Teuchos::ScalarTraits<scalar_type>::one(),
248  scalar_type beta = Teuchos::ScalarTraits<scalar_type>::zero()) const;
249 
251  virtual void
252  weightedApply (HostView& X,
253  HostView& Y,
254  HostView& W,
255  int blockIndex,
256  int stride,
258  scalar_type alpha = Teuchos::ScalarTraits<scalar_type>::one(),
259  scalar_type beta = Teuchos::ScalarTraits<scalar_type>::zero()) const;
260 
262 
264 
268  virtual std::ostream& print(std::ostream& os) const;
269 
271 
273 
275  virtual std::string description () const;
276 
278  virtual void
280  const Teuchos::EVerbosityLevel verbLevel =
283 
285  static std::string getName();
286 
287 private:
288 
291 
293  void extract ();
294 
306  void
307  applyImpl (inverse_mv_type& X,
308  inverse_mv_type& Y,
309  int blockIndex,
310  int stride,
311  Teuchos::ETransp mode,
312  InverseScalar alpha,
313  InverseScalar beta) const;
314 
316  std::vector<Teuchos::RCP<InverseCrs>> diagBlocks_;
317 
319  mutable std::vector<inverse_mv_type> invX;
321  mutable std::vector<inverse_mv_type> invY;
322 
330  mutable std::vector<Teuchos::Ptr<InverseType>> Inverses_;
331  mutable std::vector<map_type> localMaps_;
333  bool IsInitialized_;
335  bool IsComputed_;
338 
339 
342 };
343 
344 }// namespace Ifpack2
345 
346 #endif // IFPACK2_SPARSECONTAINER_HPP
static std::string getName()
Get the name of this container type for Details::constructContainer()
Definition: Ifpack2_SparseContainer_def.hpp:629
Ifpack2::Container class declaration.
virtual bool isComputed() const
Whether the container has been successfully computed.
Definition: Ifpack2_SparseContainer_def.hpp:115
Store and solve a local sparse linear problem.
Definition: Ifpack2_SparseContainer_decl.hpp:134
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to the given FancyOStream.
Definition: Ifpack2_SparseContainer_def.hpp:525
virtual void initialize()
Do all set-up operations that only require matrix structure.
Definition: Ifpack2_SparseContainer_def.hpp:129
virtual std::ostream & print(std::ostream &os) const
Print information about this object to the given output stream.
Definition: Ifpack2_SparseContainer_def.hpp:488
Declaration and definition of the Ifpack2::Details::MultiVectorLocalGatherScatter class...
virtual void weightedApply(HostView &X, HostView &Y, HostView &W, int blockIndex, int stride, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Compute Y := alpha * diag(D) * M^{-1} (diag(D) * X) + beta*Y.
Definition: Ifpack2_SparseContainer_def.hpp:334
Ifpack2::Partitioner:
Definition: Ifpack2_Partitioner.hpp:179
virtual std::string description() const
A one-line description of this object.
Definition: Ifpack2_SparseContainer_def.hpp:498
virtual bool isInitialized() const
Whether the container has been successfully initialized.
Definition: Ifpack2_SparseContainer_def.hpp:108
SparseContainer(const Teuchos::RCP< const row_matrix_type > &matrix, const Teuchos::Array< Teuchos::Array< local_ordinal_type > > &partitions, const Teuchos::RCP< const import_type > &importer, int OverlapLevel, scalar_type DampingFactor)
Constructor.
Definition: Ifpack2_SparseContainer_def.hpp:60
static const EVerbosityLevel verbLevel_default
virtual void apply(HostView &X, HostView &Y, int blockIndex, int stride, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Compute Y := alpha * M^{-1} X + beta*Y.
Definition: Ifpack2_SparseContainer_def.hpp:222
virtual ~SparseContainer()
Destructor (declared virtual for memory safety of derived classes).
Definition: Ifpack2_SparseContainer_def.hpp:100
Interface for creating and solving a local linear problem.
Definition: Ifpack2_Container.hpp:114
virtual void setParameters(const Teuchos::ParameterList &List)
Set all necessary parameters.
Definition: Ifpack2_SparseContainer_def.hpp:122
virtual void compute()
Initialize and compute all blocks.
Definition: Ifpack2_SparseContainer_def.hpp:161
Declaration of ILUT preconditioner.
void clearBlocks()
Definition: Ifpack2_SparseContainer_def.hpp:183