141 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
*> \brief \b SCNRM2
 | 
						|
*
 | 
						|
*  =========== DOCUMENTATION ===========
 | 
						|
*
 | 
						|
* Online html documentation available at
 | 
						|
*            http://www.netlib.org/lapack/explore-html/
 | 
						|
*
 | 
						|
*  Definition:
 | 
						|
*  ===========
 | 
						|
*
 | 
						|
*       REAL FUNCTION SCNRM2(N,X,INCX)
 | 
						|
*
 | 
						|
*       .. Scalar Arguments ..
 | 
						|
*       INTEGER INCX,N
 | 
						|
*       ..
 | 
						|
*       .. Array Arguments ..
 | 
						|
*       COMPLEX X(*)
 | 
						|
*       ..
 | 
						|
*
 | 
						|
*
 | 
						|
*> \par Purpose:
 | 
						|
*  =============
 | 
						|
*>
 | 
						|
*> \verbatim
 | 
						|
*>
 | 
						|
*> SCNRM2 returns the euclidean norm of a vector via the function
 | 
						|
*> name, so that
 | 
						|
*>
 | 
						|
*>    SCNRM2 := sqrt( x**H*x )
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Arguments:
 | 
						|
*  ==========
 | 
						|
*
 | 
						|
*> \param[in] N
 | 
						|
*> \verbatim
 | 
						|
*>          N is INTEGER
 | 
						|
*>         number of elements in input vector(s)
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] X
 | 
						|
*> \verbatim
 | 
						|
*>          X is COMPLEX array, dimension (N)
 | 
						|
*>         complex vector with N elements
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] INCX
 | 
						|
*> \verbatim
 | 
						|
*>          INCX is INTEGER
 | 
						|
*>         storage spacing between elements of X
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Authors:
 | 
						|
*  ========
 | 
						|
*
 | 
						|
*> \author Univ. of Tennessee
 | 
						|
*> \author Univ. of California Berkeley
 | 
						|
*> \author Univ. of Colorado Denver
 | 
						|
*> \author NAG Ltd.
 | 
						|
*
 | 
						|
*> \date November 2017
 | 
						|
*
 | 
						|
*> \ingroup single_blas_level1
 | 
						|
*
 | 
						|
*> \par Further Details:
 | 
						|
*  =====================
 | 
						|
*>
 | 
						|
*> \verbatim
 | 
						|
*>
 | 
						|
*>  -- This version written on 25-October-1982.
 | 
						|
*>     Modified on 14-October-1993 to inline the call to CLASSQ.
 | 
						|
*>     Sven Hammarling, Nag Ltd.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*  =====================================================================
 | 
						|
      REAL FUNCTION SCNRM2(N,X,INCX)
 | 
						|
*
 | 
						|
*  -- Reference BLAS level1 routine (version 3.8.0) --
 | 
						|
*  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
 | 
						|
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 | 
						|
*     November 2017
 | 
						|
*
 | 
						|
*     .. Scalar Arguments ..
 | 
						|
      INTEGER INCX,N
 | 
						|
*     ..
 | 
						|
*     .. Array Arguments ..
 | 
						|
      COMPLEX X(*)
 | 
						|
*     ..
 | 
						|
*
 | 
						|
*  =====================================================================
 | 
						|
*
 | 
						|
*     .. Parameters ..
 | 
						|
      REAL ONE,ZERO
 | 
						|
      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
 | 
						|
*     ..
 | 
						|
*     .. Local Scalars ..
 | 
						|
      REAL NORM,SCALE,SSQ,TEMP
 | 
						|
      INTEGER IX
 | 
						|
*     ..
 | 
						|
*     .. Intrinsic Functions ..
 | 
						|
      INTRINSIC ABS,AIMAG,REAL,SQRT
 | 
						|
*     ..
 | 
						|
      IF (N.LT.1 .OR. INCX.LT.1) THEN
 | 
						|
          NORM = ZERO
 | 
						|
      ELSE
 | 
						|
          SCALE = ZERO
 | 
						|
          SSQ = ONE
 | 
						|
*        The following loop is equivalent to this call to the LAPACK
 | 
						|
*        auxiliary routine:
 | 
						|
*        CALL CLASSQ( N, X, INCX, SCALE, SSQ )
 | 
						|
*
 | 
						|
          DO 10 IX = 1,1 + (N-1)*INCX,INCX
 | 
						|
              IF (REAL(X(IX)).NE.ZERO) THEN
 | 
						|
                  TEMP = ABS(REAL(X(IX)))
 | 
						|
                  IF (SCALE.LT.TEMP) THEN
 | 
						|
                      SSQ = ONE + SSQ* (SCALE/TEMP)**2
 | 
						|
                      SCALE = TEMP
 | 
						|
                  ELSE
 | 
						|
                      SSQ = SSQ + (TEMP/SCALE)**2
 | 
						|
                  END IF
 | 
						|
              END IF
 | 
						|
              IF (AIMAG(X(IX)).NE.ZERO) THEN
 | 
						|
                  TEMP = ABS(AIMAG(X(IX)))
 | 
						|
                  IF (SCALE.LT.TEMP) THEN
 | 
						|
                      SSQ = ONE + SSQ* (SCALE/TEMP)**2
 | 
						|
                      SCALE = TEMP
 | 
						|
                  ELSE
 | 
						|
                      SSQ = SSQ + (TEMP/SCALE)**2
 | 
						|
                  END IF
 | 
						|
              END IF
 | 
						|
   10     CONTINUE
 | 
						|
          NORM = SCALE*SQRT(SSQ)
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      SCNRM2 = NORM
 | 
						|
      RETURN
 | 
						|
*
 | 
						|
*     End of SCNRM2.
 | 
						|
*
 | 
						|
      END
 |