Amesos2 - Direct Sparse Solver Interfaces Version of the Day
Amesos2_Umfpack_TypeMap.hpp
1// @HEADER
2//
3// ***********************************************************************
4//
5// Amesos2: Templated Direct Sparse Solver Package
6// Copyright 2011 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Sivasankaran Rajamanickam (srajama@sandia.gov)
39//
40// ***********************************************************************
41//
42// @HEADER
43
44#ifndef AMESOS2_UMFPACK_TYPEMAP_HPP
45#define AMESOS2_UMFPACK_TYPEMAP_HPP
46
47#include <functional>
48#ifdef HAVE_TEUCHOS_COMPLEX
49#include <complex>
50#endif
51
52#include <Teuchos_as.hpp>
53#ifdef HAVE_TEUCHOS_COMPLEX
54#include <Teuchos_SerializationTraits.hpp>
55#endif
56
57#include "Amesos2_TypeMap.hpp"
58
59/* ==================== Conversion ==================== */
60namespace Teuchos {
61
73#ifdef HAVE_TEUCHOS_COMPLEX
74
75// Provide conversion from std::complex<float> to std::complex<double>
76template <typename TypeFrom>
77class ValueTypeConversionTraits<std::complex<double>, TypeFrom>
78{
79public:
80 static std::complex<double> convert( const TypeFrom t )
81 {
82 return std::complex<double>(
83 Teuchos::as<double>(t.real()),
84 Teuchos::as<double>(t.imag()));
85 }
86
87 static std::complex<double> safeConvert( const TypeFrom t )
88 {
89 return std::complex<double>(
90 Teuchos::as<double>(t.real()),
91 Teuchos::as<double>(t.imag()));
92 }
93};
94
95
96// Also convert from UMFPACK types - convert back to std::complex<float> to std::complex<double>
97template <typename TypeTo>
98class ValueTypeConversionTraits<TypeTo, std::complex<double>>
99{
100public:
101 static TypeTo convert( const std::complex<double> t )
102 {
103 typedef typename TypeTo::value_type value_type;
104 value_type ret_r = Teuchos::as<value_type>( t.real() );
105 value_type ret_i = Teuchos::as<value_type>( t.imag() );
106 return ( TypeTo( ret_r, ret_i ) );
107 }
108
109 // No special checks for safe Convert
110 static TypeTo safeConvert( const std::complex<double> t )
111 {
112 typedef typename TypeTo::value_type value_type;
113 value_type ret_r = Teuchos::as<value_type>( t.real() );
114 value_type ret_i = Teuchos::as<value_type>( t.imag() );
115 return ( TypeTo( ret_r, ret_i ) );
116 }
117};
118
119#endif // HAVE_TEUCHOS_COMPLEX
120
122
123} // end namespace Teuchos
124
125namespace Amesos2 {
126
127template <class, class> class Umfpack;
128
129/* Specialize the Amesos2::TypeMap struct for Umfpack types
130 *
131 * \cond Umfpack_type_specializations
132 */
133
134template <>
135struct TypeMap<Umfpack,float> // provide conversion from float to double
136{
137 typedef double type;
138 typedef double magnitude_type;
139};
140
141template <>
142struct TypeMap<Umfpack,double>
143{
144 typedef double type;
145 typedef double magnitude_type;
146};
147
148
149#ifdef HAVE_TEUCHOS_COMPLEX
150
151template <>
152struct TypeMap<Umfpack,std::complex<float> > // provide conversion from std::complex<float> to std::complex<double>
153{
154 typedef std::complex<double> type;
155 typedef double magnitude_type;
156};
157
158template <>
159struct TypeMap<Umfpack,std::complex<double> >
160{
161 typedef std::complex<double> type;
162 typedef double magnitude_type;
163};
164
165
166#endif // HAVE_TEUCHOS_COMPLEX
167
168/* \endcond Umfpack_type_specializations */
169
170
171} // end namespace Amesos2
172
173#endif // AMESOS2_UMFPACK_TYPEMAP_HPP