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"
74 #define USER_FREE(addr) SLUD::superlu_free_dist(addr)
78 #undef __SUPERLU_SUPERMATRIX
79 #include "superlu_defs.h"
81 #if SUPERLU_DIST_MAJOR_VERSION > 4
82 typedef superlu_dist_options_t amesos2_superlu_dist_options_t;
83 typedef superlu_dist_mem_usage_t amesos2_superlu_dist_mem_usage_t;
84 #define AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER 1
86 typedef superlu_options_t amesos2_superlu_dist_options_t;
87 typedef mem_usage_t amesos2_superlu_dist_mem_usage_t;
91 #include "superlu_ddefs.h"
94 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
96 #include "superlu_zdefs.h"
98 #endif // HAVE_TEUCHOS_COMPLEX
101 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
105 template <
typename slu_scalar_t,
typename slu_mag_t>
106 struct slu_mt_mult {};
110 template <
typename T>
111 struct slu_mt_mult<T,T> : std::multiplies<T> {};
115 struct slu_mt_mult<Z::doublecomplex,double>
116 : std::binary_function<Z::doublecomplex,double,Z::doublecomplex> {
117 Z::doublecomplex operator()(Z::doublecomplex amesos_z,
double amesos_d) {
118 Z::doublecomplex amesos_zr;
119 zd_mult(&amesos_zr, &amesos_z, amesos_d);
125 struct slu_mt_mult<Z::doublecomplex,Z::doublecomplex>
126 : std::binary_function<Z::doublecomplex,Z::doublecomplex,Z::doublecomplex> {
127 Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) {
128 Z::doublecomplex amesos_zr;
129 zz_mult(&amesos_zr, &amesos_z1, &amesos_z2);
133 #endif // HAVE_TEUCHOS_COMPLEX
135 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
151 template <
typename TypeFrom>
152 class ValueTypeConversionTraits<SLUD::Z::doublecomplex, TypeFrom>
155 static SLUD::Z::doublecomplex convert(
const TypeFrom t )
157 SLUD::Z::doublecomplex ret;
158 ret.r = Teuchos::as<double>(t.real());
159 ret.i = Teuchos::as<double>(t.imag());
163 static SLUD::Z::doublecomplex safeConvert(
const TypeFrom t )
165 SLUD::Z::doublecomplex ret;
166 ret.r = Teuchos::as<double>(t.real());
167 ret.i = Teuchos::as<double>(t.imag());
174 template <
typename TypeTo>
175 class ValueTypeConversionTraits<TypeTo, SLUD::Z::doublecomplex>
178 static TypeTo convert(
const SLUD::Z::doublecomplex t )
180 typedef typename TypeTo::value_type value_type;
181 value_type ret_r = Teuchos::as<value_type>( t.r );
182 value_type ret_i = Teuchos::as<value_type>( t.i );
183 return ( TypeTo( ret_r, ret_i ) );
187 static TypeTo safeConvert(
const SLUD::Z::doublecomplex t )
189 typedef typename TypeTo::value_type value_type;
190 value_type ret_r = Teuchos::as<value_type>( t.r );
191 value_type ret_i = Teuchos::as<value_type>( t.i );
192 return ( TypeTo( ret_r, ret_i ) );
196 template <
typename Ordinal>
197 class SerializationTraits<Ordinal,SLUD::Z::doublecomplex>
198 :
public DirectSerializationTraits<Ordinal,SLUD::Z::doublecomplex>
214 ostream& operator<<(ostream& out,
const SLUD::Z::doublecomplex z);
218 #endif // HAVE_TEUCHOS_COMPLEX
224 template <
class,
class>
class Superludist;
231 struct TypeMap<Superludist,double>
233 static const SLUD::Dtype_t dtype = SLUD::SLU_D;
235 typedef double magnitude_type;
236 typedef SLUD::D::LUstruct_t LUstruct_t;
237 typedef SLUD::D::SOLVEstruct_t SOLVEstruct_t;
240 #if defined(HAVE_TEUCHOS_COMPLEX) && !defined(__clang__)
242 struct TypeMap<Superludist,std::complex<double> >
244 static const SLUD::Dtype_t dtype = SLUD::SLU_Z;
245 typedef SLUD::Z::doublecomplex type;
246 typedef double magnitude_type;
247 typedef SLUD::Z::LUstruct_t LUstruct_t;
248 typedef SLUD::Z::SOLVEstruct_t SOLVEstruct_t;
255 struct TypeMap<Superludist,SLUD::Z::doublecomplex>
257 static const SLUD::Dtype_t dtype = SLUD::SLU_Z;
258 typedef SLUD::Z::doublecomplex type;
259 typedef double magnitude_type;
260 typedef SLUD::Z::LUstruct_t LUstruct_t;
261 typedef SLUD::Z::SOLVEstruct_t SOLVEstruct_t;
264 #endif // HAVE_TEUCHOS_COMPLEX
271 #endif // AMESOS2_SUPERLUDIST_TYPEMAP_HPP