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

Last change on this file since 2901 was 2646, checked in by ansari, 21 years ago

Ajout methode calcul de la matrice inverse par Lapack en utilisant la resolution de systeme + MAJ doc - Reza 7 Fev 2005

File size: 4.5 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:
[1342]13 LapackServer();
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);
[2554]42 int_4 ilaenv_en_C(int_4 ispec,char *name,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;
[814]46};
47
[1424]48/*! \ingroup LinAlg
49 \fn LapackLinSolve(TArray<T>&, TArray<T> &)
50 \brief Solves the linear system A*X = B using LapackServer.
51*/
[814]52template <class T>
[1042]53inline int LapackLinSolve(TArray<T>& a, TArray<T> & b)
[1342]54{ LapackServer<T> lps; return( lps.LinSolve(a, b) ); }
[814]55
[1566]56/*! \ingroup LinAlg
[2554]57 \fn LapackLinSolveSym(TArray<T>&, TArray<T> &)
58 \brief Solves the linear system A*X = B with A symetric using LapackServer.
59*/
60template <class T>
61inline int LapackLinSolveSym(TArray<T>& a, TArray<T> & b)
62{ LapackServer<T> lps; return( lps.LinSolveSym(a, b) ); }
63
64/*! \ingroup LinAlg
[1566]65 \fn LapackLeastSquareSolve(TArray<T>&, TArray<T> &)
66 \brief Solves the linear least squares problem A*X - B
67*/
[1494]68template <class T>
69inline int LapackLeastSquareSolve(TArray<T>& a, TArray<T> & b)
70{ LapackServer<T> lps; return( lps.LeastSquareSolve(a, b) ); }
71
[1424]72/*! \ingroup LinAlg
[2646]73 \fn LapackInverse(TMatrix<T>&)
74 \brief Computes the inverse matrix using linear system solver LapackServer::LinSolve.
75*/
76template <class T>
77inline TMatrix<T> LapackInverse(TMatrix<T>& a)
78{ LapackServer<T> lps; TMatrix<T> ainv; lps.ComputeInverse(a, ainv); return ainv; }
79
80/*! \ingroup LinAlg
[2567]81 \fn LapackLeastSquareSolveSVD_DC
82 \brief Solves the linear least squares problem A*X = B by SVD
83*/
84template <class T>
85inline int LapackLeastSquareSolveSVD_DC(TMatrix<T>& a,TMatrix<T>& b,TVector<r_8>& s,int_4& rank,r_8 rcond=-1.)
86{ LapackServer<T> lps; return( lps.LeastSquareSolveSVD_DC(a,b,s,rank,rcond) ); }
87
88/*! \ingroup LinAlg
[1424]89 \fn LapackSVD(TArray<T>&, TArray<T> &)
90 \brief SVD decomposition using LapackServer.
91*/
[1342]92template <class T>
93inline int LapackSVD(TArray<T>& a, TArray<T> & s)
94{ LapackServer<T> lps; return( lps.SVD(a, s) ); }
[814]95
[1424]96
97/*! \ingroup LinAlg
98 \fn LapackSVD(TArray<T>&, TArray<T> &, TArray<T> &, TArray<T> &)
99 \brief SVD decomposition using LapackServer.
100*/
[1342]101template <class T>
102inline int LapackSVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt)
103{ LapackServer<T> lps; return( lps.SVD(a, s, u, vt) ); }
104
105
[2556]106/*! \ingroup LinAlg
[2563]107 \fn LapackSVD_DC(TMatrix<T>&, TVector<r_8>&, TMatrix<T>&, TMatrix<T>&)
[2561]108 \brief SVD decomposition DC using LapackServer.
109*/
110template <class T>
[2563]111inline int LapackSVD_DC(TMatrix<T>& a, TVector<r_8>& s, TMatrix<T>& u, TMatrix<T>& vt)
[2561]112{ LapackServer<T> lps; return( lps.SVD_DC(a, s, u, vt) ); }
113
114
115/*! \ingroup LinAlg
[2556]116 \fn LapackEigenSym(TArray<T>&, TArray<T> &)
117 \brief Compute the eigenvalues and eigenvectors of A (symetric or hermitian).
118*/
119template <class T>
120inline int LapackEigenSym(TArray<T>& a, TVector<r_8>& b, bool eigenvector=true)
121{ LapackServer<T> lps; return( lps.LapackEigenSym(a,b,eigenvector) ); }
122
123/*! \ingroup LinAlg
124 \fn LapackEigen(TArray<T>&, TArray<T> &)
125 \brief Compute the eigenvalues and (right) eigenvectors of A (general square matrix).
126*/
127template <class T>
128inline int LapackEigen(TArray<T>& a, TVector< complex<r_8> >& eval, TMatrix<T>& evec, bool eigenvector=true)
129{ LapackServer<T> lps; return( lps.LapackEigen(a,eval,evec,eigenvector) ); }
130
[814]131} // Fin du namespace
132
[775]133#endif
Note: See TracBrowser for help on using the repository browser.