Rev 6098 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
cc takes the sum of the absolute values.c jack dongarra, 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 dzasum(n,zx,incx)double complex zx(*)double precision stemp,absinteger i,incx,ix,ncdzasum = 0.0d0stemp = 0.0d0if( n.le.0 .or. incx.le.0 )returnif(incx.eq.1)go to 20cc code for increment not equal to 1cix = 1do 10 i = 1,nstemp = stemp + abs(zx(ix))ix = ix + incx10 continuedzasum = stempreturncc code for increment equal to 1c20 do 30 i = 1,nstemp = stemp + abs(zx(i))30 continuedzasum = stempreturnend** DZNRM2 returns the euclidean norm of a vector via the function* name, so that** DZNRM2 := sqrt( conjg( x' )*x )**** -- This version written on 25-October-1982.* Modified on 14-October-1993 to inline the call to ZLASSQ.* Sven Hammarling, Nag Ltd.**DOUBLE PRECISION FUNCTION DZNRM2( N, X, INCX )* .. Scalar Arguments ..INTEGER INCX, N* .. Array Arguments ..DOUBLE COMPLEX X( * )* ..* .. Parameters ..DOUBLE PRECISION ONE , ZEROPARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )* .. Local Scalars ..INTEGER IXDOUBLE PRECISION NORM, SCALE, SSQ, TEMP* .. Intrinsic Functions ..INTRINSIC ABS, DIMAG, DBLE, SQRT* ..* .. Executable Statements ..IF( N.LT.1 .OR. INCX.LT.1 )THENNORM = ZEROELSESCALE = ZEROSSQ = ONE* The following loop is equivalent to this call to the LAPACK* auxiliary routine:* CALL ZLASSQ( N, X, INCX, SCALE, SSQ )*DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCXIF( DBLE( X( IX ) ).NE.ZERO )THENTEMP = ABS( DBLE( X( IX ) ) )IF( SCALE.LT.TEMP )THENSSQ = ONE + SSQ*( SCALE/TEMP )**2SCALE = TEMPELSESSQ = SSQ + ( TEMP/SCALE )**2END IFEND IFIF( DIMAG( X( IX ) ).NE.ZERO )THENTEMP = ABS( DIMAG( X( IX ) ) )IF( SCALE.LT.TEMP )THENSSQ = ONE + SSQ*( SCALE/TEMP )**2SCALE = TEMPELSESSQ = SSQ + ( TEMP/SCALE )**2END IFEND IF10 CONTINUENORM = SCALE * SQRT( SSQ )END IF*DZNRM2 = NORMRETURNENDcc finds the index of element having max. absolute value.c jack dongarra, 1/15/85.c modified 3/93 to return if incx .le. 0.c modified 12/3/93, array(1) declarations changed to array(*)cinteger function izamax(n,zx,incx)double complex zx(*)double precision smaxinteger i,incx,ix,ncizamax = 0if( n.lt.1 .or. incx.le.0 )returnizamax = 1if(n.eq.1)returnif(incx.eq.1)go to 20cc code for increment not equal to 1cix = 1smax = abs(zx(1))ix = ix + incxdo 10 i = 2,nif(abs(zx(ix)).le.smax) go to 5izamax = ismax = abs(zx(ix))5 ix = ix + incx10 continuereturncc code for increment equal to 1c20 smax = abs(zx(1))do 30 i = 2,nif(abs(zx(i)).le.smax) go to 30izamax = ismax = abs(zx(i))30 continuereturnendcc constant times a vector plus a vector.c jack dongarra, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine zaxpy(n,za,zx,incx,zy,incy)double complex zx(*),zy(*),zainteger i,incx,incy,ix,iy,ndouble precision absif(n.le.0)returnif (abs(za) .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,nzy(iy) = zy(iy) + za*zx(ix)ix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1c20 do 30 i = 1,nzy(i) = zy(i) + za*zx(i)30 continuereturnendcc copies a vector, x, to a vector, y.c jack dongarra, linpack, 4/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine zcopy(n,zx,incx,zy,incy)double complex zx(*),zy(*)integer 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 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,nzy(iy) = zx(ix)ix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 1c20 do 30 i = 1,nzy(i) = zx(i)30 continuereturnendcc forms the dot product of a vector.c jack dongarra, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)cdouble complex function zdotc(n,zx,incx,zy,incy)double complex zx(*),zy(*),ztempinteger i,incx,incy,ix,iy,nztemp = (0.0d0,0.0d0)zdotc = (0.0d0,0.0d0)if(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,nztemp = ztemp + conjg(zx(ix))*zy(iy)ix = ix + incxiy = iy + incy10 continuezdotc = ztempreturncc code for both increments equal to 1c20 do 30 i = 1,nztemp = ztemp + conjg(zx(i))*zy(i)30 continuezdotc = ztempreturnendcc forms the dot product of two vectors.c jack dongarra, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)cdouble complex function zdotu(n,zx,incx,zy,incy)double complex zx(*),zy(*),ztempinteger i,incx,incy,ix,iy,nztemp = (0.0d0,0.0d0)zdotu = (0.0d0,0.0d0)if(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,nztemp = ztemp + zx(ix)*zy(iy)ix = ix + incxiy = iy + incy10 continuezdotu = ztempreturncc code for both increments equal to 1c20 do 30 i = 1,nztemp = ztemp + zx(i)*zy(i)30 continuezdotu = ztempreturnendcc scales a vector by a constant.c jack dongarra, 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 zdscal(n,da,zx,incx)double complex zx(*)double precision dainteger i,incx,ix,ncif( n.le.0 .or. incx.le.0 )returnif(incx.eq.1)go to 20cc code for increment not equal to 1cix = 1do 10 i = 1,nzx(ix) = dcmplx(da,0.0d0)*zx(ix)ix = ix + incx10 continuereturncc code for increment equal to 1c20 do 30 i = 1,nzx(i) = dcmplx(da,0.0d0)*zx(i)30 continuereturnendsubroutine zrotg(ca,cb,c,s)double complex ca,cb,sdouble precision cdouble precision norm,scaledouble complex alphaif (abs(ca) .ne. 0.0d0) go to 10c = 0.0d0s = (1.0d0,0.0d0)ca = cbgo to 2010 continuescale = abs(ca) + abs(cb)norm = scale*dsqrt((abs(ca/cmplx(scale,0.0d0)))**2 +* (abs(cb/cmplx(scale,0.0d0)))**2)alpha = ca /abs(ca)c = abs(ca) / norms = alpha * conjg(cb) / normca = alpha * norm20 continuereturnendcc scales a vector by a constant.c jack dongarra, 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 zscal(n,za,zx,incx)double complex za,zx(*)integer i,incx,ix,ncif( n.le.0 .or. incx.le.0 )returnif(incx.eq.1)go to 20cc code for increment not equal to 1cix = 1do 10 i = 1,nzx(ix) = za*zx(ix)ix = ix + incx10 continuereturncc code for increment equal to 1c20 do 30 i = 1,nzx(i) = za*zx(i)30 continuereturnendcc interchanges two vectors.c jack dongarra, 3/11/78.c modified 12/3/93, array(1) declarations changed to array(*)csubroutine zswap (n,zx,incx,zy,incy)double complex zx(*),zy(*),ztempinteger 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,nztemp = zx(ix)zx(ix) = zy(iy)zy(iy) = ztempix = ix + incxiy = iy + incy10 continuereturncc code for both increments equal to 120 do 30 i = 1,nztemp = zx(i)zx(i) = zy(i)zy(i) = ztemp30 continuereturnend