home *** CD-ROM | disk | FTP | other *** search
- /* *****************************************************************************
- *
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- *
- ***************************************************************************** */
- subroutine matgen(a,lda,n)
- double precision a(lda,1)
- c
- init = 1325
- norma = 0.0
- c$doacross
- do 35 i = 1,n
- a(i,1) = 0.0
- 35 continue
- do 30 j = 1,n
- do 20 i = 1,n
- init = mod(3125*init,65536)
- a(i,j) = (init - 32768.0)/16384.0
- 20 continue
- 30 continue
- return
- end
-
- subroutine dgefa(a,lda,n,ipvt,info)
- integer lda,n,ipvt(1),info
- double precision a(lda,1)
- c
- c dgefa factors a double precision matrix by gaussian elimination.
- c
- c dgefa is usually called by dgeco, but it can be called
- c directly with a saving in time if rcond is not needed.
- c (time for dgeco) = (1 + 9/n)*(time for dgefa) .
- c
- c on entry
- c
- c a double precision(lda, n)
- c the matrix to be factored.
- c
- c lda integer
- c the leading dimension of the array a .
- c
- c n integer
- c the order of the matrix a .
- c
- c on return
- c
- c a an upper triangular matrix and the multipliers
- c which were used to obtain it.
- c the factorization can be written a = l*u where
- c l is a product of permutation and unit lower
- c triangular matrices and u is upper triangular.
- c
- c ipvt integer(n)
- c an integer vector of pivot indices.
- c
- c info integer
- c = 0 normal value.
- c = k if u(k,k) .eq. 0.0 . this is not an error
- c condition for this subroutine, but it does
- c indicate that dgesl or dgedi will divide by zero
- c if called. use rcond in dgeco for a reliable
- c indication of singularity.
- c
- c linpack. this version dated 08/14/78 .
- c cleve moler, university of new mexico, argonne national lab.
- c
- c subroutines and functions
- c
- c blas daxpy,dscal,idamax
- c
- c internal variables
- c
- double precision t
- integer idamax,j,k,kp1,l,nm1
- c
- c
- c gaussian elimination with partial pivoting
- c
- info = 0
- nm1 = n - 1
- if (nm1 .lt. 1) go to 70
- do 60 k = 1, nm1
- kp1 = k + 1
- c
- c find l = pivot index
- c
- l = idamax(n-k+1,a(k,k),1) + k - 1
- ipvt(k) = l
- c
- c zero pivot implies this column already triangularized
- c
- if (a(l,k) .eq. 0.0d0) go to 40
- c
- c interchange if necessary
- c
- if (l .eq. k) go to 10
- t = a(l,k)
- a(l,k) = a(k,k)
- a(k,k) = t
- 10 continue
- c
- c compute multipliers
- c
- t = -1.0d0/a(k,k)
- call dscal(n-k,t,a(k+1,k),1)
- c
- c row elimination with column indexing
- c
- c$doacross local(j,t)
- do 30 j = kp1, n
- t = a(l,j)
- if (l .eq. k) go to 20
- a(l,j) = a(k,j)
- a(k,j) = t
- 20 continue
- call daxpy(n-k,t,a(k+1,k),1,a(k+1,j),1)
- 30 continue
- go to 50
- 40 continue
- info = k
- 50 continue
- if( mod(k,32) .eq. 0) call update(k)
- 60 continue
- 70 continue
- ipvt(n) = n
- if (a(n,n) .eq. 0.0d0) info = n
- call update(n)
- return
- end
-