Rev 3403 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
cc takes the sum of the absolute values.c jack dongarra, linpack, 3/11/78.c modified 3/93 to return if incx .le. 0.c modified 12/3/93, array(1) declarations changed to array(*)cdouble precision function dasum(n,dx,incx)double precision dx(*),dtempinteger i,incx,m,mp1,n,nincxcdasum = 0.0d0dtemp = 0.0d0if( n.le.0 .or. incx.le.0 )returnif(incx.ne.1) thencc code for increment not equal to 1cnincx = n*incxdo 10 i = 1,nincx,incxdtemp = dtemp + dabs(dx(i))10 continuedasum = dtempelsecc code for increment equal to 1ccc clean-up loopcm = mod(n,6)if( m .ne. 0 ) thendo 30 i = 1,mdtemp = dtemp + dabs(dx(i))30 continueif( n .lt. 6 ) go to 60endifmp1 = m + 1do 50 i = mp1,n,6dtemp = dtemp + dabs(dx(i)) + dabs(dx(i + 1)) +& dabs(dx(i + 2))+ dabs(dx(i + 3)) +& dabs(dx(i + 4))+ dabs(dx(i + 5))50 continue60 dasum = dtempendifreturnendcc constant times a vector plus a vector.c uses unrolled loops for increments equal to one.c jack dongarra, linpack, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine daxpy(n,da,dx,incx,dy,incy)double precision dx(*),dy(*),dainteger i,incx,incy,ix,iy,m,mp1,ncif(n.le.0)returnif (da .eq. 0.0d0) returnif(incx.eq.1.and.incy.eq.1)go to 20cc code for unequal increments or equal incrementsc not equal to 1cix = 1iy = 1if(incx.lt.0)ix = (-n+1)*incx + 1if(incy.lt.0)iy = (-n+1)*incy + 1do 10 i = 1,ndy(iy) = dy(iy) + da*dx(ix)ix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1ccc clean-up loopc20 m = mod(n,4)if( m .eq. 0 ) go to 40do 30 i = 1,mdy(i) = dy(i) + da*dx(i)30 continueif( n .lt. 4 ) return40 mp1 = m + 1do 50 i = mp1,n,4dy(i) = dy(i) + da*dx(i)dy(i + 1) = dy(i + 1) + da*dx(i + 1)dy(i + 2) = dy(i + 2) + da*dx(i + 2)dy(i + 3) = dy(i + 3) + da*dx(i + 3)50 continuereturnendcc copies a vector, x, to a vector, y.c uses unrolled loops for increments equal to one.c jack dongarra, linpack, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine dcopy(n,dx,incx,dy,incy)double precision dx(*),dy(*)integer i,incx,incy,ix,iy,m,mp1,ncif(n.le.0)returnif(incx.eq.1.and.incy.eq.1)go to 20cc code for unequal increments or equal incrementsc not equal to 1cix = 1iy = 1if(incx.lt.0)ix = (-n+1)*incx + 1if(incy.lt.0)iy = (-n+1)*incy + 1do 10 i = 1,ndy(iy) = dx(ix)ix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1ccc clean-up loopc20 m = mod(n,7)if( m .eq. 0 ) go to 40do 30 i = 1,mdy(i) = dx(i)30 continueif( n .lt. 7 ) return40 mp1 = m + 1do 50 i = mp1,n,7dy(i) = dx(i)dy(i + 1) = dx(i + 1)dy(i + 2) = dx(i + 2)dy(i + 3) = dx(i + 3)dy(i + 4) = dx(i + 4)dy(i + 5) = dx(i + 5)dy(i + 6) = dx(i + 6)50 continuereturnendcc forms the dot product of two vectors.c uses unrolled loops for increments equal to one.c jack dongarra, linpack, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)cdouble precision function ddot(n,dx,incx,dy,incy)double precision dx(*),dy(*),dtempinteger i,incx,incy,ix,iy,m,mp1,ncddot = 0.0d0dtemp = 0.0d0if(n.le.0)returnif(incx.eq.1.and.incy.eq.1)go to 20cc code for unequal increments or equal incrementsc not equal to 1cix = 1iy = 1if(incx.lt.0)ix = (-n+1)*incx + 1if(incy.lt.0)iy = (-n+1)*incy + 1do 10 i = 1,ndtemp = dtemp + dx(ix)*dy(iy)ix = ix + incxiy = iy + incy10 continueddot = dtempreturncc code for both increments equal to 1cc clean-up loopc20 m = mod(n,5)if( m .eq. 0 ) go to 40do 30 i = 1,mdtemp = dtemp + dx(i)*dy(i)30 continueif( n .lt. 5 ) go to 6040 mp1 = m + 1do 50 i = mp1,n,5dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) +* dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)50 continue60 ddot = dtempreturnendcc smach computes machine parameters of floating pointc arithmetic for use in testing only. not required byc linpack proper.cc if trouble with automatic computation of these quantities,c they can be set by direct assignment statements.c assume the computer hascc b = base of arithmeticc t = number of base b digitsc l = smallest possible exponentc u = largest possible exponentcc thencc eps = b**(1-t)c tiny = 100.0*b**(-l+t)c huge = 0.01*b**(u-t)cc dmach same as smach except t, l, u apply toc double precision.cc cmach same as smach except if complex divisionc is done bycc 1/(x+i*y) = (x-i*y)/(x**2+y**2)cc thencc tiny = sqrt(tiny)c huge = sqrt(huge)ccc job is 1, 2 or 3 for epsilon, tiny and huge, respectively.cdouble precision function dmach(job)integer jobdouble precision eps,tiny,huge,sceps = 1.0d010 eps = eps/2.0d0s = 1.0d0 + epsif (s .gt. 1.0d0) go to 10eps = 2.0d0*epscs = 1.0d020 tiny = ss = s/16.0d0if (s*1.0 .ne. 0.0d0) go to 20tiny = (tiny/eps)*100.0huge = 1.0d0/tinycdmach = 0.0d0if (job .eq. 1) dmach = epsif (job .eq. 2) dmach = tinyif (job .eq. 3) dmach = hugereturnend** dnrm2() returns the euclidean norm of a vector via the function* name, so that** dnrm2 := sqrt( x'*x )*** -- This version written on 25-October-1982.* Modified on 14-October-1993 to inline the call to DLASSQ.* Sven Hammarling, Nag Ltd.**double precision function dnrm2 ( n, x, incx )* .. scalar arguments ..integer incx, n* .. array arguments ..double precision x( * )* .. parameters ..double precision one , zeroparameter ( one = 1.0d+0, zero = 0.0d+0 )* .. local scalars ..integer ixdouble precision absxi, norm, scale, ssq* .. intrinsic functions ..intrinsic abs, sqrt* ..* .. executable statements ..if( n.lt.1 .or. incx.lt.1 )thennorm = zeroelse if( n.eq.1 )thennorm = abs( x( 1 ) )elsescale = zerossq = one* the following loop is equivalent to this call to the lapack* auxiliary routine:* call dlassq( n, x, incx, scale, ssq )*do 10, ix = 1, 1 + ( n - 1 )*incx, incxif( x( ix ).ne.zero )thenabsxi = abs( x( ix ) )if( scale.lt.absxi )thenssq = one + ssq*( scale/absxi )**2scale = absxielsessq = ssq + ( absxi/scale )**2end ifend if10 continuenorm = scale * sqrt( ssq )end if*dnrm2 = normreturnend* end of dnrm2.cc applies a plane rotation.c jack dongarra, linpack, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine drot (n,dx,incx,dy,incy,c,s)double precision dx(*),dy(*),dtemp,c,sinteger i,incx,incy,ix,iy,ncif(n.le.0)returnif(incx.eq.1.and.incy.eq.1)go to 20cc code for unequal increments or equal increments not equalc to 1cix = 1iy = 1if(incx.lt.0)ix = (-n+1)*incx + 1if(incy.lt.0)iy = (-n+1)*incy + 1do 10 i = 1,ndtemp = c*dx(ix) + s*dy(iy)dy(iy) = c*dy(iy) - s*dx(ix)dx(ix) = dtempix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1c20 do 30 i = 1,ndtemp = c*dx(i) + s*dy(i)dy(i) = c*dy(i) - s*dx(i)dx(i) = dtemp30 continuereturnendcc construct givens plane rotation.c jack dongarra, linpack, 3/11/78.csubroutine drotg(da,db,c,s)double precision da,db,c,s,roe,scale,r,zcroe = dbif( dabs(da) .gt. dabs(db) ) roe = dascale = dabs(da) + dabs(db)if( scale .ne. 0.0d0 ) go to 10c = 1.0d0s = 0.0d0r = 0.0d0z = 0.0d0go to 2010 r = scale*dsqrt((da/scale)**2 + (db/scale)**2)r = dsign(1.0d0,roe)*rc = da/rs = db/rz = 1.0d0if( dabs(da) .gt. dabs(db) ) z = sif( dabs(db) .ge. dabs(da) .and. c .ne. 0.0d0 ) z = 1.0d0/c20 da = rdb = zreturnendcc scales a vector by a constant.c uses unrolled loops for increment equal to one.c jack dongarra, linpack, 3/11/78.c modified 3/93 to return if incx .le. 0.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine dscal(n,da,dx,incx)double precision da,dx(*)integer i,incx,m,mp1,n,nincxcif( n.le.0 .or. incx.le.0 )returnif(incx.eq.1)go to 20cc code for increment not equal to 1cnincx = n*incxdo 10 i = 1,nincx,incxdx(i) = da*dx(i)10 continuereturncc code for increment equal to 1ccc clean-up loopc20 m = mod(n,5)if( m .eq. 0 ) go to 40do 30 i = 1,mdx(i) = da*dx(i)30 continueif( n .lt. 5 ) return40 mp1 = m + 1do 50 i = mp1,n,5dx(i) = da*dx(i)dx(i + 1) = da*dx(i + 1)dx(i + 2) = da*dx(i + 2)dx(i + 3) = da*dx(i + 3)dx(i + 4) = da*dx(i + 4)50 continuereturnendcc interchanges two vectors.c uses unrolled loops for increments equal one.c jack dongarra, linpack, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine dswap (n,dx,incx,dy,incy)double precision dx(*),dy(*),dtempinteger i,incx,incy,ix,iy,m,mp1,ncif(n.le.0)returnif(incx.eq.1.and.incy.eq.1)go to 20cc code for unequal increments or equal increments not equalc to 1cix = 1iy = 1if(incx.lt.0)ix = (-n+1)*incx + 1if(incy.lt.0)iy = (-n+1)*incy + 1do 10 i = 1,ndtemp = dx(ix)dx(ix) = dy(iy)dy(iy) = dtempix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1cc clean-up loopc20 m = mod(n,3)if( m .eq. 0 ) go to 40do 30 i = 1,mdtemp = dx(i)dx(i) = dy(i)dy(i) = dtemp30 continueif( n .lt. 3 ) return40 mp1 = m + 1do 50 i = mp1,n,3dtemp = dx(i)dx(i) = dy(i)dy(i) = dtempdtemp = dx(i + 1)dx(i + 1) = dy(i + 1)dy(i + 1) = dtempdtemp = dx(i + 2)dx(i + 2) = dy(i + 2)dy(i + 2) = dtemp50 continuereturnendcc finds the index of element having max. absolute value.c jack dongarra, linpack, 3/11/78.c modified 3/93 to return if incx .le. 0.c modified 12/3/93, array(1) declarations changed to array(*)cinteger function idamax(n,dx,incx)double precision dx(*),dmaxinteger i,incx,ix,ncidamax = 0if( n.lt.1 .or. incx.le.0 ) returnidamax = 1if(n.eq.1)returnif(incx.eq.1)go to 20cc code for increment not equal to 1cix = 1dmax = dabs(dx(1))ix = ix + incxdo 10 i = 2,nif(dabs(dx(ix)).gt.dmax)thenidamax = idmax = dabs(dx(ix))endifix = ix + incx10 continuereturncc code for increment equal to 1c20 dmax = dabs(dx(1))do 30 i = 2,nif(dabs(dx(i)).le.dmax) go to 30idamax = idmax = dabs(dx(i))30 continuereturnend