How to solve an equation system A x = b with the routine DGESV is shown in the following example.
!----------------------------------------------------------------------- ! ! test_lapack77.f90 ! ! simple demo for using LAPACK77 routines in Fortran90 ! ! Author: Bernhard Seiwald ! Date: 12.01.2002 ! !----------------------------------------------------------------------- PROGRAM test_lapack77 !----------------------------------------------------------------------- !----------------------------------------------------------------------- IMPLICIT NONE INTEGER, PARAMETER :: I4B = SELECTED_INT_KIND(9) INTEGER, PARAMETER :: DP = KIND(1.0D0) INTEGER, PARAMETER :: w_us = 6 REAL(DP), PARAMETER :: EPS = 1.0D-9 CHARACTER(len=255) :: filename, msg INTEGER(I4B) :: iunit, i_alloc, istat INTEGER(I4B) :: dim, info INTEGER(I4B) :: n, nrhs, lda, ldb INTEGER(I4B) :: i, j REAL(DP) :: erg INTEGER(I4B), DIMENSION(:), ALLOCATABLE :: ipiv REAL(DP), DIMENSION(:), ALLOCATABLE :: inhom, loes REAL(DP), DIMENSION(:,:), ALLOCATABLE :: mat, mat1 !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! open file containing info about equation system !----------------------------------------------------------------------- WRITE(filename,'(A)') 'test_lapack_in.dat' iunit = 7 OPEN(unit=iunit, file=TRIM(filename), status='unknown', form='formatted', & iostat=istat) IF (istat /= 0) THEN WRITE(w_us,*) 'test_lapack77: Error on opening file ', filename STOP END IF !----------------------------------------------------------------------- ! read dimension of matrix and allocate arrays !----------------------------------------------------------------------- READ(iunit,*) dim ALLOCATE( mat(dim,dim), mat1(dim,dim), inhom(dim), loes(dim), & stat = i_alloc ) IF(i_alloc /= 0) STOP 'test_lapack77: Allocation for arrays1 failed!' !----------------------------------------------------------------------- ! read matrix !----------------------------------------------------------------------- DO i = 1, dim READ(iunit, *) (mat(i,j), j=1,dim) END DO !----------------------------------------------------------------------- ! read right hand side !----------------------------------------------------------------------- DO i = 1, dim READ(iunit,*) inhom(i) END DO CLOSE(unit=iunit) loes = inhom mat1 = mat n = SIZE(loes,1) nrhs = 1 lda = MAX(1,SIZE(mat,1)) ldb = MAX(1,SIZE(loes,1)) ALLOCATE( ipiv(n), stat = i_alloc ) IF(i_alloc /= 0) STOP 'test_lapack77: Allocation for arrays2 failed!' !----------------------------------------------------------------------- ! solve system !----------------------------------------------------------------------- CALL dgesv(n, nrhs, mat1, lda, ipiv, loes, ldb, info) ! error handling: messages are copies from man pages IF ( info < 0 ) THEN WRITE(msg,*) 'test_lapack77: Lapack routine dgesv did not exit ', & 'successful! The ', info, '-th argument had an illegal value' PRINT *, msg END IF IF ( info > 0 ) THEN WRITE(msg,*) 'test_lapack77: Lapack routine dgesv did not exit ', & 'successful! U(', info, ',' , info, ') is exactly zero. ', & 'The factorization has been completed, but the factor U ', & 'is exactly singular, so the solution could not be computed.' PRINT *, msg END IF !----------------------------------------------------------------------- ! check result !----------------------------------------------------------------------- DO i = 1, dim erg = SUM(mat(i,:)*loes) IF ( ABS(inhom(i) - erg) > EPS ) THEN ! report error in file 'FORTRAN_INT_ERROR' WRITE(filename,'(A)') 'FORTRAN_INT_ERROR' OPEN(unit=iunit, file=TRIM(filename), status='unknown', & form='formatted', iostat=istat) IF (istat /= 0) THEN WRITE(w_us,*) 'test_lapack77: Error on opening file ', filename STOP END IF WRITE(iunit,*) 'problem in ', i, erg CLOSE(unit=iunit) ! stop, when first error occurs STOP END IF END DO !----------------------------------------------------------------------- ! deallocate arrays !----------------------------------------------------------------------- DEALLOCATE( mat, mat1, inhom, loes, stat = i_alloc ) IF(i_alloc /= 0) STOP 'test_lapack77: Deallocation for arrays1 failed!' DEALLOCATE( ipiv, stat = i_alloc ) IF(i_alloc /= 0) STOP 'test_lapack77: Deallocation for arrays2 failed!' END PROGRAM test_lapack77