54 #ifndef AMESOS2_SUPERLU_TYPEMAP_HPP
55 #define AMESOS2_SUPERLU_TYPEMAP_HPP
58 #ifdef HAVE_TEUCHOS_COMPLEX
62 #include <Teuchos_as.hpp>
63 #ifdef HAVE_TEUCHOS_COMPLEX
64 #include <Teuchos_SerializationTraits.hpp>
67 #include "Amesos2_TypeMap.hpp"
80 #undef __SUPERLU_SUPERMATRIX
81 #include "supermatrix.h"
83 #ifdef HAVE_TEUCHOS_COMPLEX
85 #undef __SUPERLU_SCOMPLEX
86 #undef SCOMPLEX_INCLUDE
87 #include "slu_scomplex.h"
91 #undef __SUPERLU_DCOMPLEX
92 #undef DCOMPLEX_INCLUDE
93 #include "slu_dcomplex.h"
95 #endif // HAVE_TEUCHOS_COMPLEX
101 template <
typename slu_scalar_t,
typename slu_mag_t>
106 template <
typename T>
107 struct slu_mult<T,T> : std::multiplies<T> {};
109 #ifdef HAVE_TEUCHOS_COMPLEX
113 struct slu_mult<C::complex,float>
114 : std::binary_function<C::complex,float,C::complex> {
115 C::complex operator()(C::complex amesos_c,
float amesos_f) {
116 C::complex amesos_cr;
117 cs_mult(&amesos_cr, &amesos_c, amesos_f);
123 struct slu_mult<C::complex,C::complex>
124 : std::binary_function<C::complex,C::complex,C::complex> {
125 C::complex operator()(C::complex amesos_c1, C::complex amesos_c2) {
126 C::complex amesos_cr;
127 cc_mult(&amesos_cr, &amesos_c1, &amesos_c2);
133 struct slu_mult<Z::doublecomplex,double>
134 : std::binary_function<Z::doublecomplex,double,Z::doublecomplex> {
135 Z::doublecomplex operator()(Z::doublecomplex amesos_z,
double amesos_d) {
136 Z::doublecomplex amesos_zr;
137 zd_mult(&amesos_zr, &amesos_z, amesos_d);
143 struct slu_mult<Z::doublecomplex,Z::doublecomplex>
144 : std::binary_function<Z::doublecomplex,Z::doublecomplex,Z::doublecomplex> {
145 Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) {
146 Z::doublecomplex amesos_zr;
147 zz_mult(&amesos_zr, &amesos_z1, &amesos_z2);
152 #endif // HAVE_TEUCHOS_COMPLEX
154 #ifdef HAVE_TEUCHOS_COMPLEX
171 class ValueTypeConversionTraits<SLU::C::complex, std::complex<float>>
174 static SLU::C::complex convert(
const std::complex<float> t )
177 ret.r = Teuchos::as<float>(t.real());
178 ret.i = Teuchos::as<float>(t.imag());
182 static SLU::C::complex safeConvert(
const std::complex<float> t )
185 ret.r = Teuchos::as<float>(t.real());
186 ret.i = Teuchos::as<float>(t.imag());
192 class ValueTypeConversionTraits<SLU::C::complex, std::complex<double>>
195 static SLU::C::complex convert(
const std::complex<double> t )
198 ret.r = Teuchos::as<float>(t.real());
199 ret.i = Teuchos::as<float>(t.imag());
203 static SLU::C::complex safeConvert(
const std::complex<double> t )
206 ret.r = Teuchos::as<float>(t.real());
207 ret.i = Teuchos::as<float>(t.imag());
214 class ValueTypeConversionTraits<SLU::Z::doublecomplex, std::complex<float>>
217 static SLU::Z::doublecomplex convert(
const std::complex<float> t )
219 SLU::Z::doublecomplex ret;
220 ret.r = Teuchos::as<double>(t.real());
221 ret.i = Teuchos::as<double>(t.imag());
225 static SLU::Z::doublecomplex safeConvert(
const std::complex<float> t )
227 SLU::Z::doublecomplex ret;
228 ret.r = Teuchos::as<double>(t.real());
229 ret.i = Teuchos::as<double>(t.imag());
235 class ValueTypeConversionTraits<SLU::Z::doublecomplex, std::complex<double>>
238 static SLU::Z::doublecomplex convert(
const std::complex<double> t )
240 SLU::Z::doublecomplex ret;
241 ret.r = Teuchos::as<double>(t.real());
242 ret.i = Teuchos::as<double>(t.imag());
246 static SLU::Z::doublecomplex safeConvert(
const std::complex<double> t )
248 SLU::Z::doublecomplex ret;
249 ret.r = Teuchos::as<double>(t.real());
250 ret.i = Teuchos::as<double>(t.imag());
259 class ValueTypeConversionTraits<std::complex<float>, SLU::C::complex>
262 static std::complex<float> convert(
const SLU::C::complex t )
264 typedef typename std::complex<float>::value_type value_type;
265 value_type ret_r = Teuchos::as<value_type>( t.r );
266 value_type ret_i = Teuchos::as<value_type>( t.i );
267 return ( std::complex<float>( ret_r, ret_i ) );
271 static std::complex<float> safeConvert(
const SLU::C::complex t )
273 typedef typename std::complex<float>::value_type value_type;
274 value_type ret_r = Teuchos::as<value_type>( t.r );
275 value_type ret_i = Teuchos::as<value_type>( t.i );
276 return ( std::complex<float>( ret_r, ret_i ) );
281 class ValueTypeConversionTraits<std::complex<double>, SLU::C::complex>
284 static std::complex<double> convert(
const SLU::C::complex t )
286 typedef typename std::complex<double>::value_type value_type;
287 value_type ret_r = Teuchos::as<value_type>( t.r );
288 value_type ret_i = Teuchos::as<value_type>( t.i );
289 return ( std::complex<double>( ret_r, ret_i ) );
293 static std::complex<double> safeConvert(
const SLU::C::complex t )
295 typedef typename std::complex<double>::value_type value_type;
296 value_type ret_r = Teuchos::as<value_type>( t.r );
297 value_type ret_i = Teuchos::as<value_type>( t.i );
298 return ( std::complex<double>( ret_r, ret_i ) );
304 class ValueTypeConversionTraits<std::complex<float>, SLU::Z::doublecomplex>
307 static std::complex<float> convert(
const SLU::Z::doublecomplex t )
309 typedef typename std::complex<float>::value_type value_type;
310 value_type ret_r = Teuchos::as<value_type>( t.r );
311 value_type ret_i = Teuchos::as<value_type>( t.i );
312 return ( std::complex<float>( ret_r, ret_i ) );
316 static std::complex<float> safeConvert(
const SLU::Z::doublecomplex t )
318 typedef typename std::complex<float>::value_type value_type;
319 value_type ret_r = Teuchos::as<value_type>( t.r );
320 value_type ret_i = Teuchos::as<value_type>( t.i );
321 return ( std::complex<float>( ret_r, ret_i ) );
326 class ValueTypeConversionTraits<std::complex<double>, SLU::Z::doublecomplex>
329 static std::complex<double> convert(
const SLU::Z::doublecomplex t )
331 typedef typename std::complex<double>::value_type value_type;
332 value_type ret_r = Teuchos::as<value_type>( t.r );
333 value_type ret_i = Teuchos::as<value_type>( t.i );
334 return ( std::complex<double>( ret_r, ret_i ) );
338 static std::complex<double> safeConvert(
const SLU::Z::doublecomplex t )
340 typedef typename std::complex<double>::value_type value_type;
341 value_type ret_r = Teuchos::as<value_type>( t.r );
342 value_type ret_i = Teuchos::as<value_type>( t.i );
343 return ( std::complex<double>( ret_r, ret_i ) );
347 template <
typename Ordinal>
348 class SerializationTraits<Ordinal,SLU::C::complex>
349 :
public DirectSerializationTraits<Ordinal,SLU::C::complex>
352 template <
typename Ordinal>
353 class SerializationTraits<Ordinal,SLU::Z::doublecomplex>
354 :
public DirectSerializationTraits<Ordinal,SLU::Z::doublecomplex>
363 ostream& operator<<(ostream& out,
const SLU::Z::doublecomplex z);
365 ostream& operator<<(ostream& out,
const SLU::C::complex c);
368 #endif // HAVE_TEUCHOS_COMPLEX
373 template <
class,
class>
class Superlu;
380 struct TypeMap<Superlu,float>
382 static SLU::Dtype_t dtype;
384 typedef float magnitude_type;
389 struct TypeMap<Superlu,double>
391 static SLU::Dtype_t dtype;
393 typedef double magnitude_type;
397 #ifdef HAVE_TEUCHOS_COMPLEX
400 struct TypeMap<Superlu,std::complex<float> >
402 static SLU::Dtype_t dtype;
403 typedef SLU::C::complex type;
404 typedef float magnitude_type;
409 struct TypeMap<Superlu,std::complex<double> >
411 static SLU::Dtype_t dtype;
412 typedef SLU::Z::doublecomplex type;
413 typedef double magnitude_type;
418 struct TypeMap<Superlu,SLU::C::complex>
420 static SLU::Dtype_t dtype;
421 typedef SLU::C::complex type;
422 typedef float magnitude_type;
427 struct TypeMap<Superlu,SLU::Z::doublecomplex>
429 static SLU::Dtype_t dtype;
430 typedef SLU::Z::doublecomplex type;
431 typedef double magnitude_type;
435 #endif // HAVE_TEUCHOS_COMPLEX
442 #endif // AMESOS2_SUPERLU_TYPEMAP_HPP