54 #ifndef AMESOS2_SUPERLUMT_TYPEMAP_HPP
55 #define AMESOS2_SUPERLUMT_TYPEMAP_HPP
59 #include <Teuchos_as.hpp>
60 #ifdef HAVE_TEUCHOS_COMPLEX
61 #include <Teuchos_SerializationTraits.hpp>
64 #include "Amesos2_TypeMap.hpp"
72 #undef __SUPERLU_SUPERMATRIX
73 #include "supermatrix.h"
75 #ifdef HAVE_TEUCHOS_COMPLEX
78 #undef __SUPERLU_SCOMPLEX
79 #undef SCOMPLEX_INCLUDE
80 #include "slu_scomplex.h"
84 #undef __SUPERLU_DCOMPLEX
85 #undef DCOMPLEX_INCLUDE
86 #include "slu_dcomplex.h"
89 #endif // HAVE_TEUCHOS_COMPLEX
94 template <
typename slu_scalar_t,
typename slu_mag_t>
95 struct slu_mt_mult {};
100 struct slu_mt_mult<T,T> : std::multiplies<T> {};
102 #ifdef HAVE_TEUCHOS_COMPLEX
106 struct slu_mt_mult<C::complex,float>
108 C::complex operator()(C::complex amesos_c,
float amesos_f) {
109 C::complex amesos_cr;
110 cs_mult(&amesos_cr, &amesos_c, amesos_f);
116 struct slu_mt_mult<C::complex,C::complex>
118 C::complex operator()(C::complex amesos_c1, C::complex amesos_c2) {
119 C::complex amesos_cr;
120 cc_mult(&amesos_cr, &amesos_c1, &amesos_c2);
126 struct slu_mt_mult<Z::doublecomplex,double>
128 Z::doublecomplex operator()(Z::doublecomplex amesos_z,
double amesos_d) {
129 Z::doublecomplex amesos_zr;
130 zd_mult(&amesos_zr, &amesos_z, amesos_d);
136 struct slu_mt_mult<Z::doublecomplex,Z::doublecomplex>
138 Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) {
139 Z::doublecomplex amesos_zr;
140 zz_mult(&amesos_zr, &amesos_z1, &amesos_z2);
145 #endif // HAVE_TEUCHOS_COMPLEX
147 #ifdef HAVE_TEUCHOS_COMPLEX
162 template <
typename TypeFrom>
163 class ValueTypeConversionTraits<SLUMT::C::complex, TypeFrom>
166 static SLUMT::C::complex convert(
const TypeFrom t )
168 SLUMT::C::complex ret;
169 ret.r = Teuchos::as<float>(t.real());
170 ret.i = Teuchos::as<float>(t.imag());
174 static SLUMT::C::complex safeConvert(
const TypeFrom t )
176 SLUMT::C::complex ret;
177 ret.r = Teuchos::as<float>(t.real());
178 ret.i = Teuchos::as<float>(t.imag());
184 template <
typename TypeFrom>
185 class ValueTypeConversionTraits<SLUMT::Z::doublecomplex, TypeFrom>
188 static SLUMT::Z::doublecomplex convert(
const TypeFrom t )
190 SLUMT::Z::doublecomplex ret;
191 ret.r = Teuchos::as<double>(t.real());
192 ret.i = Teuchos::as<double>(t.imag());
196 static SLUMT::Z::doublecomplex safeConvert(
const TypeFrom t )
198 SLUMT::Z::doublecomplex ret;
199 ret.r = Teuchos::as<double>(t.real());
200 ret.i = Teuchos::as<double>(t.imag());
207 template <
typename TypeTo>
208 class ValueTypeConversionTraits<TypeTo, SLUMT::C::complex>
211 static TypeTo convert(
const SLUMT::C::complex t )
213 typedef typename TypeTo::value_type value_type;
214 value_type ret_r = Teuchos::as<value_type>( t.r );
215 value_type ret_i = Teuchos::as<value_type>( t.i );
216 return ( TypeTo( ret_r, ret_i ) );
220 static TypeTo safeConvert(
const SLUMT::C::complex t )
222 typedef typename TypeTo::value_type value_type;
223 value_type ret_r = Teuchos::as<value_type>( t.r );
224 value_type ret_i = Teuchos::as<value_type>( t.i );
225 return ( TypeTo( ret_r, ret_i ) );
230 template <
typename TypeTo>
231 class ValueTypeConversionTraits<TypeTo, SLUMT::Z::doublecomplex>
234 static TypeTo convert(
const SLUMT::Z::doublecomplex t )
236 typedef typename TypeTo::value_type value_type;
237 value_type ret_r = Teuchos::as<value_type>( t.r );
238 value_type ret_i = Teuchos::as<value_type>( t.i );
239 return ( TypeTo( ret_r, ret_i ) );
243 static TypeTo safeConvert(
const SLUMT::Z::doublecomplex t )
245 typedef typename TypeTo::value_type value_type;
246 value_type ret_r = Teuchos::as<value_type>( t.r );
247 value_type ret_i = Teuchos::as<value_type>( t.i );
248 return ( TypeTo( ret_r, ret_i ) );
252 template <
typename Ordinal>
253 class SerializationTraits<Ordinal,SLUMT::C::complex>
254 :
public DirectSerializationTraits<Ordinal,SLUMT::C::complex>
257 template <
typename Ordinal>
258 class SerializationTraits<Ordinal,SLUMT::Z::doublecomplex>
259 :
public DirectSerializationTraits<Ordinal,SLUMT::Z::doublecomplex>
275 ostream& operator<<(ostream& out,
const SLUMT::C::complex c);
277 ostream& operator<<(ostream& out,
const SLUMT::Z::doublecomplex z);
282 #endif // HAVE_TEUCHOS_COMPLEX
287 template <
class,
class>
class Superlumt;
294 struct TypeMap<Superlumt,float>
296 static SLUMT::Dtype_t dtype;
298 typedef float magnitude_type;
303 struct TypeMap<Superlumt,double>
305 static SLUMT::Dtype_t dtype;
307 typedef double magnitude_type;
311 #ifdef HAVE_TEUCHOS_COMPLEX
313 struct TypeMap<Superlumt,std::complex<float> >
315 static SLUMT::Dtype_t dtype;
316 typedef SLUMT::C::complex type;
317 typedef float magnitude_type;
322 struct TypeMap<Superlumt,std::complex<double> >
324 static SLUMT::Dtype_t dtype;
325 typedef SLUMT::Z::doublecomplex type;
326 typedef double magnitude_type;
331 struct TypeMap<Superlumt,SLUMT::C::complex>
333 static SLUMT::Dtype_t dtype;
334 typedef SLUMT::C::complex type;
335 typedef float magnitude_type;
340 struct TypeMap<Superlumt,SLUMT::Z::doublecomplex>
342 static SLUMT::Dtype_t dtype;
343 typedef SLUMT::Z::doublecomplex type;
344 typedef double magnitude_type;
347 #endif // HAVE_TEUCHOS_COMPLEX
354 #endif // AMESOS2_SUPERLUMT_TYPEMAP_HPP