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
95 template <
typename slu_scalar_t,
typename slu_mag_t>
96 struct slu_mt_mult {};
100 template <
typename T>
101 struct slu_mt_mult<T,T> : std::multiplies<T> {};
103 #ifdef HAVE_TEUCHOS_COMPLEX
107 struct slu_mt_mult<C::complex,float>
108 : std::binary_function<C::complex,float,C::complex> {
109 C::complex operator()(C::complex amesos_c,
float amesos_f) {
110 C::complex amesos_cr;
111 cs_mult(&amesos_cr, &amesos_c, amesos_f);
117 struct slu_mt_mult<C::complex,C::complex>
118 : std::binary_function<C::complex,C::complex,C::complex> {
119 C::complex operator()(C::complex amesos_c1, C::complex amesos_c2) {
120 C::complex amesos_cr;
121 cc_mult(&amesos_cr, &amesos_c1, &amesos_c2);
127 struct slu_mt_mult<Z::doublecomplex,double>
128 : std::binary_function<Z::doublecomplex,double,Z::doublecomplex> {
129 Z::doublecomplex operator()(Z::doublecomplex amesos_z,
double amesos_d) {
130 Z::doublecomplex amesos_zr;
131 zd_mult(&amesos_zr, &amesos_z, amesos_d);
137 struct slu_mt_mult<Z::doublecomplex,Z::doublecomplex>
138 : std::binary_function<Z::doublecomplex,Z::doublecomplex,Z::doublecomplex> {
139 Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) {
140 Z::doublecomplex amesos_zr;
141 zz_mult(&amesos_zr, &amesos_z1, &amesos_z2);
146 #endif // HAVE_TEUCHOS_COMPLEX
148 #ifdef HAVE_TEUCHOS_COMPLEX
163 template <
typename TypeFrom>
164 class ValueTypeConversionTraits<SLUMT::C::complex, TypeFrom>
167 static SLUMT::C::complex convert(
const TypeFrom t )
169 SLUMT::C::complex ret;
170 ret.r = Teuchos::as<float>(t.real());
171 ret.i = Teuchos::as<float>(t.imag());
175 static SLUMT::C::complex safeConvert(
const TypeFrom t )
177 SLUMT::C::complex ret;
178 ret.r = Teuchos::as<float>(t.real());
179 ret.i = Teuchos::as<float>(t.imag());
185 template <
typename TypeFrom>
186 class ValueTypeConversionTraits<SLUMT::Z::doublecomplex, TypeFrom>
189 static SLUMT::Z::doublecomplex convert(
const TypeFrom t )
191 SLUMT::Z::doublecomplex ret;
192 ret.r = Teuchos::as<double>(t.real());
193 ret.i = Teuchos::as<double>(t.imag());
197 static SLUMT::Z::doublecomplex safeConvert(
const TypeFrom t )
199 SLUMT::Z::doublecomplex ret;
200 ret.r = Teuchos::as<double>(t.real());
201 ret.i = Teuchos::as<double>(t.imag());
208 template <
typename TypeTo>
209 class ValueTypeConversionTraits<TypeTo, SLUMT::C::complex>
212 static TypeTo convert(
const SLUMT::C::complex t )
214 typedef typename TypeTo::value_type value_type;
215 value_type ret_r = Teuchos::as<value_type>( t.r );
216 value_type ret_i = Teuchos::as<value_type>( t.i );
217 return ( TypeTo( ret_r, ret_i ) );
221 static TypeTo safeConvert(
const SLUMT::C::complex t )
223 typedef typename TypeTo::value_type value_type;
224 value_type ret_r = Teuchos::as<value_type>( t.r );
225 value_type ret_i = Teuchos::as<value_type>( t.i );
226 return ( TypeTo( ret_r, ret_i ) );
231 template <
typename TypeTo>
232 class ValueTypeConversionTraits<TypeTo, SLUMT::Z::doublecomplex>
235 static TypeTo convert(
const SLUMT::Z::doublecomplex t )
237 typedef typename TypeTo::value_type value_type;
238 value_type ret_r = Teuchos::as<value_type>( t.r );
239 value_type ret_i = Teuchos::as<value_type>( t.i );
240 return ( TypeTo( ret_r, ret_i ) );
244 static TypeTo safeConvert(
const SLUMT::Z::doublecomplex t )
246 typedef typename TypeTo::value_type value_type;
247 value_type ret_r = Teuchos::as<value_type>( t.r );
248 value_type ret_i = Teuchos::as<value_type>( t.i );
249 return ( TypeTo( ret_r, ret_i ) );
253 template <
typename Ordinal>
254 class SerializationTraits<Ordinal,SLUMT::C::complex>
255 :
public DirectSerializationTraits<Ordinal,SLUMT::C::complex>
258 template <
typename Ordinal>
259 class SerializationTraits<Ordinal,SLUMT::Z::doublecomplex>
260 :
public DirectSerializationTraits<Ordinal,SLUMT::Z::doublecomplex>
276 ostream& operator<<(ostream& out,
const SLUMT::C::complex c);
278 ostream& operator<<(ostream& out,
const SLUMT::Z::doublecomplex z);
283 #endif // HAVE_TEUCHOS_COMPLEX
288 template <
class,
class>
class Superlumt;
295 struct TypeMap<Superlumt,float>
297 static SLUMT::Dtype_t dtype;
299 typedef float magnitude_type;
304 struct TypeMap<Superlumt,double>
306 static SLUMT::Dtype_t dtype;
308 typedef double magnitude_type;
312 #ifdef HAVE_TEUCHOS_COMPLEX
314 struct TypeMap<Superlumt,std::complex<float> >
316 static SLUMT::Dtype_t dtype;
317 typedef SLUMT::C::complex type;
318 typedef float magnitude_type;
323 struct TypeMap<Superlumt,std::complex<double> >
325 static SLUMT::Dtype_t dtype;
326 typedef SLUMT::Z::doublecomplex type;
327 typedef double magnitude_type;
332 struct TypeMap<Superlumt,SLUMT::C::complex>
334 static SLUMT::Dtype_t dtype;
335 typedef SLUMT::C::complex type;
336 typedef float magnitude_type;
341 struct TypeMap<Superlumt,SLUMT::Z::doublecomplex>
343 static SLUMT::Dtype_t dtype;
344 typedef SLUMT::Z::doublecomplex type;
345 typedef double magnitude_type;
348 #endif // HAVE_TEUCHOS_COMPLEX
355 #endif // AMESOS2_SUPERLUMT_TYPEMAP_HPP