File:  [local] / rpl / lapack / blas / dznrm2.f
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Fri Aug 13 21:03:41 2010 UTC (13 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_19, rpl-4_0_18, HEAD
Patches pour OS/2

    1:       DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX)
    2: *     .. Scalar Arguments ..
    3:       INTEGER INCX,N
    4: *     ..
    5: *     .. Array Arguments ..
    6:       DOUBLE COMPLEX X(*)
    7: *     ..
    8: *
    9: *  Purpose
   10: *  =======
   11: *
   12: *  DZNRM2 returns the euclidean norm of a vector via the function
   13: *  name, so that
   14: *
   15: *     DZNRM2 := sqrt( conjg( x' )*x )
   16: *
   17: *  Further Details
   18: *  ===============
   19: *
   20: *  -- This version written on 25-October-1982.
   21: *     Modified on 14-October-1993 to inline the call to ZLASSQ.
   22: *     Sven Hammarling, Nag Ltd.
   23: *
   24: *  =====================================================================
   25: *
   26: *     .. Parameters ..
   27:       DOUBLE PRECISION ONE,ZERO
   28:       PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
   29: *     ..
   30: *     .. Local Scalars ..
   31:       DOUBLE PRECISION NORM,SCALE,SSQ,TEMP
   32:       INTEGER IX
   33: *     ..
   34: *     .. Intrinsic Functions ..
   35:       INTRINSIC ABS,DBLE,DIMAG,SQRT
   36: *     ..
   37:       IF (N.LT.1 .OR. INCX.LT.1) THEN
   38:           NORM = ZERO
   39:       ELSE
   40:           SCALE = ZERO
   41:           SSQ = ONE
   42: *        The following loop is equivalent to this call to the LAPACK
   43: *        auxiliary routine:
   44: *        CALL ZLASSQ( N, X, INCX, SCALE, SSQ )
   45: *
   46:           DO 10 IX = 1,1 + (N-1)*INCX,INCX
   47:               IF (DBLE(X(IX)).NE.ZERO) THEN
   48:                   TEMP = ABS(DBLE(X(IX)))
   49:                   IF (SCALE.LT.TEMP) THEN
   50:                       SSQ = ONE + SSQ* (SCALE/TEMP)**2
   51:                       SCALE = TEMP
   52:                   ELSE
   53:                       SSQ = SSQ + (TEMP/SCALE)**2
   54:                   END IF
   55:               END IF
   56:               IF (DIMAG(X(IX)).NE.ZERO) THEN
   57:                   TEMP = ABS(DIMAG(X(IX)))
   58:                   IF (SCALE.LT.TEMP) THEN
   59:                       SSQ = ONE + SSQ* (SCALE/TEMP)**2
   60:                       SCALE = TEMP
   61:                   ELSE
   62:                       SSQ = SSQ + (TEMP/SCALE)**2
   63:                   END IF
   64:               END IF
   65:    10     CONTINUE
   66:           NORM = SCALE*SQRT(SSQ)
   67:       END IF
   68: *
   69:       DZNRM2 = NORM
   70:       RETURN
   71: *
   72: *     End of DZNRM2.
   73: *
   74:       END

CVSweb interface <joel.bertrand@systella.fr>