Amesos2 - Direct Sparse Solver Interfaces  Version of the Day
Amesos2_Umfpack_TypeMap.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Amesos2: Templated Direct Sparse Solver Package
4 //
5 // Copyright 2011 NTESS and the Amesos2 contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef AMESOS2_UMFPACK_TYPEMAP_HPP
11 #define AMESOS2_UMFPACK_TYPEMAP_HPP
12 
13 #include <functional>
14 #ifdef HAVE_TEUCHOS_COMPLEX
15 #include <complex>
16 #endif
17 
18 #include <Teuchos_as.hpp>
19 #ifdef HAVE_TEUCHOS_COMPLEX
20 #include <Teuchos_SerializationTraits.hpp>
21 #endif
22 
23 #include "Amesos2_TypeMap.hpp"
24 
25 /* ==================== Conversion ==================== */
26 namespace Teuchos {
27 
39 #ifdef HAVE_TEUCHOS_COMPLEX
40 
41 // Provide conversion from std::complex<float> to std::complex<double>
42 template <typename TypeFrom>
43 class ValueTypeConversionTraits<std::complex<double>, TypeFrom>
44 {
45 public:
46  static std::complex<double> convert( const TypeFrom t )
47  {
48  return std::complex<double>(
49  Teuchos::as<double>(t.real()),
50  Teuchos::as<double>(t.imag()));
51  }
52 
53  static std::complex<double> safeConvert( const TypeFrom t )
54  {
55  return std::complex<double>(
56  Teuchos::as<double>(t.real()),
57  Teuchos::as<double>(t.imag()));
58  }
59 };
60 
61 
62 // Also convert from UMFPACK types - convert back to std::complex<float> to std::complex<double>
63 template <typename TypeTo>
64 class ValueTypeConversionTraits<TypeTo, std::complex<double>>
65 {
66 public:
67  static TypeTo convert( const std::complex<double> t )
68  {
69  typedef typename TypeTo::value_type value_type;
70  value_type ret_r = Teuchos::as<value_type>( t.real() );
71  value_type ret_i = Teuchos::as<value_type>( t.imag() );
72  return ( TypeTo( ret_r, ret_i ) );
73  }
74 
75  // No special checks for safe Convert
76  static TypeTo safeConvert( const std::complex<double> t )
77  {
78  typedef typename TypeTo::value_type value_type;
79  value_type ret_r = Teuchos::as<value_type>( t.real() );
80  value_type ret_i = Teuchos::as<value_type>( t.imag() );
81  return ( TypeTo( ret_r, ret_i ) );
82  }
83 };
84 
85 #endif // HAVE_TEUCHOS_COMPLEX
86 
88 
89 } // end namespace Teuchos
90 
91 namespace Amesos2 {
92 
93 template <class, class> class Umfpack;
94 
95 /* Specialize the Amesos2::TypeMap struct for Umfpack types
96  *
97  * \cond Umfpack_type_specializations
98  */
99 
100 template <>
101 struct TypeMap<Umfpack,float> // provide conversion from float to double
102 {
103  typedef double type;
104  typedef double magnitude_type;
105 };
106 
107 template <>
108 struct TypeMap<Umfpack,double>
109 {
110  typedef double type;
111  typedef double magnitude_type;
112 };
113 
114 
115 #ifdef HAVE_TEUCHOS_COMPLEX
116 
117 template <>
118 struct TypeMap<Umfpack,std::complex<float> > // provide conversion from std::complex<float> to std::complex<double>
119 {
120  typedef Kokkos::complex<double> type;
121  typedef double magnitude_type;
122 };
123 
124 template <>
125 struct TypeMap<Umfpack,std::complex<double> >
126 {
127  typedef Kokkos::complex<double> type;
128  typedef double magnitude_type;
129 };
130 
131 
132 #endif // HAVE_TEUCHOS_COMPLEX
133 
134 /* \endcond Umfpack_type_specializations */
135 
136 
137 } // end namespace Amesos2
138 
139 #endif // AMESOS2_UMFPACK_TYPEMAP_HPP