56 #ifndef AMESOS2_PARDISOMKL_TYPEMAP_HPP
57 #define AMESOS2_PARDISOMKL_TYPEMAP_HPP
59 #ifdef HAVE_TEUCHOS_COMPLEX
63 #include <Teuchos_as.hpp>
64 #ifdef HAVE_TEUCHOS_COMPLEX
65 #include <Teuchos_SerializationTraits.hpp>
68 #include "Amesos2_TypeMap.hpp"
78 #include <mkl_types.h>
84 typedef MKL_INT _INTEGER_t;
96 #ifdef HAVE_TEUCHOS_COMPLEX
99 template <
typename TypeFrom>
100 class ValueTypeConversionTraits<Amesos2::PMKL::_MKL_Complex8, TypeFrom>
103 static Amesos2::PMKL::_MKL_Complex8 convert(
const TypeFrom t )
105 Amesos2::PMKL::_MKL_Complex8 ret;
106 ret.real = Teuchos::as<float>(t.real());
107 ret.imag = Teuchos::as<float>(t.imag());
111 static Amesos2::PMKL::_MKL_Complex8 safeConvert(
const TypeFrom t )
113 Amesos2::PMKL::_MKL_Complex8 ret;
114 ret.real = Teuchos::as<float>(t.real());
115 ret.imag = Teuchos::as<float>(t.imag());
121 template <
typename TypeFrom>
122 class ValueTypeConversionTraits<Amesos2::PMKL::_DOUBLE_COMPLEX_t, TypeFrom>
125 static Amesos2::PMKL::_DOUBLE_COMPLEX_t convert(
const TypeFrom t )
127 Amesos2::PMKL::_DOUBLE_COMPLEX_t ret;
128 ret.r = Teuchos::as<double>(t.real());
129 ret.i = Teuchos::as<double>(t.imag());
133 static Amesos2::PMKL::_DOUBLE_COMPLEX_t safeConvert(
const TypeFrom t )
135 Amesos2::PMKL::_DOUBLE_COMPLEX_t ret;
136 ret.r = Teuchos::as<double>(t.real());
137 ret.i = Teuchos::as<double>(t.imag());
144 template <
typename TypeTo>
145 class ValueTypeConversionTraits<TypeTo, Amesos2::PMKL::_MKL_Complex8>
148 static TypeTo convert(
const Amesos2::PMKL::_MKL_Complex8 t )
150 typedef typename TypeTo::value_type value_type;
151 value_type ret_r = Teuchos::as<value_type>( t.real );
152 value_type ret_i = Teuchos::as<value_type>( t.imag );
153 return ( TypeTo( ret_r, ret_i ) );
156 static TypeTo safeConvert(
const Amesos2::PMKL::_MKL_Complex8 t )
158 typedef typename TypeTo::value_type value_type;
159 value_type ret_r = Teuchos::as<value_type>( t.real );
160 value_type ret_i = Teuchos::as<value_type>( t.imag );
161 return ( TypeTo( ret_r, ret_i ) );
166 template <
typename TypeTo>
167 class ValueTypeConversionTraits<TypeTo, Amesos2::PMKL::_DOUBLE_COMPLEX_t>
170 static TypeTo convert(
const Amesos2::PMKL::_DOUBLE_COMPLEX_t t )
172 typedef typename TypeTo::value_type value_type;
173 value_type ret_r = Teuchos::as<value_type>( t.r );
174 value_type ret_i = Teuchos::as<value_type>( t.i );
175 return ( TypeTo( ret_r, ret_i ) );
179 static TypeTo safeConvert(
const Amesos2::PMKL::_DOUBLE_COMPLEX_t t )
181 typedef typename TypeTo::value_type value_type;
182 value_type ret_r = Teuchos::as<value_type>( t.r );
183 value_type ret_i = Teuchos::as<value_type>( t.i );
184 return ( TypeTo( ret_r, ret_i ) );
196 template <
class,
class>
class PardisoMKL;
205 struct TypeMap<PardisoMKL,float>
207 typedef PMKL::_REAL_t type;
208 typedef PMKL::_REAL_t magnitude_type;
213 struct TypeMap<PardisoMKL,double>
215 typedef PMKL::_DOUBLE_PRECISION_t type;
216 typedef PMKL::_DOUBLE_PRECISION_t magnitude_type;
219 #ifdef HAVE_TEUCHOS_COMPLEX
227 struct TypeMap<PardisoMKL,std::complex<float> >
229 typedef PMKL::_MKL_Complex8 type;
230 typedef PMKL::_REAL_t magnitude_type;
235 struct TypeMap<PardisoMKL,std::complex<double> >
237 typedef PMKL::_DOUBLE_COMPLEX_t type;
238 typedef PMKL::_DOUBLE_PRECISION_t magnitude_type;
243 struct TypeMap<PardisoMKL,PMKL::_MKL_Complex8>
245 typedef PMKL::_MKL_Complex8 type;
246 typedef PMKL::_REAL_t magnitude_type;
251 struct TypeMap<PardisoMKL,PMKL::_DOUBLE_COMPLEX_t>
253 typedef PMKL::_DOUBLE_COMPLEX_t type;
254 typedef PMKL::_DOUBLE_PRECISION_t magnitude_type;
256 #endif // HAVE_TEUCHOS_COMPLEX
259 struct TypeMap<PardisoMKL,int>
261 typedef PMKL::_INTEGER_t type;
266 struct TypeMap<PardisoMKL,long long int>
268 typedef long long int type;
278 struct TypeMap<PardisoMKL,long int>
280 typedef Meta::if_then_else<
281 sizeof(int) <
sizeof(
long int),
282 TypeMap<PardisoMKL,long long int>::type,
283 TypeMap<PardisoMKL,int>::type >::type type;
288 #endif // AMESOS2_PARDISOMKL_TYPEMAP_HPP