+++ /dev/null
-*DECK ENORM
- REAL FUNCTION ENORM (N, X)
-C***BEGIN PROLOGUE ENORM
-C***SUBSIDIARY
-C***PURPOSE Subsidiary to SNLS1, SNLS1E, SNSQ and SNSQE
-C***LIBRARY SLATEC
-C***TYPE SINGLE PRECISION (ENORM-S, DENORM-D)
-C***AUTHOR (UNKNOWN)
-C***DESCRIPTION
-C
-C Given an N-vector X, this function calculates the
-C Euclidean norm of X.
-C
-C The Euclidean norm is computed by accumulating the sum of
-C squares in three different sums. The sums of squares for the
-C small and large components are scaled so that no overflows
-C occur. Non-destructive underflows are permitted. Underflows
-C and overflows do not occur in the computation of the unscaled
-C sum of squares for the intermediate components.
-C The definitions of small, intermediate and large components
-C depend on two constants, RDWARF and RGIANT. The main
-C restrictions on these constants are that RDWARF**2 not
-C underflow and RGIANT**2 not overflow. The constants
-C given here are suitable for every known computer.
-C
-C The function statement is
-C
-C REAL FUNCTION ENORM(N,X)
-C
-C where
-C
-C N is a positive integer input variable.
-C
-C X is an input array of length N.
-C
-C***SEE ALSO SNLS1, SNLS1E, SNSQ, SNSQE
-C***ROUTINES CALLED (NONE)
-C***REVISION HISTORY (YYMMDD)
-C 800301 DATE WRITTEN
-C 890831 Modified array declarations. (WRB)
-C 891214 Prologue converted to Version 4.0 format. (BAB)
-C 900326 Removed duplicate information from DESCRIPTION section.
-C (WRB)
-C 900328 Added TYPE section. (WRB)
-C***END PROLOGUE ENORM
- INTEGER N
- REAL X(*)
- INTEGER I
- REAL AGIANT,FLOATN,ONE,RDWARF,RGIANT,S1,S2,S3,XABS,X1MAX,X3MAX,
- 1 ZERO
- SAVE ONE, ZERO, RDWARF, RGIANT
- DATA ONE,ZERO,RDWARF,RGIANT /1.0E0,0.0E0,3.834E-20,1.304E19/
-C***FIRST EXECUTABLE STATEMENT ENORM
- S1 = ZERO
- S2 = ZERO
- S3 = ZERO
- X1MAX = ZERO
- X3MAX = ZERO
- FLOATN = N
- AGIANT = RGIANT/FLOATN
- DO 90 I = 1, N
- XABS = ABS(X(I))
- IF (XABS .GT. RDWARF .AND. XABS .LT. AGIANT) GO TO 70
- IF (XABS .LE. RDWARF) GO TO 30
-C
-C SUM FOR LARGE COMPONENTS.
-C
- IF (XABS .LE. X1MAX) GO TO 10
- S1 = ONE + S1*(X1MAX/XABS)**2
- X1MAX = XABS
- GO TO 20
- 10 CONTINUE
- S1 = S1 + (XABS/X1MAX)**2
- 20 CONTINUE
- GO TO 60
- 30 CONTINUE
-C
-C SUM FOR SMALL COMPONENTS.
-C
- IF (XABS .LE. X3MAX) GO TO 40
- S3 = ONE + S3*(X3MAX/XABS)**2
- X3MAX = XABS
- GO TO 50
- 40 CONTINUE
- IF (XABS .NE. ZERO) S3 = S3 + (XABS/X3MAX)**2
- 50 CONTINUE
- 60 CONTINUE
- GO TO 80
- 70 CONTINUE
-C
-C SUM FOR INTERMEDIATE COMPONENTS.
-C
- S2 = S2 + XABS**2
- 80 CONTINUE
- 90 CONTINUE
-C
-C CALCULATION OF NORM.
-C
- IF (S1 .EQ. ZERO) GO TO 100
- ENORM = X1MAX*SQRT(S1+(S2/X1MAX)/X1MAX)
- GO TO 130
- 100 CONTINUE
- IF (S2 .EQ. ZERO) GO TO 110
- IF (S2 .GE. X3MAX)
- 1 ENORM = SQRT(S2*(ONE+(X3MAX/S2)*(X3MAX*S3)))
- IF (S2 .LT. X3MAX)
- 1 ENORM = SQRT(X3MAX*((S2/X3MAX)+(X3MAX*S3)))
- GO TO 120
- 110 CONTINUE
- ENORM = X3MAX*SQRT(S3)
- 120 CONTINUE
- 130 CONTINUE
- RETURN
-C
-C LAST CARD OF FUNCTION ENORM.
-C
- END