Teuchos - Trilinos Tools Package  Version of the Day
Teuchos_MatrixMarket_SymmetrizingAdder.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
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 #ifndef __Teuchos_MatrixMarket_SymmetrizingAdder_hpp
43 #define __Teuchos_MatrixMarket_SymmetrizingAdder_hpp
44 
45 #include <Teuchos_as.hpp>
46 #include <Teuchos_ScalarTraits.hpp>
47 #include <string>
48 
49 
50 // Macro that marks a function as "possibly unused," in order to
51 // suppress build warnings.
52 #if ! defined(TRILINOS_UNUSED_FUNCTION)
53 # if defined(__GNUC__) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
54 # define TRILINOS_UNUSED_FUNCTION __attribute__((__unused__))
55 # elif defined(__clang__)
56 # if __has_attribute(unused)
57 # define TRILINOS_UNUSED_FUNCTION __attribute__((__unused__))
58 # else
59 # define TRILINOS_UNUSED_FUNCTION
60 # endif // Clang has 'unused' attribute
61 # elif defined(__IBMCPP__)
62 // IBM's C++ compiler for Blue Gene/Q (V12.1) implements 'used' but not 'unused'.
63 //
64 // http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp
65 # define TRILINOS_UNUSED_FUNCTION
66 # else // some other compiler
67 # define TRILINOS_UNUSED_FUNCTION
68 # endif
69 #endif // ! defined(TRILINOS_UNUSED_FUNCTION)
70 
71 
72 namespace Teuchos {
73  namespace MatrixMarket {
74  // Anonymous namespace for helper functions for SymmetrizingAdder.
75  namespace {
76  TRILINOS_UNUSED_FUNCTION bool
77  isSkew (const std::string& symmType) {
78  return symmType.size() >= 4 && symmType.substr(0,4) == "skew";
79  }
80 
81  TRILINOS_UNUSED_FUNCTION bool
82  isConj (const std::string& symmType) {
83  return std::string::npos != symmType.find ("hermitian");
84  }
85 
86  TRILINOS_UNUSED_FUNCTION bool
87  needsSymmetrization (const std::string& symmType) {
88  return symmType != "general";
89  }
90  } // namespace (anonymous)
91 
111  template<class AdderType>
113  public:
115  typedef typename AdderType::index_type index_type;
117  typedef typename AdderType::value_type value_type;
118 
126  const std::string& symmType) :
127  adder_ (adder),
128  symmetrize_ (needsSymmetrization (symmType)),
129  conjugate_ (isConj (symmType)),
130  skew_ (isSkew (symmType))
131  {}
132 
134  void
136  const index_type j,
137  const value_type& Aij)
138  {
139  AdderType& theAdder = *adder_;
140 
141  theAdder (i, j, Aij);
142  if (symmetrize_ && i != j) {
144  const value_type Aji = skew_ ?
145  value_type(-(conjugate_ ? STS::conjugate(Aij) : Aij)) :
146  (conjugate_ ? STS::conjugate(Aij) : Aij);
147  // The optional fourth argument (which defaults to true)
148  // specifies whether or not to count the entry against the
149  // total expected number of entries. We don't want to count
150  // this entry because it wasn't part of the original data;
151  // we inserted it because the caller doesn't want symmetric
152  // storage. The original data's total expected number of
153  // entries only counts the entries that are in the original
154  // data, not those that we insert.
155  theAdder (j, i, Aji, false);
156  }
157  }
158 
163  return adder_;
164  }
165 
166  private:
170  bool symmetrize_;
172  bool conjugate_;
174  bool skew_;
175  };
176 
177  } // namespace MatrixMarket
178 } // namespace Teuchos
179 
180 #endif // __Teuchos_MatrixMarket_SymmetrizingAdder_hpp
Defines basic traits for the scalar field type.
Definition of Teuchos::as, for conversions between types.
Adds entries with optional symmetry to a sparse matrix.
AdderType::value_type value_type
The type of entries of the sparse matrix.
AdderType::index_type index_type
The type of indices of the sparse matrix.
SymmetrizingAdder(const Teuchos::RCP< AdderType > &adder, const std::string &symmType)
Constructor.
Teuchos::RCP< AdderType > getAdder() const
Persisting non-const view of the underlying adder object.
void operator()(const index_type i, const index_type j, const value_type &Aij)
Add value A_ij to entry (i,j), and optionally symmetrize.
Matrix Market file utilities.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
This structure defines some basic traits for a scalar field type.