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 ==================== */
60 namespace Teuchos {
61 
73 #ifdef HAVE_TEUCHOS_COMPLEX
74 
75 // Provide conversion from std::complex<float> to std::complex<double>
76 template <typename TypeFrom>
77 class ValueTypeConversionTraits<std::complex<double>, TypeFrom>
78 {
79 public:
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>
97 template <typename TypeTo>
98 class ValueTypeConversionTraits<TypeTo, std::complex<double>>
99 {
100 public:
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 
125 namespace Amesos2 {
126 
127 template <class, class> class Umfpack;
128 
129 /* Specialize the Amesos2::TypeMap struct for Umfpack types
130  *
131  * \cond Umfpack_type_specializations
132  */
133 
134 template <>
135 struct TypeMap<Umfpack,float> // provide conversion from float to double
136 {
137  typedef double type;
138  typedef double magnitude_type;
139 };
140 
141 template <>
142 struct TypeMap<Umfpack,double>
143 {
144  typedef double type;
145  typedef double magnitude_type;
146 };
147 
148 
149 #ifdef HAVE_TEUCHOS_COMPLEX
150 
151 template <>
152 struct 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 
158 template <>
159 struct 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