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 ==================== */
26namespace Teuchos {
27
39#ifdef HAVE_TEUCHOS_COMPLEX
40
41// Provide conversion from std::complex<float> to std::complex<double>
42template <typename TypeFrom>
43class ValueTypeConversionTraits<std::complex<double>, TypeFrom>
44{
45public:
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>
63template <typename TypeTo>
64class ValueTypeConversionTraits<TypeTo, std::complex<double>>
65{
66public:
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
91namespace Amesos2 {
92
93template <class, class> class Umfpack;
94
95/* Specialize the Amesos2::TypeMap struct for Umfpack types
96 *
97 * \cond Umfpack_type_specializations
98 */
99
100template <>
101struct TypeMap<Umfpack,float> // provide conversion from float to double
102{
103 typedef double type;
104 typedef double magnitude_type;
105};
106
107template <>
108struct TypeMap<Umfpack,double>
109{
110 typedef double type;
111 typedef double magnitude_type;
112};
113
114
115#ifdef HAVE_TEUCHOS_COMPLEX
116
117template <>
118struct 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
124template <>
125struct 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