Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2_Utilities.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_UTILITIES_HPP
44#define IFPACK2_UTILITIES_HPP
45
46#include "Ifpack2_ConfigDefs.hpp"
47
48#include "Teuchos_RefCountPtr.hpp"
49#include "Teuchos_ScalarTraits.hpp"
50
51#include "Tpetra_ConfigDefs.hpp"
52#include "Tpetra_CrsGraph.hpp"
53
56
57namespace Ifpack2 {
58
59namespace Details {
60
61
66 template <class graph_type>
67 Teuchos::RCP<Tpetra::CrsGraph<typename graph_type::local_ordinal_type, typename graph_type::global_ordinal_type, typename graph_type::node_type> >
68 computeDiagonalGraph (graph_type const &graph)
69 {
70 typedef typename graph_type::local_ordinal_type LO;
71 typedef typename graph_type::global_ordinal_type GO;
72 typedef typename graph_type::node_type NO;
73 typedef Tpetra::Map<LO, GO, NO> map_type;
74 typedef Tpetra::CrsGraph<LO, GO, NO> crs_graph_type;
75
76 const size_t maxDiagEntPerRow = 1;
77 // NOTE (mfh 12 Aug 2014) We could also pass in the column Map
78 // here. However, we still would have to do LID->GID lookups to
79 // make sure that we are using the correct diagonal column
80 // indices, so it probably wouldn't help much.
81 Teuchos::RCP<graph_type> diagonalGraph;
82 diagonalGraph = Teuchos::rcp(new crs_graph_type(graph.getRowMap(), maxDiagEntPerRow));
83 const map_type& meshRowMap = *(graph.getRowMap());
84
85 Teuchos::Array<GO> diagGblColInds(maxDiagEntPerRow);
86
87 for (LO lclRowInd = meshRowMap.getMinLocalIndex(); lclRowInd <= meshRowMap.getMaxLocalIndex(); ++lclRowInd) {
88 const GO gblRowInd = meshRowMap.getGlobalElement(lclRowInd);
89 diagGblColInds[0] = gblRowInd;
90 diagonalGraph->insertGlobalIndices(gblRowInd, diagGblColInds());
91 }
92
93 diagonalGraph->fillComplete(graph.getDomainMap(), graph.getRangeMap());
94 return diagonalGraph;
95 }
96
97
99 std::string canonicalize(const std::string& precType);
100
101
102}// namespace Details
103
104}// namespace Ifpack2
105
106#endif //IFPACK2_UTILITIES_HPP
Teuchos::RCP< Tpetra::CrsGraph< typename graph_type::local_ordinal_type, typename graph_type::global_ordinal_type, typename graph_type::node_type > > computeDiagonalGraph(graph_type const &graph)
Compute and return the graph of the diagonal of the input graph.
Definition: Ifpack2_Utilities.hpp:68
Ifpack2 implementation details.
Preconditioners and smoothers for Tpetra sparse matrices.
Definition: Ifpack2_AdditiveSchwarz_decl.hpp:74