source: Sophya/trunk/SophyaExt/LinAlg/intflapack.h@ 4086

Last change on this file since 4086 was 3572, checked in by cmv, 17 years ago

char* -> const char* pour regler les problemes de deprecated string const... + comparaison unsigned signed + suppression EVOL_PLANCK rz+cmv 07/02/2009

File size: 4.6 KB
RevLine 
[775]1#ifndef IntfLapack_H_SEEN
2#define IntfLapack_H_SEEN
3
4#include "machdefs.h"
5#include "tarray.h"
[2556]6#include "tvector.h"
[775]7
[814]8namespace SOPHYA {
[775]9
[814]10template <class T>
11class LapackServer {
12public:
[2906]13 LapackServer(bool throw_on_error=false);
[1342]14 virtual ~LapackServer();
15
16 virtual int LinSolve(TArray<T>& a, TArray<T> & b);
[2554]17 virtual int LinSolveSym(TArray<T>& a, TArray<T> & b);
[1494]18 virtual int LeastSquareSolve(TArray<T>& a, TArray<T> & b);
[2567]19 virtual int LeastSquareSolveSVD_DC(TMatrix<T>& a,TMatrix<T>& b,TVector<r_8>& s,int_4& rank,r_8 rcond=-1.);
[1494]20
[2646]21 // Calcul de la matrice inverse en utilisant la resolution de syst. lineaire
22 virtual int ComputeInverse(TMatrix<T>& a, TMatrix<T>& ainv);
23
[1342]24 virtual int SVD(TArray<T>& a, TArray<T> & s);
[2556]25 virtual int SVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt);
[2563]26 virtual int SVD_DC(TMatrix<T>& a, TVector<r_8>& s, TMatrix<T>& u, TMatrix<T>& vt);
[2556]27
28 virtual int LapackEigenSym(TArray<T>& a, TVector<r_8>& b, bool eigenvector=true);
29 virtual int LapackEigen(TArray<T>& a, TVector< complex<r_8> >& eval, TMatrix<T>& evec, bool eigenvector);
[1342]30
[1424]31 //! Set the workspace size factor for LAPACK routines
[1342]32 inline void SetWorkSpaceSizeFactor(int f = 2)
33 { wspace_size_factor = (f > 1) ? f : 1; }
[1424]34
35 //! Returns the workspace size factor
[1342]36 inline int GetWorkSpaceSizeFactor()
37 { return wspace_size_factor; }
38
39private:
40 int SVDDriver(TArray<T>& a, TArray<T> & s,
41 TArray<T>* up=NULL, TArray<T> * vtp=NULL);
[3572]42 int_4 ilaenv_en_C(int_4 ispec,const char *name,const char *opts,int_4 n1,int_4 n2,int_4 n3,int_4 n4);
[2572]43 int_4 type2i4(void *val,int nbytes);
[1342]44
45 int wspace_size_factor;
[2906]46 bool Throw_On_Error;
[814]47};
48
[1424]49/*! \ingroup LinAlg
50 \fn LapackLinSolve(TArray<T>&, TArray<T> &)
51 \brief Solves the linear system A*X = B using LapackServer.
52*/
[814]53template <class T>
[1042]54inline int LapackLinSolve(TArray<T>& a, TArray<T> & b)
[1342]55{ LapackServer<T> lps; return( lps.LinSolve(a, b) ); }
[814]56
[1566]57/*! \ingroup LinAlg
[2554]58 \fn LapackLinSolveSym(TArray<T>&, TArray<T> &)
59 \brief Solves the linear system A*X = B with A symetric using LapackServer.
60*/
61template <class T>
62inline int LapackLinSolveSym(TArray<T>& a, TArray<T> & b)
63{ LapackServer<T> lps; return( lps.LinSolveSym(a, b) ); }
64
65/*! \ingroup LinAlg
[1566]66 \fn LapackLeastSquareSolve(TArray<T>&, TArray<T> &)
67 \brief Solves the linear least squares problem A*X - B
68*/
[1494]69template <class T>
70inline int LapackLeastSquareSolve(TArray<T>& a, TArray<T> & b)
71{ LapackServer<T> lps; return( lps.LeastSquareSolve(a, b) ); }
72
[1424]73/*! \ingroup LinAlg
[2646]74 \fn LapackInverse(TMatrix<T>&)
75 \brief Computes the inverse matrix using linear system solver LapackServer::LinSolve.
76*/
77template <class T>
78inline TMatrix<T> LapackInverse(TMatrix<T>& a)
79{ LapackServer<T> lps; TMatrix<T> ainv; lps.ComputeInverse(a, ainv); return ainv; }
80
81/*! \ingroup LinAlg
[2567]82 \fn LapackLeastSquareSolveSVD_DC
83 \brief Solves the linear least squares problem A*X = B by SVD
84*/
85template <class T>
86inline int LapackLeastSquareSolveSVD_DC(TMatrix<T>& a,TMatrix<T>& b,TVector<r_8>& s,int_4& rank,r_8 rcond=-1.)
87{ LapackServer<T> lps; return( lps.LeastSquareSolveSVD_DC(a,b,s,rank,rcond) ); }
88
89/*! \ingroup LinAlg
[1424]90 \fn LapackSVD(TArray<T>&, TArray<T> &)
91 \brief SVD decomposition using LapackServer.
92*/
[1342]93template <class T>
94inline int LapackSVD(TArray<T>& a, TArray<T> & s)
95{ LapackServer<T> lps; return( lps.SVD(a, s) ); }
[814]96
[1424]97
98/*! \ingroup LinAlg
99 \fn LapackSVD(TArray<T>&, TArray<T> &, TArray<T> &, TArray<T> &)
100 \brief SVD decomposition using LapackServer.
101*/
[1342]102template <class T>
103inline int LapackSVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt)
104{ LapackServer<T> lps; return( lps.SVD(a, s, u, vt) ); }
105
106
[2556]107/*! \ingroup LinAlg
[2563]108 \fn LapackSVD_DC(TMatrix<T>&, TVector<r_8>&, TMatrix<T>&, TMatrix<T>&)
[2561]109 \brief SVD decomposition DC using LapackServer.
110*/
111template <class T>
[2563]112inline int LapackSVD_DC(TMatrix<T>& a, TVector<r_8>& s, TMatrix<T>& u, TMatrix<T>& vt)
[2561]113{ LapackServer<T> lps; return( lps.SVD_DC(a, s, u, vt) ); }
114
115
116/*! \ingroup LinAlg
[2556]117 \fn LapackEigenSym(TArray<T>&, TArray<T> &)
118 \brief Compute the eigenvalues and eigenvectors of A (symetric or hermitian).
119*/
120template <class T>
121inline int LapackEigenSym(TArray<T>& a, TVector<r_8>& b, bool eigenvector=true)
122{ LapackServer<T> lps; return( lps.LapackEigenSym(a,b,eigenvector) ); }
123
124/*! \ingroup LinAlg
125 \fn LapackEigen(TArray<T>&, TArray<T> &)
126 \brief Compute the eigenvalues and (right) eigenvectors of A (general square matrix).
127*/
128template <class T>
129inline int LapackEigen(TArray<T>& a, TVector< complex<r_8> >& eval, TMatrix<T>& evec, bool eigenvector=true)
130{ LapackServer<T> lps; return( lps.LapackEigen(a,eval,evec,eigenvector) ); }
131
[814]132} // Fin du namespace
133
[775]134#endif
Note: See TracBrowser for help on using the repository browser.