分享一个不错的 Lapack 应用实例 in fortran77

1,源码

.f 表示该源码文件为 fortran 77 源程序;

hello_lapack_f77.f

      program main

c*********************************************************************72
c https://hpc.ncsu.edu/Software/examples/lapack/lapack_examples_test.f
cc MAIN is the main program for LAPACK_EXAMPLES_TEST.
c
c  Discussion:
c
c    LAPACK_EXAMPLES_TEST tests the LAPACK library.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 March 2018
c
c  Author:
c
c    John Burkardt
c
      implicit none

      call timestamp ( )
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'LAPACK_EXAMPLES_TEST'
      write ( *, '(a)' ) '  FORTRAN77 version'
      write ( *, '(a)' ) '  Test the LAPACK library.'

      call test01 ( )
      call test02 ( )
      call test03 ( )
      call test04 ( )
      call test05 ( )
      call test06 ( )
      call test07 ( )
      call test08 ( )
      call test09 ( )

      call test10 ( )
      call test11 ( )
      call test12 ( )
      call test13 ( )
      call test14 ( )
      call test15 ( )
      call test16 ( )
      call test17 ( )
c
c  Terminate.
c
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'LAPACK_EXAMPLES_TEST'
      write ( *, '(a)' ) '  Normal end of execution.'
      write ( *, '(a)' ) ' '
      call timestamp ( )

      stop 0
      end
      subroutine test01 ( )

c*********************************************************************72
c
cc TEST01 tests DGBTRF and DGBTRS.
c
c  Discussion:
c
c    The problem is just an enlarged version of the
c    problem for n = 5, which is:
c
c    Matrix A is ( 2 -1  0  0  0)    right hand side b is  (1)
c                (-1  2 -1  0  0)                          (0)
c                ( 0 -1  2 -1  0)                          (0)
c                ( 0  0 -1  2 -1)                          (0)
c                ( 0  0  0 -1  2)                          (1)
c
c
c    Solution is   (1)
c                  (1)
c                  (1)
c                  (1)
c                  (1)
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer ml
      integer mu
      integer lda

      parameter ( n = 25 )
      parameter ( ml = 1 )
      parameter ( mu = 1 )
      parameter ( lda = 2 * ml + mu + 1 )

      double precision a(lda,n)
      double precision b(n)
      integer i
      integer info
      integer ipiv(n)
      integer j
      integer m

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST01'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general band storage mode (GB):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGBTRF factors a general band matrix.'
      write ( *, '(a)' ) '  DGBTRS solves a factored system.'
      write ( *, '(a)' ) ' '
c
c  Assign values to matrix A and right hand side b.
c
      b(1) = 1.0D+00
      do i = 2, n-1
        b(i) = 0.0D+00
      end do
      b(n) = 1.0D+00
c
c  Zero out the matrix.
c
      do i = 1, lda
        do j = 1, n
          a(i,j) = 0.0D+00
        end do
      end do

      m = ml + mu + 1
c
c  Superdiagonal,
c  Diagonal,
c  Subdiagonal.
c
      do j = 2, n
        a(m-1,j) = -1.0D+00
      end do

      do j = 1, n
        a(m,j) = 2.0D+00
      end do

      do j = 1, n-1
        a(m+1,j) = -1.0D+00
      end do
c
c  Factor the matrix.
c
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  Bandwidth is ', m
      write ( *, '(a)' ) ' '

      call dgbtrf ( n, n, ml, mu, a, lda, ipiv, info )

      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) 'TEST01'
        write ( *, '(a,i8)' ) '  Factorization failed, INFO = ', info
        return
      end if
c
c  Solve the linear system.
c
      call dgbtrs ( 'n', n, ml, mu, 1, a, lda, ipiv, b, n, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) 'TEST01'
        write ( *, '(a,i8)' ) '  Solution failed, INFO = ', info
        return
      end if

      call r8vec_print_some ( n, b, 5, 
     &  '  Partial solution (all should be 1)' )

      return
      end
      subroutine test02 ( )

c*********************************************************************72
c
cc TEST02 tests DGBTRF and DGBTRS.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer ml
      integer mu
      integer lda

      parameter ( n = 25 )
      parameter ( ml = 3 )
      parameter ( mu = 3 )
      parameter ( lda = 2 * ml + mu + 1 )

      double precision a(lda,n)
      double precision b(n)
      integer i
      integer ihi
      integer ilo
      integer info
      integer ipiv(n)
      integer j
      integer m
      double precision temp

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST02'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general band storage mode (GB):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGBTRF factors a general band matrix.'
      write ( *, '(a)' ) '  DGBTRS solves a factored system.'
      write ( *, '(a)' ) ' '
c
c  Assign values to matrix A and right hand side b.
c
c  We want to try a problem with a significant bandwidth.
c
      m = ml + mu + 1

      do j = 1, n
        ilo = max ( 1, j-mu )
        ihi = min ( n, j+ml )
 
        temp = 0.0D+00
        do i = ilo, ihi
          a(i-j+m,j) = -1.0D+00
          temp = temp - 1.0D+00
        end do
        temp = temp + 1.0D+00
 
        a(m,j) = 4.0D+00 - temp
      end do
c
c  Right hand side.
c
      do j = 1, n
        b(j) = 4.0D+00
      end do
c
c  Factor the matrix.
c
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  Bandwidth is ', m
 
      call dgbtrf ( n, n, ml, mu, a, lda, ipiv, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Factorization failed, INFO = ', info
        return
      end if
c
c  Solve the linear system.
c
      call dgbtrs ( 'n', n, ml, mu, 1, a, lda, ipiv, b, n, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Solution failed, INFO = ', info
      end if

      call r8vec_print_some ( n, b, 5, 
     &  '  Partial solution (all should be 1)' )

      return
      end
      subroutine test03 ( )

c*********************************************************************72
c
cc TEST03 tests DGECON and DGETRF.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lda
      integer lwork

      parameter ( n = 3 )
      parameter ( lda = n )
      parameter ( lwork = 4 * n )

      double precision a(lda,n)
      double precision anorm
      integer info
      integer ipiv(n)
      integer iwork(n)
      double precision rcond
      double precision r8mat_norm_li
      double precision work(lwork)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST03'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGETRF computes the LU factorization;'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGECON computes the condition number '
      write ( *, '(a)' ) '  of a factored matrix'
c
c  Set the matrix.
c
      a(1,1) = 1.0D+00
      a(1,2) = 2.0D+00
      a(1,3) = 3.0D+00

      a(2,1) = 4.0D+00
      a(2,2) = 5.0D+00
      a(2,3) = 6.0D+00

      a(3,1) = 7.0D+00
      a(3,2) = 8.0D+00
      a(3,3) = 0.0D+00

      call r8mat_print ( n, n, a, '  The matrix A:' )
c
c  Compute the L-Infinity norm of the matrix.
c
      anorm = r8mat_norm_li ( n, n, a )

      write ( *, '(a)' ) ' '
      write ( *, '(a,g14.6)' ) '  Matrix L-infinity norm is ', anorm
c
c  Factor the matrix.
c
      call dgetrf ( n, n, a, lda, ipiv, info )
c
c  Get the condition number.
c
      call dgecon ( 'I', n, a, lda, anorm, rcond, work, iwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  Condition number calculation failedc'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      write ( *, '(a)' ) ' '
      write ( *, '(a,g14.6)' ) 
     &  '  Matrix reciprocal condition number = ', rcond
 
      return
      end
      subroutine test04 ( )

c*********************************************************************72
c
cc TEST04 tests DGESVD.
c
c  Discussion:
c
c    DGESVD computes the singular value decomposition:
c
c      A = U * S * V'
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer m
      integer n
      integer lwork

      parameter ( m = 6 )
      parameter ( n = 4 )
c     parameter ( lwork = 3*min(m,n) + max ( max(m,n), 2*min(m,n) ) )
      parameter ( lwork = 3*4 + 8 )

      double precision a(m,n)
      double precision b(m,n)
      integer i
      integer info
      integer j
      integer k
      integer lda
      integer ldu
      integer ldvt
      character jobu
      character jobvt
      integer mn
      double precision s(m+n)
      integer seed
      double precision sigma(m,n)
      double precision u(m,m)
      double precision vt(n,n)
      double precision work(lwork)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST04'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGESVD computes the singular value '
      write ( *, '(a)' ) '  decomposition:'
      write ( *, '(a)' ) '    A = U * S * V'''
c
c  Set A.
c
      seed = 123456789

      call r8mat_uniform_01 ( m, n, seed, a )

      call r8mat_print ( m, n, a, '  The matrix A:' )
c
c  Compute the eigenvalues and eigenvectors.
c
      jobu = 'A'
      jobvt = 'A'
      lda = m
      ldu = m
      ldvt = n
      
      call dgesvd ( jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, 
     &  work, lwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGESVD returned nonzero INFO = ', info
        return
      end if

      mn = min ( m, n )

      call r8vec_print ( mn, s, '  Singular values' )

      call r8mat_print ( m, m, u, '  Left singular vectors U:' )
      call r8mat_print ( n, n, vt, '  Right singular vectors V'':' )

      do i = 1, m
        do j = 1, n
          sigma(i,j) = 0.0D+00
        end do
      end do

      do i = 1, min ( m, n )
        sigma(i,i) = s(i)
      end do

      do i = 1, m
        do j = 1, n
          b(i,j) = 0.0D+00
          do k = 1, n
            b(i,j) = b(i,j) + sigma(i,k) * vt(k,j)
          end do
        end do
      end do

      do i = 1, m
        do j = 1, n
          a(i,j) = 0.0D+00
          do k = 1, m
            a(i,j) = a(i,j) + u(i,k) * b(k,j)
          end do
        end do
      end do

      call r8mat_print ( m, n, a, '  The product U * S * V'':' )

      return
      end
      subroutine test05 ( )

c*********************************************************************72
c
cc TEST05 tests DGETRF and DGETRI.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lda
      integer lwork

      parameter ( n = 3 )
      parameter ( lda = n )
      parameter ( lwork = n )

      double precision a(lda,n)
      integer info
      integer ipiv(n)
      double precision work(lwork)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST05'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGETRF factors a general matrix;'
      write ( *, '(a)' ) '  DGETRI computes the inverse.'
c
c  Set the matrix.
c
      a(1,1) = 1.0D+00
      a(1,2) = 2.0D+00
      a(1,3) = 3.0D+00

      a(2,1) = 4.0D+00
      a(2,2) = 5.0D+00
      a(2,3) = 6.0D+00

      a(3,1) = 7.0D+00
      a(3,2) = 8.0D+00
      a(3,3) = 0.0D+00

      call r8mat_print ( n, n, a, '  The matrix A:' )
c
c  Factor the matrix.
c
      call dgetrf ( n, n, a, lda, ipiv, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGETRF returned INFO = ', info
        write ( *, '(a)' ) '  The matrix is numerically singular.'
        return
      end if
c
c  Compute the inverse matrix.
c
      call dgetri ( n, a, lda, ipiv, work, lwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  The inversion procedure failedc'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      call r8mat_print ( n, n, a, '  The inverse matrix:' )
 
      return
      end
      subroutine test06 ( )

c*********************************************************************72
c
cc TEST06 tests DGETRF and DGETRS.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lda

      parameter ( n = 3 )
      parameter ( lda = n )

      double precision a(lda,n)
      double precision b(n)
      integer info
      integer ipiv(n)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST06'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGETRF computes the LU factorization;'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGETRS solves linear systems using '
      write ( *, '(a)' ) '  the LU factors;'
c
c  Set the matrix.
c
      a(1,1) = 1.0D+00
      a(1,2) = 2.0D+00
      a(1,3) = 3.0D+00

      a(2,1) = 4.0D+00
      a(2,2) = 5.0D+00
      a(2,3) = 6.0D+00

      a(3,1) = 7.0D+00
      a(3,2) = 8.0D+00
      a(3,3) = 0.0D+00

      call r8mat_print ( n, n, a, '  The matrix A:' )
c
c  Factor the matrix.
c
      call dgetrf ( n, n, a, lda, ipiv, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGETRF returned INFO = ', info
        write ( *, '(a)' ) '  The matrix is numerically singular.'
        return
      end if
c
c  Set the right hand side.
c
      b(1) = 14.0D+00
      b(2) = 32.0D+00
      b(3) = 23.0D+00

      call r8vec_print ( n, b, '  Right hand side B' )
c
c  Solve the linear system.
c
      call dgetrs ( 'n', n, 1, a, lda, ipiv, b, n, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  Solution procedure failedc'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      call r8vec_print ( n, b, '  The solution X' )
 
      return
      end
      subroutine test07 ( )
c
c*********************************************************************72
c
cc TEST07 tests DGETRF and DGETRS.
c
c  Discussion:
c
c    The problem is just an enlarged version of the
c    problem for n = 5, which is:
c
c    Matrix A is ( N -1 -1 -1 -1)    right hand side b is  (1)
c                (-1  N -1 -1 -1)                          (1)
c                (-1 -1  N -1 -1)                          (1)
c                (-1 -1 -1  N -1)                          (1)
c                (-1 -1 -1 -1  N)                          (1)
c
c    Solution is   (1)
c                  (1)
c                  (1)
c                  (1)
c                  (1)
c
c    For this problem, no pivoting is required.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lda

      parameter ( n = 25 )
      parameter ( lda = n )

      double precision a(lda,n)
      double precision b(n)
      integer i
      integer info
      integer ipiv(n)
      integer j

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST07'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGETRF factors a general matrix;'
      write ( *, '(a)' ) '  DGETRS solves a linear system;'
      write ( *, '(a)' ) ' '
c
c  Assign values to matrix A and right hand side b.
c
      do i = 1, n
        do j = 1, n
          if ( i .eq. j ) then
            a(i,j) = dble ( n )
          else
            a(i,j) = -1.0D+00
          end if
        end do
      end do

      do i = 1, n
        b(i) = 1.0D+00
      end do
c
c  Factor the matrix.
c
      call dgetrf ( n, n, a, lda, ipiv, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Matrix is singular, INFO = ', info
        return
      end if
c
c  Solve the linear system.
c
      call dgetrs ( 'n', n, 1, a, lda, ipiv, b, n, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) 
     &    '  Solution procedure failed, INFO = ', info
        return
      end if

      call r8vec_print_some ( n, b, 5, 
     &  '  Partial solution (all should be 1)' )

      return
      end
      subroutine test08 ( )

c*********************************************************************72
c
cc TEST08 tests DGTSV.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      parameter ( n = 100 )

      double precision b(n)
      double precision c(n-1)
      double precision d(n)
      double precision e(n-1)
      integer i
      integer info
      integer ldb
      integer nrhs

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST08'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general tridiagonal storage mode (GT):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGTSV factors and solves a linear system'
      write ( *, '(a)' ) '  with a general tridiagonal matrix.'
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  The system is of order N = ', n
      write ( *, '(a)' ) ' '
c
c  Right hand side.
c 
      do i = 1, n-1
        b(i) = 0.0D+00
      end do
      b(n) = n + 1
c
c  Subdiagonal.
c  Diagonal.
c  Superdiagonal.
c 
      do i = 1, n-1
        c(i) = -1.0D+00
      end do

      do i = 1, n
        d(i) = 2.0D+00
      end do

      do i = 1, n-1
        e(i) = -1.0D+00
      end do
 
      nrhs = 1
      ldb = n
c
c  Factor and solve the linear system.
c
      call dgtsv ( n, nrhs, c, d, e, b, ldb, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  Solution procedure failed.'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      call r8vec_print_some ( n, b, 5, 
     &  '  Partial solution (Should be 1,2,3...)' )

      return
      end
      subroutine test09 ( )
c
c*********************************************************************72
c
cc TEST09 tests DPBTRF.
c
c  Discussion:
c
c    We want to compute the lower triangular Cholesky factor L
c    of a positive definite symmetric band matrix.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer nband

      parameter ( n = 5 )
      parameter ( nband = 1 )

      double precision a(nband+1,n)
      integer i
      integer info
      integer j
      double precision l(nband+1,n)
      double precision l_row(n)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST09'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) 
     &  '  in positive definite band storage mode (PB):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DPBTRF computes'
      write ( *, '(a)' ) '    the lower Cholesky factor A = L*L'' or'
      write ( *, '(a)' ) '    the upper Cholesky factor A = U''*U;'
      write ( *, '(a)' ) ' '
c
c  Zero out the matrix.
c
      do i = 1, nband+1
        do j = 1, n
          a(i,j) = 0.0D+00
        end do
      end do
c
c  Store the diagonal of a symmetric band matrix.
c
      do j = 1, n
        a(1,j) = 2.0D+00
      end do
c
c  Store the subdiagonal of a symmetric band matrix.
c
      do j = 1, n-1
        a(2,j) = -1.0D+00
      end do
c
c  Get the lower triangular Cholesky factor L:
c
      do i = 1, nband+1
        do j = 1, n
          l(i,j) = a(i,j)
        end do
      end do

      call dpbtrf ( 'L', n, nband, l, nband+1, info )

      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Factorization failed, INFO = ', info
        return
      end if
c
c  Print the relevant entries of L:
c
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  The lower Cholesky factor L:'
      write ( *, '(a)' ) ' '

      do i = 1, n
        do j = 1, n

          if ( 0 .le. i - j .and. i-j .le. nband ) then
            l_row(j) = l(i-j+1,j)
          else
            l_row(j) = 0.0D+00
          end if

        end do

        write ( *, '(5f10.6)' ) ( l_row(j), j = 1, n )

      end do

      return
      end
      subroutine test10 ( )

c*********************************************************************72
c
cc TEST10 tests DPBTRF and DPBTRS.
c
c  Discussion:
c
c    The problem is just an enlarged version of the
c    problem for n = 5, which is:
c
c    Matrix A is ( 2 -1  0  0  0)    right hand side b is  (1)
c                (-1  2 -1  0  0)                          (0)
c                ( 0 -1  2 -1  0)                          (0)
c                ( 0  0 -1  2 -1)                          (0)
c                ( 0  0  0 -1  2)                          (1)
c
c
c    Solution is   (1)
c                  (1)
c                  (1)
c                  (1)
c                  (1)
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer nband
      integer lda

      parameter ( n = 25 )
      parameter ( nband = 1 )
      parameter ( lda = nband + 1 )

      double precision a(lda,n)
      double precision b(n)
      integer i
      integer info
      integer j 
      integer nrhs

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST10'
      write ( *, '(a)' ) '  For a double precision real matrix (D) in'
      write ( *, '(a)' ) '  positive definite band storage mode (PB):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  For a positive definite symmetric band'
      write ( *, '(a)' ) '  matrix:'
      write ( *, '(a)' ) '  DPBTRF factors;'
      write ( *, '(a)' ) '  DPBTRS solves linear systems.'
      write ( *, '(a)' ) ' '
c
c  Zero out the matrix.
c
      do i = 1, lda
        do j = 1, n
          a(i,j) = 0.0D+00
        end do
      end do
c
c  Super (and sub) diagonal.
c
      do j = 2, n
        a(1,j) = -1.0D+00
      end do
c
c  Diagonal.
c
      do j = 1, n
        a(2,j) = 2.0D+00
      end do
c
c  Set the right hand side.
c
      b(1) = 1.0D+00
      do i = 2, n-1
        b(i) = 0.0D+00
      end do
      b(n) = 1.0D+00
c
c  Factor the matrix.
c
      call dpbtrf ( 'u', n, nband, a, lda, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Factorization failed, INFO = ', info
        return
      end if
c
c  Solve the linear system.
c
      nrhs = 1
      call dpbtrs ( 'u', n, nband, nrhs, a, lda, b, n, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  Solution failed, INFO = ', info
      end if

      call r8vec_print_some ( n, b, 5, 
     &  '  Partial solution (all should be 1)' )

      return
      end
      subroutine test11 ( )

c*********************************************************************72
c
cc TEST11 tests DPOTRF and DPOTRI.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lda

      parameter ( n = 5 )
      parameter ( lda = n )

      double precision a(n,n)
      double precision a_inv(n,n)
      integer i
      integer info
      integer j
      integer k
      double precision r(n,n)
      double precision temp(n,n)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST11'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in positive definite storage mode (PO):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DPOTRF computes the Cholesky factor '
      write ( *, '(a)' ) '    A = R''*R;'
      write ( *, '(a)' ) '  DPOTRI computes the inverse.'
      write ( *, '(a)' ) ' '
c
c  Zero out the matrix.
c
      do i = 1, n
        do j = 1, n
          a(i,j) = 0.0D+00
        end do
      end do
c
c  Subdiagonal.
c
      do i = 2, n
        a(i,i-1) = -1.0D+00
      end do
c
c  Diagonal.
c
      do i = 1, n
        a(i,i) = 2.0D+00
      end do
c
c  Superdiagonal.
c
      do i = 1, n - 1
        a(i,i+1) = -1.0D+00
      end do

      call r8mat_print ( n, n, a, '  The matrix A:' )
c
c  Factor the matrix.
c
      do i = 1, n
        do j = 1, n
          r(i,j) = a(i,j)
        end do
      end do

      call dpotrf ( 'u', n, r, lda, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a,i8)' ) '  DPOTRF returns INFO = ', info
        return
      end if

      do i = 1, n
        do j = 1, i-1
          r(i,j) = 0.0D+00
        end do
      end do

      call r8mat_print ( n, n, r, '  The Cholesky factor R:' )

      do i = 1, n
        do j = 1, n
          temp(i,j) = 0.0D+00
          do k = 1, n
            temp(i,j) = temp(i,j) + r(i,k) * r(k,j)
          end do
        end do
      end do

      call r8mat_print ( n, n, temp, '  The product R'' * R' )
c
c  Compute the inverse matrix.
c
      do i = 1, n
        do j = 1, n
          a_inv(i,j) = r(i,j)
        end do
      end do

      call dpotri ( 'u', n, a_inv, lda, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) 
     &    '  The inversion procedure failed, INFO = ', info
        return
      end if

      do i = 1, n
        do j = 1, i-1
          a_inv(i,j) = a_inv(j,i)
        end do
      end do

      call r8mat_print ( n, n, a_inv, '  The inverse matrix B:' )

      do i = 1, n
        do j = 1, n
          temp(i,j) = 0.0D+00
          do k = 1, n
            temp(i,j) = temp(i,j) + a_inv(i,k) * a(k,j)
          end do
        end do
      end do

      call r8mat_print ( n, n, temp, '  The product B * A' )

      return
      end
      subroutine test12 ( )

c*********************************************************************72
c
cc TEST12 tests DGEQRF and DORGQR.
c
c  Discussion:
c
c    DGEQRF computes the QR factorization of an M by N matrix A:
c
c      A(MxN) = Q(MxK) * R(KxN)
c
c    where K = min ( M, N ).
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer m
      integer n
      integer k
      integer lwork

      parameter ( m = 8 )
      parameter ( n = 6 )
c     parameter ( k = min ( m, n ) )
      parameter ( k = 6 )
      parameter ( lwork = n )

      double precision a(m,n)
      integer i
      integer info
      integer j
      integer l
      integer lda
      double precision q(m,k)
      double precision r(k,n)
      integer seed
      double precision tau(k)
      double precision work(lwork)

      seed = 123456789

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST12'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGEQRF computes the QR factorization:'
      write ( *, '(a)' ) '    A = Q * R'
      write ( *, '(a)' ) '  DORGQR computes the explicit form of '
      write ( *, '(a)' ) '  the Q factor.'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  In this case, our M x N matrix A has more'
      write ( *, '(a)' ) '  rows than columns:'
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  M = ', m
      write ( *, '(a,i8)' ) '  N = ', n
c
c  Set A.
c
      call r8mat_uniform_01 ( m, n, seed, a )

      call r8mat_print ( m, n, a, '  The matrix A:' )
c
c  Compute the QR factorization.
c
      lda = m

      call dgeqrf ( m, n, a, lda, tau, work, lwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGEQRF returned nonzero INFO = ', info
        return
      end if

      do i = 1, k
        do j = 1, n
          r(i,j) = 0.0D+00
        end do
      end do

      do i = 1, k
        do j = i, n
          r(i,j) = a(i,j)
        end do
      end do
c
c  Construct Q explicitly.
c
      do i = 1, m
        do j = 1, k
          q(i,j) = a(i,j)
        end do
      end do

      call dorgqr ( m, k, k, q, lda, tau, work, lwork, info )

      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DORGQR returned nonzero INFO = ', info
        return
      end if

      call r8mat_print ( m, k, q, '  The Q factor:' )

      call r8mat_print ( k, n, r, '  The R factor:' )

      do i = 1, m
        do j = 1, n
          a(i,j) = 0.0D+00
          do l = 1, k
            a(i,j) = a(i,j) + q(i,l) * r(l,j)
          end do
        end do
      end do

      call r8mat_print ( m, n, a, '  The product Q * R:' )

      return
      end
      subroutine test13 ( )

c*********************************************************************72
c
cc TEST13 tests DGEQRF and DORGQR.
c
c  Discussion:
c
c    DGEQRF computes the QR factorization of an M by N matrix A:
c
c      A(MxN) = Q(MxK) * R(KxN)
c
c    where K = min ( M, N ).
c
c    In order to get an M x M matrix Q, we are going to pad our
c    original matrix A with extra columns of zeroesc
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer m
      integer n
      integer n2
      integer k
      integer lwork

      parameter ( m = 8 )
      parameter ( n = 6 )
      parameter ( n2 = 8 )
!     parameter ( k = min ( m, n2 ) )
      parameter ( k = 8 )
      parameter ( lwork = n2 )

      double precision a(m,n)
      double precision a2(m,n2)
      integer i
      integer info
      integer j
      integer l
      integer lda
      double precision q(m,k)
      double precision r(k,n2)
      integer seed
      double precision tau(k)
      double precision work(lwork)

      seed = 123456789

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST13'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGEQRF computes the QR factorization:'
      write ( *, '(a)' ) '    A = Q * R'
      write ( *, '(a)' ) '  DORGQR computes the explicit form of '
      write ( *, '(a)' ) '  the Q factor.'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  In this case, our M x N matrix A has more'
      write ( *, '(a)' ) '  rows than columns:'
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  M = ', m
      write ( *, '(a,i8)' ) '  N = ', n
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  Normally, LAPACK will only return an'
      write ( *, '(a)' ) '  M x min(M,N) portion of Q.  When N .lt. M, '
      write ( *, '(a)' ) '  we lose information.'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  Here, we force the computation of the '
      write ( *, '(a)' ) '  full Q by making a copy of A with N-M '
      write ( *, '(a)' ) '  extra zero columns.'
      write ( *, '(a)' ) ' '
c
c  Set A.
c
      call r8mat_uniform_01 ( m, n, seed, a )

      call r8mat_print ( m, n, a, '  The matrix A:' )
c
c  Copy A, and pad with extra columns.
c
      do i = 1, m
        do j = 1, n
          a2(i,j) = a(i,j)
        end do
      end do

      do i = 1, m
        do j = n+1, m
          a2(i,j) = 0.0D+00
        end do
      end do
c
c  Compute the QR factorization.
c
      lda = m

      call dgeqrf ( m, n2, a2, lda, tau, work, lwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGEQRF returned nonzero INFO = ', info
        return
      end if

      do i = 1, k
        do j = 1, n2
          r(i,j) = 0.0D+00
        end do
      end do

      do i = 1, k
        do j = i, n2
          r(i,j) = a2(i,j)
        end do
      end do
c
c  Construct Q explicitly.
c
      do i = 1, m
        do j = 1, k
          q(i,j) = a2(i,j)
        end do
      end do

      call dorgqr ( m, k, k, q, lda, tau, work, lwork, info )

      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DORGQR returned nonzero INFO = ', info
        return
      end if

      call r8mat_print ( m, k, q, '  The Q factor:' )

      call r8mat_print ( k, n, r, '  The R factor:' )

      do i = 1, m
        do j = 1, n2
          a2(i,j) = 0.0D+00
          do l = 1, k
            a2(i,j) = a2(i,j) + q(i,l) * r(l,j)
          end do
        end do
      end do

      call r8mat_print ( m, n2, a2, '  The product Q * R:' )

      return
      end
      subroutine test14 ( )

c*********************************************************************72
c
cc TEST14 tests DGEQRF and DORGQR.
c
c  Discussion:
c
c    DGEQRF computes the QR factorization of an M by N matrix A:
c
c      A(MxN) = Q(MxK) * R(KxN)
c
c    where K = min ( M, N ).
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer m
      integer n
      integer k
      integer lwork

      parameter ( m = 6 )
      parameter ( n = 8 )
c     parameter ( k = min ( m, n ) )
      parameter ( k = 6 )
      parameter ( lwork = n )

      double precision a(m,n)
      integer i
      integer info
      integer j
      integer l
      integer lda
      double precision q(m,k)
      double precision r(k,n)
      integer seed
      double precision tau(k)
      double precision work(lwork)

      seed = 123456789

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST14'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in general storage mode (GE):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  DGEQRF computes the QR factorization:'
      write ( *, '(a)' ) '    A = Q * R'
      write ( *, '(a)' ) '  DORGQR computes the explicit form of'
      write ( *, '(a)' ) '  the Q factor.'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  In this case, our M x N matrix A has more'
      write ( *, '(a)' ) '  columns than rows:'
      write ( *, '(a)' ) ' '
      write ( *, '(a,i8)' ) '  M = ', m
      write ( *, '(a,i8)' ) '  N = ', n
c
c  Set A.
c
      call r8mat_uniform_01 ( m, n, seed, a )

      call r8mat_print ( m, n, a, '  The matrix A:' )
c
c  Compute the QR factorization.
c
      lda = m

      call dgeqrf ( m, n, a, lda, tau, work, lwork, info )
 
      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DGEQRF returned nonzero INFO = ', info
        return
      end if

      do i = 1, k
        do j = 1, n
          r(i,j) = 0.0D+00
        end do
      end do

      do i = 1, k
        do j = i, n
          r(i,j) = a(i,j)
        end do
      end do
c
c  Construct Q explicitly.
c
      do i = 1, m
        do j = 1, k
          q(i,j) = a(i,j)
        end do
      end do

      call dorgqr ( m, k, k, q, lda, tau, work, lwork, info )

      if ( info .ne. 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DORGQR returned nonzero INFO = ', info
        return
      end if

      call r8mat_print ( m, k, q, '  The Q factor:' )

      call r8mat_print ( k, n, r, '  The R factor:' )

      do i = 1, m
        do j = 1, n
          a(i,j) = 0.0D+00
          do l = 1, k
            a(i,j) = a(i,j) + q(i,l) * r(l,j)
          end do
        end do
      end do

      call r8mat_print ( m, n, a, '  The product Q*R' )

      return
      end
      subroutine test15 ( )

c*********************************************************************72
c
cc TEST15 tests DSBGVX.
c
c  Discussion:
c
c    DSBGVX deals with the generalized eigenvalue problem:
c
c      A * x = lambda * B * x
c
c    where A and B are symmetric and banded (and stored in LAPACK symmetric
c    band storage mode).  B is additionally assumed to be positive definite.
c
c    This is an "expert" interface, and the user is requesting
c    only some of the eigenvalues and eigenvectors.  In this example,
c    only the largest and smallest (in magnitude) eigenvalues will
c    be requested.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    17 March 2003
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    double precision AB(LDAB,N), contains, on input, the upper or lower
c    triangle of the symmetric band matrix A, stored in the first KA+1 rows
c    of the array AB.  
c    If UPLO = 'U', then
c      AB(KA+1+I-J,J) = A(I,J) for max(1,J-KA) .le. I .le. J;
c    If UPLO = 'L', then
c      AB(1+I-J,J) = A(I,J) for J .le. I .le. min(N,J+KA).
c
c    double precision ABSTOL, the absolute error tolerance for the eigenvalues.
c    If the input value of ABSTOL is not positive, then an appropriate
c    value will be determined internally and used instead.
c
c    double precision BB(LDBB,N), contains, on input, the upper or lower
c    triangle of the positive definite symmetric band matrix B, stored in 
c    the first KB+1 rows of the array BB.  
c    If UPLO = 'U', then
c      BB(KB+1+I-J,J) = B(I,J) for max(1,J-KB) .le. I .le. J;
c    If UPLO = 'L', then
c      BB(1+I-J,J) = B(I,J) for J .le. I .le. min(N,J+KB).
c
c    integer IFAIL(N), if JOBZ = 'V', then if INFO is 0, the first
c    M elements of IFAIL have been set to zero by DSBGVX, but if INFO
c    is nonzero, IFAIL contains the indices of the eigenvalues
c    for which the eigenvectors failed to converge.  If JOBZ = 'N',
c    then IFAIL is not referenced.
c
c    integer IL, IU, the indices of the first (smallest) and last
c    (largest) eigenvalues to be returned.  These values are only
c    used if RANGE = 'I'.  It must be the case that 1 .le. IL .le. IU .le. N.
c
c    Integer INFO, is 0 for a successful computation, 
c    negative if an input argument was illegal (the index of that
c    argument is the value of -INFO), or positive, in which case,
c    if 0 .lt. INFO .le. N, then INFO off diagonal elements of an
c    intermediate tridiagonal form did not converge to zero, or
c    if N .lt. INFO, B is not positive definite and the computation
c    could not be completed.
c
c    integer IWORK(5*N), workspace.
c
c    character JOBZ, is 'N' if only eigenvalues are desired, or 'V'
c    if eigenvectors will also be required.
c
c    Integer KA, the number of superdiagonals (if UPLO = 'U') or
c    subdiagonals (if UPLO = 'L') of A that are nonzero.
c
c    integer KB, the number of superdiagonals (if UPLO = 'U') or
c    subdiagonals (if UPLO = 'L') of B that are nonzero.
c
c    integer LDAB, the leading dimension of the array AB, which
c    must be at least KA+1.
c
c    integer LDBB, the leading dimension of the array BB, which
c    must be at least KB+1.
c
c    integer LDQ, the leading dimension of the array Q.
c    If JOBZ = 'N', then Q is not used, and LDQ should be any
c    positive value such as 1.  If JOBZ = 'V', then LDQ must be
c    at least N.
c
c    integer LDZ, the leading dimension of the array Z.
c    If JOBZ = 'N', then Z is not used, and LDZ should be any
c    positive value such as 1.  If JOBZ = 'V', then LDZ must be
c    at least N.
c
c    integer M, the number of eigenvalues found by DSBGVX.
c
c    integer N, the order of the matrices A and B.
c
c    double precision Q(LDQ,N), if JOBZ = 'V', the N by N matrix used to 
c    reduce the problem to standard form: "C * x = lambda * x"
c    and then to reduce the matrix C to tridiagonal form.  But
c    if JOBZ is not 'V', Q is not referenced.
c
c    character RANGE, specifies which eigenvalues are desired.
c    'A' means all, 'V' means a real interval will be specified in which
c    eigenvalues are to be sought, 'I' means a range of indices will
c    be specified.
c
c    character UPLO, is 'U' if the upper triangles of A and B are stored,
c    'L' if the lower triangles are stored.
c
c    double precision VL, VU, the lower and upper bounds of an interval to be
c    searched for eigenvalues.  In this case, VL must be less than VU.  
c    These values are used only if RANGE = 'V'.
c
c    double precision W(N), the requested eigenvalues, in ascending order.
c
c    double precision WORK(7*N), workspace.
c
c    double precision Z(LDZ,N), if JOBZ = 'V', the I-th column of Z contains
c    the eigenvector associated with the I-th eigenvalue W(I).
c
      implicit none

      integer n
      integer ka
      integer kb
      integer ldab
      integer ldbb
      integer ldq
      integer ldz

      parameter ( n = 11 )
      parameter ( ka = 2 )
      parameter ( kb = 1 )
      parameter ( ldab = ka+1 )
      parameter ( ldbb = kb+1 )
      parameter ( ldq = 1 )
      parameter ( ldz = 1 )

      double precision ab(ldab,n)
      double precision abstol
      double precision bb(ldbb,n)
      integer i
      integer ifail(n)
      integer il
      integer ilo
      integer info
      integer iu
      integer iwork(5*n)
      integer j
      character jobz
      integer m
      double precision q(ldq,n)
      character range
      integer test
      character uplo
      double precision value
      double precision vl
      double precision vu
      double precision w(n)
      double precision work(7*n)
      double precision z(ldz,n)

      abstol = 0.0D+00
      jobz = 'N'
      range = 'I'
      uplo = 'U'
      vl = 0.0D+00  
      vu = 1.0D+00

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST15'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in symmetric band storage mode (SB):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  For a symmetric banded NxN matrix A, '
      write ( *, '(a)' ) '  and a symmetric banded positive definite '
      write ( *, '(a)' ) '  NxN matrix B, DSBGVX solves the '
      write ( *, '(a)' ) '  generalized eigenvalue problem'
      write ( *, '(a)' ) '    A * X = LAMBDA * B * X'
      write ( *, '(a)' ) ' '

      do test = 1, 2
c
c  Set A.
c
        do j = 1, n
          ilo = max ( j - ka, 1 )
          do i = ilo, j

            if ( j .eq. i-2 ) then
              value = -1.0D+00
            else if ( j .eq. i-1 ) then
              value = -1.0D+00
            else if ( j .eq. i ) then
              value = +4.0D+00
            else if ( j .eq. i+1 ) then
              value = -1.0D+00
            else if ( j .eq. i+2 ) then
              value = -1.0D+00
            else
              value = 0.0D+00
            end if

            ab(ka+1+i-j,j) = value

          end do
        end do
c
c  Set B.
c
        do j = 1, n
          ilo = max ( j - kb, 1 )
          do i = ilo, j

            if ( j .eq. i-1 ) then
              value = -1.0D+00
            else if ( j .eq. i ) then
              value = +2.0D+00
            else if ( j .eq. i+1 ) then
              value = -1.0D+00
            else
              value = 0.0D+00
            end if

            bb(kb+1+i-j,j) = value

          end do
        end do
c
c  Request the value of the SMALLEST or LARGEST eigenvalue:
c
        if ( test .eq. 1 ) then
          il = 1
          iu = 1
        else if ( test .eq. 2 ) then
          il = n
          iu = n
        end if

        call dsbgvx ( jobz, range, uplo, n, ka, kb, ab, ldab, bb, 
     &    ldbb, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, 
     &    iwork, ifail, info )
 
        if ( info .lt. 0 ) then
          write ( *, '(a)' ) ' '
          write ( *, '(a,i8)' ) 
     &      '  Illegal value for input argument ', -info
          return
        else if ( 0 .lt. info ) then
          write ( *, '(a)' ) ' '
          write ( *, '(a)' ) '  The eigenvalue or eigenvector'
          write ( *, '(a)' ) '  iterations did not converge.'
          cycle
        end if

        call r8vec_print ( m, w, '  Computed eigenvalues' )

      end do

      return
      end
      subroutine test16 ( )

c*********************************************************************72
c
cc TEST16 tests DSYEV.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    09 April 2007
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer n
      integer lwork

      parameter ( n = 7 )
      parameter ( lwork = 3 * n - 1 )

      double precision a(n,n)
      integer info
      character jobz
      double precision lambda(n)
      character uplo
      double precision work(lwork)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST16'
      write ( *, '(a)' ) '  For a double precision real matrix (D)'
      write ( *, '(a)' ) '  in symmetric storage mode (SY):'
      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  For a symmetric matrix in general storage,'
      write ( *, '(a)' ) '  DSYEV computes eigenvalues and '
      write ( *, '(a)' ) '  eigenvectors;'
      write ( *, '(a)' ) ' '
c
c  Set A.
c
      call clement2 ( n, a )

      call r8mat_print ( n, n, a, '  The matrix A:' )
c
c  Compute the eigenvalues and eigenvectors.
c
      jobz = 'V'
      uplo = 'U'

      call dsyev ( jobz, uplo, n, a, n, lambda, work, lwork, info )
 
      if ( info .ne. 0 ) then

        write ( *, '(a)' ) ' '
        write ( *, '(a,i8)' ) '  DSYEV returned nonzero INFO = ', info

      else

        call r8vec_print ( n, lambda, '  The eigenvalues:' )

        if ( jobz .eq. 'V' ) then
          call r8mat_print ( n, n, a, '  The eigenvector matrix:' )
        end if
      
      end if

      return
      end
      subroutine test17 ( )

c*********************************************************************72
c
cc TEST17 tests DGEQRF to QR factor a matrix.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    04 March 2010
c
c  Author:
c
c    John Burkardt
c
      implicit none

      integer lda
      integer ldb
      integer lwork
      integer m
      integer n
      integer nrhs
      integer tau_size

      parameter ( m = 5 )
      parameter ( n = 5 )
      parameter ( nrhs = 1 )

      parameter ( lda = m )
      parameter ( ldb = max ( m, n ) )
      parameter ( lwork = n )
      parameter ( tau_size = n )

      double precision a(lda,n)
      double precision b(ldb,nrhs)
      integer i
      integer info
      integer j
      double precision tau(tau_size)
      double precision work(lwork)

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) 'TEST17'
      write ( *, '(a)' ) '  Call the standard LAPACK routine'
      write ( *, '(a)' ) '  DGEQRF to get the QR factorization of'
      write ( *, '(a)' ) '  a matrix stored in GE format.'

      do j = 1, n
        do i = 1, m
          if ( j == i - 1 ) then
            a(i,j) = - 1.0D+00
          else if ( j == i ) then
            a(i,j) = 2.0D+00
          else if ( j == i + 1 ) then
            a(i,j) = -1.0D+00
          else
            a(i,j) = 0.0D+00
          end if
        end do
      end do

      call r8mat_print ( m, n, a, '  Input matrix:' )

      call dgeqrf ( m, n, a, lda, tau, work, lwork, info )

      if ( info == 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  DGEQRF called successfully.'
      else
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  DGEQRF returned error flag.'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      call r8mat_print ( m, n, a, '  Factored matrix:' )

      call r8vec_print ( tau_size, tau, '  Tau:' );
c
c  Set up and solve a linear system using DQEQRS.
c
      do i = 1, n
        b(i,1) = 0.0D+00
      end do
      b(n,1) = dble ( n + 1 )

      call dgeqrs ( m, n, nrhs, a, lda, tau, b, ldb, work, lwork, info )

      if ( info == 0 ) then
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  DGEQRS called successfully.'
      else
        write ( *, '(a)' ) ' '
        write ( *, '(a)' ) '  DGEQRS returned error flag.'
        write ( *, '(a,i8)' ) '  INFO = ', info
        return
      end if

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) '  Solution from DGEQRS:'
      write ( *, '(a)' ) ' '
      do i = 1, m
        write ( *, '(2x,g14.6)' ) b(i,1)
      end do

      return
      end
      subroutine clement2 ( n, a )

c*********************************************************************72
c
cc CLEMENT2 returns the Clement2 matrix.
c
c  Formula:
c
c    if ( J = I+1 )
c      A(I,J) = sqrt(I*(N-I))
c    else if ( I = J+1 )
c      A(I,J) = sqrt(J*(N-J))
c    else
c      A(I,J) = 0
c
c  Example:
c
c    N = 5
c
c       .    sqrt(4)    .       .       .
c    sqrt(4)    .    sqrt(6)    .       .
c       .    sqrt(6)    .    sqrt(6)    .
c       .       .    sqrt(6)    .    sqrt(4)
c       .       .       .    sqrt(4)    .
c
c  Properties:
c
c    A is tridiagonal.
c
c    Because A is tridiagonal, it has property A (bipartite).
c
c    A is symmetric: A' = A.
c
c    Because A is symmetric, it is normal.
c
c    Because A is normal, it is diagonalizable.
c
c    A is persymmetric: A(I,J) = A(N+1-J,N+1-I).
c
c    The diagonal of A is zero.
c
c    A is singular if N is odd.
c
c    About 64 percent of the entries of the inverse of A are zero.
c
c    The eigenvalues are plus and minus the numbers
c
c      N-1, N-3, N-5, ..., (1 or 0).
c
c    If N is even,
c
c      det ( A ) = (-1)**(N/2) * (N-1) * (N+1)**(N/2)
c
c    and if N is odd,
c
c      det ( A ) = 0
c
c  Reference:
c
c    P A Clement,
c    A class of triple-diagonal matrices for test purposes,
c    SIAM Review,
c    Volume 1, 1959, pages 50-52.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    15 April 1999
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer N, the order of A.
c
c    Output, double precision A(N,N), the matrix.
c
      implicit none

      integer n

      double precision a(n,n)
      integer i
      integer j

      do i = 1, n
        do j = 1, n

          if ( j .eq. i + 1 ) then
            a(i,j) = sqrt ( dble ( i * ( n - i ) ) )
          else if ( i .eq. j + 1 ) then
            a(i,j) = sqrt ( dble ( j * ( n - j ) ) )
          else
            a(i,j) = 0.0D+00
          end if

        end do
      end do

      return
      end
      subroutine dgeqrs ( m, n, nrhs, a, lda, tau, b, ldb, work, lwork,
     &  info )

c*********************************************************************72
c
cc DGEQRS solves a linear system factored by DGEQRF.
c
c  Discussion:
c
c    This routine solves the least squares problem
c      min || A*X - B ||
c    using the QR factorization
c      A = Q*R
c    computed by DGEQRF.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Parameters:
c
c  M       (input) INTEGER
c          The number of rows of the matrix A.  M >= 0.
c
c  N       (input) INTEGER
c          The number of columns of the matrix A.  M >= N >= 0.
c
c  NRHS    (input) INTEGER
c          The number of columns of B.  NRHS >= 0.
c
c  A       (input) DOUBLE PRECISION array, dimension (LDA,N)
c          Details of the QR factorization of the original matrix A as
c          returned by DGEQRF.
c
c  LDA     (input) INTEGER
c          The leading dimension of the array A.  LDA >= M.
c
c  TAU     (input) DOUBLE PRECISION array, dimension (N)
c          Details of the orthogonal matrix Q.
c
c  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
c          On entry, the m-by-nrhs right hand side matrix B.
c          On exit, the n-by-nrhs solution matrix X.
c
c  LDB     (input) INTEGER
c          The leading dimension of the array B. LDB >= M.
c
c  WORK    (workspace) DOUBLE PRECISION array, dimension (LWORK)
c
c  LWORK   (input) INTEGER
c          The length of the array WORK.  LWORK must be at least NRHS,
c          and should be at least NRHS*NB, where NB is the block size
c          for this environment.
c
c  INFO    (output) INTEGER
c          = 0: successful exit
c          < 0: if INFO = -i, the i-th argument had an illegal value
c
      implicit none

      integer lda
      integer ldb
      integer lwork
      integer n
      integer nrhs

      double precision a(lda,n)
      double precision b(ldb,nrhs)
      integer info
      integer m
      double precision one
      parameter ( one = 1.0D+00 )
      double precision tau(n)
      double precision work(lwork)

      info = 0

      if ( m .lt. 0 ) then
        info = - 1
      else if ( n .lt. 0 .or. n .gt. m ) then
        info = - 2
      else if ( nrhs .lt. 0 ) then
        info = - 3
      else if ( lda .lt. max( 1, m ) ) then
        info = - 5
      else if ( ldb .lt. max( 1, m ) ) then
        info = - 8
      else if ( lwork .lt. 1 .or. lwork .lt. nrhs .and. 
     &  m .gt. 0 .and. n .gt. 0 ) then
         info = - 10
      end if

      if ( info .ne. 0 ) then
         call xerbla ( 'DGEQRS', - info )
         return
      end if
c
c  Quick return if possible.
c
      if ( n .eq. 0 .or. nrhs .eq. 0 .or. m .eq. 0 ) then
        return
      end if
c
c  Compute B := Q' * B
c
      call dormqr( 'Left', 'Transpose', m, nrhs, n, a, lda, tau, b, ldb,
     &  work, lwork, info )
c
c  Solve R * X = B(1:n,:)
c
      call dtrsm ( 'Left', 'Upper', 'No transpose', 'Non-unit', n, nrhs,
     &  one, a, lda, b, ldb )

      return
      end
      function r8mat_norm_li ( m, n, a )

c*********************************************************************72
c
cc R8MAT_NORM_LI returns the matrix L-infinity norm of an R8MAT.
c
c  Definition:
c
c    The matrix L-infinity norm is defined as:
c
c      R8MAT_NORM_LI =  Max ( 1 .le. I .le. M ) Sum ( 1 .le. J .le. N ) abs ( A(I,J) ).
c
c    The matrix L-infinity norm is derived from the vector L-infinity norm,
c    and satisifies:
c
c      R8VEC_NORM_LI ( A*x ) .le. R8MAT_NORM_LI ( A ) * R8VEC_NORM_LI ( x ).
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    24 March 2000
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer M, the number of rows in A.
c
c    Input, integer N, the number of columns in A.
c
c    Input, double precision A(M,N), the matrix whose L-infinity norm is
c    desired.
c
c    Output, double precision R8MAT_NORM_LI, the L-infinity norm of A.
c
      implicit none

      integer m
      integer n

      double precision a(m,n)
      integer i
      integer j
      double precision r8mat_norm_li
      double precision temp

      r8mat_norm_li = 0.0D+00

      do i = 1, m
        temp = 0.0D+00
        do j = 1, n
          temp = temp + abs ( a(i,j) )
        end do
        r8mat_norm_li = max ( r8mat_norm_li, temp )
      end do

      return
      end
      subroutine r8mat_print ( m, n, a, title )
c
c*********************************************************************72
c
cc R8MAT_PRINT prints an R8MAT.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    12 September 2004
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer M, the number of rows in A.
c
c    Input, integer N, the number of columns in A.
c
c    Input, double precision A(M,N), the matrix.
c
c    Input, character * ( * ) TITLE, a title to be printed.
c
      implicit none

      integer m
      integer n

      double precision a(m,n)
      character * ( * ) title

      call r8mat_print_some ( m, n, a, 1, 1, m, n, title )

      return
      end
      subroutine r8mat_print_some ( m, n, a, ilo, jlo, ihi, jhi, title )

c*********************************************************************72
c
cc R8MAT_PRINT_SOME prints some of an R8MAT.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    12 September 2004
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer M, N, the number of rows and columns.
c
c    Input, double precision A(M,N), an M by N matrix to be printed.
c
c    Input, integer ILO, JLO, the first row and column to print.
c
c    Input, integer IHI, JHI, the last row and column to print.
c
c    Input, character * ( * ) TITLE, an optional title.
c
      implicit none

      integer incx
      integer m
      integer n

      parameter ( incx = 5 )

      double precision a(m,n)
      character ( len = 14 ) ctemp(incx)
      integer i
      integer i2hi
      integer i2lo
      integer ihi
      integer ilo
      integer inc
      integer j
      integer j2
      integer j2hi
      integer j2lo
      integer jhi
      integer jlo
      character * ( * ) title

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) title

      do j2lo = max ( jlo, 1 ), min ( jhi, n ), incx

        j2hi = j2lo + incx - 1
        j2hi = min ( j2hi, n )
        j2hi = min ( j2hi, jhi )

        inc = j2hi + 1 - j2lo

        write ( *, '(a)' ) ' '

        do j = j2lo, j2hi
          j2 = j + 1 - j2lo
          write ( ctemp(j2), '(i7,7x)') j
        end do

        write ( *, '(''  Col   '',5a14)' ) ( ctemp(j), j = 1, inc)
        write ( *, '(a)' ) '  Row'
        write ( *, '(a)' ) ' '

        i2lo = max ( ilo, 1 )
        i2hi = min ( ihi, m )

        do i = i2lo, i2hi

          do j2 = 1, inc

            j = j2lo - 1 + j2

            if ( a(i,j) .eq. dble ( int ( a(i,j) ) ) ) then
              write ( ctemp(j2), '(f8.0,6x)' ) a(i,j)
            else
              write ( ctemp(j2), '(g14.6)' ) a(i,j)
            end if

          end do

          write ( *, '(i5,1x,5a14)' ) i, ( ctemp(j), j = 1, inc )

        end do

      end do

      write ( *, '(a)' ) ' '

      return
      end
      subroutine r8mat_uniform_01 ( m, n, seed, r )

c*********************************************************************72
c
cc R8MAT_UNIFORM_01 fills an array with unit pseudorandom numbers.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    11 August 2004
c
c  Author:
c
c    John Burkardt
c
c  Reference:
c
c    Paul Bratley, Bennett Fox, L E Schrage,
c    A Guide to Simulation,
c    Springer Verlag, pages 201-202, 1983.
c
c    Bennett Fox,
c    Algorithm 647:
c    Implementation and Relative Efficiency of Quasirandom
c    Sequence Generators,
c    ACM Transactions on Mathematical Software,
c    Volume 12, Number 4, pages 362-376, 1986.
c
c    P A Lewis, A S Goodman, J M Miller,
c    A Pseudo-Random Number Generator for the System/360,
c    IBM Systems Journal,
c    Volume 8, pages 136-143, 1969.
c
c  Parameters:
c
c    Input, integer M, N, the number of rows and columns in the array.
c
c    Input/output, integer SEED, the "seed" value, which should NOT be 0.
c    On output, SEED has been updated.
c
c    Output, double precision R(M,N), the array of pseudorandom values.
c
      implicit none

      integer m
      integer n

      integer i
      integer j
      integer k
      integer seed
      double precision r(m,n)

      do j = 1, n

        do i = 1, m

          k = seed / 127773

          seed = 16807 * ( seed - k * 127773 ) - k * 2836

          if ( seed .lt. 0 ) then
            seed = seed + 2147483647
          end if

          r(i,j) = dble ( seed ) * 4.656612875D-10

        end do
      end do

      return
      end
      subroutine r8vec_print ( n, a, title )

c*********************************************************************72
c
cc R8VEC_PRINT prints an R8VEC.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    22 August 2000
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer N, the number of components of the vector.
c
c    Input, double precision A(N), the vector to be printed.
c
c    Input, character * ( * ) TITLE, an optional title.
c
      implicit none

      integer n

      double precision a(n)
      integer i
      character * ( * ) title

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) title
      write ( *, '(a)' ) ' '

      do i = 1, n
        write ( *, '(2x,i8,g16.8)' ) i, a(i)
      end do

      return
      end
      subroutine r8vec_print_some ( n, a, max_print, title )

c*********************************************************************72
c
cc R8VEC_PRINT_SOME prints "some" of an R8VEC.
c
c  Discussion:
c
c    The user specifies MAX_PRINT, the maximum number of lines to print.
c
c    If N, the size of the vector, is no more than MAX_PRINT, then
c    the entire vector is printed, one entry per line.
c
c    Otherwise, if possible, the first MAX_PRINT-2 entries are printed,
c    followed by a line of periods suggesting an omission,
c    and the last entry.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    19 December 2001
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    Input, integer N, the number of entries of the vector.
c
c    Input, double precision A(N), the vector to be printed.
c
c    Input, integer MAX_PRINT, the maximum number of lines to print.
c
c    Input, character * ( * ) TITLE, an optional title.
c
      implicit none

      integer n

      double precision a(n)
      integer i
      integer max_print
      character * ( * ) title

      if ( max_print .le. 0 ) then
        return
      end if

      if ( n .le. 0 ) then
        return
      end if

      write ( *, '(a)' ) ' '
      write ( *, '(a)' ) title
      write ( *, '(a)' ) ' '

      if ( n .le. max_print ) then

        do i = 1, n
          write ( *, '(2x,i8,2x,g14.6)' ) i, a(i)
        end do

      else if ( 3 .le. max_print ) then

        do i = 1, max_print-2
          write ( *, '(2x,i8,2x,g14.6)' ) i, a(i)
        end do
        write ( *, '(a)' ) '  ......  ..............'
        i = n
        write ( *, '(2x,i8,2x,g14.6)' ) i, a(i)

      else

        do i = 1, max_print - 1
          write ( *, '(2x,i8,2x,g14.6)' ) i, a(i)
        end do
        i = max_print
        write ( *, '(2x,i8,2x,g14.6,2x,a)' ) 
     &    i, a(i), '...more entries...'

      end if

      return
      end
      subroutine timestamp ( )

c*********************************************************************72
c
cc TIMESTAMP prints out the current YMDHMS date as a timestamp.
c
c  Discussion:
c
c    This FORTRAN77 version is made available for cases where the
c    FORTRAN90 version cannot be used.
c
c  Licensing:
c
c    This code is distributed under the GNU LGPL license.
c
c  Modified:
c
c    16 September 2005
c
c  Author:
c
c    John Burkardt
c
c  Parameters:
c
c    None
c
      implicit none

      character ( len = 8 ) date
      character ( len = 10 ) time

      call date_and_time ( date, time )

      write ( *, '(a8,2x,a10)' ) date, time

      return
      end

2,编译运行

基于 lapack 包的 .a :

$ gfortran hello_lapack_f77.f -L ./third-party0/lapack/local/lib -llapack -lrefblas

3,效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值