| 1 | #ifndef  IntfLapack_H_SEEN
 | 
|---|
| 2 | #define  IntfLapack_H_SEEN
 | 
|---|
| 3 | 
 | 
|---|
| 4 | #include "machdefs.h"
 | 
|---|
| 5 | #include "tarray.h"
 | 
|---|
| 6 | #include "tvector.h"
 | 
|---|
| 7 | 
 | 
|---|
| 8 | namespace SOPHYA {
 | 
|---|
| 9 | 
 | 
|---|
| 10 | template <class T>
 | 
|---|
| 11 | class LapackServer { 
 | 
|---|
| 12 | public:
 | 
|---|
| 13 |   LapackServer(bool throw_on_error=false);
 | 
|---|
| 14 |   virtual ~LapackServer();
 | 
|---|
| 15 | 
 | 
|---|
| 16 |   virtual int LinSolve(TArray<T>& a, TArray<T> & b); 
 | 
|---|
| 17 |   virtual int LinSolveSym(TArray<T>& a, TArray<T> & b); 
 | 
|---|
| 18 |   virtual int LeastSquareSolve(TArray<T>& a, TArray<T> & b); 
 | 
|---|
| 19 |   virtual int LeastSquareSolveSVD_DC(TMatrix<T>& a,TMatrix<T>& b,TVector<r_8>& s,int_4& rank,r_8 rcond=-1.); 
 | 
|---|
| 20 | 
 | 
|---|
| 21 |   // Calcul de la matrice inverse en utilisant la resolution de syst. lineaire
 | 
|---|
| 22 |   virtual int ComputeInverse(TMatrix<T>& a, TMatrix<T>& ainv);
 | 
|---|
| 23 | 
 | 
|---|
| 24 |   virtual int SVD(TArray<T>& a, TArray<T> & s); 
 | 
|---|
| 25 |   virtual int SVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt);
 | 
|---|
| 26 |   virtual int SVD_DC(TMatrix<T>& a, TVector<r_8>& s, TMatrix<T>& u, TMatrix<T>& vt);
 | 
|---|
| 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);
 | 
|---|
| 30 | 
 | 
|---|
| 31 |   //! Set the workspace size factor for LAPACK routines
 | 
|---|
| 32 |   inline void SetWorkSpaceSizeFactor(int f = 2)
 | 
|---|
| 33 |   { wspace_size_factor = (f > 1) ? f : 1; }
 | 
|---|
| 34 | 
 | 
|---|
| 35 |   //! Returns the workspace size factor
 | 
|---|
| 36 |   inline int  GetWorkSpaceSizeFactor() 
 | 
|---|
| 37 |   { return wspace_size_factor; }
 | 
|---|
| 38 | 
 | 
|---|
| 39 | private:
 | 
|---|
| 40 |   int SVDDriver(TArray<T>& a, TArray<T> & s, 
 | 
|---|
| 41 |                 TArray<T>* up=NULL, TArray<T> * vtp=NULL);
 | 
|---|
| 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);
 | 
|---|
| 43 |   int_4 type2i4(void *val,int nbytes);
 | 
|---|
| 44 | 
 | 
|---|
| 45 |   int wspace_size_factor;
 | 
|---|
| 46 |   bool Throw_On_Error;
 | 
|---|
| 47 | };
 | 
|---|
| 48 | 
 | 
|---|
| 49 | /*! \ingroup LinAlg
 | 
|---|
| 50 |     \fn LapackLinSolve(TArray<T>&, TArray<T> &)
 | 
|---|
| 51 |     \brief Solves the linear system A*X = B using LapackServer. 
 | 
|---|
| 52 | */
 | 
|---|
| 53 | template <class T>
 | 
|---|
| 54 | inline int LapackLinSolve(TArray<T>& a, TArray<T> & b)
 | 
|---|
| 55 | { LapackServer<T> lps; return( lps.LinSolve(a, b) );  }
 | 
|---|
| 56 | 
 | 
|---|
| 57 | /*! \ingroup LinAlg
 | 
|---|
| 58 |     \fn LapackLinSolveSym(TArray<T>&, TArray<T> &)
 | 
|---|
| 59 |     \brief Solves the linear system A*X = B with A symetric using LapackServer. 
 | 
|---|
| 60 | */
 | 
|---|
| 61 | template <class T>
 | 
|---|
| 62 | inline int LapackLinSolveSym(TArray<T>& a, TArray<T> & b)
 | 
|---|
| 63 | { LapackServer<T> lps; return( lps.LinSolveSym(a, b) );  }
 | 
|---|
| 64 | 
 | 
|---|
| 65 | /*! \ingroup LinAlg
 | 
|---|
| 66 |     \fn LapackLeastSquareSolve(TArray<T>&, TArray<T> &)
 | 
|---|
| 67 |     \brief Solves the linear least squares problem A*X - B
 | 
|---|
| 68 | */
 | 
|---|
| 69 | template <class T>
 | 
|---|
| 70 | inline int LapackLeastSquareSolve(TArray<T>& a, TArray<T> & b)
 | 
|---|
| 71 | { LapackServer<T> lps; return( lps.LeastSquareSolve(a, b) );  }
 | 
|---|
| 72 | 
 | 
|---|
| 73 | /*! \ingroup LinAlg
 | 
|---|
| 74 |     \fn LapackInverse(TMatrix<T>&)
 | 
|---|
| 75 |     \brief Computes the inverse matrix using linear system solver LapackServer::LinSolve. 
 | 
|---|
| 76 | */
 | 
|---|
| 77 | template <class T>
 | 
|---|
| 78 | inline TMatrix<T> LapackInverse(TMatrix<T>& a)
 | 
|---|
| 79 | { LapackServer<T> lps; TMatrix<T> ainv; lps.ComputeInverse(a, ainv);  return ainv; }
 | 
|---|
| 80 | 
 | 
|---|
| 81 | /*! \ingroup LinAlg
 | 
|---|
| 82 |     \fn LapackLeastSquareSolveSVD_DC
 | 
|---|
| 83 |     \brief Solves the linear least squares problem A*X = B by SVD
 | 
|---|
| 84 | */
 | 
|---|
| 85 | template <class T>
 | 
|---|
| 86 | inline 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
 | 
|---|
| 90 |     \fn LapackSVD(TArray<T>&, TArray<T> &)
 | 
|---|
| 91 |     \brief SVD decomposition using LapackServer. 
 | 
|---|
| 92 | */
 | 
|---|
| 93 | template <class T>
 | 
|---|
| 94 | inline int LapackSVD(TArray<T>& a, TArray<T> & s)
 | 
|---|
| 95 | { LapackServer<T> lps; return( lps.SVD(a, s) ); }
 | 
|---|
| 96 | 
 | 
|---|
| 97 | 
 | 
|---|
| 98 | /*! \ingroup LinAlg
 | 
|---|
| 99 |     \fn LapackSVD(TArray<T>&, TArray<T> &, TArray<T> &, TArray<T> &)
 | 
|---|
| 100 |     \brief SVD decomposition using LapackServer. 
 | 
|---|
| 101 | */
 | 
|---|
| 102 | template <class T>
 | 
|---|
| 103 | inline 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 | 
 | 
|---|
| 107 | /*! \ingroup LinAlg
 | 
|---|
| 108 |     \fn LapackSVD_DC(TMatrix<T>&, TVector<r_8>&, TMatrix<T>&, TMatrix<T>&)
 | 
|---|
| 109 |     \brief SVD decomposition DC using LapackServer. 
 | 
|---|
| 110 | */
 | 
|---|
| 111 | template <class T>
 | 
|---|
| 112 | inline int LapackSVD_DC(TMatrix<T>& a, TVector<r_8>& s, TMatrix<T>& u, TMatrix<T>& vt)
 | 
|---|
| 113 | { LapackServer<T> lps; return( lps.SVD_DC(a, s, u, vt) ); }
 | 
|---|
| 114 | 
 | 
|---|
| 115 | 
 | 
|---|
| 116 | /*! \ingroup LinAlg
 | 
|---|
| 117 |     \fn LapackEigenSym(TArray<T>&, TArray<T> &)
 | 
|---|
| 118 |     \brief Compute the eigenvalues and eigenvectors of A (symetric or hermitian). 
 | 
|---|
| 119 | */
 | 
|---|
| 120 | template <class T>
 | 
|---|
| 121 | inline 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 | */
 | 
|---|
| 128 | template <class T>
 | 
|---|
| 129 | inline 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 | 
 | 
|---|
| 132 | } // Fin du namespace
 | 
|---|
| 133 | 
 | 
|---|
| 134 | #endif
 | 
|---|