integer function idamax(n,dx,incx)
c***begin prologue idamax
c***date written 791001 (yymmdd)
c***revision date 820801 (yymmdd)
c***category no. d1a2
c***keywords blas,double precision,linear algebra,maximum component,
c vector
c***author lawson, c. l., (jpl)
c hanson, r. j., (snla)
c kincaid, d. r., (u. of texas)
c krogh, f. t., (jpl)
c***purpose find largest component of d.p. vector
c***description
c
c b l a s subprogram
c description of parameters
c
c --input--
c n number of elements in input vector(s)
c dx double precision vector with n elements
c incx storage spacing between elements of dx
c
c --output--
c idamax smallest index (zero if n .le. 0)
c
c find smallest index of maximum magnitude of double precision dx.
c idamax = first i, i = 1 to n, to minimize abs(dx(1-incx+i*incx)
c***references lawson c.l., hanson r.j., kincaid d.r., krogh f.t.,
c *basic linear algebra subprograms for fortran usage*,
c algorithm no. 539, transactions on mathematical
c software, volume 5, number 3, september 1979, 308-323
c***routines called (none)
c***end prologue idamax
c
double precision dx(1),dmax,xmag
c***first executable statement idamax
idamax = 0
if(n.le.0) return
idamax = 1
if(n.le.1)return
if(incx.eq.1)goto 20
c
c code for increments not equal to 1.
c
dmax = dabs(dx(1))
ns = n*incx
ii = 1
do 10 i = 1,ns,incx
xmag = dabs(dx(i))
if(xmag.le.dmax) go to 5
idamax = ii
dmax = xmag
5 ii = ii + 1
10 continue
return
c
c code for increments equal to 1.
c
20 dmax = dabs(dx(1))
do 30 i = 2,n
xmag = dabs(dx(i))
if(xmag.le.dmax) go to 30
idamax = i
dmax = xmag
30 continue
return
end