Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
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>
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
72namespace 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.
Smart reference counting pointer class for automatic garbage collection.
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.