lapack.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:5k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. // Header file for Fortran Lapack
  10. #ifndef LAPACK_H
  11. #define LAPACK_H
  12. // This file incomplete and included here to only demonstrate the
  13. // basic framework for linking with the Fortran Lapack routines.
  14. #include "fortran.h"
  15. #include "vec.h"
  16. #include "fmat.h"
  17. typedef Fortran_double* fda_;        // (in/out) double precision array
  18. typedef const Fortran_double* cfda_; // (in) double precsion array
  19. typedef Fortran_double* fd_;        // (in/out)  single double precision
  20. typedef const Fortran_double* cfd_; // (in) single double precision
  21. typedef Fortran_float* ffa_;        // (in/out) float precision array
  22. typedef const Fortran_float* cffa_; // (in) float precsion array
  23. typedef Fortran_float* ff_;         // (in/out)  single float precision
  24. typedef const Fortran_float* cff_;  // (in) single float precision
  25. typedef Fortran_integer* fia_;          // (in/out)  single integer array
  26. typedef const Fortran_integer* cfia_;   // (in) single integer array
  27. typedef Fortran_integer* fi_;           // (in/out)  single integer
  28. typedef const Fortran_integer* cfi_;    // (in) single integer
  29. typedef char * fch_;                // (in/out) single character
  30. typedef char * cfch_;               // (in) single character
  31. #define F77_DGESV   dgesv_
  32. #define F77_DGELS   dgels_
  33. #define F77_DSYEV   dsyev_
  34. #define F77_DGEEV   dgeev_
  35. extern "C"
  36. {
  37.     // linear equations (general) using LU factorizaiton
  38.     //
  39.     void F77_DGESV(cfi_ N, cfi_ nrhs, fda_ A, cfi_ lda,
  40.         fia_ ipiv, fda_ b, cfi_ ldb, fi_ info);
  41.     // solve linear least squares using QR or LU factorization
  42.     //
  43.     void F77_DGELS(cfch_ trans, cfi_ M, 
  44.         cfi_ N, cfi_ nrhs, fda_ A, cfi_ lda, fda_ B, cfi_ ldb, fda_ work, 
  45.             cfi_ lwork, fi_ info);
  46.     // solve symmetric eigenvalues
  47.     //
  48.     void F77_DSYEV( cfch_ jobz, cfch_ uplo, cfi_ N, fda_  A, cfi_ lda, 
  49.         fda_ W, fda_ work, cfi_ lwork, fi_ info);
  50.     // solve unsymmetric eigenvalues
  51.     //
  52.     void F77_DGEEV(cfch_ jobvl, cfch_ jobvr, cfi_ N, fda_ A, cfi_ lda,
  53.         fda_ wr, fda_ wi, fda_ vl, cfi_ ldvl, fda_ vr, 
  54.         cfi_ ldvr, fda_ work, cfi_ lwork, fi_ info);
  55. }
  56. // solve linear equations using LU factorization
  57. Vector<double> Lapack_LU_linear_solve(const Fortran_matrix<double> &A,
  58.     const Vector<double> &b)
  59. {
  60.     const Fortran_integer one=1;
  61.     Subscript M=A.num_rows();
  62.     Subscript N=A.num_cols();
  63.     Fortran_matrix<double> Tmp(A);
  64.     Vector<double> x(b);
  65.     Vector<Fortran_integer> index(M);
  66.     Fortran_integer info = 0;
  67.     F77_DGESV(&N, &one, &Tmp(1,1), &M, &index(1), &x(1), &M, &info);    
  68.     if (info != 0) return Vector<double>(0);
  69.     else
  70.         return x;
  71. }
  72. // solve linear least squares problem using QR factorization
  73. //
  74. Vector<double> Lapack_LLS_QR_linear_solve(const Fortran_matrix<double> &A,
  75.     const Vector<double> &b)
  76. {
  77.     const Fortran_integer one=1;
  78.     Subscript M=A.num_rows();
  79.     Subscript N=A.num_cols();
  80.     Fortran_matrix<double> Tmp(A);
  81.     Vector<double> x(b);
  82.     Fortran_integer info = 0;
  83.     char transp = 'N';
  84.     Fortran_integer lwork = 5 * (M+N);      // temporary work space
  85.     Vector<double> work(lwork);
  86.     F77_DGELS(&transp, &M, &N, &one, &Tmp(1,1), &M, &x(1), &M,  &work(1),
  87.         &lwork, &info); 
  88.     if (info != 0) return Vector<double>(0);
  89.     else
  90.         return x;
  91. }
  92. // *********************** Eigenvalue problems *******************
  93. // solve symmetric eigenvalue problem (eigenvalues only)
  94. //
  95. Vector<double> Upper_symmetric_eigenvalue_solve(const Fortran_matrix<double> &A)
  96. {
  97.     char jobz = 'N';
  98.     char uplo = 'U';
  99.     Subscript N = A.num_rows();
  100.     assert(N == A.num_cols());
  101.     Vector<double> eigvals(N);
  102.     Fortran_integer worksize = 3*N;
  103.     Fortran_integer info = 0;
  104.     Vector<double> work(worksize);
  105.     Fortran_matrix<double> Tmp = A;
  106.     F77_DSYEV(&jobz, &uplo, &N, &Tmp(1,1), &N, eigvals.begin(), work.begin(),
  107.         &worksize, &info);
  108.     if (info != 0) return Vector<double>();
  109.     else
  110.         return eigvals;
  111. }
  112. // solve unsymmetric eigenvalue problems 
  113. //
  114. int eigenvalue_solve(const Fortran_matrix<double> &A, 
  115.         Vector<double> &wr, Vector<double> &wi)
  116. {
  117.     char jobvl = 'N';
  118.     char jobvr = 'N';
  119.     Fortran_integer N = A.num_rows();
  120.     assert(N == A.num_cols());
  121.     
  122.     if (N<1) return 1;
  123.     Fortran_matrix<double> vl(1,N);  /* should be NxN ? **** */
  124.     Fortran_matrix<double> vr(1,N);  
  125.     Fortran_integer one = 1;
  126.     Fortran_integer worksize = 5*N;
  127.     Fortran_integer info = 0;
  128.     Vector<double> work(worksize, 0.0);
  129.     Fortran_matrix<double> Tmp = A;
  130.     wr.newsize(N);
  131.     wi.newsize(N);
  132. //  void F77_DGEEV(cfch_ jobvl, cfch_ jobvr, cfi_ N, fda_ A, cfi_ lda,
  133. //      fda_ wr, fda_ wi, fda_ vl, cfi_ ldvl, fda_ vr, 
  134. //      cfi_ ldvr, fda_ work, cfi_ lwork, fi_ info);
  135.     F77_DGEEV(&jobvl, &jobvr, &N, &Tmp(1,1), &N, &(wr(1)),
  136.         &(wi(1)), &(vl(1,1)), &one, &(vr(1,1)), &one,
  137.         &(work(1)), &worksize, &info);
  138.     return (info==0 ? 0: 1);
  139. }
  140. #endif
  141. // LAPACK_H