57 #ifndef AMESOS2_SUPERLUDIST_TYPEMAP_HPP
58 #define AMESOS2_SUPERLUDIST_TYPEMAP_HPP
62 #include <Teuchos_as.hpp>
63 #ifdef HAVE_TEUCHOS_COMPLEX
64 #include <Teuchos_SerializationTraits.hpp>
67 #include "Amesos2_TypeMap.hpp"
75 #undef __SUPERLU_SUPERMATRIX
76 #include "superlu_defs.h"
78 #if SUPERLU_DIST_MAJOR_VERSION > 4
79 typedef superlu_dist_options_t amesos2_superlu_dist_options_t;
80 typedef superlu_dist_mem_usage_t amesos2_superlu_dist_mem_usage_t;
82 typedef superlu_options_t amesos2_superlu_dist_options_t;
83 typedef mem_usage_t amesos2_superlu_dist_mem_usage_t;
87 #include "superlu_ddefs.h"
90 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
92 #include "superlu_zdefs.h"
94 #endif // HAVE_TEUCHOS_COMPLEX
97 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
101 template <
typename slu_scalar_t,
typename slu_mag_t>
102 struct slu_mt_mult {};
106 template <
typename T>
107 struct slu_mt_mult<T,T> : std::multiplies<T> {};
111 struct slu_mt_mult<Z::doublecomplex,double>
112 : std::binary_function<Z::doublecomplex,double,Z::doublecomplex> {
113 Z::doublecomplex operator()(Z::doublecomplex amesos_z,
double amesos_d) {
114 Z::doublecomplex amesos_zr;
115 zd_mult(&amesos_zr, &amesos_z, amesos_d);
121 struct slu_mt_mult<Z::doublecomplex,Z::doublecomplex>
122 : std::binary_function<Z::doublecomplex,Z::doublecomplex,Z::doublecomplex> {
123 Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) {
124 Z::doublecomplex amesos_zr;
125 zz_mult(&amesos_zr, &amesos_z1, &amesos_z2);
129 #endif // HAVE_TEUCHOS_COMPLEX
131 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
147 template <
typename TypeFrom>
148 class ValueTypeConversionTraits<SLUD::Z::doublecomplex, TypeFrom>
151 static SLUD::Z::doublecomplex convert(
const TypeFrom t )
153 SLUD::Z::doublecomplex ret;
154 ret.r = Teuchos::as<double>(t.real());
155 ret.i = Teuchos::as<double>(t.imag());
159 static SLUD::Z::doublecomplex safeConvert(
const TypeFrom t )
161 SLUD::Z::doublecomplex ret;
162 ret.r = Teuchos::as<double>(t.real());
163 ret.i = Teuchos::as<double>(t.imag());
170 template <
typename TypeTo>
171 class ValueTypeConversionTraits<TypeTo, SLUD::Z::doublecomplex>
174 static TypeTo convert(
const SLUD::Z::doublecomplex t )
176 typedef typename TypeTo::value_type value_type;
177 value_type ret_r = Teuchos::as<value_type>( t.r );
178 value_type ret_i = Teuchos::as<value_type>( t.i );
179 return ( TypeTo( ret_r, ret_i ) );
183 static TypeTo safeConvert(
const SLUD::Z::doublecomplex t )
185 typedef typename TypeTo::value_type value_type;
186 value_type ret_r = Teuchos::as<value_type>( t.r );
187 value_type ret_i = Teuchos::as<value_type>( t.i );
188 return ( TypeTo( ret_r, ret_i ) );
192 template <
typename Ordinal>
193 class SerializationTraits<Ordinal,SLUD::Z::doublecomplex>
194 :
public DirectSerializationTraits<Ordinal,SLUD::Z::doublecomplex>
210 ostream& operator<<(ostream& out,
const SLUD::Z::doublecomplex z);
214 #endif // HAVE_TEUCHOS_COMPLEX
220 template <
class,
class>
class Superludist;
227 struct TypeMap<Superludist,double>
229 static const SLUD::Dtype_t dtype = SLUD::SLU_D;
231 typedef double magnitude_type;
232 typedef SLUD::D::LUstruct_t LUstruct_t;
233 typedef SLUD::D::SOLVEstruct_t SOLVEstruct_t;
236 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
238 struct TypeMap<Superludist,std::complex<double> >
240 static const SLUD::Dtype_t dtype = SLUD::SLU_Z;
241 typedef SLUD::Z::doublecomplex type;
242 typedef double magnitude_type;
243 typedef SLUD::Z::LUstruct_t LUstruct_t;
244 typedef SLUD::Z::SOLVEstruct_t SOLVEstruct_t;
251 struct TypeMap<Superludist,SLUD::Z::doublecomplex>
253 static const SLUD::Dtype_t dtype = SLUD::SLU_Z;
254 typedef SLUD::Z::doublecomplex type;
255 typedef double magnitude_type;
256 typedef SLUD::Z::LUstruct_t LUstruct_t;
257 typedef SLUD::Z::SOLVEstruct_t SOLVEstruct_t;
260 #endif // HAVE_TEUCHOS_COMPLEX
267 #endif // AMESOS2_SUPERLUDIST_TYPEMAP_HPP