21
21
// direct solver interface
23
23
#include "rheolef/solver.h"
24
#include "solver_wrapper.h"
25
#include "solver_mumps.h"
26
#include "solver_trilinos_ifpack.h"
27
#include "solver_no_trilinos_ifpack.h"
24
28
#include "solver_pastix.h"
26
30
namespace rheolef {
28
32
template<class T, class M>
33
solver_rep<T,M>::solver_rep ()
37
template<class T, class M>
29
38
solver_rep<T,M>::solver_rep (const csr<T,M>& a, const solver_option_type& opt)
30
: _ptr(new_macro(rep(a,opt)))
41
typedef solver_wrapper_rep<T,M> rep;
42
_ptr = new_macro (rep(a,opt));
44
template<class T, class M>
46
solver_rep<T,M>::build_lu (const csr<T,M>& a, const solver_option_type& opt)
48
#ifdef _RHEOLEF_HAVE_MUMPS
49
typedef solver_mumps_rep<T,M> rep;
50
#elif defined(_RHEOLEF_HAVE_PASTIX)
51
typedef solver_pastix_rep<T,M> rep;
53
#else // ! _RHEOLEF_HAVE_TRILINOS && !_RHEOLEF_HAVE_PASTIX
54
typedef solver_no_trilinos_ifpack_rep<T,M> rep;
55
#endif // ! _RHEOLEF_HAVE_MUMPS
56
if (_ptr) delete_macro (_ptr);
57
_ptr = new_macro (rep(a,opt));
59
template<class T, class M>
61
solver_rep<T,M>::build_ilu (const csr<T,M>& a, const solver_option_type& opt)
63
#ifdef _RHEOLEF_HAVE_TRILINOS
64
typedef solver_trilinos_ifpack_rep<T,M> rep;
65
#elif defined(_RHEOLEF_HAVE_PASTIX)
66
typedef solver_pastix_rep<T,M> rep;
68
#else // ! _RHEOLEF_HAVE_TRILINOS && !_RHEOLEF_HAVE_PASTIX
69
typedef solver_no_trilinos_ifpack_rep<T,M> rep;
71
if (_ptr) delete_macro (_ptr);
72
_ptr = new_macro (rep(a,opt));
33
74
template<class T, class M>
34
75
solver_rep<T,M>::~solver_rep ()
77
if (_ptr) delete_macro (_ptr);
38
80
template<class T, class M>
44
86
template<class T, class M>
46
solver_rep<T,M>::solve (const vec<T,M>& b)
88
solver_rep<T,M>::solve (const vec<T,M>& b) const
48
90
return _ptr->solve (b);
50
92
template<class T, class M>
52
solver_rep<T,M>::trans_solve (const vec<T,M>& b)
94
solver_rep<T,M>::trans_solve (const vec<T,M>& b) const
54
96
return _ptr->trans_solve (b);