123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- *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
|