1      real function ran183(ix,iy,iz)
2c
3c     Algorithm AS 183 Appl. Statist. (1982) vol.31, no.2
4c
5c     Returns a pseudo-random number rectangularly distributed
6c     between 0 and 1.   The cycle length is 6.95E+12 (See page 123
7c     of Applied Statistics (1984) vol.33), not as claimed in the
8c     original article.
9c
10c     IX, IY and IZ should be set to integer values between 1 and
11c     30000 before the first entry.
12c
13c     Integer arithmetic up to 30323 is required.
14c
15      integer ix, iy, iz
16c
17      ix = 171 * mod(ix, 177) - 2 * (ix / 177)
18      iy = 172 * mod(iy, 176) - 35 * (iy / 176)
19      iz = 170 * mod(iz, 178) - 63 * (iz / 178)
20c
21      if (ix .lt. 0) ix = ix + 30269
22      if (iy .lt. 0) iy = iy + 30307
23      if (iz .lt. 0) iz = iz + 30323
24c
25c     If integer arithmetic up to 5212632 is available, the preceding
26c     6 statements may be replaced by:
27c
28c     ix = mod(171 * ix, 30269)
29c     iy = mod(172 * iy, 30307)
30c     iz = mod(170 * iz, 30323)
31c
32      ran183 = mod(float(ix) / 30269. + float(iy) / 30307. +
33     +                        float(iz) / 30323., 1.0)
34      return
35      end
36      FUNCTION RANDDP(R)
37CCCCC RENAME TO AVOID CONFLICT WITH INTRINSIC RAND FUNCTION
38CCCCC FUNCTION RAND(R)
39C***BEGIN PROLOGUE  RAND
40C***DATE WRITTEN   770401   (YYMMDD)
41C***REVISION DATE  820801   (YYMMDD)
42C***CATEGORY NO.  L6A21
43C***KEYWORDS  RANDOM NUMBER,SPECIAL FUNCTION,UNIFORM
44C***AUTHOR  FULLERTON, W., (LANL)
45C***PURPOSE  Generates a uniformly distributed random number.
46C***DESCRIPTION
47C
48C      This pseudo-random number generator is portable among a wide
49C variety of computers.  RAND(R) undoubtedly is not as good as many
50C readily available installation dependent versions, and so this
51C routine is not recommended for widespread usage.  Its redeeming
52C feature is that the exact same random numbers (to within final round-
53C off error) can be generated from machine to machine.  Thus, programs
54C that make use of random numbers can be easily transported to and
55C checked in a new environment.
56C      The random numbers are generated by the linear congruential
57C method described, e.g., by Knuth in Seminumerical Methods (p.9),
58C Addison-Wesley, 1969.  Given the I-th number of a pseudo-random
59C sequence, the I+1 -st number is generated from
60C             X(I+1) = (A*X(I) + C) MOD M,
61C where here M = 2**22 = 4194304, C = 1731 and several suitable values
62C of the multiplier A are discussed below.  Both the multiplier A and
63C random number X are represented in double precision as two 11-bit
64C words.  The constants are chosen so that the period is the maximum
65C possible, 4194304.
66C      In order that the same numbers be generated from machine to
67C machine, it is necessary that 23-bit integers be reducible modulo
68C 2**11 exactly, that 23-bit integers be added exactly, and that 11-bit
69C integers be multiplied exactly.  Furthermore, if the restart option
70C is used (where R is between 0 and 1), then the product R*2**22 =
71C R*4194304 must be correct to the nearest integer.
72C      The first four random numbers should be .0004127026,
73C .6750836372, .1614754200, and .9086198807.  The tenth random number
74C is .5527787209, and the hundredth is .3600893021 .  The thousandth
75C number should be .2176990509 .
76C      In order to generate several effectively independent sequences
77C with the same generator, it is necessary to know the random number
78C for several widely spaced calls.  The I-th random number times 2**22,
79C where I=K*P/8 and P is the period of the sequence (P = 2**22), is
80C still of the form L*P/8.  In particular we find the I-th random
81C number multiplied by 2**22 is given by
82C I   =  0  1*P/8  2*P/8  3*P/8  4*P/8  5*P/8  6*P/8  7*P/8  8*P/8
83C RAND=  0  5*P/8  2*P/8  7*P/8  4*P/8  1*P/8  6*P/8  3*P/8  0
84C Thus the 4*P/8 = 2097152 random number is 2097152/2**22.
85C      Several multipliers have been subjected to the spectral test
86C (see Knuth, p. 82).  Four suitable multipliers roughly in order of
87C goodness according to the spectral test are
88C    3146757 = 1536*2048 + 1029 = 2**21 + 2**20 + 2**10 + 5
89C    2098181 = 1024*2048 + 1029 = 2**21 + 2**10 + 5
90C    3146245 = 1536*2048 +  517 = 2**21 + 2**20 + 2**9 + 5
91C    2776669 = 1355*2048 + 1629 = 5**9 + 7**7 + 1
92C
93C      In the table below LOG10(NU(I)) gives roughly the number of
94C random decimal digits in the random numbers considered I at a time.
95C C is the primary measure of goodness.  In both cases bigger is better.
96C
97C                   LOG10 NU(I)              C(I)
98C       A       I=2  I=3  I=4  I=5    I=2  I=3  I=4  I=5
99C
100C    3146757    3.3  2.0  1.6  1.3    3.1  1.3  4.6  2.6
101C    2098181    3.3  2.0  1.6  1.2    3.2  1.3  4.6  1.7
102C    3146245    3.3  2.2  1.5  1.1    3.2  4.2  1.1  0.4
103C    2776669    3.3  2.1  1.6  1.3    2.5  2.0  1.9  2.6
104C   Best
105C    Possible   3.3  2.3  1.7  1.4    3.6  5.9  9.7  14.9
106C
107C             Input Argument --
108C R      If R=0., the next random number of the sequence is generated.
109C        If R .LT. 0., the last generated number will be returned for
110C          possible use in a restart procedure.
111C        If R .GT. 0., the sequence of random numbers will start with
112C          the seed R mod 1.  This seed is also returned as the value of
113C          RAND provided the arithmetic is done exactly.
114C
115C             Output Value --
116C RAND   a pseudo-random number between 0. and 1.
117C***REFERENCES  (NONE)
118C***ROUTINES CALLED  (NONE)
119C***END PROLOGUE  RAND
120      DATA IA1, IA0, IA1MA0 /1536, 1029, 507/
121      DATA IC /1731/
122      DATA IX1, IX0 /0, 0/
123C***FIRST EXECUTABLE STATEMENT  RAND
124      IF (R.LT.0.) GO TO 10
125      IF (R.GT.0.) GO TO 20
126C
127C           A*X = 2**22*IA1*IX1 + 2**11*(IA1*IX1 + (IA1-IA0)*(IX0-IX1)
128C                   + IA0*IX0) + IA0*IX0
129C
130      IY0 = IA0*IX0
131      IY1 = IA1*IX1 + IA1MA0*(IX0-IX1) + IY0
132      IY0 = IY0 + IC
133      IX0 = MOD (IY0, 2048)
134      IY1 = IY1 + (IY0-IX0)/2048
135      IX1 = MOD (IY1, 2048)
136C
137 10   RANDDP = IX1*2048 + IX0
138      RANDDP = RANDDP / 4194304.
139      RETURN
140C
141 20   IX1 = INT(AMOD(R,1.)*4194304. + 0.5)
142      IX0 = MOD (IX1, 2048)
143      IX1 = (IX1-IX0)/2048
144      GO TO 10
145C
146      END
147      SUBROUTINE RANERR(X,Y,N,IWRITE,TEMP1,MAXNXT,YOUT,
148     1                  IBUGA3,ISUBRO,IERROR)
149C
150C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE RANDOM ERROR
151C              QUANTITY BETWEEN TWO SETS OF DATA.  THE RANDOM ERROR
152C              QUANTITY IS DEFINED AS:
153C
154C                 [(X(i) - Y(i) - (Xmed - Ymed)]
155C
156C              BETWEEN THE 2 SETS OF DATA IN THE INPUT VECTORS X AND Y.
157C              THE SAMPLE RANDOM ERROR QUANTITY WILL BE A SINGLE
158C              PRECISION VALUE.
159C
160C              NOTE THAT THE X AND Y VALUES ARE PAIRED.  THE
161C              RANDOM ERROR QUANTITY IS USED IN TWO SAMPLE
162C              PROFICENCY STUDIES.
163C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
164C                                (UNSORTED) OBSERVATIONS
165C                                WHICH CONSTITUTE THE FIRST SET
166C                                OF DATA.
167C                     --Y      = THE SINGLE PRECISION VECTOR OF
168C                                (UNSORTED) OBSERVATIONS
169C                                WHICH CONSTITUTE THE SECOND SET
170C                                OF DATA.
171C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
172C                                IN THE VECTOR X, OR EQUIVALENTLY,
173C                                THE INTEGER NUMBER OF OBSERVATIONS
174C                                IN THE VECTOR Y.
175C     OUTPUT ARGUMENTS--YOUT   = THE SINGLE PRECISION VECTOR OF THE
176C                                COMPUTED SAMPLE RANDOM ERROR QUANTITIES
177C                                BETWEEN THE 2 SETS OF DATA
178C                                IN THE INPUT VECTORS X AND Y.
179C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
180C             SAMPLE RANDOM ERROR QUANTITIESY BETWEEN THE 2 SETS
181C             OF DATA IN THE INPUT VECTORS X AND Y.
182C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
183C                   OF N FOR THIS SUBROUTINE.
184C     OTHER DATAPAC   SUBROUTINES NEEDED--MEDIAN.
185C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
186C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
187C     LANGUAGE--ANSI FORTRAN (1977)
188C     REFERENCES--"Standard Practice for Statistical Analysis of
189C                 One-Sample and Two-Sample Interlaboratory Proficiency
190C                 Testing Programs", 2006, ASTM International, 100 Barr
191C                 Harbor Drive, PO BOX C700, West Conshohoceken, PA
192C                 19428-2959, USA.
193C     WRITTEN BY--ALAN HECKERT
194C                 STATISTICAL ENGINEERING DIVISION
195C                 INFORMATION TECHNOLOGY LABORATORY
196C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS
197C                 GAITHERSBURG, MD 20899
198C                 PHONE--301-975-2899
199C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
200C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS.
201C     LANGUAGE--ANSI FORTRAN (1977)
202C     VERSION NUMBER--2014/12
203C     ORIGINAL VERSION--DECEMBER  2014.
204C
205C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
206C
207      CHARACTER*4 IWRITE
208      CHARACTER*4 IBUGA3
209      CHARACTER*4 ISUBRO
210      CHARACTER*4 IERROR
211C
212      CHARACTER*4 ISUBN1
213      CHARACTER*4 ISUBN2
214C
215C---------------------------------------------------------------------
216C
217      DIMENSION X(*)
218      DIMENSION Y(*)
219      DIMENSION TEMP1(*)
220      DIMENSION YOUT(*)
221C
222C-----COMMON----------------------------------------------------------
223C
224      INCLUDE 'DPCOP2.INC'
225C
226C-----START POINT-----------------------------------------------------
227C
228      ISUBN1='RANE'
229      ISUBN2='RR  '
230      IERROR='NO'
231C
232      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NERR')THEN
233        WRITE(ICOUT,999)
234  999   FORMAT(1X)
235        CALL DPWRST('XXX','BUG ')
236        WRITE(ICOUT,51)
237   51   FORMAT('***** AT THE BEGINNING OF RANERR--')
238        CALL DPWRST('XXX','BUG ')
239        WRITE(ICOUT,52)IBUGA3,N
240   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
241        CALL DPWRST('XXX','BUG ')
242        DO55I=1,N
243         WRITE(ICOUT,56)I,X(I),Y(I)
244   56    FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
245         CALL DPWRST('XXX','BUG ')
246   55   CONTINUE
247      ENDIF
248C
249C               *******************************************
250C               **  COMPUTE THE RANDOM ERROR QUANTITY    **
251C               *******************************************
252C
253C               ********************************************
254C               **  STEP 1--                              **
255C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
256C               ********************************************
257C
258      AN=N
259C
260      IF(N.LT.1)THEN
261        IERROR='YES'
262        WRITE(ICOUT,999)
263        CALL DPWRST('XXX','BUG ')
264        WRITE(ICOUT,111)
265  111   FORMAT('***** ERROR IN RANDOM ERROR QUANTITY--')
266        CALL DPWRST('XXX','BUG ')
267        WRITE(ICOUT,112)
268  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
269        CALL DPWRST('XXX','BUG ')
270        WRITE(ICOUT,113)
271  113   FORMAT('      IS LESS THAN 1.')
272        CALL DPWRST('XXX','BUG ')
273        WRITE(ICOUT,117)N
274  117   FORMAT('      THE NUMBER OF OBSERVATIONS HERE = ',I8,'.')
275        CALL DPWRST('XXX','BUG ')
276        GOTO9000
277      ENDIF
278C
279C               ************************************************
280C               **  STEP 2--                                  **
281C               **  COMPUTE THE RANDOM ERROR QUANTITIES.      **
282C               ************************************************
283C
284      CALL MEDIAN(X,N,IWRITE,TEMP1,MAXNXT,XMED,IBUGA3,IERROR)
285      CALL MEDIAN(Y,N,IWRITE,TEMP1,MAXNXT,YMED,IBUGA3,IERROR)
286      XYMED=XMED - YMED
287      DO200I=1,N
288        YOUT(I)=(X(I) - Y(I)) - XYMED
289  200 CONTINUE
290C
291C               *****************
292C               **  STEP 90--  **
293C               **  EXIT.      **
294C               *****************
295C
296 9000 CONTINUE
297      IF(IBUGA3.EQ.'ON')THEN
298        WRITE(ICOUT,999)
299        CALL DPWRST('XXX','BUG ')
300        WRITE(ICOUT,9011)
301 9011   FORMAT('***** AT THE END       OF RANERR--')
302        CALL DPWRST('XXX','BUG ')
303        WRITE(ICOUT,9012)IERROR,XMED,YMED
304 9012   FORMAT('IERROR,XMED,YMED = ',A4,2X,2G15.7)
305        CALL DPWRST('XXX','BUG ')
306        DO9013I=1,N
307          WRITE(ICOUT,9015)I,YOUT(I)
308 9015     FORMAT('I,YOUT(I) = ',I8,2X,G15.7)
309          CALL DPWRST('XXX','BUG ')
310 9013   CONTINUE
311      ENDIF
312C
313      RETURN
314      END
315      SUBROUTINE RANGDP(X,N,IWRITE,XRANGE,IBUGA3,IERROR)
316C
317C     PURPOSE--THIS SUBROUTINE COMPUTES THE
318C              SAMPLE RANGE
319C              OF THE DATA IN THE INPUT VECTOR X.
320C              THE SAMPLE RANGE = SAMPLE MAX - SAMPLE MIN.
321C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
322C                                (UNSORTED OR SORTED) OBSERVATIONS.
323C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
324C                                IN THE VECTOR X.
325C     OUTPUT ARGUMENTS--XRANGE = THE SINGLE PRECISION VALUE OF THE
326C                                COMPUTED SAMPLE RANGE.
327C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
328C             SAMPLE RANGE.
329C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
330C                   OF N FOR THIS SUBROUTINE.
331C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
332C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
333C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
334C     LANGUAGE--ANSI FORTRAN (1977)
335C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
336C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGE 338.
337C               --DAVID, ORDER STATISTICS, 1970, PAGE 10-11.
338C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
339C                 EDITION 6, 1967, PAGE 39.
340C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
341C                 ANALYSIS, EDITION 2, 1957, PAGE 21.
342C     WRITTEN BY--JAMES J. FILLIBEN
343C                 STATISTICAL ENGINEERING DIVISION
344C                 INFORMATION TECHNOLOGY LABORATORY
345C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
346C                 GAITHERSBURG, MD 20899-8980
347C                 PHONE--301-975-2855
348C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
349C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
350C     LANGUAGE--ANSI FORTRAN (1966)
351C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
352C                          DENOTED BY QUOTES RATHER THAN NH.
353C     VERSION NUMBER--82.6
354C     ORIGINAL VERSION--JUNE      1972.
355C     UPDATED         --JUNE      1974.
356C     UPDATED         --APRIL     1975.
357C     UPDATED         --SEPTEMBER 1975.
358C     UPDATED         --NOVEMBER  1975.
359C     UPDATED         --JUNE      1979.
360C     UPDATED         --AUGUST    1981.
361C     UPDATED         --MAY       1982.
362C     UPDATED         --NOVEMBER  2009. RENAME "RANGE" TO "RANGDP".  THIS
363C                                       IS SIMPLY TO AVOID COMPILATION
364C                                       ISSUES WITH VERSION 11 OF THE
365C                                       INTEL COMPILER ON WINDOWS
366C                                       (CONFLICTS WITH INTRINSIC
367C                                       RANGE FUNCTION EVEN IF AN
368C                                       EXTERNAL STATEMENT IS USED)
369C
370C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
371C
372      CHARACTER*4 IWRITE
373      CHARACTER*4 IBUGA3
374      CHARACTER*4 IERROR
375C
376      CHARACTER*4 ISUBN1
377      CHARACTER*4 ISUBN2
378C
379C---------------------------------------------------------------------
380C
381      DIMENSION X(*)
382C
383C---------------------------------------------------------------------
384C
385      INCLUDE 'DPCOP2.INC'
386C
387C-----START POINT-----------------------------------------------------
388C
389      ISUBN1='RANG'
390      ISUBN2='E   '
391      IERROR='NO'
392C
393      XMIN=0.0
394      XMAX=0.0
395C
396      IF(IBUGA3.EQ.'ON')THEN
397        WRITE(ICOUT,999)
398  999   FORMAT(1X)
399        CALL DPWRST('XXX','BUG ')
400        WRITE(ICOUT,51)
401   51   FORMAT('***** AT THE BEGINNING OF RANGE--')
402        CALL DPWRST('XXX','BUG ')
403        WRITE(ICOUT,52)IBUGA3,N
404   52   FORMAT('IBUGA3,N = ',A4,2X,I10)
405        CALL DPWRST('XXX','BUG ')
406        DO55I=1,N
407         WRITE(ICOUT,56)I,X(I)
408   56    FORMAT('I,X(I) = ',I8,G15.7)
409         CALL DPWRST('XXX','BUG ')
410   55   CONTINUE
411      ENDIF
412C
413C               *********************
414C               **  COMPUTE RANGE  **
415C               *********************
416C
417C               ********************************************
418C               **  STEP 1--                              **
419C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
420C               ********************************************
421C
422      AN=N
423C
424      IF(N.LT.1)THEN
425        WRITE(ICOUT,999)
426        CALL DPWRST('XXX','BUG ')
427        WRITE(ICOUT,111)
428  111   FORMAT('***** ERROR IN RANGE--')
429        CALL DPWRST('XXX','BUG ')
430        WRITE(ICOUT,112)
431  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE ',
432     1         'VARIABLE')
433        CALL DPWRST('XXX','BUG ')
434        WRITE(ICOUT,115)
435  115   FORMAT('      MUST BE 1 OR LARGER.')
436        CALL DPWRST('XXX','BUG ')
437        WRITE(ICOUT,117)N
438  117   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
439        CALL DPWRST('XXX','BUG ')
440        IERROR='YES'
441        GOTO9000
442      ENDIF
443C
444      IF(N.EQ.1)THEN
445        XRANGE=0.0
446        GOTO800
447      ENDIF
448C
449      HOLD=X(1)
450      DO135I=2,N
451      IF(X(I).NE.HOLD)GOTO139
452  135 CONTINUE
453      XRANGE=0.0
454      GOTO9000
455  139 CONTINUE
456C
457C               **************************
458C               **  STEP 2--            **
459C               **  COMPUTE THE RANGE.  **
460C               **************************
461C
462      XMIN=X(1)
463      XMAX=X(1)
464      DO200I=2,N
465        IF(X(I).LT.XMIN)XMIN=X(I)
466        IF(X(I).GT.XMAX)XMAX=X(I)
467  200 CONTINUE
468      XRANGE=XMAX-XMIN
469C
470C               *******************************
471C               **  STEP 3--                 **
472C               **  WRITE OUT A LINE         **
473C               **  OF SUMMARY INFORMATION.  **
474C               *******************************
475C
476  800 CONTINUE
477      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
478        WRITE(ICOUT,999)
479        CALL DPWRST('XXX','BUG ')
480        WRITE(ICOUT,811)N,XRANGE
481  811   FORMAT('THE RANGE OF THE ',I8,' OBSERVATIONS = ',G15.7)
482        CALL DPWRST('XXX','BUG ')
483      ENDIF
484C
485C               *****************
486C               **  STEP 90--  **
487C               **  EXIT.      **
488C               *****************
489C
490 9000 CONTINUE
491      IF(IBUGA3.EQ.'ON')THEN
492        WRITE(ICOUT,999)
493        CALL DPWRST('XXX','BUG ')
494        WRITE(ICOUT,9011)
495 9011   FORMAT('***** AT THE END       OF RANGE--')
496        CALL DPWRST('XXX','BUG ')
497        WRITE(ICOUT,9014)XMIN,XMAX,XRANGE,IERROR
498 9014   FORMAT('XMIN,XMAX,XRANGE,IERROR = ',3G15.7,2X,A4)
499        CALL DPWRST('XXX','BUG ')
500      ENDIF
501C
502      RETURN
503      END
504      SUBROUTINE RANK(X,N,IWRITE,XR,XS,MAXOBV,IBUGA3,IERROR)
505C
506C     PURPOSE--THIS SUBROUTINE RANKS (IN ASCENDING ORDER)
507C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
508C              AND PUTS THE RESULTING N RANKS INTO THE
509C              SINGLE PRECISION VECTOR XR.
510C     NOTE--THIS ROUTINE IN JJF8 HAS BEEN MODIFIED
511C           FOR DATAPLOT
512C           FROM THE SAME-NAME SUBROUTINE IN JJF6 IN 3 IMPORTANT WAYS--
513C           1)  THE UPPER LIMIT (IUPPER) HAS BEEN
514C               REDUCED FROM 7500 TO 1000
515C           2)  THE VECTOR XS HAS HAD ITS DIMENSION
516C               CHANGED FROM 7500 TO 1000.
517C           3)  THE VECTOR XS HAS BEEN TAKEN OUT OF COMMON.
518C              THIS SUBROUTINE GIVES THE DATA ANALYST
519C              THE ABILITY TO (FOR EXAMPLE) RANK THE DATA
520C              PRELIMINARY TO CERTAIN DISTRIBUTION-FREE
521C              ANALYSES.
522C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
523C                                OBSERVATIONS TO BE RANKED.
524C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
525C                                IN THE VECTOR X.
526C     OUTPUT ARGUMENTS--XR     = THE SINGLE PRECISION VECTOR
527C                                INTO WHICH THE RANKS
528C                                FROM X WILL BE PLACED.
529C     OUTPUT--THE SINGLE PRECISION VECTOR XR
530C             CONTAINING THE RANKS
531C             (IN ASCENDING ORDER)
532C             OF THE VALUES
533C             IN THE SINGLE PRECISION VECTOR X.
534C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
535C     RESTRICTIONS--THE MAXIMUM ALLOWABLE VALUE OF N
536C                   FOR THIS SUBROUTINE IS 7500.
537C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT.
538C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
539C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
540C     LANGUAGE--ANSI FORTRAN (1977)
541C     COMMENT--THE RANK OF THE FIRST ELEMENT
542C              OF THE VECTOR X
543C              WILL BE PLACED IN THE FIRST POSITION
544C              OF THE VECTOR XR,
545C              THE RANK OF THE SECOND ELEMENT
546C              OF THE VECTOR X
547C              WILL BE PLACED IN THE SECOND POSITION
548C              OF THE VECTOR XR,
549C              ETC.
550C     COMMENT--THE SMALLEST ELEMENT IN THE VECTOR X
551C              WILL HAVE A RANK OF 1 (UNLESS TIES EXIST).
552C              THE LARGEST ELEMENT IN THE VECTOR X
553C              WILL HAVE A RANK OF N (UNLESS TIES EXIST).
554C     COMMENT--ALTHOUGH RANKS ARE USUALLY (UNLESS TIES EXIST)
555C              INTEGRAL VALUES FROM 1 TO N, IT IS TO BE
556C              NOTED THAT THEY ARE OUTPUTED AS SINGLE
557C              PRECISION INTEGERS IN THE SINGLE PRECISION
558C              VECTOR XR.
559C              XR IS SINGLE PRECISION SO AS TO BE
560C              CONSISTENT WITH THE FACT THAT ALL
561C              VECTOR ARGUMENTS IN ALL OTHER
562C              DATAPAC SUBROUTINES ARE SINGLE PRECISION;
563C              BUT MORE IMPORTANTLY, BECAUSE TIES FREQUENTLY
564C              DO EXIST IN DATA SETS AND SO SOME OF THE
565C              RESULTING RANKS WILL BE NON-INTEGRAL
566C              AND SO THE OUTPUT VECTOR OF RANKS MUST NECESSARILY
567C              BE SINGLE PRECISION AND NOT INTEGER.
568C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
569C     COMMENT--THE FIRST AND THIRD ARGUMENTS IN THE
570C              CALLING SEQUENCE MAY
571C              BE IDENTICAL; THAT IS, AN 'IN PLACE'
572C              RANKING IS PERMITTED.
573C              THE CALLING SEQUENCE
574C              CALL RANK(X,N,X) IS VALID, IF DESIRED.
575C     COMMENT--THE SORTING ALGORTHM USED HEREIN
576C              IS THE QUICKSORT.
577C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
578C              FOLLOWING TIME TRIALS INDICATE.
579C              THESE TIME TRIALS WERE CARRIED OUT ON THE
580C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
581C              IN AUGUST OF 1974.
582C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
583C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
584C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
585C              ALSO BEEN INCLUDED--
586C              NUMBER OF RANDOM         QUICKSORT       BUBBLE SORT
587C               NUMBERS SORTED
588C                N = 10                 .002 SEC          .002 SEC
589C                N = 100                .011 SEC          .045 SEC
590C                N = 1000               .141 SEC         4.332 SEC
591C                N = 3000               .476 SEC        37.683 SEC
592C                N = 10000             1.887 SEC      NOT COMPUTED
593C     REFERENCES--CACM MARCH 1969, PAGE 186 (QUICKSORT ALGORITHM
594C                 BY RICHARD C. SINGLETON).
595C               --CACM JANUARY 1970, PAGE 54.
596C               --CACM OCTOBER 1970, PAGE 624.
597C               --JACM JANUARY 1961, PAGE 41.
598C     WRITTEN BY--JAMES J. FILLIBEN
599C                 STATISTICAL ENGINEERING DIVISION
600C                 INFORMATION TECHNOLOGY LABORATORY
601C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
602C                 GAITHERSBURG, MD 20899-8980
603C                 PHONE--301-975-2855
604C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
605C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
606C     LANGUAGE--ANSI FORTRAN (1966)
607C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
608C                          DENOTED BY QUOTES RATHER THAN NH.
609C     VERSION NUMBER--82.6
610C     ORIGINAL VERSION--JUNE      1972.
611C     UPDATED         --JANUARY   1975.
612C     UPDATED         --NOVEMBER  1975.
613C     UPDATED         --JANUARY   1977.
614C     UPDATED         --MARCH     1979.
615C     UPDATED         --AUGUST    1981.
616C     UPDATED         --MARCH     1982.
617C     UPDATED         --MAY       1982.
618C     UPDATED         --JUNE      1990. TEMPORARY ARRAYS TO GARBAGE COMMON
619C     UPDATED         --JANUARY   2007. PASS XS AS ARGUMENT
620C
621C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
622C
623      CHARACTER*4 IWRITE
624      CHARACTER*4 IBUGA3
625      CHARACTER*4 IERROR
626C
627      CHARACTER*4 ISUBN1
628      CHARACTER*4 ISUBN2
629C
630C---------------------------------------------------------------------
631C
632      DIMENSION X(*)
633      DIMENSION XR(*)
634      DIMENSION XS(MAXOBV)
635C
636C---------------------------------------------------------------------
637C
638      INCLUDE 'DPCOP2.INC'
639C
640C-----START POINT-----------------------------------------------------
641C
642      ISUBN1='RANK'
643      ISUBN2='    '
644      IERROR='NO'
645      IUPPER=MAXOBV
646C
647      K=0
648      RPREV=0.0
649C
650      IF(IBUGA3.EQ.'ON')THEN
651        WRITE(ICOUT,999)
652  999   FORMAT(1X)
653        CALL DPWRST('XXX','BUG ')
654        WRITE(ICOUT,51)
655   51   FORMAT('***** AT THE BEGINNING OF RANK--')
656        CALL DPWRST('XXX','BUG ')
657        WRITE(ICOUT,53)N,IUPPER,IBUGA3
658   53   FORMAT('N,IUPPER,IBUGA3 = ',2I8,2X,A4)
659        CALL DPWRST('XXX','BUG ')
660        DO55I=1,N
661          WRITE(ICOUT,56)I,X(I)
662   56     FORMAT('I,X(I) = ',I8,G15.7)
663          CALL DPWRST('XXX','BUG ')
664   55   CONTINUE
665      ENDIF
666C
667C               **********************************
668C               **  COMPUTE THE RANKED VALUES.  **
669C               **********************************
670C
671C               ********************************************
672C               **  STEP 1--                              **
673C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
674C               ********************************************
675C
676      AN=N
677C
678      IF(N.LT.1 .OR. N.GT.IUPPER)THEN
679        IERROR='YES'
680        WRITE(ICOUT,999)
681        CALL DPWRST('XXX','BUG ')
682        WRITE(ICOUT,111)
683  111   FORMAT('***** ERROR IN RANK--')
684        CALL DPWRST('XXX','BUG ')
685        WRITE(ICOUT,113)IUPPER
686  113   FORMAT('      THE NUMBER OF OBSERVATIONS IS LESS THAN 1 OR ',
687     1         'OR LARGER THAN ',I8)
688        CALL DPWRST('XXX','BUG ')
689        WRITE(ICOUT,118)N
690  118   FORMAT('      THE NUMBER OF OBSERVATIONS IS ',I8)
691        CALL DPWRST('XXX','BUG ')
692        GOTO9000
693      ENDIF
694C
695      IF(N.EQ.1)THEN
696        XR(1)=1.0
697        GOTO9000
698      ENDIF
699C
700      HOLD=X(1)
701      DO133I=2,N
702        IF(X(I).NE.HOLD)GOTO139
703  133 CONTINUE
704      WRITE(ICOUT,999)
705      CALL DPWRST('XXX','BUG ')
706      WRITE(ICOUT,135)HOLD
707  135 FORMAT('***** WARNING IN RANK--')
708      CALL DPWRST('XXX','BUG ')
709      WRITE(ICOUT,136)HOLD
710  136 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
711      CALL DPWRST('XXX','BUG ')
712      AVRANK=(AN+1.0)/2.0
713      DO137I=1,N
714        XR(I)=AVRANK
715  137 CONTINUE
716      GOTO9000
717  139 CONTINUE
718C
719C               ***************************************************
720C               **  STEP 2--                                     **
721C               **  FIRST SORT THE DATA FROM THE INPUT VECTOR X  **
722C               **  INTO THE INTERMEDIATE STORAGE VECTOR XS.     **
723C               ***************************************************
724C
725      CALL SORT(X,N,XS)
726C
727C               ****************************************************************
728C               **  STEP 3--
729C               **  NOW DETERMINE THE RANKS.
730C               **  THE BASIC ALGORITHM IS TO TAKE A GIVEN ELEMENT
731C               **  IN THE ORIGINAL INPUT VECTOR X,
732C               **  AND SCAN THE SORTED VALUES IN THE XS VECTOR
733C               **  UNTIL A MATCH IS FOUND;
734C               **  WHEN A MATCH IS FOUND, THEN THE RANK FOR THAT
735C               **  VALUE IN THE XS VECTOR IS DETERMINED.
736C               **  THAT RANK IS THEN WRITTEN INTO THAT POSITION
737C               **  IN THE OUTPUT Y VECTOR WHICH CORRESPONDS TO THE POSITION OF
738C               **  GIVEN ELEMENT OF INTEREST IN THE ORIGINAL X VECTOR.
739C               **  THE CODE IS LENGTHENED FROM THIS BASIC ALGORITHM
740C               **  BY A SECTION WHICH CUTS DOWN THE SEARCH IN THE XS VECTOR,
741C               **  AND BY A SECTION WHICH OBVIATES (UNDER CERTAIN CIRCUMSTANCES
742C               **  THE NEED FOR RECALCULATING THE RANK OF AN ELEMENT IN XS.
743C               ****************************************************************
744C
745      NM1=N-1
746      XPREV=X(1)
747      DO700I=1,N
748        JMIN=1
749        IF(X(I).GT.XPREV)THEN
750          JMIN=K
751          IF(JMIN.LT.N)GOTO790
752          IF(JMIN.EQ.N)GOTO820
753C
754          IERROR='YES'
755          IBRAN=1
756          WRITE(ICOUT,999)
757          CALL DPWRST('XXX','BUG ')
758          WRITE(ICOUT,111)
759          CALL DPWRST('XXX','BUG ')
760          WRITE(ICOUT,781)IBRAN
761  781     FORMAT('      IMPOSSIBLE BRANCH CONDITION AT BRANCH POINT = ',
762     1           I8)
763          CALL DPWRST('XXX','BUG ')
764          WRITE(ICOUT,782)JMIN
765  782     FORMAT('JMIN = ',I8)
766          CALL DPWRST('XXX','BUG ')
767          GOTO9000
768        ENDIF
769        IF(I.EQ.1)GOTO790
770        IF(X(I).EQ.XPREV)THEN
771          XPREV=X(I)
772          XR(I)=RPREV
773          GOTO880
774        ENDIF
775C
776  790   CONTINUE
777        DO800J=JMIN,NM1
778          IF(X(I).NE.XS(J))GOTO800
779          JP1=J+1
780          DO900K=JP1,N
781            IF(XS(K).NE.XS(J))GOTO950
782  900     CONTINUE
783          K=N+1
784  950     CONTINUE
785          AVRANK=J+K-1
786          AVRANK=AVRANK/2.0
787          XPREV=X(I)
788          XR(I)=AVRANK
789          GOTO880
790  800   CONTINUE
791  820   CONTINUE
792        J=N
793        K=N+1
794        IF(X(I).EQ.XS(J))GOTO850
795C
796        IERROR='YES'
797        IBRAN=2
798        WRITE(ICOUT,999)
799        CALL DPWRST('XXX','BUG ')
800        WRITE(ICOUT,111)
801        CALL DPWRST('XXX','BUG ')
802        WRITE(ICOUT,881)IBRAN
803  881   FORMAT('      IMPOSSIBLE BRANCH CONDITION AT BRANCH POINT = ',
804     1         I8)
805        CALL DPWRST('XXX','BUG ')
806        WRITE(ICOUT,882)X(I),XS(I)
807  882   FORMAT('X(I) = ',E15.7,'   XS(J) = ',E15.7)
808        CALL DPWRST('XXX','BUG ')
809        GOTO9000
810C
811  850   CONTINUE
812        XPREV=X(I)
813        XR(I)=N
814  880   CONTINUE
815        RPREV=XR(I)
816  700 CONTINUE
817C
818      XMIN=XS(1)
819      XMAX=XS(N)
820C
821C               ******************************
822C               **  STEP 4--                **
823C               **  WRITE OUT A FEW LINES   **
824C               **  OF SUMMARY INFORMATION  **
825C               **  ABOUT THE CODING.       **
826C               ******************************
827C
828      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
829        WRITE(ICOUT,999)
830        CALL DPWRST('XXX','BUG ')
831        AI=1
832        WRITE(ICOUT,912)XS(1),AI
833  912   FORMAT('THE MINIMUM (= ',E15.7,' ) HAS RANK ',F10.0)
834        CALL DPWRST('XXX','BUG ')
835        AI=N
836        WRITE(ICOUT,913)XS(N),AI
837  913   FORMAT('THE MAXIMUM (= ',E15.7,' ) HAS RANK ',F10.0)
838        CALL DPWRST('XXX','BUG ')
839      ENDIF
840C
841C               *****************
842C               **  STEP 90--  **
843C               **  EXIT.      **
844C               *****************
845C
846 9000 CONTINUE
847C
848      IF(IBUGA3.EQ.'ON')THEN
849        WRITE(ICOUT,999)
850        CALL DPWRST('XXX','BUG ')
851        WRITE(ICOUT,9011)
852 9011   FORMAT('***** AT THE END       OF RANK--')
853        CALL DPWRST('XXX','BUG ')
854        WRITE(ICOUT,9012)IBUGA3,IERROR
855 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
856        CALL DPWRST('XXX','BUG ')
857        DO9015I=1,N
858          WRITE(ICOUT,9016)I,X(I),XR(I),XS(I)
859 9016     FORMAT('I,X(I),XR(I),XS(I) = ',I8,3G15.7)
860          CALL DPWRST('XXX','BUG ')
861 9015   CONTINUE
862      ENDIF
863C
864      RETURN
865      END
866      SUBROUTINE RANKI(X,N,IWRITE,XR,XS,ITAG,MAXOBV,IBUGA3,IERROR)
867C
868C     PURPOSE--THIS SUBROUTINE RANKS (IN ASCENDING ORDER)
869C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
870C              AND PUTS THE RESULTING N RANKS INTO THE
871C              SINGLE PRECISION VECTOR XR.
872C
873C              THIS IS A VARIANT OF RANK THAT HANDLES TIES
874C              DIFFERENTLY.  FOR EXAMPLE, IT THERE IS A TIE BETWEEN
875C              RANK 7 AND RANK 8, THE RANK SUBROUTINE WILL ASSIGN
876C              A RANK OF 7.5 TO BOTH.  THIS ROUTINE WILL ASSIGN
877C              A RANK OF 7 AND A RANK OF 8 (IT WILL MAINTAIN THE
878C              ORIGINAL ORDER).  THE "RANK INDEX" IS TYPICALLY USED
879C              AS AN INDEX TO ANOTHER VECTOR, SO WE WANT ALL RANKS
880C              TO BE UNIQUE INTEGERS.
881C
882C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
883C                                OBSERVATIONS TO BE RANKED.
884C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
885C                                IN THE VECTOR X.
886C     OUTPUT ARGUMENTS--XR     = THE SINGLE PRECISION VECTOR
887C                                INTO WHICH THE RANKS
888C                                FROM X WILL BE PLACED.
889C     OUTPUT--THE SINGLE PRECISION VECTOR XR CONTAINING THE RANKS
890C             (IN ASCENDING ORDER) OF THE VALUES
891C             IN THE SINGLE PRECISION VECTOR X.
892C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
893C     RESTRICTIONS--THE MAXIMUM ALLOWABLE VALUE OF N
894C                   FOR THIS SUBROUTINE IS 7500.
895C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT.
896C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
897C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
898C     LANGUAGE--ANSI FORTRAN (1977)
899C     COMMENT--THE RANK OF THE FIRST ELEMENT OF THE VECTOR X
900C              WILL BE PLACED IN THE FIRST POSITION OF THE VECTOR XR,
901C              THE RANK OF THE SECOND ELEMENT OF THE VECTOR X WILL BE
902C              PLACED IN THE SECOND POSITION OF THE VECTOR XR, ETC.
903C     COMMENT--THE SMALLEST ELEMENT IN THE VECTOR X
904C              WILL HAVE A RANK OF 1 AND
905C              THE LARGEST ELEMENT IN THE VECTOR X
906C              WILL HAVE A RANK OF N.
907C     COMMENT--ALTHOUGH RANKS ARE USUALLY (UNLESS TIES EXIST)
908C              INTEGRAL VALUES FROM 1 TO N, IT IS TO BE
909C              NOTED THAT THEY ARE OUTPUTED AS SINGLE
910C              PRECISION INTEGERS IN THE SINGLE PRECISION
911C              VECTOR XR.
912C              XR IS SINGLE PRECISION SO AS TO BE
913C              CONSISTENT WITH THE FACT THAT ALL
914C              VECTOR ARGUMENTS IN ALL OTHER
915C              DATAPAC SUBROUTINES ARE SINGLE PRECISION;
916C              BUT MORE IMPORTANTLY, BECAUSE TIES FREQUENTLY
917C              DO EXIST IN DATA SETS AND SO SOME OF THE
918C              RESULTING RANKS WILL BE NON-INTEGRAL
919C              AND SO THE OUTPUT VECTOR OF RANKS MUST NECESSARILY
920C              BE SINGLE PRECISION AND NOT INTEGER.
921C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
922C     COMMENT--THE FIRST AND THIRD ARGUMENTS IN THE
923C              CALLING SEQUENCE MAY
924C              BE IDENTICAL; THAT IS, AN 'IN PLACE'
925C              RANKING IS PERMITTED.
926C              THE CALLING SEQUENCE
927C              CALL RANK(X,N,X) IS VALID, IF DESIRED.
928C     COMMENT--THE SORTING ALGORTHM USED HEREIN
929C              IS THE QUICKSORT.
930C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
931C              FOLLOWING TIME TRIALS INDICATE.
932C              THESE TIME TRIALS WERE CARRIED OUT ON THE
933C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
934C              IN AUGUST OF 1974.
935C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
936C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
937C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
938C              ALSO BEEN INCLUDED--
939C              NUMBER OF RANDOM         QUICKSORT       BUBBLE SORT
940C               NUMBERS SORTED
941C                N = 10                 .002 SEC          .002 SEC
942C                N = 100                .011 SEC          .045 SEC
943C                N = 1000               .141 SEC         4.332 SEC
944C                N = 3000               .476 SEC        37.683 SEC
945C                N = 10000             1.887 SEC      NOT COMPUTED
946C     REFERENCES--CACM MARCH 1969, PAGE 186 (QUICKSORT ALGORITHM
947C                 BY RICHARD C. SINGLETON).
948C               --CACM JANUARY 1970, PAGE 54.
949C               --CACM OCTOBER 1970, PAGE 624.
950C               --JACM JANUARY 1961, PAGE 41.
951C     WRITTEN BY--JAMES J. FILLIBEN
952C                 STATISTICAL ENGINEERING DIVISION
953C                 INFORMATION TECHNOLOGY LABORATORY
954C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
955C                 GAITHERSBURG, MD 20899-8980
956C                 PHONE--301-975-2855
957C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
958C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
959C     LANGUAGE--ANSI FORTRAN (1977)
960C     VERSION NUMBER--2010.6
961C     ORIGINAL VERSION--JUNE      2010.
962C
963C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
964C
965      CHARACTER*4 IWRITE
966      CHARACTER*4 IBUGA3
967      CHARACTER*4 IERROR
968C
969      CHARACTER*4 ISUBN1
970      CHARACTER*4 ISUBN2
971C
972C---------------------------------------------------------------------
973C
974C
975      DIMENSION X(*)
976      DIMENSION XR(*)
977      DIMENSION XS(*)
978      INTEGER   ITAG(*)
979C
980C---------------------------------------------------------------------
981C
982      INCLUDE 'DPCOP2.INC'
983C
984C-----START POINT-----------------------------------------------------
985C
986      ISUBN1='RANK'
987      ISUBN2='I   '
988      IERROR='NO'
989C
990      IUPPER=MAXOBV
991C
992      IF(IBUGA3.EQ.'ON')THEN
993        WRITE(ICOUT,999)
994  999   FORMAT(1X)
995        CALL DPWRST('XXX','BUG ')
996        WRITE(ICOUT,51)
997   51   FORMAT('***** AT THE BEGINNING OF RANK--')
998        CALL DPWRST('XXX','BUG ')
999        WRITE(ICOUT,53)IBUGA3,N,IUPPER
1000   53   FORMAT('IBUGA3,N,IUPPER = ',A4,2X,2I8)
1001        CALL DPWRST('XXX','BUG ')
1002        DO55I=1,N
1003         WRITE(ICOUT,56)I,X(I)
1004   56    FORMAT('I,X(I) = ',I8,E15.7)
1005         CALL DPWRST('XXX','BUG ')
1006   55   CONTINUE
1007      ENDIF
1008C
1009C               **********************************
1010C               **  COMPUTE THE RANKED VALUES.  **
1011C               **********************************
1012C
1013C               ********************************************
1014C               **  STEP 1--                              **
1015C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
1016C               ********************************************
1017C
1018      AN=N
1019C
1020      IF(N.LT.1 .OR. N.GT.IUPPER)THEN
1021        IERROR='YES'
1022        WRITE(ICOUT,999)
1023        CALL DPWRST('XXX','BUG ')
1024        WRITE(ICOUT,111)
1025  111   FORMAT('***** ERROR IN RANK INDEX--')
1026        CALL DPWRST('XXX','BUG ')
1027        WRITE(ICOUT,113)IUPPER
1028  113   FORMAT('      THE NUMBER OF OBSERVATIONS IS LESS THAN ONE ',
1029     1         'OR LARGER THAN ',I8)
1030        CALL DPWRST('XXX','BUG ')
1031        WRITE(ICOUT,118)N
1032  118   FORMAT('***** THE NUMBER OF OBSERVATIONS IS ',I8)
1033        CALL DPWRST('XXX','BUG ')
1034        GOTO9000
1035      ENDIF
1036C
1037      IF(N.EQ.1)THEN
1038        XR(1)=1.0
1039        GOTO9000
1040      ENDIF
1041C
1042      HOLD=X(1)
1043      DO135I=2,N
1044      IF(X(I).NE.HOLD)GOTO139
1045  135 CONTINUE
1046      WRITE(ICOUT,999)
1047      CALL DPWRST('XXX','BUG ')
1048      WRITE(ICOUT,136)
1049  136 FORMAT('***** WARNING IN RANK INDEX--')
1050      CALL DPWRST('XXX','BUG ')
1051      WRITE(ICOUT,138)HOLD
1052  138 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
1053      CALL DPWRST('XXX','BUG ')
1054      DO137I=1,N
1055        XR(I)=REAL(I)
1056  137 CONTINUE
1057      GOTO9000
1058  139 CONTINUE
1059C
1060C               ***************************************************
1061C               **  STEP 2--                                     **
1062C               **  FIRST SORT THE DATA FROM THE INPUT VECTOR X  **
1063C               **  INTO THE INTERMEDIATE STORAGE VECTOR XS.     **
1064C               ***************************************************
1065C
1066      CALL SORT(X,N,XS)
1067      DO210I=1,N
1068        ITAG(I)=0
1069  210 CONTINUE
1070C
1071C               ********************************************************
1072C               **  STEP 3--                                          **
1073C               **  NOW DETERMINE THE RANKS.                          **
1074C               **  THE BASIC ALGORITHM IS TO TAKE A GIVEN ELEMENT    **
1075C               **  IN THE ORIGINAL INPUT VECTOR X,                   **
1076C               **  AND SCAN THE SORTED VALUES IN THE XS VECTOR       **
1077C               **  UNTIL A MATCH IS FOUND;                           **
1078C               **  WHEN A MATCH IS FOUND, THEN THE RANK FOR THAT     **
1079C               **  VALUE IN THE XS VECTOR IS DETERMINED.             **
1080C               **  THAT RANK IS THEN WRITTEN INTO THAT POSITION      **
1081C               **  IN THE OUTPUT Y VECTOR WHICH CORRESPONDS TO THE   **
1082C               **  POSITION OF GIVEN ELEMENT OF INTEREST IN THE      **
1083C               **  ORIGINAL X VECTOR.  TIES ARE HANDLED BY           **
1084C               **  KEEPING A TAG VECTOR WHICH IDENTIFIES WHETHER A   **
1085C               **  MATCHED ELEMENT HAS BEEN PREVIOUSLY IDENTIFIED.   **
1086C               ********************************************************
1087C
1088      DO700I=1,N
1089        DO800J=1,N
1090          IF(X(I).EQ.XS(J) .AND. ITAG(J).EQ.0)THEN
1091            XR(I)=REAL(J)
1092            ITAG(J)=1
1093            GOTO700
1094          ENDIF
1095  800   CONTINUE
1096  700 CONTINUE
1097C
1098      XMIN=XS(1)
1099      XMAX=XS(N)
1100C
1101C               ******************************
1102C               **  STEP 4--                **
1103C               **  WRITE OUT A FEW LINES   **
1104C               **  OF SUMMARY INFORMATION  **
1105C               **  ABOUT THE CODING.       **
1106C               ******************************
1107C
1108      IF(IFEEDB.EQ.'OFF')GOTO990
1109      IF(IWRITE.EQ.'OFF')GOTO990
1110      WRITE(ICOUT,999)
1111      CALL DPWRST('XXX','BUG ')
1112      AI=1
1113      WRITE(ICOUT,912)XS(1),AI
1114  912 FORMAT('THE MINIMUM (= ',E15.7,' ) HAS RANK ',F10.0)
1115      CALL DPWRST('XXX','BUG ')
1116      AI=N
1117      WRITE(ICOUT,913)XS(N),AI
1118  913 FORMAT('THE MAXIMUM (= ',E15.7,' ) HAS RANK ',F10.0)
1119      CALL DPWRST('XXX','BUG ')
1120  990 CONTINUE
1121C
1122C               *****************
1123C               **  STEP 90--  **
1124C               **  EXIT.      **
1125C               *****************
1126C
1127 9000 CONTINUE
1128C
1129      IF(IBUGA3.EQ.'ON')THEN
1130        WRITE(ICOUT,999)
1131        CALL DPWRST('XXX','BUG ')
1132        WRITE(ICOUT,9011)
1133 9011   FORMAT('***** AT THE END       OF RANK--')
1134        CALL DPWRST('XXX','BUG ')
1135        WRITE(ICOUT,9012)IBUGA3,IERROR
1136 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
1137        CALL DPWRST('XXX','BUG ')
1138        WRITE(ICOUT,9013)N
1139 9013   FORMAT('N = ',I8)
1140        CALL DPWRST('XXX','BUG ')
1141        DO9015I=1,N
1142         WRITE(ICOUT,9016)I,X(I),XR(I),XS(I)
1143 9016    FORMAT('I,X(I),XR(I),XS(I) = ',I8,3E15.7)
1144         CALL DPWRST('XXX','BUG ')
1145 9015  CONTINUE
1146      ENDIF
1147C
1148      RETURN
1149      END
1150      SUBROUTINE RANK2(Y1,GROUP,N,IWRITE,Y2,TEMP1,TEMPR,XIDTEM,ITEMP1,
1151     1                 MAXOBV,
1152     1                 ISUBRO,IBUGA3,IERROR)
1153C
1154C     PURPOSE--THIS SUBROUTINE RANKS BASED ON TWO VARIABLES
1155C     INPUT  ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR CONTAINING
1156C                                THE RESPONSE VARIABLE TO BE RANKED.
1157C                     --GROUP  = THE SINGLE PRECISION VECTOR CONTAINING
1158C                                THE GROUP-ID VARIABLE TO BE RANKED.
1159C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
1160C                                IN THE VECTOR X.
1161C     OUTPUT ARGUMENTS--Y2     = THE SINGLE PRECISION VECTOR
1162C                                CONTAINING THE RANKED VALUES OF
1163C                                THE RESPONSE VARIABLE.
1164C     OUTPUT--THE SINGLE PRECISION VECTORS Y2 CONTAINING
1165C             THE RANKED VECTORS.
1166C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1167C     OTHER DATAPAC   SUBROUTINES NEEDED--RANK, SORT.
1168C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
1169C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
1170C     LANGUAGE--ANSI FORTRAN (1977)
1171C     WRITTEN BY--JAMES J. FILLIBEN
1172C                 STATISTICAL ENGINEERING DIVISION
1173C                 INFORMATION TECHNOLOGY LABORATORY
1174C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
1175C                 GAITHERSBURG, MD 20899-8980
1176C                 PHONE--301-975-2855
1177C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1178C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1179C     LANGUAGE--ANSI FORTRAN (1977)
1180C     VERSION NUMBER--2008.12
1181C     ORIGINAL VERSION--NOVEMBER  2008.
1182C
1183C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1184C
1185      CHARACTER*4 IWRITE
1186      CHARACTER*4 ISUBRO
1187      CHARACTER*4 IBUGA3
1188      CHARACTER*4 IERROR
1189C
1190      CHARACTER*4 ISUBN1
1191      CHARACTER*4 ISUBN2
1192C
1193C---------------------------------------------------------------------
1194C
1195      DIMENSION Y1(*)
1196      DIMENSION Y2(*)
1197      DIMENSION GROUP(*)
1198      DIMENSION TEMP1(*)
1199      DIMENSION TEMPR(*)
1200      DIMENSION XIDTEM(*)
1201C
1202      INTEGER ITEMP1(*)
1203C
1204C---------------------------------------------------------------------
1205C
1206      INCLUDE 'DPCOP2.INC'
1207C
1208C-----START POINT-----------------------------------------------------
1209C
1210      ISUBN1='RANK'
1211      ISUBN2='2   '
1212      IERROR='NO'
1213      IWRITE='OFF'
1214C
1215      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK2')THEN
1216        WRITE(ICOUT,999)
1217  999   FORMAT(1X)
1218        CALL DPWRST('XXX','BUG ')
1219        WRITE(ICOUT,51)
1220   51   FORMAT('***** AT THE BEGINNING OF RANK2--')
1221        CALL DPWRST('XXX','BUG ')
1222        WRITE(ICOUT,52)IBUGA3
1223   52   FORMAT('IBUGA3 = ',A4)
1224        CALL DPWRST('XXX','BUG ')
1225        WRITE(ICOUT,53)N
1226   53   FORMAT('N = ',2I8)
1227        CALL DPWRST('XXX','BUG ')
1228        DO55I=1,N
1229          WRITE(ICOUT,56)I,GROUP(I),Y1(I)
1230   56     FORMAT('I,GROUP(I),Y1(I) = ',I8,2G15.7)
1231          CALL DPWRST('XXX','BUG ')
1232   55   CONTINUE
1233      ENDIF
1234C
1235C    ********************************************
1236C    **  STEP 1--                              **
1237C    **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
1238C    ********************************************
1239C
1240      AN=N
1241C
1242      IF(N.LT.1)THEN
1243        IERROR='YES'
1244        WRITE(ICOUT,999)
1245        CALL DPWRST('XXX','BUG ')
1246        WRITE(ICOUT,111)
1247  111   FORMAT('***** ERROR IN RANK2--')
1248        CALL DPWRST('XXX','BUG ')
1249        WRITE(ICOUT,113)
1250  113   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',
1251     1         'NON-POSITIVE.')
1252        CALL DPWRST('XXX','BUG ')
1253        WRITE(ICOUT,115)N
1254  115   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',I8)
1255        CALL DPWRST('XXX','BUG ')
1256        GOTO9000
1257      ENDIF
1258C
1259      IF(N.EQ.1)THEN
1260        Y2(1)=1.0
1261        GOTO9000
1262      ENDIF
1263C
1264C     ***************************************************
1265C     **  STEP 2--                                     **
1266C     **  DETERMINE DISTINCT VALUES OF FIRST VARIABLE  **
1267C     **  (THE GROUP-ID VARIABLE)                      **
1268C     ***************************************************
1269C
1270      CALL DISTIN(GROUP,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
1271      IF(N.EQ.NDIST)THEN
1272        DO1010I=1,N
1273          Y2(I)=1.0
1274 1010   CONTINUE
1275        GOTO9000
1276      ELSEIF(NDIST.EQ.1)THEN
1277        CALL RANK(Y1,N,IWRITE,Y2,TEMP1,MAXOBV,IBUGA3,IERROR)
1278        GOTO9000
1279      ENDIF
1280C
1281      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK2')THEN
1282        WRITE(ICOUT,1091)
1283 1091   FORMAT('AFTER DETERMINE DISTINCT VALUES OF VARIABLE ONE')
1284        CALL DPWRST('XXX','BUG ')
1285        WRITE(ICOUT,1092)NDIST
1286 1092   FORMAT('NDIST = ',I8)
1287        CALL DPWRST('XXX','BUG ')
1288        DO1099I=1,NDIST
1289        WRITE(ICOUT,1093)I,XIDTEM(I)
1290 1093   FORMAT('I,XIDTEM(I) = ',I8,G15.7)
1291        CALL DPWRST('XXX','BUG ')
1292 1099   CONTINUE
1293      ENDIF
1294C
1295C     ****************************************************
1296C     **  STEP 3--                                      **
1297C     **  NOW RANK THE SECOND VARIABLE FOR COMMON       **
1298C     **  VALUES OF FIRST VARIABLE.                     **
1299C     ****************************************************
1300C
1301C
1302      CALL SORT(XIDTEM,NDIST,XIDTEM)
1303C
1304      DO2110ISET=1,NDIST
1305        HOLD=XIDTEM(ISET)
1306C
1307        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK2')THEN
1308          WRITE(ICOUT,2111)ISET,ISTRT,HOLD
1309 2111     FORMAT('AT 2110: ISET,ISTRT,HOLD = ',2I8,G15.7)
1310          CALL DPWRST('XXX','BUG ')
1311        ENDIF
1312C
1313        ICNT=0
1314        DO2120I=1,N
1315          IF(GROUP(I).EQ.HOLD)THEN
1316            ICNT=ICNT+1
1317            TEMP1(ICNT)=Y1(I)
1318            ITEMP1(ICNT)=I
1319          ENDIF
1320 2120   CONTINUE
1321        CALL RANK(TEMP1,ICNT,IWRITE,TEMP1,TEMPR,MAXOBV,IBUGA3,IERROR)
1322        DO2160J=1,ICNT
1323          IINDX=ITEMP1(J)
1324          Y2(IINDX)=TEMP1(J)
1325 2160   CONTINUE
1326 2110 CONTINUE
1327C
1328C               *****************
1329C               **  STEP 90--  **
1330C               **  EXIT.      **
1331C               *****************
1332C
1333 9000 CONTINUE
1334C
1335      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK2')THEN
1336        WRITE(ICOUT,999)
1337        CALL DPWRST('XXX','BUG ')
1338        WRITE(ICOUT,9011)
1339 9011   FORMAT('***** AT THE END       OF RANK2--')
1340        CALL DPWRST('XXX','BUG ')
1341        DO9015I=1,N
1342          WRITE(ICOUT,9016)I,GROUP(I),Y1(I),Y2(I)
1343 9016     FORMAT('I,GROUP(I),Y1(I),Y2(I) = ',I8,3G15.7)
1344          CALL DPWRST('XXX','BUG ')
1345 9015   CONTINUE
1346      ENDIF
1347C
1348      RETURN
1349      END
1350      SUBROUTINE RANK3(Y1,GROUP1,GROUP2,N,IWRITE,Y2,
1351     1                 TEMP1,TEMPR,XIDTEM,XIDTE2,ITEMP1,
1352     1                 MAXOBV,
1353     1                 ISUBRO,IBUGA3,IERROR)
1354C
1355C     PURPOSE--THIS SUBROUTINE RANKS BASED ON TWO VARIABLES
1356C     INPUT  ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR CONTAINING
1357C                                THE RESPONSE VARIABLE TO BE RANKED.
1358C                     --GROUP1 = THE SINGLE PRECISION VECTOR CONTAINING
1359C                                THE FIRST GROUP-ID VARIABLE TO BE
1360C                                RANKED.
1361C                     --GROUP2 = THE SINGLE PRECISION VECTOR CONTAINING
1362C                                THE SECOND GROUP-ID VARIABLE TO BE
1363C                                RANKED.
1364C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
1365C                                IN THE VECTOR X.
1366C     OUTPUT ARGUMENTS--Y2     = THE SINGLE PRECISION VECTOR
1367C                                CONTAINING THE RANKED VALUES OF
1368C                                THE RESPONSE VARIABLE.
1369C     OUTPUT--THE SINGLE PRECISION VECTORS Y2 CONTAINING
1370C             THE RANKED VECTOR.
1371C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1372C     OTHER DATAPAC   SUBROUTINES NEEDED--RANK, SORT.
1373C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
1374C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
1375C     LANGUAGE--ANSI FORTRAN (1977)
1376C     WRITTEN BY--JAMES J. FILLIBEN
1377C                 STATISTICAL ENGINEERING DIVISION
1378C                 INFORMATION TECHNOLOGY LABORATORY
1379C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
1380C                 GAITHERSBURG, MD 20899-8980
1381C                 PHONE--301-975-2855
1382C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1383C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1384C     LANGUAGE--ANSI FORTRAN (1977)
1385C     VERSION NUMBER--2008.12
1386C     ORIGINAL VERSION--DECEMBER  2008.
1387C
1388C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1389C
1390      CHARACTER*4 IWRITE
1391      CHARACTER*4 ISUBRO
1392      CHARACTER*4 IBUGA3
1393      CHARACTER*4 IERROR
1394C
1395      CHARACTER*4 ISUBN1
1396      CHARACTER*4 ISUBN2
1397C
1398C---------------------------------------------------------------------
1399C
1400      DIMENSION Y1(*)
1401      DIMENSION Y2(*)
1402      DIMENSION GROUP1(*)
1403      DIMENSION GROUP2(*)
1404      DIMENSION TEMP1(*)
1405      DIMENSION TEMPR(*)
1406      DIMENSION XIDTEM(*)
1407      DIMENSION XIDTE2(*)
1408C
1409      INTEGER ITEMP1(*)
1410C
1411C---------------------------------------------------------------------
1412C
1413      INCLUDE 'DPCOP2.INC'
1414C
1415C-----START POINT-----------------------------------------------------
1416C
1417      ISUBN1='RANK'
1418      ISUBN2='3   '
1419      IERROR='NO'
1420      IWRITE='OFF'
1421C
1422      N1=0
1423      N2=0
1424      NDIST=0
1425C
1426      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK3')THEN
1427        WRITE(ICOUT,999)
1428  999   FORMAT(1X)
1429        CALL DPWRST('XXX','BUG ')
1430        WRITE(ICOUT,51)
1431   51   FORMAT('***** AT THE BEGINNING OF RANK2--')
1432        CALL DPWRST('XXX','BUG ')
1433        WRITE(ICOUT,52)IBUGA3
1434   52   FORMAT('IBUGA3 = ',A4)
1435        CALL DPWRST('XXX','BUG ')
1436        WRITE(ICOUT,53)N
1437   53   FORMAT('N = ',2I8)
1438        CALL DPWRST('XXX','BUG ')
1439        DO55I=1,N
1440          WRITE(ICOUT,56)I,GROUP1(I),GROUP2(I),Y1(I)
1441   56     FORMAT('I,GROUP1(I),GROUP2(I),Y1(I) = ',I8,3G15.7)
1442          CALL DPWRST('XXX','BUG ')
1443   55   CONTINUE
1444      ENDIF
1445C
1446C    ********************************************
1447C    **  STEP 1--                              **
1448C    **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
1449C    ********************************************
1450C
1451      AN=N
1452C
1453      IF(N.LT.1)THEN
1454        IERROR='YES'
1455        WRITE(ICOUT,999)
1456        CALL DPWRST('XXX','BUG ')
1457        WRITE(ICOUT,111)
1458  111   FORMAT('***** ERROR IN RANK2--')
1459        CALL DPWRST('XXX','BUG ')
1460        WRITE(ICOUT,113)
1461  113   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',
1462     1         'NON-POSITIVE.')
1463        CALL DPWRST('XXX','BUG ')
1464        WRITE(ICOUT,115)N
1465  115   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',I8)
1466        CALL DPWRST('XXX','BUG ')
1467        GOTO9000
1468      ENDIF
1469C
1470      IF(N.EQ.1)THEN
1471        Y2(1)=1.0
1472        GOTO9000
1473      ENDIF
1474C
1475C     ***************************************************
1476C     **  STEP 2--                                     **
1477C     **  DETERMINE DISTINCT VALUES OF FIRST VARIABLE  **
1478C     **  (THE GROUP-ID VARIABLE)                      **
1479C     ***************************************************
1480C
1481      CALL DISTIN(GROUP1,N,IWRITE,XIDTEM,NDIST1,IBUGA3,IERROR)
1482      CALL DISTIN(GROUP2,N,IWRITE,XIDTE2,NDIST2,IBUGA3,IERROR)
1483      IF(N1.EQ.NDIST1 .AND. N2.EQ.NDIST2)THEN
1484        DO1010I=1,N
1485          Y2(I)=1.0
1486 1010   CONTINUE
1487        GOTO9000
1488      ELSEIF(NDIST1.EQ.1 .AND. NDIST2.EQ.1)THEN
1489        CALL RANK(Y1,N,IWRITE,Y2,TEMP1,MAXOBV,IBUGA3,IERROR)
1490        GOTO9000
1491      ENDIF
1492C
1493      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK3')THEN
1494        WRITE(ICOUT,1091)
1495 1091   FORMAT('AFTER DETERMINE DISTINCT VALUES OF VARIABLE ONE')
1496        CALL DPWRST('XXX','BUG ')
1497        WRITE(ICOUT,1092)NDIST
1498 1092   FORMAT('NDIST = ',I8)
1499        CALL DPWRST('XXX','BUG ')
1500        DO1099I=1,NDIST
1501        WRITE(ICOUT,1093)I,XIDTEM(I),XIDTE2(I)
1502 1093   FORMAT('I,XIDTEM(I),XIDTE2(I) = ',I8,2G15.7)
1503        CALL DPWRST('XXX','BUG ')
1504 1099   CONTINUE
1505      ENDIF
1506C
1507C     ****************************************************
1508C     **  STEP 3--                                      **
1509C     **  NOW RANK THE SECOND VARIABLE FOR COMMON       **
1510C     **  VALUES OF FIRST VARIABLE.                     **
1511C     ****************************************************
1512C
1513C
1514      CALL SORT(XIDTEM,NDIST1,XIDTEM)
1515      CALL SORT(XIDTE2,NDIST2,XIDTE2)
1516C
1517      DO2110ISET1=1,NDIST1
1518        HOLD1=XIDTEM(ISET1)
1519C
1520        DO2120ISET2=1,NDIST2
1521          HOLD2=XIDTEM(ISET2)
1522C
1523          IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK3')THEN
1524            WRITE(ICOUT,2121)ISET1,ISET2,HOLD1,HOLD2
1525 2121       FORMAT('AT 2120: ISET1,ISET2,HOLD1,HOLD2 = ',2I8,2G15.7)
1526            CALL DPWRST('XXX','BUG ')
1527          ENDIF
1528C
1529          ICNT=0
1530          DO2130I=1,N
1531            IF(GROUP1(I).EQ.HOLD1 .AND. GROUP2(I).EQ.HOLD2)THEN
1532              ICNT=ICNT+1
1533              TEMP1(ICNT)=Y1(I)
1534              ITEMP1(ICNT)=I
1535            ENDIF
1536 2130     CONTINUE
1537          CALL RANK(TEMP1,ICNT,IWRITE,TEMP1,TEMPR,MAXOBV,
1538     1              IBUGA3,IERROR)
1539          DO2160J=1,ICNT
1540            IINDX=ITEMP1(J)
1541            Y2(IINDX)=TEMP1(J)
1542 2160     CONTINUE
1543 2120   CONTINUE
1544 2110 CONTINUE
1545C
1546C               *****************
1547C               **  STEP 90--  **
1548C               **  EXIT.      **
1549C               *****************
1550C
1551 9000 CONTINUE
1552C
1553      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANK3')THEN
1554        WRITE(ICOUT,999)
1555        CALL DPWRST('XXX','BUG ')
1556        WRITE(ICOUT,9011)
1557 9011   FORMAT('***** AT THE END       OF RANK3--')
1558        CALL DPWRST('XXX','BUG ')
1559        DO9015I=1,N
1560          WRITE(ICOUT,9016)I,GROUP1(I),GROUP2(I),Y1(I),Y2(I)
1561 9016     FORMAT('I,GROUP1(I),GROUP2(I),Y1(I),Y2(I) = ',
1562     1           I8,4G15.7)
1563          CALL DPWRST('XXX','BUG ')
1564 9015   CONTINUE
1565      ENDIF
1566C
1567      RETURN
1568      END
1569      SUBROUTINE RANKCM(X,Y,N,IWRITE,XTEMP,YTEMP,XTEMP2,
1570     1MAXNXT,XYRACM,
1571     1IBUGA3,IERROR)
1572C
1573C     PURPOSE--THIS SUBROUTINE COMPUTES THE
1574C              RANK COMOVEMENT COEFFICIENT
1575C              BETWEEN THE 2 SETS OF DATA IN THE INPUT VECTORS X AND Y.
1576C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
1577C                                (UNSORTED OR SORTED) OBSERVATIONS
1578C                                WHICH CONSTITUTE THE FIRST SET
1579C                                OF DATA.
1580C                     --Y      = THE SINGLE PRECISION VECTOR OF
1581C                                (UNSORTED OR SORTED) OBSERVATIONS
1582C                                WHICH CONSTITUTE THE SECOND SET
1583C                                OF DATA.
1584C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
1585C                                IN THE VECTOR X, OR EQUIVALENTLY,
1586C                                THE INTEGER NUMBER OF OBSERVATIONS
1587C                                IN THE VECTOR Y.
1588C     OUTPUT ARGUMENTS--XYRACM = THE SINGLE PRECISION VALUE OF THE
1589C                                COMPUTED RANK COMOVEMENT
1590C                                COEFFICIENT BETWEEN THE 2 SETS OF DATA
1591C                                IN THE INPUT VECTORS X AND Y.
1592C                                THIS SINGLE PRECISION VALUE
1593C                                WILL BE BETWEEN -1.0 AND 1.0
1594C                                (INCLUSIVELY).
1595C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
1596C             RANK COMOVEMENT COEFFICIENT BETWEEN THE 2 SETS
1597C             OF DATA IN THE INPUT VECTORS X AND Y.
1598C     OTHER DATAPAC   SUBROUTINES NEEDED--RANK AND SORT.
1599C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
1600C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
1601C     LANGUAGE--ANSI FORTRAN (1977)
1602C     REFERENCES--AN INDEX FOR COMOVEMENT OF TIME SEQUENCES
1603C                 WITH GEOPHYSICAL APPLICATIONS:  A WORKING PAPER
1604C                 (PENN STATE INTERFACE CONFERANCE ON ASTRONOMY
1605C                 AUGUST 11-14, 1991)
1606C     WRITTEN BY--JAMES J. FILLIBEN
1607C                 STATISTICAL ENGINEERING DIVISION
1608C                 INFORMATION TECHNOLOGY LABORATORY
1609C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
1610C                 GAITHERSBURG, MD 20899-8980
1611C                 PHONE--301-975-2855
1612C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1613C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1614C     LANGUAGE--ANSI FORTRAN (1966)
1615C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
1616C                          DENOTED BY QUOTES RATHER THAN NH.
1617C     VERSION NUMBER--91.8
1618C     ORIGINAL VERSION--AUGUST    1991.
1619C     UPDATED         --JANUARY   2007.  CALL LIST TO RANK
1620C
1621C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1622C
1623      CHARACTER*4 IWRITE
1624      CHARACTER*4 IBUGA3
1625      CHARACTER*4 IERROR
1626C
1627      CHARACTER*4 IWRIT2
1628C
1629      CHARACTER*4 ISUBN1
1630      CHARACTER*4 ISUBN2
1631C
1632C---------------------------------------------------------------------
1633C
1634      DOUBLE PRECISION DN
1635      DOUBLE PRECISION DXI
1636      DOUBLE PRECISION DXIM1
1637      DOUBLE PRECISION DYI
1638      DOUBLE PRECISION DYIM1
1639      DOUBLE PRECISION DDELX
1640      DOUBLE PRECISION DDELY
1641      DOUBLE PRECISION DSUMX
1642      DOUBLE PRECISION DSUMY
1643      DOUBLE PRECISION DSUMXY
1644      DOUBLE PRECISION DSQRTX
1645      DOUBLE PRECISION DSQRTY
1646C
1647      DIMENSION X(*)
1648      DIMENSION Y(*)
1649C
1650      DIMENSION XTEMP(*)
1651      DIMENSION YTEMP(*)
1652      DIMENSION XTEMP2(*)
1653C
1654C---------------------------------------------------------------------
1655C
1656      INCLUDE 'DPCOP2.INC'
1657C
1658C-----START POINT-----------------------------------------------------
1659C
1660      ISUBN1='RANK'
1661      ISUBN2='CM  '
1662      IERROR='NO'
1663C
1664      DN=0.0D0
1665      DSUMX=0.0D0
1666      DSUMY=0.0D0
1667      DSUMXY=0.0D0
1668C
1669      IF(IBUGA3.EQ.'OFF')GOTO90
1670      WRITE(ICOUT,999)
1671  999 FORMAT(1X)
1672      CALL DPWRST('XXX','BUG ')
1673      WRITE(ICOUT,51)
1674   51 FORMAT('***** AT THE BEGINNING OF RANKCM--')
1675      CALL DPWRST('XXX','BUG ')
1676      WRITE(ICOUT,52)IBUGA3
1677   52 FORMAT('IBUGA3 = ',A4)
1678      CALL DPWRST('XXX','BUG ')
1679      WRITE(ICOUT,53)N
1680   53 FORMAT('N = ',I8)
1681      CALL DPWRST('XXX','BUG ')
1682      DO55I=1,N
1683      WRITE(ICOUT,56)I,X(I),Y(I)
1684   56 FORMAT('I,X(I),Y(I) = ',I8,2E15.7)
1685      CALL DPWRST('XXX','BUG ')
1686   55 CONTINUE
1687   90 CONTINUE
1688C
1689C               ********************************************
1690C               **  COMPUTE RANK COMOVEMENT  COEFFICIENT  **
1691C               ********************************************
1692C
1693C               ********************************************
1694C               **  STEP 1--                              **
1695C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
1696C               ********************************************
1697C
1698      AN=N
1699C
1700      IF(2.LE.N.AND.N.LE.MAXNXT)GOTO119
1701      IERROR='YES'
1702      WRITE(ICOUT,999)
1703      CALL DPWRST('XXX','BUG ')
1704      WRITE(ICOUT,111)
1705  111 FORMAT('***** ERROR IN RANKCM--')
1706      CALL DPWRST('XXX','BUG ')
1707      WRITE(ICOUT,112)
1708  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
1709      CALL DPWRST('XXX','BUG ')
1710      WRITE(ICOUT,113)
1711  113 FORMAT('      IN THE VARIABLE FOR WHICH')
1712      CALL DPWRST('XXX','BUG ')
1713      WRITE(ICOUT,114)
1714  114 FORMAT('      THE RANK COMOVEMENT COEFFICIENT IS TO BE')
1715      CALL DPWRST('XXX','BUG ')
1716      WRITE(ICOUT,115)MAXNXT
1717  115 FORMAT('      MUST BE BETWEEN 2 AND ',I8,' (INCLUSIVELY).')
1718      CALL DPWRST('XXX','BUG ')
1719      WRITE(ICOUT,116)
1720  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
1721      CALL DPWRST('XXX','BUG ')
1722      WRITE(ICOUT,117)N
1723  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
1724     1'.')
1725      CALL DPWRST('XXX','BUG ')
1726      GOTO9000
1727  119 CONTINUE
1728C
1729      IF(N.EQ.2)GOTO120
1730      GOTO129
1731  120 CONTINUE
1732      WRITE(ICOUT,999)
1733      CALL DPWRST('XXX','BUG ')
1734      WRITE(ICOUT,121)
1735  121 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCM--',
1736     1'THE THIRD INPUT ARGUMENT (N) HAS THE VALUE 2')
1737      CALL DPWRST('XXX','BUG ')
1738      XYRACM=0.0
1739      GOTO9000
1740  129 CONTINUE
1741C
1742      HOLD=X(1)
1743      DO135I=2,N
1744      IF(X(I).NE.HOLD)GOTO139
1745  135 CONTINUE
1746      WRITE(ICOUT,999)
1747      CALL DPWRST('XXX','BUG ')
1748      WRITE(ICOUT,136)HOLD
1749  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCM--',
1750     1'THE 1ST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
1751      CALL DPWRST('XXX','BUG ')
1752      XYRACM=0.0
1753      GOTO9000
1754  139 CONTINUE
1755C
1756      HOLD=Y(1)
1757      DO145I=2,N
1758      IF(Y(I).NE.HOLD)GOTO149
1759  145 CONTINUE
1760      WRITE(ICOUT,999)
1761      CALL DPWRST('XXX','BUG ')
1762      WRITE(ICOUT,146)HOLD
1763  146 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCM--',
1764     1'THE 2ND INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
1765      CALL DPWRST('XXX','BUG ')
1766      XYRACM=0.0
1767      GOTO9000
1768  149 CONTINUE
1769C
1770C               *************************************************
1771C               **  STEP 2--                                   **
1772C               **  COMPUTE THE RANK COMOVEMENT  COEFFICIENT.  **
1773C               *************************************************
1774C
1775      IWRIT2=IBUGA3
1776      CALL RANK(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
1777      CALL RANK(Y,N,IWRIT2,YTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
1778C
1779      DN=N
1780      DSUMX=0.0D0
1781      DSUMY=0.0D0
1782      DSUMXY=0.0D0
1783      DO300I=2,N
1784      IM1=I-1
1785      DXI=XTEMP(I)
1786      DXIM1=XTEMP(IM1)
1787      DDELX=DXI-DXIM1
1788      DYI=YTEMP(I)
1789      DYIM1=YTEMP(IM1)
1790      DDELY=DYI-DYIM1
1791      DSUMX=DSUMX+DDELX**2
1792      DSUMY=DSUMY+DDELY**2
1793      DSUMXY=DSUMXY+DDELX*DDELY
1794  300 CONTINUE
1795      DSQRTX=0.0
1796      IF(DSUMX.GT.0.0D0)DSQRTX=DSQRT(DSUMX)
1797      DSQRTY=0.0
1798      IF(DSUMY.GT.0.0D0)DSQRTY=DSQRT(DSUMY)
1799      XYRACM=DSUMXY/(DSQRTX*DSQRTY)
1800C
1801C               *******************************
1802C               **  STEP 3--                 **
1803C               **  WRITE OUT A LINE         **
1804C               **  OF SUMMARY INFORMATION.  **
1805C               *******************************
1806C
1807      IF(IFEEDB.EQ.'OFF')GOTO890
1808      IF(IWRITE.EQ.'OFF')GOTO890
1809      WRITE(ICOUT,999)
1810      CALL DPWRST('XXX','BUG ')
1811      WRITE(ICOUT,811)N,XYRACM
1812  811 FORMAT('THE RANK COMOVEMENT COEFFICIENT OF THE ',I8,
1813     1' OBSERVATIONS = ',E15.7)
1814      CALL DPWRST('XXX','BUG ')
1815  890 CONTINUE
1816C
1817C               *****************
1818C               **  STEP 90--  **
1819C               **  EXIT.      **
1820C               *****************
1821C
1822 9000 CONTINUE
1823      IF(IBUGA3.EQ.'OFF')GOTO9090
1824      WRITE(ICOUT,999)
1825      CALL DPWRST('XXX','BUG ')
1826      WRITE(ICOUT,9011)
1827 9011 FORMAT('***** AT THE END       OF RANKCM--')
1828      CALL DPWRST('XXX','BUG ')
1829      WRITE(ICOUT,9012)IBUGA3,IERROR
1830 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
1831      CALL DPWRST('XXX','BUG ')
1832      WRITE(ICOUT,9013)N
1833 9013 FORMAT('N = ',I8)
1834      CALL DPWRST('XXX','BUG ')
1835      WRITE(ICOUT,9014)DN,DSUMX,DSUMY,DSUMXY
1836 9014 FORMAT('DN,DSUMX,DSUMY,DSUMXY = ',4D15.7)
1837      CALL DPWRST('XXX','BUG ')
1838      WRITE(ICOUT,9015)XYRACM
1839 9015 FORMAT('XYRACM = ',E15.7)
1840      CALL DPWRST('XXX','BUG ')
1841 9090 CONTINUE
1842C
1843      RETURN
1844      END
1845      SUBROUTINE RANCOM(K,N,ISEED,X,ITEMP1)
1846C
1847C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM COMPOSITION
1848C              OF THE INTEGER N INTO K NON-NEGATIVE INTEGERS.
1849C     INPUT  ARGUMENTS--K      = THE INTEGER NUMBER DENOTING THE
1850C                                NUMBER OF ELEMENTS IN THE
1851C                                COMPOSITION
1852C                     --N      = THE INTEGER NUMBER BEING COMPOSED.
1853C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
1854C                                (OF DIMENSION AT LEAST K)
1855C                                INTO WHICH THE GENERATED
1856C                                RANDOM COMPOSITION IS PLACED.
1857C     OUTPUT--A RANDOM COMPOSITION OF THE INTEGER N INTO K ELEMENTS.
1858C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1859C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
1860C                   OF N FOR THIS SUBROUTINE.   HOWEVER, K <= N.
1861C     OTHER DATAPAC   SUBROUTINES NEEDED--RANKSB.
1862C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
1863C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
1864C     LANGUAGE--ANSI FORTRAN (1977)
1865C     REFERENCE: NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
1866C                ALGORITHMS', ACADEMIC PRESS, 1975, CH. 6, P. 48.
1867C     WRITTEN BY--JAMES J. FILLIBEN
1868C                 STATISTICAL ENGINEERING DIVISION
1869C                 INFORMATION TECHNOLOGY LABORATORY
1870C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
1871C                 GAITHERSBURG, MD 20899-8980
1872C                 PHONE--301-975-2855
1873C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1874C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1875C     LANGUAGE--ANSI FORTRAN (1977)
1876C     VERSION NUMBER--2008/5
1877C     ORIGINAL VERSION--MAY       2008.
1878C
1879C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1880C
1881      DIMENSION X(*)
1882      INTEGER   ITEMP1(*)
1883C
1884C-----COMMON----------------------------------------------------------
1885C
1886      INCLUDE 'DPCOP2.INC'
1887C
1888C-----START POINT-----------------------------------------------------
1889C
1890C     CHECK THE INPUT ARGUMENTS FOR ERRORS
1891C
1892      IF(K.LT.1)THEN
1893        WRITE(ICOUT,5)
1894        CALL DPWRST('XXX','BUG ')
1895        WRITE(ICOUT,6)
1896        CALL DPWRST('XXX','BUG ')
1897        WRITE(ICOUT,47)K
1898        CALL DPWRST('XXX','BUG ')
1899        GOTO9000
1900      ELSEIF(N.LT.1)THEN
1901        WRITE(ICOUT,15)
1902        CALL DPWRST('XXX','BUG ')
1903        WRITE(ICOUT,48)N
1904        CALL DPWRST('XXX','BUG ')
1905        GOTO9000
1906      ELSEIF(K.GT.N)THEN
1907        WRITE(ICOUT,25)
1908        CALL DPWRST('XXX','BUG ')
1909        WRITE(ICOUT,26)
1910        CALL DPWRST('XXX','BUG ')
1911        WRITE(ICOUT,47)K
1912        CALL DPWRST('XXX','BUG ')
1913        WRITE(ICOUT,48)N
1914        CALL DPWRST('XXX','BUG ')
1915        GOTO9000
1916      ENDIF
1917    5 FORMAT('***** ERROR--FOR THE RANDOM COMPOSITION OF N, THE')
1918    6 FORMAT('      REQUESTED NUMBER OF ELEMENTS IS NON-POSITIVE.')
1919   15 FORMAT('***** ERROR--FOR THE RANDOM COMPOSITION OF N, THE ',
1920     1       'VALUE OF N IS NON-POSITIVE.')
1921   25 FORMAT('***** ERROR--FOR THE RANDOM COMPOSITION OF N INTO ',
1922     1       'K ELEMENTS,')
1923   26 FORMAT('      K IS GREATER THAN N.')
1924   47 FORMAT('***** THE VALUE OF K IS ',I8)
1925   48 FORMAT('***** THE VALUE OF N IS ',I8)
1926C
1927C     GENERATE A RANDOM COMPOSITION OF N INTO K ELEMENTS
1928C
1929      NTEMP1=N+K-1
1930      NTEMP2=K-1
1931      CALL RANKSB(NTEMP2,NTEMP1,ISEED,X,ITEMP1)
1932      CALL SORT(X,NTEMP2,X)
1933      DO100I=1,NTEMP2
1934        ITEMP1(I)=INT(X(I)+0.5)
1935  100 CONTINUE
1936C
1937      ITEMP1(K)=N+K
1938      L=0
1939      DO200I=1,K
1940        M=ITEMP1(I)
1941        ITEMP1(I)=M-L-1
1942        L=M
1943  200 CONTINUE
1944C
1945      DO300I=1,K
1946        X(I)=REAL(ITEMP1(I))
1947  300 CONTINUE
1948C
1949 9000 CONTINUE
1950      RETURN
1951      END
1952      SUBROUTINE RANKCR(X,Y,N,IRCRTA,IWRITE,XTEMP,YTEMP,XTEMP2,MAXNXT,
1953     1                  XYRACR,STATCD,PVAL,PVALLT,PVALUT,
1954     1                  CUTU90,CUTU95,CTU975,CUTU99,CTU995,CTU999,
1955     1                  CUTL90,CUTL95,CTL975,CUTL99,CTL995,CTL999,
1956     1                  IBUGA3,ISUBRO,IERROR)
1957C
1958C     PURPOSE--THIS SUBROUTINE COMPUTES THE SPEARMAN RANK CORRELATION
1959C              COEFFICIENT BETWEEN THE 2 SETS OF DATA IN THE INPUT
1960C              VECTORS X AND Y.
1961C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
1962C                                (UNSORTED OR SORTED) OBSERVATIONS
1963C                                WHICH CONSTITUTE THE FIRST SET
1964C                                OF DATA.
1965C                     --Y      = THE SINGLE PRECISION VECTOR OF
1966C                                (UNSORTED OR SORTED) OBSERVATIONS
1967C                                WHICH CONSTITUTE THE SECOND SET
1968C                                OF DATA.
1969C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
1970C                                IN THE VECTOR X, OR EQUIVALENTLY,
1971C                                THE INTEGER NUMBER OF OBSERVATIONS
1972C                                IN THE VECTOR Y.
1973C     OUTPUT ARGUMENTS--XYRACR = THE SINGLE PRECISION VALUE OF THE
1974C                                COMPUTED SPEARMAN RANK CORRELATION
1975C                                COEFFICIENT BETWEEN THE 2 SETS OF DATA
1976C                                IN THE INPUT VECTORS X AND Y.
1977C                                THIS SINGLE PRECISION VALUE
1978C                                WILL BE BETWEEN -1.0 AND 1.0
1979C                                (INCLUSIVELY).
1980C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
1981C             SPEARMAN RANK CORRELATION COEFFICIENT BETWEEN THE 2 SETS
1982C             OF DATA IN THE INPUT VECTORS X AND Y.
1983C     OTHER DATAPAC   SUBROUTINES NEEDED--RANK AND SORT.
1984C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
1985C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
1986C     LANGUAGE--ANSI FORTRAN (1977)
1987C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
1988C                 STATISTICS, VOLUME 2, EDITION 1, 1961, PAGES 476-477.
1989C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
1990C                 EDITION 6, 1967, PAGES 193-195.
1991C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
1992C                 ANALYSIS, EDITION 2, 1957, PAGES 294-295.
1993C               --MOOD AND GRABLE, 'INTRODUCTION TO THE THEORY
1994C                 OF STATISTICS, EDITION 2, 1963, PAGE 424.
1995C               --W. J. CONOVER, "PRACTICAL NON-PARAMETRIC
1996C                 STATISTICS", THIRD EDITION, WILEY, 1999,
1997C                 PP. 318-322.
1998C     WRITTEN BY--JAMES J. FILLIBEN
1999C                 STATISTICAL ENGINEERING DIVISION
2000C                 INFORMATION TECHNOLOGY LABORATORY
2001C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
2002C                 GAITHERSBURG, MD 20899-8980
2003C                 PHONE--301-975-2855
2004C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
2005C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
2006C     LANGUAGE--ANSI FORTRAN (1977)
2007C     VERSION NUMBER--82.6
2008C     ORIGINAL VERSION--JUNE      1972.
2009C     UPDATED         --OCTOBER   1974.
2010C     UPDATED         --JANUARY   1975.
2011C     UPDATED         --SEPTEMBER 1975.
2012C     UPDATED         --NOVEMBER  1975.
2013C     UPDATED         --FEBRUARY  1976.
2014C     UPDATED         --JUNE      1979.
2015C     UPDATED         --JULY      1979.
2016C     UPDATED         --JULY      1981.
2017C     UPDATED         --AUGUST    1981.
2018C     UPDATED         --MAY       1982.
2019C     UPDATED         --JANUARY   2007. CALL LIST TO RANK
2020C     UPDATED         --FEBRUARY  2013. RETURN CRITICAL VALUES FOR
2021C                                       SMALL SAMPLES, CDF/PVALUES
2022C                                       FOR LARGE SAMPLES
2023C
2024C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
2025C
2026      CHARACTER*4 IRCRTA
2027      CHARACTER*4 IWRITE
2028      CHARACTER*4 IBUGA3
2029      CHARACTER*4 ISUBRO
2030      CHARACTER*4 IERROR
2031C
2032      CHARACTER*4 IWRIT2
2033C
2034      CHARACTER*4 ISUBN1
2035      CHARACTER*4 ISUBN2
2036C
2037C---------------------------------------------------------------------
2038C
2039      DOUBLE PRECISION DN
2040      DOUBLE PRECISION DX1
2041      DOUBLE PRECISION DX2
2042      DOUBLE PRECISION DSUM1
2043      DOUBLE PRECISION DSUM2
2044      DOUBLE PRECISION DSUM12
2045      DOUBLE PRECISION DMEAN1
2046      DOUBLE PRECISION DMEAN2
2047C
2048      DIMENSION X(*)
2049      DIMENSION Y(*)
2050C
2051      DIMENSION XTEMP(*)
2052      DIMENSION YTEMP(*)
2053      DIMENSION XTEMP2(*)
2054C
2055      DIMENSION WP900(30)
2056      DIMENSION WP950(30)
2057      DIMENSION WP975(30)
2058      DIMENSION WP990(30)
2059      DIMENSION WP995(30)
2060      DIMENSION WP999(30)
2061C
2062C-----COMMON----------------------------------------------------------
2063C
2064      INCLUDE 'DPCOP2.INC'
2065C
2066C-----START POINT-----------------------------------------------------
2067C
2068      DATA WP900/
2069     1  -9.9999,-9.9999,-9.9999, 0.8000, 0.7000, 0.6000, 0.5357, 0.5000,
2070     1   0.4667, 0.4424, 0.4182, 0.3986, 0.3791, 0.3626, 0.3500, 0.3382,
2071     1   0.3260, 0.3148, 0.3070, 0.2977, 0.2909, 0.2829, 0.2767, 0.2704,
2072     1   0.2646, 0.2588, 0.2540, 0.2490, 0.2443, 0.2400/
2073C
2074      DATA WP950/
2075     1  -9.9999,-9.9999,-9.9999, 0.8000, 0.8000, 0.7714, 0.6786, 0.6190,
2076     1   0.5833, 0.5515, 0.5273, 0.4965, 0.4780, 0.4593, 0.4429, 0.4265,
2077     1   0.4118, 0.3994, 0.3895, 0.3789, 0.3688, 0.3597, 0.3518, 0.3435,
2078     1   0.3362, 0.3299, 0.3236, 0.3175, 0.3113, 0.3059/
2079C
2080      DATA WP975/
2081     1  -9.9999,-9.9999,-9.9999,-9.9999, 0.9000, 0.8286, 0.7500, 0.7143,
2082     1   0.6833, 0.6364, 0.6091, 0.5804, 0.5549, 0.5341, 0.5179, 0.5000,
2083     1   0.4853, 0.4696, 0.4579, 0.4451, 0.4351, 0.4241, 0.4150, 0.4061,
2084     1   0.3977, 0.3894, 0.3822, 0.3749, 0.3685, 0.3620/
2085C
2086      DATA WP990/
2087     1  -9.9999,-9.9999,-9.9999,-9.9999, 0.9000, 0.8857, 0.8571, 0.8095,
2088     1   0.7667, 0.7333, 0.7000, 0.6713, 0.6429, 0.6220, 0.6000, 0.5794,
2089     1   0.5637, 0.5480, 0.5333, 0.5203, 0.5078, 0.4963, 0.4852, 0.4748,
2090     1   0.4654, 0.4564, 0.4481, 0.4401, 0.4320, 0.4251/
2091C
2092      DATA WP995/
2093     1  -9.9999,-9.9999,-9.9999,-9.9999,-9.9999, 0.9429, 0.8929, 0.8571,
2094     1   0.8167, 0.7818, 0.7455, 0.7203, 0.6978, 0.6747, 0.6500, 0.6324,
2095     1   0.6152, 0.5975, 0.5825, 0.5684, 0.5545, 0.5426, 0.5306, 0.5200,
2096     1   0.5100, 0.5002, 0.4915, 0.4828, 0.4744, 0.4665/
2097C
2098      DATA WP999/
2099     1  -9.9999,-9.9999,-9.9999,-9.9999,-9.9999,-9.9999, 0.9643, 0.9286,
2100     1   0.9000, 0.8667, 0.8364, 0.8112, 0.7857, 0.7670, 0.7464, 0.7265,
2101     1   0.7083, 0.6904, 0.6737, 0.6586, 0.6455, 0.6318, 0.6186, 0.6070,
2102     1   0.5962, 0.5856, 0.5757, 0.5660, 0.5567, 0.5479/
2103C
2104      ISUBN1='RANK'
2105      ISUBN2='CR  '
2106C
2107      IERROR='NO'
2108C
2109      DN=0.0D0
2110      DMEAN1=0.0D0
2111      DMEAN2=0.0D0
2112      DSUM12=0.0D0
2113C
2114      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NKCR')THEN
2115        WRITE(ICOUT,999)
2116  999   FORMAT(1X)
2117        CALL DPWRST('XXX','BUG ')
2118        WRITE(ICOUT,51)
2119   51   FORMAT('***** AT THE BEGINNING OF RANKCR--')
2120        CALL DPWRST('XXX','BUG ')
2121        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
2122   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
2123        CALL DPWRST('XXX','BUG ')
2124        DO55I=1,N
2125          WRITE(ICOUT,56)I,X(I),Y(I)
2126   56     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
2127          CALL DPWRST('XXX','BUG ')
2128   55   CONTINUE
2129      ENDIF
2130C
2131C               ********************************************
2132C               **  COMPUTE RANK CORRELATION COEFFICIENT  **
2133C               ********************************************
2134C
2135C               ********************************************
2136C               **  STEP 1--                              **
2137C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
2138C               ********************************************
2139C
2140      AN=N
2141C
2142      IF(N.LT.1 .OR. N.GT.MAXNXT)THEN
2143        IERROR='YES'
2144        WRITE(ICOUT,999)
2145        CALL DPWRST('XXX','BUG ')
2146        WRITE(ICOUT,111)
2147  111   FORMAT('***** ERROR IN RANK CORRELATION--')
2148        CALL DPWRST('XXX','BUG ')
2149        WRITE(ICOUT,112)
2150  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE ',
2151     1         'VARIABLES')
2152        CALL DPWRST('XXX','BUG ')
2153        WRITE(ICOUT,115)MAXNXT
2154  115   FORMAT('      MUST BE BETWEEN 1 AND ',I8,' (INCLUSIVELY).')
2155        CALL DPWRST('XXX','BUG ')
2156        WRITE(ICOUT,117)N
2157  117   FORMAT('      THE NUMBER OF OBSERVATIONS  = ',I8)
2158        CALL DPWRST('XXX','BUG ')
2159        GOTO9000
2160      ELSEIF(N.EQ.1)THEN
2161        WRITE(ICOUT,999)
2162        CALL DPWRST('XXX','BUG ')
2163        WRITE(ICOUT,121)
2164  121   FORMAT('***** WARNING IN RANK CORRELATION--')
2165        CALL DPWRST('XXX','BUG ')
2166        WRITE(ICOUT,123)
2167  123   FORMAT('      THE NUMBER OF OBSERVATIONS IS ONE.')
2168        CALL DPWRST('XXX','BUG ')
2169        XYRACR=1.0
2170        GOTO9000
2171      ENDIF
2172C
2173      HOLD=X(1)
2174      DO135I=2,N
2175       IF(X(I).NE.HOLD)GOTO139
2176  135 CONTINUE
2177      WRITE(ICOUT,999)
2178      CALL DPWRST('XXX','BUG ')
2179      WRITE(ICOUT,121)
2180      CALL DPWRST('XXX','BUG ')
2181      WRITE(ICOUT,136)HOLD
2182  136 FORMAT('      THE FIRST RESPONSE VARIABLE HAS ALL ELEMENTS = ',
2183     1       G15.7)
2184      CALL DPWRST('XXX','BUG ')
2185      XYRACR=1.0
2186      GOTO9000
2187  139 CONTINUE
2188C
2189      HOLD=Y(1)
2190      DO145I=2,N
2191        IF(Y(I).NE.HOLD)GOTO149
2192  145 CONTINUE
2193      WRITE(ICOUT,999)
2194      CALL DPWRST('XXX','BUG ')
2195      WRITE(ICOUT,121)
2196      CALL DPWRST('XXX','BUG ')
2197      WRITE(ICOUT,146)HOLD
2198  146 FORMAT('      THE SECOND RESPONSE VARIABLE HAS ALL ELEMENTS = ',
2199     1       G15.7)
2200      CALL DPWRST('XXX','BUG ')
2201      XYRACR=1.0
2202      GOTO9000
2203  149 CONTINUE
2204C
2205C               *************************************************
2206C               **  STEP 2--                                   **
2207C               **  COMPUTE THE RANK CORRELATION COEFFICIENT.  **
2208C               *************************************************
2209C
2210      IWRIT2='OFF'
2211      CALL RANK(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
2212      CALL RANK(Y,N,IWRIT2,YTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
2213C
2214      DN=N
2215      DSUM1=0.0D0
2216      DSUM2=0.0D0
2217      DO200I=1,N
2218        DX1=XTEMP(I)
2219        DX2=YTEMP(I)
2220        DSUM1=DSUM1+DX1
2221        DSUM2=DSUM2+DX2
2222  200 CONTINUE
2223      DMEAN1=DSUM1/DN
2224      DMEAN2=DSUM2/DN
2225C
2226      DSUM1=0.0D0
2227      DSUM2=0.0D0
2228      DSUM12=0.0D0
2229      DO300I=1,N
2230        DX1=XTEMP(I)
2231        DX2=YTEMP(I)
2232        DSUM1=DSUM1+(DX1-DMEAN1)*(DX1-DMEAN1)
2233        DSUM2=DSUM2+(DX2-DMEAN2)*(DX2-DMEAN2)
2234        DSUM12=DSUM12+(DX1-DMEAN1)*(DX2-DMEAN2)
2235  300 CONTINUE
2236      DSQRT1=0.0
2237      IF(DSUM1.GT.0.0D0)DSQRT1=DSQRT(DSUM1)
2238      DSQRT2=0.0
2239      IF(DSUM2.GT.0.0D0)DSQRT2=DSQRT(DSUM2)
2240      XYRACR=DSUM12/(DSQRT1*DSQRT2)
2241C
2242C               *************************************************
2243C               **  STEP 2B--                                  **
2244C               **  NOW COMPUTE CDF, PVALUE, AND CRITICAL      **
2245C               **  VALUES.                                    **
2246C               *************************************************
2247C
2248C     USE TABLED CRITICAL VALUES FROM TABLE A10 OF CONOVER FOR N <= 30.
2249C     OTHERWISE, USE
2250C
2251C           W(p) = Z(p)/SQRT(N-1)
2252C
2253      AN=REAL(N)
2254      ANUM=1.0
2255      DENOM=SQRT(AN-1.0)
2256      AFACT=ANUM/DENOM
2257      ATEMP=XYRACR/AFACT
2258      CALL NORCDF(ATEMP,STATCD)
2259      PVALLT=STATCD
2260      PVALUT=1.0 - STATCD
2261      PVAL=2.0*MIN(PVALLT,PVALUT)
2262C
2263      IF(N.GT.30 .OR. IRCRTA.EQ.'NORM')THEN
2264        P=0.90
2265        CALL NORPPF(P,CUTU90)
2266        P=0.95
2267        CALL NORPPF(P,CUTU95)
2268        P=0.975
2269        CALL NORPPF(P,CTU975)
2270        P=0.99
2271        CALL NORPPF(P,CUTU99)
2272        P=0.995
2273        CALL NORPPF(P,CTU995)
2274        P=0.999
2275        CALL NORPPF(P,CTU999)
2276        CUTU90=AFACT*CUTU90
2277        CUTU95=AFACT*CUTU95
2278        CTU975=AFACT*CTU975
2279        CUTU99=AFACT*CUTU99
2280        CTU995=AFACT*CTU995
2281        CTU999=AFACT*CTU999
2282      ELSE
2283        CUTU90=WP900(N)
2284        CUTU95=WP950(N)
2285        CTU975=WP975(N)
2286        CUTU99=WP990(N)
2287        CTU995=WP995(N)
2288        CTU999=WP999(N)
2289      ENDIF
2290      CUTL90=-CUTU90
2291      CUTL95=-CUTU95
2292      CTL975=-CTU975
2293      CUTL95=-CUTU95
2294      CTL995=-CTU995
2295      CTL999=-CTU999
2296      IF(CUTU90.LT.-9.0)CUTU90=CPUMIN
2297      IF(CUTU95.LT.-9.0)CUTU95=CPUMIN
2298      IF(CTU975.LT.-9.0)CTU975=CPUMIN
2299      IF(CUTU99.LT.-9.0)CUTU99=CPUMIN
2300      IF(CTU995.LT.-9.0)CTU995=CPUMIN
2301      IF(CTU999.LT.-9.0)CTU999=CPUMIN
2302      IF(CUTL90.GT.9.0)CUTL90=CPUMIN
2303      IF(CUTL95.GT.9.0)CUTL95=CPUMIN
2304      IF(CTL975.GT.9.0)CTL975=CPUMIN
2305      IF(CUTL99.GT.9.0)CUTL99=CPUMIN
2306      IF(CTL995.GT.9.0)CTL995=CPUMIN
2307      IF(CTL999.GT.9.0)CTL999=CPUMIN
2308C
2309C               *******************************
2310C               **  STEP 3--                 **
2311C               **  WRITE OUT A LINE         **
2312C               **  OF SUMMARY INFORMATION.  **
2313C               *******************************
2314C
2315      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
2316        WRITE(ICOUT,999)
2317        CALL DPWRST('XXX','BUG ')
2318        WRITE(ICOUT,811)N,XYRACR
2319  811   FORMAT('THE RANK CORRELATION COEFFICIENT OF THE ',I8,
2320     1         ' OBSERVATIONS = ',G15.7)
2321        CALL DPWRST('XXX','BUG ')
2322      ENDIF
2323C
2324C               *****************
2325C               **  STEP 90--  **
2326C               **  EXIT.      **
2327C               *****************
2328C
2329 9000 CONTINUE
2330      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NKCR')THEN
2331        WRITE(ICOUT,999)
2332        CALL DPWRST('XXX','BUG ')
2333        WRITE(ICOUT,9011)
2334 9011   FORMAT('***** AT THE END       OF RANKCR--')
2335        CALL DPWRST('XXX','BUG ')
2336        WRITE(ICOUT,9012)IERROR
2337 9012   FORMAT('IERROR = ',A4)
2338        CALL DPWRST('XXX','BUG ')
2339        WRITE(ICOUT,9014)DN,DMEAN1,DMEAN2,DSUM12
2340 9014   FORMAT('DN,DMEAN1,DMEAN2,DSUM12 = ',4D15.7)
2341        CALL DPWRST('XXX','BUG ')
2342        WRITE(ICOUT,9015)XYRACR
2343 9015   FORMAT('XYRACR = ',G15.7)
2344        CALL DPWRST('XXX','BUG ')
2345      ENDIF
2346C
2347      RETURN
2348      END
2349      SUBROUTINE RANKCV(X,Y,N,IWRITE,XTEMP,YTEMP,XTEMP2,
2350     1MAXNXT,XYRACV,
2351     1IBUGA3,IERROR)
2352C
2353C     PURPOSE--THIS SUBROUTINE COMPUTES THE
2354C              SPEARMAN RANK COVARIANCE COEFFICIENT
2355C              BETWEEN THE 2 SETS OF DATA IN THE INPUT VECTORS X AND Y.
2356C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
2357C                                (UNSORTED OR SORTED) OBSERVATIONS
2358C                                WHICH CONSTITUTE THE FIRST SET
2359C                                OF DATA.
2360C                     --Y      = THE SINGLE PRECISION VECTOR OF
2361C                                (UNSORTED OR SORTED) OBSERVATIONS
2362C                                WHICH CONSTITUTE THE SECOND SET
2363C                                OF DATA.
2364C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
2365C                                IN THE VECTOR X, OR EQUIVALENTLY,
2366C                                THE INTEGER NUMBER OF OBSERVATIONS
2367C                                IN THE VECTOR Y.
2368C     OUTPUT ARGUMENTS--XYRACV = THE SINGLE PRECISION VALUE OF THE
2369C                                COMPUTED SPEARMAN RANK COVARIANCE
2370C                                COEFFICIENT BETWEEN THE 2 SETS OF DATA
2371C                                IN THE INPUT VECTORS X AND Y.
2372C                                THIS SINGLE PRECISION VALUE
2373C                                WILL BE BETWEEN -1.0 AND 1.0
2374C                                (INCLUSIVELY).
2375C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
2376C             SPEARMAN RANK COVARIANCE COEFFICIENT BETWEEN THE 2 SETS
2377C             OF DATA IN THE INPUT VECTORS X AND Y.
2378C     OTHER DATAPAC   SUBROUTINES NEEDED--RANK AND SORT.
2379C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
2380C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
2381C     LANGUAGE--ANSI FORTRAN (1977)
2382C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
2383C                 STATISTICS, VOLUME 2, EDITION 1, 1961, PAGES 476-477.
2384C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
2385C                 EDITION 6, 1967, PAGES 193-195.
2386C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
2387C                 ANALYSIS, EDITION 2, 1957, PAGES 294-295.
2388C               --MOOD AND GRABLE, 'INTRODUCTION TO THE THEORY
2389C                 OF STATISTICS, EDITION 2, 1963, PAGE 424.
2390C     WRITTEN BY--JAMES J. FILLIBEN
2391C                 STATISTICAL ENGINEERING DIVISION
2392C                 INFORMATION TECHNOLOGY LABORATORY
2393C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
2394C                 GAITHERSBURG, MD 20899-8980
2395C                 PHONE--301-975-2855
2396C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
2397C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
2398C     LANGUAGE--ANSI FORTRAN (1966)
2399C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
2400C                          DENOTED BY QUOTES RATHER THAN NH.
2401C     VERSION NUMBER--82.6
2402C     ORIGINAL VERSION--JUNE      1972.
2403C     UPDATED         --OCTOBER   1974.
2404C     UPDATED         --JANUARY   1975.
2405C     UPDATED         --SEPTEMBER 1975.
2406C     UPDATED         --NOVEMBER  1975.
2407C     UPDATED         --FEBRUARY  1976.
2408C     UPDATED         --JUNE      1979.
2409C     UPDATED         --JULY      1979.
2410C     UPDATED         --JULY      1981.
2411C     UPDATED         --AUGUST    1981.
2412C     UPDATED         --MAY       1982.
2413C     UPDATED         --JANUARY   2007.  CALL LIST TO RANK
2414C
2415C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
2416C
2417      CHARACTER*4 IWRITE
2418      CHARACTER*4 IBUGA3
2419      CHARACTER*4 IERROR
2420C
2421      CHARACTER*4 IWRIT2
2422C
2423      CHARACTER*4 ISUBN1
2424      CHARACTER*4 ISUBN2
2425C
2426C---------------------------------------------------------------------
2427C
2428      DOUBLE PRECISION DN
2429      DOUBLE PRECISION DX1
2430      DOUBLE PRECISION DX2
2431      DOUBLE PRECISION DSUM1
2432      DOUBLE PRECISION DSUM2
2433      DOUBLE PRECISION DSUM12
2434      DOUBLE PRECISION DMEAN1
2435      DOUBLE PRECISION DMEAN2
2436C
2437      DIMENSION X(*)
2438      DIMENSION Y(*)
2439C
2440      DIMENSION XTEMP(*)
2441      DIMENSION YTEMP(*)
2442      DIMENSION XTEMP2(*)
2443C
2444C-----COMMON----------------------------------------------------------
2445C
2446      INCLUDE 'DPCOP2.INC'
2447C
2448C-----START POINT-----------------------------------------------------
2449C
2450      ISUBN1='RANK'
2451      ISUBN2='CV  '
2452      IERROR='NO'
2453C
2454      DN=0.0D0
2455      DMEAN1=0.0D0
2456      DMEAN2=0.0D0
2457      DSUM12=0.0D0
2458C
2459      IF(IBUGA3.EQ.'OFF')GOTO90
2460      WRITE(ICOUT,999)
2461  999 FORMAT(1X)
2462      CALL DPWRST('XXX','BUG ')
2463      WRITE(ICOUT,51)
2464   51 FORMAT('***** AT THE BEGINNING OF RANKCV--')
2465      CALL DPWRST('XXX','BUG ')
2466      WRITE(ICOUT,52)IBUGA3
2467   52 FORMAT('IBUGA3 = ',A4)
2468      CALL DPWRST('XXX','BUG ')
2469      WRITE(ICOUT,53)N
2470   53 FORMAT('N = ',I8)
2471      CALL DPWRST('XXX','BUG ')
2472      DO55I=1,N
2473      WRITE(ICOUT,56)I,X(I),Y(I)
2474   56 FORMAT('I,X(I),Y(I) = ',I8,2E15.7)
2475      CALL DPWRST('XXX','BUG ')
2476   55 CONTINUE
2477   90 CONTINUE
2478C
2479C               ********************************************
2480C               **  COMPUTE RANK COVARIANCE  COEFFICIENT  **
2481C               ********************************************
2482C
2483C               ********************************************
2484C               **  STEP 1--                              **
2485C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
2486C               ********************************************
2487C
2488      AN=N
2489C
2490      IF(1.LE.N.AND.N.LE.MAXNXT)GOTO119
2491      IERROR='YES'
2492      WRITE(ICOUT,999)
2493      CALL DPWRST('XXX','BUG ')
2494      WRITE(ICOUT,111)
2495  111 FORMAT('***** ERROR IN RANKCV--')
2496      CALL DPWRST('XXX','BUG ')
2497      WRITE(ICOUT,112)
2498  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
2499      CALL DPWRST('XXX','BUG ')
2500      WRITE(ICOUT,113)
2501  113 FORMAT('      IN THE VARIABLE FOR WHICH')
2502      CALL DPWRST('XXX','BUG ')
2503      WRITE(ICOUT,114)
2504  114 FORMAT('      THE RANK COVARIANCE COEFFICIENT IS TO BE')
2505      CALL DPWRST('XXX','BUG ')
2506      WRITE(ICOUT,115)MAXNXT
2507  115 FORMAT('      MUST BE BETWEEN 1 AND ',I8,' (INCLUSIVELY).')
2508      CALL DPWRST('XXX','BUG ')
2509      WRITE(ICOUT,116)
2510  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
2511      CALL DPWRST('XXX','BUG ')
2512      WRITE(ICOUT,117)N
2513  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
2514     1'.')
2515      CALL DPWRST('XXX','BUG ')
2516      GOTO9000
2517  119 CONTINUE
2518C
2519      IF(N.EQ.1)GOTO120
2520      GOTO129
2521  120 CONTINUE
2522      WRITE(ICOUT,999)
2523      CALL DPWRST('XXX','BUG ')
2524      WRITE(ICOUT,121)
2525  121 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCV--',
2526     1'THE THIRD INPUT ARGUMENT (N) HAS THE VALUE 1')
2527      CALL DPWRST('XXX','BUG ')
2528      XYRACV=0.0
2529      GOTO9000
2530  129 CONTINUE
2531C
2532      HOLD=X(1)
2533      DO135I=2,N
2534      IF(X(I).NE.HOLD)GOTO139
2535  135 CONTINUE
2536      WRITE(ICOUT,999)
2537      CALL DPWRST('XXX','BUG ')
2538      WRITE(ICOUT,136)HOLD
2539  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCV--',
2540     1'THE 1ST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
2541      CALL DPWRST('XXX','BUG ')
2542      XYRACV=0.0
2543      GOTO9000
2544  139 CONTINUE
2545C
2546      HOLD=Y(1)
2547      DO145I=2,N
2548      IF(Y(I).NE.HOLD)GOTO149
2549  145 CONTINUE
2550      WRITE(ICOUT,999)
2551      CALL DPWRST('XXX','BUG ')
2552      WRITE(ICOUT,146)HOLD
2553  146 FORMAT('***** NON-FATAL DIAGNOSTIC IN RANKCV--',
2554     1'THE 2ND INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
2555      CALL DPWRST('XXX','BUG ')
2556      XYRACV=0.0
2557      GOTO9000
2558  149 CONTINUE
2559C
2560C               *************************************************
2561C               **  STEP 2--                                   **
2562C               **  COMPUTE THE RANK COVARIANCE  COEFFICIENT.  **
2563C               *************************************************
2564C
2565      IWRIT2=IBUGA3
2566      CALL RANK(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
2567      CALL RANK(Y,N,IWRIT2,YTEMP,XTEMP2,MAXNXT,IBUGA3,IERROR)
2568C
2569      DN=N
2570      DSUM1=0.0D0
2571      DSUM2=0.0D0
2572      DO200I=1,N
2573      DX1=XTEMP(I)
2574      DX2=YTEMP(I)
2575      DSUM1=DSUM1+DX1
2576      DSUM2=DSUM2+DX2
2577  200 CONTINUE
2578      DMEAN1=DSUM1/DN
2579      DMEAN2=DSUM2/DN
2580C
2581      DSUM12=0.0D0
2582      DO300I=1,N
2583      DX1=XTEMP(I)
2584      DX2=YTEMP(I)
2585      DSUM12=DSUM12+(DX1-DMEAN1)*(DX2-DMEAN2)
2586  300 CONTINUE
2587      XYRACV=DSUM12/DN
2588C
2589C               *******************************
2590C               **  STEP 3--                 **
2591C               **  WRITE OUT A LINE         **
2592C               **  OF SUMMARY INFORMATION.  **
2593C               *******************************
2594C
2595      IF(IFEEDB.EQ.'OFF')GOTO890
2596      IF(IWRITE.EQ.'OFF')GOTO890
2597      WRITE(ICOUT,999)
2598      CALL DPWRST('XXX','BUG ')
2599      WRITE(ICOUT,811)N,XYRACV
2600  811 FORMAT('THE RANK COVARIANCE COEFFICIENT OF THE ',I8,
2601     1' OBSERVATIONS = ',E15.7)
2602      CALL DPWRST('XXX','BUG ')
2603  890 CONTINUE
2604C
2605C               *****************
2606C               **  STEP 90--  **
2607C               **  EXIT.      **
2608C               *****************
2609C
2610 9000 CONTINUE
2611      IF(IBUGA3.EQ.'OFF')GOTO9090
2612      WRITE(ICOUT,999)
2613      CALL DPWRST('XXX','BUG ')
2614      WRITE(ICOUT,9011)
2615 9011 FORMAT('***** AT THE END       OF RANKCV--')
2616      CALL DPWRST('XXX','BUG ')
2617      WRITE(ICOUT,9012)IBUGA3,IERROR
2618 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
2619      CALL DPWRST('XXX','BUG ')
2620      WRITE(ICOUT,9013)N
2621 9013 FORMAT('N = ',I8)
2622      CALL DPWRST('XXX','BUG ')
2623      WRITE(ICOUT,9014)DN,DMEAN1,DMEAN2,DSUM12
2624 9014 FORMAT('DN,DMEAN1,DMEAN2,DSUM12 = ',4D15.7)
2625      CALL DPWRST('XXX','BUG ')
2626      WRITE(ICOUT,9015)XYRACV
2627 9015 FORMAT('XYRACV = ',E15.7)
2628      CALL DPWRST('XXX','BUG ')
2629 9090 CONTINUE
2630C
2631      RETURN
2632      END
2633      SUBROUTINE RANKSB(K,N,ISEED,X,ITEMP1)
2634C
2635C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM K-SUBSET OF
2636C              AN N-SET.
2637C     INPUT  ARGUMENTS--K      = THE INTEGER NUMBER DENOTING THE
2638C                                SIZE OF THE SUBSET.
2639C                     --N      = THE INTEGER NUMBER DENOTING THE
2640C                                SIZE OF THE N-SET.
2641C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
2642C                                (OF DIMENSION AT LEAST K)
2643C                                INTO WHICH THE GENERATED
2644C                                RANDOM K-SUBSET OF THE N-SET WILL BE
2645C                                PLACED.
2646C     OUTPUT--A RANDOM K-SUBSET OF AN N-SET.
2647C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
2648C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
2649C                   OF N FOR THIS SUBROUTINE.   HOWEVER, K <= N.
2650C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
2651C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
2652C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
2653C     LANGUAGE--ANSI FORTRAN (1977)
2654C     REFERENCE: NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
2655C                ALGORITHMS', ACADEMIC PRESS, 1975, CH. x, p. 43.
2656C     WRITTEN BY--JAMES J. FILLIBEN
2657C                 STATISTICAL ENGINEERING DIVISION
2658C                 INFORMATION TECHNOLOGY LABORATORY
2659C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
2660C                 GAITHERSBURG, MD 20899-8980
2661C                 PHONE--301-975-2855
2662C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
2663C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
2664C     LANGUAGE--ANSI FORTRAN (1977)
2665C     VERSION NUMBER--2008/5
2666C     ORIGINAL VERSION--MAY       2008.
2667C
2668C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
2669C
2670C---------------------------------------------------------------------
2671C
2672      DIMENSION X(*)
2673      INTEGER   ITEMP1(*)
2674C
2675      INTEGER IX
2676      INTEGER R
2677      INTEGER DS
2678      INTEGER P
2679      INTEGER S
2680      INTEGER C
2681C
2682      DIMENSION U(1)
2683C
2684C-----COMMON----------------------------------------------------------
2685C
2686      INCLUDE 'DPCOP2.INC'
2687C
2688C-----START POINT-----------------------------------------------------
2689C
2690C     CHECK THE INPUT ARGUMENTS FOR ERRORS
2691C
2692      IF(K.LT.1)THEN
2693        WRITE(ICOUT,5)
2694        CALL DPWRST('XXX','BUG ')
2695        WRITE(ICOUT,47)K
2696        CALL DPWRST('XXX','BUG ')
2697        GOTO9000
2698      ELSEIF(K.GT.N)THEN
2699        WRITE(ICOUT,15)
2700        CALL DPWRST('XXX','BUG ')
2701        WRITE(ICOUT,47)K
2702        CALL DPWRST('XXX','BUG ')
2703        WRITE(ICOUT,48)N
2704        CALL DPWRST('XXX','BUG ')
2705        GOTO9000
2706      ENDIF
2707    5 FORMAT('***** ERROR--FOR THE RANDOM K-SET OF THE N-SET, ',
2708     1       'K IS NON-POSITIVE.')
2709   15 FORMAT('***** ERROR--FOR THE RANDOM K-SET OF THE N-SET, ',
2710     1       'K IS LARGER THAN N.')
2711   47 FORMAT('***** THE VALUE OF K IS ',I8)
2712   48 FORMAT('***** THE VALUE OF N IS ',I8)
2713C
2714C     GENERATE A RANDOM SUBSET OF N ELEMENTS
2715C
2716      I=0
2717      R=0
2718      NTEMP=1
2719      M0=0
2720      M=0
2721C
2722      C=K
2723      DO 100 I=1,K
2724        ITEMP1(I)=(I-1)*N/K
2725  100 CONTINUE
2726C
2727  110 CONTINUE
2728      CALL UNIRAN(NTEMP,ISEED,U)
2729      IX=1 + INT(REAL(N)*U(1))
2730      L=1 + (IX*K-1)/N
2731      IF(IX.LE.ITEMP1(L))GOTO 110
2732      ITEMP1(L)=ITEMP1(L)+1
2733      C=C-1
2734      IF(C.NE.0)GOTO 110
2735      P=0
2736      S=K
2737C
2738      DO 200 I=1,K
2739        M=ITEMP1(I)
2740        ITEMP1(I)=0
2741        IF(M.EQ.(I-1)*N/K) GOTO 200
2742        P=P+1
2743        ITEMP1(P)=M
2744  200 CONTINUE
2745C
2746  300 CONTINUE
2747      L=1 + (ITEMP1(P)*K-1)/N
2748      DS=ITEMP1(P) - (L-1)*N/K
2749      ITEMP1(P)=0
2750      ITEMP1(S)=L
2751      S=S-DS
2752      P=P-1
2753      IF(P.gt.0)GOTO 300
2754      L=K
2755C
2756  400 CONTINUE
2757      IF(ITEMP1(L).EQ.0)GOTO 500
2758      R=L
2759      M0=1 + (ITEMP1(L)-1)*N/K
2760      M=ITEMP1(L)*N/K - M0 + 1
2761C
2762  500 CONTINUE
2763      CALL UNIRAN(NTEMP,ISEED,U)
2764      IX=M0 + INT(REAL(M)*U(1))
2765      I=L
2766C
2767  600 CONTINUE
2768      I=I+1
2769      IF(I.LE.R)GOTO 800
2770C
2771  700 CONTINUE
2772      ITEMP1(I-1)=IX
2773      M=M-1
2774      L=L-1
2775      IF(L.EQ.0)THEN
2776        DO900I=1,K
2777          X(I)=REAL(ITEMP1(I))
2778  900   CONTINUE
2779        GOTO9000
2780      ENDIF
2781      GOTO 400
2782C
2783  800 CONTINUE
2784      IF(IX.LT.ITEMP1(I)) GOTO 700
2785      IX=IX+1
2786      ITEMP1(I-1)=ITEMP1(I)
2787      GOTO 600
2788C
2789 9000 CONTINUE
2790      RETURN
2791      END
2792      SUBROUTINE RANLUX(RVEC,LENV)
2793C         Subtract-and-borrow random number generator proposed by
2794C         Marsaglia and Zaman, implemented by F. James with the name
2795C         RCARRY in 1991, and later improved by Martin Luescher
2796C         in 1993 to produce "Luxury Pseudorandom Numbers".
2797C     Fortran 77 coded by F. James, 1993
2798C
2799C       references:
2800C  M. Luscher, Computer Physics Communications  79 (1994) 100
2801C  F. James, Computer Physics Communications 79 (1994) 111
2802C
2803C   LUXURY LEVELS.
2804C   ------ ------      The available luxury levels are:
2805C
2806C  level 0  (p=24): equivalent to the original RCARRY of Marsaglia
2807C           and Zaman, very long period, but fails many tests.
2808C  level 1  (p=48): considerable improvement in quality over level 0,
2809C           now passes the gap test, but still fails spectral test.
2810C  level 2  (p=97): passes all known tests, but theoretically still
2811C           defective.
2812C  level 3  (p=223): DEFAULT VALUE.  Any theoretically possible
2813C           correlations have very small chance of being observed.
2814C  level 4  (p=389): highest possible luxury, all 24 bits chaotic.
2815C
2816C!!! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2817C!!!  Calling sequences for RANLUX:                                  ++
2818C!!!      CALL RANLUX (RVEC, LEN)   returns a vector RVEC of LEN     ++
2819C!!!                   32-bit random floating point numbers between  ++
2820C!!!                   zero (not included) and one (also not incl.). ++
2821C!!!      CALL RLUXGO(LUX,INT,K1,K2) initializes the generator from  ++
2822C!!!               one 32-bit integer INT and sets Luxury Level LUX  ++
2823C!!!               which is integer between zero and MAXLEV, or if   ++
2824C!!!               LUX .GT. 24, it sets p=LUX directly.  K1 and K2   ++
2825C!!!               should be set to zero unless restarting at a break++
2826C!!!               point given by output of RLUXAT (see RLUXAT).     ++
2827C!!!      CALL RLUXAT(LUX,INT,K1,K2) gets the values of four integers++
2828C!!!               which can be used to restart the RANLUX generator ++
2829C!!!               at the current point by calling RLUXGO.  K1 and K2++
2830C!!!               specify how many numbers were generated since the ++
2831C!!!               initialization with LUX and INT.  The restarting  ++
2832C!!!               skips over  K1+K2*E9   numbers, so it can be long.++
2833C!!!   A more efficient but less convenient way of restarting is by: ++
2834C!!!      CALL RLUXIN(ISVEC)    restarts the generator from vector   ++
2835C!!!                   ISVEC of 25 32-bit integers (see RLUXUT)      ++
2836C!!!      CALL RLUXUT(ISVEC)    outputs the current values of the 25 ++
2837C!!!                 32-bit integer seeds, to be used for restarting ++
2838C!!!      ISVEC must be dimensioned 25 in the calling program        ++
2839C!!! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2840C
2841C  MAY 2003: MODIFIED SLIGHTLY FOR INCORPORATION INTO DATAPLOT.
2842C            MOSTLY JUST THE I/O.
2843C
2844      DIMENSION RVEC(LENV)
2845      DIMENSION SEEDS(24), ISEEDS(24), ISDEXT(25)
2846      PARAMETER (MAXLEV=4, LXDFLT=3)
2847      DIMENSION NDSKIP(0:MAXLEV)
2848      DIMENSION NEXT(24)
2849      PARAMETER (TWOP12=4096., IGIGA=1000000000,JSDFLT=314159265)
2850      PARAMETER (ITWO24=2**24, ICONS=2147483563)
2851      SAVE NOTYET, I24, J24, CARRY, SEEDS, TWOM24, TWOM12, LUXLEV
2852      SAVE NSKIP, NDSKIP, IN24, NEXT, KOUNT, MKOUNT, INSEED
2853      INTEGER LUXLEV
2854      LOGICAL NOTYET
2855C
2856      INCLUDE 'DPCOP2.INC'
2857C
2858      DATA NOTYET, LUXLEV, IN24, KOUNT, MKOUNT /.TRUE., LXDFLT, 0,0,0/
2859      DATA I24,J24,CARRY/24,10,0./
2860C                               default
2861C  Luxury Level   0     1     2   *3*    4
2862      DATA NDSKIP/0,   24,   73,  199,  365 /
2863Corresponds to p=24    48    97   223   389
2864C     time factor 1     2     3     6    10   on slow workstation
2865C                 1    1.5    2     3     5   on fast mainframe
2866C
2867C  NOTYET is .TRUE. if no initialization has been performed yet.
2868C              Default Initialization by Multiplicative Congruential
2869      IF (NOTYET) THEN
2870         NOTYET = .FALSE.
2871         JSEED = JSDFLT
2872         INSEED = JSEED
2873CCCCC    WRITE(6,'(A,I12)') ' RANLUX DEFAULT INITIALIZATION: ',JSEED
2874         LUXLEV = LXDFLT
2875         NSKIP = NDSKIP(LUXLEV)
2876         LP = NSKIP + 24
2877         IN24 = 0
2878         KOUNT = 0
2879         MKOUNT = 0
2880CCCCC    WRITE(6,'(A,I2,A,I4)')  ' RANLUX DEFAULT LUXURY LEVEL =  ',
2881CCCCC+        LUXLEV,'      p =',LP
2882            TWOM24 = 1.
2883         DO 25 I= 1, 24
2884            TWOM24 = TWOM24 * 0.5
2885         K = JSEED/53668
2886         JSEED = 40014*(JSEED-K*53668) -K*12211
2887         IF (JSEED .LT. 0)  JSEED = JSEED+ICONS
2888         ISEEDS(I) = MOD(JSEED,ITWO24)
2889   25    CONTINUE
2890         TWOM12 = TWOM24 * 4096.
2891         DO 50 I= 1,24
2892         SEEDS(I) = REAL(ISEEDS(I))*TWOM24
2893         NEXT(I) = I-1
2894   50    CONTINUE
2895         NEXT(1) = 24
2896         I24 = 24
2897         J24 = 10
2898         CARRY = 0.
2899         IF (SEEDS(24) .EQ. 0.) CARRY = TWOM24
2900      ENDIF
2901C
2902C          The Generator proper: "Subtract-with-borrow",
2903C          as proposed by Marsaglia and Zaman,
2904C          Florida State University, March, 1989
2905C
2906      DO 100 IVEC= 1, LENV
2907      UNI = SEEDS(J24) - SEEDS(I24) - CARRY
2908      IF (UNI .LT. 0.)  THEN
2909         UNI = UNI + 1.0
2910         CARRY = TWOM24
2911      ELSE
2912         CARRY = 0.
2913      ENDIF
2914      SEEDS(I24) = UNI
2915      I24 = NEXT(I24)
2916      J24 = NEXT(J24)
2917      RVEC(IVEC) = UNI
2918C  small numbers (with less than 12 "significant" bits) are "padded".
2919      IF (UNI .LT. TWOM12)  THEN
2920         RVEC(IVEC) = RVEC(IVEC) + TWOM24*SEEDS(J24)
2921C        and zero is forbidden in case someone takes a logarithm
2922         IF (RVEC(IVEC) .EQ. 0.)  RVEC(IVEC) = TWOM24*TWOM24
2923      ENDIF
2924C        Skipping to luxury.  As proposed by Martin Luscher.
2925      IN24 = IN24 + 1
2926      IF (IN24 .EQ. 24)  THEN
2927         IN24 = 0
2928         KOUNT = KOUNT + NSKIP
2929         DO 90 ISK= 1, NSKIP
2930         UNI = SEEDS(J24) - SEEDS(I24) - CARRY
2931         IF (UNI .LT. 0.)  THEN
2932            UNI = UNI + 1.0
2933            CARRY = TWOM24
2934         ELSE
2935            CARRY = 0.
2936         ENDIF
2937         SEEDS(I24) = UNI
2938         I24 = NEXT(I24)
2939         J24 = NEXT(J24)
2940   90    CONTINUE
2941      ENDIF
2942  100 CONTINUE
2943      KOUNT = KOUNT + LENV
2944      IF (KOUNT .GE. IGIGA)  THEN
2945         MKOUNT = MKOUNT + 1
2946         KOUNT = KOUNT - IGIGA
2947      ENDIF
2948      RETURN
2949C
2950C           Entry to input and float integer seeds from previous run
2951      ENTRY RLUXIN(ISDEXT)
2952         TWOM24 = 1.
2953         DO 195 I= 1, 24
2954           NEXT(I) = I-1
2955           TWOM24 = TWOM24 * 0.5
2956  195    CONTINUE
2957         NEXT(1) = 24
2958         TWOM12 = TWOM24 * 4096.
2959CCCCC WRITE(6,'(A)') ' FULL INITIALIZATION OF RANLUX WITH 25 INTEGERS:'
2960CCCCC WRITE(6,'(5X,5I12)') ISDEXT
2961      DO 200 I= 1, 24
2962        SEEDS(I) = REAL(ISDEXT(I))*TWOM24
2963  200 CONTINUE
2964      CARRY = 0.
2965      IF (ISDEXT(25) .LT. 0)  CARRY = TWOM24
2966      ISD = IABS(ISDEXT(25))
2967      I24 = MOD(ISD,100)
2968      ISD = ISD/100
2969      J24 = MOD(ISD,100)
2970      ISD = ISD/100
2971      IN24 = MOD(ISD,100)
2972      ISD = ISD/100
2973      LUXLEV = ISD
2974        IF (LUXLEV .LE. MAXLEV) THEN
2975          NSKIP = NDSKIP(LUXLEV)
2976CCCCC     WRITE (6,'(A,I2)') ' RANLUX LUXURY LEVEL SET BY RLUXIN TO: ',
2977CCCCC+                         LUXLEV
2978        ELSE  IF (LUXLEV .GE. 24) THEN
2979          NSKIP = LUXLEV - 24
2980CCCCC     WRITE (6,'(A,I5)') ' RANLUX P-VALUE SET BY RLUXIN TO:',LUXLEV
2981        ELSE
2982          NSKIP = NDSKIP(MAXLEV)
2983          WRITE(ICOUT,999)
2984  999     FORMAT(1X)
2985          CALL DPWRST('XXX','BUG ')
2986          WRITE(ICOUT,201)
2987  201     FORMAT('***** ERROR FROM LUXURY RANDOM NUMBER GENERATOR--')
2988          CALL DPWRST('XXX','BUG ')
2989          WRITE(ICOUT,202)LUXLEV
2990  202     FORMAT('      ILLEGAL LUXURY LEVEL: ',I5)
2991          CALL DPWRST('XXX','BUG ')
2992CCCCC     WRITE (6,'(A,I5)') ' RANLUX ILLEGAL LUXURY RLUXIN: ',LUXLEV
2993          LUXLEV = MAXLEV
2994        ENDIF
2995      INSEED = -1
2996      RETURN
2997C
2998C                    Entry to ouput seeds as integers
2999      ENTRY RLUXUT(ISDEXT)
3000      DO 300 I= 1, 24
3001         ISDEXT(I) = INT(SEEDS(I)*TWOP12*TWOP12)
3002  300 CONTINUE
3003      ISDEXT(25) = I24 + 100*J24 + 10000*IN24 + 1000000*LUXLEV
3004      IF (CARRY .GT. 0.)  ISDEXT(25) = -ISDEXT(25)
3005      RETURN
3006C
3007C                    Entry to output the "convenient" restart point
3008      ENTRY RLUXAT(LOUT,INOUT,K1,K2)
3009      LOUT = LUXLEV
3010      INOUT = INSEED
3011      K1 = KOUNT
3012      K2 = MKOUNT
3013      RETURN
3014C
3015C                    Entry to initialize from one or three integers
3016      ENTRY RLUXGO(LUX,INS,K1,K2)
3017         IF (LUX .LT. 0) THEN
3018            LUXLEV = LXDFLT
3019         ELSE IF (LUX .LE. MAXLEV) THEN
3020            LUXLEV = LUX
3021         ELSE IF (LUX .LT. 24 .OR. LUX .GT. 2000) THEN
3022            LUXLEV = MAXLEV
3023CCCCC       WRITE (6,'(A,I7)') ' RANLUX ILLEGAL LUXURY RLUXGO: ',LUX
3024            WRITE(ICOUT,999)
3025            CALL DPWRST('XXX','BUG ')
3026            WRITE(ICOUT,301)
3027  301       FORMAT('***** ERROR FROM LUXURY RANDOM NUMBER GENERATOR--')
3028            CALL DPWRST('XXX','BUG ')
3029            WRITE(ICOUT,302)LUX
3030  302       FORMAT('      ILLEGAL LUXURY LEVEL: ',I7)
3031            CALL DPWRST('XXX','BUG ')
3032         ELSE
3033            LUXLEV = LUX
3034            DO 310 ILX= 0, MAXLEV
3035              IF (LUX .EQ. NDSKIP(ILX)+24)  LUXLEV = ILX
3036  310       CONTINUE
3037         ENDIF
3038      IF (LUXLEV .LE. MAXLEV)  THEN
3039         NSKIP = NDSKIP(LUXLEV)
3040CCCCC    WRITE(6,'(A,I2,A,I4)') ' RANLUX LUXURY LEVEL SET BY RLUXGO :',
3041CCCCC+        LUXLEV,'     P=', NSKIP+24
3042      ELSE
3043          NSKIP = LUXLEV - 24
3044CCCCC     WRITE (6,'(A,I5)') ' RANLUX P-VALUE SET BY RLUXGO TO:',LUXLEV
3045      ENDIF
3046      IN24 = 0
3047      IF (INS .LT. 0) THEN
3048CCCCC    WRITE (6,'(A)')
3049CCCCC+   ' Illegal initialization by RLUXGO, negative input seed'
3050          WRITE(ICOUT,999)
3051          CALL DPWRST('XXX','BUG ')
3052          WRITE(ICOUT,401)
3053  401     FORMAT('***** ERROR FROM LUXURY RANDOM NUMBER GENERATOR--')
3054          CALL DPWRST('XXX','BUG ')
3055          WRITE(ICOUT,402)
3056  402     FORMAT('      NEGATIVE INPUT SEED: ')
3057          CALL DPWRST('XXX','BUG ')
3058      ENDIF
3059      IF (INS .GT. 0)  THEN
3060        JSEED = INS
3061CCCCC   WRITE(6,'(A,3I12)') ' RANLUX INITIALIZED BY RLUXGO FROM SEEDS',
3062CCCCC+      JSEED, K1,K2
3063      ELSE
3064        JSEED = JSDFLT
3065CCCCC   WRITE(6,'(A)')' RANLUX INITIALIZED BY RLUXGO FROM DEFAULT SEED'
3066      ENDIF
3067      INSEED = JSEED
3068      NOTYET = .FALSE.
3069      TWOM24 = 1.
3070         DO 325 I= 1, 24
3071           TWOM24 = TWOM24 * 0.5
3072         K = JSEED/53668
3073         JSEED = 40014*(JSEED-K*53668) -K*12211
3074         IF (JSEED .LT. 0)  JSEED = JSEED+ICONS
3075         ISEEDS(I) = MOD(JSEED,ITWO24)
3076  325    CONTINUE
3077      TWOM12 = TWOM24 * 4096.
3078         DO 350 I= 1,24
3079         SEEDS(I) = REAL(ISEEDS(I))*TWOM24
3080         NEXT(I) = I-1
3081  350    CONTINUE
3082      NEXT(1) = 24
3083      I24 = 24
3084      J24 = 10
3085      CARRY = 0.
3086      IF (SEEDS(24) .EQ. 0.) CARRY = TWOM24
3087C        If restarting at a break point, skip K1 + IGIGA*K2
3088C        Note that this is the number of numbers delivered to
3089C        the user PLUS the number skipped (if luxury .GT. 0).
3090      KOUNT = K1
3091      MKOUNT = K2
3092      IF (K1+K2 .NE. 0)  THEN
3093        DO 500 IOUTER= 1, K2+1
3094          INNER = IGIGA
3095          IF (IOUTER .EQ. K2+1)  INNER = K1
3096          DO 450 ISK= 1, INNER
3097            UNI = SEEDS(J24) - SEEDS(I24) - CARRY
3098            IF (UNI .LT. 0.)  THEN
3099               UNI = UNI + 1.0
3100               CARRY = TWOM24
3101            ELSE
3102               CARRY = 0.
3103            ENDIF
3104            SEEDS(I24) = UNI
3105            I24 = NEXT(I24)
3106            J24 = NEXT(J24)
3107  450     CONTINUE
3108  500   CONTINUE
3109C         Get the right value of IN24 by direct calculation
3110        IN24 = MOD(KOUNT, NSKIP+24)
3111        IF (MKOUNT .GT. 0)  THEN
3112           IZIP = MOD(IGIGA, NSKIP+24)
3113           IZIP2 = MKOUNT*IZIP + IN24
3114           IN24 = MOD(IZIP2, NSKIP+24)
3115        ENDIF
3116C       Now IN24 had better be between zero and 23 inclusive
3117        IF (IN24 .GT. 23) THEN
3118CCCCC      WRITE (6,'(A/A,3I11,A,I5)')
3119CCCCC+    '  Error in RESTARTING with RLUXGO:','  The values', INS,
3120CCCCC+     K1, K2, ' cannot occur at luxury level', LUXLEV
3121           IN24 = 0
3122          WRITE(ICOUT,999)
3123          CALL DPWRST('XXX','BUG ')
3124          WRITE(ICOUT,501)
3125  501     FORMAT('***** ERROR FROM LUXURY RANDOM NUMBER GENERATOR--')
3126          CALL DPWRST('XXX','BUG ')
3127          WRITE(ICOUT,502)
3128  502     FORMAT('      ERROR IN RESTARTING WITH RLUXG0:')
3129          CALL DPWRST('XXX','BUG ')
3130          WRITE(ICOUT,503)INS,K1,K2
3131  503     FORMAT('      THE VALUES ',3I11)
3132          CALL DPWRST('XXX','BUG ')
3133          WRITE(ICOUT,504)LUXLEV
3134  504     FORMAT('      CANNOT OCCUR AT LUXURY LEVEL ',I5)
3135          CALL DPWRST('XXX','BUG ')
3136        ENDIF
3137      ENDIF
3138C
3139      RETURN
3140      END
3141      SUBROUTINE RANMVN( N, LOWER, UPPER, INFIN, CORREL, MAXPTS,
3142     &                   ABSEPS, RELEPS, ERROR, VALUE, INFORM )
3143*
3144*     A subroutine for computing multivariate normal probabilities.
3145*     This subroutine uses the Monte-Carlo algorithm given in the paper
3146*     "Numerical Computation of Multivariate Normal Probabilities", in
3147*     J. of Computational and Graphical Stat., 1(1992), pp. 141-149, by
3148*          Alan Genz
3149*          Department of Mathematics
3150*          Washington State University
3151*          Pullman, WA 99164-3113
3152*          Email : alangenz@wsu.edu
3153*
3154*  Parameters
3155*
3156*     N      INTEGER, the number of variables.
3157*     LOWER  REAL, array of lower integration limits.
3158*     UPPER  REAL, array of upper integration limits.
3159*     INFIN  INTEGER, array of integration limits flags:
3160*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
3161*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
3162*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
3163*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
3164*     CORREL REAL, array of correlation coefficients; the correlation
3165*            coefficient in row I column J of the correlation matrix
3166*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
3167*     MAXPTS INTEGER, maximum number of function values allowed. This
3168*            parameter can be used to limit the time taken. A
3169*            sensible strategy is to start with MAXPTS = 1000*N, and then
3170*            increase MAXPTS if ERROR is too large.
3171*     ABSEPS REAL absolute error tolerance.
3172*     RELEPS REAL relative error tolerance.
3173*     ERROR  REAL estimated absolute error, with 99% confidence level.
3174*     VALUE  REAL estimated value for the integral
3175*     INFORM INTEGER, termination status parameter:
3176*            if INFORM = 0, normal completion with ERROR < EPS;
3177*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
3178*                           function vaules used; increase MAXPTS to
3179*                           decrease ERROR;
3180*            if INFORM = 2, N > 100 or N < 1.
3181*
3182      EXTERNAL MVNFNC
3183      INTEGER N, INFIN(*), MAXPTS, MPT, INFORM, INFIS, IVLS
3184      DOUBLE PRECISION
3185     &     CORREL(*), LOWER(*), UPPER(*), MVNFNC,
3186     &     ABSEPS, RELEPS, ERROR, VALUE, D, E, EPS, MVNNIT
3187      IF ( N .GT. 100 .OR. N .LT. 1 ) THEN
3188         INFORM = 2
3189         VALUE = 0
3190         ERROR = 1
3191         RETURN
3192      ENDIF
3193      INFORM = INT(MVNNIT(N,CORREL,LOWER,UPPER,INFIN,INFIS,D,E))
3194      IF ( N-INFIS .EQ. 0 ) THEN
3195         VALUE = 1
3196         ERROR = 0
3197      ELSE IF ( N-INFIS .EQ. 1 ) THEN
3198         VALUE = E - D
3199         ERROR = 2E-16
3200      ELSE
3201*
3202*        Call then Monte-Carlo integration subroutine
3203*
3204         MPT = 25 + 10*N
3205         CALL RCRUDE(N-INFIS-1, MPT, MVNFNC, ERROR, VALUE, 0)
3206         IVLS = MPT
3207 10      EPS = MAX( ABSEPS, RELEPS*ABS(VALUE) )
3208         IF ( ERROR .GT. EPS .AND. IVLS .LT. MAXPTS ) THEN
3209            MPT = MAX( MIN( INT(MPT*(ERROR/(EPS))**2),
3210     &                      MAXPTS-IVLS ), 10 )
3211            CALL RCRUDE(N-INFIS-1, MPT, MVNFNC, ERROR, VALUE, 1)
3212            IVLS = IVLS + MPT
3213            GO TO 10
3214         ENDIF
3215         IF ( ERROR. GT. EPS .AND. IVLS .GE. MAXPTS ) INFORM = 1
3216      ENDIF
3217C
3218      RETURN
3219      END
3220      SUBROUTINE RANMVT(N, NU, LOWER, UPPER, INFIN, CORREL, MAXPTS,
3221     *      ABSEPS, RELEPS, ERROR, VALUE, INFORM)
3222*
3223*     A subroutine for computing multivariate t probabilities.
3224*          Alan Genz
3225*          Department of Mathematics
3226*          Washington State University
3227*          Pullman, WA 99164-3113
3228*          Email : AlanGenz@wsu.edu
3229*
3230*  Parameters
3231*
3232*     N      INTEGER, the number of variables.
3233*     NU     INTEGER, the number of degrees of freedom.
3234*     LOWER  REAL, array of lower integration limits.
3235*     UPPER  REAL, array of upper integration limits.
3236*     INFIN  INTEGER, array of integration limits flags:
3237*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
3238*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
3239*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
3240*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
3241*     CORREL REAL, array of correlation coefficients; the correlation
3242*            coefficient in row I column J of the correlation matrix
3243*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
3244*     MAXPTS INTEGER, maximum number of function values allowed. This
3245*            parameter can be used to limit the time taken. A sensible
3246*            strategy is to start with MAXPTS = 1000*N, and then
3247*            increase MAXPTS if ERROR is too large.
3248*     ABSEPS REAL absolute error tolerance.
3249*     RELEPS REAL relative error tolerance.
3250*     ERROR  REAL, estimated absolute error, with 99% confidence level.
3251*     VALUE  REAL, estimated value for the integral
3252*     INFORM INTEGER, termination status parameter:
3253*            if INFORM = 0, normal completion with ERROR < EPS;
3254*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
3255*                           function vaules used; increase MAXPTS to
3256*                           decrease ERROR;
3257*            if INFORM = 2, N > 20 or N < 1.
3258*
3259      DOUBLE PRECISION FNCMVT
3260      EXTERNAL FNCMVT
3261      INTEGER N, NU, INFIN(*), MAXPTS, INFORM, INFIS, MPT, IVLS
3262      DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*),
3263     *     ABSEPS, RELEPS, EPS, ERROR, VALUE, E, D, MVTNIT
3264      IF ( N .GT. 20 .OR. N .LT. 1 ) THEN
3265         INFORM = 2
3266         VALUE = 0
3267         ERROR = 1
3268         RETURN
3269      ENDIF
3270      INFORM = INT(MVTNIT(N,NU,CORREL,LOWER,UPPER,INFIN,INFIS,D,E))
3271      IF ( N-INFIS .EQ. 0 ) THEN
3272         VALUE = 1
3273         ERROR = 0.0D0
3274      ELSE IF ( N-INFIS .EQ. 1 ) THEN
3275         VALUE = E - D
3276         ERROR = 2E-16
3277      ELSE
3278*
3279*        Call the Monte-Carlo integration subroutine
3280*
3281         MPT = 25 + 10*N*N
3282         CALL RCRUDE(N-INFIS-1, MPT, FNCMVT, ERROR, VALUE, 0)
3283         IVLS = MPT
3284 10      EPS = MAX( ABSEPS, RELEPS*ABS(VALUE) )
3285         IF ( ERROR .GT. EPS .AND. IVLS .LT. MAXPTS ) THEN
3286            MPT = MAX(MIN( INT(MPT*(ERROR/(EPS))**2), MAXPTS-IVLS ), 10)
3287            CALL RCRUDE(N-INFIS-1, MPT, FNCMVT, ERROR, VALUE, 1)
3288            IVLS = IVLS + MPT
3289            GO TO 10
3290         ENDIF
3291         IF ( ERROR. GT. EPS .AND. IVLS .GE. MAXPTS ) INFORM = 1
3292      ENDIF
3293C
3294      RETURN
3295      END
3296      SUBROUTINE RANPAR(K,N,ISEED,X,MULT,P)
3297C
3298C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM PARTITION
3299C              OF THE INTEGER N INTO K NON-NEGATIVE INTEGERS.
3300C     INPUT  ARGUMENTS--K      = THE INTEGER NUMBER DENOTING THE
3301C                                NUMBER OF ELEMENTS IN THE
3302C                                COMPOSITION
3303C                     --N      = THE INTEGER NUMBER BEING COMPOSED.
3304C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
3305C                                (OF DIMENSION AT LEAST K)
3306C                                INTO WHICH THE GENERATED
3307C                                RANDOM PARTITION IS PLACED.
3308C     OUTPUT--A RANDOM PARTITION OF THE INTEGER N INTO K ELEMENTS.
3309C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
3310C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
3311C                   OF N FOR THIS SUBROUTINE.   HOWEVER, K <= N.
3312C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
3313C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
3314C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
3315C     LANGUAGE--ANSI FORTRAN (1977)
3316C     REFERENCE: NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
3317C                ALGORITHMS', ACADEMIC PRESS, 1975, P. 75.
3318C
3319C                THE CODE BELOW IMPLEMENTS THE NIJENHUIS, ALBERT,
3320C                AND WILF ROUTINE.
3321C
3322C     WRITTEN BY--JAMES J. FILLIBEN
3323C                 STATISTICAL ENGINEERING DIVISION
3324C                 INFORMATION TECHNOLOGY LABORATORY
3325C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
3326C                 GAITHERSBURG, MD 20899-8980
3327C                 PHONE--301-975-2855
3328C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
3329C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
3330C     LANGUAGE--ANSI FORTRAN (1977)
3331C     VERSION NUMBER--2008/5
3332C     ORIGINAL VERSION--MAY       2008.
3333C
3334C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3335C
3336C---------------------------------------------------------------------
3337C
3338      REAL X(*)
3339      REAL U(1)
3340      INTEGER MULT(*)
3341      INTEGER P(*)
3342C
3343      INTEGER D
3344C
3345C-----COMMON----------------------------------------------------------
3346C
3347      INCLUDE 'DPCOP2.INC'
3348C
3349C-----START POINT-----------------------------------------------------
3350C
3351C     CHECK THE INPUT ARGUMENTS FOR ERRORS
3352C
3353      IF(N.LT.1)THEN
3354        WRITE(ICOUT,15)
3355        CALL DPWRST('XXX','BUG ')
3356        WRITE(ICOUT,48)N
3357        CALL DPWRST('XXX','BUG ')
3358        GOTO9000
3359      ENDIF
3360   15 FORMAT('***** ERROR--FOR THE RANDOM PARTITION OF N, THE ',
3361     1       'VALUE OF N IS NON-POSITIVE.')
3362   48 FORMAT('***** THE VALUE OF N IS ',I8)
3363C
3364C     GENERATE A RANDOM PARTITION OF N INTO K ELEMENTS
3365C
3366      NTEMP=1
3367C
3368      P(1)=1
3369      M=1
3370      IF(N.EQ.1)GOTO30
3371C
3372C     STEP 1: COMPUTE THE NUMBER OF PARTITIONS FOR I FOR
3373C             I = 1 TO N.
3374C
3375      DO21I=M,N
3376        ISUM=0
3377        DO22D=1,I
3378          IS=0
3379          I1=I
3380   24     CONTINUE
3381          I1=I1-D
3382          IF(I1.EQ.0)THEN
3383            IS=IS+1
3384          ELSEIF(I1.GT.0)THEN
3385            IS=IS+P(I1)
3386            GOTO24
3387          ENDIF
3388          ISUM=ISUM + IS*D
3389   22   CONTINUE
3390        P(I)=ISUM/I
3391   21 CONTINUE
3392C
3393C     STEP 2: NOW COMPUTE THE RANDOM PARTITION
3394C
3395   30 CONTINUE
3396      M=N
3397      K=0
3398      DO31I=1,N
3399        MULT(I)=0
3400   31 CONTINUE
3401C
3402   40 CONTINUE
3403      CALL UNIRAN(NTEMP,ISEED,U)
3404      Z=U(1)*REAL(M*P(M))
3405      D=0
3406  110 CONTINUE
3407      D=D+1
3408      I1=M
3409      J=0
3410  150 CONTINUE
3411      J=J+1
3412      I1=I1-D
3413      IF(I1.LT.0)THEN
3414        GOTO110
3415      ELSEIF(I1.EQ.0)THEN
3416        Z=Z-REAL(D)
3417        IF(Z.LE.0.0)GOTO145
3418        GOTO110
3419      ELSEIF(I1.GT.0)THEN
3420        Z=Z-REAL(D*P(I1))
3421        IF(Z.LE.0.0)GOTO145
3422        GOTO150
3423      ENDIF
3424C
3425  145 CONTINUE
3426      MULT(D)=MULT(D)+J
3427      K=K+J
3428      M=I1
3429      IF(M.NE.0)GOTO40
3430C
3431      ICNT=0
3432      DO200I=1,N
3433        IF(MULT(I).GT.0)THEN
3434          DO210J=1,MULT(I)
3435            ICNT=ICNT+1
3436            X(ICNT)=REAL(I)
3437  210     CONTINUE
3438        ENDIF
3439  200 CONTINUE
3440C
3441 9000 CONTINUE
3442      RETURN
3443      END
3444      SUBROUTINE RANPER(N,ISEED,X)
3445C
3446C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM PERMUTATION OF SIZE N
3447C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
3448C                                OF ITEMS IN THE PERMUTATION.
3449C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
3450C                                (OF DIMENSION AT LEAST N)
3451C                                INTO WHICH THE GENERATED
3452C                                RANDOM PERMUTATION WILL BE PLACED.
3453C     OUTPUT--A RANDOM PERMUTATION OF SIZE N
3454C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
3455C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
3456C                   OF N FOR THIS SUBROUTINE.
3457C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
3458C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
3459C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
3460C     LANGUAGE--ANSI FORTRAN (1977)
3461C     NOTE--THE BASIC ALGORITHM WAS ORIGINALLY SUGGESTED
3462C           BY DAN LOZIER OF THE NAT. BUR. OF STANDARDS.
3463C     WRITTEN BY--JAMES J. FILLIBEN
3464C                 STATISTICAL ENGINEERING DIVISION
3465C                 INFORMATION TECHNOLOGY LABORATORY
3466C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
3467C                 GAITHERSBURG, MD 20899-8980
3468C                 PHONE--301-975-2855
3469C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
3470C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
3471C     LANGUAGE--ANSI FORTRAN (1977)
3472C     VERSION NUMBER--89/1
3473C     ORIGINAL VERSION--DECEMBER  1988.
3474C     UPDATED         --DECEMBER  1989.  OUTER LOOP+ FOR MORE RANDOMNESS
3475C
3476C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3477C
3478C---------------------------------------------------------------------
3479C
3480      DIMENSION X(*)
3481C
3482CCCCC THE FOLLOWING DIMENSION WAS CHANGED DECEMBER 1989
3483CCCCC DIMENSION U(2)
3484      DIMENSION U(10)
3485C
3486C-----COMMON----------------------------------------------------------
3487C
3488      INCLUDE 'DPCOP2.INC'
3489C
3490C-----START POINT-----------------------------------------------------
3491C
3492      AN=N
3493C
3494C     CHECK THE INPUT ARGUMENTS FOR ERRORS
3495C
3496      IF(N.LT.1)GOTO50
3497      GOTO90
3498   50 WRITE(ICOUT, 5)
3499      CALL DPWRST('XXX','BUG ')
3500      WRITE(ICOUT,47)N
3501      CALL DPWRST('XXX','BUG ')
3502      RETURN
3503   90 CONTINUE
3504    5 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ',
3505     1       'RANPER IS NON-POSITIVE.')
3506   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
3507C
3508C     GENERATE A RANDOM PERMUTATION OF THE INTEGERS 1 TO N
3509C
3510C     START OFF WITH A RANDOM CYCLIC PERMUTATION
3511C
3512      CALL UNIRAN(10,ISEED,U)
3513      IFUDGE=INT(AN*U(10))
3514      IFUDGE=IFUDGE+1
3515      IF(IFUDGE.LE.1)IFUDGE=1
3516      IF(IFUDGE.GE.N)IFUDGE=N
3517      DO1100I=1,N
3518        IP=I+IFUDGE
3519        IF(IP.LE.N)X(I)=REAL(IP)
3520        IF(IP.GT.N)X(I)=REAL(IP-N)
3521 1100 CONTINUE
3522C
3523CCCCC THE FOLLOWING RANDOM NUMBER OF LOOPS WAS ADDED DECEMBER 1989
3524CCCCC BECAUSE OF 9 STRINGS OF 1,2 AND OTHER
3525CCCCC CORRELATED PATTERNS THAT DID NOT LOOK "RANDOM ENOUGH"
3526C
3527      NREP=2
3528      AREP=NREP
3529      CALL UNIRAN(NREP,ISEED,U)
3530      NLOOP=INT(AREP*U(NREP))
3531      NLOOP=NLOOP+1
3532      IF(NLOOP.LE.1)NLOOP=1
3533      IF(NLOOP.GE.NREP)NLOOP=NREP
3534C
3535CCCCC THE FOLLOWING "TRASHING" OF RANDOM NUMBERS WAS ADDED DECEMBER 1989
3536CCCCC BECAUSE OF 9 STRINGS OF 1,2 AND OTHER
3537CCCCC CORRELATED PATTERNS THAT DID NOT LOOK "RANDOM ENOUGH"
3538C
3539      DO1150ILOOP=1,NLOOP
3540      CALL UNIRAN(10,ISEED,U)
3541 1150 CONTINUE
3542C
3543CCCCC THE FOLLOWING OUTER LOOP WAS ADDED DECEMBER 1989
3544CCCCC BECAUSE OF 9 STRINGS OF 1,2 AND OTHER
3545CCCCC CORRELATED PATTERNS THAT DID NOT LOOK "RANDOM ENOUGH"
3546C
3547      DO1200ILOOP=1,NLOOP
3548      DO1300I=1,N
3549CCCCC THE FOLLOWING CALL WAS CHANGED DECEMBER 1989
3550CCCCC CALL UNIRAN(1,ISEED,U)
3551      CALL UNIRAN(NREP,ISEED,U)
3552CCCCC THE FOLLOWING LINE WAS CHANGED DECEMBER 1989
3553CCCCC U1=U(1)
3554      U1=U(ILOOP)
3555      PROD=AN*U1
3556      IPROD=INT(PROD)
3557      INDEX=IPROD+1
3558      IF(INDEX.LT.1)INDEX=1
3559      IF(INDEX.GT.N)INDEX=N
3560      HOLD1=X(I)
3561      HOLD2=X(INDEX)
3562      X(I)=HOLD2
3563      X(INDEX)=HOLD1
3564CCCCC WRITE(6,777)ISEED,U1
3565CC777 FORMAT('ISEED,U1 = ',I8,F10.4)
3566 1300 CONTINUE
3567 1200 CONTINUE
3568C
3569      CALL UNIRAN(5,ISEED,U)
3570      IFUDGE=INT(AN*U(5))
3571      IFUDGE=IFUDGE+1
3572      IF(IFUDGE.LE.1)IFUDGE=1
3573      IF(IFUDGE.GE.N)IFUDGE=N
3574      DO1400I=1,N
3575        IXI=INT(X(I)+0.5)
3576        IXIP=IXI+IFUDGE
3577        IF(IXIP.LE.N)X(I)=REAL(IXIP)
3578        IF(IXIP.GT.N)X(I)=REAL(IXIP-N)
3579 1400 CONTINUE
3580C
3581      RETURN
3582      END
3583      SUBROUTINE RANPE2(N,NKEEP,PVAL,NITER,IDIST,MAXNXT,ISEED,
3584     1                  Y,TAG,X,NOUT,
3585     1                  ISUBRO,IBUGA3,IERROR)
3586C
3587C     PURPOSE--THIS SUBROUTINE GENERATES RANDOM PERMUTATIONs OF SIZE N
3588C              IN A SIMULATION CONTEXT.  SPECIFICALLY,
3589C
3590C              1) ONLY THE FIRST NKEEP (1 <= NKEEP <= N) VALUES ARE
3591C                 KEPT.
3592C
3593C              2) THERE IS A PROBABILITY OF SUCCESS DEFINED BY PVAL
3594C                 (0 < PVAL <= 1).  THE N POSSIBLE VALUES ARE DIVIDED
3595C                 INTO TWO GROUPS BASED ON PVAL. FOR EXAMPLE, IF N = 10
3596C                 AND PVAL = 0.5, THEN RANDOM PERMUTATION VALUES 1 TO 5
3597C                 WILL BE KEPT WHILE RANDOM PERMUTATION VALUES 6 TO 10
3598C                 WILL NOT BE KEPT.  IF ALL VALUES ARE TO BE KEPT, THEN
3599C                 SET PVAL TO 1.
3600C
3601C              3) THE PERMUTATIONS WILL BE GENERATED NITER TIMES.
3602C
3603C              4) IF IDIST = 1 THEN ONLY DISTINCT VALUES FOR THE RANDOM
3604C                 PERMUTATION WILL BE KEPT.  IF IDIST = 0, THEN NO CHECK
3605C                 FOR DISTINCT VALUES WILL BE MADE.
3606C
3607C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER OF ITEMS IN
3608C                                THE PERMUTATION.
3609C                     --ISEED  = THE INTEGER VALUE OF THE SEED FOR THE
3610C                                RANDOM NUMBER GENERATOR.
3611C                     --NKEEP  = THE INTEGER VALUE THAT SPECIFIES HOW
3612C                                MANY RANDOM PERMUTATION VALUES WILL BE
3613C                                KEPT.
3614C                     --PVAL   = THE PROBABILITY OF SUCCESS FOR A GIVEN
3615C                                RANDOM PERMUTATION VALUE.
3616C                     --NITER  = THE INTEGER VALUE THAT SPECIFIES HOW
3617C                                MANY SETS OF PERMUTATIONS WILL BE
3618C                                GENERATED.
3619C                     --IDIST  = AN INTEGER VALUE THAT SPECIFIES WHETHER
3620C                                THE OUTPUT ARRAY WILL BE CHECKED FOR
3621C                                DISTINCT VALUES.
3622C                     --MAXNXT = THE INTEGER VALUE THAT SPECIFIES THE
3623C                                MAXIMUM SIZE OF THE OUTPUT ARRAYS.
3624C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR INTO WHICH
3625C                                THE GENERATED RANDOM PERMUTATIONS WILL
3626C                                BE PLACED.
3627C                     --TAG    = A SINGLE PRECISION VECTOR WHICH
3628C                                IDENTIFIES WHICH ITERATION THE RANDOM
3629C                                PERMUTATION CAME FROM
3630C     OUTPUT--A SET OF RANDOM PERMUTATIONS FROM MULTIPLE TRIALS.
3631C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
3632C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
3633C                   OF N FOR THIS SUBROUTINE.
3634C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
3635C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
3636C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
3637C     LANGUAGE--ANSI FORTRAN (1977)
3638C     NOTE--THE RANDOM PERMUTATIONS ALGORITHM IS BASED ON A KNUTH
3639C           ALGORITHM (VOLUME 2, ALGORITM 3.4, P. 145) AS
3640C           ADAPTED BY H. D. KNOBLE (ROUTINE RPERM).  I DON'T HAVE
3641C           THE ORIGINAL RPERM SOURCE, THIS WAS ADAPTED FROM A
3642C           LISTING OF A FORTRAN 90 IMPLEMENTATION OF THAT ALGORITHM.
3643C     WRITTEN BY--ALAN HECKERT
3644C                 STATISTICAL ENGINEERING DIVISION
3645C                 INFORMATION TECHNOLOGY LABORATORY
3646C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
3647C                 GAITHERSBURG, MD 20899-8980
3648C                 PHONE--301-975-2899
3649C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
3650C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
3651C     LANGUAGE--ANSI FORTRAN (1977)
3652C     VERSION NUMBER--2017/08
3653C     ORIGINAL VERSION--AUGUST    2017.
3654C
3655C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3656C
3657C---------------------------------------------------------------------
3658C
3659      DIMENSION Y(*)
3660      DIMENSION TAG(*)
3661      DIMENSION X(*)
3662C
3663      CHARACTER*4 IBUGA3
3664      CHARACTER*4 ISUBRO
3665      CHARACTER*4 IERROR
3666C
3667      DIMENSION U(100)
3668C
3669C-----COMMON----------------------------------------------------------
3670C
3671      INCLUDE 'DPCOP2.INC'
3672C
3673C-----START POINT-----------------------------------------------------
3674C
3675      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NPE2')THEN
3676        WRITE(ICOUT,51)
3677   51   FORMAT('AT THE BEGINNING OF RANPE2')
3678        CALL DPWRST('XXX','BUG ')
3679        WRITE(ICOUT,53)
3680   53   FORMAT('N,NKEEP,NITER,IDIST,PVAL = ',2I8,2I5,F10.5)
3681        CALL DPWRST('XXX','BUG ')
3682      ENDIF
3683C
3684C     CHECK THE INPUT ARGUMENTS FOR ERRORS
3685C
3686      IF(N.LT.1)THEN
3687        WRITE(ICOUT,101)
3688  101   FORMAT('***** ERROR IN THE SAMPLE RANDOM PERMUTATION--')
3689        CALL DPWRST('XXX','BUG ')
3690        WRITE(ICOUT,103)
3691  103   FORMAT('      THE SIZE OF THE RANDOM PERMUTATION, N, IS ',
3692     1         'NON-POSITIVE.')
3693        CALL DPWRST('XXX','BUG ')
3694        WRITE(ICOUT,105)N
3695  105   FORMAT('      THE VALUE OF N IS ',I8)
3696        CALL DPWRST('XXX','BUG ')
3697        IERROR='YES'
3698        GOTO9000
3699      ELSEIF(N.GT.MAXNXT)THEN
3700        WRITE(ICOUT,101)
3701        CALL DPWRST('XXX','BUG ')
3702        WRITE(ICOUT,107)MAXNXT
3703  107   FORMAT('      THE SIZE OF THE RANDOM PERMUTATION, N, IS ',
3704     1         'GREATER THAN ',I10,'.')
3705        CALL DPWRST('XXX','BUG ')
3706        WRITE(ICOUT,105)N
3707        CALL DPWRST('XXX','BUG ')
3708        IERROR='YES'
3709        GOTO9000
3710      ELSEIF(NKEEP.LT.1 .OR. NKEEP.GT.N)THEN
3711        WRITE(ICOUT,101)
3712        CALL DPWRST('XXX','BUG ')
3713        WRITE(ICOUT,113)
3714  113   FORMAT('      THE NUMBER OF VALUES TO KEEP, NKEEP,  FOR A ',
3715     1         'SINGLE ITERATION')
3716        CALL DPWRST('XXX','BUG ')
3717        WRITE(ICOUT,115)N
3718  115   FORMAT('      IS LESS THAN ONE OR GREATER THAN ',I8)
3719        CALL DPWRST('XXX','BUG ')
3720        WRITE(ICOUT,117)NKEEP
3721  117   FORMAT('      THE VALUE OF NKEEP IS ',I8)
3722        CALL DPWRST('XXX','BUG ')
3723        IERROR='YES'
3724        GOTO9000
3725      ELSEIF(NITER.LT.1)THEN
3726        WRITE(ICOUT,101)
3727        CALL DPWRST('XXX','BUG ')
3728        WRITE(ICOUT,123)
3729  123   FORMAT('      THE NUMBER OF ITERATIONS IS LESS THAN ONE.')
3730        CALL DPWRST('XXX','BUG ')
3731        WRITE(ICOUT,127)NITER
3732  127   FORMAT('      THE NUMBER OF ITERATIONS IS ',I8)
3733        CALL DPWRST('XXX','BUG ')
3734        IERROR='YES'
3735        GOTO9000
3736      ELSEIF(PVAL.LE.0.0 .OR. PVAL.GT.1.0)THEN
3737        WRITE(ICOUT,101)
3738        CALL DPWRST('XXX','BUG ')
3739        WRITE(ICOUT,133)
3740  133   FORMAT('      THE PROBABILITY OF SUCCESS IS LESS THAN OR ',
3741     1         'EQUAL TO ZERO OR GREATER THAN ONE')
3742        CALL DPWRST('XXX','BUG ')
3743        WRITE(ICOUT,137)PVAL
3744  137   FORMAT('      THE PROBABILITY OF SUCCESS IS ',F10.5)
3745        CALL DPWRST('XXX','BUG ')
3746        IERROR='YES'
3747        GOTO9000
3748      ENDIF
3749C
3750      AN=N
3751      NOUT=0
3752C
3753C     BASED ON PVAL, DETERMINE CUT-OFF FOR KEEPING
3754C     RANDOM PERMUTATION VALUE.
3755C
3756      IF(PVAL.GE.1.0)THEN
3757        NCUT=N
3758      ELSE
3759        AVAL=PVAL*AN
3760        NCUT=INT(AVAL+0.5)
3761      ENDIF
3762C
3763      DO1000ITER=1,NITER
3764C
3765        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NPE2')THEN
3766          WRITE(ICOUT,1001)ITER
3767 1001     FORMAT('AT LOOP 1000: ITER = ',I10)
3768          CALL DPWRST('XXX','BUG ')
3769        ENDIF
3770C
3771C       GENERATE A RANDOM PERMUTATION OF THE INTEGERS 1 TO N, BUT
3772C       ONLY GENERATE THE FIRST NKEEP VALUES
3773C
3774C       USE ALGORITHM DUE TO KNUTH TO GENERATE RANDOM PERMUTATIONS
3775C       OF SIZE N.
3776C
3777        DO1110I=1,N
3778          X(I)=REAL(I)
3779 1110   CONTINUE
3780C
3781        DO1120I=1,N,100
3782          M=MIN(N-I+1,100)
3783          CALL UNIRAN(M,ISEED,U)
3784          DO1130J=1,M
3785            IPJ=I+J-1
3786            K=INT(U(J)*(N-IPJ+1)) + IPJ
3787            ATEMP=X(IPJ)
3788            X(IPJ)=X(K)
3789            X(K)=ATEMP
3790 1130     CONTINUE
3791 1120   CONTINUE
3792C
3793C       NOW DETERMINE WHICH ONES TO KEEP
3794C
3795C          1) ONLY FIRST NKEEP VALUES CONSIDERED
3796C          2) ONLY KEEP IF VALUE IS < NCUT
3797C          3) CHECK IF VALUE HAS ALREADY BEEN SELECTED
3798C             IN PREVIOUS ITERATION
3799C
3800        IF(IDIST.EQ.0)THEN
3801          DO2000I=1,NKEEP
3802            IF(X(I).GT.NCUT)GOTO2000
3803            IF(NOUT.GE.MAXNXT)THEN
3804              WRITE(ICOUT,101)
3805              CALL DPWRST('XXX','BUG ')
3806              WRITE(ICOUT,2001)
3807 2001         FORMAT('      THE MAXIMUM NUMBER OF OUTPUT POINTS (',I8,
3808     1               ') HAS BEEN EXCEEDED.')
3809              CALL DPWRST('XXX','BUG ')
3810              IERROR='YES'
3811              GOTO9000
3812            ENDIF
3813            NOUT=NOUT+1
3814            Y(NOUT)=X(I)
3815            TAG(NOUT)=REAL(ITER)
3816 2000     CONTINUE
3817        ELSE
3818          DO3000I=1,NKEEP
3819            IF(X(I).GT.NCUT)GOTO3000
3820            IF(NOUT.GE.1)THEN
3821              DO3100J=1,NOUT
3822                IF(X(I).EQ.Y(J))GOTO3000
3823 3100         CONTINUE
3824              IF(NOUT.GE.MAXNXT)THEN
3825                WRITE(ICOUT,101)
3826                CALL DPWRST('XXX','BUG ')
3827                WRITE(ICOUT,2001)
3828                CALL DPWRST('XXX','BUG ')
3829                IERROR='YES'
3830                GOTO9000
3831              ENDIF
3832              NOUT=NOUT+1
3833              Y(NOUT)=X(I)
3834              TAG(NOUT)=REAL(ITER)
3835            ELSE
3836              NOUT=NOUT+1
3837              Y(NOUT)=X(I)
3838              TAG(NOUT)=REAL(ITER)
3839            ENDIF
3840 3000     CONTINUE
3841        ENDIF
3842C
3843 1000 CONTINUE
3844C
3845 9000 CONTINUE
3846C
3847      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NPE2')THEN
3848        WRITE(ICOUT,9001)
3849 9001   FORMAT('AT THE END OF RANPE2')
3850        CALL DPWRST('XXX','BUG ')
3851        WRITE(ICOUT,9003)NOUT,NCUT,IERROR
3852 9003   FORMAT('NOUT,NCUT,IERROR = ',2I8,2X,A4)
3853        CALL DPWRST('XXX','BUG ')
3854        IF(NOUT.GE.1)THEN
3855          DO9010I=1,NOUT
3856            WRITE(ICOUT,9013)I,Y(I),TAG(I)
3857 9013       FORMAT('I,Y(I),TAG(I) = ',I8,2F15.1)
3858        CALL DPWRST('XXX','BUG ')
3859 9010     CONTINUE
3860        ENDIF
3861      ENDIF
3862C
3863      RETURN
3864      END
3865      SUBROUTINE RANSUB(N,ISEED,X)
3866C
3867C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SUBSET OF SIZE N
3868C              IN A RANDOM SUBSET OF SIZE N, THERE WILL BE N ELEMENTS
3869C              RETURNED, WHERE EACH IS EITHER A 0 (NOT INCLUDED) OR
3870C              1 (INCLUDED).
3871C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
3872C                                OF ITEMS IN THE PERMUTATION.
3873C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
3874C                                (OF DIMENSION AT LEAST N)
3875C                                INTO WHICH THE GENERATED
3876C                                RANDOM SUBSET WILL BE PLACED.
3877C     OUTPUT--A RANDOM SUBSET OF SIZE N
3878C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
3879C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
3880C                   OF N FOR THIS SUBROUTINE.
3881C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
3882C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
3883C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
3884C     LANGUAGE--ANSI FORTRAN (1977)
3885C     REFERENCE: NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
3886C                ALGORITHMS', SECOND EDITION, ACADEMIC PRESS, 1978, CH. 2.
3887C     WRITTEN BY--JAMES J. FILLIBEN
3888C                 STATISTICAL ENGINEERING DIVISION
3889C                 INFORMATION TECHNOLOGY LABORATORY
3890C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
3891C                 GAITHERSBURG, MD 20899-8980
3892C                 PHONE--301-975-2855
3893C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
3894C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
3895C     LANGUAGE--ANSI FORTRAN (1977)
3896C     VERSION NUMBER--2008/5
3897C     ORIGINAL VERSION--MAY       2008.
3898C
3899C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3900C
3901      DIMENSION X(*)
3902C
3903C-----COMMON---------------------------------------------------------
3904C
3905      INCLUDE 'DPCOP2.INC'
3906C
3907C-----START POINT-----------------------------------------------------
3908C
3909C     CHECK THE INPUT ARGUMENTS FOR ERRORS
3910C
3911      IF(N.LT.1)THEN
3912        WRITE(ICOUT, 5)
3913        CALL DPWRST('XXX','BUG ')
3914        WRITE(ICOUT,47)N
3915        CALL DPWRST('XXX','BUG ')
3916        GOTO9000
3917      ENDIF
3918    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ELEMENTS IN THE ',
3919     1       'RANDOM SUBSET IS NON-POSITIVE.')
3920   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
3921C
3922C     GENERATE A RANDOM SUBSET OF N ELEMENTS
3923C
3924      NPAR=1
3925      CALL DUNRAN(N,NPAR,ISEED,X)
3926C
3927 9000 CONTINUE
3928      RETURN
3929      END
3930      SUBROUTINE RAYCDF(X,CDF)
3931C
3932C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
3933C              FUNCTION VALUE FOR THE RAYLEIGH DISTRIBUTION.
3934C              THIS DISTRIBUTION IS DEFINED FOR NON-NEGATIVE X AND
3935C              HAS THE CUMULATIVE DISTRIBUTION FUNCTION
3936C                 F(X) = 1 - EXP(-0.5*X**2)       X > 0
3937C              NOTE THAT THE RAYLEIGH IS A SPECIAL CASE OF THE
3938C              FOLLOWING:
3939C              1) A CHI DISTRIBUTION WITH NU = 2
3940C              2) A WEIBULL DISTRIBUTION WITH GAMMA = 2 AND SCALE
3941C                 PARAMETER SQRT(2)
3942C     INPUT  ARGUMENTS--X     = THE SINGLE PRECISION VALUE AT
3943C                               WHICH THE CUMULATIVE DISTRIBUTION
3944C                               FUNCTION IS TO BE EVALUATED.
3945C                               X SHOULD BE NON-NEGATIVE.
3946C     OUTPUT ARGUMENTS--CDF   = THE SINGLE PRECISION PROBABILITY
3947C                               DENSITY FUNCTION VALUE.
3948C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION FUNCTION
3949C             VALUE CDF FOR THE RAYLEIGH DISTRIBUTION
3950C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
3951C     RESTRICTIONS--NONE.
3952C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
3953C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
3954C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
3955C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994).
3956C                "CONTINUOUS UNIVARIATE DISTRIBUTIONS--VOLUME 1",
3957C                SECOND EDITION, WILEY, PP. 453, 686.
3958C     LANGUAGE--ANSI FORTRAN (1977)
3959C     WRITTEN BY--JAMES J. FILLIBEN
3960C                 STATISTICAL ENGINEERING DIVISION
3961C                 INFORMATION TECHNOLOGY LABORATORY
3962C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
3963C                 GAITHERSBURG, MD 20899-8980
3964C                 PHONE--301-975-2855
3965C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
3966C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
3967C     LANGUAGE--ANSI FORTRAN (1977)
3968C     VERSION NUMBER--2004.6
3969C     ORIGINAL VERSION--JUNE      2004.
3970C
3971C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3972C
3973C---------------------------------------------------------------------
3974C
3975      DOUBLE PRECISION DX
3976      DOUBLE PRECISION DCDF
3977C
3978C-----COMMON----------------------------------------------------------
3979C
3980      INCLUDE 'DPCOMC.INC'
3981      INCLUDE 'DPCOP2.INC'
3982C
3983C-----START POINT-----------------------------------------------------
3984C
3985C               ************************************
3986C               **  STEP 1--                      **
3987C               **  COMPUTE THE DENSITY FUNCTION  **
3988C               ************************************
3989C
3990      IF(X.LE.0.0)THEN
3991        CDF=0.0
3992      ELSE
3993        DX=DBLE(X)
3994        IF(DX.GE.DSQRT(D1MACH(2)))THEN
3995          CDF=1.0
3996          GOTO9000
3997        ENDIF
3998C
3999        DCDF=1.0D0 - DEXP(-0.5D0*(DBLE(X)**2))
4000        CDF=REAL(DCDF)
4001      ENDIF
4002C
4003 9000 CONTINUE
4004      RETURN
4005      END
4006      DOUBLE PRECISION FUNCTION RAYFUN(UHAT,X)
4007C
4008C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE MAXIMUM LIKELIHOOD
4009C              ESTIMATE OF THE LOCATION PARAMETER OF THE 2-PARAMETER
4010C              RAYLEIGH DISTRIBUTION.  THIS FUNCTION FINDS THE ROOT OF
4011C              THE EQUATION:
4012C
4013C              N*(XBAR - UHAT)/(SUM[i=1 to N][1/(X(i) - UHAT)] -
4014C              (1/(2*N))*SUM[i=1 to N][(X(i) - UHAT)**2] = 0
4015C
4016C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
4017C              FUNCTION.
4018C     EXAMPLE--RAYLEIGH MAXIMUM LIKELIHOOD Y
4019C     REFERENCE--COHEN AND WHITTEN (1988), "PARAMETER ESTIMATION IN
4020C                RELIABILITY AND LIFE SPAN MODELS", MARCEL DEKKER, INC.,
4021C                CHAPTER 10.
4022C     WRITTEN BY--ALAN HECKERT
4023C                 STATISTICAL ENGINEERING DIVISION
4024C                 INFORMATION TECHNOLOGY LABORATORY
4025C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4026C                 GAITHERSBUG, MD 20899-8980
4027C                 PHONE--301-975-2899
4028C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4029C           OF THE NATIONAL BUREAU OF STANDARDS.
4030C     LANGUAGE--ANSI FORTRAN (1977)
4031C     VERSION NUMBER--2010/7
4032C     ORIGINAL VERSION--JULY       2010.
4033C
4034C---------------------------------------------------------------------
4035C
4036      DOUBLE PRECISION UHAT
4037      DOUBLE PRECISION X(*)
4038C
4039      INTEGER N
4040      DOUBLE PRECISION DXBAR
4041      COMMON/RAYCOM/DXBAR,N
4042C
4043C---------------------------------------------------------------------
4044C
4045      DOUBLE PRECISION DSUM1
4046      DOUBLE PRECISION DSUM2
4047      DOUBLE PRECISION DTERM1
4048      DOUBLE PRECISION DTERM2
4049      DOUBLE PRECISION DX
4050      DOUBLE PRECISION DN
4051C
4052      INCLUDE 'DPCOP2.INC'
4053C
4054C-----START POINT-----------------------------------------------------
4055C
4056      DN=DBLE(N)
4057      DTERM1=DN*(DXBAR - UHAT)
4058      DTERM2=1.0D0/(2.0D0*DN)
4059      DSUM1=0.0D0
4060      DSUM2=0.0D0
4061      DO100I=1,N
4062        DX=X(I) - UHAT
4063        DSUM1=DSUM1 + 1.0D0/DX
4064        DSUM2=DSUM1 + DX**2
4065  100 CONTINUE
4066C
4067      RAYFUN=(DTERM1/DSUM1) - DTERM2*DSUM2
4068C
4069      RETURN
4070      END
4071      SUBROUTINE RAYLI1(Y,N,ICASPL,
4072     1                  ALOC,SCALE,
4073     1                  ALIK,AIC,AICC,BIC,
4074     1                  ISUBRO,IBUGA3,IERROR)
4075C
4076C     PURPOSE--THIS ROUTINE COMPUTES THE LIKELIHOOD FUNCTION FOR
4077C              THE RAYLEIGH DISTRIBUTION.  THIS IS FOR THE RAW DATA
4078C              CASE (I.E., NO GROUPING AND NO CENSORING).
4079C
4080C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
4081C              PERFORMED.
4082C
4083C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
4084C                CAMBRIDGE UNIVERSITY PRESS, 1999, P. 187.
4085C     WRITTEN BY--ALAN HECKERT
4086C                 STATISTICAL ENGINEERING DIVISION
4087C                 INFORMATION TECHNOLOGY LABORATORY
4088C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4089C                 GAITHERSBURG, MD 20899-8980
4090C                 PHONE--301-975-2899
4091C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4092C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4093C     LANGUAGE--ANSI FORTRAN (1977)
4094C     VERSION NUMBER--2010/7
4095C     ORIGINAL VERSION--JULY      2010.
4096C
4097C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4098C
4099      CHARACTER*4 ICASPL
4100      CHARACTER*4 ISUBRO
4101      CHARACTER*4 IBUGA3
4102      CHARACTER*4 IERROR
4103C
4104      CHARACTER*4 IWRITE
4105      CHARACTER*4 ISUBN1
4106      CHARACTER*4 ISUBN2
4107      CHARACTER*4 ISTEPN
4108C
4109      DOUBLE PRECISION DX
4110      DOUBLE PRECISION DS
4111      DOUBLE PRECISION DU
4112      DOUBLE PRECISION DN
4113      DOUBLE PRECISION DNP
4114      DOUBLE PRECISION DLIK
4115      DOUBLE PRECISION DSUM1
4116      DOUBLE PRECISION DSUM2
4117      DOUBLE PRECISION DTERM1
4118      DOUBLE PRECISION DTERM2
4119      DOUBLE PRECISION DTERM3
4120C
4121C---------------------------------------------------------------------
4122C
4123      DIMENSION Y(*)
4124C
4125C-----COMMON----------------------------------------------------------
4126C
4127      INCLUDE 'DPCOP2.INC'
4128C
4129C-----START POINT-----------------------------------------------------
4130C
4131      ISUBN1='RAYL'
4132      ISUBN2='I1  '
4133      IERROR='NO'
4134C
4135      ALIK=-99.0
4136      AIC=-99.0
4137      AICC=-99.0
4138      BIC=-99.0
4139C
4140      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YLI1')THEN
4141        WRITE(ICOUT,999)
4142  999   FORMAT(1X)
4143        CALL DPWRST('XXX','WRIT')
4144        WRITE(ICOUT,51)
4145   51   FORMAT('**** AT THE BEGINNING OF RAYLI1--')
4146        CALL DPWRST('XXX','WRIT')
4147        WRITE(ICOUT,52)IBUGA3,ISUBRO
4148   52   FORMAT('IBUGA3,ISUBRO = ',A4,2X,A4)
4149        CALL DPWRST('XXX','WRIT')
4150        WRITE(ICOUT,55)N,ALOC,SCALE
4151   55   FORMAT('N,ALOC,SCALE = ',I8,2G15.7)
4152        CALL DPWRST('XXX','WRIT')
4153        DO56I=1,MIN(N,100)
4154          WRITE(ICOUT,57)I,Y(I)
4155   57     FORMAT('I,Y(I) = ',I8,G15.7)
4156          CALL DPWRST('XXX','WRIT')
4157   56   CONTINUE
4158      ENDIF
4159C
4160C               ******************************************
4161C               **  STEP 1--                            **
4162C               **  COMPUTE LIKELIHOOD FUNCTION         **
4163C               ******************************************
4164C
4165      ISTEPN='1'
4166      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YLI1')
4167     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
4168C
4169      IERFLG=0
4170      IERROR='NO'
4171      IWRITE='OFF'
4172      IF(ICASPL.EQ.'1RAY')ALOC=0.0
4173C
4174C     THE LOG-LIKELIHOOD FUNCTION IS
4175C
4176C     -2*N*LOG(S) + SUM[i=1][N][LOG(Y(i) - U) -
4177C     (1/(2*S**2)*SUM[i=1][N][Y(i) - U]
4178C
4179      DN=DBLE(N)
4180      DS=DBLE(SCALE)
4181      DU=DBLE(ALOC)
4182      DTERM1=-2.0D0*DN*DLOG(DS)
4183      DTERM2=1.0D0/(2.0D0*DS*DS)
4184      DSUM1=0.0D0
4185      DSUM2=0.0D0
4186      DO1000I=1,N
4187        DX=DBLE(Y(I))
4188        DSUM1=DSUM1 + DLOG(DX-DU)
4189        DSUM2=DSUM2 + (DX-DU)
4190 1000 CONTINUE
4191      DLIK=DTERM1 + DSUM1 - DTERM2*DSUM2
4192C
4193      ALIK=REAL(DLIK)
4194      DNP=2.0D0
4195      IF(ICASPL.EQ.'1RAY')DNP=1.0D0
4196      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
4197      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
4198      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
4199      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
4200C
4201      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YLI1')THEN
4202        WRITE(ICOUT,999)
4203        CALL DPWRST('XXX','WRIT')
4204        WRITE(ICOUT,9011)
4205 9011   FORMAT('**** AT THE END OF RAYLI1--')
4206        CALL DPWRST('XXX','WRIT')
4207        WRITE(ICOUT,9013)DSUM1,DSUM2,DTERM1,DTERM3
4208 9013   FORMAT('DSUM1,DSUM2,DTERM1,DTERM3 = ',3G15.7)
4209        CALL DPWRST('XXX','WRIT')
4210        WRITE(ICOUT,9014)ALIK,AIC,AICC,BIC
4211 9014   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
4212        CALL DPWRST('XXX','WRIT')
4213      ENDIF
4214C
4215      RETURN
4216      END
4217      SUBROUTINE RAYML1(Y,N,ICASPL,
4218     1                  DTEMP1,
4219     1                  XMEAN,XSD,XMIN,XMAX,
4220     1                  ALOCML,SCALML,SCALSE,
4221     1                  ALOCMM,SCALMM,SCA2SE,
4222     1                  ALOCMO,SCALMO,ALOCLM,SCALLM,ALOCPE,SCALPE,
4223     1                  ALOCSE,ALAMBA,ALAMSE,
4224     1                  ISUBRO,IBUGA3,IERROR)
4225C
4226C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
4227C              FOR THE RAYLEIGH DISTRIBUTION FOR THE RAW DATA CASE (I.E.,
4228C              NO CENSORING AND NO GROUPING).
4229C
4230C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
4231C              PERFORMED.
4232C
4233C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
4234C              FROM MULTIPLE PLACES (DPMLR1 WILL GENERATE THE OUTPUT
4235C              FOR THE RAYLEIGH MLE COMMAND).
4236C
4237C     REFERENCE--COHEN AND WHITTEN (1988), "PARAMETER ESTIMATION IN
4238C                RELIABILITY AND LIFE SPAN MODELS", MARCEL DEKKER, INC.,
4239C                CHAPTER 10.
4240C              --KARL BURY, "STATISTICAL DISTRIBUTIONS IN
4241C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
4242C                1999, PP. 331-332.
4243C              --DEY, DEY, AND KUNDU (xxxx), "TWO-PARAMETER RAYLEIGH
4244C                DISTRIBUTION: DIFFERENT METHODS OF ESTIMATION",
4245C                SUBMITTED.
4246C              --MAHDI (2006), "IMPROVED PARAMETER ESTIMATION IN
4247C                RAYLEIGH MODEL", METODOLOSKIZVEZKI, VOL. 3,
4248C                NO. 1, PP. 63-74.
4249C     WRITTEN BY--ALAN HECKERT
4250C                 STATISTICAL ENGINEERING DIVISION
4251C                 INFORMATION TECHNOLOGY LABORATORY
4252C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4253C                 GAITHERSBURG, MD 20899-8980
4254C                 PHONE--301-975-2899
4255C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4256C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4257C     LANGUAGE--ANSI FORTRAN (1977)
4258C     VERSION NUMBER--2010/07
4259C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
4260C                                       SUBROUTINE (FROM DPMLRA),
4261C                                       SUPPORT 2-PARAMETER CASE
4262C     UPDATED         --MAY       2014. ADDITIONAL METHODS FOR
4263C                                       2-PARAMETER CASE
4264C
4265C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4266C
4267      CHARACTER*4 ICASPL
4268      CHARACTER*4 ISUBRO
4269      CHARACTER*4 IBUGA3
4270      CHARACTER*4 IERROR
4271C
4272      CHARACTER*4 IWRITE
4273      CHARACTER*40 IDIST
4274C
4275      CHARACTER*4 ISUBN1
4276      CHARACTER*4 ISUBN2
4277      CHARACTER*4 ISTEPN
4278C
4279      DIMENSION Y(*)
4280      DOUBLE PRECISION DTEMP1(*)
4281C
4282      DOUBLE PRECISION DPI
4283      DOUBLE PRECISION DP
4284      DOUBLE PRECISION DX
4285      DOUBLE PRECISION DN
4286      DOUBLE PRECISION DSUM1
4287      DOUBLE PRECISION DSUM2
4288      DOUBLE PRECISION DSUM3
4289      DOUBLE PRECISION DVAR
4290      DOUBLE PRECISION DTERM1
4291      DOUBLE PRECISION DTERM2
4292      DOUBLE PRECISION DTERM3
4293      DOUBLE PRECISION DTERM4
4294      DOUBLE PRECISION DTERM5
4295      DOUBLE PRECISION DEPS
4296      DOUBLE PRECISION DA
4297      DOUBLE PRECISION DB
4298      DOUBLE PRECISION DC
4299      DOUBLE PRECISION DL1
4300      DOUBLE PRECISION DL2
4301C
4302      DOUBLE PRECISION DAE
4303      DOUBLE PRECISION DRE
4304      DOUBLE PRECISION DXSTRT
4305      DOUBLE PRECISION DXLOW
4306      DOUBLE PRECISION DXUP
4307      DOUBLE PRECISION XLOWSV
4308      DOUBLE PRECISION XUPSV
4309C
4310      DOUBLE PRECISION DGAMMA
4311      EXTERNAL DGAMMA
4312      DOUBLE PRECISION DLNGAM
4313      EXTERNAL DLNGAM
4314C
4315      DOUBLE PRECISION RAYFUN
4316      EXTERNAL RAYFUN
4317C
4318      INTEGER IN
4319      DOUBLE PRECISION DXBAR
4320      COMMON/RAYCOM/DXBAR,IN
4321C
4322C-----COMMON----------------------------------------------------------
4323C
4324      INCLUDE 'DPCOP2.INC'
4325C
4326      DATA DPI/ 3.14159265358979D+00/
4327C
4328C-----START POINT-----------------------------------------------------
4329C
4330      ISUBN1='RAYM'
4331      ISUBN2='L1  '
4332      IWRITE='OFF'
4333      IERROR='NO'
4334C
4335      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YML1')THEN
4336        WRITE(ICOUT,999)
4337  999   FORMAT(1X)
4338        CALL DPWRST('XXX','WRIT')
4339        WRITE(ICOUT,51)
4340   51   FORMAT('**** AT THE BEGINNING OF RAYML1--')
4341        CALL DPWRST('XXX','WRIT')
4342        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,MAXNXT
4343   52   FORMAT('IBUGA3,ISUBRO,N,MAXNXT = ',2(A4,2X),2I8)
4344        CALL DPWRST('XXX','WRIT')
4345        DO56I=1,MIN(N,100)
4346          WRITE(ICOUT,57)I,Y(I)
4347   57     FORMAT('I,Y(I) = ',I8,G15.7)
4348          CALL DPWRST('XXX','WRIT')
4349   56   CONTINUE
4350      ENDIF
4351C
4352C               ********************************************
4353C               **  STEP 1--                              **
4354C               **  CARRY OUT CALCULATIONS                **
4355C               **  FOR RAYLEIGH MLE ESTIMATE             **
4356C               ********************************************
4357C
4358      ISTEPN='1'
4359      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YML1')
4360     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
4361C
4362      IDIST='RAYLEIGH'
4363      IFLAG=0
4364      IF(ICASPL.EQ.'1')IFLAG=1
4365      CALL SUMRAW(Y,N,IDIST,IFLAG,
4366     1            XMEAN,XVAR,XSD,XMIN,XMAX,
4367     1            ISUBRO,IBUGA3,IERROR)
4368      IF(IERROR.EQ.'YES')GOTO9000
4369      CALL SORT(Y,N,Y)
4370C
4371      ALOCML=CPUMIN
4372      SCALML=CPUMIN
4373      ALOCMM=CPUMIN
4374      SCALMM=CPUMIN
4375      SCALSE=CPUMIN
4376      SCA2SE=CPUMIN
4377      DN=DBLE(N)
4378C
4379      IF(ICASPL.EQ.'1')THEN
4380C
4381C       ONE-PARAMETER MODEL
4382C
4383C       MAXIMUM LIKELIHOOD ESTIMATE OF SIGMA:
4384C
4385C       SIGMAHAT = SUM[i=1 to N][SQRT(X(i)**2/(2*N)]
4386C
4387C       FORMULA FOR STANDARD ERROR GIVEN ON PAGE 201 OF
4388C       COHEN AND WHITTEN.
4389C
4390        DP=2.0D0
4391        DSUM1=0.0D0
4392        DO1010I=1,N
4393          DX=DBLE(Y(I))
4394          DSUM1=DSUM1 + DX*DX/(DP*DN)
4395 1010   CONTINUE
4396        DSUM1=DSQRT(DSUM1)
4397        SCALML=REAL(DSUM1)
4398        DTERM1=DSUM1**2/(2.0D0*DN*DP)
4399        DTERM2=2.0D0*DN*DP
4400C
4401C       USE LOG GAMMA FUNCTION IN CASE N GETS LARGE
4402C
4403CCCCC   DTERM3=DGAMMA((DN*DP+1.0D0)/2.0D0)
4404CCCCC   DTERM4=DGAMMA(DN*DP/2.0D0)
4405        DTERM3=DLNGAM((DN*DP+1.0D0)/2.0D0)
4406        DTERM4=DLNGAM(DN*DP/2.0D0)
4407        DTERM5=2.0D0*(DLOG(2.0D0) + DTERM3 - DTERM4)
4408        DTERM5=DEXP(DTERM5)
4409C
4410        DVAR=DTERM1*(DTERM2 - DTERM5)
4411        SCALSE=REAL(DSQRT(DVAR))
4412      ELSE
4413C
4414C       MOMENT ESTIMATES ARE:
4415C
4416C       SIGMAHAT = S*SQRT(2/(4 - PI))
4417C       UHAT     = XBAR - SIGMAHAT*SQRT(PI/2)
4418C
4419        DTERM1=DBLE(XSD)*DSQRT(2.0D0/(4.0D0 - DPI))
4420        SCALMO=REAL(DTERM1)
4421        DTERM2=DBLE(XMEAN) - DTERM1*DSQRT(DPI/2.0D0)
4422        ALOCMO=REAL(DTERM2)
4423C
4424C       L-MOMENT ESTIMATES ARE:
4425C
4426C       UHAT      = L1 - (SQRT(2)/(SQRT(2) - 1))*L2
4427C       LAMBDAHAT = GAMMA(3/2)**2*(3 - 2*SQRT(2))/(2*L2**2)
4428C
4429C       WHERE L1 AND L2 ARE THE FIRST TWO SAMPLE MOMENTS
4430C
4431C       L1 = XBAR
4432C       L2 = (2/(N*(N-1)))*SUM[i=1 to N][(i-1)*X(i) - L1]
4433C
4434        DTERM1=DGAMMA(1.5D0)
4435        DL1=DBLE(XMEAN)
4436        DSUM1=0.0D0
4437        DO1110I=1,N
4438          DSUM1=DSUM1 + DBLE(I-1)*DBLE(Y(I))
4439 1110   CONTINUE
4440        DTERM3=2.0D0/(DN*(DN-1.0D0))
4441        DL2=(DTERM3*DSUM1) - DL1
4442        DTERM2=DL1 - (DSQRT(2.0D0)/(DSQRT(2.0D0) - 1.0D0))*DL2
4443        ALOCLM=REAL(DTERM2)
4444        DTERM2=DTERM1**2/DL2**2
4445        DTERM3=(3.0D0 - 2.0D0*DSQRT(2.0D0))/2.0D0
4446        DTERM4=DTERM2*DTERM3
4447        SCALLM=REAL(DTERM4)
4448        SCALLM=SQRT(1.0/(2.0*SCALLM))
4449C
4450C       PERCENTILE ESTIMATES ARE:
4451C
4452C       SIGMAHAT = (A - B**2)**2/(C - B*XBAR)**2
4453C       UHAT     = (A*XBAR - B*C)/(A - B**2)
4454C
4455C       WHERE
4456C
4457C       A = SUM[i=1 to N][-LOG(1 - P(i)]/N
4458C       B = SUM[i=1 to N][SQRT(-LOG(1 - P(i)))]/N
4459C       C = SUM[i=1 to N][X(i)*SQRT(-LOG(1 - P(i)))]
4460C       P(i) = i/(N+1)
4461C
4462        DSUM1=0.0D0
4463        DSUM2=0.0D0
4464        DSUM3=0.0D0
4465        DO1120I=1,N
4466          DTERM1=-DLOG(1.0D0 - DBLE(I)/(DN+1.0D0))
4467          DSUM1=DSUM1 + DTERM1
4468          DSUM2=DSUM2 + DSQRT(DTERM1)
4469          DSUM3=DSUM3 + DBLE(Y(I))*DSQRT(DTERM1)
4470 1120   CONTINUE
4471        DA=DSUM1/DN
4472        DB=DSUM2/DN
4473        DC=DSUM3/DN
4474        DTERM1=(DA*DBLE(XMEAN) - DB*DC)/(DA - DB**2)
4475        ALOCPE=REAL(DTERM1)
4476        DTERM1=(DA - DB*DB)**2/(DC - DB*DBLE(XMEAN))**2
4477        SCALPE=REAL(DTERM1)
4478        SCALPE=SQRT(1.0/(2.0*SCALPE))
4479C
4480C       MODIFIED MOMENT ESTIMATES ARE:
4481C
4482C       SIGMAHAT = (XBAR - XMEAN)/(SQRT(PI/2) - SQRT(PI/(2*N))
4483C       UHAT = XBAR - SIGMAHAT*SQRT(PI/2)
4484C
4485        DN=DBLE(N)
4486        DTERM1=DSQRT(DPI/2.0D0)
4487        DTERM2=DSQRT(DPI/(2.0D0*DN))
4488        SCALMM=(XMEAN - XMIN)/REAL(DTERM1 - DTERM2)
4489        ALOCMM=XMEAN - SCALMM*REAL(DTERM1)
4490C
4491C       MAXIMUM LIKELIHOOD ESTIMATES ARE:
4492C
4493C       TO ESTIMATE U, SOLVE THE FOLLOWING EQUATION:
4494C
4495C       N*(XBAR - UHAT)/(SUM[i=1 to N][1/(X(i) - UHAT)] -
4496C       (1/(2*N))*SUM[i=1 to N][(X(i) - UHAT)**2] = 0
4497C
4498C       THEN
4499C
4500C       SIGMAHAT = (1/(2*N))*SUM[i=1 to N][(X(i) - UHAT)**2]
4501C
4502        DXBAR=DBLE(XMEAN)
4503        IN=N
4504        DO2010I=1,N
4505          DTEMP1(I)=DBLE(Y(I))
4506 2010   CONTINUE
4507C
4508        DEPS=1.0D-12
4509        DXSTRT=DBLE(ALOCMM)
4510        DAE=2.0*0.000001D0*DXSTRT
4511        DRE=DAE
4512        IFLAG=0
4513        IF(DXSTRT.GE.0.0D0)THEN
4514          DXLOW=DXSTRT/3.0D0
4515        ELSE
4516          DXLOW=DXSTRT*3.0D0
4517        ENDIF
4518        DXUP=DBLE(XMIN) - DEPS
4519        ITBRAC=0
4520 4105   CONTINUE
4521        XLOWSV=DXLOW
4522        XUPSV=DXUP
4523        CALL DFZER2(RAYFUN,DXLOW,DXUP,DXSTRT,DRE,DAE,IFLAG,DTEMP1)
4524C
4525        IF(IFLAG.EQ.4 .AND. ITBRAC.LE.100)THEN
4526          IF(DXLOW.GE.0.0D0)THEN
4527            DXLOW=XLOWSV/2.0D0
4528          ELSE
4529            DXLOW=XLOWSV*2.0D0
4530          ENDIF
4531          ITBRAC=ITBRAC+1
4532          GOTO4105
4533        ENDIF
4534C
4535        IF(IFLAG.EQ.2)THEN
4536C
4537C         NOTE: SUPPRESS THIS MESSAGE FOR NOW.
4538CCCCC     WRITE(ICOUT,999)
4539CCCCC     CALL DPWRST('XXX','BUG ')
4540CCCCC     WRITE(ICOUT,111)
4541CC111     FORMAT('***** WARNING FROM RAYLEIGH MAXIMUM ',
4542CCCCC1           'LIKELIHOOD--')
4543CCCCC     CALL DPWRST('XXX','BUG ')
4544CCCCC     WRITE(ICOUT,113)
4545CC113     FORMAT('      ESTIMATE OF MU MAY NOT BE COMPUTED TO ',
4546CCCCC1           'DESIRED TOLERANCE.')
4547CCCCC     CALL DPWRST('XXX','BUG ')
4548        ELSEIF(IFLAG.EQ.3)THEN
4549          WRITE(ICOUT,999)
4550          CALL DPWRST('XXX','BUG ')
4551          WRITE(ICOUT,121)
4552  121     FORMAT('***** WARNING FROM RAYLEIGH MAXIMUM LIKELIHOOD--')
4553          CALL DPWRST('XXX','BUG ')
4554          WRITE(ICOUT,123)
4555  123     FORMAT('      ESTIMATE OF MU MAY BE NEAR A SINGULAR POINT.')
4556          CALL DPWRST('XXX','BUG ')
4557        ELSEIF(IFLAG.EQ.4)THEN
4558          WRITE(ICOUT,999)
4559          CALL DPWRST('XXX','BUG ')
4560          WRITE(ICOUT,131)
4561  131     FORMAT('***** ERROR FROM RAYLEIGH MAXIMUM LIKELIHOOD--')
4562          CALL DPWRST('XXX','BUG ')
4563          WRITE(ICOUT,133)
4564  133     FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
4565          CALL DPWRST('XXX','BUG ')
4566        ELSEIF(IFLAG.EQ.5)THEN
4567          WRITE(ICOUT,999)
4568          CALL DPWRST('XXX','BUG ')
4569          WRITE(ICOUT,121)
4570          CALL DPWRST('XXX','BUG ')
4571          WRITE(ICOUT,143)
4572  143     FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
4573          CALL DPWRST('XXX','BUG ')
4574        ENDIF
4575C
4576        ALOCML=REAL(DXLOW)
4577        DSUM1=0.0D0
4578        DO2030I=1,N
4579          DX=DTEMP1(I) - DXLOW
4580          DSUM1=DSUM1 + DX**2
4581 2030   CONTINUE
4582        DTERM1=DSUM1/(2.0D0*DN)
4583        SCALML=REAL(DSQRT(DTERM1))
4584C
4585C       FORMULAS FOR STANDARD ERRORS ARE GIVEN IN KUNDU PAPER.
4586C       NOTE THAT HE IS OBTAINING THE VARIANCE FOR "LAMBDA"
4587C       RATHER THAN THE SCALE PARAMETER.
4588C
4589C          VAR(LAMBDA) = LAMBDA**2/N
4590C          VAR(U) = 1/{2*U + SUM[i=1 to N][Y(i) - U)**2/N}
4591C
4592C       THE MAHDI PAPER GIVES AN APPROXIMATE VARIANCE IN TERMS
4593C       OF THE SCALE PARAMETER:
4594C
4595C           VAR(SCALE) = SCALE**2/
4596C                        {4*[4 + 3*U**2/SCALE**2 + 6*U*SQRT(PI/2)/SCALE]}
4597C
4598        AN=REAL(N)
4599        ALAMBA=1.0/(2.0*SCALML**2)
4600        ALAMSE=ALAMBA/SQRT(AN)
4601        DSUM1=0.0D0
4602        DO5010I=1,N
4603          DX=DBLE(Y(I)) - DBLE(ALOCML)
4604          DSUM1=DSUM1 + 1.0D0/DX**2
4605 5010   CONTINUE
4606        DTERM1=DSQRT(1.0D0/(2.0D0*DBLE(ALOCML) + DSUM1/DN))
4607        ALOCSE=REAL(DTERM1)
4608        DTERM1=6.0D0*DBLE(ALOCML)*DSQRT(DPI/2.0D0)/DBLE(SCALML)
4609        DTERM2=4.0D0 + 3.0D0*DBLE(ALOCML)**2/DBLE(SCALML)**2
4610        DTERM3=DBLE(SCALML)**2/(DBLE(N)*(DTERM1+DTERM2))
4611        DTERM3=DSQRT(DTERM3)
4612        SCALSE=REAL(DTERM3)
4613C
4614      ENDIF
4615C
4616 9000 CONTINUE
4617      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'YML1')THEN
4618        WRITE(ICOUT,999)
4619        CALL DPWRST('XXX','WRIT')
4620        WRITE(ICOUT,9011)
4621 9011   FORMAT('**** AT THE END OF RAYML1--')
4622        CALL DPWRST('XXX','WRIT')
4623        WRITE(ICOUT,9055)N,XMEAN,XSD,XMIN,XMAX
4624 9055   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,6G15.7)
4625        CALL DPWRST('XXX','WRIT')
4626        IF(ICASPL.EQ.'1')THEN
4627          WRITE(ICOUT,9056)SCALMM,SCALSE
4628 9056     FORMAT('SCALMM,SCALSE = ',2G15.7)
4629          CALL DPWRST('XXX','WRIT')
4630        ELSE
4631          WRITE(ICOUT,9057)ALOCMM,SCALMM
4632 9057     FORMAT('ALOCMM,SCALMM = ',2G15.7)
4633          CALL DPWRST('XXX','WRIT')
4634          WRITE(ICOUT,9058)ALOCML,SCALML
4635 9058     FORMAT('ALOCML,SCALML = ',2G15.7)
4636          CALL DPWRST('XXX','WRIT')
4637          WRITE(ICOUT,9060)ALAMBA,ALAMSE,ALOCSE
4638 9060     FORMAT('ALAMBA,ALAMSE,ALOCSE = ',3G15.7)
4639          CALL DPWRST('XXX','WRIT')
4640        ENDIF
4641      ENDIF
4642C
4643      RETURN
4644      END
4645      SUBROUTINE RAYPDF(X,PDF)
4646C
4647C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
4648C              FUNCTION VALUE FOR THE RAYLEIGH DISTRIBUTION.
4649C              THIS DISTRIBUTION IS DEFINED FOR NON-NEGATIVE X AND
4650C              HAS THE PROBABILITY DENSITY FUNCTION
4651C                 F(X) = X*EXP(-X**2/2)    X > 0
4652C              NOTE THAT THE RAYLEIGH IS A SPECIAL CASE OF THE
4653C              FOLLOWING:
4654C              1) A CHI DISTRIBUTION WITH NU = 2
4655C              2) A WEIBULL DISTRIBUTION WITH GAMMA = 2 AND SCALE
4656C                 PARAMETER = SQRT(2)
4657C     INPUT  ARGUMENTS--X     = THE SINGLE PRECISION VALUE AT
4658C                               WHICH THE PROBABILITY DENSITY
4659C                               FUNCTION IS TO BE EVALUATED.
4660C                               X SHOULD BE NON-NEGATIVE.
4661C     OUTPUT ARGUMENTS--PDF   = THE SINGLE PRECISION PROBABILITY
4662C                               DENSITY FUNCTION VALUE.
4663C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY FUNCTION
4664C             VALUE PDF FOR THE RAYLEIGH DISTRIBUTION
4665C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
4666C     RESTRICTIONS--NONE.
4667C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
4668C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, LOG.
4669C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
4670C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994).
4671C                "CONTINUOUS UNIVARIATE DISTRIBUTIONS--VOLUME 1",
4672C                SECOND EDITION, WILEY, PP. 453, 686.
4673C     LANGUAGE--ANSI FORTRAN (1977)
4674C     WRITTEN BY--JAMES J. FILLIBEN
4675C                 STATISTICAL ENGINEERING DIVISION
4676C                 INFORMATION TECHNOLOGY LABORATORY
4677C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4678C                 GAITHERSBURG, MD 20899-8980
4679C                 PHONE--301-975-2855
4680C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4681C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
4682C     LANGUAGE--ANSI FORTRAN (1977)
4683C     VERSION NUMBER--2004.6
4684C     ORIGINAL VERSION--JUNE      2004.
4685C
4686C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4687C
4688C---------------------------------------------------------------------
4689C
4690      DOUBLE PRECISION DX
4691      DOUBLE PRECISION DPDF
4692      DOUBLE PRECISION DTERM1
4693      DOUBLE PRECISION DTERM2
4694C
4695C-----COMMON----------------------------------------------------------
4696C
4697      INCLUDE 'DPCOMC.INC'
4698      INCLUDE 'DPCOP2.INC'
4699C
4700C-----START POINT-----------------------------------------------------
4701C
4702C               ************************************
4703C               **  STEP 1--                      **
4704C               **  COMPUTE THE DENSITY FUNCTION  **
4705C               ************************************
4706C
4707      IF(X.LT.0.0)THEN
4708        WRITE(ICOUT,8)
4709        CALL DPWRST('XXX','WRIT')
4710        WRITE(ICOUT,48)X
4711        CALL DPWRST('XXX','WRIT')
4712        PDF=0.0
4713        GOTO9000
4714      ENDIF
4715    8 FORMAT('***** ERROR: VALUE OF THE FIRST ARGUMENT TO RAYPDF ',
4716     1       'IS NEGATIVE.')
4717   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
4718C
4719      IF(X.EQ.0.0)THEN
4720        PDF=0.0
4721      ELSE
4722        DX=DBLE(X)
4723        IF(DX.GE.DSQRT(D1MACH(2)))THEN
4724          PDF=0.0
4725          GOTO9000
4726        ENDIF
4727C
4728        DTERM1=DLOG(DX)
4729        DTERM2=-DX*DX/2.0D0
4730        DPDF=DTERM1 + DTERM2
4731        DPDF=DEXP(DPDF)
4732        PDF=REAL(DPDF)
4733      ENDIF
4734C
4735 9000 CONTINUE
4736      RETURN
4737      END
4738      SUBROUTINE RAYPPF(P,PPF)
4739C
4740C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
4741C              FUNCTION VALUE FOR THE RAYLEIGH DISTRIBUTION.
4742C              THIS DISTRIBUTION IS DEFINED FOR NON-NEGATIVE X AND
4743C              HAS THE PERCENT POINT FUNCTION
4744C                 G(P) = SQRT(2*LOG(1/(1-P)))    0 <= P < 1
4745C              NOTE THAT THE RAYLEIGH IS A SPECIAL CASE OF THE
4746C              FOLLOWING:
4747C              1) A CHI DISTRIBUTION WITH NU = 2
4748C              2) A WEIBULL DISTRIBUTION WITH GAMMA = 2 AND SCALE
4749C                 PARAMETER = SQRT(2)
4750C     INPUT  ARGUMENTS--P     = THE SINGLE PRECISION VALUE AT
4751C                               WHICH THE PERCENT POINT
4752C                               FUNCTION IS TO BE EVALUATED.
4753C                               0 <= P < 1.
4754C     OUTPUT ARGUMENTS--PPF   = THE SINGLE PRECISION PROBABILITY
4755C                               DENSITY FUNCTION VALUE.
4756C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION
4757C             VALUE FOR THE RAYLEIGH DISTRIBUTION
4758C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
4759C     RESTRICTIONS--NONE.
4760C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
4761C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
4762C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
4763C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994).
4764C                "CONTINUOUS UNIVARIATE DISTRIBUTIONS--VOLUME 1",
4765C                SECOND EDITION, WILEY, PP. 453, 686.
4766C     LANGUAGE--ANSI FORTRAN (1977)
4767C     WRITTEN BY--JAMES J. FILLIBEN
4768C                 STATISTICAL ENGINEERING DIVISION
4769C                 INFORMATION TECHNOLOGY LABORATORY
4770C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4771C                 GAITHERSBURG, MD 20899-8980
4772C                 PHONE--301-975-2855
4773C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4774C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
4775C     LANGUAGE--ANSI FORTRAN (1977)
4776C     VERSION NUMBER--2004.6
4777C     ORIGINAL VERSION--JUNE      2004.
4778C
4779C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4780C
4781      DOUBLE PRECISION DP
4782      DOUBLE PRECISION DPPF
4783C
4784C-----COMMON----------------------------------------------------------
4785C
4786      INCLUDE 'DPCOP2.INC'
4787C
4788C-----START POINT-----------------------------------------------------
4789C
4790C               ************************************
4791C               **  STEP 1--                      **
4792C               **  COMPUTE THE DENSITY FUNCTION  **
4793C               ************************************
4794C
4795      IF(P.LT.0.0 .OR. P.GE.1.0)THEN
4796        WRITE(ICOUT,8)
4797        CALL DPWRST('XXX','WRIT')
4798        WRITE(ICOUT,48)P
4799        CALL DPWRST('XXX','WRIT')
4800        PPF=0.0
4801        GOTO9000
4802      ENDIF
4803    8 FORMAT('***** ERROR: VALUE OF THE FIRST ARGUMENT TO RAYPPF ',
4804     1       'IS OUTSIDE THE [0,1) INTERVAL.')
4805   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
4806      IF(P.EQ.0.0)THEN
4807        PPF=0.0
4808      ELSE
4809        DP=DBLE(P)
4810        DPPF=DSQRT(2.0D0*DLOG(1.0D0/(1.0D0-DP)))
4811        PPF=REAL(DPPF)
4812      ENDIF
4813C
4814 9000 CONTINUE
4815      RETURN
4816      END
4817      SUBROUTINE RAYRAN(N,ISEED,X)
4818C
4819C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
4820C              FROM THE RAYLEIGH DISTRIBUTION.
4821C              THIS DISTRIBUTION IS DEFINED FOR NON-NEGATIVE X AND HAS
4822C              THE PROBABILITY DENSITY FUNCTION
4823C                 F(X) = X*EXP(-X**2/2)
4824C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
4825C                                OF RANDOM NUMBERS TO BE
4826C                                GENERATED.
4827C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
4828C                                (OF DIMENSION AT LEAST N)
4829C                                INTO WHICH THE GENERATED
4830C                                RANDOM SAMPLE WILL BE PLACED.
4831C     OUTPUT--A RANDOM SAMPLE OF SIZE N
4832C             FROM THE RAYLEIGH DISTRIBUTION
4833C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
4834C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
4835C                   OF N FOR THIS SUBROUTINE.
4836C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
4837C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
4838C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
4839C     LANGUAGE--ANSI FORTRAN (1977)
4840C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994).
4841C                "CONTINUOUS UNIVARIATE DISTRIBUTIONS--VOLUME 1",
4842C                SECOND EDITION, WILEY, P. 453.
4843C     WRITTEN BY--JAMES J. FILLIBEN
4844C                 STATISTICAL ENGINEERING DIVISION
4845C                 INFORMATION TECHNOLOGY LABORATORY
4846C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
4847C                 GAITHERSBURG, MD 20899-8980
4848C                 PHONE--301-975-2855
4849C     NOTE--DATAPLOT IS A REGISTERED TRMAXMARK
4850C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
4851C     LANGUAGE--ANSI FORTRAN (1977)
4852C     VERSION NUMBER--2004.6
4853C     ORIGINAL VERSION--JUNE      2004.
4854C
4855C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4856C
4857      DIMENSION X(*)
4858C
4859      DOUBLE PRECISION DP
4860      DOUBLE PRECISION DPPF
4861C
4862C-----COMMON----------------------------------------------------------
4863C
4864      INCLUDE 'DPCOP2.INC'
4865C
4866C-----START POINT-----------------------------------------------------
4867C
4868C     CHECK THE INPUT ARGUMENTS FOR ERRORS
4869C
4870      IF(N.LT.1)THEN
4871        WRITE(ICOUT,5)
4872        CALL DPWRST('XXX','BUG ')
4873        WRITE(ICOUT,6)
4874        CALL DPWRST('XXX','BUG ')
4875        WRITE(ICOUT,47)N
4876        CALL DPWRST('XXX','BUG ')
4877        GOTO9999
4878      ENDIF
4879C
4880    5 FORMAT('***** ERROR--FOR THE RAYLEIGH DISTRIBUTION, THE')
4881    6 FORMAT('      REQUESTED NUMBER OF RANDOM NUMBERS WAS ',
4882     1      'NON-POSITIVE.')
4883   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
4884C
4885C     USE PERCENT POINT TRANSFORMATION METHOD.
4886C
4887      CALL UNIRAN(N,ISEED,X)
4888      DO100I=1,N
4889        DP=DBLE(X(I))
4890        DPPF=DSQRT(2.0D0*DLOG(1.0D0/(1.0D0-DP)))
4891        X(I)=REAL(DPPF)
4892  100 CONTINUE
4893C
4894 9999 CONTINUE
4895      RETURN
4896      END
4897      REAL FUNCTION RC (X, Y, IER)
4898C***BEGIN PROLOGUE  RC
4899C***PURPOSE  Calculate an approximation to
4900C             RC(X,Y) = Integral from zero to infinity of
4901C                              -1/2     -1
4902C                    (1/2)(t+X)    (t+Y)  dt,
4903C            where X is nonnegative and Y is positive.
4904C***LIBRARY   SLATEC
4905C***CATEGORY  C14
4906C***TYPE      SINGLE PRECISION (RC-S, DRC-D)
4907C***KEYWORDS  DUPLICATION THEOREM, ELEMENTARY FUNCTIONS,
4908C             ELLIPTIC INTEGRAL, TAYLOR SERIES
4909C***AUTHOR  Carlson, B. C.
4910C             Ames Laboratory-DOE
4911C             Iowa State University
4912C             Ames, IA  50011
4913C           Notis, E. M.
4914C             Ames Laboratory-DOE
4915C             Iowa State University
4916C             Ames, IA  50011
4917C           Pexton, R. L.
4918C             Lawrence Livermore National Laboratory
4919C             Livermore, CA  94550
4920C***DESCRIPTION
4921C
4922C   1.     RC
4923C          Standard FORTRAN function routine
4924C          Single precision version
4925C          The routine calculates an approximation to
4926C           RC(X,Y) = Integral from zero to infinity of
4927C
4928C                              -1/2     -1
4929C                    (1/2)(t+X)    (t+Y)  dt,
4930C
4931C          where X is nonnegative and Y is positive.  The duplication
4932C          theorem is iterated until the variables are nearly equal,
4933C          and the function is then expanded in Taylor series to fifth
4934C          order.  Logarithmic, inverse circular, and inverse hyper-
4935C          bolic functions can be expressed in terms of RC.
4936C
4937C
4938C   2.     Calling Sequence
4939C          RC( X, Y, IER )
4940C
4941C          Parameters on Entry
4942C          Values assigned by the calling routine
4943C
4944C          X      - Single precision, nonnegative variable
4945C
4946C          Y      - Single precision, positive variable
4947C
4948C
4949C
4950C          On Return  (values assigned by the RC routine)
4951C
4952C          RC     - Single precision approximation to the integral
4953C
4954C          IER    - Integer to indicate normal or abnormal termination.
4955C
4956C                     IER = 0 Normal and reliable termination of the
4957C                             routine.  It is assumed that the requested
4958C                             accuracy has been achieved.
4959C
4960C                     IER > 0 Abnormal termination of the routine
4961C
4962C          X and Y are unaltered.
4963C
4964C
4965C   3.    Error Messages
4966C
4967C         Value of IER assigned by the RC routine
4968C
4969C                  Value Assigned         Error Message Printed
4970C                  IER = 1                X.LT.0.0E0.OR.Y.LE.0.0E0
4971C                      = 2                X+Y.LT.LOLIM
4972C                      = 3                MAX(X,Y) .GT. UPLIM
4973C
4974C
4975C   4.     Control Parameters
4976C
4977C                  Values of LOLIM, UPLIM, and ERRTOL are set by the
4978C                  routine.
4979C
4980C          LOLIM and UPLIM determine the valid range of X and Y
4981C
4982C          LOLIM  - Lower limit of valid arguments
4983C
4984C                   Not less  than 5 * (machine minimum)  .
4985C
4986C          UPLIM  - Upper limit of valid arguments
4987C
4988C                   Not greater than (machine maximum) / 5 .
4989C
4990C
4991C                     Acceptable values for:   LOLIM       UPLIM
4992C                     IBM 360/370 SERIES   :   3.0E-78     1.0E+75
4993C                     CDC 6000/7000 SERIES :   1.0E-292    1.0E+321
4994C                     UNIVAC 1100 SERIES   :   1.0E-37     1.0E+37
4995C                     CRAY                 :   2.3E-2466   1.09E+2465
4996C                     VAX 11 SERIES        :   1.5E-38     3.0E+37
4997C
4998C          ERRTOL determines the accuracy of the answer
4999C
5000C                 The value assigned by the routine will result
5001C                 in solution precision within 1-2 decimals of
5002C                 "machine precision".
5003C
5004C
5005C          ERRTOL  - Relative error due to truncation is less than
5006C                    16 * ERRTOL ** 6 / (1 - 2 * ERRTOL).
5007C
5008C
5009C              The accuracy of the computed approximation to the inte-
5010C              gral can be controlled by choosing the value of ERRTOL.
5011C              Truncation of a Taylor series after terms of fifth order
5012C              introduces an error less than the amount shown in the
5013C              second column of the following table for each value of
5014C              ERRTOL in the first column.  In addition to the trunca-
5015C              tion error there will be round-off error, but in prac-
5016C              tice the total error from both sources is usually less
5017C              than the amount given in the table.
5018C
5019C
5020C
5021C          Sample Choices:  ERRTOL   Relative Truncation
5022C                                    error less than
5023C                           1.0E-3    2.0E-17
5024C                           3.0E-3    2.0E-14
5025C                           1.0E-2    2.0E-11
5026C                           3.0E-2    2.0E-8
5027C                           1.0E-1    2.0E-5
5028C
5029C
5030C                    Decreasing ERRTOL by a factor of 10 yields six more
5031C                    decimal digits of accuracy at the expense of one or
5032C                    two more iterations of the duplication theorem.
5033C
5034C *Long Description:
5035C
5036C   RC Special Comments
5037C
5038C
5039C
5040C
5041C                  Check: RC(X,X+Z) + RC(Y,Y+Z) = RC(0,Z)
5042C
5043C                  where X, Y, and Z are positive and X * Y = Z * Z
5044C
5045C
5046C          On Input:
5047C
5048C          X and Y are the variables in the integral RC(X,Y).
5049C
5050C          On Output:
5051C
5052C          X and Y are unaltered.
5053C
5054C
5055C
5056C                    RC(0,1/4)=RC(1/16,1/8)=PI=3.14159...
5057C
5058C                    RC(9/4,2)=LN(2)
5059C
5060C
5061C
5062C          ********************************************************
5063C
5064C          Warning: Changes in the program may improve speed at the
5065C                   expense of robustness.
5066C
5067C
5068C   --------------------------------------------------------------------
5069C
5070C   Special Functions via RC
5071C
5072C
5073C
5074C                  LN X                X .GT. 0
5075C
5076C                                            2
5077C                  LN(X) = (X-1) RC(((1+X)/2)  , X )
5078C
5079C
5080C   --------------------------------------------------------------------
5081C
5082C                  ARCSIN X            -1 .LE. X .LE. 1
5083C
5084C                                      2
5085C                  ARCSIN X = X RC (1-X  ,1 )
5086C
5087C   --------------------------------------------------------------------
5088C
5089C                  ARCCOS X            0 .LE. X .LE. 1
5090C
5091C
5092C                                     2      2
5093C                  ARCCOS X = SQRT(1-X ) RC(X  ,1 )
5094C
5095C   --------------------------------------------------------------------
5096C
5097C                  ARCTAN X            -INF .LT. X .LT. +INF
5098C
5099C                                       2
5100C                  ARCTAN X = X RC(1,1+X  )
5101C
5102C   --------------------------------------------------------------------
5103C
5104C                  ARCCOT X            0 .LE. X .LT. INF
5105C
5106C                                 2   2
5107C                  ARCCOT X = RC(X  ,X +1 )
5108C
5109C   --------------------------------------------------------------------
5110C
5111C                  ARCSINH X           -INF .LT. X .LT. +INF
5112C
5113C                                      2
5114C                  ARCSINH X = X RC(1+X  ,1 )
5115C
5116C   --------------------------------------------------------------------
5117C
5118C                  ARCCOSH X           X .GE. 1
5119C
5120C                                    2        2
5121C                  ARCCOSH X = SQRT(X -1) RC(X  ,1 )
5122C
5123C   --------------------------------------------------------------------
5124C
5125C                  ARCTANH X           -1 .LT. X .LT. 1
5126C
5127C                                        2
5128C                  ARCTANH X = X RC(1,1-X  )
5129C
5130C   --------------------------------------------------------------------
5131C
5132C                  ARCCOTH X           X .GT. 1
5133C
5134C                                  2   2
5135C                  ARCCOTH X = RC(X  ,X -1 )
5136C
5137C   --------------------------------------------------------------------
5138C
5139C***REFERENCES  B. C. Carlson and E. M. Notis, Algorithms for incomplete
5140C                 elliptic integrals, ACM Transactions on Mathematical
5141C                 Software 7, 3 (September 1981), pp. 398-403.
5142C               B. C. Carlson, Computing elliptic integrals by
5143C                 duplication, Numerische Mathematik 33, (1979),
5144C                 pp. 1-16.
5145C               B. C. Carlson, Elliptic integrals of the first kind,
5146C                 SIAM Journal of Mathematical Analysis 8, (1977),
5147C                 pp. 231-242.
5148C***ROUTINES CALLED  R1MACH, XERMSG
5149C***REVISION HISTORY  (YYMMDD)
5150C   790801  DATE WRITTEN
5151C   890531  Changed all specific intrinsics to generic.  (WRB)
5152C   891009  Removed unreferenced statement labels.  (WRB)
5153C   891009  REVISION DATE from Version 3.2
5154C   891214  Prologue converted to Version 4.0 format.  (BAB)
5155C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
5156C   900326  Removed duplicate information from DESCRIPTION section.
5157C           (WRB)
5158C   900510  Changed calls to XERMSG to standard form, and some
5159C           editorial changes.  (RWC))
5160C   920501  Reformatted the REFERENCES section.  (WRB)
5161C***END PROLOGUE  RC
5162C
5163C-----COMMON----------------------------------------------------------
5164C
5165      INCLUDE 'DPCOMC.INC'
5166      INCLUDE 'DPCOP2.INC'
5167C
5168CCCCC CHARACTER*16 XERN3, XERN4, XERN5
5169      INTEGER IER
5170      REAL C1, C2, ERRTOL, LAMDA, LOLIM
5171      REAL MU, S, SN, UPLIM, X, XN, Y, YN
5172      LOGICAL FIRST
5173      SAVE ERRTOL,LOLIM,UPLIM,C1,C2,FIRST
5174      DATA FIRST /.TRUE./
5175C
5176C***FIRST EXECUTABLE STATEMENT  RC
5177      IF (FIRST) THEN
5178         ERRTOL = (R1MACH(3)/16.0E0)**(1.0E0/6.0E0)
5179         LOLIM  = 5.0E0 * R1MACH(1)
5180         UPLIM  = R1MACH(2) / 5.0E0
5181C
5182         C1 = 1.0E0/7.0E0
5183         C2 = 9.0E0/22.0E0
5184      ENDIF
5185      FIRST = .FALSE.
5186C
5187C         CALL ERROR HANDLER IF NECESSARY.
5188C
5189      RC = 0.0E0
5190      IF (X.LT.0.0E0.OR.Y.LE.0.0E0) THEN
5191         IER = 1
5192CCCCC    WRITE (XERN3, '(1PE15.6)') X
5193CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5194         WRITE(ICOUT,1)
5195         CALL DPWRST('XXX','BUG ')
5196         WRITE(ICOUT,9)X
5197         CALL DPWRST('XXX','BUG ')
5198         WRITE(ICOUT,19)Y
5199         CALL DPWRST('XXX','BUG ')
5200         RETURN
5201      ENDIF
5202    1 FORMAT('***** ERORR FROM RC, EITHER THE FIRST ARGUMENT IS ',
5203     *       'NEGATIVE OR THE SECOND ARGUMENT IS NON-POSITIVE ***')
5204    9 FORMAT('***** THE VALUE OF THE FIRST ARGUMENT IS ',E15.8,' *****')
5205   19 FORMAT('***** THE VALUE OF THE SECOND ARGUMENT IS ',E15.8,' ***')
5206C
5207CCCCC IF (MAX(X,Y).GT.UPLIM) THEN
5208      IF (X.GT.UPLIM) THEN
5209         IER = 3
5210CCCCC    WRITE (XERN3, '(1PE15.6)') X
5211CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5212CCCCC    WRITE (XERN5, '(1PE15.6)') UPLIM
5213         WRITE(ICOUT,2)
5214         CALL DPWRST('XXX','BUG ')
5215         WRITE(ICOUT,9)X
5216         CALL DPWRST('XXX','BUG ')
5217         WRITE(ICOUT,8)UPLIM
5218         CALL DPWRST('XXX','BUG ')
5219         RETURN
5220      ENDIF
5221    2 FORMAT('***** ERORR FROM RC, THE FIRST INPUT ARGUMENT IS LARGER',
5222     *       'THAN THE UPPER LIMIT. *****')
5223      IF (Y.GT.UPLIM) THEN
5224         IER = 3
5225         WRITE(ICOUT,3)
5226         CALL DPWRST('XXX','BUG ')
5227         WRITE(ICOUT,19)Y
5228         CALL DPWRST('XXX','BUG ')
5229         WRITE(ICOUT,8)UPLIM
5230         CALL DPWRST('XXX','BUG ')
5231         RETURN
5232      ENDIF
5233    3 FORMAT('***** ERORR FROM RC, THE SECOND INPUT ARGUMENT IS ',
5234     *       'LARGER THAN THE UPPER LIMIT. *****')
5235    8 FORMAT('***** THE VALUE OF THE UPPER LIMIT IS ',E15.8,' *****')
5236C
5237      IF (X+Y.LT.LOLIM) THEN
5238         IER = 2
5239CCCCC    WRITE (XERN3, '(1PE15.6)') X
5240CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5241CCCCC    WRITE (XERN5, '(1PE15.6)') LOLIM
5242         WRITE(ICOUT,4)
5243         CALL DPWRST('XXX','BUG ')
5244         WRITE(ICOUT,9)X
5245         CALL DPWRST('XXX','BUG ')
5246         WRITE(ICOUT,9)Y
5247         CALL DPWRST('XXX','BUG ')
5248         WRITE(ICOUT,7)UPLIM
5249         CALL DPWRST('XXX','BUG ')
5250         RETURN
5251      ENDIF
5252    4 FORMAT('***** ERORR FROM RC, THE SUM OF THE TWO ARGUMENTS IS ',
5253     *       'LESS THAN THE LOWER LIMIT. *****')
5254    7 FORMAT('***** THE VALUE OF THE LOWER LIMIT IS ',E15.8,' *****')
5255C
5256      IER = 0
5257      XN = X
5258      YN = Y
5259C
5260   30 MU = (XN+YN+YN)/3.0E0
5261      SN = (YN+MU)/MU - 2.0E0
5262      IF (ABS(SN).LT.ERRTOL) GO TO 40
5263      LAMDA = 2.0E0*SQRT(XN)*SQRT(YN) + YN
5264      XN = (XN+LAMDA)*0.250E0
5265      YN = (YN+LAMDA)*0.250E0
5266      GO TO 30
5267C
5268   40 S = SN*SN*(0.30E0+SN*(C1+SN*(0.3750E0+SN*C2)))
5269      RC = (1.0E0+S)/SQRT(MU)
5270      RETURN
5271      END
5272      SUBROUTINE RCRUDE(NDIM, MAXPTS, FUNCTN, ABSEST, FINEST, IR)
5273*
5274*     Crude Monte-Carlo Algorithm with simple antithetic variates
5275*      and weighted results on restart
5276*
5277      EXTERNAL FUNCTN
5278      INTEGER NDIM, MAXPTS, M, K, IR, NPTS
5279      DOUBLE PRECISION FINEST, ABSEST, X(100), FUN, FUNCTN, UNI,
5280     &     VARSQR, VAREST, VARPRD, FINDIF, FINVAL
5281      SAVE VAREST
5282      IF ( IR .LE. 0 ) THEN
5283         VAREST = 0.0D0
5284         FINEST = 0.0D0
5285      ENDIF
5286      FINVAL = 0.0D0
5287      VARSQR = 0.0D0
5288      NPTS = MAXPTS/2
5289      IRESET=0
5290      DO 100 M = 1,NPTS
5291         DO 200 K = 1,NDIM
5292            X(K) = UNI(IRESET)
5293  200    CONTINUE
5294         FUN = FUNCTN(NDIM, X)
5295         DO 300 K = 1,NDIM
5296            X(K) = 1.0D0 - X(K)
5297  300    CONTINUE
5298         FUN = ( FUNCTN(NDIM, X) + FUN )/2.0D0
5299         FINDIF = ( FUN - FINVAL )/DBLE(M)
5300         VARSQR = DBLE( M - 2 )*VARSQR/DBLE(M) + FINDIF**2
5301         FINVAL = FINVAL + FINDIF
5302  100 CONTINUE
5303      VARPRD = VAREST*VARSQR
5304      FINEST = FINEST + ( FINVAL - FINEST )/(1.0D0 + VARPRD)
5305      IF ( VARSQR .GT. 0.0D0 ) VAREST = (1.0D0 + VARPRD)/VARSQR
5306      ABSEST = 3.0D0*SQRT( VARSQR/( 1.0D0 + VARPRD ) )
5307C
5308      RETURN
5309      END
5310      SUBROUTINE RCSWAP(P, Q, A, B, INFIN, N, C)
5311*
5312*     Swaps rows and columns P and Q in situ.
5313*
5314      DOUBLE PRECISION A(*), B(*), C(*), T
5315      INTEGER INFIN(*), P, Q, N, I, J, II, JJ
5316      T = A(P)
5317      A(P) = A(Q)
5318      A(Q) = T
5319      T = B(P)
5320      B(P) = B(Q)
5321      B(Q) = T
5322      J = INFIN(P)
5323      INFIN(P) = INFIN(Q)
5324      INFIN(Q) = J
5325      JJ = (P*(P-1))/2
5326      II = (Q*(Q-1))/2
5327      T = C(JJ+P)
5328      C(JJ+P) = C(II+Q)
5329      C(II+Q) = T
5330      DO 100 J = 1, P-1
5331         T = C(JJ+J)
5332         C(JJ+J) = C(II+J)
5333         C(II+J) = T
5334  100 CONTINUE
5335      JJ = JJ + P
5336      DO 200 I = P+1, Q-1
5337         T = C(JJ+P)
5338         C(JJ+P) = C(II+I)
5339         C(II+I) = T
5340         JJ = JJ + I
5341  200 CONTINUE
5342      II = II + Q
5343      DO 300 I = Q+1, N
5344         T = C(II+P)
5345         C(II+P) = C(II+Q)
5346         C(II+Q) = T
5347         II = II + I
5348  300 CONTINUE
5349C
5350      RETURN
5351      END
5352      REAL FUNCTION RD (X, Y, Z, IER)
5353C***BEGIN PROLOGUE  RD
5354C***PURPOSE  Compute the incomplete or complete elliptic integral of the
5355C            2nd kind.  For X and Y nonnegative, X+Y and Z positive,
5356C             RD(X,Y,Z) = Integral from zero to infinity of
5357C                                -1/2     -1/2     -3/2
5358C                      (3/2)(t+X)    (t+Y)    (t+Z)    dt.
5359C            If X or Y is zero, the integral is complete.
5360C***LIBRARY   SLATEC
5361C***CATEGORY  C14
5362C***TYPE      SINGLE PRECISION (RD-S, DRD-D)
5363C***KEYWORDS  COMPLETE ELLIPTIC INTEGRAL, DUPLICATION THEOREM,
5364C             INCOMPLETE ELLIPTIC INTEGRAL, INTEGRAL OF THE SECOND KIND,
5365C             TAYLOR SERIES
5366C***AUTHOR  Carlson, B. C.
5367C             Ames Laboratory-DOE
5368C             Iowa State University
5369C             Ames, IA  50011
5370C           Notis, E. M.
5371C             Ames Laboratory-DOE
5372C             Iowa State University
5373C             Ames, IA  50011
5374C           Pexton, R. L.
5375C             Lawrence Livermore National Laboratory
5376C             Livermore, CA  94550
5377C***DESCRIPTION
5378C
5379C   1.     RD
5380C          Evaluate an INCOMPLETE (or COMPLETE) ELLIPTIC INTEGRAL
5381C          of the second kind
5382C          Standard FORTRAN function routine
5383C          Single precision version
5384C          The routine calculates an approximation result to
5385C          RD(X,Y,Z) = Integral from zero to infinity of
5386C                              -1/2     -1/2     -3/2
5387C                    (3/2)(t+X)    (t+Y)    (t+Z)    dt,
5388C          where X and Y are nonnegative, X + Y is positive, and Z is
5389C          positive.  If X or Y is zero, the integral is COMPLETE.
5390C          The duplication theorem is iterated until the variables are
5391C          nearly equal, and the function is then expanded in Taylor
5392C          series to fifth order.
5393C
5394C   2.     Calling Sequence
5395C
5396C          RD( X, Y, Z, IER )
5397C
5398C          Parameters on Entry
5399C          Values assigned by the calling routine
5400C
5401C          X      - Single precision, nonnegative variable
5402C
5403C          Y      - Single precision, nonnegative variable
5404C
5405C                   X + Y is positive
5406C
5407C          Z      - Real, positive variable
5408C
5409C
5410C
5411C          On Return     (values assigned by the RD routine)
5412C
5413C          RD     - Real approximation to the integral
5414C
5415C
5416C          IER    - Integer
5417C
5418C                   IER = 0 Normal and reliable termination of the
5419C                           routine.  It is assumed that the requested
5420C                           accuracy has been achieved.
5421C
5422C                   IER >  0 Abnormal termination of the routine
5423C
5424C
5425C          X, Y, Z are unaltered.
5426C
5427C   3.    Error Messages
5428C
5429C         Value of IER assigned by the RD routine
5430C
5431C                  Value Assigned         Error Message Printed
5432C                  IER = 1                MIN(X,Y) .LT. 0.0E0
5433C                      = 2                MIN(X + Y, Z ) .LT. LOLIM
5434C                      = 3                MAX(X,Y,Z) .GT. UPLIM
5435C
5436C
5437C   4.     Control Parameters
5438C
5439C                  Values of LOLIM, UPLIM, and ERRTOL are set by the
5440C                  routine.
5441C
5442C          LOLIM and UPLIM determine the valid range of X, Y, and Z
5443C
5444C          LOLIM  - Lower limit of valid arguments
5445C
5446C                    Not less  than 2 / (machine maximum) ** (2/3).
5447C
5448C          UPLIM  - Upper limit of valid arguments
5449C
5450C                    Not greater than (0.1E0 * ERRTOL / machine
5451C                    minimum) ** (2/3), where ERRTOL is described below.
5452C                    In the following table it is assumed that ERRTOL
5453C                    will never be chosen smaller than 1.0E-5.
5454C
5455C
5456C                    Acceptable Values For:   LOLIM      UPLIM
5457C                    IBM 360/370 SERIES   :   6.0E-51     1.0E+48
5458C                    CDC 6000/7000 SERIES :   5.0E-215    2.0E+191
5459C                    UNIVAC 1100 SERIES   :   1.0E-25     2.0E+21
5460C                    CRAY                 :   3.0E-1644   1.69E+1640
5461C                    VAX 11 SERIES        :   1.0E-25     4.5E+21
5462C
5463C
5464C          ERRTOL determines the accuracy of the answer
5465C
5466C                 The value assigned by the routine will result
5467C                 in solution precision within 1-2 decimals of
5468C                 "machine precision".
5469C
5470C          ERRTOL    Relative error due to truncation is less than
5471C                    3 * ERRTOL ** 6 / (1-ERRTOL) ** 3/2.
5472C
5473C
5474C
5475C              The accuracy of the computed approximation to the inte-
5476C              gral can be controlled by choosing the value of ERRTOL.
5477C              Truncation of a Taylor series after terms of fifth order
5478C              introduces an error less than the amount shown in the
5479C              second column of the following table for each value of
5480C              ERRTOL in the first column.  In addition to the trunca-
5481C              tion error there will be round-off error, but in prac-
5482C              tice the total error from both sources is usually less
5483C              than the amount given in the table.
5484C
5485C
5486C
5487C
5488C          Sample Choices:  ERRTOL   Relative Truncation
5489C                                    error less than
5490C                           1.0E-3    4.0E-18
5491C                           3.0E-3    3.0E-15
5492C                           1.0E-2    4.0E-12
5493C                           3.0E-2    3.0E-9
5494C                           1.0E-1    4.0E-6
5495C
5496C
5497C                    Decreasing ERRTOL by a factor of 10 yields six more
5498C                    decimal digits of accuracy at the expense of one or
5499C                    two more iterations of the duplication theorem.
5500C
5501C *Long Description:
5502C
5503C   RD Special Comments
5504C
5505C
5506C
5507C          Check: RD(X,Y,Z) + RD(Y,Z,X) + RD(Z,X,Y)
5508C          = 3 /  SQRT(X * Y * Z), where X, Y, and Z are positive.
5509C
5510C
5511C          On Input:
5512C
5513C          X, Y, and Z are the variables in the integral RD(X,Y,Z).
5514C
5515C
5516C          On Output:
5517C
5518C
5519C          X, Y, and Z are unaltered.
5520C
5521C
5522C
5523C          ********************************************************
5524C
5525C           WARNING: Changes in the program may improve speed at the
5526C                    expense of robustness.
5527C
5528C
5529C
5530C    -------------------------------------------------------------------
5531C
5532C
5533C   Special Functions via RD and RF
5534C
5535C
5536C                  Legendre form of ELLIPTIC INTEGRAL of 2nd kind
5537C                  ----------------------------------------------
5538C
5539C
5540C                                            2         2   2
5541C                  E(PHI,K) = SIN(PHI) RF(COS (PHI),1-K SIN (PHI),1) -
5542C
5543C                     2      3            2         2   2
5544C                  -(K/3) SIN (PHI) RD(COS (PHI),1-K SIN (PHI),1)
5545C
5546C
5547C                                 2        2           2
5548C                  E(K) = RF(0,1-K ,1) - (K/3) RD(3,1-K ,1)
5549C
5550C
5551C                         PI/2     2   2      1/2
5552C                       = INT  (1-K SIN (PHI) )  D PHI
5553C                          0
5554C
5555C
5556C
5557C                  Bulirsch form of ELLIPTIC INTEGRAL of 2nd kind
5558C                  ----------------------------------------------
5559C
5560C                                              2 2    2
5561C                  EL2(X,KC,A,B) = AX RF(1,1+KC X ,1+X ) +
5562C
5563C                                              3         2 2    2
5564C                                 +(1/3)(B-A) X RD(1,1+KC X ,1+X )
5565C
5566C
5567C
5568C                  Legendre form of alternative ELLIPTIC INTEGRAL of 2nd
5569C                  -----------------------------------------------------
5570C                        kind
5571C                        ----
5572C
5573C                            Q     2       2   2  -1/2
5574C                  D(Q,K) = INT SIN P  (1-K SIN P)     DP
5575C                            0
5576C
5577C
5578C
5579C                                   3          2     2   2
5580C                  D(Q,K) =(1/3)(SIN Q)  RD(COS Q,1-K SIN Q,1)
5581C
5582C
5583C
5584C
5585C
5586C                  Lemniscate constant B
5587C                  ---------------------
5588C
5589C
5590C
5591C                       1    2    4 -1/2
5592C                  B = INT  S (1-S )    DS
5593C                       0
5594C
5595C
5596C                  B =(1/3)RD (0,2,1)
5597C
5598C
5599C
5600C
5601C                  Heuman's LAMBDA function
5602C                  ------------------------
5603C
5604C
5605C
5606C                  (PI/2) LAMBDA0(A,B) =
5607C
5608C                                       2                2
5609C                     = SIN(B) (RF(0,COS (A),1)-(1/3) SIN (A) *
5610C
5611C                               2              2         2       2
5612C                      *RD(0,COS (A),1)) RF(COS (B),1-COS (A) SIN (B),1)
5613C
5614C                               2       3            2
5615C                     -(1/3) COS (A) SIN (B) RF(0,COS (A),1) *
5616C
5617C                             2         2       2
5618C                      *RD(COS (B),1-COS (A) SIN (B),1)
5619C
5620C
5621C
5622C                  Jacobi ZETA function
5623C                  --------------------
5624C
5625C
5626C                             2                2       2   2
5627C                  Z(B,K) = (K/3) SIN(B) RF(COS (B),1-K SIN (B),1)
5628C
5629C
5630C                                      2            2
5631C                             *RD(0,1-K ,1)/RF(0,1-K ,1)
5632C
5633C                               2       3          2       2   2
5634C                            -(K /3) SIN (B) RD(COS (B),1-K SIN (B),1)
5635C
5636C
5637C    -------------------------------------------------------------------
5638C
5639C***REFERENCES  B. C. Carlson and E. M. Notis, Algorithms for incomplete
5640C                 elliptic integrals, ACM Transactions on Mathematical
5641C                 Software 7, 3 (September 1981), pp. 398-403.
5642C               B. C. Carlson, Computing elliptic integrals by
5643C                 duplication, Numerische Mathematik 33, (1979),
5644C                 pp. 1-16.
5645C               B. C. Carlson, Elliptic integrals of the first kind,
5646C                 SIAM Journal of Mathematical Analysis 8, (1977),
5647C                 pp. 231-242.
5648C***ROUTINES CALLED  R1MACH, XERMSG
5649C***REVISION HISTORY  (YYMMDD)
5650C   790801  DATE WRITTEN
5651C   890531  Changed all specific intrinsics to generic.  (WRB)
5652C   890531  REVISION DATE from Version 3.2
5653C   891214  Prologue converted to Version 4.0 format.  (BAB)
5654C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
5655C   900326  Removed duplicate information from DESCRIPTION section.
5656C           (WRB)
5657C   900510  Modify calls to XERMSG to put in standard form.  (RWC)
5658C   920501  Reformatted the REFERENCES section.  (WRB)
5659C***END PROLOGUE  RD
5660C
5661C-----COMMON----------------------------------------------------------
5662C
5663      INCLUDE 'DPCOMC.INC'
5664      INCLUDE 'DPCOP2.INC'
5665C
5666CCCCC CHARACTER*16 XERN3, XERN4, XERN5, XERN6
5667      INTEGER IER
5668      REAL LOLIM, UPLIM, EPSLON, ERRTOL
5669      REAL C1, C2, C3, C4, EA, EB, EC, ED, EF, LAMDA
5670      REAL MU, POWER4, SIGMA, S1, S2, X, XN, XNDEV
5671      REAL XNROOT, Y, YN, YNDEV, YNROOT, Z, ZN, ZNDEV, ZNROOT
5672      LOGICAL FIRST
5673      SAVE ERRTOL, LOLIM, UPLIM, C1, C2, C3, C4, FIRST
5674      DATA FIRST /.TRUE./
5675C
5676C***FIRST EXECUTABLE STATEMENT  RD
5677      IF (FIRST) THEN
5678         ERRTOL = (R1MACH(3)/3.0E0)**(1.0E0/6.0E0)
5679         LOLIM  = 2.0E0/(R1MACH(2))**(2.0E0/3.0E0)
5680         TUPLIM = R1MACH(1)**(1.0E0/3.0E0)
5681         TUPLIM = (0.10E0*ERRTOL)**(1.0E0/3.0E0)/TUPLIM
5682         UPLIM  = TUPLIM**2.0E0
5683C
5684         C1 = 3.0E0/14.0E0
5685         C2 = 1.0E0/6.0E0
5686         C3 = 9.0E0/22.0E0
5687         C4 = 3.0E0/26.0E0
5688      ENDIF
5689      FIRST = .FALSE.
5690C
5691C         CALL ERROR HANDLER IF NECESSARY.
5692C
5693      RD = 0.0E0
5694      IF( MIN(X,Y).LT.0.0E0) THEN
5695         IER = 1
5696CCCCC    WRITE (XERN3, '(1PE15.6)') X
5697CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5698         WRITE(ICOUT,1)
5699         CALL DPWRST('XXX','BUG ')
5700         WRITE(ICOUT,9)X
5701         CALL DPWRST('XXX','BUG ')
5702         WRITE(ICOUT,8)Y
5703         CALL DPWRST('XXX','BUG ')
5704         RETURN
5705      ENDIF
5706    1 FORMAT('***** ERORR FROM RD, THE MINIMUM OF THE FIRST TWO ',
5707     *       'AGRUMENTS IS NEGATIVE. ***')
5708    9 FORMAT('***** THE VALUE OF THE FIRST ARGUMENT IS ',E15.8,' ***')
5709    8 FORMAT('***** THE VALUE OF THE SECOND ARGUMENT IS ',E15.8,' ***')
5710    7 FORMAT('***** THE VALUE OF THE THIRD ARGUMENT IS ',E15.8,' ***')
5711C
5712      IF (MAX(X,Y,Z).GT.UPLIM) THEN
5713         IER = 3
5714CCCCC    WRITE (XERN3, '(1PE15.6)') X
5715CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5716CCCCC    WRITE (XERN5, '(1PE15.6)') Z
5717CCCCC    WRITE (XERN6, '(1PE15.6)') UPLIM
5718         WRITE(ICOUT,2)
5719         CALL DPWRST('XXX','BUG ')
5720         WRITE(ICOUT,9)X
5721         CALL DPWRST('XXX','BUG ')
5722         WRITE(ICOUT,8)Y
5723         CALL DPWRST('XXX','BUG ')
5724         WRITE(ICOUT,7)Z
5725         CALL DPWRST('XXX','BUG ')
5726         WRITE(ICOUT,6)UPLIM
5727         CALL DPWRST('XXX','BUG ')
5728         RETURN
5729      ENDIF
5730    2 FORMAT('***** ERORR FROM RD, ONE OF THE THREE ARGUMENTS EXCEEDS',
5731     *       ' THE LARGEST ALLOWABLE VALUE. ****')
5732    6 FORMAT('***** THE VALUE OF THE UPPER LIMIT IS ',E15.8,' *****')
5733C
5734      IF (MIN(X+Y,Z).LT.LOLIM) THEN
5735         IER = 2
5736CCCCC    WRITE (XERN3, '(1PE15.6)') X
5737CCCCC    WRITE (XERN4, '(1PE15.6)') Y
5738CCCCC    WRITE (XERN5, '(1PE15.6)') Z
5739CCCCC    WRITE (XERN6, '(1PE15.6)') LOLIM
5740         WRITE(ICOUT,3)
5741         CALL DPWRST('XXX','BUG ')
5742         WRITE(ICOUT,4)
5743         CALL DPWRST('XXX','BUG ')
5744         WRITE(ICOUT,9)X
5745         CALL DPWRST('XXX','BUG ')
5746         WRITE(ICOUT,8)Y
5747         CALL DPWRST('XXX','BUG ')
5748         WRITE(ICOUT,7)Z
5749         CALL DPWRST('XXX','BUG ')
5750         WRITE(ICOUT,5)LOLIM
5751         CALL DPWRST('XXX','BUG ')
5752         RETURN
5753      ENDIF
5754    3 FORMAT('***** ERORR FROM RC, THE MINIMUM OF THE SUM OF THE ',
5755     *       'FIRST TWO ARGUMENTS ')
5756    4 FORMAT('AND THE THIRD ARGUMENT IS LESS THAN THE LOWER LIMIT. ')
5757    5 FORMAT('***** THE VALUE OF THE LOWER LIMIT IS ',E15.8,' *****')
5758C
5759      IER = 0
5760      XN = X
5761      YN = Y
5762      ZN = Z
5763      SIGMA = 0.0E0
5764      POWER4 = 1.0E0
5765C
5766   30 MU = (XN+YN+3.0E0*ZN)*0.20E0
5767      XNDEV = (MU-XN)/MU
5768      YNDEV = (MU-YN)/MU
5769      ZNDEV = (MU-ZN)/MU
5770      EPSLON = MAX(ABS(XNDEV), ABS(YNDEV), ABS(ZNDEV))
5771      IF (EPSLON.LT.ERRTOL) GO TO 40
5772      XNROOT = SQRT(XN)
5773      YNROOT = SQRT(YN)
5774      ZNROOT = SQRT(ZN)
5775      LAMDA = XNROOT*(YNROOT+ZNROOT) + YNROOT*ZNROOT
5776      SIGMA = SIGMA + POWER4/(ZNROOT*(ZN+LAMDA))
5777      POWER4 = POWER4*0.250E0
5778      XN = (XN+LAMDA)*0.250E0
5779      YN = (YN+LAMDA)*0.250E0
5780      ZN = (ZN+LAMDA)*0.250E0
5781      GO TO 30
5782C
5783   40 EA = XNDEV*YNDEV
5784      EB = ZNDEV*ZNDEV
5785      EC = EA - EB
5786      ED = EA - 6.0E0*EB
5787      EF = ED + EC + EC
5788      S1 = ED*(-C1+0.250E0*C3*ED-1.50E0*C4*ZNDEV*EF)
5789      S2 = ZNDEV*(C2*EF+ZNDEV*(-C3*EC+ZNDEV*C4*EA))
5790      RD = 3.0E0*SIGMA + POWER4*(1.0E0+S1+S2)/(MU* SQRT(MU))
5791C
5792      RETURN
5793      END
5794      DOUBLE PRECISION FUNCTION rexp(x)
5795C-----------------------------------------------------------------------
5796C            EVALUATION OF THE FUNCTION EXP(X) - 1
5797C-----------------------------------------------------------------------
5798C     .. Scalar Arguments ..
5799      DOUBLE PRECISION x
5800C     ..
5801C     .. Local Scalars ..
5802      DOUBLE PRECISION p1,p2,q1,q2,q3,q4,w
5803C     ..
5804C     .. Intrinsic Functions ..
5805      INTRINSIC abs,exp
5806C     ..
5807C     .. Data statements ..
5808      DATA p1/.914041914819518D-09/,p2/.238082361044469D-01/,
5809     +     q1/-.499999999085958D+00/,q2/.107141568980644D+00/,
5810     +     q3/-.119041179760821D-01/,q4/.595130811860248D-03/
5811C     ..
5812C     .. Executable Statements ..
5813C-----------------------
5814      IF (abs(x).GT.0.15D0) GO TO 10
5815      rexp = x* (((p2*x+p1)*x+1.0D0)/ ((((q4*x+q3)*x+q2)*x+q1)*x+1.0D0))
5816      RETURN
5817C
5818   10 w = exp(x)
5819      IF (x.GT.0.0D0) GO TO 20
5820      rexp = (w-0.5D0) - 0.5D0
5821      RETURN
5822
5823   20 rexp = w* (0.5D0+ (0.5D0-1.0D0/w))
5824      RETURN
5825
5826      END
5827      SUBROUTINE RGTCDF(X,ALPHA,BETA,A,B,CDF)
5828C
5829C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
5830C              FUNCTION VALUE FOR THE
5831C              REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION.
5832C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
5833C
5834C                  F(X;ALPHA,BETA,A,B) = 1 -
5835C                     ((B - X)/(B-A))**BETA*
5836C                     {ALPHA - (ALPHA-1)*((B-X)/(B-A))}**BETA
5837C                                    A <= X <= B, BETA > 0,
5838C                                    0 < ALPHA <= 2
5839C
5840C              WITH ALPHA AND BETA DENOTING THE SHAPE PARAMETERS.
5841C
5842C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
5843C                                WHICH THE CUMULATIVE DISTRIBUTION
5844C                                FUNCTION IS TO BE EVALUATED.
5845C                     --ALPHA  = THE DOUBLE PRECISION FIRST SHAPE
5846C                                PARAMETER
5847C                     --BETA   = THE DOUBLE PRECISION SECOND SHAPE
5848C                                PARAMETER
5849C     OUTPUT ARGUMENTS--CDF    = THE DOUBLE PRECISION CUMULATIVE
5850C                                DISTRIBUTION FUNCTION VALUE.
5851C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
5852C             FUNCTION VALUE CDF.
5853C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
5854C     RESTRICTIONS--X SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
5855C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
5856C     FORTRAN LIBRARY SUBROUTINES NEEDED--DLOG, DEXP.
5857C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
5858C     LANGUAGE--ANSI FORTRAN.
5859C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
5860C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
5861C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
5862C                 PUBLISHING COMPANY, CHAPTER 7.
5863C     WRITTEN BY--JAMES J. FILLIBEN
5864C                 STATISTICAL ENGINEERING DIVISION
5865C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5866C                 GAITHERSBURG, MD 20899-8980
5867C                 PHONE:  301-975-2855
5868C     ORIGINAL VERSION--FEBRUARY  2007.
5869C
5870C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5871C
5872      DOUBLE PRECISION X
5873      DOUBLE PRECISION ALPHA
5874      DOUBLE PRECISION BETA
5875      DOUBLE PRECISION A
5876      DOUBLE PRECISION B
5877      DOUBLE PRECISION CDF
5878      DOUBLE PRECISION DTERM1
5879      DOUBLE PRECISION DTERM2
5880      DOUBLE PRECISION DX
5881C
5882C-----COMMON----------------------------------------------------------
5883C
5884      INCLUDE 'DPCOP2.INC'
5885C
5886C---------------------------------------------------------------------
5887C
5888C     CHECK THE INPUT ARGUMENTS FOR ERRORS
5889C
5890      IF(B.LT.A)THEN
5891        TERM1=B
5892        B=A
5893        A=TERM1
5894      ENDIF
5895C
5896      IF(X.LT.A)THEN
5897CCCCC   WRITE(ICOUT,2)
5898CCCCC   CALL DPWRST('XXX','BUG ')
5899CCCCC   WRITE(ICOUT,3)A,B
5900CCCCC   CALL DPWRST('XXX','BUG ')
5901CCCCC   WRITE(ICOUT,46)X
5902CCCCC   CALL DPWRST('XXX','BUG ')
5903        CDF=0.0D0
5904        GOTO9000
5905      ELSEIF(X.GT.B)THEN
5906        CDF=1.0D0
5907        GOTO9000
5908      ELSEIF(ALPHA.LE.0.0D0 .OR. ALPHA.GT.2.0)THEN
5909        WRITE(ICOUT,12)
5910        CALL DPWRST('XXX','BUG ')
5911        WRITE(ICOUT,46)BETA
5912        CALL DPWRST('XXX','BUG ')
5913        CDF=0.0D0
5914        GOTO9000
5915      ELSEIF(BETA.LE.0.0D0)THEN
5916        WRITE(ICOUT,14)
5917        CALL DPWRST('XXX','BUG ')
5918        WRITE(ICOUT,46)BETA
5919        CALL DPWRST('XXX','BUG ')
5920        CDF=0.0D0
5921        GOTO9000
5922      ELSEIF(B.EQ.A)THEN
5923        WRITE(ICOUT,16)
5924        CALL DPWRST('XXX','BUG ')
5925        WRITE(ICOUT,48)A
5926        CALL DPWRST('XXX','BUG ')
5927        CDF=0.0D0
5928      ENDIF
5929CCCC2 FORMAT('***** ERROR--THE FIRST ARGUMENT TO RGTCDF IS OUTSIDE THE')
5930CCCC3 FORMAT('      (',G15.7,',',G15.7,') INTERVAL.')
5931   12 FORMAT('***** ERROR--THE SECOND ARGUMENT TO RGTCDF IS ',
5932     1       'OUTSIDE THE [0,2) INTERVAL')
5933   14 FORMAT('***** ERROR--THE THIRD ARGUMENT TO RGTCDF IS ',
5934     1       'IS NON-POSITIVE.')
5935   16 FORMAT('***** ERROR--THE LOWER AND UPPER LIMITS FOR RGTCDF ',
5936     1       'ARE EQUAL')
5937   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
5938   48 FORMAT('***** THE VALUE OF THE LIMIT IS ',G15.7)
5939C
5940C-----START POINT-----------------------------------------------------
5941C
5942      DX=(B-X)/(B-A)
5943      IF(X.LE.A)THEN
5944        CDF=0.0D0
5945      ELSEIF(X.GE.B)THEN
5946        CDF=1.0D0
5947      ELSE
5948        DTERM1=BETA*DLOG(DX)
5949        DTERM2=BETA*DLOG(ALPHA - (ALPHA-1.0D0)*DX)
5950        CDF=1.0D0 - DEXP(DTERM1 + DTERM2)
5951      ENDIF
5952C
5953 9000 CONTINUE
5954      RETURN
5955      END
5956      DOUBLE PRECISION FUNCTION RGTFUN(ALPHA,X)
5957C
5958C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE ROOT OF THE
5959C              FOLLOWING EQUATION:
5960C
5961C              G(alpha) = {(N/SUM[i=1 to m]
5962C              [n(i)*LOG(1/(alpha*y(i)-(alpha-1)*y(i)**2))] - 1}*
5963C              SUM[i=1 to m][n(i)*(1 - y(i))/(alpha - (alpha-1)*y(i))]
5964C              + SUM[i=1 to m][n(i)*(1 - 2*y(i))/
5965C              (alpha - 2*(alpha-1)*y(i))]
5966C
5967C              WHERE
5968C
5969C              M       = NUMBER OF GROUPS
5970C              n(i)    = NUMBER OF OBSERVATIONS IN GROUP i
5971C              N       = TOTAL NUMBER OF OBSERVATIONS
5972C              y(i)    = 1 - XBAR(i)
5973C              XBAR(i) = MEAN OF THE iTH INTERVAL
5974C
5975C              THIS EQUATION IS USED TO PROVIDE AN APPROXIMATE
5976C              MAXIMUM LIKELIHOOD SOLUTION FOR THE
5977C              REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION.
5978C
5979C              THIS ALGORITHM CAN IN FACT BE USED FOR RAW DATA,
5980C              GROUPS WITH EQUAL BIN SIZES, AND GROUPS WITH
5981C              UNEQUAL BIN SIZES.
5982C
5983C     EXAMPLE--REFLECTED GENERALIZED TOPP AND LEONE  MLE Y
5984C            --REFLECTED GENERALIZED TOPP AND LEONE  MLE Y X
5985C            --REFLECTED GENERALIZED TOPP AND LEONE  MLE Y XLOW XHIGH
5986C     REFERENCE--KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
5987C                CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
5988C                SUPPORT AND APPLICATIONS", WORLD SCIENTIFIC,
5989C                PP. 211-213.
5990C     WRITTEN BY--JAMES J. FILLIBEN
5991C                 STATISTICAL ENGINEERING DIVISION
5992C                 INFORMATION TECHNOLOGY LABORATORY
5993C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5994C                 GAITHERSBUG, MD 20899-8980
5995C                 PHONE--301-975-2855
5996C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5997C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5998C     LANGUAGE--ANSI FORTRAN (1977)
5999C     VERSION NUMBER--2007/7
6000C     ORIGINAL VERSION--JULY       2007.
6001C
6002C---------------------------------------------------------------------
6003C
6004      DOUBLE PRECISION ALPHA
6005      DOUBLE PRECISION X(*)
6006C
6007      COMMON/RGTCOM/NTOT,NCLASS,MAXGRP
6008C
6009C---------------------------------------------------------------------
6010C
6011      DOUBLE PRECISION DSUM1
6012      DOUBLE PRECISION DSUM2
6013      DOUBLE PRECISION DSUM3
6014      DOUBLE PRECISION DTERM1
6015      DOUBLE PRECISION DXI
6016      DOUBLE PRECISION DNI
6017      DOUBLE PRECISION DYI
6018      DOUBLE PRECISION DN
6019C
6020      INCLUDE 'DPCOP2.INC'
6021C
6022C-----START POINT-----------------------------------------------------
6023C
6024      DSUM1=0.0D0
6025      DSUM2=0.0D0
6026      DSUM3=0.0D0
6027C
6028      DN=DBLE(NTOT)
6029      DO100I=1,NCLASS
6030        DXI=X(I)
6031        DNI=X(I+MAXGRP)
6032C
6033        DYI=1.0D0 - DXI
6034        DTERM1=ALPHA*DYI - (ALPHA-1.0D0)*DYI**2
6035C
6036        DSUM1=DSUM1 + DNI*DLOG(1.0D0/DTERM1)
6037        DSUM2=DSUM2 + DNI*(1.0D0 - DYI)/(ALPHA-(ALPHA-1.0D0)*DYI)
6038        DSUM3=DSUM3 + DNI*(1.0D0 - 2.0D0*DYI)/
6039     1        (ALPHA-2.0D0*(ALPHA-1.0D0)*DYI)
6040C
6041  100 CONTINUE
6042C
6043      RGTFUN=((DN/DSUM1) - 1.0D0)*DSUM2 + DSUM3
6044C
6045      RETURN
6046      END
6047      SUBROUTINE RGTLI1(Y,N,
6048     1                  A,B,ALPHA,BETA,
6049     1                  ALIK,AIC,AICC,BIC,
6050     1                  ISUBRO,IBUGA3,IERROR)
6051C
6052C     PURPOSE--THIS ROUTINE COMPUTES THE LOG-LIKIHOOD FUNCTION FOR
6053C              THE REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION.
6054C              THIS IS FOR THE RAW DATA CASE (I.E., NO GROUPING AND NO
6055C              CENSORING).
6056C
6057C              NOTE THAT THE LOWER AND UPPER LIMITS MUST BE EXPLICITLY
6058C              GIVEN.
6059C
6060C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
6061C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH
6062C                 BOUNDED SUPPORT AND APPLICATIONS", WORLD
6063C                 SCIENTIFIC PUBLISHING CO., PP. 211-213.
6064C     WRITTEN BY--ALAN HECKERT
6065C                 STATISTICAL ENGINEERING DIVISION
6066C                 INFORMATION TECHNOLOGY LABORATORY
6067C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6068C                 GAITHERSBURG, MD 20899-8980
6069C                 PHONE--301-975-2899
6070C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6071C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6072C     LANGUAGE--ANSI FORTRAN (1977)
6073C     VERSION NUMBER--2013/06
6074C     ORIGINAL VERSION--JUNE      2013.
6075C
6076      CHARACTER*4 ISUBRO
6077      CHARACTER*4 IBUGA3
6078      CHARACTER*4 IERROR
6079C
6080      CHARACTER*4 IWRITE
6081      CHARACTER*4 ISUBN1
6082      CHARACTER*4 ISUBN2
6083      CHARACTER*4 ISTEPN
6084C
6085      DOUBLE PRECISION DA
6086      DOUBLE PRECISION DB
6087      DOUBLE PRECISION DALPHA
6088      DOUBLE PRECISION DBETA
6089      DOUBLE PRECISION DN
6090      DOUBLE PRECISION DNP
6091      DOUBLE PRECISION DLIK
6092      DOUBLE PRECISION DPDF
6093C
6094C---------------------------------------------------------------------
6095C
6096      DIMENSION Y(*)
6097C
6098C---------------------------------------------------------------------
6099C
6100      INCLUDE 'DPCOP2.INC'
6101C
6102C-----START POINT-----------------------------------------------------
6103C
6104      ISUBN1='RGTL'
6105      ISUBN2='I1  '
6106      IWRITE='OFF'
6107      IERROR='NO'
6108C
6109      ALIK=CPUMIN
6110      AIC=CPUMIN
6111      AICC=CPUMIN
6112      BIC=CPUMIN
6113C
6114      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')THEN
6115        WRITE(ICOUT,999)
6116  999   FORMAT(1X)
6117        CALL DPWRST('XXX','WRIT')
6118        WRITE(ICOUT,51)
6119   51   FORMAT('**** AT THE BEGINNING OF RGTLI1--')
6120        CALL DPWRST('XXX','WRIT')
6121        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,A,B,ALPHA,BETA
6122   52   FORMAT('IBUGA3,ISUBRO,N,A,B,ALPHA,BETA = ',2(A4,2X),I8,4G15.7)
6123        CALL DPWRST('XXX','WRIT')
6124        DO56I=1,MIN(N,100)
6125          WRITE(ICOUT,57)I,Y(I)
6126   57     FORMAT('I,Y(I) = ',I8,G15.7)
6127          CALL DPWRST('XXX','WRIT')
6128   56   CONTINUE
6129      ENDIF
6130C
6131C               ******************************************
6132C               **  STEP 1--                            **
6133C               **  COMPUTE LIKELIHOOD FUNCTION         **
6134C               ******************************************
6135C
6136      ISTEPN='1'
6137      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')
6138     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
6139C
6140      CALL MINIM(Y,N,IWRITE,YMIN,IBUGA3,IERROR)
6141      CALL MAXIM(Y,N,IWRITE,YMAX,IBUGA3,IERROR)
6142      IF(A.GE.YMIN .OR. B.LE.YMAX)THEN
6143        WRITE(ICOUT,999)
6144        CALL DPWRST('XXX','WRIT')
6145        WRITE(ICOUT,101)
6146  101   FORMAT('**** ERROR IN REFLECTED GENERALIZED TOPP AND LEONE ',
6147     1         'LOG-LIKELIHOOD--')
6148        CALL DPWRST('XXX','WRIT')
6149        WRITE(ICOUT,103)
6150  103   FORMAT('     INVALID LIMITS:')
6151        CALL DPWRST('XXX','WRIT')
6152        WRITE(ICOUT,105)A
6153  105   FORMAT('     LOWER LIMIT    = ',G15.7)
6154        CALL DPWRST('XXX','WRIT')
6155        WRITE(ICOUT,106)YMIN
6156  106   FORMAT('     DATA MINIMUM   = ',G15.7)
6157        CALL DPWRST('XXX','WRIT')
6158        WRITE(ICOUT,107)B
6159  107   FORMAT('     UPPER LIMIT    = ',G15.7)
6160        CALL DPWRST('XXX','WRIT')
6161        WRITE(ICOUT,108)YMAX
6162  108   FORMAT('     DATA MAXIMUM   = ',G15.7)
6163        CALL DPWRST('XXX','WRIT')
6164        IERROR='YES'
6165        GOTO9000
6166      ENDIF
6167C
6168C     COMPUTE THE LOG-LIKELIHOOD BY BRUTE FORCE (I.E., SUM  OF LOG OF
6169C     PDF VALUES.
6170C
6171      DALPHA=DBLE(ALPHA)
6172      DBETA=DBLE(BETA)
6173      DA=DBLE(A)
6174      DB=DBLE(B)
6175      DN=DBLE(N)
6176C
6177      DLIK=0.0D0
6178      DO1010I=1,N
6179        CALL RGTPDF(DBLE(Y(I)),DALPHA,DBETA,DA,DB,DPDF)
6180        IF(DPDF.GE.0.0D0)DLIK=DLIK + DLOG(DPDF)
6181 1010 CONTINUE
6182C
6183      ALIK=REAL(DLIK)
6184      DNP=2.0D0
6185      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
6186      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
6187      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
6188      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
6189C
6190 9000 CONTINUE
6191      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')THEN
6192        WRITE(ICOUT,999)
6193        CALL DPWRST('XXX','WRIT')
6194        WRITE(ICOUT,9011)
6195 9011   FORMAT('**** AT THE END OF RGTLI1--')
6196        CALL DPWRST('XXX','WRIT')
6197        WRITE(ICOUT,9057)ALIK,AIC,AICC,BIC
6198 9057   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
6199        CALL DPWRST('XXX','WRIT')
6200      ENDIF
6201C
6202      RETURN
6203      END
6204      SUBROUTINE RGTML1(Y,XLOW,XHIGH,N,NUMV,MAXNXT,NTOT,
6205     1                  DTEMP1,TEMP1,TEMP2,TEMP3,TEMP4,
6206     1                  XMIN,XMAX,XMEAN,XSD,
6207     1                  ALPHSV,A,B,
6208     1                  ALPHML,BETAML,ALOWML,AUPPML,
6209     1                  ISUBRO,IBUGA3,IERROR)
6210C
6211C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD
6212C              ESTIMATES FOR THE REFLECTED GENERALIZED TOPP AND LEONE
6213C              DISTRIBUTION.
6214C
6215C              THE MAXIMUM LIKELIHOOD ESTIMATE OF BETA IS:
6216C
6217C                  BETAHAT = N/[SUM[i=1 to M]
6218C                  [n(i)*LOG(1/(ALPHA*Y(i) - (ALPHA - 1)Y(i)**2)]
6219C
6220C              WITH N(i) DENOTING THE SAMPLE SIZE OF GROUP i
6221C              AND Y(I) DENOTING 1 - XBAR(i) WHERE XBAR(i) IS
6222C              THE MEAN OF GROUP i.
6223C
6224C              ALPHA IS THE SOLUTION OF THE EQUATION
6225C
6226C              [N/[SUM[i=1 to M]
6227C              [n(i)*LOG(1/(ALPHA*Y(i) - (ALPHA - 1)Y(i)**2)]]*
6228C              SUM[i=1 to m][n(i)*(1 - y(i))/(ALPHA - (ALPHA - 1)*
6229C              Y(i)] +
6230C              SUM[i=1 to m][n(i)*(1 - 2*y(i))/(ALPHA -
6231C              2*(ALPHA - 1)*Y(i)]
6232C
6233C     EXAMPLE--REFLECTED GENERALIZED TOPP AND LEONE MAXIMUM LIKELIHOOD Y
6234C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
6235C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH
6236C                 BOUNDED SUPPORT AND APPLICATIONS", WORLD
6237C                 SCIENTIFIC PUBLISHING CO., PP. 211-213.
6238C     WRITTEN BY--ALAN HECKERT
6239C                 STATISTICAL ENGINEERING DIVISION
6240C                 INFORMATION TECHNOLOGY LABORATORY
6241C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6242C                 GAITHERSBURG, MD 20899-8980
6243C                 PHONE--301-975-2899
6244C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6245C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6246C     LANGUAGE--ANSI FORTRAN (1977)
6247C     VERSION NUMBER--2010/07
6248C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
6249C                                       SUBROUTINE (FROM DPMLRG)
6250C
6251      CHARACTER*4 ISUBRO
6252      CHARACTER*4 IBUGA3
6253      CHARACTER*4 IERROR
6254C
6255      CHARACTER*4 IWRITE
6256      CHARACTER*40 IDIST
6257C
6258      DIMENSION Y(*)
6259      DIMENSION XLOW(*)
6260      DIMENSION XHIGH(*)
6261      DIMENSION TEMP1(*)
6262      DIMENSION TEMP2(*)
6263      DIMENSION TEMP3(*)
6264      DIMENSION TEMP4(*)
6265      DOUBLE PRECISION DTEMP1(*)
6266C
6267      CHARACTER*4 ISUBN1
6268      CHARACTER*4 ISUBN2
6269      CHARACTER*4 ISTEPN
6270C
6271      INTEGER IFLAG
6272C
6273      DOUBLE PRECISION DSUM1
6274      DOUBLE PRECISION DTERM1
6275C
6276      DOUBLE PRECISION RGTFUN
6277      EXTERNAL RGTFUN
6278C
6279      COMMON/RGTCOM/NTOT2,NCLASS,MAXGRP
6280C
6281      DOUBLE PRECISION DA
6282      DOUBLE PRECISION DAE
6283      DOUBLE PRECISION DRE
6284      DOUBLE PRECISION DXSTRT
6285      DOUBLE PRECISION DXLOW
6286      DOUBLE PRECISION DXUP
6287C
6288      DOUBLE PRECISION DXI
6289      DOUBLE PRECISION DNI
6290      DOUBLE PRECISION DYI
6291C
6292C---------------------------------------------------------------------
6293C
6294      INCLUDE 'DPCOP2.INC'
6295C
6296C-----START POINT-----------------------------------------------------
6297C
6298      ISUBN1='RGTM'
6299      ISUBN2='L1  '
6300      IWRITE='OFF'
6301      IERROR='NO'
6302C
6303      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
6304        WRITE(ICOUT,999)
6305  999   FORMAT(1X)
6306        CALL DPWRST('XXX','WRIT')
6307        WRITE(ICOUT,51)
6308   51   FORMAT('**** AT THE BEGINNING OF RGTML1--')
6309        CALL DPWRST('XXX','WRIT')
6310        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,NUMV,MAXGRP
6311   52   FORMAT('IBUGA3,ISUBRO,N,NUMV,MAXGRP = ',A4,2X,A4,2X,3I8)
6312        CALL DPWRST('XXX','WRIT')
6313        DO56I=1,MIN(N,100)
6314          WRITE(ICOUT,57)I,Y(I)
6315   57     FORMAT('I,Y(I) = ',I8,G15.7)
6316          CALL DPWRST('XXX','WRIT')
6317   56   CONTINUE
6318      ENDIF
6319C
6320C               ******************************************
6321C               **  STEP 1--                            **
6322C               **  CARRY OUT CALCULATIONS              **
6323C               **  FOR REFLECTED GENERALIZED TOPP AND  **
6324C               **  LEONE MLE ESTIMATE                  **
6325C               ******************************************
6326C
6327      ISTEPN='1'
6328      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')
6329     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
6330C
6331      IDIST='REFLECTED GENERALIZED TOPP AND LEONE'
6332      MAXGRP=MAXNXT/2
6333      IF(NUMV.EQ.1)THEN
6334        IFLAG=0
6335        CALL SUMRAW(Y,N,IDIST,IFLAG,
6336     1              XMEAN,XVAR,XSD,XMIN,XMAX,
6337     1              ISUBRO,IBUGA3,IERROR)
6338        IF(IERROR.EQ.'YES')GOTO9000
6339        CALL SORT(Y,N,Y)
6340        DO180I=1,N
6341          DTEMP1(I)=DBLE(Y(I))
6342          DTEMP1(I+MAXGRP)=1.0D0
6343  180   CONTINUE
6344        NTOT2=N
6345        NCLASS=N
6346C
6347      ELSEIF(NUMV.EQ.2)THEN
6348        IFLAG1=1
6349        IFLAG2=0
6350        CALL SUMGRP(Y,XLOW,N,IDIST,IFLAG1,IFLAG2,
6351     1              TEMP1,TEMP2,TEMP3,MAXNXT,
6352     1              XMEAN,XVAR,XSD,XMIN,XMAX,NTOT,
6353     1              ISUBRO,IBUGA3,IERROR)
6354        IF(IERROR.EQ.'YES')GOTO9000
6355        CALL SORTC(XLOW,Y,N,TEMP1,TEMP2)
6356        DO220I=1,N
6357          XLOW(I)=TEMP1(I)
6358          Y(I)=TEMP2(I)
6359  220   CONTINUE
6360        DELTA=(XLOW(2) - XLOW(1))/2.0
6361C
6362        NCLASS=N
6363        NTOT2=NTOT
6364        DO230I=1,NCLASS
6365          DTEMP1(I)=DBLE(XLOW(I))
6366          DTEMP1(I+MAXGRP)=DBLE(Y(I))
6367  230   CONTINUE
6368C
6369      ELSEIF(NUMV.EQ.3)THEN
6370        IFLAG1=1
6371        IFLAG2=0
6372        CALL SUMGR2(Y,XLOW,XHIGH,N,IDIST,IFLAG1,IFLAG2,
6373     1              TEMP1,TEMP2,TEMP3,MAXNXT,
6374     1              XMEAN,XVAR,XSD,XMIN,XMAX,NTOT,
6375     1              ISUBRO,IBUGA3,IERROR)
6376        IF(IERROR.EQ.'YES')GOTO9000
6377        CALL SORTC(XLOW,Y,N,TEMP1,TEMP2)
6378        CALL SORTC(XLOW,XHIGH,N,TEMP3,TEMP4)
6379        DO320I=1,N
6380          XLOW(I)=TEMP1(I)
6381          XHIGH(I)=TEMP4(I)
6382          Y(I)=TEMP2(I)
6383  320   CONTINUE
6384C
6385        DO340I=1,N
6386          DTEMP1(I)=DBLE((XHIGH(I) + XLOW(I))/2.0)
6387          DTEMP1(I+MAXGRP)=DBLE(Y(I))
6388  340   CONTINUE
6389C
6390        NCLASS=N
6391      ELSE
6392        IERROR='YES'
6393        GOTO9000
6394      ENDIF
6395C
6396C     NOW PERFORM THE MAXIMUM LIKELIHOOD ESTIMATION
6397C
6398C     STEP 1: NEED TO SCALE IF NOT WITHIN (0,1) INTERVAL.
6399C
6400C             IF USER SPECIFIES LIMITS, THEN USE THOSE.  IF NOT,
6401C             USE DATA MINIMUM/MAXIMUM.
6402C
6403      IFIX=1
6404C
6405      IF(A.NE.CPUMIN .AND. B.NE.CPUMIN .AND.
6406     1   A.LE.XMIN .AND. B.GE.XMAX) THEN
6407        IFIX=0
6408        ZLOC=A
6409        ZUPPLM=B
6410        ZSCALE=ZUPPLM - ZLOC
6411        DO2110I=1,NCLASS
6412          DTEMP1(I)=(DTEMP1(I) - DBLE(A))/DBLE(ZSCALE)
6413 2110   CONTINUE
6414      ELSEIF(XMIN.LT.0.0 .OR. XMAX.GT.1.0)THEN
6415        EPS=(XMAX-XMIN)*0.001
6416        ZLOC=XMIN - EPS
6417        ZUPPLM=XMAX+EPS
6418        ZSCALE=ZUPPLM - ZLOC
6419        DO2120I=1,NCLASS
6420          DTEMP1(I)=(DTEMP1(I) - DBLE(ZLOC))/DBLE(ZSCALE)
6421 2120   CONTINUE
6422      ELSE
6423        ZLOC=0.0
6424        ZUPPLM=1.0
6425        ZSCALE=1.0
6426      ENDIF
6427C
6428C     STEP 2: FIND ML ESTIMATE FOR ALPHA
6429C
6430      NTOT2=NTOT
6431      DXSTRT=1.5D0
6432      IF(ALPHSV.GE.0.0 .AND. ALPHSV.LE.2.0)DXSTRT=DBLE(ALPHSV)
6433      DXLOW=0.0D0
6434      DXUP=2.0D0
6435      DAE=2.0*0.000001D0*DXSTRT
6436      DRE=DAE
6437      IFLAG=0
6438      ITBRAC=0
6439      CALL DFZER2(RGTFUN,DXLOW,DXUP,DXSTRT,DRE,DAE,IFLAG,DTEMP1)
6440      ALPHML=REAL(DXLOW)
6441C
6442C     STEP 3: FIND ML ESTIMATE FOR BETA
6443C
6444      DSUM1=0.0D0
6445      DA=DBLE(ALPHML)
6446      DO2210I=1,NCLASS
6447        DXI=DTEMP1(I)
6448        DNI=DTEMP1(I+MAXGRP)
6449        DYI=1.0D0 - DXI
6450        DTERM1=1.0D0/(DA*DYI - (DA-1.0D0)*DYI**2)
6451        DSUM1=DSUM1 + DNI*DLOG(DTERM1)
6452 2210 CONTINUE
6453      BETAML=DBLE(NTOT2)/DSUM1
6454C
6455      ALOWML=ZLOC
6456      AUPPML=ZUPPLM
6457C
6458 9000 CONTINUE
6459      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
6460        WRITE(ICOUT,999)
6461        CALL DPWRST('XXX','WRIT')
6462        WRITE(ICOUT,9011)
6463 9011   FORMAT('**** AT THE END OF RGTML1--')
6464        CALL DPWRST('XXX','WRIT')
6465        WRITE(ICOUT,9055)N,XMEAN,XSD,XMIN,XMAX
6466 9055   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
6467        CALL DPWRST('XXX','WRIT')
6468        WRITE(ICOUT,9057)ALPHML,BETAML,ALOWML,AUPPML
6469 9057   FORMAT('ALPHML,BETAML,ALOWML,AUPPML = ',4G15.7)
6470        CALL DPWRST('XXX','WRIT')
6471      ENDIF
6472C
6473      RETURN
6474      END
6475      SUBROUTINE RGTPDF(X,ALPHA,BETA,A,B,PDF)
6476C
6477C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
6478C              FUNCTION VALUE FOR THE
6479C              REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION.
6480C              THE PROBABILITY DENSITY FUNCTION IS:
6481C
6482C                  f(X;ALPHA,BETA,A,B) = (BETA/(B-A))*
6483C                     ((B-X)/(B-A))**(BETA-1)*
6484C                     {ALPHA - (ALPHA-1)*((B-X)/(B-A))}**(BETA-1)*
6485C                     {ALPHA - 2*(ALPHA-1)*((B-X)/(B-A))}
6486C                     A <= X <= B, BETA > 0, 0 < ALPHA <= 2
6487C
6488C              WITH ALPHA AND BETA DENOTING THE SHAPE PARAMETERS.
6489C
6490C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
6491C                                WHICH THE PROBABILITY DENSITY
6492C                                FUNCTION IS TO BE EVALUATED.
6493C                     --ALPHA  = THE DOUBLE PRECISION FIRST SHAPE
6494C                                PARAMETER
6495C                     --BETA   = THE DOUBLE PRECISION SECOND SHAPE
6496C                                PARAMETER
6497C     OUTPUT ARGUMENTS--PDF    = THE DOUBLE PRECISION PROBABILITY
6498C                                DENSITY FUNCTION VALUE.
6499C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
6500C             FUNCTION VALUE PDF.
6501C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
6502C     RESTRICTIONS--X SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
6503C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
6504C     FORTRAN LIBRARY SUBROUTINES NEEDED--DLOG, DEXP.
6505C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
6506C     LANGUAGE--ANSI FORTRAN.
6507C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
6508C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
6509C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
6510C                 PUBLISHING COMPANY, CHAPTER 7.
6511C     WRITTEN BY--JAMES J. FILLIBEN
6512C                 STATISTICAL ENGINEERING DIVISION
6513C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6514C                 GAITHERSBURG, MD 20899-8980
6515C                 PHONE:  301-975-2855
6516C     ORIGINAL VERSION--FEBRUARY  2007.
6517C
6518C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6519C
6520C---------------------------------------------------------------------
6521C
6522      DOUBLE PRECISION X
6523      DOUBLE PRECISION ALPHA
6524      DOUBLE PRECISION BETA
6525      DOUBLE PRECISION A
6526      DOUBLE PRECISION B
6527      DOUBLE PRECISION PDF
6528      DOUBLE PRECISION DTERM1
6529      DOUBLE PRECISION DTERM2
6530      DOUBLE PRECISION DTERM3
6531      DOUBLE PRECISION DX
6532      DOUBLE PRECISION DEPS
6533C
6534      INCLUDE 'DPCOP2.INC'
6535C
6536C---------------------------------------------------------------------
6537C
6538C     CHECK THE INPUT ARGUMENTS FOR ERRORS
6539C
6540      IF(B.LT.A)THEN
6541        TERM1=B
6542        B=A
6543        A=TERM1
6544      ENDIF
6545C
6546      IF(X.LT.A .OR. X.GT.B)THEN
6547        WRITE(ICOUT,2)
6548        CALL DPWRST('XXX','BUG ')
6549        WRITE(ICOUT,3)A,B
6550        CALL DPWRST('XXX','BUG ')
6551        WRITE(ICOUT,46)X
6552        CALL DPWRST('XXX','BUG ')
6553        PDF=0.0D0
6554        GOTO9000
6555      ELSEIF(ALPHA.LE.0.0D0 .OR. ALPHA.GT.2.0)THEN
6556        WRITE(ICOUT,12)
6557        CALL DPWRST('XXX','BUG ')
6558        WRITE(ICOUT,46)BETA
6559        CALL DPWRST('XXX','BUG ')
6560        PDF=0.0D0
6561        GOTO9000
6562      ELSEIF(BETA.LE.0.0D0)THEN
6563        WRITE(ICOUT,14)
6564        CALL DPWRST('XXX','BUG ')
6565        WRITE(ICOUT,46)BETA
6566        CALL DPWRST('XXX','BUG ')
6567        PDF=0.0D0
6568        GOTO9000
6569      ELSEIF(B.EQ.A)THEN
6570        WRITE(ICOUT,16)
6571        CALL DPWRST('XXX','BUG ')
6572        WRITE(ICOUT,48)A
6573        CALL DPWRST('XXX','BUG ')
6574        PDF=0.0D0
6575      ENDIF
6576    2 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO RGTPDF IS ',
6577     1       'OUTSIDE THE')
6578    3 FORMAT('      (',G15.7,',',G15.7,') INTERVAL.')
6579   12 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO RGTPDF IS ',
6580     1       'OUTSIDE THE [0,2) INTERVAL')
6581   14 FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO RGTPDF IS ',
6582     1       'IS NON-POSITIVE.')
6583   16 FORMAT('***** ERROR--THE LOWER AND UPPER LIMITS FOR RGTPDF ',
6584     1       'ARE EQUAL')
6585   22 FORMAT('***** ERROR--FOR RGTPDF, WHEN BETA < 1, X SHOULD NOT',
6586     1       ' EQUAL THE UPPER LIMIT')
6587   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
6588   48 FORMAT('***** THE VALUE OF THE LIMIT IS ',G15.7)
6589   49 FORMAT('***** THE VALUE OF X IS ',G15.7)
6590   50 FORMAT('***** THE VALUE OF THE UPPER LIMIT IS ',G15.7)
6591C
6592C-----START POINT-----------------------------------------------------
6593C
6594      DX=(B-X)/(B-A)
6595      DEPS=1.0D-7
6596C
6597      IF(X.LE.A)THEN
6598        PDF=BETA*(2.0D0 - ALPHA)/(B-A)
6599      ELSEIF(X.GE.B)THEN
6600        IF(ABS(BETA-1.0D0).LE.DEPS)THEN
6601          PDF=BETA*ALPHA/(B-A)
6602        ELSEIF(BETA-1.0D0.GT.DEPS)THEN
6603          PDF=0.0D0
6604        ELSE
6605          WRITE(ICOUT,22)
6606          CALL DPWRST('XXX','BUG ')
6607          WRITE(ICOUT,49)X
6608          CALL DPWRST('XXX','BUG ')
6609          WRITE(ICOUT,50)BETA
6610          CALL DPWRST('XXX','BUG ')
6611          PDF=0.0D0
6612          GOTO9000
6613        ENDIF
6614      ELSE
6615        DTERM1=DLOG(BETA) - DLOG(B-A)
6616        DTERM2=(BETA-1.0D0)*DLOG(DX)
6617        DTERM3=(BETA-1.0D0)*DLOG(ALPHA - (ALPHA-1.0D0)*DX)
6618        DTERM4=DLOG(ALPHA - 2.0D0*(ALPHA-1.0D0)*DX)
6619        PDF=DEXP(DTERM1 + DTERM2 + DTERM3 + DTERM4)
6620      ENDIF
6621C
6622 9000 CONTINUE
6623      RETURN
6624      END
6625      SUBROUTINE RGTPPF(P,ALPHA,BETA,PPF)
6626C
6627C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
6628C              FUNCTION VALUE FOR THE
6629C              REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION.
6630C              THE PERCENT POINT FUNCTION IS:
6631C
6632C              G(P;ALPHA,BETA,A,B) =
6633C                  1-{ALPHA-SQRT(ALPHA**2-4*(ALPHA-1)*(1-P)**(1/BETA)}/
6634C                  {2*(ALPHA-1)}            FOR 1 < ALPHA <= 2
6635C                   1 - (1-P)**(1/BETA)     FOR ALPHA = 1
6636C                  1-{ALPHA+SQRT(ALPHA**2-4*(ALPHA-1)*(1-P)**(1/BETA)}/
6637C                  {2*(ALPHA-1)}            FOR 0 < ALPHA <= 2
6638C                  A <= X <= B, BETA > 0, 0 < ALPHA <= 2
6639C
6640C              WITH ALPHA AND BETA DENOTING THE SHAPE PARAMETERS.
6641C
6642C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
6643C                                WHICH THE PERCENT POINT
6644C                                FUNCTION IS TO BE EVALUATED.
6645C                     --ALPHA  = THE DOUBLE PRECISION FIRST SHAPE
6646C                                PARAMETER
6647C                     --BETA   = THE DOUBLE PRECISION SECOND SHAPE
6648C                                PARAMETER
6649C     OUTPUT ARGUMENTS--PPF    = THE DOUBLE PRECISION PERCENT POINT
6650C                                FUNCTION VALUE.
6651C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT FUNCTION VALUE PPF.
6652C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
6653C     RESTRICTIONS--X SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
6654C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
6655C     FORTRAN LIBRARY SUBROUTINES NEEDED--DLOG, DEXP.
6656C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
6657C     LANGUAGE--ANSI FORTRAN.
6658C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
6659C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
6660C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
6661C                 PUBLISHING COMPANY, CHAPTER 7.
6662C     WRITTEN BY--JAMES J. FILLIBEN
6663C                 STATISTICAL ENGINEERING DIVISION
6664C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6665C                 GAITHERSBURG, MD 20899-8980
6666C                 PHONE:  301-975-2855
6667C     ORIGINAL VERSION--FEBRUARY  2007.
6668C
6669C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6670C
6671C---------------------------------------------------------------------
6672C
6673      DOUBLE PRECISION P
6674      DOUBLE PRECISION ALPHA
6675      DOUBLE PRECISION BETA
6676      DOUBLE PRECISION PPF
6677      DOUBLE PRECISION DTERM1
6678      DOUBLE PRECISION DTERM2
6679      DOUBLE PRECISION DEPS
6680C
6681      INCLUDE 'DPCOP2.INC'
6682C
6683C---------------------------------------------------------------------
6684C
6685C     CHECK THE INPUT ARGUMENTS FOR ERRORS
6686C
6687      IF(P.LT.0.0D0 .OR. P.GT.1.0D0)THEN
6688        WRITE(ICOUT,2)
6689        CALL DPWRST('XXX','BUG ')
6690        WRITE(ICOUT,46)P
6691        CALL DPWRST('XXX','BUG ')
6692        PPF=0.0D0
6693        GOTO9000
6694      ELSEIF(ALPHA.LE.0.0D0 .OR. ALPHA.GT.2.0)THEN
6695        WRITE(ICOUT,12)
6696        CALL DPWRST('XXX','BUG ')
6697        WRITE(ICOUT,46)BETA
6698        CALL DPWRST('XXX','BUG ')
6699        PPF=0.0D0
6700        GOTO9000
6701      ELSEIF(BETA.LE.0.0D0)THEN
6702        WRITE(ICOUT,14)
6703        CALL DPWRST('XXX','BUG ')
6704        WRITE(ICOUT,46)BETA
6705        CALL DPWRST('XXX','BUG ')
6706        PPF=0.0D0
6707        GOTO9000
6708      ENDIF
6709    2 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO RGTPPF IS ',
6710     1       'OUTSIDE THE (0,1) INTERVAL.')
6711   12 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO RGTPPF IS ',
6712     1       'OUTSIDE THE [0,2) INTERVAL')
6713   14 FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO RGTPPF IS ',
6714     1       'IS NON-POSITIVE.')
6715   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
6716C
6717C-----START POINT-----------------------------------------------------
6718C
6719      DEPS=1.0D-7
6720      IF(P.LE.0.0D0)THEN
6721        PPF=0.0D0
6722      ELSEIF(P.GE.1.0D0)THEN
6723        PPF=1.0D0
6724      ELSE
6725        IF(DABS(ALPHA-1.0D0).LE.DEPS)THEN
6726          PPF=1.0D0 - (1.0D0 - P)**(1.0D0/BETA)
6727        ELSEIF(DABS(ALPHA-1.0D0).GT.DEPS)THEN
6728          DTERM1=ALPHA - DSQRT(ALPHA**2 - 4.0D0*(ALPHA - 1.0D0)*
6729     1           (1.0D0 - P)**(1.0D0/BETA))
6730          DTERM2=2.0D0*(ALPHA - 1.0D0)
6731          PPF=1.0D0 - DTERM1/DTERM2
6732        ELSEIF(DABS(ALPHA-1.0D0).LT.DEPS)THEN
6733          DTERM1=ALPHA + DSQRT(ALPHA**2 - 4.0D0*(ALPHA - 1.0D0)*
6734     1           (1.0D0 - P)**(1.0D0/BETA))
6735          DTERM2=2.0D0*(ALPHA - 1.0D0)
6736          PPF=1.0D0 - DTERM1/DTERM2
6737        ENDIF
6738      ENDIF
6739C
6740 9000 CONTINUE
6741      RETURN
6742      END
6743      SUBROUTINE RGTRAN(N,ALPHA,BETA,ISEED,X)
6744C
6745C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
6746C              FROM THE REFLECTED GENERALIZED TOPP AND LEONE
6747C              DISTRIBUTION WITH SHAPE PARAMETERS ALPHA AND BETA.
6748C
6749C              THE PROBABILITY DENSITY FUNCTION IS:
6750C
6751C                  f(X;ALPHA,BETA,A,B) = (BETA/(B-A))*
6752C                     ((B-X)/(B-A))**(BETA-1)*
6753C                     {ALPHA - (ALPHA-1)*((B-X)/(B-A))}**(BETA-1)*
6754C                     {ALPHA - 2*(ALPHA-1)*((B-X)/(B-A))}
6755C                     A <= X <= B, BETA > 0, 0 < ALPHA <= 2
6756C
6757C              WITH ALPHA AND BETA DENOTING THE SHAPE PARAMETERS.
6758C
6759C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
6760C                                OF RANDOM NUMBERS TO BE
6761C                                GENERATED.
6762C                     --ALPHA  = THE DOUBLE PRECISION FIRST SHAPE
6763C                                PARAMETER
6764C                     --BETA   = THE DOUBLE PRECISION VALUE OF THE
6765C                                SHAPE PARAMETER BETA.
6766C                                BETA SHOULD BE IN THE RANGE (0,1).
6767C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
6768C                                (OF DIMENSION AT LEAST N)
6769C                                INTO WHICH THE GENERATED
6770C                                RANDOM SAMPLE WILL BE PLACED.
6771C     OUTPUT--A RANDOM SAMPLE OF SIZE N
6772C             FROM THE REFLECTED GENERALIZED TOPP AND LEONE
6773C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA AND BETA.
6774C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
6775C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
6776C                   OF N FOR THIS SUBROUTINE.
6777C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, RGTPPF.
6778C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
6779C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
6780C     LANGUAGE--ANSI FORTRAN (1977)
6781C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
6782C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
6783C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
6784C                 PUBLISHING COMPANY, CHAPTER 7.
6785C     WRITTEN BY--JAMES J. FILLIBEN
6786C                 STATISTICAL ENGINEERING DIVISION
6787C                 INFORMATION TECHMOLOGY LABORATORY
6788C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6789C                 GAITHERSBURG, MD 20899-8980
6790C                 PHONE--301-975-2855
6791C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6792C           OF THE NATIONAL BUREAU OF STANDARDS.
6793C     LANGUAGE--ANSI FORTRAN (1977)
6794C     VERSION NUMBER--2007.2
6795C     ORIGINAL VERSION--FEBRUARY  2007.
6796C
6797C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6798C
6799      DOUBLE PRECISION ALPHA
6800      DOUBLE PRECISION BETA
6801      DOUBLE PRECISION DTEMP
6802      DIMENSION X(*)
6803C
6804C-----COMMON----------------------------------------------------------
6805C
6806      INCLUDE 'DPCOP2.INC'
6807C
6808C-----START POINT-----------------------------------------------------
6809C
6810C     CHECK THE INPUT ARGUMENTS FOR ERRORS
6811C
6812      IF(N.LT.1)THEN
6813        WRITE(ICOUT,5)
6814        CALL DPWRST('XXX','BUG ')
6815        WRITE(ICOUT,6)
6816        CALL DPWRST('XXX','BUG ')
6817        WRITE(ICOUT,47)N
6818        CALL DPWRST('XXX','BUG ')
6819        GOTO9000
6820      ENDIF
6821    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
6822     1'REFLECTED GENERALIZED TOPP AND LEONE')
6823    6 FORMAT('      RANDOM NUMBERS IS NON-POSITIVE')
6824   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
6825C
6826      IF(BETA.LE.0.0D0)THEN
6827        WRITE(ICOUT,201)
6828        CALL DPWRST('XXX','BUG ')
6829        WRITE(ICOUT,203)BETA
6830        CALL DPWRST('XXX','BUG ')
6831        GOTO9000
6832      ENDIF
6833  201 FORMAT('***** ERROR--THE BETA SHAPE PARAMETER IS ',
6834     1       'NON-POSITIVE.')
6835  203 FORMAT('      THE VALUE OF BETA IS ',G15.7)
6836C
6837      IF(ALPHA.LE.0.0D0 .OR. ALPHA.GT.2.0D0)THEN
6838        WRITE(ICOUT,301)
6839        CALL DPWRST('XXX','BUG ')
6840        WRITE(ICOUT,303)ALPHA
6841        CALL DPWRST('XXX','BUG ')
6842        GOTO9000
6843      ENDIF
6844  301 FORMAT('***** ERROR--THE ALPHA SHAPE PARAMETER IS ',
6845     1       'OUTSIDE THE [0,2) INTERVAL.')
6846  303 FORMAT('      THE VALUE OF ALPHA IS ',G15.7)
6847C
6848C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
6849C
6850      CALL UNIRAN(N,ISEED,X)
6851C
6852C     GENERATE N REFLECTED GENERALIZED TOPP AND LEONE DISTRIBUTION
6853C     RANDOM NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION
6854C     METHOD.
6855C
6856      DO300I=1,N
6857        ZTEMP=X(I)
6858        CALL RGTPPF(DBLE(ZTEMP),ALPHA,BETA,DTEMP)
6859        X(I)=REAL(DTEMP)
6860  300 CONTINUE
6861C
6862 9000 CONTINUE
6863      RETURN
6864      END
6865      REAL FUNCTION RF (X, Y, Z, IER)
6866C***BEGIN PROLOGUE  RF
6867C***PURPOSE  Compute the incomplete or complete elliptic integral of the
6868C            1st kind.  For X, Y, and Z non-negative and at most one of
6869C            them zero, RF(X,Y,Z) = Integral from zero to infinity of
6870C                                -1/2     -1/2     -1/2
6871C                      (1/2)(t+X)    (t+Y)    (t+Z)    dt.
6872C            If X, Y or Z is zero, the integral is complete.
6873C***LIBRARY   SLATEC
6874C***CATEGORY  C14
6875C***TYPE      SINGLE PRECISION (RF-S, DRF-D)
6876C***KEYWORDS  COMPLETE ELLIPTIC INTEGRAL, DUPLICATION THEOREM,
6877C             INCOMPLETE ELLIPTIC INTEGRAL, INTEGRAL OF THE FIRST KIND,
6878C             TAYLOR SERIES
6879C***AUTHOR  Carlson, B. C.
6880C             Ames Laboratory-DOE
6881C             Iowa State University
6882C             Ames, IA  50011
6883C           Notis, E. M.
6884C             Ames Laboratory-DOE
6885C             Iowa State University
6886C             Ames, IA  50011
6887C           Pexton, R. L.
6888C             Lawrence Livermore National Laboratory
6889C             Livermore, CA  94550
6890C***DESCRIPTION
6891C
6892C   1.     RF
6893C          Evaluate an INCOMPLETE (or COMPLETE) ELLIPTIC INTEGRAL
6894C          of the first kind
6895C          Standard FORTRAN function routine
6896C          Single precision version
6897C          The routine calculates an approximation result to
6898C          RF(X,Y,Z) = Integral from zero to infinity of
6899C
6900C                               -1/2     -1/2     -1/2
6901C                     (1/2)(t+X)    (t+Y)    (t+Z)    dt,
6902C
6903C          where X, Y, and Z are nonnegative and at most one of them
6904C          is zero.  If one of them is zero, the integral is COMPLETE.
6905C          The duplication theorem is iterated until the variables are
6906C          nearly equal, and the function is then expanded in Taylor
6907C          series to fifth order.
6908C
6909C   2.     Calling Sequence
6910C          RF( X, Y, Z, IER )
6911C
6912C          Parameters on Entry
6913C          Values assigned by the calling routine
6914C
6915C          X      - Single precision, nonnegative variable
6916C
6917C          Y      - Single precision, nonnegative variable
6918C
6919C          Z      - Single precision, nonnegative variable
6920C
6921C
6922C
6923C          On Return     (values assigned by the RF routine)
6924C
6925C          RF     - Single precision approximation to the integral
6926C
6927C          IER    - Integer
6928C
6929C                   IER = 0 Normal and reliable termination of the
6930C                           routine.  It is assumed that the requested
6931C                           accuracy has been achieved.
6932C
6933C                   IER >  0 Abnormal termination of the routine
6934C
6935C          X, Y, Z are unaltered.
6936C
6937C
6938C   3.    Error Messages
6939C
6940C         Value of IER assigned by the RF routine
6941C
6942C                  Value assigned         Error Message Printed
6943C                  IER = 1                MIN(X,Y,Z) .LT. 0.0E0
6944C                      = 2                MIN(X+Y,X+Z,Y+Z) .LT. LOLIM
6945C                      = 3                MAX(X,Y,Z) .GT. UPLIM
6946C
6947C
6948C
6949C   4.     Control Parameters
6950C
6951C                  Values of LOLIM, UPLIM, and ERRTOL are set by the
6952C                  routine.
6953C
6954C          LOLIM and UPLIM determine the valid range of X, Y and Z
6955C
6956C          LOLIM  - Lower limit of valid arguments
6957C
6958C                   Not less than 5 * (machine minimum).
6959C
6960C          UPLIM  - Upper limit of valid arguments
6961C
6962C                   Not greater than (machine maximum) / 5.
6963C
6964C
6965C                     Acceptable Values For:   LOLIM      UPLIM
6966C                     IBM 360/370 SERIES   :   3.0E-78     1.0E+75
6967C                     CDC 6000/7000 SERIES :   1.0E-292    1.0E+321
6968C                     UNIVAC 1100 SERIES   :   1.0E-37     1.0E+37
6969C                     CRAY                 :   2.3E-2466   1.09E+2465
6970C                     VAX 11 SERIES        :   1.5E-38     3.0E+37
6971C
6972C
6973C
6974C          ERRTOL determines the accuracy of the answer
6975C
6976C                 The value assigned by the routine will result
6977C                 in solution precision within 1-2 decimals of
6978C                 "machine precision".
6979C
6980C
6981C
6982C          ERRTOL - Relative error due to truncation is less than
6983C                   ERRTOL ** 6 / (4 * (1-ERRTOL)  .
6984C
6985C
6986C
6987C              The accuracy of the computed approximation to the inte-
6988C              gral can be controlled by choosing the value of ERRTOL.
6989C              Truncation of a Taylor series after terms of fifth order
6990C              introduces an error less than the amount shown in the
6991C              second column of the following table for each value of
6992C              ERRTOL in the first column.  In addition to the trunca-
6993C              tion error there will be round-off error, but in prac-
6994C              tice the total error from both sources is usually less
6995C              than the amount given in the table.
6996C
6997C
6998C
6999C
7000C
7001C          Sample Choices:  ERRTOL   Relative Truncation
7002C                                    error less than
7003C                           1.0E-3    3.0E-19
7004C                           3.0E-3    2.0E-16
7005C                           1.0E-2    3.0E-13
7006C                           3.0E-2    2.0E-10
7007C                           1.0E-1    3.0E-7
7008C
7009C
7010C                    Decreasing ERRTOL by a factor of 10 yields six more
7011C                    decimal digits of accuracy at the expense of one or
7012C                    two more iterations of the duplication theorem.
7013C
7014C *Long Description:
7015C
7016C   RF Special Comments
7017C
7018C
7019C
7020C          Check by addition theorem: RF(X,X+Z,X+W) + RF(Y,Y+Z,Y+W)
7021C          = RF(0,Z,W), where X,Y,Z,W are positive and X * Y = Z * W.
7022C
7023C
7024C          On Input:
7025C
7026C          X, Y, and Z are the variables in the integral RF(X,Y,Z).
7027C
7028C
7029C          On Output:
7030C
7031C
7032C          X, Y, and Z are unaltered.
7033C
7034C
7035C
7036C          ********************************************************
7037C
7038C          Warning: Changes in the program may improve speed at the
7039C                   expense of robustness.
7040C
7041C
7042C
7043C   Special Functions via RF
7044C
7045C
7046C                  Legendre form of ELLIPTIC INTEGRAL of 1st kind
7047C                  ----------------------------------------------
7048C
7049C
7050C                                            2         2   2
7051C                  F(PHI,K) = SIN(PHI) RF(COS (PHI),1-K SIN (PHI),1)
7052C
7053C
7054C                                 2
7055C                  K(K) = RF(0,1-K ,1)
7056C
7057C                         PI/2     2   2      -1/2
7058C                       = INT  (1-K SIN (PHI) )   D PHI
7059C                          0
7060C
7061C
7062C
7063C
7064C
7065C                  Bulirsch form of ELLIPTIC INTEGRAL of 1st kind
7066C                  ----------------------------------------------
7067C
7068C
7069C                                         2 2    2
7070C                  EL1(X,KC) = X RF(1,1+KC X ,1+X )
7071C
7072C
7073C
7074C
7075C                  Lemniscate constant A
7076C                  ---------------------
7077C
7078C
7079C                       1      4 -1/2
7080C                  A = INT (1-S )    DS = RF(0,1,2) = RF(0,2,1)
7081C                       0
7082C
7083C
7084C    -------------------------------------------------------------------
7085C
7086C***REFERENCES  B. C. Carlson and E. M. Notis, Algorithms for incomplete
7087C                 elliptic integrals, ACM Transactions on Mathematical
7088C                 Software 7, 3 (September 1981), pp. 398-403.
7089C               B. C. Carlson, Computing elliptic integrals by
7090C                 duplication, Numerische Mathematik 33, (1979),
7091C                 pp. 1-16.
7092C               B. C. Carlson, Elliptic integrals of the first kind,
7093C                 SIAM Journal of Mathematical Analysis 8, (1977),
7094C                 pp. 231-242.
7095C***ROUTINES CALLED  R1MACH, XERMSG
7096C***REVISION HISTORY  (YYMMDD)
7097C   790801  DATE WRITTEN
7098C   890531  Changed all specific intrinsics to generic.  (WRB)
7099C   891009  Removed unreferenced statement labels.  (WRB)
7100C   891009  REVISION DATE from Version 3.2
7101C   891214  Prologue converted to Version 4.0 format.  (BAB)
7102C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
7103C   900326  Removed duplicate information from DESCRIPTION section.
7104C           (WRB)
7105C   900510  Changed calls to XERMSG to standard form, and some
7106C           editorial changes.  (RWC))
7107C   920501  Reformatted the REFERENCES section.  (WRB)
7108C***END PROLOGUE  RF
7109C
7110C-----COMMON----------------------------------------------------------
7111C
7112      INCLUDE 'DPCOMC.INC'
7113      INCLUDE 'DPCOP2.INC'
7114C
7115CCCCC CHARACTER*16 XERN3, XERN4, XERN5, XERN6
7116      INTEGER IER
7117      REAL LOLIM, UPLIM, EPSLON, ERRTOL
7118      REAL C1, C2, C3, E2, E3, LAMDA
7119      REAL MU, S, X, XN, XNDEV
7120      REAL XNROOT, Y, YN, YNDEV, YNROOT, Z, ZN, ZNDEV,
7121     * ZNROOT
7122      LOGICAL FIRST
7123      SAVE ERRTOL,LOLIM,UPLIM,C1,C2,C3,FIRST
7124      DATA FIRST /.TRUE./
7125C
7126C***FIRST EXECUTABLE STATEMENT  RF
7127C
7128      IF (FIRST) THEN
7129         ERRTOL = (4.0E0*R1MACH(3))**(1.0E0/6.0E0)
7130         LOLIM  = 5.0E0 * R1MACH(1)
7131         UPLIM  = R1MACH(2)/5.0E0
7132C
7133         C1 = 1.0E0/24.0E0
7134         C2 = 3.0E0/44.0E0
7135         C3 = 1.0E0/14.0E0
7136      ENDIF
7137      FIRST = .FALSE.
7138C
7139C         CALL ERROR HANDLER IF NECESSARY.
7140C
7141      RF = 0.0E0
7142      IF (MIN(X,Y,Z).LT.0.0E0) THEN
7143         IER = 1
7144CCCCC    WRITE (XERN3, '(1PE15.6)') X
7145CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7146CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7147         WRITE(ICOUT,1)
7148         CALL DPWRST('XXX','BUG ')
7149         WRITE(ICOUT,9)X
7150         CALL DPWRST('XXX','BUG ')
7151         WRITE(ICOUT,8)Y
7152         CALL DPWRST('XXX','BUG ')
7153         WRITE(ICOUT,7)Z
7154         CALL DPWRST('XXX','BUG ')
7155         RETURN
7156      ENDIF
7157    1 FORMAT('***** ERORR FROM RF, ONE OF THE THREE ARGUMENTS IS',
7158     *       ' NEGATIVE. ***')
7159    9 FORMAT('***** THE VALUE OF THE FIRST ARGUMENT IS ',E15.8,' ***')
7160    8 FORMAT('***** THE VALUE OF THE SECOND ARGUMENT IS ',E15.8,' ***')
7161    7 FORMAT('***** THE VALUE OF THE THIRD ARGUMENT IS ',E15.8,' ***')
7162C
7163      IF (MAX(X,Y,Z).GT.UPLIM) THEN
7164         IER = 3
7165CCCCC    WRITE (XERN3, '(1PE15.6)') X
7166CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7167CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7168CCCCC    WRITE (XERN6, '(1PE15.6)') UPLIM
7169         WRITE(ICOUT,2)
7170         CALL DPWRST('XXX','BUG ')
7171         WRITE(ICOUT,9)X
7172         CALL DPWRST('XXX','BUG ')
7173         WRITE(ICOUT,8)Y
7174         CALL DPWRST('XXX','BUG ')
7175         WRITE(ICOUT,7)Z
7176         CALL DPWRST('XXX','BUG ')
7177         WRITE(ICOUT,6)UPLIM
7178         CALL DPWRST('XXX','BUG ')
7179         RETURN
7180      ENDIF
7181    2 FORMAT('***** ERORR FROM RF, ONE OF THE THREE ARGUMENTS EXCEEDS',
7182     *       ' THE LARGEST ALLOWABLE VALUE')
7183    6 FORMAT('***** THE VALUE OF THE UPPER LIMIT IS ',E15.8,' *****')
7184C
7185      IF (MIN(X+Y,X+Z,Y+Z).LT.LOLIM) THEN
7186         IER = 2
7187CCCCC    WRITE (XERN3, '(1PE15.6)') X
7188CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7189CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7190CCCCC    WRITE (XERN6, '(1PE15.6)') LOLIM
7191         WRITE(ICOUT,3)
7192         CALL DPWRST('XXX','BUG ')
7193         WRITE(ICOUT,9)X
7194         CALL DPWRST('XXX','BUG ')
7195         WRITE(ICOUT,8)Y
7196         CALL DPWRST('XXX','BUG ')
7197         WRITE(ICOUT,7)Z
7198         CALL DPWRST('XXX','BUG ')
7199         WRITE(ICOUT,5)LOLIM
7200         CALL DPWRST('XXX','BUG ')
7201         RETURN
7202      ENDIF
7203    3 FORMAT('***** ERORR FROM RF, THE MINIMUM OF THE PAIRWISE SUMS ',
7204     *       'OF THE ARGUMENTS IS LESS THAN THE LOWER LIMIT.')
7205    5 FORMAT('***** THE VALUE OF THE LOWER LIMIT IS ',E15.8,' *****')
7206C
7207      IER = 0
7208      XN = X
7209      YN = Y
7210      ZN = Z
7211C
7212   30 MU = (XN+YN+ZN)/3.0E0
7213      XNDEV = 2.0E0 - (MU+XN)/MU
7214      YNDEV = 2.0E0 - (MU+YN)/MU
7215      ZNDEV = 2.0E0 - (MU+ZN)/MU
7216      EPSLON = MAX(ABS(XNDEV), ABS(YNDEV), ABS(ZNDEV))
7217      IF (EPSLON.LT.ERRTOL) GO TO 40
7218      XNROOT =  SQRT(XN)
7219      YNROOT =  SQRT(YN)
7220      ZNROOT =  SQRT(ZN)
7221      LAMDA = XNROOT*(YNROOT+ZNROOT) + YNROOT*ZNROOT
7222      XN = (XN+LAMDA)*0.250E0
7223      YN = (YN+LAMDA)*0.250E0
7224      ZN = (ZN+LAMDA)*0.250E0
7225      GO TO 30
7226C
7227   40 E2 = XNDEV*YNDEV - ZNDEV*ZNDEV
7228      E3 = XNDEV*YNDEV*ZNDEV
7229      S  = 1.0E0 + (C1*E2-0.10E0-C2*E3)*E2 + C3*E3
7230      RF = S/SQRT(MU)
7231C
7232      RETURN
7233      END
7234      REAL FUNCTION RJ (X, Y, Z, P, IER)
7235C***BEGIN PROLOGUE  RJ
7236C***PURPOSE  Compute the incomplete or complete (X or Y or Z is zero)
7237C            elliptic integral of the 3rd kind.  For X, Y, and Z non-
7238C            negative, at most one of them zero, and P positive,
7239C             RJ(X,Y,Z,P) = Integral from zero to infinity of
7240C                                  -1/2     -1/2     -1/2     -1
7241C                        (3/2)(t+X)    (t+Y)    (t+Z)    (t+P)  dt.
7242C***LIBRARY   SLATEC
7243C***CATEGORY  C14
7244C***TYPE      SINGLE PRECISION (RJ-S, DRJ-D)
7245C***KEYWORDS  COMPLETE ELLIPTIC INTEGRAL, DUPLICATION THEOREM,
7246C             INCOMPLETE ELLIPTIC INTEGRAL, INTEGRAL OF THE THIRD KIND,
7247C             TAYLOR SERIES
7248C***AUTHOR  Carlson, B. C.
7249C             Ames Laboratory-DOE
7250C             Iowa State University
7251C             Ames, IA  50011
7252C           Notis, E. M.
7253C             Ames Laboratory-DOE
7254C             Iowa State University
7255C             Ames, IA  50011
7256C           Pexton, R. L.
7257C             Lawrence Livermore National Laboratory
7258C             Livermore, CA  94550
7259C***DESCRIPTION
7260C
7261C   1.     RJ
7262C          Standard FORTRAN function routine
7263C          Single precision version
7264C          The routine calculates an approximation result to
7265C          RJ(X,Y,Z,P) = Integral from zero to infinity of
7266C
7267C                                -1/2     -1/2     -1/2     -1
7268C                      (3/2)(t+X)    (t+Y)    (t+Z)    (t+P)  dt,
7269C
7270C          where X, Y, and Z are nonnegative, at most one of them is
7271C          zero, and P is positive.  If X or Y or Z is zero, the
7272C          integral is COMPLETE.  The duplication theorem is iterated
7273C          until the variables are nearly equal, and the function is
7274C          then expanded in Taylor series to fifth order.
7275C
7276C
7277C   2.     Calling Sequence
7278C          RJ( X, Y, Z, P, IER )
7279C
7280C          Parameters On Entry
7281C          Values assigned by the calling routine
7282C
7283C          X      - Single precision, nonnegative variable
7284C
7285C          Y      - Single precision, nonnegative variable
7286C
7287C          Z      - Single precision, nonnegative variable
7288C
7289C          P      - Single precision, positive variable
7290C
7291C
7292C          On  Return     (values assigned by the RJ routine)
7293C
7294C          RJ     - Single precision approximation to the integral
7295C
7296C          IER    - Integer
7297C
7298C                   IER = 0 Normal and reliable termination of the
7299C                           routine.  It is assumed that the requested
7300C                           accuracy has been achieved.
7301C
7302C                   IER >  0 Abnormal termination of the routine
7303C
7304C
7305C          X, Y, Z, P are unaltered.
7306C
7307C
7308C   3.    Error Messages
7309C
7310C         Value of IER assigned by the RJ routine
7311C
7312C                  Value Assigned        Error Message Printed
7313C                  IER = 1               MIN(X,Y,Z) .LT. 0.0E0
7314C                      = 2               MIN(X+Y,X+Z,Y+Z,P) .LT. LOLIM
7315C                      = 3               MAX(X,Y,Z,P) .GT. UPLIM
7316C
7317C
7318C
7319C   4.     Control Parameters
7320C
7321C                  Values of LOLIM, UPLIM, and ERRTOL are set by the
7322C                  routine.
7323C
7324C
7325C          LOLIM and UPLIM determine the valid range of X Y, Z, and P
7326C
7327C          LOLIM is not less than the cube root of the value
7328C          of LOLIM used in the routine for RC.
7329C
7330C          UPLIM is not greater than 0.3 times the cube root of
7331C          the value of UPLIM used in the routine for RC.
7332C
7333C
7334C                     Acceptable Values For:   LOLIM      UPLIM
7335C                     IBM 360/370 SERIES   :   2.0E-26     3.0E+24
7336C                     CDC 6000/7000 SERIES :   5.0E-98     3.0E+106
7337C                     UNIVAC 1100 SERIES   :   5.0E-13     6.0E+11
7338C                     CRAY                 :   1.32E-822   1.4E+821
7339C                     VAX 11 SERIES        :   2.5E-13     9.0E+11
7340C
7341C
7342C
7343C          ERRTOL determines the accuracy of the answer
7344C
7345C                 The value assigned by the routine will result
7346C                 in solution precision within 1-2 decimals of
7347C                 "machine precision".
7348C
7349C
7350C
7351C
7352C          Relative error due to truncation of the series for RJ
7353C          is less than 3 * ERRTOL ** 6 / (1 - ERRTOL) ** 3/2.
7354C
7355C
7356C
7357C              The accuracy of the computed approximation to the inte-
7358C              gral can be controlled by choosing the value of ERRTOL.
7359C              Truncation of a Taylor series after terms of fifth order
7360C              Introduces an error less than the amount shown in the
7361C              second column of the following table for each value of
7362C              ERRTOL in the first column.  In addition to the trunca-
7363C              tion error there will be round-off error, but in prac-
7364C              tice the total error from both sources is usually less
7365C              than the amount given in the table.
7366C
7367C
7368C
7369C          Sample choices:  ERRTOL   Relative Truncation
7370C                                    error less than
7371C                           1.0E-3    4.0E-18
7372C                           3.0E-3    3.0E-15
7373C                           1.0E-2    4.0E-12
7374C                           3.0E-2    3.0E-9
7375C                           1.0E-1    4.0E-6
7376C
7377C                    Decreasing ERRTOL by a factor of 10 yields six more
7378C                    decimal digits of accuracy at the expense of one or
7379C                    two more iterations of the duplication theorem.
7380C
7381C *Long Description:
7382C
7383C   RJ Special Comments
7384C
7385C
7386C          Check by addition theorem: RJ(X,X+Z,X+W,X+P)
7387C          + RJ(Y,Y+Z,Y+W,Y+P) + (A-B) * RJ(A,B,B,A) + 3 / SQRT(A)
7388C          = RJ(0,Z,W,P), where X,Y,Z,W,P are positive and X * Y
7389C          = Z * W,  A = P * P * (X+Y+Z+W),  B = P * (P+X) * (P+Y),
7390C          and B - A = P * (P-Z) * (P-W).  The sum of the third and
7391C          fourth terms on the left side is 3 * RC(A,B).
7392C
7393C
7394C          On Input:
7395C
7396C          X, Y, Z, and P are the variables in the integral RJ(X,Y,Z,P).
7397C
7398C
7399C          On Output:
7400C
7401C
7402C          X, Y, Z, and P are unaltered.
7403C
7404C          ********************************************************
7405C
7406C          Warning: Changes in the program may improve speed at the
7407C                   expense of robustness.
7408C
7409C ------------------------------------------------------------
7410C
7411C
7412C   Special Functions via RJ and RF
7413C
7414C
7415C                  Legendre form of ELLIPTIC INTEGRAL of 3rd kind
7416C                  ----------------------------------------------
7417C
7418C
7419C                               PHI         2         -1
7420C                  P(PHI,K,N) = INT (1+N SIN (THETA) )   *
7421C                                0
7422C
7423C                                      2    2         -1/2
7424C                                 *(1-K  SIN (THETA) )     D THETA
7425C
7426C
7427C                                         2          2   2
7428C                       = SIN (PHI) RF(COS (PHI), 1-K SIN (PHI),1)
7429C
7430C                                  3            2         2   2
7431C                        -(N/3) SIN (PHI) RJ(COS (PHI),1-K SIN (PHI),
7432C
7433C                                 2
7434C                        1,1+N SIN (PHI))
7435C
7436C
7437C
7438C                  Bulirsch form of ELLIPTIC INTEGRAL of 3rd kind
7439C                  ----------------------------------------------
7440C
7441C
7442C                                           2 2    2
7443C                  EL3(X,KC,P) = X RF(1,1+KC X ,1+X ) +
7444C
7445C                                            3          2 2    2     2
7446C                               +(1/3)(1-P) X  RJ(1,1+KC X ,1+X ,1+PX )
7447C
7448C
7449C                                           2
7450C                  CEL(KC,P,A,B) = A RF(0,KC ,1) +
7451C
7452C                                                     2
7453C                                 +(1/3)(B-PA) RJ(0,KC ,1,P)
7454C
7455C
7456C
7457C
7458C                  Heuman's LAMBDA function
7459C                  ------------------------
7460C
7461C
7462C                                 2                     2      2    1/2
7463C                  L(A,B,P) = (COS(A)SIN(B)COS(B)/(1-COS (A)SIN (B))   )
7464C
7465C                                           2         2       2
7466C                            *(SIN(P) RF(COS (P),1-SIN (A) SIN (P),1)
7467C
7468C                                 2       3            2       2
7469C                            +(SIN (A) SIN (P)/(3(1-COS (A) SIN (B))))
7470C
7471C                                   2         2       2
7472C                            *RJ(COS (P),1-SIN (A) SIN (P),1,1-
7473C
7474C                                2       2          2       2
7475C                            -SIN (A) SIN (P)/(1-COS (A) SIN (B))))
7476C
7477C
7478C
7479C
7480C                  (PI/2) LAMBDA0(A,B) =L(A,B,PI/2) =
7481C
7482C
7483C                    2                         2       2    -1/2
7484C               = COS (A)  SIN(B) COS(B) (1-COS (A) SIN (B))
7485C
7486C                           2                  2       2
7487C                  *RF(0,COS (A),1) + (1/3) SIN (A) COS (A)
7488C
7489C                                       2       2    -3/2
7490C                  *SIN(B) COS(B) (1-COS (A) SIN (B))
7491C
7492C                           2         2       2          2       2
7493C                  *RJ(0,COS (A),1,COS (A) COS (B)/(1-COS (A) SIN (B)))
7494C
7495C
7496C
7497C                  Jacobi ZETA function
7498C                  --------------------
7499C
7500C
7501C                             2                     2   2    1/2
7502C                  Z(B,K) = (K/3) SIN(B) COS(B) (1-K SIN (B))
7503C
7504C
7505C                                      2      2   2                2
7506C                             *RJ(0,1-K ,1,1-K SIN (B)) / RF (0,1-K ,1)
7507C
7508C
7509C    -------------------------------------------------------------------
7510C
7511C***REFERENCES  B. C. Carlson and E. M. Notis, Algorithms for incomplete
7512C                 elliptic integrals, ACM Transactions on Mathematical
7513C                 Software 7, 3 (September 1981), pp. 398-403.
7514C               B. C. Carlson, Computing elliptic integrals by
7515C                 duplication, Numerische Mathematik 33, (1979),
7516C                 pp. 1-16.
7517C               B. C. Carlson, Elliptic integrals of the first kind,
7518C                 SIAM Journal of Mathematical Analysis 8, (1977),
7519C                 pp. 231-242.
7520C***ROUTINES CALLED  R1MACH, RC, XERMSG
7521C***REVISION HISTORY  (YYMMDD)
7522C   790801  DATE WRITTEN
7523C   890531  Changed all specific intrinsics to generic.  (WRB)
7524C   891009  Removed unreferenced statement labels.  (WRB)
7525C   891009  REVISION DATE from Version 3.2
7526C   891214  Prologue converted to Version 4.0 format.  (BAB)
7527C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
7528C   900326  Removed duplicate information from DESCRIPTION section.
7529C           (WRB)
7530C   900510  Changed calls to XERMSG to standard form, and some
7531C           editorial changes.  (RWC)).
7532C   920501  Reformatted the REFERENCES section.  (WRB)
7533C***END PROLOGUE  RJ
7534C
7535C-----COMMON----------------------------------------------------------
7536C
7537      INCLUDE 'DPCOMC.INC'
7538      INCLUDE 'DPCOP2.INC'
7539C
7540CCCCC CHARACTER*16 XERN3, XERN4, XERN5, XERN6, XERN7
7541      INTEGER IER
7542      REAL ALFA, BETA, C1, C2, C3, C4, EA, EB, EC, E2, E3
7543      REAL LOLIM, UPLIM, EPSLON, ERRTOL
7544      REAL LAMDA, MU, P, PN, PNDEV
7545      REAL POWER4, RC, SIGMA, S1, S2, S3, X, XN, XNDEV
7546      REAL XNROOT, Y, YN, YNDEV, YNROOT, Z, ZN, ZNDEV,
7547     * ZNROOT
7548      LOGICAL FIRST
7549      SAVE ERRTOL,LOLIM,UPLIM,C1,C2,C3,C4,FIRST
7550      DATA FIRST /.TRUE./
7551C
7552C***FIRST EXECUTABLE STATEMENT  RJ
7553      IF (FIRST) THEN
7554         ERRTOL = (R1MACH(3)/3.0E0)**(1.0E0/6.0E0)
7555         LOLIM  = (5.0E0 * R1MACH(1))**(1.0E0/3.0E0)
7556         UPLIM  = 0.30E0*( R1MACH(2) / 5.0E0)**(1.0E0/3.0E0)
7557C
7558         C1 = 3.0E0/14.0E0
7559         C2 = 1.0E0/3.0E0
7560         C3 = 3.0E0/22.0E0
7561         C4 = 3.0E0/26.0E0
7562      ENDIF
7563      FIRST = .FALSE.
7564C
7565C         CALL ERROR HANDLER IF NECESSARY.
7566C
7567      RJ = 0.0E0
7568      IF (MIN(X,Y,Z).LT.0.0E0) THEN
7569         IER = 1
7570CCCCC    WRITE (XERN3, '(1PE15.6)') X
7571CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7572CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7573         WRITE(ICOUT,1)
7574         CALL DPWRST('XXX','BUG ')
7575         WRITE(ICOUT,9)X
7576         CALL DPWRST('XXX','BUG ')
7577         WRITE(ICOUT,8)Y
7578         CALL DPWRST('XXX','BUG ')
7579         WRITE(ICOUT,7)Z
7580         CALL DPWRST('XXX','BUG ')
7581         RETURN
7582      ENDIF
7583    1 FORMAT('***** ERORR FROM RJ, ONE OF THE THREE ARGUMENTS IS',
7584     *       ' NEGATIVE. ***')
7585    9 FORMAT('***** THE VALUE OF THE FIRST ARGUMENT IS ',E15.8,' ***')
7586    8 FORMAT('***** THE VALUE OF THE SECOND ARGUMENT IS ',E15.8,' ***')
7587    7 FORMAT('***** THE VALUE OF THE THIRD ARGUMENT IS ',E15.8,' ***')
7588   11 FORMAT('***** THE VALUE OF THE FOURTH ARGUMENT IS ',E15.8,' ***')
7589C
7590      IF (MAX(X,Y,Z,P).GT.UPLIM) THEN
7591         IER = 3
7592CCCCC    WRITE (XERN3, '(1PE15.6)') X
7593CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7594CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7595CCCCC    WRITE (XERN6, '(1PE15.6)') P
7596CCCCC    WRITE (XERN7, '(1PE15.6)') UPLIM
7597         WRITE(ICOUT,2)
7598         CALL DPWRST('XXX','BUG ')
7599         WRITE(ICOUT,9)X
7600         CALL DPWRST('XXX','BUG ')
7601         WRITE(ICOUT,8)Y
7602         CALL DPWRST('XXX','BUG ')
7603         WRITE(ICOUT,7)Z
7604         CALL DPWRST('XXX','BUG ')
7605         WRITE(ICOUT,11)P
7606         CALL DPWRST('XXX','BUG ')
7607         WRITE(ICOUT,6)UPLIM
7608         CALL DPWRST('XXX','BUG ')
7609         RETURN
7610      ENDIF
7611    2 FORMAT('***** ERORR FROM RJ, ONE OF THE FOUR ARGUMENTS EXCEEDS',
7612     *       'THE LARGEST ALLOWABLE VALUE')
7613    6 FORMAT('***** THE VALUE OF THE UPPER LIMIT IS ',E15.8,' *****')
7614C
7615      IF (MIN(X+Y,X+Z,Y+Z,P).LT.LOLIM) THEN
7616         IER = 2
7617CCCCC    WRITE (XERN3, '(1PE15.6)') X
7618CCCCC    WRITE (XERN4, '(1PE15.6)') Y
7619CCCCC    WRITE (XERN5, '(1PE15.6)') Z
7620CCCCC    WRITE (XERN6, '(1PE15.6)') P
7621CCCCC    WRITE (XERN7, '(1PE15.6)') LOLIM
7622         WRITE(ICOUT,3)
7623         CALL DPWRST('XXX','BUG ')
7624         WRITE(ICOUT,4)
7625         CALL DPWRST('XXX','BUG ')
7626         WRITE(ICOUT,9)X
7627         CALL DPWRST('XXX','BUG ')
7628         WRITE(ICOUT,8)Y
7629         CALL DPWRST('XXX','BUG ')
7630         WRITE(ICOUT,7)Z
7631         CALL DPWRST('XXX','BUG ')
7632         WRITE(ICOUT,11)P
7633         CALL DPWRST('XXX','BUG ')
7634         WRITE(ICOUT,5)LOLIM
7635         CALL DPWRST('XXX','BUG ')
7636         RETURN
7637      ENDIF
7638    3 FORMAT('***** ERORR FROM RJ, THE MINIMUM OF THE PAIRWISE SUMS ',
7639     *       'OF THE FIRST THREE ARGUMENTS ')
7640    4 FORMAT('      OR THE FOURTH ARGUMENT IS LESS THAN THE LOWER ',
7641     *       'LIMIT.')
7642    5 FORMAT('***** THE VALUE OF THE LOWER LIMIT IS ',E15.8,' *****')
7643C
7644      IER = 0
7645      XN = X
7646      YN = Y
7647      ZN = Z
7648      PN = P
7649      SIGMA = 0.0E0
7650      POWER4 = 1.0E0
7651C
7652   30 MU = (XN+YN+ZN+PN+PN)*0.20E0
7653      XNDEV = (MU-XN)/MU
7654      YNDEV = (MU-YN)/MU
7655      ZNDEV = (MU-ZN)/MU
7656      PNDEV = (MU-PN)/MU
7657      EPSLON = MAX(ABS(XNDEV), ABS(YNDEV), ABS(ZNDEV), ABS(PNDEV))
7658      IF (EPSLON.LT.ERRTOL) GO TO 40
7659      XNROOT =  SQRT(XN)
7660      YNROOT =  SQRT(YN)
7661      ZNROOT =  SQRT(ZN)
7662      LAMDA = XNROOT*(YNROOT+ZNROOT) + YNROOT*ZNROOT
7663      ALFA = PN*(XNROOT+YNROOT+ZNROOT) + XNROOT*YNROOT*ZNROOT
7664      ALFA = ALFA*ALFA
7665      BETA = PN*(PN+LAMDA)*(PN+LAMDA)
7666      SIGMA = SIGMA + POWER4*RC(ALFA,BETA,IER)
7667      POWER4 = POWER4*0.250E0
7668      XN = (XN+LAMDA)*0.250E0
7669      YN = (YN+LAMDA)*0.250E0
7670      ZN = (ZN+LAMDA)*0.250E0
7671      PN = (PN+LAMDA)*0.250E0
7672      GO TO 30
7673C
7674   40 EA = XNDEV*(YNDEV+ZNDEV) + YNDEV*ZNDEV
7675      EB = XNDEV*YNDEV*ZNDEV
7676      EC = PNDEV*PNDEV
7677      E2 = EA - 3.0E0*EC
7678      E3 = EB + 2.0E0*PNDEV*(EA-EC)
7679      S1 = 1.0E0 + E2*(-C1+0.750E0*C3*E2-1.50E0*C4*E3)
7680      S2 = EB*(0.50E0*C2+PNDEV*(-C3-C3+PNDEV*C4))
7681      S3 = PNDEV*EA*(C2-PNDEV*C3) - C2*PNDEV*EC
7682      RJ = 3.0E0*SIGMA + POWER4*(S1+S2+S3)/(MU* SQRT(MU))
7683      RETURN
7684      END
7685      SUBROUTINE RDMNOR(AMU,SIG,LDSIG,N,LTF,ZM,IFLAG,ISEED)
7686C
7687C-----------------------------------------------------------------------
7688C   RDMNOR   WRITTEN BY CHARLES P. REEVE, STATISTICAL ENGINEERING
7689C            DIVISION, NATION INSTITUTE OF STANDARDS AND TECHNOLOGY, GAITHERSBURG,
7690C            MARYLAND  20899
7691C
7692C   FOR: COMPUTING A VECTOR OF PSEUDO-RANDOM MULTIVARIATE NORMAL
7693C        DEVIATES WITH MEAN AMU AND VARIANCE SIG.  BEFORE THE FIRST
7694C        CALL WITH A GIVEN SIG, THE LOGICAL VARIABLE LTF MUST BE
7695C        ASSIGNED THE VALUE .TRUE. SO THAT A CHOLESKY FACTORIZATION
7696C        OF SIG IS PERFORMED AS IN THE REFERENCE.  THE RESULT IS A
7697C        LOWER TRIANGULAR MATRIX L, STORED IN THE LOWER TRIANGLE OF
7698C        SIG, SUCH THAT SIG=LL'.  FURTHER CALL TO RDMNOR USE ONLY THE
7699C        LOWER TRIANGLE OF SIG (L) IN COMPUTING THE DEVIATES UNTIL THE
7700C        VALUE OF LTF IS RESET TO .TRUE., EVEN IS SIG IS REDEFINED.
7701C
7702C   NOTE: BEFORE THE FIRST CALL TO THIS ROUTINE THE CALL
7703C
7704C                           Z = RDNOR(ISEED)
7705C
7706C         FOR DATAPLOT, PASS SEED AS AGRUMENT
7707C
7708C         SHOULD BE MADE IN ORDER TO INITIALIZE THE NORMAL RANDOM
7709C         NUMBER GENERATOR WHERE ISEED IS A POSITIVE INTEGER.  THIS
7710C         ALLOWS THE USER TO ESTABLISH A REPEATABLE SEQUENCE OF
7711C         DEVIATES.
7712C
7713C   SUBPROGRAMS CALLED: RDNOR (PSEUDO-RANDOM NORMAL GENERATOR)
7714C
7715C                       FOR DATAPLOT, REPLACE WITH NORRAN
7716C
7717C   CURRENT VERSION COMPLETED MAY 15, 1987
7718C
7719C   REFERENCE: STEWART, G.W., 'INTRODUCTION TO MATRIX COMPUTATIONS',
7720C              ACADEMIC PRESS, ALGORITHM 3.9, P 142.
7721C-----------------------------------------------------------------------
7722C   DEFINITION OF PASSED PARAMETERS:
7723C
7724C     * AMU = MEAN VECTOR (LENGTH N) OF THE MULTIVARIATE NORMAL
7725C             DEVIATES ZM (REAL)
7726C
7727C     * SIG = COVARIANCE MATRIX (SIZE NXN) OF THE MULTIVARIATE NORMAL
7728C             DEVIATES ZM (REAL)
7729C
7730C   * LDSIG = THE LEADING DIMENSION OF MATRIX SIG (>=N) (INTEGER)
7731C
7732C       * N = THE LENGTH OF THE VECTOR OF DEVIATES ZM (INTEGER)
7733C
7734C     * LTF = AN INDICATOR VARIABLE FOR PERFORMING A CHOLESKY
7735C             FACTORIZATION OF A NEW COVARIANCE MATRIX SIG (LOGICAL)
7736C
7737C        ZM = A PSEUDO-RANDOM MULTIVARIATE NORMAL VECTOR (LENGTH N)
7738C             WITH MEAN AMU AND VARIANCE SIG (REAL)
7739C
7740C     IFLAG = AN ERROR INDICATOR ON OUTPUT (INTEGER)   INTERPRETATION:
7741C             0 -> NO ERRORS DETECTED
7742C             1 -> THE MATRIX SIG IS NOT POSITIVE SEMIDEFINITE, THUS
7743C                  CANNOT BE A COVARIANCE MATRIX - NO DEVIATE GENERATED
7744C
7745C     ISEED = AN INTEGER THAT SPECIFIES THE SEED FOR THE DATAPLOT
7746C             RANDOM NUMBER GENERATOR.
7747C
7748C   * INDICATES VARIABLES REQUIRING INPUT VALUES
7749C-----------------------------------------------------------------------
7750      DIMENSION AMU(*),SIG(LDSIG,*),ZM(*)
7751      LOGICAL LTF
7752C
7753C--- IF NEW MATRIX SIG, PERFORM CHOLESKY FACTORIZATION.  SET ERROR
7754C--- FLAG IF SIG IS NOT POSITIVE DEFINITE
7755C
7756      IF (LTF) THEN
7757         DO 40 K = 1, N
7758            DO 20 I = 1, K-1
7759               S = 0.0
7760               DO 10 J = 1, I-1
7761                  S = S+SIG(I,J)*SIG(K,J)
7762   10          CONTINUE
7763               SIG(K,I) = (SIG(K,I)-S)/SIG(I,I)
7764   20       CONTINUE
7765            S = 0.0
7766            DO 30 J = 1, K-1
7767               S = S+SIG(K,J)**2
7768   30       CONTINUE
7769            Q = SIG(K,K)-S
7770            IF (Q.LT.0.0) THEN
7771               IFLAG = 1
7772               RETURN
7773            ELSE
7774               IF(Q.GT.0.0)THEN
7775                 SIG(K,K) = SQRT(Q)
7776               ELSE
7777                 SIG(K,K)=0.0
7778               ENDIF
7779            ENDIF
7780   40    CONTINUE
7781         LTF = .FALSE.
7782      ENDIF
7783      IFLAG = 0
7784C
7785C--- COMPUTE N INDEPENDENT N(0,1) PSEUDO-RANDOM DEVIATES IN ZM
7786C
7787CCCCC DO 50 I = 1, N
7788CCCCC    ZM(I) = RDNOR(0)
7789CCC50 CONTINUE
7790      CALL NORRAN(N,ISEED,ZM)
7791C
7792C--- COMPUTE THE PSEUDO-RANDOM MULTIVARIATE NORMAL DEVIATES IN ZM
7793C
7794      DO 70 I = N, 1, -1
7795         S = 0.0
7796         DO 60 J = 1, I
7797            S = S+SIG(I,J)*ZM(J)
7798   60    CONTINUE
7799         ZM(I) = AMU(I)+S
7800   70 CONTINUE
7801      RETURN
7802      END
7803      FUNCTION RDT (DF,ISEED)
7804C
7805C-----------------------------------------------------------------------
7806C   RDT   WRITTEN BY CHARLES P. REEVE, STATISTICAL ENGINEERING
7807C         DIVISION, NATIONAL BUREAU OF STANDARDS, GAITHERSBURG,
7808C
7809C   FOR: GENERATING A RANDOM DEVIATE FROM THE T(DF) DISTRIBUTION.
7810C        ONE OF THREE METHODS IS USED DEPENDING ON THE VALUE OF THE
7811C        PARAMETER DF (WHICH DOES NOT HAVE TO BE AN INTEGER):
7812C
7813C             VALUE OF DF             METHOD USED
7814C            -------------         ------------------
7815C              0 < DF < 1          NORMAL/SQRT(CHI-SQUARED/DF)
7816C                DF = 1            TANGENT TRANSFORMATION (CST)
7817C                DF > 1            KINDERMAN-MONAHAN-RAMAGE (TIR)
7818C
7819C        IF DF <= 0 AN ERROR MESSAGE IS PRINTED AND EXECUTION IS
7820C        TERMINATED.
7821C
7822C        DESCRIPTIONS OF EACH OF THESE ALGORITHMS CAN BE FOUND IN
7823C        THE REFERENCE GIVEN BELOW.
7824C
7825C   SUBPROGRAMS CALLED:  RDUNI (STSPAC) - UNIFORM(0,1) GENERATOR
7826C                        RDNOR (STSPAC) - NORMAL(0,1) GENERATOR
7827C                       RDCHI2 (STSPAC) - CHI-SQUARED GENERATOR
7828C
7829C   CURRENT VERSION COMPLETED FEBRUARY 28, 1986
7830C
7831C   REFERENCE: KINDERMAN, A.J., MONAHAN, J.F., AND RAMAGE, J.G.,
7832C              "COMPUTER METHODS FOR SAMPLING FROM STUDENT'S T
7833C              DISTRIBUTION", MATHEMATICS OF COMPUTATION, VOLUME 31,
7834C              NUMBER 140, OCTOBER 1977, PP. 1009-1018
7835C
7836C   ADAPTED FOR DATAPLOT.  USE THIS ALGORITHM FOR THE CASE OF
7837C   NON-INTEGER DEGREES OF FREEDOM.  CHANGE TO USE DATAPLOT UNIFORM
7838C   RANDOM NUMBER GENERATOR.
7839C
7840      REAL XTEMP(1)
7841C
7842C-----------------------------------------------------------------------
7843C
7844      F(X,A) = (1.0+X*X/A)**(-(A+1.0)/2.0)
7845C
7846      RDT=0.0
7847      IF (DF.GT.1.0) THEN
7848C
7849C
7850C   KINDERMAN-MONAHAN-RAMAGE ALGORITHM (TIR)
7851C
7852C--- STEP 1
7853C
7854   10    CONTINUE
7855CCCCC    U = RDUNI(0)
7856         CALL UNIRAN(1,ISEED,XTEMP)
7857         U=XTEMP(1)
7858         IF (U.GE.0.23079283) GO TO 20
7859         RDT = 4.0*U-0.46158566
7860C
7861C--- STEP 2
7862C
7863CCCCC    V = RDUNI(0)
7864         CALL UNIRAN(1,ISEED,XTEMP)
7865         V=XTEMP(1)
7866         IF (V.LE.1.0-0.5*ABS(RDT)) RETURN
7867         IF (V.LE.F(RDT,DF)) RETURN
7868         GO TO 10
7869C
7870C--- STEP 3
7871C
7872   20    IF (U.GE.0.5) GO TO 40
7873         S = 4.0*U-1.46158566
7874         RDT = SIGN(ABS(S)+0.46158566,S)
7875CCCCC    V = RDUNI(0)
7876         CALL UNIRAN(1,ISEED,XTEMP)
7877         V=XTEMP(1)
7878C
7879C--- STEP 4
7880C
7881   30    IF (V.LE.1.0-0.5*ABS(RDT)) RETURN
7882         IF (V.GE.1.2130613/(1.0+RDT*RDT)) GO TO 10
7883         IF (V.LE.F(RDT,DF)) RETURN
7884         GO TO 10
7885C
7886C--- STEP 5
7887C
7888   40    IF (U.GE.0.75) GO TO 50
7889         S = 8.0*U-5.0
7890         RDT = 2.0/SIGN(ABS(S)+1.0,S)
7891CCCCC    V = RDUNI(0)/(RDT*RDT)
7892         CALL UNIRAN(1,ISEED,XTEMP)
7893         V=XTEMP(1)
7894         GO TO 30
7895C
7896C--- STEP 6
7897C
7898   50    RDT = 2.0/(8.0*U-7.0)
7899CCCCC    V = RDUNI(0)
7900         CALL UNIRAN(1,ISEED,XTEMP)
7901         V=XTEMP(1)
7902         IF (V.LT.RDT*RDT*F(RDT,DF)) RETURN
7903         GO TO 10
7904C
7905      ELSEIF (DF.EQ.1.0) THEN
7906C
7907C
7908C   SYNTHETIC TANGENT ALGORITHM (CST)
7909C
7910C--- STEP 1
7911C
7912   60    CONTINUE
7913CCCCC    U = RDUNI(0)
7914         CALL UNIRAN(1,ISEED,XTEMP)
7915         U=XTEMP(1)
7916CCCCC    V = 2.0*RDUNI(0)-1.0
7917         CALL UNIRAN(1,ISEED,XTEMP)
7918         V=2.0*XTEMP(1)-1.0
7919C
7920C--- STEP 2
7921C
7922         IF (U*U+V*V.GT.1.0) GO TO 60
7923         RDT = V/U
7924         RETURN
7925C
7926      ELSEIF (DF.GT.0.0) THEN
7927C
7928C
7929C   RATIO OF STANDARD NORMAL AND SQUARE ROOT OF
7930C   CHI-SQUARED DIVIDED BY ITS DEGREES OF FREEDOM
7931C
7932C
7933CCCCC    D = SQRT(RDCHI2(DF)/DF)
7934         CALL CHSRAN(1,DF,ISEED,XTEMP)
7935         D = SQRT(XTEMP(1)/DF)
7936CCCCC    RDT = RDNOR(0)/D
7937         CALL NORRAN(1,ISEED,XTEMP)
7938         RDT = XTEMP(1)/D
7939      ELSE
7940CCCCC    PRINT *,' *** DEGREES OF FREEDOM MUST BE > 0'
7941CCCCC    PRINT *,' *** EXECUTION STOPPED IN FUNCTION RDT'
7942CCCCC    STOP
7943C
7944      ENDIF
7945      RETURN
7946      END
7947      SUBROUTINE RECCDF(X,B,CDF)
7948C
7949C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
7950C              FUNCTION VALUE FOR THE RECIPROCAL
7951C              DISTRIBUTION WITH SINGLE PRECISION
7952C              TAIL LENGTH PARAMETER = B.
7953C              THE RECIPROCAL DISTRIBUTION USED
7954C              HEREIN IS DEFINED FOR 1/B <= x < 1.
7955C              AND HAS THE PROBABILITY DENSITY FUNCTION
7956C              F(X) = 1/(X*LOG(B))
7957C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
7958C                                AT WHICH THE PROBABILITY DENSITY
7959C                                FUNCTION IS TO BE EVALUATED.
7960C                                X SHOULD BE GREATER THAN
7961C                                OR EQUAL TO 1.
7962C                     --B      = THE SINGLE PRECISION VALUE
7963C                                OF THE TAIL LENGTH PARAMETER.
7964C                                B SHOULD BE > 1.
7965C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
7966C                                DISTRIBUTION FUNCTION VALUE.
7967C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
7968C             FUNCTION VALUE CDF FOR THE RECIPROCAL
7969C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = B.
7970C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
7971C     RESTRICTIONS--B SHOULD BE > 1.
7972C                 --X SHOULD BE POSITIVE AND LESS THAN 1.
7973C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7974C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
7975C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7976C     LANGUAGE--ANSI FORTRAN.
7977C     REFERENCES--R. W. HAMMING, NUMERICAL METHODS FOR SCIENTISTS
7978C                 AND ENGINEERS, 2ND. ED., 1973, PAGE 34.
7979C     WRITTEN BY--JAMES J. FILLIBEN
7980C                 STATISTICAL ENGINEERING LABORATORY
7981C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
7982C                 GAITHERSBURG, MD 20899-8980
7983C                 PHONE:  301-975-2855
7984C     ORIGINAL VERSION--MAY       1996.
7985C
7986C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7987C
7988      DOUBLE PRECISION DX
7989      DOUBLE PRECISION DB
7990      DOUBLE PRECISION DCDF
7991C
7992C-----COMMON----------------------------------------------------------
7993C
7994      INCLUDE 'DPCOP2.INC'
7995C
7996C-----START POINT-----------------------------------------------------
7997C
7998C     CHECK THE INPUT ARGUMENTS FOR ERRORS
7999C
8000      IF(B.LE.1.0)THEN
8001        WRITE(ICOUT,15)
8002        CALL DPWRST('XXX','BUG ')
8003        WRITE(ICOUT,46)B
8004        CALL DPWRST('XXX','BUG ')
8005        PDF=0.0
8006        GOTO9999
8007      ENDIF
8008   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
8009     1'TO RECPDF IS LESS THAN OR EQUAL TO 1')
8010   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
8011      IF(X.LT.(1./B))THEN
8012        CDF=0.0
8013        GOTO9999
8014      ENDIF
8015      IF(X.GE.1.0)THEN
8016        CDF=1.0
8017        GOTO9999
8018      ENDIF
8019C
8020C-----START POINT-----------------------------------------------------
8021C
8022      DX=DBLE(X)
8023      DB=DBLE(B)
8024      DCDF=(DLOG(DX)+DLOG(DB))/DLOG(DB)
8025      CDF=SNGL(DCDF)
8026C
8027 9999 CONTINUE
8028      RETURN
8029      END
8030      SUBROUTINE RECIPG(X,ODD,EVEN,RG)
8031C THIS ROUTINE IS A TRANSLATION INTO FORTRAN OF THE ALGOL PROCEDURE
8032C RECIPGAMMA GIVEN IN   N. M. TEMME, ON THE NUMERICAL EVALUATION OF THE
8033C MODIFIED BESSEL FUNCTION OF THE THIRD KIND, J. COMP. PHYSICS, VOLUME
8034C 19, PAGE 324 (1975).
8035      DIMENSION B(12)
8036C-----------------------------------------------------------------------
8037C
8038C  MACHINE DEPENDENT CONSTANTS.
8039C  ---------------------------
8040C
8041      DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9), B(10),
8042     *     B(11), B(12)
8043     *      /-.28387 65422 7602,-.07685 28408 44786,.00170 63050 71096,
8044     1 .00127 19271 36655,.00007 63095 97586,-.4971736704E-5,-.865920800
8045     2 E-6,-.33126120E-7,.1745136E-8,.242310E-9,.9161E-11,-.170E-12/
8046C
8047C-----------------------------------------------------------------------
8048      X2=8.*X*X
8049      ALFA=-1.E-15
8050      BETA=0.
8051      DO 1 N=1,11,2
8052        BETA=-(BETA+2.*ALFA)
8053        ITEMP = 13 - N
8054        ALFA = - X2 * BETA - ALFA + B(ITEMP)
8055    1 CONTINUE
8056      EVEN=(ALFA+.5*BETA)*X2-ALFA+.92187 02936 5045
8057      ALFA=-.34E-13
8058      BETA=0.
8059      DO 2 N=2,12,2
8060        BETA=-(BETA+2.*ALFA)
8061        ITEMP = 13 - N
8062        ALFA = - X2 * BETA - ALFA + B(ITEMP)
8063    2 CONTINUE
8064      ODD=2.*(ALFA+BETA)
8065      RG=ODD*X+EVEN
8066      RETURN
8067      END
8068      SUBROUTINE RECPDF(X,B,PDF)
8069C
8070C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
8071C              FUNCTION VALUE FOR THE RECIPROCAL
8072C              DISTRIBUTION WITH SINGLE PRECISION
8073C              TAIL LENGTH PARAMETER = B.
8074C              THE RECIPROCAL DISTRIBUTION USED
8075C              HEREIN IS DEFINED FOR 1/B <= x < 1.
8076C              AND HAS THE PROBABILITY DENSITY FUNCTION
8077C              F(X) = 1/(X*LOG(B))
8078C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
8079C                                AT WHICH THE PROBABILITY DENSITY
8080C                                FUNCTION IS TO BE EVALUATED.
8081C                                X SHOULD BE GREATER THAN
8082C                                OR EQUAL TO 1.
8083C                     --B      = THE SINGLE PRECISION VALUE
8084C                                OF THE TAIL LENGTH PARAMETER.
8085C                                B SHOULD BE > 1.
8086C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
8087C                                DENSITY FUNCTION VALUE.
8088C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
8089C             FUNCTION VALUE PDF FOR THE RECIPROCAL
8090C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = B.
8091C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
8092C     RESTRICTIONS--B SHOULD BE POSITIVE.
8093C                 --X SHOULD BE POSITIVE AND LESS THAN 1.
8094C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
8095C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
8096C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
8097C     LANGUAGE--ANSI FORTRAN.
8098C     REFERENCES--R. W. HAMMING, NUMERICAL METHODS FOR SCIENTISTS
8099C                 AND ENGINEERS, 2ND. ED., 1973, PAGE 34.
8100C     WRITTEN BY--JAMES J. FILLIBEN
8101C                 STATISTICAL ENGINEERING LABORATORY
8102C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
8103C                 GAITHERSBURG, MD 20899-8980
8104C                 PHONE:  301-975-2855
8105C     ORIGINAL VERSION--MAY       1996.
8106C
8107C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8108C
8109      DOUBLE PRECISION DX
8110      DOUBLE PRECISION DB
8111      DOUBLE PRECISION DPDF
8112C
8113C-----COMMON----------------------------------------------------------
8114C
8115      INCLUDE 'DPCOP2.INC'
8116C
8117C-----START POINT-----------------------------------------------------
8118C
8119C     CHECK THE INPUT ARGUMENTS FOR ERRORS
8120C
8121      IF(B.LE.1.0)THEN
8122        WRITE(ICOUT,15)
8123        CALL DPWRST('XXX','BUG ')
8124        WRITE(ICOUT,46)B
8125        CALL DPWRST('XXX','BUG ')
8126        PDF=0.0
8127        GOTO9999
8128      ENDIF
8129   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
8130     1'TO RECPDF IS LESS THAN OR EQUAL TO 1')
8131      IF(X.LT.(1./B).OR.X.GE.1.0)THEN
8132        WRITE(ICOUT,4)
8133        CALL DPWRST('XXX','BUG ')
8134        WRITE(ICOUT,46)X
8135        CALL DPWRST('XXX','BUG ')
8136        PDF=0.0
8137        GOTO9999
8138      ENDIF
8139    4 FORMAT('***** FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT ',
8140     1'TO RECPDF IS OUTSIDE THE (1/B,1) INTERVAL')
8141   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
8142C
8143C-----START POINT-----------------------------------------------------
8144C
8145      DX=DBLE(X)
8146      DB=DBLE(B)
8147      DPDF=1.0D0/(DX*DLOG(DB))
8148      PDF=SNGL(DPDF)
8149C
8150 9999 CONTINUE
8151      RETURN
8152      END
8153      SUBROUTINE RECPPF(P,B,PPF)
8154C
8155C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
8156C              FUNCTION VALUE FOR THE RECIPROCAL
8157C              DISTRIBUTION WITH SINGLE PRECISION
8158C              TAIL LENGTH PARAMETER = B.
8159C              THE RECIPROCAL DISTRIBUTION USED
8160C              HEREIN IS DEFINED FOR 1/B <= X < 1.
8161C              AND HAS THE PROBABILITY DENSITY FUNCTION
8162C              F(X) = 1/(X*LOG(B))
8163C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
8164C                                SPECIFYING THE PROBABILITY VALUE.
8165C                                P SHOULD BE GREATER THAN OR EQUAL TO 0
8166C                                AND LESS THAN OR EQUAL TO 1.
8167C                     --B      = THE SINGLE PRECISION VALUE
8168C                                OF THE TAIL LENGTH PARAMETER.
8169C                                B SHOULD BE > 1.
8170C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT
8171C                                POINT FUNCTION VALUE.
8172C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
8173C             FUNCTION VALUE PPF FOR THE RECIPROCAL
8174C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = B.
8175C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
8176C     RESTRICTIONS--B SHOULD BE > 1.
8177C                 --P SHOULD BE >= 0 AND <= 1
8178C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
8179C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
8180C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
8181C     LANGUAGE--ANSI FORTRAN.
8182C     REFERENCES--R. W. HAMMING, NUMERICAL METHODS FOR SCIENTISTS
8183C                 AND ENGINEERS, 2ND. ED., 1973, PAGE 34.
8184C     WRITTEN BY--JAMES J. FILLIBEN
8185C                 STATISTICAL ENGINEERING LABORATORY
8186C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
8187C                 GAITHERSBURG, MD 20899-8980
8188C                 PHONE:  301-975-2855
8189C     ORIGINAL VERSION--MAY       1996.
8190C
8191C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8192C
8193      DOUBLE PRECISION DP
8194      DOUBLE PRECISION DB
8195      DOUBLE PRECISION DPPF
8196C
8197C-----COMMON----------------------------------------------------------
8198C
8199      INCLUDE 'DPCOP2.INC'
8200C
8201C---------------------------------------------------------------------
8202C
8203C     CHECK THE INPUT ARGUMENTS FOR ERRORS
8204C
8205      IF(P.LT.0.0.OR.P.GT.1.0)THEN
8206        WRITE(ICOUT,4)
8207        CALL DPWRST('XXX','BUG ')
8208        WRITE(ICOUT,46)P
8209        CALL DPWRST('XXX','BUG ')
8210        PDF=0.0
8211        GOTO9999
8212      ENDIF
8213    4 FORMAT('***** FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT ',
8214     1'TO RECPPF IS OUTSIDE THE (0,1) INTERVAL')
8215      IF(B.LE.1.0)THEN
8216        WRITE(ICOUT,15)
8217        CALL DPWRST('XXX','BUG ')
8218        WRITE(ICOUT,46)B
8219        CALL DPWRST('XXX','BUG ')
8220        PDF=0.0
8221        GOTO9999
8222      ENDIF
8223   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
8224     1'TO RECPDF IS LESS THAN OR EQUAL TO 0')
8225   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
8226      IF(P.EQ.0.0)THEN
8227        PPF=1.0/B
8228        GOTO9999
8229      ENDIF
8230      IF(P.EQ.1.0)THEN
8231        PPF=1.0
8232        GOTO9999
8233      ENDIF
8234C
8235C-----START POINT-----------------------------------------------------
8236C
8237      DP=DBLE(P)
8238      DB=DBLE(B)
8239      DPPF=DEXP(DLOG(DB)*(DP-1.0D0))
8240      PPF=SNGL(DPPF)
8241C
8242 9999 CONTINUE
8243      RETURN
8244      END
8245      SUBROUTINE RECRAN(N,B,ISEED,X)
8246C
8247C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
8248C              FROM THE RECIROCAL DISTRIBUTION
8249C              WITH SHAPE PARAMETER VALUE = B.
8250C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
8251C                                OF RANDOM NUMBERS TO BE
8252C                                GENERATED.
8253C                     --B  = THE SINGLE PRECISION VALUE OF THE
8254C                                SHAPE PARAMETER.
8255C                                B SHOULD BE POSITIVE.
8256C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
8257C                                (OF DIMENSION AT LEAST N)
8258C                                INTO WHICH THE GENERATED
8259C                                RANDOM SAMPLE WILL BE PLACED.
8260C     OUTPUT--A RANDOM SAMPLE OF SIZE N
8261C             FROM THE RECIROCAL DISTRIBUTION
8262C             WITH SHAPE PARAMETER VALUE = B.
8263C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
8264C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
8265C                   OF N FOR THIS SUBROUTINE.
8266C                 --B SHOULD BE POSITIVE.
8267C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
8268C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
8269C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
8270C     LANGUAGE--ANSI FORTRAN (1977)
8271C     REFERENCES--XX
8272C     WRITTEN BY--JAMES J. FILLIBEN
8273C                 STATISTICAL ENGINEERING DIVISION
8274C                 INFORMATION TECHNOLOGY LABORATORY
8275C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
8276C                 GAITHERSBURG, MD 20899-8980
8277C                 PHONE--301-975-2855
8278C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
8279C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
8280C     LANGUAGE--ANSI FORTRAN (1977)
8281C     VERSION NUMBER--2001.10
8282C     ORIGINAL VERSION--OCTOBER   2001.
8283C
8284C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8285C
8286      DIMENSION X(*)
8287C
8288C-----COMMON----------------------------------------------------------
8289C
8290      INCLUDE 'DPCOP2.INC'
8291C
8292C-----START POINT-----------------------------------------------------
8293C
8294C     CHECK THE INPUT ARGUMENTS FOR ERRORS
8295C
8296      IF(N.LT.1)THEN
8297        WRITE(ICOUT, 5)
8298        CALL DPWRST('XXX','BUG ')
8299        WRITE(ICOUT,47)N
8300        CALL DPWRST('XXX','BUG ')
8301        GOTO9000
8302      ENDIF
8303      IF(B.LE.1.0)THEN
8304        WRITE(ICOUT,15)
8305        CALL DPWRST('XXX','BUG ')
8306        WRITE(ICOUT,46)B
8307        CALL DPWRST('XXX','BUG ')
8308        GOTO9000
8309      ENDIF
8310    5 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO THE ',
8311     1'RECRAN SUBROUTINE IS NON-POSITIVE *****')
8312   15 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO THE ',
8313     1'RECRAN SUBROUTINE IS <= 1 *****')
8314   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
8315   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
8316C
8317C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
8318C
8319      CALL UNIRAN(N,ISEED,X)
8320C
8321C     GENERATE N RECIROCAL DISTRIBUTION RANDOM NUMBERS
8322C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
8323C
8324      DO100I=1,N
8325        CALL RECPPF(X(I),B,XTEMP)
8326        X(I)=XTEMP
8327  100 CONTINUE
8328C
8329 9000 CONTINUE
8330      RETURN
8331      END
8332      SUBROUTINE REGDAT (NPAR, NTOT, NBCH, NPTS, XPTS, Y, COEF,
8333CCCCC CALL LIST CHANGED TO REFLECT SWAPPING TO USE LESS MEMORY.
8334CCCCC$                  U1, S1, V1, U2, TLM0, TLM1, ETA0, ETA1,
8335     $                  SCRTCH, S1, V1, TLM0, TLM1, ETA0, ETA1,
8336     $                  WK1, XM, T, X, NLVL,
8337     $                  ICASRE, IFLAG, ISUBRO, IBUGA2, IERROR)
8338C
8339C         SUBROUTINE REGDAT PERFORMS ALL OF THE REGRESSION TOLERANCE LIMIT
8340C     CALCULATIONS WHICH INVOLVE THE RESPONSE (Y) DATA.  REGINI MUST BE
8341C     CALLED BEFORE REGDAT, BUT IF MULTIPLE SETS OF Y DATA ARE TO BE
8342C     ANALYZED (E.G., IN A SIMULATION), THEN REGINI NEED ONLY BE CALLED
8343C     ONCE.
8344C
8345      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
8346      INCLUDE 'DPCOPA.INC'
8347C
8348      LOGICAL CONFND
8349      CHARACTER*4 ICASRE
8350C
8351      CHARACTER*4 ISUBRO
8352      CHARACTER*4 IERROR
8353      CHARACTER*4 IBUGA2
8354      CHARACTER*4 IBUGA3
8355      CHARACTER*4 IOP
8356      CHARACTER*4 IFLAG
8357CCCCC CHARACTER*80 IFILE
8358      CHARACTER (LEN=MAXFNC) :: IFILE
8359C
8360CCCCC DIMENSION U1(*),   S1(*),   V1(*),   U2(*),   Y(*),    COEF(*),
8361      DIMENSION SCRTCH(*),   S1(*),   V1(*),   Y(*),    COEF(*),
8362     $          XPTS(*), ETA0(*), ETA1(*), TLM0(*), TLM1(*), XM(*),
8363     $          T(*),    WK1(*), X(*)
8364C
8365      COMMON /RECIPA/ IRANK1, IRANK2, TR1, TR2, GNU0, GNU1, CONFND
8366      COMMON /RECIPB/ NUMXX, NUMU1, NUMU2, NUMH
8367      COMMON /RECSIM/ RSSA
8368C
8369      INCLUDE 'DPCOP2.INC'
8370C
8371      DATA ZERO /0.D0/
8372      DATA ONE/1.D0/
8373C
8374      IF(IBUGA2.EQ.'ON')THEN
8375        WRITE(ICOUT,12)NPAR,NTOT,NBCH,NPTS
8376   12   FORMAT('NPAR,NTOT,NBCH,NPTS = ',4I8)
8377        CALL DPWRST('XXX','BUG ')
8378      ENDIF
8379C
8380      IBUGA3='OFF'
8381C   -- OLS COEFFICIENTS
8382      IERROR='NO'
8383      CALL DSET (NTOT*NPAR, WK1, ZERO)
8384C
8385C   -- FOR DATAPLOT, READ U1 ARRAY BACK IN
8386      IOP='READ'
8387      IFILE='DPRE2F.DAT'
8388      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMU1,IBUGA3,ISUBRO,IERROR)
8389      IF(IERROR.EQ.'YES')RETURN
8390C
8391      DO 60 I=1, IRANK1
8392         CALL DGER (NPAR, NTOT, ONE/S1(I), V1((I-1)*NPAR+1), 1,
8393CCCCC$              U1((I-1)*NTOT+1), 1, WK1, NPAR, IERROR)
8394     $              SCRTCH((I-1)*NTOT+1), 1, WK1, NPAR, IERROR)
8395         IF(IERROR.EQ.'YES')RETURN
8396 60   CONTINUE
8397      CALL DGEMV ('N', NPAR, NTOT, ONE, WK1, NPAR,
8398     $             Y, 1, ZERO, COEF, 1, IERROR)
8399      IF(IERROR.EQ.'YES')RETURN
8400C
8401C    -- CALCULATE RESIDUAL SUMS OF SQUARES FOR BOTH MODELS
8402      SY = DDOT (NTOT, Y, 1, Y, 1)
8403CCCCC CALL DGEMV ('T', NTOT, IRANK1, ONE, U1, NTOT, Y, 1, ZERO, WK1, 1,
8404      CALL DGEMV ('T', NTOT, IRANK1, ONE, SCRTCH, NTOT, Y, 1, ZERO,
8405     1 WK1, 1, IERROR)
8406      IF(IERROR.EQ.'YES')RETURN
8407      RSSA = SY -DDOT (IRANK1, WK1, 1, WK1, 1)
8408C   -- FOR DATAPLOT, READ U2 ARRAY BACK IN
8409      IOP='READ'
8410      IFILE='DPRE3F.DAT'
8411      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMU2,IBUGA3,ISUBRO,IERROR)
8412      IF(IERROR.EQ.'YES')RETURN
8413C
8414CCCCC CALL DGEMV ('T', NTOT, IRANK2, ONE, U2, NTOT, Y, 1, ZERO, WK1, 1,
8415      CALL DGEMV ('T', NTOT, IRANK2, ONE, SCRTCH, NTOT, Y, 1, ZERO,
8416     1  WK1, 1, IERROR)
8417      IF(IERROR.EQ.'YES')RETURN
8418      RSSB = SY - DDOT (IRANK2, WK1, 1, WK1, 1)
8419C
8420C    -- VARIANCE COMPONENT ESTIMATES
8421      RMSA = RSSA /(NTOT -IRANK1)
8422      RMSB = RSSB /(NTOT -IRANK2)
8423      TMSA = RMSA
8424      IF (RMSA .LT. RMSB) TMSA = RMSB
8425      IF (CONFND) THEN
8426          S2B = ZERO
8427      ELSE
8428          S2B  = GNU0 /TR1 *(RMSA -RMSB)
8429      END IF
8430      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GDAT')THEN
8431        WRITE(ICOUT,2001)TR1
8432        CALL DPWRST('XXX','BUG ')
8433        WRITE(ICOUT,2002)TR2
8434        CALL DPWRST('XXX','BUG ')
8435        WRITE(ICOUT,2003)S2B
8436        CALL DPWRST('XXX','BUG ')
8437      END IF
8438 2001 FORMAT('TR1 = ',E15.7)
8439 2002 FORMAT('TR2 = ',E15.7)
8440 2003 FORMAT('S2B = ',E15.7)
8441      IF (S2B .LT. ZERO) S2B = ZERO
8442      S2W  = RMSB
8443      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GDAT')THEN
8444        WRITE(ICOUT,2004)S2W,NPTS
8445        CALL DPWRST('XXX','BUG ')
8446      END IF
8447 2004 FORMAT('S2W, NPTS = ',E15.7,I8)
8448      S    = SQRT(S2B +S2W)
8449C
8450C     -- TOLERANCE LIMIT FACTORS AND TOLERANCE LIMITS
8451      DO 10 I=1, NPTS
8452         SMEAN = SQRT(S2B/ETA1(I) +S2W/ETA0(I))
8453         TFCT  = (SQRT(ETA0(I)*ETA1(I)) *(TLM1(I) -TLM0(I))*SMEAN +
8454     $           (TLM0(I)*SQRT(ETA0(I)) -TLM1(I)*SQRT(ETA1(I)))*S)/
8455     $           (SQRT(TMSA) *(SQRT(ETA0(I)) -SQRT(ETA1(I))))
8456         XM(I) = DDOT (NPAR, XPTS(I), NPTS, COEF, 1)
8457         IF(IBUGA2.EQ.'ON')THEN
8458           WRITE(ICOUT,119)I,XM(I)
8459           CALL DPWRST('XXX','BUG ')
8460         ENDIF
8461         T (I) = XM(I) -TFCT*SQRT(RMSA)
8462 10   CONTINUE
8463C
8464C     -- FOR FIT CASE, CALCULATE PREDICTED VALUES AT
8465C     -- DESIGN POINTS
8466      IF(IBUGA2.EQ.'ON')THEN
8467        WRITE(ICOUT,118)ICASRE,NLVL,NPAR
8468 118    FORMAT('ICASRE,NLVL,NPAR=',A4,1X,2I8)
8469        CALL DPWRST('XXX','BUG ')
8470        DO116I=1,NPAR*NLVL
8471          WRITE(ICOUT,117)I,X(I)
8472 117      FORMAT('I,X(I)=',I8,E15.7)
8473          CALL DPWRST('XXX','BUG ')
8474 116    CONTINUE
8475        DO115I=1,NPAR*NPTS
8476          WRITE(ICOUT,114)I,XPTS(I)
8477 114      FORMAT('I,XPTS(I)=',I8,E15.7)
8478          CALL DPWRST('XXX','BUG ')
8479 115    CONTINUE
8480      ENDIF
8481      IF(ICASRE.EQ.'FREC')THEN
8482        DO 19 I=1, NLVL
8483          XM(I) = DDOT (NPAR, X(I), NLVL, COEF, 1)
8484          IF(IBUGA2.EQ.'ON')THEN
8485            WRITE(ICOUT,119)I,XM(I)
8486 119        FORMAT('I,XM(I)=',I8,E15.7)
8487            CALL DPWRST('XXX','BUG ')
8488          ENDIF
8489 19     CONTINUE
8490      ENDIF
8491C   -- FOR DATAPLOT, READ XX ARRAY BACK IN
8492C   -- FOR RECIPE, READ THIS MATRIX BACK IN, FOR SIMCOV DO NOT
8493C   -- (SIMCOV MAKES MULTIPLE CALLS TO REGDAT, WANT TO LEAVE
8494C   -- WK1 MATRIX AS THE SVDC MATRIX)
8495      IF(IFLAG.EQ.'RECI')THEN
8496        IOP='READ'
8497        IFILE='DPRE1F.DAT'
8498        NUMXX=NTOT*NPAR
8499        CALL DPSWA2(IOP,IFILE,WK1,NUMXX,IBUGA3,ISUBRO,IERROR)
8500        IF(IERROR.EQ.'YES')RETURN
8501      ENDIF
8502C
8503      RETURN
8504      END
8505      SUBROUTINE REGINI (
8506CCCCC CALL LIST CHANGED TO REFLECT SWAPPING TO USE LESS MEMORY.
8507     &             NLVL, NPAR, NTOT, NBCH, NPTS, X, XPTS, IP,
8508CCCCC$             IQ, CONT, CONF, XX, XTX, XTXI, XN, H,
8509     $             IQ, CONT, CONF, XX, XTX, XTXI, XN, SCRTCH,
8510CCCCC$             U1, S1, V1, U2, S2, V2, TLM0, TLM1, ETA0, ETA1,
8511     $             S1, V1, S2, V2, TLM0, TLM1, ETA0, ETA1,
8512CCCCC$             SATT, IN2, WK1, WK2, WK3,
8513     $             SATT, IN2, WK2, WK3,
8514     $             CRT,ISEED, MAXREP,MAXLVL,
8515     $             ICASRE,ISUBRO,IBUGA2, IERROR)
8516C
8517C        SUBROUTINE REGINI PERFORMS ALL OF THE CALCULATIONS FOR REGRESSION
8518C     TOLERANCE LIMITS WHICH DO NOT INVOLVE THE RESPONSE (Y) DATA.
8519C
8520C
8521      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
8522      INCLUDE 'DPCOPA.INC'
8523      REAL AJUNK
8524      REAL XTMP(1)
8525C
8526      LOGICAL CONFND, SATT
8527CCCCC CHARACTER*10 DUMCHR
8528      DIMENSION X(*),    XPTS(*), IP(*),  IQ(*),   XX(*), XTX(*),
8529CCCCC$          XTXI(*), XN(*),   H(*),   U1(*),   S1(*), V1(*),
8530CCCCC$          U2(*),   S2(*),   V2(*),  TLM0(*), TLM1(*),
8531CCCCC$          ETA0(*), ETA1(*), WK1(*), WK2(*),  WK3(*)
8532     $          XTXI(*), XN(*),   SCRTCH(*),   S1(*),   V1(*),
8533     $          S2(*),   V2(*),  TLM0(*), TLM1(*),
8534     $          ETA0(*), ETA1(*), WK2(*),  WK3(*), CRT(*)
8535C
8536      COMMON /RECIPA/ IRANK1, IRANK2, TR1, TR2, GNU0, GNU1, CONFND
8537      COMMON /RECIPB/ NUMXX, NUMU1, NUMU2, NUMH
8538C
8539      CHARACTER*4 IOP
8540      CHARACTER*4 IMATCH
8541CCCCC CHARACTER*80 IFILE
8542      CHARACTER (LEN=MAXFNC) :: IFILE
8543C
8544      CHARACTER*4 ICASRE
8545C
8546      CHARACTER*4 IERROR
8547      CHARACTER*4 IBUGA2
8548      CHARACTER*4 IBUGA3
8549      CHARACTER*4 ISUBRO
8550C
8551      INCLUDE 'DPCOP2.INC'
8552C
8553      DATA ONE /1.D0/
8554      DATA ZERO/0.D0/
8555      DATA EPS /1.D-7/
8556C
8557      IF(IBUGA3.EQ.'ON')THEN
8558        WRITE(ICOUT,12)IN2
8559   12   FORMAT('IN2 = ',I8)
8560        CALL DPWRST('XXX','BUG ')
8561      ENDIF
8562C
8563      IBUGA3='OFF'
8564      IERROR='NO'
8565C      -- BUILD FULL DATA MATRIX FROM UNIQUE ROWS
8566C      -- NOTE: DATAPLOT PASSES IN FULL DESIGN MATRIX (MINUS
8567C               THE BATCH VARIABLE).  NEED TO RECONSTRUCT THE
8568C               X ARRAY.
8569C      -- NOTE: FOR EXAMPLE, THE 2-D ARRAY
8570C                   1 -3 -2
8571C                   1 -3 0
8572C                   1  1 -2
8573C                   1  1 0
8574C               IS STORED AS
8575C                   1 1 1 1 -3 -3 1 1 -2 0 -2 0
8576C               IN THE 1-D ARRAY
8577C
8578C      --       A DATAPLOT COMPLICATION IS THAT WE START WITH
8579C               THE FULL DESIGN MATRIX, BUT WE DON'T KNOW WHAT
8580C               NLVL IS IN ADVANCE (THAT IS BEING CACLUCATED
8581C               HERE).  THEREFORE, IN CREATING THE REDUCED DESIGN
8582C               MATRIX, X, WE NEED TO MAKE AN INITIAL PASS TO
8583C               DETERMINE THE VALUE OF "NLVL".  DO THIS BY LOOPING
8584C               THROUGH AND COMPARING EACH ROW OF XX WITH ALL PREVIOUS
8585C               ROWS OF XX.  INCREMENT NLVL IF NO MATCH FOUND.
8586C
8587CCCCC DO 10 I=1, NTOT
8588CCCCC    DO 20 J=1, NPAR
8589CCCCC       XX((J-1)*NTOT+I) = X((J-1)*NLVL+IP(I))
8590C20      CONTINUE
8591C10   CONTINUE
8592C
8593      NLVL=1
8594      DEPS=1.0D-10
8595      DO110I=2,NTOT
8596        IMATCH='NO'
8597        DO120J=1,I-1
8598          DO125KK=1,NPAR
8599            DTERM1=XX((KK-1)*NTOT+I)
8600            DTERM2=XX((KK-1)*NTOT+J)
8601CCCCC       IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8602CCCCC         WRITE(ICOUT,126)I,J,KK,DTERM1,DTERM2
8603CC126         FORMAT('I,J,KK=',3I8,2D15.7)
8604CCCCC         CALL DPWRST('XXX','BUG ')
8605CCCCC       ENDIF
8606            IF(DABS(DTERM1-DTERM2).GT.DEPS)THEN
8607              GOTO120
8608            ENDIF
8609  125    CONTINUE
8610         IMATCH='YES'
8611         GOTO110
8612  120  CONTINUE
8613       IF(IMATCH.EQ.'NO')NLVL=NLVL+1
8614  110 CONTINUE
8615C
8616      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8617        WRITE(ICOUT,132)NLVL
8618        CALL DPWRST('XXX','BUG ')
8619      ENDIF
8620  132 FORMAT('NLVL=',I8)
8621C
8622      DO5J=1,NPAR
8623        X((J-1)*NLVL+1)=XX((J-1)*NTOT+1)
8624    5 CONTINUE
8625      ITEST=1
8626      IP(1)=ITEST
8627C
8628      DO10I=2,NTOT
8629        IMATCH='NO'
8630        DO20J=1,ITEST
8631          DO25K=1,NPAR
8632            DTERM1=XX((K-1)*NTOT+I)
8633            DTERM2=X((K-1)*NLVL+J)
8634CCCCC       IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8635CCCCC         WRITE(ICOUT,136)I,J,K,DTERM1,DTERM2
8636CC136         FORMAT('I,J,KK=',3I8,2D15.7)
8637CCCCC         CALL DPWRST('XXX','BUG ')
8638CCCCC       ENDIF
8639            IF(DABS(DTERM1-DTERM2).GT.DEPS)THEN
8640              GOTO20
8641            ENDIF
8642   25     CONTINUE
8643          IP(I)=J
8644          GOTO10
8645   20   CONTINUE
8646        ITEST=ITEST+1
8647        DO35KK=1,NPAR
8648          X((KK-1)*NLVL+ITEST)=XX((KK-1)*NTOT+I)
8649   35   CONTINUE
8650        IP(I)=ITEST
8651   10 CONTINUE
8652C
8653      IF(ITEST.NE.NLVL)THEN
8654        WRITE(ICOUT,142)NLVL,ITEST
8655        CALL DPWRST('XXX','BUG ')
8656        IERROR='YES'
8657        RETURN
8658      ENDIF
8659  142 FORMAT('***** INTERNAL ERROR FROM REGINI--NUMBER OF LEVELS ',
8660     1'PASS 1 = ',I8,' NUMBER OF LEVELS PASS 2 = ',I8)
8661      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8662        DO1001I=1,NLVL*NPAR
8663        WRITE(ICOUT,1002)I,X(I)
8664        CALL DPWRST('XXX','BUG ')
8665 1001   CONTINUE
8666        DO1006I=1,NTOT
8667        WRITE(ICOUT,1007)I,IP(I)
8668        CALL DPWRST('XXX','BUG ')
8669 1006   CONTINUE
8670      ENDIF
8671 1002 FORMAT('I,X(I)=',I8,D15.7)
8672 1007 FORMAT('I,IP(I)=',2I8)
8673C
8674      IF(NLVL.GT.MAXLVL)THEN
8675        WRITE(ICOUT,999)
8676        CALL DPWRST('XXX','BUG ')
8677        WRITE(ICOUT,101)NLVL
8678        CALL DPWRST('XXX','BUG ')
8679        WRITE(ICOUT,102)MAXLVL
8680        CALL DPWRST('XXX','BUG ')
8681        IERROR='YES'
8682        RETURN
8683      ENDIF
8684  101 FORMAT('**** ERROR FROM REGINI:  THE NUMBER OF LEVELS IN THE ',
8685     1'DESIGN MATRIX ',I8)
8686  102 FORMAT('     EXCEEDS THE MAXIMUM ALLOWABLE ',I8)
8687C
8688C   --FOR RECIPE FIT CASE, XPTS IS CREATED FROM USER SUPPLIED DATA.
8689C   --FOR RECIPE ANOVA CASE, XPTS IS EQUAL TO X MATRIX (THAT IS,
8690C   --WE WILL COMPUTE A TOLERANCE VALUE AT ALL UNIQUE DESIGN
8691C   --POINTS.
8692C   --FOR ANOVA CASE, XPTS SHOULD BE ALL ZERO'S.  FOR FIT CASE
8693C   --FIRST NTOT ROWS SHOULD BE 1 (CORRESPONDING TO THE CONSTANT).
8694C
8695      IF(ICASRE.EQ.'AREC'.OR.(ICASRE.EQ.'FREC'.AND.NPTS.EQ.0))THEN
8696        NPTS=NLVL
8697        DO42I=1,NPAR*NLVL
8698          XPTS(I)=X(I)
8699 42     CONTINUE
8700      ENDIF
8701C
8702C   -- NEED COPY OF XX, BECAUSE DSVDC DESTROYS INPUT MATRIX
8703C   -- FOR DATAPLOT, COPY XX FILE TO A SWAP FILE, USE XX IN SUBSEQUENT
8704C      CALCULATIONS.
8705      IOP='WRIT'
8706      IFILE='DPRE1F.DAT'
8707      NUMXX=NTOT*NPAR
8708      CALL DPSWA2(IOP,IFILE,XX,NUMXX,IBUGA3,ISUBRO,IERROR)
8709      IF(IERROR.EQ.'YES')RETURN
8710C
8711CCCCC CALL DCOPY (NTOT*NPAR, XX, 1, WK1, 1)
8712C
8713C   --  XX^T *XX
8714      CALL DGEMM ('T', 'N', NPAR, NPAR, NTOT, ONE, XX, NTOT,
8715     $             XX, NTOT, ZERO, XTX, NPAR,IERROR)
8716      IF(IERROR.EQ.'YES')RETURN
8717C
8718C    --  SVD OF DESIGN MATRIX XX (COPY IN WK1)
8719      IJOB = 21
8720      LDU  = NTOT
8721      LDV  = NPAR
8722      TOL  = 1.D-7
8723CCCCC CALL DSVDC (WK1 , NTOT, NTOT, NPAR, S1, WK2, U1, LDU, V1, LDV,
8724      CALL DSVDC (XX , NTOT, NTOT, NPAR, S1, WK2, SCRTCH, LDU, V1, LDV,
8725     $            WK3, IJOB, INFO)
8726C   -- FOR DATAPLOT, COPY U1 (=SCRTCH) FILE TO A SWAP FILE
8727      IOP='WRIT'
8728      IFILE='DPRE2F.DAT'
8729      NUMU1=NTOT*NPAR
8730      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMU1,IBUGA3,ISUBRO,IERROR)
8731      IF(IERROR.EQ.'YES')RETURN
8732C
8733C    -- RANK (XX)
8734      IRANK1 = 0
8735      DO 30 I=1, NPAR
8736         IF (ABS(S1(I)) .LT. TOL) GO TO 40
8737         IRANK1 = IRANK1 +1
8738 30   CONTINUE
8739 40   CONTINUE
8740C
8741C     -- DO "SIMRAT" CODE HERE
8742      IF(.NOT.SATT)THEN
8743        IOP='WRIT'
8744        IFILE='DPRE3F.DAT'
8745        NUMXX=NTOT*NPAR
8746        CALL DPSWA2(IOP,IFILE,XX,NUMXX,IBUGA3,ISUBRO,IERROR)
8747        IF(IERROR.EQ.'YES')RETURN
8748C
8749        IOP='WRIT'
8750        IFILE='DPRE4F.DAT'
8751        NUMXPT=NPTS*NPAR
8752        CALL DPSWA2(IOP,IFILE,XPTS,NUMXPT,IBUGA3,ISUBRO,IERROR)
8753        IF(IERROR.EQ.'YES')RETURN
8754C
8755        CALL NODPPF(CONT,ZCONT)
8756        NREP=MAXREP
8757        NRAN=1
8758        DO 900 I=1, NPTS
8759CCCCC    Z = RNOR(ISEED)
8760         CALL NORRAN(NRAN,ISEED,XTMP)
8761         Z=DBLE(XTMP(1))
8762CCCCC    CALL DCOPY(NPAR,  XPTS(I), NPTS, W, 1)
8763         CALL SIMRAT
8764CCCCC$     (U1,S1,V1,IQ,W,NBCH,NTOT,NPAR,NREP,IRK,ZCONT,CONF,
8765CCCCC$      WK1,WK2,VALS,QUANT)
8766     $     (SCRTCH,S1,V1,IQ,XPTS,NBCH,NTOT,NPAR,NREP,IRK,ZCONT,CONF,
8767     $      WK2,WK3,XX,QUANT, IERROR)
8768           IF(IERROR.EQ.'YES')RETURN
8769           CRT(I)=QUANT
8770 900  CONTINUE
8771C
8772        IOP='READ'
8773        IFILE='DPRE2F.DAT'
8774        CALL DPSWA2(IOP,IFILE,SCRTCH,NUMU1,IBUGA3,ISUBRO,IERROR)
8775        IF(IERROR.EQ.'YES')RETURN
8776C
8777        IOP='READ'
8778        IFILE='DPRE3F.DAT'
8779        NUMXX=NTOT*NPAR
8780        CALL DPSWA2(IOP,IFILE,XX,NUMXX,IBUGA3,ISUBRO,IERROR)
8781        IF(IERROR.EQ.'YES')RETURN
8782C
8783        IOP='READ'
8784        IFILE='DPRE4F.DAT'
8785        NUMXPT=NPTS*NPAR
8786        CALL DPSWA2(IOP,IFILE,XPTS,NUMXPT,IBUGA3,ISUBRO,IERROR)
8787        IF(IERROR.EQ.'YES')RETURN
8788      ENDIF
8789C
8790C     -- INVERSE (XX^T XX)
8791      CALL DSET (NPAR*NPAR, XTXI, ZERO)
8792      DO 50 I=1, IRANK1
8793         CALL DGER (NPAR, NPAR, ONE/S1(I)**2, V1((I-1)*NPAR+1), 1,
8794     $              V1((I-1)*NPAR+1), 1, XTXI, NPAR,IERROR)
8795         IF(IERROR.EQ.'YES')RETURN
8796 50   CONTINUE
8797C
8798C     -- H = X *INVERSE(XX^T XX) *X^T
8799      CALL DGEMM ('N', 'N', NLVL, NPAR, NPAR, ONE, X, NLVL,
8800CCCCC$              XTXI, NPAR, ZERO, WK1, NLVL,IERROR)
8801     $              XTXI, NPAR, ZERO, XX, NLVL,IERROR)
8802      IF(IERROR.EQ.'YES')RETURN
8803CCCCC CALL DGEMM ('N', 'T', NLVL, NLVL, NPAR, ONE, WK1, NLVL,
8804CCCCC$             X, NLVL, ZERO, H, NLVL,IERROR)
8805      CALL DGEMM ('N', 'T', NLVL, NLVL, NPAR, ONE, XX, NLVL,
8806     $             X, NLVL, ZERO, SCRTCH, NLVL,IERROR)
8807C   -- FOR DATAPLOT, COPY H (=SCRTCH) FILE TO A SWAP FILE
8808      IOP='WRIT'
8809      IFILE='DPRE4F.DAT'
8810      NUMH=NLVL*NLVL
8811      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMH,IBUGA3,ISUBRO,IERROR)
8812      IF(IERROR.EQ.'YES')RETURN
8813C
8814      IF(IERROR.EQ.'YES')RETURN
8815C
8816C    -- AUGMENT THE XX MATRIX WITH BATCH INDICATORS
8817C    -- FOR DATAPLOT, READ ORIGINAL XX MATRIX BACK IN
8818      IOP='READ'
8819      IFILE='DPRE1F.DAT'
8820      NUMXX=NTOT*NPAR
8821      CALL DPSWA2(IOP,IFILE,XX,NUMXX,IBUGA3,ISUBRO,IERROR)
8822      IF(IERROR.EQ.'YES')RETURN
8823C
8824      CALL DSET (NTOT*NBCH, XX(NTOT*NPAR+1), ZERO)
8825      DO 70 I=1, NTOT
8826        XX((IQ(I)+NPAR-1)*NTOT +I) = ONE
8827 70   CONTINUE
8828C
8829C     -- DO AN SVD ON THE AUGMENTED MATRIX
8830      IJOB = 21
8831      LDU  = NTOT
8832      NCOL = NPAR+NBCH
8833      LDV  = NCOL
8834      TOL  = 1.D-7
8835CCCCC CALL DCOPY (NTOT*NCOL, XX, 1, WK1, 1)
8836CCCCC CALL DSVDC (WK1, NTOT, NTOT, NCOL, S2, WK2, U2,
8837CCCCC$            LDU, V2, LDV,  WK3, IJOB, INFO)
8838      CALL DSVDC (XX, NTOT, NTOT, NCOL, S2, WK2, SCRTCH,
8839     $            LDU, V2, LDV,  WK3, IJOB, INFO)
8840C   -- FOR DATAPLOT, COPY U2 (=SCRTCH) FILE TO A SWAP FILE
8841      IOP='WRIT'
8842      IFILE='DPRE3F.DAT'
8843CCCCC NUMU2=NTOT*(NPAR+NUMBCH)
8844      NUMU2=NTOT*(NPAR+NBCH)
8845      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMU2,IBUGA3,ISUBRO,IERROR)
8846      IF(IERROR.EQ.'YES')RETURN
8847C
8848C    -- GET RANK OF AUGMENTED DESIGN MATRIX
8849      IRANK2 = 0
8850      DO 80 I=1, NPAR+NBCH
8851         IF (ABS(S2(I)) .LT. TOL) GO TO 90
8852         IRANK2 = IRANK2 +1
8853 80   CONTINUE
8854 90   CONTINUE
8855C
8856      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8857        WRITE(ICOUT,91)IRANK2
8858        CALL DPWRST('XXX','BUG ')
8859      ENDIF
8860   91 FORMAT('FROM REGINI--IRANK2=',I8)
8861C
8862C     -- CALCULATE N, M, B =M-N^T*H*N, TR(B), AND TR(B^2)
8863      CALL DSET (NBCH*NLVL, XN, ZERO)
8864      DO 100 I=1, NTOT
8865        IDX = (IQ(I)-1)*NLVL +IP(I)
8866        XN(IDX) = XN(IDX) +1
8867 100  CONTINUE
8868CCCCC CALL DGEMM  ('T', 'N', NBCH, NLVL, NLVL, ONE, XN, NLVL,
8869CCCCC$             H, NLVL, ZERO, WK1, NBCH,IERROR)
8870C   -- FOR DATAPLOT, READ H (=SCRTCH) FROM SWAP FILE
8871      IOP='READ'
8872      IFILE='DPRE4F.DAT'
8873      NUMH=NLVL*NLVL
8874      CALL DPSWA2(IOP,IFILE,SCRTCH,NUMH,IBUGA3,ISUBRO,IERROR)
8875      IF(IERROR.EQ.'YES')RETURN
8876C
8877      CALL DGEMM  ('T', 'N', NBCH, NLVL, NLVL, ONE, XN, NLVL,
8878     1             SCRTCH, NLVL, ZERO, XX, NBCH,IERROR)
8879      IF(IERROR.EQ.'YES')RETURN
8880CCCCC CALL DGEMM  ('N', 'N', NBCH , NBCH, NLVL, ONE, WK1, NBCH,
8881      CALL DGEMM  ('N', 'N', NBCH , NBCH, NLVL, ONE, XX, NBCH,
8882     $             XN, NLVL, ZERO, WK2, NBCH,IERROR)
8883      IF(IERROR.EQ.'YES')RETURN
8884CCCCC CALL DSET   (NLVL, WK1, ONE)
8885      CALL DSET   (NLVL, XX, ONE)
8886CCCCC CALL DGEMV  ('T', NLVL, NBCH, ONE, XN, NLVL, WK1, 1,ZERO,WK3,1,
8887      CALL DGEMV  ('T', NLVL, NBCH, ONE, XN, NLVL, XX, 1,ZERO,WK3,1,
8888     $             IERROR)
8889      IF(IERROR.EQ.'YES')RETURN
8890      CALL DSCAL  (NBCH*NBCH, -ONE, WK2, 1)
8891      CALL DAXPY  (NBCH, ONE, WK3, 1, WK2, NBCH+1)
8892      TR1 = DSUM  (NBCH, WK2, NBCH+1)
8893      TR2 = DDOT  (NBCH*NBCH, WK2, 1, WK2, 1)
8894C
8895C    -- CHECK TO SEE IF BETWEEN-BATCH VARIANCE IS CONFOUNDED WITH FIXED PART
8896C
8897      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8898        WRITE(ICOUT,191)TR1,TR2,EPS
8899        CALL DPWRST('XXX','BUG ')
8900      ENDIF
8901  191 FORMAT('FROM REGINI--TR1,TR2,EPS=',3D15.7)
8902      IF (TR2 .LE. EPS) THEN
8903         IF(ICASRE.NE.'UREC')THEN
8904         WRITE(ICOUT,999)
8905         CALL DPWRST('XXX','BUG ')
8906         WRITE(ICOUT,2001)
8907         CALL DPWRST('XXX','BUG ')
8908         WRITE(ICOUT,2002)
8909         CALL DPWRST('XXX','BUG ')
8910         WRITE(ICOUT,2003)
8911         CALL DPWRST('XXX','BUG ')
8912         WRITE(ICOUT,2004)
8913         CALL DPWRST('XXX','BUG ')
8914         WRITE(ICOUT,999)
8915         CALL DPWRST('XXX','BUG ')
8916         ENDIF
8917         CONFND = .TRUE.
8918      ELSE
8919         CONFND = .FALSE.
8920      END IF
8921  999 FORMAT(' ')
8922 2001 FORMAT(' REGINI : WARNING: BETWEEN-BATCH VARIANCE CANNOT')
8923 2002 FORMAT('          BE ESTIMATED FROM THESE DATA. RESULTS')
8924 2003 FORMAT('          WILL BE BASED ON THE ASSUMPTION THAT THE')
8925 2004 FORMAT('          BETWEEN-BATCH VARIABILITY IS NEGLIGIBLE.')
8926C
8927C    -- VARIANCE OF MEAN WHEN S2W = 0
8928      CALL DGEMM ('T', 'N', NBCH, NPAR, NLVL, ONE, XN, NLVL, X,
8929CCCCC$             NLVL, ZERO, WK1, NBCH, IERROR)
8930     $             NLVL, ZERO, XX, NBCH, IERROR)
8931      IF(IERROR.EQ.'YES')RETURN
8932CCCCC CALL DGEMM ('T', 'N', NPAR, NPAR, NBCH, ONE, WK1, NBCH, WK1,
8933      CALL DGEMM ('T', 'N', NPAR, NPAR, NBCH, ONE, XX, NBCH, XX,
8934     $             NBCH, ZERO, WK2, NPAR, IERROR)
8935      IF(IERROR.EQ.'YES')RETURN
8936      CALL DGEMM ('N', 'N', NPAR, NPAR, NPAR, ONE, XTXI, NPAR, WK2,
8937CCCCC$             NPAR, ZERO, WK1, NPAR, IERROR)
8938     $             NPAR, ZERO, XX, NPAR, IERROR)
8939      IF(IERROR.EQ.'YES')RETURN
8940CCCCC CALL DGEMM ('N', 'N', NPAR, NPAR, NPAR, ONE, WK1, NPAR, XTXI,
8941      CALL DGEMM ('N', 'N', NPAR, NPAR, NPAR, ONE, XX, NPAR, XTXI,
8942     $             NPAR, ZERO, WK2, NPAR, IERROR)
8943      IF(IERROR.EQ.'YES')RETURN
8944C
8945C     -- TOLERANCE LIMIT FACTORS
8946C     8/97.  REPLACE WITH DATAPLOT NODPPF ROUTINE.
8947CCCCC ZCONT = PPND16 (CONT, IFAULT)
8948      CALL NODPPF (CONT, ZCONT)
8949      IF (.NOT. CONFND) GNU1 = TR1**2 /TR2
8950      GNU0 = NTOT -IRANK1
8951      NDF  = IRANK2 -IRANK1
8952      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8953        WRITE(ICOUT,2011)CONT,ZCONT,GNU0, NDF
8954        CALL DPWRST('XXX','BUG ')
8955      ENDIF
8956 2011 FORMAT('CONT,ZCONT, GNU0, NDF = ',3D15.7,I8)
8957C
8958C     -- IF SIMULATED CRITICAL VALUES ARE TO BE USED, SKIP
8959C        THE HEADER LINE IN THE CRITICAL VALUE FILE
8960CCCCC NOTE: FOR DATAPLOT, NOT ACTUALLY READING FILE, SO SKIP
8961CCCCC       THIS STEP.
8962CCCCC IF (.NOT. SATT) THEN
8963CCCCC    READ (IN2,'(A)') DUMCHR
8964CCCCC END IF
8965      DO 130 I=1, NPTS
8966         CALL DGEMV ('N', NPAR, NPAR, ONE, XTXI, NPAR, XPTS(I), NPTS,
8967CCCCC$               ZERO, WK1, 1, IERROR)
8968     $               ZERO, XX, 1, IERROR)
8969         IF(IERROR.EQ.'YES')RETURN
8970CCCCC    ETA0(I) = ONE /DDOT (NPAR, WK1, 1, XPTS(I), NPTS)
8971         ETA0(I) = ONE /DDOT (NPAR, XX, 1, XPTS(I), NPTS)
8972         CALL DGEMV ('N', NPAR, NPAR, ONE, WK2, NPAR, XPTS(I),
8973CCCCC$               NPTS, ZERO, WK1, 1, IERROR)
8974     $               NPTS, ZERO, XX, 1, IERROR)
8975         IF(IERROR.EQ.'YES')RETURN
8976CCCCC    ETA1(I) = ONE /DDOT (NPAR, WK1, 1, XPTS(I), NPTS)
8977         ETA1(I) = ONE /DDOT (NPAR, XX, 1, XPTS(I), NPTS)
8978         XNCP0 = ZCONT *SQRT(ETA0(I))
8979         XNCP1 = ZCONT *SQRT(ETA1(I))
8980         IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
8981           WRITE(ICOUT,2021)I,XNCP0,XNCP1
8982           CALL DPWRST('XXX','BUG ')
8983         ENDIF
8984 2021 FORMAT('I,XNCP0, XNCP1 = ',I8,D15.7,D15.7)
8985C
8986
8987CCCCC 8/97.  REPLACE FOLLOWING NON-CENTRAL T PPF WITH DATAPLOT
8988CCCCC        VERSION NCTPPF.
8989CCCCC    CALL INVNCT (CONF, GNU0, XNCP0,  TLM0(I))
8990         CALL NCTPPF (SNGL(CONF), SNGL(GNU0), SNGL(XNCP0),  AJUNK)
8991         TLM0(I)=DBLE(AJUNK)
8992         IF (CONFND) THEN
8993             TLM1(I) = TLM0(I)
8994         ELSE
8995CCCCC 8/97.  REPLACE FOLLOWING NON-CENTRAL T PPF WITH DATAPLOT
8996CCCCC        VERSION DNTPPF.
8997CCCCC       CALL INVNCT (CONF, GNU1, XNCP1,  TLM1(I))
8998            CALL NCTPPF (SNGL(CONF), SNGL(GNU1), SNGL(XNCP1), AJUNK)
8999            TLM1(I)=DBLE(AJUNK)
9000            IF (.NOT. SATT) THEN
9001CCCCC         READ (IN2,*) CRT
9002              TLM1(I) = CRT(I) *SQRT(TR1 *ETA1(I)/GNU0)
9003            END IF
9004         END IF
9005         TLM0(I) = TLM0(I)/SQRT(ETA0(I))
9006         TLM1(I) = TLM1(I)/SQRT(ETA1(I))
9007         IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'GINI')THEN
9008           WRITE(ICOUT,2031)I,TLM0(I),TLM1(I),ETA0(I),ETA1(I)
9009           CALL DPWRST('XXX','BUG ')
9010         ENDIF
9011 2031 FORMAT('I,TLM0(I),TLM1(I),ETA0(I),ETA1(I) = ',I8,4D15.7)
9012 130  CONTINUE
9013      RETURN
9014      END
9015      SUBROUTINE RELRSK(X,N1,Y,N2,PSTAMV,IWRITE,XIDTEM,STAT,
9016     1                  IBUGA3,IERROR)
9017C
9018C     PURPOSE--THIS SUBROUTINE COMPUTES THE RELATIVE RISK
9019C              (= P1/P2 WHERE P1 = PROBABILITY OF SUCCESS FOR
9020C              VARIABLE 1 AND P2 = PROBABILITY OF SUCCESS FOR
9021C              VARIABLE 2)
9022C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
9023C                                (UNSORTED) OBSERVATIONS
9024C                                WHICH CONSTITUTE THE FIRST SET
9025C                                OF DATA.
9026C                     --N1     = THE INTEGER NUMBER OF OBSERVATIONS
9027C                                IN THE VECTOR X.
9028C                     --Y      = THE SINGLE PRECISION VECTOR OF
9029C                                (UNSORTED) OBSERVATIONS
9030C                                WHICH CONSTITUTE THE SECOND SET
9031C                                OF DATA.
9032C                     --N2     = THE INTEGER NUMBER OF OBSERVATIONS
9033C                                IN THE VECTOR Y.
9034C                     --PSTAMV = THE MISSING VALUE CODE.
9035C     OUTPUT ARGUMENTS--STAT   = THE SINGLE PRECISION VALUE OF THE
9036C                                RELATIVE RISK BETWEEN THE 2 SETS
9037C                                OF DATA IN THE INPUT VECTORS
9038C                                X AND Y.
9039C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
9040C             RELATIVE RISK BETWEEN THE 2 SETS
9041C             OF DATA IN THE INPUT VECTORS X AND Y.
9042C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
9043C                   OF N FOR THIS SUBROUTINE.
9044C     OTHER DATAPAC   SUBROUTINES NEEDED--ODDDIS.
9045C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
9046C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9047C     LANGUAGE--ANSI FORTRAN (1977)
9048C     WRITTEN BY--JAMES J. FILLIBEN
9049C                 STATISTICAL ENGINEERING DIVISION
9050C                 INFORMATION TECHNOLOGY LABORATORY
9051C                 NATIONAL INSTIUTE OF STANDARDS AND TECHNOLOGY
9052C                 GAITHERSBURG, MD 20899-8980
9053C                 PHONE--301-975-2899
9054C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9055C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
9056C     LANGUAGE--ANSI FORTRAN (1977)
9057C     VERSION NUMBER--2007/4
9058C     ORIGINAL VERSION--APRIL     2007.
9059C     UPDATED         --AUGUST    2007. IF 2X2 CASE, CHECK IF SUM
9060C                                       OF ENTRIES IS <= 4.  IN THIS
9061C                                       CASE, ASSUME WE HAVE RAW DATA
9062C
9063C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9064C
9065      CHARACTER*4 IWRITE
9066      CHARACTER*4 IBUGA3
9067      CHARACTER*4 IERROR
9068C
9069      CHARACTER*4 ISTEPN
9070      CHARACTER*4 ISUBN1
9071      CHARACTER*4 ISUBN2
9072C
9073C---------------------------------------------------------------------
9074C
9075      DIMENSION X(*)
9076      DIMENSION Y(*)
9077      DIMENSION XIDTEM(*)
9078C
9079C-----COMMON----------------------------------------------------------
9080C
9081      INCLUDE 'DPCOP2.INC'
9082C
9083C-----START POINT-----------------------------------------------------
9084C
9085      ISUBN1='RELR'
9086      ISUBN2='SK  '
9087      IERROR='NO'
9088C
9089C
9090      IF(IBUGA3.EQ.'ON')THEN
9091        WRITE(ICOUT,999)
9092  999   FORMAT(1X)
9093        CALL DPWRST('XXX','BUG ')
9094        WRITE(ICOUT,51)
9095   51   FORMAT('***** AT THE BEGINNING OF RELRSK--')
9096        CALL DPWRST('XXX','BUG ')
9097        WRITE(ICOUT,52)IBUGA3
9098   52   FORMAT('IBUGA3 = ',A4)
9099        CALL DPWRST('XXX','BUG ')
9100        WRITE(ICOUT,53)N1,N2
9101   53   FORMAT('N1,N2 = ',2I8)
9102        CALL DPWRST('XXX','BUG ')
9103        DO55I=1,MAX(N1,N2)
9104          WRITE(ICOUT,56)I,X(I),Y(I)
9105   56     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
9106          CALL DPWRST('XXX','BUG ')
9107   55   CONTINUE
9108      ENDIF
9109C
9110C               ********************************************
9111C               **  STEP 21--                             **
9112C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
9113C               ********************************************
9114C
9115      ISTEPN='21'
9116      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
9117C
9118      IF(N1.LT.2)THEN
9119        WRITE(ICOUT,999)
9120        CALL DPWRST('XXX','WRIT')
9121        WRITE(ICOUT,1201)
9122 1201   FORMAT('***** ERROR IN THE RELATIVE RISK')
9123        CALL DPWRST('XXX','WRIT')
9124        WRITE(ICOUT,1203)
9125 1203   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE FIRST ',
9126     1         'RESPONSE VARIABLES IS LESS THAN TWO')
9127        CALL DPWRST('XXX','WRIT')
9128        WRITE(ICOUT,1205)N1
9129 1205   FORMAT('SAMPLE SIZE = ',I8)
9130        CALL DPWRST('XXX','WRIT')
9131        IERROR='YES'
9132        GOTO9000
9133      ENDIF
9134C
9135      IF(N2.LT.2)THEN
9136        WRITE(ICOUT,999)
9137        CALL DPWRST('XXX','WRIT')
9138        WRITE(ICOUT,1201)
9139        CALL DPWRST('XXX','WRIT')
9140        WRITE(ICOUT,1213)
9141 1213   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE SECOND ',
9142     1         'RESPONSE VARIABLES IS LESS THAN TWO')
9143        CALL DPWRST('XXX','WRIT')
9144        WRITE(ICOUT,1205)N2
9145        CALL DPWRST('XXX','WRIT')
9146        IERROR='YES'
9147        GOTO9000
9148      ENDIF
9149C
9150C     NOTE: CHECK FOR SPECIAL CASE N = 2.  IN THIS CASE,
9151C           ASSUME WE HAVE A 2X2 TABLE OF COUNTS INSTEAD
9152C           OF RAW DATA.
9153C
9154      IF(N1.EQ.2 .AND. N2.EQ.2)THEN
9155        N11=INT(X(1)+0.5)
9156        N21=INT(X(2)+0.5)
9157        N12=INT(Y(1)+0.5)
9158        N22=INT(Y(2)+0.5)
9159C
9160C       CHECK IF ALL ENTRIES 0 OR 1. IF SO, ASSUME
9161C       RAW DATA CASE.
9162C
9163        IF((N11.EQ.0 .OR. N11.EQ.1) .AND.
9164     1     (N12.EQ.0 .OR. N12.EQ.1) .AND.
9165     1     (N21.EQ.0 .OR. N21.EQ.1) .AND.
9166     1     (N22.EQ.0 .OR. N22.EQ.1)) GOTO1349
9167C
9168        IF(N11.LT.0)THEN
9169          WRITE(ICOUT,999)
9170          CALL DPWRST('XXX','BUG ')
9171          WRITE(ICOUT,1201)
9172          CALL DPWRST('XXX','BUG ')
9173          WRITE(ICOUT,1311)
9174 1311     FORMAT('      ROW 1 COLUMN 1 OF THE COUNTS TABLE IS ',
9175     1           'NEGATIVE.')
9176          CALL DPWRST('XXX','BUG ')
9177        ELSEIF(N21.LT.0)THEN
9178          WRITE(ICOUT,999)
9179          CALL DPWRST('XXX','BUG ')
9180          WRITE(ICOUT,1201)
9181          CALL DPWRST('XXX','BUG ')
9182          WRITE(ICOUT,1321)
9183 1321     FORMAT('      ROW 2 COLUMN 1 OF THE COUNTS TABLE IS ',
9184     1           'NEGATIVE.')
9185          CALL DPWRST('XXX','BUG ')
9186        ELSEIF(N12.LT.0)THEN
9187          WRITE(ICOUT,999)
9188          CALL DPWRST('XXX','BUG ')
9189          WRITE(ICOUT,1201)
9190          CALL DPWRST('XXX','BUG ')
9191          WRITE(ICOUT,1331)
9192 1331     FORMAT('      ROW 1 COLUMN 2 OF THE COUNTS TABLE IS ',
9193     1           'NEGATIVE.')
9194          CALL DPWRST('XXX','BUG ')
9195        ELSEIF(N22.LT.0)THEN
9196          WRITE(ICOUT,999)
9197          CALL DPWRST('XXX','BUG ')
9198          WRITE(ICOUT,1201)
9199          CALL DPWRST('XXX','BUG ')
9200          WRITE(ICOUT,1341)
9201 1341     FORMAT('      ROW 2 COLUMN 2 OF THE COUNTS TABLE IS ',
9202     1           'NEGATIVE.')
9203          CALL DPWRST('XXX','BUG ')
9204        ENDIF
9205C
9206        AN11=REAL(N11)
9207        AN21=REAL(N21)
9208        AN12=REAL(N12)
9209        AN22=REAL(N22)
9210        GOTO3000
9211      ENDIF
9212C
9213 1349 CONTINUE
9214C
9215      CALL ODDDIS(X,N1,PSTAMV,IWRITE,XIDTEM,N11,N21,NOUT,
9216     1            IBUGA3,IERROR)
9217      IF(IERROR.EQ.'YES' .OR. IERROR.EQ.'ON')GOTO9000
9218      CALL ODDDIS(Y,N2,PSTAMV,IWRITE,XIDTEM,N12,N22,NOUT,
9219     1            IBUGA3,IERROR)
9220      IF(IERROR.EQ.'YES' .OR. IERROR.EQ.'ON')GOTO9000
9221      AN11=REAL(N11)
9222      AN21=REAL(N21)
9223      AN12=REAL(N12)
9224      AN22=REAL(N22)
9225      GOTO3000
9226C
9227C     COMPUTE THE BIAS CORRECTED LOG OF THE ODDS RATIO.
9228C
9229 3000 CONTINUE
9230      AN1=AN11+AN21
9231      AN2=AN12+AN22
9232      AN=AN1 + AN2
9233C
9234      P11=AN11/AN1
9235      P21=AN21/AN1
9236      P12=AN12/AN2
9237      P22=AN22/AN2
9238C
9239      IF(P12.GT.0.0)THEN
9240        STAT=(P11/AN)/(P12/AN)
9241      ELSE
9242        STAT=0.0
9243        WRITE(ICOUT,999)
9244        CALL DPWRST('XXX','BUG ')
9245        WRITE(ICOUT,1201)
9246        CALL DPWRST('XXX','BUG ')
9247        WRITE(ICOUT,2411)
9248 2411   FORMAT('      PROBABILITY OF SUCCESS FOR VARIABLE TWO')
9249        CALL DPWRST('XXX','BUG ')
9250        WRITE(ICOUT,2413)
9251 2413   FORMAT('      IS ZERO.  UNABLE TO COMPUTE RELATIVE RISK.')
9252        CALL DPWRST('XXX','BUG ')
9253      ENDIF
9254C
9255C
9256C               *******************************
9257C               **  STEP 3--                 **
9258C               **  WRITE OUT A LINE         **
9259C               **  OF SUMMARY INFORMATION.  **
9260C               *******************************
9261C
9262      IF(IFEEDB.EQ.'OFF')GOTO890
9263      IF(IWRITE.EQ.'OFF' .OR. IWRITE.EQ.'NO')GOTO890
9264      WRITE(ICOUT,999)
9265      CALL DPWRST('XXX','BUG ')
9266      WRITE(ICOUT,811)STAT
9267  811 FORMAT('THE RELATIVE RISK = ',G15.7)
9268      CALL DPWRST('XXX','BUG ')
9269  890 CONTINUE
9270C
9271C               *****************
9272C               **  STEP 90--  **
9273C               **  EXIT.      **
9274C               *****************
9275C
9276 9000 CONTINUE
9277      IF(IBUGA3.EQ.'ON')THEN
9278        WRITE(ICOUT,999)
9279        CALL DPWRST('XXX','BUG ')
9280        WRITE(ICOUT,9011)
9281 9011   FORMAT('***** AT THE END OF RELRSK--')
9282        CALL DPWRST('XXX','BUG ')
9283        WRITE(ICOUT,9012)IBUGA3,IERROR
9284 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
9285        CALL DPWRST('XXX','BUG ')
9286        WRITE(ICOUT,9013)N,N11,N12,N21,N22
9287 9013   FORMAT('N,N11,N12,N21,N22 = ',5I10)
9288        CALL DPWRST('XXX','BUG ')
9289        WRITE(ICOUT,9014)P11,P12,P21,P22
9290 9014   FORMAT('P11,P12,P21,P22 = ',4G15.7)
9291        CALL DPWRST('XXX','BUG ')
9292        WRITE(ICOUT,9015)STAT
9293 9015   FORMAT('STAT = ',G15.7)
9294        CALL DPWRST('XXX','BUG ')
9295      ENDIF
9296C
9297      RETURN
9298      END
9299      SUBROUTINE RELSD(X,N,IWRITE,XRELSD,IBUGA3,IERROR)
9300C
9301C     PURPOSE--THIS SUBROUTINE COMPUTES THE
9302C              SAMPLE RELATIVE STANDARD DEVIATION
9303C              OF THE DATA IN THE INPUT VECTOR X.
9304C              THE SAMPLE RELATIVE STANDARD DEVIATION = 100 * (THE SAMPLE
9305C              STANDARD DEVIATION)/(THE SAMPLE MEAN).
9306C              THE DENOMINATOR N-1 IS USED IN COMPUTING THE
9307C              SAMPLE STANDARD DEVIATION.
9308C              THE SAMPLE RELATIVE STANDARD DEVIATION IS ALTERNATIVELY
9309C              REFERRED TO AS THE SAMPLE COEFFICIENT OF VARIATION.
9310C              THE SAMPLE STANDARD DEVIATION = SQRT((THE SUM OF THE
9311C              SQUARED DEVIATIONS ABOUT THE SAMPLE MEAN)/(N-1)).
9312C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
9313C                                (UNSORTED OR SORTED) OBSERVATIONS.
9314C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
9315C                                IN THE VECTOR X.
9316C     OUTPUT ARGUMENTS--XRELSD = THE SINGLE PRECISION VALUE OF THE
9317C                                COMPUTED SAMPLE RELATIVE STANDARD DEVIATION.
9318C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
9319C             SAMPLE RELATIVE STANDARD DEVIATION.
9320C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
9321C                   OF N FOR THIS SUBROUTINE.
9322C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
9323C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
9324C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9325C     LANGUAGE--ANSI FORTRAN (1977)
9326C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
9327C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 47, 233.
9328C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
9329C                 EDITION 6, 1967, PAGES 62-65.
9330C     WRITTEN BY--JAMES J. FILLIBEN
9331C                 STATISTICAL ENGINEERING DIVISION
9332C                 INFORMATION TECHNOLOGY LABORATORY
9333C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
9334C                 GAITHERSBURG, MD 20899-8980
9335C                 PHONE--301-975-2855
9336C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9337C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
9338C     LANGUAGE--ANSI FORTRAN (1966)
9339C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
9340C                          DENOTED BY QUOTES RATHER THAN NH.
9341C     VERSION NUMBER--82.6
9342C     ORIGINAL VERSION--JUNE      1972.
9343C     UPDATED         --SEPTEMBER 1975.
9344C     UPDATED         --NOVEMBER  1975.
9345C     UPDATED         --AUGUST    1981.
9346C     UPDATED         --MAY       1982.
9347C     UPDATED         --FEBRUARY  1994. USE ABS OF MEAN
9348C
9349C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9350C
9351      CHARACTER*4 IWRITE
9352      CHARACTER*4 IBUGA3
9353      CHARACTER*4 IERROR
9354C
9355      CHARACTER*4 ISUBN1
9356      CHARACTER*4 ISUBN2
9357C
9358C---------------------------------------------------------------------
9359C
9360      DOUBLE PRECISION DN
9361      DOUBLE PRECISION DX
9362      DOUBLE PRECISION DSUM
9363      DOUBLE PRECISION DMEAN
9364      DOUBLE PRECISION DVAR
9365      DOUBLE PRECISION DSD
9366C
9367      DIMENSION X(*)
9368C
9369C-----COMMON----------------------------------------------------------
9370C
9371      INCLUDE 'DPCOP2.INC'
9372C
9373C-----START POINT-----------------------------------------------------
9374C
9375      ISUBN1='RELS'
9376      ISUBN2='D   '
9377      IERROR='NO'
9378C
9379      DMEAN=0.0D0
9380      DSD=0.0D0
9381C
9382      IF(IBUGA3.EQ.'OFF')GOTO90
9383      WRITE(ICOUT,999)
9384  999 FORMAT(1X)
9385      CALL DPWRST('XXX','BUG ')
9386      WRITE(ICOUT,51)
9387   51 FORMAT('***** AT THE BEGINNING OF RELSD--')
9388      CALL DPWRST('XXX','BUG ')
9389      WRITE(ICOUT,52)IBUGA3
9390   52 FORMAT('IBUGA3 = ',A4)
9391      CALL DPWRST('XXX','BUG ')
9392      WRITE(ICOUT,53)N
9393   53 FORMAT('N = ',I8)
9394      CALL DPWRST('XXX','BUG ')
9395      DO55I=1,N
9396      WRITE(ICOUT,56)I,X(I)
9397   56 FORMAT('I,X(I) = ',I8,E15.7)
9398      CALL DPWRST('XXX','BUG ')
9399   55 CONTINUE
9400   90 CONTINUE
9401C
9402C               *******************************************
9403C               **  COMPUTE RELATIVE STANDARD DEVIATION  **
9404C               *******************************************
9405C
9406C               ********************************************
9407C               **  STEP 1--                              **
9408C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
9409C               ********************************************
9410C
9411      AN=N
9412C
9413      IF(N.GE.1)GOTO119
9414      IERROR='YES'
9415      WRITE(ICOUT,999)
9416      CALL DPWRST('XXX','BUG ')
9417      WRITE(ICOUT,111)
9418  111 FORMAT('***** ERROR IN RELSD--')
9419      CALL DPWRST('XXX','BUG ')
9420      WRITE(ICOUT,112)
9421  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
9422      CALL DPWRST('XXX','BUG ')
9423      WRITE(ICOUT,113)
9424  113 FORMAT('      IN THE VARIABLE FOR WHICH')
9425      CALL DPWRST('XXX','BUG ')
9426      WRITE(ICOUT,114)
9427  114 FORMAT('      THE RELATIVE STANDARD DEVIATION IS TO BE ',
9428     1'COMPUTED')
9429      CALL DPWRST('XXX','BUG ')
9430      WRITE(ICOUT,115)
9431  115 FORMAT('      MUST BE 1 OR LARGER.')
9432      CALL DPWRST('XXX','BUG ')
9433      WRITE(ICOUT,116)
9434  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
9435      CALL DPWRST('XXX','BUG ')
9436      WRITE(ICOUT,117)N
9437  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
9438     1'.')
9439      CALL DPWRST('XXX','BUG ')
9440      GOTO9000
9441  119 CONTINUE
9442C
9443      IF(N.EQ.1)GOTO120
9444      GOTO129
9445  120 CONTINUE
9446      WRITE(ICOUT,999)
9447      CALL DPWRST('XXX','BUG ')
9448      WRITE(ICOUT,121)
9449  121 FORMAT('***** NON-FATAL DIAGNOSTIC IN RELSD--',
9450     1'THE SECOND INPUT ARGUMENT (N) HAS THE VALUE 1')
9451      CALL DPWRST('XXX','BUG ')
9452      XRELSD=0.0
9453      GOTO9000
9454  129 CONTINUE
9455C
9456      HOLD=X(1)
9457      DO135I=2,N
9458      IF(X(I).NE.HOLD)GOTO139
9459  135 CONTINUE
9460      WRITE(ICOUT,999)
9461      CALL DPWRST('XXX','BUG ')
9462      WRITE(ICOUT,136)HOLD
9463  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN RELSD--',
9464     1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
9465      CALL DPWRST('XXX','BUG ')
9466      XRELSD=0.0
9467      GOTO9000
9468  139 CONTINUE
9469C
9470C               ************************************************
9471C               **  STEP 2--                                  **
9472C               **  COMPUTE THE RELATIVE STANDARD DEVIATION.  **
9473C               ************************************************
9474C
9475      DN=N
9476      DSUM=0.0D0
9477      DO200I=1,N
9478      DX=X(I)
9479      DSUM=DSUM+DX
9480  200 CONTINUE
9481      DMEAN=DSUM/DN
9482      XMEAN=DMEAN
9483C
9484      DSUM=0.0D0
9485      DO300I=1,N
9486      DX=X(I)
9487      DSUM=DSUM+(DX-DMEAN)**2
9488  300 CONTINUE
9489      DVAR=DSUM/(DN-1.0D0)
9490      DSD=0.0D0
9491      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
9492CCCCC MODIFY FOLLOWING LINE.  FEBRUARY 1994.
9493CCCCC XRELSD=100.0D0*DSD/DMEAN
9494      XRELSD=100.0D0*DSD/ABS(DMEAN)
9495C
9496C               *******************************
9497C               **  STEP 3--                 **
9498C               **  WRITE OUT A LINE         **
9499C               **  OF SUMMARY INFORMATION.  **
9500C               *******************************
9501C
9502      IF(IFEEDB.EQ.'OFF')GOTO890
9503      IF(IWRITE.EQ.'OFF')GOTO890
9504      WRITE(ICOUT,999)
9505      CALL DPWRST('XXX','BUG ')
9506      WRITE(ICOUT,811)N,XRELSD
9507  811 FORMAT('THE RELATIVE STANDARD DEVIATION OF THE ',I8,
9508     1' OBSERVATIONS = ',E15.7,' PERCENT')
9509      CALL DPWRST('XXX','BUG ')
9510  890 CONTINUE
9511C
9512C               *****************
9513C               **  STEP 90--  **
9514C               **  EXIT.      **
9515C               *****************
9516C
9517 9000 CONTINUE
9518      IF(IBUGA3.EQ.'OFF')GOTO9090
9519      WRITE(ICOUT,999)
9520      CALL DPWRST('XXX','BUG ')
9521      WRITE(ICOUT,9011)
9522 9011 FORMAT('***** AT THE END       OF RELSD--')
9523      CALL DPWRST('XXX','BUG ')
9524      WRITE(ICOUT,9012)IBUGA3,IERROR
9525 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
9526      CALL DPWRST('XXX','BUG ')
9527      WRITE(ICOUT,9013)N
9528 9013 FORMAT('N = ',I8)
9529      CALL DPWRST('XXX','BUG ')
9530      WRITE(ICOUT,9014)DMEAN,DSD
9531 9014 FORMAT('DMEAN,DSD = ',2D15.7)
9532      CALL DPWRST('XXX','BUG ')
9533      WRITE(ICOUT,9015)XRELSD
9534 9015 FORMAT('XRELSD = ',E15.7)
9535      CALL DPWRST('XXX','BUG ')
9536 9090 CONTINUE
9537C
9538      RETURN
9539      END
9540      SUBROUTINE REPEAZ(Y,X,XIDTEM,TEMP,N,IWRITE,XREP,
9541     1ISUBRO,IBUGA3,IERROR)
9542C
9543C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE REPEATABILITY
9544C              STANDARD DEVIATION OF THE DATA IN THE INPUT VECTOR Y
9545C              WITH LAB ID VECTOR X.  THE REPEATABILITY STANDARD
9546C              DEVIATION IS DEFINED AS:
9547C
9548C                 Sr = SQRT(SUM[i=1 to p][s(i)**2/p]
9549C
9550C              WITH
9551C                 p      = NUMBER OF LABS
9552C                 s(i)   = STANDARD DEVIATION OF GROUP i.
9553C
9554C     INPUT  ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR OF
9555C                                (UNSORTED OR SORTED) OBSERVATIONS.
9556C                     --X      = THE SINGLE PRECISION VECTOR OF
9557C                                GROUP ID's.
9558C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
9559C                                IN THE VECTOR Y.
9560C     OUTPUT ARGUMENTS--XREP   = THE SINGLE PRECISION VALUE OF THE
9561C                                COMPUTED SAMPLE REPEATABILITY SD.
9562C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
9563C             SAMPLE REPEATABILITY SD.
9564C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
9565C                   OF N FOR THIS SUBROUTINE.
9566C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, DISTIN, SD.
9567C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
9568C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9569C     LANGUAGE--ANSI FORTRAN (1977)
9570C     REFERENCES--"Standard Practice for Conducting an
9571C                 Interlaboratory Study to Determine the Precision
9572C                 of a Test Method", ASTM International,
9573C                 100 Barr Harbor Drive, PO BOX C700,
9574C                 West Conshohoceken, PA 19428-2959, USA.
9575C                 This document is in support of
9576C                 ASTM Standard E 691 - 99.
9577C     WRITTEN BY--JAMES J. FILLIBEN
9578C                 STATISTICAL ENGINEERING DIVISION
9579C                 INFORMATION TECHNOLOGY LABORATORY
9580C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
9581C                 GAITHERSBURG, MD 20899-8980
9582C                 PHONE--301-975-2855
9583C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9584C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
9585C     LANGUAGE--ANSI FORTRAN (1977)
9586C     VERSION NUMBER--2005.2
9587C     ORIGINAL VERSION--FEBRUARY  2005.
9588C     UPDATED         --NOVEMBER  2009. MODIFY NAME TO AVOID CONFLICT
9589C                                       WITH INTRINSIC REPEAT FUNCTION
9590C                                       ON SOME FORTRAN 90 COMPILERS
9591C
9592C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9593C
9594      CHARACTER*4 IWRITE
9595      CHARACTER*4 IBUGA3
9596      CHARACTER*4 ISUBRO
9597      CHARACTER*4 IERROR
9598C
9599      CHARACTER*4 ISUBN1
9600      CHARACTER*4 ISUBN2
9601C
9602C---------------------------------------------------------------------
9603C
9604      DOUBLE PRECISION DSUM
9605C
9606      DIMENSION Y(*)
9607      DIMENSION X(*)
9608      DIMENSION XIDTEM(*)
9609      DIMENSION TEMP(*)
9610C
9611C-----COMMON----------------------------------------------------------
9612C
9613      INCLUDE 'DPCOP2.INC'
9614C
9615C-----START POINT-----------------------------------------------------
9616C
9617      ISUBN1='REPE'
9618      ISUBN2='AT  '
9619      IERROR='NO'
9620C
9621      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PEAT')THEN
9622        WRITE(ICOUT,999)
9623  999   FORMAT(1X)
9624        CALL DPWRST('XXX','BUG ')
9625        WRITE(ICOUT,51)
9626   51   FORMAT('***** AT THE BEGINNING OF REPEAT--')
9627        CALL DPWRST('XXX','BUG ')
9628        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
9629   52   FORMAT('IBUGA3,ISUBRO,N = ',A4,1X,A4,1X,I8)
9630        CALL DPWRST('XXX','BUG ')
9631        DO55I=1,N
9632          WRITE(ICOUT,56)I,Y(I),X(I)
9633   56     FORMAT('I,Y(I),X(I) = ',I8,2E15.7)
9634          CALL DPWRST('XXX','BUG ')
9635   55   CONTINUE
9636      ENDIF
9637C
9638C               **********************
9639C               **  COMPUTE REPEAT  **
9640C               ********************
9641C
9642C               ********************************************
9643C               **  STEP 1--                              **
9644C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
9645C               ********************************************
9646C
9647      AN=N
9648C
9649      IF(N.LE.1)THEN
9650        IERROR='YES'
9651        WRITE(ICOUT,999)
9652        CALL DPWRST('XXX','BUG ')
9653        WRITE(ICOUT,111)
9654  111   FORMAT('***** ERROR IN COMPUTING REPEATABILITY SD--')
9655        CALL DPWRST('XXX','BUG ')
9656        WRITE(ICOUT,112)
9657  112   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS IN THE')
9658        CALL DPWRST('XXX','BUG ')
9659        WRITE(ICOUT,114)
9660  114   FORMAT('      VARIABLES FOR WHICH THE REPEATABILITY SD IS ')
9661        CALL DPWRST('XXX','BUG ')
9662        WRITE(ICOUT,115)
9663  115   FORMAT('      TO BE COMPUTED MUST BE 2 OR LARGER.')
9664        CALL DPWRST('XXX','BUG ')
9665        WRITE(ICOUT,116)
9666  116   FORMAT('      SUCH WAS NOT THE CASE HERE.')
9667        CALL DPWRST('XXX','BUG ')
9668        WRITE(ICOUT,117)N
9669  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
9670        CALL DPWRST('XXX','BUG ')
9671        IERROR='YES'
9672        GOTO9000
9673      ENDIF
9674C
9675C               ****************************************************
9676C               **  STEP 2--                                      **
9677C               **  COMPUTE THE REPEATABILTY STANDARD DEVIATION.  **
9678C               ****************************************************
9679C
9680      IWRITE='OFF'
9681      CALL DISTIN(X,N,IWRITE,XIDTEM,NUMSET,IBUGA3,IERROR)
9682      CALL SORT(XIDTEM,NUMSET,XIDTEM)
9683C
9684      IF(NUMSET.LT.1)THEN
9685        WRITE(ICOUT,999)
9686        CALL DPWRST('XXX','BUG ')
9687        WRITE(ICOUT,111)
9688        CALL DPWRST('XXX','BUG ')
9689        WRITE(ICOUT,192)
9690  192   FORMAT('      NUMBER OF LABS    NUMSET < 1')
9691        CALL DPWRST('XXX','BUG ')
9692        IERROR='YES'
9693        GOTO9000
9694      ENDIF
9695C
9696      AN=N
9697      ANUMSE=NUMSET
9698C
9699      DSUM=0.0D0
9700      J=0
9701      DO1110ISET1=1,NUMSET
9702        K=0
9703        DO1130I=1,N
9704          IF(XIDTEM(ISET1).EQ.X(I))THEN
9705            K=K+1
9706            TEMP(K)=Y(I)
9707          ENDIF
9708 1130   CONTINUE
9709        NTEMP=K
9710        CALL SD(TEMP,NTEMP,IWRITE,XSD,IBUGA3,IERROR)
9711        DSUM=DSUM + DBLE(XSD)**2
9712        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PEAT')THEN
9713          WRITE(ICOUT,1131)ISET1,NTEMP,XSD
9714 1131     FORMAT('***** GROUP ',I8,': N, SD = ',I8,2X,G15.7)
9715          CALL DPWRST('XXX','BUG ')
9716        ENDIF
9717 1110 CONTINUE
9718C
9719      XREP=REAL(DSQRT(DSUM/DBLE(NUMSET)))
9720C
9721C               *******************************
9722C               **  STEP 3--                 **
9723C               **  WRITE OUT A LINE         **
9724C               **  OF SUMMARY INFORMATION.  **
9725C               *******************************
9726C
9727      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
9728        WRITE(ICOUT,999)
9729        CALL DPWRST('XXX','BUG ')
9730        WRITE(ICOUT,811)XREP
9731  811   FORMAT('THE REPEATABILITY STANDARD DEVIATION = ',E15.7)
9732        CALL DPWRST('XXX','BUG ')
9733      ENDIF
9734C
9735C               *****************
9736C               **  STEP 90--  **
9737C               **  EXIT.      **
9738C               *****************
9739C
9740 9000 CONTINUE
9741      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PEAT')THEN
9742        WRITE(ICOUT,999)
9743        CALL DPWRST('XXX','BUG ')
9744        WRITE(ICOUT,9011)
9745 9011   FORMAT('***** AT THE END       OF REPEAT--')
9746        CALL DPWRST('XXX','BUG ')
9747        WRITE(ICOUT,9012)IBUGA3,ISUBRO,IERROR
9748 9012   FORMAT('IBUGA3,ISUBRO,IERROR = ',A4,2X,A4,2X,A4)
9749        CALL DPWRST('XXX','BUG ')
9750        WRITE(ICOUT,9013)N,NUMSET
9751 9013   FORMAT('N,NUMSET = ',I8,1X,I8)
9752        CALL DPWRST('XXX','BUG ')
9753        WRITE(ICOUT,9015)XREP
9754 9015   FORMAT('XREP = ',E15.7)
9755        CALL DPWRST('XXX','BUG ')
9756      ENDIF
9757C
9758      RETURN
9759      END
9760      SUBROUTINE REPLAC(X,Z,NX,VAL,NVAL,IWRITE,Y,ICASE,
9761     1                  ISUBRO,IBUGA3,IERROR)
9762C
9763C     PURPOSE--THIS COMMAND IS A VARIANT OF THE MATCH COMMAND.
9764C              THE SYNTAX
9765C                  LET Y2 = REPLACE GROUPID GROUP2 Y1
9766C              DOES THE FOLLOWING:
9767C              1) IT MATCHES THE VALUES IN GROUP2 AGAINST
9768C                 GROUPID AND RETURNS THE INDICES OF THE
9769C                 MATCHING ROWS FOR THE GROUPID ARRAY.
9770C              2) THE INDEX IS USED TO ACCESS THE CORRESPONDING
9771C                 VALUE IN THE Y1 ARRAY.
9772C              3) THE CORRESPONDING ROW OF Y2 IS REPLACED WITH
9773C                 THE Y1 VALUE.
9774C              NOTE THAT Y2, GROUPID, AND Y1 SHOULD HAVE THE
9775C              SAME LENGTH.  ALSO, IT IS ASSUMED THAT Y1
9776C              ALREADY EXISTS.  THIS SHOULD BE CHECKED FOR BEFORE
9777C              CALLING THIS ROUTINE.
9778C
9779C              THE SHORTHAND SYNTAX
9780C                  LET Y2 = REPLACE GROUPID GROUP
9781C              SIMPLY ASSIGNS A VALUE OF 1 IN THE CORRESPONDING
9782C              ROW OF Y2 (THIS IS A CONVENIENT SYNTAX FOR
9783C              CREATING A TAG VARIABLE).  THIS CASE IS IDENTIFIED
9784C              WITH THE "ICASE=INDE" OPTION.
9785C     WRITTEN BY--JAMES J. FILLIBEN
9786C                 STATISTICAL ENGINEERING DIVISION
9787C                 INFORMATION TECHNOLOGY LABORATORY
9788C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
9789C                 GAITHERSBURG, MD 20899-8980
9790C                 PHONE--301-975-2855
9791C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9792C           OF THE NATIONAL BUREAU OF STANDARDS.
9793C     LANGUAGE--ANSI FORTRAN (1977)
9794C     VERSION NUMBER--2006/2
9795C     ORIGINAL VERSION--FEBRUARY  2006.
9796C
9797C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES----------------
9798C
9799      CHARACTER*4 ICASE
9800      CHARACTER*4 IWRITE
9801      CHARACTER*4 ISUBRO
9802      CHARACTER*4 IBUGA3
9803      CHARACTER*4 IERROR
9804C
9805      CHARACTER*4 ISUBN1
9806      CHARACTER*4 ISUBN2
9807C
9808C
9809C------------------------------------------------------------------
9810C
9811      DIMENSION X(*)
9812      DIMENSION Y(*)
9813      DIMENSION Z(*)
9814      DIMENSION VAL(*)
9815C
9816C-----COMMOMN---------------------------------------------------
9817C
9818      INCLUDE 'DPCOP2.INC'
9819C
9820C-----START POINT--------------------------------------------------
9821C
9822      ISUBN1='MATC'
9823      ISUBN2='H   '
9824      IERROR='NO'
9825C
9826      IF(ISUBRO.EQ.'PLAC' .OR. IBUGA3.EQ.'ON')THEN
9827        WRITE(ICOUT,999)
9828  999   FORMAT(1X)
9829        CALL DPWRST('XXX','BUG ')
9830        WRITE(ICOUT,51)
9831   51   FORMAT('***** AT THE BEGINNING OF REPLAC--')
9832        CALL DPWRST('XXX','BUG ')
9833        WRITE(ICOUT,52)IBUGA3,IWRITE,NX,NVAL
9834   52   FORMAT('IBUGA3,IWRITE,NX,NVAL = ',2(A4,2X),2I8)
9835        CALL DPWRST('XXX','BUG ')
9836        DO55I=1,NX
9837          WRITE(ICOUT,56)I,X(I),Z(I),Y(I)
9838   56     FORMAT('I,X(I),Z(I),Y(I) = ',I8,3G15.7)
9839          CALL DPWRST('XXX','BUG ')
9840   55   CONTINUE
9841        DO65I=1,NVAL
9842          WRITE(ICOUT,66)I,VAL(I)
9843   66     FORMAT('I,VAL(I) = ',I8,G15.7)
9844          CALL DPWRST('XXX','BUG ')
9845   65   CONTINUE
9846      ENDIF
9847C
9848C               ****************************************
9849C               **  COMPUTE INDICES OF MATCHING VALUES *
9850C               ****************************************
9851C
9852      DO100I=1,NVAL
9853        VALTMP=VAL(I)
9854        INDTMP=1
9855        YDIFF=CPUMAX
9856        DO200J=1,NX
9857          APROD=X(J)*VALTMP
9858          TERM1=MAX(X(J),VALTMP)
9859          TERM2=MIN(X(J),VALTMP)
9860          IF(APROD.GT.0.0)THEN
9861            ADIFF=ABS(ABS(TERM1) - ABS(TERM2))
9862          ELSEIF(APROD.LT.0.0)THEN
9863            ADIFF=TERM1+ABS(TERM2)
9864          ELSE
9865            ADIFF=ABS(TERM1-TERM2)
9866          ENDIF
9867          IF(ADIFF.LT.YDIFF)THEN
9868            INDTMP=J
9869            YDIFF=ADIFF
9870          ENDIF
9871  200   CONTINUE
9872        IF(ICASE.EQ.'INDE')THEN
9873          Y(INDTMP)=1.0
9874        ELSE
9875          Y(INDTMP)=Z(INDTMP)
9876        ENDIF
9877  100 CONTINUE
9878C
9879C               *****************
9880C               **  STEP 90--  **
9881C               **  EXIT.      **
9882C               *****************
9883C
9884      IF(ISUBRO.EQ.'PLAC' .OR. IBUGA3.EQ.'ON')THEN
9885        WRITE(ICOUT,999)
9886        CALL DPWRST('XXX','BUG ')
9887        WRITE(ICOUT,9011)
9888 9011   FORMAT('***** AT THE END       OF REPLAC--')
9889        CALL DPWRST('XXX','BUG ')
9890        WRITE(ICOUT,9012)IBUGA3,IERROR,NX
9891 9012   FORMAT('IBUGA3,IERROR,NX = ',2(A4,2X),I8)
9892        CALL DPWRST('XXX','BUG ')
9893        DO9015I=1,NX
9894          WRITE(ICOUT,9016)I,X(I),Z(I),Y(I)
9895 9016     FORMAT('I,X(I),Z(I),Y(I) = ',I8,3G15.7)
9896          CALL DPWRST('XXX','BUG ')
9897 9015   CONTINUE
9898      ENDIF
9899C
9900      RETURN
9901      END
9902      SUBROUTINE REPROD(Y,X,XIDTEM,TEMP,TEMP2,N,IWRITE,XREP,
9903     1ISUBRO,IBUGA3,IERROR)
9904C
9905C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE REPRODUCABILITY
9906C              STANDARD DEVIATION OF THE DATA IN THE INPUT VECTOR Y
9907C              WITH LAB ID VECTOR X.  THE REPRODUCABILITY STANDARD
9908C              DEVIATION IS DEFINED AS:
9909C
9910C                 SR = MAX(SR*,Sr)
9911C
9912C              WITH
9913C
9914C                 SR* = SQRT(s(x)**2 + (Sr**2*(n-1)/n)
9915C
9916C                 s(xbar)    = STANDARD DEVIATION OF THE CELL
9917C                              AVERAGES
9918C                 n          = CELL SAMPLE SIZE (CURRENTLY, EQUAL
9919C                              CELL SIZES EXPECTED)
9920C
9921C              AND Sr DENOTING THE REPEATABILITY STANDARD DEVIATION
9922C
9923C                 Sr = SQRT(SUM[i=1 to p][s(i)**2/p]
9924C
9925C              WITH
9926C                 p      = NUMBER OF LABS
9927C                 s(i)   = STANDARD DEVIATION OF GROUP i.
9928C
9929C     INPUT  ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR OF
9930C                                (UNSORTED OR SORTED) OBSERVATIONS.
9931C                     --X      = THE SINGLE PRECISION VECTOR OF
9932C                                GROUP ID's.
9933C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
9934C                                IN THE VECTOR Y.
9935C     OUTPUT ARGUMENTS--XREP   = THE SINGLE PRECISION VALUE OF THE
9936C                                COMPUTED SAMPLE REPRODUCABILITY SD.
9937C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
9938C             SAMPLE REPRODUCABILITY SD.
9939C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
9940C                   OF N FOR THIS SUBROUTINE.
9941C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, DISTIN, SD.
9942C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
9943C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9944C     LANGUAGE--ANSI FORTRAN (1977)
9945C     REFERENCES--"Standard Practice for Conducting an
9946C                 Interlaboratory Study to Determine the Precision
9947C                 of a Test Method", ASTM International,
9948C                 100 Barr Harbor Drive, PO BOX C700,
9949C                 West Conshohoceken, PA 19428-2959, USA.
9950C                 This document is in support of
9951C                 ASTM Standard E 691 - 99.
9952C     WRITTEN BY--JAMES J. FILLIBEN
9953C                 STATISTICAL ENGINEERING DIVISION
9954C                 INFORMATION TECHNOLOGY LABORATORY
9955C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
9956C                 GAITHERSBURG, MD 20899-8980
9957C                 PHONE--301-975-2855
9958C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9959C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
9960C     LANGUAGE--ANSI FORTRAN (1977)
9961C     VERSION NUMBER--2005.2
9962C     ORIGINAL VERSION--FEBRUARY  2005.
9963C
9964C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9965C
9966      CHARACTER*4 IWRITE
9967      CHARACTER*4 IBUGA3
9968      CHARACTER*4 ISUBRO
9969      CHARACTER*4 IERROR
9970C
9971      CHARACTER*4 ISUBN1
9972      CHARACTER*4 ISUBN2
9973C
9974C---------------------------------------------------------------------
9975C
9976      DOUBLE PRECISION DSUM
9977      DOUBLE PRECISION DXREP
9978      DOUBLE PRECISION XREPRD
9979C
9980      DIMENSION Y(*)
9981      DIMENSION X(*)
9982      DIMENSION XIDTEM(*)
9983      DIMENSION TEMP(*)
9984      DIMENSION TEMP2(*)
9985C
9986C-----COMMON----------------------------------------------------------
9987C
9988      INCLUDE 'DPCOP2.INC'
9989C
9990C-----START POINT-----------------------------------------------------
9991C
9992      ISUBN1='REPE'
9993      ISUBN2='AT  '
9994      IERROR='NO'
9995C
9996      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PROD')THEN
9997        WRITE(ICOUT,999)
9998  999   FORMAT(1X)
9999        CALL DPWRST('XXX','BUG ')
10000        WRITE(ICOUT,51)
10001   51   FORMAT('***** AT THE BEGINNING OF REPROD--')
10002        CALL DPWRST('XXX','BUG ')
10003        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
10004   52   FORMAT('IBUGA3,ISUBRO,N = ',A4,1X,A4,1X,I8)
10005        CALL DPWRST('XXX','BUG ')
10006        DO55I=1,N
10007          WRITE(ICOUT,56)I,Y(I),X(I)
10008   56     FORMAT('I,Y(I),X(I) = ',I8,2E15.7)
10009          CALL DPWRST('XXX','BUG ')
10010   55   CONTINUE
10011      ENDIF
10012C
10013C               **********************
10014C               **  COMPUTE REPROD  **
10015C               **********************
10016C
10017C               ********************************************
10018C               **  STEP 1--                              **
10019C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
10020C               ********************************************
10021C
10022      AN=N
10023C
10024      IF(N.LE.1)THEN
10025        IERROR='YES'
10026        WRITE(ICOUT,999)
10027        CALL DPWRST('XXX','BUG ')
10028        WRITE(ICOUT,111)
10029  111   FORMAT('***** ERROR IN COMPUTING REPRODUCABILITY SD--')
10030        CALL DPWRST('XXX','BUG ')
10031        WRITE(ICOUT,112)
10032  112   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS IN THE')
10033        CALL DPWRST('XXX','BUG ')
10034        WRITE(ICOUT,114)
10035  114   FORMAT('      VARIABLES FOR WHICH THE REPRODUCABILITY SD IS ')
10036        CALL DPWRST('XXX','BUG ')
10037        WRITE(ICOUT,115)
10038  115   FORMAT('      TO BE COMPUTED MUST BE 2 OR LARGER.')
10039        CALL DPWRST('XXX','BUG ')
10040        WRITE(ICOUT,116)
10041  116   FORMAT('      SUCH WAS NOT THE CASE HERE.')
10042        CALL DPWRST('XXX','BUG ')
10043        WRITE(ICOUT,117)N
10044  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
10045        CALL DPWRST('XXX','BUG ')
10046        IERROR='YES'
10047        GOTO9000
10048      ENDIF
10049C
10050C               ****************************************************
10051C               **  STEP 2--                                      **
10052C               **  COMPUTE THE REPRODABILTY STANDARD DEVIATION.  **
10053C               ****************************************************
10054C
10055      IWRITE='OFF'
10056      CALL DISTIN(X,N,IWRITE,XIDTEM,NUMSET,IBUGA3,IERROR)
10057      CALL SORT(XIDTEM,NUMSET,XIDTEM)
10058C
10059      IF(NUMSET.LT.1)THEN
10060        WRITE(ICOUT,999)
10061        CALL DPWRST('XXX','BUG ')
10062        WRITE(ICOUT,111)
10063        CALL DPWRST('XXX','BUG ')
10064        WRITE(ICOUT,192)
10065  192   FORMAT('      NUMBER OF LABS    NUMSET < 1')
10066        CALL DPWRST('XXX','BUG ')
10067        IERROR='YES'
10068        GOTO9000
10069      ENDIF
10070C
10071      AN=N
10072      ANUMSE=NUMSET
10073C
10074      DSUM=0.0D0
10075      J=0
10076      DO1110ISET1=1,NUMSET
10077        K=0
10078        DO1130I=1,N
10079          IF(XIDTEM(ISET1).EQ.X(I))THEN
10080            K=K+1
10081            TEMP(K)=Y(I)
10082          ENDIF
10083 1130   CONTINUE
10084        NTEMP=K
10085C
10086        IF(ISET1.EQ.1)THEN
10087          NHOLD=NTEMP
10088        ELSE
10089          IF(NTEMP.NE.NHOLD)THEN
10090            WRITE(ICOUT,999)
10091            CALL DPWRST('XXX','BUG ')
10092            WRITE(ICOUT,111)
10093            CALL DPWRST('XXX','BUG ')
10094            WRITE(ICOUT,1131)ISET1,NHOLD,NTEMP
10095 1131       FORMAT('      FOR GROUP ',I8,', ',I8,
10096     1             'ELEMENTS EXPECTED BUT ',I8,' ELEMENTS FOUND.')
10097            CALL DPWRST('XXX','BUG ')
10098            IERROR='YES'
10099            GOTO9000
10100          ENDIF
10101        ENDIF
10102C
10103        CALL MEAN(TEMP,NTEMP,IWRITE,XMEAN,IBUGA3,IERROR)
10104        CALL SD(TEMP,NTEMP,IWRITE,XSD,IBUGA3,IERROR)
10105        DSUM=DSUM + DBLE(XSD)**2
10106        TEMP2(ISET1)=XMEAN
10107        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PROD')THEN
10108          WRITE(ICOUT,1151)NUMSET,XSD
10109 1151     FORMAT('***** GROUP ',I8,': MEAN, SD = ',2G15.7)
10110          CALL DPWRST('XXX','BUG ')
10111        ENDIF
10112 1110 CONTINUE
10113C
10114      DXREP=DSUM/DBLE(NUMSET)
10115      CALL SD(TEMP2,NUMSET,IWRITE,SXBAR,IBUGA3,IERROR)
10116      XREPRD=DSQRT(DBLE(SXBAR**2) + DXREP*DBLE(NHOLD-1)/DBLE(NHOLD))
10117      XREP=REAL(MAX(DSQRT(DXREP),XREPRD))
10118C
10119C               *******************************
10120C               **  STEP 3--                 **
10121C               **  WRITE OUT A LINE         **
10122C               **  OF SUMMARY INFORMATION.  **
10123C               *******************************
10124C
10125      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
10126        WRITE(ICOUT,999)
10127        CALL DPWRST('XXX','BUG ')
10128        WRITE(ICOUT,811)XREP
10129  811   FORMAT('THE REPRODUCABILITY STANDARD DEVIATION = ',E15.7)
10130        CALL DPWRST('XXX','BUG ')
10131      ENDIF
10132C
10133C               *****************
10134C               **  STEP 90--  **
10135C               **  EXIT.      **
10136C               *****************
10137C
10138 9000 CONTINUE
10139      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'PROD')THEN
10140        WRITE(ICOUT,999)
10141        CALL DPWRST('XXX','BUG ')
10142        WRITE(ICOUT,9011)
10143 9011   FORMAT('***** AT THE END       OF REPROD--')
10144        CALL DPWRST('XXX','BUG ')
10145        WRITE(ICOUT,9012)IBUGA3,ISUBRO,IERROR
10146 9012   FORMAT('IBUGA3,ISUBRO,IERROR = ',A4,2X,A4,2X,A4)
10147        CALL DPWRST('XXX','BUG ')
10148        WRITE(ICOUT,9013)N,NUMSET
10149 9013   FORMAT('N,NUMSET = ',I8,1X,I8)
10150        CALL DPWRST('XXX','BUG ')
10151        WRITE(ICOUT,9015)XREP,DXREP,XREPRD
10152 9015   FORMAT('XREP,DXREP,XREPRD = ',3G15.7)
10153        CALL DPWRST('XXX','BUG ')
10154      ENDIF
10155C
10156      RETURN
10157      END
10158      SUBROUTINE RESULT(NR,N,X,F,G,A,P,ITNCNT,IFLG)
10159      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
10160C
10161C PURPOSE
10162C -------
10163C PRINT INFORMATION  (FOR OPTIMIZE COMMAND)
10164C
10165C PARAMETERS
10166C ----------
10167C NR           --> ROW DIMENSION OF MATRIX
10168C N            --> DIMENSION OF PROBLEM
10169C X(N)         --> ITERATE X[K]
10170C F            --> FUNCTION VALUE AT X[K]
10171C G(N)         --> GRADIENT AT X[K]
10172C A(N,N)       --> HESSIAN AT X[K]
10173C P(N)         --> STEP TAKEN
10174C ITNCNT       --> ITERATION NUMBER K
10175C IFLG         --> FLAG CONTROLLING INFO TO PRINT
10176C IPR          --> DEVICE TO WHICH TO SEND OUTPUT
10177C
10178      DIMENSION X(N),G(N),P(N),A(NR,1)
10179C
10180C-----COMMON VARIABLES (GENERAL)--------------------------------------
10181C
10182      INCLUDE 'DPCOP2.INC'
10183C
10184C-----START POINT-----------------------------------------------------
10185C
10186C PRINT ITERATION NUMBER
10187      WRITE(ICOUT,903) ITNCNT
10188      CALL DPWRST('XXX','BUG ')
10189      IF(IFLG.EQ.0) GO TO 120
10190C
10191C PRINT STEP
10192      WRITE(ICOUT,907)
10193      CALL DPWRST('XXX','BUG ')
10194      WRITE(ICOUT,905) (P(I),I=1,MIN(5,N))
10195      CALL DPWRST('XXX','BUG ')
10196C
10197C PRINT CURRENT ITERATE
10198  120 CONTINUE
10199      WRITE(ICOUT,904)
10200      CALL DPWRST('XXX','BUG ')
10201      WRITE(ICOUT,905) (X(I),I=1,MIN(5,N))
10202      CALL DPWRST('XXX','BUG ')
10203C
10204C PRINT FUNCTION VALUE
10205      WRITE(ICOUT,906)
10206      CALL DPWRST('XXX','BUG ')
10207      WRITE(ICOUT,905) F
10208      CALL DPWRST('XXX','BUG ')
10209C
10210C PRINT GRADIENT
10211      WRITE(ICOUT,908)
10212      CALL DPWRST('XXX','BUG ')
10213      WRITE(ICOUT,905) (G(I),I=1,MIN(5,N))
10214      CALL DPWRST('XXX','BUG ')
10215C
10216C PRINT HESSIAN FROM ITERATION K
10217      IF(IFLG.EQ.0) GO TO 140
10218      WRITE(ICOUT,901)
10219      CALL DPWRST('XXX','BUG ')
10220      DO 130 I=1,N
10221        WRITE(ICOUT,900) I
10222        CALL DPWRST('XXX','BUG ')
10223        WRITE(ICOUT,902) (A(I,J),J=1,I)
10224        CALL DPWRST('XXX','BUG ')
10225  130 CONTINUE
10226        WRITE(ICOUT,902) (A(I,J),J=1,I)
10227        CALL DPWRST('XXX','BUG ')
10228C
10229  900 FORMAT('****** FROM RESULT     ROW',I5)
10230  901 FORMAT('****** FROM RESULT       HESSIAN AT X(K)')
10231  902 FORMAT('****** FROM RESULT       ',5(2X,E20.13))
10232  903 FORMAT('****** FROM RESULT    ITERATE K=',I5)
10233  904 FORMAT('****** FROM RESULT       X(K)')
10234  905 FORMAT('****** FROM RESULT       ',5(2X,E20.13))
10235  906 FORMAT('****** FROM RESULT       FUNCTION AT X(K)')
10236  907 FORMAT('****** FROM RESULT       STEP')
10237  908 FORMAT('****** FROM RESULT       GRADIENT AT X(K)')
10238  140 RETURN
10239      END
10240      SUBROUTINE REVERS(X,NX,IWRITE,Y,YTEMP,IBUGA3,IERROR)
10241C
10242C     PURPOSE--REVERSE THE ORDER OF AN ARRAY.  THAT IS,
10243C              Y(1)=X(N), ..., Y(N)=X(1).
10244C     NOTE--IT IS PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y(.)
10245C           BEING IDENTICAL TO THE INPUT VECTOR X(.).
10246C     WRITTEN BY--JAMES J. FILLIBEN
10247C                 STATISTICAL ENGINEERING DIVISION
10248C                 INFORMATION TECHNOLOGY LABORATORY
10249C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10250C                 GAITHERSBURG, MD 20899-8980
10251C                 PHONE--301-975-2855
10252C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10253C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10254C     LANGUAGE--ANSI FORTRAN (1977)
10255C     VERSION NUMBER--98/5
10256C     ORIGINAL VERSION--MAY       1998.
10257C
10258C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10259C
10260      CHARACTER*4 IWRITE
10261      CHARACTER*4 IBUGA3
10262      CHARACTER*4 IERROR
10263C
10264      CHARACTER*4 ISUBN1
10265      CHARACTER*4 ISUBN2
10266C
10267C---------------------------------------------------------------------
10268C
10269      DIMENSION X(*)
10270      DIMENSION Y(*)
10271      DIMENSION YTEMP(*)
10272C
10273C-----COMMON----------------------------------------------------------
10274C
10275      INCLUDE 'DPCOP2.INC'
10276C
10277C-----START POINT-----------------------------------------------------
10278C
10279      ISUBN1='REVE'
10280      ISUBN2='RS  '
10281      IERROR='NO'
10282C
10283      IF(IBUGA3.EQ.'ON')THEN
10284        WRITE(ICOUT,999)
10285  999   FORMAT(1X)
10286        CALL DPWRST('XXX','BUG ')
10287        WRITE(ICOUT,51)
10288   51   FORMAT('***** AT THE BEGINNING OF REVERS--')
10289        CALL DPWRST('XXX','BUG ')
10290        WRITE(ICOUT,52)IBUGA3,IWRITE,NX
10291   52   FORMAT('IBUGA3,IWRITE,NX = ',2(A4,2X),I8)
10292        CALL DPWRST('XXX','BUG ')
10293        DO55I=1,NX
10294          WRITE(ICOUT,56)I,X(I)
10295   56     FORMAT('I,X(I) = ',I8,G15.7)
10296          CALL DPWRST('XXX','BUG ')
10297   55   CONTINUE
10298      ENDIF
10299C
10300C               **************************************
10301C               **  FLIP ORDER OF ARRAY             **
10302C               **************************************
10303C
10304      DO100I=1,NX
10305        IREV=NX-I+1
10306        YTEMP(I)=X(IREV)
10307  100 CONTINUE
10308      DO200I=1,NX
10309        Y(I)=YTEMP(I)
10310  200 CONTINUE
10311C
10312C               *****************
10313C               **  STEP 90--  **
10314C               **  EXIT.      **
10315C               *****************
10316C
10317      IF(IBUGA3.EQ.'ON')THEN
10318        WRITE(ICOUT,999)
10319        CALL DPWRST('XXX','BUG ')
10320        WRITE(ICOUT,9011)
10321 9011   FORMAT('***** AT THE END       OF REVERS--')
10322        CALL DPWRST('XXX','BUG ')
10323        DO9015I=1,NX
10324          WRITE(ICOUT,9016)I,X(I),Y(I)
10325 9016     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
10326          CALL DPWRST('XXX','BUG ')
10327 9015   CONTINUE
10328      ENDIF
10329C
10330      RETURN
10331      END
10332      SUBROUTINE REVRT(X, M)
10333C
10334C     ALGORITHM AS 97.1  APPL. STATIST. (1976) VOL.25, NO. 2
10335C
10336C     Inverse discrete Fourier transform in one dimension of real
10337C     data using complex transform subroutine FASTG.
10338C
10339C     X = array of Fourier components as output from subroutine FORRT,
10340C         type real, dimension M.
10341C     M = length of the inverse transform, must be a power of 2.
10342C     The minimum length is 8, maximum 2**21.
10343C
10344C     Auxiliary routines required: SCRAG & FASTG from AS 83, but
10345C     with SCRAG modified as described on page 168 of the paper for
10346C     this algorithm.
10347C
10348      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
10349      DOUBLE PRECISION X(M)
10350      DATA ZERO/0.0D0/, HALF/0.5D0/, ONE/1.0D0/, ONE5/1.5D0/,
10351     *      TWO/2.0D0/, FOUR/4.0D0/
10352C
10353C     Check for valid transform size.
10354C
10355      II = 8
10356      DO 2 K = 3, 21
10357      IPOW = K
10358      IF (II .EQ. M) GO TO 3
10359      II = II * 2
10360    2 CONTINUE
10361C
10362C     If this point is reached, an illegal size was specified.
10363C
10364      RETURN
10365    3 PIE = FOUR * ATAN(ONE)
10366      N = M / 2
10367      NN = N / 2
10368C
10369C     Undo the spectrum into that of two interleaved series.
10370C     First, the special cases.
10371C
10372      Z = X(1) + X(N+1)
10373      X(N+1) = X(1) - X(N+1)
10374      X(1) = Z
10375      NN1 = NN + 1
10376      NN2 = NN1 + N
10377      X(NN1) = TWO * X(NN1)
10378      X(NN2) = -TWO * X(NN2)
10379      Z = PIE / N
10380      BCOS = -TWO * (SIN(Z / TWO) **2)
10381      BSIN = SIN(Z)
10382      UN = ONE
10383      VN = ZERO
10384      DO 4 K = 2, NN
10385      Z = UN * BCOS + VN * BSIN + UN
10386      VN = VN * BCOS - UN * BSIN + VN
10387      SAVE1 = ONE5 - HALF * (Z * Z + VN * VN)
10388      UN = Z * SAVE1
10389      VN = VN * SAVE1
10390      KI = N + K
10391      L = N + 2 - K
10392      LI = N + L
10393      AN = X(K) + X(L)
10394      BN = X(KI) - X(LI)
10395      PN = X(K) - X(L)
10396      QN = X(KI) + X(LI)
10397      CN = UN * PN + VN * QN
10398      DN = UN * QN - VN * PN
10399      X(K) = AN - DN
10400      X(KI) = BN + CN
10401      X(L) = AN + DN
10402      X(LI) = CN - BN
10403    4 CONTINUE
10404C
10405C     Now do the inverse transform
10406C
10407      CALL FASTG(X, X(N+1), N, -1)
10408C
10409C     Now undo the order - the half arrays are already bit reversed;
10410C     bit reverse the whole array.
10411C
10412      CALL SCRAG(X, M, IPOW)
10413      RETURN
10414      END
10415      SUBROUTINE RIGCDF(DX,DGAMMA,DMU,DCDF)
10416C
10417C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
10418C              FUNCTION VALUE FOR THE RECIPROCAL INVERSE GAUSSIAN
10419C              DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU.
10420C              THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION IS
10421C              THE DISTRIBUTION OF Y = 1/X WHEN X HAS AN INVERSE
10422C              GAUSSIAN DISTRIBUTION.
10423C              THE FORMULA FOR THE CDF OF THE RECIROCAL INVERSE
10424C              GAUSIAN DISTRIBUTION IS:
10425C              F(X,GAMMA,MU) = NORCDF{-[1/(MU*X) - 1]*SQRT(GAMMA*X)} -
10426C              EXP[2*GAMMA/MU]*NORCDF{-[1/(MU*X) - 1]*SQRT(GAMMA*X)} -
10427C              X, GAMMA, MU > 0
10428C     NOTE--THE RECIPROCAL INVERSE GAUSSIA DISTRIBUTION CAN BE
10429C           COMPUTED IN TERMS OF THE INVERSE GAUSSIAN CDF:
10430C              RIGCDF(X,GAMMA,MU) = 1 - IGCDF(1/X,GAMMA,MU)
10431C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
10432C                                WHICH THE CUMULATIVE DISTRIBUTION
10433C                                FUNCTION IS TO BE EVALUATED.
10434C                                X SHOULD BE POSITIVE.
10435C                     --GAMMA  = THE SHAPE PARAMETER
10436C                                GAMMA SHOULD BE POSITIVE.
10437C                     --AMU    = THE SHAPE PARAMETER
10438C                                MU SHOULD BE POSITIVE.
10439C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
10440C                                DISTRIBUTION FUNCTION VALUE.
10441C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
10442C             FUNCTION VALUE CDF FOR THE RECIPROCAL INVERSE
10443C             GAUSSIAN DISTRIBUTION
10444C             WITH SHAPE PARAMETERS GAMMA AND MU
10445C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10446C     RESTRICTIONS--X SHOULD BE POSITIVE.
10447C                 --GAMMA SHOULD BE POSITIVE.
10448C     OTHER DATAPAC   SUBROUTINES NEEDED--IGCDF.
10449C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10450C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10451C     LANGUAGE--ANSI FORTRAN (1977)
10452C     REFERENCES--SAM SAUNDERS TALK, MAY 1990
10453C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
10454C                 DISTRIBUTIONS--1, 1970, PAGES
10455C     WRITTEN BY--JAMES J. FILLIBEN
10456C                 STATISTICAL ENGINEERING DIVISION
10457C                 INFORMATION TECHNOLOGY LABORATORY
10458C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10459C                 GAITHERSBURG, MD 20899-8980
10460C                 PHONE--301-975-2855
10461C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10462C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10463C     LANGUAGE--ANSI FORTRAN (1977)
10464C     VERSION NUMBER--90.6
10465C     ORIGINAL VERSION--MAY       1990.
10466C     UPDATED         --DECEMBER  2003. SUPPORT FOR GENERAL MU
10467C     UPDATED         --APRIL     2014. CONVERT TO DOUBLE PRECISION
10468C     UPDATED         --APRIL     2014. SUPPORT FOR CHAN PARAMETERIZATION
10469C                                       (THIS ACTUALLY DONE IN IGCDF)
10470C
10471C---------------------------------------------------------------------
10472C
10473      DOUBLE PRECISION DX
10474      DOUBLE PRECISION DGAMMA
10475      DOUBLE PRECISION DMU
10476      DOUBLE PRECISION DCDF
10477      DOUBLE PRECISION DX2
10478C
10479      INCLUDE 'DPCOP2.INC'
10480C
10481C-----START POINT-----------------------------------------------------
10482C
10483C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10484C
10485      DCDF=0.0D0
10486      IF(DGAMMA.LE.0.0D0)THEN
10487         WRITE(ICOUT,51)
10488   51    FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO RIGCDF ',
10489     1          'IS NON-POSITIVE.')
10490         CALL DPWRST('XXX','BUG ')
10491         WRITE(ICOUT,52)DGAMMA
10492   52    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
10493         CALL DPWRST('XXX','BUG ')
10494         GOTO9000
10495      ELSEIF(DMU.LE.0.0D0)THEN
10496         WRITE(ICOUT,71)
10497   71    FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO RIGCDF ',
10498     1          'IS NON-POSITIVE.')
10499         CALL DPWRST('XXX','BUG ')
10500         WRITE(ICOUT,52)DMU
10501         CALL DPWRST('XXX','BUG ')
10502         GOTO9000
10503      ENDIF
10504C
10505      IF(DX.LE.0.0D0)GOTO9000
10506C
10507      DX2=1.0D0/DX
10508      CALL IGCDF(DX2,DGAMMA,DMU,DCDF)
10509      DCDF=1.0D0 - DCDF
10510C
10511 9000 CONTINUE
10512      RETURN
10513      END
10514      SUBROUTINE RIGCHA(DX,DGAMMA,DMU,DHAZ)
10515C
10516C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE HAZARD
10517C              FUNCTION VALUE FOR THE RECIPROCAL INVERSE GAUSSIAN
10518C              DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU.
10519C              THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION IS
10520C              THE DISTRIBUTION OF Y = 1/X WHEN X HAS AN INVERSE
10521C              GAUSSIAN DISTRIBUTION.
10522C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
10523C                                WHICH THE PROBABILITY DENSITY
10524C                                FUNCTION IS TO BE EVALUATED.
10525C                                X SHOULD BE POSITIVE.
10526C                     --GAMMA  = THE SHAPE PARAMETER
10527C                                GAMMA SHOULD BE POSITIVE.
10528C                     --AMU    = THE SHAPE PARAMETER
10529C                                MU SHOULD BE POSITIVE.
10530C     OUTPUT ARGUMENTS--HAZ    = THE SINGLE PRECISION CUMULATIVE HAZARD
10531C                                FUNCTION VALUE.
10532C     OUTPUT--THE SINGLE PRECISION CUMULATIVE HAZARD
10533C             FUNCTION VALUE PDF FOR THE RECIPROCAL INVERSE GAUSSIAN
10534C             DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU
10535C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10536C     RESTRICTIONS--X SHOULD BE POSITIVE.
10537C                 --GAMMA AND MU SHOULD BE POSITIVE.
10538C     OTHER DATAPAC   SUBROUTINES NEEDED--RIGDF.
10539C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10540C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10541C     LANGUAGE--ANSI FORTRAN (1977)
10542C     REFERENCES--SAM SAUNDERS TALK, MAY 1990
10543C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
10544C                 DISTRIBUTIONS--1, 1970, PAGES
10545C     WRITTEN BY--JAMES J. FILLIBEN
10546C                 STATISTICAL ENGINEERING DIVISION
10547C                 INFORMATION TECHNOLOGY LABORATORY
10548C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10549C                 GAITHERSBURG, MD 20899-8980
10550C                 PHONE--301-975-2855
10551C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10552C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10553C     LANGUAGE--ANSI FORTRAN (1977)
10554C     VERSION NUMBER--98.6
10555C     ORIGINAL VERSION--APRIL     1998.
10556C     UPDATED         --DECEMBER  2003. SUPPORT FOR GENERAL MU
10557C     UPDATED         --APRIL     2014. CONVERT TO DOUBLE PRECISION
10558C     UPDATED         --APRIL     2014. SUPPORT FOR CHAN PARAMETERIZATION
10559C                                       (ACTUALLY DONE IN IGCDF ROUTINE)
10560C
10561C---------------------------------------------------------------------
10562C
10563      DOUBLE PRECISION DX
10564      DOUBLE PRECISION DGAMMA
10565      DOUBLE PRECISION DMU
10566      DOUBLE PRECISION DHAZ
10567      DOUBLE PRECISION DCDF
10568C
10569      INCLUDE 'DPCOP2.INC'
10570C
10571C-----START POINT-----------------------------------------------------
10572C
10573C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10574C
10575      DHAZ=0.0D0
10576      IF(DGAMMA.LE.0.0D0)THEN
10577         WRITE(ICOUT,51)
10578   51    FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO RIGCHA ',
10579     1          'IS NON-POSITIVE.')
10580         CALL DPWRST('XXX','BUG ')
10581         WRITE(ICOUT,52)DGAMMA
10582   52    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
10583         CALL DPWRST('XXX','BUG ')
10584         GOTO9000
10585      ELSEIF(DMU.LE.0.0D0)THEN
10586         WRITE(ICOUT,71)
10587   71    FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO RIGCHA ',
10588     1          'IS NON-POSITIVE.')
10589         CALL DPWRST('XXX','BUG ')
10590         WRITE(ICOUT,52)DMU
10591         CALL DPWRST('XXX','BUG ')
10592         GOTO9000
10593      ELSEIF(DX.LT.0.0D0)THEN
10594         WRITE(ICOUT,61)
10595   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT TO RIGCHA ',
10596     1          'IS NON-POSITIVE.')
10597         CALL DPWRST('XXX','BUG ')
10598         WRITE(ICOUT,52)X
10599         CALL DPWRST('XXX','BUG ')
10600         GOTO9000
10601      ENDIF
10602C
10603      IF(DX.EQ.0.0D0)GOTO9000
10604      CALL RIGCDF(DX,DGAMMA,DMU,DCDF)
10605      DCDF=1.0D0-DCDF
10606      IF(DCDF.GT.0.0D0)THEN
10607        DHAZ=-DLOG(DCDF)
10608      ELSE
10609        WRITE(ICOUT,162)X
10610  162   FORMAT('***** FOR THE VALUE OF THE ARGUMENT ',G15.7,
10611     1     ' THE CDF IS ESSENTIALLY 1, CUMULATIVE HAZARD SET TO 0.')
10612        CALL DPWRST('XXX','BUG ')
10613        DHAZ=0.0D0
10614      ENDIF
10615C
10616 9000 CONTINUE
10617      RETURN
10618      END
10619      SUBROUTINE RIGHAZ(DX,DGAMMA,DMU,DHAZ)
10620C
10621C     PURPOSE--THIS SUBROUTINE COMPUTES THE HAZARD
10622C              FUNCTION VALUE FOR THE RECIPROCAL INVERSE GAUSSIAN
10623C              DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU.
10624C              THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION IS
10625C              THE DISTRIBUTION OF Y = 1/X WHEN X HAS AN INVERSE
10626C              GAUSSIAN DISTRIBUTION.
10627C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
10628C                                WHICH THE PROBABILITY DENSITY
10629C                                FUNCTION IS TO BE EVALUATED.
10630C                                X SHOULD BE POSITIVE.
10631C                     --GAMMA  = THE SHAPE PARAMETER
10632C                                GAMMA SHOULD BE POSITIVE.
10633C                     --AMU    = THE SHAPE PARAMETER
10634C                                MU SHOULD BE POSITIVE.
10635C     OUTPUT ARGUMENTS--HAZ    = THE SINGLE PRECISION HAZARD
10636C                                FUNCTION VALUE.
10637C     OUTPUT--THE SINGLE PRECISION HAZARD
10638C             FUNCTION VALUE HAZARD FOR THE RECIPROCAL INVERSE
10639C             GAUSSIAN DISTRIBUTION
10640C             WITH SHAPE PARAMETERS GAMMA AND MU
10641C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10642C     RESTRICTIONS--X SHOULD BE POSITIVE.
10643C                 --GAMMA AND MU SHOULD BE POSITIVE.
10644C     OTHER DATAPAC   SUBROUTINES NEEDED--RIGCDF, RIGPDF.
10645C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10646C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10647C     LANGUAGE--ANSI FORTRAN (1977)
10648C     REFERENCES--SAM SAUNDERS TALK, MAY 1990
10649C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
10650C                 DISTRIBUTIONS--1, 1970, PAGES
10651C     WRITTEN BY--JAMES J. FILLIBEN
10652C                 STATISTICAL ENGINEERING DIVISION
10653C                 INFORMATION TECHNOLOGY LABORATORY
10654C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10655C                 GAITHERSBURG, MD 20899-8980
10656C                 PHONE--301-975-2855
10657C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10658C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10659C     LANGUAGE--ANSI FORTRAN (1977)
10660C     VERSION NUMBER--98.6
10661C     ORIGINAL VERSION--APRIL     1998.
10662C     UPDATED         --DECEMBER  2003. USE GENERAL VALUE OF MU
10663C                                       INSTEAD OF ASSUMING MU=1
10664C     UPDATED         --APRIL     2014. CONVERT TO DOUBLE PRECISION
10665C     UPDATED         --APRIL     2014. SUPPORT FOR CHAN PARAMETERIZATION
10666C                                       (ACTUALLY DONE IN IGCDF AND
10667C                                       IGPDF ROUTINES)
10668C
10669C---------------------------------------------------------------------
10670C
10671      DOUBLE PRECISION DX
10672      DOUBLE PRECISION DGAMMA
10673      DOUBLE PRECISION DMU
10674      DOUBLE PRECISION DHAZ
10675      DOUBLE PRECISION DCDF
10676      DOUBLE PRECISION DPDF
10677C
10678      INCLUDE 'DPCOP2.INC'
10679C
10680C-----START POINT-----------------------------------------------------
10681C
10682C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10683C
10684      IF(DGAMMA.LE.0.0D0)THEN
10685         WRITE(ICOUT,51)
10686   51    FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO RIGHAZ ',
10687     1          'IS NON-POSITIVE.')
10688         CALL DPWRST('XXX','BUG ')
10689         WRITE(ICOUT,52)DGAMMA
10690   52    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
10691         CALL DPWRST('XXX','BUG ')
10692         GOTO9000
10693      ELSEIF(DMU.LE.0.0D0)THEN
10694         WRITE(ICOUT,71)
10695   71    FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO RIGHAZ ',
10696     1          'IS NON-POSITIVE.')
10697         CALL DPWRST('XXX','BUG ')
10698         WRITE(ICOUT,52)DMU
10699         CALL DPWRST('XXX','BUG ')
10700         GOTO9000
10701      ELSEIF(DX.LT.0.0D0)THEN
10702         WRITE(ICOUT,61)
10703   61    FORMAT('***** ERROR--THE FIRST ARGUMENT TO RIGHAZ ',
10704     1          'IS NON-POSITIVE.')
10705         CALL DPWRST('XXX','BUG ')
10706         WRITE(ICOUT,52)DX
10707         CALL DPWRST('XXX','BUG ')
10708         GOTO9000
10709      ENDIF
10710C
10711      IF(DX.EQ.0.0D0)GOTO9000
10712C
10713      CALL RIGCDF(DX,DGAMMA,DMU,DCDF)
10714      DCDF=1.0D0 - DCDF
10715      IF(DCDF.GT.0.0D0)THEN
10716        CALL RIGPDF(DX,DGAMMA,DMU,DPDF)
10717        DHAZ=DPDF/DCDF
10718      ELSE
10719        WRITE(ICOUT,162)DX
10720  162   FORMAT('***** FOR THE VALUE OF THE ARGUMENT ',
10721     1            E15.8,' THE CDF IS ESSENTIALLY 1, HAZARD SET TO 0.')
10722        CALL DPWRST('XXX','BUG ')
10723      ENDIF
10724C
10725 9000 CONTINUE
10726      RETURN
10727      END
10728      SUBROUTINE RIGPDF(DX,DGAMMA,DMU,DPDF)
10729C
10730C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
10731C              FUNCTION VALUE FOR THE RECIPROCAL INVERSE GAUSSIAN
10732C              DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU.
10733C              THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION IS
10734C              THE DISTRIBUTION OF Y = 1/X WHEN X HAS AN INVERSE
10735C              GAUSSIAN DISTRIBUTION.
10736C              THE FORMULA FOR THE RECIPROCAL INVERSE GAUSSIAN
10737C              PROBABILITY DENSITY FUNCTION IS:
10738C              f(X,GAMMA,MU)=SQRT(GAMMA/(2*PI*X)]*
10739C                            EXP[-GAMMA*(1-MU*X)**2/(2*MU**2*X)]
10740C                            X, GAMMA, MU > 0
10741C     NOTE--THE RECIPROCAL INVERSE GAUSSIA DISTRIBUTION CAN BE
10742C           COMPUTED IN TERMS OF THE INVERSE GAUSSIAN PDF:
10743C           RIGPDF(X,GAMMA,MU)=IGPDF(1/X,GAMMA,MU)/(X**2)
10744C     NOTE--THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION--
10745C              GOES FROM 0 TO INFINITY
10746C              HAS MEAN = (GAMMA + MU)/(GAMMA*MU)
10747C              HAS STANDARD DEVIATION=SQRT((GAMMA+2*MU)/(GAMMA**2*MU))
10748C              IS NEAR-SYMMETRIC AND MODERATE-TAILED FOR SMALL GAMMA
10749C              IS HIGHLY-SKEWED AND LONG-TAILED FOR LARGE GAMMA
10750C              APPROACHES NORMALITY AS GAMMA APPROACHES 0
10751C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
10752C                                WHICH THE PROBABILITY DENSITY
10753C                                FUNCTION IS TO BE EVALUATED.
10754C                                X SHOULD BE POSITIVE.
10755C                     --GAMMA  = THE SHAPE PARAMETER
10756C                                GAMMA SHOULD BE POSITIVE.
10757C                     --AMU    = THE SHAPE PARAMETER
10758C                                MU SHOULD BE POSITIVE.
10759C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
10760C                                DENSITY FUNCTION VALUE.
10761C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
10762C             FUNCTION VALUE PDF FOR THE RECIPROCAL INVERSE GAUSSIAN
10763C             DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU
10764C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10765C     RESTRICTIONS--X SHOULD BE POSITIVE.
10766C                 --GAMMA AND MU SHOULD BE POSITIVE.
10767C     OTHER DATAPAC   SUBROUTINES NEEDED--IGPDF.
10768C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10769C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10770C     LANGUAGE--ANSI FORTRAN (1977)
10771C     REFERENCES--SAM SAUNDERS TALK, MAY 1990
10772C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
10773C                 DISTRIBUTIONS--1, 1970, PAGES
10774C     WRITTEN BY--JAMES J. FILLIBEN
10775C                 STATISTICAL ENGINEERING DIVISION
10776C                 INFORMATION TECHNOLOGY LABORATORY
10777C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10778C                 GAITHERSBURG, MD 20899-8980
10779C                 PHONE--301-975-2855
10780C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10781C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10782C     LANGUAGE--ANSI FORTRAN (1977)
10783C     VERSION NUMBER--90.6
10784C     ORIGINAL VERSION--MAY       1990.
10785C     UPDATED         --DECEMBER  2003. USE GENERAL VALUE OF MU
10786C                                       INSTEAD OF ASSUMING MU=1
10787C     UPDATED         --APRIL     2014. CONVERT TO DOUBLE PRECISION
10788C     UPDATED         --APRIL     2014. SUPPORT FOR CHAN PARAMETERIZATION
10789C                                       (THIS ACTUALLY DONE IN IGCDF)
10790C
10791C---------------------------------------------------------------------
10792C
10793      DOUBLE PRECISION DX
10794      DOUBLE PRECISION DGAMMA
10795      DOUBLE PRECISION DMU
10796      DOUBLE PRECISION DPDF
10797      DOUBLE PRECISION DX2
10798C
10799      INCLUDE 'DPCOP2.INC'
10800C
10801C-----START POINT-----------------------------------------------------
10802C
10803C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10804C
10805      DPDF=0.0D0
10806      IF(DGAMMA.LE.0.0D0)THEN
10807         WRITE(ICOUT,51)
10808   51    FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO RIGPDF ',
10809     1          'IS NON-POSITIVE.')
10810         CALL DPWRST('XXX','BUG ')
10811         WRITE(ICOUT,52)DGAMMA
10812   52    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
10813         CALL DPWRST('XXX','BUG ')
10814         GOTO9000
10815      ELSEIF(DMU.LE.0.0D0)THEN
10816         WRITE(ICOUT,71)
10817   71    FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO RIGPDF ',
10818     1          'IS NON-POSITIVE.')
10819         CALL DPWRST('XXX','BUG ')
10820         WRITE(ICOUT,52)DMU
10821         CALL DPWRST('XXX','BUG ')
10822         GOTO9000
10823      ELSEIF(DX.LT.0.0D0)THEN
10824         WRITE(ICOUT,61)
10825   61    FORMAT('***** ERROR--THE FIRST ARGUMENT TO RIGPDF ',
10826     1          'IS NON-POSITIVE.')
10827         CALL DPWRST('XXX','BUG ')
10828         WRITE(ICOUT,52)DX
10829         CALL DPWRST('XXX','BUG ')
10830         GOTO9000
10831      ENDIF
10832C
10833      IF(DX.EQ.0.0D0)GOTO9000
10834C
10835      DX2=1.0D0/DX
10836      CALL IGPDF(DX2,DGAMMA,DMU,DPDF)
10837      DPDF=DPDF/(DX**2)
10838C
10839 9000 CONTINUE
10840      RETURN
10841      END
10842      SUBROUTINE RIGPPF(DP,DGAMMA,DMU,DPPF)
10843C
10844C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
10845C              FUNCTION VALUE FOR THE RECIPROCAL INVERSE GAUSSIAN
10846C              DISTRIBUTION WITH SHAPE PARAMETERS GAMMA AND MU.
10847C              THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION IS
10848C              THE DISTRIBUTION OF Y = 1/X WHEN X HAS AN INVERSE
10849C              GAUSSIAN DISTRIBUTION.
10850C     NOTE--THE RECIPROCAL INVERSE GAUSSIAN PPF CAN BE
10851C           COMPUTED IN TERMS OF THE INVERSE GAUSSIAN PPF:
10852C              RIGPPF(P,GAMMA,MU) = 1/IGPPF(1-P,GAMMA,MU)
10853C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
10854C                                (BETWEEN 0.0 AND 1.0)
10855C                                AT WHICH THE PERCENT POINT
10856C                                FUNCTION IS TO BE EVALUATED.
10857C                     --GAMMA  = THE SHAPE PARAMETER
10858C                                GAMMA SHOULD BE POSITIVE.
10859C                     --AMU    = THE SHAPE PARAMETER
10860C                                MU SHOULD BE POSITIVE.
10861C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT POINT
10862C                                FUNCTION VALUE.
10863C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
10864C             FUNCTION VALUE PPF FOR THE INVERSE GAUSSIAN DISRIBUTION
10865C             WITH SHAPE PARAMETERS GAMMA AND MU
10866C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10867C     RESTRICTIONS--P SHOULD BE BETWEEN
10868C                   0.0 (INCLUSIVELY) AND 1.0 (EXCLUSIVELY).
10869C                 --GAMMA AND MU SHOULD BE POSITIVE
10870C     OTHER DATAPAC   SUBROUTINES NEEDED--IGPPF
10871C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE
10872C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10873C     LANGUAGE--ANSI FORTRAN (1977)
10874C     REFERENCES--SAM SAUNDERS TALK, MAY 1990
10875C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
10876C                 DISTRIBUTIONS--1, 1970, PAGES
10877C     WRITTEN BY--JAMES J. FILLIBEN
10878C                 STATISTICAL ENGINEERING DIVISION
10879C                 INFORMATION TECHNOLOGY LABORATORY
10880C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10881C                 GAITHERSBURG, MD 20899-8980
10882C                 PHONE--301-975-2855
10883C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10884C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10885C     LANGUAGE--ANSI FORTRAN (1977)
10886C     VERSION NUMBER--90.6
10887C     ORIGINAL VERSION--MAY       1990.
10888C     UPDATED         --DECEMBER  2003. USE GENERAL VALUE OF MU
10889C                                       INSTEAD OF ASSUMING MU=1
10890C     UPDATED         --APRIL     2014. CONVERT TO DOUBLE PRECISION
10891C     UPDATED         --APRIL     2014. SUPPORT FOR CHAN PARAMETERIZATION
10892C                                       (THIS ACTUALLY DONE IN IGCDF)
10893C
10894C---------------------------------------------------------------------
10895C
10896      DOUBLE PRECISION DP
10897      DOUBLE PRECISION DP2
10898      DOUBLE PRECISION DGAMMA
10899      DOUBLE PRECISION DMU
10900      DOUBLE PRECISION DPPF
10901C
10902      INCLUDE 'DPCOP2.INC'
10903C
10904C-----START POINT-----------------------------------------------------
10905C
10906C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10907C
10908      DPPF=0.0D0
10909      IF(DGAMMA.LE.0.0D0)THEN
10910         WRITE(ICOUT,51)
10911   51    FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO RIGPPF ',
10912     1          'IS NON-POSITIVE.')
10913         CALL DPWRST('XXX','BUG ')
10914         WRITE(ICOUT,52)DGAMMA
10915   52    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
10916         CALL DPWRST('XXX','BUG ')
10917         GOTO9000
10918      ELSEIF(DMU.LE.0.0D0)THEN
10919         WRITE(ICOUT,71)
10920   71    FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO RIGPPF ',
10921     1          'IS NON-POSITIVE.')
10922         CALL DPWRST('XXX','BUG ')
10923         WRITE(ICOUT,52)DMU
10924         CALL DPWRST('XXX','BUG ')
10925         GOTO9000
10926      ELSEIF(DP.LT.0.0D0 .OR. DP.GE.1.0D0)THEN
10927        WRITE(ICOUT,61)
10928   61   FORMAT('***** ERROR--THE FIRST ARGUMENT TO RIGPPF IS OUTSIDE ',
10929     1         'THE ALLOWABLE [0,1) INTERVAL.')
10930        CALL DPWRST('XXX','BUG ')
10931        WRITE(ICOUT,52)DP
10932        CALL DPWRST('XXX','BUG ')
10933        GOTO9000
10934      ENDIF
10935C
10936      IF(DP.LE.0.0D0)GOTO9000
10937C
10938      DP2=1.0D0 - DP
10939      CALL IGPPF(DP2,DGAMMA,DMU,DPPF)
10940      DPPF=1.0D0/DPPF
10941C
10942 9000 CONTINUE
10943      RETURN
10944      END
10945      SUBROUTINE RIGRAN(N,GAMMA,AMU,ISEED,X)
10946C
10947C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
10948C              FROM THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION
10949C              WITH SHAPE PARAMETERS GAMMA AND MU.
10950C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
10951C                                OF RANDOM NUMBERS TO BE
10952C                                GENERATED.
10953C                     --GAMMA  = THE SINGLE PRECISION VALUE OF THE
10954C                                TAIL LENGTH PARAMETER.
10955C                                GAMMA SHOULD BE POSITIVE.
10956C                     --AMU    = THE SHAPE PARAMETER
10957C                                MU SHOULD BE POSITIVE.
10958C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
10959C                                (OF DIMENSION AT LEAST N)
10960C                                INTO WHICH THE GENERATED
10961C                                RANDOM SAMPLE WILL BE PLACED.
10962C     OUTPUT--A RANDOM SAMPLE OF SIZE N
10963C             FROM THE RECIPROCAL INVERSE GAUSSIAN DISTRIBUTION
10964C             WITH TAIL LENGTH PARAMETERS GAMMA AND MU.
10965C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10966C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
10967C                   OF N FOR THIS SUBROUTINE.
10968C                 --GAMMA AND MU SHOULD BE POSITIVE.
10969C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, RIGPPF.
10970C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10971C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10972C     LANGUAGE--ANSI FORTRAN (1977)
10973C     REFERENCES--JOHNSON AND KOTZ
10974C               --SAM SAUNDERS
10975C     WRITTEN BY--JAMES J. FILLIBEN
10976C                 STATISTICAL ENGINEERING DIVISION
10977C                 INFORMATION TECHNOLOGY LABORATORY
10978C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
10979C                 GAITHERSBURG, MD 20899-8980
10980C                 PHONE--301-975-2855
10981C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10982C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10983C     LANGUAGE--ANSI FORTRAN (1977)
10984C     VERSION NUMBER--90.6
10985C     ORIGINAL VERSION--MAY       1990.
10986C     UPDATED         --DECEMBER  2003. USE GENERAL VALUE OF MU
10987C                                       INSTEAD OF ASSUMING MU=1
10988C
10989C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10990C
10991C---------------------------------------------------------------------
10992C
10993      DIMENSION X(*)
10994C
10995      DOUBLE PRECISION DPPF
10996C
10997C---------------------------------------------------------------------
10998C
10999      INCLUDE 'DPCOP2.INC'
11000C
11001C-----START POINT-----------------------------------------------------
11002C
11003C     CHECK THE INPUT ARGUMENTS FOR ERRORS
11004C
11005      IF(N.LT.1)THEN
11006         WRITE(ICOUT,51)
11007   51    FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
11008     1          'RECIPROCAL INVERSE GAUSSIAN RANDOM NUMBERS IS')
11009         CALL DPWRST('XXX','BUG ')
11010         WRITE(ICOUT,52)N
11011   52    FORMAT('      NON-POSITIVE.  THE VALUE OF THE ARGUMENT IS ',
11012     1          I8,'.')
11013         CALL DPWRST('XXX','BUG ')
11014         GOTO9000
11015      ELSEIF(GAMMA.LE.0.0)THEN
11016         WRITE(ICOUT,61)
11017   61    FORMAT('***** ERROR--THE GAMMA SHAPE PARAMETER FOR THE',
11018     1          ' RECIPROCAL INVERSE GAUSSIAN')
11019         CALL DPWRST('XXX','BUG ')
11020         WRITE(ICOUT,62)
11021   62    FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
11022         CALL DPWRST('XXX','BUG ')
11023         WRITE(ICOUT,63)GAMMA
11024   63    FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
11025         CALL DPWRST('XXX','BUG ')
11026         GOTO9000
11027      ELSEIF(AMU.LE.0.0)THEN
11028         WRITE(ICOUT,71)
11029   71    FORMAT('***** ERROR--THE MU SHAPE PARAMETER FOR THE',
11030     1          ' RECIPROCAL INVERSE GAUSSIAN')
11031         CALL DPWRST('XXX','BUG ')
11032         WRITE(ICOUT,72)
11033   72    FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
11034         CALL DPWRST('XXX','BUG ')
11035         WRITE(ICOUT,63)AMU
11036         CALL DPWRST('XXX','BUG ')
11037         GOTO9000
11038      ENDIF
11039C
11040C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
11041C
11042      CALL UNIRAN(N,ISEED,X)
11043C
11044C     GENERATE N RECIP. INV. GAUS. DISTRIBUTION RANDOM NUMBERS
11045C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
11046C
11047      DO100I=1,N
11048        XTEMP=X(I)
11049        CALL RIGPPF(DBLE(XTEMP),DBLE(GAMMA),DBLE(AMU),DPPF)
11050        X(I)=REAL(DPPF)
11051  100 CONTINUE
11052C
11053 9000 CONTINUE
11054      RETURN
11055      END
11056      DOUBLE PRECISION FUNCTION rlog1(x)
11057C-----------------------------------------------------------------------
11058C             EVALUATION OF THE FUNCTION X - LN(1 + X)
11059C-----------------------------------------------------------------------
11060C     .. Scalar Arguments ..
11061      DOUBLE PRECISION x
11062C     ..
11063C     .. Local Scalars ..
11064      DOUBLE PRECISION a,b,h,p0,p1,p2,q1,q2,r,t,w,w1
11065C     ..
11066C     .. Intrinsic Functions ..
11067      INTRINSIC dble,dlog
11068C     ..
11069C     .. Data statements ..
11070C------------------------
11071      DATA a/.566749439387324D-01/
11072      DATA b/.456512608815524D-01/
11073      DATA p0/.333333333333333D+00/,p1/-.224696413112536D+00/,
11074     +     p2/.620886815375787D-02/
11075      DATA q1/-.127408923933623D+01/,q2/.354508718369557D+00/
11076C     ..
11077C     .. Executable Statements ..
11078C------------------------
11079      IF (x.LT.-0.39D0 .OR. x.GT.0.57D0) GO TO 40
11080      IF (x.LT.-0.18D0) GO TO 10
11081      IF (x.GT.0.18D0) GO TO 20
11082C
11083C              ARGUMENT REDUCTION
11084C
11085      h = x
11086      w1 = 0.0D0
11087      GO TO 30
11088C
11089   10 h = dble(x) + 0.3D0
11090      h = h/0.7D0
11091      w1 = a - h*0.3D0
11092      GO TO 30
11093C
11094   20 h = 0.75D0*dble(x) - 0.25D0
11095      w1 = b + h/3.0D0
11096C
11097C               SERIES EXPANSION
11098C
11099   30 r = h/ (h+2.0D0)
11100      t = r*r
11101      w = ((p2*t+p1)*t+p0)/ ((q2*t+q1)*t+1.0D0)
11102      rlog1 = 2.0D0*t* (1.0D0/ (1.0D0-r)-r*w) + w1
11103      RETURN
11104C
11105C
11106   40 w = (x+0.5D0) + 0.5D0
11107      rlog1 = x - dlog(w)
11108      RETURN
11109
11110      END
11111      SUBROUTINE RMS(X,N,IWRITE,XRMS,IBUGA3,ISUBRO,IERROR)
11112C
11113C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE ROOT MEANS SQUARE
11114C              ERROR
11115C
11116C                  RMS = SQRT(SUM[i=1 to n][X(i)**2]/N)
11117C
11118C              OF THE DATA IN THE INPUT VECTOR X.
11119C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
11120C                                (UNSORTED OR SORTED) OBSERVATIONS.
11121C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
11122C                                IN THE VECTOR X.
11123C     OUTPUT ARGUMENTS--XRMS    = THE SINGLE PRECISION VALUE OF THE
11124C                                COMPUTED SAMPLE ROOT MEAN SQUARE ERROR.
11125C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
11126C             SAMPLE ROOT MEAN SQUARE ERROR.
11127C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
11128C                   OF N FOR THIS SUBROUTINE.
11129C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
11130C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
11131C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
11132C     LANGUAGE--ANSI FORTRAN (1977)
11133C     WRITTEN BY--JAMES J. FILLIBEN
11134C                 STATISTICAL ENGINEERING DIVISION
11135C                 INFORMATION TECHNOLOGY LABORATORY
11136C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
11137C                 GAITHERSBURG, MD 20899-8980
11138C                 PHONE--301-975-2855
11139C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11140C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
11141C     LANGUAGE--ANSI FORTRAN (1977)
11142C     VERSION NUMBER--2010.1
11143C     ORIGINAL VERSION--JANUARY   2010.
11144C
11145C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11146C
11147      CHARACTER*4 IWRITE
11148      CHARACTER*4 IBUGA3
11149      CHARACTER*4 ISUBRO
11150      CHARACTER*4 IERROR
11151C
11152      CHARACTER*4 ISUBN1
11153      CHARACTER*4 ISUBN2
11154C
11155C---------------------------------------------------------------------
11156C
11157      DOUBLE PRECISION DX
11158      DOUBLE PRECISION DSUM
11159      DOUBLE PRECISION DRMS
11160C
11161      DIMENSION X(*)
11162C
11163C---------------------------------------------------------------------
11164C
11165      INCLUDE 'DPCOP2.INC'
11166C
11167C-----START POINT-----------------------------------------------------
11168C
11169      ISUBN1='RMS '
11170      ISUBN2='    '
11171      IERROR='NO'
11172C
11173      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'RMS ')THEN
11174        WRITE(ICOUT,999)
11175  999   FORMAT(1X)
11176        CALL DPWRST('XXX','BUG ')
11177        WRITE(ICOUT,51)
11178   51   FORMAT('***** AT THE BEGINNING OF RMS--')
11179        CALL DPWRST('XXX','BUG ')
11180        WRITE(ICOUT,52)IBUGA3,N
11181   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
11182        CALL DPWRST('XXX','BUG ')
11183        DO55I=1,N
11184          WRITE(ICOUT,56)I,X(I)
11185   56     FORMAT('I,X(I) = ',I8,G15.7)
11186          CALL DPWRST('XXX','BUG ')
11187   55   CONTINUE
11188      ENDIF
11189C
11190C               **************************************
11191C               **  COMPUTE ROOT MEAN SQUARE ERROR  **
11192C               **************************************
11193C
11194C               ********************************************
11195C               **  STEP 1--                              **
11196C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
11197C               ********************************************
11198C
11199      IF(N.LT.1)THEN
11200        WRITE(ICOUT,999)
11201        CALL DPWRST('XXX','BUG ')
11202        WRITE(ICOUT,111)
11203  111   FORMAT('***** ERROR IN ROOT MEAN SQUARE ERROR--')
11204        CALL DPWRST('XXX','BUG ')
11205        WRITE(ICOUT,112)
11206  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
11207     1         'VARIABLE IS LESS THAN 1.')
11208        CALL DPWRST('XXX','BUG ')
11209        WRITE(ICOUT,117)N
11210  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8)
11211        CALL DPWRST('XXX','BUG ')
11212        IERROR='YES'
11213        GOTO9000
11214      ENDIF
11215C
11216C               *******************************************
11217C               **  STEP 2--                             **
11218C               **  COMPUTE THE ROOT MEAN SQUARE ERROR.  **
11219C               *******************************************
11220C
11221      DSUM=0.0D0
11222      DO200I=1,N
11223        DX=X(I)
11224        DSUM=DSUM + DX*DX
11225  200 CONTINUE
11226      DRMS=DSQRT(DSUM/DBLE(N))
11227      XRMS=REAL(DRMS)
11228C
11229C               *******************************
11230C               **  STEP 3--                 **
11231C               **  WRITE OUT A LINE         **
11232C               **  OF SUMMARY INFORMATION.  **
11233C               *******************************
11234C
11235      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
11236        WRITE(ICOUT,999)
11237        CALL DPWRST('XXX','BUG ')
11238        WRITE(ICOUT,811)N,XRMS
11239  811   FORMAT('THE ROOT MEAN SQUARE ERROR OF THE ',I8,
11240     1         ' OBSERVATIONS = ',G15.7)
11241        CALL DPWRST('XXX','BUG ')
11242      ENDIF
11243C
11244C               *****************
11245C               **  STEP 90--  **
11246C               **  EXIT.      **
11247C               *****************
11248C
11249 9000 CONTINUE
11250      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'RMS')THEN
11251        WRITE(ICOUT,999)
11252        CALL DPWRST('XXX','BUG ')
11253        WRITE(ICOUT,9011)
11254 9011   FORMAT('***** AT THE END       OF SD--')
11255        CALL DPWRST('XXX','BUG ')
11256        WRITE(ICOUT,9012)IERROR
11257 9012   FORMAT('IERROR = ',A4)
11258        CALL DPWRST('XXX','BUG ')
11259        WRITE(ICOUT,9013)N,DSUM,DRMS,XRMS
11260 9013   FORMAT('N,DSUM,DRMS,XRMS = ',I8,3G15.7)
11261        CALL DPWRST('XXX','BUG ')
11262      ENDIF
11263C
11264      RETURN
11265      END
11266      REAL FUNCTION RND(X,IDIGIT)
11267C
11268C     PURPOSE--ROUND A REAL VALUE TO THE SPECIFIED NUMBER OF DIGITS
11269C     WRITTEN BY--ALAN HECKERT
11270C                 STATISTICAL ENGINEERING DIVISION
11271C                 INFORMATION TECHNOLOGY LABOARATORY
11272C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11273C                 GAITHERSBURG, MD 20899-8980
11274C                 PHONE--301-975-2899
11275C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11276C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11277C     LANGUAGE--ANSI FORTRAN (1977)
11278C     VERSION NUMBER--2009/10
11279C     ORIGINAL VERSION--OCTOBER   2009.
11280C
11281C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11282C
11283      REAL X
11284CCCCC REAL ABSX
11285CCCCC REAL AMULT
11286      REAL SAVE1
11287CCCCC REAL TERM
11288CCCCC REAL TEMP1
11289CCCCC REAL TEMP2
11290CCCCC REAL TEMP3
11291CCCCC REAL TEMP4
11292      INTEGER IDIGIT
11293      INTEGER IPOWER
11294C
11295C---------------------------------------------------------------------
11296C
11297      INCLUDE 'DPCOP2.INC'
11298C
11299      IF(IDIGIT.LT.-10)IDIGIT=-10
11300      IF(IDIGIT.GT.10)IDIGIT=10
11301C
11302CCCCC SAVE1=REAL(IDIGIT)
11303CCCCC ABSX=ABS(X)
11304CCCCC IPOWER=0
11305CCCCC IF(SAVE1.GT.0.0)IPOWER=AINT(SAVE1+0.5)
11306CCCCC AMULT=10.0**IPOWER
11307CCCCC TEMP2=ABSX*AMULT
11308CCCCC TEMP3=AINT(TEMP2+0.5)
11309CCCCC TEMP4=TEMP3/AMULT
11310CCCCC TERM=TEMP4
11311CCCCC IF(X.LT.0.0)TERM=(-TEMP4)
11312CCCCC RND=TERM
11313C
11314C     2014/12: ABOVE ALGORITHM DID NOT WORK AS EXPECTED FOR 64-BIT
11315C              INTEL FORTRAN COMPILER FOR WINDOWS.  USE DIFFERENT
11316C              ALGORITHM.
11317C
11318      SAVE1=REAL(IDIGIT)
11319      IF(SAVE1.LT.0.0)SAVE1=0.0
11320      IPOWER=INT(AINT(SAVE1+0.5))
11321      RND=REAL(INT(X*10**IPOWER + 0.5))/10**IPOWER
11322C
11323      RETURN
11324      END
11325      DOUBLE PRECISION FUNCTION RNOR()
11326*
11327*     RNOR generates normal random numbers with zero mean and unit
11328*     standard deviation, often denoted N(0,1),adapted from G. Marsaglia
11329*     and W. W. Tsang: "A Fast, Easily Implemented Method for Sampling
11330*     from Decreasing or Symmetric Unimodal Density Functions"
11331*      SIAM J. Sci. Stat. Comput. 5(1984), pp. 349-359.
11332*
11333      INTEGER J, N, TN
11334      DOUBLE PRECISION TWOPIS, AA, B, C, XDN
11335      PARAMETER ( N = 64, TN = 2*N, TWOPIS = TN/2.506628274631000D0 )
11336      PARAMETER ( XDN = 0.3601015713011893D0, B = 0.4878991777603940D0 )
11337      PARAMETER (  AA =  12.37586029917064D0, C =  12.67705807886560D0 )
11338      DOUBLE PRECISION XT, XX, Y, UNI
11339      DOUBLE PRECISION X(0:N)
11340      SAVE X
11341      DATA ( X(J), J = 0, 31 ) /
11342     &  0.3409450287039653D+00,  0.4573145918669259D+00,
11343     &  0.5397792816116612D+00,  0.6062426796530441D+00,
11344     &  0.6631690627645207D+00,  0.7136974590560222D+00,
11345     &  0.7596124749339174D+00,  0.8020356003555283D+00,
11346     &  0.8417226679789527D+00,  0.8792102232083114D+00,
11347     &  0.9148948043867484D+00,  0.9490791137530882D+00,
11348     &  0.9820004812398864D+00,  0.1013849238029940D+01,
11349     &  0.1044781036740172D+01,  0.1074925382028552D+01,
11350     &  0.1104391702268125D+01,  0.1133273776243940D+01,
11351     &  0.1161653030133931D+01,  0.1189601040838737D+01,
11352     &  0.1217181470700870D+01,  0.1244451587898246D+01,
11353     &  0.1271463480572119D+01,  0.1298265041883197D+01,
11354     &  0.1324900782180860D+01,  0.1351412509933371D+01,
11355     &  0.1377839912870011D+01,  0.1404221063559975D+01,
11356     &  0.1430592868502691D+01,  0.1456991476137671D+01,
11357     &  0.1483452656603219D+01,  0.1510012164318519D+01 /
11358      DATA ( X(J), J = 32, 64 ) /
11359     &  0.1536706093359520D+01,  0.1563571235037691D+01,
11360     &  0.1590645447014253D+01,  0.1617968043674446D+01,
11361     &  0.1645580218369081D+01,  0.1673525509567038D+01,
11362     &  0.1701850325062740D+01,  0.1730604541317782D+01,
11363     &  0.1759842199038300D+01,  0.1789622321566574D+01,
11364     &  0.1820009890130691D+01,  0.1851077020230275D+01,
11365     &  0.1882904397592872D+01,  0.1915583051943031D+01,
11366     &  0.1949216574916360D+01,  0.1983923928905685D+01,
11367     &  0.2019843052906235D+01,  0.2057135559990095D+01,
11368     &  0.2095992956249391D+01,  0.2136645022544389D+01,
11369     &  0.2179371340398135D+01,  0.2224517507216017D+01,
11370     &  0.2272518554850147D+01,  0.2323933820094302D+01,
11371     &  0.2379500774082828D+01,  0.2440221797979943D+01,
11372     &  0.2507511701865317D+01,  0.2583465835225429D+01,
11373     &  0.2671391590320836D+01,4*0.2776994269662875D+01 /
11374      IRESET=0
11375      Y = UNI(IRESET)
11376      J = MOD( INT( TN*UNI(IRESET) ), N )
11377      XT = X(J+1)
11378      RNOR = ( Y + Y - 1 )*XT
11379      IF ( ABS(RNOR) .GT. X(J) ) THEN
11380         XX = B*( XT - ABS(RNOR) )/( XT - X(J) )
11381         Y = UNI(IRESET)
11382         IF ( Y .GT. C - AA*EXP( -XX**2/2 ) ) THEN
11383            RNOR = SIGN( XX, RNOR )
11384         ELSE
11385            IF ( EXP(-XT**2/2)+Y/(TWOPIS*XT).GT.EXP(-RNOR**2/2) ) THEN
11386 10            XX = XDN*LOG( UNI(IRESET) )
11387               IF ( -2*LOG( UNI(IRESET) ) .LE. XX**2 ) GO TO 10
11388               RNOR = SIGN( X(N) - XX, RNOR )
11389            END IF
11390         END IF
11391      END IF
11392C
11393      RETURN
11394      END
11395      SUBROUTINE RNORM(U1, U2, ISEED)
11396C
11397C     ALGORITHM AS 53.1  APPL. STATIST. (1972) VOL.21, NO.3
11398C
11399C     Sets U1 and U2 to two independent standardized random normal
11400C     deviates.   This is a Fortran version of the method given in
11401C     Knuth(1969).
11402C
11403C     Function RAND must give a result randomly and rectangularly
11404C     distributed between the limits 0 and 1 exclusive.
11405C
11406      REAL U1, U2
11407      REAL XTEMP(1)
11408C
11409C     Local variables
11410C
11411      REAL X, Y, S, ONE, TWO
11412      DATA ONE /1.0/, TWO /2.0/
11413C
11414    1 CONTINUE
11415      N1 = 1
11416      CALL UNIRAN(N1,ISEED,XTEMP)
11417      X = XTEMP(1)
11418      CALL UNIRAN(N1,ISEED,XTEMP)
11419      Y = XTEMP(1)
11420C
11421      X = TWO * X - ONE
11422      Y = TWO * Y - ONE
11423      S = X * X + Y * Y
11424      IF (S .GT. ONE) GO TO 1
11425      S = SQRT(- TWO * LOG(S) / S)
11426      U1 = X * S
11427      U2 = Y * S
11428      RETURN
11429      END
11430      SUBROUTINE ROBPSD(X,N,NREPL,XTEMP1,ICASE,IWRITE,MAXNXT,
11431     1                  XSC,IERROR,ISUBRO,IBUGA3)
11432C
11433C     PURPOSE--THIS SUBROUTINE COMPUTES A ROBUST POOLED STANDARD
11434C              DEVIATION.  THIS IS THE "ALGORITHM S" DESCRIBED IN
11435C              ISO STANDARD 1358 (IT WAS ORIGINALLY GIVEN IN ISO
11436C              STANDARD 5725-5).
11437C
11438C     REFERENCE--ISO 13528 (2005), "Statistical Methods for use in
11439C                proficiency testing by interlaboratory comparisons,"
11440C                Section C.2 Algorithm S.
11441C
11442C     WRITTEN BY--ALAN HECKERT
11443C                 STATISTICAL ENGINEERING DIVISION
11444C                 INFORMATION TECHNOLOGY LABORATORY
11445C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOOGY
11446C                 GAITHERSBURG, MD 20899-8980
11447C                 PHONE--301-975-2899
11448C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11449C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOOGY.
11450C     LANGUAGE--ANSI FORTRAN (1977)
11451C     VERSION NUMBER--2010/12
11452C     ORIGINAL VERSION--DECEMBER  2010.
11453C
11454C     NOTE--THE X ARRAY MAY CONTAIN EITHER STANDARD DEVIATIONS OR
11455C           RANGES (ICASE SPECIFIES WHICH IS BEING USED).
11456C
11457      REAL    X(*)
11458      REAL    XTEMP1(*)
11459      REAL    XSC
11460      REAL    ANU
11461      REAL    EPS
11462      REAL    PHI
11463      REAL    WSTAR
11464      REAL    WSTARU
11465      REAL    DIFF
11466      REAL    XMED
11467C
11468      CHARACTER*4 ICASE
11469      CHARACTER*4 IWRITE
11470      CHARACTER*4 IERROR
11471      CHARACTER*4 ISUBRO
11472      CHARACTER*4 IBUGA3
11473C
11474      DOUBLE PRECISION DSUM
11475      DOUBLE PRECISION DTEMP1
11476C
11477      INTEGER N
11478      INTEGER MAXNXT
11479      INTEGER I
11480      INTEGER NU
11481      INTEGER ITER
11482C
11483      INCLUDE 'DPCOP2.INC'
11484C
11485      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'BPSD ')THEN
11486        WRITE(ICOUT,999)
11487  999   FORMAT(1X)
11488        CALL DPWRST('XXX','BUG ')
11489        WRITE(ICOUT,51)
11490   51   FORMAT('***** AT THE BEGINNING OF ROBPSD--')
11491        CALL DPWRST('XXX','BUG ')
11492        DO55I=1,N
11493          WRITE(ICOUT,56)I,X(I)
11494   56     FORMAT('I,X(I) = ',I8,G15.7)
11495          CALL DPWRST('XXX','BUG ')
11496   55   CONTINUE
11497      ENDIF
11498C
11499C     NEED AT LEAST 2 VALUES AND ALL VALUES SHOULD BE
11500C     NON-NEGATIVE.
11501C
11502      IF(N.LT.2)THEN
11503        WRITE(ICOUT,999)
11504        CALL DPWRST('XXX','BUG ')
11505        WRITE(ICOUT,101)
11506  101   FORMAT('***** ERROR IN ROBUST POOLED STANDARD DEVIATION--')
11507        CALL DPWRST('XXX','BUG ')
11508        WRITE(ICOUT,103)
11509  103   FORMAT('      THE NUMBER OF OBSERVATIONS IS LESS THAN TWO.')
11510        CALL DPWRST('XXX','BUG ')
11511        WRITE(ICOUT,105)N
11512  105   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I6)
11513        CALL DPWRST('XXX','BUG ')
11514        IERROR='YES'
11515        GOTO9000
11516      ENDIF
11517C
11518      IF(ICASE.EQ.'SD' .AND. NREPL.LT.1)THEN
11519        WRITE(ICOUT,999)
11520        CALL DPWRST('XXX','BUG ')
11521        WRITE(ICOUT,101)
11522        CALL DPWRST('XXX','BUG ')
11523        WRITE(ICOUT,107)
11524  107   FORMAT('      THE NUMBER OF REPLICATIONS FOR EACH SD IS ',
11525     1         'LESS THAN ONE.')
11526        CALL DPWRST('XXX','BUG ')
11527        WRITE(ICOUT,109)NREPL
11528  109   FORMAT('      THE NUMBER OF REPLICATIONS = ',I6)
11529        CALL DPWRST('XXX','BUG ')
11530        IERROR='YES'
11531        GOTO9000
11532      ENDIF
11533C
11534      DO110I=1,N
11535        IF(X(I).LT.0.0)THEN
11536          WRITE(ICOUT,999)
11537          CALL DPWRST('XXX','BUG ')
11538          WRITE(ICOUT,101)
11539          CALL DPWRST('XXX','BUG ')
11540          WRITE(ICOUT,113)I,X(I)
11541  113     FORMAT('      ROW ',I8,' CONTAINS A NEGATIVE VALUE (',
11542     1           G15.7,').')
11543          CALL DPWRST('XXX','BUG ')
11544          IERROR='YES'
11545          GOTO9000
11546        ENDIF
11547  110 CONTINUE
11548C
11549C     STEP 1: SORT THE STANDARD DEVIATIONS (RANGES)
11550C             AND COMPUTE THE MEDIAN
11551C
11552CCCCC CALL SORT(X,N,X)
11553      CALL MEDIAN(X,N,IWRITE,XTEMP1,MAXNXT,XMED,IBUGA3,IERROR)
11554      WSTAR=XMED
11555C
11556C     STEP 2: UPDATE WSTAR VIA:
11557C
11558C             1) CALCULATE PHI = NU*WSTAR
11559C             2) FOR EACH X(I), CALCULATE
11560C
11561C                XSTAR(I) = PHI     IF  X(I) > PHI
11562C                         = X(I)    OTHERWISE
11563C             3) UPDATED WSTAR = EPS*SQRT(SUM[i=1 to n][(XSTAR(I)**2)/N])
11564C
11565      NU=0
11566      IF(ICASE.EQ.'SD')THEN
11567        NU=NREPL-1
11568      ELSEIF(ICASE.EQ.'RANG')THEN
11569        NU=1
11570      ENDIF
11571C
11572      IF(NU.EQ.1)THEN
11573        ANU=1.645
11574        EPS=1.097
11575      ELSEIF(NU.EQ.2)THEN
11576        ANU=1.517
11577        EPS=1.054
11578      ELSEIF(NU.EQ.3)THEN
11579        ANU=1.444
11580        EPS=1.039
11581      ELSEIF(NU.EQ.4)THEN
11582        ANU=1.395
11583        EPS=1.032
11584      ELSEIF(NU.EQ.5)THEN
11585        ANU=1.359
11586        EPS=1.027
11587      ELSEIF(NU.EQ.6)THEN
11588        ANU=1.332
11589        EPS=1.024
11590      ELSEIF(NU.EQ.7)THEN
11591        ANU=1.310
11592        EPS=1.021
11593      ELSEIF(NU.EQ.8)THEN
11594        ANU=1.292
11595        EPS=1.019
11596      ELSEIF(NU.EQ.9)THEN
11597        ANU=1.277
11598        EPS=1.018
11599      ELSEIF(NU.EQ.10)THEN
11600        ANU=1.264
11601        EPS=1.017
11602      ELSE
11603        CALL CHSPPF(0.9,NU,APPF)
11604        ANU=SQRT(APPF/REAL(NU))
11605        IDF=NU+2
11606        TERM1=REAL(NU)*ANU*ANU
11607        CALL CHSCDF(TERM1,IDF,CDF)
11608        EPS=1.0/SQRT(CDF + 0.1*ANU*ANU)
11609      ENDIF
11610C
11611      ITER=1
11612 1000 CONTINUE
11613      PHI=ANU*WSTAR
11614      DSUM=0.0D0
11615      DO1010I=1,N
11616        IF(X(I).GT.PHI)THEN
11617          XTEMP1(I)=PHI
11618          DSUM=DSUM + DBLE(PHI)**2
11619        ELSE
11620          DSUM=DSUM + DBLE(X(I))**2
11621        ENDIF
11622 1010 CONTINUE
11623      DTEMP1=DBLE(EPS)*DSQRT(DSUM/DBLE(N))
11624      WSTARU=REAL(DTEMP1)
11625      DIFF=ABS(WSTAR - WSTARU)
11626      RATIO=WSTAR/WSTARU
11627C
11628      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'BPSD ')THEN
11629        WRITE(ICOUT,1022)ITER,WSTAR,WSTARU,DIFF,RATIO
11630 1022   FORMAT('ITER,WSTAR,WSTARU,DIFF,RATIO =',I5,4G15.7)
11631        CALL DPWRST('XXX','BUG ')
11632        WRITE(ICOUT,1024)ANU,EPS,PHI
11633 1024   FORMAT('ANU,EPS,PHI =',3G15.7)
11634        CALL DPWRST('XXX','BUG ')
11635      ENDIF
11636C
11637      ITER=ITER+1
11638      IF(ITER.GT.50)GOTO1099
11639      IF(ABS(RATIO - 1.0) .LT. 1.0E-4)GOTO1099
11640      IF(DIFF.LT.0.0000001)GOTO1099
11641      WSTAR=WSTARU
11642      GOTO1000
11643C
11644 1099 CONTINUE
11645      WSTAR=WSTARU
11646      XSC=WSTAR
11647C
11648 9000 CONTINUE
11649      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'BPSD ')THEN
11650        WRITE(ICOUT,9010)
11651 9010   FORMAT('AT THE END OF ROBPSD')
11652        CALL DPWRST('XXX','BUG ')
11653        WRITE(ICOUT,9012)XSC
11654 9012   FORMAT('XSC=',G15.7)
11655        CALL DPWRST('XXX','BUG ')
11656      ENDIF
11657C
11658      RETURN
11659      END
11660      SUBROUTINE RPOCDF(X,C,CDF)
11661C
11662C     NOTE--THE STANDARD REFLECTED POWER FUNCTION
11663C           CUMULATIVE DISTRIBUTION FUNCTION IS:
11664C
11665C           F(X,C) = 1 - (1-X)**C        0 <= X <= 1, C > 0
11666C
11667C           WITH C DENOTING THE SCALE PARAMETER.
11668C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
11669C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
11670C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
11671C     WRITTEN BY--JAMES J. FILLIBEN
11672C                 STATISTICAL ENGINEERING DIVISION
11673C                 INFORMATION TECHNOLOGY LABORATORY
11674C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11675C                 GAITHERSBURG, MD 20899-8980
11676C                 PHONE--301-975-2855
11677C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11678C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11679C     LANGUAGE--ANSI FORTRAN (1977)
11680C     VERSION NUMBER--2007/12
11681C     ORIGINAL VERSION--DECEMBER  2007.
11682C
11683C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11684C
11685      DOUBLE PRECISION DX
11686      DOUBLE PRECISION DC
11687      DOUBLE PRECISION DCDF
11688C
11689      INCLUDE 'DPCOP2.INC'
11690C
11691C-----START POINT-----------------------------------------------------
11692C
11693      IF(X.LE.0.0)THEN
11694        CDF=0.0
11695        GOTO9999
11696      ELSEIF(X.GE.1.0)THEN
11697        CDF=1.0
11698        GOTO9999
11699      ENDIF
11700C
11701      IF(C.LE.0.0)THEN
11702        WRITE(ICOUT,311)
11703        CALL DPWRST('XXX','BUG ')
11704        WRITE(ICOUT,302)C
11705        CALL DPWRST('XXX','BUG ')
11706        CDF=0.0
11707        GOTO9999
11708      ENDIF
11709  311 FORMAT('***** ERROR IN RPOCDF--THE SECOND ARGUMENT IS ',
11710     1       'NON-POSITIVE.')
11711  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
11712C
11713      DX=DBLE(X)
11714      DC=DBLE(C)
11715      DCDF=1.0D0 - (1.0D0-DX)**DC
11716      CDF=REAL(DCDF)
11717C
11718 9999 CONTINUE
11719      RETURN
11720      END
11721      SUBROUTINE RPOCHA(X,C,HAZ)
11722C
11723C     NOTE--THE STANDARD REFLECTED POWER FUNCTION CUMULATIVE HAZARD
11724C           FUNCTION IS:
11725C
11726C              H(X;C) = -LOG((1 - X)**C)       0 <= X <= 1, C > 0
11727C
11728C           WHERE C IS THE SHAPE PARAMETER.
11729C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
11730C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
11731C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
11732C     WRITTEN BY--JAMES J. FILLIBEN
11733C                 STATISTICAL ENGINEERING DIVISION
11734C                 INFORMATION TECHNOLOGY LABORATORY
11735C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11736C                 GAITHERSBURG, MD 20899-8980
11737C                 PHONE--301-975-2855
11738C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11739C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11740C     LANGUAGE--ANSI FORTRAN (1977)
11741C     VERSION NUMBER--2007/12
11742C     ORIGINAL VERSION--DECEMBER  2007.
11743C
11744C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11745C
11746      DOUBLE PRECISION DTERM1
11747      DOUBLE PRECISION DX
11748      DOUBLE PRECISION DC
11749      DOUBLE PRECISION DHAZ
11750C
11751      INCLUDE 'DPCOP2.INC'
11752C
11753C-----START POINT-----------------------------------------------------
11754C
11755      HAZ=0.0
11756      IF(X.LT.0.0 .OR. X.GT.1.0)THEN
11757        WRITE(ICOUT,301)
11758        CALL DPWRST('XXX','BUG ')
11759        WRITE(ICOUT,302)X
11760        CALL DPWRST('XXX','BUG ')
11761        GOTO9999
11762      ELSEIF(C.LE.0.0)THEN
11763        WRITE(ICOUT,311)
11764        CALL DPWRST('XXX','BUG ')
11765        WRITE(ICOUT,302)C
11766        CALL DPWRST('XXX','BUG ')
11767        GOTO9999
11768      ENDIF
11769  301 FORMAT('***** ERROR IN RPOCHAZ--THE FIRST ARGUMENT IS NOT IN ',
11770     1       'THE INTERVAL (0,1).')
11771  311 FORMAT('***** ERROR IN RPOCHAZ--THE SECOND ARGUMENT IS ',
11772     1       'NON-POSITIVE.')
11773  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
11774C
11775      DX=DBLE(X)
11776      DC=DBLE(C)
11777      DTERM1=(1.0D0 - DX)**DC
11778      IF(DTERM1.GT.0.0D0)THEN
11779        DHAZ=-DLOG(DTERM1)
11780        HAZ=REAL(DHAZ)
11781      ELSE
11782        WRITE(ICOUT,401)
11783        CALL DPWRST('XXX','BUG ')
11784        WRITE(ICOUT,402)
11785        CALL DPWRST('XXX','BUG ')
11786        WRITE(ICOUT,302)X
11787        CALL DPWRST('XXX','BUG ')
11788      ENDIF
11789  401 FORMAT('***** ERROR IN RPOCHAZ')
11790  402 FORMAT('      THE COMPUTED VALUE OF THE HAZARD FUNCTION ',
11791     1       'OVERFLOWS.')
11792C
11793 9999 CONTINUE
11794      RETURN
11795      END
11796      SUBROUTINE RPOHAZ(X,C,HAZ)
11797C
11798C     NOTE--THE STANDARD REFLECTED POWER FUNCTION HAZARD
11799C           FUNCTION IS:
11800C
11801C              h(X;C) = C/(1 - X)     0 <= X <= 1, C > 0
11802C
11803C           WHERE C IS THE SHAPE PARAMETER.
11804C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
11805C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
11806C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
11807C     WRITTEN BY--JAMES J. FILLIBEN
11808C                 STATISTICAL ENGINEERING DIVISION
11809C                 INFORMATION TECHNOLOGY LABORATORY
11810C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11811C                 GAITHERSBURG, MD 20899-8980
11812C                 PHONE--301-975-2855
11813C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11814C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11815C     LANGUAGE--ANSI FORTRAN (1977)
11816C     VERSION NUMBER--2007/12
11817C     ORIGINAL VERSION--DECEMBER  2007.
11818C
11819C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11820C
11821      DOUBLE PRECISION DX
11822      DOUBLE PRECISION DC
11823      DOUBLE PRECISION DHAZ
11824C
11825      INCLUDE 'DPCOP2.INC'
11826C
11827C-----START POINT-----------------------------------------------------
11828C
11829      HAZ=0.0
11830      IF(X.LT.0.0 .OR. X.GE.1.0)THEN
11831        WRITE(ICOUT,301)
11832        CALL DPWRST('XXX','BUG ')
11833        WRITE(ICOUT,302)X
11834        CALL DPWRST('XXX','BUG ')
11835        GOTO9999
11836      ELSEIF(C.LE.0.0)THEN
11837        WRITE(ICOUT,311)
11838        CALL DPWRST('XXX','BUG ')
11839        WRITE(ICOUT,302)C
11840        CALL DPWRST('XXX','BUG ')
11841        GOTO9999
11842      ENDIF
11843  301 FORMAT('***** ERROR IN RPOHAZ--THE FIRST ARGUMENT IS NOT IN ',
11844     1       'THE INTERVAL (0,1).')
11845  311 FORMAT('***** ERROR IN RPOHAZ--THE SECOND ARGUMENT IS ',
11846     1       'NON-POSITIVE.')
11847  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
11848C
11849      DX=DBLE(X)
11850      DC=DBLE(C)
11851      DHAZ=DC/(1.0D0 - DX)
11852      HAZ=REAL(DHAZ)
11853C
11854 9999 CONTINUE
11855      RETURN
11856      END
11857      SUBROUTINE RPOPDF(X,C,PDF)
11858C
11859C     NOTE--THE STANDARD REFLECTED POWER FUNCTION PROBABILITY DENSITY
11860C           FUNCTION IS:
11861C
11862C              f(X;C) = C*(1-X)**(C-1)    0 <= X <= 1, C > 0
11863C
11864C           WITH C DENOTING THE SHAPE PARAMETER.
11865C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
11866C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
11867C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
11868C     WRITTEN BY--JAMES J. FILLIBEN
11869C                 STATISTICAL ENGINEERING DIVISION
11870C                 INFORMATION TECHNOLOGY LABORATORY
11871C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11872C                 GAITHERSBURG, MD 20899-8980
11873C                 PHONE--301-975-2855
11874C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11875C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11876C     LANGUAGE--ANSI FORTRAN (1977)
11877C     VERSION NUMBER--2007/12
11878C     ORIGINAL VERSION--DECEMBER  2007.
11879C
11880C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11881C
11882      DOUBLE PRECISION DX
11883      DOUBLE PRECISION DC
11884      DOUBLE PRECISION DPDF
11885C
11886      INCLUDE 'DPCOP2.INC'
11887C
11888C-----START POINT-----------------------------------------------------
11889C
11890      PDF=0.0
11891      IF(X.LT.0.0 .OR. X.GT.1.0)THEN
11892        WRITE(ICOUT,301)
11893        CALL DPWRST('XXX','BUG ')
11894        WRITE(ICOUT,302)X
11895        CALL DPWRST('XXX','BUG ')
11896        GOTO9999
11897      ELSEIF(C.LE.0.0)THEN
11898        WRITE(ICOUT,311)
11899        CALL DPWRST('XXX','BUG ')
11900        WRITE(ICOUT,302)C
11901        CALL DPWRST('XXX','BUG ')
11902        GOTO9999
11903      ELSEIF(X.GE.1.0 .AND. C.LT.1.0)THEN
11904        WRITE(ICOUT,301)
11905        CALL DPWRST('XXX','BUG ')
11906        WRITE(ICOUT,302)X
11907        CALL DPWRST('XXX','BUG ')
11908        GOTO9999
11909      ENDIF
11910  301 FORMAT('***** ERROR IN RPOPDF--THE FIRST ARGUMENT IS NOT IN ',
11911     1       'THE INTERVAL (0,1).')
11912  311 FORMAT('***** ERROR IN RPOPDF--THE SECOND ARGUMENT IS ',
11913     1       'NON-POSITIVE.')
11914  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
11915C
11916      DX=DBLE(X)
11917      DC=DBLE(C)
11918      DPDF=DC*(1.0D0 - DX)**(DC-1.0D0)
11919      PDF=REAL(DPDF)
11920C
11921 9999 CONTINUE
11922      RETURN
11923      END
11924      SUBROUTINE RPOPPF(P,C,PPF)
11925C
11926C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT FUNCTION
11927C              VALUE FOR THE REFLECTED POWER FUNCTION DISTRIBUTION.
11928C              THE STANDARD REFLECTED POWER FUNCTION PPF IS:
11929C
11930C              G(P;C) = 1 - (1-P)**(1/C)    0 <= P <= 1, C > 0
11931C
11932C           WITH C DENOTING THE SHAPE PARAMETER.
11933C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
11934C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
11935C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
11936C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
11937C                                (BETWEEN 0.0 AND 1.0)
11938C                                AT WHICH THE PERCENT POINT
11939C                                FUNCTION IS TO BE EVALUATED.
11940C                     --C      = THE SINGLE PRECISION VALUE OF THE SHAPE
11941C                                PARAMETER.
11942C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT
11943C                                POINT FUNCTION VALUE.
11944C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
11945C             FUNCTION VALUE PPF.
11946C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
11947C     RESTRICTIONS--P SHOULD BE BETWEEN 0.0 AND 1.0, INCLUSIVELY.
11948C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
11949C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
11950C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
11951C     LANGUAGE--ANSI FORTRAN (1977)
11952C     WRITTEN BY--JAMES J. FILLIBEN
11953C                 STATISTICAL ENGINEERING DIVISION
11954C                 INFORMATION TECHNOLOGY LABORATORY
11955C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11956C                 GAITHERSBURG, MD 20899-8980
11957C                 PHONE--301-921-3651
11958C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11959C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
11960C     LANGUAGE--ANSI FORTRAN (1977)
11961C     VERSION NUMBER--2007.12
11962C     ORIGINAL VERSION--DECEMBER  2007.
11963C
11964C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11965C
11966      DOUBLE PRECISION DP
11967      DOUBLE PRECISION DC
11968      DOUBLE PRECISION DPPF
11969C
11970C-----COMMON----------------------------------------------------------
11971C
11972      INCLUDE 'DPCOP2.INC'
11973C
11974C-----START POINT-----------------------------------------------------
11975C     CHECK THE INPUT ARGUMENTS FOR ERRORS
11976C
11977      PPF=0.0
11978      IF(P.LT.0.0 .OR. P.GT.1.0)THEN
11979        WRITE(ICOUT,301)
11980        CALL DPWRST('XXX','BUG ')
11981        WRITE(ICOUT,302)P
11982        CALL DPWRST('XXX','BUG ')
11983        GOTO9999
11984      ELSEIF(C.LE.0.0)THEN
11985        WRITE(ICOUT,311)
11986        CALL DPWRST('XXX','BUG ')
11987        WRITE(ICOUT,302)C
11988        CALL DPWRST('XXX','BUG ')
11989        GOTO9999
11990      ENDIF
11991  301 FORMAT('***** ERROR IN RPOPPF--THE FIRST ARGUMENT IS NOT IN ',
11992     1       'THE INTERVAL (0,1).')
11993  311 FORMAT('***** ERROR IN RPOPPF--THE SECOND ARGUMENT IS ',
11994     1       'NON-POSITIVE.')
11995  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
11996C
11997C-----START POINT-----------------------------------------------------
11998C
11999      IF(P.EQ.0.0)THEN
12000        PPF=0.0
12001      ELSEIF(P.EQ.1.0)THEN
12002        PPF=1.0
12003      ELSE
12004        DP=DBLE(P)
12005        DC=DBLE(C)
12006        DPPF=1.0D0 - (1.0D0-DP)**(1.0D0/DC)
12007        PPF=REAL(DPPF)
12008      ENDIF
12009C
12010 9999 CONTINUE
12011      RETURN
12012      END
12013      SUBROUTINE RPORAN(N,C,ISEED,X)
12014C
12015C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
12016C              FROM THE THE REFLECTED POWER FUNCTION.
12017C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
12018C                                OF RANDOM NUMBERS TO BE
12019C                                GENERATED.
12020C                     --C      = A SINGLE PRECISION VALUE THAT SPECIFIES
12021C                                THE VALUE OF THE SHAPE PARAMETER.
12022C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
12023C                                (OF DIMENSION AT LEAST N)
12024C                                INTO WHICH THE GENERATED
12025C                                RANDOM SAMPLE WILL BE PLACED.
12026C     OUTPUT--A RANDOM SAMPLE OF SIZE N
12027C             FROM THE REFLECTED POWER DISTRIBUTION
12028C             WITH MEAN = 0 AND STANDARD DEVIATION = 1.
12029C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
12030C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
12031C                   OF N FOR THIS SUBROUTINE.
12032C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
12033C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE
12034C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
12035C     LANGUAGE--ANSI FORTRAN (1977)
12036C     REFERENCE --KOTZ AND VAN DORP (2004), "BEYOND BETA: OTHER
12037C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
12038C                 SUPPORT AND APPLICATION", WORLD SCIENTIFIC, PP. 199-201.
12039C     WRITTEN BY--JAMES J. FILLIBEN
12040C                 STATISTICAL ENGINEERING DIVISION
12041C                 INFORMATION TECHNOLOGY LABORATORY
12042C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
12043C                 GAITHERSBURG, MD 20899-8980
12044C                 PHONE--301-975-2855
12045C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
12046C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
12047C     LANGUAGE--ANSI FORTRAN (1977)
12048C     VERSION NUMBER--2007.12
12049C     ORIGINAL VERSION--DECEMBER  2007.
12050C
12051C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
12052C
12053      DIMENSION X(*)
12054      DOUBLE PRECISION DX
12055      DOUBLE PRECISION DC
12056      DOUBLE PRECISION DTEMP
12057C
12058C-----COMMON----------------------------------------------------------
12059C
12060      INCLUDE 'DPCOP2.INC'
12061C
12062C-----START POINT-----------------------------------------------------
12063C
12064C     CHECK THE INPUT ARGUMENTS FOR ERRORS
12065C
12066      IF(N.LT.1)THEN
12067        WRITE(ICOUT, 5)
12068        CALL DPWRST('XXX','BUG ')
12069        WRITE(ICOUT,47)N
12070        CALL DPWRST('XXX','BUG ')
12071        GOTO9000
12072      ELSEIF(C.LE.0.0)THEN
12073        WRITE(ICOUT,311)
12074        CALL DPWRST('XXX','BUG ')
12075        WRITE(ICOUT,312)
12076        CALL DPWRST('XXX','BUG ')
12077        WRITE(ICOUT,302)C
12078        CALL DPWRST('XXX','BUG ')
12079        GOTO9000
12080      ENDIF
12081    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF REFLECTED POWER ',
12082     1       'FUNCTION RANDOM NUMBERS IS NON-POSITIVE.')
12083   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
12084  311 FORMAT('***** ERROR IN REFLECTED POWER FUNCTION RANDOM NUMBERS.')
12085  312 FORMAT('      THE VALUE OF THE SHAPE PARAMETER IS NON-POSITIVE.')
12086  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
12087C
12088C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
12089C
12090      CALL UNIRAN(N,ISEED,X)
12091C
12092C     REFLECTED POWER FUNCTION RANDOM NUMBERS = (UNIFORM)**(1/C)
12093C
12094      DC=DBLE(C)
12095      DO200I=1,N
12096        DX=DBLE(X(I))
12097        DTEMP=1.0D0 - (1.0D0-DX)**(1.0D0/DC)
12098        X(I)=REAL(DTEMP)
12099  200 CONTINUE
12100C
12101 9000 CONTINUE
12102      RETURN
12103      END
12104      SUBROUTINE RSCSUM(X,N,XCAP,IWRITE,XRSCSU,IBUGA3,ISUBRO,IERROR)
12105C
12106C     PURPOSE--THIS SUBROUTINE COMPUTES THE RESCALED SUM OF SCORES
12107C
12108C                  RSCSUM = SUM[i=1 to n][X(i)]/SQRT(N)
12109C
12110C              OF THE DATA IN THE INPUT VECTOR X.
12111C
12112C              SOME AUTHORS RECOMMEND CAPPING THE VALUE OF
12113C              OUTLIERS TO LESSEN THE EFFECT OF SEVERE OUTLIERS
12114C              (THIS CAP IS TYPICALLY SET TO EITHER +/-3 OR
12115C              +/- 4).  SET XOUT TO CPUMIN IF CAPPING IS NOT
12116C              DESIRED.
12117C
12118C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
12119C                                (UNSORTED OR SORTED) OBSERVATIONS.
12120C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
12121C                                IN THE VECTOR X.
12122C     OUTPUT ARGUMENTS--RSCSUM = THE SINGLE PRECISION VALUE OF THE
12123C                                COMPUTED RESCALED SUM.
12124C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE RESCALED SUM.
12125C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
12126C                   OF N FOR THIS SUBROUTINE.
12127C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
12128C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
12129C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
12130C     LANGUAGE--ANSI FORTRAN (1977)
12131C     WRITTEN BY--ALAN HECKERT
12132C                 STATISTICAL ENGINEERING DIVISION
12133C                 INFORMATION TECHNOLOGY LABORATORY
12134C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
12135C                 GAITHERSBURG, MD 20899-8980
12136C                 PHONE--301-975-2855
12137C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
12138C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
12139C     LANGUAGE--ANSI FORTRAN (1977)
12140C     VERSION NUMBER--2012.2
12141C     ORIGINAL VERSION--FEBRUARY  2012.
12142C
12143C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
12144C
12145      CHARACTER*4 IWRITE
12146      CHARACTER*4 IBUGA3
12147      CHARACTER*4 ISUBRO
12148      CHARACTER*4 IERROR
12149C
12150      CHARACTER*4 ISUBN1
12151      CHARACTER*4 ISUBN2
12152C
12153C---------------------------------------------------------------------
12154C
12155      DOUBLE PRECISION DN
12156      DOUBLE PRECISION DX
12157      DOUBLE PRECISION DSUM
12158C
12159      DIMENSION X(*)
12160C
12161C-----COMMON----------------------------------------------------------
12162C
12163      INCLUDE 'DPCOP2.INC'
12164C
12165C-----START POINT-----------------------------------------------------
12166C
12167      ISUBN1='RSCS'
12168      ISUBN2='UM  '
12169      IERROR='NO'
12170C
12171      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'CSUM')THEN
12172        WRITE(ICOUT,999)
12173  999   FORMAT(1X)
12174        CALL DPWRST('XXX','BUG ')
12175        WRITE(ICOUT,51)
12176   51   FORMAT('***** AT THE BEGINNING OF RSCSUM--')
12177        CALL DPWRST('XXX','BUG ')
12178        WRITE(ICOUT,52)IBUGA3,N,XCAP
12179   52   FORMAT('IBUGA3,N,XCAP = ',A4,2X,I8,2X,G15.7)
12180        CALL DPWRST('XXX','BUG ')
12181        DO55I=1,N
12182          WRITE(ICOUT,56)I,X(I)
12183   56     FORMAT('I,X(I) = ',I8,G15.7)
12184          CALL DPWRST('XXX','BUG ')
12185   55   CONTINUE
12186      ENDIF
12187C
12188C               ********************************************
12189C               **  STEP 1--                              **
12190C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
12191C               ********************************************
12192C
12193      IF(N.LT.1)THEN
12194        WRITE(ICOUT,999)
12195        CALL DPWRST('XXX','BUG ')
12196        WRITE(ICOUT,111)
12197  111   FORMAT('***** ERROR IN RESCALED SUM ERROR--')
12198        CALL DPWRST('XXX','BUG ')
12199        WRITE(ICOUT,112)
12200  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
12201     1         'VARIABLE IS LESS THAN 1.')
12202        CALL DPWRST('XXX','BUG ')
12203        WRITE(ICOUT,117)N
12204  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8)
12205        CALL DPWRST('XXX','BUG ')
12206        IERROR='YES'
12207        GOTO9000
12208      ENDIF
12209C
12210C               ******************************************
12211C               **  STEP 2--                            **
12212C               **  COMPUTE THE SUM OF RESCALED SCORES. **
12213C               ******************************************
12214C
12215      DSUM=0.0D0
12216      IF(XCAP.EQ.CPUMIN)THEN
12217        DO200I=1,N
12218          DX=X(I)
12219          DSUM=DSUM + DX
12220  200   CONTINUE
12221      ELSE
12222        DO300I=1,N
12223          DX=X(I)
12224          IF(DABS(DX).GT.DBLE(XCAP))THEN
12225            IF(DX.GT.0.0D0)THEN
12226              DX=ABS(XCAP)
12227            ELSE
12228              DX=-ABS(XCAP)
12229            ENDIF
12230          ENDIF
12231          DSUM=DSUM + DX
12232  300   CONTINUE
12233      ENDIF
12234      DN=DBLE(N)
12235      XRSCSU=REAL(DSUM/DSQRT(DN))
12236C
12237C               *******************************
12238C               **  STEP 3--                 **
12239C               **  WRITE OUT A LINE         **
12240C               **  OF SUMMARY INFORMATION.  **
12241C               *******************************
12242C
12243      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
12244        WRITE(ICOUT,999)
12245        CALL DPWRST('XXX','BUG ')
12246        WRITE(ICOUT,811)N,XRSCSS
12247  811   FORMAT('THE RESCALED SUM OF THE ',I8,' OBSERVATIONS = ',G15.7)
12248        CALL DPWRST('XXX','BUG ')
12249      ENDIF
12250C
12251C               *****************
12252C               **  STEP 90--  **
12253C               **  EXIT.      **
12254C               *****************
12255C
12256 9000 CONTINUE
12257      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'CSUM')THEN
12258        WRITE(ICOUT,999)
12259        CALL DPWRST('XXX','BUG ')
12260        WRITE(ICOUT,9011)
12261 9011   FORMAT('***** AT THE END OF RSCSUM--')
12262        CALL DPWRST('XXX','BUG ')
12263        WRITE(ICOUT,9013)IERROR,N,DSUM,XRSCSU
12264 9013   FORMAT('IERROR,N,DSUM,XRSCSU = ',A4,2X,I8,2G15.7)
12265        CALL DPWRST('XXX','BUG ')
12266      ENDIF
12267C
12268      RETURN
12269      END
12270      SUBROUTINE RSURF(X,Y,NP,KOLR,FRM,
12271     1           XTEMP,YTEMP,TATEMP,NTEMP,NTRACE,
12272     1           IBUGG3,ISUBRO,IERROR)
12273C
12274C     PURPOSE--PAINT IN THE ENCLOSED REGION
12275C              DEFINED BY THE NP COORDINATES
12276C              IN X(.) AND Y(.).
12277C              USE FILL COLOR AS SPECIFIED BY THE INTEGER KOLR
12278C              (WHERE KOLR = 0 IMPLIES NO FILL).
12279C
12280C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
12281C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
12282C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
12283C
12284C---------------------------------------------------------------------
12285C
12286      CHARACTER*4 IBUGG3
12287      CHARACTER*4 ISUBRO
12288      CHARACTER*4 IERROR
12289C
12290      DIMENSION X(*)
12291      DIMENSION Y(*)
12292C
12293      DIMENSION XTEMP(*)
12294      DIMENSION YTEMP(*)
12295      DIMENSION TATEMP(*)
12296C
12297C-----COMMON----------------------------------------------------------
12298C
12299      INCLUDE 'DPCOP2.INC'
12300C
12301C-----START POINT-----------------------------------------------------
12302C
12303      IERROR='NO'
12304      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'SURF')THEN
12305        WRITE(ICOUT,999)
12306  999   FORMAT(1X)
12307        CALL DPWRST('XXX','BUG ')
12308        WRITE(ICOUT,1011)NP,KOLR,NTEMP,NTRACE,FRM
12309 1011   FORMAT('FROM RSURF--NP,KOLR,NTEMP,NTRACE,FRM = ',4I8,F10.5)
12310        CALL DPWRST('XXX','BUG ')
12311        DO1015I=1,NP
12312          WRITE(ICOUT,1016)I,X(I),Y(I),TATEMP(I),XTEMP(I),YTEMP(I)
12313 1016     FORMAT('I,X(I),Y(I),TATEMP(I),XTEMP(I),YTEMP(I) = ',
12314     1           I8,5G15.7)
12315          CALL DPWRST('XXX','BUG ')
12316 1015   CONTINUE
12317      ENDIF
12318C
12319CCCCC NTRACE=NTRACE+1
12320CCCCC DO1100I=1,NP
12321CCCCC NTEMP=NTEMP+1
12322CCCCC XTEMP(NTEMP)=X(I)
12323CCCCC YTEMP(NTEMP)=Y(I)
12324CCCCC TATEMP(NTEMP)=NTRACE
12325C1100 CONTINUE
12326C
12327      RETURN
12328      END
12329      SUBROUTINE RULNRM( LENRUL, NUMNUL, RULPTS, W, RULCON )
12330      INTEGER LENRUL, NUMNUL, I, J, K, RULPTS(*)
12331      DOUBLE PRECISION ALPHA, NORMCF, NORMNL, W(LENRUL, *), RULCON
12332*
12333*     Compute orthonormalized null rules.
12334*
12335      NORMCF = 0
12336      DO 100 I = 1,LENRUL
12337         NORMCF = NORMCF + RULPTS(I)*W(I,1)*W(I,1)
12338  100 CONTINUE
12339      DO 200 K = 2,NUMNUL
12340         DO 300 I = 1,LENRUL
12341            W(I,K) = W(I,K) - W(I,1)
12342  300    CONTINUE
12343         DO 400 J = 2,K-1
12344            ALPHA = 0
12345            DO 500 I = 1,LENRUL
12346               ALPHA = ALPHA + RULPTS(I)*W(I,J)*W(I,K)
12347  500       CONTINUE
12348            ALPHA = -ALPHA/NORMCF
12349            DO 600 I = 1,LENRUL
12350               W(I,K) = W(I,K) + ALPHA*W(I,J)
12351  600       CONTINUE
12352  400    CONTINUE
12353         NORMNL = 0
12354         DO 700 I = 1,LENRUL
12355            NORMNL = NORMNL + RULPTS(I)*W(I,K)*W(I,K)
12356  700    CONTINUE
12357         ALPHA = SQRT(NORMCF/NORMNL)
12358         DO 800 I = 1,LENRUL
12359            W(I,K) = ALPHA*W(I,K)
12360  800    CONTINUE
12361  200 CONTINUE
12362      DO 900 J = 2, NUMNUL
12363         DO 950 I = 1,LENRUL
12364            W(I,J) = W(I,J)/RULCON
12365  950    CONTINUE
12366  900 CONTINUE
12367C
12368      RETURN
12369      END
12370      FUNCTION RUNIF(T,N)
12371C***BEGIN PROLOGUE  RUNIF
12372C***DATE WRITTEN   770401   (YYMMDD)
12373C***REVISION DATE  820801   (YYMMDD)
12374C***REVISION HISTORY  (YYMMDD)
12375C   000330  Modified array declarations.  (JEC)
12376C***CATEGORY NO.  L6A21
12377C***KEYWORDS  RANDOM NUMBER,SPECIAL FUNCTION,UNIFORM
12378C***AUTHOR  FULLERTON, W., (LANL)
12379C***PURPOSE  A portable random number genaerator.
12380C***DESCRIPTION
12381C
12382C This random number generator is portable among a wide variety of
12383C computers.  It generates a random number between 0.0 and 1.0 accord-
12384C ing to the algorithm presented by Bays and Durham (TOMS, 2, 59,
12385C 1976).  The motivation for using this scheme, which resembles the
12386C Maclaren-Marsaglia method, is to greatly increase the period of the
12387C random sequence.  If the period of the basic generator (RAND) is P,
12388C then the expected mean period of the sequence generated by RUNIF is
12389C given by   new mean P = SQRT (PI*FACTORIAL(N)/(8*P)),
12390C where FACTORIAL(N) must be much greater than P in this asymptotic
12391C formula.  Generally, N should be around 32 if P=4.E6 as for RAND.
12392C
12393C             Input Argument --
12394C N      IABS(N) is the number of random numbers in an auxiliary table.
12395C        Note though that IABS(N)+1 is the number of items in array T.
12396C        If N is positive and differs from its value in the previous
12397C        invocation, then the table is initialized for the new value of
12398C        N.  If N is negative, IABS(N) is the number of items in an
12399C        auxiliary table, but the tables are now assumed already to
12400C        be initialized.  This option enables the user to save the
12401C        table T at the end of a long computer run and to restart with
12402C        the same sequence.  Normally, RUNIF would be called at most
12403C        once with negative N.  Subsequent invocations would have N
12404C        positive and of the correct magnitude.
12405C
12406C             Input and Output Argument  --
12407C T      an array of IABS(N)+1 random numbers from a previous invocation
12408C        of RUNIF.  Whenever N is positive and differs from the old
12409C        N, the table is initialized.  The first IABS(N) numbers are the
12410C        table discussed in the reference, and the N+1 -st value is Y.
12411C        This array may be saved in order to restart a sequence.
12412C
12413C             Output Value --
12414C RUNIF  a random number between 0.0 and 1.0.
12415C***REFERENCES  (NONE)
12416C***ROUTINES CALLED  RAND
12417C***END PROLOGUE  RUNIF
12418      DIMENSION T(*)
12419      EXTERNAL RANDDP
12420      DATA NOLD /-1/
12421C***FIRST EXECUTABLE STATEMENT  RUNIF
12422C
12423      FLOATN=0.0
12424C
12425      IF (N.EQ.NOLD) GO TO 20
12426C
12427      NOLD = IABS(N)
12428      FLOATN = NOLD
12429      IF (N.LT.0) DUMMY = RANDDP (T(NOLD+1))
12430      IF (N.LT.0) GO TO 20
12431C
12432      DO 10 I=1,NOLD
12433        T(I) = RANDDP (0.)
12434 10   CONTINUE
12435      T(NOLD+1) = RANDDP (0.)
12436C
12437 20   J = INT(T(NOLD+1)*FLOATN + 1.)
12438      T(NOLD+1) = T(J)
12439      RUNIF = T(J)
12440      T(J) = RANDDP (0.)
12441C
12442      RETURN
12443      END
12444      subroutine rwts(y,n,fit,rw)
12445c
12446c  This routine is part of the Bill Cleveland seasonal loess
12447c  program.
12448c
12449      integer mid(2), n
12450      real y(n), fit(n), rw(n), cmad, c9, c1, r
12451      do 23097 i = 1,n
12452      rw(i) = abs(y(i)-fit(i))
1245323097 continue
12454      mid(1) = n/2+1
12455      mid(2) = n-mid(1)+1
12456      call psort(rw,n,mid,2)
12457      cmad = 3.0*(rw(mid(1))+rw(mid(2)))
12458      c9 = .999*cmad
12459      c1 = .001*cmad
12460      do 23099 i = 1,n
12461      r = abs(y(i)-fit(i))
12462      if(.not.(r .le. c1))goto 23101
12463      rw(i) = 1.
12464      goto 23102
1246523101 continue
12466      if(.not.(r .le. c9))goto 23103
12467      rw(i) = (1.0-(r/cmad)**2)**2
12468      goto 23104
1246923103 continue
12470      rw(i) = 0.
1247123104 continue
1247223102 continue
1247323099 continue
12474      return
12475      end
12476      SUBROUTINE R9AIMP (X, AMPL, THETA)
12477C***BEGIN PROLOGUE  R9AIMP
12478C***SUBSIDIARY
12479C***PURPOSE  Evaluate the Airy modulus and phase.
12480C***LIBRARY   SLATEC (FNLIB)
12481C***CATEGORY  C10D
12482C***TYPE      SINGLE PRECISION (R9AIMP-S, D9AIMP-D)
12483C***KEYWORDS  AIRY FUNCTION, FNLIB, MODULUS, PHASE, SPECIAL FUNCTIONS
12484C***AUTHOR  Fullerton, W., (LANL)
12485C***DESCRIPTION
12486C
12487C Evaluate the Airy modulus and phase for X .LE. -1.0
12488C
12489C Series for AM21       on the interval -1.25000D-01 to  0.
12490C                                        with weighted error   2.89E-17
12491C                                         log weighted error  16.54
12492C                               significant figures required  14.15
12493C                                    decimal places required  17.34
12494C
12495C Series for ATH1       on the interval -1.25000D-01 to  0.
12496C                                        with weighted error   2.53E-17
12497C                                         log weighted error  16.60
12498C                               significant figures required  15.15
12499C                                    decimal places required  17.38
12500C
12501C Series for AM22       on the interval -1.00000D+00 to -1.25000D-01
12502C                                        with weighted error   2.99E-17
12503C                                         log weighted error  16.52
12504C                               significant figures required  14.57
12505C                                    decimal places required  17.28
12506C
12507C Series for ATH2       on the interval -1.00000D+00 to -1.25000D-01
12508C                                        with weighted error   2.57E-17
12509C                                         log weighted error  16.59
12510C                               significant figures required  15.07
12511C                                    decimal places required  17.34
12512C
12513C***REFERENCES  (NONE)
12514C***ROUTINES CALLED  CSEVL, INITS, R1MACH, XERMSG
12515C***REVISION HISTORY  (YYMMDD)
12516C   770701  DATE WRITTEN
12517C   890206  REVISION DATE from Version 3.2
12518C   891214  Prologue converted to Version 4.0 format.  (BAB)
12519C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
12520C   900720  Routine changed from user-callable to subsidiary.  (WRB)
12521C***END PROLOGUE  R9AIMP
12522C
12523C-----COMMON----------------------------------------------------------
12524C
12525      INCLUDE 'DPCOMC.INC'
12526      INCLUDE 'DPCOP2.INC'
12527C
12528      DIMENSION AM21CS(40), ATH1CS(36), AM22CS(33), ATH2CS(32)
12529      LOGICAL FIRST
12530      SAVE AM21CS, ATH1CS, AM22CS, ATH2CS, PI4, NAM21,
12531     1 NATH1, NAM22, NATH2, XSML, FIRST
12532      DATA AM21CS( 1) /    .0065809191 761485E0 /
12533      DATA AM21CS( 2) /    .0023675984 685722E0 /
12534      DATA AM21CS( 3) /    .0001324741 670371E0 /
12535      DATA AM21CS( 4) /    .0000157600 904043E0 /
12536      DATA AM21CS( 5) /    .0000027529 702663E0 /
12537      DATA AM21CS( 6) /    .0000006102 679017E0 /
12538      DATA AM21CS( 7) /    .0000001595 088468E0 /
12539      DATA AM21CS( 8) /    .0000000471 033947E0 /
12540      DATA AM21CS( 9) /    .0000000152 933871E0 /
12541      DATA AM21CS(10) /    .0000000053 590722E0 /
12542      DATA AM21CS(11) /    .0000000020 000910E0 /
12543      DATA AM21CS(12) /    .0000000007 872292E0 /
12544      DATA AM21CS(13) /    .0000000003 243103E0 /
12545      DATA AM21CS(14) /    .0000000001 390106E0 /
12546      DATA AM21CS(15) /    .0000000000 617011E0 /
12547      DATA AM21CS(16) /    .0000000000 282491E0 /
12548      DATA AM21CS(17) /    .0000000000 132979E0 /
12549      DATA AM21CS(18) /    .0000000000 064188E0 /
12550      DATA AM21CS(19) /    .0000000000 031697E0 /
12551      DATA AM21CS(20) /    .0000000000 015981E0 /
12552      DATA AM21CS(21) /    .0000000000 008213E0 /
12553      DATA AM21CS(22) /    .0000000000 004296E0 /
12554      DATA AM21CS(23) /    .0000000000 002284E0 /
12555      DATA AM21CS(24) /    .0000000000 001232E0 /
12556      DATA AM21CS(25) /    .0000000000 000675E0 /
12557      DATA AM21CS(26) /    .0000000000 000374E0 /
12558      DATA AM21CS(27) /    .0000000000 000210E0 /
12559      DATA AM21CS(28) /    .0000000000 000119E0 /
12560      DATA AM21CS(29) /    .0000000000 000068E0 /
12561      DATA AM21CS(30) /    .0000000000 000039E0 /
12562      DATA AM21CS(31) /    .0000000000 000023E0 /
12563      DATA AM21CS(32) /    .0000000000 000013E0 /
12564      DATA AM21CS(33) /    .0000000000 000008E0 /
12565      DATA AM21CS(34) /    .0000000000 000005E0 /
12566      DATA AM21CS(35) /    .0000000000 000003E0 /
12567      DATA AM21CS(36) /    .0000000000 000001E0 /
12568      DATA AM21CS(37) /    .0000000000 000001E0 /
12569      DATA AM21CS(38) /    .0000000000 000000E0 /
12570      DATA AM21CS(39) /    .0000000000 000000E0 /
12571      DATA AM21CS(40) /    .0000000000 000000E0 /
12572      DATA ATH1CS( 1) /   -.0712583781 5669365E0 /
12573      DATA ATH1CS( 2) /   -.0059047197 9831451E0 /
12574      DATA ATH1CS( 3) /   -.0001211454 4069499E0 /
12575      DATA ATH1CS( 4) /   -.0000098860 8542270E0 /
12576      DATA ATH1CS( 5) /   -.0000013808 4097352E0 /
12577      DATA ATH1CS( 6) /   -.0000002614 2640172E0 /
12578      DATA ATH1CS( 7) /   -.0000000605 0432589E0 /
12579      DATA ATH1CS( 8) /   -.0000000161 8436223E0 /
12580      DATA ATH1CS( 9) /   -.0000000048 3464911E0 /
12581      DATA ATH1CS(10) /   -.0000000015 7655272E0 /
12582      DATA ATH1CS(11) /   -.0000000005 5231518E0 /
12583      DATA ATH1CS(12) /   -.0000000002 0545441E0 /
12584      DATA ATH1CS(13) /   -.0000000000 8043412E0 /
12585      DATA ATH1CS(14) /   -.0000000000 3291252E0 /
12586      DATA ATH1CS(15) /   -.0000000000 1399875E0 /
12587      DATA ATH1CS(16) /   -.0000000000 0616151E0 /
12588      DATA ATH1CS(17) /   -.0000000000 0279614E0 /
12589      DATA ATH1CS(18) /   -.0000000000 0130428E0 /
12590      DATA ATH1CS(19) /   -.0000000000 0062373E0 /
12591      DATA ATH1CS(20) /   -.0000000000 0030512E0 /
12592      DATA ATH1CS(21) /   -.0000000000 0015239E0 /
12593      DATA ATH1CS(22) /   -.0000000000 0007758E0 /
12594      DATA ATH1CS(23) /   -.0000000000 0004020E0 /
12595      DATA ATH1CS(24) /   -.0000000000 0002117E0 /
12596      DATA ATH1CS(25) /   -.0000000000 0001132E0 /
12597      DATA ATH1CS(26) /   -.0000000000 0000614E0 /
12598      DATA ATH1CS(27) /   -.0000000000 0000337E0 /
12599      DATA ATH1CS(28) /   -.0000000000 0000188E0 /
12600      DATA ATH1CS(29) /   -.0000000000 0000105E0 /
12601      DATA ATH1CS(30) /   -.0000000000 0000060E0 /
12602      DATA ATH1CS(31) /   -.0000000000 0000034E0 /
12603      DATA ATH1CS(32) /   -.0000000000 0000020E0 /
12604      DATA ATH1CS(33) /   -.0000000000 0000011E0 /
12605      DATA ATH1CS(34) /   -.0000000000 0000007E0 /
12606      DATA ATH1CS(35) /   -.0000000000 0000004E0 /
12607      DATA ATH1CS(36) /   -.0000000000 0000002E0 /
12608      DATA AM22CS( 1) /   -.0156284448 0625341E0 /
12609      DATA AM22CS( 2) /    .0077833644 5239681E0 /
12610      DATA AM22CS( 3) /    .0008670577 7047718E0 /
12611      DATA AM22CS( 4) /    .0001569662 7315611E0 /
12612      DATA AM22CS( 5) /    .0000356396 2571432E0 /
12613      DATA AM22CS( 6) /    .0000092459 8335425E0 /
12614      DATA AM22CS( 7) /    .0000026211 0161850E0 /
12615      DATA AM22CS( 8) /    .0000007918 8221651E0 /
12616      DATA AM22CS( 9) /    .0000002510 4152792E0 /
12617      DATA AM22CS(10) /    .0000000826 5223206E0 /
12618      DATA AM22CS(11) /    .0000000280 5711662E0 /
12619      DATA AM22CS(12) /    .0000000097 6821090E0 /
12620      DATA AM22CS(13) /    .0000000034 7407923E0 /
12621      DATA AM22CS(14) /    .0000000012 5828132E0 /
12622      DATA AM22CS(15) /    .0000000004 6298826E0 /
12623      DATA AM22CS(16) /    .0000000001 7272825E0 /
12624      DATA AM22CS(17) /    .0000000000 6523192E0 /
12625      DATA AM22CS(18) /    .0000000000 2490471E0 /
12626      DATA AM22CS(19) /    .0000000000 0960156E0 /
12627      DATA AM22CS(20) /    .0000000000 0373448E0 /
12628      DATA AM22CS(21) /    .0000000000 0146417E0 /
12629      DATA AM22CS(22) /    .0000000000 0057826E0 /
12630      DATA AM22CS(23) /    .0000000000 0022991E0 /
12631      DATA AM22CS(24) /    .0000000000 0009197E0 /
12632      DATA AM22CS(25) /    .0000000000 0003700E0 /
12633      DATA AM22CS(26) /    .0000000000 0001496E0 /
12634      DATA AM22CS(27) /    .0000000000 0000608E0 /
12635      DATA AM22CS(28) /    .0000000000 0000248E0 /
12636      DATA AM22CS(29) /    .0000000000 0000101E0 /
12637      DATA AM22CS(30) /    .0000000000 0000041E0 /
12638      DATA AM22CS(31) /    .0000000000 0000017E0 /
12639      DATA AM22CS(32) /    .0000000000 0000007E0 /
12640      DATA AM22CS(33) /    .0000000000 0000002E0 /
12641      DATA ATH2CS( 1) /    .0044052734 5871877E0 /
12642      DATA ATH2CS( 2) /   -.0304291945 2318455E0 /
12643      DATA ATH2CS( 3) /   -.0013856532 8377179E0 /
12644      DATA ATH2CS( 4) /   -.0001804443 9089549E0 /
12645      DATA ATH2CS( 5) /   -.0000338084 7108327E0 /
12646      DATA ATH2CS( 6) /   -.0000076781 8353522E0 /
12647      DATA ATH2CS( 7) /   -.0000019678 3944371E0 /
12648      DATA ATH2CS( 8) /   -.0000005483 7271158E0 /
12649      DATA ATH2CS( 9) /   -.0000001625 4615505E0 /
12650      DATA ATH2CS(10) /   -.0000000505 3049981E0 /
12651      DATA ATH2CS(11) /   -.0000000163 1580701E0 /
12652      DATA ATH2CS(12) /   -.0000000054 3420411E0 /
12653      DATA ATH2CS(13) /   -.0000000018 5739855E0 /
12654      DATA ATH2CS(14) /   -.0000000006 4895120E0 /
12655      DATA ATH2CS(15) /   -.0000000002 3105948E0 /
12656      DATA ATH2CS(16) /   -.0000000000 8363282E0 /
12657      DATA ATH2CS(17) /   -.0000000000 3071196E0 /
12658      DATA ATH2CS(18) /   -.0000000000 1142367E0 /
12659      DATA ATH2CS(19) /   -.0000000000 0429811E0 /
12660      DATA ATH2CS(20) /   -.0000000000 0163389E0 /
12661      DATA ATH2CS(21) /   -.0000000000 0062693E0 /
12662      DATA ATH2CS(22) /   -.0000000000 0024260E0 /
12663      DATA ATH2CS(23) /   -.0000000000 0009461E0 /
12664      DATA ATH2CS(24) /   -.0000000000 0003716E0 /
12665      DATA ATH2CS(25) /   -.0000000000 0001469E0 /
12666      DATA ATH2CS(26) /   -.0000000000 0000584E0 /
12667      DATA ATH2CS(27) /   -.0000000000 0000233E0 /
12668      DATA ATH2CS(28) /   -.0000000000 0000093E0 /
12669      DATA ATH2CS(29) /   -.0000000000 0000037E0 /
12670      DATA ATH2CS(30) /   -.0000000000 0000015E0 /
12671      DATA ATH2CS(31) /   -.0000000000 0000006E0 /
12672      DATA ATH2CS(32) /   -.0000000000 0000002E0 /
12673      DATA PI4 / 0.7853981633 9744831 E0 /
12674      DATA FIRST /.TRUE./
12675C***FIRST EXECUTABLE STATEMENT  R9AIMP
12676      IF (FIRST) THEN
12677         ETA = 0.1*R1MACH(3)
12678         NAM21 = INITS (AM21CS, 40, ETA)
12679         NATH1 = INITS (ATH1CS, 36, ETA)
12680         NAM22 = INITS (AM22CS, 33, ETA)
12681         NATH2 = INITS (ATH2CS, 32, ETA)
12682C
12683         XSML = -1.0/R1MACH(3)**0.3333
12684      ENDIF
12685      FIRST = .FALSE.
12686C
12687      IF (X.GE.(-2.0)) GO TO 20
12688      Z = 1.0
12689      IF (X.GT.XSML) Z = 16.0/X**3 + 1.0
12690      AMPL = 0.3125 + CSEVL(Z, AM21CS, NAM21)
12691      THETA = -0.625 + CSEVL (Z, ATH1CS, NATH1)
12692      GO TO 30
12693C
12694 20   IF (X .GT. (-1.0)) THEN
12695        WRITE(ICOUT,1)
12696    1   FORMAT('***** ERORR FROM R9AIMP, X MUST BE LESS THAN OR EQUAL',
12697     1         ' TO -1.  *******')
12698        CALL DPWRST('XXX','BUG ')
12699        RETURN
12700      ENDIF
12701C
12702      Z = (16.0/X**3 + 9.0)/7.0
12703      AMPL = 0.3125 + CSEVL (Z, AM22CS, NAM22)
12704      THETA = -0.625 + CSEVL (Z, ATH2CS, NATH2)
12705C
12706 30   SQRTX = SQRT(-X)
12707      AMPL = SQRT (AMPL/SQRTX)
12708      THETA = PI4 - X*SQRTX * THETA
12709C
12710      RETURN
12711      END
12712      SUBROUTINE SAMLMR(X,N,XMOM,NMOM,A,B)
12713C===================================================== SAMLMR.FOR
12714C***********************************************************************
12715C*                                                                     *
12716C*  FORTRAN CODE WRITTEN FOR INCLUSION IN IBM RESEARCH REPORT RC20525, *
12717C*  'FORTRAN ROUTINES FOR USE WITH THE METHOD OF L-MOMENTS, VERSION 3' *
12718C*                                                                     *
12719C*  J. R. M. HOSKING                                                   *
12720C*  IBM RESEARCH DIVISION                                              *
12721C*  T. J. WATSON RESEARCH CENTER                                       *
12722C*  YORKTOWN HEIGHTS                                                   *
12723C*  NEW YORK 10598, U.S.A.                                             *
12724C*                                                                     *
12725C*  VERSION 3     AUGUST 1996                                          *
12726C*                                                                     *
12727C***********************************************************************
12728C
12729C  SAMPLE L-MOMENTS OF A DATA ARRAY
12730C
12731C  PARAMETERS OF ROUTINE:
12732C  X      * INPUT* ARRAY OF LENGTH N. CONTAINS THE DATA, IN ASCENDING
12733C                  ORDER.
12734C  N      * INPUT* NUMBER OF DATA VALUES
12735C  XMOM   *OUTPUT* ARRAY OF LENGTH NMOM. ON EXIT, CONTAINS THE SAMPLE
12736C                  L-MOMENTS L-1, L-2, T-3, T-4, ... .
12737C  NMOM   * INPUT* NUMBER OF L-MOMENTS TO BE FOUND. AT MOST MAX(N,20).
12738C  A      * INPUT* ) PARAMETERS OF PLOTTING
12739C  B      * INPUT* ) POSITION (SEE BELOW)
12740C
12741C  FOR UNBIASED ESTIMATES (OF THE LAMBDA'S) SET A=B=ZERO. OTHERWISE,
12742C  PLOTTING-POSITION ESTIMATORS ARE USED, BASED ON THE PLOTTING POSITION
12743C  (J+A)/(N+B)  FOR THE J'TH SMALLEST OF N OBSERVATIONS. FOR EXAMPLE,
12744C  A=-0.35D0 AND B=0.0D0 YIELDS THE ESTIMATORS RECOMMENDED BY
12745C  HOSKING ET AL. (1985, TECHNOMETRICS) FOR THE GEV DISTRIBUTION.
12746C
12747C  MODIFIED 6/2005 FOR INCLUSION INTO DATAPLOT BY ALAN HECKERT.
12748C  NOTE THAT THE CHANGES WERE ONLY FOR THE I/O, NO CHANGE IN
12749C  COMPUTATIONAL ASPECTS.
12750C
12751      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
12752      DOUBLE PRECISION X(N),XMOM(NMOM),SUM(20)
12753C
12754      INCLUDE 'DPCOP2.INC'
12755C
12756      DATA ZERO/0D0/,ONE/1D0/
12757C
12758      IF(NMOM.GT.20.OR.NMOM.GT.N)THEN
12759        WRITE(ICOUT,999)
12760  999   FORMAT(1X)
12761        CALL DPWRST('XXX','BUG ')
12762        WRITE(ICOUT,7000)
12763 7000   FORMAT('****** ERROR IN ROUTINE SAMLMR: PARAMETER NMOM ',
12764     1         '(NUMBER OF MOMENTS) INVALID')
12765        CALL DPWRST('XXX','BUG ')
12766      ENDIF
12767C
12768      DO 10 J=1,NMOM
12769         SUM(J)=ZERO
12770   10 CONTINUE
12771      IF(A.EQ.ZERO.AND.B.EQ.ZERO)THEN
12772C
12773C         UNBIASED ESTIMATES OF PWM'S
12774C
12775         DO 70 I=1,N
12776            Z=I
12777            TERM=X(I)
12778            SUM(1)=SUM(1)+TERM
12779            DO 60 J=2,NMOM
12780               Z=Z-ONE
12781               TERM=TERM*Z
12782               SUM(J)=SUM(J)+TERM
12783   60       CONTINUE
12784   70    CONTINUE
12785         Y=N
12786         Z=N
12787         SUM(1)=SUM(1)/Z
12788         DO 80 J=2,NMOM
12789            Y=Y-ONE
12790            Z=Z*Y
12791            SUM(J)=SUM(J)/Z
12792   80    CONTINUE
12793      ELSE
12794         IF(A.LE.-ONE.OR.A.GE.B)THEN
12795            WRITE(ICOUT,999)
12796            CALL DPWRST('XXX','BUG ')
12797            WRITE(ICOUT,7010)
12798 7010       FORMAT('****** ERROR IN ROUTINE SAMLMR :')
12799            CALL DPWRST('XXX','BUG ')
12800            WRITE(ICOUT,7011)
12801 7011       FORMAT('       PLOTTING-POSITION PARAMETERS INVALID')
12802            CALL DPWRST('XXX','BUG ')
12803            RETURN
12804         ENDIF
12805C
12806C         PLOTTING-POSITION ESTIMATES OF PWM'S
12807C
12808         DO 30 I=1,N
12809            PPOS=(I+A)/(N+B)
12810            TERM=X(I)
12811            SUM(1)=SUM(1)+TERM
12812            DO 20 J=2,NMOM
12813               TERM=TERM*PPOS
12814               SUM(J)=SUM(J)+TERM
12815   20       CONTINUE
12816   30    CONTINUE
12817         DO 40 J=1,NMOM
12818            SUM(J)=SUM(J)/N
12819   40    CONTINUE
12820      ENDIF
12821C
12822C         L-MOMENTS
12823C
12824      K=NMOM
12825      P0=ONE
12826      IF(NMOM-NMOM/2*2.EQ.1)P0=-ONE
12827      DO 120 KK=2,NMOM
12828         AK=K
12829         P0=-P0
12830         P=P0
12831         TEMP=P*SUM(1)
12832         DO 110 I=1,K-1
12833            AI=I
12834            P=-P*(AK+AI-ONE)*(AK-AI)/(AI*AI)
12835            TEMP=TEMP+P*SUM(I+1)
12836  110    CONTINUE
12837         SUM(K)=TEMP
12838         K=K-1
12839  120 CONTINUE
12840      XMOM(1)=SUM(1)
12841      IF(NMOM.EQ.1)RETURN
12842      XMOM(2)=SUM(2)
12843      IF(SUM(2).EQ.ZERO)THEN
12844         WRITE(ICOUT,999)
12845         CALL DPWRST('XXX','BUG ')
12846         WRITE(ICOUT,7020)
12847 7020    FORMAT('****** ERROR IN ROUTINE SAMLMR: ALL DATA VALUES ',
12848     1          'EQUAL.')
12849         CALL DPWRST('XXX','BUG ')
12850         RETURN
12851      ENDIF
12852      IF(NMOM.EQ.2)RETURN
12853      DO 130 K=3,NMOM
12854         XMOM(K)=SUM(K)/SUM(2)
12855  130 CONTINUE
12856C
12857      RETURN
12858      END
12859      SUBROUTINE SAMLMU(X,N,XMOM,NMOM)
12860C===================================================== SAMLMU.FOR
12861C***********************************************************************
12862C*                                                                     *
12863C*  FORTRAN CODE WRITTEN FOR INCLUSION IN IBM RESEARCH REPORT RC20525, *
12864C*  'FORTRAN ROUTINES FOR USE WITH THE METHOD OF L-MOMENTS, VERSION 3' *
12865C*                                                                     *
12866C*  J. R. M. HOSKING                                                   *
12867C*  IBM RESEARCH DIVISION                                              *
12868C*  T. J. WATSON RESEARCH CENTER                                       *
12869C*  YORKTOWN HEIGHTS                                                   *
12870C*  NEW YORK 10598, U.S.A.                                             *
12871C*                                                                     *
12872C*  VERSION 3     AUGUST 1996                                          *
12873C*                                                                     *
12874C***********************************************************************
12875C
12876C  SAMPLE L-MOMENTS OF A DATA ARRAY
12877C
12878C  PARAMETERS OF ROUTINE:
12879C  X      * INPUT* ARRAY OF LENGTH N. CONTAINS THE DATA, IN ASCENDING
12880C                  ORDER.
12881C  N      * INPUT* NUMBER OF DATA VALUES
12882C  XMOM   *OUTPUT* ARRAY OF LENGTH NMOM. CONTAINS THE SAMPLE L-MOMENTS,
12883C                  STORED AS DESCRIBED BELOW.
12884C  NMOM   * INPUT* NUMBER OF L-MOMENTS TO BE FOUND. AT MOST 100.
12885C
12886C  MODIFIED 6/2005 FOR INCLUSION INTO DATAPLOT BY ALAN HECKERT.
12887C  NOTE THAT THE CHANGES WERE ONLY FOR THE I/O, NO CHANGE IN
12888C  COMPUTATIONAL ASPECTS.
12889C
12890      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
12891      PARAMETER (MAXMOM=100)
12892      DOUBLE PRECISION X(N),XMOM(NMOM),COEF(2,MAXMOM)
12893C
12894      INCLUDE 'DPCOP2.INC'
12895C
12896      DATA ZERO/0.0D0/,ONE/1.0D0/,TWO/2.0D0/
12897C
12898      IF(NMOM.GT.MAXMOM)THEN
12899        WRITE(ICOUT,999)
12900  999   FORMAT(1X)
12901        CALL DPWRST('XXX','BUG ')
12902        WRITE(ICOUT,7000)
12903 7000   FORMAT('****** ERROR IN ROUTINE SAMLMU: PARAMETER NMOM ',
12904     1         '(NUMBER OF MOMENTS) INVALID')
12905        CALL DPWRST('XXX','BUG ')
12906      ENDIF
12907C
12908      DN=N
12909      DO 10 J=1,NMOM
12910         XMOM(J)=ZERO
12911   10 CONTINUE
12912      IF(NMOM.LE.2)THEN
12913C
12914C         AT MOST TWO L-MOMENTS
12915C
12916         SUM1=ZERO
12917         SUM2=ZERO
12918         TEMP=-DN+ONE
12919         DO 110 I=1,N
12920            SUM1=SUM1+X(I)
12921            SUM2=SUM2+X(I)*TEMP
12922            TEMP=TEMP+TWO
12923  110    CONTINUE
12924         XMOM(1)=SUM1/DN
12925         IF(NMOM.EQ.1)RETURN
12926         XMOM(2)=SUM2/(DN*(DN-ONE))
12927         RETURN
12928      ELSE
12929C
12930C         UNBIASED ESTIMATES OF L-MOMENTS -- THE 'DO 30' LOOP
12931C         RECURSIVELY CALCULATES DISCRETE LEGENDRE POLYNOMIALS, VIA
12932C         EQ.(9) OF NEUMAN AND SCHONBACH (1974, INT.J.NUM.METH.ENG.)
12933C
12934         DO 20 J=3,NMOM
12935           TEMP=ONE/DBLE((J-1)*(N-J+1))
12936           COEF(1,J)=DBLE(J+J-3)*TEMP
12937           COEF(2,J)=DBLE((J-2)*(N+J-2))*TEMP
12938   20    CONTINUE
12939         TEMP=-DN-ONE
12940         CONST=ONE/(DN-ONE)
12941         NHALF=N/2
12942         DO 40 I=1,NHALF
12943            TEMP=TEMP+TWO
12944            XI=X(I)
12945            XII=X(N+1-I)
12946            TERMP=XI+XII
12947            TERMN=XI-XII
12948            XMOM(1)=XMOM(1)+TERMP
12949            S1=ONE
12950            S=TEMP*CONST
12951            XMOM(2)=XMOM(2)+S*TERMN
12952            DO 30 J=3,NMOM,2
12953               S2=S1
12954               S1=S
12955               S=COEF(1,J)*TEMP*S1-COEF(2,J)*S2
12956               XMOM(J)=XMOM(J)+S*TERMP
12957               IF(J.EQ.NMOM)GOTO 30
12958               JJ=J+1
12959               S2=S1
12960               S1=S
12961               S=COEF(1,JJ)*TEMP*S1-COEF(2,JJ)*S2
12962               XMOM(JJ)=XMOM(JJ)+S*TERMN
12963   30       CONTINUE
12964   40    CONTINUE
12965         IF(N.EQ.NHALF+NHALF)GOTO 60
12966           TERM=X(NHALF+1)
12967           S=ONE
12968           XMOM(1)=XMOM(1)+TERM
12969           DO 50 J=3,NMOM,2
12970              S=-COEF(2,J)*S
12971              XMOM(J)=XMOM(J)+S*TERM
12972   50      CONTINUE
12973C
12974C         L-MOMENT RATIOS
12975C
12976   60    CONTINUE
12977         XMOM(1)=XMOM(1)/DN
12978         IF(XMOM(2).EQ.ZERO)THEN
12979            WRITE(ICOUT,999)
12980            CALL DPWRST('XXX','BUG ')
12981            WRITE(ICOUT,7020)
12982 7020       FORMAT('****** ERROR IN ROUTINE SAMLMU: ALL DATA VALUES ',
12983     1             'EQUAL.')
12984            CALL DPWRST('XXX','BUG ')
12985            DO 1020 J=1,NMOM
12986               XMOM(J)=ZERO
12987 1020       CONTINUE
12988            RETURN
12989         ENDIF
12990         DO 70 J=3,NMOM
12991            XMOM(J)=XMOM(J)/XMOM(2)
12992   70    CONTINUE
12993         XMOM(2)=XMOM(2)/DN
12994         RETURN
12995      ENDIF
12996C
12997C
12998      RETURN
12999      END
13000      SUBROUTINE SAMPWM(X,N,XMOM,NMOM,A,B,KIND)
13001C===================================================== SAMPWM.FOR
13002C***********************************************************************
13003C*                                                                     *
13004C*  FORTRAN CODE WRITTEN FOR INCLUSION IN IBM RESEARCH REPORT RC20525, *
13005C*  'FORTRAN ROUTINES FOR USE WITH THE METHOD OF L-MOMENTS, VERSION 3' *
13006C*                                                                     *
13007C*  J. R. M. HOSKING                                                   *
13008C*  IBM RESEARCH DIVISION                                              *
13009C*  T. J. WATSON RESEARCH CENTER                                       *
13010C*  YORKTOWN HEIGHTS                                                   *
13011C*  NEW YORK 10598, U.S.A.                                             *
13012C*                                                                     *
13013C*  VERSION 3     AUGUST 1996                                          *
13014C*                                                                     *
13015C***********************************************************************
13016C
13017C  PROBABILITY WEIGHTED MOMENTS OF A DATA ARRAY
13018C
13019C  PARAMETERS OF ROUTINE:
13020C  X      * INPUT* ARRAY OF LENGTH N. CONTAINS THE DATA, IN ASCENDING
13021C                  ORDER.
13022C  N      * INPUT* NUMBER OF DATA VALUES
13023C  XMOM   *OUTPUT* ARRAY OF LENGTH NMOM. ON EXIT, CONTAINS THE SAMPLE
13024C                  PROBABILITY WEIGHTED MOMENTS. XMOM(I) CONTAINS
13025C                  ALPHA-SUB-(I-1) OR BETA-SUB-(I-1).
13026C  NMOM   * INPUT* NUMBER OF PROBABILITY WEIGHTED MOMENTS TO BE FOUND.
13027C                  AT MOST MAX(N,20).
13028C  A      * INPUT* ) PARAMETERS OF PLOTTING
13029C  B      * INPUT* ) POSITION (SEE BELOW)
13030C  KIND   * INPUT* SPECIFIES WHICH KIND OF PWM'S ARE TO BE FOUND.
13031C                  1  ALPHA-SUB-R = E ( X (1-F(X))**R )
13032C                  2  BETA -SUB-R = E ( X F(X)**R )
13033C
13034C  FOR UNBIASED ESTIMATES SET A AND B EQUAL TO ZERO. OTHERWISE,
13035C  PLOTTING-POSITION ESTIMATORS ARE USED, BASED ON THE PLOTTING POSITION
13036C  (J+A)/(N+B)  FOR THE J'TH SMALLEST OF N OBSERVATIONS. FOR EXAMPLE,
13037C  A=-0.35D0 AND B=0.0D0 YIELDS THE ESTIMATORS RECOMMENDED BY
13038C  HOSKING ET AL. (1985, TECHNOMETRICS) FOR THE GEV DISTRIBUTION.
13039C
13040C  MODIFIED 6/2005 FOR INCLUSION INTO DATAPLOT BY ALAN HECKERT.
13041C  NOTE THAT THE CHANGES WERE ONLY FOR THE I/O, NO CHANGE IN
13042C  COMPUTATIONAL ASPECTS.
13043C
13044      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
13045      DOUBLE PRECISION X(N),XMOM(NMOM)
13046C
13047      INCLUDE 'DPCOP2.INC'
13048C
13049      DATA ZERO/0D0/,ONE/1D0/
13050      IF(NMOM.GT.20.OR.NMOM.GT.N)THEN
13051         WRITE(ICOUT,999)
13052  999    FORMAT(1X)
13053         CALL DPWRST('XXX','BUG ')
13054         WRITE(ICOUT,7000)
13055 7000    FORMAT('****** ERROR IN ROUTINE SAMPWM: PARAMETER NMOM ',
13056     1          '(NUMBER OF MOMENTS) INVALID')
13057         CALL DPWRST('XXX','BUG ')
13058      ENDIF
13059C
13060      IF(KIND.NE.1.AND.KIND.NE.2)THEN
13061         WRITE(ICOUT,999)
13062         CALL DPWRST('XXX','BUG ')
13063         WRITE(ICOUT,7010)
13064 7010    FORMAT('****** ERROR IN ROUTINE SAMPWM : PARAMETER KIND ',
13065     1          'INVALID.')
13066         CALL DPWRST('XXX','BUG ')
13067         RETURN
13068      ENDIF
13069      DO 10 J=1,NMOM
13070         XMOM(J)=ZERO
13071   10 CONTINUE
13072      DN=N
13073      IF(A.EQ.ZERO.AND.B.EQ.ZERO)THEN
13074C
13075C         UNBIASED ESTIMATES OF PWM'S
13076C
13077         DO 70 I=1,N
13078            DI=I
13079            WEIGHT=ONE/DN
13080            XMOM(1)=XMOM(1)+WEIGHT*X(I)
13081            DO 60 J=2,NMOM
13082               DJ=J-ONE
13083               IF(KIND.EQ.1)THEN
13084                  WEIGHT=WEIGHT*(DN-DI-DJ+ONE)/(DN-DJ)
13085               ELSEIF(KIND.EQ.2)THEN
13086                  WEIGHT=WEIGHT*(DI-DJ)/(DN-DJ)
13087               ENDIF
13088               XMOM(J)=XMOM(J)+WEIGHT*X(I)
13089   60       CONTINUE
13090   70    CONTINUE
13091      ELSE
13092         IF(A.LE.-ONE.OR.A.GE.B)THEN
13093            WRITE(ICOUT,999)
13094            CALL DPWRST('XXX','BUG ')
13095            WRITE(ICOUT,7020)
13096 7020       FORMAT('****** ERROR IN ROUTINE SAMPWM:',
13097     *             ' PLOTTING-POSITION PARAMETERS INVALID')
13098            CALL DPWRST('XXX','BUG ')
13099            RETURN
13100         ENDIF
13101C
13102C         PLOTTING-POSITION ESTIMATES OF PWM'S
13103C
13104         DO 30 I=1,N
13105            PPOS=(I+A)/(N+B)
13106            IF(KIND.EQ.1)PPOS=ONE-PPOS
13107            TERM=X(I)
13108            XMOM(1)=XMOM(1)+TERM
13109            DO 20 J=2,NMOM
13110               TERM=TERM*PPOS
13111               XMOM(J)=XMOM(J)+TERM
13112   20       CONTINUE
13113   30    CONTINUE
13114         DO 40 J=1,NMOM
13115            XMOM(J)=XMOM(J)/DN
13116   40    CONTINUE
13117      ENDIF
13118C
13119      RETURN
13120      END
13121      REAL FUNCTION SASUM(N,SX,INCX)
13122C***BEGIN PROLOGUE  SASUM
13123C***DATE WRITTEN   791001   (YYMMDD)
13124C***REVISION DATE  820801   (YYMMDD)
13125C***CATEGORY NO.  D1A3A
13126C***KEYWORDS  ADD,BLAS,LINEAR ALGEBRA,MAGNITUDE,SUM,VECTOR
13127C***AUTHOR  LAWSON, C. L., (JPL)
13128C           HANSON, R. J., (SNLA)
13129C           KINCAID, D. R., (U. OF TEXAS)
13130C           KROGH, F. T., (JPL)
13131C***PURPOSE  Sum of magnitudes of s.p vector components
13132C***DESCRIPTION
13133C
13134C                B L A S  Subprogram
13135C    Description of Parameters
13136C
13137C     --Input--
13138C        N  number of elements in input vector(S)
13139C       SX  single precision vector with N elements
13140C     INCX  storage spacing between elements of SX
13141C
13142C     --Output--
13143C    SASUM  single precision result (zero if N .LE. 0)
13144C
13145C     Returns sum of magnitudes of single precision SX.
13146C     SASUM = sum from 0 to N-1 of  ABS(SX(1+I*INCX))
13147C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
13148C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
13149C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
13150C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
13151C***ROUTINES CALLED  (NONE)
13152C***END PROLOGUE  SASUM
13153C
13154      REAL SX(*)
13155C***FIRST EXECUTABLE STATEMENT  SASUM
13156      SASUM = 0.0E0
13157      IF(N.LE.0)RETURN
13158      IF(INCX.EQ.1)GOTO 20
13159C
13160C        CODE FOR INCREMENTS NOT EQUAL TO 1.
13161C
13162      NS = N*INCX
13163          DO 10 I=1,NS,INCX
13164          SASUM = SASUM + ABS(SX(I))
13165   10     CONTINUE
13166      RETURN
13167C
13168C        CODE FOR INCREMENTS EQUAL TO 1.
13169C
13170C
13171C        CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 6.
13172C
13173   20 M = MOD(N,6)
13174      IF( M .EQ. 0 ) GO TO 40
13175      DO 30 I = 1,M
13176        SASUM = SASUM + ABS(SX(I))
13177   30 CONTINUE
13178      IF( N .LT. 6 ) RETURN
13179   40 MP1 = M + 1
13180      DO 50 I = MP1,N,6
13181        SASUM = SASUM + ABS(SX(I)) + ABS(SX(I + 1)) + ABS(SX(I + 2))
13182     1  + ABS(SX(I + 3)) + ABS(SX(I + 4)) + ABS(SX(I + 5))
13183   50 CONTINUE
13184      RETURN
13185      END
13186      SUBROUTINE SADMVN( N, LOWER, UPPER, INFIN, CORREL, MAXPTS,
13187     &                   ABSEPS, RELEPS, ERROR, VALUE, INFORM )
13188*
13189*     A subroutine for computing multivariate normal probabilities.
13190*     This subroutine uses an algorithm given in the paper
13191*     "Numerical Computation of Multivariate Normal Probabilities", in
13192*     J. of Computational and Graphical Stat., 1(1992), pp. 141-149, by
13193*          Alan Genz
13194*          Department of Mathematics
13195*          Washington State University
13196*          Pullman, WA 99164-3113
13197*          Email : alangenz@wsu.edu
13198*
13199*  Parameters
13200*
13201*     N      INTEGER, the number of variables.
13202*     LOWER  REAL, array of lower integration limits.
13203*     UPPER  REAL, array of upper integration limits.
13204*     INFIN  INTEGER, array of integration limits flags:
13205*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
13206*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
13207*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
13208*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
13209*     CORREL REAL, array of correlation coefficients; the correlation
13210*            coefficient in row I column J of the correlation matrix
13211*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
13212*     MAXPTS INTEGER, maximum number of function values allowed. This
13213*            parameter can be used to limit the time taken. A
13214*            sensible strategy is to start with MAXPTS = 1000*N, and then
13215*            increase MAXPTS if ERROR is too large.
13216*     ABSEPS REAL absolute error tolerance.
13217*     RELEPS REAL relative error tolerance.
13218*     ERROR  REAL estimated absolute error, with 99% confidence level.
13219*     VALUE  REAL estimated value for the integral
13220*     INFORM INTEGER, termination status parameter:
13221*            if INFORM = 0, normal completion with ERROR < EPS;
13222*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
13223*                           function vaules used; increase MAXPTS to
13224*                           decrease ERROR;
13225*            if INFORM = 2, N > 20 or N < 1.
13226*
13227      EXTERNAL MVNFNC
13228      INTEGER N, NL, M, INFIN(*), LENWRK, MAXPTS, INFORM, INFIS,
13229     &     RULCLS, TOTCLS, NEWCLS, MAXCLS
13230      DOUBLE PRECISION
13231     &     CORREL(*), LOWER(*), UPPER(*), ABSEPS, RELEPS, ERROR, VALUE,
13232     &     OLDVAL, D, E, MVNNIT, MVNFNC
13233      PARAMETER ( NL = 20 )
13234      PARAMETER ( LENWRK = 20*NL**2 )
13235      DOUBLE PRECISION WORK(LENWRK)
13236      IF ( N .GT. 20 .OR. N .LT. 1 ) THEN
13237         INFORM = 2
13238         VALUE = 0
13239         ERROR = 1
13240         RETURN
13241      ENDIF
13242      INFORM = INT(MVNNIT(N,CORREL,LOWER,UPPER,INFIN,INFIS,D,E))
13243      M = N - INFIS
13244      IF ( M .EQ. 0 ) THEN
13245         VALUE = 1
13246         ERROR = 0
13247      ELSE IF ( M .EQ. 1 ) THEN
13248         VALUE = E - D
13249         ERROR = 2E-16
13250      ELSE
13251*
13252*        Call the subregion adaptive integration subroutine
13253*
13254         M = M - 1
13255         RULCLS = 1
13256         CALL ADAPT( M, RULCLS, 0, MVNFNC, ABSEPS, RELEPS,
13257     &               LENWRK, WORK, ERROR, VALUE, INFORM )
13258         MAXCLS = MIN( 10*RULCLS, MAXPTS )
13259         TOTCLS = 0
13260         CALL ADAPT(M, TOTCLS, MAXCLS, MVNFNC, ABSEPS, RELEPS,
13261     &        LENWRK, WORK, ERROR, VALUE, INFORM)
13262         IF ( ERROR .GT. MAX( ABSEPS, RELEPS*ABS(VALUE) ) ) THEN
13263 10         OLDVAL = VALUE
13264            MAXCLS = MAX( 2*RULCLS, MIN( 3*MAXCLS/2, MAXPTS - TOTCLS ) )
13265            NEWCLS = -1
13266            CALL ADAPT(M, NEWCLS, MAXCLS, MVNFNC, ABSEPS, RELEPS,
13267     &           LENWRK, WORK, ERROR, VALUE, INFORM)
13268            TOTCLS = TOTCLS + NEWCLS
13269            ERROR = ABS(VALUE-OLDVAL) + SQRT(RULCLS*ERROR**2/TOTCLS)
13270            IF ( ERROR .GT. MAX( ABSEPS, RELEPS*ABS(VALUE) ) ) THEN
13271               IF ( MAXPTS - TOTCLS .GT. 2*RULCLS ) GO TO 10
13272            ELSE
13273               INFORM = 0
13274            END IF
13275         ENDIF
13276      ENDIF
13277C
13278      RETURN
13279      END
13280      SUBROUTINE SADMVT(N, NU, LOWER, UPPER, INFIN, CORREL, MAXPTS,
13281     *      ABSEPS, RELEPS, ERROR, VALUE, INFORM)
13282*
13283*     A subroutine for computing multivariate t probabilities.
13284*          Alan Genz
13285*          Department of Mathematics
13286*          Washington State University
13287*          Pullman, WA 99164-3113
13288*          Email : AlanGenz@wsu.edu
13289*
13290*  Parameters
13291*
13292*     N      INTEGER, the number of variables.
13293*     NU     INTEGER, the number of degrees of freedom.
13294*     LOWER  REAL, array of lower integration limits.
13295*     UPPER  REAL, array of upper integration limits.
13296*     INFIN  INTEGER, array of integration limits flags:
13297*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
13298*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
13299*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
13300*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
13301*     CORREL REAL, array of correlation coefficients; the correlation
13302*            coefficient in row I column J of the correlation matrix
13303*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
13304*     MAXPTS INTEGER, maximum number of function values allowed. This
13305*            parameter can be used to limit the time taken. A sensible
13306*            strategy is to start with MAXPTS = 1000*N, and then
13307*            increase MAXPTS if ERROR is too large.
13308*     ABSEPS REAL absolute error tolerance.
13309*     RELEPS REAL relative error tolerance.
13310*     ERROR  REAL, estimated absolute error, with 99% confidence level.
13311*     VALUE  REAL, estimated value for the integral
13312*     INFORM INTEGER, termination status parameter:
13313*            if INFORM = 0, normal completion with ERROR < EPS;
13314*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
13315*                           function vaules used; increase MAXPTS to
13316*                           decrease ERROR;
13317*            if INFORM = 2, N > 20 or N < 1.
13318*
13319      EXTERNAL FNCMVT
13320      DOUBLE PRECISION FNCMVT
13321      INTEGER NL, N, NU, M, INFIN(*), LENWRK, MAXPTS, INFORM, INFIS,
13322     &     RULCLS, TOTCLS, NEWCLS, MAXCLS
13323      DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*), ABSEPS, RELEPS,
13324     &     ERROR, VALUE, OLDVAL, D, E, MVTNIT
13325      PARAMETER ( NL = 20 )
13326      PARAMETER ( LENWRK = 20*NL**2 )
13327      DOUBLE PRECISION WORK(LENWRK)
13328      IF ( N .GT. 20 .OR. N .LT. 1 ) THEN
13329         INFORM = 2
13330         VALUE = 0.0D0
13331         ERROR = 1.0D0
13332         RETURN
13333      ENDIF
13334      INFORM = INT(MVTNIT(N,NU,CORREL,LOWER,UPPER,INFIN,INFIS,D,E))
13335      M = N - INFIS
13336      IF ( M .EQ. 0 ) THEN
13337         VALUE = 1.0D0
13338         ERROR = 0.0D0
13339      ELSE IF ( M .EQ. 1 ) THEN
13340         VALUE = E - D
13341         ERROR = 2E-16
13342      ELSE
13343*
13344*        Call the subregion adaptive integration subroutine
13345*
13346         M = M - 1
13347         RULCLS = 1
13348         CALL ADAPT( M, RULCLS, 0, FNCMVT, ABSEPS, RELEPS,
13349     *               LENWRK, WORK, ERROR, VALUE, INFORM )
13350         MAXCLS = MIN( 10*RULCLS, MAXPTS )
13351         TOTCLS = 0
13352         CALL ADAPT( M, TOTCLS, MAXCLS, FNCMVT, ABSEPS, RELEPS,
13353     *               LENWRK, WORK, ERROR, VALUE, INFORM )
13354         IF ( ERROR .GT. MAX( ABSEPS, RELEPS*ABS(VALUE) ) ) THEN
13355 10         OLDVAL = VALUE
13356            MAXCLS = MAX( 2*RULCLS, MIN( 3*MAXCLS/2, MAXPTS - TOTCLS ) )
13357            NEWCLS = -1
13358            CALL ADAPT( M, NEWCLS, MAXCLS, FNCMVT, ABSEPS, RELEPS,
13359     *                  LENWRK, WORK, ERROR, VALUE, INFORM  )
13360            TOTCLS = TOTCLS + NEWCLS
13361            ERROR = ABS(VALUE-OLDVAL) +
13362     *              SQRT(REAL(RULCLS)*ERROR**2/REAL(TOTCLS))
13363            IF ( ERROR .GT. MAX( ABSEPS, RELEPS*ABS(VALUE) ) ) THEN
13364               IF ( MAXPTS - TOTCLS .GT. 2*RULCLS ) GO TO 10
13365            ELSE
13366               INFORM = 0
13367            END IF
13368         ENDIF
13369      ENDIF
13370C
13371      RETURN
13372      END
13373      SUBROUTINE SAXPY(N,SA,SX,INCX,SY,INCY)
13374C***BEGIN PROLOGUE  SAXPY
13375C***DATE WRITTEN   791001   (YYMMDD)
13376C***REVISION DATE  820801   (YYMMDD)
13377C***CATEGORY NO.  D1A7
13378C***KEYWORDS  BLAS,LINEAR ALGEBRA,TRIAD,VECTOR
13379C***AUTHOR  LAWSON, C. L., (JPL)
13380C           HANSON, R. J., (SNLA)
13381C           KINCAID, D. R., (U. OF TEXAS)
13382C           KROGH, F. T., (JPL)
13383C***PURPOSE  S.P. computation y = a*x + y
13384C***DESCRIPTION
13385C
13386C                B L A S  Subprogram
13387C    Description of Parameters
13388C
13389C     --Input--
13390C        N  number of elements in input vector(s)
13391C       SA  single precision scalar multiplier
13392C       SX  single precision vector with N elements
13393C     INCX  storage spacing between elements of SX
13394C       SY  single precision vector with N elements
13395C     INCY  storage spacing between elements of SY
13396C
13397C     --Output--
13398C       SY  single precision result (unchanged if N .LE. 0)
13399C
13400C     Overwrite single precision SY with single precision SA*SX +SY.
13401C     For I = 0 to N-1, replace  SY(LY+I*INCY) with SA*SX(LX+I*INCX) +
13402C       SY(LY+I*INCY), where LX = 1 if INCX .GE. 0, else LX = (-INCX)*N
13403C       and LY is defined in a similar way using INCY.
13404C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
13405C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
13406C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
13407C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
13408C***ROUTINES CALLED  (NONE)
13409C***END PROLOGUE  SAXPY
13410C
13411      REAL SX(*),SY(*),SA
13412C***FIRST EXECUTABLE STATEMENT  SAXPY
13413      IF(N.LE.0.OR.SA.EQ.0.E0) RETURN
13414C
13415CCCCC JULY 2008: MODIFY FOLLOWING LINE SO THAT IT
13416CCCCC            DOES NOT GENERATE WARNING MESSAGE
13417CCCCC            FOR FORTRAN 95 COMPILER.
13418C
13419CCCCC IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60
13420      IF(INCX.EQ.INCY) THEN
13421        IF(INCX-1.EQ.0)THEN
13422          GOTO20
13423        ELSEIF(INCX-1.GT.0)THEN
13424          GOTO60
13425        ELSE
13426          GOTO5
13427        ENDIF
13428      ENDIF
13429    5 CONTINUE
13430C
13431C        CODE FOR NONEQUAL OR NONPOSITIVE INCREMENTS.
13432C
13433      IX = 1
13434      IY = 1
13435      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
13436      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
13437      DO 10 I = 1,N
13438        SY(IY) = SY(IY) + SA*SX(IX)
13439        IX = IX + INCX
13440        IY = IY + INCY
13441   10 CONTINUE
13442      RETURN
13443C
13444C        CODE FOR BOTH INCREMENTS EQUAL TO 1
13445C
13446C
13447C        CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 4.
13448C
13449   20 M = MOD(N,4)
13450      IF( M .EQ. 0 ) GO TO 40
13451      DO 30 I = 1,M
13452        SY(I) = SY(I) + SA*SX(I)
13453   30 CONTINUE
13454      IF( N .LT. 4 ) RETURN
13455   40 MP1 = M + 1
13456      DO 50 I = MP1,N,4
13457        SY(I) = SY(I) + SA*SX(I)
13458        SY(I + 1) = SY(I + 1) + SA*SX(I + 1)
13459        SY(I + 2) = SY(I + 2) + SA*SX(I + 2)
13460        SY(I + 3) = SY(I + 3) + SA*SX(I + 3)
13461   50 CONTINUE
13462      RETURN
13463C
13464C        CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS.
13465C
13466   60 CONTINUE
13467      NS = N*INCX
13468          DO 70 I=1,NS,INCX
13469          SY(I) = SA*SX(I) + SY(I)
13470   70     CONTINUE
13471      RETURN
13472      END
13473      SUBROUTINE SBFIT(XBAR, SIGMA, RTB1, B2, GAMMA, DELTA, XLAM,
13474     $  XI, FAULT)
13475C
13476C        ALGORITHM AS 99.2  APPL. STATIST. (1976) VOL.25, P.180
13477C
13478C        FINDS PARAMETERS OF JOHNSON SB CURVE WITH
13479C        GIVEN FIRST FOUR MOMENTS
13480C
13481      REAL HMU(6), DERIV(4), DD(4), XBAR, SIGMA, RTB1, B2, GAMMA,
13482     $  DELTA, XLAM, XI, TT, TOL, RB1, B1, E, U, X, Y, W, F, D,
13483     $  G, S, H2, T, H2A, H2B, H3, H4, RBET, BET2, ZERO, ONE,
13484     $  TWO, THREE, FOUR, SIX, HALF, QUART, ONE5, A1, A2, A3,
13485     $  A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15,
13486     $  A16, A17, A18, A19, A20, A21, A22, ZABS, ZLOG, ZSQRT
13487      LOGICAL NEG, FAULT
13488C
13489      DATA TT, TOL, LIMIT /1.0E-4, 0.01, 50/
13490      DATA ZERO, ONE, TWO, THREE, FOUR, SIX, HALF, QUART, ONE5
13491     $     /0.0, 1.0, 2.0,   3.0,  4.0, 6.0,  0.5,  0.25,  1.5/
13492      DATA     A1,     A2,     A3,     A4,     A5,     A6,
13493     $         A7,     A8,     A9,    A10,    A11,    A12,
13494     $        A13,    A14,    A15,    A16,    A17,    A18,
13495     $        A19,    A20,    A21,    A22
13496     $    /0.0124, 0.0623, 0.4043,  0.408,  0.479,  0.485,
13497     $     0.5291, 0.5955,  0.626,   0.64, 0.7077, 0.7466,
13498     $        0.8, 0.9281, 1.0614,   1.25, 1.7973,    1.8,
13499     $      2.163,    2.5, 8.5245, 11.346/
13500C
13501      ZABS(X) = ABS(X)
13502      ZLOG(X) = LOG(X)
13503      ZSQRT(X) = SQRT(X)
13504C
13505      RB1 = ZABS(RTB1)
13506      B1 = RB1 * RB1
13507      NEG = RTB1 .LT. ZERO
13508C
13509C        GET D AS FIRST ESTIMATE OF DELTA
13510C
13511      E = B1 + ONE
13512      X = HALF * B1 + ONE
13513      Y = ZABS(RB1) * ZSQRT(QUART * B1 + ONE)
13514      U = (X + Y) ** (ONE / THREE)
13515      W = U + ONE / U - ONE
13516      F = W * W * (THREE + W * (TWO + W)) - THREE
13517      E = (B2 - E) / (F - E)
13518      IF (ZABS(RB1) .GT. TOL) GOTO 5
13519      F = TWO
13520      GOTO 20
13521    5 D = ONE / ZSQRT(ZLOG(W))
13522      IF (D .LT. A10) GOTO 10
13523      F = TWO - A21 / (D * (D * (D - A19) + A22))
13524      GOTO 20
13525   10 F = A16 * D
13526   20 F = E * F + ONE
13527      IF (F .LT. A18) GOTO 25
13528      D = (A9 * F - A4) * (THREE - F) ** (-A5)
13529      GOTO 30
13530   25 D = A13 * (F - ONE)
13531C
13532C        GET G AS FIRST ESTIMATE OF GAMMA
13533C
13534   30 G = ZERO
13535      IF (B1 .LT. TT) GOTO 70
13536      IF (D .GT. ONE) GOTO 40
13537      G = (A12 * D ** A17 + A8) * B1 ** A6
13538      GOTO 70
13539   40 IF (D .LE. A20) GOTO 50
13540      U = A1
13541      Y = A7
13542      GOTO 60
13543   50 U = A2
13544      Y = A3
13545   60 G = B1 ** (U * D + Y) * (A14 + D * (A15 * D - A11))
13546   70 M = 0
13547C
13548C        MAIN ITERATION STARTS HERE
13549C
13550   80 M = M + 1
13551      FAULT = M .GT. LIMIT
13552      IF (FAULT) RETURN
13553C
13554C        GET FIRST SIX MOMENTS FOR LATEST G AND D VALUES
13555C
13556      CALL MOM(G, D, HMU, FAULT)
13557      IF (FAULT) RETURN
13558      S = HMU(1) * HMU(1)
13559      H2 = HMU(2) - S
13560      FAULT = H2 .LE. ZERO
13561      IF (FAULT) RETURN
13562      T = ZSQRT(H2)
13563      H2A = T * H2
13564      H2B = H2 * H2
13565      H3 = HMU(3) - HMU(1) * (THREE * HMU(2) - TWO * S)
13566      RBET = H3 / H2A
13567      H4 = HMU(4) - HMU(1) * (FOUR * HMU(3) - HMU(1) *
13568     $  (SIX * HMU(2) - THREE * S))
13569      BET2 = H4 / H2B
13570      W = G * D
13571      U = D * D
13572C
13573C        GET DERIVATIVES
13574C
13575      DO 120 J = 1, 2
13576      DO 110 K = 1, 4
13577      T = K
13578      IF (J .EQ. 1) GOTO 90
13579      S = ((W - T) * (HMU(K) - HMU(K + 1)) + (T + ONE) *
13580     $  (HMU(K + 1) - HMU(K + 2))) / U
13581      GOTO 100
13582   90 S = HMU(K + 1) - HMU(K)
13583  100 DD(K) = T * S / D
13584  110 CONTINUE
13585      T = TWO * HMU(1) * DD(1)
13586      S = HMU(1) * DD(2)
13587      Y = DD(2) - T
13588      DERIV(J) = (DD(3) - THREE * (S + HMU(2) * DD(1) - T * HMU(1))
13589     $  - ONE5 * H3 * Y / H2) / H2A
13590      DERIV(J + 2) = (DD(4) - FOUR * (DD(3) * HMU(1) + DD(1) * HMU(3))
13591     $  + SIX * (HMU(2) * T + HMU(1) * (S - T * HMU(1)))
13592     $  - TWO * H4 * Y / H2) / H2B
13593  120 CONTINUE
13594      T = ONE / (DERIV(1) * DERIV(4) - DERIV(2) * DERIV(3))
13595      U = (DERIV(4) * (RBET - RB1) - DERIV(2) * (BET2 - B2)) * T
13596      Y = (DERIV(1) * (BET2 - B2) - DERIV(3) * (RBET - RB1)) * T
13597C
13598C        FORM NEW ESTIMATES OF G AND D
13599C
13600      G = G - U
13601      IF (B1 .EQ. ZERO .OR. G .LT. ZERO) G = ZERO
13602      D = D - Y
13603      IF (ZABS(U) .GT. TT .OR. ZABS(Y) .GT. TT) GOTO 80
13604C
13605C        END OF ITERATION
13606C
13607      DELTA = D
13608      XLAM = SIGMA / ZSQRT(H2)
13609      IF (NEG) GOTO 130
13610      GAMMA = G
13611      GOTO 140
13612  130 GAMMA = -G
13613      HMU(1) = ONE - HMU(1)
13614  140 XI = XBAR - XLAM * HMU(1)
13615      RETURN
13616      END
13617      SUBROUTINE SCATTI(N,A,IINDEX,B,NOUT,MAXOBV,ISUBRO,IBUGA3,IERROR)
13618C
13619C     PURPOSE--THIS SUBROUTINE DISPERSES VALUES FROM CONTIGUOUS
13620C              ELEMENTS IN ARRAY B AND STORES THEM IN ARRAY A
13621C              WHERE THE STORAGE LOCATIONS ARE DEFINED BY THE
13622C              ARRAY IINDEX.
13623C
13624C              THIS IS EQUIVALENT TO SCATTR ROUTINE EXCEPT THAT THE
13625C              A AND B ARRAYS ARE INTEGERS IN THIS ROUTINE.
13626C
13627C     INPUT  ARGUMENTS--IINDEX = THE INTEGER VECTOR THAT SPECIFIES
13628C                                THE ELEMENTS OF B THAT WILL BE
13629C                                EXTRACTED.
13630C                       B      = A SINGLE PRECISION VECTOR FROM WHIC
13631C                                DATA VALUES WILL BE EXTRACTED.
13632C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
13633C                                TO BE EXTRACTED.
13634C     OUTPUT ARGUMENTS--A      = THE OUTPUT ARRAY THAT WILL CONTAIN
13635C                                N ELEMENTS.
13636C                       NOUT   = THE INTEGER SCALAR THAT SPECIFIES THE
13637C                                MAXIMUM INDEX VALUE.
13638C     OUTPUT--THE COMPUTED SINGLE PRECISION ARRAY A.
13639C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
13640C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
13641C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
13642C     LANGUAGE--ANSI FORTRAN (1977)
13643C     WRITTEN BY--ALAN HECKERT
13644C                 STATISTICAL ENGINEERING DIVISION
13645C                 INFORMATION TECHNOLOGY LABORATORY
13646C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
13647C                 GAITHERSBURG, MD 20899-8980
13648C                 PHONE--301-975-2899
13649C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
13650C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
13651C     LANGUAGE--ANSI FORTRAN (1977)
13652C     VERSION NUMBER--2011.8
13653C     ORIGINAL VERSION--AUGUST    2011.
13654C
13655C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
13656C
13657C
13658      INTEGER N
13659      INTEGER IINDEX(*)
13660      INTEGER A(*)
13661      INTEGER B(*)
13662C
13663      CHARACTER*4 ISUBRO
13664      CHARACTER*4 IBUGA3
13665      CHARACTER*4 IERROR
13666C
13667      INCLUDE 'DPCOP2.INC'
13668C
13669C-----START POINT-----------------------------------------------------
13670C
13671      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'THER')THEN
13672        WRITE(ICOUT,999)
13673  999   FORMAT(1X)
13674        CALL DPWRST('XXX','BUG ')
13675        WRITE(ICOUT,51)
13676   51   FORMAT('***** AT THE BEGINNING OF GATHER--')
13677        CALL DPWRST('XXX','BUG ')
13678        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
13679   52   FORMAT('IBUGA3,ISUBRO,N = ',A4,2X,A4,2X,I8)
13680        CALL DPWRST('XXX','BUG ')
13681        IF(N.GT.0)THEN
13682          DO55I=1,N
13683            WRITE(ICOUT,56)I,IINDEX(I),B(I)
13684   56       FORMAT('I,IINDX(I),B(I) = ',I8,2X,2I8)
13685            CALL DPWRST('XXX','BUG ')
13686   55     CONTINUE
13687        ENDIF
13688      ENDIF
13689C
13690      NOUT=-99
13691      DO 1010 I = 1,N
13692         ITEMP=IINDEX(I)
13693         IF(ITEMP.GE.1 .AND. ITEMP.LE.MAXOBV)THEN
13694           A(ITEMP) = B(I)
13695           IF(ITEMP.GT.NOUT) NOUT=ITEMP
13696         ELSE
13697           WRITE(ICOUT,1011)
13698 1011      FORMAT('***** ERROR IN SCATTER OPERATION--')
13699           CALL DPWRST('XXX','BUG ')
13700           WRITE(ICOUT,1013)I
13701 1013      FORMAT('      FOR ROW ',I8,' THE INDEX VALUE IS OUTSIDE THE')
13702           CALL DPWRST('XXX','BUG ')
13703           WRITE(ICOUT,1015)MAXOBV
13704 1015      FORMAT('      THE INTERVAL (1,',I10,').')
13705           CALL DPWRST('XXX','BUG ')
13706           IERROR='YES'
13707           GOTO9000
13708         ENDIF
13709 1010 CONTINUE
13710C
13711 9000 CONTINUE
13712C
13713      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'THER')THEN
13714        WRITE(ICOUT,9051)
13715 9051   FORMAT('***** AT THE END OF SCATTER--')
13716        CALL DPWRST('XXX','BUG ')
13717        WRITE(ICOUT,9053)NOUT
13718 9053   FORMAT('NOUT = ',I8)
13719        CALL DPWRST('XXX','BUG ')
13720        IF(NOUT.GT.0)THEN
13721          DO9055I=1,NOUT
13722            WRITE(ICOUT,9056)I,A(I)
13723 9056       FORMAT('I,A(I) = ',2I8)
13724            CALL DPWRST('XXX','BUG ')
13725 9055     CONTINUE
13726        ENDIF
13727      ENDIF
13728C
13729      RETURN
13730      END
13731      SUBROUTINE SCATTR(N,A,IINDEX,B,NOUT,MAXOBV,ISUBRO,IBUGA3,IERROR)
13732C
13733C     PURPOSE--THIS SUBROUTINE DISPERSES VALUES FROM CONTIGUOUS
13734C              ELEMENTS IN ARRAY B AND STORES THEM IN ARRAY A
13735C              WHERE THE STORAGE LOCATIONS ARE DEFINED BY THE
13736C              ARRAY IINDEX.
13737C     INPUT  ARGUMENTS--IINDEX = THE INTEGER VECTOR THAT SPECIFIES
13738C                                THE ELEMENTS OF B THAT WILL BE
13739C                                EXTRACTED.
13740C                       B      = A SINGLE PRECISION VECTOR FROM WHIC
13741C                                DATA VALUES WILL BE EXTRACTED.
13742C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
13743C                                TO BE EXTRACTED.
13744C     OUTPUT ARGUMENTS--A      = THE OUTPUT ARRAY THAT WILL CONTAIN
13745C                                N ELEMENTS.
13746C                       NOUT   = THE INTEGER SCALAR THAT SPECIFIES THE
13747C                                MAXIMUM INDEX VALUE.
13748C     OUTPUT--THE COMPUTED SINGLE PRECISION ARRAY A.
13749C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
13750C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
13751C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
13752C     LANGUAGE--ANSI FORTRAN (1977)
13753C     WRITTEN BY--ALAN HECKERT
13754C                 STATISTICAL ENGINEERING DIVISION
13755C                 INFORMATION TECHNOLOGY LABORATORY
13756C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
13757C                 GAITHERSBURG, MD 20899-8980
13758C                 PHONE--301-975-2899
13759C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
13760C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
13761C     LANGUAGE--ANSI FORTRAN (1977)
13762C     VERSION NUMBER--2008.11
13763C     ORIGINAL VERSION--NOVEMBER  2008.
13764C
13765C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
13766C
13767C
13768      INTEGER N
13769      INTEGER IINDEX(*)
13770      REAL A(*)
13771      REAL B(*)
13772C
13773      CHARACTER*4 ISUBRO
13774      CHARACTER*4 IBUGA3
13775      CHARACTER*4 IERROR
13776C
13777      INCLUDE 'DPCOP2.INC'
13778C
13779C-----START POINT-----------------------------------------------------
13780C
13781      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'THER')THEN
13782        WRITE(ICOUT,999)
13783  999   FORMAT(1X)
13784        CALL DPWRST('XXX','BUG ')
13785        WRITE(ICOUT,51)
13786   51   FORMAT('***** AT THE BEGINNING OF GATHER--')
13787        CALL DPWRST('XXX','BUG ')
13788        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
13789   52   FORMAT('IBUGA3,ISUBRO,N = ',A4,2X,A4,2X,I8)
13790        CALL DPWRST('XXX','BUG ')
13791        IF(N.GT.0)THEN
13792          DO55I=1,N
13793            WRITE(ICOUT,56)I,IINDEX(I),B(I)
13794   56       FORMAT('I,IINDX(I),B(I) = ',I8,2X,I8,G15.7)
13795            CALL DPWRST('XXX','BUG ')
13796   55     CONTINUE
13797        ENDIF
13798      ENDIF
13799C
13800      NOUT=-99
13801      DO 1010 I = 1,N
13802         ITEMP=IINDEX(I)
13803         IF(ITEMP.GE.1 .AND. ITEMP.LE.MAXOBV)THEN
13804           A(ITEMP) = B(I)
13805           IF(ITEMP.GT.NOUT) NOUT=ITEMP
13806         ELSE
13807           WRITE(ICOUT,1011)
13808 1011      FORMAT('***** ERROR IN SCATTER OPERATION--')
13809           CALL DPWRST('XXX','BUG ')
13810           WRITE(ICOUT,1013)I
13811 1013      FORMAT('      FOR ROW ',I8,' THE INDEX VALUE IS OUTSIDE THE')
13812           CALL DPWRST('XXX','BUG ')
13813           WRITE(ICOUT,1015)MAXOBV
13814 1015      FORMAT('      THE INTERVAL (1,',I10,').')
13815           CALL DPWRST('XXX','BUG ')
13816           IERROR='YES'
13817           GOTO9000
13818         ENDIF
13819 1010 CONTINUE
13820C
13821 9000 CONTINUE
13822C
13823      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'THER')THEN
13824        WRITE(ICOUT,9051)
13825 9051   FORMAT('***** AT THE END OF SCATTER--')
13826        CALL DPWRST('XXX','BUG ')
13827        WRITE(ICOUT,9053)NOUT
13828 9053   FORMAT('NOUT = ',I8)
13829        CALL DPWRST('XXX','BUG ')
13830        IF(NOUT.GT.0)THEN
13831          DO9055I=1,NOUT
13832            WRITE(ICOUT,9056)I,A(I)
13833 9056       FORMAT('I,A(I) = ',I8,2X,G15.7)
13834            CALL DPWRST('XXX','BUG ')
13835 9055     CONTINUE
13836        ENDIF
13837      ENDIF
13838C
13839      RETURN
13840      END
13841      SUBROUTINE SCLMUL(N,S,V,Z)
13842      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
13843C
13844C PURPOSE
13845C -------
13846C MULTIPLY VECTOR BY SCALAR
13847C RESULT VECTOR MAY BE OPERAND VECTOR
13848C
13849C PARAMETERS
13850C ----------
13851C N            --> DIMENSION OF VECTORS
13852C S            --> SCALAR
13853C V(N)         --> OPERAND VECTOR
13854C Z(N)        <--  RESULT VECTOR
13855      DIMENSION V(N),Z(N)
13856      DO 100 I=1,N
13857        Z(I)=S*V(I)
13858  100 CONTINUE
13859      RETURN
13860      END
13861      SUBROUTINE SCOPY(N,SX,INCX,SY,INCY)
13862C***BEGIN PROLOGUE  SCOPY
13863C***DATE WRITTEN   791001   (YYMMDD)
13864C***REVISION DATE  820801   (YYMMDD)
13865C***CATEGORY NO.  D1A5
13866C***KEYWORDS  BLAS,COPY,LINEAR ALGEBRA,VECTOR
13867C***AUTHOR  LAWSON, C. L., (JPL)
13868C           HANSON, R. J., (SNLA)
13869C           KINCAID, D. R., (U. OF TEXAS)
13870C           KROGH, F. T., (JPL)
13871C***PURPOSE  Copy s.p. vector y = x
13872C***DESCRIPTION
13873C
13874C                B L A S  Subprogram
13875C    Description of Parameters
13876C
13877C     --Input--
13878C        N  number of elements in input vector(s)
13879C       SX  single precision vector with N elements
13880C     INCX  storage spacing between elements of SX
13881C       SY  single precision vector with N elements
13882C     INCY  storage spacing between elements of SY
13883C
13884C     --Output--
13885C       SY  copy of vector SX (unchanged if N .LE. 0)
13886C
13887C     Copy single precision SX to single precision SY.
13888C     For I = 0 to N-1, copy  SX(LX+I*INCX) to SY(LY+I*INCY),
13889C     where LX = 1 if INCX .GE. 0, else LX = (-INCX)*N, and LY is
13890C     defined in a similar way using INCY.
13891C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
13892C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
13893C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
13894C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
13895C***ROUTINES CALLED  (NONE)
13896C***END PROLOGUE  SCOPY
13897C
13898      REAL SX(1),SY(1)
13899C***FIRST EXECUTABLE STATEMENT  SCOPY
13900      IF(N.LE.0)RETURN
13901C
13902CCCCC JUNE 2008: MODIFY FOLLOWING LINE SO THAT IT DOES NOT
13903CCCCC            GENERATE WARNING MESSAGE ON FORTRAN 95 COMPILERS.
13904C
13905CCCCC IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60
13906      IF(INCX.EQ.INCY) THEN
13907        IF(INCX-1.LT.0)THEN
13908          GOTO5
13909        ELSEIF(INCX-1.EQ.0)THEN
13910          GOTO20
13911        ELSE
13912          GOTO60
13913        ENDIF
13914      ENDIF
13915    5 CONTINUE
13916C
13917C        CODE FOR UNEQUAL OR NONPOSITIVE INCREMENTS.
13918C
13919      IX = 1
13920      IY = 1
13921      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
13922      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
13923      DO 10 I = 1,N
13924        SY(IY) = SX(IX)
13925        IX = IX + INCX
13926        IY = IY + INCY
13927   10 CONTINUE
13928      RETURN
13929C
13930C        CODE FOR BOTH INCREMENTS EQUAL TO 1
13931C
13932C
13933C        CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 7.
13934C
13935   20 M = MOD(N,7)
13936      IF( M .EQ. 0 ) GO TO 40
13937      DO 30 I = 1,M
13938        SY(I) = SX(I)
13939   30 CONTINUE
13940      IF( N .LT. 7 ) RETURN
13941   40 MP1 = M + 1
13942      DO 50 I = MP1,N,7
13943        SY(I) = SX(I)
13944        SY(I + 1) = SX(I + 1)
13945        SY(I + 2) = SX(I + 2)
13946        SY(I + 3) = SX(I + 3)
13947        SY(I + 4) = SX(I + 4)
13948        SY(I + 5) = SX(I + 5)
13949        SY(I + 6) = SX(I + 6)
13950   50 CONTINUE
13951      RETURN
13952C
13953C        CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS.
13954C
13955   60 CONTINUE
13956      NS = N*INCX
13957          DO 70 I=1,NS,INCX
13958          SY(I) = SX(I)
13959   70     CONTINUE
13960      RETURN
13961      END
13962      SUBROUTINE SCOPYM(N,SX,INCX,SY,INCY)
13963C***BEGIN PROLOGUE  SCOPYM
13964C***DATE WRITTEN   801001   (YYMMDD)
13965C***REVISION DATE  820801   (YYMMDD)
13966C***CATEGORY NO.  D1A5
13967C***KEYWORDS  BLAS,COPY,VECTOR
13968C***AUTHOR  KAHANER,DAVID(NBS)
13969C***PURPOSE  Copy negative of real SX to real SY.
13970C***DESCRIPTION
13971C
13972C       Description of Parameters
13973C           The * Flags Output Variables
13974C
13975C       N   Number of elements in vector(s)
13976C      SX   Real vector with N elements
13977C    INCX   Storage spacing between elements of SX
13978C      SY*  Real negative copy of SX
13979C    INCY   Storage spacing between elements of SY
13980C
13981C      ***  Note that SY = -SX  ***
13982C
13983C  Copy negative of real SX to real SY.  For I=0 to N-1,
13984C   copy  -SX(LX+I*INCX) to SY(LY+I*INCY), where LX=1 if
13985C   INCX .GE. 0, else LX = (-INCX)*N, and LY is defined
13986C   in a similar way using INCY.
13987C***REFERENCES  (NONE)
13988C***ROUTINES CALLED  (NONE)
13989C***END PROLOGUE  SCOPYM
13990      REAL SX(1),SY(1)
13991C***FIRST EXECUTABLE STATEMENT  SCOPYM
13992      IF(N.LE.0) RETURN
13993C
13994CCCCC JUNE 2008: MODIFY FOLLOWING LINE SO THAT IT DOES NOT
13995CCCCC            GENERATE WARNING MESSAGE ON FORTRAN 95 COMPILERS.
13996C
13997CCCCC IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60
13998      IF(INCX.EQ.INCY) THEN
13999        IF(INCX-1.LT.0)THEN
14000          GOTO5
14001        ELSEIF(INCX-1.EQ.0)THEN
14002          GOTO20
14003        ELSE
14004          GOTO60
14005        ENDIF
14006      ENDIF
14007    5 CONTINUE
14008C
14009C         CODE FOR UNEQUAL OR NONPOSITIVE INCREMENTS
14010C
14011      IX=1
14012      IY=1
14013      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
14014      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
14015      DO 10 I=1,N
14016        SY(IY) = -SX(IX)
14017        IX = IX + INCX
14018        IY = IY + INCY
14019   10 CONTINUE
14020      RETURN
14021C
14022C        CODE FOR BOTH INCREMENTS EQUAL TO 1
14023C
14024C
14025C        CLEAN UP LOOP SO REMAINING VECTOR LENGTH IS MULTIPLE OF 7
14026C
14027   20 M = MOD(N,7)
14028      IF( M .EQ. 0 ) GO TO 40
14029      DO 30 I=1,M
14030        SY(I) = -SX(I)
14031   30 CONTINUE
14032      IF( N .LT. 7 ) RETURN
14033   40 MP1 = M + 1
14034      DO 50 I= MP1,N,7
14035        SY(I) = -SX(I)
14036        SY(I + 1) = -SX(I + 1)
14037        SY(I + 2) = -SX(I + 2)
14038        SY(I + 3) = -SX(I + 3)
14039        SY(I + 4) = -SX(I + 4)
14040        SY(I + 5) = -SX(I + 5)
14041        SY(I + 6) = -SX(I + 6)
14042   50 CONTINUE
14043      RETURN
14044C
14045C          CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS
14046C
14047   60 CONTINUE
14048      NS = N*INCX
14049          DO 70 I=1,NS,INCX
14050          SY(I) = -SX(I)
14051   70     CONTINUE
14052      RETURN
14053      END
14054      subroutine scrag(xreal, n, ipow)
14055c
14056c       Algorithm AS 83.3 Appl. Statist. (1975) vol.24, no.1
14057c ***   MODIFIED FOR USE WITH AS 97 ***
14058c
14059c       Subroutine for unscrambling FFT data.
14060c
14061      implicit double precision (A-H, O-Z)
14062      double precision  xreal(n)
14063      integer l(19)
14064      equivalence (l1,l(1)), (l2,l(2)), (l3,l(3)), (l4,l(4)),
14065     +          (l5,l(5)), (l6,l(6)), (l7,l(7)), (l8,l(8)), (l9,l(9)),
14066     +          (l10,l(10)), (l11,l(11)), (l12,l(12)), (l13,l(13)),
14067     +          (l14,l(14)), (l15,l(15)), (l16,l(16)), (l17,l(17)),
14068     +          (l18,l(18)), (l19,l(19))
14069c
14070      ii = 1
14071      itop = 2 ** (ipow - 1)
14072      i = 20 - ipow
14073      do 5 k = 1, i
14074        l(k) = ii
14075    5 continue
14076      l0 = ii
14077      i = i + 1
14078      do 6 k = i, 19
14079        ii = ii * 2
14080        l(k) = ii
14081    6 continue
14082c
14083      ii = 0
14084      do 30 j1 = 1, l1, l0
14085        do 29 j2 = j1, l2, l1
14086          do 28 j3 = j2, l3, l2
14087            do 27 j4 = j3, l4, l3
14088            do 26 j5 = j4, l5, l4
14089              do 25 j6 = j5, l6, l5
14090                do 24 j7 = j6, l7, l6
14091                  do 23 j8 = j7, l8, l7
14092                  do 22 j9 = j8, l9, l8
14093                    do 21 j10 = j9, l10, l9
14094                      do 20 j11 = j10, l11, l10
14095                        do 19 j12 = j11, l12, l11
14096                        do 18 j13 = j12, l13, l12
14097                          do 17 j14 = j13, l14, l13
14098                            do 16 j15 = j14, l15, l14
14099                              do 15 j16 = j15, l16, l15
14100                              do 14 j17 = j16, l17, l16
14101                                do 13 j18 = j17, l18, l17
14102                                  do 12 j19 = j18, l19, l18
14103                                    j20 = j19
14104                                    do 11 i = 1, 2
14105                                      ii = ii + 1
14106                                      if (ii .lt. j20) then
14107c
14108c                                       J20 is the bit-reverse of
14109c                                       II pairwise interchange.
14110c
14111                                        tempr = xreal(ii)
14112                                        xreal(ii) = xreal(j20)
14113                                        xreal(j20) = tempr
14114                                      end if
14115                                      j20 = j20 + itop
14116   11                               continue
14117   12                             continue
14118   13                           continue
14119   14                         continue
14120   15                         continue
14121   16                       continue
14122   17                     continue
14123   18                   continue
14124   19                   continue
14125   20                 continue
14126   21               continue
14127   22             continue
14128   23             continue
14129   24           continue
14130   25         continue
14131   26       continue
14132   27       continue
14133   28     continue
14134   29   continue
14135   30 continue
14136c
14137      return
14138      end
14139      SUBROUTINE SCRUDE( NDIM, MAXPTS, ABSEST, FINEST, IR )
14140*
14141*     Crude Monte-Carlo Algorithm for Deak method with
14142*      weighted results on restart
14143*
14144CCCCC INTEGER NDIM, MAXPTS, M, K, IR, NPTS
14145      INTEGER NDIM, MAXPTS, M, IR
14146      DOUBLE PRECISION FINEST, ABSEST, SPNRML,
14147     &     VARSQR, VAREST, VARPRD, FINDIF, FINVAL
14148      SAVE VAREST
14149      IF ( IR .LE. 0 ) THEN
14150         VAREST = 0
14151         FINEST = 0
14152      ENDIF
14153      FINVAL = 0
14154      VARSQR = 0
14155      DO 100 M = 1,MAXPTS
14156         FINDIF = ( SPNRML(NDIM) - FINVAL )/DBLE(M)
14157         FINVAL = FINVAL + FINDIF
14158         VARSQR = DBLE( M - 2 )*VARSQR/DBLE(M) + FINDIF**2
14159 100  CONTINUE
14160      VARPRD = VAREST*VARSQR
14161      FINEST = FINEST + ( FINVAL - FINEST )/(1.0D0 + VARPRD)
14162      IF ( VARSQR .GT. 0.0D0 ) VAREST = (1.0D0 + VARPRD)/VARSQR
14163      ABSEST = 3.0D0*SQRT( VARSQR/( 1.0D0 + VARPRD ) )
14164C
14165      RETURN
14166      END
14167      SUBROUTINE SD(X,N,IWRITE,XSD,IBUGA3,IERROR)
14168C
14169C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE STANDARD DEVIATION
14170C              (WITH DENOMINATOR N-1) OF THE DATA IN THE INPUT VECTOR X.
14171C              THE SAMPLE STANDARD DEVIATION = SQRT((THE SUM OF THE
14172C              SQUARED DEVIATIONS ABOUT THE SAMPLE MEAN)/(N-1)).
14173C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
14174C                                (UNSORTED OR SORTED) OBSERVATIONS.
14175C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
14176C                                IN THE VECTOR X.
14177C     OUTPUT ARGUMENTS--XSD    = THE SINGLE PRECISION VALUE OF THE
14178C                                COMPUTED SAMPLE STANDARD DEVIATION.
14179C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
14180C             SAMPLE STANDARD DEVIATION (WITH DENOMINATOR N-1).
14181C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
14182C                   OF N FOR THIS SUBROUTINE.
14183C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
14184C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
14185C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
14186C     LANGUAGE--ANSI FORTRAN (1977)
14187C     REFERENCES--SNEDECOR AND COCHRAN, STATISTICAL METHODS,
14188C                 EDITION 6, 1967, PAGE 44.
14189C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
14190C                 ANALYSIS, EDITION 2, 1957, PAGES 19, 76.
14191C     WRITTEN BY--JAMES J. FILLIBEN
14192C                 STATISTICAL ENGINEERING DIVISION
14193C                 INFORMATION TECHNOLOGY LABORATORY
14194C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
14195C                 GAITHERSBURG, MD 20899-8980
14196C                 PHONE--301-975-2855
14197C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14198C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14199C     LANGUAGE--ANSI FORTRAN (1966)
14200C     VERSION NUMBER--82.6
14201C     ORIGINAL VERSION--JUNE      1972.
14202C     UPDATED         --SEPTEMBER 1975.
14203C     UPDATED         --NOVEMBER  1975.
14204C     UPDATED         --AUGUST    1981.
14205C     UPDATED         --MAY       1982.
14206C
14207C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14208C
14209      CHARACTER*4 IWRITE
14210      CHARACTER*4 IBUGA3
14211      CHARACTER*4 IERROR
14212C
14213      CHARACTER*4 ISUBN1
14214      CHARACTER*4 ISUBN2
14215C
14216C---------------------------------------------------------------------
14217C
14218      DOUBLE PRECISION DN
14219      DOUBLE PRECISION DX
14220      DOUBLE PRECISION DSUM
14221      DOUBLE PRECISION DMEAN
14222      DOUBLE PRECISION DVAR
14223      DOUBLE PRECISION DSD
14224C
14225      DIMENSION X(*)
14226C
14227C-----COMMON----------------------------------------------------------
14228C
14229      INCLUDE 'DPCOP2.INC'
14230C
14231C-----START POINT-----------------------------------------------------
14232C
14233      ISUBN1='SD  '
14234      ISUBN2='    '
14235      IERROR='NO'
14236C
14237      XSD=0.0
14238      DMEAN=0.0D0
14239      AN=N
14240C
14241      IF(IBUGA3.EQ.'ON')THEN
14242        WRITE(ICOUT,999)
14243  999   FORMAT(1X)
14244        CALL DPWRST('XXX','BUG ')
14245        WRITE(ICOUT,51)
14246   51   FORMAT('***** AT THE BEGINNING OF SD--')
14247        CALL DPWRST('XXX','BUG ')
14248        WRITE(ICOUT,52)IBUGA3,N
14249   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
14250        CALL DPWRST('XXX','BUG ')
14251        DO55I=1,N
14252          WRITE(ICOUT,56)I,X(I)
14253   56     FORMAT('I,X(I) = ',I8,G15.7)
14254          CALL DPWRST('XXX','BUG ')
14255   55   CONTINUE
14256      ENDIF
14257C
14258C               **********************************
14259C               **  COMPUTE STANDARD DEVIATION  **
14260C               **********************************
14261C
14262C               ********************************************
14263C               **  STEP 1--                              **
14264C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
14265C               ********************************************
14266C
14267      IF(N.LT.1)THEN
14268        IERROR='YES'
14269        WRITE(ICOUT,999)
14270        CALL DPWRST('XXX','BUG ')
14271        WRITE(ICOUT,111)
14272  111   FORMAT('***** ERROR IN SD--')
14273        CALL DPWRST('XXX','BUG ')
14274        WRITE(ICOUT,112)
14275  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
14276        CALL DPWRST('XXX','BUG ')
14277        WRITE(ICOUT,115)
14278  115   FORMAT('      VARIABLE IS LESS THAN 1.')
14279        CALL DPWRST('XXX','BUG ')
14280        WRITE(ICOUT,117)N
14281  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,'.')
14282        CALL DPWRST('XXX','BUG ')
14283        GOTO9000
14284      ELSEIF(N.EQ.1)THEN
14285        GOTO800
14286      ENDIF
14287C
14288      HOLD=X(1)
14289      DO135I=2,N
14290        IF(X(I).NE.HOLD)GOTO139
14291  135 CONTINUE
14292      GOTO800
14293  139 CONTINUE
14294C
14295C               ***************************************
14296C               **  STEP 2--                         **
14297C               **  COMPUTE THE STANDARD DEVIATION.  **
14298C               ***************************************
14299C
14300      DN=N
14301      DSUM=0.0D0
14302      DO200I=1,N
14303        DX=X(I)
14304        DSUM=DSUM+DX
14305  200 CONTINUE
14306      DMEAN=DSUM/DN
14307C
14308      DSUM=0.0D0
14309      DO300I=1,N
14310        DX=X(I)
14311        DSUM=DSUM+(DX-DMEAN)**2
14312  300 CONTINUE
14313      DVAR=DSUM/(DN-1.0D0)
14314      DSD=0.0D0
14315      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
14316      XSD=DSD
14317C
14318C               *******************************
14319C               **  STEP 3--                 **
14320C               **  WRITE OUT A LINE         **
14321C               **  OF SUMMARY INFORMATION.  **
14322C               *******************************
14323C
14324  800 CONTINUE
14325      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
14326        WRITE(ICOUT,999)
14327        CALL DPWRST('XXX','BUG ')
14328        WRITE(ICOUT,811)N,XSD
14329  811   FORMAT('THE STANDARD DEVIATION OF THE ',I8,' OBSERVATIONS = ',
14330     1         E15.7)
14331        CALL DPWRST('XXX','BUG ')
14332      ENDIF
14333C
14334C               *****************
14335C               **  STEP 90--  **
14336C               **  EXIT.      **
14337C               *****************
14338C
14339 9000 CONTINUE
14340      IF(IBUGA3.EQ.'ON')THEN
14341        WRITE(ICOUT,999)
14342        CALL DPWRST('XXX','BUG ')
14343        WRITE(ICOUT,9011)
14344 9011   FORMAT('***** AT THE END       OF SD--')
14345        CALL DPWRST('XXX','BUG ')
14346        WRITE(ICOUT,9012)IERROR,DMEAN,XSD
14347 9012   FORMAT('IERROR,DMEAN,XSD = ',A4,2X,2G15.7)
14348        CALL DPWRST('XXX','BUG ')
14349      ENDIF
14350C
14351      RETURN
14352      END
14353      SUBROUTINE SDDP(X,N,IWRITE,XSD,IBUGA3,IERROR)
14354C
14355C     PURPOSE--THIS SUBROUTINE COMPUTES THE
14356C              SAMPLE STANDARD DEVIATION (WITH DENOMINATOR N-1)
14357C              OF THE DATA IN THE INPUT VECTOR X.
14358C              THE SAMPLE STANDARD DEVIATION = SQRT((THE SUM OF THE
14359C              SQUARED DEVIATIONS ABOUT THE SAMPLE MEAN)/(N-1)).
14360C            --THIS IS A DOUBLE PRECISION VERSION OF
14361C              THE SD SUBROUTINE.
14362C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VECTOR OF
14363C                                (UNSORTED OR SORTED) OBSERVATIONS.
14364C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
14365C                                IN THE VECTOR X.
14366C     OUTPUT ARGUMENTS--XSD    = THE DOUBLE PRECISION VALUE OF THE
14367C                                COMPUTED SAMPLE STANDARD DEVIATION.
14368C     OUTPUT--THE COMPUTED DOUBLE PRECISION VALUE OF THE
14369C             SAMPLE STANDARD DEVIATION (WITH DENOMINATOR N-1).
14370C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
14371C                   OF N FOR THIS SUBROUTINE.
14372C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
14373C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
14374C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
14375C     LANGUAGE--ANSI FORTRAN (1977)
14376C     REFERENCES--SNEDECOR AND COCHRAN, STATISTICAL METHODS,
14377C                 EDITION 6, 1967, PAGE 44.
14378C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
14379C                 ANALYSIS, EDITION 2, 1957, PAGES 19, 76.
14380C     WRITTEN BY--JAMES J. FILLIBEN
14381C                 STATISTICAL ENGINEERING DIVISION
14382C                 INFORMATION TECHNOLOGY LABORATORY
14383C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
14384C                 GAITHERSBURG, MD 20899-8980
14385C                 PHONE--301-975-2855
14386C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14387C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14388C     LANGUAGE--ANSI FORTRAN (1977)
14389C     VERSION NUMBER--2006.4
14390C     ORIGINAL VERSION--APRIL     2006.
14391C
14392C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14393C
14394      CHARACTER*4 IWRITE
14395      CHARACTER*4 IBUGA3
14396      CHARACTER*4 IERROR
14397C
14398      CHARACTER*4 ISUBN1
14399      CHARACTER*4 ISUBN2
14400C
14401C---------------------------------------------------------------------
14402C
14403      DOUBLE PRECISION DN
14404      DOUBLE PRECISION DX
14405      DOUBLE PRECISION DSUM
14406      DOUBLE PRECISION DMEAN
14407      DOUBLE PRECISION DVAR
14408      DOUBLE PRECISION DSD
14409      DOUBLE PRECISION XSD
14410      DOUBLE PRECISION HOLD
14411C
14412      DOUBLE PRECISION X(*)
14413C
14414C-----COMMON----------------------------------------------------------
14415C
14416      INCLUDE 'DPCOP2.INC'
14417C
14418C-----START POINT-----------------------------------------------------
14419C
14420      ISUBN1='SDDP'
14421      ISUBN2='    '
14422      IERROR='NO'
14423C
14424      DMEAN=0.0D0
14425C
14426      IF(IBUGA3.EQ.'OFF')GOTO90
14427      WRITE(ICOUT,999)
14428  999 FORMAT(1X)
14429      CALL DPWRST('XXX','BUG ')
14430      WRITE(ICOUT,51)
14431   51 FORMAT('***** AT THE BEGINNING OF SD--')
14432      CALL DPWRST('XXX','BUG ')
14433      WRITE(ICOUT,52)IBUGA3
14434   52 FORMAT('IBUGA3 = ',A4)
14435      CALL DPWRST('XXX','BUG ')
14436      WRITE(ICOUT,53)N
14437   53 FORMAT('N = ',I8)
14438      CALL DPWRST('XXX','BUG ')
14439      DO55I=1,N
14440      WRITE(ICOUT,56)I,X(I)
14441   56 FORMAT('I,X(I) = ',I8,G15.7)
14442      CALL DPWRST('XXX','BUG ')
14443   55 CONTINUE
14444   90 CONTINUE
14445C
14446C               **********************************
14447C               **  COMPUTE STANDARD DEVIATION  **
14448C               **********************************
14449C
14450C               ********************************************
14451C               **  STEP 1--                              **
14452C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
14453C               ********************************************
14454C
14455      DN=N
14456C
14457      IF(N.GE.1)GOTO119
14458      IERROR='YES'
14459      WRITE(ICOUT,999)
14460      CALL DPWRST('XXX','BUG ')
14461      WRITE(ICOUT,111)
14462  111 FORMAT('***** ERROR IN SDDP--')
14463      CALL DPWRST('XXX','BUG ')
14464      WRITE(ICOUT,112)
14465  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS IN THE VARIABLE')
14466      CALL DPWRST('XXX','BUG ')
14467      WRITE(ICOUT,114)
14468  114 FORMAT('      FOR WHICH THE STANDARD DEVIATION IS TO BE')
14469      CALL DPWRST('XXX','BUG ')
14470      WRITE(ICOUT,115)
14471  115 FORMAT('      COMPUTED MUST BE 1 OR LARGER.')
14472      CALL DPWRST('XXX','BUG ')
14473      WRITE(ICOUT,116)
14474  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
14475      CALL DPWRST('XXX','BUG ')
14476      WRITE(ICOUT,117)N
14477  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
14478     1'.')
14479      CALL DPWRST('XXX','BUG ')
14480      GOTO9000
14481  119 CONTINUE
14482C
14483      IF(N.EQ.1)THEN
14484        XSD=0.0D0
14485        GOTO9000
14486      ENDIF
14487C
14488      HOLD=X(1)
14489      DO135I=2,N
14490      IF(X(I).NE.HOLD)GOTO139
14491  135 CONTINUE
14492      XSD=0.0D0
14493      GOTO9000
14494  139 CONTINUE
14495C
14496C               ***************************************
14497C               **  STEP 2--                         **
14498C               **  COMPUTE THE STANDARD DEVIATION.  **
14499C               ***************************************
14500C
14501      DN=N
14502      DSUM=0.0D0
14503      DO200I=1,N
14504        DX=X(I)
14505        DSUM=DSUM+DX
14506  200 CONTINUE
14507      DMEAN=DSUM/DN
14508C
14509      DSUM=0.0D0
14510      DO300I=1,N
14511        DX=X(I)
14512        DSUM=DSUM+(DX-DMEAN)**2
14513  300 CONTINUE
14514      DVAR=DSUM/(DN-1.0D0)
14515      DSD=0.0D0
14516      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
14517      XSD=DSD
14518C
14519C               *******************************
14520C               **  STEP 3--                 **
14521C               **  WRITE OUT A LINE         **
14522C               **  OF SUMMARY INFORMATION.  **
14523C               *******************************
14524C
14525      IF(IFEEDB.EQ.'OFF')GOTO890
14526      IF(IWRITE.EQ.'OFF')GOTO890
14527      WRITE(ICOUT,999)
14528      CALL DPWRST('XXX','BUG ')
14529      WRITE(ICOUT,811)N,XSD
14530  811 FORMAT('THE STANDARD DEVIATION OF THE ',I8,' OBSERVATIONS = ',
14531     1E15.7)
14532      CALL DPWRST('XXX','BUG ')
14533  890 CONTINUE
14534C
14535C               *****************
14536C               **  STEP 90--  **
14537C               **  EXIT.      **
14538C               *****************
14539C
14540 9000 CONTINUE
14541      IF(IBUGA3.EQ.'OFF')GOTO9090
14542      WRITE(ICOUT,999)
14543      CALL DPWRST('XXX','BUG ')
14544      WRITE(ICOUT,9011)
14545 9011 FORMAT('***** AT THE END       OF SDDP--')
14546      CALL DPWRST('XXX','BUG ')
14547      WRITE(ICOUT,9012)IBUGA3,IERROR
14548 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
14549      CALL DPWRST('XXX','BUG ')
14550      WRITE(ICOUT,9013)N
14551 9013 FORMAT('N = ',I8)
14552      CALL DPWRST('XXX','BUG ')
14553      WRITE(ICOUT,9014)DMEAN
14554 9014 FORMAT('DMEAN = ',D15.7)
14555      CALL DPWRST('XXX','BUG ')
14556      WRITE(ICOUT,9015)XSD
14557 9015 FORMAT('XSD = ',E15.7)
14558      CALL DPWRST('XXX','BUG ')
14559 9090 CONTINUE
14560C
14561      RETURN
14562      END
14563      SUBROUTINE SDECDF(X,ALMBDA,CDF)
14564C
14565C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
14566C              FUNCTION VALUE FOR THE SKEW-LAPLACE DISTRIBUTION
14567C              (OR SKEW-DOUBLE EXPONENTIAL)
14568C              WITH SHAPE PARAMETER = LAMBDA.
14569C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
14570C              THE CUMULATIVE DISTRIBUTION FUNCTION
14571C                 SDECDF(X,LAMBDA) = 0.5*EXP((1+LAMBDA)*X)/(1+LAMMBDA)
14572C                                                          X <= 0
14573C                                  = 1 + (1)*EXP(-X) -
14574C                                    0.5/(EXP((1+LAMBDA)*X)*(-1-LAMBDA))
14575C                                                          X > 0
14576C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
14577C                                WHICH THE CUMULATIVE DISTRIBUTION
14578C                                FUNCTION IS TO BE EVALUATED.
14579C                     --ALMBDA = THE SHAPE PARAMETER
14580C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PROBABILITY
14581C                                DENSITY FUNCTION VALUE.
14582C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
14583C             FUNCTION VALUE CDF FOR THE SKEWED-LAPLACE DISTRIBUTION
14584C             WITH SHAPE PARAMETER = LAMBDA.
14585C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
14586C     RESTRICTIONS--NONE.
14587C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
14588C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
14589C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
14590C     LANGUAGE--ANSI FORTRAN (1977)
14591C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
14592C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
14593C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
14594C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
14595C                 PP. 134.
14596C     WRITTEN BY--JAMES J. FILLIBEN
14597C                 STATISTICAL ENGINEERING DIVISION
14598C                 INFORMATION TECHNOLOGY LABORATORY
14599C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
14600C                 GAITHERSBURG, MD 20899-8980
14601C                 PHONE--301-975-2855
14602C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14603C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14604C     LANGUAGE--ANSI FORTRAN (1977)
14605C     VERSION NUMBER--2004.6
14606C     ORIGINAL VERSION--JUNE      2004.
14607C
14608C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14609C
14610      DOUBLE PRECISION DX
14611      DOUBLE PRECISION DLMBDA
14612      DOUBLE PRECISION DCDF
14613C
14614C-----COMMON----------------------------------------------------------
14615C
14616      INCLUDE 'DPCOP2.INC'
14617C
14618C-----START POINT-----------------------------------------------------
14619C
14620C               ************************************
14621C               **  STEP 1--                      **
14622C               **  COMPUTE THE DENSITY FUNCTION  **
14623C               ************************************
14624C
14625      IF(ALMBDA.LT.0.0)THEN
14626        WRITE(ICOUT,5)
14627        CALL DPWRST('XXX','WRIT')
14628        WRITE(ICOUT,48)ALMBDA
14629        CALL DPWRST('XXX','WRIT')
14630        CDF=0.0
14631        GOTO9000
14632      ENDIF
14633    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER IN SDECDF ',
14634     1       'ROUTINE IS NEGATIVE.')
14635   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
14636C
14637      DX=DBLE(X)
14638      DLMBDA=DBLE(ALMBDA)
14639C
14640      IF(ALMBDA.EQ.0)THEN
14641        CALL DEXCDF(X,CDF)
14642        GOTO9000
14643      ELSE
14644        IF(X.LE.0.0)THEN
14645          DCDF=0.5D0*DEXP((1.0D0 + DLMBDA)*DX)/(1.0D0 + DLMBDA)
14646        ELSE
14647          DCDF=1.0D0 - DEXP(-DX) -
14648     1         0.5D0/(DEXP((1.0D0 + DLMBDA)*DX)*(-1.0D0-DLMBDA))
14649        ENDIF
14650        CDF=REAL(DCDF)
14651      ENDIF
14652C
14653 9000 CONTINUE
14654      RETURN
14655      END
14656      REAL FUNCTION SDEFUN(X)
14657C
14658C     PURPOSE--SDEPPF CALLS FZERO TO FIND A ROOT FOR THE PERCENT
14659C              POINT FUNCTION.  SDEFUN IS THE FUNCTION FOR WHICH
14660C              THE ZERO IS FOUND.  IT IS:
14661C                 P - SDECDF(X,LAMBDA)
14662C              WHERE P IS THE DESIRED PERCENT POINT.
14663C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
14664C                                WHICH THE CUMULATIVE DISTRIBUTION
14665C                                FUNCTION IS TO BE EVALUATED.
14666C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
14667C             FUNCTION VALUE SDEFUN.
14668C     PRINTING--NONE.
14669C     RESTRICTIONS--NONE.
14670C     OTHER DATAPAC   SUBROUTINES NEEDED--SDECDF.
14671C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
14672C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
14673C     LANGUAGE--ANSI FORTRAN (1977)
14674C     WRITTEN BY--JAMES J. FILLIBEN
14675C                 STATISTICAL ENGINEERING DIVISION
14676C                 INFORMATION TECHNOLOGY LABORATORY
14677C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
14678C                 GAITHERSBURG, MD 20899-8980
14679C                 PHONE--301-975-2855
14680C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14681C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14682C     LANGUAGE--ANSI FORTRAN (1977)
14683C     VERSION NUMBER--2004.6
14684C     ORIGINAL VERSION--JUNE      2004.
14685C
14686C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14687C
14688      REAL P
14689      COMMON/SDECOM/P,ALAMB
14690C
14691C-----COMMON----------------------------------------------------------
14692C
14693      INCLUDE 'DPCOP2.INC'
14694C
14695C-----START POINT-----------------------------------------------------
14696C
14697      CALL SDECDF(X,ALAMB,CDF)
14698      SDEFUN=P - CDF
14699C
14700      RETURN
14701      END
14702      SUBROUTINE SDEPDF(X,ALMBDA,PDF)
14703C
14704C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
14705C              FUNCTION VALUE FOR THE SKEW-LAPLACE DISTRIBUTION
14706C              (OR SKEW-DOUBLE EXPONENTIAL)
14707C              WITH SHAPE PARAMETER = LAMBDA.
14708C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
14709C              THE PROBABILITY DENSITY FUNCTION
14710C                 SDEPDF(X,LAMBDA) = 0.5*EXP((1+LAMBDA)*X)   X <= 0
14711C                                  = EXP(-X) - 0.5*EXP((1+LAMBDA)*X)
14712C                                                            X > 0
14713C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
14714C                                WHICH THE PROBABILITY DENSITY
14715C                                FUNCTION IS TO BE EVALUATED.
14716C                     --ALMBDA = THE SHAPE PARAMETER
14717C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
14718C                                DENSITY FUNCTION VALUE.
14719C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
14720C             FUNCTION VALUE PDF FOR THE SKEWED-LAPLACE DISTRIBUTION
14721C             WITH SHAPE PARAMETER = LAMBDA.
14722C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
14723C     RESTRICTIONS--NONE.
14724C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
14725C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
14726C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
14727C     LANGUAGE--ANSI FORTRAN (1977)
14728C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
14729C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
14730C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
14731C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
14732C                 PP. 134.
14733C     WRITTEN BY--JAMES J. FILLIBEN
14734C                 STATISTICAL ENGINEERING DIVISION
14735C                 INFORMATION TECHNOLOGY LABORATORY
14736C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
14737C                 GAITHERSBURG, MD 20899-8980
14738C                 PHONE--301-975-2855
14739C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14740C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14741C     LANGUAGE--ANSI FORTRAN (1977)
14742C     VERSION NUMBER--2004.6
14743C     ORIGINAL VERSION--JUNE      2004.
14744C
14745C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14746C
14747C---------------------------------------------------------------------
14748C
14749      DOUBLE PRECISION DX
14750      DOUBLE PRECISION DLMBDA
14751      DOUBLE PRECISION DPDF
14752C
14753C-----COMMON----------------------------------------------------------
14754C
14755      INCLUDE 'DPCOP2.INC'
14756C
14757C-----START POINT-----------------------------------------------------
14758C
14759C               ************************************
14760C               **  STEP 1--                      **
14761C               **  COMPUTE THE DENSITY FUNCTION  **
14762C               ************************************
14763C
14764      IF(ALMBDA.LT.0.0)THEN
14765        WRITE(ICOUT,5)
14766        CALL DPWRST('XXX','WRIT')
14767        WRITE(ICOUT,48)ALMBDA
14768        CALL DPWRST('XXX','WRIT')
14769        PDF=0.0
14770        GOTO9000
14771      ENDIF
14772    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER IN SDEPDF ',
14773     1       'ROUTINE IS NEGATIVE.')
14774   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
14775C
14776      DX=DBLE(X)
14777      DLMBDA=DBLE(ALMBDA)
14778C
14779      IF(ALMBDA.EQ.0.0)THEN
14780        CALL DEXPDF(X,PDF)
14781        GOTO9000
14782      ELSE
14783        IF(X.LE.0.0)THEN
14784          DPDF=0.5D0*DEXP((1.0D0 + DLMBDA)*DX)
14785        ELSE
14786          DPDF=DEXP(-DX) - 0.5D0*DEXP(-(1.0D0 + DLMBDA)*DX)
14787        ENDIF
14788        PDF=REAL(DPDF)
14789      ENDIF
14790C
14791 9000 CONTINUE
14792      RETURN
14793      END
14794      SUBROUTINE SDEPPF(P,ALMBDA,PPF)
14795C
14796C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
14797C              FUNCTION VALUE FOR THE SKEW DOUBLE EXPONENTIAL
14798C              DISTRIBUTION WITH SHAPE PARAMETER = LAMBDA.
14799C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND THE
14800C              PERCENT POINT FUNCTION IS COMPUTED BY:
14801C              1) COMPUTE PCUT = SDECDF(0,LAMBDA)
14802C              2) IF P <= PCUT, USE CLOSED FORM FORMULA:
14803C                    PPF = LOG[2*P*(1+LAMBDA)]/(1+LAMBDA)
14804C
14805C              3) IF P > PCUT, NUMERICALLY INVERT THE CDF FUNCTION.
14806C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
14807C                                WHICH THE PERCENT POINT
14808C                                FUNCTION IS TO BE EVALUATED.
14809C                     --ALMBDA = THE SHAPE PARAMETER
14810C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION CUMULATIVE
14811C                                DISTRIBUTION FUNCTION VALUE.
14812C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
14813C             FUNCTION VALUE PPF.
14814C     PRINTING--NONE.
14815C     RESTRICTIONS--NONE.
14816C     OTHER DATAPAC   SUBROUTINES NEEDED--FZERO.
14817C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
14818C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
14819C     LANGUAGE--ANSI FORTRAN (1977)
14820C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
14821C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
14822C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
14823C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
14824C                 PP. 134.
14825C     WRITTEN BY--JAMES J. FILLIBEN
14826C                 STATISTICAL ENGINEERING DIVISION
14827C                 INFORMATION TECHNOLOGY LABORATORY
14828C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
14829C                 GAITHERSBURG, MD 20899-8980
14830C                 PHONE--301-975-2855
14831C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
14832C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
14833C     LANGUAGE--ANSI FORTRAN (1977)
14834C     VERSION NUMBER--2004.6
14835C     ORIGINAL VERSION--JUNE      2004.
14836C
14837C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
14838C
14839C---------------------------------------------------------------------
14840C
14841      REAL PPF
14842      DOUBLE PRECISION DP
14843      DOUBLE PRECISION DPPF
14844      DOUBLE PRECISION DLMBDA
14845C
14846      REAL SDEFUN
14847      EXTERNAL SDEFUN
14848C
14849      REAL P2,ALAMB
14850      COMMON/SDECOM/P2,ALAMB
14851C
14852      INCLUDE 'DPCOP2.INC'
14853C
14854C-----START POINT-----------------------------------------------------
14855C
14856C
14857      IF(P.LE.0.0.OR.P.GE.1.0)THEN
14858         WRITE(ICOUT,61)
14859   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
14860     1          'TO THE SDEPPF SUBROUTINE ')
14861         CALL DPWRST('XXX','BUG ')
14862         WRITE(ICOUT,62)
14863   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
14864         CALL DPWRST('XXX','BUG ')
14865         WRITE(ICOUT,63)P
14866   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
14867         CALL DPWRST('XXX','BUG ')
14868         PPF=0.0
14869         GOTO9000
14870      ENDIF
14871C
14872      IF(ALMBDA.LT.0.0)THEN
14873        WRITE(ICOUT,5)
14874        CALL DPWRST('XXX','WRIT')
14875        WRITE(ICOUT,48)ALMBDA
14876        CALL DPWRST('XXX','WRIT')
14877        PDF=0.0
14878        GOTO9000
14879      ENDIF
14880    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER IN SDEPPF ',
14881     1       'ROUTINE IS NEGATIVE.')
14882   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
14883C
14884      DP=DBLE(P)
14885      DLMBDA=DBLE(ALMBDA)
14886C
14887      IF(ALMBDA.EQ.0.0)THEN
14888        CALL DEXPPF(P,PPF)
14889        GOTO9000
14890      ENDIF
14891C
14892C  STEP 1: COMPUTE SDECDF(0,LAMBDA).  CLOSED FORM FOR P < PCUT.
14893C
14894      CALL SDECDF(0.0,ALMBDA,PCUT)
14895      IF(P.LE.PCUT)THEN
14896        DPPF=DLOG(2.0D0*DP*(1.0D0+DLMBDA))/(1.0D0+DLMBDA)
14897        PPF=REAL(DPPF)
14898        GOTO9000
14899      ENDIF
14900C
14901C  STEP 2: FIND BRACKETING INTERVAL.  PCUT IS LOWER BOUND, PPF OF
14902C          EXPONENTIAL DISTRIBUTION IS UPPER BOUND.
14903C
14904      XLOW=PCUT
14905      CALL EXPPPF(P,XUP)
14906      XLOW=XLOW - 1.0
14907      XUP=XUP + 10.0
14908C
14909      AE=1.E-6
14910      RE=1.E-6
14911      ALAMB=ALMBDA
14912      P2=P
14913      CALL FZERO(SDEFUN,XLOW,XUP,XUP,RE,AE,IFLAG)
14914C
14915      PPF=XLOW
14916      IF(IFLAG.EQ.2)THEN
14917C
14918C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
14919CCCCC   WRITE(ICOUT,999)
14920  999   FORMAT(1X)
14921CCCCC   CALL DPWRST('XXX','BUG ')
14922CCCCC   WRITE(ICOUT,111)
14923CC111   FORMAT('***** WARNING FROM SDEPPF--')
14924CCCCC   CALL DPWRST('XXX','BUG ')
14925CCCCC   WRITE(ICOUT,113)
14926CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
14927CCCCC1         'TOLERANCE.')
14928CCCCC   CALL DPWRST('XXX','BUG ')
14929      ELSEIF(IFLAG.EQ.3)THEN
14930        WRITE(ICOUT,999)
14931        CALL DPWRST('XXX','BUG ')
14932        WRITE(ICOUT,121)
14933  121   FORMAT('***** WARNING FROM SDEPPF--')
14934        CALL DPWRST('XXX','BUG ')
14935        WRITE(ICOUT,123)
14936  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
14937        CALL DPWRST('XXX','BUG ')
14938      ELSEIF(IFLAG.EQ.4)THEN
14939        WRITE(ICOUT,999)
14940        CALL DPWRST('XXX','BUG ')
14941        WRITE(ICOUT,131)
14942  131   FORMAT('***** ERROR FROM SDEPPF--')
14943        CALL DPWRST('XXX','BUG ')
14944        WRITE(ICOUT,133)
14945  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
14946        CALL DPWRST('XXX','BUG ')
14947      ELSEIF(IFLAG.EQ.5)THEN
14948        WRITE(ICOUT,999)
14949        CALL DPWRST('XXX','BUG ')
14950        WRITE(ICOUT,141)
14951  141   FORMAT('***** WARNING FROM SDEPPF--')
14952        CALL DPWRST('XXX','BUG ')
14953        WRITE(ICOUT,143)
14954  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
14955        CALL DPWRST('XXX','BUG ')
14956      ENDIF
14957C
14958 9000 CONTINUE
14959      RETURN
14960      END
14961      SUBROUTINE SDERAN(N,ALMBDA,ISEED,X)
14962C
14963C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
14964C              FROM THE SKEWED DOUBLE EXPONENTIAL (LAPLACE)
14965C              DISTRIBUTION WITH SHAPE PARAMETER = ALMBDA.
14966C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
14967C              THE PROBABILITY DENSITY FUNCTION
14968C                 SDEPDF(X,LAMBDA) = 0.5*EXP((1+LAMBDA)*X)   X <= 0
14969C                                  = EXP(-X) - 0.5*EXP((1+LAMBDA)*X)
14970C                                                            X > 0
14971C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
14972C                                OF RANDOM NUMBERS TO BE
14973C                                GENERATED.
14974C                     --ALMBDA = THE SHAPE (PARAMETER) FOR THE
14975C                                SKEWED DOUBLE EXPONENTIAL
14976C                                DISTRIBUTION.
14977C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
14978C                                (OF DIMENSION AT LEAST N)
14979C                                INTO WHICH THE GENERATED
14980C                                RANDOM SAMPLE WILL BE PLACED.
14981C     OUTPUT--A RANDOM SAMPLE OF SIZE N
14982C             FROM THE SKEWED DOUBLE EXPONENTIAL DISTRIBUTION
14983C             WITH SHAPE PARAMETER = ALMBDA.
14984C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
14985C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
14986C                   OF N FOR THIS SUBROUTINE.
14987C                 --ALMBDA CAN BE ANY REAL NUMBER.
14988C     OTHER DATAPAC   SUBROUTINES NEEDED--SDEPPF.
14989C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
14990C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
14991C     LANGUAGE--ANSI FORTRAN (1977)
14992C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
14993C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
14994C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
14995C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
14996C                 PP. 134.
14997C     WRITTEN BY--JAMES J. FILLIBEN
14998C                 STATISTICAL ENGINEERING DIVISION
14999C                 INFORMATION TECHNOLOGY LABORATORY
15000C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
15001C                 GAITHERSBURG, MD 20899-8980
15002C                 PHONE--301-975-2855
15003C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
15004C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
15005C     LANGUAGE--ANSI FORTRAN (1977)
15006C     VERSION NUMBER--2004.6
15007C     ORIGINAL VERSION--JUNE      2004.
15008C
15009C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
15010C
15011C---------------------------------------------------------------------
15012C
15013      DIMENSION X(*)
15014C
15015C---------------------------------------------------------------------
15016C
15017      INCLUDE 'DPCOP2.INC'
15018C
15019C-----START POINT-----------------------------------------------------
15020C
15021C     CHECK THE INPUT ARGUMENTS FOR ERRORS
15022C
15023      IF(N.LT.1)THEN
15024        WRITE(ICOUT,5)
15025        CALL DPWRST('XXX','BUG ')
15026        WRITE(ICOUT,6)
15027        CALL DPWRST('XXX','BUG ')
15028        WRITE(ICOUT,47)N
15029        CALL DPWRST('XXX','BUG ')
15030        GOTO9999
15031      ENDIF
15032      IF(ALMBDA.LT.0.0)THEN
15033        WRITE(ICOUT,15)
15034        CALL DPWRST('XXX','WRIT')
15035        WRITE(ICOUT,48)ALMBDA
15036        CALL DPWRST('XXX','WRIT')
15037        PDF=0.0
15038        GOTO9999
15039      ENDIF
15040    5 FORMAT('***** ERROR--FOR THE SKEWED DOUBLE EXPONENTIAL ',
15041     1       'DISTRIBUTION,')
15042    6 FORMAT('       THE REQUESTED NUMBER OF RANDOM NUMBERS WAS ',
15043     1      'NON-POSITIVE.')
15044   15 FORMAT('***** ERROR: VALUE OF LAMBDA FOR SKEW DOUBLE ',
15045     1       'EXPONENTIAL RANDOM NUMBERS IS NEGATIVE.')
15046   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
15047   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
15048C
15049C     USE PERCENT POINT TRANSFORMATION METHOD.
15050C
15051      CALL UNIRAN(N,ISEED,X)
15052C
15053      DO100I=1,N
15054        ATEMP=X(I)
15055        CALL SDEPPF(ATEMP,ALMBDA,APPF)
15056        X(I)=APPF
15057  100 CONTINUE
15058C
15059 9999 CONTINUE
15060      RETURN
15061      END
15062      SUBROUTINE SDMEAN(X,N,IWRITE,XSDM,IBUGA3,IERROR)
15063C
15064C     PURPOSE--THIS SUBROUTINE COMPUTES THE
15065C              STANDARD DEVIATION OF THE MEAN (AVERAGE).
15066C              IT IS HERE COMPUTED AS THE RATIO OF THE
15067C              SAMPLE STANDARD DEVIATION (WITH DENOMINATOR N-1)
15068C              OF THE DATA IN THE INPUT VECTOR X,
15069C              DIVIDED BY THE SQUARE ROOT OF THE
15070C              NUMBER N OF OBSERVATIONS IN X.
15071C              THE SAMPLE STANDARD DEVIATION = SQRT((THE SUM OF THE
15072C              SQUARED DEVIATIONS ABOUT THE SAMPLE MEAN)/(N-1)).
15073C              THE STANDARD DEVIATION OF THE MEAN =
15074C              THE SAMPLE STANDARD DEVIATION / SQRT(N).
15075C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
15076C                                (UNSORTED OR SORTED) OBSERVATIONS.
15077C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
15078C                                IN THE VECTOR X.
15079C     OUTPUT ARGUMENTS--XSDM   = THE SINGLE PRECISION VALUE OF THE
15080C                                COMPUTED STANDARD DEVIATION
15081C                                OF THE SAMPLE MEAN.
15082C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
15083C             STANDARD DEVIATION OF THE SAMPLE MEAN.
15084C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
15085C                   OF N FOR THIS SUBROUTINE.
15086C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
15087C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
15088C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
15089C     LANGUAGE--ANSI FORTRAN (1977)
15090C     REFERENCES--SNEDECOR AND COCHRAN, STATISTICAL METHODS,
15091C                 EDITION 6, 1967, PAGE 44.
15092C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
15093C                 ANALYSIS, EDITION 2, 1957, PAGES 19, 76.
15094C     WRITTEN BY--JAMES J. FILLIBEN
15095C                 STATISTICAL ENGINEERING DIVISION
15096C                 INFORMATION TECHNOLOGY LABORATORY
15097C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
15098C                 GAITHERSBURG, MD 20899-8980
15099C                 PHONE--301-975-2855
15100C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
15101C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
15102C     LANGUAGE--ANSI FORTRAN (1966)
15103C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
15104C                          DENOTED BY QUOTES RATHER THAN NH.
15105C     VERSION NUMBER--82.6
15106C     ORIGINAL VERSION--JANUARY   1978.
15107C     UPDATED         --JUNE      1979.
15108C     UPDATED         --JUNE      1979.
15109C     UPDATED         --AUGUST    1981.
15110C     UPDATED         --MAY       1982.
15111C
15112C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
15113C
15114      CHARACTER*4 IWRITE
15115      CHARACTER*4 IBUGA3
15116      CHARACTER*4 IERROR
15117C
15118      CHARACTER*4 ISUBN1
15119      CHARACTER*4 ISUBN2
15120C
15121C---------------------------------------------------------------------
15122C
15123      DOUBLE PRECISION DN
15124      DOUBLE PRECISION DX
15125      DOUBLE PRECISION DSUM
15126      DOUBLE PRECISION DMEAN
15127      DOUBLE PRECISION DVAR
15128      DOUBLE PRECISION DSD
15129C
15130      DIMENSION X(*)
15131C
15132C-----COMMON---------------------------------------------------------
15133C
15134      INCLUDE 'DPCOP2.INC'
15135C
15136C-----START POINT-----------------------------------------------------
15137C
15138      ISUBN1='SDME'
15139      ISUBN2='AN  '
15140      IERROR='NO'
15141C
15142      DMEAN=0.0D0
15143      DSD=0.0D0
15144C
15145      IF(IBUGA3.EQ.'OFF')GOTO90
15146      WRITE(ICOUT,999)
15147  999 FORMAT(1X)
15148      CALL DPWRST('XXX','BUG ')
15149      WRITE(ICOUT,51)
15150   51 FORMAT('***** AT THE BEGINNING OF SDMEAN--')
15151      CALL DPWRST('XXX','BUG ')
15152      WRITE(ICOUT,52)IBUGA3
15153   52 FORMAT('IBUGA3 = ',A4)
15154      CALL DPWRST('XXX','BUG ')
15155      WRITE(ICOUT,53)N
15156   53 FORMAT('N = ',I8)
15157      CALL DPWRST('XXX','BUG ')
15158      DO55I=1,N
15159      WRITE(ICOUT,56)I,X(I)
15160   56 FORMAT('I,X(I) = ',I8,E15.7)
15161      CALL DPWRST('XXX','BUG ')
15162   55 CONTINUE
15163   90 CONTINUE
15164C
15165C               **********************************************
15166C               **  COMPUTE STANDARD DEVIATION OF THE MEAN  **
15167C               **********************************************
15168C
15169C               ********************************************
15170C               **  STEP 1--                              **
15171C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
15172C               ********************************************
15173C
15174      AN=N
15175C
15176      IF(N.GE.1)GOTO119
15177      IERROR='YES'
15178      WRITE(ICOUT,999)
15179      CALL DPWRST('XXX','BUG ')
15180      WRITE(ICOUT,111)
15181  111 FORMAT('***** ERROR IN SDMEAN--')
15182      CALL DPWRST('XXX','BUG ')
15183      WRITE(ICOUT,112)
15184  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
15185      CALL DPWRST('XXX','BUG ')
15186      WRITE(ICOUT,113)
15187  113 FORMAT('      IN THE VARIABLE FOR WHICH')
15188      CALL DPWRST('XXX','BUG ')
15189      WRITE(ICOUT,114)
15190  114 FORMAT('      THE STANDARD DEVIATION OF THE MEAN IS TO BE')
15191      CALL DPWRST('XXX','BUG ')
15192      WRITE(ICOUT,115)
15193  115 FORMAT('      COMPUTED, MUST BE 1 OR LARGER.')
15194      CALL DPWRST('XXX','BUG ')
15195      WRITE(ICOUT,116)
15196  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
15197      CALL DPWRST('XXX','BUG ')
15198      WRITE(ICOUT,117)N
15199  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
15200     1'.')
15201      CALL DPWRST('XXX','BUG ')
15202      GOTO9000
15203  119 CONTINUE
15204C
15205      IF(N.EQ.1)GOTO120
15206      GOTO129
15207  120 CONTINUE
15208      WRITE(ICOUT,999)
15209      CALL DPWRST('XXX','BUG ')
15210      WRITE(ICOUT,121)
15211  121 FORMAT('***** NON-FATAL DIAGNOSTIC IN SDMEAN--',
15212     1'THE 2ND INPUT ARGUMENT (N) HAS THE VALUE 1')
15213      CALL DPWRST('XXX','BUG ')
15214      XSDM=0.0
15215      GOTO9000
15216  129 CONTINUE
15217C
15218      HOLD=X(1)
15219      DO135I=2,N
15220      IF(X(I).NE.HOLD)GOTO139
15221  135 CONTINUE
15222      WRITE(ICOUT,999)
15223      CALL DPWRST('XXX','BUG ')
15224      WRITE(ICOUT,136)HOLD
15225  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN SDMEAN--',
15226     1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
15227      CALL DPWRST('XXX','BUG ')
15228      XSDM=0.0
15229      GOTO9000
15230  139 CONTINUE
15231C
15232C               ***************************************************
15233C               **  STEP 2--                                     **
15234C               **  COMPUTE THE STANDARD DEVIATION OF THE MEAN.  **
15235C               ***************************************************
15236C
15237      DN=N
15238      DSUM=0.0D0
15239      DO200I=1,N
15240      DX=X(I)
15241      DSUM=DSUM+DX
15242  200 CONTINUE
15243      DMEAN=DSUM/DN
15244C
15245      DSUM=0.0D0
15246      DO300I=1,N
15247      DX=X(I)
15248      DSUM=DSUM+(DX-DMEAN)**2
15249  300 CONTINUE
15250      DVAR=DSUM/(DN-1.0D0)
15251      DSD=0.0D0
15252      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
15253      XSDM=DSD/DSQRT(DN)
15254C
15255C               *******************************
15256C               **  STEP 3--                 **
15257C               **  WRITE OUT A LINE         **
15258C               **  OF SUMMARY INFORMATION.  **
15259C               *******************************
15260C
15261      IF(IFEEDB.EQ.'OFF')GOTO890
15262      IF(IWRITE.EQ.'OFF')GOTO890
15263      WRITE(ICOUT,999)
15264      CALL DPWRST('XXX','BUG ')
15265      WRITE(ICOUT,811)N,XSDM
15266  811 FORMAT('THE STANDARD DEVIATION OF THE MEAN BASED ON ',I8,
15267     1' OBSERVATIONS = ',E15.7)
15268      CALL DPWRST('XXX','BUG ')
15269  890 CONTINUE
15270C
15271C               *****************
15272C               **  STEP 90--  **
15273C               **  EXIT.      **
15274C               *****************
15275C
15276 9000 CONTINUE
15277      IF(IBUGA3.EQ.'OFF')GOTO9090
15278      WRITE(ICOUT,999)
15279      CALL DPWRST('XXX','BUG ')
15280      WRITE(ICOUT,9011)
15281 9011 FORMAT('***** AT THE END       OF SDMEAN--')
15282      CALL DPWRST('XXX','BUG ')
15283      WRITE(ICOUT,9012)IBUGA3,IERROR
15284 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
15285      CALL DPWRST('XXX','BUG ')
15286      WRITE(ICOUT,9013)N
15287 9013 FORMAT('N = ',I8)
15288      CALL DPWRST('XXX','BUG ')
15289      WRITE(ICOUT,9014)DMEAN,DSD
15290 9014 FORMAT('DMEAN,DSD = ',2D15.7)
15291      CALL DPWRST('XXX','BUG ')
15292      WRITE(ICOUT,9015)XSDM
15293 9015 FORMAT('XSDM = ',E15.7)
15294      CALL DPWRST('XXX','BUG ')
15295 9090 CONTINUE
15296C
15297      RETURN
15298      END
15299      SUBROUTINE SDMLE(X,N,IWRITE,XSD,IBUGA3,IERROR)
15300C
15301C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE STANDARD DEVIATION
15302C              (WITH DENOMINATOR N) OF THE DATA IN THE INPUT VECTOR X.
15303C              THE SAMPLE STANDARD DEVIATION = SQRT((THE SUM OF THE
15304C              SQUARED DEVIATIONS ABOUT THE SAMPLE MEAN)/N).
15305C
15306C              NOTE THAT THIS IS SIMILAR TO SUBROUTINE SD.  THE
15307C              DISTINCTION IS THAT THIS ROUTINE USES N RATHER THAN
15308C              N-1 AS THE DIVISOR.  THIS IS THE MAXIMUM LIKELIHOOD
15309C              VERSION OF THE ESTIMATOR.  THIS WAS ADDED PRIMARILY
15310C              FOR INTERNAL USE (E.G., COEFFICIENT OF VARIATION
15311C              CONFIDENCE LIMITS MAY USE THIS).
15312C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
15313C                                (UNSORTED OR SORTED) OBSERVATIONS.
15314C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
15315C                                IN THE VECTOR X.
15316C     OUTPUT ARGUMENTS--XSD    = THE SINGLE PRECISION VALUE OF THE
15317C                                COMPUTED SAMPLE STANDARD DEVIATION.
15318C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
15319C             SAMPLE STANDARD DEVIATION (WITH DENOMINATOR N-1).
15320C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
15321C                   OF N FOR THIS SUBROUTINE.
15322C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
15323C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
15324C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
15325C     LANGUAGE--ANSI FORTRAN (1977)
15326C     WRITTEN BY--ALAN HECKERT
15327C                 STATISTICAL ENGINEERING DIVISION
15328C                 INFORMATION TECHNOLOGY LABORATORY
15329C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
15330C                 GAITHERSBURG, MD 20899-8980
15331C                 PHONE--301-975-2899
15332C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
15333C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
15334C     LANGUAGE--ANSI FORTRAN (1977)
15335C     VERSION NUMBER--2016.12
15336C     ORIGINAL VERSION--DECEMBER  2016.
15337C
15338C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
15339C
15340      CHARACTER*4 IWRITE
15341      CHARACTER*4 IBUGA3
15342      CHARACTER*4 IERROR
15343C
15344      CHARACTER*4 ISUBN1
15345      CHARACTER*4 ISUBN2
15346C
15347C---------------------------------------------------------------------
15348C
15349      DOUBLE PRECISION DN
15350      DOUBLE PRECISION DX
15351      DOUBLE PRECISION DSUM
15352      DOUBLE PRECISION DMEAN
15353      DOUBLE PRECISION DVAR
15354      DOUBLE PRECISION DSD
15355C
15356      DIMENSION X(*)
15357C
15358C-----COMMON----------------------------------------------------------
15359C
15360      INCLUDE 'DPCOP2.INC'
15361C
15362C-----START POINT-----------------------------------------------------
15363C
15364      ISUBN1='SDML'
15365      ISUBN2='E   '
15366      IERROR='NO'
15367C
15368      DMEAN=0.0D0
15369C
15370      IF(IBUGA3.EQ.'ON')THEN
15371        WRITE(ICOUT,999)
15372  999   FORMAT(1X)
15373        CALL DPWRST('XXX','BUG ')
15374        WRITE(ICOUT,51)
15375   51   FORMAT('***** AT THE BEGINNING OF SDMLE--')
15376        CALL DPWRST('XXX','BUG ')
15377        WRITE(ICOUT,52)IBUGA3,N
15378   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
15379        CALL DPWRST('XXX','BUG ')
15380        DO55I=1,N
15381          WRITE(ICOUT,56)I,X(I)
15382   56     FORMAT('I,X(I) = ',I8,G15.7)
15383          CALL DPWRST('XXX','BUG ')
15384   55   CONTINUE
15385      ENDIF
15386C
15387C               **********************************
15388C               **  COMPUTE STANDARD DEVIATION  **
15389C               **********************************
15390C
15391C               ********************************************
15392C               **  STEP 1--                              **
15393C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
15394C               ********************************************
15395C
15396      AN=N
15397C
15398      IF(N.LT.1)THEN
15399        IERROR='YES'
15400        WRITE(ICOUT,999)
15401        CALL DPWRST('XXX','BUG ')
15402        WRITE(ICOUT,111)
15403  111   FORMAT('***** ERROR IN SD (MLE FORM)--')
15404        CALL DPWRST('XXX','BUG ')
15405        WRITE(ICOUT,112)
15406  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
15407        CALL DPWRST('XXX','BUG ')
15408        WRITE(ICOUT,115)
15409  115   FORMAT('      VARIABLE IS LESS THAN 1.')
15410        CALL DPWRST('XXX','BUG ')
15411        WRITE(ICOUT,117)N
15412  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,'.')
15413        CALL DPWRST('XXX','BUG ')
15414        GOTO9000
15415      ENDIF
15416C
15417      XSD=0.0
15418      IF(N.EQ.1)GOTO800
15419C
15420      HOLD=X(1)
15421      DO135I=2,N
15422        IF(X(I).NE.HOLD)GOTO139
15423  135 CONTINUE
15424      GOTO800
15425  139 CONTINUE
15426C
15427C               ***************************************
15428C               **  STEP 2--                         **
15429C               **  COMPUTE THE STANDARD DEVIATION.  **
15430C               ***************************************
15431C
15432      DN=N
15433      DSUM=0.0D0
15434      DO200I=1,N
15435        DX=X(I)
15436        DSUM=DSUM+DX
15437  200 CONTINUE
15438      DMEAN=DSUM/DN
15439C
15440      DSUM=0.0D0
15441      DO300I=1,N
15442        DX=X(I)
15443        DSUM=DSUM+(DX-DMEAN)**2
15444  300 CONTINUE
15445      DVAR=DSUM/DN
15446      DSD=0.0D0
15447      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
15448      XSD=DSD
15449C
15450C               *******************************
15451C               **  STEP 3--                 **
15452C               **  WRITE OUT A LINE         **
15453C               **  OF SUMMARY INFORMATION.  **
15454C               *******************************
15455C
15456  800 CONTINUE
15457      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
15458        WRITE(ICOUT,999)
15459        CALL DPWRST('XXX','BUG ')
15460        WRITE(ICOUT,811)N,XSD
15461  811   FORMAT('THE STANDARD DEVIATION (MLE) OF THE ',I8,
15462     1         ' OBSERVATIONS = ',E15.7)
15463        CALL DPWRST('XXX','BUG ')
15464      ENDIF
15465C
15466C               *****************
15467C               **  STEP 90--  **
15468C               **  EXIT.      **
15469C               *****************
15470C
15471 9000 CONTINUE
15472      IF(IBUGA3.EQ.'ON')THEN
15473        WRITE(ICOUT,999)
15474        CALL DPWRST('XXX','BUG ')
15475        WRITE(ICOUT,9011)
15476 9011   FORMAT('***** AT THE END       OF SD--')
15477        CALL DPWRST('XXX','BUG ')
15478        WRITE(ICOUT,9012)IERROR,DMEAN,XSD
15479 9012   FORMAT('IERROR,DMEAN,XSD = ',A4,2X,2G15.7)
15480        CALL DPWRST('XXX','BUG ')
15481      ENDIF
15482C
15483      RETURN
15484      END
15485      REAL FUNCTION SDOT(N,SX,INCX,SY,INCY)
15486C
15487C***BEGIN PROLOGUE  SDOT
15488C***DATE WRITTEN   791001   (YYMMDD)
15489C***REVISION DATE  820801   (YYMMDD)
15490C***CATEGORY NO.  D1A4
15491C***KEYWORDS  BLAS,INNER PRODUCT,LINEAR ALGEBRA,VECTOR
15492C***AUTHOR  LAWSON, C. L., (JPL)
15493C           HANSON, R. J., (SNLA)
15494C           KINCAID, D. R., (U. OF TEXAS)
15495C           KROGH, F. T., (JPL)
15496C***PURPOSE  S.P. inner product of s.p. vectors
15497C***DESCRIPTION
15498C
15499C                B L A S  Subprogram
15500C    Description of Parameters
15501C
15502C     --Input--
15503C        N  number of elements in input vector(s)
15504C       SX  single precision vector with N elements
15505C     INCX  storage spacing between elements of SX
15506C       SY  single precision vector with N elements
15507C     INCY  storage spacing between elements of SY
15508C
15509C     --Output--
15510C     SDOT  single precision dot product (zero if N .LE. 0)
15511C
15512C     where LX = 1 if INCX .GE. 0, else LX = (-INCX)*N, and LY is
15513C     defined in a similar way using INCY.
15514C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
15515C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
15516C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
15517C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
15518C***ROUTINES CALLED  (NONE)
15519C***END PROLOGUE  SDOT
15520C
15521      REAL SX(*),SY(*)
15522C***FIRST EXECUTABLE STATEMENT  SDOT
15523      SDOT = 0.0E0
15524      IF(N.LE.0)RETURN
15525C
15526CCCCC JUNE 2008: MODIFY FOLLOWING LINE SO THAT IT DOES NOT
15527CCCCC            GENERATE WARNING MESSAGE ON FORTRAN 95 COMPILERS.
15528C
15529CCCCC IF(INCX.EQ.INCY) IF(INCX-1)5,20,60
15530      IF(INCX.EQ.INCY) THEN
15531        IF(INCX-1.LT.0)THEN
15532          GOTO5
15533        ELSEIF(INCX-1.EQ.0)THEN
15534          GOTO20
15535        ELSE
15536          GOTO60
15537        ENDIF
15538      ENDIF
15539    5 CONTINUE
15540C
15541C        CODE FOR UNEQUAL INCREMENTS OR NONPOSITIVE INCREMENTS.
15542C
15543      IX = 1
15544      IY = 1
15545      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
15546      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
15547      DO 10 I = 1,N
15548        SDOT = SDOT + SX(IX)*SY(IY)
15549        IX = IX + INCX
15550        IY = IY + INCY
15551   10 CONTINUE
15552      RETURN
15553C
15554C        CODE FOR BOTH INCREMENTS EQUAL TO 1
15555C
15556C
15557C        CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 5.
15558C
15559   20 M = MOD(N,5)
15560      IF( M .EQ. 0 ) GO TO 40
15561      DO 30 I = 1,M
15562        SDOT = SDOT + SX(I)*SY(I)
15563   30 CONTINUE
15564      IF( N .LT. 5 ) RETURN
15565   40 MP1 = M + 1
15566      DO 50 I = MP1,N,5
15567        SDOT = SDOT + SX(I)*SY(I) + SX(I + 1)*SY(I + 1) +
15568     1   SX(I + 2)*SY(I + 2) + SX(I + 3)*SY(I + 3) + SX(I + 4)*SY(I + 4)
15569   50 CONTINUE
15570      RETURN
15571C
15572C        CODE FOR POSITIVE EQUAL INCREMENTS .NE.1.
15573C
15574   60 CONTINUE
15575      NS=N*INCX
15576      DO 70 I=1,NS,INCX
15577        SDOT = SDOT + SX(I)*SY(I)
15578   70   CONTINUE
15579      RETURN
15580      END
15581      REAL FUNCTION SDSDOT(N,X,INCX,Y,INCY,C)
15582CCCCC REAL FUNCTION SDSDOT(N,SB,SX,INCX,SY,INCY)
15583CCCCC OCTOBER 1993.  USE VERSION AS CODED IN LINPACK MANUAL
15584C***BEGIN PROLOGUE  SDSDOT
15585C***DATE WRITTEN   791001   (YYMMDD)
15586C***REVISION DATE  820801   (YYMMDD)
15587C***CATEGORY NO.  D1A4
15588C***KEYWORDS  BLAS,INNER PRODUCT,LINEAR ALGEBRA,VECTOR
15589C***AUTHOR  LAWSON, C. L., (JPL)
15590C           HANSON, R. J., (SNLA)
15591C           KINCAID, D. R., (U. OF TEXAS)
15592C           KROGH, F. T., (JPL)
15593C***PURPOSE  S.P. result with inner product accumulated in d.p.
15594C***DESCRIPTION
15595C
15596C                B L A S  Subprogram
15597C    Description of Parameters
15598C
15599C     --Input--
15600C        N  number of elements in input vector(s)
15601C        C  single precision scalar to be added to inner product
15602C        X  single precision vector with N elements
15603C     INCX  storage spacing between elements of SX
15604C        Y  single precision vector with N elements
15605C     INCY  storage spacing between elements of SY
15606C
15607C     --Output--
15608C   SDSDOT  single precision dot product (zero if N .LE. 0)
15609C
15610C     Returns S.P. result with dot product accumulated in D.P.
15611C     SDSDOT = SB + sum for I = 0 to N-1 of SX(LX+I*INCX)*SY(LY+I*INCY)
15612C     where LX = 1 if INCX .GE. 0, else LX = (-INCX)*N, and LY is
15613C     defined in a similar way using INCY.
15614C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
15615C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
15616C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
15617C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
15618C***ROUTINES CALLED  (NONE)
15619C***END PROLOGUE  SDSDOT
15620C
15621      REAL X(INCX,*),Y(INCY,*),C
15622      DOUBLE PRECISION SUM
15623C***FIRST EXECUTABLE STATEMENT  SDSDOT
15624      SUM = 0.0D0
15625      IF(N .LE. 0) GO TO 20
15626      DO 10 I = 1,N
15627        SUM = SUM + DBLE(X(1,I))*DBLE(Y(1,I))
15628   10 CONTINUE
15629   20 SUM = SUM + DBLE(C)
15630      SDSDOT = SNGL(SUM)
15631      RETURN
15632      END
15633      SUBROUTINE SECFAC(NR,N,X,G,A,XPLS,GPLS,EPSM,ITNCNT,RNF,
15634     +     IAGFLG,NOUPDT,S,Y,U,W)
15635      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
15636C
15637C PURPOSE
15638C -------
15639C UPDATE HESSIAN BY THE BFGS FACTORED METHOD
15640C
15641C PARAMETERS
15642C ----------
15643C NR           --> ROW DIMENSION OF MATRIX
15644C N            --> DIMENSION OF PROBLEM
15645C X(N)         --> OLD ITERATE, X[K-1]
15646C G(N)         --> GRADIENT OR APPROXIMATE AT OLD ITERATE
15647C A(N,N)      <--> ON ENTRY: CHOLESKY DECOMPOSITION OF HESSIAN IN
15648C                    LOWER PART AND DIAGONAL.
15649C                  ON EXIT:  UPDATED CHOLESKY DECOMPOSITION OF HESSIAN
15650C                    IN LOWER TRIANGULAR PART AND DIAGONAL
15651C XPLS(N)      --> NEW ITERATE, X[K]
15652C GPLS(N)      --> GRADIENT OR APPROXIMATE AT NEW ITERATE
15653C EPSM         --> MACHINE EPSILON
15654C ITNCNT       --> ITERATION COUNT
15655C RNF          --> RELATIVE NOISE IN OPTIMIZATION FUNCTION FCN
15656C IAGFLG       --> =1 IF ANALYTIC GRADIENT SUPPLIED, =0 ITHERWISE
15657C NOUPDT      <--> BOOLEAN: NO UPDATE YET
15658C                  [RETAIN VALUE BETWEEN SUCCESSIVE CALLS]
15659C S(N)         --> WORKSPACE
15660C Y(N)         --> WORKSPACE
15661C U(N)         --> WORKSPACE
15662C W(N)         --> WORKSPACE
15663C
15664      DIMENSION X(*),XPLS(*),G(*),GPLS(*)
15665      DIMENSION A(NR,*)
15666      DIMENSION S(*),Y(*),U(*),W(*)
15667      LOGICAL NOUPDT,SKPUPD
15668C
15669      IF(ITNCNT.EQ.1) NOUPDT=.TRUE.
15670      DO 10 I=1,N
15671        S(I)=XPLS(I)-X(I)
15672        Y(I)=GPLS(I)-G(I)
15673   10 CONTINUE
15674      DEN1=DDOT(N,S,1,Y,1)
15675      SNORM2=DNRM2(N,S,1)
15676      YNRM2=DNRM2(N,Y,1)
15677      IF(DEN1.LT.SQRT(EPSM)*SNORM2*YNRM2) GO TO 110
15678C     IF(DEN1.GE.SQRT(EPSM)*SNORM2*YNRM2)
15679C     THEN
15680        CALL MVMLTU(NR,N,A,S,U)
15681        DEN2=DDOT(N,U,1,U,1)
15682C
15683C       L <-- SQRT(DEN1/DEN2)*L
15684C
15685        ALP=SQRT(DEN1/DEN2)
15686        IF(.NOT.NOUPDT) GO TO 50
15687C       IF(NOUPDT)
15688C       THEN
15689          DO 30 J=1,N
15690            U(J)=ALP*U(J)
15691            DO 20 I=J,N
15692              A(I,J)=ALP*A(I,J)
15693   20       CONTINUE
15694   30     CONTINUE
15695          NOUPDT=.FALSE.
15696          DEN2=DEN1
15697          ALP=1.0
15698C       ENDIF
15699   50   SKPUPD=.TRUE.
15700C
15701C       W = L(L+)S = HS
15702C
15703        CALL MVMLTL(NR,N,A,U,W)
15704        I=1
15705        IF(IAGFLG.NE.0) GO TO 55
15706C       IF(IAGFLG.EQ.0)
15707C       THEN
15708          RELTOL=SQRT(RNF)
15709          GO TO 60
15710C       ELSE
15711   55     RELTOL=RNF
15712C       ENDIF
15713   60   IF(I.GT.N .OR. .NOT.SKPUPD) GO TO 70
15714C       IF(I.LE.N .AND. SKPUPD)
15715C       THEN
15716          IF(ABS(Y(I)-W(I)) .LT. RELTOL*MAX(ABS(G(I)),ABS(GPLS(I))))
15717     +         GO TO 65
15718C         IF(ABS(Y(I)-W(I)) .GE. RELTOL*AMAX1(ABS(G(I)),ABS(GPLS(I))))
15719C         THEN
15720            SKPUPD=.FALSE.
15721            GO TO 60
15722C         ELSE
15723   65       I=I+1
15724            GO TO 60
15725C         ENDIF
15726C       ENDIF
15727   70   IF(SKPUPD) GO TO 110
15728C       IF(.NOT.SKPUPD)
15729C       THEN
15730C
15731C         W=Y-ALP*L(L+)S
15732C
15733          DO 75 I=1,N
15734            W(I)=Y(I)-ALP*W(I)
15735   75     CONTINUE
15736C
15737C         ALP=1/SQRT(DEN1*DEN2)
15738C
15739          ALP=ALP/DEN1
15740C
15741C         U=(L+)/SQRT(DEN1*DEN2) = (L+)S/SQRT((Y+)S * (S+)L(L+)S)
15742C
15743          DO 80 I=1,N
15744            U(I)=ALP*U(I)
15745   80     CONTINUE
15746C
15747C         COPY L INTO UPPER TRIANGULAR PART.  ZERO L.
15748C
15749          IF(N.EQ.1) GO TO 93
15750          DO 90 I=2,N
15751            IM1=I-1
15752            DO 85 J=1,IM1
15753              A(J,I)=A(I,J)
15754              A(I,J)=0.
15755   85       CONTINUE
15756   90     CONTINUE
15757C
15758C         FIND Q, (L+) SUCH THAT  Q(L+) = (L+) + U(W+)
15759C
15760   93     CALL QRUPDT(NR,N,A,U,W)
15761C
15762C         UPPER TRIANGULAR PART AND DIAGONAL OF A NOW CONTAIN UPDATED
15763C         CHOLESKY DECOMPOSITION OF HESSIAN.  COPY BACK TO LOWER
15764C         TRIANGULAR PART.
15765C
15766          IF(N.EQ.1) GO TO 110
15767          DO 100 I=2,N
15768            IM1=I-1
15769            DO 95 J=1,IM1
15770              A(I,J)=A(J,I)
15771   95       CONTINUE
15772  100     CONTINUE
15773C       ENDIF
15774C     ENDIF
15775  110 RETURN
15776      END
15777      SUBROUTINE SECUNF(NR,N,X,G,A,UDIAG,XPLS,GPLS,EPSM,ITNCNT,
15778     +     RNF,IAGFLG,NOUPDT,S,Y,T)
15779      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
15780C
15781C PURPOSE
15782C -------
15783C UPDATE HESSIAN BY THE BFGS UNFACTORED METHOD
15784C
15785C PARAMETERS
15786C ----------
15787C NR           --> ROW DIMENSION OF MATRIX
15788C N            --> DIMENSION OF PROBLEM
15789C X(N)         --> OLD ITERATE, X[K-1]
15790C G(N)         --> GRADIENT OR APPROXIMATE AT OLD ITERATE
15791C A(N,N)      <--> ON ENTRY: APPROXIMATE HESSIAN AT OLD ITERATE
15792C                    IN UPPER TRIANGULAR PART (AND UDIAG)
15793C                  ON EXIT:  UPDATED APPROX HESSIAN AT NEW ITERATE
15794C                    IN LOWER TRIANGULAR PART AND DIAGONAL
15795C                  [LOWER TRIANGULAR PART OF SYMMETRIC MATRIX]
15796C UDIAG        --> ON ENTRY: DIAGONAL OF HESSIAN
15797C XPLS(N)      --> NEW ITERATE, X[K]
15798C GPLS(N)      --> GRADIENT OR APPROXIMATE AT NEW ITERATE
15799C EPSM         --> MACHINE EPSILON
15800C ITNCNT       --> ITERATION COUNT
15801C RNF          --> RELATIVE NOISE IN OPTIMIZATION FUNCTION FCN
15802C IAGFLG       --> =1 IF ANALYTIC GRADIENT SUPPLIED, =0 OTHERWISE
15803C NOUPDT      <--> BOOLEAN: NO UPDATE YET
15804C                  [RETAIN VALUE BETWEEN SUCCESSIVE CALLS]
15805C S(N)         --> WORKSPACE
15806C Y(N)         --> WORKSPACE
15807C T(N)         --> WORKSPACE
15808C
15809      DIMENSION X(N),G(N),XPLS(N),GPLS(N)
15810      DIMENSION A(NR,1)
15811      DIMENSION UDIAG(N)
15812      DIMENSION S(N),Y(N),T(N)
15813      LOGICAL NOUPDT,SKPUPD
15814C
15815C COPY HESSIAN IN UPPER TRIANGULAR PART AND UDIAG TO
15816C LOWER TRIANGULAR PART AND DIAGONAL
15817C
15818      DO 5 J=1,N
15819        A(J,J)=UDIAG(J)
15820        IF(J.EQ.N) GO TO 5
15821        JP1=J+1
15822        DO 4 I=JP1,N
15823          A(I,J)=A(J,I)
15824    4   CONTINUE
15825    5 CONTINUE
15826C
15827      IF(ITNCNT.EQ.1) NOUPDT=.TRUE.
15828      DO 10 I=1,N
15829        S(I)=XPLS(I)-X(I)
15830        Y(I)=GPLS(I)-G(I)
15831   10 CONTINUE
15832      DEN1=DDOT(N,S,1,Y,1)
15833      SNORM2=DNRM2(N,S,1)
15834      YNRM2=DNRM2(N,Y,1)
15835      IF(DEN1.LT.SQRT(EPSM)*SNORM2*YNRM2) GO TO 100
15836C     IF(DEN1.GE.SQRT(EPSM)*SNORM2*YNRM2)
15837C     THEN
15838        CALL MVMLTS(NR,N,A,S,T)
15839        DEN2=DDOT(N,S,1,T,1)
15840        IF(.NOT. NOUPDT) GO TO 50
15841C       IF(NOUPDT)
15842C       THEN
15843C
15844C         H <-- [(S+)Y/(S+)HS]H
15845C
15846          GAM=DEN1/DEN2
15847          DEN2=GAM*DEN2
15848          DO 30 J=1,N
15849            T(J)=GAM*T(J)
15850            DO 20 I=J,N
15851              A(I,J)=GAM*A(I,J)
15852   20       CONTINUE
15853   30     CONTINUE
15854          NOUPDT=.FALSE.
15855C       ENDIF
15856   50   SKPUPD=.TRUE.
15857C
15858C       CHECK UPDATE CONDITION ON ROW I
15859C
15860        DO 60 I=1,N
15861          TOL=RNF*MAX(ABS(G(I)),ABS(GPLS(I)))
15862          IF(IAGFLG.EQ.0) TOL=TOL/SQRT(RNF)
15863          IF(ABS(Y(I)-T(I)).LT.TOL) GO TO 60
15864C         IF(ABS(Y(I)-T(I)).GE.TOL)
15865C         THEN
15866            SKPUPD=.FALSE.
15867            GO TO 70
15868C         ENDIF
15869   60   CONTINUE
15870   70   IF(SKPUPD) GO TO 100
15871C       IF(.NOT.SKPUPD)
15872C       THEN
15873C
15874C         BFGS UPDATE
15875C
15876          DO 90 J=1,N
15877            DO 80 I=J,N
15878              A(I,J)=A(I,J)+Y(I)*Y(J)/DEN1-T(I)*T(J)/DEN2
15879   80       CONTINUE
15880   90     CONTINUE
15881C       ENDIF
15882C     ENDIF
15883  100 RETURN
15884      END
15885      SUBROUTINE SEMCDF(X,R,CDF)
15886C
15887C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
15888C              FUNCTION VALUE FOR THE SEMI-CIRCULAR
15889C              DISTRIBUTION ON THE INTERVAL (-R,R).
15890C              THE CUMULATIVE DISTRIBUTION FUNCTION IS
15891C
15892C                  F(X;R) = 0.5 + X*SQRT(R**2-X**2)/(PI*R**2) +
15893C                           ARCSIN(X/R)/PI
15894C
15895C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
15896C                                WHICH THE CUMULATIVE DISTRIBUTION
15897C                                FUNCTION IS TO BE EVALUATED.
15898C                     --R      = THE SINGLE PRECISION VALUE OF
15899C                                THE SHAPE PARAMETER (RADIUS)
15900C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
15901C                                DISTRIBUTION FUNCTION VALUE.
15902C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
15903C             FUNCTION VALUE CDF.
15904C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
15905C     RESTRICTIONS--X SHOULD BE BETWEEN -R AND R, INCLUSIVELY.
15906C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
15907C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT, ATAN.
15908C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
15909C     LANGUAGE--ANSI FORTRAN (1977)
15910C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
15911C                 DISTRIBUTIONS--XXXXX.
15912C     WRITTEN BY--JAMES J. FILLIBEN
15913C                 STATISTICAL ENGINEERING DIVISION
15914C                 INFORMATION TECHNOLOGY LABORATORY
15915C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
15916C                 GAITHERSBURG, MD 20899-8980
15917C                 PHONE--301-975-2855
15918C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
15919C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
15920C     LANGUAGE--ANSI FORTRAN (1977)
15921C     VERSION NUMBER--82.6
15922C     ORIGINAL VERSION--NOVEMBER  1977.
15923C     UPDATED         --DECEMBER  1981.
15924C     UPDATED         --MAY       1982.
15925C     UPDATED         --OCTOBER   2006. GENERALIZE TO CASE WHERE
15926C                                       RADIUS NOT EQUAL TO 1
15927C
15928C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
15929C
15930C-----COMMON----------------------------------------------------------
15931C
15932      INCLUDE 'DPCOP2.INC'
15933C
15934C-----DATA STATEMENTS-------------------------------------------------
15935C
15936      DATA PI/3.14159265359/
15937C
15938C-----START POINT-----------------------------------------------------
15939C
15940C     CHECK THE INPUT ARGUMENTS FOR ERRORS
15941C
15942      IF(R.LE.0.0)THEN
15943        WRITE(ICOUT,1)
15944    1   FORMAT('***** ERROR--THE SECOD INPUT ARGUMENT ',
15945     1         'TO SEMCDF IS NON-POSITIVE')
15946        CALL DPWRST('XXX','BUG ')
15947        WRITE(ICOUT,46)R
15948        CALL DPWRST('XXX','BUG ')
15949        CDF=0.0
15950        GOTO9000
15951      ENDIF
15952      IF(X.LT.-R .OR. X.GT.R)THEN
15953        WRITE(ICOUT,2)
15954    2   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT ',
15955     1         'TO SEMCDF IS OUTSIDE THE (-R,R) INTERVAL')
15956        CALL DPWRST('XXX','BUG ')
15957        WRITE(ICOUT,46)X
15958   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
15959        CALL DPWRST('XXX','BUG ')
15960        WRITE(ICOUT,47)R
15961   47   FORMAT('***** THE VALUE OF R            IS ',G15.7)
15962        CALL DPWRST('XXX','BUG ')
15963        CDF=0.0
15964        GOTO9000
15965      ENDIF
15966C
15967      IF(X.EQ.-R)THEN
15968        CDF=0.0
15969      ELSEIF(X.EQ.R)THEN
15970        CDF=1.0
15971      ELSE
15972        TERM1=0.5
15973        TERM2=X*SQRT(R**2 - X*X)/(PI*R**2)
15974        TERM3=ASIN(X/R)/PI
15975        CDF=TERM1 + TERM2 + TERM3
15976      ENDIF
15977C
15978 9000 CONTINUE
15979      RETURN
15980      END
15981      SUBROUTINE SEMPDF(X,R,PDF)
15982C
15983C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
15984C              FUNCTION VALUE FOR THE SEMI-CIRCULAR
15985C              DISTRIBUTION ON THE INTERVAL (-R,R).
15986C              THIS DISTRIBUTION HAS MEAN = 0.0
15987C              AND STANDARD DEVIATION = SQRT(R**2/4)
15988C              THIS DISTRIBUTION HAS THE PROBABILITY
15989C              DENSITY FUNCTION
15990C
15991C                  F(X;R) = 2*SQRT(R**2-X**2)/(PI*R**2)
15992C
15993C              (A SEMI-CIRCLE FOR R=1, AN ELLIPSE OTHERWISE).
15994C              THIS DISTRIBUTION IS IMPORTANT IN THAT IT IS
15995C              THE DISTRIBUTION ONTO ONE AXIS
15996C              OF POINTS WHICH ARE UNIFORMLY
15997C              DISTRIBUTED WITHIN A CIRCLE OF UNIT RADIUS.
15998C              IT IS USEFUL IN TESTING FOR
15999C              2-DIMENSIONAL UNIFORMITY.
16000C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
16001C                                WHICH THE PROBABILITY DENSITY
16002C                                FUNCTION IS TO BE EVALUATED.
16003C                     --R      = THE SINGLE PRECISION VALUE THAT
16004C                                DEFINES THE RADIUS
16005C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
16006C                                DENSITY FUNCTION VALUE.
16007C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
16008C             FUNCTION VALUE PDF.
16009C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
16010C     RESTRICTIONS--X SHOULD BE BETWEEN -R AND R, INCLUSIVELY.
16011C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
16012C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT
16013C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
16014C     LANGUAGE--ANSI FORTRAN (1977)
16015C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
16016C                 DISTRIBUTIONS--XXXXX.
16017C     WRITTEN BY--JAMES J. FILLIBEN
16018C                 STATISTICAL ENGINEERING DIVISION
16019C                 INFORMATION TECHNOLOGY LABORATORY
16020C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
16021C                 GAITHERSBURG, MD 20899-8980
16022C                 PHONE--301-975-2855
16023C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16024C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
16025C     LANGUAGE--ANSI FORTRAN (1977)
16026C     VERSION NUMBER--94.4
16027C     ORIGINAL VERSION--APRIL     1994
16028C     UPDATED         --OCTOBER   2006. GENERALIZE TO CASES WHERE
16029C                                       R NOT EQUAL TO 1.
16030C
16031C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16032C
16033C-----COMMON----------------------------------------------------------
16034C
16035      INCLUDE 'DPCOP2.INC'
16036C
16037C-----DATA STATEMENTS-------------------------------------------------
16038C
16039      DATA PI/3.14159265359/
16040C
16041C-----START POINT-----------------------------------------------------
16042C
16043C     CHECK THE INPUT ARGUMENTS FOR ERRORS
16044C
16045      IF(R.LE.0.0)THEN
16046        WRITE(ICOUT,1)
16047    1   FORMAT('***** ERROR--THE SECOD INPUT ARGUMENT ',
16048     1         'TO SEMPDF IS NON-POSITIVE')
16049        CALL DPWRST('XXX','BUG ')
16050        WRITE(ICOUT,46)R
16051        CALL DPWRST('XXX','BUG ')
16052        PDF=0.0
16053        GOTO9000
16054      ENDIF
16055      IF(X.LT.-R .OR. X.GT.R)THEN
16056        WRITE(ICOUT,2)
16057    2   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT ',
16058     1         'TO SEMPDF IS OUTSIDE THE (-R,R) INTERVAL')
16059        CALL DPWRST('XXX','BUG ')
16060        WRITE(ICOUT,46)X
16061   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
16062        CALL DPWRST('XXX','BUG ')
16063        WRITE(ICOUT,47)R
16064   47   FORMAT('***** THE VALUE OF R            IS ',G15.7)
16065        CALL DPWRST('XXX','BUG ')
16066        PDF=0.0
16067        GOTO9000
16068      ENDIF
16069C
16070      IF(X.EQ.-R)THEN
16071        PDF=0.0
16072      ELSEIF(X.EQ.R)THEN
16073        PDF=0.0
16074      ELSE
16075        PDF=2.0*SQRT(R**2 - X*X)/(R**2*PI)
16076      ENDIF
16077C
16078 9000 CONTINUE
16079      RETURN
16080      END
16081      SUBROUTINE SEMPPF(P,R,PPF)
16082C
16083C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
16084C              FUNCTION VALUE FOR THE SEMI-CIRCULAR
16085C              DISTRIBUTION ON THE INTERVAL (-R,R).
16086C              THIS DISTRIBUTION HAS MEAN = 0.0
16087C              AND STANDARD DEVIATION = SQRT(R**2/4)
16088C              THIS DISTRIBUTION HAS THE PROBABILITY
16089C              DENSITY FUNCTION
16090C
16091C                  F(X;R) = 2*SQRT(R**2-X**2)/(PI*R**2)
16092C
16093C              (A SEMI-CIRCLE FOR R=1, AN ELLIPSE OTHERWISE).
16094C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
16095C                                (BETWEEN 0.0 AND 1.0)
16096C                                AT WHICH THE PERCENT POINT
16097C                                FUNCTION IS TO BE EVALUATED.
16098C                     --R      = THE SINGLE PRECISION VALUE THAT
16099C                                DEFINES THE RADIUS
16100C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT
16101C                                POINT FUNCTION VALUE.
16102C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
16103C             FUNCTION VALUE PPF.
16104C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
16105C     RESTRICTIONS--P SHOULD BE BETWEEN 0.0 AND 1.0, INCLUSIVELY.
16106C     OTHER DATAPAC   SUBROUTINES NEEDED--SEMCDF.
16107C     FORTRAN LIBRARY SUBROUTINES NEEDED--ABS.
16108C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
16109C     LANGUAGE--ANSI FORTRAN (1977)
16110C     REFERENCES--FILLIBEN, SIMPLE AND ROBUST LINEAR ESTIMATION
16111C                 OF THE LOCATION PARAMETER OF A SYMMETRIC
16112C                 DISTRIBUTION (UNPUBLISHED PH.D. DISSERTATION,
16113C                 PRINCETON UNIVERSITY), 1969, PAGES 21-44, 229-231.
16114C               --FILLIBEN, 'THE PERCENT POINT FUNCTION',
16115C                 (UNPUBLISHED MANUSCRIPT), 1970, PAGES 28-31.
16116C               --JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
16117C                 DISTRIBUTIONS--2, 1970, PAGES 57-74.
16118C     WRITTEN BY--JAMES J. FILLIBEN
16119C                 STATISTICAL ENGINEERING DIVISION
16120C                 INFORMATION TECHNOLOGY LABORATORY
16121C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
16122C                 GAITHERSBURG, MD 20899-8980
16123C                 PHONE--301-975-2855
16124C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16125C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
16126C     LANGUAGE--ANSI FORTRAN (1977)
16127C     VERSION NUMBER--82.6
16128C     ORIGINAL VERSION--DECEMBER  1977.
16129C     UPDATED         --DECEMBER  1981.
16130C     UPDATED         --MAY       1982.
16131C     UPDATED         --OCTOBER   2006. GENERALIZE TO THE CASE
16132C                                       WHERE R NOT EQUAL TO 1
16133C
16134C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16135C
16136C
16137C-----COMMON----------------------------------------------------------
16138C
16139      INCLUDE 'DPCOP2.INC'
16140C
16141C-----START POINT-----------------------------------------------------
16142C
16143C     CHECK THE INPUT ARGUMENTS FOR ERRORS
16144C
16145      IF(P.LT.0.0 .OR. P.GT.1.0)THEN
16146        WRITE(ICOUT,1)
16147        CALL DPWRST('XXX','BUG ')
16148        WRITE(ICOUT,46)P
16149        CALL DPWRST('XXX','BUG ')
16150        GOTO9000
16151      ENDIF
16152    1 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO ',
16153     1       'SEMPPF IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
16154   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
16155      IF(R.LE.0.0)THEN
16156        WRITE(ICOUT,2)
16157    2   FORMAT('***** ERROR--THE SECOD INPUT ARGUMENT ',
16158     1         'TO SEMPDF IS NON-POSITIVE')
16159        CALL DPWRST('XXX','BUG ')
16160        WRITE(ICOUT,46)R
16161        CALL DPWRST('XXX','BUG ')
16162        PPF=0.0
16163        GOTO9000
16164      ENDIF
16165C
16166      PHOLD=P
16167      IF(PHOLD.EQ.0.0)THEN
16168        PPF=-R
16169      ELSEIF(PHOLD.EQ.1.0)THEN
16170        PPF=R
16171      ELSE
16172        CONTINUE
16173        TOL=0.000001
16174        MAXIT=100
16175C
16176        XMIN=-R
16177        XMAX=R
16178C
16179        XMID=(XMIN+XMAX)/2.0
16180        XLOW=XMIN
16181        XUP=XMAX
16182        ICOUNT=0
16183C
16184  210   CONTINUE
16185        X=XMID
16186        CALL SEMCDF(X,R,PCALC)
16187        IF(PCALC.EQ.PHOLD)GOTO240
16188        IF(PCALC.GT.PHOLD)GOTO220
16189C
16190        XLOW=XMID
16191        XMID=(XMID+XUP)/2.0
16192        GOTO230
16193C
16194  220   CONTINUE
16195        XUP=XMID
16196        XMID=(XMID+XLOW)/2.0
16197C
16198  230   CONTINUE
16199        XDEL=ABS(XMID-XLOW)
16200        ICOUNT=ICOUNT+1
16201        IF(XDEL.LT.TOL.OR.ICOUNT.GT.MAXIT)GOTO240
16202        GOTO210
16203C
16204  240   CONTINUE
16205        PPF=XMID
16206      ENDIF
16207C
16208 9000 CONTINUE
16209      RETURN
16210      END
16211      SUBROUTINE SEMRAN(N,R,ISEED,X)
16212C
16213C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
16214C              FROM THE SEMI-CIRCULAR DISTRIBUTION.
16215C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
16216C                                OF RANDOM NUMBERS TO BE
16217C                                GENERATED.
16218C                     --R      = THE SINGLE PRECISION VALUE THAT
16219C                                DEFINES THE RADIUS
16220C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
16221C                                (OF DIMENSION AT LEAST N)
16222C                                INTO WHICH THE GENERATED
16223C                                RANDOM SAMPLE WILL BE PLACED.
16224C     OUTPUT--A RANDOM SAMPLE OF SIZE N
16225C             FROM THE SEMI-CIRCULAR DISTRIBUTION
16226C             WITH MEAN = 0 AND STANDARD DEVIATION = ZZZ
16227C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
16228C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
16229C                   OF N FOR THIS SUBROUTINE.
16230C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, SEMPPF
16231C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
16232C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
16233C     LANGUAGE--ANSI FORTRAN (1977)
16234C     REFERENCES--TOCHER, THE ART OF SIMULATION,
16235C                 1963, PAGES 14-15.
16236C               --HAMMERSLEY AND HANDSCOMB, MONTE CARLO METHODS,
16237C                 1964, PAGE 36.
16238C               --FILLIBEN, SIMPLE AND ROBUST LINEAR ESTIMATION
16239C                 OF THE LOCATION PARAMETER OF A SYMMETRIC
16240C                 DISTRIBUTION (UNPUBLISHED PH.D. DISSERTATION,
16241C                 PRINCETON UNIVERSITY), 1969, PAGE 230.
16242C               --FILLIBEN, 'THE PERCENT POINT FUNCTION',
16243C                 (UNPUBLISHED MANUSCRIPT), 1970, PAGES 28-31.
16244C               --JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
16245C                 DISTRIBUTIONS--2, 1970, PAGES ZZZ.
16246C     WRITTEN BY--JAMES J. FILLIBEN
16247C                 STATISTICAL ENGINEERING DIVISION
16248C                 INFORMATION TECHNOLOGY LABORATORY
16249C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
16250C                 GAITHERSBURG, MD 20899-8980
16251C                 PHONE--301-975-2855
16252C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16253C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
16254C     LANGUAGE--ANSI FORTRAN (1977)
16255C     VERSION NUMBER--82.6
16256C     ORIGINAL VERSION--JUNE      1978.
16257C     UPDATED         --DECEMBER  1981.
16258C     UPDATED         --MAY       1982.
16259C     UPDATED         --OCTOBER   2006. GENERALIZE TO CASES WHERE
16260C                                       R NOT EQUAL TO 1.
16261C
16262C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16263C
16264C---------------------------------------------------------------------
16265C
16266      DIMENSION X(*)
16267C
16268C-----COMMON----------------------------------------------------------
16269C
16270      INCLUDE 'DPCOP2.INC'
16271C
16272C-----START POINT-----------------------------------------------------
16273C
16274C     CHECK THE INPUT ARGUMENTS FOR ERRORS
16275C
16276      IF(N.LT.1)THEN
16277        WRITE(ICOUT, 5)
16278        CALL DPWRST('XXX','BUG ')
16279        WRITE(ICOUT,47)N
16280        CALL DPWRST('XXX','BUG ')
16281        GOTO9000
16282      ENDIF
16283    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF SEMI-CIRCULAR ',
16284     1       'RANDOM NUMBERS IS NON-POSITIVE')
16285   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
16286C
16287      IF(R.LE.0.0)THEN
16288        WRITE(ICOUT,8)
16289    8   FORMAT('***** ERROR--THE SHAPE PARAMETER, R, FOR THE ',
16290     1       'SEMI-CIRCULAR RANDOM NUMBERS IS NON-POSITIVE')
16291        CALL DPWRST('XXX','BUG ')
16292        WRITE(ICOUT,46)R
16293   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
16294        CALL DPWRST('XXX','BUG ')
16295        GOTO9000
16296      ENDIF
16297C
16298C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
16299C
16300      CALL UNIRAN(N,ISEED,X)
16301C
16302C     GENERATE N SEMI-CIRCULAR RANDOM NUMBERS
16303C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
16304C
16305      DO100I=1,N
16306      CALL SEMPPF(X(I),R,ATEMP)
16307      X(I)=ATEMP
16308  100 CONTINUE
16309C
16310 9000 CONTINUE
16311      RETURN
16312      END
16313      SUBROUTINE SENSIT(X,Y,N,IWRITE,XIDTEM,STAT,IBUGA3,IERROR)
16314C
16315C     PURPOSE--THIS SUBROUTINE COMPUTES THE TEST SENSITIVITY
16316C              BETWEEN TWO VARIABLES.
16317C
16318C              THIS IS SPECIFICALLY FOR THE 2X2 CASE.  THAT IS,
16319C              EACH VARIABLE HAS TWO MUTUALLY EXCLUSIVE
16320C              CHOICES CODED AS 1 (FOR SUCCESS) OR 0 (FOR
16321C              FAILURE).  TEST SENSITIVITY IS DEFINED AS THE
16322C              CONDITIONAL PROBABILITY OF A POSITIVE TEST GiVEN
16323C              THAT THE DISEASE IS PRESENT.
16324C
16325C              A TYPICAL EXAMPLE WOULD BE WHERE VARIABLE ONE
16326C              DENOTES THE GROUND TRUTH AND A VALUE OF 1
16327C              INDICATES "PRESENT" AND A VALUE OF 0 INDICATES
16328C              "NOT PRESENT".  VARIABLE TWO REPRESENTS SOME TYPE
16329C              OF DETECTION DEVICE WHERE A VALUE OF 1 INDICATES
16330C              THE DEVICE DETECTED THE SPECIFIED OBJECT WHILE A
16331C              VALUE OF 0 INDICATES THAT THE OBJECT WAS NOT
16332C              DETECTED.  TEST SENSITIVITY IS THEN DEFINED AS
16333C              THE PROBABILITY OF DETECTING THE OBJECT GIVEN
16334C              THAT THE OBJECT IS ACTUALLY THERE.
16335C
16336C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
16337C                                (UNSORTED) OBSERVATIONS
16338C                                WHICH CONSTITUTE THE FIRST SET
16339C                                OF DATA.
16340C                     --Y      = THE SINGLE PRECISION VECTOR OF
16341C                                (UNSORTED) OBSERVATIONS
16342C                                WHICH CONSTITUTE THE SECOND SET
16343C                                OF DATA.
16344C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
16345C                                IN THE VECTOR X, OR EQUIVALENTLY,
16346C                                THE INTEGER NUMBER OF OBSERVATIONS
16347C                                IN THE VECTOR Y.
16348C     OUTPUT ARGUMENTS--STAT   = THE SINGLE PRECISION VALUE OF THE
16349C                                COMPUTED TEST SENSITIVITY
16350C                                BETWEEN THE 2 SETS OF DATA
16351C                                IN THE INPUT VECTORS X AND Y.
16352C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
16353C             SAMPLE TEST SENSITIVITY BETWEEN THE 2 SETS
16354C             OF DATA IN THE INPUT VECTORS X AND Y.
16355C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
16356C                   OF N FOR THIS SUBROUTINE.
16357C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
16358C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
16359C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
16360C     LANGUAGE--ANSI FORTRAN (1977)
16361C     WRITTEN BY--JAMES J. FILLIBEN
16362C                 STATISTICAL ENGINEERING DIVISION
16363C                 INFORMATION TECHNOLOGY LABORATORY
16364C                 NATIONAL INSTIUTE OF STANDARDS AND TECHNOLOGY
16365C                 GAITHERSBURG, MD 20899-8980
16366C                 PHONE--301-975-2899
16367C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16368C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
16369C     LANGUAGE--ANSI FORTRAN (1977)
16370C     VERSION NUMBER--2007/3
16371C     ORIGINAL VERSION--MARCH     2007.
16372C     UPDATED         --AUGUST    2007. IF 2X2 CASE, CHECK IF SUM
16373C                                       OF ENTRIES IS <= 4.  IN THIS
16374C                                       CASE, ASSUME WE HAVE RAW DATA
16375C
16376C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16377C
16378      CHARACTER*4 IWRITE
16379      CHARACTER*4 IBUGA3
16380      CHARACTER*4 IERROR
16381C
16382      CHARACTER*4 ISTEPN
16383      CHARACTER*4 ISUBN1
16384      CHARACTER*4 ISUBN2
16385C
16386C---------------------------------------------------------------------
16387C
16388      DIMENSION X(*)
16389      DIMENSION Y(*)
16390      DIMENSION XIDTEM(*)
16391C
16392C-----COMMON----------------------------------------------------------
16393C
16394      INCLUDE 'DPCOP2.INC'
16395C
16396C-----START POINT-----------------------------------------------------
16397C
16398      ISUBN1='SENS'
16399      ISUBN2='IT  '
16400      IERROR='NO'
16401C
16402C
16403      IF(IBUGA3.EQ.'ON')THEN
16404        WRITE(ICOUT,999)
16405  999   FORMAT(1X)
16406        CALL DPWRST('XXX','BUG ')
16407        WRITE(ICOUT,51)
16408   51   FORMAT('***** AT THE BEGINNING OF SENSIT--')
16409        CALL DPWRST('XXX','BUG ')
16410        WRITE(ICOUT,52)IBUGA3
16411   52   FORMAT('IBUGA3 = ',A4)
16412        CALL DPWRST('XXX','BUG ')
16413        WRITE(ICOUT,53)N
16414   53   FORMAT('N = ',I8)
16415        CALL DPWRST('XXX','BUG ')
16416        DO55I=1,N
16417          WRITE(ICOUT,56)I,X(I),Y(I)
16418   56     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
16419          CALL DPWRST('XXX','BUG ')
16420   55   CONTINUE
16421      ENDIF
16422C
16423C               ********************************************
16424C               **  STEP 21--                             **
16425C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
16426C               ********************************************
16427C
16428      ISTEPN='21'
16429      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
16430C
16431      IF(N.LT.2)THEN
16432        WRITE(ICOUT,999)
16433        CALL DPWRST('XXX','WRIT')
16434        WRITE(ICOUT,1201)
16435 1201   FORMAT('***** ERROR IN THE TEST SENSITIVITY')
16436        CALL DPWRST('XXX','WRIT')
16437        WRITE(ICOUT,1203)
16438 1203   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
16439     1         'VARIABLES IS LESS THAN TWO')
16440        CALL DPWRST('XXX','WRIT')
16441        WRITE(ICOUT,1205)N
16442 1205   FORMAT('SAMPLE SIZE = ',I8)
16443        CALL DPWRST('XXX','WRIT')
16444        IERROR='YES'
16445        GOTO9000
16446      ENDIF
16447C
16448C               ********************************************
16449C               **  STEP 22--                             **
16450C               **  CHECK THAT THE VARIABLES HAVE AT MOST **
16451C               **  TWO DISTINCT VALUES (1 INDICATES A    **
16452C               **  SUCCESS, 0 INDICATES A FAILURE).      **
16453C               ********************************************
16454C
16455      ISTEPN='22'
16456      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
16457C
16458C     NOTE: CHECK FOR SPECIAL CASE N = 2.  IN THIS CASE,
16459C           ASSUME WE HAVE A 2X2 TABLE OF COUNTS INSTEAD
16460C           OF RAW DATA.
16461C
16462      IF(N.EQ.2)THEN
16463        N11=INT(X(1)+0.5)
16464        N21=INT(X(2)+0.5)
16465        N12=INT(Y(1)+0.5)
16466        N22=INT(Y(2)+0.5)
16467C
16468C       CHECK IF ALL ENTRIES 0 OR 1. IF SO, ASSUME
16469C       RAW DATA CASE.
16470C
16471        IF((N11.EQ.0 .OR. N11.EQ.1) .AND.
16472     1     (N12.EQ.0 .OR. N12.EQ.1) .AND.
16473     1     (N21.EQ.0 .OR. N21.EQ.1) .AND.
16474     1     (N22.EQ.0 .OR. N22.EQ.1)) GOTO1349
16475C
16476        IF(N11.LT.0)THEN
16477          WRITE(ICOUT,999)
16478          CALL DPWRST('XXX','BUG ')
16479          WRITE(ICOUT,1201)
16480          CALL DPWRST('XXX','BUG ')
16481          WRITE(ICOUT,1311)
16482 1311     FORMAT('      ROW 1 COLUMN 1 OF THE COUNTS TABLE IS ',
16483     1           'NEGATIVE.')
16484          CALL DPWRST('XXX','BUG ')
16485        ELSEIF(N21.LT.0)THEN
16486          WRITE(ICOUT,999)
16487          CALL DPWRST('XXX','BUG ')
16488          WRITE(ICOUT,1201)
16489          CALL DPWRST('XXX','BUG ')
16490          WRITE(ICOUT,1321)
16491 1321     FORMAT('      ROW 2 COLUMN 1 OF THE COUNTS TABLE IS ',
16492     1           'NEGATIVE.')
16493          CALL DPWRST('XXX','BUG ')
16494        ELSEIF(N12.LT.0)THEN
16495          WRITE(ICOUT,999)
16496          CALL DPWRST('XXX','BUG ')
16497          WRITE(ICOUT,1201)
16498          CALL DPWRST('XXX','BUG ')
16499          WRITE(ICOUT,1331)
16500 1331     FORMAT('      ROW 1 COLUMN 2 OF THE COUNTS TABLE IS ',
16501     1           'NEGATIVE.')
16502          CALL DPWRST('XXX','BUG ')
16503        ELSEIF(N22.LT.0)THEN
16504          WRITE(ICOUT,999)
16505          CALL DPWRST('XXX','BUG ')
16506          WRITE(ICOUT,1201)
16507          CALL DPWRST('XXX','BUG ')
16508          WRITE(ICOUT,1341)
16509 1341     FORMAT('      ROW 2 COLUMN 2 OF THE COUNTS TABLE IS ',
16510     1           'NEGATIVE.')
16511          CALL DPWRST('XXX','BUG ')
16512        ENDIF
16513C
16514        AN11=REAL(N11)
16515        AN21=REAL(N21)
16516        AN12=REAL(N12)
16517        AN22=REAL(N22)
16518        STAT=AN11/(AN11+AN12)
16519        GOTO3000
16520      ENDIF
16521C
16522 1349 CONTINUE
16523C
16524      CALL DISTIN(X,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
16525      IF(NDIST.EQ.1)THEN
16526        AVAL=XIDTEM(1)
16527        IF(ABS(AVAL).LE.0.5)THEN
16528          AVAL=0.0
16529        ELSE
16530          AVAL=1.0
16531        ENDIF
16532        DO2202I=1,N
16533          X(I)=1.0
16534 2202   CONTINUE
16535      ELSEIF(NDIST.EQ.2)THEN
16536        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
16537          DO2203I=1,N
16538            IF(X(I).NE.1.0)X(I)=0.0
16539 2203     CONTINUE
16540        ELSE
16541          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
16542          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
16543          DO2208I=1,N
16544            IF(X(I).EQ.ATEMP1)X(I)=0.0
16545            IF(X(I).EQ.ATEMP2)X(I)=1.0
16546 2208     CONTINUE
16547        ENDIF
16548      ELSE
16549        WRITE(ICOUT,999)
16550        CALL DPWRST('XXX','BUG ')
16551        WRITE(ICOUT,1201)
16552        CALL DPWRST('XXX','BUG ')
16553        WRITE(ICOUT,2211)
16554 2211   FORMAT('      RESPONSE VARIABLE ONE SHOULD CONTAIN AT MOST')
16555        CALL DPWRST('XXX','BUG ')
16556        WRITE(ICOUT,2213)
16557 2213   FORMAT('      TWO DISTINCT VALUES.')
16558        CALL DPWRST('XXX','BUG ')
16559        WRITE(ICOUT,2215)NDIST
16560 2215   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
16561        CALL DPWRST('XXX','BUG ')
16562        IERROR='YES'
16563        GOTO9000
16564      ENDIF
16565C
16566      CALL DISTIN(Y,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
16567      IF(NDIST.EQ.1)THEN
16568        AVAL=XIDTEM(1)
16569        IF(ABS(AVAL).LE.0.5)THEN
16570          AVAL=0.0
16571        ELSE
16572          AVAL=1.0
16573        ENDIF
16574        DO2302I=1,N
16575          Y(I)=1.0
16576 2302   CONTINUE
16577      ELSEIF(NDIST.EQ.2)THEN
16578        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
16579          DO2303I=1,N
16580            IF(Y(I).NE.1.0)Y(I)=0.0
16581 2303     CONTINUE
16582        ELSE
16583          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
16584          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
16585          DO2308I=1,N
16586            IF(Y(I).EQ.ATEMP1)Y(I)=0.0
16587            IF(Y(I).EQ.ATEMP2)Y(I)=1.0
16588 2308     CONTINUE
16589        ENDIF
16590      ELSE
16591        WRITE(ICOUT,999)
16592        CALL DPWRST('XXX','BUG ')
16593        WRITE(ICOUT,1201)
16594        CALL DPWRST('XXX','BUG ')
16595        WRITE(ICOUT,2311)
16596 2311   FORMAT('      RESPONSE VARIABLE TWO SHOULD CONTAIN AT MOST')
16597        CALL DPWRST('XXX','BUG ')
16598        WRITE(ICOUT,2313)
16599 2313   FORMAT('      TWO DISTINCT VALUES.')
16600        CALL DPWRST('XXX','BUG ')
16601        WRITE(ICOUT,2315)NDIST
16602 2315   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
16603        CALL DPWRST('XXX','BUG ')
16604        IERROR='YES'
16605        GOTO9000
16606      ENDIF
16607C
16608      N11=0
16609      N12=0
16610      N21=0
16611      N22=0
16612      DO2410I=1,N
16613        IF(X(I).EQ.1.0 .AND. Y(I).EQ.1.0)THEN
16614          N11=N11+1
16615        ELSEIF(X(I).EQ.0.0 .AND. Y(I).EQ.0.0)THEN
16616          N22=N22+1
16617        ELSEIF(X(I).EQ.1.0 .AND. Y(I).EQ.0.0)THEN
16618          N12=N12+1
16619        ELSEIF(X(I).EQ.0.0 .AND. Y(I).EQ.1.0)THEN
16620          N21=N21+1
16621        ENDIF
16622 2410 CONTINUE
16623C
16624      STAT=REAL(N11)/REAL(N11+N12)
16625C
16626 3000 CONTINUE
16627C
16628C
16629C               *******************************
16630C               **  STEP 3--                 **
16631C               **  WRITE OUT A LINE         **
16632C               **  OF SUMMARY INFORMATION.  **
16633C               *******************************
16634C
16635      IF(IFEEDB.EQ.'OFF')GOTO890
16636      IF(IWRITE.EQ.'OFF' .OR. IWRITE.EQ.'NO')GOTO890
16637      WRITE(ICOUT,999)
16638      CALL DPWRST('XXX','BUG ')
16639      WRITE(ICOUT,811)STAT
16640  811 FORMAT('THE TEST SENSITIVITY PROPORTION = ',G15.7)
16641      CALL DPWRST('XXX','BUG ')
16642  890 CONTINUE
16643C
16644C               *****************
16645C               **  STEP 90--  **
16646C               **  EXIT.      **
16647C               *****************
16648C
16649 9000 CONTINUE
16650      IF(IBUGA3.EQ.'ON')THEN
16651        WRITE(ICOUT,999)
16652        CALL DPWRST('XXX','BUG ')
16653        WRITE(ICOUT,9011)
16654 9011   FORMAT('***** AT THE END OF SENSIT--')
16655        CALL DPWRST('XXX','BUG ')
16656        WRITE(ICOUT,9012)IBUGA3,IERROR
16657 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
16658        CALL DPWRST('XXX','BUG ')
16659        WRITE(ICOUT,9013)N,N11,N12,N21,N22
16660 9013   FORMAT('N,N11,N12,N21,N22 = ',5I10)
16661        CALL DPWRST('XXX','BUG ')
16662        WRITE(ICOUT,9015)STAT
16663 9015   FORMAT('STAT = ',G15.7)
16664        CALL DPWRST('XXX','BUG ')
16665      ENDIF
16666C
16667      RETURN
16668      END
16669      SUBROUTINE SEQDIF(X,NX,IWRITE,Y,NY,ISTAT,
16670     1                  IBUGA3,ISUBRO,IERROR)
16671C
16672C     PURPOSE--COMPUTE SEQUENTIAL DIFFERENCE OF A VARIABLE--
16673C              Y(1) = X(2)-X(1)
16674C              Y(2) = X(3)-X(2)
16675C              Y(3) = X(4)-X(3)
16676C              ETC.
16677C     NOTE--CODE UPDATED TO ALSO ALLOW
16678C              SEQUENTIAL MEAN
16679C              SEQUENTIAL SUM
16680C              SEQUENTIAL MINIMUM
16681C              SEQUENTIAL MAXIMUM
16682C              SEQUENTIAL PRODUCT
16683C              SEQUENTIAL LOWER
16684C              SEQUENTIAL UPPER
16685C     NOTE--IT IS PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y(.)
16686C           BEING IDENTICAL TO THE INPUT VECTOR X(.).
16687C     WRITTEN BY--JAMES J. FILLIBEN
16688C                 STATISTICAL ENGINEERING DIVISION
16689C                 INFORMATION TECHNOLOGY LABORATORY
16690C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
16691C                 GAITHERSBURG, MD 20899-8980
16692C                 PHONE--301-975-2855
16693C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16694C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
16695C     LANGUAGE--ANSI FORTRAN (1977)
16696C     VERSION NUMBER--82.6
16697C     ORIGINAL VERSION--FEBRUARY  1979.
16698C     UPDATED         --APRIL     1979.
16699C     UPDATED         --JULY      1979.
16700C     UPDATED         --AUGUST    1981.
16701C     UPDATED         --MAY       1982.
16702C     UPDATED         --FEBRUARY  2016. SUPPORT FOR MEAN, SUM, PRODUCT,
16703C                                       MIN, AND MAX CASES
16704C
16705C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16706C
16707      CHARACTER*4 ISTAT
16708      CHARACTER*4 IWRITE
16709      CHARACTER*4 ISUBRO
16710      CHARACTER*4 IBUGA3
16711      CHARACTER*4 IERROR
16712C
16713      CHARACTER*4 ISUBN1
16714      CHARACTER*4 ISUBN2
16715C
16716C---------------------------------------------------------------------
16717C
16718      DIMENSION X(*)
16719      DIMENSION Y(*)
16720C
16721C-----COMMON----------------------------------------------------------
16722C
16723      INCLUDE 'DPCOP2.INC'
16724C
16725C-----START POINT-----------------------------------------------------
16726C
16727      ISUBN1='SEQD'
16728      ISUBN2='IF  '
16729      IERROR='NO'
16730C
16731      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QDIF')THEN
16732        WRITE(ICOUT,999)
16733  999   FORMAT(1X)
16734        CALL DPWRST('XXX','BUG ')
16735        WRITE(ICOUT,51)
16736   51   FORMAT('***** AT THE BEGINNING OF SEQDIF--')
16737        CALL DPWRST('XXX','BUG ')
16738        WRITE(ICOUT,52)IBUGA3,IWRITE,ISTAT,NX
16739   52   FORMAT('IBUGA3,IWRITE,ISTAT,NX = ',3(A4,2X),I8)
16740        CALL DPWRST('XXX','BUG ')
16741        DO55I=1,NX
16742          WRITE(ICOUT,56)I,X(I)
16743   56     FORMAT('I,X(I) = ',I8,G15.7)
16744          CALL DPWRST('XXX','BUG ')
16745   55   CONTINUE
16746      ENDIF
16747C
16748C               **************************************
16749C               **  COMPUTE SEQUENTIAL DIFFERENCE.  **
16750C               **************************************
16751C
16752      NXM1=NX-1
16753      IF(NXM1.LT.1)THEN
16754        IERROR='YES'
16755        WRITE(ICOUT,999)
16756        CALL DPWRST('XXX','BUG ')
16757        WRITE(ICOUT,151)
16758  151   FORMAT('***** ERROR IN SEQUENTIAL DIFFERENCE--')
16759        CALL DPWRST('XXX','BUG ')
16760        WRITE(ICOUT,152)
16761  152   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
16762     1         'VARIABLE IS LESS THAN 2.')
16763        CALL DPWRST('XXX','BUG ')
16764        WRITE(ICOUT,157)NX
16765  157   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
16766        CALL DPWRST('XXX','BUG ')
16767      ELSE
16768        IF(ISTAT.EQ.'MEAN')THEN
16769          DO110I=1,NXM1
16770            IP1=I+1
16771            Y(I)=(X(IP1)+X(I))/2.0
16772  110     CONTINUE
16773          NY=NXM1
16774        ELSEIF(ISTAT.EQ.'MINI')THEN
16775          DO120I=1,NXM1
16776            IP1=I+1
16777            Y(I)=MIN(X(IP1),X(I))
16778  120     CONTINUE
16779          NY=NXM1
16780        ELSEIF(ISTAT.EQ.'MAXI')THEN
16781          DO130I=1,NXM1
16782            IP1=I+1
16783            Y(I)=MAX(X(IP1),X(I))
16784  130     CONTINUE
16785          NY=NXM1
16786        ELSEIF(ISTAT.EQ.'SUM ')THEN
16787          DO140I=1,NXM1
16788            IP1=I+1
16789            Y(I)=X(IP1)+X(I)
16790  140     CONTINUE
16791          NY=NXM1
16792        ELSEIF(ISTAT.EQ.'PROD')THEN
16793          DO150I=1,NXM1
16794            IP1=I+1
16795            Y(I)=X(IP1)*X(I)
16796  150     CONTINUE
16797          NY=NXM1
16798        ELSEIF(ISTAT.EQ.'LOWE')THEN
16799          DO160I=1,NXM1
16800            Y(I)=X(I)
16801  160     CONTINUE
16802          NY=NXM1
16803        ELSEIF(ISTAT.EQ.'UPPE')THEN
16804          DO170I=1,NXM1
16805            IP1=I+1
16806            Y(I)=X(IP1)
16807  170     CONTINUE
16808          NY=NXM1
16809        ELSE
16810          DO100I=1,NXM1
16811            IP1=I+1
16812            Y(I)=X(IP1)-X(I)
16813  100     CONTINUE
16814          NY=NXM1
16815        ENDIF
16816      ENDIF
16817C
16818C               *****************
16819C               **  STEP 90--  **
16820C               **  EXIT.      **
16821C               *****************
16822C
16823      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QDIF')THEN
16824        WRITE(ICOUT,999)
16825        CALL DPWRST('XXX','BUG ')
16826        WRITE(ICOUT,9011)
16827 9011   FORMAT('***** AT THE END       OF SEQDIF--')
16828        CALL DPWRST('XXX','BUG ')
16829        WRITE(ICOUT,9013)IERROR,NX,NY
16830 9013   FORMAT('IERROR,NX,NY = ',A4,2X,2I8)
16831        CALL DPWRST('XXX','BUG ')
16832        DO9015I=1,NX
16833          WRITE(ICOUT,9016)I,X(I),Y(I)
16834 9016     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
16835          CALL DPWRST('XXX','BUG ')
16836 9015   CONTINUE
16837      ENDIF
16838C
16839      RETURN
16840      END
16841      SUBROUTINE SEQDI2(X,XGROUP,NX,IWRITE,Y,YGROUP,NY,ISTAT,
16842     1                  XDIST,XTEMP,
16843     1                  IBUGA3,ISUBRO,IERROR)
16844C
16845C     PURPOSE--THIS IS A VARIANT OF THE SEQDIF (SEQUENTIAL DIFFERENCE)
16846C              ROUTINE.  THE DISTINCTION IS THAT THIS ROUTINE INCLUDES
16847C              A GROUP-ID VARIABLE.  THAT IS, THE SEQUENTIAL DIFFERENCE
16848C              WILL BE COMPUTED WITHIN EACH GROUP.  NOTE THAT ALTHOUGH
16849C              THE DATA DO NOT NEED TO BE PRE-SORTED BY GROUP, THE ORDER
16850C              WITHIN A GROUP WILL BE MAINTAINED.  THE COMMAND IS
16851C
16852C                  LET Y YGROUP = SEQUENTIAL DIFFERENCE X XGROUP
16853C
16854C     NOTE--CODE ALSO SUPPORTS THE FOLLOWING
16855C              SEQUENTIAL MEAN
16856C              SEQUENTIAL SUM
16857C              SEQUENTIAL MINIMUM
16858C              SEQUENTIAL MAXIMUM
16859C              SEQUENTIAL PRODUCT
16860C              SEQUENTIAL LOWER
16861C              SEQUENTIAL UPPER
16862C     NOTE--IT IS PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y(.)
16863C           BEING IDENTICAL TO THE INPUT VECTOR X(.).
16864C     WRITTEN BY--ALAN HECKERT
16865C                 STATISTICAL ENGINEERING DIVISION
16866C                 INFORMATION TECHNOLOGY LABORATORY
16867C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
16868C                 GAITHERSBURG, MD 20899-8980
16869C                 PHONE--301-975-2899
16870C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16871C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
16872C     LANGUAGE--ANSI FORTRAN (1977)
16873C     VERSION NUMBER--2016.02
16874C     ORIGINAL VERSION--FEBRUARY  2016.
16875C
16876C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16877C
16878      CHARACTER*4 ISTAT
16879      CHARACTER*4 IWRITE
16880      CHARACTER*4 ISUBRO
16881      CHARACTER*4 IBUGA3
16882      CHARACTER*4 IERROR
16883C
16884      CHARACTER*4 ISUBN1
16885      CHARACTER*4 ISUBN2
16886C
16887C---------------------------------------------------------------------
16888C
16889      DIMENSION X(*)
16890      DIMENSION XGROUP(*)
16891      DIMENSION Y(*)
16892      DIMENSION YGROUP(*)
16893      DIMENSION XDIST(*)
16894      DIMENSION XTEMP(*)
16895C
16896C-----COMMON----------------------------------------------------------
16897C
16898      INCLUDE 'DPCOP2.INC'
16899C
16900C-----START POINT-----------------------------------------------------
16901C
16902      ISUBN1='SEQD'
16903      ISUBN2='I2  '
16904      IERROR='NO'
16905C
16906      NY=0
16907C
16908      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QDI2')THEN
16909        WRITE(ICOUT,999)
16910  999   FORMAT(1X)
16911        CALL DPWRST('XXX','BUG ')
16912        WRITE(ICOUT,51)
16913   51   FORMAT('***** AT THE BEGINNING OF SEQDI2--')
16914        CALL DPWRST('XXX','BUG ')
16915        WRITE(ICOUT,52)IBUGA3,ISTAT,NX
16916   52   FORMAT('IBUGA3,ISTAT,NX = ',2(A4,2X),I8)
16917        CALL DPWRST('XXX','BUG ')
16918        DO55I=1,NX
16919          WRITE(ICOUT,56)I,XGROUP(I),X(I)
16920   56     FORMAT('I,XGROUP(I),X(I) = ',I8,2G15.7)
16921          CALL DPWRST('XXX','BUG ')
16922   55   CONTINUE
16923      ENDIF
16924C
16925C               **************************************
16926C               **  COMPUTE SEQUENTIAL DIFFERENCE.  **
16927C               **************************************
16928C
16929      IF(NX.LT.2)THEN
16930        IERROR='YES'
16931        WRITE(ICOUT,999)
16932        CALL DPWRST('XXX','BUG ')
16933        WRITE(ICOUT,151)
16934  151   FORMAT('***** ERROR IN GROUP SEQUENTIAL DIFFERENCE--')
16935        CALL DPWRST('XXX','BUG ')
16936        WRITE(ICOUT,152)
16937  152   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
16938     1         'VARIABLE IS LESS THAN 2.')
16939        CALL DPWRST('XXX','BUG ')
16940        WRITE(ICOUT,157)NX
16941  157   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
16942        CALL DPWRST('XXX','BUG ')
16943      ELSE
16944C
16945C       DETERMINE THE DISTINCT GROUPS
16946C
16947        CALL DISTIN(XGROUP,NX,IWRITE,XDIST,NXDIST,IBUGA3,IERROR)
16948        IF(NX.EQ.NXDIST)THEN
16949          WRITE(ICOUT,999)
16950          CALL DPWRST('XXX','BUG ')
16951          WRITE(ICOUT,151)
16952          CALL DPWRST('XXX','BUG ')
16953          WRITE(ICOUT,201)
16954  201     FORMAT('      THE NUMBER OF OBSERVATIONS IS EQUAL TO THE ',
16955     1           'NUMBER OF GROUPS.')
16956          CALL DPWRST('XXX','BUG ')
16957          WRITE(ICOUT,203)
16958  203     FORMAT('      NOTHING DONE.')
16959          CALL DPWRST('XXX','BUG ')
16960          IERROR='YES'
16961          GOTO9000
16962        ENDIF
16963C
16964        DO300K=1,NXDIST
16965          NTEMP=0
16966          HOLD=XDIST(K)
16967          DO301J=1,NX
16968            IF(XGROUP(J).EQ.HOLD)THEN
16969              NTEMP=NTEMP+1
16970              XTEMP(NTEMP)=X(J)
16971            ENDIF
16972  301     CONTINUE
16973C
16974          NXM1=NTEMP-1
16975          IF(NXM1.GE.1)THEN
16976            IF(ISTAT.EQ.'MEAN')THEN
16977              DO410I=1,NXM1
16978                IP1=I+1
16979                NY=NY+1
16980                Y(NY)=(XTEMP(IP1)+XTEMP(I))/2.0
16981                YGROUP(NY)=REAL(K)
16982  410         CONTINUE
16983            ELSEIF(ISTAT.EQ.'MINI')THEN
16984              DO420I=1,NXM1
16985                IP1=I+1
16986                NY=NY+1
16987                Y(NY)=MIN(XTEMP(IP1),XTEMP(I))
16988                YGROUP(NY)=REAL(K)
16989  420         CONTINUE
16990            ELSEIF(ISTAT.EQ.'MAXI')THEN
16991              DO430I=1,NXM1
16992                IP1=I+1
16993                NY=NY+1
16994                Y(NY)=MAX(XTEMP(IP1),XTEMP(I))
16995                YGROUP(NY)=REAL(K)
16996  430         CONTINUE
16997            ELSEIF(ISTAT.EQ.'SUM ')THEN
16998              DO440I=1,NXM1
16999                IP1=I+1
17000                NY=NY+1
17001                Y(NY)=XTEMP(IP1)+XTEMP(I)
17002                YGROUP(NY)=REAL(K)
17003  440         CONTINUE
17004            ELSEIF(ISTAT.EQ.'PROD')THEN
17005              DO450I=1,NXM1
17006                IP1=I+1
17007                NY=NY+1
17008                Y(NY)=XTEMP(IP1)*XTEMP(I)
17009                YGROUP(NY)=REAL(K)
17010  450         CONTINUE
17011            ELSEIF(ISTAT.EQ.'DIFF')THEN
17012              DO460I=1,NXM1
17013                IP1=I+1
17014                NY=NY+1
17015                Y(NY)=XTEMP(IP1)-XTEMP(I)
17016                YGROUP(NY)=REAL(K)
17017  460         CONTINUE
17018            ELSEIF(ISTAT.EQ.'LOWE')THEN
17019              DO470I=1,NXM1
17020                IP1=I+1
17021                NY=NY+1
17022                Y(NY)=XTEMP(I)
17023                YGROUP(NY)=REAL(K)
17024  470         CONTINUE
17025            ELSEIF(ISTAT.EQ.'UPPE')THEN
17026              DO480I=1,NXM1
17027                IP1=I+1
17028                NY=NY+1
17029                Y(NY)=XTEMP(IP1)
17030                YGROUP(NY)=REAL(K)
17031  480         CONTINUE
17032            ENDIF
17033          ENDIF
17034  300   CONTINUE
17035      ENDIF
17036C
17037C               *****************
17038C               **  STEP 90--  **
17039C               **  EXIT.      **
17040C               *****************
17041C
17042 9000 CONTINUE
17043C
17044      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QDI2')THEN
17045        WRITE(ICOUT,999)
17046        CALL DPWRST('XXX','BUG ')
17047        WRITE(ICOUT,9011)
17048 9011   FORMAT('***** AT THE END       OF SEQDI2--')
17049        CALL DPWRST('XXX','BUG ')
17050        WRITE(ICOUT,9013)IERROR,NX,NY
17051 9013   FORMAT('IERROR,NX,NY = ',A4,2X,2I8)
17052        CALL DPWRST('XXX','BUG ')
17053        DO9015I=1,NY
17054          WRITE(ICOUT,9016)I,YGROUP(I),Y(I)
17055 9016     FORMAT('I,YGROUP(I),Y(I) = ',I8,2G15.7)
17056          CALL DPWRST('XXX','BUG ')
17057 9015   CONTINUE
17058      ENDIF
17059C
17060      RETURN
17061      END
17062      SUBROUTINE SETARI(Y1,Y2,N1,N2,IACASE,IWRITE,
17063     1                  Y3,Y4,N3,SCAL3,ITYP3,
17064     1                  Y1HOLD,Y2HOLD,
17065     1                  IBUGA3,ISUBRO,IERROR)
17066C
17067C     PURPOSE--CARRY OUT SET        ARITHMETIC OPERATIONS
17068C              OF THE REAL DATA IN Y1 AND Y2.
17069C
17070C     OPERATIONS--UNION
17071C                 INTERSECTION
17072C                 COMPLEMENT
17073C                 CARDINALITY
17074C                 CARTESIAN PRODUCT
17075C                 ELEMENTS (DISTINCT)
17076C
17077C     INPUT  ARGUMENTS--Y1 (REAL)
17078C                     --Y2 (REAL)
17079C     OUTPUT ARGUMENTS--Y3 (REAL)
17080C                       SCAL3
17081C                       ITYP3
17082C                     --Y4 (REAL)
17083C
17084C     NOTE--IT IS NOT PERMISSIBLE TO HAVE THE OUTPUT SETS Y3(.) & Y4(.)
17085C           BEING IDENTICAL TO THE INPUT SETS   Y1(.) OR Y2(.).
17086C     WRITTEN BY--JAMES J. FILLIBEN
17087C                 STATISTICAL ENGINEERING DIVISION
17088C                 INFORMATION TECHNOLOGY LABORATORY
17089C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
17090C                 GAITHERSBURG, MD 20899-8980
17091C                 PHONE--301-975-2855
17092C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17093C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
17094C     LANGUAGE--ANSI FORTRAN (1977)
17095C     VERSION NUMBER--87/9
17096C     ORIGINAL VERSION--AUGUST   1987.
17097C     UPDATED         --JUNE      1990. TEMPORARY ARRAYS TO GARBAGE COMMON
17098C     UPDATED         --SEPTEMBER 1993. FIX CARTESIAN PRODUCT (ALAN)
17099C     UPDATED         --JULY      2019. MOVE CREATION OF SCRATCH
17100C                                       STORAGE TO CALLING ROUTINE
17101C                                       SOME RECODING FOR BETTER
17102C                                       READABILITY (BUT NO SUBSTANATIVE
17103C                                       CHANGE)
17104C
17105C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
17106C
17107      CHARACTER*4 IACASE
17108      CHARACTER*4 IWRITE
17109      CHARACTER*4 ITYP3
17110      CHARACTER*4 IBUGA3
17111      CHARACTER*4 ISUBRO
17112      CHARACTER*4 IERROR
17113C
17114      CHARACTER*4 ISUBN1
17115      CHARACTER*4 ISUBN2
17116C
17117C---------------------------------------------------------------------
17118C
17119      INCLUDE 'DPCOPA.INC'
17120C
17121      DIMENSION Y1(*)
17122      DIMENSION Y2(*)
17123      DIMENSION Y3(*)
17124      DIMENSION Y4(*)
17125      DIMENSION Y1HOLD(*)
17126      DIMENSION Y2HOLD(*)
17127C
17128C-----COMMON----------------------------------------------------------
17129C
17130      INCLUDE 'DPCOP2.INC'
17131C
17132C-----START POINT-----------------------------------------------------
17133C
17134      ISUBN1='SETA'
17135      ISUBN2='RI  '
17136      IERROR='NO'
17137      SCAL3=(-999.0)
17138      ITYP3='VECT'
17139C
17140      TOL=0.00001
17141C
17142      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TARI')THEN
17143        WRITE(ICOUT,999)
17144  999   FORMAT(1X)
17145        CALL DPWRST('XXX','BUG ')
17146        WRITE(ICOUT,51)
17147   51   FORMAT('***** AT THE BEGINNING OF SETARI--')
17148        CALL DPWRST('XXX','BUG ')
17149        WRITE(ICOUT,52)IBUGA3,ISUBRO,IACASE,IWRITE,N1
17150   52   FORMAT('IBUGA3,ISUBRO,IACASE,IWRITE,N1 = ',4(A4,2X),I8)
17151        CALL DPWRST('XXX','BUG ')
17152        DO55I=1,N1
17153          WRITE(ICOUT,56)I,Y1(I),Y2(I)
17154   56     FORMAT('I,Y1(I),Y2(I) = ',I8,2G15.7)
17155          CALL DPWRST('XXX','BUG ')
17156   55   CONTINUE
17157      ENDIF
17158C
17159C               **************************************************
17160C               **  CARRY OUT SET        ARITHMETIC OPERATIONS  **
17161C               **************************************************
17162C
17163C               ********************************************
17164C               **  STEP 11--                             **
17165C               **  CHECK NUMBER OF INPUT OBSERVATIONS.   **
17166C               ********************************************
17167C
17168      IF(N1.LT.1 .OR. N2.LT.1)THEN
17169        IF(N1.GT.1 .AND.
17170     1    (IACASE.EQ.'SECA' .OR. IACASE.EQ.'SEEL'))GOTO1190
17171        IERROR='YES'
17172        WRITE(ICOUT,999)
17173        CALL DPWRST('XXX','BUG ')
17174        WRITE(ICOUT,1151)
17175 1151   FORMAT('***** ERROR IN SET ARITHMETIC (SETARI)--')
17176        CALL DPWRST('XXX','BUG ')
17177        WRITE(ICOUT,1152)
17178 1152   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE VARIABLE ',
17179     1         'FOR WHICH')
17180        CALL DPWRST('XXX','BUG ')
17181        IF(IACASE.EQ.'SEUN')THEN
17182          WRITE(ICOUT,1161)
17183 1161     FORMAT('      THE  SET UNION  IS TO BE COMPUTED')
17184          CALL DPWRST('XXX','BUG ')
17185        ELSEIF(IACASE.EQ.'SEIN')THEN
17186          WRITE(ICOUT,1162)
17187 1162     FORMAT('      THE  SET INTERSECTION  IS TO BE COMPUTED')
17188          CALL DPWRST('XXX','BUG ')
17189        ELSEIF(IACASE.EQ.'SECO')THEN
17190          WRITE(ICOUT,1163)
17191 1163     FORMAT('      THE  SET COMPLEMENT  IS TO BE COMPUTED')
17192          CALL DPWRST('XXX','BUG ')
17193        ELSEIF(IACASE.EQ.'SECA')THEN
17194          WRITE(ICOUT,1164)
17195 1164     FORMAT('      THE  SET CARDINALITY  IS TO BE COMPUTED')
17196          CALL DPWRST('XXX','BUG ')
17197        ELSEIF(IACASE.EQ.'SECP')THEN
17198          WRITE(ICOUT,1165)
17199 1165     FORMAT('      THE  SET CARTESIAN PRODUCT  IS TO BE COMPUTED')
17200          CALL DPWRST('XXX','BUG ')
17201        ELSEIF(IACASE.EQ.'SEEL')THEN
17202          WRITE(ICOUT,1166)
17203 1166     FORMAT('      THE  SET ELEMENTS  IS TO BE COMPUTED')
17204          CALL DPWRST('XXX','BUG ')
17205        ENDIF
17206        WRITE(ICOUT,1181)
17207 1181   FORMAT('      MUST BE 1 OR LARGER.  SUCH WAS NOT THE ',
17208     1         'CASE HERE.')
17209        CALL DPWRST('XXX','BUG ')
17210        WRITE(ICOUT,1183)N1
17211 1183   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
17212        CALL DPWRST('XXX','BUG ')
17213        GOTO9000
17214      ENDIF
17215C
17216 1190 CONTINUE
17217C
17218C               *********************************
17219C               **  STEP 12--                  **
17220C               **  BRANCH TO THE PROPER CASE  **
17221C               *********************************
17222C
17223      IF(IACASE.EQ.'SEUN')THEN
17224C
17225C               *********************************************
17226C               **  STEP 21--                              **
17227C               **  TREAT THE SET        UNION       CASE  **
17228C               *********************************************
17229C
17230        K=1
17231        Y3(K)=Y1(K)
17232C
17233        IF(N1.GT.1)THEN
17234          DO2110I=1,N1
17235            TARGET=Y1(I)
17236            DO2120J=1,K
17237              Y3JL=Y3(J)-TOL
17238              Y3JU=Y3(J)+TOL
17239              IF(Y3JL.LE.TARGET.AND.TARGET.LE.Y3JU)GOTO2110
17240 2120       CONTINUE
17241            K=K+1
17242            Y3(K)=TARGET
17243 2110     CONTINUE
17244        ENDIF
17245C
17246        DO2130I=1,N2
17247          TARGET=Y2(I)
17248          DO2140J=1,K
17249            Y3JL=Y3(J)-TOL
17250            Y3JU=Y3(J)+TOL
17251            IF(Y3JL.LE.TARGET.AND.TARGET.LE.Y3JU)GOTO2130
17252 2140     CONTINUE
17253          K=K+1
17254          Y3(K)=TARGET
17255 2130   CONTINUE
17256C
17257        ITYP3='VECT'
17258        N3=K
17259      ELSEIF(IACASE.EQ.'SEIN')THEN
17260C
17261C               *********************************************
17262C               **  STEP 22--                              **
17263C               **  TREAT THE SET        INTERSECTION CASE **
17264C               *********************************************
17265C
17266        K=0
17267C
17268        DO2210I=1,N1
17269          TARGET=Y1(I)
17270          DO2220J=1,N2
17271            Y2JL=Y2(J)-TOL
17272            Y2JU=Y2(J)+TOL
17273            IF(Y2JL.LE.TARGET.AND.TARGET.LE.Y2JU)GOTO2215
17274 2220     CONTINUE
17275          GOTO2210
17276 2215     CONTINUE
17277          K=K+1
17278          Y3(K)=TARGET
17279 2210   CONTINUE
17280C
17281        ITYP3='VECT'
17282        N3=K
17283      ELSEIF(IACASE.EQ.'SECO')THEN
17284C
17285C               ************************************************
17286C               **  STEP 23--                                 **
17287C               **  TREAT THE SET        COMPLEMENT     CASE  **
17288C               ************************************************
17289C
17290        K=0
17291C
17292        DO2310I=1,N2
17293          TARGET=Y2(I)
17294          DO2320J=1,N1
17295            Y1JL=Y1(J)-TOL
17296            Y1JU=Y1(J)+TOL
17297            IF(Y1JL.LE.TARGET.AND.TARGET.LE.Y1JU)GOTO2310
17298 2320     CONTINUE
17299          K=K+1
17300          Y3(K)=TARGET
17301 2310   CONTINUE
17302C
17303        ITYP3='VECT'
17304        N3=K
17305      ELSEIF(IACASE.EQ.'SECA')THEN
17306C
17307C               ************************************************
17308C               **  STEP 24--                                 **
17309C               **  TREAT THE SET        CARDINALITY    CASE  **
17310C               ************************************************
17311C
17312        K=1
17313        Y3(K)=Y1(K)
17314C
17315        IF(N1.GT.1)THEN
17316          DO2410I=1,N1
17317            TARGET=Y1(I)
17318            DO2420J=1,K
17319              Y3JL=Y3(J)-TOL
17320              Y3JU=Y3(J)+TOL
17321              IF(Y3JL.LE.TARGET.AND.TARGET.LE.Y3JU)GOTO2410
17322 2420       CONTINUE
17323            K=K+1
17324 2410     CONTINUE
17325        ENDIF
17326        SCAL3=K
17327C
17328        ITYP3='SCAL'
17329        N3=1
17330      ELSEIF(IACASE.EQ.'SECP')THEN
17331C
17332C               ***************************************************
17333C               **  STEP 25--                                    **
17334C               **  TREAT THE SET        CARTESIAN PRODUCT CASE  **
17335C               ***************************************************
17336C
17337        K1=1
17338        Y1HOLD(K1)=Y1(K1)
17339        IF(N1.GT.1)THEN
17340          DO2510I=1,N1
17341            TARGET=Y1(I)
17342            DO2520J=1,K1
17343              Y1JL=Y1HOLD(J)-TOL
17344              Y1JU=Y1HOLD(J)+TOL
17345              IF(Y1JL.LE.TARGET.AND.TARGET.LE.Y1JU)GOTO2510
17346 2520       CONTINUE
17347            K1=K1+1
17348            Y1HOLD(K1)=TARGET
17349 2510     CONTINUE
17350        ENDIF
17351C
17352CCCCC   THE FOLLOWING SECTION WAS CORRECTED (ALAN) SEPTEMBER 1993
17353        K2=1
17354        Y2HOLD(K2)=Y2(K2)
17355        IF(N2.GT.1)THEN
17356          DO2530I=1,N2
17357            TARGET=Y2(I)
17358            DO2540J=1,K2
17359              Y2JL=Y2HOLD(J)-TOL
17360              Y2JU=Y2HOLD(J)+TOL
17361              IF(Y2JL.LE.TARGET.AND.TARGET.LE.Y2JU)GOTO2530
17362 2540       CONTINUE
17363            K2=K2+1
17364            Y2HOLD(K2)=TARGET
17365 2530     CONTINUE
17366        ENDIF
17367C
17368CCCCC   THE FOLLOWING SECTION WAS CORRECTED   (ALAN) SEPTEMBER 1993
17369        K=0
17370        DO2550I=1,K1
17371          DO2560J=1,K2
17372            K=K+1
17373            Y3(K)=Y1HOLD(I)
17374            Y4(K)=Y2HOLD(J)
17375 2560     CONTINUE
17376 2550   CONTINUE
17377C
17378        ITYP3='VECT'
17379        N3=K
17380      ELSEIF(IACASE.EQ.'SEEL')THEN
17381C
17382C               *******************************************************
17383C               **  STEP 26--                                        **
17384C               **  TREAT THE SET        ELEMENTS (DISTINCT)   CASE  **
17385C               *******************************************************
17386C
17387        K=1
17388        Y3(K)=Y1(K)
17389C
17390        IF(N1.GT.1)THEN
17391          DO2610I=1,N1
17392            TARGET=Y1(I)
17393            DO2620J=1,K
17394              Y3JL=Y3(J)-TOL
17395              Y3JU=Y3(J)+TOL
17396              IF(Y3JL.LE.TARGET.AND.TARGET.LE.Y3JU)GOTO2610
17397 2620       CONTINUE
17398            K=K+1
17399            Y3(K)=TARGET
17400 2610     CONTINUE
17401        ENDIF
17402C
17403        ITYP3='VECT'
17404        N3=K
17405      ELSE
17406        WRITE(ICOUT,999)
17407        CALL DPWRST('XXX','BUG ')
17408        WRITE(ICOUT,1211)
17409 1211   FORMAT('***** INTERNAL ERROR IN SETARI--')
17410        CALL DPWRST('XXX','BUG ')
17411        WRITE(ICOUT,1212)
17412 1212   FORMAT('      IACASE NOT EQUAL TO')
17413        CALL DPWRST('XXX','BUG ')
17414        WRITE(ICOUT,1213)
17415 1213   FORMAT('      SEUN, SEIN, SECO, SECA, SECP OR SEEL')
17416        CALL DPWRST('XXX','BUG ')
17417        WRITE(ICOUT,1215)
17418 1215   FORMAT('      IACASE = ',A4)
17419        CALL DPWRST('XXX','BUG ')
17420        IERROR='YES'
17421        GOTO9000
17422      ENDIF
17423C
17424C               *****************
17425C               **  STEP 90--  **
17426C               **  EXIT.      **
17427C               *****************
17428C
17429 9000 CONTINUE
17430C
17431      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TARI')THEN
17432        WRITE(ICOUT,999)
17433        CALL DPWRST('XXX','BUG ')
17434        WRITE(ICOUT,9011)
17435 9011   FORMAT('***** AT THE END       OF SETARI--')
17436        CALL DPWRST('XXX','BUG ')
17437        WRITE(ICOUT,9017)N1,N2,N3
17438 9017   FORMAT('N1,N2,N3 = ',3I8)
17439        CALL DPWRST('XXX','BUG ')
17440        WRITE(ICOUT,9018)SCAL3,ITYP3,IERROR
17441 9018   FORMAT('SCAL3,ITYP3,IERROR = ',G15.7,2(2X,A4))
17442        CALL DPWRST('XXX','BUG ')
17443        IF(ITYP3.NE.'SCAL')THEN
17444          DO9021I=1,N1
17445            WRITE(ICOUT,9022)I,Y1(I)
17446 9022       FORMAT('I,Y1(I) = ',I8,G15.7)
17447            CALL DPWRST('XXX','BUG ')
17448 9021     CONTINUE
17449          DO9031I=1,N2
17450            WRITE(ICOUT,9032)I,Y2(I)
17451 9032       FORMAT('I,Y2(I) = ',I8,G15.7)
17452            CALL DPWRST('XXX','BUG ')
17453 9031     CONTINUE
17454          DO9041I=1,N3
17455            WRITE(ICOUT,9042)I,Y3(I),Y4(I)
17456 9042       FORMAT('I,Y3(I),Y4(I) = ',I8,2G15.7)
17457            CALL DPWRST('XXX','BUG ')
17458 9041     CONTINUE
17459        ENDIF
17460      ENDIF
17461C
17462      RETURN
17463      END
17464      REAL FUNCTION SGAMMA(ISEED,A)
17465CCCCC REAL FUNCTION SGAMMA(IR,A)
17466C                                                                       SGA   10
17467C**********************************************************************CSGA   20
17468C**********************************************************************CSGA   30
17469C                                                                      CSGA   40
17470C                                                                      CSGA   50
17471C     (STANDARD-)  G A M M A  DISTRIBUTION                             CSGA   60
17472C                                                                      CSGA   70
17473C                                                                      CSGA   80
17474C**********************************************************************CSGA   90
17475C**********************************************************************CSGA  100
17476C                                                                      CSGA  110
17477C               PARAMETER  A >= 1.0  ]                                 CSGA  120
17478C                                                                      CSGA  130
17479C**********************************************************************CSGA  140
17480C                                                                      CSGA  150
17481C     FOR DETAILS SEE:                                                 CSGA  160
17482C                                                                      CSGA  170
17483C               AHRENS, J.H. AND DIETER, U.                            CSGA  180
17484C               GENERATING GAMMA VARIATES BY A                         CSGA  190
17485C               MODIFIED REJECTION TECHNIQUE.                          CSGA  200
17486C               COMM. ACM, 25,1 (JAN. 1982), 47 - 54.                  CSGA  210
17487C                                                                      CSGA  220
17488C     STEP NUMBERS CORRESPOND TO ALGORITHM 'GD' IN THE ABOVE PAPER     CSGA  230
17489C                                 (STRAIGHTFORWARD IMPLEMENTATION)     CSGA  240
17490C                                                                      CSGA  250
17491C**********************************************************************CSGA  260
17492C                                                                      CSGA  270
17493C               PARAMETER  0.0 < A < 1.0  ]                            CSGA  280
17494C                                                                      CSGA  290
17495C**********************************************************************CSGA  300
17496C                                                                      CSGA  310
17497C     FOR DETAILS SEE:                                                 CSGA  320
17498C                                                                      CSGA  330
17499C               AHRENS, J.H. AND DIETER, U.                            CSGA  340
17500C               COMPUTER METHODS FOR SAMPLING FROM GAMMA,              CSGA  350
17501C               BETA, POISSON AND BINOMIAL DISTRIBUTIONS.              CSGA  360
17502C               COMPUTING, 12 (1974), 223 - 246.                       CSGA  370
17503C                                                                      CSGA  380
17504C     (ADAPTED IMPLEMENTATION OF ALGORITHM 'GS' IN THE ABOVE PAPER)    CSGA  390
17505C                                                                      CSGA  400
17506C**********************************************************************CSGA  410
17507C                                                                       SGA  420
17508C
17509C     INPUT:  IR=CURRENT STATE OF BASIC RANDOM NUMBER GENERATOR
17510C             A =PARAMETER (MEAN) OF THE STANDARD GAMMA DISTRIBUTION
17511C     OUTPUT: SGAMMA = SAMPLE FROM THE GAMMA-(A)-DISTRIBUTION
17512C
17513C     COEFFICIENTS Q(K) - FOR Q0 = SUM(Q(K)*A**(-K))
17514C     COEFFICIENTS A(K) - FOR Q = Q0+(T*T/2)*SUM(A(K)*V**K)
17515C     COEFFICIENTS E(K) - FOR EXP(Q)-1 = SUM(E(K)*Q**K)
17516C
17517C  MAY, 2003: SOME MODIFICATIONS MADE IN ORDER TO INCORPORATE
17518C             INTO DATAPLOT.
17519C
17520C             1) REPLACE CALLS TO SUNIF WITH CALLS TO DATAPLOT
17521C                UNIFORM RANDOM NUMBER ROUTINE "UNIRAN".
17522C             2) REPLACE IR WITH ISEED
17523C             3) REPLACE CALLS TO "SNORM" WITH "NORRAN"
17524C
17525C  JANUARY, 2005: THERE WAS A BUG IF GAMMA RAND NUMBER ROUTINE
17526C                 CALLED MORE THAN ONCE.  NEED TO RESET VALUE OF
17527C                 AA AND AAA TO 0.  DO THIS BY STORING IN COMMON
17528C                 AND HAVING CALLING ROUTINE RESET.
17529C
17530      REAL XTEMP(1)
17531C
17532      COMMON/SGAMM/AA,AAA
17533C
17534      DATA Q1,Q2,Q3,Q4,Q5,Q6,Q7 /.04166669,.02083148,
17535     ,.00801191,.00144121,-.00007388,.00024511,.00024240/
17536      DATA A1,A2,A3,A4,A5,A6,A7 /.3333333,-.2500030,
17537     ,.2000062,-.1662921,.1423657,-.1367177,.1233795/
17538      DATA E1,E2,E3,E4,E5 /1.,.4999897,.1668290,.0407753,.0102930/
17539C
17540C     PREVIOUS A PRE-SET TO ZERO - AA IS A', AAA IS A"
17541C     SQRT32 IS THE SQUAREROOT OF 32 = 5.656854249492380
17542C
17543CCCCC DATA AA /0.0/, AAA /0.0/, SQRT32 /5.656854/
17544      DATA SQRT32 /5.656854/
17545C
17546      SI=0.0
17547      Q0=0.0
17548      C=0.0
17549      B=0.0
17550      S=0.0
17551      D=0.0
17552      S2=0.0
17553C
17554      IF (A .EQ. AA) GO TO 1
17555      IF (A .LT. 1.0) GO TO 12
17556C
17557C     STEP  1:  RECALCULATIONS OF S2,S,D IF A HAS CHANGED
17558C
17559      AA=A
17560      S2=A-0.5
17561      S=SQRT(S2)
17562      D=SQRT32-12.0*S
17563C
17564C     STEP  2:  T=STANDARD NORMAL DEVIATE,
17565C               X=(S,1/2)-NORMAL DEVIATE.
17566C               IMMEDIATE ACCEPTANCE (I)
17567C
17568CCC1  T=SNORM(IR)
17569   1  CONTINUE
17570      NTEMP=1
17571      CALL NORRAN(NTEMP,ISEED,XTEMP)
17572      T=XTEMP(1)
17573      X=S+0.5*T
17574      SGAMMA=X*X
17575      IF (T .GE. 0.0) RETURN
17576C
17577C     STEP  3:  U= 0,1 -UNIFORM SAMPLE. SQUEEZE ACCEPTANCE (S)
17578C
17579CCCCC U=SUNIF(IR)
17580      NTEMP=1
17581      CALL UNIRAN(NTEMP,ISEED,XTEMP)
17582      U=XTEMP(1)
17583      IF (D*U .LE. T*T*T) RETURN
17584C
17585C     STEP  4:  RECALCULATIONS OF Q0,B,SI,C IF NECESSARY
17586C
17587      IF (A .EQ. AAA) GO TO 4
17588      AAA=A
17589      R=1.0/A
17590      Q0=((((((Q7*R+Q6)*R+Q5)*R+Q4)*R+Q3)*R+Q2)*R+Q1)*R
17591C
17592C               APPROXIMATION DEPENDING ON SIZE OF PARAMETER A
17593C               THE CONSTANTS IN THE EXPRESSIONS FOR B, SI AND
17594C               C WERE ESTABLISHED BY NUMERICAL EXPERIMENTS
17595C
17596      IF (A .LE. 3.686) GO TO 3
17597      IF (A .LE. 13.022) GO TO 2
17598C
17599C               CASE 3:  A .GT. 13.022
17600C
17601      B=1.77
17602      SI=.75
17603      C=.1515/S
17604      GO TO 4
17605C
17606C               CASE 2:  3.686 .LT. A .LE. 13.022
17607C
17608   2  B=1.654+.0076*S2
17609      SI=1.68/S+.275
17610      C=.062/S+.024
17611      GO TO 4
17612C
17613C               CASE 1:  A .LE. 3.686
17614C
17615   3  B=.463+S-.178*S2
17616      SI=1.235
17617      C=.195/S-.079+.016*S
17618C
17619C     STEP  5:  NO QUOTIENT TEST IF X NOT POSITIVE
17620C
17621   4  IF (X .LE. 0.0) GO TO 7
17622C
17623C     STEP  6:  CALCULATION OF V AND QUOTIENT Q
17624C
17625      V=T/(S+S)
17626      IF (ABS(V) .LE. 0.25) GO TO 5
17627      Q=Q0-S*T+0.25*T*T+(S2+S2)*LOG(1.0+V)
17628      GO TO 6
17629   5  Q=Q0+0.5*T*T*((((((A7*V+A6)*V+A5)*V+A4)*V+A3)*V+A2)*V+A1)*V
17630C
17631C     STEP  7:  QUOTIENT ACCEPTANCE (Q)
17632C
17633   6  IF (LOG(1.0-U) .LE. Q) RETURN
17634C
17635C     STEP  8:  E=STANDARD EXPONENTIAL DEVIATE
17636C               U= 0,1 -UNIFORM DEVIATE
17637C               T=(B,SI)-DOUBLE EXPONENTIAL (LAPLACE) SAMPLE
17638C
17639CCC7  E=SEXPO(IR)
17640   7  CONTINUE
17641      NTEMP=1
17642      CALL EXPRAN(NTEMP,ISEED,XTEMP)
17643      E=XTEMP(1)
17644      CALL UNIRAN(NTEMP,ISEED,XTEMP)
17645CCCCC U=SUNIF(IR)
17646      U=XTEMP(1)
17647      U=U+U-1.0
17648      T=B+SIGN(SI*E,U)
17649C
17650C     STEP  9:  REJECTION IF T .LT. TAU(1) = -.71874483771719
17651C
17652      IF (T .LT. (-.7187449)) GO TO 7
17653C
17654C     STEP 10:  CALCULATION OF V AND QUOTIENT Q
17655C
17656      V=T/(S+S)
17657      IF (ABS(V) .LE. 0.25) GO TO 8
17658      Q=Q0-S*T+0.25*T*T+(S2+S2)*LOG(1.0+V)
17659      GO TO 9
17660   8  Q=Q0+0.5*T*T*((((((A7*V+A6)*V+A5)*V+A4)*V+A3)*V+A2)*V+A1)*V
17661C
17662C     STEP 11:  HAT ACCEPTANCE (H) (IF Q NOT POSITIVE GO TO STEP 8)
17663C
17664   9  IF (Q .LE. 0.0) GO TO 7
17665      IF (Q .LE. 0.5) GO TO 10
17666      W=EXP(Q)-1.0
17667      GO TO 11
17668  10  W=((((E5*Q+E4)*Q+E3)*Q+E2)*Q+E1)*Q
17669C
17670C               IF T IS REJECTED, SAMPLE AGAIN AT STEP 8
17671C
17672  11  IF (C*ABS(U) .GT. W*EXP(E-0.5*T*T)) GO TO 7
17673      X=S+0.5*T
17674      SGAMMA=X*X
17675      RETURN
17676C
17677C     ALTERNATE METHOD FOR PARAMETERS A BELOW 1  (.3678794=EXP(-1.))
17678C
17679  12  AA=0.0
17680      B=1.0+.3678794*A
17681CC13  P=B*SUNIF(IR)
17682  13  CONTINUE
17683      NTEMP=1
17684      CALL UNIRAN(NTEMP,ISEED,XTEMP)
17685      P=B*XTEMP(1)
17686      IF (P .GE. 1.0) GO TO 14
17687      SGAMMA=EXP(LOG(P)/A)
17688CCCCC IF (SEXPO(IR) .LT. SGAMMA) GO TO 13
17689      NTEMP=1
17690      CALL EXPRAN(NTEMP,ISEED,XTEMP)
17691      IF (XTEMP(1) .LT. SGAMMA) GO TO 13
17692      RETURN
17693  14  SGAMMA=-LOG((B-P)/A)
17694CCCCC IF (SEXPO(IR) .LT. (1.0-A)*LOG(SGAMMA)) GO TO 13
17695      NTEMP=1
17696      CALL EXPRAN(NTEMP,ISEED,XTEMP)
17697      IF (XTEMP(1) .LT. (1.0-A)*LOG(SGAMMA)) GO TO 13
17698      RETURN
17699      END
17700      SUBROUTINE SGECO(A,LDA,N,IPVT,RCOND,Z)
17701C***BEGIN PROLOGUE  SGECO
17702C***DATE WRITTEN   780814   (YYMMDD)
17703C***REVISION DATE  820801   (YYMMDD)
17704C***CATEGORY NO.  D2A1
17705C***KEYWORDS  CONDITION,FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX
17706C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
17707C***PURPOSE  Factors a real matrix by Gaussian elimination and estimates
17708C            the condition number of the matrix.
17709C***DESCRIPTION
17710C
17711C     SGECO factors a real matrix by Gaussian elimination
17712C     and estimates the condition of the matrix.
17713C
17714C     If  RCOND  is not needed, SGEFA is slightly faster.
17715C     To solve  A*X = B , follow SGECO by SGESL.
17716C     To compute  INVERSE(A)*C , follow SGECO by SGESL.
17717C     To compute  DETERMINANT(A) , follow SGECO by SGEDI.
17718C     To compute  INVERSE(A) , follow SGECO by SGEDI.
17719C
17720C     On Entry
17721C
17722C        A       REAL(LDA, N)
17723C                the matrix to be factored.
17724C
17725C        LDA     INTEGER
17726C                the leading dimension of the array  A .
17727C
17728C        N       INTEGER
17729C                the order of the matrix  A .
17730C
17731C     On Return
17732C
17733C        A       an upper triangular matrix and the multipliers
17734C                which were used to obtain it.
17735C                The factorization can be written  A = L*U , where
17736C                L  is a product of permutation and unit lower
17737C                triangular matrices and  U  is upper triangular.
17738C
17739C        IPVT    INTEGER(N)
17740C                an integer vector of pivot indices.
17741C
17742C        RCOND   REAL
17743C                an estimate of the reciprocal condition of  A .
17744C                For the system  A*X = B , relative perturbations
17745C                in  A  and  B  of size  EPSILON  may cause
17746C                relative perturbations in  X  of size  EPSILON/RCOND .
17747C                If  RCOND  is so small that the logical expression
17748C                           1.0 + RCOND .EQ. 1.0
17749C                is true, then  A  may be singular to working
17750C                precision.  In particular,  RCOND  is zero  if
17751C                exact singularity is detected or the estimate
17752C                underflows.
17753C
17754C        Z       REAL(N)
17755C                a work vector whose contents are usually unimportant.
17756C                If  A  is close to a singular matrix, then  Z  is
17757C                an approximate null vector in the sense that
17758C                NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
17759C
17760C     LINPACK.  This version dated 08/14/78 .
17761C     Cleve Moler, University of New Mexico, Argonne National Lab.
17762C
17763C     Subroutines and Functions
17764C
17765C     LINPACK SGEFA
17766C     BLAS SAXPY,SDOT,SSCAL,SASUM
17767C     Fortran ABS,AMAX1,SIGN
17768C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
17769C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
17770C***ROUTINES CALLED  SASUM,SAXPY,SDOT,SGEFA,SSCAL
17771C***END PROLOGUE  SGECO
17772      INTEGER LDA,N,IPVT(*)
17773      REAL A(LDA,*),Z(*)
17774      REAL RCOND
17775C
17776      REAL SDOT,EK,T,WK,WKM
17777      REAL ANORM,S,SASUM,SM,YNORM
17778      INTEGER INFO,J,K,KB,KP1,L
17779C
17780C     COMPUTE 1-NORM OF A
17781C
17782C***FIRST EXECUTABLE STATEMENT  SGECO
17783      ANORM = 0.0E0
17784      DO 10 J = 1, N
17785         ANORM = AMAX1(ANORM,SASUM(N,A(1,J),1))
17786   10 CONTINUE
17787C
17788C     FACTOR
17789C
17790      CALL SGEFA(A,LDA,N,IPVT,INFO)
17791C
17792C     RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
17793C     ESTIMATE = NORM(Z)/NORM(Y) WHERE  A*Z = Y  AND  TRANS(A)*Y = E .
17794C     TRANS(A)  IS THE TRANSPOSE OF A .  THE COMPONENTS OF  E  ARE
17795C     CHOSEN TO CAUSE MAXIMUM LOCAL GROWTH IN THE ELEMENTS OF W  WHERE
17796C     TRANS(U)*W = E .  THE VECTORS ARE FREQUENTLY RESCALED TO AVOID
17797C     OVERFLOW.
17798C
17799C     SOLVE TRANS(U)*W = E
17800C
17801      EK = 1.0E0
17802      DO 20 J = 1, N
17803         Z(J) = 0.0E0
17804   20 CONTINUE
17805      DO 100 K = 1, N
17806         IF (Z(K) .NE. 0.0E0) EK = SIGN(EK,-Z(K))
17807         IF (ABS(EK-Z(K)) .LE. ABS(A(K,K))) GO TO 30
17808            S = ABS(A(K,K))/ABS(EK-Z(K))
17809            CALL SSCAL(N,S,Z,1)
17810            EK = S*EK
17811   30    CONTINUE
17812         WK = EK - Z(K)
17813         WKM = -EK - Z(K)
17814         S = ABS(WK)
17815         SM = ABS(WKM)
17816         IF (A(K,K) .EQ. 0.0E0) GO TO 40
17817            WK = WK/A(K,K)
17818            WKM = WKM/A(K,K)
17819         GO TO 50
17820   40    CONTINUE
17821            WK = 1.0E0
17822            WKM = 1.0E0
17823   50    CONTINUE
17824         KP1 = K + 1
17825         IF (KP1 .GT. N) GO TO 90
17826            DO 60 J = KP1, N
17827               SM = SM + ABS(Z(J)+WKM*A(K,J))
17828               Z(J) = Z(J) + WK*A(K,J)
17829               S = S + ABS(Z(J))
17830   60       CONTINUE
17831            IF (S .GE. SM) GO TO 80
17832               T = WKM - WK
17833               WK = WKM
17834               DO 70 J = KP1, N
17835                  Z(J) = Z(J) + T*A(K,J)
17836   70          CONTINUE
17837   80       CONTINUE
17838   90    CONTINUE
17839         Z(K) = WK
17840  100 CONTINUE
17841      S = 1.0E0/SASUM(N,Z,1)
17842      CALL SSCAL(N,S,Z,1)
17843C
17844C     SOLVE TRANS(L)*Y = W
17845C
17846      DO 120 KB = 1, N
17847         K = N + 1 - KB
17848         IF (K .LT. N) Z(K) = Z(K) + SDOT(N-K,A(K+1,K),1,Z(K+1),1)
17849         IF (ABS(Z(K)) .LE. 1.0E0) GO TO 110
17850            S = 1.0E0/ABS(Z(K))
17851            CALL SSCAL(N,S,Z,1)
17852  110    CONTINUE
17853         L = IPVT(K)
17854         T = Z(L)
17855         Z(L) = Z(K)
17856         Z(K) = T
17857  120 CONTINUE
17858      S = 1.0E0/SASUM(N,Z,1)
17859      CALL SSCAL(N,S,Z,1)
17860C
17861      YNORM = 1.0E0
17862C
17863C     SOLVE L*V = Y
17864C
17865      DO 140 K = 1, N
17866         L = IPVT(K)
17867         T = Z(L)
17868         Z(L) = Z(K)
17869         Z(K) = T
17870         IF (K .LT. N) CALL SAXPY(N-K,T,A(K+1,K),1,Z(K+1),1)
17871         IF (ABS(Z(K)) .LE. 1.0E0) GO TO 130
17872            S = 1.0E0/ABS(Z(K))
17873            CALL SSCAL(N,S,Z,1)
17874            YNORM = S*YNORM
17875  130    CONTINUE
17876  140 CONTINUE
17877      S = 1.0E0/SASUM(N,Z,1)
17878      CALL SSCAL(N,S,Z,1)
17879      YNORM = S*YNORM
17880C
17881C     SOLVE  U*Z = V
17882C
17883      DO 160 KB = 1, N
17884         K = N + 1 - KB
17885         IF (ABS(Z(K)) .LE. ABS(A(K,K))) GO TO 150
17886            S = ABS(A(K,K))/ABS(Z(K))
17887            CALL SSCAL(N,S,Z,1)
17888            YNORM = S*YNORM
17889  150    CONTINUE
17890         IF (A(K,K) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
17891         IF (A(K,K) .EQ. 0.0E0) Z(K) = 1.0E0
17892         T = -Z(K)
17893         CALL SAXPY(K-1,T,A(1,K),1,Z(1),1)
17894  160 CONTINUE
17895C     MAKE ZNORM = 1.0
17896      S = 1.0E0/SASUM(N,Z,1)
17897      CALL SSCAL(N,S,Z,1)
17898      YNORM = S*YNORM
17899C
17900      IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
17901      IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
17902      RETURN
17903      END
17904      SUBROUTINE SGEDI(A,LDA,N,IPVT,DET,WORK,JOB)
17905C***BEGIN PROLOGUE  SGEDI
17906C***DATE WRITTEN   780814   (YYMMDD)
17907C***REVISION DATE  820801   (YYMMDD)
17908C***CATEGORY NO.  D2A1,D3A1
17909C***KEYWORDS  DETERMINANT,FACTOR,INVERSE,LINEAR ALGEBRA,LINPACK,MATRIX
17910C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
17911C***PURPOSE  Computes the determinant and inverse of a matrix
17912C            using the factors computed by SGECO or SGEFA.
17913C***DESCRIPTION
17914C
17915C     SGEDI computes the determinant and inverse of a matrix
17916C     using the factors computed by SGECO or SGEFA.
17917C
17918C     On Entry
17919C
17920C        A       REAL(LDA, N)
17921C                the output from SGECO or SGEFA.
17922C
17923C        LDA     INTEGER
17924C                the leading dimension of the array  A .
17925C
17926C        N       INTEGER
17927C                the order of the matrix  A .
17928C
17929C        IPVT    INTEGER(N)
17930C                the pivot vector from SGECO or SGEFA.
17931C
17932C        WORK    REAL(N)
17933C                work vector.  Contents destroyed.
17934C
17935C        JOB     INTEGER
17936C                = 11   both determinant and inverse.
17937C                = 01   inverse only.
17938C                = 10   determinant only.
17939C
17940C     On Return
17941C
17942C        A       inverse of original matrix if requested.
17943C                Otherwise unchanged.
17944C
17945C        DET     REAL(2)
17946C                determinant of original matrix if requested.
17947C                Otherwise not referenced.
17948C                Determinant = DET(1) * 10.0**DET(2)
17949C                with  1.0 .LE. ABS(DET(1)) .LT. 10.0
17950C                or  DET(1) .EQ. 0.0 .
17951C
17952C     Error Condition
17953C
17954C        A division by zero will occur if the input factor contains
17955C        a zero on the diagonal and the inverse is requested.
17956C        It will not occur if the subroutines are called correctly
17957C        and if SGECO has set RCOND .GT. 0.0 or SGEFA has set
17958C        INFO .EQ. 0 .
17959C
17960C     LINPACK.  This version dated 08/14/78 .
17961C     Cleve Moler, University of New Mexico, Argonne National Lab.
17962C
17963C     Subroutines and Functions
17964C
17965C     BLAS SAXPY,SSCAL,SSWAP
17966C     Fortran ABS,MOD
17967C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
17968C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
17969C***ROUTINES CALLED  SAXPY,SSCAL,SSWAP
17970C***END PROLOGUE  SGEDI
17971      INTEGER LDA,N,IPVT(1),JOB
17972      REAL A(LDA,1),DET(2),WORK(1)
17973C
17974      REAL T
17975      REAL TEN
17976      INTEGER I,J,K,KB,KP1,L,NM1
17977C
17978C     COMPUTE DETERMINANT
17979C
17980C***FIRST EXECUTABLE STATEMENT  SGEDI
17981      IF (JOB/10 .EQ. 0) GO TO 70
17982         DET(1) = 1.0E0
17983         DET(2) = 0.0E0
17984         TEN = 10.0E0
17985         DO 50 I = 1, N
17986            IF (IPVT(I) .NE. I) DET(1) = -DET(1)
17987            DET(1) = A(I,I)*DET(1)
17988C        ...EXIT
17989            IF (DET(1) .EQ. 0.0E0) GO TO 60
17990   10       IF (ABS(DET(1)) .GE. 1.0E0) GO TO 20
17991               DET(1) = TEN*DET(1)
17992               DET(2) = DET(2) - 1.0E0
17993            GO TO 10
17994   20       CONTINUE
17995   30       IF (ABS(DET(1)) .LT. TEN) GO TO 40
17996               DET(1) = DET(1)/TEN
17997               DET(2) = DET(2) + 1.0E0
17998            GO TO 30
17999   40       CONTINUE
18000   50    CONTINUE
18001   60    CONTINUE
18002   70 CONTINUE
18003C
18004C     COMPUTE INVERSE(U)
18005C
18006      IF (MOD(JOB,10) .EQ. 0) GO TO 150
18007         DO 100 K = 1, N
18008            A(K,K) = 1.0E0/A(K,K)
18009            T = -A(K,K)
18010            CALL SSCAL(K-1,T,A(1,K),1)
18011            KP1 = K + 1
18012            IF (N .LT. KP1) GO TO 90
18013            DO 80 J = KP1, N
18014               T = A(K,J)
18015               A(K,J) = 0.0E0
18016               CALL SAXPY(K,T,A(1,K),1,A(1,J),1)
18017   80       CONTINUE
18018   90       CONTINUE
18019  100    CONTINUE
18020C
18021C        FORM INVERSE(U)*INVERSE(L)
18022C
18023         NM1 = N - 1
18024         IF (NM1 .LT. 1) GO TO 140
18025         DO 130 KB = 1, NM1
18026            K = N - KB
18027            KP1 = K + 1
18028            DO 110 I = KP1, N
18029               WORK(I) = A(I,K)
18030               A(I,K) = 0.0E0
18031  110       CONTINUE
18032            DO 120 J = KP1, N
18033               T = WORK(J)
18034               CALL SAXPY(N,T,A(1,J),1,A(1,K),1)
18035  120       CONTINUE
18036            L = IPVT(K)
18037            IF (L .NE. K) CALL SSWAP(N,A(1,K),1,A(1,L),1)
18038  130    CONTINUE
18039  140    CONTINUE
18040  150 CONTINUE
18041      RETURN
18042      END
18043      SUBROUTINE SGEEV(A,LDA,N,E,V,LDV,WORK,JOB,INFO)
18044C***BEGIN PROLOGUE  SGEEV
18045C***DATE WRITTEN   800808   (YYMMDD)
18046C***REVISION DATE  820801   (YYMMDD)
18047C***CATEGORY NO.  D4A2
18048C***KEYWORDS  EIGENVALUE,EIGENVECTOR,GENERAL MATRIX,REAL
18049C***AUTHOR  KAHANER, D. K., (NBS)
18050C           MOLER, C. B., (U. OF NEW MEXICO)
18051C           STEWART, G. W., (U. OF MARYLAND)
18052C***PURPOSE  To compute the eigenvalues and, optionally, the eigen-
18053C            vectors of a GENERAL real matrix.
18054C***DESCRIPTION
18055C
18056C     LICEPACK.    This version dated 08/08/80.
18057C     David Kahaner, Cleve Moler, G. W. Stewart,
18058C       N.B.S.         U.N.M.      N.B.S./U.MD.
18059C
18060C     Abstract
18061C      SGEEV computes the eigenvalues and, optionally,
18062C      the eigenvectors of a general real matrix.
18063C
18064C     Call Sequence Parameters-
18065C       (The values of parameters marked with * (star) will be changed
18066C         by SGEEV.)
18067C
18068C        A*      REAL(LDA,N)
18069C                real nonsymmetric input matrix.
18070C
18071C        LDA     INTEGER
18072C                set by the user to
18073C                the leading dimension of the real array A.
18074C
18075C        N       INTEGER
18076C                set by the user to
18077C                the order of the matrices A and V, and
18078C                the number of elements in E.
18079C
18080C        E*      COMPLEX(N)
18081C                on return from SGEEV, E contains the eigenvalues of A.
18082C                See also INFO below.
18083C
18084C        V*      COMPLEX(LDV,N)
18085C                on return from SGEEV, if the user has set JOB
18086C                = 0        V is not referenced.
18087C                = nonzero  the N eigenvectors of A are stored in the
18088C                first N columns of V.  See also INFO below.
18089C                (Note that if the input matrix A is nearly degenerate,
18090C                 V may be badly conditioned, i.e., may have nearly
18091C                 dependent columns.)
18092C
18093C        LDV     INTEGER
18094C                set by the user to
18095C                the leading dimension of the array V if JOB is also
18096C                set nonzero.  In that case, N must be .LE. LDV.
18097C                If JOB is set to zero, LDV is not referenced.
18098C
18099C        WORK*   REAL(2N)
18100C                temporary storage vector.  Contents changed by SGEEV.
18101C
18102C        JOB     INTEGER
18103C                set by the user to
18104C                = 0        eigenvalues only to be calculated by SGEEV.
18105C                           Neither V nor LDV is referenced.
18106C                = nonzero  eigenvalues and vectors to be calculated.
18107C                           In this case, A & V must be distinct arrays.
18108C                           Also, if LDA .GT. LDV, SGEEV changes all the
18109C                           elements of A thru column N.  If LDA < LDV,
18110C                           SGEEV changes all the elements of V through
18111C                           column N. If LDA = LDV, only A(I,J) and V(I,
18112C                           J) for I,J = 1,...,N are changed by SGEEV.
18113C
18114C        INFO*   INTEGER
18115C                on return from SGEEV the value of INFO is
18116C                = 0  normal return, calculation successful.
18117C                = K  if the eigenvalue iteration fails to converge,
18118C                     eigenvalues K+1 through N are correct, but
18119C                     no eigenvectors were computed even if they were
18120C                     requested (JOB nonzero).
18121C
18122C      Error Messages
18123C           No. 1  recoverable  N is greater than LDA
18124C           No. 2  recoverable  N is less than one.
18125C           No. 3  recoverable  JOB is nonzero and N is greater than LDV
18126C           No. 4  warning      LDA > LDV, elements of A other than the
18127C                               N by N input elements have been changed.
18128C           No. 5  warning      LDA < LDV, elements of V other than the
18129C                               N x N output elements have been changed.
18130C
18131C
18132C     Subroutines used
18133C
18134C     EISPACK-  BALANC,BALBAK, ORTHES, ORTRAN, HQR, HQR2
18135C     BLAS-  SCOPY, SCOPYM
18136C     SLATEC- XERROR
18137C***REFERENCES  (NONE)
18138C***ROUTINES CALLED  BALANC,BALBAK,HQR,HQR2,ORTHES,ORTRAN,SCOPY,SCOPYM,
18139C                    XERROR
18140C***END PROLOGUE  SGEEV
18141CCCCC INTEGER I,IHI,ILO,INFO,J,JB,JOB,K,KM,KP,L,LDA,LDV,
18142      INTEGER IHI,ILO,INFO,J,JOB,K,L,LDA,LDV,
18143     1        MDIM,MIN0,N
18144      REAL A(*),E(*),WORK(*),V(*)
18145C***FIRST EXECUTABLE STATEMENT  SGEEV
18146      IF(N .GT. LDA)THEN
18147CCCCC   WRITE(*,*) 'FROM SGEEV: N > LDA'
18148        INFO = -1
18149        RETURN
18150      ENDIF
18151      IF(N .LT. 1) THEN
18152CCCCC   WRITE(*,*) 'FROM SGEEV: N < 1'
18153        INFO = -1
18154        RETURN
18155      END IF
18156      IF(N .EQ. 1 .AND. JOB .EQ. 0) GO TO 35
18157      MDIM = LDA
18158      IF(JOB .EQ. 0) GO TO 5
18159      IF(N .GT. LDV)THEN
18160CCCCC   WRITE(*,*) 'FROM SGEEV: JOB NON-ZERO AND N > LDV'
18161        INFO = -1
18162        RETURN
18163      ENDIF
18164      IF(N .EQ. 1) GO TO 35
18165C
18166C       REARRANGE A IF NECESSARY WHEN LDA.GT.LDV AND JOB .NE.0
18167C
18168      MDIM = MIN0(LDA,LDV)
18169      IF(LDA.LT.LDV) THEN
18170CCCCC  WRITE(*,*) 'FROM SGEEV: LDA < LDV, ELEMENTS OF V OTHER'
18171CCCCC  WRITE(*,*) 'THAN THE N BY N OUTPUT ELEMENTS HAVE BEEN CHANGED.'
18172      ENDIF
18173      IF(LDA.LE.LDV) GO TO 5
18174CCCCC WRITE(*,*) 'FROM SGEEV: LDA > LDV, ELEMENTS OF A OTHER THAN THE'
18175CCCCC WRITE(*,*) 'N BY N INPUT ELEMENTS HAVE BEEN CHANGED.'
18176      L = N - 1
18177      DO 4 J=1,L
18178         M = 1+J*LDV
18179         K = 1+J*LDA
18180         CALL SCOPY(N,A(K),1,A(M),1)
18181    4 CONTINUE
18182    5 CONTINUE
18183C
18184C     SCALE AND ORTHOGONAL REDUCTION TO HESSENBERG.
18185C
18186      CALL BALANC(MDIM,N,A,ILO,IHI,WORK(1))
18187      CALL ORTHES(MDIM,N,ILO,IHI,A,WORK(N+1))
18188      IF(JOB .NE. 0) GO TO 10
18189C
18190C     EIGENVALUES ONLY
18191C
18192      CALL HQR(LDA,N,ILO,IHI,A,E(1),E(N+1),INFO)
18193      GO TO 30
18194C
18195C     EIGENVALUES AND EIGENVECTORS.
18196C
18197   10 CALL ORTRAN(MDIM,N,ILO,IHI,A,WORK(N+1),V)
18198      CALL HQR2(MDIM,N,ILO,IHI,A,E(1),E(N+1),V,INFO)
18199      IF (INFO .NE. 0) GO TO 30
18200      CALL BALBAK(MDIM,N,ILO,IHI,WORK(1),N,V)
18201C
18202C     CONVERT EIGENVECTORS TO COMPLEX STORAGE.
18203C
18204CCCCC JULY 1993.  FOR DATAPLOT PURPOSES, DO NOT CONVERT TO COMPLEX
18205CCCCC FORMAT (I.E., ROWS 1 TO N CORRESPOND TO REAL PART, ROWS N+1
18206CCCCC TO 2*N CORRESPOND TO IMAGINARY PART).
18207CNIST DO 20 JB = 1,N
18208CNIST    J=N+1-JB
18209CNIST    I=N+J
18210CNIST    K=(J-1)*MDIM+1
18211CNIST    KP=K+MDIM
18212CNIST    KM=K-MDIM
18213CNIST    IF(E(I).GE.0.0E0) CALL SCOPY(N,V(K),1,WORK(1),2)
18214CNIST    IF(E(I).LT.0.0E0) CALL SCOPY(N,V(KM),1,WORK(1),2)
18215CNIST    IF(E(I).EQ.0.0E0) CALL SCOPY(N,0.0E0,0,WORK(2),2)
18216CNIST    IF(E(I).GT.0.0E0) CALL SCOPY(N,V(KP),1,WORK(2),2)
18217CNIST    IF(E(I).LT.0.0E0) CALL SCOPYM(N,V(K),1,WORK(2),2)
18218CNIST    L=2*(J-1)*LDV+1
18219CNIST    CALL SCOPY(2*N,WORK(1),1,V(L),1)
18220CCC20 CONTINUE
18221C
18222C     CONVERT EIGENVALUES TO COMPLEX STORAGE.
18223C
18224CCCCC JULY 1993.  FOR DATAPLOT PURPOSES, DO NOT CONVERT TO COMPLEX
18225CCCCC FORMAT (I.E., ROWS 1 TO N CORRESPOND TO REAL PART, ROWS N+1
18226CCCCC TO 2*N CORRESPOND TO IMAGINARY PART).
18227   30 CONTINUE
18228CNIST CALL SCOPY(N,E(1),1,WORK(1),1)
18229CNIST CALL SCOPY(N,E(N+1),1,E(2),2)
18230CNIST CALL SCOPY(N,WORK(1),1,E(1),2)
18231      RETURN
18232C
18233C     TAKE CARE OF N=1 CASE
18234C
18235   35 E(1) = A(1)
18236      E(2) = 0.E0
18237      INFO = 0
18238      IF(JOB .EQ. 0) RETURN
18239      V(1) = A(1)
18240      V(2) = 0.E0
18241      RETURN
18242      END
18243      SUBROUTINE SGEFA(A,LDA,N,IPVT,INFO)
18244C***BEGIN PROLOGUE  SGEFA
18245C***DATE WRITTEN   780814   (YYMMDD)
18246C***REVISION DATE  820801   (YYMMDD)
18247C***CATEGORY NO.  D2A1
18248C***KEYWORDS  FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX
18249C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
18250C***PURPOSE  Factors a real matrix by Gaussian elimination.
18251C***DESCRIPTION
18252C
18253C     SGEFA factors a real matrix by Gaussian elimination.
18254C
18255C     SGEFA is usually called by SGECO, but it can be called
18256C     directly with a saving in time if  RCOND  is not needed.
18257C     (Time for SGECO) = (1 + 9/N)*(Time for SGEFA) .
18258C
18259C     On Entry
18260C
18261C        A       REAL(LDA, N)
18262C                the matrix to be factored.
18263C
18264C        LDA     INTEGER
18265C                the leading dimension of the array  A .
18266C
18267C        N       INTEGER
18268C                the order of the matrix  A .
18269C
18270C     On Return
18271C
18272C        A       an upper triangular matrix and the multipliers
18273C                which were used to obtain it.
18274C                The factorization can be written  A = L*U , where
18275C                L  is a product of permutation and unit lower
18276C                triangular matrices and  U  is upper triangular.
18277C
18278C        IPVT    INTEGER(N)
18279C                an integer vector of pivot indices.
18280C
18281C        INFO    INTEGER
18282C                = 0  normal value.
18283C                = K  if  U(K,K) .EQ. 0.0 .  This is not an error
18284C                     condition for this subroutine, but it does
18285C                     indicate that SGESL or SGEDI will divide by zero
18286C                     if called.  Use  RCOND  in SGECO for a reliable
18287C                     indication of singularity.
18288C
18289C     LINPACK.  This version dated 08/14/78 .
18290C     Cleve Moler, University of New Mexico, Argonne National Lab.
18291C
18292C     Subroutines and Functions
18293C
18294C     BLAS SAXPY,SSCAL,ISAMAX
18295C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
18296C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
18297C***ROUTINES CALLED  ISAMAX,SAXPY,SSCAL
18298C***END PROLOGUE  SGEFA
18299      INTEGER LDA,N,IPVT(*),INFO
18300      REAL A(LDA,*)
18301C
18302      REAL T
18303      INTEGER ISAMAX,J,K,KP1,L,NM1
18304C
18305C     GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
18306C
18307C***FIRST EXECUTABLE STATEMENT  SGEFA
18308      INFO = 0
18309      NM1 = N - 1
18310      IF (NM1 .LT. 1) GO TO 70
18311      DO 60 K = 1, NM1
18312         KP1 = K + 1
18313C
18314C        FIND L = PIVOT INDEX
18315C
18316         L = ISAMAX(N-K+1,A(K,K),1) + K - 1
18317         IPVT(K) = L
18318C
18319C        ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
18320C
18321         IF (A(L,K) .EQ. 0.0E0) GO TO 40
18322C
18323C           INTERCHANGE IF NECESSARY
18324C
18325            IF (L .EQ. K) GO TO 10
18326               T = A(L,K)
18327               A(L,K) = A(K,K)
18328               A(K,K) = T
18329   10       CONTINUE
18330C
18331C           COMPUTE MULTIPLIERS
18332C
18333            T = -1.0E0/A(K,K)
18334            CALL SSCAL(N-K,T,A(K+1,K),1)
18335C
18336C           ROW ELIMINATION WITH COLUMN INDEXING
18337C
18338            DO 30 J = KP1, N
18339               T = A(L,J)
18340               IF (L .EQ. K) GO TO 20
18341                  A(L,J) = A(K,J)
18342                  A(K,J) = T
18343   20          CONTINUE
18344               CALL SAXPY(N-K,T,A(K+1,K),1,A(K+1,J),1)
18345   30       CONTINUE
18346         GO TO 50
18347   40    CONTINUE
18348            INFO = K
18349   50    CONTINUE
18350   60 CONTINUE
18351   70 CONTINUE
18352      IPVT(N) = N
18353      IF (A(N,N) .EQ. 0.0E0) INFO = N
18354      RETURN
18355      END
18356      SUBROUTINE SGESL(A,LDA,N,IPVT,B,JOB)
18357C***BEGIN PROLOGUE  SGESL
18358C***DATE WRITTEN   780814   (YYMMDD)
18359C***REVISION DATE  820801   (YYMMDD)
18360C***CATEGORY NO.  D2A1
18361C***KEYWORDS  LINEAR ALGEBRA,LINPACK,MATRIX,SOLVE
18362C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
18363C***PURPOSE  Solves the real system A*X=B or TRANS(A)*X=B
18364C            using the factors of SGECO or SGEFA
18365C***DESCRIPTION
18366C
18367C     SGESL solves the real system
18368C     A * X = B  or  TRANS(A) * X = B
18369C     using the factors computed by SGECO or SGEFA.
18370C
18371C     On Entry
18372C
18373C        A       REAL(LDA, N)
18374C                the output from SGECO or SGEFA.
18375C
18376C        LDA     INTEGER
18377C                the leading dimension of the array  A .
18378C
18379C        N       INTEGER
18380C                the order of the matrix  A .
18381C
18382C        IPVT    INTEGER(N)
18383C                the pivot vector from SGECO or SGEFA.
18384C
18385C        B       REAL(N)
18386C                the right hand side vector.
18387C
18388C        JOB     INTEGER
18389C                = 0         to solve  A*X = B ,
18390C                = nonzero   to solve  TRANS(A)*X = B  where
18391C                            TRANS(A)  is the transpose.
18392C
18393C     On Return
18394C
18395C        B       the solution vector  X .
18396C
18397C     Error Condition
18398C
18399C        A division by zero will occur if the input factor contains a
18400C        zero on the diagonal.  Technically, this indicates singularity,
18401C        but it is often caused by improper arguments or improper
18402C        setting of LDA .  It will not occur if the subroutines are
18403C        called correctly and if SGECO has set RCOND .GT. 0.0
18404C        or SGEFA has set INFO .EQ. 0 .
18405C
18406C     To compute  INVERSE(A) * C  where  C  is a matrix
18407C     with  P  columns
18408C           CALL SGECO(A,LDA,N,IPVT,RCOND,Z)
18409C           IF (RCOND is too small) GO TO ...
18410C           DO 10 J = 1, P
18411C              CALL SGESL(A,LDA,N,IPVT,C(1,J),0)
18412C        10 CONTINUE
18413C
18414C     LINPACK.  This version dated 08/14/78 .
18415C     Cleve Moler, University of New Mexico, Argonne National Lab.
18416C
18417C     Subroutines and Functions
18418C
18419C     BLAS SAXPY,SDOT
18420C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
18421C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
18422C***ROUTINES CALLED  SAXPY,SDOT
18423C***END PROLOGUE  SGESL
18424      INTEGER LDA,N,IPVT(*),JOB
18425      REAL A(LDA,*),B(*)
18426C
18427      REAL SDOT,T
18428      INTEGER K,KB,L,NM1
18429C***FIRST EXECUTABLE STATEMENT  SGESL
18430      NM1 = N - 1
18431      IF (JOB .NE. 0) GO TO 50
18432C
18433C        JOB = 0 , SOLVE  A * X = B
18434C        FIRST SOLVE  L*Y = B
18435C
18436         IF (NM1 .LT. 1) GO TO 30
18437         DO 20 K = 1, NM1
18438            L = IPVT(K)
18439            T = B(L)
18440            IF (L .EQ. K) GO TO 10
18441               B(L) = B(K)
18442               B(K) = T
18443   10       CONTINUE
18444            CALL SAXPY(N-K,T,A(K+1,K),1,B(K+1),1)
18445   20    CONTINUE
18446   30    CONTINUE
18447C
18448C        NOW SOLVE  U*X = Y
18449C
18450         DO 40 KB = 1, N
18451            K = N + 1 - KB
18452            B(K) = B(K)/A(K,K)
18453            T = -B(K)
18454            CALL SAXPY(K-1,T,A(1,K),1,B(1),1)
18455   40    CONTINUE
18456      GO TO 100
18457   50 CONTINUE
18458C
18459C        JOB = NONZERO, SOLVE  TRANS(A) * X = B
18460C        FIRST SOLVE  TRANS(U)*Y = B
18461C
18462         DO 60 K = 1, N
18463            T = SDOT(K-1,A(1,K),1,B(1),1)
18464            B(K) = (B(K) - T)/A(K,K)
18465   60    CONTINUE
18466C
18467C        NOW SOLVE TRANS(L)*X = Y
18468C
18469         IF (NM1 .LT. 1) GO TO 90
18470         DO 80 KB = 1, NM1
18471            K = N - KB
18472            B(K) = B(K) + SDOT(N-K,A(K+1,K),1,B(K+1),1)
18473            L = IPVT(K)
18474            IF (L .EQ. K) GO TO 70
18475               T = B(L)
18476               B(L) = B(K)
18477               B(K) = T
18478   70       CONTINUE
18479   80    CONTINUE
18480   90    CONTINUE
18481  100 CONTINUE
18482      RETURN
18483      END
18484      SUBROUTINE SGEMM (TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB,
18485     $   BETA, C, LDC,
18486     $   IERROR)
18487*DECK SGEMM
18488C***BEGIN PROLOGUE  SGEMM
18489C***PURPOSE  Multiply a real general matrix by a real general matrix.
18490C***LIBRARY   SLATEC (BLAS)
18491C***CATEGORY  D1B6
18492C***TYPE      SINGLE PRECISION (SGEMM-S, DGEMM-D, CGEMM-C)
18493C***KEYWORDS  LEVEL 3 BLAS, LINEAR ALGEBRA
18494C***AUTHOR  Dongarra, J., (ANL)
18495C           Duff, I., (AERE)
18496C           Du Croz, J., (NAG)
18497C           Hammarling, S. (NAG)
18498C***DESCRIPTION
18499C
18500C  SGEMM  performs one of the matrix-matrix operations
18501C
18502C     C := alpha*op( A )*op( B ) + beta*C,
18503C
18504C  where  op( X ) is one of
18505C
18506C     op( X ) = X   or   op( X ) = X',
18507C
18508C  alpha and beta are scalars, and A, B and C are matrices, with op( A )
18509C  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
18510C
18511C  Parameters
18512C  ==========
18513C
18514C  TRANSA - CHARACTER*1.
18515C           On entry, TRANSA specifies the form of op( A ) to be used in
18516C           the matrix multiplication as follows:
18517C
18518C              TRANSA = 'N' or 'n',  op( A ) = A.
18519C
18520C              TRANSA = 'T' or 't',  op( A ) = A'.
18521C
18522C              TRANSA = 'C' or 'c',  op( A ) = A'.
18523C
18524C           Unchanged on exit.
18525C
18526C  TRANSB - CHARACTER*1.
18527C           On entry, TRANSB specifies the form of op( B ) to be used in
18528C           the matrix multiplication as follows:
18529C
18530C              TRANSB = 'N' or 'n',  op( B ) = B.
18531C
18532C              TRANSB = 'T' or 't',  op( B ) = B'.
18533C
18534C              TRANSB = 'C' or 'c',  op( B ) = B'.
18535C
18536C           Unchanged on exit.
18537C
18538C  M      - INTEGER.
18539C           On entry,  M  specifies  the number  of rows  of the  matrix
18540C           op( A )  and of the  matrix  C.  M  must  be at least  zero.
18541C           Unchanged on exit.
18542C
18543C  N      - INTEGER.
18544C           On entry,  N  specifies the number  of columns of the matrix
18545C           op( B ) and the number of columns of the matrix C. N must be
18546C           at least zero.
18547C           Unchanged on exit.
18548C
18549C  K      - INTEGER.
18550C           On entry,  K  specifies  the number of columns of the matrix
18551C           op( A ) and the number of rows of the matrix op( B ). K must
18552C           be at least  zero.
18553C           Unchanged on exit.
18554C
18555C  ALPHA  - REAL            .
18556C           On entry, ALPHA specifies the scalar alpha.
18557C           Unchanged on exit.
18558C
18559C  A      - REAL             array of DIMENSION ( LDA, ka ), where ka is
18560C           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
18561C           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
18562C           part of the array  A  must contain the matrix  A,  otherwise
18563C           the leading  k by m  part of the array  A  must contain  the
18564C           matrix A.
18565C           Unchanged on exit.
18566C
18567C  LDA    - INTEGER.
18568C           On entry, LDA specifies the first dimension of A as declared
18569C           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
18570C           LDA must be at least  max( 1, m ), otherwise  LDA must be at
18571C           least  max( 1, k ).
18572C           Unchanged on exit.
18573C
18574C  B      - REAL             array of DIMENSION ( LDB, kb ), where kb is
18575C           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
18576C           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
18577C           part of the array  B  must contain the matrix  B,  otherwise
18578C           the leading  n by k  part of the array  B  must contain  the
18579C           matrix B.
18580C           Unchanged on exit.
18581C
18582C  LDB    - INTEGER.
18583C           On entry, LDB specifies the first dimension of B as declared
18584C           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
18585C           LDB must be at least  max( 1, k ), otherwise  LDB must be at
18586C           least  max( 1, n ).
18587C           Unchanged on exit.
18588C
18589C  BETA   - REAL            .
18590C           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
18591C           supplied as zero then C need not be set on input.
18592C           Unchanged on exit.
18593C
18594C  C      - REAL             array of DIMENSION ( LDC, n ).
18595C           Before entry, the leading  m by n  part of the array  C must
18596C           contain the matrix  C,  except when  beta  is zero, in which
18597C           case C need not be set on entry.
18598C           On exit, the array  C  is overwritten by the  m by n  matrix
18599C           ( alpha*op( A )*op( B ) + beta*C ).
18600C
18601C  LDC    - INTEGER.
18602C           On entry, LDC specifies the first dimension of C as declared
18603C           in  the  calling  (sub)  program.   LDC  must  be  at  least
18604C           max( 1, m ).
18605C           Unchanged on exit.
18606C
18607C***REFERENCES  Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.
18608C                 A set of level 3 basic linear algebra subprograms.
18609C                 ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.
18610C***ROUTINES CALLED  LSAME, XERBLA
18611C***REVISION HISTORY  (YYMMDD)
18612C   890208  DATE WRITTEN
18613C   910605  Modified to meet SLATEC prologue standards.  Only comment
18614C           lines were modified.  (BKS)
18615C***END PROLOGUE  SGEMM
18616C     .. Scalar Arguments ..
18617      CHARACTER*1        TRANSA, TRANSB
18618      INTEGER            M, N, K, LDA, LDB, LDC
18619      REAL               ALPHA, BETA
18620C     .. Array Arguments ..
18621      REAL               A( LDA, * ), B( LDB, * ), C( LDC, * )
18622C     .. External Functions ..
18623      LOGICAL            LSAME
18624      EXTERNAL           LSAME
18625C     .. External Subroutines ..
18626CCCCC EXTERNAL           XERBLA
18627C     .. Intrinsic Functions ..
18628      INTRINSIC          MAX
18629C     .. Local Scalars ..
18630      LOGICAL            NOTA, NOTB
18631      INTEGER            I, INFO, J, L, NCOLA, NROWA, NROWB
18632      REAL               TEMP
18633C     .. Parameters ..
18634      REAL               ONE         , ZERO
18635      PARAMETER        ( ONE = 1.0E+0, ZERO = 0.0E+0 )
18636C
18637      CHARACTER*4 IERROR
18638C
18639      INCLUDE 'DPCOP2.INC'
18640C
18641C***FIRST EXECUTABLE STATEMENT  SGEMM
18642C
18643C     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
18644C     transposed and set  NROWA, NCOLA and  NROWB  as the number of rows
18645C     and  columns of  A  and the  number of  rows  of  B  respectively.
18646C
18647      IERROR='NO'
18648C
18649      NOTA  = LSAME( TRANSA, 'N' )
18650      NOTB  = LSAME( TRANSB, 'N' )
18651      IF( NOTA )THEN
18652         NROWA = M
18653         NCOLA = K
18654      ELSE
18655         NROWA = K
18656         NCOLA = M
18657      END IF
18658      IF( NOTB )THEN
18659         NROWB = K
18660      ELSE
18661         NROWB = N
18662      END IF
18663C
18664C     Test the input parameters.
18665C
18666      INFO = 0
18667      IF(      ( .NOT.NOTA                 ).AND.
18668     $         ( .NOT.LSAME( TRANSA, 'C' ) ).AND.
18669     $         ( .NOT.LSAME( TRANSA, 'T' ) )      )THEN
18670         INFO = 1
18671      ELSE IF( ( .NOT.NOTB                 ).AND.
18672     $         ( .NOT.LSAME( TRANSB, 'C' ) ).AND.
18673     $         ( .NOT.LSAME( TRANSB, 'T' ) )      )THEN
18674         INFO = 2
18675      ELSE IF( M  .LT.0               )THEN
18676         INFO = 3
18677      ELSE IF( N  .LT.0               )THEN
18678         INFO = 4
18679      ELSE IF( K  .LT.0               )THEN
18680         INFO = 5
18681      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
18682         INFO = 8
18683      ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN
18684         INFO = 10
18685      ELSE IF( LDC.LT.MAX( 1, M     ) )THEN
18686         INFO = 13
18687      END IF
18688      IF( INFO.NE.0 )THEN
18689CCCCC    CALL XERBLA( 'SGEMM ', INFO )
18690         WRITE(ICOUT,1001)
18691         CALL DPWRST('XXX','BUG ')
18692         IERROR='YES'
18693 1001 FORMAT('***** INTERNAL ERROR FROM SGEMM, INVALID',
18694     1' ARGUMENTS.')
18695         RETURN
18696      END IF
18697C
18698C     Quick return if possible.
18699C
18700      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
18701     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
18702     $   RETURN
18703C
18704C     And if  alpha.eq.zero.
18705C
18706      IF( ALPHA.EQ.ZERO )THEN
18707         IF( BETA.EQ.ZERO )THEN
18708            DO 20, J = 1, N
18709               DO 10, I = 1, M
18710                  C( I, J ) = ZERO
18711   10          CONTINUE
18712   20       CONTINUE
18713         ELSE
18714            DO 40, J = 1, N
18715               DO 30, I = 1, M
18716                  C( I, J ) = BETA*C( I, J )
18717   30          CONTINUE
18718   40       CONTINUE
18719         END IF
18720         RETURN
18721      END IF
18722C
18723C     Start the operations.
18724C
18725      IF( NOTB )THEN
18726         IF( NOTA )THEN
18727C
18728C           Form  C := alpha*A*B + beta*C.
18729C
18730            DO 90, J = 1, N
18731               IF( BETA.EQ.ZERO )THEN
18732                  DO 50, I = 1, M
18733                     C( I, J ) = ZERO
18734   50             CONTINUE
18735               ELSE IF( BETA.NE.ONE )THEN
18736                  DO 60, I = 1, M
18737                     C( I, J ) = BETA*C( I, J )
18738   60             CONTINUE
18739               END IF
18740               DO 80, L = 1, K
18741                  IF( B( L, J ).NE.ZERO )THEN
18742                     TEMP = ALPHA*B( L, J )
18743                     DO 70, I = 1, M
18744                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
18745   70                CONTINUE
18746                  END IF
18747   80          CONTINUE
18748   90       CONTINUE
18749         ELSE
18750C
18751C           Form  C := alpha*A'*B + beta*C
18752C
18753            DO 120, J = 1, N
18754               DO 110, I = 1, M
18755                  TEMP = ZERO
18756                  DO 100, L = 1, K
18757                     TEMP = TEMP + A( L, I )*B( L, J )
18758  100             CONTINUE
18759                  IF( BETA.EQ.ZERO )THEN
18760                     C( I, J ) = ALPHA*TEMP
18761                  ELSE
18762                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
18763                  END IF
18764  110          CONTINUE
18765  120       CONTINUE
18766         END IF
18767      ELSE
18768         IF( NOTA )THEN
18769C
18770C           Form  C := alpha*A*B' + beta*C
18771C
18772            DO 170, J = 1, N
18773               IF( BETA.EQ.ZERO )THEN
18774                  DO 130, I = 1, M
18775                     C( I, J ) = ZERO
18776  130             CONTINUE
18777               ELSE IF( BETA.NE.ONE )THEN
18778                  DO 140, I = 1, M
18779                     C( I, J ) = BETA*C( I, J )
18780  140             CONTINUE
18781               END IF
18782               DO 160, L = 1, K
18783                  IF( B( J, L ).NE.ZERO )THEN
18784                     TEMP = ALPHA*B( J, L )
18785                     DO 150, I = 1, M
18786                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
18787  150                CONTINUE
18788                  END IF
18789  160          CONTINUE
18790  170       CONTINUE
18791         ELSE
18792C
18793C           Form  C := alpha*A'*B' + beta*C
18794C
18795            DO 200, J = 1, N
18796               DO 190, I = 1, M
18797                  TEMP = ZERO
18798                  DO 180, L = 1, K
18799                     TEMP = TEMP + A( L, I )*B( J, L )
18800  180             CONTINUE
18801                  IF( BETA.EQ.ZERO )THEN
18802                     C( I, J ) = ALPHA*TEMP
18803                  ELSE
18804                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
18805                  END IF
18806  190          CONTINUE
18807  200       CONTINUE
18808         END IF
18809      END IF
18810C
18811      RETURN
18812C
18813C     End of SGEMM .
18814C
18815      END
18816      SUBROUTINE SGTSL(N,C,D,E,B,INFO)
18817C***BEGIN PROLOGUE  SGTSL
18818C***DATE WRITTEN   780814   (YYMMDD)
18819C***REVISION DATE  820801   (YYMMDD)
18820C***CATEGORY NO.  D2A2A
18821C***KEYWORDS  LINEAR ALGEBRA,LINPACK,MATRIX,SOLVE,TRIDIAGONAL
18822C***AUTHOR  DONGARRA, J., (ANL)
18823C***PURPOSE  Solves the system A*X=B where a is TRIDIAGONAL
18824C***DESCRIPTION
18825C
18826C     SGTSL given a general tridiagonal matrix and a right hand
18827C     side will find the solution.
18828C
18829C     On Entry
18830C
18831C        N       INTEGER
18832C                is the order of the tridiagonal matrix.
18833C
18834C        C       REAL(N)
18835C                is the subdiagonal of the tridiagonal matrix.
18836C                C(2) through C(N) should contain the subdiagonal.
18837C                On output, C is destroyed.
18838C
18839C        D       REAL(N)
18840C                is the diagonal of the tridiagonal matrix.
18841C                On output, D is destroyed.
18842C
18843C        E       REAL(N)
18844C                is the superdiagonal of the tridiagonal matrix.
18845C                E(1) through E(N-1) should contain the superdiagonal.
18846C                On output, E is destroyed.
18847C
18848C        B       REAL(N)
18849C                is the right hand side vector.
18850C
18851C     On Return
18852C
18853C        B       is the solution vector.
18854C
18855C        INFO    INTEGER
18856C                = 0 normal value.
18857C                = K if the K-th element of the diagonal becomes
18858C                    exactly zero.  The subroutine returns when
18859C                    this is detected.
18860C
18861C     LINPACK.  This version dated 08/14/78 .
18862C     Jack Dongarra, Argonne National Laboratory.
18863C
18864C     No externals
18865C     Fortran ABS
18866C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
18867C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
18868C***ROUTINES CALLED  (NONE)
18869C***END PROLOGUE  SGTSL
18870      INTEGER N,INFO
18871      REAL C(1),D(1),E(1),B(1)
18872C
18873      INTEGER K,KB,KP1,NM1,NM2
18874      REAL T
18875C     BEGIN BLOCK PERMITTING ...EXITS TO 100
18876C
18877C***FIRST EXECUTABLE STATEMENT  SGTSL
18878         INFO = 0
18879         C(1) = D(1)
18880         NM1 = N - 1
18881         IF (NM1 .LT. 1) GO TO 40
18882            D(1) = E(1)
18883            E(1) = 0.0E0
18884            E(N) = 0.0E0
18885C
18886            DO 30 K = 1, NM1
18887               KP1 = K + 1
18888C
18889C              FIND THE LARGEST OF THE TWO ROWS
18890C
18891               IF (ABS(C(KP1)) .LT. ABS(C(K))) GO TO 10
18892C
18893C                 INTERCHANGE ROW
18894C
18895                  T = C(KP1)
18896                  C(KP1) = C(K)
18897                  C(K) = T
18898                  T = D(KP1)
18899                  D(KP1) = D(K)
18900                  D(K) = T
18901                  T = E(KP1)
18902                  E(KP1) = E(K)
18903                  E(K) = T
18904                  T = B(KP1)
18905                  B(KP1) = B(K)
18906                  B(K) = T
18907   10          CONTINUE
18908C
18909C              ZERO ELEMENTS
18910C
18911               IF (C(K) .NE. 0.0E0) GO TO 20
18912                  INFO = K
18913C     ............EXIT
18914                  GO TO 100
18915   20          CONTINUE
18916               T = -C(KP1)/C(K)
18917               C(KP1) = D(KP1) + T*D(K)
18918               D(KP1) = E(KP1) + T*E(K)
18919               E(KP1) = 0.0E0
18920               B(KP1) = B(KP1) + T*B(K)
18921   30       CONTINUE
18922   40    CONTINUE
18923         IF (C(N) .NE. 0.0E0) GO TO 50
18924            INFO = N
18925         GO TO 90
18926   50    CONTINUE
18927C
18928C           BACK SOLVE
18929C
18930            NM2 = N - 2
18931            B(N) = B(N)/C(N)
18932            IF (N .EQ. 1) GO TO 80
18933               B(NM1) = (B(NM1) - D(NM1)*B(N))/C(NM1)
18934               IF (NM2 .LT. 1) GO TO 70
18935               DO 60 KB = 1, NM2
18936                  K = NM2 - KB + 1
18937                  B(K) = (B(K) - D(K)*B(K+1) - E(K)*B(K+2))/C(K)
18938   60          CONTINUE
18939   70          CONTINUE
18940   80       CONTINUE
18941   90    CONTINUE
18942  100 CONTINUE
18943C
18944      RETURN
18945      END
18946      SUBROUTINE SHANDI(Y,N,IWRITE,RIGHT,TEMP1,TEMP2,ICASE1,ICASE2,
18947     1                  IBUGA3,ISUBRO,IERROR)
18948C
18949C     PURPOSE--THIS SUBROUTINE COMPUTES THE SHANNON DIVERSITY INDEX.
18950C
18951C              THE FOLLOWING CASES ARE SUPPORTED:
18952C
18953C              1) IF ICASE1 = 'RAW', THEN "Y" IS A GROUP-ID VARIABLE.
18954C                 DATAPLOT WILL GENERATE A FREQUENCY TABLE FOR THE
18955C                 GROUPS AND THEN COMPUTE THE SHANNON DIVERSITY INDEX AS
18956C
18957C                     H = {N*LOG(N) - SUM[i=1 to K][F(i)*LOG(F(i))]}/N
18958C
18959C                 WHERE N IS THE COUNT OVER ALL GROUPS, K IS THE NUMBER OF
18960C                 GROUPS, AND F(I) IS THE FREQUENCY OF THE I-TH GROUP.
18961C
18962C                 THIS STATISTIC IS THEN NORMALIZED BY DIVIDING BY LOG(K).
18963C
18964C             2) IF ICASE1 = 'SUMMARY', THEN
18965C
18966C                a) SUM THE VALUES IN Y.  IF THIS SUM EQUALS 1, THEN ASSUME
18967C                   THAT Y DENOTES THE PROPORTIONS FOR EACH GROUP AND
18968C                   COMPUTE THE STATISTIC AS
18969C
18970C                        H = -SUM[i=1 to K][P(i)*LOG(P(i))]
18971C
18972C                b) IF THE SUM IS NOT EQUAL TO 1, THEN ASSUME THAT Y DENOTES
18973C                   THE COUNTS FOR EACH GROUP AND COMPUTE THE STATISTIC AS
18974C                   FOR THE RAW CASE (I.E., JUST SKIP THE BINNING STEP).
18975C
18976C     INPUT  ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR OF OBSERVATIONS.
18977C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
18978C                                IN THE VECTOR Y.
18979C     OUTPUT ARGUMENTS--RIGHT  = THE SINGLE PRECISION VALUE OF THE
18980C                                COMPUTED SHANNON DIVERSITY INDEX.
18981C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
18982C             SAMPLE SHANNON DIVERSITY INDEX.
18983C     REFERENCE--BRANI VIDAKOVIC (2011), "STATISTICS FOR
18984C                BIOENGINEERING SCIENCES: WITH MATLAB AND WINBUGS
18985C                SUPPORT", SPRINGER, P. 23.
18986C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
18987C                   OF N FOR THIS SUBROUTINE.
18988C     OTHER DATAPAC   SUBROUTINES NEEDED--FREQUE.
18989C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
18990C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
18991C     LANGUAGE--ANSI FORTRAN (1977)
18992C     WRITTEN BY--ALAN HECKERT
18993C                 STATISTICAL ENGINEERING DIVISION
18994C                 INFORMATION TECHNOLOGY LABORATORY
18995C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18996C                 GAITHERSBURG, MD 20899-8980
18997C                 PHONE--301-975-2899
18998C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18999C           OF THE NATIONAL BUREAU OF STANDARDS.
19000C     LANGUAGE--ANSI FORTRAN (1977)
19001C     VERSION NUMBER--2011/12
19002C     ORIGINAL VERSION--DECEMBER  2011.
19003C
19004C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19005C
19006      CHARACTER*4 IWRITE
19007      CHARACTER*4 ICASE1
19008      CHARACTER*4 ICASE2
19009      CHARACTER*4 IBUGA3
19010      CHARACTER*4 ISUBRO
19011      CHARACTER*4 IERROR
19012C
19013      CHARACTER*4 ISUBN1
19014      CHARACTER*4 ISUBN2
19015C
19016      DOUBLE PRECISION DSUM
19017      DOUBLE PRECISION DSUM2
19018      DOUBLE PRECISION DTERM1
19019      DOUBLE PRECISION DYI
19020      DOUBLE PRECISION EPS
19021C
19022C---------------------------------------------------------------------
19023C
19024      DIMENSION Y(*)
19025      DIMENSION TEMP1(*)
19026      DIMENSION TEMP2(*)
19027C
19028C-----COMMON----------------------------------------------------------
19029C
19030      INCLUDE 'DPCOP2.INC'
19031C
19032      DATA EPS /1.0D-12/
19033C
19034C-----START POINT-----------------------------------------------------
19035C
19036      ISUBN1='SHAN'
19037      ISUBN2='DI  '
19038      IERROR='NO'
19039      RIGHT=CPUMIN
19040C
19041      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANDI')THEN
19042        WRITE(ICOUT,999)
19043  999   FORMAT(1X)
19044        CALL DPWRST('XXX','BUG ')
19045        WRITE(ICOUT,51)
19046   51   FORMAT('***** AT THE BEGINNING OF SHANDI--')
19047        CALL DPWRST('XXX','BUG ')
19048        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
19049   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
19050        CALL DPWRST('XXX','BUG ')
19051        DO55I=1,N
19052          WRITE(ICOUT,56)I,Y(I)
19053   56     FORMAT('I,Y(I) = ',I8,G15.7)
19054          CALL DPWRST('XXX','BUG ')
19055   55   CONTINUE
19056      ENDIF
19057C
19058C               ********************************************
19059C               **  STEP 1--                              **
19060C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
19061C               ********************************************
19062C
19063      IF(N.LT.1)THEN
19064        IERROR='YES'
19065        WRITE(ICOUT,999)
19066        CALL DPWRST('XXX','BUG ')
19067        WRITE(ICOUT,111)
19068  111   FORMAT('***** ERROR IN SHANNON DIVERSITY INDEX--')
19069        CALL DPWRST('XXX','BUG ')
19070        WRITE(ICOUT,112)
19071  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
19072        CALL DPWRST('XXX','BUG ')
19073        WRITE(ICOUT,113)
19074  113   FORMAT('      VARIABLES IS NON-POSITIVE.')
19075        CALL DPWRST('XXX','BUG ')
19076        WRITE(ICOUT,117)N
19077  117   FORMAT('      THE NUMBER OF OBSERVATIONS      = ',I8)
19078        CALL DPWRST('XXX','BUG ')
19079        GOTO9000
19080      ENDIF
19081C
19082      IF(ICASE1.EQ.'RAW')THEN
19083        NUMVAR=1
19084        ND=0
19085        CALL FREQUE(Y,N,TEMP1,ND,NUMVAR,IWRITE,
19086     1              TEMP2,K,IBUGA3,IERROR)
19087        IF(IERROR.EQ.'YES')GOTO9000
19088        DSUM=0.0D0
19089        DSUM2=0.0D0
19090        DO1210I=1,K
19091          ITEMP=INT(TEMP2(I)+0.5)
19092          IF(ITEMP.GT.0)THEN
19093            DYI=DBLE(ITEMP)
19094            DSUM=DSUM + DYI*DLOG(DYI)
19095            DSUM2=DSUM2 + DBLE(ITEMP)
19096          ENDIF
19097 1210   CONTINUE
19098        IF(DSUM2.LE.0.0D0)THEN
19099          IERROR='YES'
19100          WRITE(ICOUT,999)
19101          CALL DPWRST('XXX','BUG ')
19102          WRITE(ICOUT,111)
19103          CALL DPWRST('XXX','BUG ')
19104          WRITE(ICOUT,1212)
19105 1212     FORMAT('      THE TOTAL FREQUENCY COUNT WAS NON-POSITIVE.')
19106          CALL DPWRST('XXX','BUG ')
19107          GOTO9000
19108        ELSE
19109          DTERM1=(DSUM2*DLOG(DSUM2) - DSUM)/DSUM2
19110          IF(ICASE2.EQ.'EQUI')THEN
19111            RIGHT=REAL(DTERM1)/DBLE(K)
19112          ELSE
19113            RIGHT=REAL(DTERM1)
19114          ENDIF
19115        ENDIF
19116      ELSE
19117        DSUM=0.0D0
19118        DO2000I=1,N
19119          IF(Y(I).LT.0.0)THEN
19120            IERROR='YES'
19121            WRITE(ICOUT,999)
19122            CALL DPWRST('XXX','BUG ')
19123            WRITE(ICOUT,111)
19124            CALL DPWRST('XXX','BUG ')
19125            WRITE(ICOUT,2012)
19126 2012       FORMAT('      A NEGATIVE PROPORTION OR COUNT WAS ',
19127     1             'ENCOUNTERED.')
19128            CALL DPWRST('XXX','BUG ')
19129            WRITE(ICOUT,2013)I,Y(I)
19130 2013       FORMAT('      ROW ',I8,' = ',G15.7)
19131            CALL DPWRST('XXX','BUG ')
19132            GOTO9000
19133          ENDIF
19134          DSUM=DSUM + DBLE(Y(I))
19135 2000   CONTINUE
19136C
19137        IF(DABS(DSUM - 1.0D0).LE.EPS)THEN
19138          DSUM=0.0D0
19139          DO2110I=1,N
19140            IF(Y(I).GT.0.0)THEN
19141              DYI=DBLE(Y(I))
19142              DSUM=DSUM + DYI*DLOG(DYI)
19143            ENDIF
19144 2110     CONTINUE
19145          IF(ICASE2.EQ.'EQUI')THEN
19146            RIGHT=-REAL(DSUM)/LOG(REAL(N))
19147          ELSE
19148            RIGHT=-REAL(DSUM)
19149          ENDIF
19150        ELSE
19151          DSUM=0.0D0
19152          DSUM2=0.0D0
19153          DO2210I=1,N
19154            ITEMP=INT(Y(I)+0.5)
19155            IF(ITEMP.GT.0)THEN
19156              DYI=DBLE(ITEMP)
19157              DSUM=DSUM + DYI*DLOG(DYI)
19158              DSUM2=DSUM2 + DBLE(ITEMP)
19159            ENDIF
19160 2210     CONTINUE
19161          IF(DSUM2.LE.0.0D0)THEN
19162            IERROR='YES'
19163            WRITE(ICOUT,999)
19164            CALL DPWRST('XXX','BUG ')
19165            WRITE(ICOUT,111)
19166            CALL DPWRST('XXX','BUG ')
19167            WRITE(ICOUT,2212)
19168 2212       FORMAT('      THE TOTAL FREQUENCY COUNT WAS NON-POSITIVE.')
19169            CALL DPWRST('XXX','BUG ')
19170            GOTO9000
19171          ELSE
19172            DTERM1=(DSUM2*DLOG(DSUM2) - DSUM)/DSUM2
19173            IF(ICASE2.EQ.'EQUI')THEN
19174              RIGHT=REAL(DTERM1)/LOG(REAL(N))
19175            ELSE
19176              RIGHT=REAL(DTERM1)
19177            ENDIF
19178          ENDIF
19179        ENDIF
19180      ENDIF
19181C
19182C               *******************************
19183C               **  STEP 3--                 **
19184C               **  WRITE OUT A LINE         **
19185C               **  OF SUMMARY INFORMATION.  **
19186C               *******************************
19187C
19188      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
19189        WRITE(ICOUT,999)
19190        CALL DPWRST('XXX','BUG ')
19191        WRITE(ICOUT,811)RIGHT
19192  811   FORMAT('THE SHANNON DIVERSITY INDEX = ',G15.7)
19193        CALL DPWRST('XXX','BUG ')
19194      ENDIF
19195C
19196C               *****************
19197C               **  STEP 90--  **
19198C               **  EXIT.      **
19199C               *****************
19200C
19201 9000 CONTINUE
19202      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ANDI')THEN
19203        WRITE(ICOUT,999)
19204        CALL DPWRST('XXX','BUG ')
19205        WRITE(ICOUT,9011)
19206 9011   FORMAT('***** AT THE END       OF SHANDI--')
19207        CALL DPWRST('XXX','BUG ')
19208      ENDIF
19209C
19210      RETURN
19211      END
19212      SUBROUTINE SHMIDM(X,N,IWRITE,XTEMP,MAXNXT,XMIDM,
19213     1                  ISUBRO,IBUGA3,IERROR)
19214C
19215C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE SHORTEST HALF
19216C              MIDMEAN.  THE FORMULA FOR THIS STATISTIC IS
19217C
19218C                   M = SUM[i=k to k+m][X(i)]/m   FOR THE MINIMUM
19219C                                                 (X(k+m) - X(k))
19220C                       m = n/2              n ODD
19221C                       m = INT(n/2) + 1     n EVEN
19222C
19223C              THIS IS ESSENTIALLY AN ASYMETRIC VERSION OF THE MID-MEAN.
19224C              ALTHOUGH IT HAS RATHER LOW EFFICIENY (LOWER THAN THE
19225C              MEDIAN), IT IS LESS SENSITIVE TO ASYMMETRICALLY
19226C              DISTRIBUTED OUTLIERS.
19227C
19228C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
19229C                                (UNSORTED OR SORTED) OBSERVATIONS.
19230C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
19231C                                IN THE VECTOR X.
19232C     OUTPUT ARGUMENTS--XMIDM  = THE SINGLE PRECISION VALUE OF THE
19233C                                COMPUTED SAMPLE SHORTEST HALF MIDMEAN.
19234C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SAMPLE SHMIDMN.
19235C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT.
19236C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
19237C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19238C     LANGUAGE--ANSI FORTRAN (1977)
19239C     REFERENCES--DAVID DUEWER (2008), "A COMPARISON OF LOCATION
19240C                 ESTIMATORS FOR INTERLABORATORY DATA CONTAMINATED
19241C                 WITH VALUE AND UNCERTAINTY OUTLIERS",
19242C                 ACCREDITED QUALITY ASSURANCE, VOL. 13, PP. 193-216.
19243C     WRITTEN BY--ALAN HECKERT
19244C                 STATISTICAL ENGINEERING DIVISION
19245C                 INFORMATION TECHNOLOGY LABORATORY
19246C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19247C                 GAITHERSBURG, MD 20899-8980
19248C                 PHONE--301-975-2899
19249C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19250C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
19251C     LANGUAGE--ANSI FORTRAN (1977)
19252C     VERSION NUMBER--2017.02
19253C     ORIGINAL VERSION--FEBRUARY  2017.
19254C
19255C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19256C
19257      CHARACTER*4 IWRITE
19258      CHARACTER*4 ISUBRO
19259      CHARACTER*4 IBUGA3
19260      CHARACTER*4 IERROR
19261C
19262      CHARACTER*4 ISUBN1
19263      CHARACTER*4 ISUBN2
19264C
19265C---------------------------------------------------------------------
19266C
19267      DOUBLE PRECISION DK
19268      DOUBLE PRECISION DX
19269      DOUBLE PRECISION DSUM
19270C
19271      DIMENSION X(*)
19272      DIMENSION XTEMP(*)
19273C
19274C-----COMMON----------------------------------------------------------
19275C
19276      INCLUDE 'DPCOP2.INC'
19277C
19278C-----START POINT-----------------------------------------------------
19279C
19280      ISUBN1='SHMI'
19281      ISUBN2='DM  '
19282      IERROR='NO'
19283      XMIDM=CPUMIN
19284C
19285      IF(IBUGA3.EQ.'ON')THEN
19286        WRITE(ICOUT,999)
19287  999   FORMAT(1X)
19288        CALL DPWRST('XXX','BUG ')
19289        WRITE(ICOUT,51)
19290   51   FORMAT('***** AT THE BEGINNING OF SHMIDM--')
19291        CALL DPWRST('XXX','BUG ')
19292        WRITE(ICOUT,52)ISUBRO,IBUGA3,N
19293   52   FORMAT('ISUBRO,IBUGA3,N = ',2(A4,2X),I8)
19294        CALL DPWRST('XXX','BUG ')
19295        DO55I=1,N
19296          WRITE(ICOUT,56)I,X(I)
19297   56     FORMAT('I,X(I) = ',I8,G15.7)
19298          CALL DPWRST('XXX','BUG ')
19299   55   CONTINUE
19300      ENDIF
19301C
19302C               ***********************
19303C               **  COMPUTE SHMIDMN  **
19304C               ***********************
19305C
19306C               ********************************************
19307C               **  STEP 1--                              **
19308C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
19309C               ********************************************
19310C
19311      AN=N
19312C
19313      IF(N.LT.1 .OR. N.GT.MAXNXT)THEN
19314        IERROR='YES'
19315        WRITE(ICOUT,999)
19316        CALL DPWRST('XXX','BUG ')
19317        WRITE(ICOUT,111)
19318  111   FORMAT('***** ERROR IN SHORTEST HALF MIDMEAN--')
19319        CALL DPWRST('XXX','BUG ')
19320        WRITE(ICOUT,112)
19321  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE')
19322        CALL DPWRST('XXX','BUG ')
19323        WRITE(ICOUT,115)MAXNXT
19324  115   FORMAT('      MUST BE BETWEEN 1 AND ',I8,' (INCLUSIVELY).')
19325        CALL DPWRST('XXX','BUG ')
19326        WRITE(ICOUT,116)
19327  116   FORMAT('      SUCH WAS NOT THE CASE HERE.')
19328        CALL DPWRST('XXX','BUG ')
19329        WRITE(ICOUT,117)N
19330  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,'.')
19331        CALL DPWRST('XXX','BUG ')
19332        GOTO9000
19333      ENDIF
19334C
19335      IF(N.EQ.1)THEN
19336        XMIDM=X(1)
19337        GOTO800
19338      ELSEIF(N.EQ.2)THEN
19339        XMIDM=(X(1)+X(2))/2.0
19340        GOTO800
19341      ELSEIF(N.EQ.3)THEN
19342        XMIDM=(X(1)+X(2)+X(3))/3.0
19343        GOTO800
19344      ENDIF
19345C
19346      HOLD=X(1)
19347      DO135I=2,N
19348        IF(X(I).NE.HOLD)GOTO139
19349  135 CONTINUE
19350      XMIDM=HOLD
19351      GOTO800
19352  139 CONTINUE
19353C
19354C               ****************************
19355C               **  STEP 2--              **
19356C               **  COMPUTE THE SHMIDMN.  **
19357C               ****************************
19358C
19359      CALL SORT(X,N,XTEMP)
19360C
19361C     FIND K
19362C
19363      M=(N/2)
19364      IF(MOD(N,2).EQ.1)M=M+1
19365      NLAST=N-M
19366      DIFF=XTEMP(1+M)-XTEMP(1)
19367      K=1
19368      DO200I=2,NLAST
19369        HOLD=XTEMP(I+M) - XTEMP(I)
19370        IF(HOLD.LT.DIFF)THEN
19371          DIFF=HOLD
19372          K=I
19373        ENDIF
19374  200 CONTINUE
19375C
19376      DSUM=0.0
19377      DO210I=K,K+M
19378        DX=XTEMP(I)
19379        DSUM=DSUM+DX
19380  210 CONTINUE
19381      DK=DBLE(M+1)
19382      XMIDM=DSUM/DK
19383C
19384C               *******************************
19385C               **  STEP 3--                 **
19386C               **  WRITE OUT A LINE         **
19387C               **  OF SUMMARY INFORMATION.  **
19388C               *******************************
19389C
19390  800 CONTINUE
19391      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
19392        WRITE(ICOUT,999)
19393        CALL DPWRST('XXX','BUG ')
19394        WRITE(ICOUT,821)N,XMIDM
19395  821   FORMAT('THE SHORTEST HALF MIDMEAN OF THE ',I8,
19396     1         ' OBSERVATIONS = ',G15.7)
19397        CALL DPWRST('XXX','BUG ')
19398      ENDIF
19399C
19400C               *****************
19401C               **  STEP 90--  **
19402C               **  EXIT.      **
19403C               *****************
19404C
19405 9000 CONTINUE
19406      IF(IBUGA3.EQ.'ON')THEN
19407        WRITE(ICOUT,999)
19408        CALL DPWRST('XXX','BUG ')
19409        WRITE(ICOUT,9011)
19410 9011   FORMAT('***** AT THE END       OF SHMIDM--')
19411        CALL DPWRST('XXX','BUG ')
19412        WRITE(ICOUT,9012)IBUGA3,IERROR,K,M,XMIIDM
19413 9012   FORMAT('IBUGA3,IERROR,K,M,XMIDM = ',2(A4,2X),2I8,G15.7)
19414        CALL DPWRST('XXX','BUG ')
19415      ENDIF
19416C
19417      RETURN
19418      END
19419      SUBROUTINE SHMIDR(X,N,IWRITE,XTEMP,MAXNXT,XMIDR,
19420     1                  ISUBRO,IBUGA3,IERROR)
19421C
19422C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE SHORTEST HALF
19423C              MIDRANGE.  THE FORMULA FOR THIS STATISTIC IS
19424C
19425C                   SHMIDRM = (X(k) + X(k+m))/2   FOR THE MINIMUM
19426C                                                 (X(k+m) - X(k))
19427C                       m = n/2              n ODD
19428C                       m = INT(n/2) + 1     n EVEN
19429C
19430C              THIS IS ESSENTIALLY AN ASYMETRIC VERSION OF THE MID-RANGE.
19431C              ALTHOUGH IT HAS RATHER LOW EFFICIENY (LOWER THAN THE
19432C              MEDIAN), IT IS LESS SENSITIVE TO ASYMMETRICALLY
19433C              DISTRIBUTED OUTLIERS.
19434C
19435C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
19436C                                (UNSORTED OR SORTED) OBSERVATIONS.
19437C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
19438C                                IN THE VECTOR X.
19439C     OUTPUT ARGUMENTS--XMIDR  = THE SINGLE PRECISION VALUE OF THE
19440C                                COMPUTED SAMPLE SHORTEST HALF MIDRANGE.
19441C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SAMPLE SHMIDR.
19442C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT.
19443C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
19444C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19445C     LANGUAGE--ANSI FORTRAN (1977)
19446C     REFERENCES--DAVID DUEWER (2008), "A COMPARISON OF LOCATION
19447C                 ESTIMATORS FOR INTERLABORATORY DATA CONTAMINATED
19448C                 WITH VALUE AND UNCERTAINTY OUTLIERS",
19449C                 ACCREDITED QUALITY ASSURANCE, VOL. 13, PP. 193-216.
19450C     WRITTEN BY--ALAN HECKERT
19451C                 STATISTICAL ENGINEERING DIVISION
19452C                 INFORMATION TECHNOLOGY LABORATORY
19453C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19454C                 GAITHERSBURG, MD 20899-8980
19455C                 PHONE--301-975-2899
19456C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19457C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
19458C     LANGUAGE--ANSI FORTRAN (1977)
19459C     VERSION NUMBER--2017.02
19460C     ORIGINAL VERSION--FEBRUARY  2017.
19461C
19462C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19463C
19464      CHARACTER*4 IWRITE
19465      CHARACTER*4 ISUBRO
19466      CHARACTER*4 IBUGA3
19467      CHARACTER*4 IERROR
19468C
19469      CHARACTER*4 ISUBN1
19470      CHARACTER*4 ISUBN2
19471C
19472C---------------------------------------------------------------------
19473C
19474      DIMENSION X(*)
19475      DIMENSION XTEMP(*)
19476C
19477C-----COMMON----------------------------------------------------------
19478C
19479      INCLUDE 'DPCOP2.INC'
19480C
19481C-----START POINT-----------------------------------------------------
19482C
19483      ISUBN1='SHMI'
19484      ISUBN2='DR  '
19485      IERROR='NO'
19486      XMIDR=CPUMIN
19487C
19488      IF(IBUGA3.EQ.'ON')THEN
19489        WRITE(ICOUT,999)
19490  999   FORMAT(1X)
19491        CALL DPWRST('XXX','BUG ')
19492        WRITE(ICOUT,51)
19493   51   FORMAT('***** AT THE BEGINNING OF SHMIDR--')
19494        CALL DPWRST('XXX','BUG ')
19495        WRITE(ICOUT,52)ISUBRO,IBUGA3,N
19496   52   FORMAT('ISUBRO,IBUGA3,N = ',2(A4,2X),I8)
19497        CALL DPWRST('XXX','BUG ')
19498        DO55I=1,N
19499          WRITE(ICOUT,56)I,X(I)
19500   56     FORMAT('I,X(I) = ',I8,G15.7)
19501          CALL DPWRST('XXX','BUG ')
19502   55   CONTINUE
19503      ENDIF
19504C
19505C               ***********************
19506C               **  COMPUTE SHMIDRN  **
19507C               ***********************
19508C
19509C               ********************************************
19510C               **  STEP 1--                              **
19511C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
19512C               ********************************************
19513C
19514      AN=N
19515C
19516      IF(N.LT.1 .OR. N.GT.MAXNXT)THEN
19517        IERROR='YES'
19518        WRITE(ICOUT,999)
19519        CALL DPWRST('XXX','BUG ')
19520        WRITE(ICOUT,111)
19521  111   FORMAT('***** ERROR IN SHORTEST HALF MIDRANGE--')
19522        CALL DPWRST('XXX','BUG ')
19523        WRITE(ICOUT,112)
19524  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE')
19525        CALL DPWRST('XXX','BUG ')
19526        WRITE(ICOUT,115)MAXNXT
19527  115   FORMAT('      MUST BE BETWEEN 1 AND ',I8,' (INCLUSIVELY).')
19528        CALL DPWRST('XXX','BUG ')
19529        WRITE(ICOUT,116)
19530  116   FORMAT('      SUCH WAS NOT THE CASE HERE.')
19531        CALL DPWRST('XXX','BUG ')
19532        WRITE(ICOUT,117)N
19533  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,'.')
19534        CALL DPWRST('XXX','BUG ')
19535        GOTO9000
19536      ENDIF
19537C
19538      IF(N.EQ.1)THEN
19539        XMIDR=X(1)
19540        GOTO800
19541      ELSEIF(N.EQ.2)THEN
19542        XMIDR=(X(1)+X(2))/2.0
19543        GOTO800
19544      ELSEIF(N.EQ.3)THEN
19545        XMIDR=(X(1)+X(2)+X(3))/3.0
19546        GOTO800
19547      ENDIF
19548C
19549      HOLD=X(1)
19550      DO135I=2,N
19551        IF(X(I).NE.HOLD)GOTO139
19552  135 CONTINUE
19553      XMIDR=HOLD
19554      GOTO800
19555  139 CONTINUE
19556C
19557C               ****************************
19558C               **  STEP 2--              **
19559C               **  COMPUTE THE SHMIDRN.  **
19560C               ****************************
19561C
19562      CALL SORT(X,N,XTEMP)
19563C
19564C     FIND K
19565C
19566      M=(N/2)
19567      IF(MOD(N,2).EQ.1)M=M+1
19568      NLAST=N-M
19569      DIFF=XTEMP(1+M)-XTEMP(1)
19570      K=1
19571      DO200I=2,NLAST
19572        HOLD=XTEMP(I+M) - XTEMP(I)
19573        IF(HOLD.LT.DIFF)THEN
19574          DIFF=HOLD
19575          K=I
19576        ENDIF
19577  200 CONTINUE
19578C
19579      XMIDR=(XTEMP(K) + XTEMP(K+M))/2.0
19580C
19581C               *******************************
19582C               **  STEP 3--                 **
19583C               **  WRITE OUT A LINE         **
19584C               **  OF SUMMARY INFORMATION.  **
19585C               *******************************
19586C
19587  800 CONTINUE
19588      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
19589        WRITE(ICOUT,999)
19590        CALL DPWRST('XXX','BUG ')
19591        WRITE(ICOUT,821)N,XMIDR
19592  821   FORMAT('THE SHORTEST HALF MIDRANGE OF THE ',I8,
19593     1         ' OBSERVATIONS = ',G15.7)
19594        CALL DPWRST('XXX','BUG ')
19595      ENDIF
19596C
19597C               *****************
19598C               **  STEP 90--  **
19599C               **  EXIT.      **
19600C               *****************
19601C
19602 9000 CONTINUE
19603      IF(IBUGA3.EQ.'ON')THEN
19604        WRITE(ICOUT,999)
19605        CALL DPWRST('XXX','BUG ')
19606        WRITE(ICOUT,9011)
19607 9011   FORMAT('***** AT THE END       OF SHMIDR--')
19608        CALL DPWRST('XXX','BUG ')
19609        WRITE(ICOUT,9012)IBUGA3,IERROR,K,M,XMIIDM
19610 9012   FORMAT('IBUGA3,IERROR,K,M,XMIDR = ',2(A4,2X),2I8,G15.7)
19611        CALL DPWRST('XXX','BUG ')
19612      ENDIF
19613C
19614      RETURN
19615      END
19616      SUBROUTINE SIMPDI(Y,N,IWRITE,RIGHT,TEMP1,TEMP2,ICASE1,
19617     1                  IBUGA3,ISUBRO,IERROR)
19618C
19619C     PURPOSE--THIS SUBROUTINE COMPUTES THE SIMPSON DIVERSITY INDEX.
19620C
19621C              THE FOLLOWING CASES ARE SUPPORTED:
19622C
19623C              1) IF ICASE1 = 'RAW', THEN "Y" IS A GROUP-ID VARIABLE.
19624C                 DATAPLOT WILL GENERATE A FREQUENCY TABLE FOR THE
19625C                 GROUPS AND THEN COMPUTE THE SIMPSON DIVERSITY INDEX AS
19626C
19627C                     D = SUM[i=1 TO K][(F(i)/N)**2]
19628C
19629C                 WHERE N IS THE COUNT OVER ALL GROUPS, K IS THE NUMBER OF
19630C                 GROUPS, AND F(i) IS THE FREQUENCY OF THE i-TH GROUP.
19631C
19632C             2) IF ICASE1 = 'SUMMARY', THEN
19633C
19634C                a) SUM THE VALUES IN Y.  IF THIS SUM EQUALS 1, THEN ASSUME
19635C                   THAT Y DENOTES THE PROPORTIONS FOR EACH GROUP AND
19636C                   COMPUTE THE STATISTIC AS
19637C
19638C                        D = SUM[i=1 TO K][P(i)**2]
19639C
19640C                b) IF THE SUM IS NOT EQUAL TO 1, THEN ASSUME THAT Y
19641C                   DENOTES THE COUNTS FOR EACH GROUP AND COMPUTE THE
19642C                   STATISTIC AS FOR THE RAW CASE (I.E., JUST SKIP THE
19643C                   BINNING STEP).
19644C
19645C     INPUT  ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR OF OBSERVATIONS.
19646C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
19647C                                IN THE VECTOR Y.
19648C     OUTPUT ARGUMENTS--RIGHT  = THE SINGLE PRECISION VALUE OF THE
19649C                                COMPUTED SIMPSON DIVERSITY INDEX.
19650C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
19651C             SAMPLE SIMPSON DIVERSITY INDEX.
19652C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
19653C                   OF N FOR THIS SUBROUTINE.
19654C     OTHER DATAPAC   SUBROUTINES NEEDED--FREQUE.
19655C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
19656C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19657C     LANGUAGE--ANSI FORTRAN (1977)
19658C     WRITTEN BY--ALAN HECKERT
19659C                 STATISTICAL ENGINEERING DIVISION
19660C                 INFORMATION TECHNOLOGY LABORATORY
19661C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19662C                 GAITHERSBURG, MD 20899-8980
19663C                 PHONE--301-975-2899
19664C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19665C           OF THE NATIONAL BUREAU OF STANDARDS.
19666C     LANGUAGE--ANSI FORTRAN (1977)
19667C     VERSION NUMBER--2011/12
19668C     ORIGINAL VERSION--DECEMBER  2011.
19669C
19670C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19671C
19672      CHARACTER*4 IWRITE
19673      CHARACTER*4 ICASE1
19674      CHARACTER*4 IBUGA3
19675      CHARACTER*4 ISUBRO
19676      CHARACTER*4 IERROR
19677C
19678      CHARACTER*4 ISUBN1
19679      CHARACTER*4 ISUBN2
19680C
19681      DOUBLE PRECISION DSUM
19682      DOUBLE PRECISION DSUM2
19683      DOUBLE PRECISION DTERM1
19684      DOUBLE PRECISION DYI
19685      DOUBLE PRECISION EPS
19686C
19687C---------------------------------------------------------------------
19688C
19689      DIMENSION Y(*)
19690      DIMENSION TEMP1(*)
19691      DIMENSION TEMP2(*)
19692C
19693C-----COMMON----------------------------------------------------------
19694C
19695      INCLUDE 'DPCOP2.INC'
19696C
19697      DATA EPS /1.0D-12/
19698C
19699C-----START POINT-----------------------------------------------------
19700C
19701      ISUBN1='SIMP'
19702      ISUBN2='DI  '
19703      IERROR='NO'
19704      RIGHT=CPUMIN
19705C
19706      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MPDI')THEN
19707        WRITE(ICOUT,999)
19708  999   FORMAT(1X)
19709        CALL DPWRST('XXX','BUG ')
19710        WRITE(ICOUT,51)
19711   51   FORMAT('***** AT THE BEGINNING OF SIMPDI--')
19712        CALL DPWRST('XXX','BUG ')
19713        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
19714   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
19715        CALL DPWRST('XXX','BUG ')
19716        DO55I=1,N
19717          WRITE(ICOUT,56)I,Y(I)
19718   56     FORMAT('I,Y(I) = ',I8,G15.7)
19719          CALL DPWRST('XXX','BUG ')
19720   55   CONTINUE
19721      ENDIF
19722C
19723C               ********************************************
19724C               **  STEP 1--                              **
19725C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
19726C               ********************************************
19727C
19728      IF(N.LT.1)THEN
19729        IERROR='YES'
19730        WRITE(ICOUT,999)
19731        CALL DPWRST('XXX','BUG ')
19732        WRITE(ICOUT,111)
19733  111   FORMAT('***** ERROR IN SIMPSON DIVERSITY INDEX--')
19734        CALL DPWRST('XXX','BUG ')
19735        WRITE(ICOUT,112)
19736  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
19737        CALL DPWRST('XXX','BUG ')
19738        WRITE(ICOUT,113)
19739  113   FORMAT('      VARIABLES IS NON-POSITIVE.')
19740        CALL DPWRST('XXX','BUG ')
19741        WRITE(ICOUT,117)N
19742  117   FORMAT('      THE NUMBER OF OBSERVATIONS      = ',I8)
19743        CALL DPWRST('XXX','BUG ')
19744        GOTO9000
19745      ENDIF
19746C
19747      IF(ICASE1.EQ.'RAW')THEN
19748        NUMVAR=1
19749        ND=0
19750        CALL FREQUE(Y,N,TEMP1,ND,NUMVAR,IWRITE,
19751     1              TEMP2,K,IBUGA3,IERROR)
19752        IF(IERROR.EQ.'YES')GOTO9000
19753        DSUM=0.0D0
19754        DSUM2=0.0D0
19755        DO1210I=1,K
19756          ITEMP=INT(TEMP2(I)+0.5)
19757          IF(ITEMP.GT.0)THEN
19758            DYI=DBLE(ITEMP)
19759            DSUM=DSUM + DYI**2
19760            DSUM2=DSUM2 + DBLE(ITEMP)
19761          ENDIF
19762 1210   CONTINUE
19763        IF(DSUM2.LE.0.0D0)THEN
19764          IERROR='YES'
19765          WRITE(ICOUT,999)
19766          CALL DPWRST('XXX','BUG ')
19767          WRITE(ICOUT,111)
19768          CALL DPWRST('XXX','BUG ')
19769          WRITE(ICOUT,1212)
19770 1212     FORMAT('      THE TOTAL FREQUENCY COUNT WAS NON-POSITIVE.')
19771          CALL DPWRST('XXX','BUG ')
19772          GOTO9000
19773        ELSE
19774          DTERM1=DSUM/DSUM2**2
19775          RIGHT=REAL(DTERM1)
19776        ENDIF
19777      ELSE
19778        DSUM=0.0D0
19779        DO2000I=1,N
19780          IF(Y(I).LT.0.0)THEN
19781            IERROR='YES'
19782            WRITE(ICOUT,999)
19783            CALL DPWRST('XXX','BUG ')
19784            WRITE(ICOUT,111)
19785            CALL DPWRST('XXX','BUG ')
19786            WRITE(ICOUT,2012)
19787 2012       FORMAT('      A NEGATIVE PROPORTION OR COUNT WAS ',
19788     1             'ENCOUNTERED.')
19789            CALL DPWRST('XXX','BUG ')
19790            WRITE(ICOUT,2013)I,Y(I)
19791 2013       FORMAT('      ROW ',I8,' = ',G15.7)
19792            CALL DPWRST('XXX','BUG ')
19793            GOTO9000
19794          ENDIF
19795          DSUM=DSUM + DBLE(Y(I))
19796 2000   CONTINUE
19797C
19798        IF(DABS(DSUM - 1.0D0).LE.EPS)THEN
19799          DSUM=0.0D0
19800          DO2110I=1,N
19801            IF(Y(I).GT.0.0)THEN
19802              DYI=DBLE(Y(I))
19803              DSUM=DSUM + DYI**2
19804            ENDIF
19805 2110     CONTINUE
19806          RIGHT=REAL(DSUM)
19807        ELSE
19808          DSUM=0.0D0
19809          DSUM2=0.0D0
19810          DO2210I=1,N
19811            ITEMP=INT(Y(I)+0.5)
19812            IF(ITEMP.GT.0)THEN
19813              DYI=DBLE(ITEMP)
19814              DSUM=DSUM + DYI**2
19815              DSUM2=DSUM2 + DBLE(ITEMP)
19816            ENDIF
19817 2210     CONTINUE
19818          IF(DSUM2.LE.0.0D0)THEN
19819            IERROR='YES'
19820            WRITE(ICOUT,999)
19821            CALL DPWRST('XXX','BUG ')
19822            WRITE(ICOUT,111)
19823            CALL DPWRST('XXX','BUG ')
19824            WRITE(ICOUT,2212)
19825 2212       FORMAT('      THE TOTAL FREQUENCY COUNT WAS NON-POSITIVE.')
19826            CALL DPWRST('XXX','BUG ')
19827            GOTO9000
19828          ELSE
19829            DTERM1=DSUM/DSUM2**2
19830            RIGHT=REAL(DTERM1)
19831          ENDIF
19832        ENDIF
19833      ENDIF
19834C
19835C               *******************************
19836C               **  STEP 3--                 **
19837C               **  WRITE OUT A LINE         **
19838C               **  OF SUMMARY INFORMATION.  **
19839C               *******************************
19840C
19841      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
19842        WRITE(ICOUT,999)
19843        CALL DPWRST('XXX','BUG ')
19844        WRITE(ICOUT,811)RIGHT
19845  811   FORMAT('THE SIMPSON DIVERSITY INDEX = ',G15.7)
19846        CALL DPWRST('XXX','BUG ')
19847      ENDIF
19848C
19849C               *****************
19850C               **  STEP 90--  **
19851C               **  EXIT.      **
19852C               *****************
19853C
19854 9000 CONTINUE
19855      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MPDI')THEN
19856        WRITE(ICOUT,999)
19857        CALL DPWRST('XXX','BUG ')
19858        WRITE(ICOUT,9011)
19859 9011   FORMAT('***** AT THE END       OF SIMPDI--')
19860        CALL DPWRST('XXX','BUG ')
19861      ENDIF
19862C
19863      RETURN
19864      END
19865      SUBROUTINE SHIFTC(X,N1,NSHIFT,MAXOBV,Y,N2,
19866     1                  ISUBRO,IBUGA3,IERROR)
19867C
19868C     PURPOSE--THIS SUBROUTINE SETS THE VECTOR Y EQUAL TO THE
19869C              VECTOR Y AND THEN CIRCULAR SHIFTS THE ELEMENTS IN Y
19870C              EITHER TO THE LEFT (IF NSHIFT < 0) OR TO THE RIGHT
19871C              (IF NSHIFT > 0).
19872C     INPUT  ARGUMENTS--X      = A SINGLE PRECISION VECTOR CONTAINING
19873C                                THE DATA TO BE SHIFTED.
19874C                     --N1     = THE INTEGER NUMBER OF OBSERVATIONS
19875C                                IN THE INPUT VECTOR.
19876C                     --NSHIFT = THE INTEGER NUMBER THAT SPECIFIES
19877C                                THE NUMBER OF ELEMENTS TO SHIFT
19878C     OUTPUT ARGUMENTS--Y      = THE OUTPUT ARRAY THAT WILL CONTAIN
19879C                                SHIFTED ELEMENTS.
19880C                     --N2     = THE NUMBER OF ELEMENTS IN THE OUTPUT
19881C                                ARRAY.
19882C     OUTPUT--THE COMPUTED SINGLE PRECISION ARRAY Y.
19883C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
19884C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
19885C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
19886C     LANGUAGE--ANSI FORTRAN (1977)
19887C     WRITTEN BY--JAMES J. FILLIBEN
19888C                 STATISTICAL ENGINEERING DIVISION
19889C                 INFORMATION TECHNOLOGY LABORATORY
19890C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19891C                 GAITHERSBURG, MD 20899-8980
19892C                 PHONE--301-975-2855
19893C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19894C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
19895C     LANGUAGE--ANSI FORTRAN (1977)
19896C     VERSION NUMBER--2009.6
19897C     ORIGINAL VERSION--JUNE      2009.
19898C
19899C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19900C
19901C
19902      INTEGER N1
19903      INTEGER N2
19904      INTEGER NSHIFT
19905      REAL X(*)
19906      REAL Y(*)
19907C
19908      CHARACTER*4 ISUBRO
19909      CHARACTER*4 IBUGA3
19910      CHARACTER*4 IERROR
19911C
19912      INCLUDE 'DPCOP2.INC'
19913C
19914C-----START POINT-----------------------------------------------------
19915C
19916      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTC')THEN
19917        WRITE(ICOUT,999)
19918  999   FORMAT(1X)
19919        CALL DPWRST('XXX','BUG ')
19920        WRITE(ICOUT,51)
19921   51   FORMAT('***** AT THE BEGINNING OF SHIFTC--')
19922        CALL DPWRST('XXX','BUG ')
19923        WRITE(ICOUT,52)IBUGA3,ISUBRO,N1,MAXOBV
19924   52   FORMAT('IBUGA3,ISUBRO,N1,MAXOBV = ',2(A4,2X),2I8)
19925        CALL DPWRST('XXX','BUG ')
19926        IF(N1.GT.0)THEN
19927          DO55I=1,N1
19928            WRITE(ICOUT,56)I,X(I)
19929   56       FORMAT('I,X(I) = ',I8,2X,G15.7)
19930            CALL DPWRST('XXX','BUG ')
19931   55     CONTINUE
19932        ENDIF
19933      ENDIF
19934C
19935      NTEMP=0
19936C
19937      IF(N1.LT.1)THEN
19938        WRITE(ICOUT,1011)
19939 1011   FORMAT('***** ERROR IN CIRCULAR SHIFT OPERATION--')
19940        CALL DPWRST('XXX','BUG ')
19941        WRITE(ICOUT,1013)N1
19942 1013   FORMAT('      THE NUMBER OF ELEMENTS IN THE INPUT VARIABLE ',
19943     1         'IS NON-POSITIVE.')
19944        CALL DPWRST('XXX','BUG ')
19945        IERROR='YES'
19946        GOTO9000
19947      ENDIF
19948C
19949      DO2000I=1,N1
19950        Y(I)=X(I)
19951 2000 CONTINUE
19952C
19953      IF(NSHIFT.GT.0)THEN
19954        DO2100I=1,N1
19955          IINDX=MOD(I+NSHIFT-1,N1)+1
19956          Y(IINDX)=X(I)
19957C
19958          IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTC')THEN
19959            WRITE(ICOUT,999)
19960            CALL DPWRST('XXX','BUG ')
19961            WRITE(ICOUT,2101)I,NSHIFT,IINDX
19962 2101       FORMAT('I,NSHIFT,IINDX=',3I8)
19963            CALL DPWRST('XXX','BUG ')
19964          ENDIF
19965C
19966 2100   CONTINUE
19967      ELSEIF(NSHIFT.LT.0)THEN
19968C
19969        IF(ABS(NTEMP).LE.N1)THEN
19970          NTEMP=NSHIFT
19971        ELSE
19972          NTEMP=MOD(ABS(NSHIFT),N1)
19973        ENDIF
19974C
19975        DO2200I=1,N1
19976          IINDX=MOD(I-NTEMP-1,N1)+1
19977          Y(I)=X(IINDX)
19978C
19979          IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTC')THEN
19980            WRITE(ICOUT,999)
19981            CALL DPWRST('XXX','BUG ')
19982            WRITE(ICOUT,2201)I,NSHIFT,IINDX
19983 2201       FORMAT('I,NSHIFT,IINDX=',3I8)
19984            CALL DPWRST('XXX','BUG ')
19985          ENDIF
19986C
199872200    CONTINUE
19988      ENDIF
19989C
19990      N2=N1
19991C
19992 9000 CONTINUE
19993      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTC')THEN
19994        WRITE(ICOUT,999)
19995        CALL DPWRST('XXX','BUG ')
19996        WRITE(ICOUT,9051)
19997 9051   FORMAT('***** AT THE END OF SHIFTC--')
19998        CALL DPWRST('XXX','BUG ')
19999        WRITE(ICOUT,9052)N2
20000 9052   FORMAT('N2 = ',I8)
20001        CALL DPWRST('XXX','BUG ')
20002        IF(N2.GT.0)THEN
20003          DO9055I=1,N2
20004            WRITE(ICOUT,9056)I,Y(I)
20005 9056       FORMAT('I,Y(I) = ',I8,2X,G15.7)
20006            CALL DPWRST('XXX','BUG ')
20007 9055     CONTINUE
20008        ENDIF
20009      ENDIF
20010C
20011      RETURN
20012      END
20013      SUBROUTINE SHIFTL(ISHIFT,IHARG,IHARG2,IARG,ARG,IARGT,NUMARG,
20014     1IBUGO2,IERROR)
20015C
20016C     PURPOSE--SHIFT TO THE LEFT (ONLY)
20017C              THE IHARG,IHARG2,IARG,ARG, AND IARGT VECTORS
20018C              AND ADJUST THE VALUE OF NUMARG ACCORDINGLY.
20019C              THE ADJUSTMENT RESULTS IN
20020C              ALL ELEMENTS BEING SHIFTED
20021C              ISHIFT STEPS TO THE LEFT.
20022C     WRITTEN BY--JAMES J. FILLIBEN
20023C                 STATISTICAL ENGINEERING DIVISION
20024C                 INFORMATION TECHNOLOGY LABORATORY
20025C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
20026C                 GAITHERSBURG, MD 20899-8980
20027C                 PHONE--301-975-2855
20028C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20029C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
20030C     LANGUAGE--ANSI FORTRAN (1977)
20031C     VERSION NUMBER--82/7
20032C     ORIGINAL VERSION--APRIL     1978.
20033C     UPDATED         --JUNE      1978.
20034C     UPDATED         --JANUARY   1981.
20035C     UPDATED         --JULY      1981.
20036C     UPDATED         --NOVEMBER  1981.
20037C     UPDATED         --MAY       1982.
20038C
20039C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20040C
20041      CHARACTER*4 IHARG
20042      CHARACTER*4 IHARG2
20043      CHARACTER*4 IARGT
20044C
20045      CHARACTER*4 IBUGO2
20046      CHARACTER*4 IERROR
20047C
20048C---------------------------------------------------------------------
20049C
20050      DIMENSION IHARG(*)
20051      DIMENSION IHARG2(*)
20052      DIMENSION IARG(*)
20053      DIMENSION ARG(*)
20054      DIMENSION IARGT(*)
20055C
20056C-----COMMON----------------------------------------------------------
20057C
20058      INCLUDE 'DPCOP2.INC'
20059C
20060C-----START POINT-----------------------------------------------------
20061C
20062      IERROR='NO'
20063C
20064      IF(IBUGO2.EQ.'OFF')GOTO90
20065      WRITE(ICOUT,999)
20066  999 FORMAT(1X)
20067      CALL DPWRST('XXX','BUG ')
20068      WRITE(ICOUT,51)
20069   51 FORMAT('***** AT THE BEGINNING OF SHIFTL--')
20070      CALL DPWRST('XXX','BUG ')
20071      WRITE(ICOUT,52)ISHIFT,NUMARG
20072   52 FORMAT('ISHIFT,NUMARG = ',2I8)
20073      CALL DPWRST('XXX','BUG ')
20074      DO55I=1,NUMARG
20075      WRITE(ICOUT,56)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
20076   56 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
20077     1I8,2X,A4,A4,I8,E15.7,2X,A4)
20078      CALL DPWRST('XXX','BUG ')
20079   55 CONTINUE
20080   90 CONTINUE
20081C
20082      IMIN=1
20083      IMAX=NUMARG-ISHIFT
20084      DO100I=IMIN,IMAX
20085      IPSHIF=I+ISHIFT
20086      IHARG(I)=IHARG(IPSHIF)
20087      IHARG2(I)=IHARG2(IPSHIF)
20088      IARG(I)=IARG(IPSHIF)
20089      ARG(I)=ARG(IPSHIF)
20090      IARGT(I)=IARGT(IPSHIF)
20091  100 CONTINUE
20092C
20093      DO200I=IMAX+1,NUMARG
20094      IHARG(I)='    '
20095      IHARG2(I)='    '
20096      IARG(I)=-1
20097      ARG(I)=CPUMIN
20098      IARGT(I)='    '
20099  200 CONTINUE
20100C
20101      NUMARG=IMAX
20102      GOTO9000
20103C
20104C               *****************
20105C               **  STEP 90--  **
20106C               **  EXIT       **
20107C               *****************
20108C
20109 9000 CONTINUE
20110      IF(IBUGO2.EQ.'OFF')GOTO9090
20111      WRITE(ICOUT,999)
20112      CALL DPWRST('XXX','BUG ')
20113      WRITE(ICOUT,9011)
20114 9011 FORMAT('***** AT THE END       OF SHIFTL--')
20115      CALL DPWRST('XXX','BUG ')
20116      WRITE(ICOUT,9012)ISHIFT,NUMARG
20117 9012 FORMAT('ISHIFT,NUMARG = ',2I8)
20118      CALL DPWRST('XXX','BUG ')
20119      WRITE(ICOUT,9013)IMIN,IMAX
20120 9013 FORMAT('IMIN,IMAX = ',2I8)
20121      CALL DPWRST('XXX','BUG ')
20122      DO9015I=1,NUMARG
20123      WRITE(ICOUT,9016)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
20124 9016 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
20125     1I8,2X,A4,A4,I8,E15.7,2X,A4)
20126      CALL DPWRST('XXX','BUG ')
20127 9015 CONTINUE
20128 9090 CONTINUE
20129C
20130      RETURN
20131      END
20132      SUBROUTINE SHIFTR(ISHIFT,IHARG,IHARG2,IARG,ARG,IARGT,NUMARG,
20133     1IBUGO2,IERROR)
20134C
20135C     PURPOSE--SHIFT TO THE RIGHT (ONLY)
20136C              THE IHARG,IHARG2,IARG,ARG, AND IARGT VECTORS
20137C              AND ADJUST THE VALUE OF NUMARG ACCORDINGLY.
20138C              THE ADJUSTMENT RESULTS IN
20139C              ALL ELEMENTS BEING SHIFTED
20140C              ISHIFT STEPS TO THE RIGHT.
20141C     WRITTEN BY--JAMES J. FILLIBEN
20142C                 STATISTICAL ENGINEERING DIVISION
20143C                 INFORMATION TECHNOLOGY LABORATORY
20144C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
20145C                 GAITHERSBURG, MD 20899-8980
20146C                 PHONE--301-975-2855
20147C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20148C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
20149C     LANGUAGE--ANSI FORTRAN (1977)
20150C     VERSION NUMBER--82/7
20151C     ORIGINAL VERSION--APRIL     1978.
20152C     UPDATED         --JUNE      1978.
20153C     UPDATED         --JANUARY   1981.
20154C     UPDATED         --JULY      1981.
20155C     UPDATED         --NOVEMBER  1981.
20156C     UPDATED         --MAY       1982.
20157C
20158C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20159C
20160      CHARACTER*4 IHARG
20161      CHARACTER*4 IHARG2
20162      CHARACTER*4 IARGT
20163C
20164      CHARACTER*4 IBUGO2
20165      CHARACTER*4 IERROR
20166C
20167C---------------------------------------------------------------------
20168C
20169      DIMENSION IHARG(*)
20170      DIMENSION IHARG2(*)
20171      DIMENSION IARG(*)
20172      DIMENSION ARG(*)
20173      DIMENSION IARGT(*)
20174C
20175C-----COMMON----------------------------------------------------------
20176C
20177      INCLUDE 'DPCOP2.INC'
20178C
20179C-----START POINT-----------------------------------------------------
20180C
20181      IERROR='NO'
20182C
20183      IF(IBUGO2.EQ.'OFF')GOTO90
20184      WRITE(ICOUT,999)
20185  999 FORMAT(1X)
20186      CALL DPWRST('XXX','BUG ')
20187      WRITE(ICOUT,51)
20188   51 FORMAT('***** AT THE BEGINNING OF SHIFTR--')
20189      CALL DPWRST('XXX','BUG ')
20190      WRITE(ICOUT,52)ISHIFT,NUMARG
20191   52 FORMAT('ISHIFT,NUMARG = ',2I8)
20192      CALL DPWRST('XXX','BUG ')
20193      DO55I=1,NUMARG
20194      WRITE(ICOUT,56)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
20195   56 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
20196     1I8,2X,A4,A4,I8,E15.7,2X,A4)
20197      CALL DPWRST('XXX','BUG ')
20198   55 CONTINUE
20199   90 CONTINUE
20200C
20201      IMIN=1+ISHIFT
20202      IMAX=NUMARG+ISHIFT
20203      DO100I=IMIN,IMAX
20204      IREV=IMAX-I+IMIN
20205      IREV2=IREV-ISHIFT
20206      IHARG(IREV)=IHARG(IREV2)
20207      IHARG2(IREV)=IHARG2(IREV2)
20208      IARG(IREV)=IARG(IREV2)
20209      ARG(IREV)=ARG(IREV2)
20210      IARGT(IREV)=IARGT(IREV2)
20211  100 CONTINUE
20212      NUMARG=IMAX
20213      GOTO9000
20214C
20215C               *****************
20216C               **  STEP 90--  **
20217C               **  EXIT       **
20218C               *****************
20219C
20220 9000 CONTINUE
20221      IF(IBUGO2.EQ.'OFF')GOTO9090
20222      WRITE(ICOUT,999)
20223      CALL DPWRST('XXX','BUG ')
20224      WRITE(ICOUT,9011)
20225 9011 FORMAT('***** AT THE END       OF SHIFTR--')
20226      CALL DPWRST('XXX','BUG ')
20227      WRITE(ICOUT,9012)ISHIFT,NUMARG
20228 9012 FORMAT('ISHIFT,NUMARG = ',2I8)
20229      CALL DPWRST('XXX','BUG ')
20230      DO9015I=1,NUMARG
20231      WRITE(ICOUT,9016)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
20232 9016 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
20233     1I8,2X,A4,A4,I8,E15.7,2X,A4)
20234      CALL DPWRST('XXX','BUG ')
20235 9015 CONTINUE
20236 9090 CONTINUE
20237C
20238      RETURN
20239      END
20240      SUBROUTINE SHIFTZ(X,N1,NSHIFT,MAXOBV,Y,N2,
20241     1                  ISUBRO,IBUGA3,IERROR)
20242C
20243C     PURPOSE--THIS SUBROUTINE SETS THE VECTOR Y EQUAL TO THE
20244C              VECTOR Y AND THEN SHIFTS THE ELEMENTS IN Y EITHER
20245C              TO THE LEFT (IF NSHIFT < 0) OR TO THE RIGHT
20246C              (IF NSHIFT > 0).
20247C     INPUT  ARGUMENTS--X      = A SINGLE PRECISION VECTOR CONTAINING
20248C                                THE DATA TO BE SHIFTED.
20249C                     --N1     = THE INTEGER NUMBER OF OBSERVATIONS
20250C                                IN THE INPUT VECTOR.
20251C                     --NSHIFT = THE INTEGER NUMBER THAT SPECIFIES
20252C                                THE NUMBER OF ELEMENTS TO SHIFT
20253C     OUTPUT ARGUMENTS--Y      = THE OUTPUT ARRAY THAT WILL CONTAIN
20254C                                SHIFTED ELEMENTS.
20255C                     --N2     = THE NUMBER OF ELEMENTS IN THE OUTPUT
20256C                                ARRAY.
20257C     OUTPUT--THE COMPUTED SINGLE PRECISION ARRAY Y.
20258C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
20259C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
20260C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
20261C     LANGUAGE--ANSI FORTRAN (1977)
20262C     WRITTEN BY--JAMES J. FILLIBEN
20263C                 STATISTICAL ENGINEERING DIVISION
20264C                 INFORMATION TECHNOLOGY LABORATORY
20265C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20266C                 GAITHERSBURG, MD 20899-8980
20267C                 PHONE--301-975-2855
20268C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20269C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20270C     LANGUAGE--ANSI FORTRAN (1977)
20271C     VERSION NUMBER--2009.2
20272C     ORIGINAL VERSION--FEBRUARY  2009.
20273C
20274C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20275C
20276C
20277      INTEGER N1
20278      INTEGER N2
20279      INTEGER NSHIFT
20280      REAL X(*)
20281      REAL Y(*)
20282C
20283      CHARACTER*4 ISUBRO
20284      CHARACTER*4 IBUGA3
20285      CHARACTER*4 IERROR
20286C
20287      INCLUDE 'DPCOP2.INC'
20288C
20289C-----START POINT-----------------------------------------------------
20290C
20291      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTZ')THEN
20292        WRITE(ICOUT,999)
20293  999   FORMAT(1X)
20294        CALL DPWRST('XXX','BUG ')
20295        WRITE(ICOUT,51)
20296   51   FORMAT('***** AT THE BEGINNING OF SHIFTZ--')
20297        CALL DPWRST('XXX','BUG ')
20298        WRITE(ICOUT,52)IBUGA3,ISUBRO,N1
20299   52   FORMAT('IBUGA3,ISUBRO,N1 = ',A4,2X,A4,2X,I8)
20300        CALL DPWRST('XXX','BUG ')
20301        IF(N1.GT.0)THEN
20302          DO55I=1,N1
20303            WRITE(ICOUT,56)I,X(I)
20304   56       FORMAT('I,X(I) = ',I8,2X,G15.7)
20305            CALL DPWRST('XXX','BUG ')
20306   55     CONTINUE
20307        ENDIF
20308      ENDIF
20309C
20310      IF(N1.LT.1)THEN
20311        WRITE(ICOUT,1011)
20312 1011   FORMAT('***** ERROR IN SHIFT OPERATION--')
20313        CALL DPWRST('XXX','BUG ')
20314        WRITE(ICOUT,1013)N1
20315 1013   FORMAT('      THE NUMBER OF ELEMENTS IN THE INPUT VARIABLE ',
20316     1         'IS NON-POSITIVE.')
20317        CALL DPWRST('XXX','BUG ')
20318        IERROR='YES'
20319        GOTO9000
20320      ENDIF
20321C
20322      DO2000I=1,N1
20323        Y(I)=X(I)
20324 2000 CONTINUE
20325C
20326      IF(NSHIFT.GT.0)THEN
20327        N2=NSHIFT
20328        DO2100I=1,N1
20329          N2=N2+1
20330C
20331          IF(N2.GT.MAXOBV)THEN
20332            WRITE(ICOUT,1011)
20333            CALL DPWRST('XXX','BUG ')
20334            WRITE(ICOUT,2113)
20335 2113       FORMAT('      THE MAXIMUM NUMBER OF ROWS FOR THE OUTPUT')
20336            CALL DPWRST('XXX','BUG ')
20337            WRITE(ICOUT,2115)
20338 2115       FORMAT('      VARIABLE HAS BEEN EXCEEDED.')
20339            CALL DPWRST('XXX','BUG ')
20340            IERROR='YES'
20341            GOTO9000
20342          ENDIF
20343C
20344          Y(N2)=X(I)
203452100    CONTINUE
20346      ELSEIF(NSHIFT.LT.0)THEN
20347        ICNT=0
20348        NSTRT=ABS(NSHIFT)+1
20349        DO2200I=NSTRT,N1
20350          ICNT=ICNT+1
20351          Y(ICNT)=X(I)
203522200    CONTINUE
20353        N2=N1
20354      ENDIF
20355C
20356 9000 CONTINUE
20357      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'IFTZ')THEN
20358        WRITE(ICOUT,999)
20359        CALL DPWRST('XXX','BUG ')
20360        WRITE(ICOUT,9051)
20361 9051   FORMAT('***** AT THE END OF SHIFTZ--')
20362        CALL DPWRST('XXX','BUG ')
20363        WRITE(ICOUT,9052)N2
20364 9052   FORMAT('N2 = ',I8)
20365        CALL DPWRST('XXX','BUG ')
20366        IF(N2.GT.0)THEN
20367          DO9055I=1,N1
20368            WRITE(ICOUT,9056)I,Y(I)
20369 9056       FORMAT('I,Y(I) = ',I8,2X,G15.7)
20370            CALL DPWRST('XXX','BUG ')
20371 9055     CONTINUE
20372        ENDIF
20373      ENDIF
20374C
20375      RETURN
20376      END
20377      SUBROUTINE SICIEI(IC,X,SI,CI,CII,EI,EXNEI,SHI,CHI,CHII,IERR)
20378C
20379C                         APPENDIX
20380C
20381C                   IMPLEMENTING PROGRAM
20382C LANGUAGE. AMERICAN NATIONAL STANDARD FORTRAN
20383C DEFINITIONS. X, A REAL VARIABLE
20384C     SI(X) =INTEGRAL(SIN T/T)DT FROM 0 TO X
20385C     SI(-X)=-SI(X)
20386C     CI(X) =GAMMA+LN X+INTEGRAL((COS T-1)/T)DT FROM 0 TO X
20387C     CI(-X)=CI(X)-I PI
20388C     EI(X) =-P.V.INTEGRAL(EXP(-T)/T)DT FROM -X TO INFINITY
20389C     EXNEI(X)=EXP(-X)*EI(X)                      (X .GT. 0)
20390C         INTEGRAL(EXP(-T)/T) DT FROM X TO INFINITY, OFTEN
20391C         DENOTED BY -EI(-X)=E1(X). (SEE AUTOMATIC COMPUTING
20392C         METHODS FOR SPECIAL FUNCTIONS, PART II. THE EXPO-
20393C         NENTIAL INTEGRAL EN(X), J. OF RESEARCH NBS, 78B,
20394C         OCTOBER-DECEMBER 1974, PP. 199-216.)
20395C     SHI(X) =INTEGRAL(SINH T/T)DT FROM 0 TO X
20396C     SHI(-X)=-SHI(X)
20397C     CHI(X)=GAMMA+LN X+INTEGRAL((COSH T-1)/T)DT FROM 0 TO X
20398C     CHI(-X)=CHI(X)-I PI
20399C                 GAMMA(EULER'S CONSTANT)=.5772156649...
20400C   SPECIAL CASES
20401C     X=0
20402C       SI(0)=SHI(0)=0
20403C       CI(0)=EI(0)=EXNEI(0)=CHI(0)=-INFINITY
20404C                                  =-MAX. MACH. VALUE (RINF)
20405C     LIMITING VALUES - X APPROACHES INFINITY
20406C       SI(X)=PI/2
20407C       CI(X)=0
20408C       EI(X)=SHI(X)=CHI(X)=INFINITY (RINF)
20409C       EXNEI(X)=0
20410C USAGE. CALL SICIEI (IC,X,SI,CI,CII,EI,EXNEI,SHI,CHI,CHII,
20411C                                                      IERR)
20412C     FORMAL PARAMETERS
20413C         IC      INTEGER TYPE                        INPUT
20414C                     IC  FUNCTIONS TO BE COMPUTED
20415C                      1    SI,CI
20416C                      2    EI,EXNEI
20417C                      3    EI,EXNEI,SHI,CHI
20418C                      4    SI,CI,EI,EXNEI,SHI,CHI
20419C         X       REAL OR DOUBLE PRECISION TYPE       INPUT
20420C         SI=SI(X)             (SAME TYPE AS X)       OUTPUT
20421C         CI+I CII=CI(X)              ''              OUTPUT
20422C         EI=EI(X)                    ''              OUTPUT
20423C         EXNEI=EXP(-X)*EI(X)         ''              OUTPUT
20424C         SHI=SHI(X)                  ''              OUTPUT
20425C         CHI+I CHII=CHI(X)           ''              OUTPUT
20426C         IERR    INTEGER TYPE                        OUTPUT
20427C                     IERR=0   X .GE. 0, NORMAL RETURN
20428C                     IERR=1   X .LT. 0, ERROR RETURN IF
20429C                                           IC=2
20430C MODIFICATIONS.
20431C     THE CODE IS SET UP FOR DOUBLE PRECISION COMPUTATION
20432C     WITH DOUBLE PRECISION TYPE STATEMENTS
20433C          DOUBLE PRECISION FUNCTION REFERENCES AND,PARTICU-
20434C     LARLY,FOR THE UNIVAC 1108 WITH (SEE DEFINITIONS BELOW)
20435C          RINF APPROX. 2**1023,ULSC=2**56,NBM=60 AND OTHER
20436C     CONSTANTS IN DOUBLE PRECISION FORMAT TO 19 SIGNIFICANT
20437C     FIGURES. ALL ABOVE ITEMS MUST BE CHANGED FOR SINGLE
20438C     PRECISION COMPUTATIONS WITH DATA ADJUSTMENTS FOR OTHER
20439C     COMPUTERS.
20440C   AUXILIARY FUNCTIONS
20441C       VARIOUS FUNCTIONS ARE AVAILABLE TO GREATER ACCURACY
20442C       AT INTERMEDIATE POINTS IN THE SUBROUTINE,NAMELY,
20443C           SI-(PI/2)=IMAG. PART OF THE CONTINUED FRACTION
20444C           CI(EI AND CHI)-GAMMA-LN X=SUM OF SERIES
20445C   CAUTION - THE SUBROUTINE CANNOT READILY BE ADAPTED TO
20446C             COMPUTE THE FUNCTIONS FOR COMPLEX ARGUMENTS.
20447C METHOD.   T=ABS(X)
20448C     POWER SERIES   T .LE. PSLSC(=2) FOR SI,CI
20449C                    T .LE. AELL(=-LN(TOLER)) FOR EI,SHI,CHI
20450C         SI=SUMS(SGN(RK)*TM(RK))  IP=-1  RK=1,3,...,RKO
20451C         CI=SUMC(SGN(RK)*TM(RK))  IP=+1  RK=2,4,...,RKE
20452C                +EULER+XLOG
20453C         SHI=SUMOT(TM(RK))        IP=-1  RK=1,3,...,RKO
20454C         CHI=SUMET(TM(RK))        IP=+1  RK=2,4,...,RKE
20455C                +EULER+XLOG
20456C         EI=SUMOT+SUMET+EULER+XLOG               (X .GT. 0)
20457C               SGN(1)=1
20458C               SGN(RK+1)=-SGN(RK)        RK=1,3,...
20459C               SGN(RK+1)=+SGN(RK)        RK=2,4,...
20460C               TM(RK)=((T**RK)/(1*2...RK))/RK
20461C                     =PTM(RK)/RK
20462C                   PTM(1)=T
20463C                   PTM(RK+1)=PTM(RK)*(T/(RK+1))   RK .GE. 1
20464C               IF TM(RK)/SUM .LT. TOLER
20465C                 RKE=RK WHERE SUM=ABS(SUMC)       IC=1 OR 4
20466C                              SUM=SUMET           IC=2 OR 3
20467C                                          IC=4,X .GT. PSLSC
20468C                 RKO=RK WHERE SUM=ABS(SUMS)       IC=1 OR 4
20469C                              SUM=SUMOT           IC=2 OR 3
20470C                                          IC=4,X .GT. PSLSC
20471C         EXNEI= EI/EXP(T/2)/EXP(T/2)
20472C              =(EI/EXPHT)/EXPHT
20473C     CONTINUED FRACTION    T .GT. PSLSC
20474C         -CI+I(SI-PI/2)=E1(IT)
20475C                       =EXP(-IT)*(1 I/I (1+IT)-
20476C                               1**2 I/I (3+IT)-
20477C                               2**2 I/I (5+IT)-...)
20478C                       =EXP(-IT)*II(AM(RM) I/I BM(RM))
20479C                                             RM=1,2,...,RMF
20480C                            AM(1)=1
20481C                            AM(RM)=-(RM-1)**2     RM .GT. 1
20482C                            BM(RM)=2*RM-1+IT=BMR+I BMI
20483C                       =EXP(-IT)*(FM/GM)
20484C                       =EXP(-IT)*(FMR+I FMI)/(GMR+I GMI)
20485C                       =EXP(-IT)*F(RM)
20486C                       =(COST-I SINT)*(FR+I FI)
20487C         -CI+I(SI-PI/2)=(FR*COST+FI*SINT)+
20488C                                         I(FI*COST-FR*SINT)
20489C                         IF RESQ(RM) .LE. TOLSQ(=TOLER**2)
20490C                             OR RESQ(RM) .GE. RESQ(RM-1)
20491C                               (RESQ .GE. RESQP)
20492C                         RMF=RM  WHERE
20493C                             RESQ=(MOD(1-F(RM-1)/F(RM)))**2
20494C     ASYMPTOTIC EXPANSION    T .GT. AELL
20495C         EI=(EXNEI*EXPHT)*EXPHT
20496C         EXNEI=(1+SUME(TM(RK)))/T            RK=1,2,...,RKF
20497C         SHI=CHI=EI/2
20498C             TM(RK)=(1*2...RK)/(T**RK)
20499C             TM(0)=1
20500C             TM(RK)=(RK/T)*TM(RK-1)               RK .GE. 1
20501C               IF TM(RK) .LT. TOLER (CONVERGENCE) RKF=RK OR
20502C                  TM(RK) .GE. TM(RK-1)(DIVERGENCE) RKF=RK-1
20503C RANGE.
20504C     FOR SI(X),CI(X), ABS(X) .LT. ULSC(UPPER LIMIT FOR
20505C                                           SIN,COS ROUTINE)
20506C         X=APPROXIMATELY 2**21, NBM=27
20507C                         2**56, NBM=60
20508C     FOR EXP(-X)*EI(X), X .LE. RINF
20509C     FOR EI(X), X .LT. XMAXEI (APPROXIMATELY 92.5,  NBC=8,
20510C                                            715.6,  NBC=11)
20511C                 NBC=NUMBER OF BINARY DIGITS IN THE BIASED
20512C                 CHARACTERISTIC OF A FLOATING POINT NUMBER
20513C     FOR SHI(X),CHI(X), ABS(X) .LT. XMAXHF
20514C         X=APPROXIMATELY 93.2,   NBC=8
20515C                        716.3,   NBC=11
20516C ACCURACY. THE MAXIMUM RELATIVE ERROR, EXCEPT FOR REGIONS
20517C           IN THE IMMEDIATE NEIGHBORHOOD OF ZEROS,ON THE
20518C           UNIVAC 1108 IS 4.5(-7) FOR SINGLE PRECISION COM-
20519C           PUTATION AND 7.5(-17) FOR DOUBLE PRECISION COM-
20520C           PUTATION.
20521C PRECISION. VARIABLE - BY SETTING THE DESIRED VALUE OF NBM
20522C                       OR A PREDETERMINED VALUE OF TOLER
20523C MAXIMUM     UNIVAC 1108 TIME/SHARING EXECUTIVE SYSTEM
20524C TIMING.      NBM=27   NBM=60
20525C (SECONDS)     .0093    .070
20526C STORAGE. 954 WORDS REQUIRED BY THE UNIVAC 1108 COMPILER
20527C
20528C
20529C          MACHINE DEPENDENT STATEMENTS
20530C               TYPE STATEMENTS
20531C
20532      INCLUDE 'DPCOMC.INC'
20533C
20534      DOUBLE PRECISION X,SI,CI,CII,EI,EXNEI,SHI,CHI,CHII
20535      DOUBLE PRECISION A,AELL,AM,AMIN,ASUMSC,
20536     1       BMI,BMR,COST,EXPL,EXPHT,
20537     2       FI,FIP,FMI,FMM1I,FMM1R,FMM2I,FMM2R,FMR,FR,FRP,
20538     3       GMI,GMM1I,GMM1R,GMM2I,GMM2R,GMR,
20539     4       PSLL,PSLSC,PTM,RE,RESQ,RESQP,RK,RM,
20540     5       SCC,SFMI,SFMR,SGMI,SGMR,SGN,
20541     6       SINT,SUMC,SUME,SUMEO,SUMET,SUMOT,SUMS,SUMSC,
20542     7       T,TEMP,TEMPA,TEMPB,TM,TMAX,TMM1,TOLER,TOLSQ,
20543     8       XLOG,XMAXEI,XMAXHF
20544      DOUBLE PRECISION RINF,ULSC,EULER,HALFPI,PI,ALOG2,
20545     1                 ZERO,ONE,TWO,FOUR
20546      DIMENSION A(4)
20547      EQUIVALENCE (FMR,A(1)), (FMI,A(2)), (GMR,A(3)),
20548     1            (GMI,A(4))
20549C               CONSTANTS
20550      DATA EULER/.5772156649015328606D0/
20551      DATA HALFPI/1.570796326794896619D0/
20552      DATA PI/3.141592653589793238D0/
20553      DATA ALOG2/.6931471805599453094D0/
20554      DATA ZERO,ONE,TWO,FOUR /
20555     1     0.0D0,1.D0,2.D0,4.D0/
20556C                 RINF=MAXIMUM MACHINE VALUE
20557C                 ULSC=MAXIMUM ARGUMENT FOR SIN,COS ROUTINE
20558C                        APPROX. 2**(NBM-6) OR 10**(S-2)
20559C                                   (S=SIGNIFICANT FIGURES)
20560C                 NBM=ACCURACY DESIRED OR THE
20561C                     MAXIMUM NUMBER OF BINARY DIGITS IN THE
20562C                       MANTISSA OF A FLOATING POINT NUMBER
20563C                 TOLER=UPPER LIMIT FOR RELATIVE ERRORS
20564C                      =2**(-NBM)=APPROX. 10**(-S)
20565C TOLER PRECOMPUTED MAY BE INSERTED IN A DATA STATEMENT AND
20566C THE NBM DATA STATEMENT ELIMINATED
20567CCCCC DATA RINF/.8988465674311579538D308 /
20568CCCCC DATA ULSC/.72057594037927936D17/
20569CCCCC DATA NBM / 60 /
20570C
20571      RINF=D1MACH(2)
20572      NBM=I1MACH(14)
20573      ULSC=TWO**(NBM-6)
20574      TOLER=TWO**(-NBM)
20575C
20576C NOTE - ARGUMENT CHECKS PRECEDING FUNCTION REFERENCES
20577C        NECESSITATE ADDITIONAL MACHINE DEPENDENT STATEMENTS           0
20578C        IN THE STATEMENT NUMBER RANGE 140-150
20579C          INITIALIZATION OF OUTPUT FUNCTIONS
20580      SI=RINF
20581      CI=RINF
20582      CII=RINF
20583      EI=ZERO
20584      EXNEI=RINF
20585      SHI=ZERO
20586      CHI=ZERO
20587      CHII=RINF
20588C          VALIDITY CHECK ON INPUT PARAMETERS
20589C               INDICATOR CHECK
20590C                 SET IND=IC
20591C                   CHANGE IND=4 IF IC .LT. 1 OR .GT. 4
20592      IND=IC
20593      IF (IND .LT. 1) GO TO 10
20594      IF (IND .GT. 4) GO TO 10
20595      GO TO 20
20596  10  IND=4
20597C               ARGUMENT CHECK
20598C                 X .GE. 0    IERR=0
20599C                 X .LT. 0    IERR=1
20600C                             (ERROR RETURN IF IC=2)
20601  20  IERR=0
20602      T=X
20603  30  CONTINUE
20604C
20605CCCCC JUNE 2008: MODIFY FOLLOWING LINE SO THAT IT DOES NOT
20606CCCCC            GENERATE WARNING MESSAGES WITH FORTRAN 95 COMPILERS.
20607C
20608CCCCC IF (T) 40,50,90
20609      IF (T.LT.0) THEN
20610        GOTO40
20611      ELSEIF (T.EQ.0) THEN
20612        GOTO50
20613      ELSE
20614        GOTO90
20615      ENDIF
20616  40  T=-T
20617      IF (IND .EQ. 1) GO TO 30
20618      IERR=1
20619      IF (IND .NE. 2) GO TO 30
20620      IF (X .LT. ZERO) RETURN
20621C          SPECIAL CASES
20622C               X=0
20623  50  CONTINUE
20624CCCCC IF (IND-2) 80,70,60
20625      IF (IND-2.LT.0) THEN
20626         GOTO80
20627      ELSEIF (IND-2.EQ.0) THEN
20628         GOTO70
20629      ELSE
20630         GOTO60
20631      ENDIF
20632  60  SHI=ZERO
20633      CHI=-RINF
20634      CHII=ZERO
20635  70  EI=-RINF
20636      EXNEI=-RINF
20637      IF (IND .NE. 4) RETURN
20638  80  SI=ZERO
20639      CI=-RINF
20640      CII=ZERO
20641      RETURN
20642  90  IF (T .LT. ULSC) GO TO 140
20643C               ABS(X) .GE. ULSC
20644CCCCC IF (IND-2) 130,110,100
20645      IF (IND-2.LT.0) THEN
20646         GOTO130
20647      ELSEIF (IND-2.EQ.0) THEN
20648         GOTO110
20649      ELSE
20650         GOTO100
20651      ENDIF
20652 100  SHI=RINF
20653      CHI=RINF
20654      CHII=ZERO
20655      IF (IERR .EQ. 1) GO TO 120
20656 110  EI=RINF
20657      EXNEI=(ONE+(ONE/T))/T
20658 120  IF (IND .NE. 4) GO TO 1000
20659 130  SI=HALFPI
20660      CI=ZERO
20661      CII=ZERO
20662      GO TO 1000
20663C          EVALUATIONS FOR ABS(X)(=T) .GT. 0 AND .LT. ULSC
20664C               ADDITIONAL MACHINE DEPENDENT STATEMENTS
20665C                    FUNCTION REFERENCES
20666C                    CONTROL VARIABLES
20667 140  XLOG=DLOG(T)
20668      SINT=DSIN(T)
20669      COST=DCOS(T)
20670      EXPL =DLOG(RINF)
20671      XMAXEI=EXPL+DLOG(EXPL+DLOG(EXPL)) -ONE/EXPL
20672      XMAXHF=XMAXEI+ALOG2
20673      AELL=-DLOG(TOLER)
20674      AMIN=ONE/RINF
20675      PSLL=TWO*DSQRT(AMIN)
20676      PSLSC=TWO
20677C               EXPONENTIAL FUNCTION DETERMINATION
20678      IF (T .LE. TOLER) GO TO 150
20679      IF (T .GE. XMAXHF) GO TO 160
20680      EXPHT=DEXP(T/TWO)
20681      GO TO 170
20682 150  EXPHT=ONE
20683      GO TO 170
20684 160  EXPHT=RINF
20685C               METHOD SELECTION
20686 170  IF (T .LE. PSLSC) GO TO 200
20687      IF (IND .EQ. 1) GO TO 500
20688      IF (IND .EQ. 4) GO TO 500
20689 180  IF (T .GT. AELL) GO TO 800
20690      GO TO 230
20691C                    INDICATOR TO COMPUTE EI,SHI,CHI
20692 190  IF (IND .EQ. 1) GO TO 1000
20693      IND=3
20694      GO TO 180
20695C                    METHOD --- POWER SERIES
20696C                      SI(X),CI(X),           T .LE. PSLSC
20697C                      EI(X),SHI(X),CHI(X),   T .LE. AELL
20698C                         LIMITING VALUES, T NEAR ZERO
20699 200  IF (T .GT. PSLL) GO TO 210
20700      SUMC=ZERO
20701      SUMET=ZERO
20702      SUMS=T
20703      SUMOT=T
20704      GO TO 360
20705C                         INITIALIZATION FOR SI,CI
20706 210  IF (IND .NE. 1) GO TO 230
20707 220  SUMS=ZERO
20708      SUMC=ZERO
20709      SUMSC=ZERO
20710      SGN=ONE
20711      GO TO 240
20712C                         INITIALIZATION FOR SHI,CHI(AND EI)
20713 230  SUMOT=ZERO
20714      SUMET=ZERO
20715      SUMEO=ZERO
20716      IF (IND .EQ. 4) GO TO 220
20717C                              IP -  INDICATOR FOR ODD OR
20718C                                      EVEN TERMS
20719 240  IP=-1
20720      RK=ONE
20721      PTM=T
20722C                         COMPUTATION OF (T**K)/(1*2...K)/K
20723 250  TM=PTM/RK
20724C                         SUMMATION FOR SI(CI)
20725        IF (IND .NE. 1) GO TO 310
20726 260    SUMSC=SGN*TM+SUMSC
20727C                         RELATIVE ERROR FOR SI(CI)
20728C PARTIAL SUM OF ALTERNATING ODD(EVEN) TERMS MAY EQUAL ZERO
20729        ASUMSC=SUMSC
20730 270    CONTINUE
20731CCCCC   IF (ASUMSC) 280,300,290
20732        IF (ASUMSC.LT.0) THEN
20733           GOTO280
20734        ELSEIF (ASUMSC.EQ.0) THEN
20735           GOTO300
20736        ELSE
20737           GOTO290
20738        ENDIF
20739 280    ASUMSC=-ASUMSC
20740        GO TO 270
20741 290    RE=TM/ASUMSC
20742        GO TO 320
20743 300    RE=RINF
20744        GO TO 320
20745C                         SUMMATION FOR SHI(CHI)(AND EI)
20746 310    SUMEO=TM+SUMEO
20747        IF (IND .EQ. 4) GO TO 260
20748C                         RELATIVE ERROR FOR SHI(CHI)
20749        RE=TM/SUMEO
20750C                         SIGN CHANGE AND SELECTION
20751C                         OF SUMS OF ODD(EVEN) TERMS
20752 320    IF (IP .EQ. 1) GO TO 330
20753        SGN=-SGN
20754        SUMS=SUMSC
20755        SUMSC=SUMC
20756        SUMOT=SUMEO
20757        SUMEO=SUMET
20758        GO TO 340
20759 330    SUMC=SUMSC
20760        SUMSC=SUMS
20761        SUMET=SUMEO
20762        SUMEO=SUMOT
20763C                         RELATIVE ERROR CHECK
20764 340    IF (RE .LT. TOLER) GO TO 360
20765C                         ADDITIONAL TERMS
20766        RK=RK+ONE
20767C                              UNDERFLOW TEST
20768C UNDERFLOWS AFFECTING ACCURACY ARE AVOIDED. ALL OTHER
20769C UNDERFLOWS ARE ASSUMED TO BE SET EQUAL TO ZERO
20770        IF (T .GT. PSLSC) GO TO 350
20771        IF (PTM .LE. (AMIN*RK*RK)/T ) GO TO 360
20772 350    PTM=(T/RK)*PTM
20773        IP=-IP
20774        GO TO 250
20775C                         SI,CI EVALUATION
20776 360  IF (IND .NE. 1) GO TO 380
20777 370  SI=SUMS
20778      CI=(SUMC+XLOG)+EULER
20779      CII=ZERO
20780      GO TO 1000
20781C                         EI EVALUATION
20782 380  IF (X .LE. ZERO) GO TO 390
20783      EI=(SUMET+SUMOT+XLOG)+EULER
20784      EXNEI=(EI/EXPHT)/EXPHT
20785      IF (IND .EQ. 2) RETURN
20786C                         SHI,CHI EVALUATION
20787 390  SHI=SUMOT
20788      CHI=(EULER+SUMET)+XLOG
20789      CHII=ZERO
20790      IF (IND .NE. 4) GO TO 1000
20791      GO TO 370
20792C                    METHOD --- CONTINUED FRACTION
20793C                      SI(X),CI(X),       T .GT. PSLSC
20794C                      -CI(T) + I (SI(T)-HALFPI)=E1(IT)
20795C                         INITIALIZATION
20796 500  SCC=RINF/FOUR
20797      TOLSQ=TOLER*TOLER
20798      RM=ONE
20799      AM=ONE
20800      BMR=ONE
20801      BMI=T
20802      FMM2R=ONE
20803      FMM2I=ZERO
20804      GMM2R=ZERO
20805      GMM2I=ZERO
20806      FMM1R=ZERO
20807      FMM1I=ZERO
20808      GMM1R=ONE
20809      GMM1I=ZERO
20810      RESQP=RINF
20811      FRP=ZERO
20812      FIP=ZERO
20813C                         RECURRENCE RELATION
20814C                           FM=BM*FMM1 + AM*FMM2
20815C                           GM=BM*GMM1 + AM*GMM2
20816 510  FMR=BMR*FMM1R-BMI*FMM1I+AM*FMM2R
20817        FMI=BMI*FMM1R+BMR*FMM1I+AM*FMM2I
20818        GMR=BMR*GMM1R-BMI*GMM1I+AM*GMM2R
20819        GMI=BMI*GMM1R+BMR*GMM1I+AM*GMM2I
20820C                         CONVERGENT F=FM/GM
20821C                           TESTS TO AVOID INCORRECT RESULTS
20822C                               DUE TO OVERFLOWS(UNDERFLOWS)
20823C                             FINDING MAXIMUM(=TMAX) OF
20824C                               ABSOLUTE OF FMR,GMR,FMI,GMI
20825C                               FOR SCALING PURPOSES
20826        TMAX=ZERO
20827        I=1
20828 520    TEMP=A(I)
20829 530      CONTINUE
20830CCCCC     IF (TEMP) 540,560,550
20831          IF (TEMP.LT.0) THEN
20832             GOTO540
20833          ELSEIF (TEMP.EQ.0) THEN
20834             GOTO560
20835          ELSE
20836             GOTO550
20837          ENDIF
20838 540      TEMP=-TEMP
20839          GO TO 530
20840 550      IF (TEMP .LE. TMAX) GO TO 560
20841          TMAX=TEMP
20842 560      IF (I .GE. 4) GO TO 570
20843          I=I+1
20844          GO TO 520
20845 570    SFMR=FMR/TMAX
20846        SFMI=FMI/TMAX
20847        SGMR=GMR/TMAX
20848        SGMI=GMI/TMAX
20849        TEMP=SGMR*SGMR + SGMI*SGMI
20850        FR=(SFMR*SGMR+SFMI*SGMI)/TEMP
20851        FI=(SFMI*SGMR-SFMR*SGMI)/TEMP
20852C                         RELATIVE ERROR CHECK
20853        TEMP=FR*FR+FI*FI
20854        TEMPA=(FRP*FR+FIP*FI)/TEMP
20855        TEMPB=(FIP*FR-FRP*FI)/TEMP
20856        TEMP=ONE-TEMPA
20857        RESQ =TEMP*TEMP+TEMPB*TEMPB
20858        IF (RESQ  .LE. TOLSQ) GO TO 590
20859        IF (RESQ .GE. RESQP) GO TO 580
20860C                         ADDITIONAL CONVERGENTS
20861        AM=-RM*RM
20862        RM=RM+ONE
20863        BMR=BMR+TWO
20864        FMM2R=FMM1R
20865        FMM2I=FMM1I
20866        GMM2R=GMM1R
20867        GMM2I=GMM1I
20868        FMM1R=FMR
20869        FMM1I=FMI
20870        GMM1R=GMR
20871        GMM1I=GMI
20872        FRP=FR
20873        FIP=FI
20874        RESQP=RESQ
20875C                         SCALING
20876C SCALING SHOULD NOT BE DELETED AS THE VALUES OF FMR,FMI AND
20877C GMR,GMI MAY OVERFLOW FOR SMALL VALUES OF T
20878        IF (TMAX .LT. SCC/(BMR-AM ) ) GO TO 510
20879        FMM2R=FMM2R/TMAX
20880        FMM2I=FMM2I/TMAX
20881        GMM2R=GMM2R/TMAX
20882        GMM2I=GMM2I/TMAX
20883        FMM1R=FMM1R/TMAX
20884        FMM1I=FMM1I/TMAX
20885        GMM1R=GMM1R/TMAX
20886        GMM1I=GMM1I/TMAX
20887        GO TO 510
20888C                         DIVERGENCE OF RELATIVE ERROR
20889C                           ACCEPT PRIOR CONVERGENT
20890 580  FR=FRP
20891      FI=FIP
20892C                         SI,CI EVALUATION
20893 590  SI=FI*COST-FR*SINT+HALFPI
20894      CI=-(FR*COST+FI*SINT)
20895      CII=ZERO
20896      GO TO 190
20897C                    METHOD --- ASYMPTOTIC EXPANSION
20898C                      EI(X),EXNEI(X)         X .GT. AELL
20899C                      SHI(T)=CHI(T)=EI(T)/2  T .GT. AELL
20900C                         INITIALIZATION
20901 800  IF (IND .NE. 2) GO TO 880
20902 810  SUME=ZERO
20903      RK=ZERO
20904      TM=ONE
20905C                         ADDITIONAL TERMS
20906 820  TMM1=TM
20907        RK=RK+ONE
20908        TM=(RK/T)*TM
20909C                         TOLERANCE CHECK
20910        IF (TM .LT. TOLER) GO TO 840
20911        IF (TM .GE. TMM1) GO TO 830
20912        SUME=SUME+TM
20913        GO TO 820
20914C                         DIVERGENT PATH
20915 830  SUME=SUME-TMM1
20916C                         EXNEI EVALUATION
20917 840  IF (X .LT. ZERO) GO TO 870
20918      EXNEI=(ONE+SUME)/T
20919C                         EI EVALUATION - X .LT. XMAXEI
20920      IF (T .GE. XMAXEI) GO TO 850
20921      EI=(EXNEI*EXPHT)*EXPHT
20922      GO TO 860
20923C                         EI - LIMITING VALUE, X .GE. XMAXEI
20924 850  EI=RINF
20925C                         SHI,CHI EVALUATION - T .LT. XMAXHF
20926 860  IF (IND .EQ. 2) RETURN
20927 870  IF (T .GE. XMAXHF) GO TO 1000
20928      SHI=(((( ONE+SUME)/T)/TWO)*EXPHT)*EXPHT
20929      CHI=SHI
20930      CHII=ZERO
20931      GO TO 1000
20932C                         SHI,CHI - LIMITING VALUE
20933C                                              T .GE. XMAXHF
20934 880  IF ( T .LT. XMAXHF) GO TO 810
20935      SHI=RINF
20936      CHI=RINF
20937      CHII=ZERO
20938      IF ( X .GT. ZERO) GO TO 810
20939      GO TO 1010
20940C          ADJUSTMENTS FOR X .LT. 0
209411000  IF (X .GT. ZERO) RETURN
209421010  IF (IC .EQ. 3) GO TO 1020
20943      SI=-SI
20944      CII=-PI
20945      IF (IC .EQ. 1) RETURN
209461020  SHI=-SHI
20947      CHII=-PI
20948      RETURN
20949      END
20950      SUBROUTINE SIDEDI(XC,YC,NS,D,IB,JB,X,Y)
20951C
20952C     PURPOSE--XX
20953C
20954C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
20955C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
20956C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
20957C     UPDATED         --JANUARY   1989.  MORE CHANGES TO STANDARD FORTRAN 77--
20958C                                        CHANGED DO WHILE/END DO (ALAN HECKERT).
20959C
20960C---------------------------------------------------------------------
20961C
20962      DIMENSION IB(*)
20963      DIMENSION JB(*)
20964      DIMENSION X(*)
20965      DIMENSION Y(*)
20966C
20967C-----START POINT-----------------------------------------------------
20968C
20969      EPS=0.001*AMIN1(ABS(X(2)-X(1)),ABS(Y(2)-Y(1)))
20970      NS=0
20971      D=0.
20972      NB=1
20973CCCCC DO WHILE (NS.EQ.0)                 JANUARY 1989
20974  100 CONTINUE
20975      IF(NS.NE.0)GOTO199
20976        IF (IB(NB).EQ.IB(NB+1)) THEN
20977          I=IB(NB)
20978          J1=JB(NB)
20979          J2=JB(NB+1)
20980          IF (ABS(XC-X(I)).LE.EPS.AND.
20981     1         ABS(YC-Y(J1)).LT.ABS(Y(J2)-Y(J1))) THEN
20982            D=D+ABS(YC-Y(J1))
20983            NS=NB
20984          ELSE
20985            D=D+ABS(Y(J2)-Y(J1))
20986          END IF
20987        ELSE
20988          J=JB(NB)
20989          I1=IB(NB)
20990          I2=IB(NB+1)
20991          IF (ABS(YC-Y(J)).LE.EPS.AND.
20992     1         ABS(XC-X(I1)).LT.ABS(X(I2)-X(I1))) THEN
20993            D=D+ABS(XC-X(I1))
20994            NS=NB
20995          ELSE
20996            D=D+ABS(X(I2)-X(I1))
20997          END IF
20998        END IF
20999        NB=NB+1
21000CCCCC END DO                             JANUARY 1989
21001      GOTO100
21002  199 CONTINUE
21003      RETURN
21004      END
21005      SUBROUTINE SIMCOV(ISEED,IBUGA2,IBUGA3,IBUGCO,IBUGEV,IBUGQ,
21006     1                  ISUBRO,IFOUND,IERROR)
21007C
21008C     PURPOSE--CARRY OUT MARK VANGEL'S SIMCOV PROGRAM
21009C              FOR LINEAR MODELS.
21010C     WRITTEN BY--ALAN HECKERT
21011C                 STATISTICAL ENGINEERING DIVISION
21012C                 INFORMATION TECHNOLOGY LABORATORY
21013C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
21014C                 GAITHERSBURG, MD 20899-8980
21015C                 PHONE--301-975-2899
21016C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
21017C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
21018C     LANGUAGE--ANSI FORTRAN (1977)
21019C     VERSION NUMBER--97/9
21020C     ORIGINAL VERSION--SEPTEMBER   1997.
21021C     UPDATED         --JULY        2019. TWEAK SCRATCH SPACE
21022C
21023C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
21024C
21025      CHARACTER*4 IBUGA2
21026      CHARACTER*4 IBUGA3
21027      CHARACTER*4 IBUGCO
21028      CHARACTER*4 IBUGEV
21029      CHARACTER*4 IBUGQ
21030      CHARACTER*4 ISUBRO
21031      CHARACTER*4 IFOUND
21032      CHARACTER*4 IERROR
21033C
21034      CHARACTER*4 ICASRE
21035      CHARACTER*4 ICASDG
21036      CHARACTER*4 ICASEQ
21037      CHARACTER*4 IKEY
21038      CHARACTER*4 IHRIGH
21039      CHARACTER*4 IHRIG2
21040      CHARACTER*4 IFLAG
21041C
21042      CHARACTER*4 IHWUSE
21043      CHARACTER*4 MESSAG
21044      CHARACTER*4 IHLEFT
21045      CHARACTER*4 IHLEF2
21046C
21047      CHARACTER*4 IVARN1
21048      CHARACTER*4 IVARN2
21049C
21050      CHARACTER*4 IWRITE
21051      CHARACTER*4 ISUBN1
21052      CHARACTER*4 ISUBN2
21053      CHARACTER*4 ISTEPN
21054C
21055CCCCC CHARACTER*20 IMODEL
21056C
21057      LOGICAL SATT
21058C
21059      DOUBLE PRECISION PCT
21060      DOUBLE PRECISION ERR
21061      DOUBLE PRECISION SDW
21062      DOUBLE PRECISION SDB
21063      DOUBLE PRECISION RHO
21064C
21065C---------------------------------------------------------------------
21066C
21067      INCLUDE 'DPCOPA.INC'
21068      INCLUDE 'DPCOZZ.INC'
21069      INCLUDE 'DPCOZI.INC'
21070      INCLUDE 'DPCOZD.INC'
21071C
21072      DIMENSION ILIS(100)
21073      DIMENSION ICOLR(100)
21074C
21075      REAL XTMP(1)
21076      DOUBLE PRECISION XDESGN(MAXOBV)
21077      DOUBLE PRECISION XPTS(MAXOBV)
21078      DOUBLE PRECISION V2(MAXOBV)
21079      DOUBLE PRECISION TLM0(MAXOBV)
21080      DOUBLE PRECISION TLM1(MAXOBV)
21081      DOUBLE PRECISION ETA0(MAXOBV)
21082      DOUBLE PRECISION ETA1(MAXOBV)
21083      DOUBLE PRECISION XM(MAXOBV)
21084      DOUBLE PRECISION WK2(MAXOBV)
21085      DOUBLE PRECISION WK3(MAXOBV)
21086      DOUBLE PRECISION XN(MAXOBV)
21087      DOUBLE PRECISION T(MAXOBV)
21088      DOUBLE PRECISION CRT(MAXOBV)
21089      DOUBLE PRECISION Y2(MAXOBV)
21090      DOUBLE PRECISION COV(MAXOBV)
21091C
21092      DIMENSION IP(MAXOBV)
21093      DIMENSION IQ(MAXOBV)
21094C
21095      DIMENSION PRED2(MAXOBV)
21096      DIMENSION RES2(MAXOBV)
21097C
21098      DOUBLE PRECISION XMAT(5*MAXOBV)
21099      DOUBLE PRECISION SCRTCH(10*MAXOBV)
21100C
21101      DOUBLE PRECISION XTX(100)
21102      DOUBLE PRECISION XTXI(100)
21103      DOUBLE PRECISION S1(100)
21104      DOUBLE PRECISION S2(100)
21105      DOUBLE PRECISION V1(100)
21106      DOUBLE PRECISION COEF(100)
21107C
21108CCCCC DIMENSION ICH(10)
21109C
21110      DIMENSION IVARN1(100)
21111      DIMENSION IVARN2(100)
21112C
21113C-----COMMON----------------------------------------------------------
21114C
21115      INCLUDE 'DPCOMC.INC'
21116      INCLUDE 'DPCOHK.INC'
21117      INCLUDE 'DPCOSU.INC'
21118      INCLUDE 'DPCODA.INC'
21119      INCLUDE 'DPCOHO.INC'
21120C
21121C-----COMMON VARIABLES (GENERAL)--------------------------------------
21122C
21123      EQUIVALENCE (COV(1),X(1))
21124      EQUIVALENCE (Y2(1),X3D(1))
21125      EQUIVALENCE (PRED2(1),D(1))
21126      EQUIVALENCE (RES2(1),D(MAXOBV+1))
21127      EQUIVALENCE (CRT(1),DSIZE(1))
21128      EQUIVALENCE (XN(1),DSYMB(1))
21129      EQUIVALENCE (T(1),DFILL(1))
21130      EQUIVALENCE (XTX(1),DCOLOR(1))
21131      EQUIVALENCE (XTXI(1),DCOLOR(1001))
21132      EQUIVALENCE (S1(1),DCOLOR(2001))
21133      EQUIVALENCE (S2(1),DCOLOR(3001))
21134      EQUIVALENCE (V1(1),DCOLOR(4001))
21135C
21136      EQUIVALENCE (GARBAG(IGARB1),XMAT(1))
21137      EQUIVALENCE (GARBAG(IGAR11),SCRTCH(1))
21138C
21139      EQUIVALENCE (DGARBG(IDGAR1),XDESGN(1))
21140      EQUIVALENCE (DGARBG(IDGAR2),XPTS(1))
21141      EQUIVALENCE (DGARBG(IDGAR3),V2(1))
21142      EQUIVALENCE (DGARBG(IDGAR4),TLM0(1))
21143      EQUIVALENCE (DGARBG(IDGAR5),TLM1(1))
21144      EQUIVALENCE (DGARBG(IDGAR6),ETA0(1))
21145      EQUIVALENCE (DGARBG(IDGAR7),ETA1(1))
21146      EQUIVALENCE (DGARBG(IDGAR8),XM(1))
21147      EQUIVALENCE (DGARBG(IDGAR9),WK2(1))
21148      EQUIVALENCE (DGARBG(IDGA10),WK3(1))
21149C
21150      EQUIVALENCE (IGARBG(IIGAR1),IQ(1))
21151      EQUIVALENCE (IGARBG(IIGAR2),IP(1))
21152C
21153C-----COMMON----------------------------------------------------------
21154C
21155      INCLUDE 'DPCOP2.INC'
21156C
21157C-----START POINT-----------------------------------------------------
21158C
21159      ISUBN1='SIMC'
21160      ISUBN2='OV  '
21161      IERROR='NO'
21162C
21163      MAXCP1=MAXCOL+1
21164      MAXCP2=MAXCOL+2
21165      MAXCP3=MAXCOL+3
21166      MAXCP4=MAXCOL+4
21167      MAXCP5=MAXCOL+5
21168      MAXCP6=MAXCOL+6
21169C
21170CCCCC IPAROC(1)='NONE'
21171C
21172      MAXV2=35
21173      MINN2=2
21174      ILOCXP=0
21175      ILOCB=0
21176      JMAX=0
21177      NUMVAR=0
21178C
21179      CPUEPS=R1MACH(3)
21180C
21181      MAXN2=MAXCHF
21182      MAXN3=MAXCHF
21183      MAXN4=MAXCHF
21184C
21185      MAXLVL=INT(SQRT(REAL(IGARB0)))
21186      MAXPT1=20*MAXOBV
21187      MAXPT2=10*MAXOBV
21188C
21189      NPAR=0
21190      NTOT=0
21191      NBCH=0
21192      NLEFT=0
21193C
21194C               *****************************
21195C               **  TREAT THE RECIPE CASE  **
21196C               *****************************
21197C
21198      IF(IBUGA2.EQ.'OFF'.AND.ISUBRO.NE.'MCOV')GOTO90
21199      WRITE(ICOUT,999)
21200  999 FORMAT(1X)
21201      CALL DPWRST('XXX','BUG ')
21202      WRITE(ICOUT,51)
21203   51 FORMAT('***** AT THE BEGINNING OF SIMCOV--')
21204      CALL DPWRST('XXX','BUG ')
21205      WRITE(ICOUT,53)IBUGA2,IBUGA3
21206   53 FORMAT('IBUGA2,IBUGA3 = ',A4,2X,A4)
21207      CALL DPWRST('XXX','BUG ')
21208      WRITE(ICOUT,54)IBUGCO,IBUGEV,IBUGQ
21209   54 FORMAT('IBUGCO,IBUGEV,IBUGQ = ',A4,2X,A4,2X,A4)
21210      CALL DPWRST('XXX','BUG ')
21211      WRITE(ICOUT,56)NUMNAM
21212   56 FORMAT('NUMNAM = ',I8)
21213      CALL DPWRST('XXX','BUG ')
21214      DO57I=1,NUMNAM
21215      WRITE(ICOUT,58)I,IHNAME(I),IHNAM2(I),IUSE(I),IN(I),IVALUE(I),
21216     1VALUE(I)
21217   58 FORMAT('I,IHNAME(I),IHNAM2(I),IUSE(I),IN(I),IVALUE(I)',
21218     1'VALUE(I) = ',I8,2X,A4,A4,2X,A4,I8,I8,E15.7)
21219      CALL DPWRST('XXX','BUG ')
21220   57 CONTINUE
21221      WRITE(ICOUT,61)IRECSA,RECIDG,RECIPC,RECICO
21222   61 FORMAT('IRECSA,RECIDG,RECIPC,RECICO=',A4,1X,3(E15.7))
21223      CALL DPWRST('XXX','BUG ')
21224   90 CONTINUE
21225C
21226C               **********************************
21227C               **  STEP 1--                    **
21228C               **  EXTRACT THE COMMAND         **
21229C               **    SIMCOV FIT                **
21230C               **    SIMCOV ANOVA              **
21231C               **    SIMCOV Y <UNIVARIATE CASE **
21232C               **********************************
21233C
21234      ISTEPN='1'
21235      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21236     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21237C
21238      IF(ICOM.EQ.'SIMC'.AND.NUMARG.GE.1.AND.IHARG(1).EQ.'FIT')THEN
21239        IFOUND='YES'
21240        ICASRE='FREC'
21241        IJUNK=INT(RECIDG+0.5)
21242        ICASDG='1'
21243        IF(IJUNK.EQ.0)ICASDG='0'
21244        IF(IJUNK.EQ.1)ICASDG='1'
21245        IF(IJUNK.EQ.2)ICASDG='2'
21246        IF(IJUNK.EQ.3)ICASDG='3'
21247        IF(IJUNK.EQ.4)ICASDG='4'
21248        IF(IJUNK.EQ.5)ICASDG='5'
21249        IF(IJUNK.EQ.6)ICASDG='6'
21250        IF(IJUNK.EQ.7)ICASDG='7'
21251        IF(IJUNK.EQ.8)ICASDG='8'
21252        IF(IJUNK.EQ.9)ICASDG='9'
21253        IF(IJUNK.EQ.10)ICASDG='10'
21254      ELSEIF(ICOM.EQ.'SIMC'.AND.NUMARG.GE.1.AND.IHARG(1).EQ.'ANOV')THEN
21255        IFOUND='YES'
21256        ICASRE='AREC'
21257      ELSEIF(ICOM.EQ.'SIMC'.AND.NUMARG.GE.1)THEN
21258        IFOUND='YES'
21259        ICASRE='UREC'
21260      ENDIF
21261      IF(IBUGA2.EQ.'ON')THEN
21262        WRITE(ICOUT,66)ICASRE
21263   66   FORMAT('ICASRE=',A4)
21264        CALL DPWRST('XXX','BUG ')
21265      ENDIF
21266      IF(ICASRE.EQ.'    ')GOTO9000
21267C
21268C               *******************************************************
21269C               **  STEP 2--                                         **
21270C               **  CHECK FOR THE PROPER NUMBER OF INPUT ARGUMENTS.  **
21271C               *******************************************************
21272C
21273      ISTEPN='2'
21274      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21275     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21276C
21277      MINNA=0
21278      MAXNA=100
21279      CALL CHECKA(NUMARG,MINNA,MAXNA,IANS,IWIDTH,ISUBN1,ISUBN2,
21280     1IERROR)
21281      IF(IERROR.EQ.'YES')GOTO9000
21282C
21283C               ******************************************************
21284C               **  STEP 3--                                        **
21285C               **  IN PARTICULAR, CHECK THAT THE NUMBER OF ARGUMENTS*
21286C               **  IS AT LEAST 1,                                  **
21287C               *******************************************************
21288C
21289      ISTEPN='3'
21290      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21291     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21292C
21293      IF(NUMARG.GE.1)GOTO2090
21294      WRITE(ICOUT,2001)
21295 2001 FORMAT('***** ERROR IN SIMCOV--')
21296      CALL DPWRST('XXX','BUG ')
21297      WRITE(ICOUT,2002)
21298 2002 FORMAT('      NUMBER OF ARGUMENTS DETECTED')
21299      CALL DPWRST('XXX','BUG ')
21300      WRITE(ICOUT,2003)NUMARG
21301 2003 FORMAT('      IN RECIPE COMMAND = 0.  NUMARG = ',I6)
21302      CALL DPWRST('XXX','BUG ')
21303      WRITE(ICOUT,2007)IWIDTH
21304 2007 FORMAT('      NUMBER OF CHARACTERS IN COMMAND LINE = ',I8)
21305      CALL DPWRST('XXX','BUG ')
21306      IF(IWIDTH.GE.1)WRITE(ICOUT,2008)(IANS(J),J=1,MIN(IWIDTH,100))
21307 2008 FORMAT('      COMMAND LINE--',100A1)
21308      IF(IWIDTH.GE.1)CALL DPWRST('XXX','BUG ')
21309      IERROR='YES'
21310      GOTO9000
21311 2090 CONTINUE
21312C
21313      DO2100J=1,NUMARG
21314      J1=J
21315      IF(IHARG(J).EQ.'SUBS'.AND.IHARG2(J).EQ.'ET  ')GOTO2110
21316      IF(IHARG(J).EQ.'EXCE'.AND.IHARG2(J).EQ.'PT  ')GOTO2110
21317      IF(IHARG(J).EQ.'FOR '.AND.IHARG2(J).EQ.'    ')GOTO2110
21318 2100 CONTINUE
21319      ILOCQ=NUMARG+1
21320      GOTO2120
21321 2110 CONTINUE
21322      ILOCQ=J1
21323      GOTO2120
21324 2120 CONTINUE
21325C
21326C               *******************************************************
21327C               **  STEP 4--                                         **
21328C               **  FOR RECIPE FIT AND RECIPE ANOVA,                 **
21329C               **  THE SECOND WORD AFTER  RECIPE SHOULD BE THE      **
21330C               **  RESPONSE VARIABLE (= THE DEPENDENT VARIABLE).    **
21331C               **  FOR RECIPE <Y>, RESPONSE VARIABLE IS FIRST WORD. **
21332C               **  EXTRACT THE RESPONSE VARIABLE AND DETERMINE      **
21333C               **  IF IT IS ALREADY IN THE NAME LIST AND IS, IN FACT,*
21334C               **  A VARIABLE (AS OPPOSED TO A PARAMETER).          **
21335C               *******************************************************
21336C
21337      ISTEPN='4'
21338      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21339     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21340C
21341      ILOCY=2
21342      IF(ICASRE.EQ.'UREC')ILOCY=1
21343      IHLEFT=IHARG(ILOCY)
21344      IHLEF2=IHARG2(ILOCY)
21345      DO2350I=1,NUMNAM
21346      I2=I
21347      IF(IHLEFT.EQ.IHNAME(I2).AND.IHLEF2.EQ.IHNAM2(I2).AND.
21348     1IUSE(I2).EQ.'V')GOTO2379
21349 2350 CONTINUE
21350      WRITE(ICOUT,2361)
21351 2361 FORMAT('***** ERROR IN SIMCOV--')
21352      CALL DPWRST('XXX','BUG ')
21353      WRITE(ICOUT,2362)
21354 2362 FORMAT('      THE NAME FOLLOWING THE WORD RECIPE FIT ',
21355     1'(OR RECIPE ANOVA')
21356      CALL DPWRST('XXX','BUG ')
21357      WRITE(ICOUT,2363)
21358 2363 FORMAT('      (WHICH SHOULD BE THE RESPONSE VARIABLE)')
21359      CALL DPWRST('XXX','BUG ')
21360      WRITE(ICOUT,2364)
21361 2364 FORMAT('      EITHER DOES NOT EXIST,')
21362      CALL DPWRST('XXX','BUG ')
21363      WRITE(ICOUT,2365)
21364 2365 FORMAT('      OR IS A PARAMETER (AS OPPOSED')
21365      CALL DPWRST('XXX','BUG ')
21366      WRITE(ICOUT,2366)
21367 2366 FORMAT('      TO A VARIABLE) IN THE CURRENT')
21368      CALL DPWRST('XXX','BUG ')
21369      WRITE(ICOUT,2367)
21370 2367 FORMAT('      LIST OF AVAILABLE VARIABLE AND PARAMETER')
21371      CALL DPWRST('XXX','BUG ')
21372      WRITE(ICOUT,2368)
21373 2368 FORMAT('      NAMES.')
21374      CALL DPWRST('XXX','BUG ')
21375      WRITE(ICOUT,999)
21376      CALL DPWRST('XXX','BUG ')
21377      WRITE(ICOUT,2369)IHLEFT,IHLEF2
21378 2369 FORMAT('      NAME AFTER THE WORD RECIPE FIT/ANOVA = ',A4,A4)
21379      CALL DPWRST('XXX','BUG ')
21380      IF(IWIDTH.GE.1)WRITE(ICOUT,2378)(IANS(J),J=1,MIN(IWIDTH,100))
21381 2378 FORMAT('      COMMAND LINE--',100A1)
21382      IF(IWIDTH.GE.1)CALL DPWRST('XXX','BUG ')
21383      IERROR='YES'
21384      GOTO9000
21385 2379 CONTINUE
21386      ILOCV=I2
21387      ICOLL=IVALUE(ILOCV)
21388      NLEFT=IN(ILOCV)
21389C
21390C               *******************************************************
21391C               **  STEP 5--                                         **
21392C               **  FOR ALL VARIATIONS OF THE SIMCOV COMMAND,        **
21393C               **  CHECK THAT THE INPUT NUMBER OF OBSERVATIONS (NLEFT)
21394C               **  FOR THE RESPONSE VARIABLE IS 2 OR LARGER.        **
21395C               *******************************************************
21396C
21397      ISTEPN='5'
21398      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21399     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21400C
21401      IF(NLEFT.GE.MINN2)GOTO390
21402      WRITE(ICOUT,999)
21403      CALL DPWRST('XXX','BUG ')
21404      WRITE(ICOUT,311)
21405  311 FORMAT('***** ERROR IN SIMCOV--')
21406      CALL DPWRST('XXX','BUG ')
21407      WRITE(ICOUT,312)IHLEFT,IHLEF2
21408  312 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS ',
21409     1'IN VARIABLE ',A4,A4)
21410      CALL DPWRST('XXX','BUG ')
21411      WRITE(ICOUT,313)
21412  313 FORMAT('      (FOR WHICH A RECIPE ANALYSIS ')
21413      CALL DPWRST('XXX','BUG ')
21414      WRITE(ICOUT,314)
21415  314 FORMAT('      WAS TO HAVE BEEN PERFORMED)')
21416      CALL DPWRST('XXX','BUG ')
21417      WRITE(ICOUT,315)MINN2
21418  315 FORMAT('      MUST BE ',I8,' OR LARGER;')
21419      CALL DPWRST('XXX','BUG ')
21420      WRITE(ICOUT,316)
21421  316 FORMAT('      SUCH WAS NOT THE CASE HERE.')
21422      CALL DPWRST('XXX','BUG ')
21423      WRITE(ICOUT,317)NLEFT
21424  317 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS NLEFT = ',I8)
21425      CALL DPWRST('XXX','BUG ')
21426      WRITE(ICOUT,318)
21427  318 FORMAT('      THE ENTERED COMMAND LINE WAS AS FOLLOWS--')
21428      CALL DPWRST('XXX','BUG ')
21429      IF(IWIDTH.GE.1)WRITE(ICOUT,319)(IANS(I),I=1,IWIDTH)
21430  319 FORMAT(80A1)
21431      IF(IWIDTH.GE.1)CALL DPWRST('XXX','BUG ')
21432      IERROR='YES'
21433      GOTO9000
21434C
21435  390 CONTINUE
21436C
21437C               **************************************************
21438C               **  STEP 12--                                   **
21439C               **  EXTRACT THE INDEPENDENT VARIABLES           **
21440C               **  FOR SIMCOV FIT:                             **
21441C               **      Y X <BATCH> <XPRED>                     **
21442C               **  FOR SIMCOV ANOVA:                           **
21443C               **      Y X1 ... XK <BATCH>                     **
21444C               **  FOR SIMCOV :                                **
21445C               **      Y <BATCH>                               **
21446C               **  IF THE   TO   FEATURE IS USED IN THE        **
21447C               **  ARGUMENT LIST, TRANSLATE THE   TO   TO      **
21448C               **  EXPLICIT VARIABLE NAMES             INTO    **
21449C               **************************************************
21450C
21451      ISTEPN='12'
21452      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21453     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21454C
21455      IF(ICASRE.EQ.'FREC')THEN
21456        MAXREC=3
21457        JMIN=ILOCY+1
21458        JMAX=ILOCQ-1
21459        CALL EXTVAR(IHARG,IHARG2,NUMARG,JMIN,JMAX,MAXREC,
21460     1  IHNAME,IHNAM2,IUSE,NUMNAM,
21461     1  IVARN1,IVARN2,NUMVAR,IBUGA2,ISUBRO,IERROR)
21462        IF(IERROR.EQ.'YES')GOTO9000
21463        IF(NUMVAR.EQ.1)THEN
21464          ILOCX=ILOCY+1
21465          ILOCB=-1
21466          ILOCXP=-1
21467        ELSEIF(NUMVAR.EQ.2)THEN
21468          ILOCX=ILOCY+1
21469          ILOCB=ILOCX+1
21470          ILOCXP=-1
21471        ELSEIF(NUMVAR.EQ.3)THEN
21472          ILOCX=ILOCY+1
21473          ILOCB=ILOCX+1
21474          ILOCXP=ILOCB+1
21475        ELSE
21476          WRITE(ICOUT,999)
21477          CALL DPWRST('XXX','BUG ')
21478          WRITE(ICOUT,411)
21479          CALL DPWRST('XXX','BUG ')
21480          WRITE(ICOUT,412)
21481          CALL DPWRST('XXX','BUG ')
21482          WRITE(ICOUT,413)NUMVAR
21483          CALL DPWRST('XXX','BUG ')
21484          IERROR='YES'
21485          GOTO9000
21486        ENDIF
21487  411 FORMAT('***** ERROR IN SIMCOV (SIMCOV FIT)--')
21488  412 FORMAT('      BETWEEN 2 AND 4 VARIABLE NAMES CAN BE SPECIFIED '
21489     1      ,'FOR THIS COMMAND')
21490  413 FORMAT('      ',I8,' VARIABLES WERE GIVEN.')
21491      ELSEIF(ICASRE.EQ.'UREC')THEN
21492        MAXREC=1
21493        JMIN=ILOCY+1
21494        JMAX=ILOCQ-1
21495        CALL EXTVAR(IHARG,IHARG2,NUMARG,JMIN,JMAX,MAXREC,
21496     1  IHNAME,IHNAM2,IUSE,NUMNAM,
21497     1  IVARN1,IVARN2,NUMVAR,IBUGA2,ISUBRO,IERROR)
21498        IF(IERROR.EQ.'YES')GOTO9000
21499        ILOCX=-1
21500        ILOCXP=-1
21501        IF(NUMVAR.EQ.1)THEN
21502          ILOCB=ILOCX+1
21503        ELSEIF(NUMVAR.EQ.0)THEN
21504          ILOCB=-1
21505        ELSE
21506          WRITE(ICOUT,999)
21507          CALL DPWRST('XXX','BUG ')
21508          WRITE(ICOUT,421)
21509          CALL DPWRST('XXX','BUG ')
21510          WRITE(ICOUT,422)
21511          CALL DPWRST('XXX','BUG ')
21512          WRITE(ICOUT,423)NUMVAR
21513          CALL DPWRST('XXX','BUG ')
21514          IERROR='YES'
21515          GOTO9000
21516        ENDIF
21517  421 FORMAT('***** ERROR IN SIMCOV (SIMCOV)--')
21518  422 FORMAT('      BETWEEN 0 AND 1 VARIABLE NAMES CAN BE SPECIFIED '
21519     1      ,'FOR THIS COMMAND')
21520  423 FORMAT('      ',I8,' VARIABLES WERE GIVEN.')
21521      ELSEIF(ICASRE.EQ.'AREC')THEN
21522        NUMFAC=INT(RECIFA+0.5)
21523CCCCC   IF(NUMFAC.GT.MAXPAR)THEN
21524CCCCC     WRITE(ICOUT,999)
21525CCCCC     CALL DPWRST('XXX','BUG ')
21526CCCCC     WRITE(ICOUT,511)
21527CCCCC     CALL DPWRST('XXX','BUG ')
21528CCCCC     WRITE(ICOUT,512)NUMFAC,MAXPAR
21529CCCCC     CALL DPWRST('XXX','BUG ')
21530CCCCC     IERROR='YES'
21531CCCCC     GOTO9000
21532CCCCC   ENDIF
21533CC511   FORMAT('***** ERROR IN SIMCOV (RECIPE ANOVA)--')
21534CC512   FORMAT('      THE REQUESTED NUMBER OF FACTORS ',I8,
21535CCCCC1        ' IS GREATER THAN THE ALLOWED MAXIMUM OF ',I8)
21536        MAXREC=NUMFAC+1
21537        JMIN=ILOCY+1
21538        JMAX=ILOCQ-1
21539        CALL EXTVAR(IHARG,IHARG2,NUMARG,JMIN,JMAX,MAXREC,
21540     1  IHNAME,IHNAM2,IUSE,NUMNAM,
21541     1  IVARN1,IVARN2,NUMVAR,IBUGA2,ISUBRO,IERROR)
21542        IF(IERROR.EQ.'YES')GOTO9000
21543        IF(NUMVAR.EQ.NUMFAC)THEN
21544          ILOCX=ILOCY+1
21545          ILOCB=-1
21546          ILOCXP=-1
21547        ELSEIF(NUMVAR.EQ.NUMFAC+1)THEN
21548          ILOCX=ILOCY+1
21549          ILOCB=ILOCX+NUMFAC
21550          ILOCXP=-1
21551        ELSE
21552          WRITE(ICOUT,999)
21553          CALL DPWRST('XXX','BUG ')
21554          WRITE(ICOUT,611)
21555          CALL DPWRST('XXX','BUG ')
21556          WRITE(ICOUT,612)NUMFAC,NUMVAR
21557          CALL DPWRST('XXX','BUG ')
21558          IERROR='YES'
21559          GOTO9000
21560        ENDIF
21561  611 FORMAT('***** ERROR IN SIMCOV (SIMCOV ANOVA)--')
21562  612 FORMAT('      ',I8,' FACTORS WERE SPECIFIED, BUT ONLY ',I8,
21563     1       ' VARIABLES WERE GIVEN ON THE COMMAND LINE.')
21564      ENDIF
21565C
21566      IF(IBUGA2.EQ.'ON')THEN
21567        WRITE(ICOUT,71)NUMVAR,NUMFAC
21568   71   FORMAT('NUMVAR,NUMFAC=',2I8)
21569        CALL DPWRST('XXX','BUG ')
21570      ENDIF
21571C
21572C               ***************************************
21573C               **  STEP 13--                        **
21574C               **  CHECK THE VALIDITY OF EACH       **
21575C               **  OF THE VARIABLES.                **
21576C               **  THE DESIGN MATRIX (X) AND BATCH  **
21577C               **  IDENTIFIER VARIABLE MUST HAVE THE**
21578C               **  SAME NUMER OF OBSERVATIONS AS THE**
21579C               **  Y VARIABLE.  THE XPRED VARIABLE  **
21580C               **  MUST HAVE AT LEAST 2 OBSERVATIONS**
21581C               ***************************************
21582C
21583      ISTEPN='13'
21584      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21585     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21586C
21587      IF(ICASRE.EQ.'UREC'.AND.NUMVAR.EQ.0)GOTO1399
21588      DO1300I=1,NUMVAR
21589C
21590      IHRIGH=IVARN1(I)
21591      IHRIG2=IVARN2(I)
21592      IHWUSE='V'
21593      MESSAG='YES'
21594      CALL CHECKN(IHRIGH,IHRIG2,IHWUSE,
21595     1IHNAME,IHNAM2,IUSE,IN,IVALUE,VALUE,NUMNAM,MAXNAM,
21596     1ISUBN1,ISUBN2,MESSAG,IANS,IWIDTH,ILOCV,IERROR)
21597      IF(IERROR.EQ.'YES')GOTO9000
21598C
21599      NRIGHT=IN(ILOCV)
21600      ILIS(I)=ILOCV
21601      ICOLR(I)=IVALUE(ILOCV)
21602C
21603      IF(ILOCXP.GT.0 .AND. I.EQ.NUMVAR)NPRED=NRIGHT
21604      IF(NRIGHT.EQ.NLEFT)GOTO1390
21605      IF(ILOCXP.GT.0 .AND. I.EQ.NUMVAR .AND. NRIGHT.GT.2)GOTO1390
21606C
21607      WRITE(ICOUT,999)
21608      CALL DPWRST('XXX','BUG ')
21609      WRITE(ICOUT,1311)
21610 1311 FORMAT('***** ERROR IN SIMCOV--')
21611      CALL DPWRST('XXX','BUG ')
21612      WRITE(ICOUT,1312)
21613 1312 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
21614      CALL DPWRST('XXX','BUG ')
21615      WRITE(ICOUT,1321)
21616 1321 FORMAT('      FOR THE INDEPENDENT VARIABLES')
21617      CALL DPWRST('XXX','BUG ')
21618      WRITE(ICOUT,1322)
21619 1322 FORMAT('      MUST BE THE SAME AS THE DEPENDENT VARIABLE.')
21620      CALL DPWRST('XXX','BUG ')
21621      WRITE(ICOUT,1323)
21622 1323 FORMAT('      IN ADDITION, THE VARIABLE CONTAINING THE X ')
21623      CALL DPWRST('XXX','BUG ')
21624      WRITE(ICOUT,1324)
21625 1324 FORMAT('      VALUES FOR THE TOLERANCE LIMITS MUST HAVE AT ',
21626     1'LEAST 2 ELEMENTS.')
21627      CALL DPWRST('XXX','BUG ')
21628      WRITE(ICOUT,1327)
21629 1327 FORMAT('      SUCH WAS NOT THE CASE HERE.')
21630      CALL DPWRST('XXX','BUG ')
21631      WRITE(ICOUT,1328)
21632 1328 FORMAT('      THE ENTERED COMMAND LINE WAS AS FOLLOWS--')
21633      CALL DPWRST('XXX','BUG ')
21634      IF(IWIDTH.GE.1)WRITE(ICOUT,1329)(IANS(J),J=1,MIN(80,IWIDTH))
21635 1329 FORMAT('      ',80A1)
21636      IF(IWIDTH.GE.1)CALL DPWRST('XXX','BUG ')
21637      IERROR='YES'
21638      GOTO9000
21639 1390 CONTINUE
21640C
21641 1300 CONTINUE
21642 1399 CONTINUE
21643C
21644C               **********************************************
21645C               **  STEP 6.3--                              **
21646C               **  FOR ALL VARIATIONS OF THE SIMCOV COMMAND,*
21647C               **  CHECK TO SEE THE TYPE CASE--            **
21648C               **    1) UNQUALIFIED (THAT IS, FULL);       **
21649C               **    2) SUBSET/EXCEPT; OR                  **
21650C               **    3) FOR.                               **
21651C               **********************************************
21652C
21653      ISTEPN='6.3'
21654      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21655     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21656C
21657      ICASEQ='FULL'
21658      ILOCQ=NUMARG+1
21659      IF(NUMARG.LT.1)GOTO490
21660      DO400J=1,NUMARG
21661      J1=J
21662      IF(IHARG(J).EQ.'SUBS'.AND.IHARG2(J).EQ.'ET  ')GOTO410
21663      IF(IHARG(J).EQ.'EXCE'.AND.IHARG2(J).EQ.'PT  ')GOTO410
21664      IF(IHARG(J).EQ.'FOR '.AND.IHARG2(J).EQ.'    ')GOTO420
21665  400 CONTINUE
21666      GOTO490
21667  410 CONTINUE
21668      ICASEQ='SUBS'
21669      IKEY='SUBS'
21670      IF(IHARG(J1).EQ.'EXCE')IKEY='EXCE'
21671      ILOCQ=J1
21672      GOTO490
21673  420 CONTINUE
21674      ICASEQ='FOR'
21675      ILOCQ=J1
21676      GOTO490
21677  490 CONTINUE
21678      IF(IBUGA2.EQ.'OFF'.AND.ISUBRO.NE.'MCOV')GOTO495
21679      WRITE(ICOUT,491)NUMARG,ILOCQ
21680  491 FORMAT('NUMARG,ILOCQ = ',2I8)
21681      CALL DPWRST('XXX','BUG ')
21682  495 CONTINUE
21683C
21684C               *******************************************************
21685C               **  STEP 12--                                        **
21686C               **  BRANCH TO THE APPROPRIATE SUBCASE; THEN          **
21687C               **  COPY OVER THE RESPONSE VECTOR TO BE USED IN THE  **
21688C               **  MODEL INTO THE VECTOR Y2; AND                    **
21689C               **  COPY OVER THE VECTORS THAT WERE USED IN THE MODEL**
21690C               **  INTO THE FULL DESIGN MATRIX                      **
21691C               *******************************************************
21692C
21693      ISTEPN='12'
21694      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21695     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21696C
21697      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')WRITE(ICOUT,601)NLEFT,NUMVAR
21698  601 FORMAT('NLEFT,NUMVAR = ',2I8)
21699      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')CALL DPWRST('XXX','BUG ')
21700C
21701      IF(ICASEQ.EQ.'FULL')GOTO610
21702      IF(ICASEQ.EQ.'SUBS')GOTO620
21703      IF(ICASEQ.EQ.'FOR')GOTO630
21704C
21705  610 CONTINUE
21706      DO615I=1,NLEFT
21707      ISUB(I)=1
21708  615 CONTINUE
21709      NQ=NLEFT
21710      GOTO650
21711C
21712  620 CONTINUE
21713      NIOLD=NLEFT
21714CCCCC CALL DPSUB2(NIOLD,ILOCS,NS,IBUGQ,IERROR)
21715      CALL DPSUBS(NIOLD,ILOCS,NS,IBUGQ,IERROR)
21716      NQ=NIOLD
21717      GOTO650
21718C
21719  630 CONTINUE
21720      NIOLD=NLEFT
21721      CALL DPFOR(NIOLD,NFOR,IROW1,IROWN,
21722     1NLOCAL,ILOCS,NS,IBUGQ,IERROR)
21723      NQ=NFOR
21724      GOTO650
21725C
21726  650 CONTINUE
21727      NTOT=NQ
21728      K=ICOLL
21729      J=0
21730      DO4500I=1,NLEFT
21731      IF(ISUB(I).EQ.0)GOTO4500
21732      J=J+1
21733      IJ=MAXN*(K-1)+I
21734      IF(K.LE.MAXCOL)Y2(J)=DBLE(V(IJ))
21735      IF(K.EQ.MAXCP1)Y2(J)=DBLE(PRED(I))
21736      IF(K.EQ.MAXCP2)Y2(J)=DBLE(RES(I))
21737      IF(K.EQ.MAXCP3)Y2(J)=DBLE(YPLOT(I))
21738      IF(K.EQ.MAXCP4)Y2(J)=DBLE(XPLOT(I))
21739      IF(K.EQ.MAXCP5)Y2(J)=DBLE(X2PLOT(I))
21740      IF(K.EQ.MAXCP6)Y2(J)=DBLE(TAGPLO(I))
21741 4500 CONTINUE
21742      IF(IBUGA2.EQ.'ON')THEN
21743        DO4503I=1,NTOT
21744        WRITE(ICOUT,4504)I,Y2(I)
21745 4504   FORMAT('I,Y2(I)=',I8,2X,D15.7)
21746        CALL DPWRST('XXX','BUG ')
21747 4503   CONTINUE
21748      ENDIF
21749C
21750C     ********************************************************
21751C     ** DEFINE A VECTOR OF ALL 1'S (FOR THE CONSTANT TERM) **
21752C     ** IN THE DESIGN MATRIX.                              **
21753C     ********************************************************
21754C
21755      J=0
21756      DO380I=1,NLEFT
21757      IF(ISUB(I).EQ.0)GOTO380
21758      J=J+1
21759      XMAT(J)=1.0D0
21760  380 CONTINUE
21761C
21762C     ********************************************************
21763C     ** DETERMINE IF THERE IS A BATCH VARIABLE.  IF NOT,   **
21764C     ** CREATE ONE EQUAL TO ALL 1'S.  IF YES, DETERMINE    **
21765C     ** HOW MANY UNIQUE VALUES.                            **
21766C     ********************************************************
21767C
21768      IF(ILOCB.LE.0)THEN
21769        J=0
21770        DO4610I=1,NLEFT
21771          IF(ISUB(I).EQ.0)GOTO4610
21772          J=J+1
21773          IQ(J)=1
21774 4610   CONTINUE
21775        NBCH=1
21776        GOTO4699
21777      ENDIF
21778C
21779      IF(ICASRE.EQ.'FREC')THEN
21780        K=ICOLR(NUMVAR)
21781        IF(ILOCXP.GT.0)K=ICOLR(NUMVAR-1)
21782      ELSE
21783        K=ICOLR(NUMVAR)
21784      ENDIF
21785C
21786      J=0
21787      DO4600I=1,NLEFT
21788      IF(ISUB(I).EQ.0)GOTO4600
21789      J=J+1
21790      IJ=MAXN*(K-1)+I
21791      IF(K.LE.MAXCOL)RES2(J)=V(IJ)
21792      IF(K.EQ.MAXCP1)RES2(J)=PRED(I)
21793      IF(K.EQ.MAXCP2)RES2(J)=RES(I)
21794      IF(K.EQ.MAXCP3)RES2(J)=YPLOT(I)
21795      IF(K.EQ.MAXCP4)RES2(J)=XPLOT(I)
21796      IF(K.EQ.MAXCP5)RES2(J)=X2PLOT(I)
21797      IF(K.EQ.MAXCP6)RES2(J)=TAGPLO(I)
21798 4600 CONTINUE
21799C
21800      CALL SORT(RES2,NQ,PRED2)
21801      IWRITE='NO'
21802      CALL DISTIN(PRED2,NQ,IWRITE,PRED2,NBCH,IBUGA3,IERROR)
21803      IF(IERROR.EQ.'YES')GOTO9000
21804      DO4650I=1,NQ
21805        IQ(I)=0
21806        DO4660J=1,NBCH
21807          IF(RES2(I).EQ.PRED2(J))THEN
21808            IQ(I)=J
21809            GOTO4650
21810          ENDIF
21811 4660   CONTINUE
21812 4650 CONTINUE
21813C
21814 4699 CONTINUE
21815C
21816      IF(IBUGA2.EQ.'ON')THEN
21817        DO4603I=1,NTOT
21818        WRITE(ICOUT,4604)I,IQ(I)
21819 4604   FORMAT('I,IQ(I)=',I8,2X,I8)
21820        CALL DPWRST('XXX','BUG ')
21821 4603   CONTINUE
21822      ENDIF
21823C
21824C     ********************************************************
21825C     ** DETERMINE IF THERE IS A PREDICTED VARIABLE (FIT    **
21826C     ** CASE ONLY).  IF SO, EXTRACT AND PUT IN XPTS.       **
21827C     ********************************************************
21828C
21829      IF(ICASRE.EQ.'UREC')THEN
21830        XPTS(1)=1.D0
21831        NPRED=1
21832        NPAR=1
21833        GOTO4799
21834      ELSEIF(ILOCXP.LT.0.OR.ICASRE.EQ.'AREC')THEN
21835        XPTS(1:MAXOBV/2)=0.D0
21836        NPRED=0
21837        GOTO4799
21838      ENDIF
21839C
21840      K=ICOLR(NUMVAR)
21841      DO4703I=1,NPRED
21842        XPTS(I)=1.D0
21843 4703 CONTINUE
21844      J=NPRED
21845      DO4700I=1,NPRED
21846      IF(ISUB(I).EQ.0)GOTO4700
21847      J=J+1
21848      IJ=MAXN*(K-1)+I
21849      IF(K.LE.MAXCOL)XPTS(J)=DBLE(V(IJ))
21850      IF(K.EQ.MAXCP1)XPTS(J)=DBLE(PRED(I))
21851      IF(K.EQ.MAXCP2)XPTS(J)=DBLE(RES(I))
21852      IF(K.EQ.MAXCP3)XPTS(J)=DBLE(YPLOT(I))
21853      IF(K.EQ.MAXCP4)XPTS(J)=DBLE(XPLOT(I))
21854      IF(K.EQ.MAXCP5)XPTS(J)=DBLE(X2PLOT(I))
21855      IF(K.EQ.MAXCP6)XPTS(J)=DBLE(TAGPLO(I))
21856 4700 CONTINUE
21857C
21858 4799 CONTINUE
21859C
21860      IF(IBUGA2.EQ.'ON')THEN
21861        DO4713I=1,2*NPRED
21862        WRITE(ICOUT,4714)I,XPTS(I)
21863 4714   FORMAT('I,XPTS(I)=',I8,2X,D15.7)
21864        CALL DPWRST('XXX','BUG ')
21865 4713   CONTINUE
21866      ENDIF
21867C
21868C     ********************************************************
21869C     ** COPY OVER THE FULL DESIGN MATRIX.                  **
21870C     ********************************************************
21871C
21872      IF(ICASRE.EQ.'FREC')THEN
21873        NPAR=1
21874        IF(ICASDG.EQ.'0')GOTO379
21875        IF(ICASDG.EQ.'1')NLOOP=1
21876        IF(ICASDG.EQ.'2')NLOOP=2
21877        IF(ICASDG.EQ.'3')NLOOP=3
21878        IF(ICASDG.EQ.'4')NLOOP=4
21879        IF(ICASDG.EQ.'5')NLOOP=5
21880        IF(ICASDG.EQ.'6')NLOOP=6
21881        IF(ICASDG.EQ.'7')NLOOP=7
21882        IF(ICASDG.EQ.'8')NLOOP=8
21883        IF(ICASDG.EQ.'9')NLOOP=9
21884        IF(ICASDG.EQ.'10')NLOOP=10
21885        K=ICOLR(1)
21886        DO376IVAR=1,NLOOP
21887          J=IVAR*NTOT
21888          DO371I=1,NLEFT
21889            IF(ISUB(I).EQ.0)GOTO371
21890            J=J+1
21891            IJ=MAXN*(K-1)+I
21892            IF(K.LE.MAXCOL)XMAT(J)=DBLE(V(IJ)**NLOOP)
21893            IF(K.EQ.MAXCP1)XMAT(J)=DBLE(PRED(I)**NLOOP)
21894            IF(K.EQ.MAXCP2)XMAT(J)=DBLE(RES(I)**NLOOP)
21895            IF(K.EQ.MAXCP3)XMAT(J)=DBLE(YPLOT(I)**NLOOP)
21896            IF(K.EQ.MAXCP4)XMAT(J)=DBLE(XPLOT(I)**NLOOP)
21897            IF(K.EQ.MAXCP5)XMAT(J)=DBLE(X2PLOT(I)**NLOOP)
21898            IF(K.EQ.MAXCP6)XMAT(J)=DBLE(TAGPLO(I)**NLOOP)
21899  371     CONTINUE
21900  376   CONTINUE
21901        NPAR=NLOOP+1
21902  379   CONTINUE
21903C
21904      ELSEIF(ICASRE.EQ.'UREC')THEN
21905        NPAR=1
21906        J=NTOT
21907CCCCC   DO372I=1,NLEFT
21908CCCCC     IF(ISUB(I).EQ.0)GOTO372
21909CCCCC     J=J+1
21910CCCCC     XMAT(J)=1.D0
21911C372    CONTINUE
21912      ELSEIF(ICASRE.EQ.'AREC')THEN
21913        NLOOP=NUMVAR
21914        IF(ILOCB.GT.0)NLOOP=NUMVAR-1
21915        DO389IVAR=1,NLOOP
21916          K=ICOLR(IVAR)
21917          J=IVAR*NTOT
21918          DO381I=1,NLEFT
21919            IF(ISUB(I).EQ.0)GOTO381
21920            J=J+1
21921            IJ=MAXN*(K-1)+I
21922            IF(K.LE.MAXCOL)XMAT(J)=DBLE(V(IJ))
21923            IF(K.EQ.MAXCP1)XMAT(J)=DBLE(PRED(I))
21924            IF(K.EQ.MAXCP2)XMAT(J)=DBLE(RES(I))
21925            IF(K.EQ.MAXCP3)XMAT(J)=DBLE(YPLOT(I))
21926            IF(K.EQ.MAXCP4)XMAT(J)=DBLE(XPLOT(I))
21927            IF(K.EQ.MAXCP5)XMAT(J)=DBLE(X2PLOT(I))
21928            IF(K.EQ.MAXCP6)XMAT(J)=DBLE(TAGPLO(I))
21929  381     CONTINUE
21930  389   CONTINUE
21931        NPAR=NLOOP+1
21932      ENDIF
21933C
21934      IF(IBUGA2.EQ.'ON')THEN
21935        DO4803I=1,NTOT*NPAR
21936        WRITE(ICOUT,4804)I,XMAT(I)
21937 4804   FORMAT('I,XMAT(I)=',I8,2X,D15.7)
21938        CALL DPWRST('XXX','BUG ')
21939 4803   CONTINUE
21940      ENDIF
21941C
21942C               ******************************************************
21943C               **  STEP 14--                                       **
21944C               **  CARRY OUT THE ACTUAL FIT                        **
21945C               **  VIA CALLING                                     **
21946C               **  REGINI AND REGDAT                               **
21947C               ******************************************************
21948C
21949      NSTOR=NTOT*(NPAR+NBCH)
21950      IF(NSTOR.GT.MAXPT1)THEN
21951        WRITE(ICOUT,999)
21952        CALL DPWRST('XXX','BUG ')
21953        WRITE(ICOUT,6071)
21954        CALL DPWRST('XXX','BUG ')
21955        WRITE(ICOUT,6072)NSTOR
21956        CALL DPWRST('XXX','BUG ')
21957        WRITE(ICOUT,6073)MAXPT1
21958        CALL DPWRST('XXX','BUG ')
21959        IERROR='YES'
21960        GOTO9000
21961      ENDIF
21962 6071 FORMAT('***** ERROR FROM SIMCOV--THE AMOUNT OF SCRATCH STORAGE ',
21963     1'REQUIRED')
21964 6072 FORMAT('     NUMBER OF POINTS*(NUMBER OF PARAMETERS + NUMBER OF',
21965     1' BATCHES) = ',I8)
21966 6073 FORMAT('     EXCEEDS THE MAXIMIM ALLOWABLE OF ',I8)
21967      ISTEPN='14'
21968      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')
21969     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21970C
21971      IF(IBUGA2.EQ.'OFF'.AND.ISUBRO.NE.'MCOV')GOTO6099
21972      WRITE(ICOUT,999)
21973      CALL DPWRST('XXX','BUG ')
21974      WRITE(ICOUT,6081)
21975 6081 FORMAT('***** FROM SIMCOV, AS ABOUT TO CALL REGINI--')
21976      CALL DPWRST('XXX','BUG ')
21977 6099 CONTINUE
21978C
21979      SATT=.FALSE.
21980      IF(IRECSA.EQ.'YES'.OR.IRECSA.EQ.'TRUE'.OR.IRECSA.EQ.'ON')
21981     1SATT=.TRUE.
21982      NREPS=IRECR2
21983      MAXREP=10*MAXOBV
21984      IF(NREPS.GT.MAXREP)THEN
21985        NREPS=MAXREP
21986        WRITE(ICOUT,998)
21987        CALL DPWRST('XXX','WRIT')
21988        WRITE(ICOUT,6531)NREPS,MAXREP
21989        CALL DPWRST('XXX','WRIT')
21990        WRITE(ICOUT,6532)
21991        CALL DPWRST('XXX','WRIT')
21992        WRITE(ICOUT,998)
21993        CALL DPWRST('XXX','WRIT')
21994      ENDIF
21995  998 FORMAT(1X)
21996 6531 FORMAT('THE REQUESTED NUMBER OF SIMULATION REPLICATIONS ',I8,
21997     1' IS GREATER THAN THE ALLOWED MAXIMUM OF ',I8)
21998 6532 FORMAT('THE MAXIMUM ALLOWED NUMBER OF REPLICATIONS WILL BE ',
21999     1'USED.')
22000      WRITE(ICOUT,999)
22001      CALL DPWRST('XXX','WRIT')
22002      WRITE(ICOUT,1032)
22003 1032 FORMAT(20X,'RECIPE SIMCOV ANALYSIS')
22004      CALL DPWRST('XXX','WRIT')
22005      WRITE(ICOUT,1132)
22006 1132 FORMAT(22X,'(MARK VANGEL, NIST)')
22007      CALL DPWRST('XXX','WRIT')
22008      WRITE(ICOUT,998)
22009      CALL DPWRST('XXX','WRIT')
22010      WRITE(ICOUT,1033)NTOT
22011 1033 FORMAT('NUMBER OF OBSERVATIONS         = ',I8)
22012      CALL DPWRST('XXX','WRIT')
22013      WRITE(ICOUT,1035)NBCH
22014 1035 FORMAT('NUMBER OF BATCHES              = ',I8)
22015      CALL DPWRST('XXX','WRIT')
22016      WRITE(ICOUT,1036)IRECR1
22017 1036 FORMAT('NUMBER OF SIMCOV SIMULATIONS   = ',I8)
22018      CALL DPWRST('XXX','WRIT')
22019      WRITE(ICOUT,1037)RECIPC
22020 1037 FORMAT('PROBABILITY CONTENT            = ',G15.7)
22021      CALL DPWRST('XXX','WRIT')
22022      WRITE(ICOUT,1039)
22023 1039 FORMAT('NOTE: PLEASE BE PATIENT.  THE SIMULATION CAN TAKE ',
22024     1'SOME TIME.')
22025      CALL DPWRST('XXX','WRIT')
22026      WRITE(ICOUT,998)
22027      CALL DPWRST('XXX','WRIT')
22028      WRITE(ICOUT,1041)
22029 1041 FORMAT('  CORRELATION      PROBABILITY')
22030      CALL DPWRST('XXX','WRIT')
22031C
22032      CALL REGINI(NLVL,NPAR,NTOT,NBCH,NPRED,XDESGN,XPTS,IP,IQ,
22033     1            DBLE(RECIPC),DBLE(RECICO),XMAT,XTX,XTXI,XN,SCRTCH,
22034     1            S1,V1,S2,V2,TLM0,TLM1,ETA0,ETA1,
22035     1            SATT,IN2,WK2,WK3,
22036     1            CRT,ISEED,MAXREP,MAXLVL,
22037     1            ICASRE,ISUBRO,IBUGA2,IERROR)
22038      IF(IERROR.EQ.'YES')GOTO9000
22039      IF(IBUGA2.EQ.'OFF'.AND.ISUBRO.NE.'MCOV')GOTO6199
22040      WRITE(ICOUT,999)
22041      CALL DPWRST('XXX','BUG ')
22042      WRITE(ICOUT,6181)
22043 6181 FORMAT('***** FROM SIMCOV, AS ABOUT TO PERFORM SIMULATION--')
22044      CALL DPWRST('XXX','BUG ')
22045 6199 CONTINUE
22046C
22047      NSIM=IRECR1
22048      NRHO=IRECC1
22049      NRAN=1
22050C
22051      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')THEN
22052        WRITE(ICOUT,6185)NSIM,NRHO,NRAN,NPRED
22053 6185   FORMAT('NSIM,NRHO,NRAN,NPRED=',4I8)
22054        CALL DPWRST('XXX','BUG ')
22055      ENDIF
22056C
22057C  LOOP OVER INTRACLASS CORRELATION VALUES
22058C
22059      DO7000 IRHO=1,NRHO
22060        RHO=DBLE(IRHO-1)/DBLE(NRHO-1)
22061        IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')THEN
22062          WRITE(ICOUT,7005)IRHO,RHO
22063 7005     FORMAT('IRHO,RHO=',I8,E15.7)
22064          CALL DPWRST('XXX','BUG ')
22065        ENDIF
22066        CALL NODPPF(DBLE(RECIPC),PCT)
22067        PCT=-PCT
22068        SDB=DSQRT(RHO)
22069        SDW=DSQRT(1.0D0-RHO)
22070        IF(NBCH.EQ.1)THEN
22071          SDB=0.0D0
22072          SDW=1.0D0
22073        ENDIF
22074        DO7049 IDX=1,NPRED
22075          COV(IDX)=0.D0
22076CCCCC     XMU(IDX)=0.D0
22077 7049   CONTINUE
22078        DO5000 IDX=1,NSIM
22079          CALL NORRAN(NBCH,ISEED,RES2)
22080          DO5021I=1,NTOT
22081            CALL NORRAN(NRAN,ISEED,XTMP)
22082            ERR=DBLE(XTMP(1))
22083            Y2(I)=DBLE(RES2(IQ(I)))*SDB + ERR*SDW
22084 5021     CONTINUE
22085C
22086        IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')THEN
22087          WRITE(ICOUT,7009)
22088 7009     FORMAT('BEFORE CALL TO REGDAT')
22089          CALL DPWRST('XXX','BUG ')
22090        ENDIF
22091        IFLAG='SIMC'
22092        CALL REGDAT(NPAR,NTOT,NBCH,NPRED,XPTS,Y2,COEF,
22093     1            SCRTCH,S1,V1,TLM0,TLM1,ETA0,ETA1,
22094     1            XMAT,XM,T,XDESGN,NLVL,
22095     1            ICASRE,IFLAG,ISUBRO,IBUGA2,IERROR)
22096      IF(IERROR.EQ.'YES')GOTO9000
22097      IF(IBUGA2.EQ.'ON'.OR.ISUBRO.EQ.'MCOV')THEN
22098        WRITE(ICOUT,7019)
22099 7019   FORMAT('NPRED = ',I8)
22100        CALL DPWRST('XXX','BUG ')
22101      ENDIF
22102      DO4000I=1,NPRED
22103        IF(T(I).LT.PCT) COV(I) = COV(I)+1.0D0
22104 4000 CONTINUE
22105 5000 CONTINUE
22106C
22107      WRITE(ICOUT,998)
22108      CALL DPWRST('XXX','WRIT')
22109      DO6000I=1,NPRED
22110        WRITE(ICOUT,2000)RHO,COV(I)/DBLE(NSIM)
22111 2000   FORMAT(2F12.4)
22112        CALL DPWRST('XXX','WRIT')
22113 6000 CONTINUE
22114C
22115 7000 CONTINUE
22116C
22117C               ***************************************
22118C               **  STEP 16--                        **
22119C               **  STORE THE TOLERANCE VALUES       **
22120C               ***************************************
22121C7640 CONTINUE
22122CCCCC IH=IRECTN(1:4)
22123CCCCC IH2=IRECTN(5:8)
22124C
22125CCCCC NEWNAM='NO'
22126CCCCC DO7650I=1,NUMNAM
22127CCCCC I2=I
22128CCCCC IF(IH.EQ.IHNAME(I).AND.IH2.EQ.IHNAM2(I).AND.
22129CCCCC1IUSE(I).EQ.'V')THEN
22130CCCCC   ICOLL1=IVALUE(I2)
22131CCCCC   GOTO7680
22132CCCCC ENDIF
22133CCCCC IF(IH.EQ.IHNAME(I).AND.IH2.EQ.IHNAM2(I).AND.
22134CCCCC1IUSE(I).NE.'V')THEN
22135CCCCC   WRITE(ICOUT,7646)
22136C7646   FORMAT('***** ERROR IN SIMCOV--')
22137CCCCC   CALL DPWRST('XXX','BUG ')
22138CCCCC   WRITE(ICOUT,7647)IRECTN
22139C7647   FORMAT('      THE REQUESTED NAME FOR THE TOLERANCE ',
22140CCCCC1         'VARIABLE, ',A8,', WAS FOUND IN THE')
22141CCCCC   CALL DPWRST('XXX','BUG ')
22142CCCCC   WRITE(ICOUT,7648)
22143C7648   FORMAT('      CURRENT NAME LIST, BUT NOT AS A VARIABLE.')
22144CCCCC   CALL DPWRST('XXX','BUG ')
22145CCCCC   WRITE(ICOUT,7649)
22146C7649   FORMAT('      THEREFORE THE TOLERANCE VARIABLE WAS NOT ',
22147CCCCC1         'UPDATED.')
22148CCCCC   CALL DPWRST('XXX','BUG ')
22149CCCCC   GOTO7699
22150CCCCC ENDIF
22151C7650 CONTINUE
22152CCCCC NEWNAM='YES'
22153C
22154C  NEW VARIABLE, CHECK TO ENSURE MAXIMUM NAMES AND MAXIMUM
22155C  COLUMNS NOT EXCEEDED.
22156C
22157CCCCC IF(NUMNAM.GE.MAXNAM)THEN
22158CCCCC   WRITE(ICOUT,7651)
22159C7651   FORMAT('***** ERROR IN SIMCOV--')
22160CCCCC   CALL DPWRST('XXX','BUG ')
22161CCCCC   WRITE(ICOUT,7652)
22162C7652   FORMAT('      THE TOTAL NUMBER OF (VARIABLE + PARAMETER)')
22163CCCCC   CALL DPWRST('XXX','BUG ')
22164CCCCC   WRITE(ICOUT,7653)MAXNAM
22165C7653   FORMAT('      NAMES MUST BE AT MOST ',I8)
22166CCCCC   CALL DPWRST('XXX','BUG ')
22167CCCCC   WRITE(ICOUT,7654)
22168C7654   FORMAT('      SUCH WAS NOT THE CASE HERE--')
22169CCCCC   CALL DPWRST('XXX','BUG ')
22170CCCCC   WRITE(ICOUT,7655)
22171C7655   FORMAT('      THE MAXIMUM ALLOWABLE NUMBER OF NAMES')
22172CCCCC   CALL DPWRST('XXX','BUG ')
22173CCCCC   WRITE(ICOUT,7656)
22174C7656   FORMAT('      WAS JUST EXCEEDED.')
22175CCCCC   CALL DPWRST('XXX','BUG ')
22176CCCCC   WRITE(ICOUT,7657)
22177C7657   FORMAT('      SUGGESTED ACTION--ENTER     STAT')
22178CCCCC   CALL DPWRST('XXX','BUG ')
22179CCCCC   WRITE(ICOUT,7658)
22180C7658   FORMAT('      TO DETERMINE THE IMPORTANT')
22181CCCCC   CALL DPWRST('XXX','BUG ')
22182CCCCC   WRITE(ICOUT,7659)
22183C7659   FORMAT('      (VERSUS UNIMPORTANT) VARIABLES')
22184CCCCC   CALL DPWRST('XXX','BUG ')
22185CCCCC   WRITE(ICOUT,7660)
22186C7660   FORMAT('      AND PARAMETERS, AND THEN REUSE SOME')
22187CCCCC   CALL DPWRST('XXX','BUG ')
22188CCCCC   WRITE(ICOUT,7661)
22189C7661   FORMAT('      OF THE NAMES.')
22190CCCCC   CALL DPWRST('XXX','BUG ')
22191CCCCC   WRITE(ICOUT,7662)
22192C7662   FORMAT('      THE TOLERANCE VARIABLE WAS NOT UPDATED--')
22193CCCCC   CALL DPWRST('XXX','BUG ')
22194CCCCC   GOTO7699
22195CCCCC ENDIF
22196C
22197CCCCC IF(NUMCOL.GE.MAXCOL)THEN
22198CCCCC   WRITE(ICOUT,7665)
22199C7665   FORMAT('***** ERROR IN SIMCOV--')
22200CCCCC   CALL DPWRST('XXX','BUG ')
22201CCCCC   WRITE(ICOUT,7666)
22202C7666   FORMAT('      THE NUMBER OF DATA COLUMNS')
22203CCCCC   CALL DPWRST('XXX','BUG ')
22204CCCCC   WRITE(ICOUT,7667)MAXCOL
22205C7667   FORMAT('      HAS JUST EXCEEDED THE MAX ALLOWABLE ',I8,'  .')
22206CCCCC   CALL DPWRST('XXX','BUG ')
22207CCCCC   WRITE(ICOUT,7668)
22208C7668   FORMAT('      SUGGESTED ACTION--')
22209CCCCC   CALL DPWRST('XXX','BUG ')
22210CCCCC   WRITE(ICOUT,7669)
22211C7669   FORMAT('      ENTER      STATUS VARIABLES')
22212CCCCC   CALL DPWRST('XXX','BUG ')
22213CCCCC   WRITE(ICOUT,7670)
22214C7670   FORMAT('      TO FIND OUT THE FULL LIST OF USED COLUMNS')
22215CCCCC   CALL DPWRST('XXX','BUG ')
22216CCCCC   WRITE(ICOUT,7671)
22217C7671   FORMAT('      AND THEN DELETE SOME COLUMNS.')
22218CCCCC   CALL DPWRST('XXX','BUG ')
22219CCCCC   WRITE(ICOUT,7672)
22220C7672   FORMAT('      THE TOLERANCE VARIABLE WAS NOT UPDATED--')
22221CCCCC   CALL DPWRST('XXX','BUG ')
22222CCCCC   GOTO7699
22223CCCCC ENDIF
22224C
22225C7680 CONTINUE
22226CCCCC IF(NEWNAM.EQ.'YES')THEN
22227CCCCC   NUMCOL=NUMCOL+1
22228CCCCC   ICOLL1=NUMCOL
22229CCCCC   NUMNAM=NUMNAM+1
22230CCCCC   IHNAME(NUMNAM)=IH
22231CCCCC   IHNAM2(NUMNAM)=IH2
22232CCCCC   IUSE(NUMNAM)='V'
22233CCCCC   VALUE(NUMNAM)=ICOLL1
22234CCCCC   IVALUE(NUMNAM)=ICOLL1
22235CCCCC   NTEMP=NTOT
22236CCCCC   IF(ICASRE.EQ.'FREC'.AND.ILOCXP.GT.0)NTEMP=NPRED
22237CCCCC   IN(NUMNAM)=NTEMP
22238CCCCC   IF(IBUGA2.EQ.'ON')THEN
22239CCCCC     WRITE(ICOUT,7683)IN(NUMNAM)
22240C7683     FORMAT('IN(NUMNAM)=',I8)
22241CCCCC     CALL DPWRST('XXX','BUG ')
22242CCCCC   ENDIF
22243CCCCC ELSE
22244CCCCC   NTEMP=NTOT
22245CCCCC   IF(ICASRE.EQ.'FREC'.AND.ILOCXP.GT.0)NTEMP=NPRED
22246CCCCC   IF(ICASRE.EQ.'UREC')NTEMP=1
22247CCCCC   IN(ICOLL1)=NTEMP
22248CCCCC   IF(IBUGA2.EQ.'ON')THEN
22249CCCCC     WRITE(ICOUT,7686)IN(ICOLL1)
22250C7686     FORMAT('IN(ICOLL1)=',I8)
22251CCCCC     CALL DPWRST('XXX','BUG ')
22252CCCCC   ENDIF
22253CCCCC ENDIF
22254CCCCC IF(IBUGA2.EQ.'ON')THEN
22255CCCCC   WRITE(ICOUT,7681)NEWNAM,ICOLL1,NUMCOL,NUMNAM,NPRED,NTEMP
22256CCCCC   CALL DPWRST('XXX','BUG ')
22257C7681   FORMAT('NEWNAM,ICOLL1,NUMCOL,NUMNAM,NPRED,NTEMP =',
22258CCCCC1         A4,1X,5I8)
22259CCCCC ENDIF
22260CCCCC K=ICOLL1
22261CCCCC DO7682I=1,NTEMP
22262CCCCC   IJ=MAXN*(K-1)+I
22263CCCCC   IF(K.LE.MAXCOL)V(IJ)=T(I)
22264CCCCC   IF(K.EQ.MAXCP1)PRED(I)=T(I)
22265CCCCC   IF(K.EQ.MAXCP1)RES(I)=T(I)
22266CCCCC   IF(K.EQ.MAXCP1)YPLOT(I)=T(I)
22267CCCCC   IF(K.EQ.MAXCP1)XPLOT(I)=T(I)
22268CCCCC   IF(K.EQ.MAXCP1)X2PLOT(I)=T(I)
22269CCCCC   IF(K.EQ.MAXCP1)TAGPLO(I)=T(I)
22270C7682 CONTINUE
22271C
22272C7699 CONTINUE
22273C
22274C8000 CONTINUE
22275C
22276C               *****************
22277C               **  STEP 90--  **
22278C               **  EXIT       **
22279C               *****************
22280C
22281 9000 CONTINUE
22282      IF(IBUGA2.EQ.'OFF'.AND.ISUBRO.NE.'MCOV')GOTO9090
22283      WRITE(ICOUT,999)
22284      CALL DPWRST('XXX','BUG ')
22285      WRITE(ICOUT,9011)
22286 9011 FORMAT('***** AT THE END       OF SIMCOV--')
22287      CALL DPWRST('XXX','BUG ')
22288      WRITE(ICOUT,9012)IBUGA2,IBUGA3
22289 9012 FORMAT('IBUGA2,IBUGA3 = ',A4,2X,A4)
22290      CALL DPWRST('XXX','BUG ')
22291      WRITE(ICOUT,9013)IBUGCO,IBUGEV,IBUGQ
22292 9013 FORMAT('IBUGCO,IBUGEV,IBUGQ = ',A4,2X,A4,2X,A4)
22293      CALL DPWRST('XXX','BUG ')
22294      WRITE(ICOUT,9015)NPAR,NTOT,NBCH,NLVL,ICASRE
22295 9015 FORMAT('NPAR,NTOT,NBCH,NLEVL,ICASRE = ',4(I8,1X),2X,A4)
22296      CALL DPWRST('XXX','BUG ')
22297      WRITE(ICOUT,9052)ICASEQ
22298 9052 FORMAT('ICASEQ = ',A4)
22299      CALL DPWRST('XXX','BUG ')
22300      WRITE(ICOUT,9061)IWIDTH
22301 9061 FORMAT('IWIDTH = ',I8)
22302      CALL DPWRST('XXX','BUG ')
22303      IF(IWIDTH.GE.1)WRITE(ICOUT,9062)(IANS(I),I=1,MIN(100,IWIDTH))
22304 9062 FORMAT('(IANS(I),I=1,IWIDTH) = ',100A1)
22305      IF(IWIDTH.GE.1)CALL DPWRST('XXX','BUG ')
22306      WRITE(ICOUT,9069)IFOUND,IERROR
22307 9069 FORMAT('IFOUND,IERROR = ',A4,2X,A4)
22308      CALL DPWRST('XXX','BUG ')
22309 9090 CONTINUE
22310C
22311      RETURN
22312      END
22313      SUBROUTINE SIMPLX(A,M,N,MP,NP,M1,M2,M3,
22314     1ICASE,IZROV,IPOSV,IBUGA3,ISUBRO,IERROR)
22315C
22316C     PURPOSE--CARRY OUT SIMPLEX LINEAR PROGRAMMING SOLUTION
22317C
22318C     INPUT  ARGUMENTS--
22319C
22320C     SOURCE--NUMERICAL RECIPES,
22321C             PRESS, FLANNERY, TEUKOLSKY, AND VETTERLING,
22322C             CAMBRIDGE UNIVERSITY PRESS, 1986.
22323C
22324C---------------------------------------------------------------------
22325C
22326CCCCC PARAMETER(MMAX=100,EPS=1.E-6)
22327CCCCC PARAMETER(MMAX=100,EPS=1.E-3)
22328      PARAMETER(MMAX=100)
22329C
22330      CHARACTER*4 IBUGA3
22331      CHARACTER*4 ISUBRO
22332      CHARACTER*4 IERROR
22333C
22334      DIMENSION A(MP,NP),IZROV(N),IPOSV(M),L1(MMAX),L2(MMAX),L3(MMAX)
22335C
22336C-----COMMON----------------------------------------------------------
22337C
22338      INCLUDE 'DPCOP2.INC'
22339C
22340C-----START POINT-----------------------------------------------------
22341C
22342      IERROR='NO'
22343C
22344      JMAX=0
22345      MP1=M+1
22346      NP1=N+1
22347C
22348      MP2=M+2
22349C
22350      IF(IBUGA3.EQ.'OFF'.AND.ISUBRO.NE.'MPLX')GOTO90
22351      WRITE(ICOUT,999)
22352  999 FORMAT(1X)
22353      CALL DPWRST('XXX','BUG ')
22354      WRITE(ICOUT,51)
22355   51 FORMAT('***** AT THE BEGINNING OF SIMPLX--')
22356      CALL DPWRST('XXX','BUG ')
22357      WRITE(ICOUT,52)IBUGA3,ISUBRO
22358   52 FORMAT('IBUGA3,ISUBRO = ',A4,2X,A4)
22359      CALL DPWRST('XXX','BUG ')
22360      WRITE(ICOUT,999)
22361      CALL DPWRST('XXX','BUG ')
22362      WRITE(ICOUT,61)M,N,MP,NP,M1,M2,M3
22363   61 FORMAT('M,N,MP,NP,M1,M2,M3 = ',7I8)
22364      CALL DPWRST('XXX','BUG ')
22365      IF(M.LE.0)GOTO69
22366      IF(N.LE.0)GOTO69
22367      JMAX=NP1
22368      IF(JMAX.GT.10)JMAX=10
22369      DO62I=1,MP2
22370      WRITE(ICOUT,63)I,(A(I,J),J=1,JMAX)
22371   63 FORMAT('I,A(I,.) = ',I8,10F10.2)
22372      CALL DPWRST('XXX','BUG ')
22373   62 CONTINUE
22374   69 CONTINUE
22375   90 CONTINUE
22376C
22377C     MAKE A CORRECTION (THANKS TO CHRIS WITZGEL, NBS)
22378C     ON THE VALUE OF EPSILON
22379C     TO CIRCUMVENT A BUG ARISING FROM
22380C     A TEST PROBLEM DRAWN FROM
22381C     BRONSON/SCHAUM OP. RES. (PROBLEM 1.7).
22382C     (SEPT, 1987)
22383C
22384      AM=M
22385      SUM=0.0
22386      DO1000I=1,M
22387      MP1=M+1
22388      SUM=SUM+A(MP1,1)
22389 1000 CONTINUE
22390      XBAR=SUM/AM
22391      EPSEXP=6.0
22392      IF(XBAR.GT.0.0)EPSEXP=6.0-AINT(LOG10(XBAR)+0.5)
22393      IF(EPSEXP.LT.1.0)EPSEXP=1.0
22394      EPS=10.0**(-EPSEXP)
22395C
22396CCCCC IF(M.NE.M1+M2+M3)PAUSE 'Bad input constraint counts.'
22397      IF(M.NE.M1+M2+M3)GOTO110
22398      GOTO119
22399  110 CONTINUE
22400      WRITE(ICOUT,999)
22401      CALL DPWRST('XXX','BUG ')
22402      WRITE(ICOUT,111)
22403  111 FORMAT('***** ERROR IN SIMPLX--')
22404      CALL DPWRST('XXX','BUG ')
22405      WRITE(ICOUT,112)
22406  112 FORMAT('      BAD INPUT CONSTRAINT COUNTS.')
22407      CALL DPWRST('XXX','BUG ')
22408      WRITE(ICOUT,113)M
22409  113 FORMAT('      M = ',I8)
22410      CALL DPWRST('XXX','BUG ')
22411      WRITE(ICOUT,114)M1,M2,M3
22412  114 FORMAT('      M1,M2,M3 = ',3I8)
22413      CALL DPWRST('XXX','BUG ')
22414      IERROR='YES'
22415      GOTO9000
22416  119 CONTINUE
22417C
22418      NL1=N
22419      DO 11 K=1,N
22420        L1(K)=K
22421        IZROV(K)=K
2242211    CONTINUE
22423      NL2=M
22424      DO 12 I=1,M
22425C
22426CCCCC   IF(A(I+1,1).LT.0.)PAUSE 'Bad input tableau.'
22427      IF(A(I+1,1).LT.0.)GOTO120
22428      GOTO129
22429  120 CONTINUE
22430      WRITE(ICOUT,999)
22431      CALL DPWRST('XXX','BUG ')
22432      WRITE(ICOUT,121)
22433  121 FORMAT('***** ERROR IN SIMPLX--')
22434      CALL DPWRST('XXX','BUG ')
22435      WRITE(ICOUT,122)
22436  122 FORMAT('      BAD INPUT TABLEAU.')
22437      CALL DPWRST('XXX','BUG ')
22438      WRITE(ICOUT,123)
22439  123 FORMAT('      POSSIBLE CAUSE--')
22440      CALL DPWRST('XXX','BUG ')
22441      WRITE(ICOUT,124)
22442  124 FORMAT('      SOME CONSTRAINT LIMIT IS NEGATIVE')
22443      CALL DPWRST('XXX','BUG ')
22444      WRITE(ICOUT,125)
22445  125 FORMAT('      (FORBIDDEN IN SIMPLEX METHOD)')
22446      CALL DPWRST('XXX','BUG ')
22447      IERROR='YES'
22448      GOTO9000
22449  129 CONTINUE
22450C
22451        L2(I)=I
22452        IPOSV(I)=N+I
2245312    CONTINUE
22454C
22455      DO 13 I=1,M2
22456        L3(I)=1
2245713    CONTINUE
22458C
22459      IR=0
22460      IF(M2+M3.EQ.0)GO TO 30
22461      IR=1
22462C
22463      DO 15 K=1,N+1
22464        Q1=0.
22465        DO 14 I=M1+1,M
22466          Q1=Q1+A(I+1,K)
2246714      CONTINUE
22468        A(M+2,K)=-Q1
22469      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MPLX')
22470     1WRITE(ICOUT,777)K,A(M+2,K)
22471  777 FORMAT('K,A(M+2,K) = ',I8,F10.2)
22472      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MPLX')
22473     1CALL DPWRST('XXX','BUG ')
2247415    CONTINUE
22475C
2247610    CONTINUE
22477      CALL SIMP1(A,MP,NP,M+1,L1,NL1,0,KP,BMAX)
22478      IF(IBUGA3.EQ.'OFF'.AND.ISUBRO.NE.'MPLX')GOTO790
22479      WRITE(ICOUT,999)
22480      CALL DPWRST('XXX','BUG ')
22481      DO782I=1,MP2
22482      WRITE(ICOUT,783)I,(A(I,J),J=1,JMAX)
22483  783 FORMAT('I,A(I,.) = ',I8,10F10.2)
22484      CALL DPWRST('XXX','BUG ')
22485  782 CONTINUE
22486      WRITE(ICOUT,784)IR,BMAX,A(M+2,1),EPS,XBAR
22487  784 FORMAT('IR,BMAX,A(M+2,1),EPS,XBAR = ',I8,4E15.7)
22488      CALL DPWRST('XXX','BUG ')
22489  790 CONTINUE
22490C
22491      IF(BMAX.LE.EPS.AND.A(M+2,1).LT.-EPS)THEN
22492        ICASE=-1
22493      WRITE(ICOUT,999)
22494      CALL DPWRST('XXX','BUG ')
22495      WRITE(ICOUT,211)
22496  211 FORMAT('***** ERROR IN SIMPLX (FROM CODE POINT 211)--')
22497      CALL DPWRST('XXX','BUG ')
22498      WRITE(ICOUT,212)
22499  212 FORMAT('      NO SOLUTION SATISFIES ALL CONSTRAINTS.')
22500      CALL DPWRST('XXX','BUG ')
22501      IERROR='YES'
22502CCCCC   RETURN
22503        GOTO9000
22504C
22505      ELSE IF(BMAX.LE.EPS.AND.A(M+2,1).LE.EPS)THEN
22506        M12=M1+M2+1
22507        IF(M12.LE.M)THEN
22508          DO 16 IP=M12,M
22509            IF(IPOSV(IP).EQ.IP+N)THEN
22510              CALL SIMP1(A,MP,NP,IP,L1,NL1,1,KP,BMAX)
22511              IF(BMAX.GT.0.)GO TO 1
22512            ENDIF
2251316        CONTINUE
22514        ENDIF
22515        IR=0
22516        M12=M12-1
22517        IF(M1+1.GT.M12)GO TO 30
22518C
22519        DO 18 I=M1+1,M12
22520          IF(L3(I-M1).EQ.1)THEN
22521            DO 17 K=1,N+1
22522              A(I+1,K)=-A(I+1,K)
2252317          CONTINUE
22524          ENDIF
2252518      CONTINUE
22526C
22527        GO TO 30
22528      ENDIF
22529      CALL SIMP2(A,M,N,MP,NP,L2,NL2,IP,KP,Q1)
22530      IF(IP.EQ.0)THEN
22531        ICASE=-1
22532      WRITE(ICOUT,999)
22533      CALL DPWRST('XXX','BUG ')
22534      WRITE(ICOUT,221)
22535  221 FORMAT('***** ERROR IN SIMPLX (FROM CODE POINT 221)--')
22536      CALL DPWRST('XXX','BUG ')
22537      WRITE(ICOUT,222)
22538  222 FORMAT('      NO SOLUTION SATISFIES ALL CONSTRAINTS.')
22539      CALL DPWRST('XXX','BUG ')
22540      IERROR='YES'
22541CCCCC   RETURN
22542        GOTO9000
22543      ENDIF
22544C
225451     CONTINUE
22546      CALL SIMP3(A,MP,NP,M+1,N,IP,KP)
22547      IF(IPOSV(IP).GE.N+M1+M2+1)THEN
22548        DO 19 K=1,NL1
22549          IF(L1(K).EQ.KP)GO TO 2
2255019      CONTINUE
225512       CONTINUE
22552        NL1=NL1-1
22553        DO 21 IS=K,NL1
22554          L1(IS)=L1(IS+1)
2255521      CONTINUE
22556      ELSE
22557        IF(IPOSV(IP).LT.N+M1+1)GO TO 20
22558        KH=IPOSV(IP)-M1-N
22559        IF(L3(KH).EQ.0)GO TO 20
22560        L3(KH)=0
22561      ENDIF
22562      A(M+2,KP+1)=A(M+2,KP+1)+1.
22563      DO 22 I=1,M+2
22564        A(I,KP+1)=-A(I,KP+1)
2256522    CONTINUE
2256620    CONTINUE
22567      IS=IZROV(KP)
22568      IZROV(KP)=IPOSV(IP)
22569      IPOSV(IP)=IS
22570      IF(IR.NE.0)GO TO 10
2257130    CONTINUE
22572      CALL SIMP1(A,MP,NP,0,L1,NL1,0,KP,BMAX)
22573      IF(BMAX.LE.0.)THEN
22574        ICASE=0
22575CCCCC   RETURN
22576        GOTO9000
22577      ENDIF
22578      CALL SIMP2(A,M,N,MP,NP,L2,NL2,IP,KP,Q1)
22579      IF(IP.EQ.0)THEN
22580        ICASE=1
22581      WRITE(ICOUT,999)
22582      CALL DPWRST('XXX','BUG ')
22583      WRITE(ICOUT,231)
22584  231 FORMAT('***** ERROR IN SIMPLX--')
22585      CALL DPWRST('XXX','BUG ')
22586      WRITE(ICOUT,232)
22587  232 FORMAT('      OBJECTIVE FUNCTION UNBOUNDED IN THIS REGION.')
22588      CALL DPWRST('XXX','BUG ')
22589      IERROR='YES'
22590CCCCC   RETURN
22591        GOTO9000
22592      ENDIF
22593      CALL SIMP3(A,MP,NP,M,N,IP,KP)
22594      GO TO 20
22595C
22596 9000 CONTINUE
22597      IF(IBUGA3.EQ.'OFF'.AND.ISUBRO.NE.'MPLX')GOTO9090
22598      WRITE(ICOUT,999)
22599      CALL DPWRST('XXX','BUG ')
22600      WRITE(ICOUT,9011)
22601 9011 FORMAT('***** AT THE END       OF SIMPLX--')
22602      CALL DPWRST('XXX','BUG ')
22603      WRITE(ICOUT,9012)IBUGA3,ISUBRO
22604 9012 FORMAT('IBUGA3,ISUBRO = ',A4,2X,A4)
22605      CALL DPWRST('XXX','BUG ')
22606      WRITE(ICOUT,999)
22607      CALL DPWRST('XXX','BUG ')
22608      WRITE(ICOUT,9021)M,N,MP,NP,M1,M2,M3,MP1,NP1
22609 9021 FORMAT('M,N,MP,NP,M1,M2,M3,MP1,NP1 = ',9I8)
22610      CALL DPWRST('XXX','BUG ')
22611      WRITE(ICOUT,9022)ICASE
22612 9022 FORMAT('ICASE = ',I8)
22613      CALL DPWRST('XXX','BUG ')
22614      WRITE(ICOUT,9023)XBAR,EPS
22615 9023 FORMAT('XBAR,EPS = ',2E15.7)
22616      CALL DPWRST('XXX','BUG ')
22617      IF(M.LE.0)GOTO9039
22618      IF(N.LE.0)GOTO9039
22619      JMAX=NP1
22620      IF(JMAX.GT.10)JMAX=10
22621      DO9032I=1,MP1
22622      WRITE(ICOUT,9033)I,(A(I,J),J=1,JMAX)
22623 9033 FORMAT('I,A(I,.) = ',I8,10F10.2)
22624      CALL DPWRST('XXX','BUG ')
22625 9032 CONTINUE
22626 9039 CONTINUE
22627      DO9041I=1,M
22628      WRITE(ICOUT,9042)I,IPOSV(I)
22629 9042 FORMAT('I,IPOSV(I) = ',2I8)
22630      CALL DPWRST('XXX','BUG ')
22631 9041 CONTINUE
22632      DO9051I=1,N
22633      WRITE(ICOUT,9052)I,IZROV(I)
22634 9052 FORMAT('I,IZROV(I) = ',2I8)
22635      CALL DPWRST('XXX','BUG ')
22636 9051 CONTINUE
22637 9090 CONTINUE
22638C
22639      RETURN
22640      END
22641      SUBROUTINE SIMP1(A,MP,NP,MM,LL,NLL,IABF,KP,BMAX)
22642C
22643C     PURPOSE--
22644C
22645C     SOURCE--NUMERICAL RECIPES,
22646C             PRESS, FLANNERY, TEUKOLSKY, AND VETTERLING,
22647C             CAMBRIDGE UNIVERSITY PRESS, 1986.
22648C
22649C
22650C---------------------------------------------------------------------
22651C
22652      DIMENSION A(MP,NP),LL(NP)
22653C
22654C-----START POINT-----------------------------------------------------
22655C
22656      KP=LL(1)
22657      BMAX=A(MM+1,KP+1)
22658      IF(NLL.LT.2)RETURN
22659      DO 11 K=2,NLL
22660        IF(IABF.EQ.0)THEN
22661          TEST=A(MM+1,LL(K)+1)-BMAX
22662        ELSE
22663          TEST=ABS(A(MM+1,LL(K)+1))-ABS(BMAX)
22664        ENDIF
22665        IF(TEST.GT.0.)THEN
22666          BMAX=A(MM+1,LL(K)+1)
22667          KP=LL(K)
22668        ENDIF
2266911    CONTINUE
22670C
22671      RETURN
22672      END
22673      SUBROUTINE SIMP2(A,M,N,MP,NP,L2,NL2,IP,KP,Q1)
22674C
22675C     PURPOSE--
22676C
22677C     SOURCE--NUMERICAL RECIPES,
22678C             PRESS, FLANNERY, TEUKOLSKY, AND VETTERLING,
22679C             CAMBRIDGE UNIVERSITY PRESS, 1986.
22680C
22681C---------------------------------------------------------------------
22682C
22683      PARAMETER (EPS=1.E-6)
22684      DIMENSION A(MP,NP),L2(MP)
22685C
22686      INCLUDE 'DPCOBE.INC'
22687      INCLUDE 'DPCOP2.INC'
22688C
22689C-----START POINT-----------------------------------------------------
22690C
22691      IF(ISUBG4.EQ.'IMP2')THEN
22692        WRITE(ICOUT,1)M,N,MP,NP
22693    1   FORMAT('M,N,MP,NP = ',4I8)
22694        CALL DPWRST('XXX','BUG ')
22695      ENDIF
22696C
22697      Q0=0.0
22698      QP=0.0
22699C
22700      IP=0
22701      IF(NL2.LT.1)RETURN
22702      DO 11 I=1,NL2
22703        IF(A(L2(I)+1,KP+1).LT.-EPS)GO TO 2
2270411    CONTINUE
22705      RETURN
227062     Q1=-A(L2(I)+1,1)/A(L2(I)+1,KP+1)
22707      IP=L2(I)
22708      IF(I+1.GT.NL2)RETURN
22709      DO 13 I=I+1,NL2
22710        II=L2(I)
22711        IF(A(II+1,KP+1).LT.-EPS)THEN
22712          Q=-A(II+1,1)/A(II+1,KP+1)
22713          IF(Q.LT.Q1)THEN
22714            IP=II
22715            Q1=Q
22716          ELSE IF (Q.EQ.Q1) THEN
22717            DO 12 K=1,N
22718              QP=-A(IP+1,K+1)/A(IP+1,KP+1)
22719              Q0=-A(II+1,K+1)/A(II+1,KP+1)
22720              IF(Q0.NE.QP)GO TO 6
2272112          CONTINUE
227226           IF(Q0.LT.QP)IP=II
22723          ENDIF
22724        ENDIF
2272513    CONTINUE
22726C
22727      RETURN
22728      END
22729      SUBROUTINE SIMP3(A,MP,NP,I1,K1,IP,KP)
22730C
22731C     PURPOSE--
22732C
22733C     SOURCE--NUMERICAL RECIPES,
22734C             PRESS, FLANNERY, TEUKOLSKY, AND VETTERLING,
22735C             CAMBRIDGE UNIVERSITY PRESS, 1986.
22736C
22737C---------------------------------------------------------------------
22738C
22739      DIMENSION A(MP,NP)
22740C
22741C-----START POINT-----------------------------------------------------
22742C
22743      PIV=1./A(IP+1,KP+1)
22744      IF(I1.GE.0)THEN
22745        DO 12 II=1,I1+1
22746          IF(II-1.NE.IP)THEN
22747            A(II,KP+1)=A(II,KP+1)*PIV
22748            DO 11 KK=1,K1+1
22749              IF(KK-1.NE.KP)THEN
22750                A(II,KK)=A(II,KK)-A(IP+1,KK)*A(II,KP+1)
22751              ENDIF
2275211          CONTINUE
22753          ENDIF
2275412      CONTINUE
22755      ENDIF
22756      DO 13 KK=1,K1+1
22757        IF(KK-1.NE.KP)A(IP+1,KK)=-A(IP+1,KK)*PIV
2275813    CONTINUE
22759      A(IP+1,KP+1)=PIV
22760C
22761      RETURN
22762      END
22763      SUBROUTINE SIMRAT
22764     $ (U1, S1, V1, IQ, W, NBCH, NTOT, NPAR, NREP, IRK,
22765     $ XNCP, CONF, WK1, WK2, VALS, QUANT,IERROR)
22766C
22767C      MARK VANGEL, APRIL 1995
22768C
22769C        SIMULATE THE PIVOTAL RATIO IN THE LIMIT OF ZERO
22770C     WITHIN-GROUP VARIANCE.
22771C
22772C     SINGULAR VALUE DECOMPOSITION OF THE DEISGN MATRIX:
22773C     U1, S1, V1  ---  (INPUT, D.P.)
22774C     IQ    ---   BATCH INDICATOR (INPUT, INT., LENGTH `NBCH')
22775C     W     ---   VECTOR OF COEFFICIENTS OF POINT AT WHICH TOL.
22776C             LIM. IS TO BE CALCULATED (INPUT, D.P., LENGTH `NREP')
22777C     NBCH  ---   NUMBER OF BATCHES (INPUT, INT.)
22778C     NTOT  ---   TOTAL NUMBER OF DATA VALUES (INPUT, INT.)
22779C     NPAR  ---   NUMBER OF REGRESSION COEFFICIENTS (INPUT, INT.)
22780C     NREP  ---   NUMBER OF SIMULATION REPLICATES (INPUT, INT.)
22781C     IRK   ---   RANK OF DESIGN MATRIX (INPUT, INT.)
22782C     XNCP  ---   NONCENTRALITY PARAMETER (Z_{\BETA}) (INPUT,D.P.)
22783C     CONF  ---   CONFIDENCE LEVEL (INPUT, D.P.)
22784C     WK1   ---   WORK ARRAY (OUTPUT, D.P., LENGTH MAX(NBCH, IRK))
22785C     WK2   ---   WORK ARRAY (OUTPUT, D.P., LENGTH NTOT)
22786C     VALS  ---   ARRAY OF SIM. VALUES (OUTPUT, D.P., LENGTH NREP)
22787C     QUANT ---   ESTIMATED QUANTILE (OUPUT, D.P.)
22788C
22789      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
22790CCCCC REAL RNOR
22791      REAL XTMP(1)
22792      DOUBLE PRECISION DUM(1)
22793      CHARACTER*4 IERROR
22794      DIMENSION U1(1), S1(1), V1(1), IQ(1), W(1), WK1(1),
22795     $          WK2(1), VALS(1)
22796      DATA ZERO, ONE /0.D0, 1.D0/
22797C
22798C     -- LOOP OVER `NREP' REPLICATES
22799      NRAN=1
22800      DO 100 ISIM=1, NREP
22801C
22802C     -- GENERATE ONE N(0,1) R.V. FOR EACH LEVEL OF RANDOM
22803C        EFFECT.
22804         DO 10 I=1, NBCH
22805CCCCC      WK1(I) = RNOR(0)
22806           CALL NORRAN(NRAN,ISEED,XTMP)
22807           WK1(I)=DBLE(XTMP(1))
22808 10      CONTINUE
22809C
22810C     --  CREATE PSEUDO-RANDOM DATA FOR \SIGMA_{E}^2 = 0 CASE
22811         DO 20 I=1, NTOT
22812            WK2(I) = WK1(IQ(I))
22813 20      CONTINUE
22814         Y2 = DDOT (NTOT, WK2, 1, WK2, 1)
22815C
22816C     -- FORM VECTOR Q = (U^T)Y
22817         CALL DGEMV ('T', NTOT, IRK, ONE, U1, NTOT,
22818     $            WK2, 1, ZERO, WK1, 1, IERROR)
22819         IF(IERROR.EQ.'YES')RETURN
22820         Q2 = DDOT (IRK, WK1, 1, WK1, 1)
22821C
22822C     -- FORM VECTOR W = (V^T)W
22823         CALL DGEMV ('T', NPAR, NTOT, ONE, V1, NPAR,
22824     $            W,   1, ZERO, WK2,   1, IERROR)
22825         IF(IERROR.EQ.'YES')RETURN
22826C
22827C     -- CALCULATE W^T(L^(-))Q, WHERE L IS MATRIX OF SVS
22828         XNUM = 0
22829         DO 30 I=1, IRK
22830            XNUM = XNUM +WK2(I) *WK1(I) /S1(I)
22831 30      CONTINUE
22832C
22833C     -- CALCULATE RESIDUAL SUM OF SQUARES
22834         RSS = Y2 -Q2
22835C
22836C     -- FINALLY, FORM RATIO AND RETURN
22837         VALS (ISIM) = (XNUM+XNCP) /SQRT(RSS/(NTOT -IRK))
22838 100  CONTINUE
22839C
22840C     -- SORT THE SIMULATED PIVOT VALUES
22841      KFLAG=1
22842      CALL DSORT (VALS, DUM, NREP, KFLAG, IERROR)
22843C
22844C     -- RETURN THE DESIRED QUANTILE
22845      IDX   = INT(CONF*NREP)
22846      QUANT = VALS(IDX)
22847      RETURN
22848      END
22849      SUBROUTINE SINCDF(X,CDF)
22850C
22851C     NOTE--SINE CDF IS:
22852C              SINCDF(X) = SIN((X/2) + (PI/4))**2
22853C     WRITTEN BY--ALAN HECKERT
22854C                 STATISTICAL ENGINEERING DIVISION
22855C                 INFORMATION TECHNOLOGY LABORATORY
22856C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS
22857C                 GAITHERSBURG, MD 20899
22858C                 PHONE--301-975-2899
22859C     REFERENCE--PETER BURROWS, "EXTREME STATISTICS FROM THE SINE
22860C                DISTRIBUTION", THE AMERICAN STATISTICIAN, AUGUST 1986,
22861C                VOL. 40, NO. 3, PP. 216-218.
22862C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22863C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS.
22864C     LANGUAGE--ANSI FORTRAN (1977)
22865C     VERSION NUMBER--2013/3
22866C     ORIGINAL VERSION--MARCH     2013.
22867C
22868C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22869C
22870C
22871C-----COMMON----------------------------------------------------------
22872C
22873      INCLUDE 'DPCOP2.INC'
22874C
22875      DATA PI/3.1415926535898E0/
22876C
22877C-----START POINT-----------------------------------------------------
22878C
22879      CDF=0.0
22880      PI2=PI/2.0
22881      PI4=PI/4.0
22882      IF(X.LE.-PI2)THEN
22883        CDF=0.0
22884      ELSEIF(X.GE.PI2)THEN
22885        CDF=1.0
22886      ELSE
22887        CDF=SIN((X/2.0) + PI4)**2
22888      ENDIF
22889C
22890      RETURN
22891      END
22892      SUBROUTINE SINFIT(X,TEMP,N,IWRITE,XSINFR,XSINAM,XRESSD,
22893     1ISUBRO,IBUGA3,IERROR)
22894C
22895C     PURPOSE--THIS SUBROUTINE COMPUTES THE
22896C              SINUSOIDAL FREQUENCY ESTIMATE
22897C              AND THE SINUSOIDAL AMPLITUDE ESTIMATE
22898C              OF THE DATA IN THE INPUT VECTOR X.
22899C              THE FREQUENCY AND AMPLITUDE ESTIMATE =
22900C              THAT APPROXIMATE LEAST SQUARES FIT FREQUENCY AND AMP.
22901C              WHICH BEST FITS THE DATA IN A 1-FREQUENCY SIN MODEL.
22902C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
22903C                                (UNSORTED) OBSERVATIONS.
22904C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
22905C                                IN THE VECTOR X.
22906C     OUTPUT ARGUMENTS--XSINFR = THE SINGLE PRECISION VALUE OF THE
22907C                                COMPUTED SAMPLE AUTOCOVARIANCE
22908C                                COEFFICIENT.
22909C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
22910C             SINUSOIDAL FREQUENCY ESTIMATE AND AMPLITUDE ESTIMATE.
22911C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
22912C                   OF N FOR THIS SUBROUTINE.
22913C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
22914C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
22915C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22916C     LANGUAGE--ANSI FORTRAN (1977)
22917C     REFERENCE--BLOOMFIELD, PETER, FOURIER ANALYSIS OF TIME SERIES:
22918C                AN INTRODUCTION, WILEY, 1976, PAGES 14 AND 18.
22919C     WRITTEN BY--JAMES J. FILLIBEN
22920C                 STATISTICAL ENGINEERING DIVISION
22921C                 INFORMATION TECHNOLOGY LABORATORY
22922C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
22923C                 GAITHERSBURG, MD 20899-8980
22924C                 PHONE--301-975-2855
22925C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22926C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
22927C     VERSION NUMBER--88/1
22928C     ORIGINAL VERSION--JANUARY   1988.
22929C
22930C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22931C
22932      CHARACTER*4 IWRITE
22933      CHARACTER*4 ISUBRO
22934      CHARACTER*4 IBUGA3
22935      CHARACTER*4 IERROR
22936C
22937      CHARACTER*4 ISUBN1
22938      CHARACTER*4 ISUBN2
22939C
22940C---------------------------------------------------------------------
22941C
22942      DOUBLE PRECISION DN
22943      DOUBLE PRECISION DX
22944CCCCC DOUBLE PRECISION DX1
22945CCCCC DOUBLE PRECISION DX2
22946      DOUBLE PRECISION DSUM
22947      DOUBLE PRECISION DMEAN
22948C
22949      DIMENSION X(*)
22950      DIMENSION TEMP(*)
22951C
22952C-----COMMON----------------------------------------------------------
22953C
22954      INCLUDE 'DPCOP2.INC'
22955C
22956C-----START POINT-----------------------------------------------------
22957C
22958      ISUBN1='SINF'
22959      ISUBN2='IT  '
22960      IERROR='NO'
22961C
22962      PI=3.1415926
22963C
22964      DN=0.0D0
22965      DMEAN=0.0D0
22966C
22967      IF(IBUGA3.EQ.'OFF'.AND.ISUBRO.NE.'NFIT')GOTO90
22968      WRITE(ICOUT,999)
22969  999 FORMAT(1X)
22970      CALL DPWRST('XXX','BUG ')
22971      WRITE(ICOUT,51)
22972   51 FORMAT('***** AT THE BEGINNING OF SINFIT--')
22973      CALL DPWRST('XXX','BUG ')
22974      WRITE(ICOUT,52)ISUBRO,IBUGA3,N
22975   52 FORMAT('ISUBRO,IBUGA3,N = ',2(A4,2X),I8)
22976      CALL DPWRST('XXX','BUG ')
22977      DO55I=1,N
22978      WRITE(ICOUT,56)I,X(I)
22979   56 FORMAT('I,X(I) = ',I8,G15.7)
22980      CALL DPWRST('XXX','BUG ')
22981   55 CONTINUE
22982   90 CONTINUE
22983C
22984C               *******************************************
22985C               **  COMPUTE  APPROX. LEAST SQUARES FIT   **
22986C               **  ESTIMATE OF UENCY                    **
22987C               **  IN A 1-TERM SINUSOIDAL MODEL.        **
22988C               *******************************************
22989C
22990C               ********************************************
22991C               **  STEP 1--                              **
22992C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
22993C               ********************************************
22994C
22995      AN=N
22996C
22997      IF(N.LT.1)THEN
22998        IERROR='YES'
22999        WRITE(ICOUT,999)
23000        CALL DPWRST('XXX','BUG ')
23001        WRITE(ICOUT,111)
23002  111   FORMAT('***** ERROR IN SINFIT--')
23003        CALL DPWRST('XXX','BUG ')
23004        WRITE(ICOUT,112)
23005  112   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS MUST BE 1 OR ',
23006     1         'LARGER.')
23007        CALL DPWRST('XXX','BUG ')
23008        WRITE(ICOUT,116)
23009  116   FORMAT('      SUCH WAS NOT THE CASE HERE.')
23010        CALL DPWRST('XXX','BUG ')
23011        WRITE(ICOUT,117)N
23012  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
23013        CALL DPWRST('XXX','BUG ')
23014        GOTO9000
23015      ELSEIF(N.EQ.1)THEN
23016        WRITE(ICOUT,999)
23017        CALL DPWRST('XXX','BUG ')
23018        WRITE(ICOUT,121)
23019  121   FORMAT('***** WARNING IN SINFIT--')
23020        CALL DPWRST('XXX','BUG ')
23021        WRITE(ICOUT,123)
23022  123   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS IS EXACTLY ',
23023     1         'EQUAL TO ONE.')
23024        CALL DPWRST('XXX','BUG ')
23025        XSINFR=0.0
23026        GOTO9000
23027      ENDIF
23028C
23029      HOLD=X(1)
23030      DO135I=2,N
23031      IF(X(I).NE.HOLD)GOTO139
23032  135 CONTINUE
23033      WRITE(ICOUT,999)
23034      CALL DPWRST('XXX','BUG ')
23035      WRITE(ICOUT,121)
23036      CALL DPWRST('XXX','BUG ')
23037      WRITE(ICOUT,136)HOLD
23038  136 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
23039      CALL DPWRST('XXX','BUG ')
23040      XSINFR=0.0
23041      GOTO9000
23042  139 CONTINUE
23043C
23044C               ************************************************
23045C               **  STEP 2--                                  **
23046C               **  COMPUTE THE  APPROXIMATE LEAST SQUARES    **
23047C               **  SINUSOIDAL FREQUENCY ESTIMATE             **
23048C               ************************************************
23049C
23050      DN=N
23051      DSUM=0.0D0
23052      DO200I=1,N
23053      DX=X(I)
23054      DSUM=DSUM+DX
23055  200 CONTINUE
23056      DMEAN=DSUM/DN
23057      XMEAN=DMEAN
23058C
23059      DO300I=1,N
23060      TEMP(I)=X(I)-XMEAN
23061  300 CONTINUE
23062C
23063      SSQHOL=CPUMAX
23064      NLOOP=100
23065      ANLOOP=NLOOP
23066      DO500IANGLE=1,NLOOP
23067      AANGLE=IANGLE
23068      THETA=AANGLE/(2.0*ANLOOP)
23069      OMEGA=2.0*PI*THETA
23070C
23071      SUM1=0.0
23072      SUM2=0.0
23073      DO550I=1,N
23074      AI=I
23075      SUM1=SUM1+X(I)*COS(OMEGA*AI)
23076      SUM2=SUM2+X(I)*SIN(OMEGA*AI)
23077  550 CONTINUE
23078      A=(2.0/AN)*SUM1
23079      B=(2.0/AN)*SUM2
23080      AMP=A*A+B*B
23081      IF(AMP.GT.0.0)AMP=SQRT(AMP)
23082C
23083      SSQ=0.0
23084      DO560I=1,N
23085      AI=I
23086      PREDI=A*COS(OMEGA*AI)+B*SIN(OMEGA*AI)
23087      RESI=TEMP(I)-PREDI
23088      SSQ=SSQ+RESI**2
23089  560 CONTINUE
23090C
23091      IF(IANGLE.LE.1)GOTO561
23092      GOTO562
23093  561 CONTINUE
23094      FREHOL=THETA
23095      AMPHOL=AMP
23096      SSQHOL=SSQ
23097      GOTO569
23098  562 CONTINUE
23099      IF(SSQ.LT.SSQHOL)FREHOL=THETA
23100      IF(SSQ.LT.SSQHOL)AMPHOL=AMP
23101      IF(SSQ.LT.SSQHOL)SSQHOL=SSQ
23102      GOTO569
23103  569 CONTINUE
23104C
23105      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'NFIT')THEN
23106        WRITE(ICOUT,563)AANGLE,THETA,SSQ,SSQHOL,A,B,AMP
23107  563   FORMAT('AANGLE,THETA,SSQ,SSQHOL,A,B,AMP = ',7E12.4)
23108        CALL DPWRST('XXX','BUG ')
23109      ENDIF
23110C
23111  500 CONTINUE
23112      XSINFR=FREHOL
23113      XSINAM=AMPHOL
23114      RESSD=SSQHOL/(AN-2.0)
23115      IF(RESSD.GT.0.0)RESSD=SQRT(RESSD)
23116C
23117      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'NFIT')THEN
23118        WRITE(ICOUT,591)XSINFR,XSINAM,XRESSD
23119  591   FORMAT('XSINFR,XSINAM,XRESSD = ',3E15.7)
23120        CALL DPWRST('XXX','BUG ')
23121      ENDIF
23122C
23123C               *******************************
23124C               **  STEP 3--                 **
23125C               **  WRITE OUT A LINE         **
23126C               **  OF SUMMARY INFORMATION.  **
23127C               *******************************
23128C
23129      IF(IFEEDB.EQ.'OFF')GOTO890
23130      IF(IWRITE.EQ.'OFF')GOTO890
23131      WRITE(ICOUT,999)
23132      CALL DPWRST('XXX','BUG ')
23133      WRITE(ICOUT,811)N,XSINFR
23134  811 FORMAT('THE SINUSOIDAL FREQUENCY ESTIMATE FOR THE ',I8,
23135     1' OBSERVATIONS = ',G15.7)
23136      CALL DPWRST('XXX','BUG ')
23137      WRITE(ICOUT,812)N,XSINAM
23138  812 FORMAT('THE SINUSOIDAL AMPLITUDE ESTIMATE FOR THE ',I8,
23139     1' OBSERVATIONS = ',G15.7)
23140      CALL DPWRST('XXX','BUG ')
23141      WRITE(ICOUT,813)XRESSD
23142  813 FORMAT('THE RESIDUAL STANDARD DEVIATION = ',G15.7)
23143      CALL DPWRST('XXX','BUG ')
23144  890 CONTINUE
23145C
23146C               *****************
23147C               **  STEP 90--  **
23148C               **  EXIT.      **
23149C               *****************
23150C
23151 9000 CONTINUE
23152      IF(IBUGA3.EQ.'OFF'.AND.ISUBRO.NE.'NFIT')GOTO9090
23153      WRITE(ICOUT,999)
23154      CALL DPWRST('XXX','BUG ')
23155      WRITE(ICOUT,9011)
23156 9011 FORMAT('***** AT THE END       OF SINFIT--')
23157      CALL DPWRST('XXX','BUG ')
23158      WRITE(ICOUT,9012)ISUBRO,IBUGA3,IERROR
23159 9012 FORMAT('ISUBRO,IBUGA3,IERROR = ',2(A4,2X),A4)
23160      CALL DPWRST('XXX','BUG ')
23161      WRITE(ICOUT,9014)N,DN,DMEAN
23162 9014 FORMAT('N,DN,DMEAN = ',I8,2G15.7)
23163      CALL DPWRST('XXX','BUG ')
23164      WRITE(ICOUT,9015)XSINFR,XSINAM,XRESSD
23165 9015 FORMAT('XSINFR,XSINAM,XRESSD = ',3G15.7)
23166      CALL DPWRST('XXX','BUG ')
23167 9090 CONTINUE
23168C
23169      RETURN
23170      END
23171      SUBROUTINE SINPDF(X,PDF)
23172C
23173C     NOTE--SINE PDF IS:
23174C              SINPDF(X) = 0.5*COS(X)
23175C     WRITTEN BY--ALAN HECKERT
23176C                 STATISTICAL ENGINEERING DIVISION
23177C                 INFORMATION TECHNOLOGY LABORATORY
23178C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS
23179C                 GAITHERSBURG, MD 20899
23180C                 PHONE--301-975-2899
23181C     REFERENCE--PETER BURROWS, "EXTREME STATISTICS FROM THE SINE
23182C                DISTRIBUTION", THE AMERICAN STATISTICIAN, AUGUST 1986,
23183C                VOL. 40, NO. 3, PP. 216-218.
23184C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23185C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS.
23186C     LANGUAGE--ANSI FORTRAN (1977)
23187C     VERSION NUMBER--2013/3
23188C     ORIGINAL VERSION--MARCH     2013.
23189C
23190C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23191C
23192C
23193C-----COMMON----------------------------------------------------------
23194C
23195      INCLUDE 'DPCOP2.INC'
23196C
23197      DATA PI/3.1415926535898E0/
23198C
23199C-----START POINT-----------------------------------------------------
23200C
23201      PDF=0.0
23202      PI2=PI/2.0
23203      IF(X.LT.-PI2 .OR. X.GT.PI2)THEN
23204        WRITE(ICOUT,301)
23205        CALL DPWRST('XXX','BUG ')
23206        WRITE(ICOUT,302)X
23207        CALL DPWRST('XXX','BUG ')
23208        GOTO9999
23209      ENDIF
23210  301 FORMAT('***** ERROR--THE INPUT ARGUMENT TO SINPDF IS NOT IN THE ',
23211     1       'INTERVAL (-PI/2,PI/2).')
23212  302 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
23213C
23214      PDF=0.5*COS(X)
23215C
23216 9999 CONTINUE
23217      RETURN
23218      END
23219      SUBROUTINE SINPPF(P,PPF)
23220C
23221C     NOTE--THE SINE PPF IS:
23222C
23223C               G(P) = 2*(ARCSIN(SQRT(P)) - (PI/4))
23224C     WRITTEN BY--ALAN HECKERT
23225C                 STATISTICAL ENGINEERING DIVISION
23226C                 INFORMATION TECHNOLOGY LABORATORY
23227C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS
23228C                 GAITHERSBURG, MD 20899
23229C                 PHONE--301-975-2899
23230C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23231C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS.
23232C     LANGUAGE--ANSI FORTRAN (1977)
23233C     VERSION NUMBER--2013/3
23234C     ORIGINAL VERSION--MARCH     2013.
23235C
23236C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23237C
23238C-----COMMON----------------------------------------------------------
23239C
23240      INCLUDE 'DPCOP2.INC'
23241C
23242      DATA PI/3.1415926535898E0/
23243C
23244C-----START POINT-----------------------------------------------------
23245C
23246C     CHECK THE INPUT ARGUMENTS FOR ERRORS
23247C
23248      IF(P.LT.0.0.OR.P.GT.1.0)THEN
23249        WRITE(ICOUT,1)
23250    1   FORMAT('***** ERROR--THE FIRST ARGUMENT TO SINPPF IS OUTSIDE',
23251     1         ' THE ALLOWABLE (0,1) INTERVAL.')
23252        CALL DPWRST('XXX','BUG ')
23253        WRITE(ICOUT,46)P
23254   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
23255        CALL DPWRST('XXX','BUG ')
23256        PPF=0.0
23257        GOTO9000
23258      ENDIF
23259C
23260      IF(P.LE.0.0)THEN
23261        PPF=-PI/2.0
23262      ELSEIF(P.GE.1.0)THEN
23263        PPF=PI/2.0
23264      ELSE
23265        ARG=SQRT(P)
23266        ARG2=ARG/SQRT(1.0 - ARG*ARG)
23267        TERM1=ATAN(ARG2)
23268        PPF=2.0*(TERM1 - (PI/4.0))
23269      ENDIF
23270C
23271 9000 CONTINUE
23272      RETURN
23273      END
23274      SUBROUTINE SINRAN(N,ISEED,X)
23275C
23276C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
23277C              FROM THE SINE DISTRIBUTION
23278C              F(X) = 0.5*EXP(-ABS(X)).
23279C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
23280C                                OF RANDOM NUMBERS TO BE
23281C                                GENERATED.
23282C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
23283C                                (OF DIMENSION AT LEAST N)
23284C                                INTO WHICH THE GENERATED
23285C                                RANDOM SAMPLE WILL BE PLACED.
23286C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE SINE DISTRIBUTION
23287C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
23288C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
23289C                   OF N FOR THIS SUBROUTINE.
23290C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
23291C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
23292C     LANGUAGE--ANSI FORTRAN (1977)
23293C     WRITTEN BY--ALAN HECKER
23294C                 STATISTICAL ENGINEERING DIVISION
23295C                 INFORMATION TECHNOLOGY LABORATORY
23296C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS
23297C                 GAITHERSBURG, MD 20899
23298C                 PHONE--301-975-2899
23299C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23300C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGYS.
23301C     LANGUAGE--ANSI FORTRAN (1977)
23302C     VERSION NUMBER--2013/3
23303C     ORIGINAL VERSION--MARCH     2013.
23304C
23305C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23306C
23307C---------------------------------------------------------------------
23308C
23309      DIMENSION X(*)
23310C
23311C-----COMMON----------------------------------------------------------
23312C
23313      INCLUDE 'DPCOP2.INC'
23314C
23315C-----START POINT-----------------------------------------------------
23316C
23317C     CHECK THE INPUT ARGUMENTS FOR ERRORS
23318C
23319      IF(N.LT.1)THEN
23320        WRITE(ICOUT, 5)
23321    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO SINRAN IS ',
23322     1         'NON-POSITIVE.')
23323        CALL DPWRST('XXX','BUG ')
23324        WRITE(ICOUT,47)N
23325   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
23326        CALL DPWRST('XXX','BUG ')
23327        RETURN
23328      ENDIF
23329C
23330C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
23331C
23332      CALL UNIRAN(N,ISEED,X)
23333C
23334C     GENERATE N COSINE RANDOM NUMBERS
23335C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
23336C
23337      DO100I=1,N
23338        CALL SINPPF(X(I),XTEMP)
23339        X(I)=XTEMP
23340  100 CONTINUE
23341C
23342      RETURN
23343      END
23344      SUBROUTINE SINTRA(Y1,N1,IWRITE,Y2,N2,IBUGA3,IERROR)
23345C
23346C     PURPOSE--COMPUTE SINE TRANSFORM OF A VARIABLE--
23347C            = THE COEFFICIENTS OF THE SINE TERM
23348C              IN THE FINITE FOURIER RESPRESENTATION OF THE DATA IN Y1.
23349C              Y2(1) = B0 = 0
23350C              Y2(2) = B1
23351C              Y2(3) = B2
23352C              ETC.
23353C     NOTE--IT IS NOT PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y2(.)
23354C           BEING IDENTICAL TO THE INPUT VECTOR Y1(.).
23355C     WRITTEN BY--JAMES J. FILLIBEN
23356C                 STATISTICAL ENGINEERING DIVISION
23357C                 INFORMATION TECHNOLOGY LABORATORY
23358C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
23359C                 GAITHERSBURG, MD 20899-8980
23360C                 PHONE--301-975-2855
23361C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23362C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
23363C     LANGUAGE--ANSI FORTRAN (1977)
23364C     VERSION NUMBER--85/1
23365C     ORIGINAL VERSION--DECEMBER  1984.
23366C
23367C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23368C
23369      CHARACTER*4 IWRITE
23370      CHARACTER*4 IBUGA3
23371      CHARACTER*4 IERROR
23372C
23373      CHARACTER*4 ISUBN1
23374      CHARACTER*4 ISUBN2
23375C
23376C-----DOUBLE PRECISION STATEMENTS FOR NON-COMMON VARIABLES-------------------
23377C
23378      DOUBLE PRECISION DPI
23379      DOUBLE PRECISION DN1
23380      DOUBLE PRECISION DDEL
23381      DOUBLE PRECISION DI
23382      DOUBLE PRECISION DSUM
23383      DOUBLE PRECISION DK
23384      DOUBLE PRECISION DOMEGA
23385      DOUBLE PRECISION DY1K
23386C
23387C---------------------------------------------------------------------
23388C
23389      DIMENSION Y1(*)
23390      DIMENSION Y2(*)
23391C
23392C-----COMMON----------------------------------------------------------
23393C
23394      INCLUDE 'DPCOP2.INC'
23395C
23396C-----START POINT-----------------------------------------------------
23397C
23398      ISUBN1='SINT'
23399      ISUBN2='RA  '
23400      IERROR='NO'
23401C
23402      N1HALF=(-999)
23403      IMAX=(-999)
23404      IEVODD=(-999)
23405      DDEL=(-999.0D0)
23406C
23407      DN1=N1
23408C
23409      DPI=3.14159265358979D0
23410C
23411      IF(IBUGA3.EQ.'ON')THEN
23412        WRITE(ICOUT,999)
23413  999   FORMAT(1X)
23414        CALL DPWRST('XXX','BUG ')
23415        WRITE(ICOUT,51)
23416   51   FORMAT('***** AT THE BEGINNING OF SINTRA--')
23417        CALL DPWRST('XXX','BUG ')
23418        WRITE(ICOUT,52)IBUGA3,IWRITE,N1,MAXOBV
23419   52   FORMAT('IBUGA3,IWRITE,N1,MAXOBV = ',2(A4,2X),2I8)
23420        CALL DPWRST('XXX','BUG ')
23421        DO55I=1,N1
23422          WRITE(ICOUT,56)I,Y1(I)
23423   56     FORMAT('I,Y1(I) = ',I8,G15.7)
23424          CALL DPWRST('XXX','BUG ')
23425   55   CONTINUE
23426      ENDIF
23427C
23428C               ***********************************
23429C               **  COMPUTE SINE TRANSFORM.      **
23430C               ***********************************
23431C
23432      IF(N1.LT.1)GOTO1100
23433      GOTO1190
23434C
23435 1100 CONTINUE
23436      IERROR='YES'
23437      WRITE(ICOUT,999)
23438      CALL DPWRST('XXX','BUG ')
23439      WRITE(ICOUT,1151)
23440 1151 FORMAT('***** ERROR IN SINTRA--')
23441      CALL DPWRST('XXX','BUG ')
23442      WRITE(ICOUT,1152)
23443 1152 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
23444      CALL DPWRST('XXX','BUG ')
23445      WRITE(ICOUT,1153)
23446 1153 FORMAT('      IN THE VARIABLE FOR WHICH')
23447      CALL DPWRST('XXX','BUG ')
23448      WRITE(ICOUT,1154)
23449 1154 FORMAT('      THE SINE TRANSFORM IS TO BE COMPUTED')
23450      CALL DPWRST('XXX','BUG ')
23451      WRITE(ICOUT,1155)
23452 1155 FORMAT('      MUST BE 1 OR LARGER.')
23453      CALL DPWRST('XXX','BUG ')
23454      WRITE(ICOUT,1156)
23455 1156 FORMAT('      SUCH WAS NOT THE CASE HERE.')
23456      CALL DPWRST('XXX','BUG ')
23457      WRITE(ICOUT,1157)N1
23458 1157 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
23459     1'.')
23460      CALL DPWRST('XXX','BUG ')
23461      GOTO9000
23462C
23463 1190 CONTINUE
23464C
23465      N1HALF=N1/2
23466      N1HALP=N1HALF+1
23467      IMAX=N1HALP
23468      IEVODD=N1-2*(N1/2)
23469      DDEL=(DN1+1.0D0)/2.0D0
23470      IF(IEVODD.EQ.0)DDEL=(DN1+2.0D0)/2.0D0
23471C
23472      J=0
23473      J=J+1
23474      Y2(J)=0.0
23475C
23476      DO1210IP1=2,IMAX
23477      J=J+1
23478      I=IP1-1
23479      DI=I
23480CCCCC FREQI=DI/DN1
23481      DSUM=0.0D0
23482C
23483      DO1220K=1,N1
23484      DK=K
23485      DOMEGA=2.0*DPI*(DI/DN1)
23486      DY1K=Y1(K)
23487      DSUM=DSUM+DY1K*DSIN(DOMEGA*(DK-DDEL))
23488 1220 CONTINUE
23489      COEF=DSUM/DN1
23490      IF(IBUGA3.EQ.'ON')WRITE(ICOUT,1221)J,I,DN1,DI,COEF
23491 1221 FORMAT('J,I,DN1,DI,COEF = ',I8,I8,2D15.7,E15.7)
23492      IF(IBUGA3.EQ.'ON')CALL DPWRST('XXX','BUG ')
23493C
23494      Y2(J)=COEF
23495C
23496 1210 CONTINUE
23497C
23498      N2=J
23499C
23500C               *****************
23501C               **  STEP 90--  **
23502C               **  EXIT.      **
23503C               *****************
23504C
23505 9000 CONTINUE
23506C
23507      IF(IBUGA3.EQ.'ON')THEN
23508        WRITE(ICOUT,999)
23509        CALL DPWRST('XXX','BUG ')
23510        WRITE(ICOUT,9011)
23511 9011   FORMAT('***** AT THE END       OF SINTRA--')
23512        CALL DPWRST('XXX','BUG ')
23513        WRITE(ICOUT,9012)IERROR
23514 9012   FORMAT('IERROR = ',A4)
23515        CALL DPWRST('XXX','BUG ')
23516        WRITE(ICOUT,9013)N1,N2,N1HALF,IMAX,IEVODD,DDEL
23517 9013   FORMAT('N1,N2,N1HALF,IMAX,IEVODD,DDEL = ',5I8,D15.7)
23518        CALL DPWRST('XXX','BUG ')
23519        DO9015I=1,N1
23520          WRITE(ICOUT,9016)I,Y1(I),Y2(I)
23521 9016     FORMAT('I,Y1(I),Y2(I) = ',I8,2G15.7)
23522          CALL DPWRST('XXX','BUG ')
23523 9015   CONTINUE
23524      ENDIF
23525C
23526      RETURN
23527      END
23528      SUBROUTINE SIZE(X,N,IWRITE,XSIZE,IBUGA3,IERROR)
23529C
23530C     PURPOSE--THIS SUBROUTINE    COMPUTES    THE
23531C              SAMPLE SIZE
23532C              OF THE DATA IN THE INPUT VECTOR X.
23533C              THE SAMPLE SIZE IS IDENTICALLY = THE INPUT ARGUMENT N
23534C              EXCEPT N IS AN INTEGER VARIABLE
23535C              WHEREAS THE OUTPUTTED XSIZE IS A SINGLE PRECISION VARIABLE.
23536C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
23537C                                (UNSORTED OR SORTED) OBSERVATIONS.
23538C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
23539C                                IN THE VECTOR X.
23540C     OUTPUT ARGUMENTS--XSIZE  = THE SINGLE PRECISION VALUE OF THE
23541C                                   COMPUTED    SAMPLE SIZE.
23542C     OUTPUT--THE    COMPUTED    SINGLE PRECISION VALUE OF THE
23543C             SAMPLE SIZE; THAT IS, A SINGLE PRECISION REPRESENTATION
23544C             OF THE INTEGER INPUT VARIABLE N.
23545C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
23546C                   OF N FOR THIS SUBROUTINE.
23547C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
23548C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
23549C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
23550C     LANGUAGE--ANSI FORTRAN (1977)
23551C     REFERENCES--NONE.
23552C     NOTE--ALTHOUGH THIS SUBROUTINE DOES    NOTHING
23553C           EXCEPT FORM THE SINGLE PRECISION VARIABLE XSIZE
23554C           WHICH IS EQUAL TO THE INTEGER INPUT VARIABLE N,
23555C           IT EXISTS AND HAS THE ARGUMENT STRUCTURE
23556C           THAT IT DOES SO AS TO HAVE AN IDENTICAL
23557C           CALLING SEQUENCE WITH MOST OF THE OTHER
23558C           SUBROUTINES IN THE INDIVIDUAL STATISTICS
23559C           CATEGORY OF THE DATAPAC LIBRARY.
23560C           THIS IS DESIRABLE FOR THE USE OF THE
23561C           SUBSET STATISTICS SUBROUTINES SSTAT1, SSTAT2, SSTAT3, ...
23562C           WHICH CARRY AN INDIVIDUAL STATISTICS CATEGORY SUBROUTINE
23563C           NAME (E. G., MEAN, MEDIAN, SD, RANGE, SIZE, ETC.)
23564C           AS ITS FIRST INPUT ARGUMENT SO AS TO SPECIFY
23565C           WHAT STATISTIC IS TO BE COMPUTED FOR THE SUBSETS OF
23566C     WRITTEN BY--JAMES J. FILLIBEN
23567C                 STATISTICAL ENGINEERING DIVISION
23568C                 INFORMATION TECHNOLOGY LABORATORY
23569C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
23570C                 GAITHERSBURG, MD 20899-8980
23571C                 PHONE--301-975-2855
23572C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23573C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
23574C     LANGUAGE--ANSI FORTRAN (1966)
23575C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
23576C                          DENOTED BY QUOTES RATHER THAN NH.
23577C     VERSION NUMBER--82.6
23578C     ORIGINAL VERSION--JUNE      1977.
23579C     UPDATED         --JUNE      1979.
23580C     UPDATED         --AUGUST    1981.
23581C     UPDATED         --MARCH     1982.
23582C     UPDATED         --MAY       1982.
23583C     UPDATED         --OCTOBER   2012. DON'T SET ERROR FLAG
23584C                                       FOR EMPTY SUBSET, JUST
23585C                                       SET SIZE TO 0.
23586C
23587C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23588C
23589      CHARACTER*4 IWRITE
23590      CHARACTER*4 IBUGA3
23591      CHARACTER*4 IERROR
23592C
23593      CHARACTER*4 ISUBN1
23594      CHARACTER*4 ISUBN2
23595C
23596C---------------------------------------------------------------------
23597C
23598      DIMENSION X(*)
23599C
23600C-----COMMON----------------------------------------------------------
23601C
23602      INCLUDE 'DPCOP2.INC'
23603C
23604C-----START POINT-----------------------------------------------------
23605C
23606      ISUBN1='SIZE'
23607      ISUBN2='    '
23608      IERROR='NO'
23609C
23610      IF(IBUGA3.EQ.'ON')THEN
23611        WRITE(ICOUT,999)
23612  999   FORMAT(1X)
23613        CALL DPWRST('XXX','BUG ')
23614        WRITE(ICOUT,51)
23615   51   FORMAT('***** AT THE BEGINNING OF SIZE--')
23616        CALL DPWRST('XXX','BUG ')
23617        WRITE(ICOUT,52)IBUGA3,N
23618   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
23619        CALL DPWRST('XXX','BUG ')
23620        DO55I=1,N
23621          WRITE(ICOUT,56)I,X(I)
23622   56     FORMAT('I,X(I) = ',I8,G15.7)
23623          CALL DPWRST('XXX','BUG ')
23624   55   CONTINUE
23625      ENDIF
23626C
23627C               ********************
23628C               **  COMPUTE SIZE  **
23629C               ********************
23630C
23631C               ********************************************
23632C               **  STEP 1--                              **
23633C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
23634C               ********************************************
23635C
23636CCCCC AN=N
23637C
23638CCCCC IF(N.GE.1)GOTO119
23639CCCCC IERROR='YES'
23640CCCCC WRITE(ICOUT,999)
23641CCCCC CALL DPWRST('XXX','BUG ')
23642CCCCC WRITE(ICOUT,111)
23643CC111 FORMAT('***** ERROR IN SIZE--')
23644CCCCC CALL DPWRST('XXX','BUG ')
23645CCCCC WRITE(ICOUT,112)
23646CC112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
23647CCCCC CALL DPWRST('XXX','BUG ')
23648CCCCC WRITE(ICOUT,113)
23649CC113 FORMAT('      IN THE VARIABLE FOR WHICH')
23650CCCCC CALL DPWRST('XXX','BUG ')
23651CCCCC WRITE(ICOUT,114)
23652CC114 FORMAT('      THE SAMPLE SIZE IS TO BE COMPUTED')
23653CCCCC CALL DPWRST('XXX','BUG ')
23654CCCCC WRITE(ICOUT,115)
23655CC115 FORMAT('      MUST BE 1 OR LARGER.')
23656CCCCC CALL DPWRST('XXX','BUG ')
23657CCCCC WRITE(ICOUT,116)
23658CC116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
23659CCCCC CALL DPWRST('XXX','BUG ')
23660CCCCC WRITE(ICOUT,117)N
23661CC117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
23662CCCCC1'.')
23663CCCCC CALL DPWRST('XXX','BUG ')
23664CCCCC GOTO9000
23665CC119 CONTINUE
23666C
23667CCCCC IF(N.LE.1)GOTO120
23668CCCCC GOTO129
23669CC120 CONTINUE
23670CCCCC WRITE(ICOUT,999)
23671CCCCC CALL DPWRST('XXX','BUG ')
23672CCCCC WRITE(ICOUT,121)N
23673CC121 FORMAT('***** NON-FATAL DIAGNOSTIC IN SIZE--',
23674CCCCC1'THE SECOND INPUT ARGUMENT (N) HAS THE VALUE ',I8)
23675CCCCC CALL DPWRST('XXX','BUG ')
23676CCCCC XSIZE=N
23677CCCCC GOTO9000
23678CC129 CONTINUE
23679C
23680CCCCC HOLD=X(1)
23681CCCCC DO135I=2,N
23682CCCCC IF(X(I).NE.HOLD)GOTO139
23683CC135 CONTINUE
23684CCCCC WRITE(ICOUT,999)
23685CCCCC CALL DPWRST('XXX','BUG ')
23686CCCCC WRITE(ICOUT,136)HOLD
23687CC136 FORMAT('***** NON-FATAL DIAGNOSTIC IN SIZE--',
23688CCCCC1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
23689CCCCC CALL DPWRST('XXX','BUG ')
23690CCCCC XSIZE=N
23691CCCCC GOTO9000
23692CC139 CONTINUE
23693C
23694CC190 CONTINUE
23695C
23696C               ********************************
23697C               **  STEP 2--                  **
23698C               **  COMPUTE THE SAMPLE SIZE.  **
23699C               ********************************
23700C
23701      XSIZE=N
23702C
23703C               *******************************
23704C               **  STEP 3--                 **
23705C               **  WRITE OUT A LINE         **
23706C               **  OF SUMMARY INFORMATION.  **
23707C               *******************************
23708C
23709      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
23710        WRITE(ICOUT,999)
23711        CALL DPWRST('XXX','BUG ')
23712        WRITE(ICOUT,811)N,XSIZE
23713  811   FORMAT('THE SAMPLE SIZE OF THE ',I8,' OBSERVATIONS = ',G15.7)
23714        CALL DPWRST('XXX','BUG ')
23715      ENDIF
23716C
23717C               *****************
23718C               **  STEP 90--  **
23719C               **  EXIT.      **
23720C               *****************
23721C
23722      IF(IBUGA3.EQ.'ON')THEN
23723        WRITE(ICOUT,999)
23724        CALL DPWRST('XXX','BUG ')
23725        WRITE(ICOUT,9011)
23726 9011   FORMAT('***** AT THE END       OF SIZE--')
23727        CALL DPWRST('XXX','BUG ')
23728        WRITE(ICOUT,9012)IBUGA3,IERROR,N,XSIZE
23729 9012   FORMAT('IBUGA3,IERROR,N,XSIZE = ',2(A4,2X),I8,G15.7)
23730        CALL DPWRST('XXX','BUG ')
23731      ENDIF
23732C
23733      RETURN
23734      END
23735      SUBROUTINE SLACDF(X,CDF)
23736C
23737C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
23738C              FUNCTION FROM THE THE SLASH DISTIBUTION WITH
23739C              LOCATION = 0 AND SCALE = 1.  THIS DISTRIBUTION IS
23740C              DEFINED FOR ALL X AND HAS THE PROBABILITY DENSITY
23741C              FUNCTION
23742C              F(X) = NORPDF(0) - NORPDF(X))/[X**2]     X <> 0
23743C                     0.5*NORPDF(0)                     X = 0
23744C              WHERE NORPDF IS THE PDF OF THE STANDARD NORMAL
23745C              DISTRIBUTION.  THE CUMULATIVE DISTRIBUTION IS
23746C              COMPUTED BY CALLING THE QAGI (FROM QUADPACK)
23747C              INTEGRATION ROUTINE.
23748C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
23749C                                WHICH THE CUMULATIVE DISTRIBUTION
23750C                                FUNCTION IS TO BE EVALUATED.
23751C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
23752C                                DISTRIBUTION FUNCTION VALUE.
23753C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
23754C             FUNCTION VALUE CDF.
23755C     PRINTING--NONE.
23756C     RESTRICTIONS--NONE.
23757C     OTHER DATAPAC   SUBROUTINES NEEDED--DQAGI.
23758C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
23759C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
23760C     LANGUAGE--ANSI FORTRAN (1977)
23761C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
23762C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
23763C     WRITTEN BY--JAMES J. FILLIBEN
23764C                 STATISTICAL ENGINEERING DIVISION
23765C                 INFORMATION TECHNOLOGY LABORATORY
23766C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
23767C                 GAITHERSBURG, MD 20899-8980
23768C                 PHONE--301-975-2855
23769C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23770C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
23771C     LANGUAGE--ANSI FORTRAN (1977)
23772C     VERSION NUMBER--2003.12
23773C     ORIGINAL VERSION--DECEMBER  2003.
23774C
23775C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23776C
23777C---------------------------------------------------------------------
23778C
23779      INTEGER LIMIT
23780      INTEGER LENW
23781      PARAMETER(LIMIT=100)
23782      PARAMETER(LENW=4*LIMIT)
23783      INTEGER INF
23784      INTEGER NEVAL
23785      INTEGER IER
23786      INTEGER LAST
23787      INTEGER IWORK(LIMIT)
23788      REAL X
23789      REAL CDF
23790      DOUBLE PRECISION EPSABS
23791      DOUBLE PRECISION EPSREL
23792      DOUBLE PRECISION DCDF
23793      DOUBLE PRECISION DX
23794      DOUBLE PRECISION ABSERR
23795      DOUBLE PRECISION WORK(LENW)
23796C
23797      DOUBLE PRECISION SLAFUN
23798      EXTERNAL SLAFUN
23799C
23800      INCLUDE 'DPCOP2.INC'
23801C
23802C-----START POINT-----------------------------------------------------
23803C
23804C
23805      INF=-1
23806      EPSABS=0.0D0
23807      EPSREL=1.0D-7
23808      IER=0
23809      DCDF=0.0D0
23810C
23811C  NOTE: FOR X > 0, COMPUTE 1 - SLACDF(-X) FOR EFFICIENCY (INTEGRATING
23812C        OVER A SMALLER RANGE) AND GREATER ACCURACY.
23813C
23814      IFLAG=0
23815      DX=DBLE(X)
23816      IF(DX.GT.0.0D0)THEN
23817        IFLAG=1
23818        DX=-DX
23819      ENDIF
23820C
23821      CALL DQAGI(SLAFUN,DX,INF,EPSABS,EPSREL,DCDF,ABSERR,NEVAL,
23822     1          IER,LIMIT,LENW,LAST,IWORK,WORK)
23823C
23824      IF(IFLAG.EQ.0)THEN
23825        CDF=REAL(DCDF)
23826      ELSE
23827        DCDF=1.0D0 - DCDF
23828        CDF=REAL(DCDF)
23829      ENDIF
23830C
23831      IF(IER.EQ.1)THEN
23832        WRITE(ICOUT,999)
23833  999   FORMAT(1X)
23834        CALL DPWRST('XXX','BUG ')
23835        WRITE(ICOUT,111)
23836  111   FORMAT('***** ERROR FROM SLACDF--')
23837        CALL DPWRST('XXX','BUG ')
23838        WRITE(ICOUT,113)
23839  113   FORMAT('      MAXIMUM NUMBER OF SUBDIVISIONS EXCEEDED.')
23840        CALL DPWRST('XXX','BUG ')
23841      ELSEIF(IER.EQ.2)THEN
23842        WRITE(ICOUT,999)
23843        CALL DPWRST('XXX','BUG ')
23844        WRITE(ICOUT,121)
23845  121   FORMAT('***** ERROR FROM SLACDF--')
23846        CALL DPWRST('XXX','BUG ')
23847        WRITE(ICOUT,123)
23848  123   FORMAT('      ROUNDOFF ERROR PREVENTS REQUESTED TOLERANCE ',
23849     1         'FROM BEING ACHIEVED.')
23850        CALL DPWRST('XXX','BUG ')
23851      ELSEIF(IER.EQ.3)THEN
23852        WRITE(ICOUT,999)
23853        CALL DPWRST('XXX','BUG ')
23854        WRITE(ICOUT,131)
23855  131   FORMAT('***** ERROR FROM SLACDF--')
23856        CALL DPWRST('XXX','BUG ')
23857        WRITE(ICOUT,133)
23858  133   FORMAT('      BAD INTEGRAND BEHAVIOUR DETECTED.')
23859        CALL DPWRST('XXX','BUG ')
23860      ELSEIF(IER.EQ.4)THEN
23861        WRITE(ICOUT,999)
23862        CALL DPWRST('XXX','BUG ')
23863        WRITE(ICOUT,141)
23864  141   FORMAT('***** ERROR FROM SLACDF--')
23865        CALL DPWRST('XXX','BUG ')
23866        WRITE(ICOUT,143)
23867  143   FORMAT('      INTEGRATION DID NOT CONVERGE.')
23868        CALL DPWRST('XXX','BUG ')
23869      ELSEIF(IER.EQ.5)THEN
23870        WRITE(ICOUT,999)
23871        CALL DPWRST('XXX','BUG ')
23872        WRITE(ICOUT,151)
23873  151   FORMAT('***** ERROR FROM SLACDF--')
23874        CALL DPWRST('XXX','BUG ')
23875        WRITE(ICOUT,153)
23876  153   FORMAT('      THE INTEGRATION IS PROBABLY DIVERGENT.')
23877        CALL DPWRST('XXX','BUG ')
23878      ELSEIF(IER.EQ.6)THEN
23879        WRITE(ICOUT,999)
23880        CALL DPWRST('XXX','BUG ')
23881        WRITE(ICOUT,161)
23882  161   FORMAT('***** ERROR FROM SLACDF--')
23883        CALL DPWRST('XXX','BUG ')
23884        WRITE(ICOUT,163)
23885  163   FORMAT('      INVALID INPUT TO THE INTEGRATION ROUTINE.')
23886        CALL DPWRST('XXX','BUG ')
23887      ENDIF
23888C
23889      RETURN
23890      END
23891      DOUBLE PRECISION FUNCTION SLAFUN(DX)
23892C
23893C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
23894C              FUNCTION FROM THE THE SLASH DISTIBUTION WITH
23895C              LOCATION = 0 AND SCALE = 1.  IDENTICAL TO SLAPDF,
23896C              BUT DEFINE AS FUNCTION TO BE USED FOR INTEGRATION
23897C              CODE CALLED BY SLACDF.
23898C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
23899C                                WHICH THE PROBABILITY DENSITY
23900C                                FUNCTION IS TO BE EVALUATED.
23901C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
23902C             FUNCTION VALUE SLAFUN.
23903C     PRINTING--NONE.
23904C     RESTRICTIONS--NONE.
23905C     OTHER DATAPAC   SUBROUTINES NEEDED--NODPDF.
23906C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
23907C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
23908C     LANGUAGE--ANSI FORTRAN (1977)
23909C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
23910C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
23911C     WRITTEN BY--JAMES J. FILLIBEN
23912C                 STATISTICAL ENGINEERING DIVISION
23913C                 INFORMATION TECHNOLOGY LABORATORY
23914C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
23915C                 GAITHERSBURG, MD 20899-8980
23916C                 PHONE--301-975-2855
23917C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23918C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
23919C     LANGUAGE--ANSI FORTRAN (1977)
23920C     VERSION NUMBER--2003.12
23921C     ORIGINAL VERSION--DECEMBER  2003.
23922C
23923C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23924C
23925      DOUBLE PRECISION DTERM2
23926      DOUBLE PRECISION DTERM3
23927      DOUBLE PRECISION DX
23928      DOUBLE PRECISION DPDF
23929C
23930C-----COMMON----------------------------------------------------------
23931C
23932      INCLUDE 'DPCOP2.INC'
23933C
23934C-----START POINT-----------------------------------------------------
23935C
23936C
23937C     TRANSFORM THE NORMAL PDF
23938C
23939      CALL NODPDF(DX,DTERM3)
23940C
23941      IF(DX.EQ.0.0D0)THEN
23942        DPDF=0.5D0*DTERM3
23943      ELSE
23944        CALL NODPDF(0.0D0,DTERM2)
23945        DPDF=(DTERM2 - DTERM3)/(DX*DX)
23946      ENDIF
23947C
23948      SLAFUN=DPDF
23949C
23950      RETURN
23951      END
23952      REAL FUNCTION SLAFU2(X)
23953C
23954C     PURPOSE--SLAPPF CALLS FZERO TO FIND A ROOT FOR THE PERCENT
23955C              POINT FUNCTION.  SLAFU2 IS THE FUNCTION FOR WHICH
23956C              THE ZERO IS FOUND.  IT IS:
23957C                 P - SLACDF(X)
23958C              WHERE P IS THE DESIRED PERCENT POINT.
23959C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
23960C                                WHICH THE CUMULATIVE DISTRIBUTION
23961C                                FUNCTION IS TO BE EVALUATED.
23962C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
23963C             FUNCTION VALUE SLAFU2.
23964C     PRINTING--NONE.
23965C     RESTRICTIONS--NONE.
23966C     OTHER DATAPAC   SUBROUTINES NEEDED--SLACDF.
23967C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
23968C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
23969C     LANGUAGE--ANSI FORTRAN (1977)
23970C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
23971C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
23972C     WRITTEN BY--JAMES J. FILLIBEN
23973C                 STATISTICAL ENGINEERING DIVISION
23974C                 INFORMATION TECHNOLOGY LABORATORY
23975C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
23976C                 GAITHERSBURG, MD 20899-8980
23977C                 PHONE--301-975-2855
23978C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23979C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
23980C     LANGUAGE--ANSI FORTRAN (1977)
23981C     VERSION NUMBER--2003.12
23982C     ORIGINAL VERSION--DECEMBER  2003.
23983C
23984C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23985C
23986      REAL P
23987      COMMON/SLACOM/P
23988C
23989C-----COMMON----------------------------------------------------------
23990C
23991      INCLUDE 'DPCOP2.INC'
23992C
23993C-----START POINT-----------------------------------------------------
23994C
23995      CALL SLACDF(X,CDF)
23996      SLAFU2=P - CDF
23997C
23998      RETURN
23999      END
24000      DOUBLE PRECISION FUNCTION SLAFU3(SIGMA,X)
24001C
24002C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE MAXIMUM LIKELIHOOD
24003C              ESTIMATE OF THE SCALE PARAMETER OF THE SLASH
24004C              DISTRIBUTION.  THIS FUNCTION FINDS THE ROOT OF
24005C              THE EQUATION:
24006C
24007C              (SIGMA**2/N)*SUM[i=1 to n][X(I)**2*W(X(I))] - 1 = 0
24008C
24009C              WHERE
24010C
24011C              X(I) = (Y(I) - MU)/SIGMA
24012C              W(X(I)) = (2/X**2) - 1/(EXP(X**2/2) - 1)
24013C
24014C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
24015C              FUNCTION.
24016C     EXAMPLE--SLASH MAXIMUM LIKELIHOOD Y
24017C     REFERENCE--KAREN KAFADAR, (1982), "A BIWEIGHT APPROACH TO
24018C                THE ONE-SAMPLE PROBLEM", JOURNAL OF THE
24019C                AMERICAN STATISTICAL ASSOCIATION, VOL. 77,
24020C                NO. 378, PP. 416-424.
24021C     WRITTEN BY--JAMES J. FILLIBEN
24022C                 STATISTICAL ENGINEERING DIVISION
24023C                 INFORMATION TECHNOLOGY LABORATORY
24024C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24025C                 GAITHERSBUG, MD 20899-8980
24026C                 PHONE--301-975-2855
24027C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24028C           OF THE NATIONAL BUREAU OF STANDARDS.
24029C     LANGUAGE--ANSI FORTRAN (1977)
24030C     VERSION NUMBER--2007/6
24031C     ORIGINAL VERSION--JUNE       2007.
24032C
24033C---------------------------------------------------------------------
24034C
24035      DOUBLE PRECISION SIGMA
24036      DOUBLE PRECISION X(*)
24037C
24038      INTEGER N
24039      DOUBLE PRECISION DMU
24040      COMMON/SL3COM/DMU,N
24041C
24042C---------------------------------------------------------------------
24043C
24044      DOUBLE PRECISION DSUM1
24045      DOUBLE PRECISION DX
24046      DOUBLE PRECISION DWI
24047C
24048      INCLUDE 'DPCOP2.INC'
24049C
24050C-----START POINT-----------------------------------------------------
24051C
24052      DSUM1=0.0D0
24053      DO100I=1,N
24054        DX=(X(I) - DMU)/SIGMA
24055        DWI=(2.0D0/DX**2) - 1.0D0/(DEXP(DX**2/2.0D0) - 1.0D0)
24056        DSUM1=DSUM1 + DX*DX*DWI
24057  100 CONTINUE
24058C
24059      SLAFU3=(SIGMA**2/DBLE(N))*DSUM1 - SIGMA**2
24060C
24061      RETURN
24062      END
24063      SUBROUTINE SLALI1(Y,TEMP1,N,ALOC,SCALE,
24064     1                  ALIK,AIC,AICC,BIC,
24065     1                  ISUBRO,IBUGA3,IERROR)
24066C
24067C     PURPOSE--THIS ROUTINE COMPUTES THE LIKELIHOOD FUNCTION FOR
24068C              THE SLASH DISTRIBUTION.  THIS IS FOR THE RAW DATA
24069C              CASE (I.E., NO GROUPING AND NO CENSORING).
24070C
24071C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
24072C              PERFORMED.
24073C
24074C     WRITTEN BY--ALAN HECKERT
24075C                 STATISTICAL ENGINEERING DIVISION
24076C                 INFORMATION TECHNOLOGY LABORATORY
24077C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24078C                 GAITHERSBURG, MD 20899-8980
24079C                 PHONE--301-975-2899
24080C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24081C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
24082C     LANGUAGE--ANSI FORTRAN (1977)
24083C     VERSION NUMBER--2009/10
24084C     ORIGINAL VERSION--OCTOBER   2009.
24085C
24086C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24087C
24088      CHARACTER*4 ISUBRO
24089      CHARACTER*4 IBUGA3
24090      CHARACTER*4 IERROR
24091C
24092      CHARACTER*4 IWRITE
24093      CHARACTER*4 ICASPL
24094      CHARACTER*4 IADEDF
24095      CHARACTER*4 IGEPDF
24096      CHARACTER*4 IMAKDF
24097      CHARACTER*4 IBEIDF
24098      CHARACTER*4 ILGADF
24099      CHARACTER*4 ISKNDF
24100      CHARACTER*4 IGLDDF
24101      CHARACTER*4 IBGEDF
24102      CHARACTER*4 IGETDF
24103      CHARACTER*4 ICONDF
24104      CHARACTER*4 IGOMDF
24105      CHARACTER*4 IKATDF
24106      CHARACTER*4 IGIGDF
24107      CHARACTER*4 IGEODF
24108C
24109      CHARACTER*4 ISUBN1
24110      CHARACTER*4 ISUBN2
24111      CHARACTER*4 ISTEPN
24112      CHARACTER*4 ICAPTY
24113      CHARACTER*4 ICAPSW
24114C
24115      DOUBLE PRECISION DN
24116      DOUBLE PRECISION DNP
24117      DOUBLE PRECISION DLIK
24118      DOUBLE PRECISION DTERM3
24119C
24120C---------------------------------------------------------------------
24121C
24122      DIMENSION Y(*)
24123      DIMENSION TEMP1(*)
24124C
24125C-----COMMON----------------------------------------------------------
24126C
24127      INCLUDE 'DPCOP2.INC'
24128C
24129C-----START POINT-----------------------------------------------------
24130C
24131      ISUBN1='SLAL'
24132      ISUBN2='I1  '
24133      IERROR='NO'
24134C
24135      ALIK=-99.0
24136      AIC=-99.0
24137      AICC=-99.0
24138      BIC=-99.0
24139C
24140      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'ALI1')THEN
24141        WRITE(ICOUT,999)
24142  999   FORMAT(1X)
24143        CALL DPWRST('XXX','WRIT')
24144        WRITE(ICOUT,51)
24145   51   FORMAT('**** AT THE BEGINNING OF SLALI1--')
24146        CALL DPWRST('XXX','WRIT')
24147        WRITE(ICOUT,52)IBUGA3,ISUBRO
24148   52   FORMAT('IBUGA3,ISUBRO = ',A4,2X,A4)
24149        CALL DPWRST('XXX','WRIT')
24150        WRITE(ICOUT,55)N,ALOC,SCALE
24151   55   FORMAT('N,ALOC,SCALE = ',I8,2G15.7)
24152        CALL DPWRST('XXX','WRIT')
24153        DO56I=1,MIN(N,100)
24154          WRITE(ICOUT,57)I,Y(I)
24155   57     FORMAT('I,Y(I) = ',I8,G15.7)
24156          CALL DPWRST('XXX','WRIT')
24157   56   CONTINUE
24158      ENDIF
24159C
24160C               ******************************************
24161C               **  STEP 1--                            **
24162C               **  COMPUTE LIKELIHOOD FUNCTION         **
24163C               ******************************************
24164C
24165      ISTEPN='1'
24166      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'ALI1')
24167     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
24168C
24169      IERFLG=0
24170      IERROR='NO'
24171      IWRITE='OFF'
24172      ICASPL='SLAS'
24173      MINMAX=0
24174C
24175C     COMPUTE THE LOG-LIKELIHOOD FUNCTION FROM:
24176C
24177C         LOG-LIKE = SUM[i=1 to n][LOG(f(x(i);theta))]
24178C
24179C     WITH theta DENOTING THE PARAMETERS OF THE
24180C     DISTRIBUTION.  CALL DPPDF1 AND SUM TO COMPUTE THIS SUM.
24181C
24182      SHAPE1=CPUMIN
24183      SHAPE2=CPUMIN
24184      SHAPE3=CPUMIN
24185      SHAPE4=CPUMIN
24186      SHAPE5=CPUMIN
24187      SHAPE6=CPUMIN
24188      SHAPE7=CPUMIN
24189      IADEDF='NULL'
24190      IGEPDF='NULL'
24191      IMAKDF='NULL'
24192      IBEIDF='NULL'
24193      ILGADF='NULL'
24194      ISKNDF='NULL'
24195      IGLDDF='NULL'
24196      IBGEDF='NULL'
24197      IGETDF='NULL'
24198      ICONDF='NULL'
24199      IGOMDF='NULL'
24200      IKATDF='NULL'
24201      IGIGDF='NULL'
24202      IGEODF='NULL'
24203      ICAPSW='NULL'
24204      ICAPTY='NULL'
24205      CALL DPPDF1(Y,TEMP1,N,ICASPL,
24206     1            SHAPE1,SHAPE2,SHAPE3,SHAPE4,
24207     1            SHAPE5,SHAPE6,SHAPE7,
24208     1            YLOWLM,YUPPLM,A,B,MINMAX,
24209     1            ICAPSW,ICAPTY,
24210     1            IADEDF,IGEPDF,IMAKDF,IBEIDF,
24211     1            ILGADF,ISKNDF,IGLDDF,IBGEDF,
24212     1            IGETDF,ICONDF,IGOMDF,IKATDF,
24213     1            IGIGDF,IGEODF,
24214     1            ALOC,SCALE,
24215     1            IBUGA3,ISUBRO,IERROR)
24216      DO1000I=1,N
24217        TEMP1(I)=LOG(TEMP1(I))
24218 1000 CONTINUE
24219      CALL SUMDP(TEMP1,N,IWRITE,ALIK,IBUGA3,IERROR)
24220C
24221      DN=DBLE(N)
24222      DLIK=DBLE(ALIK)
24223      DNP=2.0D0
24224      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
24225      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
24226      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
24227      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
24228C
24229      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'ALI1')THEN
24230        WRITE(ICOUT,999)
24231        CALL DPWRST('XXX','WRIT')
24232        WRITE(ICOUT,9011)
24233 9011   FORMAT('**** AT THE END OF SLALI1--')
24234        CALL DPWRST('XXX','WRIT')
24235        WRITE(ICOUT,9013)DSUM1,DTERM1,DTERM3
24236 9013   FORMAT('DSUM1,DTERM1,DTERM3 = ',3G15.7)
24237        CALL DPWRST('XXX','WRIT')
24238        WRITE(ICOUT,9014)ALIK,AIC,AICC,BIC
24239 9014   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
24240        CALL DPWRST('XXX','WRIT')
24241      ENDIF
24242C
24243      RETURN
24244      END
24245      SUBROUTINE SLAML1(Y,N,MAXNXT,
24246     1                  TEMP1,TEMP2,TEMP3,DTEMP1,
24247     1                  XMEAN,XSD,XMIN,XMAX,XMED,XMAD,
24248     1                  ALOC,ASCALE,
24249     1                  ISUBRO,IBUGA3,IERROR)
24250C
24251C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
24252C              FOR THE SLASH DISTRIBUTION FOR THE RAW DATA CASE (I.E.,
24253C              NO CENSORING AND NO GROUPING).
24254C
24255C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
24256C              PERFORMED.
24257C
24258C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
24259C              FROM MULTIPLE PLACES (DPMGU1 WILL GENERATE THE OUTPUT
24260C              FOR THE SLASH MLE COMMAND).
24261C
24262C     WRITTEN BY--ALAN HECKERT
24263C                 STATISTICAL ENGINEERING DIVISION
24264C                 INFORMATION TECHNOLOGY LABORATORY
24265C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24266C                 GAITHERSBURG, MD 20899-8980
24267C                 PHONE--301-975-2899
24268C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24269C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
24270C     LANGUAGE--ANSI FORTRAN (1977)
24271C     VERSION NUMBER--2009/10
24272C     ORIGINAL VERSION--OCTOBER   2009. EXTRACTED AS A SEPARATE
24273C                                       SUBROUTINE (FROM DPMLSL)
24274C
24275C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24276C
24277      CHARACTER*4 ISUBRO
24278      CHARACTER*4 IBUGA3
24279      CHARACTER*4 IERROR
24280C
24281      CHARACTER*4 IWRITE
24282      CHARACTER*40 IDIST
24283C
24284      CHARACTER*4 ISUBN1
24285      CHARACTER*4 ISUBN2
24286      CHARACTER*4 ISTEPN
24287      INTEGER IFLAG
24288C
24289      DIMENSION Y(*)
24290      DIMENSION TEMP1(*)
24291      DIMENSION TEMP2(*)
24292      DIMENSION TEMP3(*)
24293      DOUBLE PRECISION DTEMP1(*)
24294C
24295      DOUBLE PRECISION DAE
24296      DOUBLE PRECISION DRE
24297      DOUBLE PRECISION DXSTRT
24298      DOUBLE PRECISION DXLOW
24299      DOUBLE PRECISION DXUP
24300      DOUBLE PRECISION XLOWSV
24301      DOUBLE PRECISION XUPSV
24302C
24303C
24304      DOUBLE PRECISION SLAFU3
24305      EXTERNAL SLAFU3
24306C
24307      INTEGER IN
24308      DOUBLE PRECISION DMU
24309      COMMON/SL3COM/DMU,IN
24310C
24311C-----COMMON----------------------------------------------------------
24312C
24313      INCLUDE 'DPCOP2.INC'
24314C
24315C-----START POINT-----------------------------------------------------
24316C
24317      ISUBN1='SLAM'
24318      ISUBN2='L1  '
24319      IWRITE='OFF'
24320      IERROR='NO'
24321C
24322      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'AML1')THEN
24323        WRITE(ICOUT,999)
24324  999   FORMAT(1X)
24325        CALL DPWRST('XXX','WRIT')
24326        WRITE(ICOUT,51)
24327   51   FORMAT('**** AT THE BEGINNING OF SLAML1--')
24328        CALL DPWRST('XXX','WRIT')
24329        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,MAXNXT
24330   52   FORMAT('IBUGA3,ISUBRO,N,MAXNXT = ',2(A4,2X),2I8)
24331        CALL DPWRST('XXX','WRIT')
24332        DO56I=1,MIN(N,100)
24333          WRITE(ICOUT,57)I,Y(I)
24334   57     FORMAT('I,Y(I) = ',I8,G15.7)
24335          CALL DPWRST('XXX','WRIT')
24336   56   CONTINUE
24337      ENDIF
24338C
24339C               ********************************************
24340C               **  STEP 1--                              **
24341C               **  CARRY OUT CALCULATIONS                **
24342C               **  FOR SLASH MLE ESTIMATE                **
24343C               ********************************************
24344C
24345      ISTEPN='1'
24346      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'AML1')
24347     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
24348C
24349      IDIST='SLASH'
24350      IFLAG=0
24351      CALL SUMRAW(Y,N,IDIST,IFLAG,
24352     1            XMEAN,XVAR,XSD,XMIN,XMAX,
24353     1            ISUBRO,IBUGA3,IERROR)
24354      CALL MEDIAN(Y,N,IWRITE,TEMP1,MAXNXT,XMED,IBUGA3,IERROR)
24355C
24356      CALL MAD(Y,N,IWRITE,TEMP1,TEMP2,MAXNXT,XMAD,IBUGA3,IERROR)
24357      CALL SORT(Y,N,Y)
24358C
24359C     IF THE DATA ARE IN Y, THE ML ESTIMATE FOR THE LOCATION
24360C     PARAMETER IS THE SOLUTION TO THE EQUATION
24361C
24362C        MUHAT = SUM[i=1 to n][X(I)*W(X(I))]/
24363C                SUM[i=1 to n][W(X(I))]
24364C
24365C     WHERE
24366C
24367C        X(I) = (Y(I) - MU)/SIGMA
24368C        W(X(I)) = (2/X**2) - 1/(EXP(X**2/2) - 1)
24369C
24370C     THIS IS THE BIWEIGHT ESTIMATE OF LOCATION.
24371C
24372      DO1107I=1,N
24373        TEMP1(I)=Y(I)
24374 1107 CONTINUE
24375      CALL BIWLOC(TEMP1,N,IWRITE,TEMP2,TEMP3,MAXNXT,XBW,
24376     1            IBUGA3,IERROR)
24377      ALOC=XBW
24378C
24379C     THE ESTIMATE FOR THE SCALE PARAMETER IS THE SOLUTION
24380C     OF THE FOLLOWING EQUATION:
24381C
24382C        (1/N)*SUM[i=1 to n][X(I)**2*W(X(I))] - 1 = 0
24383C
24384      DO4101I=1,N
24385        DTEMP1(I)=DBLE(Y(I))
24386 4101 CONTINUE
24387C
24388      DMU=DBLE(ALOC)
24389      IN=N
24390C
24391      DXSTRT=DBLE(XMAD)
24392      DAE=2.0*0.000001D0*DXSTRT
24393      DRE=DAE
24394      IFLAG=0
24395      DXLOW=DXSTRT/2.0D0
24396      DXUP=2.0D0*DXSTRT
24397      ITBRAC=0
24398 4105 CONTINUE
24399      XLOWSV=DXLOW
24400      XUPSV=DXUP
24401      CALL DFZER2(SLAFU3,DXLOW,DXUP,DXSTRT,DRE,DAE,IFLAG,DTEMP1)
24402C
24403      IF(IFLAG.EQ.4 .AND. ITBRAC.LE.100)THEN
24404        DXLOW=XLOWSV/2.0D0
24405        DXUP=2.0D0*XUPSV
24406        ITBRAC=ITBRAC+1
24407        GOTO4105
24408      ENDIF
24409C
24410      IF(IFLAG.EQ.2)THEN
24411C
24412C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
24413CCCCC   WRITE(ICOUT,999)
24414CCCCC   CALL DPWRST('XXX','BUG ')
24415CCCCC   WRITE(ICOUT,111)
24416CC111   FORMAT('***** WARNING FROM SLASH MAXIMUM ',
24417CCCCC1         'LIKELIHOOD--')
24418CCCCC   CALL DPWRST('XXX','BUG ')
24419CCCCC   WRITE(ICOUT,113)
24420CC113   FORMAT('      ESTIMATE OF SIGMA MAY NOT BE COMPUTED TO ',
24421CCCCC1         'DESIRED TOLERANCE.')
24422CCCCC   CALL DPWRST('XXX','BUG ')
24423      ELSEIF(IFLAG.EQ.3)THEN
24424        WRITE(ICOUT,999)
24425        CALL DPWRST('XXX','BUG ')
24426        WRITE(ICOUT,121)
24427  121   FORMAT('***** WARNING FROM SLASH MAXIMUM LIKELIHOOD--')
24428        CALL DPWRST('XXX','BUG ')
24429        WRITE(ICOUT,123)
24430  123   FORMAT('      ESTIMATE OF SIGMA MAY BE NEAR A SINGULAR POINT.')
24431        CALL DPWRST('XXX','BUG ')
24432      ELSEIF(IFLAG.EQ.4)THEN
24433        WRITE(ICOUT,999)
24434        CALL DPWRST('XXX','BUG ')
24435        WRITE(ICOUT,131)
24436  131   FORMAT('***** ERROR FROM SLASH MAXIMUM LIKELIHOOD--')
24437        CALL DPWRST('XXX','BUG ')
24438        WRITE(ICOUT,133)
24439  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
24440        CALL DPWRST('XXX','BUG ')
24441      ELSEIF(IFLAG.EQ.5)THEN
24442        WRITE(ICOUT,999)
24443        CALL DPWRST('XXX','BUG ')
24444        WRITE(ICOUT,141)
24445  141   FORMAT('***** WARNING FROM SLASH MAXIMUM LIKELIHOOD--')
24446        CALL DPWRST('XXX','BUG ')
24447        WRITE(ICOUT,143)
24448  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
24449        CALL DPWRST('XXX','BUG ')
24450      ENDIF
24451C
24452      ASCALE=REAL(DXLOW)
24453C
24454      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'AML1')THEN
24455        WRITE(ICOUT,999)
24456        CALL DPWRST('XXX','WRIT')
24457        WRITE(ICOUT,9011)
24458 9011   FORMAT('**** AT THE END OF SLAML1--')
24459        CALL DPWRST('XXX','WRIT')
24460        WRITE(ICOUT,9055)N,XMEAN,XSD,XMIN,XMAX
24461 9055   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
24462        CALL DPWRST('XXX','WRIT')
24463        WRITE(ICOUT,9056)ALOC,ASCALE,XMED,XMAD
24464 9056   FORMAT('ALOC,ASCALE,XMED,XMAD = ',4G15.7)
24465        CALL DPWRST('XXX','WRIT')
24466      ENDIF
24467C
24468      RETURN
24469      END
24470      SUBROUTINE SLAPDF(X,PDF)
24471C
24472C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
24473C              FUNCTION FROM THE THE SLASH DISTIBUTION WITH
24474C              LOCATION = 0 AND SCALE = 1.  THIS DISTRIBUTION IS
24475C              DEFINED FOR ALL X AND HAS THE PROBABILITY DENSITY
24476C              FUNCTION
24477C              F(X) = NORPDF(0) - NORPDF(X))/[X**2]     X <> 0
24478C                     0.5*NORPDF(0)                     X = 0
24479C              WHERE NORPDF IS THE PDF OF THE STANDARD NORMAL
24480C              DISTRIBUTION.
24481C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
24482C                                WHICH THE PROBABILITY DENSITY
24483C                                FUNCTION IS TO BE EVALUATED.
24484C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
24485C                                DENSITY FUNCTION VALUE.
24486C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
24487C             FUNCTION VALUE PDF.
24488C     PRINTING--NONE.
24489C     RESTRICTIONS--NONE.
24490C     OTHER DATAPAC   SUBROUTINES NEEDED--NODPDF.
24491C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
24492C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
24493C     LANGUAGE--ANSI FORTRAN (1977)
24494C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
24495C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
24496C     WRITTEN BY--JAMES J. FILLIBEN
24497C                 STATISTICAL ENGINEERING DIVISION
24498C                 INFORMATION TECHNOLOGY LABORATORY
24499C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
24500C                 GAITHERSBURG, MD 20899-8980
24501C                 PHONE--301-975-2855
24502C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24503C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
24504C     LANGUAGE--ANSI FORTRAN (1977)
24505C     VERSION NUMBER--2003.1
24506C     ORIGINAL VERSION--JANUARY   2003.
24507C
24508C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24509C
24510      DOUBLE PRECISION DTERM2
24511      DOUBLE PRECISION DTERM3
24512      DOUBLE PRECISION DX
24513      DOUBLE PRECISION DPDF
24514C
24515C-----COMMON----------------------------------------------------------
24516C
24517      INCLUDE 'DPCOP2.INC'
24518C
24519C-----START POINT-----------------------------------------------------
24520C
24521C
24522C     TRANSFORM THE NORMAL PDF
24523C
24524      DX=DBLE(X)
24525      CALL NODPDF(DX,DTERM3)
24526C
24527      IF(X.EQ.0.0)THEN
24528        DPDF=0.5D0*DTERM3
24529        PDF=REAL(DPDF)
24530      ELSE
24531        CALL NODPDF(0.0D0,DTERM2)
24532        DPDF=(DTERM2 - DTERM3)/(DX*DX)
24533        PDF=REAL(DPDF)
24534      ENDIF
24535C
24536      RETURN
24537      END
24538      SUBROUTINE SLAPPF(P,PPF)
24539C
24540C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
24541C              FUNCTION OF THE THE SLASH DISTIBUTION WITH
24542C              LOCATION = 0 AND SCALE = 1.  THIS DISTRIBUTION IS
24543C              DEFINED FOR ALL X AND HAS THE PROBABILITY DENSITY
24544C              FUNCTION
24545C              F(X) = NORPDF(0) - NORPDF(X))/[X**2]     X <> 0
24546C                     0.5*NORPDF(0)                     X = 0
24547C              WHERE NORPDF IS THE PDF OF THE STANDARD NORMAL
24548C              DISTRIBUTION.  THE PERCENT POINT FUNCTION IS
24549C              COMPUTED BY CALLING THE FZERO ROUTINE TO FIND THE
24550C              ROOT OF P - SLACDF(X) WHERE SLACDF IS THE CUMULATIVE
24551C              DISTRIBUTION FUNCTION OF THE SLASH DISTRIBUTION.
24552C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
24553C                                WHICH THE PERCENT POINT
24554C                                FUNCTION IS TO BE EVALUATED.
24555C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION CUMULATIVE
24556C                                DISTRIBUTION FUNCTION VALUE.
24557C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
24558C             FUNCTION VALUE PPF.
24559C     PRINTING--NONE.
24560C     RESTRICTIONS--NONE.
24561C     OTHER DATAPAC   SUBROUTINES NEEDED--FZERO.
24562C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
24563C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
24564C     LANGUAGE--ANSI FORTRAN (1977)
24565C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
24566C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
24567C     WRITTEN BY--JAMES J. FILLIBEN
24568C                 STATISTICAL ENGINEERING DIVISION
24569C                 INFORMATION TECHNOLOGY LABORATORY
24570C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
24571C                 GAITHERSBURG, MD 20899-8980
24572C                 PHONE--301-975-2855
24573C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24574C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
24575C     LANGUAGE--ANSI FORTRAN (1977)
24576C     VERSION NUMBER--2003.12
24577C     ORIGINAL VERSION--DECEMBER  2003.
24578C
24579C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24580C
24581C---------------------------------------------------------------------
24582C
24583      REAL PPF
24584C
24585      REAL SLAFU2
24586      EXTERNAL SLAFU2
24587C
24588      REAL P2
24589      COMMON/SLACOM/P2
24590C
24591      INCLUDE 'DPCOP2.INC'
24592C
24593C-----START POINT-----------------------------------------------------
24594C
24595C
24596      IF(P.LE.0.0.OR.P.GE.1.0)THEN
24597         WRITE(ICOUT,61)
24598   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
24599     1          'TO THE SLAPPF SUBROUTINE ')
24600         CALL DPWRST('XXX','BUG ')
24601         WRITE(ICOUT,62)
24602   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL ***')
24603         CALL DPWRST('XXX','BUG ')
24604         WRITE(ICOUT,63)P
24605   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
24606         CALL DPWRST('XXX','BUG ')
24607         PPF=0.0
24608         GOTO9000
24609      ELSE
24610         XTEMP=675000.
24611         CALL SLACDF(-XTEMP,PLOW)
24612         CALL SLACDF(XTEMP,PUPP)
24613         IF(P.LT.PLOW .OR. P.GT.PUPP)THEN
24614           WRITE(ICOUT,71)
24615   71      FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
24616     1            'TO THE SLAPPF SUBROUTINE ')
24617           CALL DPWRST('XXX','BUG ')
24618           WRITE(ICOUT,72)
24619   72      FORMAT('      IS OUTSIDE THE INTERVAL (',G15.7,',',G15.7,
24620     1            ') INTERVAL, UNABLE TO COMPUTE PPF')
24621           CALL DPWRST('XXX','BUG ')
24622           WRITE(ICOUT,63)P
24623           CALL DPWRST('XXX','BUG ')
24624           PPF=0.0
24625           GOTO9000
24626         ENDIF
24627      ENDIF
24628C
24629C  STEP 1: FIND BRACKETING INTERVAL.  START WITH FACT THAT SLASH
24630C          DISTRIBUTION IS SYMMETRIC ABOUT X = 0.
24631C
24632      IF(P.EQ.0.5)THEN
24633        PPF=0.0
24634        GOTO9000
24635      ELSEIF(P.GT.0.5)THEN
24636        XLOW=0.0
24637        IF(P.LE.0.95)THEN
24638          XUP=9.0
24639        ELSEIF(P.LT.0.995)THEN
24640          XUP=100.
24641        ELSEIF(P.LT.0.9995)THEN
24642          XUP=1000.
24643        ELSEIF(P.LT.0.99995)THEN
24644          XUP=10000.
24645        ELSE
24646          XUP=675000.
24647        ENDIF
24648      ELSE
24649        XUP=0.0
24650        IF(P.GT.0.05)THEN
24651          XLOW=-9.0
24652        ELSEIF(P.GT.0.005)THEN
24653          XLOW=-100.0
24654        ELSEIF(P.GT.0.0005)THEN
24655          XLOW=-1000.
24656        ELSEIF(P.GT.0.00005)THEN
24657          XLOW=-10000.
24658        ELSE
24659          XLOW=-675000.
24660        ENDIF
24661      ENDIF
24662C
24663      P2=P
24664      AE=1.E-6
24665      RE=1.E-6
24666      IFLAG=0
24667      CALL FZERO(SLAFU2,XLOW,XUP,XUP,RE,AE,IFLAG)
24668C
24669      PPF=XLOW
24670C
24671      IF(IFLAG.EQ.2)THEN
24672C
24673C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
24674CCCCC   WRITE(ICOUT,999)
24675  999   FORMAT(1X)
24676CCCCC   CALL DPWRST('XXX','BUG ')
24677CCCCC   WRITE(ICOUT,111)
24678CC111   FORMAT('***** WARNING FROM SLAPPF--')
24679CCCCC   CALL DPWRST('XXX','BUG ')
24680CCCCC   WRITE(ICOUT,113)
24681CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
24682CCCCC1         'TOLERANCE.')
24683CCCCC   CALL DPWRST('XXX','BUG ')
24684      ELSEIF(IFLAG.EQ.3)THEN
24685        WRITE(ICOUT,999)
24686        CALL DPWRST('XXX','BUG ')
24687        WRITE(ICOUT,121)
24688  121   FORMAT('***** WARNING FROM SLAPPF--')
24689        CALL DPWRST('XXX','BUG ')
24690        WRITE(ICOUT,123)
24691  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
24692        CALL DPWRST('XXX','BUG ')
24693      ELSEIF(IFLAG.EQ.4)THEN
24694        WRITE(ICOUT,999)
24695        CALL DPWRST('XXX','BUG ')
24696        WRITE(ICOUT,131)
24697  131   FORMAT('***** ERROR FROM SLAPPF--')
24698        CALL DPWRST('XXX','BUG ')
24699        WRITE(ICOUT,133)
24700  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
24701        CALL DPWRST('XXX','BUG ')
24702      ELSEIF(IFLAG.EQ.5)THEN
24703        WRITE(ICOUT,999)
24704        CALL DPWRST('XXX','BUG ')
24705        WRITE(ICOUT,141)
24706  141   FORMAT('***** WARNING FROM SLAPPF--')
24707        CALL DPWRST('XXX','BUG ')
24708        WRITE(ICOUT,143)
24709  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
24710        CALL DPWRST('XXX','BUG ')
24711      ENDIF
24712C
24713 9000 CONTINUE
24714      RETURN
24715      END
24716      SUBROUTINE SLARAN(N,ISEED,X)
24717C
24718C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
24719C              FROM THE THE SLASH DISTIBUTION WITH LOCATION = 0
24720C              AND SCALE = 1.  THIS DISTRIBUTION IS DEFINED FOR ALL
24721C              X AND HAS THE PROBABILITY DENSITY FUNCTION
24722C              F(X) = NORPDF(0) - NORPDF(X))/[X**2]     X <> 0
24723C                     0.5*NORPDF(0)                     X = 0
24724C              WHERE NORPDF IS THE PDF OF THE STANDARD NORMAL
24725C              DISTRIBUTION.  NOTE THAT THE SLASH DISTRIBUTION IS
24726C              THE RATIO OF AN INDEPENDENT STANDARD NORMAL AND
24727C              UNIFORM DISTRIBUTIONS.
24728C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
24729C                                OF RANDOM NUMBERS TO BE
24730C                                GENERATED.
24731C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
24732C                                (OF DIMENSION AT LEAST N)
24733C                                INTO WHICH THE GENERATED
24734C                                RANDOM SAMPLE WILL BE PLACED.
24735C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE SLASH DISTRIBUTION
24736C             WITH LOCATION = 0 AND SCALE = 1.
24737C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24738C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
24739C                   OF N FOR THIS SUBROUTINE.
24740C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
24741C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG, SQRT, SIN, COS.
24742C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24743C     LANGUAGE--ANSI FORTRAN (1977)
24744C     METHOD--TRANSFORM NORMAL RANDOM NUMBERS
24745C     REFERENCES--JOHNSON, KOTZ, BALKRISHNAN, "CONTINUOUS UNIVARIATE
24746C                 DISTRIBUTIONS, VOLUME 1", WILEY, 1994 (PAGE 63).
24747C     WRITTEN BY--JAMES J. FILLIBEN
24748C                 STATISTICAL ENGINEERING DIVISION
24749C                 INFORMATION TECHNOLOGY LABORATORY
24750C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
24751C                 GAITHERSBURG, MD 20899-8980
24752C                 PHONE--301-975-2855
24753C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24754C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
24755C     LANGUAGE--ANSI FORTRAN (1977)
24756C     VERSION NUMBER--2003.1
24757C     ORIGINAL VERSION--JANUARY   2003.
24758C
24759C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24760C
24761C---------------------------------------------------------------------
24762C
24763      DIMENSION X(*)
24764      DIMENSION Y(1)
24765C
24766C-----COMMON----------------------------------------------------------
24767C
24768      INCLUDE 'DPCOP2.INC'
24769C
24770C-----START POINT-----------------------------------------------------
24771C
24772C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24773C
24774C     GENERATE N NORMAL (0,1) RANDOM NUMBERS;
24775C
24776C
24777C     TRANSFORM THE NORMAL RANDOM NUMBERS
24778C
24779      NTEMP=1
24780      DO300I=1,N
24781        CALL NORRAN(NTEMP,ISEED,Y)
24782        TERM1=Y(1)
24783        CALL UNIRAN(NTEMP,ISEED,Y)
24784        TERM2=Y(1)
24785        IF(TERM2.EQ.0.0)THEN
24786          CALL UNIRAN(NTEMP,ISEED,Y)
24787          TERM2=Y(1)
24788        ENDIF
24789        X(I)=TERM1/TERM2
24790  300 CONTINUE
24791C
24792      RETURN
24793      END
24794      SUBROUTINE SLOCDF(X,ALPHA,CDF)
24795C
24796C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
24797C              FUNCTION VALUE FOR THE SLOPE DISTRIBUTION.
24798C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
24799C
24800C                  F(X;ALPHA) = ALPHA*X + (1-ALPHA)*X**2
24801C                              0 <= X <= 1, 0 <= ALPHA <= 2
24802C
24803C              WITH ALPHA DENOTING THE SHAPE PARAMETER.
24804C
24805C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
24806C                                WHICH THE CUMULATIVE DISTRIBUTION
24807C                                FUNCTION IS TO BE EVALUATED.
24808C                     --ALPHA   = THE SINGLE PRECISION SHAPE PARAMETER
24809C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
24810C                                DISTRIBUTION FUNCTION VALUE.
24811C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
24812C             FUNCTION VALUE CDF.
24813C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24814C     RESTRICTIONS--X SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
24815C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
24816C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
24817C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24818C     LANGUAGE--ANSI FORTRAN.
24819C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND ALPHA: OTHER
24820C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
24821C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
24822C                 PUBLISHING COMPANY, CHAPTER 8.
24823C     WRITTEN BY--JAMES J. FILLIBEN
24824C                 STATISTICAL ENGINEERING DIVISION
24825C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24826C                 GAITHERSBURG, MD 20899-8980
24827C                 PHONE:  301-975-2855
24828C     ORIGINAL VERSION--SEPTEMBER   2007.
24829C
24830C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24831C
24832C-----COMMON----------------------------------------------------------
24833C
24834      INCLUDE 'DPCOP2.INC'
24835C
24836C---------------------------------------------------------------------
24837C
24838C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24839C
24840      IF(X.LT.0.0 .OR. X.GT.1.0)THEN
24841        WRITE(ICOUT,2)
24842        CALL DPWRST('XXX','BUG ')
24843        WRITE(ICOUT,46)X
24844        CALL DPWRST('XXX','BUG ')
24845        CDF=0.0
24846        GOTO9000
24847      ELSEIF(ALPHA.LT.0.0 .OR. ALPHA.GT.2.0)THEN
24848        WRITE(ICOUT,12)
24849        CALL DPWRST('XXX','BUG ')
24850        WRITE(ICOUT,46)ALPHA
24851        CALL DPWRST('XXX','BUG ')
24852        CDF=0.0
24853        GOTO9000
24854      ENDIF
24855    2 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO SLOCDF IS ',
24856     1       'OUTSIDE THE (0,1) INTERVAL.')
24857   12 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO SLOCDF IS ',
24858     1       'OUTSIDE THE (0,2) INTERVAL.')
24859   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
24860C
24861C-----START POINT-----------------------------------------------------
24862C
24863      CDF=ALPHA*X + (1.0-ALPHA)*X**2
24864C
24865 9000 CONTINUE
24866      RETURN
24867      END
24868      SUBROUTINE SLOPDF(X,ALPHA,PDF)
24869C
24870C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
24871C              FUNCTION VALUE FOR THE SLOPE DISTRIBUTION.
24872C              THE PROBABILITY DENSITY FUNCTION IS:
24873C
24874C                  f(X;ALPHA) = ALPHA + 2*(1-ALPHA)*X
24875C                              0 <= X <= 1, 0 <= ALPHA <= 2
24876C
24877C              WITH ALPHA DENOTING THE SHAPE PARAMETER.
24878C
24879C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
24880C                                WHICH THE PROBABILITY DENSITY
24881C                                FUNCTION IS TO BE EVALUATED.
24882C                     --ALPHA   = THE SINGLE PRECISION SHAPE PARAMETER
24883C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
24884C                                DENSITY FUNCTION VALUE.
24885C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
24886C             FUNCTION VALUE PDF.
24887C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24888C     RESTRICTIONS--X SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
24889C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
24890C     FORTRAN LIBRARY SUBROUTINES NEEDED--DLOG, DEXP.
24891C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24892C     LANGUAGE--ANSI FORTRAN.
24893C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND ALPHA: OTHER
24894C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
24895C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
24896C                 PUBLISHING COMPANY, CHAPTER 8.
24897C     WRITTEN BY--JAMES J. FILLIBEN
24898C                 STATISTICAL ENGINEERING DIVISION
24899C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24900C                 GAITHERSBURG, MD 20899-8980
24901C                 PHONE:  301-975-2855
24902C     ORIGINAL VERSION--SEPTEMBER   2007.
24903C
24904C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24905C
24906C-----COMMON----------------------------------------------------------
24907C
24908      INCLUDE 'DPCOP2.INC'
24909C
24910C---------------------------------------------------------------------
24911C
24912C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24913C
24914      IF(X.LT.0.0 .OR. X.GT.1.0)THEN
24915        WRITE(ICOUT,2)
24916        CALL DPWRST('XXX','BUG ')
24917        WRITE(ICOUT,46)X
24918        CALL DPWRST('XXX','BUG ')
24919        PDF=0.0
24920        GOTO9000
24921      ELSEIF(ALPHA.LT.0.0 .OR. ALPHA.GT.2.0)THEN
24922        WRITE(ICOUT,12)
24923        CALL DPWRST('XXX','BUG ')
24924        WRITE(ICOUT,46)ALPHA
24925        CALL DPWRST('XXX','BUG ')
24926        PDF=0.0
24927        GOTO9000
24928      ENDIF
24929    2 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO SLOPDF IS ',
24930     1       'OUTSIDE THE (0,1) INTERVAL.')
24931   12 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO SLOPDF IS ',
24932     1       'OUTSIDE THE (0,2) INTERVAL.')
24933   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
24934C
24935C-----START POINT-----------------------------------------------------
24936C
24937      PDF=ALPHA + 2.0*(1.0-ALPHA)*X
24938C
24939 9000 CONTINUE
24940      RETURN
24941      END
24942      SUBROUTINE SLOPPF(P,ALPHA,PPF)
24943C
24944C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
24945C              FUNCTION VALUE FOR THE SLOPE DISTRIBUTION.
24946C              THE PERCENT POINT FUNCTION IS:
24947C
24948C              F(P;ALPHA) = P                ALPHA = 1
24949C                         = {-ALPHA +
24950C                           SQRT(ALPHA**2 + 4*P*(1-ALPHA))}/
24951C                           (2*(1-ALPHA))    ALPHA <> 1
24952C                           0 <= P <= 1, 0 <= ALPHA <= 2
24953C
24954C              WITH ALPHA DENOTING THE SHAPE PARAMETER.
24955C
24956C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
24957C                                WHICH THE PERCENT POINT
24958C                                FUNCTION IS TO BE EVALUATED.
24959C                     --ALPHA   = THE SINGLE PRECISION SHAPE PARAMETER
24960C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT POINT
24961C                                FUNCTION VALUE.
24962C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
24963C             FUNCTION VALUE PPF.
24964C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24965C     RESTRICTIONS--P SHOULD BE BETWEEN 0 AND 1, INCLUSIVELY.
24966C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
24967C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
24968C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24969C     LANGUAGE--ANSI FORTRAN.
24970C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND ALPHA: OTHER
24971C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
24972C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
24973C                 PUBLISHING COMPANY, CHAPTER 8.
24974C     WRITTEN BY--JAMES J. FILLIBEN
24975C                 STATISTICAL ENGINEERING DIVISION
24976C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24977C                 GAITHERSBURG, MD 20899-8980
24978C                 PHONE:  301-975-2855
24979C     ORIGINAL VERSION--SEPTEMBER   2007.
24980C
24981C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24982C
24983C-----COMMON----------------------------------------------------------
24984C
24985      INCLUDE 'DPCOP2.INC'
24986C
24987C---------------------------------------------------------------------
24988C
24989C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24990C
24991      IF(P.LT.0.0 .OR. P.GT.1.0)THEN
24992        WRITE(ICOUT,2)
24993        CALL DPWRST('XXX','BUG ')
24994        WRITE(ICOUT,46)P
24995        CALL DPWRST('XXX','BUG ')
24996        PPF=0.0
24997        GOTO9000
24998      ELSEIF(ALPHA.LT.0.0 .OR. ALPHA.GT.2.0)THEN
24999        WRITE(ICOUT,12)
25000        CALL DPWRST('XXX','BUG ')
25001        WRITE(ICOUT,46)ALPHA
25002        CALL DPWRST('XXX','BUG ')
25003        PPF=0.0
25004        GOTO9000
25005      ENDIF
25006    2 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO SLOPPF IS ',
25007     1       'OUTSIDE THE (0,1) INTERVAL.')
25008   12 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO SLOPPF IS ',
25009     1       'OUTSIDE THE (0,2) INTERVAL.')
25010   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
25011C
25012C-----START POINT-----------------------------------------------------
25013C
25014      IF(ALPHA.EQ.1.0)THEN
25015        PPF=P
25016      ELSE
25017        TERM1=ALPHA**2 + 4.0*P*(1.0-ALPHA)
25018        TERM2=2.0*(1.0 - ALPHA)
25019        PPF=(-ALPHA + SQRT(TERM1))/TERM2
25020      ENDIF
25021C
25022 9000 CONTINUE
25023      RETURN
25024      END
25025      SUBROUTINE SLORAN(N,ALPHA,ISEED,X)
25026C
25027C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
25028C              FROM THE SLOPE DISTRIBUTION WITH
25029C              SHAPE PARAMETER ALPHA.
25030C
25031C              THE PROBABILITY DENSITY FUNCTION IS:
25032C
25033C                  f(X;ALPHA) = ALPHA + 2*(1-ALPHA)*X
25034C                              0 <= X <= 1, 0 <= ALPHA <= 2
25035C
25036C              WITH ALPHA DENOTING THE SHAPE PARAMETER.
25037C
25038C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
25039C                                OF RANDOM NUMBERS TO BE
25040C                                GENERATED.
25041C                     --ALPHA  = THE SINGLE PRECISION VALUE OF THE
25042C                                SHAPE PARAMETER ALPHA.
25043C                                ALPHA SHOULD BE IN THE RANGE (0,1).
25044C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
25045C                                (OF DIMENSION AT LEAST N)
25046C                                INTO WHICH THE GENERATED
25047C                                RANDOM SAMPLE WILL BE PLACED.
25048C     OUTPUT--A RANDOM SAMPLE OF SIZE N
25049C             FROM THE SLOPE DISTRIBUTION
25050C             WITH SHAPE PARAMETER ALPHA.
25051C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25052C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
25053C                   OF N FOR THIS SUBROUTINE.
25054C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, SLOPPF.
25055C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25056C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
25057C     LANGUAGE--ANSI FORTRAN (1977)
25058C     REFERENCES--KOTZ AND VAN DORP (2004), "BEYOND ALPHA: OTHER
25059C                 CONTINUOUS FAMILIES OF DISTRIBUTIONS WITH BOUNDED
25060C                 SUPPORT AND APPLICATIONS", WORLD SCIENTFIC
25061C                 PUBLISHING COMPANY, CHAPTER 8.
25062C     WRITTEN BY--JAMES J. FILLIBEN
25063C                 STATISTICAL ENGINEERING DIVISION
25064C                 INFORMATION TECHMOLOGY LABORATORY
25065C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25066C                 GAITHERSBURG, MD 20899-8980
25067C                 PHONE--301-975-2855
25068C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25069C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
25070C     LANGUAGE--ANSI FORTRAN (1977)
25071C     VERSION NUMBER--2007.9
25072C     ORIGINAL VERSION--SEPTEMBER 2007.
25073C
25074C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25075C
25076C---------------------------------------------------------------------
25077C
25078      DIMENSION X(*)
25079C
25080C-----COMMON----------------------------------------------------------
25081C
25082      INCLUDE 'DPCOP2.INC'
25083C
25084C-----START POINT-----------------------------------------------------
25085C
25086C     CHECK THE INPUT ARGUMENTS FOR ERRORS
25087C
25088      IF(N.LT.1)THEN
25089        WRITE(ICOUT, 5)
25090        CALL DPWRST('XXX','BUG ')
25091        WRITE(ICOUT,47)N
25092        CALL DPWRST('XXX','BUG ')
25093        GOTO9000
25094      ENDIF
25095    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
25096     1'SLOPE RANDOM NUMBERS IS NON-POSITIVE')
25097   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
25098C
25099      IF(ALPHA.LT.0.0 .OR. ALPHA.GT.2.0)THEN
25100        WRITE(ICOUT,201)
25101        CALL DPWRST('XXX','BUG ')
25102        WRITE(ICOUT,203)ALPHA
25103        CALL DPWRST('XXX','BUG ')
25104        PDF=0.0
25105        GOTO9000
25106      ENDIF
25107  201 FORMAT('***** ERROR--THE ALPHA SHAPE PARAMETER IS ',
25108     1       'OUTSIDE THE (0,2) INTERVAL.')
25109  203 FORMAT('      THE VALUE OF ALPHA IS ',G15.7)
25110C
25111C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
25112C
25113      CALL UNIRAN(N,ISEED,X)
25114C
25115C     GENERATE N SLOPE DISTRIBUTION RANDOM
25116C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
25117C
25118      DO300I=1,N
25119        CALL SLOPPF(X(I),ALPHA,XTEMP)
25120        X(I)=XTEMP
25121  300 CONTINUE
25122C
25123 9000 CONTINUE
25124      RETURN
25125      END
25126      function Sn(x,n,y,a2,scrtch)
25127C
25128cc#####################################################################
25129cc######################  file Sn.for :  ##############################
25130cc#####################################################################
25131cc
25132cc   This file contains a Fortran function for a new robust estimator
25133cc   of scale denoted as Sn, proposed in Rousseeuw and Croux (1993).
25134cc   The estimator has a high breakdown point and a bounded influence
25135cc   function. The algorithm given here is very fast (running in
25136cc   O(nlogn) time) and needs only O(n) storage space.
25137cc
25138cc   Rousseeuw, P.J. and Croux, C. (1993), "Alternatives to the
25139cc      Median Absolute Deviation," Journal of the American
25140cc      Statistical Association, Vol. 88, 1273-1283.
25141cc
25142cc   A Fortran function for the estimator Qn, described in the same
25143cc   paper, is attached below. For both estimators, implementations
25144cc   in the Pascal language can be obtained from the authors.
25145cc
25146cc   This software may be used and copied freely, provided
25147cc   reference is made to the abovementioned paper.
25148cc
25149cc   For questions, problems or comments contact:
25150cc
25151cc              Peter Rousseeuw (rousse@wins.uia.ac.be)
25152cc              Christophe Croux (croux@wins.uia.ac.be)
25153cc              Department of Mathematics and Computing
25154cc              Universitaire Instelling Antwerpen
25155cc              Universiteitsplein 1
25156cc              B-2610 Wilrijk (Antwerp)
25157cc              Belgium
25158cc
25159cc--------------------------------------------------------------------
25160cc
25161cc   Efficient algorithm for the scale estimator:
25162cc
25163cc       Sn = cn * 1.1926 * LOMED_{i} HIMED_{i} |x_i-x_j|
25164cc
25165cc   which can equivalently be written as
25166cc
25167cc       Sn = cn * 1.1926 * LOMED_{i} LOMED_{j<>i} |x_i-x_j|
25168cc
25169cc   Parameters of the function Sn :
25170cc       x  : real array containing the observations
25171cc       n  : number of observations (n>=2)
25172cc
25173cc   The function Sn uses the procedures:
25174cc       sort(x,n,y) : sorts an array x of length n, and stores the
25175cc                     result in an array y (of size at least n)
25176cc       pull(a,n,k) : finds the k-th order statistic of an
25177cc                     array a of length n
25178cc
25179cc   The function Sn also creates an auxiliary array a2
25180cc       (of size at least n) in which it stores the values
25181cc       LOMED_{j<>i} |x_i-x_j|   for i=1,...,n
25182cc
25183ccccc dimension x(n),y(1000),a2(1000)
25184      dimension x(*),y(*),a2(*),scrtch(*)
25185      integer rightA,rightB,tryA,tryB,diff,Amin,Amax,even,half
25186      real medA, medB
25187      call sort(x,n,y)
25188      a2(1)=y(n/2+1)-y(1)
25189      do 10 i=2,(n+1)/2
25190          nA=i-1
25191          nB=n-i
25192          diff=nB-nA
25193          leftA=1
25194          leftB=1
25195          rightA=nB
25196          rightB=nB
25197          Amin=diff/2+1
25198          Amax=diff/2+nA
2519915        continue
25200          if (leftA.lt.rightA) then
25201              length=rightA-leftA+1
25202              even=1-mod(length,2)
25203              half=(length-1)/2
25204              tryA=leftA+half
25205              tryB=leftB+half
25206              if (tryA.lt.Amin) then
25207                  rightB=tryB
25208                  leftA=tryA+even
25209              else
25210                  if (tryA.gt.Amax) then
25211                      rightA=tryA
25212                      leftB=tryB+even
25213                  else
25214                      medA=y(i)-y(i-tryA+Amin-1)
25215                      medB=y(tryB+i)-y(i)
25216                      if (medA.ge.medB) then
25217                          rightA=tryA
25218                          leftB=tryB+even
25219                      else
25220                          rightB=tryB
25221                          leftA=tryA+even
25222                      endif
25223                  endif
25224              endif
25225          go to 15
25226          endif
25227          if (leftA.gt.Amax) then
25228              a2(i)=y(leftB+i)-y(i)
25229          else
25230              medA=y(i)-y(i-leftA+Amin-1)
25231              medB=y(leftB+i)-y(i)
25232              a2(i)=min(medA,medB)
25233          endif
2523410    continue
25235      do 20 i=(n+1)/2+1,n-1
25236          nA=n-i
25237          nB=i-1
25238          diff=nB-nA
25239          leftA=1
25240          leftB=1
25241          rightA=nB
25242          rightB=nB
25243          Amin=diff/2+1
25244          Amax=diff/2+nA
2524525        continue
25246          if (leftA.lt.rightA) then
25247              length=rightA-leftA+1
25248              even=1-mod(length,2)
25249              half=(length-1)/2
25250              tryA=leftA+half
25251              tryB=leftB+half
25252              if (tryA.lt.Amin) then
25253                  rightB=tryB
25254                  leftA=tryA+even
25255              else
25256                  if (tryA.gt.Amax) then
25257                      rightA=tryA
25258                      leftB=tryB+even
25259                  else
25260                      medA=y(i+tryA-Amin+1)-y(i)
25261                      medB=y(i)-y(i-tryB)
25262                      if (medA.ge.medB) then
25263                          rightA=tryA
25264                          leftB=tryB+even
25265                      else
25266                          rightB=tryB
25267                          leftA=tryA+even
25268                      endif
25269                  endif
25270              endif
25271          go to 25
25272          endif
25273          if (leftA.gt.Amax) then
25274              a2(i)=y(i)-y(i-leftB)
25275          else
25276              medA=y(i+leftA-Amin+1)-y(i)
25277              medB=y(i)-y(i-leftB)
25278              a2(i)=min(medA,medB)
25279          endif
2528020    continue
25281      a2(n)=y(n)-y((n+1)/2)
25282      cn=1
25283      if (n.le.9) then
25284          if (n.eq.2) cn=0.743
25285          if (n.eq.3) cn=1.851
25286          if (n.eq.4) cn=0.954
25287          if (n.eq.5) cn=1.351
25288          if (n.eq.6) cn=0.993
25289          if (n.eq.7) cn=1.198
25290          if (n.eq.8) cn=1.005
25291          if (n.eq.9) cn=1.131
25292      else
25293          if (mod(n,2).eq.1) cn=n/(n-0.9)
25294      endif
25295      Sn=cn*1.1926*pull(a2,n,(n+1)/2,scrtch)
25296      return
25297      end
25298      SUBROUTINE SNCDF(X,ALMBDA,ISKNDF,CDF)
25299C
25300C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
25301C              FUNCTION VALUE FOR THE SKEW-NORMAL DISTRIBUTION
25302C              WITH SHAPE PARAMETER = LAMBDA.
25303C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND
25304C              THE CUMULATIVE DISTRIBUTION IS COMPUTED BY
25305C              NUMERICALLY INTEGRATING THE PDF FUNCTION.
25306C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
25307C                                WHICH THE CUMULATIVE DISTRIBUTION
25308C                                FUNCTION IS TO BE EVALUATED.
25309C                     --ALMBDA = THE SHAPE PARAMETER
25310C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PROBABILITY
25311C                                DENSITY FUNCTION VALUE.
25312C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
25313C             FUNCTION VALUE CDF FOR THE SKEWED-NORMAL DISTRIBUTION
25314C             WITH SHAPE PARAMETER = LAMBDA.
25315C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25316C     RESTRICTIONS--NONE.
25317C     OTHER DATAPAC   SUBROUTINES NEEDED--DQAGI.
25318C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25319C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25320C     LANGUAGE--ANSI FORTRAN (1977)
25321C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25322C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25323C                 JOHN WILEY, 1994, PAGE 454.
25324C               --"Log-Skew-Normal and Log-Skew-t Distributions as
25325C                 Models for Family Income Data", Azzalini, Cappello,
25326C                 and Kotz, paper downloaded from Azzalini's web
25327C                 site.
25328C     WRITTEN BY--JAMES J. FILLIBEN
25329C                 STATISTICAL ENGINEERING DIVISION
25330C                 INFORMATION TECHNOLOGY LABORATORY
25331C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25332C                 GAITHERSBURG, MD 20899-8980
25333C                 PHONE--301-975-2855
25334C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25335C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25336C     LANGUAGE--ANSI FORTRAN (1977)
25337C     VERSION NUMBER--2003.11
25338C     ORIGINAL VERSION--NOVEMBER  2003.
25339C     UPDATED         --JULY      2005. SUPPORT FOR RE-PARAMETERIZED
25340C                                       DEFINITION THAT IS USEFUL FOR
25341C                                       FITTING
25342C
25343C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25344C
25345C---------------------------------------------------------------------
25346C
25347      CHARACTER*4 ISKNDF
25348C
25349      INTEGER LIMIT
25350      INTEGER LENW
25351      PARAMETER(LIMIT=100)
25352      PARAMETER(LENW=4*LIMIT)
25353      INTEGER INF
25354      INTEGER NEVAL
25355      INTEGER IER
25356      INTEGER LAST
25357      INTEGER IWORK(LIMIT)
25358      REAL X
25359      REAL CDF
25360      DOUBLE PRECISION EPSABS
25361      DOUBLE PRECISION EPSREL
25362      DOUBLE PRECISION DCDF
25363      DOUBLE PRECISION DX
25364      DOUBLE PRECISION ABSERR
25365      DOUBLE PRECISION WORK(LENW)
25366C
25367      DOUBLE PRECISION SNFUN
25368      EXTERNAL SNFUN
25369C
25370      DOUBLE PRECISION DLMBDA
25371      COMMON/SNCOM/DLMBDA
25372C
25373C-----COMMON----------------------------------------------------------
25374C
25375      INCLUDE 'DPCOP2.INC'
25376C
25377C-----START POINT-----------------------------------------------------
25378C
25379C               ************************************
25380C               **  STEP 1--                      **
25381C               **  COMPUTE THE DENSITY FUNCTION  **
25382C               ************************************
25383C
25384      IF(ISKNDF.EQ.'DEFA')THEN
25385        INF=-1
25386        EPSABS=0.0D0
25387        EPSREL=1.0D-7
25388        IER=0
25389        CDF=0.0D0
25390C
25391        DX=DBLE(X)
25392        DLMBDA=DBLE(ALMBDA)
25393C
25394        CALL DQAGI(SNFUN,DX,INF,EPSABS,EPSREL,DCDF,ABSERR,NEVAL,
25395     1             IER,LIMIT,LENW,LAST,IWORK,WORK)
25396C
25397        CDF=REAL(DCDF)
25398C
25399        IF(IER.EQ.1)THEN
25400          WRITE(ICOUT,999)
25401  999     FORMAT(1X)
25402          CALL DPWRST('XXX','BUG ')
25403          WRITE(ICOUT,111)
25404  111     FORMAT('***** ERROR FROM SNCDF--')
25405          CALL DPWRST('XXX','BUG ')
25406          WRITE(ICOUT,113)
25407  113     FORMAT('      MAXIMUM NUMBER OF SUBDIVISIONS EXCEEDED.')
25408          CALL DPWRST('XXX','BUG ')
25409        ELSEIF(IER.EQ.2)THEN
25410          WRITE(ICOUT,999)
25411          CALL DPWRST('XXX','BUG ')
25412          WRITE(ICOUT,121)
25413  121     FORMAT('***** ERROR FROM SNCDF--')
25414          CALL DPWRST('XXX','BUG ')
25415          WRITE(ICOUT,123)
25416  123     FORMAT('      ROUNDOFF ERROR PREVENTS REQUESTED TOLERANCE ',
25417     1           'FROM BEING ACHIEVED.')
25418          CALL DPWRST('XXX','BUG ')
25419        ELSEIF(IER.EQ.3)THEN
25420          WRITE(ICOUT,999)
25421          CALL DPWRST('XXX','BUG ')
25422          WRITE(ICOUT,131)
25423  131     FORMAT('***** ERROR FROM SNCDF--')
25424          CALL DPWRST('XXX','BUG ')
25425          WRITE(ICOUT,133)
25426  133     FORMAT('      BAD INTEGRAND BEHAVIOUR DETECTED.')
25427          CALL DPWRST('XXX','BUG ')
25428        ELSEIF(IER.EQ.4)THEN
25429          WRITE(ICOUT,999)
25430          CALL DPWRST('XXX','BUG ')
25431          WRITE(ICOUT,141)
25432  141     FORMAT('***** ERROR FROM SNCDF--')
25433          CALL DPWRST('XXX','BUG ')
25434          WRITE(ICOUT,143)
25435  143     FORMAT('      INTEGRATION DID NOT CONVERGE.')
25436          CALL DPWRST('XXX','BUG ')
25437        ELSEIF(IER.EQ.5)THEN
25438          WRITE(ICOUT,999)
25439          CALL DPWRST('XXX','BUG ')
25440          WRITE(ICOUT,151)
25441  151     FORMAT('***** ERROR FROM SNCDF--')
25442          CALL DPWRST('XXX','BUG ')
25443          WRITE(ICOUT,153)
25444  153     FORMAT('      THE INTEGRATION IS PROBABLY DIVERGENT.')
25445          CALL DPWRST('XXX','BUG ')
25446        ELSEIF(IER.EQ.6)THEN
25447          WRITE(ICOUT,999)
25448          CALL DPWRST('XXX','BUG ')
25449          WRITE(ICOUT,161)
25450  161     FORMAT('***** ERROR FROM SNCDF--')
25451          CALL DPWRST('XXX','BUG ')
25452          WRITE(ICOUT,163)
25453  163     FORMAT('      INVALID INPUT TO THE INTEGRATION ROUTINE.')
25454          CALL DPWRST('XXX','BUG ')
25455        ENDIF
25456C
25457      ENDIF
25458C
25459      RETURN
25460      END
25461      DOUBLE PRECISION FUNCTION SNFUN(DX)
25462C
25463C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
25464C              FUNCTION VALUE FOR THE SKEW-NORMAL DISTRIBUTION
25465C              WITH SHAPE PARAMETER = LAMBDA.
25466C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
25467C              THE PROBABILITY DENSITY FUNCTION.  IDENTICAL TO SLAPDF,
25468C              BUT DEFINE AS FUNCTION TO BE USED FOR INTEGRATION
25469C              CODE CALLED BY SLACDF.  ALSO, THIS ROUTINE USES
25470C              DOUBLE PRECISION ARITHMETIC.
25471C                 SNPDF(X,LAMBDA) = 2*NORCDF(LAMDDA*X)*NORPDF(X)
25472C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
25473C                                WHICH THE PROBABILITY DENSITY
25474C                                FUNCTION IS TO BE EVALUATED.
25475C     OUTPUT ARGUMENTS--SNFUN  = THE DOUBLE PRECISION PROBABILITY
25476C                                DENSITY FUNCTION VALUE.
25477C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
25478C             FUNCTION VALUE PDF FOR THE SKEWED-NORMAL DISTRIBUTION
25479C             WITH SHAPE PARAMETER = LAMBDA.
25480C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25481C     RESTRICTIONS--NONE.
25482C     OTHER DATAPAC   SUBROUTINES NEEDED--NODPDF, NODCDF..
25483C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25484C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25485C     LANGUAGE--ANSI FORTRAN (1977)
25486C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25487C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25488C                 JOHN WILEY, 1994, PAGE 454.
25489C               --AZZALINI HAS AUTHORED A NUMBER OF PAPERS ON THIS
25490C                 DISTRIBUTION.
25491C     WRITTEN BY--JAMES J. FILLIBEN
25492C                 STATISTICAL ENGINEERING DIVISION
25493C                 INFORMATION TECHNOLOGY LABORATORY
25494C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25495C                 GAITHERSBURG, MD 20899-8980
25496C                 PHONE--301-975-2855
25497C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25498C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25499C     LANGUAGE--ANSI FORTRAN (1977)
25500C     VERSION NUMBER--2003.12
25501C     ORIGINAL VERSION--DECEMBER  2003.
25502C
25503C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25504C
25505C---------------------------------------------------------------------
25506C
25507      DOUBLE PRECISION DX
25508      DOUBLE PRECISION DTERM1
25509      DOUBLE PRECISION DTERM2
25510      DOUBLE PRECISION DPDF
25511C
25512      DOUBLE PRECISION DLMBDA
25513      COMMON/SNCOM/DLMBDA
25514C
25515C-----COMMON----------------------------------------------------------
25516C
25517      INCLUDE 'DPCOP2.INC'
25518C
25519C-----START POINT-----------------------------------------------------
25520C
25521C               ************************************
25522C               **  STEP 1--                      **
25523C               **  COMPUTE THE DENSITY FUNCTION  **
25524C               ************************************
25525C
25526      CALL NODCDF(DX*DLMBDA,DTERM1)
25527      CALL NODPDF(DX,DTERM2)
25528      DPDF=2.0D0*DTERM1*DTERM2
25529      SNFUN=DPDF
25530C
25531      RETURN
25532      END
25533      REAL FUNCTION SNFU2(X)
25534C
25535C     PURPOSE--SNPPF CALLS FZERO TO FIND A ROOT FOR THE PERCENT
25536C              POINT FUNCTION.  SNFU2 IS THE FUNCTION FOR WHICH
25537C              THE ZERO IS FOUND.  IT IS:
25538C                 P - SNCDF(X,LAMBDA)
25539C              WHERE P IS THE DESIRED PERCENT POINT.
25540C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
25541C                                WHICH THE CUMULATIVE DISTRIBUTION
25542C                                FUNCTION IS TO BE EVALUATED.
25543C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
25544C             FUNCTION VALUE SNFU2.
25545C     PRINTING--NONE.
25546C     RESTRICTIONS--NONE.
25547C     OTHER DATAPAC   SUBROUTINES NEEDED--SNCDF.
25548C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25549C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
25550C     LANGUAGE--ANSI FORTRAN (1977)
25551C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25552C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25553C                 JOHN WILEY, 1994, PAGE 454.
25554C               --AZZALINI HAS AUTHORED A NUMBER OF PAPERS ON THIS
25555C                 DISTRIBUTION.
25556C     WRITTEN BY--JAMES J. FILLIBEN
25557C                 STATISTICAL ENGINEERING DIVISION
25558C                 INFORMATION TECHNOLOGY LABORATORY
25559C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
25560C                 GAITHERSBURG, MD 20899-8980
25561C                 PHONE--301-975-2855
25562C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25563C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25564C     LANGUAGE--ANSI FORTRAN (1977)
25565C     VERSION NUMBER--2003.12
25566C     ORIGINAL VERSION--DECEMBER  2003.
25567C
25568C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25569C
25570C---------------------------------------------------------------------
25571C
25572      REAL P
25573      CHARACTER*4 ISKNDF
25574      COMMON/SN2COM/P,ISKNDF
25575C
25576      DOUBLE PRECISION DLMBDA
25577      COMMON/SNCOM/DLMBDA
25578C
25579      INCLUDE 'DPCOP2.INC'
25580C
25581C-----START POINT-----------------------------------------------------
25582C
25583      CALL SNCDF(X,REAL(DLMBDA),ISKNDF,CDF)
25584      SNFU2=P - CDF
25585C
25586      RETURN
25587      END
25588      SUBROUTINE SNPDF(X,ALMBDA,ISKNDF,PDF)
25589C
25590C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
25591C              FUNCTION VALUE FOR THE SKEW-NORMAL DISTRIBUTION
25592C              WITH SHAPE PARAMETER = LAMBDA.
25593C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
25594C              THE PROBABILITY DENSITY FUNCTION
25595C                 SNPDF(X,LAMBDA) = 2*NORCDF(LAMDDA*X)*NORPDF(X)
25596C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
25597C                                WHICH THE PROBABILITY DENSITY
25598C                                FUNCTION IS TO BE EVALUATED.
25599C                                X SHOULD BE NON-NEGATIVE.
25600C                     --ALMBDA = THE SHAPE PARAMETER
25601C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
25602C                                DENSITY FUNCTION VALUE.
25603C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
25604C             FUNCTION VALUE PDF FOR THE SKEWED-NORMAL DISTRIBUTION
25605C             WITH SHAPE PARAMETER = LAMBDA.
25606C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25607C     RESTRICTIONS--NONE.
25608C     OTHER DATAPAC   SUBROUTINES NEEDED--NODPDF, NODCDF..
25609C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25610C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25611C     LANGUAGE--ANSI FORTRAN (1977)
25612C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25613C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25614C                 JOHN WILEY, 1994, PAGE 454.
25615C               --"Log-Skew-Normal and Log-Skew-t Distributions as
25616C                 Models for Family Income Data", Azzalini, Cappello,
25617C                 and Kotz, paper downloaded from Azzalini's web
25618C                 site.
25619C     WRITTEN BY--JAMES J. FILLIBEN
25620C                 STATISTICAL ENGINEERING DIVISION
25621C                 INFORMATION TECHNOLOGY LABORATORY
25622C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25623C                 GAITHERSBURG, MD 20899-8980
25624C                 PHONE--301-975-2855
25625C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25626C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25627C     LANGUAGE--ANSI FORTRAN (1977)
25628C     VERSION NUMBER--2003.11
25629C     ORIGINAL VERSION--NOVEMBER  2003.
25630C     UPDATED         --JULY      2005. SUPPORT FOR RE-PARAMETERIZED
25631C                                       DEFINITION THAT IS USEFUL FOR
25632C                                       FITTING
25633C
25634C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25635C
25636C---------------------------------------------------------------------
25637C
25638      CHARACTER*4 ISKNDF
25639C
25640      DOUBLE PRECISION DX,DLMBDA
25641      DOUBLE PRECISION DTERM1
25642      DOUBLE PRECISION DTERM2
25643      DOUBLE PRECISION DPDF
25644C
25645C-----COMMON----------------------------------------------------------
25646C
25647      INCLUDE 'DPCOP2.INC'
25648C
25649C-----START POINT-----------------------------------------------------
25650C
25651C               ************************************
25652C               **  STEP 1--                      **
25653C               **  COMPUTE THE DENSITY FUNCTION  **
25654C               ************************************
25655C
25656      DX=DBLE(X)
25657      DLMBDA=DBLE(ALMBDA)
25658      IF(ISKNDF.EQ.'DEFA')THEN
25659        CALL NODCDF(DX*DLMBDA,DTERM1)
25660        CALL NODPDF(DX,DTERM2)
25661        DPDF=2.0D0*DTERM1*DTERM2
25662        PDF=REAL(DPDF)
25663        GOTO9000
25664      ELSE
25665      ENDIF
25666C
25667 9000 CONTINUE
25668      RETURN
25669      END
25670      SUBROUTINE SNPPF(P,ALMBDA,ISKNDF,PPF)
25671C
25672C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
25673C              FUNCTION VALUE FOR THE SKEW-NORMAL DISTRIBUTION
25674C              WITH SHAPE PARAMETER = LAMBDA.
25675C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND THE
25676C              PERCENT POINT FUNCTION IS COMPUTED BY
25677C              NUMERICALLY INVERTING THE CDF FUNCTION.
25678C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
25679C                                WHICH THE PERCENT POINT
25680C                                FUNCTION IS TO BE EVALUATED.
25681C                     --ALMBDA = THE SHAPE PARAMETER
25682C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION CUMULATIVE
25683C                                DISTRIBUTION FUNCTION VALUE.
25684C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
25685C             FUNCTION VALUE PPF.
25686C     PRINTING--NONE.
25687C     RESTRICTIONS--NONE.
25688C     OTHER DATAPAC   SUBROUTINES NEEDED--FZERO.
25689C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25690C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25691C     LANGUAGE--ANSI FORTRAN (1977)
25692C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25693C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25694C                 JOHN WILEY, 1994, PAGE 454.
25695C               --"Log-Skew-Normal and Log-Skew-t Distributions as
25696C                 Models for Family Income Data", Azzalini, Cappello,
25697C                 and Kotz, paper downloaded from Azzalini's web
25698C                 site.
25699C     WRITTEN BY--JAMES J. FILLIBEN
25700C                 STATISTICAL ENGINEERING DIVISION
25701C                 INFORMATION TECHNOLOGY LABORATORY
25702C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
25703C                 GAITHERSBURG, MD 20899-8980
25704C                 PHONE--301-975-2855
25705C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25706C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25707C     LANGUAGE--ANSI FORTRAN (1977)
25708C     VERSION NUMBER--2003.12
25709C     ORIGINAL VERSION--DECEMBER  2003.
25710C     UPDATED         --JULY      2005. SUPPORT FOR RE-PARAMETERIZED
25711C                                       DEFINITION THAT IS USEFUL FOR
25712C                                       FITTING
25713C
25714C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25715C
25716C---------------------------------------------------------------------
25717C
25718      CHARACTER*4 ISKNDF
25719C
25720      REAL PPF
25721C
25722      REAL SNFU2
25723      EXTERNAL SNFU2
25724C
25725      REAL P2
25726      CHARACTER*4 ISNDF2
25727      COMMON/SN2COM/P2,ISNDF2
25728C
25729      DOUBLE PRECISION DLMBDA
25730      COMMON/SNCOM/DLMBDA
25731C
25732      INCLUDE 'DPCOP2.INC'
25733C
25734C-----START POINT-----------------------------------------------------
25735C
25736C
25737      IF(P.LE.0.0.OR.P.GE.1.0)THEN
25738         WRITE(ICOUT,61)
25739   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
25740     1          'TO THE SNPPF SUBROUTINE ')
25741         CALL DPWRST('XXX','BUG ')
25742         WRITE(ICOUT,62)
25743   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL ***')
25744         CALL DPWRST('XXX','BUG ')
25745         WRITE(ICOUT,63)P
25746   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
25747         CALL DPWRST('XXX','BUG ')
25748         PPF=0.0
25749         GOTO9000
25750      ENDIF
25751C
25752C  STEP 1: FIND BRACKETING INTERVAL.  START WITH FACT THAT LAMBDA = 0
25753C          IS THE NORMAL DISTRIBUTION AND THE HALF-NORMAL IS THE
25754C          LIMITING DISTRIBUTION AS LAMBDA GOES TO INFINITY.
25755C
25756      IF(ALMBDA.EQ.0.0)THEN
25757        CALL NORPPF(P,PPF)
25758        GOTO9000
25759      ELSE
25760        IFLAG2=0
25761        IF(ALMBDA.LT.0.0)IFLAG2=1
25762        P2=P
25763        IF(IFLAG2.EQ.1)P2=1.0 - P
25764        CALL NORPPF(P2,XLOW)
25765        CALL HFNPPF(P2,XUP)
25766      ENDIF
25767      XLOW=XLOW - 0.2
25768      XUP=XUP + 0.2
25769C
25770      ISNDF2=ISKNDF
25771      AE=1.E-6
25772      RE=1.E-6
25773      DLMBDA=DBLE(ALMBDA)
25774      IF(IFLAG2.EQ.1)DLMBDA=-DLMBDA
25775      IFLAG=0
25776      CALL FZERO(SNFU2,XLOW,XUP,XUP,RE,AE,IFLAG)
25777C
25778      PPF=XLOW
25779      IF(IFLAG2.EQ.1)PPF=-PPF
25780C
25781      IF(IFLAG.EQ.2)THEN
25782C
25783C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
25784CCCCC   WRITE(ICOUT,999)
25785  999   FORMAT(1X)
25786CCCCC   CALL DPWRST('XXX','BUG ')
25787CCCCC   WRITE(ICOUT,111)
25788CC111   FORMAT('***** WARNING FROM SNPPF--')
25789CCCCC   CALL DPWRST('XXX','BUG ')
25790CCCCC   WRITE(ICOUT,113)
25791CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
25792CCCCC1         'TOLERANCE.')
25793CCCCC   CALL DPWRST('XXX','BUG ')
25794      ELSEIF(IFLAG.EQ.3)THEN
25795        WRITE(ICOUT,999)
25796        CALL DPWRST('XXX','BUG ')
25797        WRITE(ICOUT,121)
25798  121   FORMAT('***** WARNING FROM SNPPF--')
25799        CALL DPWRST('XXX','BUG ')
25800        WRITE(ICOUT,123)
25801  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
25802        CALL DPWRST('XXX','BUG ')
25803      ELSEIF(IFLAG.EQ.4)THEN
25804        WRITE(ICOUT,999)
25805        CALL DPWRST('XXX','BUG ')
25806        WRITE(ICOUT,131)
25807  131   FORMAT('***** ERROR FROM SNPPF--')
25808        CALL DPWRST('XXX','BUG ')
25809        WRITE(ICOUT,133)
25810  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
25811        CALL DPWRST('XXX','BUG ')
25812      ELSEIF(IFLAG.EQ.5)THEN
25813        WRITE(ICOUT,999)
25814        CALL DPWRST('XXX','BUG ')
25815        WRITE(ICOUT,141)
25816  141   FORMAT('***** WARNING FROM SNPPF--')
25817        CALL DPWRST('XXX','BUG ')
25818        WRITE(ICOUT,143)
25819  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
25820        CALL DPWRST('XXX','BUG ')
25821      ENDIF
25822C
25823 9000 CONTINUE
25824      RETURN
25825      END
25826      SUBROUTINE SNRAN(N,ALMBDA,ISKNDF,ISEED,X)
25827C
25828C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
25829C              FROM THE SKEWED NORMAL DISTRIBUTION
25830C              WITH SHAPE PARAMETER = ALMBDA.
25831C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
25832C              THE PROBABILITY DENSITY FUNCTION
25833C                 SNPDF(X,LAMBDA) = 2*NORCDF(LAMDDA*X)*NORPDF(X)
25834C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
25835C                                OF RANDOM NUMBERS TO BE
25836C                                GENERATED.
25837C                     --ALMBDA = THE SHAPE (PARAMETER) FOR THE
25838C                                SKEWED NORMAL DISTRIBUTION.
25839C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
25840C                                (OF DIMENSION AT LEAST N)
25841C                                INTO WHICH THE GENERATED
25842C                                RANDOM SAMPLE WILL BE PLACED.
25843C     OUTPUT--A RANDOM SAMPLE OF SIZE N
25844C             FROM THE SKEWED NORMAL DISTRIBUTION
25845C             WITH SHAPE PARAMETER = ALMBDA.
25846C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25847C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
25848C                   OF N FOR THIS SUBROUTINE.
25849C                 --ALMBDA CAN BE ANY REAL NUMBER.
25850C     OTHER DATAPAC   SUBROUTINES NEEDED--NORRAN.
25851C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25852C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
25853C     LANGUAGE--ANSI FORTRAN (1977)
25854C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25855C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25856C                 JOHN WILEY, 1994, PAGE 454.
25857C               --"Log-Skew-Normal and Log-Skew-t Distributions as
25858C                 Models for Family Income Data", Azzalini, Cappello,
25859C                 and Kotz, paper downloaded from Azzalini's web
25860C                 site.
25861C               --ALGORITHM FOR RANDOM NUMBERS ADAPTED FROM
25862C                 AZZALINI'S R FUNCTIONS FOR SKEW NORMAL.
25863C     WRITTEN BY--JAMES J. FILLIBEN
25864C                 STATISTICAL ENGINEERING DIVISION
25865C                 INFORMATION TECHNOLOGY LABORATORY
25866C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
25867C                 GAITHERSBURG, MD 20899-8980
25868C                 PHONE--301-975-2855
25869C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25870C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25871C     LANGUAGE--ANSI FORTRAN (1977)
25872C     VERSION NUMBER--2003.11
25873C     ORIGINAL VERSION--NOVEMBER  2003.
25874C     UPDATED         --JULY      2005. SUPPORT FOR RE-PARAMETERIZED
25875C                                       DEFINITION THAT IS USEFUL FOR
25876C                                       FITTING
25877C
25878C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25879C
25880C---------------------------------------------------------------------
25881C
25882      DIMENSION X(*)
25883      DIMENSION Y(2)
25884C
25885      CHARACTER*4 ISKNDF
25886C
25887C-----COMMON----------------------------------------------------------
25888C
25889      INCLUDE 'DPCOP2.INC'
25890C
25891C-----START POINT-----------------------------------------------------
25892C
25893C     CHECK THE INPUT ARGUMENTS FOR ERRORS
25894C
25895      IF(N.LT.1)THEN
25896        WRITE(ICOUT,5)
25897        CALL DPWRST('XXX','BUG ')
25898        WRITE(ICOUT,6)
25899        CALL DPWRST('XXX','BUG ')
25900        WRITE(ICOUT,47)N
25901        CALL DPWRST('XXX','BUG ')
25902        GOTO9999
25903      ENDIF
25904    5 FORMAT('***** FATAL ERROR--FOR THE SKEWED NORMAL DISTRIBUTION,')
25905    6 FORMAT('       THE REQUESTED NUMBER OF RANDOM NUMBERS WAS ',
25906     1      'NON-POSITIVE.')
25907   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
25908C
25909C     ALGORITHM ADAPTED FROM AZZALINI'S R FUNCTION LIBRARY.
25910C
25911      IF(ISKNDF.EQ.'DEFA')THEN
25912        DO100I=1,N
25913          CALL NORRAN(2,ISEED,Y)
25914          U1=Y(1)
25915          U2=Y(2)
25916          ATEMP=ALMBDA*U1
25917          IF(U2.GT.ATEMP)U1=-U1
25918          X(I)=U1
25919  100   CONTINUE
25920      ELSE
25921      ENDIF
25922C
25923 9999 CONTINUE
25924      RETURN
25925      END
25926      SUBROUTINE STCDF(X,NU,ALMBDA,CDF)
25927C
25928C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
25929C              FUNCTION VALUE FOR THE SKEW-T DISTRIBUTION
25930C              WITH SHAPE PARAMETERS NU AND LAMBDA.
25931C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
25932C              THE PROBABILITY DENSITY FUNCTION
25933C                 STPDF(X,NU,LAMBDA) = 2*
25934C                       TCDF(LAMBDA*X*SQRT((NU+1)/(X**2+NU)),NU+1)*
25935C                       TPDF(X,NU)
25936C              THE CUMULATIVE DISTRIBUTION IS COMPUTED BY
25937C              NUMERICALLY INTEGRATING THE PDF FUNCTION.
25938C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
25939C                                WHICH THE CUMULATIVE DISTRIBUTION
25940C                                FUNCTION IS TO BE EVALUATED.
25941C                     --NU     = THE DEGREES OF FREEDOM PARAMETER
25942C                     --ALMBDA = THE SKEWNESS PARAMETER
25943C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PROBABILITY
25944C                                DENSITY FUNCTION VALUE.
25945C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
25946C             FUNCTION VALUE CDF FOR THE SKEW-T DISTRIBUTION
25947C             WITH SHAPE PARAMETERS NU AND LAMBDA.
25948C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25949C     RESTRICTIONS--NONE.
25950C     OTHER DATAPAC   SUBROUTINES NEEDED--DQAGI.
25951C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25952C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25953C     LANGUAGE--ANSI FORTRAN (1977)
25954C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
25955C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
25956C                 JOHN WILEY, 1994, PAGE 454.
25957C               --"Log-Skew-Normal and Log-Skew-t Distributions as
25958C                 Models for Family Income Data", Azzalini, Cappello,
25959C                 and Kotz, paper downloaded from Azzalini's web
25960C                 site.
25961C     WRITTEN BY--JAMES J. FILLIBEN
25962C                 STATISTICAL ENGINEERING DIVISION
25963C                 INFORMATION TECHNOLOGY LABORATORY
25964C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25965C                 GAITHERSBURG, MD 20899-8980
25966C                 PHONE--301-975-2855
25967C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25968C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
25969C     LANGUAGE--ANSI FORTRAN (1977)
25970C     VERSION NUMBER--2003.12
25971C     ORIGINAL VERSION--DECEMBER  2003.
25972C
25973C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25974C
25975C---------------------------------------------------------------------
25976C
25977      INTEGER LIMIT
25978      INTEGER LENW
25979      PARAMETER(LIMIT=100)
25980      PARAMETER(LENW=4*LIMIT)
25981      INTEGER INF
25982      INTEGER NEVAL
25983      INTEGER IER
25984      INTEGER LAST
25985      INTEGER IWORK(LIMIT)
25986      INTEGER NU
25987      REAL X
25988      REAL CDF
25989      DOUBLE PRECISION EPSABS
25990      DOUBLE PRECISION EPSREL
25991      DOUBLE PRECISION DCDF
25992      DOUBLE PRECISION DX
25993      DOUBLE PRECISION ABSERR
25994      DOUBLE PRECISION WORK(LENW)
25995C
25996      DOUBLE PRECISION STFUN
25997      EXTERNAL STFUN
25998C
25999      DOUBLE PRECISION DNU
26000      DOUBLE PRECISION DLMBDA
26001      COMMON/STCOM/DNU,DLMBDA
26002C
26003C-----COMMON----------------------------------------------------------
26004C
26005      INCLUDE 'DPCOP2.INC'
26006C
26007C-----START POINT-----------------------------------------------------
26008C
26009C               ********************************************
26010C               **  STEP 1--                              **
26011C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
26012C               ********************************************
26013C
26014      IF(NU.LE.0)THEN
26015        WRITE(ICOUT,115)
26016  115   FORMAT('***** ERROR--THE DEGREES OF FREEDOM SHAPE ',
26017     1        'PARAMETER FOR THE')
26018        CALL DPWRST('XXX','BUG ')
26019        WRITE(ICOUT,116)
26020  116   FORMAT('     SKEWED-T DISTRIBUTION IS NON-POSITIVE.')
26021        CALL DPWRST('XXX','BUG ')
26022        WRITE(ICOUT,147)NU
26023  147   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
26024        CALL DPWRST('XXX','BUG ')
26025        CDF=0.0
26026        GOTO9000
26027      ENDIF
26028C
26029C               ************************************
26030C               **  STEP 1--                      **
26031C               **  COMPUTE THE DENSITY FUNCTION  **
26032C               ************************************
26033C
26034      INF=-1
26035      EPSABS=0.0D0
26036      EPSREL=1.0D-7
26037      IER=0
26038      CDF=0.0D0
26039C
26040      DX=DBLE(X)
26041      DLMBDA=DBLE(ALMBDA)
26042      DNU=DBLE(NU)
26043C
26044      CALL DQAGI(STFUN,DX,INF,EPSABS,EPSREL,DCDF,ABSERR,NEVAL,
26045     1          IER,LIMIT,LENW,LAST,IWORK,WORK)
26046C
26047      CDF=REAL(DCDF)
26048C
26049      IF(IER.EQ.1)THEN
26050        WRITE(ICOUT,999)
26051  999   FORMAT(1X)
26052        CALL DPWRST('XXX','BUG ')
26053        WRITE(ICOUT,111)
26054  111   FORMAT('***** ERROR FROM STCDF--')
26055        CALL DPWRST('XXX','BUG ')
26056        WRITE(ICOUT,113)
26057  113   FORMAT('      MAXIMUM NUMBER OF SUBDIVISIONS EXCEEDED.')
26058        CALL DPWRST('XXX','BUG ')
26059      ELSEIF(IER.EQ.2)THEN
26060        WRITE(ICOUT,999)
26061        CALL DPWRST('XXX','BUG ')
26062        WRITE(ICOUT,121)
26063  121   FORMAT('***** ERROR FROM STCDF--')
26064        CALL DPWRST('XXX','BUG ')
26065        WRITE(ICOUT,123)
26066  123   FORMAT('      ROUNDOFF ERROR PREVENTS REQUESTED TOLERANCE ',
26067     1         'FROM BEING ACHIEVED.')
26068        CALL DPWRST('XXX','BUG ')
26069      ELSEIF(IER.EQ.3)THEN
26070        WRITE(ICOUT,999)
26071        CALL DPWRST('XXX','BUG ')
26072        WRITE(ICOUT,131)
26073  131   FORMAT('***** ERROR FROM STCDF--')
26074        CALL DPWRST('XXX','BUG ')
26075        WRITE(ICOUT,133)
26076  133   FORMAT('      BAD INTEGRAND BEHAVIOUR DETECTED.')
26077        CALL DPWRST('XXX','BUG ')
26078      ELSEIF(IER.EQ.4)THEN
26079        WRITE(ICOUT,999)
26080        CALL DPWRST('XXX','BUG ')
26081        WRITE(ICOUT,141)
26082  141   FORMAT('***** ERROR FROM STCDF--')
26083        CALL DPWRST('XXX','BUG ')
26084        WRITE(ICOUT,143)
26085  143   FORMAT('      INTEGRATION DID NOT CONVERGE.')
26086        CALL DPWRST('XXX','BUG ')
26087      ELSEIF(IER.EQ.5)THEN
26088        WRITE(ICOUT,999)
26089        CALL DPWRST('XXX','BUG ')
26090        WRITE(ICOUT,151)
26091  151   FORMAT('***** ERROR FROM STCDF--')
26092        CALL DPWRST('XXX','BUG ')
26093        WRITE(ICOUT,153)
26094  153   FORMAT('      THE INTEGRATION IS PROBABLY DIVERGENT.')
26095        CALL DPWRST('XXX','BUG ')
26096      ELSEIF(IER.EQ.6)THEN
26097        WRITE(ICOUT,999)
26098        CALL DPWRST('XXX','BUG ')
26099        WRITE(ICOUT,161)
26100  161   FORMAT('***** ERROR FROM STCDF--')
26101        CALL DPWRST('XXX','BUG ')
26102        WRITE(ICOUT,163)
26103  163   FORMAT('      INVALID INPUT TO THE INTEGRATION ROUTINE.')
26104        CALL DPWRST('XXX','BUG ')
26105      ENDIF
26106C
26107 9000 CONTINUE
26108      RETURN
26109      END
26110      DOUBLE PRECISION FUNCTION STFUN(DX)
26111C
26112C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
26113C              FUNCTION VALUE FOR THE SKEW-T DISTRIBUTION
26114C              WITH SHAPE PARAMETERS NU AND LAMBDA.
26115C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
26116C              THE PROBABILITY DENSITY FUNCTION
26117C                 STPDF(X,NU,LAMBDA) = 2*
26118C                       TCDF(LAMBDA*X*SQRT((NU+1)/(X**2+NU)),NU+1)*
26119C                       TPDF(X,NU)
26120C              IDENTICAL TO TNPDF,
26121C              BUT DEFINE AS FUNCTION TO BE USED FOR INTEGRATION
26122C              CODE CALLED BY TNCDF.  ALSO, THIS ROUTINE USES
26123C              DOUBLE PRECISION ARITHMETIC.
26124C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
26125C                                WHICH THE PROBABILITY DENSITY
26126C                                FUNCTION IS TO BE EVALUATED.
26127C     OUTPUT ARGUMENTS--STFUN  = THE DOUBLE PRECISION PROBABILITY
26128C                                DENSITY FUNCTION VALUE.
26129C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
26130C             FUNCTION VALUE PDF FOR THE SKEW-T DISTRIBUTION
26131C             WITH SHAPE PARAMETERS NU AND LAMBDA.
26132C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
26133C     RESTRICTIONS--NONE.
26134C     OTHER DATAPAC   SUBROUTINES NEEDED--NODPDF, NODCDF..
26135C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26136C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
26137C     LANGUAGE--ANSI FORTRAN (1977)
26138C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
26139C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
26140C                 JOHN WILEY, 1994, PAGE 454.
26141C               --AZZALINI HAS AUTHORED A NUMBER OF PAPERS ON THIS
26142C                 DISTRIBUTION.
26143C     WRITTEN BY--JAMES J. FILLIBEN
26144C                 STATISTICAL ENGINEERING DIVISION
26145C                 INFORMATION TECHNOLOGY LABORATORY
26146C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
26147C                 GAITHERSBURG, MD 20899-8980
26148C                 PHONE--301-975-2855
26149C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26150C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
26151C     LANGUAGE--ANSI FORTRAN (1977)
26152C     VERSION NUMBER--2003.12
26153C     ORIGINAL VERSION--DECEMBER  2003.
26154C
26155C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26156C
26157C---------------------------------------------------------------------
26158C
26159      DOUBLE PRECISION DX
26160      DOUBLE PRECISION DZ
26161      DOUBLE PRECISION DTERM1
26162      DOUBLE PRECISION DTERM2
26163      DOUBLE PRECISION DNU2
26164C
26165      DOUBLE PRECISION DNU
26166      DOUBLE PRECISION DLMBDA
26167      COMMON/STCOM/DNU,DLMBDA
26168C
26169C-----COMMON----------------------------------------------------------
26170C
26171      INCLUDE 'DPCOP2.INC'
26172C
26173C-----START POINT-----------------------------------------------------
26174C
26175C               ************************************
26176C               **  STEP 1--                      **
26177C               **  COMPUTE THE DENSITY FUNCTION  **
26178C               ************************************
26179C
26180      NU=INT(DNU+0.5)
26181      DZ=DLMBDA*DX*DSQRT((DNU+1.0D0)/(DX**2+DNU))
26182      DNU2=DBLE(NU+1)
26183      CALL TDCDF(DZ,DNU2,DTERM1)
26184      CALL TDPDF(DX,NU,DTERM2)
26185      STFUN=2.0D0*DTERM1*DTERM2
26186C
26187      RETURN
26188      END
26189      REAL FUNCTION STFU2(X)
26190C
26191C     PURPOSE--STPPF CALLS FZERO TO FIND A ROOT FOR THE PERCENT
26192C              POINT FUNCTION.  STFU2 IS THE FUNCTION FOR WHICH
26193C              THE ZERO IS FOUND.  IT IS:
26194C                 P - STCDF(X,LAMBDA)
26195C              WHERE P IS THE DESIRED PERCENT POINT.
26196C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
26197C                                WHICH THE CUMULATIVE DISTRIBUTION
26198C                                FUNCTION IS TO BE EVALUATED.
26199C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
26200C             FUNCTION VALUE STFU2.
26201C     PRINTING--NONE.
26202C     RESTRICTIONS--NONE.
26203C     OTHER DATAPAC   SUBROUTINES NEEDED--STCDF.
26204C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26205C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
26206C     LANGUAGE--ANSI FORTRAN (1977)
26207C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
26208C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
26209C                 JOHN WILEY, 1994, PAGE 454.
26210C               --AZZALINI HAS AUTHORED A NUMBER OF PAPERS ON THIS
26211C                 DISTRIBUTION.
26212C     WRITTEN BY--JAMES J. FILLIBEN
26213C                 STATISTICAL ENGINEERING DIVISION
26214C                 INFORMATION TECHNOLOGY LABORATORY
26215C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
26216C                 GAITHERSBURG, MD 20899-8980
26217C                 PHONE--301-975-2855
26218C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26219C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
26220C     LANGUAGE--ANSI FORTRAN (1977)
26221C     VERSION NUMBER--2003.12
26222C     ORIGINAL VERSION--DECEMBER  2003.
26223C
26224C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26225C
26226C---------------------------------------------------------------------
26227C
26228      REAL P
26229      COMMON/ST2COM/P
26230C
26231      DOUBLE PRECISION DNU
26232      DOUBLE PRECISION DLMBDA
26233      COMMON/STCOM/DNU,DLMBDA
26234C
26235      INCLUDE 'DPCOP2.INC'
26236C
26237C-----START POINT-----------------------------------------------------
26238C
26239      NU=INT(DNU+0.01D0)
26240      CALL STCDF(X,NU,REAL(DLMBDA),CDF)
26241      STFU2=P - CDF
26242C
26243      RETURN
26244      END
26245      SUBROUTINE STPDF(X,NU,ALMBDA,PDF)
26246C
26247C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
26248C              FUNCTION VALUE FOR THE SKEW-T DISTRIBUTION
26249C              WITH SHAPE PARAMETERS NU AND LAMBDA.
26250C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
26251C              THE PROBABILITY DENSITY FUNCTION
26252C                 STPDF(X,NU,LAMBDA) = 2*
26253C                       TCDF(LAMBDA*X*SQRT((NU+1)/(X**2+NU)),NU+1)*
26254C                       TPDF(X,NU)
26255C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
26256C                                WHICH THE PROBABILITY DENSITY
26257C                                FUNCTION IS TO BE EVALUATED.
26258C                                X SHOULD BE NON-NEGATIVE.
26259C                     --NU     = THE FIRST SHAPE PARAMETER
26260C                     --ALMBDA = THE SECOND SHAPE PARAMETER
26261C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
26262C                                DENSITY FUNCTION VALUE.
26263C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
26264C             FUNCTION VALUE PDF FOR THE SKEWED-T DISTRIBUTION
26265C             WITH SHAPE PARAMETERS NU AND LAMBDA.
26266C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
26267C     RESTRICTIONS--NONE.
26268C     OTHER DATAPAC   SUBROUTINES NEEDED--TPDF, TCDF
26269C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26270C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
26271C     LANGUAGE--ANSI FORTRAN (1977)
26272C     REFERENCES--"Log-Skew-Normal and Log-Skew-t Distributions as
26273C                 Models for Family Income Data", Azzalini, Cappello,
26274C                 and Kotz, paper downloaded from Azzalini's web
26275C                 site.
26276C     WRITTEN BY--JAMES J. FILLIBEN
26277C                 STATISTICAL ENGINEERING DIVISION
26278C                 INFORMATION TECHNOLOGY LABORATORY
26279C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
26280C                 GAITHERSBURG, MD 20899-8980
26281C                 PHONE--301-975-2855
26282C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26283C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
26284C     LANGUAGE--ANSI FORTRAN (1977)
26285C     VERSION NUMBER--2003.11
26286C     ORIGINAL VERSION--NOVEMBER  2003.
26287C     UPDATED         --OCTOBER   2006. CALL LIST TO TCDF/TPDF
26288C
26289C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26290C
26291C-----COMMON----------------------------------------------------------
26292C
26293      INCLUDE 'DPCOP2.INC'
26294C
26295C-----START POINT-----------------------------------------------------
26296C
26297C
26298C               ********************************************
26299C               **  STEP 1--                              **
26300C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
26301C               ********************************************
26302C
26303      IF(NU.LE.0)THEN
26304        WRITE(ICOUT,115)
26305  115   FORMAT('***** ERROR--THE DEGREES OF FREEDOM SHAPE ',
26306     1        'PARAMETER FOR THE')
26307        CALL DPWRST('XXX','BUG ')
26308        WRITE(ICOUT,116)
26309  116   FORMAT('     SKEWED-T DISTRIBUTION IS NON-POSITIVE.')
26310        CALL DPWRST('XXX','BUG ')
26311        WRITE(ICOUT,147)NU
26312  147   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
26313        CALL DPWRST('XXX','BUG ')
26314        PDF=0.0
26315        GOTO9000
26316      ENDIF
26317C
26318C               ************************************
26319C               **  STEP 1--                      **
26320C               **  COMPUTE THE DENSITY FUNCTION  **
26321C               ************************************
26322C
26323      ANU=REAL(NU)
26324      Z=ALMBDA*X*SQRT((ANU+1.0)/(X**2+ANU))
26325      CALL TCDF(Z,REAL(NU+1),TERM1)
26326      CALL TPDF(X,REAL(NU),TERM2)
26327      PDF=2.0D0*TERM1*TERM2
26328C
26329 9000 CONTINUE
26330      RETURN
26331      END
26332      SUBROUTINE STPPF(P,NU,ALMBDA,PPF)
26333C
26334C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
26335C              FUNCTION VALUE FOR THE SKEW-NORMAL DISTRIBUTION
26336C              WITH SHAPE PARAMETER = LAMBDA.
26337C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND THE
26338C              PERCENT POINT FUNCTION IS COMPUTED BY
26339C              NUMERICALLY INVERTING THE CDF FUNCTION.
26340C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
26341C                                WHICH THE PERCENT POINT
26342C                                FUNCTION IS TO BE EVALUATED.
26343C                     --NU     = THE DEGREES OF FREEDOM PARAMETER
26344C                     --ALMBDA = THE SKEWNESS PARAMETER
26345C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION CUMULATIVE
26346C                                DISTRIBUTION FUNCTION VALUE.
26347C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
26348C             FUNCTION VALUE PPF.
26349C     PRINTING--NONE.
26350C     RESTRICTIONS--NONE.
26351C     OTHER DATAPAC   SUBROUTINES NEEDED--FZERO.
26352C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26353C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
26354C     LANGUAGE--ANSI FORTRAN (1977)
26355C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
26356C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
26357C                 JOHN WILEY, 1994, PAGE 454.
26358C               --"Log-Skew-Normal and Log-Skew-t Distributions as
26359C                 Models for Family Income Data", Azzalini, Cappello,
26360C                 and Kotz, paper downloaded from Azzalini's web
26361C                 site.
26362C     WRITTEN BY--JAMES J. FILLIBEN
26363C                 STATISTICAL ENGINEERING DIVISION
26364C                 INFORMATION TECHNOLOGY LABORATORY
26365C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
26366C                 GAITHERSBURG, MD 20899-8980
26367C                 PHONE--301-975-2855
26368C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26369C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
26370C     LANGUAGE--ANSI FORTRAN (1977)
26371C     VERSION NUMBER--2003.12
26372C     ORIGINAL VERSION--DECEMBER  2003.
26373C     UPDATED         --OCTOBER   2006. CALL LIST TO TPPF
26374C
26375C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26376C
26377C---------------------------------------------------------------------
26378C
26379      REAL PPF
26380C
26381      REAL STFU2
26382      EXTERNAL STFU2
26383C
26384      REAL P2
26385      COMMON/ST2COM/P2
26386C
26387      DOUBLE PRECISION DNU
26388      DOUBLE PRECISION DLMBDA
26389      COMMON/STCOM/DNU,DLMBDA
26390C
26391      INCLUDE 'DPCOP2.INC'
26392C
26393C-----START POINT-----------------------------------------------------
26394C
26395C               ********************************************
26396C               **  STEP 1--                              **
26397C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
26398C               ********************************************
26399C
26400      PPF=0.0
26401      IF(NU.LE.0)THEN
26402        WRITE(ICOUT,115)
26403  115   FORMAT('***** ERROR--THE DEGREES OF FREEDOM SHAPE ',
26404     1        'PARAMETER FOR THE')
26405        CALL DPWRST('XXX','BUG ')
26406        WRITE(ICOUT,116)
26407  116   FORMAT('     SKEWED-T DISTRIBUTION IS NON-POSITIVE.')
26408        CALL DPWRST('XXX','BUG ')
26409        WRITE(ICOUT,147)NU
26410  147   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
26411        CALL DPWRST('XXX','BUG ')
26412        GOTO9000
26413      ELSEIF(P.LE.0.0.OR.P.GE.1.0)THEN
26414         WRITE(ICOUT,61)
26415   61    FORMAT('***** ERROR--THE FIRST  ARGUMENT TO STPPF')
26416         CALL DPWRST('XXX','BUG ')
26417         WRITE(ICOUT,62)
26418   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
26419         CALL DPWRST('XXX','BUG ')
26420         WRITE(ICOUT,63)P
26421   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
26422         CALL DPWRST('XXX','BUG ')
26423         GOTO9000
26424      ENDIF
26425C
26426C  STEP 1: FIND BRACKETING INTERVAL.  START WITH FACT THAT LAMBDA = 0
26427C          IS THE T DISTRIBUTION AND THE FOLDED-T IS THE
26428C          LIMITING DISTRIBUTION AS LAMBDA GOES TO INFINITY.
26429C
26430      IF(ALMBDA.EQ.0.0)THEN
26431        CALL TPPF(P,REAL(NU),PPF)
26432        GOTO9000
26433      ELSE
26434        IFLAG2=0
26435        IF(ALMBDA.LT.0.0)IFLAG2=1
26436        P2=P
26437        IF(IFLAG2.EQ.1)P2=1.0 - P
26438        CALL TPPF(P2,REAL(NU),XLOW)
26439        CALL FTPPF(P2,NU,XUP)
26440      ENDIF
26441      XLOW=XLOW - 0.2
26442      XUP=XUP + 0.2
26443C
26444      AE=1.E-6
26445      RE=1.E-6
26446      DLMBDA=DBLE(ALMBDA)
26447      DNU=DBLE(NU)
26448      IF(IFLAG2.EQ.1)DLMBDA=-DLMBDA
26449      IFLAG=0
26450      CALL FZERO(STFU2,XLOW,XUP,XUP,RE,AE,IFLAG)
26451C
26452      PPF=XLOW
26453      IF(IFLAG2.EQ.1)PPF=-PPF
26454C
26455      IF(IFLAG.EQ.2)THEN
26456C
26457C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
26458CCCCC   WRITE(ICOUT,999)
26459  999   FORMAT(1X)
26460CCCCC   CALL DPWRST('XXX','BUG ')
26461CCCCC   WRITE(ICOUT,111)
26462CC111   FORMAT('***** WARNING FROM STPPF--')
26463CCCCC   CALL DPWRST('XXX','BUG ')
26464CCCCC   WRITE(ICOUT,113)
26465CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
26466CCCCC1         'TOLERANCE.')
26467CCCCC   CALL DPWRST('XXX','BUG ')
26468      ELSEIF(IFLAG.EQ.3)THEN
26469        WRITE(ICOUT,999)
26470        CALL DPWRST('XXX','BUG ')
26471        WRITE(ICOUT,121)
26472  121   FORMAT('***** WARNING FROM STPPF--')
26473        CALL DPWRST('XXX','BUG ')
26474        WRITE(ICOUT,123)
26475  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
26476        CALL DPWRST('XXX','BUG ')
26477      ELSEIF(IFLAG.EQ.4)THEN
26478        WRITE(ICOUT,999)
26479        CALL DPWRST('XXX','BUG ')
26480        WRITE(ICOUT,131)
26481  131   FORMAT('***** ERROR FROM STPPF--')
26482        CALL DPWRST('XXX','BUG ')
26483        WRITE(ICOUT,133)
26484  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
26485        CALL DPWRST('XXX','BUG ')
26486      ELSEIF(IFLAG.EQ.5)THEN
26487        WRITE(ICOUT,999)
26488        CALL DPWRST('XXX','BUG ')
26489        WRITE(ICOUT,141)
26490  141   FORMAT('***** WARNING FROM STPPF--')
26491        CALL DPWRST('XXX','BUG ')
26492        WRITE(ICOUT,143)
26493  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
26494        CALL DPWRST('XXX','BUG ')
26495      ENDIF
26496C
26497 9000 CONTINUE
26498      RETURN
26499      END
26500      SUBROUTINE STRAN(N,NU,ALMBDA,ISEED,X)
26501C
26502C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
26503C              FROM THE SKEWED T DISTRIBUTION
26504C              WITH SHAPE PARAMETERS NU AND ALMBDA.
26505C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
26506C              THE PROBABILITY DENSITY FUNCTION
26507C                 STPDF(X,NU,LAMBDA) = 2*
26508C                       TCDF(LAMBDA*X*SQRT((NU+1)/(X**2+NU)),NU+1)*
26509C                       TPDF(X,NU)
26510C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
26511C                                OF RANDOM NUMBERS TO BE
26512C                                GENERATED.
26513C                     --NU     = THE FIRST SHAPE PARAMETER
26514C                     --ALMBDA = THE SECOND SHAPE PARAMETER
26515C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
26516C                                (OF DIMENSION AT LEAST N)
26517C                                INTO WHICH THE GENERATED
26518C                                RANDOM SAMPLE WILL BE PLACED.
26519C     OUTPUT--A RANDOM SAMPLE OF SIZE N
26520C             FROM THE SKEWED T DISTRIBUTION
26521C             WITH SHAPE PARAMETERS NU AND ALMBDA.
26522C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
26523C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
26524C                   OF N FOR THIS SUBROUTINE.
26525C                 --NU SHOULD BE A POSITIVE INTEGER.
26526C                 --ALMBDA CAN BE ANY REAL NUMBER.
26527C     OTHER DATAPAC   SUBROUTINES NEEDED--CHSRAN, SNRAN.
26528C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26529C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
26530C     LANGUAGE--ANSI FORTRAN (1977)
26531C               --"Log-Skew-Normal and Log-Skew-t Distributions as
26532C                 Models for Family Income Data", Azzalini, Cappello,
26533C                 and Kotz, paper downloaded from Azzalini's web
26534C                 site.
26535C     REFERENCES--ALGORITHM FOR RANDOM NUMBERS ADAPTED FROM
26536C                 AZZALINI'S R FUNCTIONS FOR SKEW T.
26537C     WRITTEN BY--JAMES J. FILLIBEN
26538C                 STATISTICAL ENGINEERING DIVISION
26539C                 INFORMATION TECHNOLOGY LABORATORY
26540C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
26541C                 GAITHERSBURG, MD 20899-8980
26542C                 PHONE--301-975-2855
26543C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26544C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
26545C     LANGUAGE--ANSI FORTRAN (1977)
26546C     VERSION NUMBER--2003.11
26547C     ORIGINAL VERSION--NOVEMBER  2003.
26548C
26549C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26550C
26551C---------------------------------------------------------------------
26552C
26553      DIMENSION X(*)
26554      DIMENSION Y(1)
26555C
26556      CHARACTER*4 ISKNDF
26557C
26558C-----COMMON----------------------------------------------------------
26559C
26560      INCLUDE 'DPCOP2.INC'
26561C
26562C-----START POINT-----------------------------------------------------
26563C
26564C     CHECK THE INPUT ARGUMENTS FOR ERRORS
26565C
26566      IF(N.LT.1)THEN
26567        WRITE(ICOUT,5)
26568    5   FORMAT('***** ERROR--FOR THE SKEWED T DISTRIBUTION,')
26569        CALL DPWRST('XXX','BUG ')
26570        WRITE(ICOUT,6)
26571    6   FORMAT('       THE REQUESTED NUMBER OF RANDOM NUMBERS WAS ',
26572     1         'NON-POSITIVE.')
26573        CALL DPWRST('XXX','BUG ')
26574        WRITE(ICOUT,47)N
26575   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
26576        CALL DPWRST('XXX','BUG ')
26577        GOTO9999
26578      ELSEIF(NU.LE.0)THEN
26579        WRITE(ICOUT,115)
26580  115   FORMAT('***** ERROR--THE DEGREES OF FREEDOM SHAPE ',
26581     1         'PARAMETER FOR THE')
26582        CALL DPWRST('XXX','BUG ')
26583        WRITE(ICOUT,116)
26584  116   FORMAT('     SKEWED-T RANDOM NUMBERS IS NON-POSITIVE.')
26585        CALL DPWRST('XXX','BUG ')
26586        WRITE(ICOUT,47)NU
26587        CALL DPWRST('XXX','BUG ')
26588        GOTO9999
26589      ENDIF
26590C
26591C     ALGORITM ADAPTED FROM AZZALINI'S R FUNCTION LIBRARY.
26592C
26593      ISKNDF='DEFA'
26594      NTEMP=1
26595      ANU=REAL(NU)
26596      DO100I=1,N
26597C
26598        CALL SNRAN(1,ALMBDA,ISKNDF,ISEED,Y)
26599        Z=Y(1)
26600        CALL CHSRAN(1,ANU,ISEED,Y)
26601        V=Y(1)/ANU
26602        X(I)=Z/SQRT(V)
26603C
26604  100 CONTINUE
26605C
26606 9999 CONTINUE
26607      RETURN
26608      END
26609      REAL FUNCTION SNRM2(N,SX,INCX)
26610C***BEGIN PROLOGUE  SNRM2
26611C***DATE WRITTEN   791001   (YYMMDD)
26612C***REVISION DATE  820801   (YYMMDD)
26613C***CATEGORY NO.  D1A3B
26614C***KEYWORDS  BLAS,EUCLIDEAN,L2,LENGTH,LINEAR ALGEBRA,NORM,VECTOR
26615C***AUTHOR  LAWSON, C. L., (JPL)
26616C           HANSON, R. J., (SNLA)
26617C           KINCAID, D. R., (U. OF TEXAS)
26618C           KROGH, F. T., (JPL)
26619C***PURPOSE  Euclidean length (L2 norm) of s.p. vector
26620C***DESCRIPTION
26621C
26622C                B L A S  Subprogram
26623C    Description of Parameters
26624C
26625C     --Input--
26626C        N  number of elements in input vector(s)
26627C       SX  single precision vector with N elements
26628C     INCX  storage spacing between elements of SX
26629C
26630C     --Output--
26631C    SNRM2  single precision result (zero if N .LE. 0)
26632C
26633C     Euclidean norm of the N-vector stored in SX() with storage
26634C     increment INCX .
26635C     If N .LE. 0, return with result = 0.
26636C     If N .GE. 1, then INCX must be .GE. 1
26637C
26638C           C. L. Lawson, 1978 Jan 08
26639C
26640C     Four Phase Method     using two built-in constants that are
26641C     hopefully applicable to all machines.
26642C         CUTLO = maximum of  SQRT(U/EPS)  over all known machines.
26643C         CUTHI = minimum of  SQRT(V)      over all known machines.
26644C     where
26645C         EPS = smallest no. such that EPS + 1. .GT. 1.
26646C         U   = smallest positive no.   (underflow limit)
26647C         V   = largest  no.            (overflow  limit)
26648C
26649C     Brief Outline of Algorithm..
26650C
26651C     Phase 1 scans zero components.
26652C     Move to phase 2 when a component is nonzero and .LE. CUTLO
26653C     Move to phase 3 when a component is .GT. CUTLO
26654C     Move to phase 4 when a component is .GE. CUTHI/M
26655C     where M = N for X() real and M = 2*N for complex.
26656C
26657C     Values for CUTLO and CUTHI..
26658C     From the environmental parameters listed in the IMSL converter
26659C     document the limiting values are as follows..
26660C     CUTLO, S.P.   U/EPS = 2**(-102) for  Honeywell.  Close seconds are
26661C                   Univac and DEC at 2**(-103)
26662C                   Thus CUTLO = 2**(-51) = 4.44089E-16
26663C     CUTHI, S.P.   V = 2**127 for Univac, Honeywell, and DEC.
26664C                   Thus CUTHI = 2**(63.5) = 1.30438E19
26665C     CUTLO, D.P.   U/EPS = 2**(-67) for Honeywell and DEC.
26666C                   Thus CUTLO = 2**(-33.5) = 8.23181D-11
26667C     CUTHI, D.P.   same as S.P.  CUTHI = 1.30438D19
26668C     DATA CUTLO, CUTHI / 8.232D-11,  1.304D19 /
26669C     DATA CUTLO, CUTHI / 4.441E-16,  1.304E19 /
26670C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
26671C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
26672C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
26673C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
26674C***ROUTINES CALLED  (NONE)
26675C***END PROLOGUE  SNRM2
26676      INTEGER          NEXT
26677      REAL   SX(*),  CUTLO, CUTHI, HITEST, SUM, XMAX, ZERO, ONE
26678      DATA   ZERO, ONE /0.0E0, 1.0E0/
26679C
26680      DATA CUTLO, CUTHI / 4.441E-16,  1.304E19 /
26681C***FIRST EXECUTABLE STATEMENT  SNRM2
26682      IF(N .GT. 0) GO TO 10
26683         SNRM2  = ZERO
26684         GO TO 300
26685C
26686CCC10 ASSIGN 30 TO NEXT
26687   10 CONTINUE
26688      NEXT=30
26689      SUM = ZERO
26690      NN = N * INCX
26691C                                                 BEGIN MAIN LOOP
26692      I = 1
26693CCC20    GO TO NEXT,(30, 50, 70, 110)
26694   20 CONTINUE
26695      IF(NEXT.EQ.30)THEN
26696        GOTO30
26697      ELSEIF(NEXT.EQ.50)THEN
26698        GOTO50
26699      ELSEIF(NEXT.EQ.70)THEN
26700        GOTO70
26701      ELSEIF(NEXT.EQ.110)THEN
26702        GOTO110
26703      ENDIF
26704   30 CONTINUE
26705      IF( ABS(SX(I)) .GT. CUTLO) GO TO 85
26706CCCCC ASSIGN 50 TO NEXT
26707      NEXT=50
26708      XMAX = ZERO
26709C
26710C                        PHASE 1.  SUM IS ZERO
26711C
26712   50 CONTINUE
26713      IF( SX(I) .EQ. ZERO) GO TO 200
26714      IF( ABS(SX(I)) .GT. CUTLO) GO TO 85
26715C
26716C                                PREPARE FOR PHASE 2.
26717CCCCC ASSIGN 70 TO NEXT
26718      NEXT=70
26719      GO TO 105
26720C
26721C                                PREPARE FOR PHASE 4.
26722C
26723  100 CONTINUE
26724      I = J
26725CCCCC ASSIGN 110 TO NEXT
26726      NEXT=110
26727      SUM = (SUM / SX(I)) / SX(I)
26728  105 CONTINUE
26729      XMAX = ABS(SX(I))
26730      GO TO 115
26731C
26732C                   PHASE 2.  SUM IS SMALL.
26733C                             SCALE TO AVOID DESTRUCTIVE UNDERFLOW.
26734C
26735   70 CONTINUE
26736      IF( ABS(SX(I)) .GT. CUTLO ) GO TO 75
26737C
26738C                     COMMON CODE FOR PHASES 2 AND 4.
26739C                     IN PHASE 4 SUM IS LARGE.  SCALE TO AVOID OVERFLOW.
26740C
26741  110 CONTINUE
26742      IF( ABS(SX(I)) .LE. XMAX ) GO TO 115
26743         SUM = ONE + SUM * (XMAX / SX(I))**2
26744         XMAX = ABS(SX(I))
26745         GO TO 200
26746C
26747  115 CONTINUE
26748      SUM = SUM + (SX(I)/XMAX)**2
26749      GO TO 200
26750C
26751C
26752C                  PREPARE FOR PHASE 3.
26753C
26754   75 CONTINUE
26755      SUM = (SUM * XMAX) * XMAX
26756C
26757C
26758C     FOR REAL OR D.P. SET HITEST = CUTHI/N
26759C     FOR COMPLEX      SET HITEST = CUTHI/(2*N)
26760C
26761   85 CONTINUE
26762      HITEST = CUTHI/FLOAT( N )
26763C
26764C                   PHASE 3.  SUM IS MID-RANGE.  NO SCALING.
26765C
26766      DO 95 J =I,NN,INCX
26767         IF(ABS(SX(J)) .GE. HITEST) GO TO 100
26768         SUM = SUM + SX(J)**2
26769   95 CONTINUE
26770      SNRM2 = SQRT( SUM )
26771      GO TO 300
26772C
26773  200 CONTINUE
26774      I = I + INCX
26775      IF ( I .LE. NN ) GO TO 20
26776C
26777C              END OF MAIN LOOP.
26778C
26779C              COMPUTE SQUARE ROOT AND ADJUST FOR SCALING.
26780C
26781      SNRM2 = XMAX * SQRT(SUM)
26782  300 CONTINUE
26783      RETURN
26784      END
26785      SUBROUTINE SNDOFD(NR,N,XPLS,FPLS,A,SX,RNOISE,STEPSZ,ANBR)
26786CDPLT SUBROUTINE SNDOFD(NR,N,XPLS,OPTFCN,FPLS,A,SX,RNOISE,STEPSZ,ANBR)
26787      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
26788C PURPOSE
26789C -------
26790C FIND SECOND ORDER FORWARD FINITE DIFFERENCE APPROXIMATION "A"
26791C TO THE SECOND DERIVATIVE (HESSIAN) OF THE FUNCTION DEFINED BY THE SUBP
26792C "OPTFCN" EVALUATED AT THE NEW ITERATE "XPLS"
26793C
26794C FOR OPTIMIZATION USE THIS ROUTINE TO ESTIMATE
26795C 1) THE SECOND DERIVATIVE (HESSIAN) OF THE OPTIMIZATION FUNCTION
26796C    IF NO ANALYTICAL USER FUNCTION HAS BEEN SUPPLIED FOR EITHER
26797C    THE GRADIENT OR THE HESSIAN AND IF THE OPTIMIZATION FUNCTION
26798C    "OPTFCN" IS INEXPENSIVE TO EVALUATE.
26799C
26800C PARAMETERS
26801C ----------
26802C NR           --> ROW DIMENSION OF MATRIX
26803C N            --> DIMENSION OF PROBLEM
26804C XPLS(N)      --> NEW ITERATE:   X[K]
26805C OPTFCN       --> NAME OF SUBROUTINE TO EVALUATE FUNCTION
26806C FPLS         --> FUNCTION VALUE AT NEW ITERATE, F(XPLS)
26807C A(N,N)      <--  FINITE DIFFERENCE APPROXIMATION TO HESSIAN
26808C                  ONLY LOWER TRIANGULAR MATRIX AND DIAGONAL
26809C                  ARE RETURNED
26810C SX(N)        --> DIAGONAL SCALING MATRIX FOR X
26811C RNOISE       --> RELATIVE NOISE IN FNAME [F(X)]
26812C STEPSZ(N)    --> WORKSPACE (STEPSIZE IN I-TH COMPONENT DIRECTION)
26813C ANBR(N)      --> WORKSPACE (NEIGHBOR IN I-TH DIRECTION)
26814C
26815C
26816      DIMENSION XPLS(N)
26817      DIMENSION SX(N)
26818      DIMENSION STEPSZ(N),ANBR(N)
26819      DIMENSION A(NR,1)
26820      DIMENSION FHAT2(1)
26821C
26822C FIND I-TH STEPSIZE AND EVALUATE NEIGHBOR IN DIRECTION
26823C OF I-TH UNIT VECTOR.
26824C
26825      OV3 = 1.0D0/3.0D0
26826      DO 10 I=1,N
26827        STEPSZ(I)=RNOISE**OV3 * MAX(ABS(XPLS(I)),1.D0/SX(I))
26828        XTMPI=XPLS(I)
26829        XPLS(I)=XTMPI+STEPSZ(I)
26830        CALL OPTFCN(N,XPLS,ANBR(I))
26831        XPLS(I)=XTMPI
26832   10 CONTINUE
26833C
26834C CALCULATE COLUMN I OF A
26835C
26836      DO 30 I=1,N
26837        XTMPI=XPLS(I)
26838        XPLS(I)=XTMPI+2.0*STEPSZ(I)
26839        CALL OPTFCN(N,XPLS,FHAT2)
26840        FHAT=FHAT2(1)
26841        A(I,I)=((FPLS-ANBR(I))+(FHAT-ANBR(I)))/(STEPSZ(I)*STEPSZ(I))
26842C
26843C CALCULATE SUB-DIAGONAL ELEMENTS OF COLUMN
26844        IF(I.EQ.N) GO TO 25
26845        XPLS(I)=XTMPI+STEPSZ(I)
26846        IP1=I+1
26847        DO 20 J=IP1,N
26848          XTMPJ=XPLS(J)
26849          XPLS(J)=XTMPJ+STEPSZ(J)
26850          CALL OPTFCN(N,XPLS,FHAT2)
26851          FHAT=FHAT2(1)
26852          A(J,I)=((FPLS-ANBR(I))+(FHAT-ANBR(J)))/(STEPSZ(I)*STEPSZ(J))
26853          XPLS(J)=XTMPJ
26854   20   CONTINUE
26855   25   XPLS(I)=XTMPI
26856   30 CONTINUE
26857      RETURN
26858      END
26859      REAL FUNCTION SNV(AJV, ITYPE, GAMMA, DELTA, XLAM, XI, IFAULT)
26860C
26861C        ALGORITHM AS 100.2  APPL. STATIST. (1976) VOL.25, P.190
26862C
26863C        CONVERTS A JOHNSON VARIATE (AJV) TO A
26864C        STANDARD NORMAL VARIATE (SNV)
26865C
26866      REAL AJV, GAMMA, DELTA, XLAM, XI, V, W, C, ZERO, HALF, ONE,
26867     $  ZLOG, ZSQRT
26868C
26869      DATA ZERO, HALF, ONE, C /0.0, 0.5, 1.0, -63.0/
26870C
26871      ZLOG(W) = LOG(W)
26872      ZSQRT(W) = SQRT(W)
26873C
26874      SNV = ZERO
26875      IFAULT = 1
26876      IF (ITYPE .LT. 1 .OR. ITYPE .GT. 4) RETURN
26877      IFAULT = 0
26878      GOTO (10, 20, 30, 40), ITYPE
26879C
26880C        SL DISTRIBUTION
26881C
26882   10 W = XLAM * (AJV - XI)
26883      IF (W .LE. ZERO) GOTO 15
26884      SNV = XLAM * (ZLOG(W) * DELTA + GAMMA)
26885      RETURN
26886   15 IFAULT = 2
26887      RETURN
26888C
26889C        SU DISTRIBUTION
26890C
26891   20 W = (AJV - XI) / XLAM
26892      IF (W .GT. C) GOTO 23
26893      W = -HALF / W
26894      GOTO 27
26895   23 W = ZSQRT(W * W + ONE) + W
26896   27 SNV = ZLOG(W) * DELTA + GAMMA
26897      RETURN
26898C
26899C        SB DISTRIBUTION
26900C
26901   30 W = AJV - XI
26902      V = XLAM - W
26903      IF (W .LE. ZERO .OR. V .LE. ZERO) GOTO 35
26904      SNV = ZLOG(W / V) * DELTA + GAMMA
26905      RETURN
26906   35 IFAULT = 2
26907      RETURN
26908C
26909C        NORMAL DISTRIBUTION
26910C
26911   40 SNV = DELTA * AJV + GAMMA
26912      RETURN
26913      END
26914      SUBROUTINE SORT(X,N,Y)
26915C
26916C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
26917C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X
26918C              AND PUTS THE RESULTING N SORTED VALUES INTO THE
26919C              SINGLE PRECISION VECTOR Y.
26920C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
26921C                                OBSERVATIONS TO BE SORTED.
26922C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
26923C                                IN THE VECTOR X.
26924C     OUTPUT ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR
26925C                                INTO WHICH THE SORTED DATA VALUES
26926C                                FROM X WILL BE PLACED.
26927C     OUTPUT--THE SINGLE PRECISION VECTOR Y
26928C             CONTAINING THE SORTED
26929C             (IN ASCENDING ORDER) VALUES
26930C             OF THE SINGLE PRECISION VECTOR X.
26931C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
26932C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
26933C                   (DEFINED AND USED INTERNALLY WITHIN
26934C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
26935C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
26936C                   IF IL AND IU EACH HAVE DIMENSION K,
26937C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
26938C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
26939C                   OF IL AND IU HAVE BEEN SET TO 36,
26940C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
26941C                   APPROXIMATELY 137 BILLION.
26942C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
26943C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
26944C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
26945C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
26946C                   THEN THERE IS NO PRACTICAL RESTRICTION
26947C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
26948C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
26949C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
26950C                   INTO THIS SUBROUTINE.)
26951C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
26952C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26953C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
26954C     LANGUAGE--ANSI FORTRAN (1977)
26955C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
26956C              WILL BE PLACED IN THE FIRST POSITION
26957C              OF THE VECTOR Y,
26958C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
26959C              WILL BE PLACED IN THE SECOND POSITION
26960C              OF THE VECTOR Y, ETC.
26961C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
26962C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
26963C              THIS IS DONE BY HAVING THE SAME
26964C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
26965C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
26966C              CALL SORT(X,N,X)
26967C              IS ALLOWABLE AND WILL RESULT IN
26968C              THE DESIRED 'IN-PLACE' SORT.
26969C     COMMENT--THE SORTING ALGORTHM USED HEREIN
26970C              IS THE  QUICKSORT.
26971C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
26972C              FOLLOWING TIME TRIALS INDICATE.
26973C              THESE TIME TRIALS WERE CARRIED OUT ON THE
26974C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
26975C              IN AUGUST OF 1974.
26976C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
26977C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
26978C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
26979C              ALSO BEEN INCLUDED--
26980C              NUMBER OF RANDOM         QUICKSORT       BUBBLE SORT
26981C               NUMBERS SORTED
26982C                N = 10                 .002 SEC          .002 SEC
26983C                N = 100                .011 SEC          .045 SEC
26984C                N = 1000               .141 SEC         4.332 SEC
26985C                N = 3000               .476 SEC        37.683 SEC
26986C                N = 10000             1.887 SEC      NOT COMPUTED
26987C     REFERENCES--CACM MARCH 1969, PAGE 186 ( QUICKSORT ALGORITHM
26988C                 BY RICHARD C. SINGLETON).
26989C               --CACM JANUARY 1970, PAGE 54.
26990C               --CACM OCTOBER 1970, PAGE 624.
26991C               --JACM JANUARY 1961, PAGE 41.
26992C     WRITTEN BY--JAMES J. FILLIBEN
26993C                 STATISTICAL ENGINEERING DIVISION
26994C                 INFORMATION TECHNOLOGY LABORATORY
26995C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
26996C                 GAITHERSBURG, MD 20899-8980
26997C                 PHONE--301-975-2855
26998C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26999C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
27000C     LANGUAGE--ANSI FORTRAN (1966)
27001C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
27002C                          DENOTED BY QUOTES RATHER THAN NH.
27003C     VERSION NUMBER--82.6
27004C     ORIGINAL VERSION--JUNE      1972.
27005C     UPDATED         --NOVEMBER  1975.
27006C     UPDATED         --JUNE      1981.
27007C     UPDATED         --AUGUST    1981.
27008C     UPDATED         --MAY       1982.
27009C
27010C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27011C
27012      CHARACTER*4 IBUGA3
27013      CHARACTER*4 IERROR
27014C
27015      CHARACTER*4 ISUBN1
27016      CHARACTER*4 ISUBN2
27017C
27018C---------------------------------------------------------------------
27019C
27020      DIMENSION X(*)
27021      DIMENSION Y(*)
27022C
27023      DIMENSION IU(36)
27024      DIMENSION IL(36)
27025C
27026C-----COMMON----------------------------------------------------------
27027C
27028      INCLUDE 'DPCOP2.INC'
27029C
27030C-----START POINT-----------------------------------------------------
27031C
27032      ISUBN1='SORT'
27033      ISUBN2='    '
27034      IERROR='NO'
27035      IBUGA3='OFF'
27036C
27037      IF(IBUGA3.EQ.'OFF')GOTO90
27038      WRITE(ICOUT,999)
27039  999 FORMAT(1X)
27040      CALL DPWRST('XXX','BUG ')
27041      WRITE(ICOUT,51)
27042   51 FORMAT('***** AT THE BEGINNING OF SORT--')
27043      CALL DPWRST('XXX','BUG ')
27044      WRITE(ICOUT,52)IBUGA3
27045   52 FORMAT('IBUGA3 = ',A4)
27046      CALL DPWRST('XXX','BUG ')
27047      WRITE(ICOUT,53)N
27048   53 FORMAT('N = ',I8)
27049      CALL DPWRST('XXX','BUG ')
27050      DO55I=1,N
27051      WRITE(ICOUT,56)I,X(I)
27052   56 FORMAT('I,X(I) = ',I8,E15.7)
27053      CALL DPWRST('XXX','BUG ')
27054   55 CONTINUE
27055   90 CONTINUE
27056C
27057C               ************************
27058C               **  SORT THE VALUES.  **
27059C               ************************
27060C
27061C               ********************************************
27062C               **  STEP 1--                              **
27063C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27064C               ********************************************
27065C
27066      IF(N.GE.1)GOTO119
27067      IERROR='YES'
27068      WRITE(ICOUT,999)
27069      CALL DPWRST('XXX','BUG ')
27070      WRITE(ICOUT,111)
27071  111 FORMAT('***** ERROR IN SORT--',
27072     1'THE SECOND INPUT ARGUMENT (N) IS SMALLER THAN 1')
27073      CALL DPWRST('XXX','BUG ')
27074      WRITE(ICOUT,118)N
27075  118 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
27076      CALL DPWRST('XXX','BUG ')
27077      GOTO9000
27078  119 CONTINUE
27079C
27080      IF(N.EQ.1)GOTO120
27081      GOTO129
27082  120 CONTINUE
27083CCCCC WRITE(ICOUT,999)
27084CCCCC CALL DPWRST('XXX','BUG ')
27085CCCCC WRITE(ICOUT,121)
27086CC121 FORMAT('***** NON-FATAL DIAGNOSTIC IN SORT--',
27087CCCCC1'THE SECOND INPUT ARGUMENT (N) HAS THE VALUE 1')
27088CCCCC CALL DPWRST('XXX','BUG ')
27089      Y(1)=X(1)
27090      GOTO9000
27091  129 CONTINUE
27092C
27093      HOLD=X(1)
27094      DO135I=2,N
27095      IF(X(I).NE.HOLD)GOTO139
27096  135 CONTINUE
27097CCCCC WRITE(ICOUT,999)
27098CCCCC CALL DPWRST('XXX','BUG ')
27099CCCCC WRITE(ICOUT,136)HOLD
27100CC136 FORMAT('***** NON-FATAL DIAGNOSTIC IN SORT--',
27101CCCCC1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
27102CCCCC CALL DPWRST('XXX','BUG ')
27103      DO137I=1,N
27104        Y(I)=X(I)
27105  137 CONTINUE
27106      GOTO9000
27107  139 CONTINUE
27108C
27109C               *******************************************
27110C               **  STEP 2--                             **
27111C               **  COPY THE VECTOR X INTO THE VECTOR Y  **
27112C               *******************************************
27113C
27114      DO200I=1,N
27115        Y(I)=X(I)
27116  200 CONTINUE
27117C
27118C               **********************************************************
27119C               **  STEP 3--                                            **
27120C               **  CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED  **
27121C               **********************************************************
27122C
27123      NM1=N-1
27124      DO250I=1,NM1
27125      IP1=I+1
27126      IF(Y(I).LE.Y(IP1))GOTO250
27127      GOTO290
27128  250 CONTINUE
27129      GOTO9000
27130  290 CONTINUE
27131C
27132C               ***************************
27133C               **  STEP 4--             **
27134C               **  CARRY OUT THE SORT.  **
27135C               ***************************
27136C
27137      M=1
27138      I=1
27139      J=N
27140  305 IF(I.GE.J)GOTO370
27141  310 K=I
27142      MID=(I+J)/2
27143      AMED=Y(MID)
27144      IF(Y(I).LE.AMED)GOTO320
27145      Y(MID)=Y(I)
27146      Y(I)=AMED
27147      AMED=Y(MID)
27148  320 L=J
27149      IF(Y(J).GE.AMED)GOTO340
27150      Y(MID)=Y(J)
27151      Y(J)=AMED
27152      AMED=Y(MID)
27153      IF(Y(I).LE.AMED)GOTO340
27154      Y(MID)=Y(I)
27155      Y(I)=AMED
27156      AMED=Y(MID)
27157      GOTO340
27158  330 Y(L)=Y(K)
27159      Y(K)=TT
27160  340 L=L-1
27161      IF(Y(L).GT.AMED)GOTO340
27162      TT=Y(L)
27163  350 K=K+1
27164      IF(Y(K).LT.AMED)GOTO350
27165      IF(K.LE.L)GOTO330
27166      LMI=L-I
27167      JMK=J-K
27168      IF(LMI.LE.JMK)GOTO360
27169      IL(M)=I
27170      IU(M)=L
27171      I=K
27172      M=M+1
27173      GOTO380
27174  360 IL(M)=K
27175      IU(M)=J
27176      J=L
27177      M=M+1
27178      GOTO380
27179  370 M=M-1
27180      IF(M.EQ.0)GOTO9000
27181      I=IL(M)
27182      J=IU(M)
27183  380 JMI=J-I
27184      IF(JMI.GE.11)GOTO310
27185      IF(I.EQ.1)GOTO305
27186      I=I-1
27187  390 I=I+1
27188      IF(I.EQ.J)GOTO370
27189      AMED=Y(I+1)
27190      IF(Y(I).LE.AMED)GOTO390
27191      K=I
27192  395 Y(K+1)=Y(K)
27193      K=K-1
27194      IF(AMED.LT.Y(K))GOTO395
27195      Y(K+1)=AMED
27196      GOTO390
27197C
27198C               *****************
27199C               **  STEP 90--  **
27200C               **  EXIT.      **
27201C               *****************
27202C
27203 9000 CONTINUE
27204C
27205      IF(IBUGA3.EQ.'OFF')GOTO9090
27206      WRITE(ICOUT,999)
27207      CALL DPWRST('XXX','BUG ')
27208      WRITE(ICOUT,9011)
27209 9011 FORMAT('***** AT THE END       OF SORT--')
27210      CALL DPWRST('XXX','BUG ')
27211      WRITE(ICOUT,9012)IBUGA3,IERROR
27212 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
27213      CALL DPWRST('XXX','BUG ')
27214      WRITE(ICOUT,9013)N
27215 9013 FORMAT('N = ',I8)
27216      CALL DPWRST('XXX','BUG ')
27217      DO9015I=1,N
27218      WRITE(ICOUT,9016)I,X(I),Y(I)
27219 9016 FORMAT('I,X(I),Y(I) = ',I8,2E15.7)
27220      CALL DPWRST('XXX','BUG ')
27221 9015 CONTINUE
27222 9090 CONTINUE
27223C
27224      RETURN
27225      END
27226      SUBROUTINE SORT2(X1,X2,N,IWRITE,Y1,Y2,TEMP1,XIDTEM,
27227     1                 ISORDI,ISUBRO,IBUGA3,IERROR)
27228C
27229C     PURPOSE--THIS SUBROUTINE SORTS BASED ON TWO VARIABLES
27230C     INPUT  ARGUMENTS--X1     = THE SINGLE PRECISION VECTOR CONTAINING
27231C                                THE FIRST RESPONSE VARIABLE TO BE
27232C                                SORTED.
27233C                     --X2     = THE SINGLE PRECISION VECTOR CONTAINING
27234C                                THE SECOND RESPONSE VARIABLE TO BE
27235C                                SORTED.
27236C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27237C                                IN THE VECTOR X.
27238C                     --ISORDI = CHARACTER VARIABLE THAT SPECIFIES
27239C                                WHETHER SORT IS ASCENDING OR
27240C                                DESCENDING.
27241C     OUTPUT ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR
27242C                                CONTAINING THE SORTED VALUES OF
27243C                                THE FIRST RESPONSE VARIABLE.
27244C     OUTPUT ARGUMENTS--Y2     = THE SINGLE PRECISION VECTOR
27245C                                CONTAINING THE SORTED VALUES OF
27246C                                THE SECOND RESPONSE VARIABLE.
27247C     OUTPUT--THE SINGLE PRECISION VECTORS Y1 AND Y2 CONTAINING
27248C             THE SORTED VECTORS.
27249C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
27250C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, SORTI.
27251C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27252C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
27253C     LANGUAGE--ANSI FORTRAN (1977)
27254C     WRITTEN BY--JAMES J. FILLIBEN
27255C                 STATISTICAL ENGINEERING DIVISION
27256C                 INFORMATION TECHNOLOGY LABORATORY
27257C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
27258C                 GAITHERSBURG, MD 20899-8980
27259C                 PHONE--301-975-2855
27260C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27261C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
27262C     LANGUAGE--ANSI FORTRAN (1977)
27263C     VERSION NUMBER--2008.10
27264C     ORIGINAL VERSION--OCTOBER   2008.
27265C
27266C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27267C
27268      CHARACTER*4 IWRITE
27269      CHARACTER*4 ISORDI
27270      CHARACTER*4 ISUBRO
27271      CHARACTER*4 IBUGA3
27272      CHARACTER*4 IERROR
27273C
27274      CHARACTER*4 ISUBN1
27275      CHARACTER*4 ISUBN2
27276C
27277C---------------------------------------------------------------------
27278C
27279      DIMENSION Y1(*)
27280      DIMENSION Y2(*)
27281      DIMENSION X1(*)
27282      DIMENSION X2(*)
27283      DIMENSION TEMP1(*)
27284      DIMENSION XIDTEM(*)
27285C
27286C-----COMMON----------------------------------------------------------
27287C
27288      INCLUDE 'DPCOP2.INC'
27289C
27290C-----START POINT-----------------------------------------------------
27291C
27292      ISUBN1='SORT'
27293      ISUBN2='2   '
27294      IERROR='NO'
27295C
27296      ISTRT=0
27297      IFRST=0
27298      ILAST=0
27299C
27300      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT2')THEN
27301        WRITE(ICOUT,999)
27302  999   FORMAT(1X)
27303        CALL DPWRST('XXX','BUG ')
27304        WRITE(ICOUT,51)
27305   51   FORMAT('***** AT THE BEGINNING OF SORT2--')
27306        CALL DPWRST('XXX','BUG ')
27307        WRITE(ICOUT,52)IBUGA3,ISORDI
27308   52   FORMAT('IBUGA3,ISORDI = ',A4,2X,A4)
27309        CALL DPWRST('XXX','BUG ')
27310        WRITE(ICOUT,53)N
27311   53   FORMAT('N = ',2I8)
27312        CALL DPWRST('XXX','BUG ')
27313        DO55I=1,N
27314          WRITE(ICOUT,56)I,X1(I),X2(I)
27315   56     FORMAT('I,X1(I),X2(I) = ',I8,2G15.7)
27316          CALL DPWRST('XXX','BUG ')
27317   55   CONTINUE
27318      ENDIF
27319C
27320C    ********************************************
27321C    **  STEP 1--                              **
27322C    **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27323C    ********************************************
27324C
27325      AN=N
27326C
27327      IF(N.LT.1)THEN
27328        IERROR='YES'
27329        WRITE(ICOUT,999)
27330        CALL DPWRST('XXX','BUG ')
27331        WRITE(ICOUT,111)
27332  111   FORMAT('***** ERROR IN SORT2--')
27333        CALL DPWRST('XXX','BUG ')
27334        WRITE(ICOUT,113)
27335  113   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',
27336     1         'NON-POSITIVE.')
27337        CALL DPWRST('XXX','BUG ')
27338        WRITE(ICOUT,115)N
27339  115   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',I8)
27340        CALL DPWRST('XXX','BUG ')
27341        GOTO9000
27342      ENDIF
27343C
27344      IF(N.EQ.1)THEN
27345        Y1(1)=X1(1)
27346        Y2(1)=X2(1)
27347        GOTO9000
27348      ENDIF
27349C
27350C     ***************************************************
27351C     **  STEP 2--                                     **
27352C     **  SORT FIRST VARIABLE AND CARRY THE SECOND     **
27353C     **  VARIABLE.                                    **
27354C     ***************************************************
27355C
27356      CALL SORTI(X1,N,Y1,TEMP1)
27357C
27358      IF(ISORDI.EQ.'DESC')THEN
27359        DO1010I=1,N
27360          Y2(I)=Y1(I)
27361 1010   CONTINUE
27362        DO1020I=1,N
27363          II=N-I+1
27364          Y1(I)=Y2(II)
27365 1020   CONTINUE
27366      ENDIF
27367C
27368      DO1030I=1,N
27369        J=INT(TEMP1(I)+0.5)
27370        Y2(I)=X2(J)
27371 1030 CONTINUE
27372      IF(ISORDI.EQ.'DESC')THEN
27373        DO1040I=1,N
27374          TEMP1(I)=Y2(I)
27375 1040   CONTINUE
27376        DO1050I=1,N
27377          II=N-I+1
27378          Y2(I)=TEMP1(II)
27379 1050   CONTINUE
27380      ENDIF
27381C
27382      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT2')THEN
27383        WRITE(ICOUT,1091)
27384 1091   FORMAT('AFTER SORT FIRST RESPONSE VARIABLE')
27385        CALL DPWRST('XXX','BUG ')
27386        DO1099I=1,N
27387        WRITE(ICOUT,1093)I,X1(I),X2(I),Y1(I),Y2(I)
27388 1093   FORMAT('I,X1(I),X2(I),Y1(I),Y2(I) = ',I8,4G15.7)
27389        CALL DPWRST('XXX','BUG ')
27390 1099   CONTINUE
27391      ENDIF
27392C
27393C     ****************************************************
27394C     **  STEP 3--                                      **
27395C     **  NOW SORT THE SECOND VARIABLE FOR COMMON       **
27396C     **  VALUES OF FIRST VARIABLE.                     **
27397C     ****************************************************
27398C
27399      CALL DISTIN(Y1,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
27400      IF(N.EQ.NDIST)GOTO9000
27401      IF(NDIST.EQ.1)THEN
27402        CALL SORTI(X2,N,Y2,TEMP1)
27403        IF(ISORDI.EQ.'DESC')THEN
27404          DO2010I=1,N
27405            TEMP1(I)=Y2(I)
27406 2010     CONTINUE
27407          DO2020I=1,N
27408            II=N-I+1
27409            Y2(I)=TEMP1(I)
27410 2020     CONTINUE
27411        ENDIF
27412        GOTO9000
27413      ENDIF
27414C
27415      CALL SORT(XIDTEM,NDIST,XIDTEM)
27416      IF(ISORDI.EQ.'DESC')THEN
27417        DO2030I=1,NDIST
27418          TEMP1(I)=XIDTEM(I)
27419 2030   CONTINUE
27420        DO2040I=1,NDIST
27421          II=NDIST-I+1
27422          XIDTEM(I)=TEMP1(II)
27423 2040   CONTINUE
27424      ENDIF
27425C
27426      ISTRT=1
27427      DO2110ISET=1,NDIST
27428        HOLD=XIDTEM(ISET)
27429C
27430        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT2')THEN
27431          WRITE(ICOUT,2111)ISET,ISTRT,HOLD
27432 2111     FORMAT('AT 2110: ISET,ISTRT,HOLD = ',2I8,G15.7)
27433          CALL DPWRST('XXX','BUG ')
27434        ENDIF
27435C
27436        ICNT=0
27437        IFLAG1=0
27438        DO2120I=ISTRT,N
27439          IF(Y1(I).EQ.HOLD)THEN
27440            IF(IFLAG1.EQ.0)THEN
27441              IFRST=I
27442              IFLAG1=1
27443            ENDIF
27444            ILAST=I
27445            ICNT=ICNT+1
27446            TEMP1(ICNT)=Y2(I)
27447          ENDIF
27448 2120   CONTINUE
27449        ISTRT=ILAST+1
27450        CALL SORT(TEMP1,ICNT,TEMP1)
27451        IF(ISORDI.EQ.'DESC')THEN
27452          ICNT2=0
27453          DO2130J=ICNT,1,-1
27454            ICNT2=ICNT2+1
27455            Y2(IFRST+J-1)=TEMP1(ICNT2)
27456 2130     CONTINUE
27457        ELSE
27458          DO2160J=1,ICNT
27459            Y2(IFRST+J-1)=TEMP1(J)
27460 2160     CONTINUE
27461        ENDIF
27462 2110 CONTINUE
27463C
27464C               *****************
27465C               **  STEP 90--  **
27466C               **  EXIT.      **
27467C               *****************
27468C
27469 9000 CONTINUE
27470C
27471      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT2')THEN
27472        WRITE(ICOUT,999)
27473        CALL DPWRST('XXX','BUG ')
27474        WRITE(ICOUT,9011)
27475 9011   FORMAT('***** AT THE END       OF SORT2--')
27476        CALL DPWRST('XXX','BUG ')
27477        DO9015I=1,N
27478          WRITE(ICOUT,9016)I,X1(I),X2(I),Y1(I),Y2(I)
27479 9016     FORMAT('I,X1(I),X2(I),Y1(I),Y2(I) = ',I8,4G15.7)
27480          CALL DPWRST('XXX','BUG ')
27481 9015   CONTINUE
27482      ENDIF
27483C
27484      RETURN
27485      END
27486      SUBROUTINE SORT3(X1,X2,X3,N,IWRITE,Y1,Y2,Y3,
27487     1                 TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,XIDTEM,XIDTE2,
27488     1                 ISORDI,ISUBRO,IBUGA3,IERROR)
27489C
27490C     PURPOSE--THIS SUBROUTINE SORTS BASED ON THREE VARIABLES
27491C     INPUT  ARGUMENTS--X1     = THE SINGLE PRECISION VECTOR CONTAINING
27492C                                THE FIRST RESPONSE VARIABLE TO BE
27493C                                SORTED.
27494C                     --X2     = THE SINGLE PRECISION VECTOR CONTAINING
27495C                                THE SECOND RESPONSE VARIABLE TO BE
27496C                                SORTED.
27497C                     --X3     = THE SINGLE PRECISION VECTOR CONTAINING
27498C                                THE THIRD RESPONSE VARIABLE TO BE
27499C                                SORTED.
27500C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27501C                                IN THE VECTOR X.
27502C                     --ISORDI = CHARACTER VARIABLE THAT SPECIFIES
27503C                                WHETHER SORT IS ASCENDING OR
27504C                                DESCENDING.
27505C     OUTPUT ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR
27506C                                CONTAINING THE SORTED VALUES OF
27507C                                THE FIRST RESPONSE VARIABLE.
27508C                     --Y2     = THE SINGLE PRECISION VECTOR
27509C                                CONTAINING THE SORTED VALUES OF
27510C                                THE SECOND RESPONSE VARIABLE.
27511C                     --Y3     = THE SINGLE PRECISION VECTOR
27512C                                CONTAINING THE SORTED VALUES OF
27513C                                THE THIRD RESPONSE VARIABLE.
27514C     OUTPUT--THE SINGLE PRECISION VECTORS Y1, Y2 AND Y3 CONTAINING
27515C             THE SORTED VECTORS.
27516C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
27517C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, SORTI.
27518C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27519C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
27520C     LANGUAGE--ANSI FORTRAN (1977)
27521C     WRITTEN BY--JAMES J. FILLIBEN
27522C                 STATISTICAL ENGINEERING DIVISION
27523C                 INFORMATION TECHNOLOGY LABORATORY
27524C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
27525C                 GAITHERSBURG, MD 20899-8980
27526C                 PHONE--301-975-2855
27527C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27528C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
27529C     LANGUAGE--ANSI FORTRAN (1977)
27530C     VERSION NUMBER--2008.10
27531C     ORIGINAL VERSION--OCTOBER   2008.
27532C
27533C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27534C
27535      CHARACTER*4 IWRITE
27536      CHARACTER*4 ISORDI
27537      CHARACTER*4 ISUBRO
27538      CHARACTER*4 IBUGA3
27539      CHARACTER*4 IERROR
27540C
27541      CHARACTER*4 ISUBN1
27542      CHARACTER*4 ISUBN2
27543C
27544C---------------------------------------------------------------------
27545C
27546      DIMENSION Y1(*)
27547      DIMENSION Y2(*)
27548      DIMENSION Y3(*)
27549      DIMENSION X1(*)
27550      DIMENSION X2(*)
27551      DIMENSION X3(*)
27552      DIMENSION TEMP1(*)
27553      DIMENSION TEMP2(*)
27554      DIMENSION TEMP3(*)
27555      DIMENSION TEMP4(*)
27556      DIMENSION TEMP5(*)
27557      DIMENSION XIDTEM(*)
27558      DIMENSION XIDTE2(*)
27559C
27560C-----COMMON----------------------------------------------------------
27561C
27562      INCLUDE 'DPCOP2.INC'
27563C
27564C-----START POINT-----------------------------------------------------
27565C
27566      ISUBN1='SORT'
27567      ISUBN2='3   '
27568      IERROR='NO'
27569C
27570      ISTRT=0
27571      IFRST=0
27572      ILAST=0
27573C
27574      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
27575        WRITE(ICOUT,999)
27576  999   FORMAT(1X)
27577        CALL DPWRST('XXX','BUG ')
27578        WRITE(ICOUT,51)
27579   51   FORMAT('***** AT THE BEGINNING OF SORT3--')
27580        CALL DPWRST('XXX','BUG ')
27581        WRITE(ICOUT,52)IBUGA3,ISORDI
27582   52   FORMAT('IBUGA3,ISORDI = ',A4,2X,A4)
27583        CALL DPWRST('XXX','BUG ')
27584        WRITE(ICOUT,53)N
27585   53   FORMAT('N = ',2I8)
27586        CALL DPWRST('XXX','BUG ')
27587        DO55I=1,N
27588          WRITE(ICOUT,56)I,X1(I),X2(I),X3(I)
27589   56     FORMAT('I,X1(I),X2(I),X3(I) = ',I8,3G15.7)
27590          CALL DPWRST('XXX','BUG ')
27591   55   CONTINUE
27592      ENDIF
27593C
27594C    ********************************************
27595C    **  STEP 1--                              **
27596C    **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27597C    ********************************************
27598C
27599      AN=N
27600C
27601      IF(N.LT.1)THEN
27602        IERROR='YES'
27603        WRITE(ICOUT,999)
27604        CALL DPWRST('XXX','BUG ')
27605        WRITE(ICOUT,111)
27606  111   FORMAT('***** ERROR IN SORT3--')
27607        CALL DPWRST('XXX','BUG ')
27608        WRITE(ICOUT,113)
27609  113   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',
27610     1         'NON-POSITIVE.')
27611        CALL DPWRST('XXX','BUG ')
27612        WRITE(ICOUT,115)N
27613  115   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',I8)
27614        CALL DPWRST('XXX','BUG ')
27615        GOTO9000
27616      ENDIF
27617C
27618      IF(N.EQ.1)THEN
27619        Y1(1)=X1(1)
27620        Y2(1)=X2(1)
27621        Y3(1)=X3(1)
27622        GOTO9000
27623      ENDIF
27624C
27625C     ***************************************************
27626C     **  STEP 2--                                     **
27627C     **  SORT FIRST VARIABLE AND CARRY THE SECOND     **
27628C     **  AND THIRD VARIABLES.                         **
27629C     ***************************************************
27630C
27631      CALL SORTI(X1,N,Y1,TEMP1)
27632C
27633      IF(ISORDI.EQ.'DESC')THEN
27634        DO1010I=1,N
27635          Y2(I)=Y1(I)
27636 1010   CONTINUE
27637        DO1020I=1,N
27638          II=N-I+1
27639          Y1(I)=Y2(II)
27640 1020   CONTINUE
27641      ENDIF
27642C
27643      DO1030I=1,N
27644        J=INT(TEMP1(I)+0.5)
27645        Y2(I)=X2(J)
27646        Y3(I)=X3(J)
27647 1030 CONTINUE
27648      IF(ISORDI.EQ.'DESC')THEN
27649        DO1040I=1,N
27650          TEMP1(I)=Y2(I)
27651 1040   CONTINUE
27652        DO1050I=1,N
27653          II=N-I+1
27654          Y2(I)=TEMP1(II)
27655 1050   CONTINUE
27656        DO1060I=1,N
27657          TEMP1(I)=Y3(I)
27658 1060   CONTINUE
27659        DO1070I=1,N
27660          II=N-I+1
27661          Y3(I)=TEMP1(II)
27662 1070   CONTINUE
27663      ENDIF
27664C
27665      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
27666        WRITE(ICOUT,1091)
27667 1091   FORMAT('AFTER SORT FIRST RESPONSE VARIABLE')
27668        CALL DPWRST('XXX','BUG ')
27669        DO1099I=1,N
27670        WRITE(ICOUT,1093)I,X1(I),X2(I),X3(I),Y1(I),Y2(I),Y3(I)
27671 1093   FORMAT('I,X1(I),X2(I),X3(I),Y1(I),Y2(I),Y3(I) = ',
27672     1         I8,6G15.7)
27673        CALL DPWRST('XXX','BUG ')
27674 1099   CONTINUE
27675      ENDIF
27676C
27677C     **********************************************************
27678C     **  STEP 3--                                            **
27679C     **  NOW SORT THE SECOND AND THIRD VARIABLES FOR COMMON  **
27680C     **  VALUES OF FIRST VARIABLE.                           **
27681C     **********************************************************
27682C
27683      CALL DISTIN(Y1,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
27684      IF(N.EQ.NDIST)GOTO9000
27685      IF(NDIST.EQ.1)THEN
27686        CALL SORTI(X2,N,Y2,TEMP1)
27687        IF(ISORDI.EQ.'DESC')THEN
27688          DO2010I=1,N
27689            TEMP1(I)=Y2(I)
27690 2010     CONTINUE
27691          DO2015I=1,N
27692            II=N-I+1
27693            Y2(I)=TEMP1(I)
27694 2015     CONTINUE
27695          DO2020I=1,N
27696            TEMP1(I)=Y3(I)
27697 2020     CONTINUE
27698          DO2025I=1,N
27699            II=N-I+1
27700            Y3(I)=TEMP1(I)
27701 2025     CONTINUE
27702        ENDIF
27703        GOTO9000
27704      ENDIF
27705C
27706      CALL SORT(XIDTEM,NDIST,XIDTEM)
27707      IF(ISORDI.EQ.'DESC')THEN
27708        DO2030I=1,NDIST
27709          TEMP1(I)=XIDTEM(I)
27710 2030   CONTINUE
27711        DO2040I=1,NDIST
27712          II=NDIST-I+1
27713          XIDTEM(I)=TEMP1(II)
27714 2040   CONTINUE
27715      ENDIF
27716C
27717      ISTRT=1
27718      DO2110ISET=1,NDIST
27719        HOLD=XIDTEM(ISET)
27720C
27721        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
27722          WRITE(ICOUT,2111)ISET,ISTRT,HOLD
27723 2111     FORMAT('AT 2110: ISET,ISTRT,HOLD = ',2I8,G15.7)
27724          CALL DPWRST('XXX','BUG ')
27725        ENDIF
27726C
27727        ICNT=0
27728        IFLAG1=0
27729        DO2120I=ISTRT,N
27730          IF(Y1(I).EQ.HOLD)THEN
27731            IF(IFLAG1.EQ.0)THEN
27732              IFRST=I
27733              IFLAG1=1
27734            ENDIF
27735            ILAST=I
27736            ICNT=ICNT+1
27737            TEMP1(ICNT)=Y2(I)
27738            TEMP2(ICNT)=Y3(I)
27739          ENDIF
27740 2120   CONTINUE
27741        ISTRT=ILAST+1
27742        CALL SORT2(TEMP1,TEMP2,ICNT,IWRITE,TEMP3,TEMP4,TEMP5,XIDTE2,
27743     1             ISORDI,ISUBRO,IBUGA3,IERROR)
27744        IF(ISORDI.EQ.'DESC')THEN
27745          ICNT2=0
27746          DO2130J=ICNT,1,-1
27747            ICNT2=ICNT2+1
27748            Y2(IFRST+J-1)=TEMP3(ICNT2)
27749            Y3(IFRST+J-1)=TEMP4(ICNT2)
27750 2130     CONTINUE
27751        ELSE
27752          DO2160J=1,ICNT
27753            Y2(IFRST+J-1)=TEMP3(J)
27754            Y3(IFRST+J-1)=TEMP4(J)
27755 2160     CONTINUE
27756        ENDIF
27757 2110 CONTINUE
27758C
27759C               *****************
27760C               **  STEP 90--  **
27761C               **  EXIT.      **
27762C               *****************
27763C
27764 9000 CONTINUE
27765C
27766      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
27767        WRITE(ICOUT,999)
27768        CALL DPWRST('XXX','BUG ')
27769        WRITE(ICOUT,9011)
27770 9011   FORMAT('***** AT THE END       OF SORT3--')
27771        CALL DPWRST('XXX','BUG ')
27772        DO9015I=1,N
27773          WRITE(ICOUT,9016)I,X1(I),X2(I),X3(I),Y1(I),Y2(I),Y3(I)
27774 9016     FORMAT('I,X1(I),X2(I),X3(I),Y1(I),Y2(I),Y3(I) = ',
27775     1           I8,6G15.7)
27776          CALL DPWRST('XXX','BUG ')
27777 9015   CONTINUE
27778      ENDIF
27779C
27780      RETURN
27781      END
27782      SUBROUTINE SORT4(X1,X2,X3,X4,N,IWRITE,Y1,Y2,Y3,Y4,
27783     1                 TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,
27784     1                 XTEMP1,XTEMP2,XTEMP3,XTEMP4,XTEMP5,
27785     1                 XIDTEM,XIDTE2,XIDTE3,
27786     1                 ISORDI,ISUBRO,IBUGA3,IERROR)
27787C
27788C     PURPOSE--THIS SUBROUTINE SORTS BASED ON THREE VARIABLES
27789C     INPUT  ARGUMENTS--X1     = THE SINGLE PRECISION VECTOR CONTAINING
27790C                                THE FIRST RESPONSE VARIABLE TO BE
27791C                                SORTED.
27792C                     --X2     = THE SINGLE PRECISION VECTOR CONTAINING
27793C                                THE SECOND RESPONSE VARIABLE TO BE
27794C                                SORTED.
27795C                     --X3     = THE SINGLE PRECISION VECTOR CONTAINING
27796C                                THE THIRD RESPONSE VARIABLE TO BE
27797C                                SORTED.
27798C                     --X4     = THE SINGLE PRECISION VECTOR CONTAINING
27799C                                THE FOURTH RESPONSE VARIABLE TO BE
27800C                                SORTED.
27801C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27802C                                IN THE VECTOR X.
27803C                     --ISORDI = CHARACTER VARIABLE THAT SPECIFIES
27804C                                WHETHER SORT IS ASCENDING OR
27805C                                DESCENDING.
27806C     OUTPUT ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR
27807C                                CONTAINING THE SORTED VALUES OF
27808C                                THE FIRST RESPONSE VARIABLE.
27809C                     --Y2     = THE SINGLE PRECISION VECTOR
27810C                                CONTAINING THE SORTED VALUES OF
27811C                                THE SECOND RESPONSE VARIABLE.
27812C                     --Y3     = THE SINGLE PRECISION VECTOR
27813C                                CONTAINING THE SORTED VALUES OF
27814C                                THE THIRD RESPONSE VARIABLE.
27815C                     --Y4     = THE SINGLE PRECISION VECTOR
27816C                                CONTAINING THE SORTED VALUES OF
27817C                                THE FOURTH RESPONSE VARIABLE.
27818C     OUTPUT--THE SINGLE PRECISION VECTORS Y1, Y2, Y3 AND Y4
27819C             CONTAINING THE SORTED VECTORS.
27820C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
27821C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, SORTI.
27822C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27823C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
27824C     LANGUAGE--ANSI FORTRAN (1977)
27825C     WRITTEN BY--JAMES J. FILLIBEN
27826C                 STATISTICAL ENGINEERING DIVISION
27827C                 INFORMATION TECHNOLOGY LABORATORY
27828C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
27829C                 GAITHERSBURG, MD 20899-8980
27830C                 PHONE--301-975-2855
27831C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27832C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
27833C     LANGUAGE--ANSI FORTRAN (1977)
27834C     VERSION NUMBER--2008.10
27835C     ORIGINAL VERSION--OCTOBER   2008.
27836C
27837C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27838C
27839      CHARACTER*4 IWRITE
27840      CHARACTER*4 ISORDI
27841      CHARACTER*4 ISUBRO
27842      CHARACTER*4 IBUGA3
27843      CHARACTER*4 IERROR
27844C
27845      CHARACTER*4 ISUBN1
27846      CHARACTER*4 ISUBN2
27847C
27848C---------------------------------------------------------------------
27849C
27850      DIMENSION Y1(*)
27851      DIMENSION Y2(*)
27852      DIMENSION Y3(*)
27853      DIMENSION Y4(*)
27854      DIMENSION X1(*)
27855      DIMENSION X2(*)
27856      DIMENSION X3(*)
27857      DIMENSION X4(*)
27858      DIMENSION TEMP1(*)
27859      DIMENSION TEMP2(*)
27860      DIMENSION TEMP3(*)
27861      DIMENSION TEMP4(*)
27862      DIMENSION TEMP5(*)
27863      DIMENSION TEMP6(*)
27864      DIMENSION XTEMP1(*)
27865      DIMENSION XTEMP2(*)
27866      DIMENSION XTEMP3(*)
27867      DIMENSION XTEMP4(*)
27868      DIMENSION XTEMP5(*)
27869      DIMENSION XIDTEM(*)
27870      DIMENSION XIDTE2(*)
27871      DIMENSION XIDTE3(*)
27872C
27873C-----COMMON----------------------------------------------------------
27874C
27875      INCLUDE 'DPCOP2.INC'
27876C
27877C-----START POINT-----------------------------------------------------
27878C
27879      ISUBN1='SORT'
27880      ISUBN2='4   '
27881      IERROR='NO'
27882C
27883      IFRST=0
27884      ISTRT=0
27885      ILAST=0
27886C
27887      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT4')THEN
27888        WRITE(ICOUT,999)
27889  999   FORMAT(1X)
27890        CALL DPWRST('XXX','BUG ')
27891        WRITE(ICOUT,51)
27892   51   FORMAT('***** AT THE BEGINNING OF SORT3--')
27893        CALL DPWRST('XXX','BUG ')
27894        WRITE(ICOUT,52)IBUGA3,ISORDI,N
27895   52   FORMAT('IBUGA3,ISORDI,N = ',2(A4,2X),I8)
27896        CALL DPWRST('XXX','BUG ')
27897        DO55I=1,N
27898          WRITE(ICOUT,56)I,X1(I),X2(I),X3(I),X4(I)
27899   56     FORMAT('I,X1(I),X2(I),X3(I),X4(I) = ',I8,4G15.7)
27900          CALL DPWRST('XXX','BUG ')
27901   55   CONTINUE
27902      ENDIF
27903C
27904C    ********************************************
27905C    **  STEP 1--                              **
27906C    **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27907C    ********************************************
27908C
27909      AN=N
27910C
27911      IF(N.LT.1)THEN
27912        IERROR='YES'
27913        WRITE(ICOUT,999)
27914        CALL DPWRST('XXX','BUG ')
27915        WRITE(ICOUT,111)
27916  111   FORMAT('***** ERROR IN SORT3--')
27917        CALL DPWRST('XXX','BUG ')
27918        WRITE(ICOUT,113)
27919  113   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',
27920     1         'NON-POSITIVE.')
27921        CALL DPWRST('XXX','BUG ')
27922        WRITE(ICOUT,115)N
27923  115   FORMAT('      THE NUMBER OF RESPONSE VALUES IS ',I8)
27924        CALL DPWRST('XXX','BUG ')
27925        GOTO9000
27926      ENDIF
27927C
27928      IF(N.EQ.1)THEN
27929        Y1(1)=X1(1)
27930        Y2(1)=X2(1)
27931        Y3(1)=X3(1)
27932        Y4(1)=X4(1)
27933        GOTO9000
27934      ENDIF
27935C
27936C     ***************************************************
27937C     **  STEP 2--                                     **
27938C     **  SORT FIRST VARIABLE AND CARRY THE SECOND     **
27939C     **  AND THIRD VARIABLES.                         **
27940C     ***************************************************
27941C
27942      CALL SORTI(X1,N,Y1,TEMP1)
27943C
27944      IF(ISORDI.EQ.'DESC')THEN
27945        DO1010I=1,N
27946          Y2(I)=Y1(I)
27947 1010   CONTINUE
27948        DO1020I=1,N
27949          II=N-I+1
27950          Y1(I)=Y2(II)
27951 1020   CONTINUE
27952      ENDIF
27953C
27954      DO1030I=1,N
27955        J=INT(TEMP1(I)+0.5)
27956        Y2(I)=X2(J)
27957        Y3(I)=X3(J)
27958        Y4(I)=X4(J)
27959 1030 CONTINUE
27960      IF(ISORDI.EQ.'DESC')THEN
27961        DO1040I=1,N
27962          TEMP1(I)=Y2(I)
27963 1040   CONTINUE
27964        DO1050I=1,N
27965          II=N-I+1
27966          Y2(I)=TEMP1(II)
27967 1050   CONTINUE
27968        DO1060I=1,N
27969          TEMP1(I)=Y3(I)
27970 1060   CONTINUE
27971        DO1070I=1,N
27972          II=N-I+1
27973          Y3(I)=TEMP1(II)
27974 1070   CONTINUE
27975        DO1080I=1,N
27976          TEMP1(I)=Y4(I)
27977 1080   CONTINUE
27978        DO1090I=1,N
27979          II=N-I+1
27980          Y4(I)=TEMP1(II)
27981 1090   CONTINUE
27982      ENDIF
27983C
27984      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
27985        WRITE(ICOUT,1091)
27986 1091   FORMAT('AFTER SORT FIRST RESPONSE VARIABLE')
27987        CALL DPWRST('XXX','BUG ')
27988        DO1099I=1,N
27989        WRITE(ICOUT,1093)I,X1(I),X2(I),X3(I),X4(I),
27990     1                   Y1(I),Y2(I),Y3(I)
27991 1093   FORMAT('I,X1(I),X2(I),X3(I),X4(I),',
27992     1         'Y1(I),Y2(I),Y3(I),Y4(I) = ',
27993     1         I8,8G15.7)
27994        CALL DPWRST('XXX','BUG ')
27995 1099   CONTINUE
27996      ENDIF
27997C
27998C     **********************************************************
27999C     **  STEP 3--                                            **
28000C     **  NOW SORT THE SECOND AND THIRD VARIABLES FOR COMMON  **
28001C     **  VALUES OF FIRST VARIABLE.                           **
28002C     **********************************************************
28003C
28004      CALL DISTIN(Y1,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
28005      IF(N.EQ.NDIST)GOTO9000
28006      IF(NDIST.EQ.1)THEN
28007        CALL SORTI(X2,N,Y2,TEMP1)
28008        IF(ISORDI.EQ.'DESC')THEN
28009          DO2010I=1,N
28010            TEMP1(I)=Y2(I)
28011 2010     CONTINUE
28012          DO2011I=1,N
28013            II=N-I+1
28014            Y2(I)=TEMP1(I)
28015 2011     CONTINUE
28016          DO2020I=1,N
28017            TEMP1(I)=Y3(I)
28018 2020     CONTINUE
28019          DO2021I=1,N
28020            II=N-I+1
28021            Y3(I)=TEMP1(I)
28022 2021     CONTINUE
28023          DO2025I=1,N
28024            TEMP1(I)=Y4(I)
28025 2025     CONTINUE
28026          DO2026I=1,N
28027            II=N-I+1
28028            Y4(I)=TEMP1(I)
28029 2026     CONTINUE
28030        ENDIF
28031        GOTO9000
28032      ENDIF
28033C
28034      CALL SORT(XIDTEM,NDIST,XIDTEM)
28035      IF(ISORDI.EQ.'DESC')THEN
28036        DO2030I=1,NDIST
28037          TEMP1(I)=XIDTEM(I)
28038 2030   CONTINUE
28039        DO2040I=1,NDIST
28040          II=NDIST-I+1
28041          XIDTEM(I)=TEMP1(II)
28042 2040   CONTINUE
28043      ENDIF
28044C
28045      ISTRT=1
28046      DO2110ISET=1,NDIST
28047        HOLD=XIDTEM(ISET)
28048C
28049        IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
28050          WRITE(ICOUT,2111)ISET,ISTRT,HOLD
28051 2111     FORMAT('AT 2110: ISET,ISTRT,HOLD = ',2I8,G15.7)
28052          CALL DPWRST('XXX','BUG ')
28053        ENDIF
28054C
28055        ICNT=0
28056        IFLAG1=0
28057        DO2120I=ISTRT,N
28058          IF(Y1(I).EQ.HOLD)THEN
28059            IF(IFLAG1.EQ.0)THEN
28060              IFRST=I
28061              IFLAG1=1
28062            ENDIF
28063            ILAST=I
28064            ICNT=ICNT+1
28065            TEMP1(ICNT)=Y2(I)
28066            TEMP2(ICNT)=Y3(I)
28067            TEMP3(ICNT)=Y4(I)
28068          ENDIF
28069 2120   CONTINUE
28070        ISTRT=ILAST+1
28071        CALL SORT3(TEMP1,TEMP2,TEMP3,ICNT,IWRITE,TEMP4,TEMP5,TEMP6,
28072     1             XTEMP1,XTEMP2,XTEMP3,XTEMP4,XTEMP5,
28073     1             XIDTE2,XIDTE3,
28074     1             ISORDI,ISUBRO,IBUGA3,IERROR)
28075        IF(ISORDI.EQ.'DESC')THEN
28076          ICNT2=0
28077          DO2130J=ICNT,1,-1
28078            ICNT2=ICNT2+1
28079            Y2(IFRST+J-1)=TEMP4(ICNT2)
28080            Y3(IFRST+J-1)=TEMP5(ICNT2)
28081            Y4(IFRST+J-1)=TEMP6(ICNT2)
28082 2130     CONTINUE
28083        ELSE
28084          DO2160J=1,ICNT
28085            Y2(IFRST+J-1)=TEMP4(J)
28086            Y3(IFRST+J-1)=TEMP5(J)
28087            Y4(IFRST+J-1)=TEMP6(J)
28088 2160     CONTINUE
28089        ENDIF
28090 2110 CONTINUE
28091C
28092C               *****************
28093C               **  STEP 90--  **
28094C               **  EXIT.      **
28095C               *****************
28096C
28097 9000 CONTINUE
28098C
28099      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'ORT3')THEN
28100        WRITE(ICOUT,999)
28101        CALL DPWRST('XXX','BUG ')
28102        WRITE(ICOUT,9011)
28103 9011   FORMAT('***** AT THE END       OF SORT3--')
28104        CALL DPWRST('XXX','BUG ')
28105        DO9015I=1,N
28106          WRITE(ICOUT,9016)I,X1(I),X2(I),X3(I),X4(I),
28107     1                     Y1(I),Y2(I),Y3(I),Y4(I)
28108 9016     FORMAT('I,X1(I),X2(I),X3(I),X4(I),',
28109     1           'Y1(I),Y2(I),Y3(I),Y4(I) = ',
28110     1           I8,8G15.7)
28111          CALL DPWRST('XXX','BUG ')
28112 9015   CONTINUE
28113      ENDIF
28114C
28115      RETURN
28116      END
28117      SUBROUTINE SORTC(X,Y,N,XS,YC)
28118C
28119C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
28120C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
28121C              PUTS THE RESULTING N SORTED VALUES INTO THE
28122C              SINGLE PRECISION VECTOR XS,
28123C              REARRANGES THE ELEMENTS OF THE VECTOR Y
28124C              (ACCORDING TO THE SORT ON X),
28125C              AND PUTS THE REARRANGED Y VALUES
28126C              INTO THE SINGLE PRECISION VECTOR YC.
28127C              THIS SUBROUTINE GIVES THE DATA ANALYST
28128C              THE ABILITY TO SORT ONE DATA VECTOR
28129C              WHILE 'CARRYING ALONG' THE ELEMENTS
28130C              OF A SECOND DATA VECTOR.
28131C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
28132C                                OBSERVATIONS TO BE SORTED.
28133C                     --Y      = THE SINGLE PRECISION VECTOR OF
28134C                                OBSERVATIONS TO BE 'CARRIED ALONG',
28135C                                THAT IS, TO BE REARRANGED ACCORDING
28136C                                TO THE SORT ON X.
28137C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
28138C                                IN THE VECTOR X.
28139C     OUTPUT ARGUMENTS--XS     = THE SINGLE PRECISION VECTOR
28140C                                INTO WHICH THE SORTED DATA VALUES
28141C                                FROM X WILL BE PLACED.
28142C                     --YC     = THE SINGLE PRECISION VECTOR
28143C                                INTO WHICH THE REARRANGED
28144C                                (ACCORDING TO THE SORT OF THE
28145C                                VECTOR X) VALUES OF THE VECTOR Y
28146C                                WILL BE PLACED.
28147C     OUTPUT--THE SINGLE PRECISION VECTOR XS
28148C             CONTAINING THE SORTED
28149C             (IN ASCENDING ORDER) VALUES
28150C             OF THE SINGLE PRECISION VECTOR X, AND
28151C             THE SINGLE PRECISION VECTOR YC
28152C             CONTAINING THE REARRANGED
28153C             (ACCORDING TO THE SORT ON X)
28154C             VALUES OF THE VECTOR Y.
28155C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
28156C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
28157C                   (DEFINED AND USED INTERNALLY WITHIN
28158C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
28159C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
28160C                   IF IL AND IU EACH HAVE DIMENSION K,
28161C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
28162C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
28163C                   OF IL AND IU HAVE BEEN SET TO 36,
28164C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
28165C                   APPROXIMATELY 137 BILLION.
28166C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
28167C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
28168C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
28169C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
28170C                   THEN THERE IS NO PRACTICAL RESTRICTION
28171C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
28172C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
28173C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
28174C                   INTO THIS SUBROUTINE.)
28175C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
28176C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28177C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
28178C     LANGUAGE--ANSI FORTRAN (1977)
28179C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
28180C              WILL BE PLACED IN THE FIRST POSITION
28181C              OF THE VECTOR XS,
28182C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
28183C              WILL BE PLACED IN THE SECOND POSITION
28184C              OF THE VECTOR XS,
28185C              ETC.
28186C     COMMENT--THE ELEMENT IN THE VECTOR Y CORRESPONDING
28187C              TO THE SMALLEST ELEMENT IN X
28188C              WILL BE PLACED IN THE FIRST POSITION
28189C              OF THE VECTOR YC,
28190C              THE ELEMENT IN THE VECTOR Y CORRESPONDING
28191C              TO THE SECOND SMALLEST ELEMENT IN X
28192C              WILL BE PLACED IN THE SECOND POSITION
28193C              OF THE VECTOR YC,
28194C              ETC.
28195C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
28196C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
28197C              THIS IS DONE BY HAVING THE SAME
28198C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
28199C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
28200C              CALL SORTC(X,Y,N,X,YC)
28201C              IS ALLOWABLE AND WILL RESULT IN
28202C              THE DESIRED 'IN-PLACE' SORT.
28203C     COMMENT--THE SORTING ALGORTHM USED HEREIN
28204C              IS THE BINARY SORT.
28205C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
28206C              FOLLOWING TIME TRIALS INDICATE.
28207C              THESE TIME TRIALS WERE CARRIED OUT ON THE
28208C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
28209C              IN AUGUST OF 1974.
28210C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
28211C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
28212C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
28213C              ALSO BEEN INCLUDED--
28214C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
28215C               NUMBERS SORTED
28216C                N = 10                 .002 SEC          .002 SEC
28217C                N = 100                .011 SEC          .045 SEC
28218C                N = 1000               .141 SEC         4.332 SEC
28219C                N = 3000               .476 SEC        37.683 SEC
28220C                N = 10000             1.887 SEC      NOT COMPUTED
28221C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
28222C                 BY RICHARD C. SINGLETON).
28223C               --CACM JANUARY 1970, PAGE 54.
28224C               --CACM OCTOBER 1970, PAGE 624.
28225C               --JACM JANUARY 1961, PAGE 41.
28226C     WRITTEN BY--JAMES J. FILLIBEN
28227C                 STATISTICAL ENGINEERING DIVISION
28228C                 INFORMATION TECHNOLOGY LABORATORY
28229C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
28230C                 GAITHERSBURG, MD 20899-8980
28231C                 PHONE--301-975-2855
28232C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28233C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
28234C     LANGUAGE--ANSI FORTRAN (1966)
28235C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
28236C                          DENOTED BY QUOTES RATHER THAN NH.
28237C     VERSION NUMBER--82.6
28238C     ORIGINAL VERSION--JUNE      1972.
28239C     UPDATED         --NOVEMBER  1975.
28240C     UPDATED         --JUNE      1981.
28241C     UPDATED         --MAY       1982.
28242C
28243C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28244C
28245C---------------------------------------------------------------------
28246C
28247      DIMENSION X(*),Y(*),XS(*),YC(*)
28248      DIMENSION IU(36),IL(36)
28249C
28250C-----COMMON----------------------------------------------------------
28251C
28252      INCLUDE 'DPCOP2.INC'
28253C
28254C-----START POINT-----------------------------------------------------
28255C
28256C     CHECK THE INPUT ARGUMENTS FOR ERRORS
28257C
28258      IF(N.LT.1)THEN
28259        WRITE(ICOUT,15)
28260   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO SORTC ',
28261     1         'IS NON-POSITIVE.')
28262        CALL DPWRST('XXX','BUG ')
28263        WRITE(ICOUT,47)N
28264   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
28265        CALL DPWRST('XXX','BUG ')
28266        GOTO9000
28267      ELSEIF(N.EQ.1)THEN
28268        XS(1)=X(1)
28269        YC(1)=Y(1)
28270        GOTO9000
28271      ENDIF
28272C
28273C     COPY THE VECTOR X INTO THE VECTOR XS AND THE VECTOR Y INTO YC
28274C
28275      DO100I=1,N
28276        XS(I)=X(I)
28277        YC(I)=Y(I)
28278  100 CONTINUE
28279C
28280C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
28281C
28282      NM1=N-1
28283      DO200I=1,NM1
28284      IP1=I+1
28285      IF(XS(I).LE.XS(IP1))GOTO200
28286      GOTO250
28287  200 CONTINUE
28288      GOTO9000
28289  250 M=1
28290      I=1
28291      J=N
28292  305 IF(I.GE.J)GOTO370
28293  310 K=I
28294      MID=(I+J)/2
28295      AMED=XS(MID)
28296      BMED=YC(MID)
28297      IF(XS(I).LE.AMED)GOTO320
28298      XS(MID)=XS(I)
28299      YC(MID)=YC(I)
28300      XS(I)=AMED
28301      YC(I)=BMED
28302      AMED=XS(MID)
28303      BMED=YC(MID)
28304  320 L=J
28305      IF(XS(J).GE.AMED)GOTO340
28306      XS(MID)=XS(J)
28307      YC(MID)=YC(J)
28308      XS(J)=AMED
28309      YC(J)=BMED
28310      AMED=XS(MID)
28311      BMED=YC(MID)
28312      IF(XS(I).LE.AMED)GOTO340
28313      XS(MID)=XS(I)
28314      YC(MID)=YC(I)
28315      XS(I)=AMED
28316      YC(I)=BMED
28317      AMED=XS(MID)
28318      BMED=YC(MID)
28319      GOTO340
28320  330 XS(L)=XS(K)
28321      YC(L)=YC(K)
28322      XS(K)=TX
28323      YC(K)=TY
28324  340 L=L-1
28325      IF(XS(L).GT.AMED)GOTO340
28326      TX=XS(L)
28327      TY=YC(L)
28328  350 K=K+1
28329      IF(XS(K).LT.AMED)GOTO350
28330      IF(K.LE.L)GOTO330
28331      LMI=L-I
28332      JMK=J-K
28333      IF(LMI.LE.JMK)GOTO360
28334      IL(M)=I
28335      IU(M)=L
28336      I=K
28337      M=M+1
28338      GOTO380
28339  360 IL(M)=K
28340      IU(M)=J
28341      J=L
28342      M=M+1
28343      GOTO380
28344  370 M=M-1
28345      IF(M.EQ.0)GOTO9000
28346      I=IL(M)
28347      J=IU(M)
28348  380 JMI=J-I
28349      IF(JMI.GE.11)GOTO310
28350      IF(I.EQ.1)GOTO305
28351      I=I-1
28352  390 I=I+1
28353      IF(I.EQ.J)GOTO370
28354      AMED=XS(I+1)
28355      BMED=YC(I+1)
28356      IF(XS(I).LE.AMED)GOTO390
28357      K=I
28358  395 XS(K+1)=XS(K)
28359      YC(K+1)=YC(K)
28360      K=K-1
28361      IF(AMED.LT.XS(K))GOTO395
28362      XS(K+1)=AMED
28363      YC(K+1)=BMED
28364      GOTO390
28365C
28366 9000 CONTINUE
28367      RETURN
28368      END
28369      SUBROUTINE SORTC3(X,Y,N,XS,YC)
28370C
28371C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
28372C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
28373C              PUTS THE RESULTING N SORTED VALUES INTO THE
28374C              SINGLE PRECISION VECTOR XS,
28375C              REARRANGES THE ELEMENTS OF THE VECTOR Y
28376C              (ACCORDING TO THE SORT ON X),
28377C              AND PUTS THE REARRANGED Y VALUES
28378C              INTO THE SINGLE PRECISION VECTOR YC.
28379C              THIS SUBROUTINE GIVES THE DATA ANALYST
28380C              THE ABILITY TO SORT ONE DATA VECTOR
28381C              WHILE 'CARRYING ALONG' THE ELEMENTS
28382C              OF A SECOND DATA VECTOR.
28383C
28384C              NOTE: THIS IS A COPY OF SORTC WHERE THE Y AND
28385C                    YC ARRAYS ARE INTEGER RATHER THAN REAL.
28386C                    USE THIS TO AVOID WARNING MESSAGES ON THE
28387C                    COMPILE.
28388C
28389C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
28390C                                OBSERVATIONS TO BE SORTED.
28391C                     --Y      = THE SINGLE PRECISION VECTOR OF
28392C                                OBSERVATIONS TO BE 'CARRIED ALONG',
28393C                                THAT IS, TO BE REARRANGED ACCORDING
28394C                                TO THE SORT ON X.
28395C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
28396C                                IN THE VECTOR X.
28397C     OUTPUT ARGUMENTS--XS     = THE SINGLE PRECISION VECTOR
28398C                                INTO WHICH THE SORTED DATA VALUES
28399C                                FROM X WILL BE PLACED.
28400C                     --YC     = THE SINGLE PRECISION VECTOR
28401C                                INTO WHICH THE REARRANGED
28402C                                (ACCORDING TO THE SORT OF THE
28403C                                VECTOR X) VALUES OF THE VECTOR Y
28404C                                WILL BE PLACED.
28405C     OUTPUT--THE SINGLE PRECISION VECTOR XS
28406C             CONTAINING THE SORTED
28407C             (IN ASCENDING ORDER) VALUES
28408C             OF THE SINGLE PRECISION VECTOR X, AND
28409C             THE SINGLE PRECISION VECTOR YC
28410C             CONTAINING THE REARRANGED
28411C             (ACCORDING TO THE SORT ON X)
28412C             VALUES OF THE VECTOR Y.
28413C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
28414C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
28415C                   (DEFINED AND USED INTERNALLY WITHIN
28416C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
28417C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
28418C                   IF IL AND IU EACH HAVE DIMENSION K,
28419C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
28420C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
28421C                   OF IL AND IU HAVE BEEN SET TO 36,
28422C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
28423C                   APPROXIMATELY 137 BILLION.
28424C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
28425C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
28426C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
28427C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
28428C                   THEN THERE IS NO PRACTICAL RESTRICTION
28429C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
28430C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
28431C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
28432C                   INTO THIS SUBROUTINE.)
28433C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
28434C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28435C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
28436C     LANGUAGE--ANSI FORTRAN (1977)
28437C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
28438C              WILL BE PLACED IN THE FIRST POSITION
28439C              OF THE VECTOR XS,
28440C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
28441C              WILL BE PLACED IN THE SECOND POSITION
28442C              OF THE VECTOR XS,
28443C              ETC.
28444C     COMMENT--THE ELEMENT IN THE VECTOR Y CORRESPONDING
28445C              TO THE SMALLEST ELEMENT IN X
28446C              WILL BE PLACED IN THE FIRST POSITION
28447C              OF THE VECTOR YC,
28448C              THE ELEMENT IN THE VECTOR Y CORRESPONDING
28449C              TO THE SECOND SMALLEST ELEMENT IN X
28450C              WILL BE PLACED IN THE SECOND POSITION
28451C              OF THE VECTOR YC,
28452C              ETC.
28453C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
28454C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
28455C              THIS IS DONE BY HAVING THE SAME
28456C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
28457C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
28458C              CALL SORTC(X,Y,N,X,YC)
28459C              IS ALLOWABLE AND WILL RESULT IN
28460C              THE DESIRED 'IN-PLACE' SORT.
28461C     COMMENT--THE SORTING ALGORTHM USED HEREIN
28462C              IS THE BINARY SORT.
28463C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
28464C              FOLLOWING TIME TRIALS INDICATE.
28465C              THESE TIME TRIALS WERE CARRIED OUT ON THE
28466C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
28467C              IN AUGUST OF 1974.
28468C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
28469C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
28470C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
28471C              ALSO BEEN INCLUDED--
28472C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
28473C               NUMBERS SORTED
28474C                N = 10                 .002 SEC          .002 SEC
28475C                N = 100                .011 SEC          .045 SEC
28476C                N = 1000               .141 SEC         4.332 SEC
28477C                N = 3000               .476 SEC        37.683 SEC
28478C                N = 10000             1.887 SEC      NOT COMPUTED
28479C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
28480C                 BY RICHARD C. SINGLETON).
28481C               --CACM JANUARY 1970, PAGE 54.
28482C               --CACM OCTOBER 1970, PAGE 624.
28483C               --JACM JANUARY 1961, PAGE 41.
28484C     WRITTEN BY--JAMES J. FILLIBEN
28485C                 STATISTICAL ENGINEERING DIVISION
28486C                 INFORMATION TECHNOLOGY LABORATORY
28487C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
28488C                 GAITHERSBURG, MD 20899-8980
28489C                 PHONE--301-975-2855
28490C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28491C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
28492C     LANGUAGE--ANSI FORTRAN (1966)
28493C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
28494C                          DENOTED BY QUOTES RATHER THAN NH.
28495C     VERSION NUMBER--82.6
28496C     ORIGINAL VERSION--JUNE      1972.
28497C     UPDATED         --NOVEMBER  1975.
28498C     UPDATED         --JUNE      1981.
28499C     UPDATED         --MAY       1982.
28500C
28501C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28502C
28503C---------------------------------------------------------------------
28504C
28505      REAL X(*),XS(*)
28506      INTEGER Y(*),YC(*)
28507      INTEGER BMED
28508      INTEGER TY
28509      DIMENSION IU(36),IL(36)
28510C
28511C-----COMMON----------------------------------------------------------
28512C
28513      INCLUDE 'DPCOP2.INC'
28514C
28515C-----START POINT-----------------------------------------------------
28516C
28517C     CHECK THE INPUT ARGUMENTS FOR ERRORS
28518C
28519      IF(N.LT.1)THEN
28520        WRITE(ICOUT,15)
28521   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO SORTC ',
28522     1         'IS NON-POSITIVE.')
28523        CALL DPWRST('XXX','BUG ')
28524        WRITE(ICOUT,47)N
28525   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
28526        CALL DPWRST('XXX','BUG ')
28527        GOTO9000
28528      ELSEIF(N.EQ.1)THEN
28529        XS(1)=X(1)
28530        YC(1)=Y(1)
28531        GOTO9000
28532      ENDIF
28533C
28534      HOLD=X(1)
28535      DO60I=2,N
28536        IF(X(I).NE.HOLD)GOTO90
28537   60 CONTINUE
28538      DO61I=1,N
28539        XS(I)=X(I)
28540        YC(I)=Y(I)
28541   61 CONTINUE
28542      GOTO9000
28543C
28544   90 CONTINUE
28545C
28546C     COPY THE VECTOR X INTO THE VECTOR XS AND THE VECTOR Y INTO YS
28547C
28548      DO100I=1,N
28549        XS(I)=X(I)
28550        YC(I)=Y(I)
28551  100 CONTINUE
28552C
28553C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
28554C
28555      NM1=N-1
28556      DO200I=1,NM1
28557      IP1=I+1
28558      IF(XS(I).LE.XS(IP1))GOTO200
28559      GOTO250
28560  200 CONTINUE
28561      GOTO9000
28562  250 M=1
28563      I=1
28564      J=N
28565  305 IF(I.GE.J)GOTO370
28566  310 K=I
28567      MID=(I+J)/2
28568      AMED=XS(MID)
28569      BMED=YC(MID)
28570      IF(XS(I).LE.AMED)GOTO320
28571      XS(MID)=XS(I)
28572      YC(MID)=YC(I)
28573      XS(I)=AMED
28574      YC(I)=BMED
28575      AMED=XS(MID)
28576      BMED=YC(MID)
28577  320 L=J
28578      IF(XS(J).GE.AMED)GOTO340
28579      XS(MID)=XS(J)
28580      YC(MID)=YC(J)
28581      XS(J)=AMED
28582      YC(J)=BMED
28583      AMED=XS(MID)
28584      BMED=YC(MID)
28585      IF(XS(I).LE.AMED)GOTO340
28586      XS(MID)=XS(I)
28587      YC(MID)=YC(I)
28588      XS(I)=AMED
28589      YC(I)=BMED
28590      AMED=XS(MID)
28591      BMED=YC(MID)
28592      GOTO340
28593  330 XS(L)=XS(K)
28594      YC(L)=YC(K)
28595      XS(K)=TX
28596      YC(K)=TY
28597  340 L=L-1
28598      IF(XS(L).GT.AMED)GOTO340
28599      TX=XS(L)
28600      TY=YC(L)
28601  350 K=K+1
28602      IF(XS(K).LT.AMED)GOTO350
28603      IF(K.LE.L)GOTO330
28604      LMI=L-I
28605      JMK=J-K
28606      IF(LMI.LE.JMK)GOTO360
28607      IL(M)=I
28608      IU(M)=L
28609      I=K
28610      M=M+1
28611      GOTO380
28612  360 IL(M)=K
28613      IU(M)=J
28614      J=L
28615      M=M+1
28616      GOTO380
28617  370 M=M-1
28618      IF(M.EQ.0)GOTO9000
28619      I=IL(M)
28620      J=IU(M)
28621  380 JMI=J-I
28622      IF(JMI.GE.11)GOTO310
28623      IF(I.EQ.1)GOTO305
28624      I=I-1
28625  390 I=I+1
28626      IF(I.EQ.J)GOTO370
28627      AMED=XS(I+1)
28628      BMED=YC(I+1)
28629      IF(XS(I).LE.AMED)GOTO390
28630      K=I
28631  395 XS(K+1)=XS(K)
28632      YC(K+1)=YC(K)
28633      K=K-1
28634      IF(AMED.LT.XS(K))GOTO395
28635      XS(K+1)=AMED
28636      YC(K+1)=BMED
28637      GOTO390
28638C
28639 9000 CONTINUE
28640      RETURN
28641      END
28642      SUBROUTINE SORTC4(X,Y,N,XS,YC)
28643C
28644C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
28645C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
28646C              PUTS THE RESULTING N SORTED VALUES INTO THE
28647C              SINGLE PRECISION VECTOR XS,
28648C              REARRANGES THE ELEMENTS OF THE VECTOR Y
28649C              (ACCORDING TO THE SORT ON X),
28650C              AND PUTS THE REARRANGED Y VALUES
28651C              INTO THE SINGLE PRECISION VECTOR YC.
28652C              THIS SUBROUTINE GIVES THE DATA ANALYST
28653C              THE ABILITY TO SORT ONE DATA VECTOR
28654C              WHILE 'CARRYING ALONG' THE ELEMENTS
28655C              OF A SECOND DATA VECTOR.
28656C
28657C              NOTE: THIS IS A COPY OF SORTC WHERE THE X, Y, XS, AND
28658C                    YC ARRAYS ARE INTEGER RATHER THAN REAL.
28659C                    USE THIS TO AVOID WARNING MESSAGES ON THE
28660C                    COMPILE.
28661C
28662C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
28663C                                OBSERVATIONS TO BE SORTED.
28664C                     --Y      = THE SINGLE PRECISION VECTOR OF
28665C                                OBSERVATIONS TO BE 'CARRIED ALONG',
28666C                                THAT IS, TO BE REARRANGED ACCORDING
28667C                                TO THE SORT ON X.
28668C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
28669C                                IN THE VECTOR X.
28670C     OUTPUT ARGUMENTS--XS     = THE SINGLE PRECISION VECTOR
28671C                                INTO WHICH THE SORTED DATA VALUES
28672C                                FROM X WILL BE PLACED.
28673C                     --YC     = THE SINGLE PRECISION VECTOR
28674C                                INTO WHICH THE REARRANGED
28675C                                (ACCORDING TO THE SORT OF THE
28676C                                VECTOR X) VALUES OF THE VECTOR Y
28677C                                WILL BE PLACED.
28678C     OUTPUT--THE SINGLE PRECISION VECTOR XS
28679C             CONTAINING THE SORTED
28680C             (IN ASCENDING ORDER) VALUES
28681C             OF THE SINGLE PRECISION VECTOR X, AND
28682C             THE SINGLE PRECISION VECTOR YC
28683C             CONTAINING THE REARRANGED
28684C             (ACCORDING TO THE SORT ON X)
28685C             VALUES OF THE VECTOR Y.
28686C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
28687C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
28688C                   (DEFINED AND USED INTERNALLY WITHIN
28689C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
28690C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
28691C                   IF IL AND IU EACH HAVE DIMENSION K,
28692C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
28693C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
28694C                   OF IL AND IU HAVE BEEN SET TO 36,
28695C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
28696C                   APPROXIMATELY 137 BILLION.
28697C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
28698C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
28699C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
28700C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
28701C                   THEN THERE IS NO PRACTICAL RESTRICTION
28702C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
28703C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
28704C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
28705C                   INTO THIS SUBROUTINE.)
28706C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
28707C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28708C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
28709C     LANGUAGE--ANSI FORTRAN (1977)
28710C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
28711C              WILL BE PLACED IN THE FIRST POSITION
28712C              OF THE VECTOR XS,
28713C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
28714C              WILL BE PLACED IN THE SECOND POSITION
28715C              OF THE VECTOR XS,
28716C              ETC.
28717C     COMMENT--THE ELEMENT IN THE VECTOR Y CORRESPONDING
28718C              TO THE SMALLEST ELEMENT IN X
28719C              WILL BE PLACED IN THE FIRST POSITION
28720C              OF THE VECTOR YC,
28721C              THE ELEMENT IN THE VECTOR Y CORRESPONDING
28722C              TO THE SECOND SMALLEST ELEMENT IN X
28723C              WILL BE PLACED IN THE SECOND POSITION
28724C              OF THE VECTOR YC,
28725C              ETC.
28726C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
28727C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
28728C              THIS IS DONE BY HAVING THE SAME
28729C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
28730C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
28731C              CALL SORTC(X,Y,N,X,YC)
28732C              IS ALLOWABLE AND WILL RESULT IN
28733C              THE DESIRED 'IN-PLACE' SORT.
28734C     COMMENT--THE SORTING ALGORTHM USED HEREIN
28735C              IS THE BINARY SORT.
28736C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
28737C              FOLLOWING TIME TRIALS INDICATE.
28738C              THESE TIME TRIALS WERE CARRIED OUT ON THE
28739C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
28740C              IN AUGUST OF 1974.
28741C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
28742C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
28743C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
28744C              ALSO BEEN INCLUDED--
28745C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
28746C               NUMBERS SORTED
28747C                N = 10                 .002 SEC          .002 SEC
28748C                N = 100                .011 SEC          .045 SEC
28749C                N = 1000               .141 SEC         4.332 SEC
28750C                N = 3000               .476 SEC        37.683 SEC
28751C                N = 10000             1.887 SEC      NOT COMPUTED
28752C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
28753C                 BY RICHARD C. SINGLETON).
28754C               --CACM JANUARY 1970, PAGE 54.
28755C               --CACM OCTOBER 1970, PAGE 624.
28756C               --JACM JANUARY 1961, PAGE 41.
28757C     WRITTEN BY--JAMES J. FILLIBEN
28758C                 STATISTICAL ENGINEERING DIVISION
28759C                 INFORMATION TECHNOLOGY LABORATORY
28760C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
28761C                 GAITHERSBURG, MD 20899-8980
28762C                 PHONE--301-975-2855
28763C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28764C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
28765C     LANGUAGE--ANSI FORTRAN (1966)
28766C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
28767C                          DENOTED BY QUOTES RATHER THAN NH.
28768C     VERSION NUMBER--82.6
28769C     ORIGINAL VERSION--JUNE      1972.
28770C     UPDATED         --NOVEMBER  1975.
28771C     UPDATED         --JUNE      1981.
28772C     UPDATED         --MAY       1982.
28773C
28774C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28775C
28776C---------------------------------------------------------------------
28777C
28778      INTEGER X(*),XS(*)
28779      INTEGER Y(*),YC(*)
28780      INTEGER BMED
28781      INTEGER AMED
28782      INTEGER HOLD
28783      INTEGER TX
28784      INTEGER TY
28785      DIMENSION IU(36),IL(36)
28786C
28787C-----COMMON----------------------------------------------------------
28788C
28789      INCLUDE 'DPCOP2.INC'
28790C
28791C-----START POINT-----------------------------------------------------
28792C
28793C     CHECK THE INPUT ARGUMENTS FOR ERRORS
28794C
28795      IF(N.LT.1)THEN
28796        WRITE(ICOUT,15)
28797   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO ',
28798     1         'SORTC IS NON-POSITIVE.')
28799        CALL DPWRST('XXX','BUG ')
28800        WRITE(ICOUT,47)N
28801   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
28802        CALL DPWRST('XXX','BUG ')
28803        RETURN
28804      ELSEIF(N.EQ.1)THEN
28805CCCCC   WRITE(ICOUT,18)
28806CCC18   FORMAT('***** WARNING--THE THIRD ARGUMENT ',
28807CCCCC1         'TO SORTC HAS THE VALUE 1')
28808CCCCC   CALL DPWRST('XXX','BUG ')
28809        XS(1)=X(1)
28810        YC(1)=Y(1)
28811        RETURN
28812      ENDIF
28813C
28814      HOLD=X(1)
28815      DO60I=2,N
28816        IF(X(I).NE.HOLD)GOTO90
28817   60 CONTINUE
28818CCCCC WRITE(ICOUT, 9)HOLD
28819CCCC9 FORMAT('***** WARNING--THE FIRST ARGUMENT ',
28820CCCCC1       '(A VECTOR) TO SORTC HAS ALL ELEMENTS = ',G15.7)
28821CCCCC CALL DPWRST('XXX','BUG ')
28822      DO61I=1,N
28823        XS(I)=X(I)
28824        YC(I)=Y(I)
28825   61 CONTINUE
28826      RETURN
28827C
28828   90 CONTINUE
28829C     COPY THE VECTOR X INTO THE VECTOR XS
28830      DO100I=1,N
28831      XS(I)=X(I)
28832  100 CONTINUE
28833C
28834C     COPY THE VECTOR Y INTO THE VECTOR YS
28835C
28836      DO150I=1,N
28837      YC(I)=Y(I)
28838  150 CONTINUE
28839C
28840C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
28841C
28842      NM1=N-1
28843      DO200I=1,NM1
28844      IP1=I+1
28845      IF(XS(I).LE.XS(IP1))GOTO200
28846      GOTO250
28847  200 CONTINUE
28848      RETURN
28849  250 M=1
28850      I=1
28851      J=N
28852  305 IF(I.GE.J)GOTO370
28853  310 K=I
28854      MID=(I+J)/2
28855      AMED=XS(MID)
28856      BMED=YC(MID)
28857      IF(XS(I).LE.AMED)GOTO320
28858      XS(MID)=XS(I)
28859      YC(MID)=YC(I)
28860      XS(I)=AMED
28861      YC(I)=BMED
28862      AMED=XS(MID)
28863      BMED=YC(MID)
28864  320 L=J
28865      IF(XS(J).GE.AMED)GOTO340
28866      XS(MID)=XS(J)
28867      YC(MID)=YC(J)
28868      XS(J)=AMED
28869      YC(J)=BMED
28870      AMED=XS(MID)
28871      BMED=YC(MID)
28872      IF(XS(I).LE.AMED)GOTO340
28873      XS(MID)=XS(I)
28874      YC(MID)=YC(I)
28875      XS(I)=AMED
28876      YC(I)=BMED
28877      AMED=XS(MID)
28878      BMED=YC(MID)
28879      GOTO340
28880  330 XS(L)=XS(K)
28881      YC(L)=YC(K)
28882      XS(K)=TX
28883      YC(K)=TY
28884  340 L=L-1
28885      IF(XS(L).GT.AMED)GOTO340
28886      TX=XS(L)
28887      TY=YC(L)
28888  350 K=K+1
28889      IF(XS(K).LT.AMED)GOTO350
28890      IF(K.LE.L)GOTO330
28891      LMI=L-I
28892      JMK=J-K
28893      IF(LMI.LE.JMK)GOTO360
28894      IL(M)=I
28895      IU(M)=L
28896      I=K
28897      M=M+1
28898      GOTO380
28899  360 IL(M)=K
28900      IU(M)=J
28901      J=L
28902      M=M+1
28903      GOTO380
28904  370 M=M-1
28905      IF(M.EQ.0)RETURN
28906      I=IL(M)
28907      J=IU(M)
28908  380 JMI=J-I
28909      IF(JMI.GE.11)GOTO310
28910      IF(I.EQ.1)GOTO305
28911      I=I-1
28912  390 I=I+1
28913      IF(I.EQ.J)GOTO370
28914      AMED=XS(I+1)
28915      BMED=YC(I+1)
28916      IF(XS(I).LE.AMED)GOTO390
28917      K=I
28918  395 XS(K+1)=XS(K)
28919      YC(K+1)=YC(K)
28920      K=K-1
28921      IF(AMED.LT.XS(K))GOTO395
28922      XS(K+1)=AMED
28923      YC(K+1)=BMED
28924      GOTO390
28925      END
28926      SUBROUTINE SORTC5(X,Y,N,XS,YC)
28927C
28928C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
28929C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
28930C              PUTS THE RESULTING N SORTED VALUES INTO THE
28931C              SINGLE PRECISION VECTOR XS,
28932C              REARRANGES THE ELEMENTS OF THE VECTOR Y
28933C              (ACCORDING TO THE SORT ON X),
28934C              AND PUTS THE REARRANGED Y VALUES
28935C              INTO THE SINGLE PRECISION VECTOR YC.
28936C              THIS SUBROUTINE GIVES THE DATA ANALYST
28937C              THE ABILITY TO SORT ONE DATA VECTOR
28938C              WHILE 'CARRYING ALONG' THE ELEMENTS
28939C              OF A SECOND DATA VECTOR.
28940C
28941C              NOTE: THIS IS A COPY OF SORTC WHERE THE X AND
28942C                    XS ARRAYS ARE INTEGER RATHER THAN REAL.
28943C                    USE THIS TO AVOID WARNING MESSAGES ON THE
28944C                    COMPILE.
28945C
28946C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
28947C                                OBSERVATIONS TO BE SORTED.
28948C                     --Y      = THE SINGLE PRECISION VECTOR OF
28949C                                OBSERVATIONS TO BE 'CARRIED ALONG',
28950C                                THAT IS, TO BE REARRANGED ACCORDING
28951C                                TO THE SORT ON X.
28952C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
28953C                                IN THE VECTOR X.
28954C     OUTPUT ARGUMENTS--XS     = THE SINGLE PRECISION VECTOR
28955C                                INTO WHICH THE SORTED DATA VALUES
28956C                                FROM X WILL BE PLACED.
28957C                     --YC     = THE SINGLE PRECISION VECTOR
28958C                                INTO WHICH THE REARRANGED
28959C                                (ACCORDING TO THE SORT OF THE
28960C                                VECTOR X) VALUES OF THE VECTOR Y
28961C                                WILL BE PLACED.
28962C     OUTPUT--THE SINGLE PRECISION VECTOR XS
28963C             CONTAINING THE SORTED
28964C             (IN ASCENDING ORDER) VALUES
28965C             OF THE SINGLE PRECISION VECTOR X, AND
28966C             THE SINGLE PRECISION VECTOR YC
28967C             CONTAINING THE REARRANGED
28968C             (ACCORDING TO THE SORT ON X)
28969C             VALUES OF THE VECTOR Y.
28970C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
28971C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
28972C                   (DEFINED AND USED INTERNALLY WITHIN
28973C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
28974C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
28975C                   IF IL AND IU EACH HAVE DIMENSION K,
28976C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
28977C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
28978C                   OF IL AND IU HAVE BEEN SET TO 36,
28979C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
28980C                   APPROXIMATELY 137 BILLION.
28981C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
28982C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
28983C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
28984C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
28985C                   THEN THERE IS NO PRACTICAL RESTRICTION
28986C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
28987C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
28988C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
28989C                   INTO THIS SUBROUTINE.)
28990C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
28991C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28992C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
28993C     LANGUAGE--ANSI FORTRAN (1977)
28994C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
28995C              WILL BE PLACED IN THE FIRST POSITION
28996C              OF THE VECTOR XS,
28997C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
28998C              WILL BE PLACED IN THE SECOND POSITION
28999C              OF THE VECTOR XS,
29000C              ETC.
29001C     COMMENT--THE ELEMENT IN THE VECTOR Y CORRESPONDING
29002C              TO THE SMALLEST ELEMENT IN X
29003C              WILL BE PLACED IN THE FIRST POSITION
29004C              OF THE VECTOR YC,
29005C              THE ELEMENT IN THE VECTOR Y CORRESPONDING
29006C              TO THE SECOND SMALLEST ELEMENT IN X
29007C              WILL BE PLACED IN THE SECOND POSITION
29008C              OF THE VECTOR YC,
29009C              ETC.
29010C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
29011C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
29012C              THIS IS DONE BY HAVING THE SAME
29013C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
29014C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
29015C              CALL SORTC(X,Y,N,X,YC)
29016C              IS ALLOWABLE AND WILL RESULT IN
29017C              THE DESIRED 'IN-PLACE' SORT.
29018C     COMMENT--THE SORTING ALGORTHM USED HEREIN
29019C              IS THE BINARY SORT.
29020C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
29021C              FOLLOWING TIME TRIALS INDICATE.
29022C              THESE TIME TRIALS WERE CARRIED OUT ON THE
29023C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
29024C              IN AUGUST OF 1974.
29025C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
29026C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
29027C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
29028C              ALSO BEEN INCLUDED--
29029C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
29030C               NUMBERS SORTED
29031C                N = 10                 .002 SEC          .002 SEC
29032C                N = 100                .011 SEC          .045 SEC
29033C                N = 1000               .141 SEC         4.332 SEC
29034C                N = 3000               .476 SEC        37.683 SEC
29035C                N = 10000             1.887 SEC      NOT COMPUTED
29036C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
29037C                 BY RICHARD C. SINGLETON).
29038C               --CACM JANUARY 1970, PAGE 54.
29039C               --CACM OCTOBER 1970, PAGE 624.
29040C               --JACM JANUARY 1961, PAGE 41.
29041C     WRITTEN BY--JAMES J. FILLIBEN
29042C                 STATISTICAL ENGINEERING DIVISION
29043C                 INFORMATION TECHNOLOGY LABORATORY
29044C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
29045C                 GAITHERSBURG, MD 20899-8980
29046C                 PHONE--301-975-2855
29047C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29048C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
29049C     LANGUAGE--ANSI FORTRAN (1966)
29050C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
29051C                          DENOTED BY QUOTES RATHER THAN NH.
29052C     VERSION NUMBER--82.6
29053C     ORIGINAL VERSION--JUNE      1972.
29054C     UPDATED         --NOVEMBER  1975.
29055C     UPDATED         --JUNE      1981.
29056C     UPDATED         --MAY       1982.
29057C
29058C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29059C
29060C---------------------------------------------------------------------
29061C
29062      INTEGER X(*),XS(*)
29063      REAL Y(*),YC(*)
29064CCCCC INTEGER BMED
29065      DIMENSION IU(36),IL(36)
29066C
29067      INTEGER HOLD
29068      INTEGER AMED
29069      INTEGER TX
29070C
29071C-----COMMON----------------------------------------------------------
29072C
29073      INCLUDE 'DPCOP2.INC'
29074C
29075C-----START POINT-----------------------------------------------------
29076C
29077C     CHECK THE INPUT ARGUMENTS FOR ERRORS
29078C
29079      IF(N.LT.1)THEN
29080        WRITE(ICOUT,15)
29081   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO SORTC5 ',
29082     1         'IS NON-POSITIVE.')
29083        CALL DPWRST('XXX','BUG ')
29084        WRITE(ICOUT,47)N
29085   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
29086        CALL DPWRST('XXX','BUG ')
29087        RETURN
29088      ELSEIF(N.EQ.1)THEN
29089CCCCC   WRITE(ICOUT,18)
29090CCC18 FORMAT('***** WARNING--THE SECOND ARGUMENT ',
29091CCCCC1       'TO SORTC5 HAS THE VALUE 1.')
29092CCCCC   CALL DPWRST('XXX','BUG ')
29093        XS(1)=X(1)
29094        YC(1)=Y(1)
29095        RETURN
29096      ENDIF
29097C
29098      HOLD=X(1)
29099      DO60I=2,N
29100        IF(X(I).NE.HOLD)GOTO90
29101   60 CONTINUE
29102CCCCC WRITE(ICOUT, 9)HOLD
29103CCCC9 FORMAT('***** NON-FATAL DIAGNOSTIC--THE 1ST INPUT ARGUMENT ',
29104CCCCC1'(A VECTOR) TO THE SORTC  SUBROUTINE HAS ALL ELEMENTS = ',E15.8)
29105CCCCC CALL DPWRST('XXX','BUG ')
29106      DO61I=1,N
29107        XS(I)=X(I)
29108        YC(I)=Y(I)
29109   61 CONTINUE
29110      RETURN
29111C
29112   90 CONTINUE
29113C     COPY THE VECTOR X INTO THE VECTOR XS
29114      DO100I=1,N
29115      XS(I)=X(I)
29116  100 CONTINUE
29117C
29118C     COPY THE VECTOR Y INTO THE VECTOR YS
29119C
29120      DO150I=1,N
29121      YC(I)=Y(I)
29122  150 CONTINUE
29123C
29124C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
29125C
29126      NM1=N-1
29127      DO200I=1,NM1
29128      IP1=I+1
29129      IF(XS(I).LE.XS(IP1))GOTO200
29130      GOTO250
29131  200 CONTINUE
29132      RETURN
29133  250 M=1
29134      I=1
29135      J=N
29136  305 IF(I.GE.J)GOTO370
29137  310 K=I
29138      MID=(I+J)/2
29139      AMED=XS(MID)
29140      BMED=YC(MID)
29141      IF(XS(I).LE.AMED)GOTO320
29142      XS(MID)=XS(I)
29143      YC(MID)=YC(I)
29144      XS(I)=AMED
29145      YC(I)=BMED
29146      AMED=XS(MID)
29147      BMED=YC(MID)
29148  320 L=J
29149      IF(XS(J).GE.AMED)GOTO340
29150      XS(MID)=XS(J)
29151      YC(MID)=YC(J)
29152      XS(J)=AMED
29153      YC(J)=BMED
29154      AMED=XS(MID)
29155      BMED=YC(MID)
29156      IF(XS(I).LE.AMED)GOTO340
29157      XS(MID)=XS(I)
29158      YC(MID)=YC(I)
29159      XS(I)=AMED
29160      YC(I)=BMED
29161      AMED=XS(MID)
29162      BMED=YC(MID)
29163      GOTO340
29164  330 XS(L)=XS(K)
29165      YC(L)=YC(K)
29166      XS(K)=TX
29167      YC(K)=TY
29168  340 L=L-1
29169      IF(XS(L).GT.AMED)GOTO340
29170      TX=XS(L)
29171      TY=YC(L)
29172  350 K=K+1
29173      IF(XS(K).LT.AMED)GOTO350
29174      IF(K.LE.L)GOTO330
29175      LMI=L-I
29176      JMK=J-K
29177      IF(LMI.LE.JMK)GOTO360
29178      IL(M)=I
29179      IU(M)=L
29180      I=K
29181      M=M+1
29182      GOTO380
29183  360 IL(M)=K
29184      IU(M)=J
29185      J=L
29186      M=M+1
29187      GOTO380
29188  370 M=M-1
29189      IF(M.EQ.0)RETURN
29190      I=IL(M)
29191      J=IU(M)
29192  380 JMI=J-I
29193      IF(JMI.GE.11)GOTO310
29194      IF(I.EQ.1)GOTO305
29195      I=I-1
29196  390 I=I+1
29197      IF(I.EQ.J)GOTO370
29198      AMED=XS(I+1)
29199      BMED=YC(I+1)
29200      IF(XS(I).LE.AMED)GOTO390
29201      K=I
29202  395 XS(K+1)=XS(K)
29203      YC(K+1)=YC(K)
29204      K=K-1
29205      IF(AMED.LT.XS(K))GOTO395
29206      XS(K+1)=AMED
29207      YC(K+1)=BMED
29208      GOTO390
29209      END
29210      SUBROUTINE SORTDE(X,N,Y)
29211C
29212C     PURPOSE--THIS SUBROUTINE SORTS (IN DESCENDING ORDER)
29213C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X
29214C              AND PUTS THE RESULTING N SORTED VALUES INTO THE
29215C              SINGLE PRECISION VECTOR Y.
29216C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
29217C                                OBSERVATIONS TO BE SORTED.
29218C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
29219C                                IN THE VECTOR X.
29220C     OUTPUT ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR
29221C                                INTO WHICH THE SORTED DATA VALUES
29222C                                FROM X WILL BE PLACED.
29223C     OUTPUT--THE SINGLE PRECISION VECTOR Y
29224C             CONTAINING THE SORTED
29225C             (IN ASCENDING ORDER) VALUES
29226C             OF THE SINGLE PRECISION VECTOR X.
29227C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
29228C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
29229C                   (DEFINED AND USED INTERNALLY WITHIN
29230C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
29231C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
29232C                   IF IL AND IU EACH HAVE DIMENSION K,
29233C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
29234C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
29235C                   OF IL AND IU HAVE BEEN SET TO 36,
29236C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
29237C                   APPROXIMATELY 137 BILLION.
29238C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
29239C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
29240C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
29241C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
29242C                   THEN THERE IS NO PRACTICAL RESTRICTION
29243C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
29244C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
29245C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
29246C                   INTO THIS SUBROUTINE.)
29247C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
29248C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
29249C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
29250C     LANGUAGE--ANSI FORTRAN (1977)
29251C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
29252C              WILL BE PLACED IN THE FIRST POSITION
29253C              OF THE VECTOR Y,
29254C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
29255C              WILL BE PLACED IN THE SECOND POSITION
29256C              OF THE VECTOR Y, ETC.
29257C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
29258C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
29259C              THIS IS DONE BY HAVING THE SAME
29260C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
29261C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
29262C              CALL SORT(X,N,X)
29263C              IS ALLOWABLE AND WILL RESULT IN
29264C              THE DESIRED 'IN-PLACE' SORT.
29265C     COMMENT--THE SORTING ALGORTHM USED HEREIN
29266C              IS THE  QUICKSORT.
29267C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
29268C              FOLLOWING TIME TRIALS INDICATE.
29269C              THESE TIME TRIALS WERE CARRIED OUT ON THE
29270C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
29271C              IN AUGUST OF 1974.
29272C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
29273C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
29274C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
29275C              ALSO BEEN INCLUDED--
29276C              NUMBER OF RANDOM         QUICKSORT       BUBBLE SORT
29277C               NUMBERS SORTED
29278C                N = 10                 .002 SEC          .002 SEC
29279C                N = 100                .011 SEC          .045 SEC
29280C                N = 1000               .141 SEC         4.332 SEC
29281C                N = 3000               .476 SEC        37.683 SEC
29282C                N = 10000             1.887 SEC      NOT COMPUTED
29283C     REFERENCES--CACM MARCH 1969, PAGE 186 ( QUICKSORT ALGORITHM
29284C                 BY RICHARD C. SINGLETON).
29285C               --CACM JANUARY 1970, PAGE 54.
29286C               --CACM OCTOBER 1970, PAGE 624.
29287C               --JACM JANUARY 1961, PAGE 41.
29288C     WRITTEN BY--JAMES J. FILLIBEN
29289C                 STATISTICAL ENGINEERING DIVISION
29290C                 INFORMATION TECHNOLOGY LABORATORY
29291C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
29292C                 GAITHERSBURG, MD 20899-8980
29293C                 PHONE--301-975-2855
29294C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29295C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
29296C     LANGUAGE--ANSI FORTRAN (1966)
29297C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
29298C                          DENOTED BY QUOTES RATHER THAN NH.
29299C     VERSION NUMBER--88.9
29300C     ORIGINAL VERSION--AUGUST    1988.
29301C
29302C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29303C
29304      CHARACTER*4 IBUGA3
29305      CHARACTER*4 IERROR
29306C
29307      CHARACTER*4 ISUBN1
29308      CHARACTER*4 ISUBN2
29309C
29310C---------------------------------------------------------------------
29311C
29312      DIMENSION X(*)
29313      DIMENSION Y(*)
29314C
29315      DIMENSION IU(36)
29316      DIMENSION IL(36)
29317C
29318C-----COMMON----------------------------------------------------------
29319C
29320      INCLUDE 'DPCOP2.INC'
29321C
29322C-----START POINT-----------------------------------------------------
29323C
29324      ISUBN1='SORT'
29325      ISUBN2='DE  '
29326      IERROR='NO'
29327      IBUGA3='OFF'
29328C
29329      IF(IBUGA3.EQ.'OFF')GOTO90
29330      WRITE(ICOUT,999)
29331  999 FORMAT(1X)
29332      CALL DPWRST('XXX','BUG ')
29333      WRITE(ICOUT,51)
29334   51 FORMAT('***** AT THE BEGINNING OF SORT--')
29335      CALL DPWRST('XXX','BUG ')
29336      WRITE(ICOUT,52)IBUGA3
29337   52 FORMAT('IBUGA3 = ',A4)
29338      CALL DPWRST('XXX','BUG ')
29339      WRITE(ICOUT,53)N
29340   53 FORMAT('N = ',I8)
29341      CALL DPWRST('XXX','BUG ')
29342      DO55I=1,N
29343      WRITE(ICOUT,56)I,X(I)
29344   56 FORMAT('I,X(I) = ',I8,E15.7)
29345      CALL DPWRST('XXX','BUG ')
29346   55 CONTINUE
29347   90 CONTINUE
29348C
29349C               ************************
29350C               **  SORT THE VALUES.  **
29351C               ************************
29352C
29353C               ********************************************
29354C               **  STEP 1--                              **
29355C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
29356C               ********************************************
29357C
29358      IF(N.GE.1)GOTO119
29359      IERROR='YES'
29360      WRITE(ICOUT,999)
29361      CALL DPWRST('XXX','BUG ')
29362      WRITE(ICOUT,111)
29363  111 FORMAT('***** ERROR IN SORT--',
29364     1'THE 2ND INPUT ARGUMENT (N) IS SMALLER THAN 1')
29365      CALL DPWRST('XXX','BUG ')
29366      WRITE(ICOUT,118)N
29367  118 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
29368      CALL DPWRST('XXX','BUG ')
29369      GOTO9000
29370  119 CONTINUE
29371C
29372      IF(N.EQ.1)GOTO120
29373      GOTO129
29374  120 CONTINUE
29375CCCCC WRITE(ICOUT,999)
29376CCCCC CALL DPWRST('XXX','BUG ')
29377CCCCC WRITE(ICOUT,121)
29378CC121 FORMAT('***** WARNING IN SORT--THE SECOND ',
29379CCCCC1       'ARGUMENT (N) HAS THE VALUE 1.')
29380CCCCC CALL DPWRST('XXX','BUG ')
29381      Y(1)=X(1)
29382      GOTO9000
29383  129 CONTINUE
29384C
29385      HOLD=X(1)
29386      DO135I=2,N
29387      IF(X(I).NE.HOLD)GOTO139
29388  135 CONTINUE
29389CCCCC WRITE(ICOUT,999)
29390CCCCC CALL DPWRST('XXX','BUG ')
29391CCCCC WRITE(ICOUT,136)HOLD
29392CC136 FORMAT('***** WARNING IN SORT--THE FIRST ARGUMENT ',
29393CCCCC1       '(A VECTOR) HAS ALL ELEMENTS = ',G15.7)
29394CCCCC CALL DPWRST('XXX','BUG ')
29395      DO137I=1,N
29396      Y(I)=X(I)
29397  137 CONTINUE
29398      GOTO9000
29399  139 CONTINUE
29400C
29401C               *******************************************
29402C               **  STEP 2--                             **
29403C               **  COPY THE VECTOR X INTO THE VECTOR Y  **
29404C               *******************************************
29405C
29406      DO200I=1,N
29407      Y(I)=X(I)
29408  200 CONTINUE
29409C
29410      DO210I=1,N
29411      Y(I)=(-Y(I))
29412  210 CONTINUE
29413C
29414C               **********************************************************
29415C               **  STEP 3--                                            **
29416C               **  CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED  **
29417C               **********************************************************
29418C
29419      NM1=N-1
29420      DO250I=1,NM1
29421      IP1=I+1
29422      IF(Y(I).LE.Y(IP1))GOTO250
29423      GOTO290
29424  250 CONTINUE
29425      GOTO8000
29426  290 CONTINUE
29427C
29428C               ***************************
29429C               **  STEP 4--             **
29430C               **  CARRY OUT THE SORT.  **
29431C               ***************************
29432C
29433      M=1
29434      I=1
29435      J=N
29436  305 IF(I.GE.J)GOTO370
29437  310 K=I
29438      MID=(I+J)/2
29439      AMED=Y(MID)
29440      IF(Y(I).LE.AMED)GOTO320
29441      Y(MID)=Y(I)
29442      Y(I)=AMED
29443      AMED=Y(MID)
29444  320 L=J
29445      IF(Y(J).GE.AMED)GOTO340
29446      Y(MID)=Y(J)
29447      Y(J)=AMED
29448      AMED=Y(MID)
29449      IF(Y(I).LE.AMED)GOTO340
29450      Y(MID)=Y(I)
29451      Y(I)=AMED
29452      AMED=Y(MID)
29453      GOTO340
29454  330 Y(L)=Y(K)
29455      Y(K)=TT
29456  340 L=L-1
29457      IF(Y(L).GT.AMED)GOTO340
29458      TT=Y(L)
29459  350 K=K+1
29460      IF(Y(K).LT.AMED)GOTO350
29461      IF(K.LE.L)GOTO330
29462      LMI=L-I
29463      JMK=J-K
29464      IF(LMI.LE.JMK)GOTO360
29465      IL(M)=I
29466      IU(M)=L
29467      I=K
29468      M=M+1
29469      GOTO380
29470  360 IL(M)=K
29471      IU(M)=J
29472      J=L
29473      M=M+1
29474      GOTO380
29475  370 M=M-1
29476      IF(M.EQ.0)GOTO8000
29477      I=IL(M)
29478      J=IU(M)
29479  380 JMI=J-I
29480      IF(JMI.GE.11)GOTO310
29481      IF(I.EQ.1)GOTO305
29482      I=I-1
29483  390 I=I+1
29484      IF(I.EQ.J)GOTO370
29485      AMED=Y(I+1)
29486      IF(Y(I).LE.AMED)GOTO390
29487      K=I
29488  395 Y(K+1)=Y(K)
29489      K=K-1
29490      IF(AMED.LT.Y(K))GOTO395
29491      Y(K+1)=AMED
29492      GOTO390
29493C
29494 8000 CONTINUE
29495      DO8100I=1,N
29496      Y(I)=(-Y(I))
29497 8100 CONTINUE
29498C
29499C               *****************
29500C               **  STEP 90--  **
29501C               **  EXIT.      **
29502C               *****************
29503C
29504 9000 CONTINUE
29505C
29506      IF(IBUGA3.EQ.'OFF')GOTO9090
29507      WRITE(ICOUT,999)
29508      CALL DPWRST('XXX','BUG ')
29509      WRITE(ICOUT,9011)
29510 9011 FORMAT('***** AT THE END       OF SORT--')
29511      CALL DPWRST('XXX','BUG ')
29512      WRITE(ICOUT,9012)IBUGA3,IERROR
29513 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
29514      CALL DPWRST('XXX','BUG ')
29515      WRITE(ICOUT,9013)N
29516 9013 FORMAT('N = ',I8)
29517      CALL DPWRST('XXX','BUG ')
29518      DO9015I=1,N
29519      WRITE(ICOUT,9016)I,X(I),Y(I)
29520 9016 FORMAT('I,X(I),Y(I) = ',I8,2E15.7)
29521      CALL DPWRST('XXX','BUG ')
29522 9015 CONTINUE
29523 9090 CONTINUE
29524C
29525      RETURN
29526      END
29527      SUBROUTINE SORTI(X,N,XS,AINDEX)
29528C
29529C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
29530C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
29531C              PUTS THE RESULTING N SORTED VALUES INTO THE
29532C              SINGLE PRECISION VECTOR XS, AND
29533C              REARRANGES THE ELEMENTS 1, 2, ..., N OF VECTOR AINDEX
29534C              (ACCORDING TO THE SORT ON X).
29535C              THIS SUBROUTINE GIVES THE DATA ANALYST
29536C              THE ABILITY TO SORT ONE DATA VECTOR
29537C              WHILE DETERMINING THE POSITION INDEX
29538C              AFTER-THE-FACT, SO AS TO SUBSEQUENTLY
29539C              'CARRY ALONG' THE ELEMENTS
29540C              OF MANY OTHER DATA VECTORS (DONE ELSEWHERE).
29541C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
29542C                                OBSERVATIONS TO BE SORTED.
29543C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
29544C                                IN THE VECTOR X.
29545C     OUTPUT ARGUMENTS--XS     = THE SINGLE PRECISION VECTOR
29546C                                INTO WHICH THE SORTED DATA VALUES
29547C                                FROM X WILL BE PLACED.
29548C                     --AINDEX = THE SINGLE PRECISION VECTOR
29549C                                INTO WHICH THE REARRANGED
29550C                                (ACCORDING TO THE SORT OF THE
29551C                                VECTOR X) VALUES OF 1, 2, ..., N
29552C                                WILL BE PLACED.
29553C     OUTPUT--THE SINGLE PRECISION VECTOR XS
29554C             CONTAINING THE SORTED
29555C             (IN ASCENDING ORDER) VALUES
29556C             OF THE SINGLE PRECISION VECTOR X, AND
29557C             THE SINGLE PRECISION VECTOR AINDEX
29558C             CONTAINING THE REARRANGED
29559C             (ACCORDING TO THE SORT ON X)
29560C             VALUES OF 1, 2, ..., N.
29561C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
29562C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
29563C                   (DEFINED AND USED INTERNALLY WITHIN
29564C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
29565C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
29566C                   IF IL AND IU EACH HAVE DIMENSION K,
29567C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
29568C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
29569C                   OF IL AND IU HAVE BEEN SET TO 36,
29570C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
29571C                   APPROXIMATELY 137 BILLION.
29572C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
29573C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
29574C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
29575C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
29576C                   THEN THERE IS NO PRACTICAL RESTRICTION
29577C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
29578C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
29579C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
29580C                   INTO THIS SUBROUTINE.)
29581C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
29582C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
29583C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
29584C     LANGUAGE--ANSI FORTRAN (1977)
29585C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
29586C              WILL BE PLACED IN THE FIRST POSITION
29587C              OF THE VECTOR XS,
29588C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
29589C              WILL BE PLACED IN THE SECOND POSITION
29590C              OF THE VECTOR XS,
29591C              ETC.
29592C     COMMENT--AT THE END, AINDEX(1) WILL CONTAIN TBE ORIGINAL
29593C              POSITION NUMBER WHERE THE SMALLEST VALUE OF X DID RESIDE.
29594C          AINDEX(2) WILL CONTAIN THE ORIGINAL
29595C          POSITION NUMBER WHERE THE SECOND SMALLEST VALUE OF X DID RESIDE.
29596C          AINDEX(N) WILL CONTAIN THE ORIGINAL
29597C          POSITION NUMBER WHERE THE LARGEST VALUE OF X DID RESIDE.
29598C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
29599C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
29600C              THIS IS DONE BY HAVING THE SAME
29601C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
29602C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
29603C              CALL SORTI(X,N,X,AINDEX)
29604C              IS ALLOWABLE AND WILL RESULT IN
29605C              THE DESIRED 'IN-PLACE' SORT.
29606C     COMMENT--THE SORTING ALGORTHM USED HEREIN
29607C              IS THE BINARY SORT.
29608C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
29609C              FOLLOWING TIME TRIALS INDICATE.
29610C              THESE TIME TRIALS WERE CARRIED OUT ON THE
29611C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
29612C              IN AUGUST OF 1974.
29613C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
29614C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
29615C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
29616C              ALSO BEEN INCLUDED--
29617C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
29618C               NUMBERS SORTED
29619C                N = 10                 .002 SEC          .002 SEC
29620C                N = 100                .011 SEC          .045 SEC
29621C                N = 1000               .141 SEC         4.332 SEC
29622C                N = 3000               .476 SEC        37.683 SEC
29623C                N = 10000             1.887 SEC      NOT COMPUTED
29624C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
29625C                 BY RICHARD C. SINGLETON).
29626C               --CACM JANUARY 1970, PAGE 54.
29627C               --CACM OCTOBER 1970, PAGE 624.
29628C               --JACM JANUARY 1961, PAGE 41.
29629C     WRITTEN BY--JAMES J. FILLIBEN
29630C                 STATISTICAL ENGINEERING DIVISION
29631C                 INFORMATION TECHNOLOGY LABORATORY
29632C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
29633C                 GAITHERSBURG, MD 20899-8980
29634C                 PHONE--301-975-2855
29635C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29636C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
29637C     LANGUAGE--ANSI FORTRAN (1966)
29638C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
29639C                          DENOTED BY QUOTES RATHER THAN NH.
29640C     VERSION NUMBER--82.6
29641C     ORIGINAL VERSION--JUNE      1972.
29642C     UPDATED         --NOVEMBER  1975.
29643C     UPDATED         --JUNE      1981.
29644C     UPDATED         --MAY       1982.
29645C
29646C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29647C
29648C---------------------------------------------------------------------
29649C
29650      DIMENSION X(*),XS(*),AINDEX(*)
29651      DIMENSION IU(36),IL(36)
29652C
29653C-----COMMON----------------------------------------------------------
29654C
29655      INCLUDE 'DPCOP2.INC'
29656C
29657C-----START POINT-----------------------------------------------------
29658C
29659C     CHECK THE INPUT ARGUMENTS FOR ERRORS
29660C
29661      IF(N.LT.1)THEN
29662        WRITE(ICOUT,15)
29663   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO SORTI ',
29664     1         'IS NON-POSITIVE.')
29665        CALL DPWRST('XXX','BUG ')
29666        WRITE(ICOUT,47)N
29667   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
29668        CALL DPWRST('XXX','BUG ')
29669        RETURN
29670      ELSEIF(N.EQ.1)THEN
29671        XS(1)=X(1)
29672        AINDEX(1)=1
29673        RETURN
29674      ENDIF
29675C
29676      HOLD=X(1)
29677      DO60I=2,N
29678        IF(X(I).NE.HOLD)GOTO90
29679   60 CONTINUE
29680      DO61I=1,N
29681        XS(I)=X(I)
29682        AINDEX(I)=I
29683   61 CONTINUE
29684      RETURN
29685C
29686   90 CONTINUE
29687CCCC9 FORMAT('***** WARNING--THE FIRST ARGUMENT (A VECTOR) TO ',
29688CCCCC1       'THE SORTI  SUBROUTINE HAS ALL ELEMENTS = ',G15.7)
29689C
29690      NTEMP=0
29691C
29692C     COPY THE VECTOR X INTO THE VECTOR XS
29693C
29694      DO100I=1,N
29695        XS(I)=X(I)
29696  100 CONTINUE
29697C
29698C     COPY THE VECTOR INDEX INTO THE VECTOR INDEXS
29699C
29700      DO150I=1,N
29701        AINDEX(I)=I
29702  150 CONTINUE
29703C
29704C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
29705C
29706      NM1=N-1
29707      DO200I=1,NM1
29708      IP1=I+1
29709      IF(XS(I).LE.XS(IP1))GOTO200
29710      GOTO250
29711  200 CONTINUE
29712      RETURN
29713  250 M=1
29714      I=1
29715      J=N
29716  305 IF(I.GE.J)GOTO370
29717  310 K=I
29718      MID=(I+J)/2
29719      AMED=XS(MID)
29720      BMED=AINDEX(MID)
29721      IF(XS(I).LE.AMED)GOTO320
29722      XS(MID)=XS(I)
29723      AINDEX(MID)=AINDEX(I)
29724      XS(I)=AMED
29725      AINDEX(I)=BMED
29726      AMED=XS(MID)
29727      BMED=AINDEX(MID)
29728  320 L=J
29729      IF(XS(J).GE.AMED)GOTO340
29730      XS(MID)=XS(J)
29731      AINDEX(MID)=AINDEX(J)
29732      XS(J)=AMED
29733      AINDEX(J)=BMED
29734      AMED=XS(MID)
29735      BMED=AINDEX(MID)
29736      IF(XS(I).LE.AMED)GOTO340
29737      XS(MID)=XS(I)
29738      AINDEX(MID)=AINDEX(I)
29739      XS(I)=AMED
29740      AINDEX(I)=BMED
29741      AMED=XS(MID)
29742      BMED=AINDEX(MID)
29743      GOTO340
29744  330 XS(L)=XS(K)
29745      AINDEX(L)=AINDEX(K)
29746      XS(K)=TX
29747      AINDEX(K)=TY
29748  340 L=L-1
29749      IF(XS(L).GT.AMED)GOTO340
29750      TX=XS(L)
29751      TY=AINDEX(L)
29752  350 K=K+1
29753      IF(XS(K).LT.AMED)GOTO350
29754      IF(K.LE.L)GOTO330
29755      LMI=L-I
29756      JMK=J-K
29757      IF(LMI.LE.JMK)GOTO360
29758      IL(M)=I
29759      IU(M)=L
29760      I=K
29761      M=M+1
29762      GOTO380
29763  360 IL(M)=K
29764      IU(M)=J
29765      J=L
29766      M=M+1
29767      GOTO380
29768  370 M=M-1
29769      IF(M.EQ.0)RETURN
29770      I=IL(M)
29771      J=IU(M)
29772  380 JMI=J-I
29773      IF(JMI.GE.11)GOTO310
29774      IF(I.EQ.1)GOTO305
29775      I=I-1
29776  390 I=I+1
29777      IF(I.EQ.J)GOTO370
29778      AMED=XS(I+1)
29779      BMED=AINDEX(I+1)
29780      IF(XS(I).LE.AMED)GOTO390
29781      K=I
29782  395 XS(K+1)=XS(K)
29783      AINDEX(K+1)=AINDEX(K)
29784      K=K-1
29785      IF(AMED.LT.XS(K))GOTO395
29786      XS(K+1)=AMED
29787      AINDEX(K+1)=BMED
29788      GOTO390
29789      END
29790      SUBROUTINE SORTII(X,N,XS,AINDEX)
29791C
29792C     PURPOSE--THIS SUBROUTINE SORTS (IN ASCENDING ORDER)
29793C              THE N ELEMENTS OF THE SINGLE PRECISION VECTOR X,
29794C              PUTS THE RESULTING N SORTED VALUES INTO THE
29795C              SINGLE PRECISION VECTOR XS, AND
29796C              REARRANGES THE ELEMENTS 1, 2, ..., N OF VECTOR AINDEX
29797C              (ACCORDING TO THE SORT ON X).
29798C              THIS SUBROUTINE GIVES THE DATA ANALYST
29799C              THE ABILITY TO SORT ONE DATA VECTOR
29800C              WHILE DETERMINING THE POSITION INDEX
29801C              AFTER-THE-FACT, SO AS TO SUBSEQUENTLY
29802C              'CARRY ALONG' THE ELEMENTS
29803C              OF MANY OTHER DATA VECTORS (DONE ELSEWHERE).
29804C
29805C              THIS ROUTINE IS IDENTICAL TO SORTII WITH THE
29806C              DIFFERENCE THAT THIS ROUTINE ASSUMES X, XS, AND
29807C              AINDEX ARE INTEGER RATHER THAN REAL.
29808C
29809C     INPUT  ARGUMENTS--X      = THE INTEGER VECTOR OF
29810C                                OBSERVATIONS TO BE SORTED.
29811C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
29812C                                IN THE VECTOR X.
29813C     OUTPUT ARGUMENTS--XS     = THE INTEGER VECTOR
29814C                                INTO WHICH THE SORTED DATA VALUES
29815C                                FROM X WILL BE PLACED.
29816C                     --AINDEX = THE INTEGER VECTOR
29817C                                INTO WHICH THE REARRANGED
29818C                                (ACCORDING TO THE SORT OF THE
29819C                                VECTOR X) VALUES OF 1, 2, ..., N
29820C                                WILL BE PLACED.
29821C     OUTPUT--THE SINGLE PRECISION VECTOR XS
29822C             CONTAINING THE SORTED
29823C             (IN ASCENDING ORDER) VALUES
29824C             OF THE SINGLE PRECISION VECTOR X, AND
29825C             THE SINGLE PRECISION VECTOR AINDEX
29826C             CONTAINING THE REARRANGED
29827C             (ACCORDING TO THE SORT ON X)
29828C             VALUES OF 1, 2, ..., N.
29829C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
29830C     RESTRICTIONS--THE DIMENSIONS OF THE VECTORS IL AND IU
29831C                   (DEFINED AND USED INTERNALLY WITHIN
29832C                   THIS SUBROUTINE) DICTATE THE MAXIMUM
29833C                   ALLOWABLE VALUE OF N FOR THIS SUBROUTINE.
29834C                   IF IL AND IU EACH HAVE DIMENSION K,
29835C                   THEN N MAY NOT EXCEED 2**(K+1) - 1.
29836C                   FOR THIS SUBROUTINE AS WRITTEN, THE DIMENSIONS
29837C                   OF IL AND IU HAVE BEEN SET TO 36,
29838C                   THUS THE MAXIMUM ALLOWABLE VALUE OF N IS
29839C                   APPROXIMATELY 137 BILLION.
29840C                   SINCE THIS EXCEEDS THE MAXIMUM ALLOWABLE
29841C                   VALUE FOR AN INTEGER VARIABLE IN MANY COMPUTERS,
29842C                   AND SINCE A SORT OF 137 BILLION ELEMENTS
29843C                   IS PRESENTLY IMPRACTICAL AND UNLIKELY,
29844C                   THEN THERE IS NO PRACTICAL RESTRICTION
29845C                   ON THE MAXIMUM VALUE OF N FOR THIS SUBROUTINE.
29846C                   (IN LIGHT OF THE ABOVE, NO CHECK OF THE
29847C                   UPPER LIMIT OF N HAS BEEN INCORPORATED
29848C                   INTO THIS SUBROUTINE.)
29849C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
29850C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
29851C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
29852C     LANGUAGE--ANSI FORTRAN (1977)
29853C     COMMENT--THE SMALLEST ELEMENT OF THE VECTOR X
29854C              WILL BE PLACED IN THE FIRST POSITION
29855C              OF THE VECTOR XS,
29856C              THE SECOND SMALLEST ELEMENT IN THE VECTOR X
29857C              WILL BE PLACED IN THE SECOND POSITION
29858C              OF THE VECTOR XS,
29859C              ETC.
29860C     COMMENT--AT THE END, AINDEX(1) WILL CONTAIN TBE ORIGINAL
29861C              POSITION NUMBER WHERE THE SMALLEST VALUE OF X DID RESIDE.
29862C          AINDEX(2) WILL CONTAIN THE ORIGINAL
29863C          POSITION NUMBER WHERE THE SECOND SMALLEST VALUE OF X DID RESIDE.
29864C          AINDEX(N) WILL CONTAIN THE ORIGINAL
29865C          POSITION NUMBER WHERE THE LARGEST VALUE OF X DID RESIDE.
29866C     COMMENT--THE INPUT VECTOR X REMAINS UNALTERED.
29867C     COMMENT--IF THE ANALYST DESIRES A SORT 'IN PLACE',
29868C              THIS IS DONE BY HAVING THE SAME
29869C              OUTPUT VECTOR AS INPUT VECTOR IN THE CALLING SEQUENCE.
29870C              THUS, FOR EXAMPLE, THE CALLING SEQUENCE
29871C              CALL SORTI(X,N,X,AINDEX)
29872C              IS ALLOWABLE AND WILL RESULT IN
29873C              THE DESIRED 'IN-PLACE' SORT.
29874C     COMMENT--THE SORTING ALGORTHM USED HEREIN
29875C              IS THE BINARY SORT.
29876C              THIS ALGORTHIM IS EXTREMELY FAST AS THE
29877C              FOLLOWING TIME TRIALS INDICATE.
29878C              THESE TIME TRIALS WERE CARRIED OUT ON THE
29879C              UNIVAC 1108 EXEC 8 SYSTEM AT NBS
29880C              IN AUGUST OF 1974.
29881C              BY WAY OF COMPARISON, THE TIME TRIAL VALUES
29882C              FOR THE EASY-TO-PROGRAM BUT EXTREMELY
29883C              INEFFICIENT BUBBLE SORT ALGORITHM HAVE
29884C              ALSO BEEN INCLUDED--
29885C              NUMBER OF RANDOM        BINARY SORT       BUBBLE SORT
29886C               NUMBERS SORTED
29887C                N = 10                 .002 SEC          .002 SEC
29888C                N = 100                .011 SEC          .045 SEC
29889C                N = 1000               .141 SEC         4.332 SEC
29890C                N = 3000               .476 SEC        37.683 SEC
29891C                N = 10000             1.887 SEC      NOT COMPUTED
29892C     REFERENCES--CACM MARCH 1969, PAGE 186 (BINARY SORT ALGORITHM
29893C                 BY RICHARD C. SINGLETON).
29894C               --CACM JANUARY 1970, PAGE 54.
29895C               --CACM OCTOBER 1970, PAGE 624.
29896C               --JACM JANUARY 1961, PAGE 41.
29897C     WRITTEN BY--JAMES J. FILLIBEN
29898C                 STATISTICAL ENGINEERING DIVISION
29899C                 INFORMATION TECHNOLOGY LABORATORY
29900C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
29901C                 GAITHERSBURG, MD 20899-8980
29902C                 PHONE--301-975-2855
29903C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29904C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
29905C     LANGUAGE--ANSI FORTRAN (1966)
29906C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
29907C                          DENOTED BY QUOTES RATHER THAN NH.
29908C     VERSION NUMBER--82.6
29909C     ORIGINAL VERSION--JUNE      1972.
29910C     UPDATED         --NOVEMBER  1975.
29911C     UPDATED         --JUNE      1981.
29912C     UPDATED         --MAY       1982.
29913C
29914C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29915C
29916C---------------------------------------------------------------------
29917C
29918      INTEGER X(*),XS(*),AINDEX(*)
29919      DIMENSION IU(36),IL(36)
29920C
29921C-----COMMON----------------------------------------------------------
29922C
29923      INCLUDE 'DPCOP2.INC'
29924C
29925C-----START POINT-----------------------------------------------------
29926C
29927C     CHECK THE INPUT ARGUMENTS FOR ERRORS
29928C
29929      IF(N.LT.1)THEN
29930        WRITE(ICOUT,15)
29931   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO SORTII ',
29932     1         'IS NON-POSITIVE.')
29933        CALL DPWRST('XXX','BUG ')
29934        WRITE(ICOUT,47)N
29935   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
29936        CALL DPWRST('XXX','BUG ')
29937        RETURN
29938      ELSEIF(N.EQ.1)THEN
29939CCCCC   WRITE(ICOUT,18)
29940CCC18   FORMAT('***** WARNING--THE SECOND ARGUMENT TO SORTII ',
29941CCCCC1         'HAS THE VALUE 1.')
29942CCCCC   CALL DPWRST('XXX','BUG ')
29943        XS(1)=X(1)
29944        AINDEX(1)=1
29945        RETURN
29946      ENDIF
29947C
29948      IHOLD=X(1)
29949      DO60I=2,N
29950        IF(X(I).NE.IHOLD)GOTO90
29951   60 CONTINUE
29952      DO61I=1,N
29953        XS(I)=X(I)
29954        AINDEX(I)=I
29955   61 CONTINUE
29956      RETURN
29957   90 CONTINUE
29958C
29959C     COPY THE VECTOR X INTO THE VECTOR XS
29960      DO100I=1,N
29961        XS(I)=X(I)
29962  100 CONTINUE
29963C
29964C     COPY THE VECTOR INDEX INTO THE VECTOR INDEXS
29965C
29966      DO150I=1,N
29967        AINDEX(I)=I
29968  150 CONTINUE
29969C
29970C     CHECK TO SEE IF THE INPUT VECTOR IS ALREADY SORTED
29971C
29972      NM1=N-1
29973      DO200I=1,NM1
29974        IP1=I+1
29975        IF(XS(I).LE.XS(IP1))GOTO200
29976        GOTO250
29977  200 CONTINUE
29978      RETURN
29979  250 CONTINUE
29980      M=1
29981      I=1
29982      J=N
29983  305 CONTINUE
29984      IF(I.GE.J)GOTO370
29985  310 CONTINUE
29986      K=I
29987      MID=(I+J)/2
29988      AMED=REAL(XS(MID))
29989      BMED=REAL(AINDEX(MID))
29990      IF(XS(I).LE.INT(AMED+0.1))GOTO320
29991      XS(MID)=XS(I)
29992      AINDEX(MID)=AINDEX(I)
29993      XS(I)=INT(AMED+0.1)
29994      AINDEX(I)=INT(BMED+0.1)
29995      AMED=REAL(XS(MID))
29996      BMED=REAL(AINDEX(MID))
29997  320 L=J
29998      IF(XS(J).GE.INT(AMED+0.1))GOTO340
29999      XS(MID)=XS(J)
30000      AINDEX(MID)=AINDEX(J)
30001      XS(J)=INT(AMED+0.1)
30002      AINDEX(J)=INT(BMED+0.1)
30003      AMED=REAL(XS(MID))
30004      BMED=REAL(AINDEX(MID))
30005      IF(XS(I).LE.INT(AMED+0.1))GOTO340
30006      XS(MID)=XS(I)
30007      AINDEX(MID)=AINDEX(I)
30008      XS(I)=INT(AMED+0.1)
30009      AINDEX(I)=INT(BMED+0.1)
30010      AMED=REAL(XS(MID))
30011      BMED=REAL(AINDEX(MID))
30012      GOTO340
30013  330 CONTINUE
30014      XS(L)=XS(K)
30015      AINDEX(L)=AINDEX(K)
30016      XS(K)=INT(TX+0.1)
30017      AINDEX(K)=INT(TY+0.1)
30018  340 CONTINUE
30019      L=L-1
30020      IF(XS(L).GT.INT(AMED+0.1))GOTO340
30021      TX=REAL(XS(L))
30022      TY=REAL(AINDEX(L))
30023  350 CONTINUE
30024      K=K+1
30025      IF(XS(K).LT.INT(AMED+0.1))GOTO350
30026      IF(K.LE.L)GOTO330
30027      LMI=L-I
30028      JMK=J-K
30029      IF(LMI.LE.JMK)GOTO360
30030      IL(M)=I
30031      IU(M)=L
30032      I=K
30033      M=M+1
30034      GOTO380
30035  360 CONTINUE
30036      IL(M)=K
30037      IU(M)=J
30038      J=L
30039      M=M+1
30040      GOTO380
30041  370 CONTINUE
30042      M=M-1
30043      IF(M.EQ.0)RETURN
30044      I=IL(M)
30045      J=IU(M)
30046  380 CONTINUE
30047      JMI=J-I
30048      IF(JMI.GE.11)GOTO310
30049      IF(I.EQ.1)GOTO305
30050      I=I-1
30051  390 CONTINUE
30052      I=I+1
30053      IF(I.EQ.J)GOTO370
30054      AMED=REAL(XS(I+1))
30055      BMED=REAL(AINDEX(I+1))
30056      IF(XS(I).LE.INT(AMED+0.1))GOTO390
30057      K=I
30058  395 CONTINUE
30059      XS(K+1)=XS(K)
30060      AINDEX(K+1)=AINDEX(K)
30061      K=K-1
30062      IF(INT(AMED+0.1).LT.XS(K))GOTO395
30063      XS(K+1)=INT(AMED+0.1)
30064      AINDEX(K+1)=INT(BMED+0.1)
30065      GOTO390
30066      END
30067      SUBROUTINE SORTSH(X, N)
30068C
30069C        ALGORITHM AS 304.8 APPL.STATIST. (1996), VOL.45, NO.3
30070C
30071C        Sorts the N values stored in array X in ascending order
30072C
30073C        DATAPLOT NOTE: THIS IS A UTILITY ROUTINE USED BY
30074C                       FISHER TWO SAMPLE RANDOMIZATION TEST
30075C
30076      INTEGER N
30077      REAL X(N)
30078C
30079      INTEGER I, J, INCR
30080      REAL TEMP
30081C
30082      INCR = 1
30083C
30084C        Loop : calculate the increment
30085C
30086   10 INCR = 3 * INCR + 1
30087      IF (INCR .LE. N) GOTO 10
30088
30089C
30090C        Loop : Shell-Metzner sort
30091C
30092   20 INCR = INCR / 3
30093      I = INCR + 1
30094   30 IF (I .GT. N) GOTO 60
30095      TEMP = X(I)
30096      J = I
30097   40 IF (X(J - INCR) .LT. TEMP) GOTO 50
30098      X(J) = X(J - INCR)
30099      J = J - INCR
30100      IF (J .GT. INCR) GOTO 40
30101   50 X(J) = TEMP
30102      I = I + 1
30103      GOTO 30
30104   60 IF (INCR .GT. 1) GOTO 20
30105C
30106      RETURN
30107      END
30108      SUBROUTINE SPANF1(EDGE1,EDGE2,NEDGE,Y,X,NVERT,IWRITE,
30109     1Y2,X2,TAG,NOUT,
30110     1IEDGE,IX,NV,IWORK1,
30111     1IBUGA3,IERROR)
30112C
30113C     PURPOSE--IMPLEMENTS THE COMMAND
30114C
30115C                 LET Y1 Y2 TAG = SPANNING FOREST EDGE1 EDGE2 Y X
30116C
30117C              WHERE EDGE1 AND EDGE2 DEFINE A LIST OF EDGES
30118C              AND Y AND X ARE THE COORDINATES FOR THE VERTICES.
30119C
30120C              NOTE THAT THIS FORM OF THE COMMAND IS MOST USEFUL
30121C              WHEN THE PRIMARY GOAL IS TO GENERATE A PLOT OF
30122C              THE SPANNING FOREST (I.E., THE CONNECTED COMPONENTS
30123C              OF THE GRAPH).
30124C
30125C     EXAMPLES--LET Y2 X2 TAG = SPANNING FOREST E1 E2 Y X
30126C     INPUT  ARGUMENTS--EDGE1  VECTOR IDENTIFYING FIRST VERTEX IN EDGE
30127C                       EDGE2  VECTOR IDENTIFYING SECOND VERTEX IN EDGE
30128C                       NEDGE  NUMBER OF EDGES
30129C                       Y      VECTOR CONTAINING Y-COORDINATE OF
30130C                              VERTICES
30131C                       X      VECTOR CONTAINING X-COORDINATE OF
30132C                              VERTICES
30133C                       X      X-AXIS VECTOR
30134C                       NVERT  NUMBER OF VERTICES
30135C     REFERENCE--NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
30136C                ALGORITHMS', ACADEMIC PRESS, 1975, PP. 106-108.
30137C     OUTPUT ARGUMENTS--Y2     Y-AXIS VECTOR OF THE NEW VERTICES
30138C                       X2     X-AXIS VECTOR OF THE NEW VERTICES
30139C                       TAG    VECTOR IDENTIFYING PAIRS OF VERTICES
30140C                       NOUT   NUMBER OF VERTICES IN OUTPUT MATRIX
30141C     WRITTEN BY--JAMES J. FILLIBEN
30142C                 STATISTICAL ENGINEERING DIVISION
30143C                 INFORMATION TECHNOLOGY LABORATORY
30144C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30145C                 GAITHERSBURG, MD 20899-8980
30146C                 PHONE--301-975-2855
30147C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
30148C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
30149C     LANGUAGE--ANSI FORTRAN (1977)
30150C     VERSION NUMBER--2008/8
30151C     ORIGINAL VERSION--JUNE     2008.
30152C
30153C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30154C
30155      CHARACTER*4 IWRITE
30156      CHARACTER*4 IBUGA3
30157      CHARACTER*4 IERROR
30158C
30159      CHARACTER*4 ISUBN1
30160      CHARACTER*4 ISUBN2
30161C
30162      DIMENSION EDGE1(*)
30163      DIMENSION EDGE2(*)
30164      DIMENSION Y(*)
30165      DIMENSION X(*)
30166      DIMENSION Y2(*)
30167      DIMENSION X2(*)
30168      DIMENSION TAG(*)
30169C
30170      INTEGER IEDGE(*)
30171      INTEGER IX(*)
30172      INTEGER NV(*)
30173      INTEGER IWORK1(*)
30174C
30175C-----COMMON----------------------------------------------------------
30176C
30177      INCLUDE 'DPCOP2.INC'
30178C
30179C-----START POINT-----------------------------------------------------
30180C
30181      ISUBN1='SPAN'
30182      ISUBN2='F1  '
30183      IERROR='NO'
30184C
30185      IF(IBUGA3.EQ.'ON')THEN
30186        WRITE(ICOUT,999)
30187  999   FORMAT(1X)
30188        CALL DPWRST('XXX','BUG ')
30189        WRITE(ICOUT,51)
30190   51   FORMAT('***** AT THE BEGINNING OF SPANF1--')
30191        CALL DPWRST('XXX','BUG ')
30192        WRITE(ICOUT,52)IBUGA3,IWRITE,NEDGE,NVERT
30193   52   FORMAT('IBUGA3,IWRITE,NEDGE,NVERT = ',A4,2X,A4,2X,2I10)
30194        CALL DPWRST('XXX','BUG ')
30195        DO55I=1,NEDGE
30196          WRITE(ICOUT,56)I,EDGE1(I),EDGE2(I)
30197   56     FORMAT('I,EDGE1(I),EDGE2(I) = ',I8,2G15.7)
30198          CALL DPWRST('XXX','BUG ')
30199   55   CONTINUE
30200        DO65I=1,NVERT
30201          WRITE(ICOUT,66)I,Y(I),X(I)
30202   66     FORMAT('I,Y(I),X(I) = ',I8,2G15.7)
30203          CALL DPWRST('XXX','BUG ')
30204   65   CONTINUE
30205      ENDIF
30206C
30207C               ******************************************
30208C               **  STEP 1: CHECK THAT VERTICES ARE IN  **
30209C               **          THE RANGE (1,NVERT)         **
30210C               ******************************************
30211C
30212      DO100I=1,NEDGE
30213        ITEMP1=INT(EDGE1(I)+0.01)
30214        IF(ITEMP1.LT.1 .OR. ITEMP1.GT.NVERT)THEN
30215          WRITE(ICOUT,999)
30216          CALL DPWRST('XXX','BUG ')
30217          WRITE(ICOUT,101)
30218  101     FORMAT('***** ERROR FROM SPANNING FOREST--')
30219          CALL DPWRST('XXX','BUG ')
30220          WRITE(ICOUT,103)I
30221  103     FORMAT('      THE FIRST VERTEX FOR EDGE ',I8,' IS LESS ',
30222     1           'THAN ONE')
30223          CALL DPWRST('XXX','BUG ')
30224          WRITE(ICOUT,105)NVERT
30225  105     FORMAT('      OR GREATER THAN THE NUMBER OF VERTICES (',I8,
30226     1           ').')
30227          CALL DPWRST('XXX','BUG ')
30228          IERROR='YES'
30229          GOTO9000
30230        ENDIF
30231C
30232        ITEMP2=INT(EDGE2(I)+0.01)
30233        IF(ITEMP2.LT.1 .OR. ITEMP2.GT.NVERT)THEN
30234          WRITE(ICOUT,999)
30235          CALL DPWRST('XXX','BUG ')
30236          WRITE(ICOUT,101)
30237          CALL DPWRST('XXX','BUG ')
30238          WRITE(ICOUT,113)I
30239  113     FORMAT('      THE SECOND VERTEX FOR EDGE ',I8,' IS LESS THAN')
30240          CALL DPWRST('XXX','BUG ')
30241          WRITE(ICOUT,105)NVERT
30242          CALL DPWRST('XXX','BUG ')
30243          IERROR='YES'
30244          GOTO9000
30245        ENDIF
30246C
30247  100 CONTINUE
30248C
30249C               ******************************************
30250C               **  STEP 2: PREPARE INPUT FOR SPANFO    **
30251C               **          ROUTINE                     **
30252C               ******************************************
30253C
30254      DO200I=1,NEDGE
30255        IT1=(I-1)*2 + 1
30256        IT2=I*2
30257        IEDGE(IT1)=INT(EDGE1(I)+0.1)
30258        IEDGE(IT2)=INT(EDGE2(I)+0.1)
30259  200 CONTINUE
30260C
30261      CALL SPANFO(NVERT,NEDGE,IEDGE,K,IX,NV,IWORK1)
30262C
30263      IF(IBUGA3.EQ.'ON')THEN
30264        WRITE(ICOUT,223)K
30265  223   FORMAT('AFTER CALL TO SPANFO: K = ',I8)
30266        CALL DPWRST('XXX','BUG ')
30267        DO230I=1,NEDGE
30268          IT1=(I-1)*2 + 1
30269          IT2=I*2
30270          WRITE(ICOUT,231)I,IEDGE(IT1),IEDGE(IT2)
30271  231     FORMAT('I,IEDGE(1,I),IEDGE(2,I) = ',3I8)
30272          CALL DPWRST('XXX','BUG ')
30273  230   CONTINUE
30274        DO240I=1,NVERT
30275          WRITE(ICOUT,241)I,IX(I)
30276  241     FORMAT('I,IX(I) = ',2I8)
30277          CALL DPWRST('XXX','BUG ')
30278  240   CONTINUE
30279        DO250I=1,K
30280          WRITE(ICOUT,251)I,NV(I)
30281  251     FORMAT('I,NV(I) = ',2I8)
30282          CALL DPWRST('XXX','BUG ')
30283  250   CONTINUE
30284      ENDIF
30285C
30286C               ******************************************
30287C               **  STEP 3: CONVERT SPANFO OUTPOUT TO   **
30288C               **          FORM WE WANT                **
30289C               ******************************************
30290C
30291      ICNT1=0
30292      ICNT2=0
30293C
30294      DO300IK=1,K
30295        ATAG=REAL(IK)
30296        IPTS=NV(IK)-1
30297C
30298        IF(IBUGA3.EQ.'ON')THEN
30299          WRITE(ICOUT,301)IK,IPTS,ATAG
30300  301     FORMAT('IK,IPTS,ATAG = ',2I8,G15.7)
30301          CALL DPWRST('XXX','BUG ')
30302        ENDIF
30303C
30304        IF(IPTS.GE.1)THEN
30305          DO310I=1,IPTS
30306            ICNT2=ICNT2+1
30307            IT1=(ICNT2-1)*2 + 1
30308            IT2=ICNT2*2
30309            ITEMP1=IEDGE(IT1)
30310            ITEMP2=IEDGE(IT2)
30311C
30312            IF(IBUGA3.EQ.'ON')THEN
30313              WRITE(ICOUT,311)I,IT1,IT2,ITEMP1,ITEMP2
30314  311         FORMAT('I,IT1,IT2,ITEMP1,ITEMP2 = ',5I8)
30315              CALL DPWRST('XXX','BUG ')
30316              WRITE(ICOUT,313)Y(ITEMP1),X(ITEMP1)
30317  313         FORMAT('Y(ITEMP1),X(ITEMP1) = ',2G15.7)
30318              CALL DPWRST('XXX','BUG ')
30319              WRITE(ICOUT,314)Y(ITEMP2),X(ITEMP2)
30320  314         FORMAT('Y(ITEMP2),X(ITEMP2) = ',2G15.7)
30321              CALL DPWRST('XXX','BUG ')
30322            ENDIF
30323C
30324            ICNT1=ICNT1+1
30325            Y2(ICNT1)=Y(ITEMP1)
30326            X2(ICNT1)=X(ITEMP1)
30327            TAG(ICNT1)=ATAG
30328C
30329            IF(IBUGA3.EQ.'ON')THEN
30330              WRITE(ICOUT,315)ICNT1,Y2(ICNT1),X2(ICNT1)
30331  315         FORMAT('ICNT1,Y2(ICNT1),X2(ICNT1) = ',I8,2G15.7)
30332              CALL DPWRST('XXX','BUG ')
30333            ENDIF
30334C
30335            ICNT1=ICNT1+1
30336            Y2(ICNT1)=Y(ITEMP2)
30337            X2(ICNT1)=X(ITEMP2)
30338            TAG(ICNT1)=ATAG
30339C
30340            IF(IBUGA3.EQ.'ON')THEN
30341              WRITE(ICOUT,315)ICNT1,Y2(ICNT1),X2(ICNT1)
30342              CALL DPWRST('XXX','BUG ')
30343            ENDIF
30344C
30345  310     CONTINUE
30346        ELSE
30347          DO320I=1,NVERT
30348            IF(IK.EQ.IX(I))THEN
30349              ICNT1=ICNT1+1
30350              Y2(ICNT1)=Y(IX(I))
30351              X2(ICNT1)=X(IX(I))
30352              TAG(ICNT1)=ATAG
30353              GOTO329
30354            ENDIF
30355  320     CONTINUE
30356  329     CONTINUE
30357        ENDIF
30358  300 CONTINUE
30359C
30360      NOUT=ICNT1
30361C
30362C               *****************
30363C               **  STEP 90--  **
30364C               **  EXIT       **
30365C               *****************
30366C
30367 9000 CONTINUE
30368C
30369      IF(IBUGA3.EQ.'ON')THEN
30370        WRITE(ICOUT,999)
30371        CALL DPWRST('XXX','BUG ')
30372        WRITE(ICOUT,9011)
30373 9011   FORMAT('***** AT THE END OF SPANF1--')
30374        CALL DPWRST('XXX','BUG ')
30375        WRITE(ICOUT,9014)NOUT
30376 9014   FORMAT('NOUT = ',I8)
30377        CALL DPWRST('XXX','BUG ')
30378        DO9015I=1,NOUT
30379          WRITE(ICOUT,9016)I,Y2(I),X2(I),TAG(I)
30380 9016     FORMAT('I,Y2(I),X2(I),TAG(I) = ',I8,3G15.7)
30381          CALL DPWRST('XXX','BUG ')
30382 9015   CONTINUE
30383      ENDIF
30384C
30385      RETURN
30386      END
30387      SUBROUTINE SPANF2(EDGE1,EDGE2,NEDGE,NVERT,IWRITE,
30388     1IEDGE,IX,NV,K,IWORK1,
30389     1IBUGA3,IERROR)
30390C
30391C     PURPOSE--IMPLEMENTS THE COMMAND
30392C
30393C              LET EDGE1 EDGE2 TAG NV = SPANNING FOREST EDGE1 EDGE2 NVERT
30394C
30395C              WHERE EDGE1 AND EDGE2 DEFINE A LIST OF EDGES
30396C              AND NVERT IS THE NUMBER OF VERTICES.
30397C
30398C              NOTE THAT THIS FORM OF THE COMMAND RETURNS THE
30399C              OUTPUT AS GIVEN BY THE SPANFO ROUTINE.
30400C              THE SPANNING FOREST (I.E., THE CONNECTED COMPONENTS
30401C              OF THE GRAPH).
30402C
30403C     EXAMPLES--LET Y2 X2 TAG = SPANNING FOREST E1 E2 Y X
30404C     INPUT  ARGUMENTS--EDGE1  VECTOR IDENTIFYING FIRST VERTEX IN EDGE
30405C                       EDGE2  VECTOR IDENTIFYING SECOND VERTEX IN EDGE
30406C                       NEDGE  NUMBER OF EDGES
30407C                       NVERT  NUMBER OF VERTICES
30408C     OUTPUT ARGUMENTS--EDGE1  RE-ARRANGED FIRST VERTEX IN EDGE
30409C                       EDGE2  RE-ARRANGED SECOND VERTEX IN EDGE
30410C                       IX     INTEGER VECTOR THAT IDENTIFIES WHICH
30411C                              COMPONENT THE I-TH VERTEX BELONGS TO
30412C                       NV     INTEGER VECTOR THAT IDENTIFIES THEES
30413C                              NUMBER OF EDGES IN EACH COMPONENT
30414C                       K      AN INTEGER SCALAR THAT IDENTIFIES THE
30415C                              THE NUMBER OF COMPONENTS
30416C     REFERENCE--NIJENHUIS, ALBERT AND WILF, HERBERT S., 'COMBINATORIAL
30417C                ALGORITHMS', ACADEMIC PRESS, 1975, PP. 106-108.
30418C     WRITTEN BY--JAMES J. FILLIBEN
30419C                 STATISTICAL ENGINEERING DIVISION
30420C                 INFORMATION TECHNOLOGY LABORATORY
30421C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30422C                 GAITHERSBURG, MD 20899-8980
30423C                 PHONE--301-975-2855
30424C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
30425C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
30426C     LANGUAGE--ANSI FORTRAN (1977)
30427C     VERSION NUMBER--2008/8
30428C     ORIGINAL VERSION--JUNE     2008.
30429C
30430C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30431C
30432      CHARACTER*4 IWRITE
30433      CHARACTER*4 IBUGA3
30434      CHARACTER*4 IERROR
30435C
30436      CHARACTER*4 ISUBN1
30437      CHARACTER*4 ISUBN2
30438C
30439      DIMENSION EDGE1(*)
30440      DIMENSION EDGE2(*)
30441C
30442      INTEGER IEDGE(*)
30443      INTEGER IX(*)
30444      INTEGER NV(*)
30445      INTEGER IWORK1(*)
30446C
30447C-----COMMON----------------------------------------------------------
30448C
30449      INCLUDE 'DPCOP2.INC'
30450C
30451C-----START POINT-----------------------------------------------------
30452C
30453      ISUBN1='SPAN'
30454      ISUBN2='F2  '
30455      IERROR='NO'
30456C
30457      IF(IBUGA3.EQ.'ON')THEN
30458        WRITE(ICOUT,999)
30459  999   FORMAT(1X)
30460        CALL DPWRST('XXX','BUG ')
30461        WRITE(ICOUT,51)
30462   51   FORMAT('***** AT THE BEGINNING OF SPANF2--')
30463        CALL DPWRST('XXX','BUG ')
30464        WRITE(ICOUT,52)IBUGA3,IWRITE,NEDGE,NVERT
30465   52   FORMAT('IBUGA3,IWRITE,NEDGE,NVERT = ',A4,2X,A4,2X,2I10)
30466        CALL DPWRST('XXX','BUG ')
30467        DO55I=1,NEDGE
30468          WRITE(ICOUT,56)I,EDGE1(I),EDGE2(I)
30469   56     FORMAT('I,EDGE1(I),EDGE2(I) = ',I8,2G15.7)
30470          CALL DPWRST('XXX','BUG ')
30471   55   CONTINUE
30472      ENDIF
30473C
30474C               ******************************************
30475C               **  STEP 1: CHECK THAT VERTICES ARE IN  **
30476C               **          THE RANGE (1,NVERT)         **
30477C               ******************************************
30478C
30479      DO100I=1,NEDGE
30480        ITEMP1=INT(EDGE1(I)+0.01)
30481        IF(ITEMP1.LT.1 .OR. ITEMP1.GT.NVERT)THEN
30482          WRITE(ICOUT,999)
30483          CALL DPWRST('XXX','BUG ')
30484          WRITE(ICOUT,101)
30485  101     FORMAT('***** ERROR FROM SPANNING FOREST--')
30486          CALL DPWRST('XXX','BUG ')
30487          WRITE(ICOUT,103)I
30488  103     FORMAT('      THE FIRST VERTEX FOR EDGE ',I8,' IS LESS ',
30489     1           'THAN ONE')
30490          CALL DPWRST('XXX','BUG ')
30491          WRITE(ICOUT,105)NVERT
30492  105     FORMAT('      OR GREATER THAN THE NUMBER OF VERTICES (',I8,
30493     1           ').')
30494          CALL DPWRST('XXX','BUG ')
30495          IERROR='YES'
30496          GOTO9000
30497        ENDIF
30498C
30499        ITEMP2=INT(EDGE2(I)+0.01)
30500        IF(ITEMP2.LT.1 .OR. ITEMP2.GT.NVERT)THEN
30501          WRITE(ICOUT,999)
30502          CALL DPWRST('XXX','BUG ')
30503          WRITE(ICOUT,101)
30504          CALL DPWRST('XXX','BUG ')
30505          WRITE(ICOUT,113)I
30506  113     FORMAT('      THE SECOND VERTEX FOR EDGE ',I8,' IS LESS THAN')
30507          CALL DPWRST('XXX','BUG ')
30508          WRITE(ICOUT,105)NVERT
30509          CALL DPWRST('XXX','BUG ')
30510          IERROR='YES'
30511          GOTO9000
30512        ENDIF
30513C
30514  100 CONTINUE
30515C
30516C               ******************************************
30517C               **  STEP 2: PREPARE INPUT FOR SPANFO    **
30518C               **          ROUTINE                     **
30519C               ******************************************
30520C
30521      DO200I=1,NEDGE
30522        IT1=(I-1)*2 + 1
30523        IT2=I*2
30524        IEDGE(IT1)=INT(EDGE1(I)+0.1)
30525        IEDGE(IT2)=INT(EDGE2(I)+0.1)
30526  200 CONTINUE
30527C
30528      CALL SPANFO(NVERT,NEDGE,IEDGE,K,IX,NV,IWORK1)
30529C
30530      IF(IBUGA3.EQ.'ON')THEN
30531        WRITE(ICOUT,223)K
30532  223   FORMAT('AFTER CALL TO SPANFO: K = ',I8)
30533        CALL DPWRST('XXX','BUG ')
30534        DO230I=1,NEDGE
30535          IT1=(I-1)*2 + 1
30536          IT2=I*2
30537          WRITE(ICOUT,231)I,IEDGE(IT1),IEDGE(IT2)
30538  231     FORMAT('I,IEDGE(1,I),IEDGE(2,I) = ',3I8)
30539          CALL DPWRST('XXX','BUG ')
30540  230   CONTINUE
30541        DO240I=1,NVERT
30542          WRITE(ICOUT,241)I,IX(I)
30543  241     FORMAT('I,IX(I) = ',2I8)
30544          CALL DPWRST('XXX','BUG ')
30545  240   CONTINUE
30546        DO250I=1,K
30547          WRITE(ICOUT,251)I,NV(I)
30548  251     FORMAT('I,NV(I) = ',2I8)
30549          CALL DPWRST('XXX','BUG ')
30550  250   CONTINUE
30551      ENDIF
30552C
30553C               ******************************************
30554C               **  STEP 3: CONVERT SPANFO OUTPOUT TO   **
30555C               **          FORM WE WANT.  FOR THIS     **
30556C               **          ROUTINE, THAT JUST MEANS    **
30557C               **          COPY THE EDGE ARRAYS.       **
30558C               ******************************************
30559C
30560      DO330I=1,NEDGE
30561          IT1=(I-1)*2 + 1
30562          IT2=I*2
30563          EDGE1(I)=REAL(IEDGE(IT1))
30564          EDGE2(I)=REAL(IEDGE(IT2))
30565  330 CONTINUE
30566C
30567C               *****************
30568C               **  STEP 90--  **
30569C               **  EXIT       **
30570C               *****************
30571C
30572 9000 CONTINUE
30573C
30574      IF(IBUGA3.EQ.'ON')THEN
30575        WRITE(ICOUT,999)
30576        CALL DPWRST('XXX','BUG ')
30577        WRITE(ICOUT,9011)
30578 9011   FORMAT('***** AT THE END OF SPANF2--')
30579        CALL DPWRST('XXX','BUG ')
30580        WRITE(ICOUT,9014)NEDGE,NVERT,K
30581 9014   FORMAT('NEDGE,NVERT,K = ',3I8)
30582        CALL DPWRST('XXX','BUG ')
30583        DO9015I=1,NEDGE
30584          WRITE(ICOUT,9016)I,EDGE1(I),EDGE2(I)
30585 9016     FORMAT('I,EDGE1(I),EDGE2(I) = ',I8,2G15.7)
30586          CALL DPWRST('XXX','BUG ')
30587 9015   CONTINUE
30588        DO9025I=1,NVERT
30589          WRITE(ICOUT,9026)I,IX(I)
30590 9026     FORMAT('I,IX(I) = ',2I8)
30591          CALL DPWRST('XXX','BUG ')
30592 9025   CONTINUE
30593        DO9035I=1,K
30594          WRITE(ICOUT,9036)I,NV(I)
30595 9036     FORMAT('I,NV(I) = ',2I8)
30596          CALL DPWRST('XXX','BUG ')
30597 9035   CONTINUE
30598      ENDIF
30599C
30600      RETURN
30601      END
30602      SUBROUTINE SPECIF(X,Y,N,IWRITE,XIDTEM,STAT,IBUGA3,IERROR)
30603C
30604C     PURPOSE--THIS SUBROUTINE COMPUTES THE TEST SPECIFICITY
30605C              BETWEEN TWO VARIABLES.
30606C
30607C              THIS IS SPECIFICALLY FOR THE 2X2 CASE.  THAT IS,
30608C              EACH VARIABLE HAS TWO MUTUALLY EXCLUSIVE
30609C              CHOICES CODED AS 1 (FOR SUCCESS) OR 0 (FOR
30610C              FAILURE).  TEST SPECIFICITY IS DEFINED AS THE
30611C              CONDITIONAL PROBABILITY OF A POSITIVE TEST GiVEN
30612C              THAT THE DISEASE IS NOT PRESENT.
30613C
30614C              A TYPICAL EXAMPLE WOULD BE WHERE VARIABLE ONE
30615C              DENOTES THE GROUND TRUTH AND A VALUE OF 1
30616C              INDICATES "PRESENT" AND A VALUE OF 0 INDICATES
30617C              "NOT PRESENT".  VARIABLE TWO REPRESENTS SOME TYPE
30618C              OF DETECTION DEVICE WHERE A VALUE OF 1 INDICATES
30619C              THE DEVICE DETECTED THE SPECIFIED OBJECT WHILE A
30620C              VALUE OF 0 INDICATES THAT THE OBJECT WAS NOT
30621C              DETECTED.  TEST SPECIFICITY IS THEN DEFINED AS
30622C              THE PROBABILITY OF NOT DETECTING THE OBJECT GIVEN
30623C              THAT THE OBJECT IS NOT ACTUALLY THERE.
30624C
30625C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
30626C                                (UNSORTED) OBSERVATIONS
30627C                                WHICH CONSTITUTE THE FIRST SET
30628C                                OF DATA.
30629C                     --Y      = THE SINGLE PRECISION VECTOR OF
30630C                                (UNSORTED) OBSERVATIONS
30631C                                WHICH CONSTITUTE THE SECOND SET
30632C                                OF DATA.
30633C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
30634C                                IN THE VECTOR X, OR EQUIVALENTLY,
30635C                                THE INTEGER NUMBER OF OBSERVATIONS
30636C                                IN THE VECTOR Y.
30637C     OUTPUT ARGUMENTS--STAT   = THE SINGLE PRECISION VALUE OF THE
30638C                                COMPUTED TEST SPECIFICITY
30639C                                BETWEEN THE 2 SETS OF DATA
30640C                                IN THE INPUT VECTORS X AND Y.
30641C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
30642C             SAMPLE TEST SPECIFICITY BETWEEN THE 2 SETS
30643C             OF DATA IN THE INPUT VECTORS X AND Y.
30644C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
30645C                   OF N FOR THIS SUBROUTINE.
30646C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
30647C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
30648C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
30649C     LANGUAGE--ANSI FORTRAN (1977)
30650C     WRITTEN BY--JAMES J. FILLIBEN
30651C                 STATISTICAL ENGINEERING DIVISION
30652C                 INFORMATION TECHNOLOGY LABORATORY
30653C                 NATIONAL INSTIUTE OF STANDARDS AND TECHNOLOGY
30654C                 GAITHERSBURG, MD 20899-8980
30655C                 PHONE--301-975-2899
30656C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
30657C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
30658C     LANGUAGE--ANSI FORTRAN (1977)
30659C     VERSION NUMBER--2007/3
30660C     ORIGINAL VERSION--MARCH     2007.
30661C     UPDATED         --AUGUST    2007. IF 2X2 CASE, CHECK IF SUM
30662C                                       OF ENTRIES IS <= 4.  IN THIS
30663C                                       CASE, ASSUME WE HAVE RAW DATA
30664C
30665C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30666C
30667      CHARACTER*4 IWRITE
30668      CHARACTER*4 IBUGA3
30669      CHARACTER*4 IERROR
30670C
30671      CHARACTER*4 ISTEPN
30672      CHARACTER*4 ISUBN1
30673      CHARACTER*4 ISUBN2
30674C
30675C---------------------------------------------------------------------
30676C
30677      DIMENSION X(*)
30678      DIMENSION Y(*)
30679      DIMENSION XIDTEM(*)
30680C
30681C-----COMMON----------------------------------------------------------
30682C
30683      INCLUDE 'DPCOP2.INC'
30684C
30685C-----START POINT-----------------------------------------------------
30686C
30687      ISUBN1='SPEC'
30688      ISUBN2='IF  '
30689      IERROR='NO'
30690C
30691      IF(IBUGA3.EQ.'ON')THEN
30692        WRITE(ICOUT,999)
30693  999   FORMAT(1X)
30694        CALL DPWRST('XXX','BUG ')
30695        WRITE(ICOUT,51)
30696   51   FORMAT('***** AT THE BEGINNING OF SPECIF--')
30697        CALL DPWRST('XXX','BUG ')
30698        WRITE(ICOUT,52)IBUGA3,N
30699   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
30700        CALL DPWRST('XXX','BUG ')
30701        DO55I=1,N
30702          WRITE(ICOUT,56)I,X(I),Y(I)
30703   56     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
30704          CALL DPWRST('XXX','BUG ')
30705   55   CONTINUE
30706      ENDIF
30707C
30708C               ********************************************
30709C               **  STEP 21--                             **
30710C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
30711C               ********************************************
30712C
30713      ISTEPN='21'
30714      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
30715C
30716      IF(N.LT.2)THEN
30717        WRITE(ICOUT,999)
30718        CALL DPWRST('XXX','WRIT')
30719        WRITE(ICOUT,1201)
30720 1201   FORMAT('***** ERROR IN THE TEST SPECIFICITY')
30721        CALL DPWRST('XXX','WRIT')
30722        WRITE(ICOUT,1203)
30723 1203   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
30724     1         'VARIABLES IS LESS THAN TWO')
30725        CALL DPWRST('XXX','WRIT')
30726        WRITE(ICOUT,1205)N
30727 1205   FORMAT('SAMPLE SIZE = ',I8)
30728        CALL DPWRST('XXX','WRIT')
30729        IERROR='YES'
30730        GOTO9000
30731      ENDIF
30732C
30733C               ********************************************
30734C               **  STEP 22--                             **
30735C               **  CHECK THAT THE VARIABLES HAVE AT MOST **
30736C               **  TWO DISTINCT VALUES (1 INDICATES A    **
30737C               **  SUCCESS, 0 INDICATES A FAILURE).      **
30738C               ********************************************
30739C
30740      ISTEPN='22'
30741      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
30742C
30743C     NOTE: CHECK FOR SPECIAL CASE N = 2.  IN THIS CASE,
30744C           ASSUME WE HAVE A 2X2 TABLE OF COUNTS INSTEAD
30745C           OF RAW DATA.
30746C
30747      IF(N.EQ.2)THEN
30748        N11=INT(X(1)+0.5)
30749        N21=INT(X(2)+0.5)
30750        N12=INT(Y(1)+0.5)
30751        N22=INT(Y(2)+0.5)
30752C
30753C       CHECK IF ALL ENTRIES 0 OR 1. IF SO, ASSUME
30754C       RAW DATA CASE.
30755C
30756        IF((N11.EQ.0 .OR. N11.EQ.1) .AND.
30757     1     (N12.EQ.0 .OR. N12.EQ.1) .AND.
30758     1     (N21.EQ.0 .OR. N21.EQ.1) .AND.
30759     1     (N22.EQ.0 .OR. N22.EQ.1)) GOTO1349
30760C
30761        IF(N11.LT.0)THEN
30762          WRITE(ICOUT,999)
30763          CALL DPWRST('XXX','BUG ')
30764          WRITE(ICOUT,1201)
30765          CALL DPWRST('XXX','BUG ')
30766          WRITE(ICOUT,1311)
30767 1311     FORMAT('      ROW 1 COLUMN 1 OF THE COUNTS TABLE IS ',
30768     1           'NEGATIVE.')
30769          CALL DPWRST('XXX','BUG ')
30770        ELSEIF(N21.LT.0)THEN
30771          WRITE(ICOUT,999)
30772          CALL DPWRST('XXX','BUG ')
30773          WRITE(ICOUT,1201)
30774          CALL DPWRST('XXX','BUG ')
30775          WRITE(ICOUT,1321)
30776 1321     FORMAT('      ROW 2 COLUMN 1 OF THE COUNTS TABLE IS ',
30777     1           'NEGATIVE.')
30778          CALL DPWRST('XXX','BUG ')
30779        ELSEIF(N12.LT.0)THEN
30780          WRITE(ICOUT,999)
30781          CALL DPWRST('XXX','BUG ')
30782          WRITE(ICOUT,1201)
30783          CALL DPWRST('XXX','BUG ')
30784          WRITE(ICOUT,1331)
30785 1331     FORMAT('      ROW 1 COLUMN 2 OF THE COUNTS TABLE IS ',
30786     1           'NEGATIVE.')
30787          CALL DPWRST('XXX','BUG ')
30788        ELSEIF(N22.LT.0)THEN
30789          WRITE(ICOUT,999)
30790          CALL DPWRST('XXX','BUG ')
30791          WRITE(ICOUT,1201)
30792          CALL DPWRST('XXX','BUG ')
30793          WRITE(ICOUT,1341)
30794 1341     FORMAT('      ROW 2 COLUMN 2 OF THE COUNTS TABLE IS ',
30795     1           'NEGATIVE.')
30796          CALL DPWRST('XXX','BUG ')
30797        ENDIF
30798C
30799        AN11=REAL(N11)
30800        AN21=REAL(N21)
30801        AN12=REAL(N12)
30802        AN22=REAL(N22)
30803        STAT=AN22/(AN21+AN22)
30804        GOTO3000
30805      ENDIF
30806C
30807      CALL DISTIN(X,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
30808      IF(NDIST.EQ.1)THEN
30809        AVAL=XIDTEM(1)
30810        IF(ABS(AVAL).LE.0.5)THEN
30811          AVAL=0.0
30812        ELSE
30813          AVAL=1.0
30814        ENDIF
30815        DO2202I=1,N
30816          X(I)=1.0
30817 2202   CONTINUE
30818      ELSEIF(NDIST.EQ.2)THEN
30819        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
30820          DO2203I=1,N
30821            IF(X(I).NE.1.0)X(I)=0.0
30822 2203     CONTINUE
30823        ELSE
30824          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
30825          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
30826          DO2208I=1,N
30827            IF(X(I).EQ.ATEMP1)X(I)=0.0
30828            IF(X(I).EQ.ATEMP2)X(I)=1.0
30829 2208     CONTINUE
30830        ENDIF
30831      ELSE
30832        WRITE(ICOUT,999)
30833        CALL DPWRST('XXX','BUG ')
30834        WRITE(ICOUT,1201)
30835        CALL DPWRST('XXX','BUG ')
30836        WRITE(ICOUT,2211)
30837 2211   FORMAT('      RESPONSE VARIABLE ONE SHOULD CONTAIN AT MOST')
30838        CALL DPWRST('XXX','BUG ')
30839        WRITE(ICOUT,2213)
30840 2213   FORMAT('      TWO DISTINCT VALUES.')
30841        CALL DPWRST('XXX','BUG ')
30842        WRITE(ICOUT,2215)NDIST
30843 2215   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
30844        CALL DPWRST('XXX','BUG ')
30845        IERROR='YES'
30846        GOTO9000
30847      ENDIF
30848C
30849 1349 CONTINUE
30850C
30851      CALL DISTIN(Y,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
30852      IF(NDIST.EQ.1)THEN
30853        AVAL=XIDTEM(1)
30854        IF(ABS(AVAL).LE.0.5)THEN
30855          AVAL=0.0
30856        ELSE
30857          AVAL=1.0
30858        ENDIF
30859        DO2302I=1,N
30860          Y(I)=1.0
30861 2302   CONTINUE
30862      ELSEIF(NDIST.EQ.2)THEN
30863        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
30864          DO2303I=1,N
30865            IF(Y(I).NE.1.0)Y(I)=0.0
30866 2303     CONTINUE
30867        ELSE
30868          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
30869          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
30870          DO2308I=1,N
30871            IF(Y(I).EQ.ATEMP1)Y(I)=0.0
30872            IF(Y(I).EQ.ATEMP2)Y(I)=1.0
30873 2308     CONTINUE
30874        ENDIF
30875      ELSE
30876        WRITE(ICOUT,999)
30877        CALL DPWRST('XXX','BUG ')
30878        WRITE(ICOUT,1201)
30879        CALL DPWRST('XXX','BUG ')
30880        WRITE(ICOUT,2311)
30881 2311   FORMAT('      RESPONSE VARIABLE TWO SHOULD CONTAIN AT MOST')
30882        CALL DPWRST('XXX','BUG ')
30883        WRITE(ICOUT,2313)
30884 2313   FORMAT('      TWO DISTINCT VALUES.')
30885        CALL DPWRST('XXX','BUG ')
30886        WRITE(ICOUT,2315)NDIST
30887 2315   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
30888        CALL DPWRST('XXX','BUG ')
30889        IERROR='YES'
30890        GOTO9000
30891      ENDIF
30892C
30893      N11=0
30894      N12=0
30895      N21=0
30896      N22=0
30897      DO2410I=1,N
30898        IF(X(I).EQ.1.0 .AND. Y(I).EQ.1.0)THEN
30899          N11=N11+1
30900        ELSEIF(X(I).EQ.0.0 .AND. Y(I).EQ.0.0)THEN
30901          N22=N22+1
30902        ELSEIF(X(I).EQ.1.0 .AND. Y(I).EQ.0.0)THEN
30903          N12=N12+1
30904        ELSEIF(X(I).EQ.0.0 .AND. Y(I).EQ.1.0)THEN
30905          N21=N21+1
30906        ENDIF
30907 2410 CONTINUE
30908C
30909      STAT=REAL(N22)/REAL(N21+N22)
30910C
30911 3000 CONTINUE
30912C
30913C
30914C               *******************************
30915C               **  STEP 3--                 **
30916C               **  WRITE OUT A LINE         **
30917C               **  OF SUMMARY INFORMATION.  **
30918C               *******************************
30919C
30920      IF(IFEEDB.EQ.'OFF')GOTO890
30921      IF(IWRITE.EQ.'OFF' .OR. IWRITE.EQ.'NO')GOTO890
30922      WRITE(ICOUT,999)
30923      CALL DPWRST('XXX','BUG ')
30924      WRITE(ICOUT,811)STAT
30925  811 FORMAT('THE TEST SPECIFICITY PROPORTION = ',G15.7)
30926      CALL DPWRST('XXX','BUG ')
30927  890 CONTINUE
30928C
30929C               *****************
30930C               **  STEP 90--  **
30931C               **  EXIT.      **
30932C               *****************
30933C
30934 9000 CONTINUE
30935      IF(IBUGA3.EQ.'ON')THEN
30936        WRITE(ICOUT,999)
30937        CALL DPWRST('XXX','BUG ')
30938        WRITE(ICOUT,9011)
30939 9011   FORMAT('***** AT THE END OF SPECIF--')
30940        CALL DPWRST('XXX','BUG ')
30941        WRITE(ICOUT,9012)IBUGA3,IERROR
30942 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
30943        CALL DPWRST('XXX','BUG ')
30944        WRITE(ICOUT,9013)N,N11,N12,N21,N22
30945 9013   FORMAT('N,N11,N12,N21,N22 = ',5I10)
30946        CALL DPWRST('XXX','BUG ')
30947        WRITE(ICOUT,9015)STAT
30948 9015   FORMAT('STAT = ',G15.7)
30949        CALL DPWRST('XXX','BUG ')
30950      ENDIF
30951C
30952      RETURN
30953      END
30954      DOUBLE PRECISION FUNCTION SPHINC( N, R )
30955*
30956*                   R
30957*     SPHINC =  K  I  exp(-t*t/2) t**(N-1) dt, for N > 1.
30958*                N  0
30959*
30960      INTEGER I, N
30961      DOUBLE PRECISION R, RR, RP, PF, ET, PHI
30962      PARAMETER ( RP = 2.5066 28274 63100 04D0 )
30963      IF ( R .GT. 0 ) THEN
30964         RR = R*R
30965         PF = 1.0D0
30966         DO 100 I = N-2, 2, -2
30967            PF = 1.0D0 + RR*PF/DBLE(I)
30968  100    CONTINUE
30969         IF ( MOD( N, 2 ) .EQ. 0 ) THEN
30970            ET = LOG(PF) - RR/2.0D0
30971            IF ( ET .GT. -40.0D0 ) THEN
30972               SPHINC = 1.0D0 - EXP( ET )
30973            ELSE
30974               SPHINC = 1.0D0
30975            END IF
30976         ELSE
30977            SPHINC = 1  - 2*PHI(-R)
30978            ET = LOG(R*PF) - RR/2
30979            IF ( ET .GT. -40 ) SPHINC = SPHINC - 2.0D0*EXP( ET )/RP
30980         ENDIF
30981      ELSE
30982         SPHINC = 0.0D0
30983      ENDIF
30984C
30985      RETURN
30986      END
30987      DOUBLE PRECISION FUNCTION SPHLIM( N, A, B, INFI, Y )
30988      DOUBLE PRECISION A(*), B(*), Y(*), CMN, CMX, SPHINC
30989      INTEGER INFI(*), I, N
30990      CMN = -10*N
30991      CMX =  10*N
30992      DO 100 I = 1,N
30993         IF ( Y(I) .GT. 0.0D0 ) THEN
30994            IF ( INFI(I) .NE. 1 ) CMX = MIN( CMX, B(I)/Y(I) )
30995            IF ( INFI(I) .NE. 0 ) CMN = MAX( CMN, A(I)/Y(I) )
30996         ELSE
30997            IF ( INFI(I) .NE. 1 ) CMN = MAX( CMN, B(I)/Y(I) )
30998            IF ( INFI(I) .NE. 0 ) CMX = MIN( CMX, A(I)/Y(I) )
30999         ENDIF
31000  100 CONTINUE
31001      IF ( CMN .LT. CMX ) THEN
31002         IF ( CMN .GE. 0.0D0 .AND. CMX .GE. 0.0D0 ) THEN
31003            SPHLIM = SPHINC( N,  CMX ) - SPHINC( N,  CMN )
31004         ELSEIF ( CMN .LT. 0.0D0 .AND. CMX .GE. 0.0D0 ) THEN
31005            SPHLIM = SPHINC( N, -CMN ) + SPHINC( N,  CMX )
31006         ELSE
31007            SPHLIM = SPHINC( N, -CMN ) - SPHINC( N, -CMX )
31008         ENDIF
31009      ELSE
31010         SPHLIM = 0.0D0
31011      ENDIF
31012C
31013      RETURN
31014      END
31015      SUBROUTINE SPHMVN(N, LOWER, UPPER, INFIN, CORREL, MAXPTS,
31016     &     ABSEPS, RELEPS, ERROR, VALUE, INFORM)
31017*
31018*     A subroutine for computing multivariate normal probabilities.
31019*     This subroutine uses a Mont-Carlo algorithm given in the paper
31020*       "Three Digit Accurate Multiple Normal Probabilities",
31021*          pp. 369-380, Numer. Math. 35(1980), by I. Deak
31022*
31023*
31024*  Parameters
31025*
31026*     N      INTEGER, the number of variables.
31027*     LOWER  REAL, array of lower integration limits.
31028*     UPPER  REAL, array of upper integration limits.
31029*     INFIN  INTEGER, array of integration limits flags:
31030*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
31031*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
31032*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
31033*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
31034*     CORREL REAL, array of correlation coefficients; the correlation
31035*            coefficient in row I column J of the correlation matrix
31036*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
31037*     MAXPTS INTEGER, maximum number of function values allowed. This
31038*            parameter can be used to limit the time. A sensible
31039*            strategy is to start with MAXPTS = 1000*N, and then
31040*            increase MAXPTS if ERROR is too large.
31041*     ABSEPS REAL absolute error tolerance.
31042*     RELEPS REAL relative error tolerance.
31043*     ERROR  REAL, estimated absolute error, with 99% confidence level.
31044*     VALUE  REAL, estimated value for the integral
31045*     INFORM INTEGER, termination status parameter:
31046*            if INFORM = 0, normal completion with ERROR < EPS;
31047*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
31048*                           function vaules used; increase MAXPTS to
31049*                           decrease ERROR;
31050*            if INFORM = 2, N > 100.
31051*
31052      EXTERNAL SPNRML
31053      INTEGER N, INFIS, INFIN(*), MAXPTS, MPT, INFORM, NS, IVLS
31054      DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*),
31055     &     ABSEPS, RELEPS, ERROR, VALUE, D, E, EPS, SPNRNT
31056      IF ( N .GT. 100 ) THEN
31057         INFORM = 2
31058         VALUE = 0.0D0
31059         ERROR = 1.0D0
31060         RETURN
31061      ENDIF
31062      INFORM = INT(SPNRNT(N,CORREL,LOWER,UPPER,INFIN,INFIS,D,E,NS))
31063      IF ( N-INFIS .EQ. 0 ) THEN
31064         VALUE = 1.0D0
31065         ERROR = 0.0D0
31066      ELSE IF ( N-INFIS .EQ. 1 ) THEN
31067         VALUE = E - D
31068         ERROR = 2E-16
31069      ELSE
31070*
31071*        Call then Monte-Carlo integration subroutine
31072*
31073         MPT = 25 + NS/N**3
31074         CALL SCRUDE( N-INFIS, MPT, ERROR, VALUE, 0 )
31075         IVLS = MPT*NS
31076 10      EPS = MAX( ABSEPS, RELEPS*ABS(VALUE) )
31077         IF ( ERROR .GT. EPS .AND. IVLS .LT. MAXPTS ) THEN
31078            MPT = MAX( MIN( INT(MPT*(ERROR/(EPS))**2),
31079     &                      ( MAXPTS - IVLS )/NS ), 10 )
31080            CALL SCRUDE( N-INFIS, MPT, ERROR, VALUE, 1 )
31081            IVLS = IVLS + MPT*NS
31082            GO TO 10
31083         ENDIF
31084         IF ( ERROR. GT. EPS .AND. IVLS .GE. MAXPTS ) INFORM = 1
31085      ENDIF
31086C
31087      RETURN
31088      END
31089      SUBROUTINE SPHMVT( N, NU, LOWER, UPPER, INFIN, CORREL, MAXPTS,
31090     *                   ABSEPS, RELEPS, ERROR, VALUE, INFORM )
31091*
31092*     A subroutine for computing multivariate t probabilities.
31093*     This subroutine uses a modified version of the Mont-Carlo
31094*     algorithm for multivariatie Normal probabilities in the paper
31095*       "Three Digit Accurate Multiple Normal Probabilities",
31096*          pp. 369-380, Numer. Math. 35(1980), by I. Deak
31097*
31098*
31099*  Parameters
31100*
31101*     N      INTEGER, the number of variables.
31102*     NU     INTEGER, the number of degrees of freedom.
31103*     LOWER  REAL, array of lower integration limits.
31104*     UPPER  REAL, array of upper integration limits.
31105*     INFIN  INTEGER, array of integration limits flags:
31106*            if INFIN(I) < 0, Ith limits are (-infinity, infinity);
31107*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
31108*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
31109*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
31110*     CORREL REAL, array of correlation coefficients; the correlation
31111*            coefficient in row I column J of the correlation matrix
31112*            should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
31113*     MAXPTS INTEGER, maximum number of function values allowed. This
31114*            parameter can be used to limit the time. A sensible
31115*            strategy is to start with MAXPTS = 1000*N, and then
31116*            increase MAXPTS if ERROR is too large.
31117*     ABSEPS REAL absolute error tolerance.
31118*     RELEPS REAL relative error tolerance.
31119*     ERROR  REAL, estimated absolute error, with 99% confidence level.
31120*     VALUE  REAL, estimated value for the integral
31121*     INFORM INTEGER, termination status parameter:
31122*            if INFORM = 0, normal completion with ERROR < EPS;
31123*            if INFORM = 1, completion with ERROR > EPS and MAXPTS
31124*                           function vaules used; increase MAXPTS to
31125*                           decrease ERROR;
31126*            if INFORM = 2, N > 50.
31127*
31128      EXTERNAL SPMVTI
31129      INTEGER N, NU, INFIS, INFIN(*), MAXPTS, MPT, INFORM, NS, IVLS
31130      DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*),
31131     *     ABSEPS, RELEPS, ERROR, VALUE, D, E, EPS, SPMVTI
31132      IF ( N .GT. 50 ) THEN
31133         INFORM = 2
31134         VALUE = 0.0D0
31135         ERROR = 1.0D0
31136         RETURN
31137      ENDIF
31138      INFORM = INT(SPMVTI(N,NU,CORREL,LOWER,UPPER,INFIN,INFIS,D,E,NS))
31139      IF ( N-INFIS .EQ. 0 ) THEN
31140         VALUE = 1.0D0
31141         ERROR = 0.0D0
31142      ELSE IF ( N-INFIS .EQ. 1 ) THEN
31143         VALUE = E - D
31144         ERROR = 2E-16
31145      ELSE
31146*
31147*        Call the Monte-Carlo integration subroutine
31148*
31149         MPT = 25 + NS/N**3
31150         CALL TCRUDE( N-INFIS, MPT, ERROR, VALUE, 0 )
31151         IVLS = MPT*NS
31152 10      EPS = MAX( ABSEPS, RELEPS*ABS(VALUE) )
31153         IF ( ERROR .GT. EPS .AND. IVLS .LT. MAXPTS ) THEN
31154            MPT = MAX( MIN( INT( MPT*( ERROR/EPS )**2 ),
31155     *                      ( MAXPTS - IVLS )/NS ), 10 )
31156            CALL TCRUDE( N-INFIS, MPT, ERROR, VALUE, 1 )
31157            IVLS = IVLS + MPT*NS
31158            GO TO 10
31159         ENDIF
31160         IF ( ERROR. GT. EPS .AND. IVLS .GE. MAXPTS ) INFORM = 1
31161      ENDIF
31162C
31163      RETURN
31164      END
31165      DOUBLE PRECISION FUNCTION SPHLMT( N, NU, A, B, INFI, Y )
31166      DOUBLE PRECISION A(*), B(*), Y(*), CMN, CMX, SPHNCT
31167      INTEGER INFI(*), I, N, NU
31168      CMN = -10.0D0*N
31169      CMX =  10.0D0*N
31170      DO 100 I = 1,N
31171         IF ( Y(I) .GT. 0.0D0 ) THEN
31172            IF ( INFI(I) .NE. 1 ) CMX = MIN( CMX, B(I)/Y(I) )
31173            IF ( INFI(I) .NE. 0 ) CMN = MAX( CMN, A(I)/Y(I) )
31174         ELSE
31175            IF ( INFI(I) .NE. 1 ) CMN = MAX( CMN, B(I)/Y(I) )
31176            IF ( INFI(I) .NE. 0 ) CMX = MIN( CMX, A(I)/Y(I) )
31177         ENDIF
31178  100 CONTINUE
31179      IF ( CMN .LT. CMX ) THEN
31180         IF ( CMN .GE. 0.0D0 .AND. CMX .GE. 0.0D0 ) THEN
31181            SPHLMT = SPHNCT( N, NU,  CMX ) - SPHNCT( N, NU,  CMN )
31182         ELSEIF ( CMN .LT. 0.0D0 .AND. CMX .GE. 00D0 ) THEN
31183            SPHLMT = SPHNCT( N, NU, -CMN ) + SPHNCT( N, NU,  CMX )
31184         ELSE
31185            SPHLMT = SPHNCT( N, NU, -CMN ) - SPHNCT( N, NU, -CMX )
31186         ENDIF
31187      ELSE
31188         SPHLMT = 0.0D0
31189      ENDIF
31190C
31191      RETURN
31192      END
31193      DOUBLE PRECISION FUNCTION SPHNCT( M, NU, R )
31194*
31195*                   R
31196*     SPHNCT =  K  I  ( 1 + t**2/NU )**(-(NU+M)/2 ) t**(M-1) dt, for M > 0.
31197*                M  0
31198*
31199      INTEGER I, M, NU, NUOLD
31200      DOUBLE PRECISION R, RR, RT, PI, PF, STUDNT, TCON
31201      PARAMETER ( PI = 3.14159 26535 89793D0 )
31202      SAVE NUOLD, TCON
31203      DATA NUOLD / 0 /
31204      IF ( R .GT. 0.0D0 ) THEN
31205         IF ( M .LE. 1 ) THEN
31206            SPHNCT = 2.0D0*STUDNT( NU, R ) - 1.0D0
31207         ELSE IF ( M .EQ. 2 ) THEN
31208            SPHNCT = 1.0D0 - 1.0D0/SQRT( 1.0D0 + R*R/NU )**NU
31209         ELSE
31210            RR = R*R/NU
31211            RT = RR/( 1.0D0 + RR )
31212            PF = 1.0D0
31213            DO 100 I = M - 2, 2, -2
31214               PF = 1 + PF*RT*DBLE( NU + I - 2 )/DBLE(I)
31215  100       CONTINUE
31216            PF = PF*SQRT( RT/RR )**NU
31217            IF ( MOD( M, 2 ) .EQ. 0 ) THEN
31218               SPHNCT = 1.0D0 - PF
31219            ELSE
31220               IF ( NU .NE. NUOLD ) THEN
31221                  NUOLD = NU
31222                  TCON = 1.0D0
31223                  IF ( MOD( NU, 2 ) .EQ. 0 ) THEN
31224                     TCON = TCON/2.0D0
31225                  ELSE
31226                     TCON = TCON/PI
31227                  END IF
31228                  DO 200 I = NU-2, 1, -2
31229                     TCON = ( I + 1 )*TCON/I
31230  200             CONTINUE
31231               END IF
31232               SPHNCT = 2.0D0*
31233     &                  ( STUDNT( NU, R ) - TCON*SQRT(RT)*PF ) - 1.0D0
31234            ENDIF
31235         ENDIF
31236      ELSE
31237         SPHNCT = 0.0D0
31238      ENDIF
31239C
31240      RETURN
31241      END
31242      DOUBLE PRECISION FUNCTION spmpar(i)
31243C-----------------------------------------------------------------------
31244C
31245C     SPMPAR PROVIDES THE SINGLE PRECISION MACHINE CONSTANTS FOR
31246C     THE COMPUTER BEING USED. IT IS ASSUMED THAT THE ARGUMENT
31247C     I IS AN INTEGER HAVING ONE OF THE VALUES 1, 2, OR 3. IF THE
31248C     SINGLE PRECISION ARITHMETIC BEING USED HAS M BASE B DIGITS AND
31249C     ITS SMALLEST AND LARGEST EXPONENTS ARE EMIN AND EMAX, THEN
31250C
31251C        SPMPAR(1) = B**(1 - M), THE MACHINE PRECISION,
31252C
31253C        SPMPAR(2) = B**(EMIN - 1), THE SMALLEST MAGNITUDE,
31254C
31255C        SPMPAR(3) = B**EMAX*(1 - B**(-M)), THE LARGEST MAGNITUDE.
31256C
31257C-----------------------------------------------------------------------
31258C     WRITTEN BY
31259C        ALFRED H. MORRIS, JR.
31260C        NAVAL SURFACE WARFARE CENTER
31261C        DAHLGREN VIRGINIA
31262C-----------------------------------------------------------------------
31263C-----------------------------------------------------------------------
31264C     MODIFIED BY BARRY W. BROWN TO RETURN DOUBLE PRECISION MACHINE
31265C     CONSTANTS FOR THE COMPUTER BEING USED.  THIS MODIFICATION WAS
31266C     MADE AS PART OF CONVERTING BRATIO TO DOUBLE PRECISION
31267C-----------------------------------------------------------------------
31268C     .. Scalar Arguments ..
31269      INTEGER i
31270C     ..
31271C     .. Local Scalars ..
31272      DOUBLE PRECISION b,binv,bm1,one,w,z
31273      INTEGER emax,emin,ibeta,m
31274C     ..
31275C     .. External Functions ..
31276      INTEGER ipmpar
31277      EXTERNAL ipmpar
31278C     ..
31279C     .. Intrinsic Functions ..
31280      INTRINSIC dble
31281C
31282      INCLUDE 'DPCOMC.INC'
31283C     ..
31284C     .. Executable Statements ..
31285C
31286      IF (i.GT.1) GO TO 10
31287      b = i1mach(10)
31288      m = i1mach(11)
31289CCCCC b = ipmpar(4)
31290CCCCC m = ipmpar(8)
31291      spmpar = b** (1-m)
31292      RETURN
31293C
31294   10 IF (i.GT.2) GO TO 20
31295      b = i1mach(10)
31296CCCCC b = ipmpar(4)
31297      emin = i1mach(12)
31298CCCCC emin = ipmpar(9)
31299      one = dble(1)
31300      binv = one/b
31301      w = b** (emin+2)
31302      spmpar = ((w*binv)*binv)*binv
31303      RETURN
31304C
31305   20 continue
31306      ibeta = i1mach(10)
31307CCCCC ibeta = ipmpar(4)
31308      m = i1mach(11)
31309CCCCC m = ipmpar(8)
31310      emax = i1mach(13)
31311CCCCC emax = ipmpar(10)
31312C
31313      b = ibeta
31314      bm1 = ibeta - 1
31315      one = dble(1)
31316      z = b** (m-1)
31317      w = ((z-one)*b+bm1)/ (b*z)
31318C
31319      z = b** (emax-2)
31320      spmpar = ((w*z)*b)*b
31321      RETURN
31322
31323      END
31324      DOUBLE PRECISION FUNCTION SPMVT(N)
31325*
31326*     Integrand subroutine
31327*
31328      DOUBLE PRECISION LOWER(*), UPPER(*), CORREL(*), D, E, ZERO
31329      INTEGER N, INFIN(*), INFIS
31330      INTEGER NL, IJ, I, II, J, K, NS, NSO, ND, NU, NUIN
31331      PARAMETER ( NL = 50, ND = 2, ZERO = 0 )
31332      DOUBLE PRECISION A(NL), B(NL), U(NL,NL), Y(NL), COV(NL*(NL+1)/2)
31333      INTEGER INFI(NL), IS(NL), IC(NL)
31334      DOUBLE PRECISION RS, TMP, BT, RNOR, SPHLMT, SPMVTI
31335      SAVE NU, A, B, INFI, U
31336*
31337*    First generate U = COV*(random orthogonal matrix)
31338*
31339      DO 100 K = N-1, 1, -1
31340         TMP = 0
31341         DO 200 J = K, N
31342            Y(J) = RNOR()
31343            TMP = TMP + Y(J)**2
31344  200    CONTINUE
31345         TMP = -SQRT(TMP)
31346         BT = 1/( TMP*( Y(K) + TMP ) )
31347         Y(K) = Y(K) + TMP
31348         DO 300 I = 1, N
31349            TMP = 0
31350            DO 350 J = K, N
31351               TMP = TMP + U(I,J)*Y(J)
31352  350       CONTINUE
31353            TMP = BT*TMP
31354            DO 380 J = K, N
31355               U(I,J) = U(I,J) - TMP*Y(J)
31356  380       CONTINUE
31357  300    CONTINUE
31358  100 CONTINUE
31359*
31360*     Compute integrand average
31361*
31362      RS = SQRT( DBLE(ND) )
31363      DO 400 I = 1,ND
31364         IC(I) = I
31365  400 CONTINUE
31366      IC(ND+1) = N+1
31367      SPMVT = 0.0D0
31368      NS = 0
31369 10   CONTINUE
31370      DO 410 I = 1,ND
31371         IS(I) = -1
31372  410 CONTINUE
31373 20   CONTINUE
31374      DO 420 I = 1, N
31375         TMP = 0
31376         DO 430 J = 1,ND
31377            TMP = TMP + IS(J)*U( I, IC(J) )
31378  430    CONTINUE
31379         Y(I) = TMP/RS
31380  420 CONTINUE
31381      NS = NS + 1
31382      SPMVT = SPMVT + ( SPHLMT( N, NU, A, B, INFI, Y ) - SPMVT )/NS
31383      DO 440 I = 1, ND
31384         IS(I) = IS(I) + 2
31385         IF ( IS(I) .LT. 2 ) GO TO 20
31386         IS(I) = -1
31387  440 CONTINUE
31388      DO 450 I = 1, ND
31389         IC(I) = IC(I) + 1
31390         IF ( IC(I) .LT. IC(I+1)  ) GO TO 10
31391         IC(I) = I
31392  450 CONTINUE
31393      SPMVT = SPMVT/2.0D0
31394      RETURN
31395*
31396      ENTRY SPMVTI( N,NUIN, CORREL, LOWER,UPPER,INFIN, INFIS, D,E, NSO )
31397      SPMVTI = 0.0D0
31398      NU = NUIN
31399*
31400*     Initialisation
31401*
31402      II = 0
31403      IJ = 0
31404      INFIS = 0
31405      DO 500 I = 1, N
31406         INFI(I) = INFIN(I)
31407         IF ( INFI(I) .LT. 0 ) THEN
31408            INFIS = INFIS + 1
31409         ELSE
31410            A(I) = 0.0D0
31411            B(I) = 0.0D0
31412            IF ( INFI(I) .NE. 0 ) A(I) = LOWER(I)
31413            IF ( INFI(I) .NE. 1 ) B(I) = UPPER(I)
31414         ENDIF
31415         DO 550 J = 1, I-1
31416            II = II + 1
31417            IJ = IJ + 1
31418            COV(IJ) = CORREL(II)
31419  550    CONTINUE
31420         IJ = IJ + 1
31421         COV(IJ) = 1
31422  500 CONTINUE
31423      NSO = 1
31424      DO 600 I = 1,ND
31425         NSO = 2*NSO*( N - INFIS - I + 1 )/I
31426  600 CONTINUE
31427*
31428*     First move any doubly infinite limits to innermost positions
31429*
31430      IF ( INFIS .LT. N ) THEN
31431         DO 700 I = N, N-INFIS+1, -1
31432            IF ( INFI(I) .GE. 0 ) THEN
31433               DO 750 J = 1,I-1
31434                  IF ( INFI(J) .LT. 0 ) THEN
31435                     CALL RCSWAP( J, I, A, B, INFI, N, COV )
31436                     GO TO 700
31437                  ENDIF
31438  750          CONTINUE
31439            ENDIF
31440  700    CONTINUE
31441      ENDIF
31442      II = 0
31443      DO 800 I = 1, N-INFIS
31444         DO 810 J = 1, I
31445            U(J,I) = 0
31446            II = II + 1
31447            U(I,J) = COV(II)
31448  810    CONTINUE
31449  800 CONTINUE
31450*
31451*     Determine Cholesky decomposition
31452*
31453      DO 900 J = 1, N-INFIS
31454         DO 910 I = J, N-INFIS
31455            TMP = U(I,J)
31456            DO 920 K = 1, J-1
31457               TMP = TMP - U(I,K)*U(J,K)
31458  920       CONTINUE
31459            IF ( I .EQ. J ) THEN
31460               U(J,J) = SQRT( MAX( TMP, ZERO ) )
31461            ELSE IF ( U(I,I) .GT. 0 ) THEN
31462               U(I,J) = TMP/U(J,J)
31463            ELSE
31464               U(I,J) = 0.0D0
31465            END IF
31466  910    CONTINUE
31467  900 CONTINUE
31468      DO 950 I = 1, N-INFIS
31469         IF ( U(I,I) .GT. 0 ) THEN
31470            IF ( INFI(I) .NE. 0 ) A(I) = A(I)/U(I,I)
31471            IF ( INFI(I) .NE. 1 ) B(I) = B(I)/U(I,I)
31472            DO 960 J = 1,I
31473               U(I,J) = U(I,J)/U(I,I)
31474  960       CONTINUE
31475         ENDIF
31476  950 CONTINUE
31477      CALL MVTLMS( NU, A(1), B(1), INFI(1), D, E )
31478C
31479      RETURN
31480      END
31481      DOUBLE PRECISION FUNCTION SPNRML(N)
31482*
31483*     Integrand subroutine
31484*
31485      DOUBLE PRECISION LOWER(*), UPPER(*), CORREL(*), D, E, ZERO
31486      INTEGER N, INFIN(*), INFIS
31487      INTEGER NL, IJ, I, J, K, NS, NSO, ND
31488      PARAMETER ( NL = 100, ND = 3, ZERO = 0 )
31489      DOUBLE PRECISION A(NL), B(NL), U(NL,NL), Y(NL)
31490      INTEGER INFI(NL), IS(NL), IC(NL)
31491      DOUBLE PRECISION RS, TMP, BT, RNOR, SPHLIM, SPNRNT
31492C
31493CCCCC INCLUDE 'DPCOPA.INC'
31494CCCCC INCLUDE 'DPCOZD.INC'
31495CCCCC EQUIVALENCE (DGARBG(IDGA10),U(1,1))
31496C
31497      SAVE A, B, INFI, U
31498*
31499*    First generate U = COV*(random orthogonal matrix)
31500*
31501      DO 100 K = N-1, 1, -1
31502         TMP = 0
31503         DO 200 J = K, N
31504            Y(J) = RNOR()
31505            TMP = TMP + Y(J)**2
31506  200    CONTINUE
31507         TMP = -SQRT(TMP)
31508         BT = 1/( TMP*( Y(K) + TMP ) )
31509         Y(K) = Y(K) + TMP
31510         DO 300 I = 1, N
31511            TMP = 0
31512            DO 400 J = K, N
31513               TMP = TMP + U(I,J)*Y(J)
31514  400       CONTINUE
31515            TMP = BT*TMP
31516            DO 500 J = K, N
31517               U(I,J) = U(I,J) - TMP*Y(J)
31518  500       CONTINUE
31519  300    CONTINUE
31520  100 CONTINUE
31521*
31522*     Compute integrand average
31523*
31524      RS = SQRT( DBLE(ND) )
31525      DO 600 I = 1,ND
31526         IC(I) = I
31527 600  CONTINUE
31528      IC(ND+1) = N+1
31529      SPNRML = 0.0D0
31530      NS = 0
31531 10   DO 650 I = 1,ND
31532         IS(I) = -1
31533 650  CONTINUE
31534 20   DO 700 I = 1, N
31535         TMP = 0
31536         DO 750 J = 1,ND
31537            TMP = TMP + IS(J)*U(I,IC(J))
31538 750     CONTINUE
31539         Y(I) = TMP/RS
31540 700  CONTINUE
31541      NS = NS + 1
31542      SPNRML = SPNRML + ( SPHLIM( N, A, B, INFI, Y ) - SPNRML )/NS
31543      DO 800 I = 1, ND
31544         IS(I) = IS(I) + 2
31545         IF ( IS(I) .LT. 2 ) GO TO 20
31546         IS(I) = -1
31547 800  CONTINUE
31548      DO 850 I = 1, ND
31549         IC(I) = IC(I) + 1
31550         IF ( IC(I) .LT. IC(I+1)  ) GO TO 10
31551         IC(I) = I
31552 850  CONTINUE
31553      SPNRML = SPNRML/2.0D0
31554      RETURN
31555      ENTRY SPNRNT( N, CORREL, LOWER, UPPER, INFIN, INFIS, D, E, NSO )
31556      SPNRNT = 0
31557*
31558*     Initialisation
31559*
31560      IJ = 0
31561      INFIS = 0
31562      DO 900 I = 1, N
31563         INFI(I) = INFIN(I)
31564         IF ( INFI(I) .LT. 0 ) THEN
31565            INFIS = INFIS + 1
31566         ELSE
31567            A(I) = 0.0D0
31568            B(I) = 0.0D0
31569            IF ( INFI(I) .NE. 0 ) A(I) = LOWER(I)
31570            IF ( INFI(I) .NE. 1 ) B(I) = UPPER(I)
31571         ENDIF
31572         DO 910 J = 1, I-1
31573            IJ = IJ + 1
31574            U(I,J) = CORREL(IJ)
31575            U(J,I) = 0.0D0
31576  910    CONTINUE
31577         U(I,I) = 1.D0
31578  900 CONTINUE
31579      NSO = 1
31580      DO 920 I = 1,ND
31581         NSO = 2*NSO*( N - INFIS - I + 1 )/I
31582  920 CONTINUE
31583*
31584*     First move any doubly infinite limits to innermost positions
31585*
31586      IF ( INFIS .LT. N ) THEN
31587         DO 930 I = N, N-INFIS+1, -1
31588            IF ( INFI(I) .GE. 0 ) THEN
31589               DO 940 J = 1,I-1
31590                  IF ( INFI(J) .LT. 0 ) THEN
31591                     DO 950 K = 1, J-1
31592                        TMP = U(J,K)
31593                        U(J,K) = U(I,K)
31594                        U(I,K) = TMP
31595  950                CONTINUE
31596                     DO 960 K = J+1, I-1
31597                        TMP = U(I,K)
31598                        U(I,K) = U(K,J)
31599                        U(K,J) = TMP
31600 960                 CONTINUE
31601                     DO 970 K = I+1, N
31602                        TMP = U(K,J)
31603                        U(K,J) = U(K,I)
31604                        U(K,I) = TMP
31605 970                 CONTINUE
31606                     TMP = A(J)
31607                     A(J) = A(I)
31608                     A(I) = TMP
31609                     TMP = B(J)
31610                     B(J) = B(I)
31611                     B(I) = TMP
31612                     TMP = INFI(J)
31613                     INFI(J) = INFI(I)
31614                     INFI(I) = INT(TMP)
31615                     GO TO 930
31616                  ENDIF
31617 940           CONTINUE
31618            ENDIF
31619 930     CONTINUE
31620      ENDIF
31621*
31622*     Determine Cholesky decomposition
31623*
31624      DO 980 J = 1, N-INFIS
31625         DO 982 I = J, N-INFIS
31626            TMP = U(I,J)
31627            DO 984 K = 1, J-1
31628               TMP = TMP - U(I,K)*U(J,K)
31629  984       CONTINUE
31630            IF ( I .EQ. J ) THEN
31631               U(J,J) = SQRT( MAX( TMP, ZERO ) )
31632            ELSE IF ( U(I,I) .GT. 0 ) THEN
31633               U(I,J) = TMP/U(J,J)
31634            ELSE
31635               U(I,J) = 0.0D0
31636            END IF
31637 982     CONTINUE
31638 980  CONTINUE
31639      DO 990 I = 1, N-INFIS
31640         IF ( U(I,I) .GT. 0 ) THEN
31641            IF ( INFI(I) .NE. 0 ) A(I) = A(I)/U(I,I)
31642            IF ( INFI(I) .NE. 1 ) B(I) = B(I)/U(I,I)
31643            DO 995 J = 1,I
31644               U(I,J) = U(I,J)/U(I,I)
31645 995        CONTINUE
31646         ENDIF
31647 990  CONTINUE
31648      CALL LIMITS( A(1), B(1), INFI(1), D, E )
31649C
31650      RETURN
31651      END
31652      SUBROUTINE SPOCO(A,LDA,N,RCOND,Z,INFO)
31653C***BEGIN PROLOGUE  SPOCO
31654C***DATE WRITTEN   780814   (YYMMDD)
31655C***REVISION DATE  820801   (YYMMDD)
31656C***CATEGORY NO.  D2B1B
31657C***KEYWORDS  CONDITION,FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX,
31658C             POSITIVE DEFINITE
31659C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
31660C***PURPOSE  Factors a real SYMMETRIC POSITIVE DEFINITE MATRIX
31661C            and estimates the condition number of the matrix.
31662C***DESCRIPTION
31663C
31664C     SPOCO factors a real symmetric positive definite matrix
31665C     and estimates the condition of the matrix.
31666C
31667C     If  RCOND  is not needed, SPOFA is slightly faster.
31668C     To solve  A*X = B , follow SPOCO by SPOSL.
31669C     To compute  INVERSE(A)*C , follow SPOCO by SPOSL.
31670C     To compute  DETERMINANT(A) , follow SPOCO by SPODI.
31671C     To compute  INVERSE(A) , follow SPOCO by SPODI.
31672C
31673C     On Entry
31674C
31675C        A       REAL(LDA, N)
31676C                the symmetric matrix to be factored.  Only the
31677C                diagonal and upper triangle are used.
31678C
31679C        LDA     INTEGER
31680C                the leading dimension of the array  A .
31681C
31682C        N       INTEGER
31683C                the order of the matrix  A .
31684C
31685C     On Return
31686C
31687C        A       an upper triangular matrix  R  so that  A = TRANS(R)*R
31688C                where  TRANS(R)  is the transpose.
31689C                The strict lower triangle is unaltered.
31690C                If  INFO .NE. 0 , the factorization is not complete.
31691C
31692C        RCOND   REAL
31693C                an estimate of the reciprocal condition of  A .
31694C                For the system  A*X = B , relative perturbations
31695C                in  A  and  B  of size  EPSILON  may cause
31696C                relative perturbations in  X  of size  EPSILON/RCOND .
31697C                If  RCOND  is so small that the logical expression
31698C                           1.0 + RCOND .EQ. 1.0
31699C                is true, then  A  may be singular to working
31700C                precision.  In particular,  RCOND  is zero  if
31701C                exact singularity is detected or the estimate
31702C                underflows.  If INFO .NE. 0 , RCOND is unchanged.
31703C
31704C        Z       REAL(N)
31705C                a work vector whose contents are usually unimportant.
31706C                If  A  is close to a singular matrix, then  Z  is
31707C                an approximate null vector in the sense that
31708C                NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
31709C                If  INFO .NE. 0 , Z  is unchanged.
31710C
31711C        INFO    INTEGER
31712C                = 0  for normal return.
31713C                = K  signals an error condition.  The leading minor
31714C                     of order  K  is not positive definite.
31715C
31716C     LINPACK.  This version dated 08/14/78 .
31717C     Cleve Moler, University of New Mexico, Argonne National Lab.
31718C
31719C     Subroutines and Functions
31720C
31721C     LINPACK SPOFA
31722C     BLAS SAXPY,SDOT,SSCAL,SASUM
31723C     Fortran ABS,AMAX1,REAL,SIGN
31724C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
31725C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
31726C***ROUTINES CALLED  SASUM,SAXPY,SDOT,SPOFA,SSCAL
31727C***END PROLOGUE  SPOCO
31728      INTEGER LDA,N,INFO
31729      REAL A(LDA,1),Z(1)
31730      REAL RCOND
31731C
31732      REAL SDOT,EK,T,WK,WKM
31733      REAL ANORM,S,SASUM,SM,YNORM
31734      INTEGER I,J,JM1,K,KB,KP1
31735C
31736C     FIND NORM OF A USING ONLY UPPER HALF
31737C
31738C***FIRST EXECUTABLE STATEMENT  SPOCO
31739      DO 30 J = 1, N
31740         Z(J) = SASUM(J,A(1,J),1)
31741         JM1 = J - 1
31742         IF (JM1 .LT. 1) GO TO 20
31743         DO 10 I = 1, JM1
31744            Z(I) = Z(I) + ABS(A(I,J))
31745   10    CONTINUE
31746   20    CONTINUE
31747   30 CONTINUE
31748      ANORM = 0.0E0
31749      DO 40 J = 1, N
31750         ANORM = AMAX1(ANORM,Z(J))
31751   40 CONTINUE
31752C
31753C     FACTOR
31754C
31755      CALL SPOFA(A,LDA,N,INFO)
31756      IF (INFO .NE. 0) GO TO 180
31757C
31758C        RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
31759C        ESTIMATE = NORM(Z)/NORM(Y) WHERE  A*Z = Y  AND  A*Y = E .
31760C        THE COMPONENTS OF  E  ARE CHOSEN TO CAUSE MAXIMUM LOCAL
31761C        GROWTH IN THE ELEMENTS OF W  WHERE  TRANS(R)*W = E .
31762C        THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
31763C
31764C        SOLVE TRANS(R)*W = E
31765C
31766         EK = 1.0E0
31767         DO 50 J = 1, N
31768            Z(J) = 0.0E0
31769   50    CONTINUE
31770         DO 110 K = 1, N
31771            IF (Z(K) .NE. 0.0E0) EK = SIGN(EK,-Z(K))
31772            IF (ABS(EK-Z(K)) .LE. A(K,K)) GO TO 60
31773               S = A(K,K)/ABS(EK-Z(K))
31774               CALL SSCAL(N,S,Z,1)
31775               EK = S*EK
31776   60       CONTINUE
31777            WK = EK - Z(K)
31778            WKM = -EK - Z(K)
31779            S = ABS(WK)
31780            SM = ABS(WKM)
31781            WK = WK/A(K,K)
31782            WKM = WKM/A(K,K)
31783            KP1 = K + 1
31784            IF (KP1 .GT. N) GO TO 100
31785               DO 70 J = KP1, N
31786                  SM = SM + ABS(Z(J)+WKM*A(K,J))
31787                  Z(J) = Z(J) + WK*A(K,J)
31788                  S = S + ABS(Z(J))
31789   70          CONTINUE
31790               IF (S .GE. SM) GO TO 90
31791                  T = WKM - WK
31792                  WK = WKM
31793                  DO 80 J = KP1, N
31794                     Z(J) = Z(J) + T*A(K,J)
31795   80             CONTINUE
31796   90          CONTINUE
31797  100       CONTINUE
31798            Z(K) = WK
31799  110    CONTINUE
31800         S = 1.0E0/SASUM(N,Z,1)
31801         CALL SSCAL(N,S,Z,1)
31802C
31803C        SOLVE R*Y = W
31804C
31805         DO 130 KB = 1, N
31806            K = N + 1 - KB
31807            IF (ABS(Z(K)) .LE. A(K,K)) GO TO 120
31808               S = A(K,K)/ABS(Z(K))
31809               CALL SSCAL(N,S,Z,1)
31810  120       CONTINUE
31811            Z(K) = Z(K)/A(K,K)
31812            T = -Z(K)
31813            CALL SAXPY(K-1,T,A(1,K),1,Z(1),1)
31814  130    CONTINUE
31815         S = 1.0E0/SASUM(N,Z,1)
31816         CALL SSCAL(N,S,Z,1)
31817C
31818         YNORM = 1.0E0
31819C
31820C        SOLVE TRANS(R)*V = Y
31821C
31822         DO 150 K = 1, N
31823            Z(K) = Z(K) - SDOT(K-1,A(1,K),1,Z(1),1)
31824            IF (ABS(Z(K)) .LE. A(K,K)) GO TO 140
31825               S = A(K,K)/ABS(Z(K))
31826               CALL SSCAL(N,S,Z,1)
31827               YNORM = S*YNORM
31828  140       CONTINUE
31829            Z(K) = Z(K)/A(K,K)
31830  150    CONTINUE
31831         S = 1.0E0/SASUM(N,Z,1)
31832         CALL SSCAL(N,S,Z,1)
31833         YNORM = S*YNORM
31834C
31835C        SOLVE R*Z = V
31836C
31837         DO 170 KB = 1, N
31838            K = N + 1 - KB
31839            IF (ABS(Z(K)) .LE. A(K,K)) GO TO 160
31840               S = A(K,K)/ABS(Z(K))
31841               CALL SSCAL(N,S,Z,1)
31842               YNORM = S*YNORM
31843  160       CONTINUE
31844            Z(K) = Z(K)/A(K,K)
31845            T = -Z(K)
31846            CALL SAXPY(K-1,T,A(1,K),1,Z(1),1)
31847  170    CONTINUE
31848C        MAKE ZNORM = 1.0
31849         S = 1.0E0/SASUM(N,Z,1)
31850         CALL SSCAL(N,S,Z,1)
31851         YNORM = S*YNORM
31852C
31853         IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
31854         IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
31855  180 CONTINUE
31856      RETURN
31857      END
31858      SUBROUTINE SPOFA(A,LDA,N,INFO)
31859C***BEGIN PROLOGUE  SPOFA
31860C***DATE WRITTEN   780814   (YYMMDD)
31861C***REVISION DATE  820801   (YYMMDD)
31862C***CATEGORY NO.  D2B1B
31863C***KEYWORDS  FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX,POSITIVE DEFINITE
31864C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
31865C***PURPOSE  Factors a real SYMMETRIC POSITIVE DEFINITE matrix.
31866C***DESCRIPTION
31867C
31868C     SPOFA factors a real symmetric positive definite matrix.
31869C
31870C     SPOFA is usually called by SPOCO, but it can be called
31871C     directly with a saving in time if  RCOND  is not needed.
31872C     (Time for SPOCO) = (1 + 18/N)*(Time for SPOFA) .
31873C
31874C     On Entry
31875C
31876C        A       REAL(LDA, N)
31877C                the symmetric matrix to be factored.  Only the
31878C                diagonal and upper triangle are used.
31879C
31880C        LDA     INTEGER
31881C                the leading dimension of the array  A .
31882C
31883C        N       INTEGER
31884C                the order of the matrix  A .
31885C
31886C     On Return
31887C
31888C        A       an upper triangular matrix  R  so that  A = TRANS(R)*R
31889C                where  TRANS(R)  is the transpose.
31890C                The strict lower triangle is unaltered.
31891C                If  INFO .NE. 0 , the factorization is not complete.
31892C
31893C        INFO    INTEGER
31894C                = 0  for normal return.
31895C                = K  signals an error condition.  The leading minor
31896C                     of order  K  is not positive definite.
31897C
31898C     LINPACK.  This version dated 08/14/78 .
31899C     Cleve Moler, University of New Mexico, Argonne National Lab.
31900C
31901C     Subroutines and Functions
31902C
31903C     BLAS SDOT
31904C     Fortran SQRT
31905C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
31906C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
31907C***ROUTINES CALLED  SDOT
31908C***END PROLOGUE  SPOFA
31909      INTEGER LDA,N,INFO
31910      REAL A(LDA,1)
31911C
31912      REAL SDOT,T
31913      REAL S
31914      INTEGER J,JM1,K
31915C     BEGIN BLOCK WITH ...EXITS TO 40
31916C
31917C
31918C***FIRST EXECUTABLE STATEMENT  SPOFA
31919         DO 30 J = 1, N
31920            INFO = J
31921            S = 0.0E0
31922            JM1 = J - 1
31923            IF (JM1 .LT. 1) GO TO 20
31924            DO 10 K = 1, JM1
31925               T = A(K,J) - SDOT(K-1,A(1,K),1,A(1,J),1)
31926               T = T/A(K,K)
31927               A(K,J) = T
31928               S = S + T*T
31929   10       CONTINUE
31930   20       CONTINUE
31931            S = A(J,J) - S
31932C     ......EXIT
31933            IF (S .LE. 0.0E0) GO TO 40
31934            A(J,J) = SQRT(S)
31935   30    CONTINUE
31936         INFO = 0
31937   40 CONTINUE
31938      RETURN
31939      END
31940      SUBROUTINE SQRDC(X,LDX,N,P,QRAUX,JPVT,WORK,JOB)
31941C***BEGIN PROLOGUE  SQRDC
31942C***DATE WRITTEN   780814   (YYMMDD)
31943C***REVISION DATE  820801   (YYMMDD)
31944C***CATEGORY NO.  D5
31945C***KEYWORDS  DECOMPOSITION,LINEAR ALGEBRA,LINPACK,MATRIX,
31946C             ORTHOGONAL TRIANGULAR
31947C***AUTHOR  STEWART, G. W., (U. OF MARYLAND)
31948C***PURPOSE  Uses Householder transformations to compute the QR
31949C            factorization of an N by P matrix X.  Column pivoting is
31950C            a users option.
31951C***DESCRIPTION
31952C
31953C     SQRDC uses Householder transformations to compute the QR
31954C     factorization of an N by P matrix X.  Column pivoting
31955C     based on the 2-norms of the reduced columns may be
31956C     performed at the user's option.
31957C
31958C     On Entry
31959C
31960C        X       REAL(LDX,P), where LDX .GE. N.
31961C                X contains the matrix whose decomposition is to be
31962C                computed.
31963C
31964C        LDX     INTEGER.
31965C                LDX is the leading dimension of the array X.
31966C
31967C        N       INTEGER.
31968C                N is the number of rows of the matrix X.
31969C
31970C        P       INTEGER.
31971C                P is the number of columns of the matrix X.
31972C
31973C        JPVT    INTEGER(P).
31974C                JPVT contains integers that control the selection
31975C                of the pivot columns.  The K-th column X(K) of X
31976C                is placed in one of three classes according to the
31977C                value of JPVT(K).
31978C
31979C                   If JPVT(K) .GT. 0, then X(K) is an initial
31980C                                      column.
31981C
31982C                   If JPVT(K) .EQ. 0, then X(K) is a free column.
31983C
31984C                   If JPVT(K) .LT. 0, then X(K) is a final column.
31985C
31986C                Before the decomposition is computed, initial columns
31987C                are moved to the beginning of the array X and final
31988C                columns to the end.  Both initial and final columns
31989C                are frozen in place during the computation and only
31990C                free columns are moved.  At the K-th stage of the
31991C                reduction, if X(K) is occupied by a free column,
31992C                it is interchanged with the free column of largest
31993C                reduced norm.  JPVT is not referenced if
31994C                JOB .EQ. 0.
31995C
31996C        WORK    REAL(P).
31997C                WORK is a work array.  WORK is not referenced if
31998C                JOB .EQ. 0.
31999C
32000C        JOB     INTEGER.
32001C                JOB is an integer that initiates column pivoting.
32002C                If JOB .EQ. 0, no pivoting is done.
32003C                If JOB .NE. 0, pivoting is done.
32004C
32005C     On Return
32006C
32007C        X       X contains in its upper triangle the upper
32008C                triangular matrix R of the QR factorization.
32009C                Below its diagonal X contains information from
32010C                which the orthogonal part of the decomposition
32011C                can be recovered.  Note that if pivoting has
32012C                been requested, the decomposition is not that
32013C                of the original matrix X but that of X
32014C                with its columns permuted as described by JPVT.
32015C
32016C        QRAUX   REAL(P).
32017C                QRAUX contains further information required to recover
32018C                the orthogonal part of the decomposition.
32019C
32020C        JPVT    JPVT(K) contains the index of the column of the
32021C                original matrix that has been interchanged into
32022C                the K-th column, if pivoting was requested.
32023C
32024C     LINPACK.  This version dated 08/14/78 .
32025C     G. W. Stewart, University of Maryland, Argonne National Lab.
32026C
32027C     SQRDC uses the following functions and subprograms.
32028C
32029C     BLAS SAXPY,SDOT,SSCAL,SSWAP,SNRM2
32030C     Fortran ABS,AMAX1,MIN0,SQRT
32031C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
32032C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
32033C***ROUTINES CALLED  SAXPY,SDOT,SNRM2,SSCAL,SSWAP
32034C***END PROLOGUE  SQRDC
32035      INTEGER LDX,N,P,JOB
32036      INTEGER JPVT(1)
32037      REAL X(LDX,1),QRAUX(1),WORK(1)
32038C
32039      INTEGER J,JP,L,LP1,LUP,MAXJ,PL,PU
32040      REAL MAXNRM,SNRM2,TT
32041      REAL SDOT,NRMXL,T
32042      LOGICAL NEGJ,SWAPJ
32043C
32044C***FIRST EXECUTABLE STATEMENT  SQRDC
32045      PL = 1
32046      PU = 0
32047      IF (JOB .EQ. 0) GO TO 60
32048C
32049C        PIVOTING HAS BEEN REQUESTED.  REARRANGE THE COLUMNS
32050C        ACCORDING TO JPVT.
32051C
32052         DO 20 J = 1, P
32053            SWAPJ = JPVT(J) .GT. 0
32054            NEGJ = JPVT(J) .LT. 0
32055            JPVT(J) = J
32056            IF (NEGJ) JPVT(J) = -J
32057            IF (.NOT.SWAPJ) GO TO 10
32058               IF (J .NE. PL) CALL SSWAP(N,X(1,PL),1,X(1,J),1)
32059               JPVT(J) = JPVT(PL)
32060               JPVT(PL) = J
32061               PL = PL + 1
32062   10       CONTINUE
32063   20    CONTINUE
32064         PU = P
32065         DO 50 JJ = 1, P
32066            J = P - JJ + 1
32067            IF (JPVT(J) .GE. 0) GO TO 40
32068               JPVT(J) = -JPVT(J)
32069               IF (J .EQ. PU) GO TO 30
32070                  CALL SSWAP(N,X(1,PU),1,X(1,J),1)
32071                  JP = JPVT(PU)
32072                  JPVT(PU) = JPVT(J)
32073                  JPVT(J) = JP
32074   30          CONTINUE
32075               PU = PU - 1
32076   40       CONTINUE
32077   50    CONTINUE
32078   60 CONTINUE
32079C
32080C     COMPUTE THE NORMS OF THE FREE COLUMNS.
32081C
32082      IF (PU .LT. PL) GO TO 80
32083      DO 70 J = PL, PU
32084         QRAUX(J) = SNRM2(N,X(1,J),1)
32085         WORK(J) = QRAUX(J)
32086   70 CONTINUE
32087   80 CONTINUE
32088C
32089C     PERFORM THE HOUSEHOLDER REDUCTION OF X.
32090C
32091      LUP = MIN0(N,P)
32092      DO 200 L = 1, LUP
32093         IF (L .LT. PL .OR. L .GE. PU) GO TO 120
32094C
32095C           LOCATE THE COLUMN OF LARGEST NORM AND BRING IT
32096C           INTO THE PIVOT POSITION.
32097C
32098            MAXNRM = 0.0E0
32099            MAXJ = L
32100            DO 100 J = L, PU
32101               IF (QRAUX(J) .LE. MAXNRM) GO TO 90
32102                  MAXNRM = QRAUX(J)
32103                  MAXJ = J
32104   90          CONTINUE
32105  100       CONTINUE
32106            IF (MAXJ .EQ. L) GO TO 110
32107               CALL SSWAP(N,X(1,L),1,X(1,MAXJ),1)
32108               QRAUX(MAXJ) = QRAUX(L)
32109               WORK(MAXJ) = WORK(L)
32110               JP = JPVT(MAXJ)
32111               JPVT(MAXJ) = JPVT(L)
32112               JPVT(L) = JP
32113  110       CONTINUE
32114  120    CONTINUE
32115         QRAUX(L) = 0.0E0
32116         IF (L .EQ. N) GO TO 190
32117C
32118C           COMPUTE THE HOUSEHOLDER TRANSFORMATION FOR COLUMN L.
32119C
32120            NRMXL = SNRM2(N-L+1,X(L,L),1)
32121            IF (NRMXL .EQ. 0.0E0) GO TO 180
32122               IF (X(L,L) .NE. 0.0E0) NRMXL = SIGN(NRMXL,X(L,L))
32123               CALL SSCAL(N-L+1,1.0E0/NRMXL,X(L,L),1)
32124               X(L,L) = 1.0E0 + X(L,L)
32125C
32126C              APPLY THE TRANSFORMATION TO THE REMAINING COLUMNS,
32127C              UPDATING THE NORMS.
32128C
32129               LP1 = L + 1
32130               IF (P .LT. LP1) GO TO 170
32131               DO 160 J = LP1, P
32132                  T = -SDOT(N-L+1,X(L,L),1,X(L,J),1)/X(L,L)
32133                  CALL SAXPY(N-L+1,T,X(L,L),1,X(L,J),1)
32134                  IF (J .LT. PL .OR. J .GT. PU) GO TO 150
32135                  IF (QRAUX(J) .EQ. 0.0E0) GO TO 150
32136                     TT = 1.0E0 - (ABS(X(L,J))/QRAUX(J))**2
32137                     TT = AMAX1(TT,0.0E0)
32138                     T = TT
32139                     TT = 1.0E0 + 0.05E0*TT*(QRAUX(J)/WORK(J))**2
32140                     IF (TT .EQ. 1.0E0) GO TO 130
32141                        QRAUX(J) = QRAUX(J)*SQRT(T)
32142                     GO TO 140
32143  130                CONTINUE
32144                        QRAUX(J) = SNRM2(N-L,X(L+1,J),1)
32145                        WORK(J) = QRAUX(J)
32146  140                CONTINUE
32147  150             CONTINUE
32148  160          CONTINUE
32149  170          CONTINUE
32150C
32151C              SAVE THE TRANSFORMATION.
32152C
32153               QRAUX(L) = X(L,L)
32154               X(L,L) = -NRMXL
32155  180       CONTINUE
32156  190    CONTINUE
32157  200 CONTINUE
32158      RETURN
32159      END
32160      SUBROUTINE SQRSL(X,LDX,N,K,QRAUX,Y,QY,QTY,B,RSD,XB,JOB,INFO)
32161C***BEGIN PROLOGUE  SQRSL
32162C***DATE WRITTEN   780814   (YYMMDD)
32163C***REVISION DATE  820801   (YYMMDD)
32164C***CATEGORY NO.  D9,D2A1
32165C***KEYWORDS  LINEAR ALGEBRA,LINPACK,MATRIX,ORTHOGONAL TRIANGULAR,SOLVE
32166C***AUTHOR  STEWART, G. W., (U. OF MARYLAND)
32167C***PURPOSE  Applies the output of SQRDC to compute coordinate trans-
32168C            formations projections, and least squares solutions.
32169C***DESCRIPTION
32170C
32171C     SQRSL applies the output of SQRDC to compute coordinate
32172C     transformations, projections, and least squares solutions.
32173C     For K .LE. MIN(N,P), let XK be the matrix
32174C
32175C            XK = (X(JPVT(1)),X(JPVT(2)), ... ,X(JPVT(K)))
32176C
32177C     formed from columnns JPVT(1), ... ,JPVT(K) of the original
32178C     N x P matrix X that was input to SQRDC (if no pivoting was
32179C     done, XK consists of the first K columns of X in their
32180C     original order).  SQRDC produces a factored orthogonal matrix Q
32181C     and an upper triangular matrix R such that
32182C
32183C              XK = Q * (R)
32184C                       (0)
32185C
32186C     This information is contained in coded form in the arrays
32187C     X and QRAUX.
32188C
32189C     On Entry
32190C
32191C        X      REAL(LDX,P)
32192C               X contains the output of SQRDC.
32193C
32194C        LDX    INTEGER
32195C               LDX is the leading dimension of the array X.
32196C
32197C        N      INTEGER
32198C               N is the number of rows of the matrix XK.  It must
32199C               have the same value as N in SQRDC.
32200C
32201C        K      INTEGER
32202C               K is the number of columns of the matrix XK.  K
32203C               must not be greater than MIN(N,P), where P is the
32204C               same as in the calling sequence to SQRDC.
32205C
32206C        QRAUX  REAL(P)
32207C               QRAUX contains the auxiliary output from SQRDC.
32208C
32209C        Y      REAL(N)
32210C               Y contains an N-vector that is to be manipulated
32211C               by SQRSL.
32212C
32213C        JOB    INTEGER
32214C               JOB specifies what is to be computed.  JOB has
32215C               the decimal expansion ABCDE, with the following
32216C               meaning.
32217C
32218C                    If A .NE. 0, compute QY.
32219C                    If B,C,D, or E .NE. 0, compute QTY.
32220C                    If C .NE. 0, compute B.
32221C                    If D .NE. 0, compute RSD.
32222C                    If E .NE. 0, compute XB.
32223C
32224C               Note that a request to compute B, RSD, or XB
32225C               automatically triggers the computation of QTY, for
32226C               which an array must be provided in the calling
32227C               sequence.
32228C
32229C     On Return
32230C
32231C        QY     REAL(N).
32232C               QY contains Q*Y, if its computation has been
32233C               requested.
32234C
32235C        QTY    REAL(N).
32236C               QTY contains TRANS(Q)*Y, if its computation has
32237C               been requested.  Here TRANS(Q) is the
32238C               transpose of the matrix Q.
32239C
32240C        B      REAL(K)
32241C               B contains the solution of the least squares problem
32242C
32243C                    minimize norm2(Y - XK*B),
32244C
32245C               if its computation has been requested.  (Note that
32246C               if pivoting was requested in SQRDC, the J-th
32247C               component of B will be associated with column JPVT(J)
32248C               of the original matrix X that was input into SQRDC.)
32249C
32250C        RSD    REAL(N).
32251C               RSD contains the least squares residual Y - XK*B,
32252C               if its computation has been requested.  RSD is
32253C               also the orthogonal projection of Y onto the
32254C               orthogonal complement of the column space of XK.
32255C
32256C        XB     REAL(N).
32257C               XB contains the least squares approximation XK*B,
32258C               if its computation has been requested.  XB is also
32259C               the orthogonal projection of Y onto the column space
32260C               of X.
32261C
32262C        INFO   INTEGER.
32263C               INFO is zero unless the computation of B has
32264C               been requested and R is exactly singular.  In
32265C               this case, INFO is the index of the first zero
32266C               diagonal element of R and B is left unaltered.
32267C
32268C     The parameters QY, QTY, B, RSD, and XB are not referenced
32269C     if their computation is not requested and in this case
32270C     can be replaced by dummy variables in the calling program.
32271C     To save storage, the user may in some cases use the same
32272C     array for different parameters in the calling sequence.  A
32273C     frequently occuring example is when one wishes to compute
32274C     any of B, RSD, or XB and does not need Y or QTY.  In this
32275C     case one may identify Y, QTY, and one of B, RSD, or XB, while
32276C     providing separate arrays for anything else that is to be
32277C     computed.  Thus the calling sequence
32278C
32279C          CALL SQRSL(X,LDX,N,K,QRAUX,Y,DUM,Y,B,Y,DUM,110,INFO)
32280C
32281C     will result in the computation of B and RSD, with RSD
32282C     overwriting Y.  More generally, each item in the following
32283C     list contains groups of permissible identifications for
32284C     a single callinng sequence.
32285C
32286C          1. (Y,QTY,B) (RSD) (XB) (QY)
32287C
32288C          2. (Y,QTY,RSD) (B) (XB) (QY)
32289C
32290C          3. (Y,QTY,XB) (B) (RSD) (QY)
32291C
32292C          4. (Y,QY) (QTY,B) (RSD) (XB)
32293C
32294C          5. (Y,QY) (QTY,RSD) (B) (XB)
32295C
32296C          6. (Y,QY) (QTY,XB) (B) (RSD)
32297C
32298C     In any group the value returned in the array allocated to
32299C     the group corresponds to the last member of the group.
32300C
32301C     LINPACK.  This version dated 08/14/78 .
32302C     G. W. Stewart, University of Maryland, Argonne National Lab.
32303C
32304C     SQRSL uses the following functions and subprograms.
32305C
32306C     BLAS SAXPY,SCOPY,SDOT
32307C     Fortran ABS,MIN0,MOD
32308C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
32309C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
32310C***ROUTINES CALLED  SAXPY,SCOPY,SDOT
32311C***END PROLOGUE  SQRSL
32312      INTEGER LDX,N,K,JOB,INFO
32313      REAL X(LDX,1),QRAUX(1),Y(1),QY(1),QTY(1),B(1),RSD(1),XB(1)
32314C
32315      INTEGER I,J,JJ,JU,KP1
32316      REAL SDOT,T,TEMP
32317      LOGICAL CB,CQY,CQTY,CR,CXB
32318C
32319C     SET INFO FLAG.
32320C
32321C***FIRST EXECUTABLE STATEMENT  SQRSL
32322      INFO = 0
32323C
32324C     DETERMINE WHAT IS TO BE COMPUTED.
32325C
32326      CQY = JOB/10000 .NE. 0
32327      CQTY = MOD(JOB,10000) .NE. 0
32328      CB = MOD(JOB,1000)/100 .NE. 0
32329      CR = MOD(JOB,100)/10 .NE. 0
32330      CXB = MOD(JOB,10) .NE. 0
32331      JU = MIN0(K,N-1)
32332C
32333C     SPECIAL ACTION WHEN N=1.
32334C
32335      IF (JU .NE. 0) GO TO 40
32336         IF (CQY) QY(1) = Y(1)
32337         IF (CQTY) QTY(1) = Y(1)
32338         IF (CXB) XB(1) = Y(1)
32339         IF (.NOT.CB) GO TO 30
32340            IF (X(1,1) .NE. 0.0E0) GO TO 10
32341               INFO = 1
32342            GO TO 20
32343   10       CONTINUE
32344               B(1) = Y(1)/X(1,1)
32345   20       CONTINUE
32346   30    CONTINUE
32347         IF (CR) RSD(1) = 0.0E0
32348      GO TO 250
32349   40 CONTINUE
32350C
32351C        SET UP TO COMPUTE QY OR QTY.
32352C
32353         IF (CQY) CALL SCOPY(N,Y,1,QY,1)
32354         IF (CQTY) CALL SCOPY(N,Y,1,QTY,1)
32355         IF (.NOT.CQY) GO TO 70
32356C
32357C           COMPUTE QY.
32358C
32359            DO 60 JJ = 1, JU
32360               J = JU - JJ + 1
32361               IF (QRAUX(J) .EQ. 0.0E0) GO TO 50
32362                  TEMP = X(J,J)
32363                  X(J,J) = QRAUX(J)
32364                  T = -SDOT(N-J+1,X(J,J),1,QY(J),1)/X(J,J)
32365                  CALL SAXPY(N-J+1,T,X(J,J),1,QY(J),1)
32366                  X(J,J) = TEMP
32367   50          CONTINUE
32368   60       CONTINUE
32369   70    CONTINUE
32370         IF (.NOT.CQTY) GO TO 100
32371C
32372C           COMPUTE TRANS(Q)*Y.
32373C
32374            DO 90 J = 1, JU
32375               IF (QRAUX(J) .EQ. 0.0E0) GO TO 80
32376                  TEMP = X(J,J)
32377                  X(J,J) = QRAUX(J)
32378                  T = -SDOT(N-J+1,X(J,J),1,QTY(J),1)/X(J,J)
32379                  CALL SAXPY(N-J+1,T,X(J,J),1,QTY(J),1)
32380                  X(J,J) = TEMP
32381   80          CONTINUE
32382   90       CONTINUE
32383  100    CONTINUE
32384C
32385C        SET UP TO COMPUTE B, RSD, OR XB.
32386C
32387         IF (CB) CALL SCOPY(K,QTY,1,B,1)
32388         KP1 = K + 1
32389         IF (CXB) CALL SCOPY(K,QTY,1,XB,1)
32390         IF (CR .AND. K .LT. N) CALL SCOPY(N-K,QTY(KP1),1,RSD(KP1),1)
32391         IF (.NOT.CXB .OR. KP1 .GT. N) GO TO 120
32392            DO 110 I = KP1, N
32393               XB(I) = 0.0E0
32394  110       CONTINUE
32395  120    CONTINUE
32396         IF (.NOT.CR) GO TO 140
32397            DO 130 I = 1, K
32398               RSD(I) = 0.0E0
32399  130       CONTINUE
32400  140    CONTINUE
32401         IF (.NOT.CB) GO TO 190
32402C
32403C           COMPUTE B.
32404C
32405            DO 170 JJ = 1, K
32406               J = K - JJ + 1
32407               IF (X(J,J) .NE. 0.0E0) GO TO 150
32408                  INFO = J
32409C           ......EXIT
32410                  GO TO 180
32411  150          CONTINUE
32412               B(J) = B(J)/X(J,J)
32413               IF (J .EQ. 1) GO TO 160
32414                  T = -B(J)
32415                  CALL SAXPY(J-1,T,X(1,J),1,B,1)
32416  160          CONTINUE
32417  170       CONTINUE
32418  180       CONTINUE
32419  190    CONTINUE
32420         IF (.NOT.CR .AND. .NOT.CXB) GO TO 240
32421C
32422C           COMPUTE RSD OR XB AS REQUIRED.
32423C
32424            DO 230 JJ = 1, JU
32425               J = JU - JJ + 1
32426               IF (QRAUX(J) .EQ. 0.0E0) GO TO 220
32427                  TEMP = X(J,J)
32428                  X(J,J) = QRAUX(J)
32429                  IF (.NOT.CR) GO TO 200
32430                     T = -SDOT(N-J+1,X(J,J),1,RSD(J),1)/X(J,J)
32431                     CALL SAXPY(N-J+1,T,X(J,J),1,RSD(J),1)
32432  200             CONTINUE
32433                  IF (.NOT.CXB) GO TO 210
32434                     T = -SDOT(N-J+1,X(J,J),1,XB(J),1)/X(J,J)
32435                     CALL SAXPY(N-J+1,T,X(J,J),1,XB(J),1)
32436  210             CONTINUE
32437                  X(J,J) = TEMP
32438  220          CONTINUE
32439  230       CONTINUE
32440  240    CONTINUE
32441  250 CONTINUE
32442      RETURN
32443      END
32444      SUBROUTINE SROT(N,SX,INCX,SY,INCY,SC,SS)
32445C***BEGIN PROLOGUE  SROT
32446C***DATE WRITTEN   791001   (YYMMDD)
32447C***REVISION DATE  820801   (YYMMDD)
32448C***CATEGORY NO.  D1A8
32449C***KEYWORDS  BLAS,GIVENS ROTATION,LINEAR ALGEBRA,VECTOR
32450C***AUTHOR  LAWSON, C. L., (JPL)
32451C           HANSON, R. J., (SNLA)
32452C           KINCAID, D. R., (U. OF TEXAS)
32453C           KROGH, F. T., (JPL)
32454C***PURPOSE  Apply s.p. Givens rotation
32455C***DESCRIPTION
32456C
32457C                B L A S  Subprogram
32458C    Description of Parameters
32459C
32460C     --Input--
32461C        N  number of elements in input vector(s)
32462C       SX  single precision vector with N elements
32463C     INCX  storage spacing between elements of SX
32464C       SY  single precision vector with N elements
32465C     INCY  storage spacing between elements of SY
32466C       SC  element of rotation matrix
32467C       SS  element of rotation matrix
32468C
32469C     --Output--
32470C       SX  rotated vector SX (unchanged if N .LE. 0)
32471C       SY  rotated vector SY (unchanged if N .LE. 0)
32472C
32473C     Multiply the 2 x 2 matrix  ( SC SS) times the 2 x N matrix (SX**T)
32474C                                (-SS SC)                        (SY**T)
32475C     where **T indicates transpose.  The elements of SX are in
32476C     SX(LX+I*INCX), I = 0 to N-1, where LX = 1 if INCX .GE. 0, else
32477C     LX = (-INCX)*N, and similarly for SY using LY and INCY.
32478C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
32479C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
32480C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
32481C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
32482C***ROUTINES CALLED  (NONE)
32483C***END PROLOGUE  SROT
32484C
32485      REAL             SX,SY,SC,SS,ZERO,ONE,W,Z
32486      DIMENSION SX(*),SY(*)
32487      DATA ZERO,ONE/0.E0,1.E0/
32488C***FIRST EXECUTABLE STATEMENT  SROT
32489      IF(N .LE. 0 .OR. (SS .EQ. ZERO .AND. SC .EQ. ONE)) GO TO 40
32490      IF(.NOT. (INCX .EQ. INCY .AND. INCX .GT. 0)) GO TO 20
32491C
32492           NSTEPS=INCX*N
32493           DO 10 I=1,NSTEPS,INCX
32494                W=SX(I)
32495                Z=SY(I)
32496                SX(I)=SC*W+SS*Z
32497                SY(I)=-SS*W+SC*Z
32498   10           CONTINUE
32499           GO TO 40
32500C
32501   20 CONTINUE
32502           KX=1
32503           KY=1
32504C
32505           IF(INCX .LT. 0) KX=1-(N-1)*INCX
32506           IF(INCY .LT. 0) KY=1-(N-1)*INCY
32507C
32508           DO 30 I=1,N
32509                W=SX(KX)
32510                Z=SY(KY)
32511                SX(KX)=SC*W+SS*Z
32512                SY(KY)=-SS*W+SC*Z
32513                KX=KX+INCX
32514                KY=KY+INCY
32515   30           CONTINUE
32516   40 CONTINUE
32517C
32518      RETURN
32519      END
32520      SUBROUTINE SROTG(SA,SB,SC,SS)
32521C***BEGIN PROLOGUE  SROTG
32522C***DATE WRITTEN   791001   (YYMMDD)
32523C***REVISION DATE  820801   (YYMMDD)
32524C***CATEGORY NO.  D1B10
32525C***KEYWORDS  BLAS,GIVENS ROTATION,LINEAR ALGEBRA,VECTOR
32526C***AUTHOR  LAWSON, C. L., (JPL)
32527C           HANSON, R. J., (SNLA)
32528C           KINCAID, D. R., (U. OF TEXAS)
32529C           KROGH, F. T., (JPL)
32530C***PURPOSE  Construct s.p. plane Givens rotation
32531C***DESCRIPTION
32532C
32533C                B L A S  Subprogram
32534C    Description of Parameters
32535C
32536C     --Input--
32537C       SA  single precision scalar
32538C       SB  single precision scalar
32539C
32540C     --Output--
32541C       SA  single precision result R
32542C       SB  single precision result Z
32543C       SC  single precision result
32544C       SS  single precision result
32545C
32546C     Designed by C. L. Lawson, JPL, 1977 Sept 08
32547C
32548C
32549C     Construct the Givens transformation
32550C
32551C         ( SC  SS )
32552C     G = (        ) ,    SC**2 + SS**2 = 1 ,
32553C         (-SS  SC )
32554C
32555C     which zeros the second entry of the 2-vector  (SA,SB)**T.
32556C
32557C     The quantity R = (+/-)SQRT(SA**2 + SB**2) overwrites SA in
32558C     storage.  The value of SB is overwritten by a value Z which
32559C     allows SC and SS to be recovered by the following algorithm:
32560C
32561C           If Z=1  set  SC=0.  and  SS=1.
32562C           If ABS(Z) .LT. 1  set  SC=SQRT(1-Z**2)  and  SS=Z
32563C           If ABS(Z) .GT. 1  set  SC=1/Z  and  SS=SQRT(1-SC**2)
32564C
32565C     Normally, the subprogram SROT(N,SX,INCX,SY,INCY,SC,SS) will
32566C     next be called to apply the transformation to a 2 by N matrix.
32567C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
32568C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
32569C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
32570C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
32571C***ROUTINES CALLED  (NONE)
32572C***END PROLOGUE  SROTG
32573C
32574C***FIRST EXECUTABLE STATEMENT  SROTG
32575      IF (ABS(SA) .LE. ABS(SB)) GO TO 10
32576C
32577C *** HERE ABS(SA) .GT. ABS(SB) ***
32578C
32579      U = SA + SA
32580      V = SB / U
32581C
32582C     NOTE THAT U AND R HAVE THE SIGN OF SA
32583C
32584      R = SQRT(.25 + V**2) * U
32585C
32586C     NOTE THAT SC IS POSITIVE
32587C
32588      SC = SA / R
32589      SS = V * (SC + SC)
32590      SB = SS
32591      SA = R
32592      RETURN
32593C
32594C *** HERE ABS(SA) .LE. ABS(SB) ***
32595C
32596   10 IF (SB .EQ. 0.) GO TO 20
32597      U = SB + SB
32598      V = SA / U
32599C
32600C     NOTE THAT U AND R HAVE THE SIGN OF SB
32601C     (R IS IMMEDIATELY STORED IN SA)
32602C
32603      SA = SQRT(.25 + V**2) * U
32604C
32605C     NOTE THAT SS IS POSITIVE
32606C
32607      SS = SB / SA
32608      SC = V * (SS + SS)
32609      IF (SC .EQ. 0.) GO TO 15
32610      SB = 1. / SC
32611      RETURN
32612   15 SB = 1.
32613      RETURN
32614C
32615C *** HERE SA = SB = 0. ***
32616C
32617   20 SC = 1.
32618      SS = 0.
32619      RETURN
32620C
32621      END
32622      SUBROUTINE SRTMEA(Y,XH1,N,ICASE,
32623     1                  MAXNXT,
32624     1                  XH1DIS,STTEMP,TEMP,TEMP2,TEMP3,TEMP4,TEMP5,
32625     1                  X2,AINDX,NUMSE1,
32626     1                  ISEED,ITEMP1,ITEMP2,ITEMP3,ITEMP4,ITEMP5,ITEMP6,
32627     1                  DTEMP1,DTEMP2,DTEMP3,
32628     1                  ISUBRO,IBUGA3,IERROR)
32629C
32630C     PURPOSE--SORT BY MEAN (OR SOME OTHER LOCATION STATISTIC).
32631C              THAT IS,
32632C
32633C                 LET X2 INDEX = SORT BY MEAN Y X
32634C
32635C               WILL SORT X (HERE X IS A GROUP-ID VARIABLE AND
32636C               Y IS A RESPONSE VARIABLE) BASED ON THE MEAN
32637C               (OR SOME OTHER APPROPRIATE STATISTIC).
32638C     WRITTEN BY--ALAN HECKERT
32639C                 STATISTICAL ENGINEERING DIVISION
32640C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32641C                 GAITHERSBURG, MD 20899-8980
32642C                 PHONE--301-975-2899
32643C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32644C           OF THE NATIONAL BUREAU OF STANDARDS.
32645C     LANGUAGE--ANSI FORTRAN (1977)
32646C     VERSION NUMBER--2005/12
32647C     ORIGINAL VERSION--DECEMBER  2005.
32648C     UPDATED         --JANUARY   2007.  CALL LIST TO CODE
32649C     UPDATED         --JUNE      2010.  CALL LIST TO CMPSTA
32650C     UPDATED         --JULY      2016.  FIX ISSUE WHEN X IS NOT
32651C                                        PRE-SORTED
32652C
32653C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32654C
32655      CHARACTER*4 ICASE
32656      CHARACTER*4 ISUBRO
32657      CHARACTER*4 IBUGA3
32658      CHARACTER*4 IERROR
32659C
32660      CHARACTER*4 IWRITE
32661C
32662      CHARACTER*4 ISUBN1
32663      CHARACTER*4 ISUBN2
32664      CHARACTER*4 ISTEPN
32665C
32666C---------------------------------------------------------------------
32667C
32668      DIMENSION Y(*)
32669      DIMENSION XH1(*)
32670      DIMENSION X2(*)
32671      DIMENSION AINDX(*)
32672C
32673      DIMENSION XH1DIS(*)
32674      DIMENSION STTEMP(*)
32675      DIMENSION TEMP(*)
32676      DIMENSION TEMP2(*)
32677      DIMENSION TEMP3(*)
32678      DIMENSION TEMP4(*)
32679      DIMENSION TEMP5(*)
32680      INTEGER ITEMP1(*)
32681      INTEGER ITEMP2(*)
32682      INTEGER ITEMP3(*)
32683      INTEGER ITEMP4(*)
32684      INTEGER ITEMP5(*)
32685      INTEGER ITEMP6(*)
32686      DOUBLE PRECISION DTEMP1(*)
32687      DOUBLE PRECISION DTEMP2(*)
32688      DOUBLE PRECISION DTEMP3(*)
32689C
32690C-----COMMON----------------------------------------------------------
32691C
32692      INCLUDE 'DPCOPA.INC'
32693      INCLUDE 'DPCOST.INC'
32694      INCLUDE 'DPCOHK.INC'
32695      INCLUDE 'DPCOP2.INC'
32696C
32697C-----START POINT-----------------------------------------------------
32698C
32699      ISUBN1='SRTM'
32700      ISUBN2='EA  '
32701C
32702C     CHECK THE INPUT ARGUMENTS FOR ERRORS
32703C
32704      IF(N.LE.1)THEN
32705        WRITE(ICOUT,999)
32706  999   FORMAT(1X)
32707        CALL DPWRST('XXX','BUG ')
32708        WRITE(ICOUT,31)
32709   31   FORMAT('***** ERROR IN SORT BY <STATISTIC>--')
32710        CALL DPWRST('XXX','BUG ')
32711        WRITE(ICOUT,32)
32712   32   FORMAT('      THE NUMBER OF OBSERVATIONS MUST BE AT LEAST 2.')
32713        CALL DPWRST('XXX','BUG ')
32714        WRITE(ICOUT,34)N
32715   34   FORMAT('      THE ENTERED NUMBER OF OBSERVATIONS HERE = ',I6)
32716        CALL DPWRST('XXX','BUG ')
32717        WRITE(ICOUT,999)
32718        CALL DPWRST('XXX','BUG ')
32719        IERROR='YES'
32720        GOTO9000
32721      ENDIF
32722C
32723      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'TMEA')THEN
32724        WRITE(ICOUT,70)
32725   70   FORMAT('AT THE BEGINNING OF SRTMEA--')
32726        CALL DPWRST('XXX','BUG ')
32727        WRITE(ICOUT,71)N,ICASE
32728   71   FORMAT('N,ICASE = ',I8,2X,A4)
32729        CALL DPWRST('XXX','BUG ')
32730        DO72I=1,N
32731          WRITE(ICOUT,73)I,Y(I),XH1(I)
32732   73     FORMAT('I, Y(I), XH1(I) = ',I8,2G15.7)
32733          CALL DPWRST('XXX','BUG ')
32734   72   CONTINUE
32735      ENDIF
32736C
32737C               ******************************************************
32738C               **  STEP 2--                                        **
32739C               **  DETERMINE THE NUMBER OF DISTINCT VALUES         **
32740C               **  FOR VARIABLE 2 (ONE OF THE GROUP VARIABLES).    **
32741C               ******************************************************
32742C
32743      ISTEPN='2'
32744      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'TMEA')
32745     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
32746C
32747C  THE DISTINCT VALUES WILL BE CODED INTO 1, 2, ... , NDIST.
32748C  NOTE THAT TRYING TO MAINTAIN ORIGINAL SCALE IS PROBLEMATIC
32749C  IF THE DATA HAS GAPS (E.G., 101, 102, 105) SINCE WE HAVE
32750C  NO EASY WAY TO AUTOMATICALLY PLACE THE TIC MARK LABELS.
32751C
32752      IWRITE='OFF'
32753      CALL CODE(XH1,N,IWRITE,TEMP3,TEMP5,MAXNXT,IBUGA3,IERROR)
32754      DO110I=1,N
32755        XH1(I)=TEMP3(I)
32756  110 CONTINUE
32757      CALL DISTIN(XH1,N,IWRITE,XH1DIS,NUMSE1,IBUGA3,IERROR)
32758C
32759C     JULY 2016: FOLLOWING LINE NEEDED FOR CASE WHERE X VARIABLE
32760C                NOT PRE-SORTED.
32761C
32762      CALL SORT(XH1DIS,NUMSE1,XH1DIS)
32763C
32764      AN=N
32765      ANUMS1=NUMSE1
32766C
32767      DO310I=1,NUMSE1
32768        NTEMP=0
32769        DO320J=1,N
32770          IF(XH1(J).EQ.XH1DIS(I))THEN
32771            NTEMP=NTEMP+1
32772            TEMP2(NTEMP)=Y(J)
32773          ENDIF
32774  320   CONTINUE
32775        IWRITE='OFF'
32776        IF(NTEMP.GT.0)THEN
32777          NUMV=1
32778          CALL CMPSTA(TEMP2,TEMP,TEMP,TEMP3,TEMP4,TEMP5,
32779     1                MAXNXT,NTEMP,NTEMP,NTEMP,NUMV,ICASE,
32780     1                ISEED,ITEMP1,ITEMP2,ITEMP3,
32781     1                ITEMP4,ITEMP5,ITEMP6,
32782     1                DTEMP1,DTEMP2,DTEMP3,
32783CCCCC1                IQUAME,IQUASE,PSTAMV,
32784     1                STAT1,
32785     1                ISUBRO,IBUGA3,IERROR)
32786          IF(IERROR.EQ.'YES')GOTO9000
32787          STTEMP(I)=STAT1
32788CCCCC     AINDX(I)=REAL(I)
32789          AINDX(I)=XH1DIS(I)
32790        ELSE
32791          IERROR='YES'
32792          GOTO9000
32793        ENDIF
32794  310 CONTINUE
32795C
32796      CALL SORTC(STTEMP,AINDX,NUMSE1,STTEMP,TEMP3)
32797C
32798      DO390I=1,NUMSE1
32799        AINDX(I)=TEMP3(I)
32800  390 CONTINUE
32801C
32802      DO410I=1,NUMSE1
32803        AVALUE=0.0
32804        DO415J=1,NUMSE1
32805          IF(XH1DIS(I).EQ.AINDX(J))THEN
32806CCCCC       AVALUE=REAL(J)
32807            AVALUE=XH1DIS(J)
32808            GOTO419
32809          ENDIF
32810  415   CONTINUE
32811  419   CONTINUE
32812        DO420J=1,N
32813          IF(XH1(J).EQ.XH1DIS(I))THEN
32814            X2(J)=AVALUE
32815          ENDIF
32816  420   CONTINUE
32817  410 CONTINUE
32818C
32819C               ******************
32820C               **   STEP 90--  **
32821C               **   EXIT       **
32822C               ******************
32823C
32824 9000 CONTINUE
32825      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'TMEA')THEN
32826        WRITE(ICOUT,999)
32827        CALL DPWRST('XXX','BUG ')
32828        WRITE(ICOUT,9011)
32829 9011   FORMAT('***** AT THE END       OF SRTMEA--')
32830        CALL DPWRST('XXX','BUG ')
32831        WRITE(ICOUT,9015)NUMSE1
32832 9015   FORMAT('NUMSE1 = ',I8)
32833        CALL DPWRST('XXX','BUG ')
32834        DO9020I=1,NUMSE1
32835          WRITE(ICOUT,9021)I,XH1DIS(I),AINDX(I)
32836 9021     FORMAT('I,XH1DIS(I),AINDX(I) = ',I8,2G15.7)
32837          CALL DPWRST('XXX','BUG ')
32838 9020   CONTINUE
32839        DO9030I=1,N
32840          WRITE(ICOUT,9031)I,Y(I),XH1(I),X2(I)
32841 9031     FORMAT('I,Y(I),XH1(I),X2(I) = ',I8,G15.7)
32842          CALL DPWRST('XXX','BUG ')
32843 9030   CONTINUE
32844      ENDIF
32845C
32846      RETURN
32847      END
32848      subroutine ss(y,n,np,ns,isdeg,nsjump,userw,rw,season,work1,work2,
32849     &work3,work4)
32850c
32851c  This routine is part of the Bill Cleveland seasonal loess
32852c  program.
32853c
32854      integer n, np, ns, isdeg, nsjump, nright, nleft, i, j, k
32855      real y(n), rw(n), season(n+2*np), work1(n), work2(n), work3(n),
32856     &work4(n), xs
32857      logical userw,ok
32858      j=1
3285923105 if(.not.(j .le. np))goto 23107
32860      k = (n-j)/np+1
32861      do 23108 i = 1,k
32862      work1(i) = y((i-1)*np+j)
3286323108 continue
32864      if(.not.(userw))goto 23110
32865      do 23112 i = 1,k
32866      work3(i) = rw((i-1)*np+j)
3286723112 continue
3286823110 continue
32869      call ess(work1,k,ns,isdeg,nsjump,userw,work3,work2(2),work4)
32870      xs = 0
32871      nright = min0(ns,k)
32872      call est(work1,k,ns,isdeg,xs,work2(1),1,nright,work4,userw,work3,
32873     &ok)
32874      if(.not.( .not. ok))goto 23114
32875      work2(1) = work2(2)
3287623114 continue
32877      xs = k+1
32878      nleft = max0(1,k-ns+1)
32879      call est(work1,k,ns,isdeg,xs,work2(k+2),nleft,k,work4,userw,work3,
32880     &ok)
32881      if(.not.( .not. ok))goto 23116
32882      work2(k+2) = work2(k+1)
3288323116 continue
32884      do 23118 m = 1,k+2
32885      season((m-1)*np+j) = work2(m)
3288623118 continue
32887       j=j+1
32888      goto 23105
3288923107 continue
32890      return
32891      end
32892      SUBROUTINE SSCAL(N,SA,SX,INCX)
32893C***BEGIN PROLOGUE  SSCAL
32894C***DATE WRITTEN   791001   (YYMMDD)
32895C***REVISION DATE  820801   (YYMMDD)
32896C***CATEGORY NO.  D1A6
32897C***KEYWORDS  BLAS,LINEAR ALGEBRA,SCALE,VECTOR
32898C***AUTHOR  LAWSON, C. L., (JPL)
32899C           HANSON, R. J., (SNLA)
32900C           KINCAID, D. R., (U. OF TEXAS)
32901C           KROGH, F. T., (JPL)
32902C***PURPOSE  S.P. vector scale x = a*x
32903C***DESCRIPTION
32904C
32905C                B L A S  Subprogram
32906C    Description of Parameters
32907C
32908C     --Input--
32909C        N  number of elements in input vector(s)
32910C       SA  single precision scale factor
32911C       SX  single precision vector with N elements
32912C     INCX  storage spacing between elements of SX
32913C
32914C     --Output--
32915C       SX  single precision result (unchanged if N .LE. 0)
32916C
32917C     Replace single precision SX by single precision SA*SX.
32918C     For I = 0 to N-1, replace SX(1+I*INCX) with  SA * SX(1+I*INCX)
32919C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
32920C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
32921C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
32922C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
32923C***ROUTINES CALLED  (NONE)
32924C***END PROLOGUE  SSCAL
32925C
32926      REAL SA,SX(*)
32927C***FIRST EXECUTABLE STATEMENT  SSCAL
32928      IF(N.LE.0)RETURN
32929      IF(INCX.EQ.1)GOTO 20
32930C
32931C        CODE FOR INCREMENTS NOT EQUAL TO 1.
32932C
32933      NS = N*INCX
32934          DO 10 I = 1,NS,INCX
32935          SX(I) = SA*SX(I)
32936   10     CONTINUE
32937      RETURN
32938C
32939C        CODE FOR INCREMENTS EQUAL TO 1.
32940C
32941C
32942C        CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 5.
32943C
32944   20 M = MOD(N,5)
32945      IF( M .EQ. 0 ) GO TO 40
32946      DO 30 I = 1,M
32947        SX(I) = SA*SX(I)
32948   30 CONTINUE
32949      IF( N .LT. 5 ) RETURN
32950   40 MP1 = M + 1
32951      DO 50 I = MP1,N,5
32952        SX(I) = SA*SX(I)
32953        SX(I + 1) = SA*SX(I + 1)
32954        SX(I + 2) = SA*SX(I + 2)
32955        SX(I + 3) = SA*SX(I + 3)
32956        SX(I + 4) = SA*SX(I + 4)
32957   50 CONTINUE
32958      RETURN
32959      END
32960      SUBROUTINE SSIEV(A,LDA,N,E,WORK,JOB,INFO)
32961C***BEGIN PROLOGUE  SSIEV
32962C***DATE WRITTEN   800808   (YYMMDD)
32963C***REVISION DATE  820801   (YYMMDD)
32964C***CATEGORY NO.  D4A1
32965C***KEYWORDS  EIGENVALUE,EIGENVECTOR,MATRIX,REAL,SYMMETRIC
32966C***AUTHOR  KAHANER, D. K., (NBS)
32967C           MOLER, C. B., (U. OF NEW MEXICO)
32968C           STEWART, G. W., (U. OF MARYLAND)
32969C***PURPOSE  To compute the eigenvalues and, optionally, the eigen-
32970C            vectors of a real SYMMETRIC matrix.
32971C***DESCRIPTION
32972C
32973C     LICEPACK.  This version dated 08/08/80.
32974C     David Kahaner, Cleve Moler, Pete Stewart
32975C          N.B.S.       U.N.M.     N.B.S./U.MD.
32976C
32977C     Abstract
32978C      SSIEV computes the eigenvalues and, optionally, the eigenvectors
32979C      of a real symmetric matrix.
32980C
32981C     Call Sequence Parameters-
32982C       (The values of parameters marked with * (star) will be  changed
32983C         by SSIEV.)
32984C
32985C       A*      REAL (LDA,N)
32986C               real symmetric input matrix.
32987C               Only the diagonal and upper triangle of A must be input,
32988C               as SSIEV copies the upper triangle to the lower.
32989C               That is, the user must define A(I,J), I=1,..N, and J=I,.
32990C               ..,N.
32991C               On return from SSIEV, if the user has set JOB
32992C               = 0        the lower triangle of A has been altered.
32993C               = nonzero  the N eigenvectors of A are stored in its
32994C               first N columns.  See also INFO below.
32995C
32996C       LDA     INTEGER
32997C               set by the user to
32998C               the leading dimension of the array A.
32999C
33000C       N       INTEGER
33001C               set by the user to
33002C               the order of the matrix A and
33003C               the number of elements in E.
33004C
33005C       E*      REAL (N)
33006C               on return from SSIEV, E contains the N
33007C               eigenvalues of A.  See also INFO below.
33008C
33009C       WORK*   REAL (2*N)
33010C               temporary storage vector.  Contents changed by SSIEV.
33011C
33012C       JOB     INTEGER
33013C               set by user on input
33014C               = 0         only calculate eigenvalues of A.
33015C               = nonzero   calculate eigenvalues and eigenvectors of A.
33016C
33017C       INFO*   INTEGER
33018C               on return from SSIEV, the value of INFO is
33019C               = 0 for normal return.
33020C               = K if the eigenvalue iteration fails to converge.
33021C                   eigenvalues and vectors 1 through K-1 are correct.
33022C
33023C
33024C     Error Messages-
33025C          No. 1   recoverable  N is greater than LDA
33026C          No. 2   recoverable  N is less than one
33027C
33028C     Subroutines Used
33029C
33030C     EISPACK- TRED1, TRED2, TQLRAT, IMTQL2
33031C     SLATEC-  XERROR
33032C***REFERENCES  (NONE)
33033C***ROUTINES CALLED  IMTQL2,TQLRAT,TRED1,TRED2,XERROR
33034C***END PROLOGUE  SSIEV
33035      INTEGER INFO,JOB,LDA,N
33036      REAL A(LDA,N),E(N),WORK(1)
33037C***FIRST EXECUTABLE STATEMENT  SSIEV
33038       IF(N .GT. LDA)THEN
33039CCCCC    WRITE(*,*) 'FROM SSIEV: N .GT. LDA.'
33040         INFO = -1
33041         RETURN
33042       ENDIF
33043       IF(N .LT. 1) THEN
33044CCCCC    WRITE(*,*) 'FROM SSIEV: N .LT. 1'
33045         INFO = -2
33046         RETURN
33047       ENDIF
33048C
33049C       CHECK N=1 CASE
33050C
33051      E(1) = A(1,1)
33052      INFO = 0
33053      IF(N .EQ. 1) RETURN
33054C
33055C     COPY UPPER TRIANGLE TO LOWER
33056C
33057      DO 10 J=1,N
33058         DO 11 I=1,J
33059            A(J,I)=A(I,J)
33060   11    CONTINUE
33061   10 CONTINUE
33062C
33063      IF(JOB.NE.0) GO TO 20
33064C
33065C     EIGENVALUES ONLY
33066C
33067      CALL TRED1(LDA,N,A,E,WORK(1),WORK(N+1))
33068      CALL TQLRAT(N,E,WORK(N+1),INFO)
33069      RETURN
33070C
33071C     EIGENVALUES AND EIGENVECTORS
33072C
33073   20 CALL TRED2(LDA,N,A,E,WORK,A)
33074      CALL IMTQL2(LDA,N,E,WORK,A,INFO)
33075      RETURN
33076      END
33077      SUBROUTINE SSNC(P1,P2,ALPHA,BETA,N,IC,IBUGA3,IERROR)
33078C
33079C     PURPOSE--THIS SUBROUTINE COMPUTES THE
33080C              BINOMIAL BASED SINGLE SAMPLE PLAN (N,C).
33081C     INPUT  ARGUMENTS--P1     = THE SINGLE PRECISION VALUE FOR
33082C                                THE ACCEPTABLE QUALITY LEVEL.
33083C                     --P2     = THE SINGLE PRECISION VALUE FOR
33084C                                THE LOT TOLERANCE PERCENT DEFECTIVE
33085C                     --ALPHA  = PROBABILITY FOR AQL.
33086C                     --BETA   = PROBABILITY FOR LTPD.
33087C     OUTPUT ARGUMENTS--N      = THE COMPUTED SAMPLE SIZE.
33088C                     --IC     = ACCEPTABLE NUMBER OF DEFECTIVES.
33089C     OTHER DATAPAC   SUBROUTINES NEEDED--BINCDF.
33090C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33091C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
33092C     LANGUAGE--ANSI FORTRAN (1977)
33093C     REFERENCES--MONTGOMERY, STATISTICAL QUALITY CONTROL,
33094C                 ALGORITHM IS FORTRAN TRANSLATION OF A BASIC CODE
33095C                 PROVIDED BY JACK PRINS.
33096C     WRITTEN BY--ALAN HECKERT
33097C                 STATISTICAL ENGINEERING DIVISION
33098C                 INFORMATION TECHNOLOGY LABORATORY
33099C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33100C                 GAITHERSBURG, MD 20899-8980
33101C                 PHONE--301-075-2899
33102C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33103C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33104C     LANGUAGE--ANSI FORTRAN (1977)
33105C     VERSION NUMBER--99/3
33106C     ORIGINAL VERSION--MARCH     1999.
33107C
33108C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33109C
33110      CHARACTER*4 IBUGA3
33111      CHARACTER*4 IERROR
33112C
33113C---------------------------------------------------------------------
33114C
33115      DOUBLE PRECISION DCDF
33116C
33117      REAL L
33118C
33119C-----COMMON----------------------------------------------------------
33120C
33121      INCLUDE 'DPCOP2.INC'
33122C
33123C-----START POINT-----------------------------------------------------
33124C
33125      IF(IBUGA3.EQ.'ON')THEN
33126        WRITE(ICOUT,11)
33127   11   FORMAT('AT THE BEGINNING OF SSNC')
33128        CALL DPWRST('XXX','BUG ')
33129      ENDIF
33130C
33131      IERROR='NO'
33132      MAXIT=10000
33133      I=0
33134  100 CONTINUE
33135      IF(I.GT.MAXIT)THEN
33136        WRITE(ICOUT,999)
33137        CALL DPWRST('XXX','BUG ')
33138        WRITE(ICOUT,101)
33139  101   FORMAT('***** MAXIMUM NUMBER OF ITERATIONS EXCEEDED FOR THE ',
33140     1         'BINOMIAL SINGLE SAMPLE PLAN')
33141        CALL DPWRST('XXX','BUG ')
33142        N=0
33143        IC=0
33144        GOTO9000
33145      ENDIF
33146      IDF=2 + 2*I
33147      P=1.0 - BETA
33148      CALL CHSPPF(P,IDF,PPF)
33149      L=0.5*(REAL(I) + (-0.5 + 1.0/P2)*PPF)
33150C
33151      IDF=2 + 2*I
33152      P=ALPHA
33153      CALL CHSPPF(P,IDF,PPF)
33154      U=0.5*(REAL(I) + (-0.5 + 1.0/P1)*PPF)
33155C
33156      IF(INT(U)-INT(L).LT.1)THEN
33157        I=I+1
33158        GOTO100
33159      ENDIF
33160C
33161      IF(U.GT.L)THEN
33162        N=INT(U)
33163      ELSE
33164        N=INT(L)
33165      ENDIF
33166      IC=I
33167C
33168  300 CONTINUE
33169      N=N-1
33170      CALL BINCDF(DBLE(IC),DBLE(P2),N,DCDF)
33171      S=REAL(DCDF)
33172      IF(S.GT.BETA)GOTO400
33173      BCDF=S
33174      GOTO300
33175C
33176  400 CONTINUE
33177      N=N+1
33178      CALL BINCDF(DBLE(IC),DBLE(P1),N,DCDF)
33179      S=REAL(DCDF)
33180      ACDF=S
33181C
33182      WRITE(ICOUT,999)
33183  999 FORMAT(1X)
33184      CALL DPWRST('XXX','BUG ')
33185      WRITE(ICOUT,1001)
33186 1001 FORMAT('BINOMIAL SINGLE SAMPLE PLAN')
33187      CALL DPWRST('XXX','BUG ')
33188      WRITE(ICOUT,1011)P1
33189 1011 FORMAT('     P1 (= Acceptable Quality Level)          = ',F7.4)
33190      CALL DPWRST('XXX','BUG ')
33191      WRITE(ICOUT,1021)P2
33192 1021 FORMAT('     P2 (= Lot Tolerance Percent Defective)   = ',F7.4)
33193      CALL DPWRST('XXX','BUG ')
33194      WRITE(ICOUT,1031)ALPHA
33195 1031 FORMAT('     ALPHA                                    = ',F7.4)
33196      CALL DPWRST('XXX','BUG ')
33197      WRITE(ICOUT,1041)BETA
33198 1041 FORMAT('     BETA                                     = ',F7.4)
33199      CALL DPWRST('XXX','BUG ')
33200      WRITE(ICOUT,999)
33201      CALL DPWRST('XXX','BUG ')
33202      WRITE(ICOUT,1051)N
33203 1051 FORMAT('     Computed Sample Size                     = ',I8)
33204      CALL DPWRST('XXX','BUG ')
33205      WRITE(ICOUT,1061)IC
33206 1061 FORMAT('     Computed Acceptance Number              = ',I8)
33207      CALL DPWRST('XXX','BUG ')
33208      WRITE(ICOUT,999)
33209      CALL DPWRST('XXX','BUG ')
33210C
33211      WRITE(ICOUT,1071)
33212 1071 FORMAT('The sample size and acceptance number are saved in')
33213      CALL DPWRST('XXX','BUG ')
33214      WRITE(ICOUT,1081)
33215 1081 FORMAT('the internal parameters SSN and SSC respectively.')
33216      CALL DPWRST('XXX','BUG ')
33217      WRITE(ICOUT,999)
33218      CALL DPWRST('XXX','BUG ')
33219C
33220 9000 CONTINUE
33221      RETURN
33222      END
33223      SUBROUTINE SSORT(X,Y,N,KFLAG)
33224C
33225c      NOTE: This subroutine used in computing the consensus mean
33226c            using the Iyer and Wang generalized tolerance interval
33227c            approach.
33228c
33229c            Modified for Dataplot 3/2006.
33230c
33231C***BEGIN PROLOGUE  SSORT
33232C***DATE WRITTEN   761101   (YYMMDD)
33233C***REVISION DATE  820801   (YYMMDD)
33234C***CATEGORY NO.  N6A2B1
33235C***KEYWORDS  QUICKSORT,SINGLETON QUICKSORT,SORT,SORTING
33236C***AUTHOR  JONES, R. E., (SNLA)
33237C           WISNIEWSKI, J. A., (SNLA)
33238C***PURPOSE  SSORT sorts array X and optionally makes the same
33239C            interchanges in array Y.  The array X may be sorted in
33240C            increasing order or decreasing order.  A slightly modified
33241C            QUICKSORT algorithm is used.
33242C***DESCRIPTION
33243C
33244C     Written by Rondall E. Jones
33245C     Modified by John A. Wisniewski to use the Singleton quicksort
33246C     algorithm.  Date 18 November 1976.
33247C
33248C     Abstract
33249C         SSORT sorts array X and optionally makes the same
33250C         interchanges in array Y.  The array X may be sorted in
33251C         increasing order or decreasing order.  A slightly modified
33252C         quicksort algorithm is used.
33253C
33254C     Reference
33255C         Singleton, R. C., Algorithm 347, An Efficient Algorithm for
33256C         Sorting with Minimal Storage, CACM,12(3),1969,185-7.
33257C
33258C     Description of Parameters
33259C         X - array of values to be sorted   (usually abscissas)
33260C         Y - array to be (optionally) carried along
33261C         N - number of values in array X to be sorted
33262C         KFLAG - control parameter
33263C             =2  means sort X in increasing order and carry Y along.
33264C             =1  means sort X in increasing order (ignoring Y)
33265C             =-1 means sort X in decreasing order (ignoring Y)
33266C             =-2 means sort X in decreasing order and carry Y along.
33267C***REFERENCES  SINGLETON,R.C., ALGORITHM 347, AN EFFICIENT ALGORITHM
33268C                 FOR SORTING WITH MINIMAL STORAGE, CACM,12(3),1969,
33269C                 185-7.
33270C***END PROLOGUE  SSORT
33271      integer n, kflag
33272      double precision X(N),Y(N)
33273      integer IL(21),IU(21)
33274c
33275      double precision t, tt, r, ty, tty
33276c
33277      INCLUDE 'DPCOP2.INC'
33278C
33279C***FIRST EXECUTABLE STATEMENT  SSORT
33280      NN = N
33281      IF (NN.LT.1) THEN
33282         WRITE(ICOUT,1)
33283    1    FORMAT('*****ERROR FROM SSORT--')
33284         CALL DPWRST('XXX','WRIT')
33285         WRITE(ICOUT,2)
33286    2    FORMAT('     THE NUMBER OF VALUES TO BE SORTED WAS NOT ',
33287     1          'POSITIVE.')
33288         CALL DPWRST('XXX','WRIT')
33289         RETURN
33290      ENDIF
33291      KK = IABS(KFLAG)
33292      IF ((KK.EQ.1).OR.(KK.EQ.2)) GO TO 15
33293         WRITE(ICOUT,1)
33294         CALL DPWRST('XXX','WRIT')
33295         WRITE(ICOUT,3)
33296    3    FORMAT('     THE SORT CONTROL PARAMETER, K, WAS NOT ',
33297     1          '2, 1, -1, OR -2.')
33298         CALL DPWRST('XXX','WRIT')
33299         RETURN
33300C
33301C ALTER ARRAY X TO GET DECREASING ORDER IF NEEDED
33302C
33303   15 IF (KFLAG.GE.1) GO TO 30
33304      DO 20 I=1,NN
33305         X(I) = -X(I)
33306   20 CONTINUE
33307   30 CONTINUE
33308      GO TO (100,200),KK
33309C
33310C SORT X ONLY
33311C
33312  100 CONTINUE
33313      M=1
33314      I=1
33315      J=NN
33316      R=.375d0
33317  110 IF (I .EQ. J) GO TO 155
33318      IF (R .GT. .5898437d0) GO TO 120
33319      R=R+3.90625d-2
33320      GO TO 125
33321  120 R=R-.21875d0
33322  125 K=I
33323C                                  SELECT A CENTRAL ELEMENT OF THE
33324C                                  ARRAY AND SAVE IT IN LOCATION T
33325      IJ = I + INT(FLOAT (J-I) * R)
33326      T=X(IJ)
33327C                                  IF FIRST ELEMENT OF ARRAY IS GREATER
33328C                                  THAN T, INTERCHANGE WITH T
33329      IF (X(I) .LE. T) GO TO 130
33330      X(IJ)=X(I)
33331      X(I)=T
33332      T=X(IJ)
33333  130 L=J
33334C                                  IF LAST ELEMENT OF ARRAY IS LESS THAN
33335C                                  T, INTERCHANGE WITH T
33336      IF (X(J) .GE. T) GO TO 140
33337      X(IJ)=X(J)
33338      X(J)=T
33339      T=X(IJ)
33340C                                  IF FIRST ELEMENT OF ARRAY IS GREATER
33341C                                  THAN T, INTERCHANGE WITH T
33342      IF (X(I) .LE. T) GO TO 140
33343      X(IJ)=X(I)
33344      X(I)=T
33345      T=X(IJ)
33346      GO TO 140
33347  135 TT=X(L)
33348      X(L)=X(K)
33349      X(K)=TT
33350C                                  FIND AN ELEMENT IN THE SECOND HALF OF
33351C                                  THE ARRAY WHICH IS SMALLER THAN T
33352  140 L=L-1
33353      IF (X(L) .GT. T) GO TO 140
33354C                                  FIND AN ELEMENT IN THE FIRST HALF OF
33355C                                  THE ARRAY WHICH IS GREATER THAN T
33356  145 K=K+1
33357      IF (X(K) .LT. T) GO TO 145
33358C                                  INTERCHANGE THESE ELEMENTS
33359      IF (K .LE. L) GO TO 135
33360C                                  SAVE UPPER AND LOWER SUBSCRIPTS OF
33361C                                  THE ARRAY YET TO BE SORTED
33362      IF (L-I .LE. J-K) GO TO 150
33363      IL(M)=I
33364      IU(M)=L
33365      I=K
33366      M=M+1
33367      GO TO 160
33368  150 IL(M)=K
33369      IU(M)=J
33370      J=L
33371      M=M+1
33372      GO TO 160
33373C                                  BEGIN AGAIN ON ANOTHER PORTION OF
33374C                                  THE UNSORTED ARRAY
33375  155 M=M-1
33376      IF (M .EQ. 0) GO TO 300
33377      I=IL(M)
33378      J=IU(M)
33379  160 IF (J-I .GE. 1) GO TO 125
33380      IF (I .EQ. 1) GO TO 110
33381      I=I-1
33382  165 I=I+1
33383      IF (I .EQ. J) GO TO 155
33384      T=X(I+1)
33385      IF (X(I) .LE. T) GO TO 165
33386      K=I
33387  170 X(K+1)=X(K)
33388      K=K-1
33389      IF (T .LT. X(K)) GO TO 170
33390      X(K+1)=T
33391      GO TO 165
33392C
33393C SORT X AND CARRY Y ALONG
33394C
33395  200 CONTINUE
33396      M=1
33397      I=1
33398      J=NN
33399      R=.375d0
33400  210 IF (I .EQ. J) GO TO 255
33401      IF (R .GT. .5898437d0) GO TO 220
33402      R=R+3.90625d-2
33403      GO TO 225
33404  220 R=R-.21875d0
33405  225 K=I
33406C                                  SELECT A CENTRAL ELEMENT OF THE
33407C                                  ARRAY AND SAVE IT IN LOCATION T
33408      IJ = I + INT(FLOAT (J-I) *R)
33409      T=X(IJ)
33410      TY= Y(IJ)
33411C                                  IF FIRST ELEMENT OF ARRAY IS GREATER
33412C                                  THAN T, INTERCHANGE WITH T
33413      IF (X(I) .LE. T) GO TO 230
33414      X(IJ)=X(I)
33415      X(I)=T
33416      T=X(IJ)
33417       Y(IJ)= Y(I)
33418       Y(I)=TY
33419      TY= Y(IJ)
33420  230 L=J
33421C                                  IF LAST ELEMENT OF ARRAY IS LESS THAN
33422C                                  T, INTERCHANGE WITH T
33423      IF (X(J) .GE. T) GO TO 240
33424      X(IJ)=X(J)
33425      X(J)=T
33426      T=X(IJ)
33427       Y(IJ)= Y(J)
33428       Y(J)=TY
33429      TY= Y(IJ)
33430C                                  IF FIRST ELEMENT OF ARRAY IS GREATER
33431C                                  THAN T, INTERCHANGE WITH T
33432      IF (X(I) .LE. T) GO TO 240
33433      X(IJ)=X(I)
33434      X(I)=T
33435      T=X(IJ)
33436       Y(IJ)= Y(I)
33437       Y(I)=TY
33438      TY= Y(IJ)
33439      GO TO 240
33440  235 TT=X(L)
33441      X(L)=X(K)
33442      X(K)=TT
33443      TTY= Y(L)
33444       Y(L)= Y(K)
33445       Y(K)=TTY
33446C                                  FIND AN ELEMENT IN THE SECOND HALF OF
33447C                                  THE ARRAY WHICH IS SMALLER THAN T
33448  240 L=L-1
33449      IF (X(L) .GT. T) GO TO 240
33450C                                  FIND AN ELEMENT IN THE FIRST HALF OF
33451C                                  THE ARRAY WHICH IS GREATER THAN T
33452  245 K=K+1
33453      IF (X(K) .LT. T) GO TO 245
33454C                                  INTERCHANGE THESE ELEMENTS
33455      IF (K .LE. L) GO TO 235
33456C                                  SAVE UPPER AND LOWER SUBSCRIPTS OF
33457C                                  THE ARRAY YET TO BE SORTED
33458      IF (L-I .LE. J-K) GO TO 250
33459      IL(M)=I
33460      IU(M)=L
33461      I=K
33462      M=M+1
33463      GO TO 260
33464  250 IL(M)=K
33465      IU(M)=J
33466      J=L
33467      M=M+1
33468      GO TO 260
33469C                                  BEGIN AGAIN ON ANOTHER PORTION OF
33470C                                  THE UNSORTED ARRAY
33471  255 M=M-1
33472      IF (M .EQ. 0) GO TO 300
33473      I=IL(M)
33474      J=IU(M)
33475  260 IF (J-I .GE. 1) GO TO 225
33476      IF (I .EQ. 1) GO TO 210
33477      I=I-1
33478  265 I=I+1
33479      IF (I .EQ. J) GO TO 255
33480      T=X(I+1)
33481      TY= Y(I+1)
33482      IF (X(I) .LE. T) GO TO 265
33483      K=I
33484  270 X(K+1)=X(K)
33485       Y(K+1)= Y(K)
33486      K=K-1
33487      IF (T .LT. X(K)) GO TO 270
33488      X(K+1)=T
33489       Y(K+1)=TY
33490      GO TO 265
33491C
33492C CLEAN UP
33493C
33494  300 CONTINUE
33495      IF (KFLAG.GE.1) RETURN
33496      DO 310 I=1,NN
33497         X(I) = -X(I)
33498  310 CONTINUE
33499      RETURN
33500      END
33501      SUBROUTINE SSQ(X,N,XCAP,IWRITE,XSSQ,IBUGA3,ISUBRO,IERROR)
33502C
33503C     PURPOSE--THIS SUBROUTINE COMPUTES THE SUM OF SQUARES
33504C
33505C                  SSQ = SUM[i=1 to n][X(i)**2]
33506C
33507C              OF THE DATA IN THE INPUT VECTOR X.
33508C
33509C              SOME AUTHORS RECOMMEND CAPPING THE VALUE OF
33510C              OUTLIERS TO LESSEN THE EFFECT OF SEVERE OUTLIERS
33511C              (THIS CAP IS TYPICALLY SET TO EITHER +/-3 OR
33512C              +/- 4).  SET XOUT TO CPUMIN IF CAPPING IS NOT
33513C              DESIRED.
33514C
33515C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
33516C                                (UNSORTED OR SORTED) OBSERVATIONS.
33517C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
33518C                                IN THE VECTOR X.
33519C                     --XCAP   = OPTIONAL CAP VALUE
33520C     OUTPUT ARGUMENTS--XSSQ   = THE SINGLE PRECISION VALUE OF THE
33521C                                COMPUTED SUM OF SQUARES.
33522C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SUM OF SQUARES.
33523C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
33524C                   OF N FOR THIS SUBROUTINE.
33525C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33526C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33527C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33528C     LANGUAGE--ANSI FORTRAN (1977)
33529C     WRITTEN BY--ALAN HECKERT
33530C                 STATISTICAL ENGINEERING DIVISION
33531C                 INFORMATION TECHNOLOGY LABORATORY
33532C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
33533C                 GAITHERSBURG, MD 20899-8980
33534C                 PHONE--301-975-2855
33535C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33536C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33537C     LANGUAGE--ANSI FORTRAN (1977)
33538C     VERSION NUMBER--2012.2
33539C     ORIGINAL VERSION--FEBRUARY  2012.
33540C
33541C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33542C
33543      CHARACTER*4 IWRITE
33544      CHARACTER*4 IBUGA3
33545      CHARACTER*4 ISUBRO
33546      CHARACTER*4 IERROR
33547C
33548      CHARACTER*4 ISUBN1
33549      CHARACTER*4 ISUBN2
33550C
33551C---------------------------------------------------------------------
33552C
33553      DOUBLE PRECISION DX
33554      DOUBLE PRECISION DSUM
33555C
33556      DIMENSION X(*)
33557C
33558C-----COMMON----------------------------------------------------------
33559C
33560      INCLUDE 'DPCOP2.INC'
33561C
33562C-----START POINT-----------------------------------------------------
33563C
33564      ISUBN1='SSQ '
33565      ISUBN2='    '
33566      IERROR='NO'
33567C
33568      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'SSQ ')THEN
33569        WRITE(ICOUT,999)
33570  999   FORMAT(1X)
33571        CALL DPWRST('XXX','BUG ')
33572        WRITE(ICOUT,51)
33573   51   FORMAT('***** AT THE BEGINNING OF SSQ--')
33574        CALL DPWRST('XXX','BUG ')
33575        WRITE(ICOUT,52)IBUGA3,N,XCAP
33576   52   FORMAT('IBUGA3,N,XCAP = ',A4,2X,I8,2X,G15.7)
33577        CALL DPWRST('XXX','BUG ')
33578        DO55I=1,N
33579          WRITE(ICOUT,56)I,X(I)
33580   56     FORMAT('I,X(I) = ',I8,G15.7)
33581          CALL DPWRST('XXX','BUG ')
33582   55   CONTINUE
33583      ENDIF
33584C
33585C               ********************************************
33586C               **  STEP 1--                              **
33587C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33588C               ********************************************
33589C
33590      IF(N.LT.1)THEN
33591        WRITE(ICOUT,999)
33592        CALL DPWRST('XXX','BUG ')
33593        WRITE(ICOUT,111)
33594  111   FORMAT('***** ERROR IN SUM OF SQUARES--')
33595        CALL DPWRST('XXX','BUG ')
33596        WRITE(ICOUT,112)
33597  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
33598     1         'VARIABLE IS LESS THAN 1.')
33599        CALL DPWRST('XXX','BUG ')
33600        WRITE(ICOUT,117)N
33601  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8)
33602        CALL DPWRST('XXX','BUG ')
33603        IERROR='YES'
33604        GOTO9000
33605      ENDIF
33606C
33607C               *************************************
33608C               **  STEP 2--                       **
33609C               **  COMPUTE THE SUM OF SQUARES.    **
33610C               *************************************
33611C
33612      DSUM=0.0D0
33613      IF(XCAP.EQ.CPUMIN)THEN
33614        DO200I=1,N
33615          DX=X(I)
33616          DSUM=DSUM + DX*DX
33617  200   CONTINUE
33618      ELSE
33619        DO300I=1,N
33620          DX=X(I)
33621          IF(DABS(DX).GT.XCAP)THEN
33622            IF(DX.GT.0.0D0)THEN
33623              DX=ABS(XCAP)
33624            ELSE
33625              DX=-ABS(XCAP)
33626            ENDIF
33627          ENDIF
33628          DSUM=DSUM + DX*DX
33629  300   CONTINUE
33630      ENDIF
33631      XSSQ=REAL(DSUM)
33632C
33633C               *******************************
33634C               **  STEP 3--                 **
33635C               **  WRITE OUT A LINE         **
33636C               **  OF SUMMARY INFORMATION.  **
33637C               *******************************
33638C
33639      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
33640        WRITE(ICOUT,999)
33641        CALL DPWRST('XXX','BUG ')
33642        WRITE(ICOUT,811)N,XSSQ
33643  811   FORMAT('THE SUM OF SQUARES OF THE ',I8,
33644     1         ' OBSERVATIONS = ',G15.7)
33645        CALL DPWRST('XXX','BUG ')
33646      ENDIF
33647C
33648C               *****************
33649C               **  STEP 90--  **
33650C               **  EXIT.      **
33651C               *****************
33652C
33653 9000 CONTINUE
33654      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'SSQ')THEN
33655        WRITE(ICOUT,999)
33656        CALL DPWRST('XXX','BUG ')
33657        WRITE(ICOUT,9011)
33658 9011   FORMAT('***** AT THE END OF SSQ--')
33659        CALL DPWRST('XXX','BUG ')
33660        WRITE(ICOUT,9013)IERROR,N,DSUM,XSSQ
33661 9013   FORMAT('IERROR,N,DSUM,XSSQ = ',A4,2X,I8,2G15.7)
33662        CALL DPWRST('XXX','BUG ')
33663      ENDIF
33664C
33665      RETURN
33666      END
33667      SUBROUTINE SSQMEA(X,N,IWRITE,XSSQ,IBUGA3,ISUBRO,IERROR)
33668C
33669C     PURPOSE--THIS SUBROUTINE COMPUTES THE SUM OF SQUARES FROM THE
33670C              MEAN
33671C
33672C                  SSQ = SUM[i=1 to n][(X(i) - XBAR)**2]
33673C
33674C              OF THE DATA IN THE INPUT VECTOR X.
33675C
33676C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
33677C                                (UNSORTED OR SORTED) OBSERVATIONS.
33678C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
33679C                                IN THE VECTOR X.
33680C     OUTPUT ARGUMENTS--XSSQ   = THE SINGLE PRECISION VALUE OF THE
33681C                                COMPUTED SUM OF SQUARES FROM THE MEAN.
33682C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SUM OF SQUARES
33683C             FROM THE MEAN
33684C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
33685C                   OF N FOR THIS SUBROUTINE.
33686C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33687C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33688C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33689C     LANGUAGE--ANSI FORTRAN (1977)
33690C     WRITTEN BY--ALAN HECKERT
33691C                 STATISTICAL ENGINEERING DIVISION
33692C                 INFORMATION TECHNOLOGY LABORATORY
33693C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
33694C                 GAITHERSBURG, MD 20899-8980
33695C                 PHONE--301-975-2855
33696C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33697C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33698C     LANGUAGE--ANSI FORTRAN (1977)
33699C     VERSION NUMBER--2013.2
33700C     ORIGINAL VERSION--FEBRUARY  2013.
33701C
33702C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33703C
33704      CHARACTER*4 IWRITE
33705      CHARACTER*4 IBUGA3
33706      CHARACTER*4 ISUBRO
33707      CHARACTER*4 IERROR
33708C
33709      CHARACTER*4 ISUBN1
33710      CHARACTER*4 ISUBN2
33711C
33712C---------------------------------------------------------------------
33713C
33714      DOUBLE PRECISION DN
33715      DOUBLE PRECISION DX
33716      DOUBLE PRECISION DSUM
33717      DOUBLE PRECISION DXBAR
33718C
33719      DIMENSION X(*)
33720C
33721C-----COMMON----------------------------------------------------------
33722C
33723      INCLUDE 'DPCOP2.INC'
33724C
33725C-----START POINT-----------------------------------------------------
33726C
33727      ISUBN1='SSQM'
33728      ISUBN2='EA  '
33729      IERROR='NO'
33730C
33731      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QMEA')THEN
33732        WRITE(ICOUT,999)
33733  999   FORMAT(1X)
33734        CALL DPWRST('XXX','BUG ')
33735        WRITE(ICOUT,51)
33736   51   FORMAT('***** AT THE BEGINNING OF SSQMEA--')
33737        CALL DPWRST('XXX','BUG ')
33738        WRITE(ICOUT,52)IBUGA3,N
33739   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
33740        CALL DPWRST('XXX','BUG ')
33741        DO55I=1,N
33742          WRITE(ICOUT,56)I,X(I)
33743   56     FORMAT('I,X(I) = ',I8,G15.7)
33744          CALL DPWRST('XXX','BUG ')
33745   55   CONTINUE
33746      ENDIF
33747C
33748C               ********************************************
33749C               **  STEP 1--                              **
33750C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33751C               ********************************************
33752C
33753      IF(N.LT.1)THEN
33754        WRITE(ICOUT,999)
33755        CALL DPWRST('XXX','BUG ')
33756        WRITE(ICOUT,111)
33757  111   FORMAT('***** ERROR IN SUM OF SQUARES FROM THE MEAN--')
33758        CALL DPWRST('XXX','BUG ')
33759        WRITE(ICOUT,112)
33760  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
33761     1         'VARIABLE IS LESS THAN 1.')
33762        CALL DPWRST('XXX','BUG ')
33763        WRITE(ICOUT,117)N
33764  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8)
33765        CALL DPWRST('XXX','BUG ')
33766        IERROR='YES'
33767        GOTO9000
33768      ENDIF
33769C
33770C               *************************************
33771C               **  STEP 2--                       **
33772C               **  COMPUTE THE SUM OF SQUARES.    **
33773C               *************************************
33774C
33775      DN=DBLE(N)
33776      DSUM=0.0D0
33777      DO100I=1,N
33778        DX=X(I)
33779        DSUM=DSUM + DX
33780  100 CONTINUE
33781      DXBAR=DSUM/DN
33782C
33783      DSUM=0.0D0
33784      DO200I=1,N
33785        DX=X(I) - DXBAR
33786        DSUM=DSUM + DX*DX
33787  200 CONTINUE
33788C
33789      XSSQ=REAL(DSUM)
33790C
33791C               *******************************
33792C               **  STEP 3--                 **
33793C               **  WRITE OUT A LINE         **
33794C               **  OF SUMMARY INFORMATION.  **
33795C               *******************************
33796C
33797      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
33798        WRITE(ICOUT,999)
33799        CALL DPWRST('XXX','BUG ')
33800        WRITE(ICOUT,811)N,XSSQ
33801  811   FORMAT('THE SUM OF SQUARES FROM THE MEAN OF THE ',I8,
33802     1         ' OBSERVATIONS = ',G15.7)
33803        CALL DPWRST('XXX','BUG ')
33804      ENDIF
33805C
33806C               *****************
33807C               **  STEP 90--  **
33808C               **  EXIT.      **
33809C               *****************
33810C
33811 9000 CONTINUE
33812      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'QMEA')THEN
33813        WRITE(ICOUT,999)
33814        CALL DPWRST('XXX','BUG ')
33815        WRITE(ICOUT,9011)
33816 9011   FORMAT('***** AT THE END OF SSQMEA--')
33817        CALL DPWRST('XXX','BUG ')
33818        WRITE(ICOUT,9013)IERROR,N,DXBAR,DSUM,XSSQ
33819 9013   FORMAT('IERROR,N,DXBAR,DSUM,XSSQ = ',A4,2X,I8,3G15.7)
33820        CALL DPWRST('XXX','BUG ')
33821      ENDIF
33822C
33823      RETURN
33824      END
33825      SUBROUTINE SSVDC(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,JOB,INFO)
33826C***BEGIN PROLOGUE  SSVDC
33827C***DATE WRITTEN   790319   (YYMMDD)
33828C***REVISION DATE  820801   (YYMMDD)
33829C***CATEGORY NO.  D6
33830C***KEYWORDS  LINEAR ALGEBRA,LINPACK,MATRIX,
33831C             SINGULAR VALUE DECOMPOSITION
33832C***AUTHOR  STEWART, G. W., (U. OF MARYLAND)
33833C***PURPOSE  Perform the singular value decomposition of a real NXP
33834C            matrix
33835C***DESCRIPTION
33836C
33837C     SSVDC is a subroutine to reduce a real NxP matrix X by
33838C     orthogonal transformations U and V to diagonal form.  The
33839C     diagonal elements S(I) are the singular values of X.  The
33840C     columns of U are the corresponding left singular vectors,
33841C     and the columns of V the right singular vectors.
33842C
33843C     On Entry
33844C
33845C         X         REAL(LDX,P), where LDX .GE. N.
33846C                   X contains the matrix whose singular value
33847C                   decomposition is to be computed.  X is
33848C                   destroyed by SSVDC.
33849C
33850C         LDX       INTEGER
33851C                   LDX is the leading dimension of the array X.
33852C
33853C         N         INTEGER
33854C                   N is the number of rows of the matrix X.
33855C
33856C         P         INTEGER
33857C                   P is the number of columns of the matrix X.
33858C
33859C         LDU       INTEGER
33860C                   LDU is the leading dimension of the array U.
33861C                   (See below).
33862C
33863C         LDV       INTEGER
33864C                   LDV is the leading dimension of the array V.
33865C                   (See below).
33866C
33867C         WORK      REAL(N)
33868C                   work is a scratch array.
33869C
33870C         JOB       INTEGER
33871C                   JOB controls the computation of the singular
33872C                   vectors.  It has the decimal expansion AB
33873C                   with the following meaning
33874C
33875C                        A .EQ. 0  Do not compute the left singular
33876C                                  vectors.
33877C                        A .EQ. 1  Return the N left singular vectors
33878C                                  in U.
33879C                        A .GE. 2  Return the first MIN(N,P) singular
33880C                                  vectors in U.
33881C                        B .EQ. 0  Do not compute the right singular
33882C                                  vectors.
33883C                        B .EQ. 1  Return the right singular vectors
33884C                                  in V.
33885C
33886C     On Return
33887C
33888C         S         REAL(MM), where MM=MIN(N+1,P).
33889C                   The first MIN(N,P) entries of S contain the
33890C                   singular values of X arranged in descending
33891C                   order of magnitude.
33892C
33893C         E         REAL(P).
33894C                   E ordinarily contains zeros.  However, see the
33895C                   discussion of INFO for exceptions.
33896C
33897C         U         REAL(LDU,K), where LDU .GE. N.  If JOBA .EQ. 1, then
33898C                                   K .EQ. N.  If JOBA .GE. 2 , then
33899C                                   K .EQ. MIN(N,P).
33900C                   U contains the matrix of right singular vectors.
33901C                   U is not referenced if JOBA .EQ. 0.  If N .LE. P
33902C                   or if JOBA .EQ. 2, then U may be identified with X
33903C                   in the subroutine call.
33904C
33905C         V         REAL(LDV,P), where LDV .GE. P.
33906C                   V contains the matrix of right singular vectors.
33907C                   V is not referenced if JOB .EQ. 0.  If P .LE. N,
33908C                   then V may be identified with X in the
33909C                   subroutine call.
33910C
33911C         INFO      INTEGER.
33912C                   the singular values (and their corresponding
33913C                   singular vectors) S(INFO+1),S(INFO+2),...,S(M)
33914C                   are correct (here M=MIN(N,P)).  Thus if
33915C                   INFO .EQ. 0, all the singular values and their
33916C                   vectors are correct.  In any event, the matrix
33917C                   B = TRANS(U)*X*V is the bidiagonal matrix
33918C                   with the elements of S on its diagonal and the
33919C                   elements of E on its super-diagonal (TRANS(U)
33920C                   is the transpose of U).  Thus the singular
33921C                   values of X and B are the same.
33922C
33923C     LINPACK.  This version dated 03/19/79 .
33924C     G. W. Stewart, University of Maryland, Argonne National Lab.
33925C
33926C     ***** Uses the following functions and subprograms.
33927C
33928C     External SROT
33929C     BLAS SAXPY,SDOT,SSCAL,SSWAP,SNRM2,SROTG
33930C     Fortran ABS,AMAX1,MAX0,MIN0,MOD,SQRT
33931C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
33932C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
33933C***ROUTINES CALLED  SAXPY,SDOT,SNRM2,SROT,SROTG,SSCAL,SSWAP
33934C***END PROLOGUE  SSVDC
33935      INTEGER LDX,N,P,LDU,LDV,JOB,INFO
33936      REAL X(LDX,*),S(*),E(*),U(LDU,*),V(LDV,*),WORK(*)
33937C
33938C
33939      INTEGER I,ITER,J,JOBU,K,KASE,KK,L,LL,LLS,LM1,LP1,LS,LU,M,MAXIT,
33940     1        MM,MM1,MP1,NCT,NCTP1,NCU,NRT,NRTP1
33941CCCCC REAL SDOT,T,R
33942      REAL SDOT,T
33943      REAL B,C,CS,EL,EMM1,F,G,SNRM2,SCALE,SHIFT,SL,SM,SN,SMM1,T1,TEST,
33944     1     ZTEST
33945      LOGICAL WANTU,WANTV
33946C
33947C     SET THE MAXIMUM NUMBER OF ITERATIONS.
33948C
33949C***FIRST EXECUTABLE STATEMENT  SSVDC
33950      MAXIT = 30
33951      LS = 0
33952      L=0
33953C
33954C     DETERMINE WHAT IS TO BE COMPUTED.
33955C
33956      WANTU = .FALSE.
33957      WANTV = .FALSE.
33958      JOBU = MOD(JOB,100)/10
33959      NCU = N
33960      IF (JOBU .GT. 1) NCU = MIN0(N,P)
33961      IF (JOBU .NE. 0) WANTU = .TRUE.
33962      IF (MOD(JOB,10) .NE. 0) WANTV = .TRUE.
33963C
33964C     REDUCE X TO BIDIAGONAL FORM, STORING THE DIAGONAL ELEMENTS
33965C     IN S AND THE SUPER-DIAGONAL ELEMENTS IN E.
33966C
33967      INFO = 0
33968      NCT = MIN0(N-1,P)
33969      NRT = MAX0(0,MIN0(P-2,N))
33970      LU = MAX0(NCT,NRT)
33971      IF (LU .LT. 1) GO TO 170
33972      DO 160 L = 1, LU
33973         LP1 = L + 1
33974         IF (L .GT. NCT) GO TO 20
33975C
33976C           COMPUTE THE TRANSFORMATION FOR THE L-TH COLUMN AND
33977C           PLACE THE L-TH DIAGONAL IN S(L).
33978C
33979            S(L) = SNRM2(N-L+1,X(L,L),1)
33980            IF (S(L) .EQ. 0.0E0) GO TO 10
33981               IF (X(L,L) .NE. 0.0E0) S(L) = SIGN(S(L),X(L,L))
33982               CALL SSCAL(N-L+1,1.0E0/S(L),X(L,L),1)
33983               X(L,L) = 1.0E0 + X(L,L)
33984   10       CONTINUE
33985            S(L) = -S(L)
33986   20    CONTINUE
33987         IF (P .LT. LP1) GO TO 50
33988         DO 40 J = LP1, P
33989            IF (L .GT. NCT) GO TO 30
33990            IF (S(L) .EQ. 0.0E0) GO TO 30
33991C
33992C              APPLY THE TRANSFORMATION.
33993C
33994               T = -SDOT(N-L+1,X(L,L),1,X(L,J),1)/X(L,L)
33995               CALL SAXPY(N-L+1,T,X(L,L),1,X(L,J),1)
33996   30       CONTINUE
33997C
33998C           PLACE THE L-TH ROW OF X INTO  E FOR THE
33999C           SUBSEQUENT CALCULATION OF THE ROW TRANSFORMATION.
34000C
34001            E(J) = X(L,J)
34002   40    CONTINUE
34003   50    CONTINUE
34004         IF (.NOT.WANTU .OR. L .GT. NCT) GO TO 70
34005C
34006C           PLACE THE TRANSFORMATION IN U FOR SUBSEQUENT BACK
34007C           MULTIPLICATION.
34008C
34009            DO 60 I = L, N
34010               U(I,L) = X(I,L)
34011   60       CONTINUE
34012   70    CONTINUE
34013         IF (L .GT. NRT) GO TO 150
34014C
34015C           COMPUTE THE L-TH ROW TRANSFORMATION AND PLACE THE
34016C           L-TH SUPER-DIAGONAL IN E(L).
34017C
34018            E(L) = SNRM2(P-L,E(LP1),1)
34019            IF (E(L) .EQ. 0.0E0) GO TO 80
34020               IF (E(LP1) .NE. 0.0E0) E(L) = SIGN(E(L),E(LP1))
34021               CALL SSCAL(P-L,1.0E0/E(L),E(LP1),1)
34022               E(LP1) = 1.0E0 + E(LP1)
34023   80       CONTINUE
34024            E(L) = -E(L)
34025            IF (LP1 .GT. N .OR. E(L) .EQ. 0.0E0) GO TO 120
34026C
34027C              APPLY THE TRANSFORMATION.
34028C
34029               DO 90 I = LP1, N
34030                  WORK(I) = 0.0E0
34031   90          CONTINUE
34032               DO 100 J = LP1, P
34033                  CALL SAXPY(N-L,E(J),X(LP1,J),1,WORK(LP1),1)
34034  100          CONTINUE
34035               DO 110 J = LP1, P
34036                  CALL SAXPY(N-L,-E(J)/E(LP1),WORK(LP1),1,X(LP1,J),1)
34037  110          CONTINUE
34038  120       CONTINUE
34039            IF (.NOT.WANTV) GO TO 140
34040C
34041C              PLACE THE TRANSFORMATION IN V FOR SUBSEQUENT
34042C              BACK MULTIPLICATION.
34043C
34044               DO 130 I = LP1, P
34045                  V(I,L) = E(I)
34046  130          CONTINUE
34047  140       CONTINUE
34048  150    CONTINUE
34049  160 CONTINUE
34050  170 CONTINUE
34051C
34052C     SET UP THE FINAL BIDIAGONAL MATRIX OR ORDER M.
34053C
34054      M = MIN0(P,N+1)
34055      NCTP1 = NCT + 1
34056      NRTP1 = NRT + 1
34057      IF (NCT .LT. P) S(NCTP1) = X(NCTP1,NCTP1)
34058      IF (N .LT. M) S(M) = 0.0E0
34059      IF (NRTP1 .LT. M) E(NRTP1) = X(NRTP1,M)
34060      E(M) = 0.0E0
34061C
34062C     IF REQUIRED, GENERATE U.
34063C
34064      IF (.NOT.WANTU) GO TO 300
34065         IF (NCU .LT. NCTP1) GO TO 200
34066         DO 190 J = NCTP1, NCU
34067            DO 180 I = 1, N
34068               U(I,J) = 0.0E0
34069  180       CONTINUE
34070            U(J,J) = 1.0E0
34071  190    CONTINUE
34072  200    CONTINUE
34073         IF (NCT .LT. 1) GO TO 290
34074         DO 280 LL = 1, NCT
34075            L = NCT - LL + 1
34076            IF (S(L) .EQ. 0.0E0) GO TO 250
34077               LP1 = L + 1
34078               IF (NCU .LT. LP1) GO TO 220
34079               DO 210 J = LP1, NCU
34080                  T = -SDOT(N-L+1,U(L,L),1,U(L,J),1)/U(L,L)
34081                  CALL SAXPY(N-L+1,T,U(L,L),1,U(L,J),1)
34082  210          CONTINUE
34083  220          CONTINUE
34084               CALL SSCAL(N-L+1,-1.0E0,U(L,L),1)
34085               U(L,L) = 1.0E0 + U(L,L)
34086               LM1 = L - 1
34087               IF (LM1 .LT. 1) GO TO 240
34088               DO 230 I = 1, LM1
34089                  U(I,L) = 0.0E0
34090  230          CONTINUE
34091  240          CONTINUE
34092            GO TO 270
34093  250       CONTINUE
34094               DO 260 I = 1, N
34095                  U(I,L) = 0.0E0
34096  260          CONTINUE
34097               U(L,L) = 1.0E0
34098  270       CONTINUE
34099  280    CONTINUE
34100  290    CONTINUE
34101  300 CONTINUE
34102C
34103C     IF IT IS REQUIRED, GENERATE V.
34104C
34105      IF (.NOT.WANTV) GO TO 350
34106         DO 340 LL = 1, P
34107            L = P - LL + 1
34108            LP1 = L + 1
34109            IF (L .GT. NRT) GO TO 320
34110            IF (E(L) .EQ. 0.0E0) GO TO 320
34111               DO 310 J = LP1, P
34112                  T = -SDOT(P-L,V(LP1,L),1,V(LP1,J),1)/V(LP1,L)
34113                  CALL SAXPY(P-L,T,V(LP1,L),1,V(LP1,J),1)
34114  310          CONTINUE
34115  320       CONTINUE
34116            DO 330 I = 1, P
34117               V(I,L) = 0.0E0
34118  330       CONTINUE
34119            V(L,L) = 1.0E0
34120  340    CONTINUE
34121  350 CONTINUE
34122C
34123C     MAIN ITERATION LOOP FOR THE SINGULAR VALUES.
34124C
34125      MM = M
34126      ITER = 0
34127  360 CONTINUE
34128C
34129C        QUIT IF ALL THE SINGULAR VALUES HAVE BEEN FOUND.
34130C
34131C     ...EXIT
34132         IF (M .EQ. 0) GO TO 620
34133C
34134C        IF TOO MANY ITERATIONS HAVE BEEN PERFORMED, SET
34135C        FLAG AND RETURN.
34136C
34137         IF (ITER .LT. MAXIT) GO TO 370
34138            INFO = M
34139C     ......EXIT
34140            GO TO 620
34141  370    CONTINUE
34142C
34143C        THIS SECTION OF THE PROGRAM INSPECTS FOR
34144C        NEGLIGIBLE ELEMENTS IN THE S AND E ARRAYS.  ON
34145C        COMPLETION THE VARIABLES KASE AND L ARE SET AS FOLLOWS.
34146C
34147C           KASE = 1     IF S(M) AND E(L-1) ARE NEGLIGIBLE AND L.LT.M
34148C           KASE = 2     IF S(L) IS NEGLIGIBLE AND L.LT.M
34149C           KASE = 3     IF E(L-1) IS NEGLIGIBLE, L.LT.M, AND
34150C                        S(L), ..., S(M) ARE NOT NEGLIGIBLE (QR STEP).
34151C           KASE = 4     IF E(M-1) IS NEGLIGIBLE (CONVERGENCE).
34152C
34153         DO 390 LL = 1, M
34154            L = M - LL
34155C        ...EXIT
34156            IF (L .EQ. 0) GO TO 400
34157            TEST = ABS(S(L)) + ABS(S(L+1))
34158            ZTEST = TEST + ABS(E(L))
34159            IF (ZTEST .NE. TEST) GO TO 380
34160               E(L) = 0.0E0
34161C        ......EXIT
34162               GO TO 400
34163  380       CONTINUE
34164  390    CONTINUE
34165  400    CONTINUE
34166         IF (L .NE. M - 1) GO TO 410
34167            KASE = 4
34168         GO TO 480
34169  410    CONTINUE
34170            LP1 = L + 1
34171            MP1 = M + 1
34172            DO 430 LLS = LP1, MP1
34173               LS = M - LLS + LP1
34174C           ...EXIT
34175               IF (LS .EQ. L) GO TO 440
34176               TEST = 0.0E0
34177               IF (LS .NE. M) TEST = TEST + ABS(E(LS))
34178               IF (LS .NE. L + 1) TEST = TEST + ABS(E(LS-1))
34179               ZTEST = TEST + ABS(S(LS))
34180               IF (ZTEST .NE. TEST) GO TO 420
34181                  S(LS) = 0.0E0
34182C           ......EXIT
34183                  GO TO 440
34184  420          CONTINUE
34185  430       CONTINUE
34186  440       CONTINUE
34187            IF (LS .NE. L) GO TO 450
34188               KASE = 3
34189            GO TO 470
34190  450       CONTINUE
34191            IF (LS .NE. M) GO TO 460
34192               KASE = 1
34193            GO TO 470
34194  460       CONTINUE
34195               KASE = 2
34196               L = LS
34197  470       CONTINUE
34198  480    CONTINUE
34199         L = L + 1
34200C
34201C        PERFORM THE TASK INDICATED BY KASE.
34202C
34203         GO TO (490,520,540,570), KASE
34204C
34205C        DEFLATE NEGLIGIBLE S(M).
34206C
34207  490    CONTINUE
34208            MM1 = M - 1
34209            F = E(M-1)
34210            E(M-1) = 0.0E0
34211            DO 510 KK = L, MM1
34212               K = MM1 - KK + L
34213               T1 = S(K)
34214               CALL SROTG(T1,F,CS,SN)
34215               S(K) = T1
34216               IF (K .EQ. L) GO TO 500
34217                  F = -SN*E(K-1)
34218                  E(K-1) = CS*E(K-1)
34219  500          CONTINUE
34220               IF (WANTV) CALL SROT(P,V(1,K),1,V(1,M),1,CS,SN)
34221  510       CONTINUE
34222         GO TO 610
34223C
34224C        SPLIT AT NEGLIGIBLE S(L).
34225C
34226  520    CONTINUE
34227            F = E(L-1)
34228            E(L-1) = 0.0E0
34229            DO 530 K = L, M
34230               T1 = S(K)
34231               CALL SROTG(T1,F,CS,SN)
34232               S(K) = T1
34233               F = -SN*E(K)
34234               E(K) = CS*E(K)
34235               IF (WANTU) CALL SROT(N,U(1,K),1,U(1,L-1),1,CS,SN)
34236  530       CONTINUE
34237         GO TO 610
34238C
34239C        PERFORM ONE QR STEP.
34240C
34241  540    CONTINUE
34242C
34243C           CALCULATE THE SHIFT.
34244C
34245            SCALE = AMAX1(ABS(S(M)),ABS(S(M-1)),ABS(E(M-1)),ABS(S(L)),
34246     1                    ABS(E(L)))
34247            SM = S(M)/SCALE
34248            SMM1 = S(M-1)/SCALE
34249            EMM1 = E(M-1)/SCALE
34250            SL = S(L)/SCALE
34251            EL = E(L)/SCALE
34252            B = ((SMM1 + SM)*(SMM1 - SM) + EMM1**2)/2.0E0
34253            C = (SM*EMM1)**2
34254            SHIFT = 0.0E0
34255            IF (B .EQ. 0.0E0 .AND. C .EQ. 0.0E0) GO TO 550
34256               SHIFT = SQRT(B**2+C)
34257               IF (B .LT. 0.0E0) SHIFT = -SHIFT
34258               SHIFT = C/(B + SHIFT)
34259  550       CONTINUE
34260            F = (SL + SM)*(SL - SM) - SHIFT
34261            G = SL*EL
34262C
34263C           CHASE ZEROS.
34264C
34265            MM1 = M - 1
34266            DO 560 K = L, MM1
34267               CALL SROTG(F,G,CS,SN)
34268               IF (K .NE. L) E(K-1) = F
34269               F = CS*S(K) + SN*E(K)
34270               E(K) = CS*E(K) - SN*S(K)
34271               G = SN*S(K+1)
34272               S(K+1) = CS*S(K+1)
34273               IF (WANTV) CALL SROT(P,V(1,K),1,V(1,K+1),1,CS,SN)
34274               CALL SROTG(F,G,CS,SN)
34275               S(K) = F
34276               F = CS*E(K) + SN*S(K+1)
34277               S(K+1) = -SN*E(K) + CS*S(K+1)
34278               G = SN*E(K+1)
34279               E(K+1) = CS*E(K+1)
34280               IF (WANTU .AND. K .LT. N)
34281     1            CALL SROT(N,U(1,K),1,U(1,K+1),1,CS,SN)
34282  560       CONTINUE
34283            E(M-1) = F
34284            ITER = ITER + 1
34285         GO TO 610
34286C
34287C        CONVERGENCE.
34288C
34289  570    CONTINUE
34290C
34291C           MAKE THE SINGULAR VALUE  POSITIVE.
34292C
34293            IF (S(L) .GE. 0.0E0) GO TO 580
34294               S(L) = -S(L)
34295               IF (WANTV) CALL SSCAL(P,-1.0E0,V(1,L),1)
34296  580       CONTINUE
34297C
34298C           ORDER THE SINGULAR VALUE.
34299C
34300  590       IF (L .EQ. MM) GO TO 600
34301C           ...EXIT
34302               IF (S(L) .GE. S(L+1)) GO TO 600
34303               T = S(L)
34304               S(L) = S(L+1)
34305               S(L+1) = T
34306               IF (WANTV .AND. L .LT. P)
34307     1            CALL SSWAP(P,V(1,L),1,V(1,L+1),1)
34308               IF (WANTU .AND. L .LT. N)
34309     1            CALL SSWAP(N,U(1,L),1,U(1,L+1),1)
34310               L = L + 1
34311            GO TO 590
34312  600       CONTINUE
34313            ITER = 0
34314            M = M - 1
34315  610    CONTINUE
34316      GO TO 360
34317  620 CONTINUE
34318      RETURN
34319      END
34320      SUBROUTINE SSWAP(N,SX,INCX,SY,INCY)
34321C***BEGIN PROLOGUE  SSWAP
34322C***DATE WRITTEN   791001   (YYMMDD)
34323C***REVISION DATE  820801   (YYMMDD)
34324C***CATEGORY NO.  D1A5
34325C***KEYWORDS  BLAS,INTERCHANGE,LINEAR ALGEBRA,VECTOR
34326C***AUTHOR  LAWSON, C. L., (JPL)
34327C           HANSON, R. J., (SNLA)
34328C           KINCAID, D. R., (U. OF TEXAS)
34329C           KROGH, F. T., (JPL)
34330C***PURPOSE  Interchange s.p vectors
34331C***DESCRIPTION
34332C
34333C                B L A S  Subprogram
34334C    Description of Parameters
34335C
34336C     --Input--
34337C        N  number of elements in input vector(s)
34338C       SX  single precision vector with N elements
34339C     INCX  storage spacing between elements of SX
34340C       SY  single precision vector with N elements
34341C     INCY  storage spacing between elements of SY
34342C
34343C     --Output--
34344C       SX  input vector SY (unchanged if N .LE. 0)
34345C       SY  input vector SX (unchanged if N .LE. 0)
34346C
34347C     Interchange single precision SX and single precision SY.
34348C     For I = 0 to N-1, interchange  SX(LX+I*INCX) and SY(LY+I*INCY),
34349C     where LX = 1 if INCX .GE. 0, else LX = (-INCX)*N, and LY is
34350C     defined in a similar way using INCY.
34351C***REFERENCES  LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T.,
34352C                 *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*,
34353C                 ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL
34354C                 SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323
34355C***ROUTINES CALLED  (NONE)
34356C***END PROLOGUE  SSWAP
34357C
34358      REAL SX(*),SY(*),STEMP1,STEMP2,STEMP3
34359C***FIRST EXECUTABLE STATEMENT  SSWAP
34360      IF(N.LE.0)RETURN
34361CCCCC JUNE 2008: MODIFY FOLLOWING LINE SO THAT IT DOES NOT
34362CCCCC            GENERATE WARNING MESSAGE ON FORTRAN 95 COMPILERS.
34363C
34364CCCCC IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60
34365      IF(INCX.EQ.INCY) THEN
34366        IF(INCX-1.LT.0)THEN
34367          GOTO5
34368        ELSEIF(INCX-1.EQ.0)THEN
34369          GOTO20
34370        ELSE
34371          GOTO60
34372        ENDIF
34373      ENDIF
34374    5 CONTINUE
34375C
34376C       CODE FOR UNEQUAL OR NONPOSITIVE INCREMENTS.
34377C
34378      IX = 1
34379      IY = 1
34380      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
34381      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
34382      DO 10 I = 1,N
34383        STEMP1 = SX(IX)
34384        SX(IX) = SY(IY)
34385        SY(IY) = STEMP1
34386        IX = IX + INCX
34387        IY = IY + INCY
34388   10 CONTINUE
34389      RETURN
34390C
34391C       CODE FOR BOTH INCREMENTS EQUAL TO 1
34392C
34393C
34394C       CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 3.
34395C
34396   20 M = MOD(N,3)
34397      IF( M .EQ. 0 ) GO TO 40
34398      DO 30 I = 1,M
34399        STEMP1 = SX(I)
34400        SX(I) = SY(I)
34401        SY(I) = STEMP1
34402   30 CONTINUE
34403      IF( N .LT. 3 ) RETURN
34404   40 MP1 = M + 1
34405      DO 50 I = MP1,N,3
34406        STEMP1 = SX(I)
34407        STEMP2 = SX(I+1)
34408        STEMP3 = SX(I+2)
34409        SX(I) = SY(I)
34410        SX(I+1) = SY(I+1)
34411        SX(I+2) = SY(I+2)
34412        SY(I) = STEMP1
34413        SY(I+1) = STEMP2
34414        SY(I+2) = STEMP3
34415   50 CONTINUE
34416      RETURN
34417   60 CONTINUE
34418C
34419C     CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS.
34420C
34421      NS = N*INCX
34422        DO 70 I=1,NS,INCX
34423        STEMP1 = SX(I)
34424        SX(I) = SY(I)
34425        SY(I) = STEMP1
34426   70   CONTINUE
34427      RETURN
34428      END
34429      SUBROUTINE START1(A,X,Y,NS,CN,XC,YC)
34430C
34431C     PURPOSE--XX
34432C
34433C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
34434C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
34435C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
34436C
34437C-----COMMON----------------------------------------------------------
34438C
34439      INCLUDE 'DPCOCP.INC'
34440C
34441C---------------------------------------------------------------------
34442C
34443CCCCC DIMENSION A(IMX,2),X(2),Y(2)   AUGUST 1988
34444C
34445      DIMENSION A(MAXIMX,2)
34446      DIMENSION X(2)
34447      DIMENSION Y(2)
34448C
34449C-----START POINT-----------------------------------------------------
34450C
34451        DNM=A(1,1)-A(1,2)
34452        IF (DNM.NE.0.) THEN
34453          R=(CN-A(1,2))/DNM
34454        ELSE
34455          R=-1.
34456        END IF
34457        IF ((R.GT.0..AND.R.LT.1.).OR.
34458     1     (R.EQ.0..AND.DNM.LT.0.).OR.
34459     2     (R.EQ.1..AND.DNM.GT.0.)) THEN
34460          XC=X(1)
34461          YC=Y(2)+R*(Y(1)-Y(2))
34462        ELSE
34463          NS=-1
34464        END IF
34465      RETURN
34466      END
34467      SUBROUTINE START2(A,X,Y,NS,CN,XC,YC)
34468C
34469C     PURPOSE--XX
34470C
34471C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
34472C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
34473C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
34474C
34475C-----COMMON----------------------------------------------------------
34476C
34477      INCLUDE 'DPCOCP.INC'
34478C
34479C---------------------------------------------------------------------
34480C
34481CCCCC DIMENSION A(IMX,2),X(2),Y(2)   AUGUST 1988
34482C
34483      DIMENSION A(MAXIMX,2)
34484      DIMENSION X(2)
34485      DIMENSION Y(2)
34486C
34487C-----START POINT-----------------------------------------------------
34488C
34489        DNM=A(1,1)-A(2,1)
34490        IF (DNM.NE.0.) THEN
34491          R=(CN-A(2,1))/DNM
34492        ELSE
34493          R=-1.
34494        END IF
34495        IF ((R.GT.0..AND.R.LT.1.).OR.
34496     1     (R.EQ.0..AND.DNM.LT.0.).OR.
34497     2     (R.EQ.1..AND.DNM.GT.0.)) THEN
34498          XC=X(2)+R*(X(1)-X(2))
34499          YC=Y(1)
34500        ELSE
34501          NS=-1
34502        ENDIF
34503      RETURN
34504      END
34505      SUBROUTINE START3(A,X,Y,NS,CN,XC,YC)
34506C
34507C     PURPOSE--XX
34508C
34509C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
34510C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
34511C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
34512C
34513C-----COMMON----------------------------------------------------------
34514C
34515      INCLUDE 'DPCOCP.INC'
34516C
34517C---------------------------------------------------------------------
34518C
34519CCCCC DIMENSION A(IMX,2),X(2),Y(2)   AUGUST 1988
34520C
34521      DIMENSION A(MAXIMX,2)
34522      DIMENSION X(2)
34523      DIMENSION Y(2)
34524C
34525C-----START POINT-----------------------------------------------------
34526C
34527        DNM=A(1,2)-A(1,1)
34528        IF (DNM.NE.0.) THEN
34529          R=(CN-A(1,1))/DNM
34530        ELSE
34531          R=-1.
34532        END IF
34533        IF ((R.GT.0..AND.R.LT.1.).OR.
34534     1     (R.EQ.0..AND.DNM.LT.0.).OR.
34535     2     (R.EQ.1..AND.DNM.GT.0.)) THEN
34536          XC=X(1)
34537          YC=Y(1)+R*(Y(2)-Y(1))
34538        ELSE
34539          NS=-1
34540        ENDIF
34541      RETURN
34542      END
34543      SUBROUTINE START4(A,X,Y,NS,CN,XC,YC)
34544C
34545C     PURPOSE--XX
34546C
34547C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
34548C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
34549C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
34550C
34551C-----COMMON----------------------------------------------------------
34552C
34553      INCLUDE 'DPCOCP.INC'
34554C
34555C---------------------------------------------------------------------
34556C
34557CCCCC DIMENSION A(IMX,2),X(2),Y(2)   AUGUST 1988
34558C
34559      DIMENSION A(MAXIMX,2)
34560      DIMENSION X(2)
34561      DIMENSION Y(2)
34562C
34563C-----START POINT-----------------------------------------------------
34564C
34565        DNM=A(2,1)-A(1,1)
34566        IF (DNM.NE.0.) THEN
34567          R=(CN-A(1,1))/DNM
34568        ELSE
34569          R=-1.
34570        END IF
34571        IF ((R.GT.0..AND.R.LT.1.).OR.
34572     1     (R.EQ.0..AND.DNM.LT.0.).OR.
34573     2     (R.EQ.1..AND.DNM.GT.0.)) THEN
34574          XC=X(1)+R*(X(2)-X(1))
34575          YC=Y(1)
34576        ELSE
34577          NS=-1
34578        ENDIF
34579      RETURN
34580      END
34581      DOUBLE PRECISION FUNCTION STDINV( N, Z )
34582*
34583*     Inverse Student t Distribution Function
34584*
34585*                    STDINV
34586*           Z = C   I      (1 + y*y/N)**(-(N+1)/2) dy
34587*                N  -INF
34588*
34589*      Reference: G.W. Hill, Comm. ACM Algorithm 395
34590*                 Comm. ACM 13 (1970), pp. 619-620.
34591*
34592*      Conversions to double precision and other modifications by
34593*                 Alan Genz, 1993-4.
34594*
34595      INTEGER N
34596      DOUBLE PRECISION Z, P, PHINV, A, B, C, D, X, Y, PI, TWO
34597      DOUBLE PRECISION STUDNT, STDJAC
34598      PARAMETER ( PI = 3.14159 26535 89793D0, TWO = 2  )
34599      IF ( 0.0D0 .LT. Z .AND. Z .LT. 1.0D0 ) THEN
34600         IF ( N .EQ. 1 ) THEN
34601            STDINV = TAN( PI*( 2*Z - 1 )/2 )
34602         ELSE IF ( N .EQ. 2) THEN
34603            STDINV = ( 2.0D0*Z - 1.0D0 )/SQRT( 2.0D0*Z*( 1.0D0 - Z ) )
34604         ELSE
34605            IF ( 2.0D0*Z .GE. 1.0D0 ) THEN
34606               P = 2.0D0*( 1.0D0 - Z )
34607            ELSE
34608               P = 2.0D0*Z
34609            END IF
34610            A = 1.0D0/( DBLE(N) - 0.5D0 )
34611            B = 48.0D0/( A*A )
34612            C = ( ( 20700.0D0*A/B - 98.0D0 )*A - 16.0D0 )*A + 96.36D0
34613            D = ( ( 94.5D0/( B + C ) - 3.0D0 )/B + 1.0D0 )*
34614     &          SQRT( A*PI/2.0D0 )*DBLE(N)
34615            X = D*P
34616            Y = X**( TWO/DBLE(N) )
34617            IF ( Y .GT. A + 0.05D0 ) THEN
34618               X = PHINV( P/2.0D0 )
34619               Y = X*X
34620               IF ( N .LT. 5 ) C = C + 3.0D0*
34621     &            ( DBLE(N) - 4.5D0 )*( 10.0D0*X + 6.0D0 )/100.0D0
34622               C = ( ( (D*X - 100.0D0)*X/20.0D0 - 7.0D0 )*X - 2.0D0 )
34623     &             *X + B + C
34624               Y = (((((4.0D0*Y+63.0D0)*Y/10.0D0+36.0D0)*Y+94.5D0)/
34625     &             C-Y-3.0D0)/B + 1.0D0)*X
34626               Y = A*Y*Y
34627               IF ( Y .GT. 0.002D0) THEN
34628                  Y = EXP(Y) - 1.0D0
34629               ELSE
34630                  Y = Y*( 1.0D0 + Y/2.0D0 )
34631               ENDIF
34632            ELSE
34633               Y = ((1.0D0/((DBLE(N+6)/(DBLE(N)*Y) -
34634     &              0.089D0*D - 0.822D0 )*(3.0D0*DBLE(N+6)))
34635     &              + 0.5D0/DBLE(N+4))*Y - 1.0D0)*DBLE(N+1)/DBLE(N+2)
34636     &              + 1.0D0/Y
34637            END IF
34638            STDINV = SQRT(DBLE(N)*Y)
34639            IF ( 2.0D0*Z .LT. 1.0D0 ) STDINV = -STDINV
34640            IF ( ABS( STDINV ) .GT. 0.0D0 ) THEN
34641*
34642*     Use one third order correction to the single precision result
34643*
34644               X = STDINV
34645               D = Z - STUDNT(N,X)
34646               STDINV = X + 2.0D0*D/( 2.0D0/STDJAC(N,X) -
34647     &                  D*DBLE(N+1)/(DBLE(N)/X+X) )
34648            END IF
34649         END IF
34650      ELSE
34651*
34652*     Use cutoff values for Z near 0 or 1.
34653*
34654         STDINV = SQRT( DBLE(N)/( 2D-16*
34655     &      SQRT( 2.0D0*PI*DBLE(N)))**( TWO/N ) )
34656         IF ( 2.0D0*Z .LT. 1.0D0 ) STDINV = -STDINV
34657      END IF
34658C
34659      RETURN
34660      END
34661      DOUBLE PRECISION FUNCTION STDJAC( NU, T )
34662*
34663*     Student t Distribution Transformation Jacobean
34664*
34665*          T            STDINV(NU,T)
34666*         I  f(y) dy = I   f(STDINV(NU,Z) STDJAC(NU,STDINV(NU,Z)) dZ
34667*         -INF          0
34668*
34669      INTEGER NU, J
34670      DOUBLE PRECISION CONST, NUOLD, PI, T, TT
34671      PARAMETER ( PI = 3.14159 26535 89793D0 )
34672      SAVE NUOLD, CONST
34673      DATA NUOLD/ 0D0 /
34674      IF ( NU .EQ. 1 ) THEN
34675         STDJAC = PI*( 1.0D0 + T*T )
34676      ELSE IF ( NU .EQ. 2 ) THEN
34677         STDJAC = SQRT( 2.0D0 + T*T )**3
34678      ELSE
34679         IF ( NU .NE. NUOLD ) THEN
34680            NUOLD = NU
34681            IF ( MOD( NU, 2 ) .EQ. 0 ) THEN
34682               CONST = SQRT(NUOLD)*2.0D0
34683            ELSE
34684               CONST = SQRT(NUOLD)*PI
34685            END IF
34686            DO 100 J = NU-2, 1, -2
34687               CONST = J*CONST/(J+1)
34688  100       CONTINUE
34689         END IF
34690         TT = 1 + T*T/NU
34691         STDJAC = CONST*TT**( DBLE(NU+1)/2.0D0 )
34692         IF ( MOD( NU, 2 ) .EQ. 0 ) STDJAC = STDJAC*SQRT( TT )
34693      END IF
34694C
34695      RETURN
34696      END
34697      subroutine stl(y,n,np,ns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,
34698     &nljump,ni,no,rw,season,trend,work)
34699c
34700c  This routine is part of the Bill Cleveland seasonal loess
34701c  program.
34702c
34703      integer n, np, ns, nt, nl, isdeg, itdeg, ildeg, nsjump, ntjump,
34704     &nljump, ni, no, k
34705      integer newns, newnt, newnl, newnp
34706      real y(n), rw(n), season(n), trend(n), work(n+2*np,5)
34707      logical userw
34708c
34709      userw = .false.
34710      k = 0
34711      do 23000 i = 1,n
34712      trend(i) = 0.0
3471323000 continue
34714      newns = max0(3,ns)
34715      newnt = max0(3,nt)
34716      newnl = max0(3,nl)
34717      newnp = max0(2,np)
34718      if(.not.(mod(newns,2) .eq. 0))goto 23002
34719      newns = newns + 1
3472023002 continue
34721      if(.not.(mod(newnt,2) .eq. 0))goto 23004
34722      newnt = newnt + 1
3472323004 continue
34724      if(.not.(mod(newnl,2) .eq. 0))goto 23006
34725      newnl = newnl + 1
3472623006 continue
3472723008 continue
34728      call onestp(y,n,newnp,newns,newnt,newnl,isdeg,itdeg,ildeg,nsjump,
34729     &ntjump,nljump,ni,userw,rw,season, trend, work)
34730      k = k+1
34731      if(.not.(k .gt. no))goto 23011
34732      goto 23010
3473323011 continue
34734      do 23013 i = 1,n
34735      work(i,1) = trend(i)+season(i)
3473623013 continue
34737      call rwts(y,n,work(1,1),rw)
34738      userw = .true.
34739      goto 23008
3474023010 continue
34741      if(.not.(no .le. 0))goto 23015
34742      do 23017 i = 1,n
34743      rw(i) = 1.0
3474423017 continue
3474523015 continue
34746      return
34747      end
34748      subroutine stlez(y, n, np, ns, isdeg, itdeg, robust, no, rw,
34749     &season, trend, work)
34750c
34751c  This routine is part of the Bill Cleveland seasonal loess
34752c  program.
34753c
34754      logical robust
34755      integer n, i, j, np, ns, no, nt, nl, ni, nsjump, ntjump, nljump,
34756     &newns, newnp
34757      integer isdeg, itdeg, ildeg
34758      real y(n), rw(n), season(n), trend(n), work(n+2*np,7)
34759      real maxs, mins, maxt, mint, maxds, maxdt, difs, dift
34760      ildeg = itdeg
34761      newns = max0(3,ns)
34762      if(.not.(mod(newns,2) .eq. 0))goto 23120
34763      newns = newns+1
3476423120 continue
34765      newnp = max0(2,np)
34766      nt = int((1.5*real(newnp))/(1 - 1.5/real(newns)) + 0.5)
34767      nt = max0(3,nt)
34768      if(.not.(mod(nt,2) .eq. 0))goto 23122
34769      nt = nt+1
3477023122 continue
34771      nl = newnp
34772      if(.not.(mod(nl,2) .eq. 0))goto 23124
34773      nl = nl+1
3477423124 continue
34775      if(.not.(robust))goto 23126
34776      ni = 1
34777      goto 23127
3477823126 continue
34779      ni = 2
3478023127 continue
34781      nsjump = max0(1,int(float(newns)/10 + 0.9))
34782      ntjump = max0(1,int(float(nt)/10 + 0.9))
34783      nljump = max0(1,int(float(nl)/10 + 0.9))
34784      do 23128 i = 1,n
34785      trend(i) = 0.0
3478623128 continue
34787      call onestp(y,n,newnp,newns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,
34788     &nljump,ni,.false.,rw,season,trend,work)
34789      no = 0
34790      if(.not.(robust))goto 23130
34791      j=1
3479223132 if(.not.(j .le. 15))goto 23134
34793      do 23135 i = 1,n
34794      work(i,6) = season(i)
34795      work(i,7) = trend(i)
34796      work(i,1) = trend(i)+season(i)
3479723135 continue
34798      call rwts(y,n,work(1,1),rw)
34799      call onestp(y, n, newnp, newns, nt, nl, isdeg, itdeg, ildeg,
34800     &nsjump,ntjump, nljump, ni, .true., rw, season, trend, work)
34801      no = no+1
34802      maxs = work(1,6)
34803      mins = work(1,6)
34804      maxt = work(1,7)
34805      mint = work(1,7)
34806      maxds = abs(work(1,6) - season(1))
34807      maxdt = abs(work(1,7) - trend(1))
34808      do 23137 i = 2,n
34809      if(.not.(maxs .lt. work(i,6)))goto 23139
34810      maxs = work(i,6)
3481123139 continue
34812      if(.not.(maxt .lt. work(i,7)))goto 23141
34813      maxt = work(i,7)
3481423141 continue
34815      if(.not.(mins .gt. work(i,6)))goto 23143
34816      mins = work(i,6)
3481723143 continue
34818      if(.not.(mint .gt. work(i,7)))goto 23145
34819      mint = work(i,7)
3482023145 continue
34821      difs = abs(work(i,6) - season(i))
34822      dift = abs(work(i,7) - trend(i))
34823      if(.not.(maxds .lt. difs))goto 23147
34824      maxds = difs
3482523147 continue
34826      if(.not.(maxdt .lt. dift))goto 23149
34827      maxdt = dift
3482823149 continue
3482923137 continue
34830      if(.not.((maxds/(maxs-mins) .lt. .01)  .and.  (maxdt/(maxt-mint)
34831     & .lt. .01)))goto 23151
34832      goto 23134
3483323151 continue
34834       j=j+1
34835      goto 23132
3483623134 continue
3483723130 continue
34838      if(.not.( .not. robust))goto 23153
34839      do 23155 i = 1,n
34840      rw(i) = 1.0
3484123155 continue
3484223153 continue
34843      return
34844      end
34845      SUBROUTINE STMOM3(X,N,IWRITE,XSMOM3,IBUGA3,IERROR)
34846C
34847C     PURPOSE--THIS SUBROUTINE COMPUTES THE
34848C              SAMPLE STANDARDIZED THIRD CENTRAL MOMENT
34849C              OF THE DATA IN THE INPUT VECTOR X.
34850C              THE SAMPLE STANDARDIZED THIRD CENTRAL MOMENT =
34851C              (THE SAMPLE THIRD CENTRAL MOMENT)/((THE SAMPLE
34852C              STANDARD DEVIATION)**3).
34853C              N (RATHER THAN N-1) HAS BEEN USED IN THE DENOMINATOR
34854C              IN THE CALCULATION OF BOTH THE SAMPLE THIRD CENTRAL
34855C              MOMENT AND THE SAMPLE STANDARD DEVIATION.
34856C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
34857C                                (UNSORTED OR SORTED) OBSERVATIONS.
34858C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
34859C                                IN THE VECTOR X.
34860C     OUTPUT ARGUMENTS--XSMOM3 = THE SINGLE PRECISION VALUE OF THE
34861C                                COMPUTED SAMPLE STANDARDIZED THIRD
34862C                                CENTRAL MOMENT.
34863C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
34864C             SAMPLE STANDARDIZED THIRD CENTRAL MOMENT.
34865C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
34866C                   OF N FOR THIS SUBROUTINE.
34867C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34868C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
34869C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34870C     LANGUAGE--ANSI FORTRAN (1977)
34871C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
34872C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 85,
34873C                 234, 243, 297-298, 305.
34874C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
34875C                 EDITION 6, 1967, PAGES 86-90.
34876C     WRITTEN BY--JAMES J. FILLIBEN
34877C                 STATISTICAL ENGINEERING DIVISION
34878C                 INFORMATION TECHNOLOGY LABORATORY
34879C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
34880C                 GAITHERSBURG, MD 20899-8980
34881C                 PHONE--301-975-2855
34882C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34883C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34884C     LANGUAGE--ANSI FORTRAN (1977)
34885C     VERSION NUMBER--82.6
34886C     ORIGINAL VERSION--JUNE      1972.
34887C     UPDATED         --SEPTEMBER 1975.
34888C     UPDATED         --NOVEMBER  1975.
34889C     UPDATED         --JUNE      1979.
34890C     UPDATED         --AUGUST    1981.
34891C     UPDATED         --MAY       1982.
34892C     UPDATED         --APRIL     2013. RESTORE DIVIDE BY N RATHER
34893C                                       THAN (N-1)
34894C     UPDATED         --APRIL     2013. ALTERNATIVE DEFINITION
34895C                                       USED BY EXCEL AND OTHER
34896C                                       POPULAR SOFTWARE
34897C     UPDATED         --JULY      2016. DON'T PRINT ERROR MESSAGE
34898C                                       WHEN ALL VALUES ARE EQUAL
34899C
34900C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34901C
34902      CHARACTER*4 IWRITE
34903      CHARACTER*4 IBUGA3
34904      CHARACTER*4 IERROR
34905C
34906      CHARACTER*4 ISUBN1
34907      CHARACTER*4 ISUBN2
34908C
34909C---------------------------------------------------------------------
34910C
34911      DOUBLE PRECISION DN
34912      DOUBLE PRECISION DX
34913      DOUBLE PRECISION DSUM1
34914      DOUBLE PRECISION DSUM2
34915      DOUBLE PRECISION DMEAN
34916      DOUBLE PRECISION DVAR
34917      DOUBLE PRECISION DSD
34918      DOUBLE PRECISION DMOM3
34919C
34920      DIMENSION X(*)
34921C
34922C-----COMMON----------------------------------------------------------
34923C
34924      INCLUDE 'DPCOST.INC'
34925      INCLUDE 'DPCOP2.INC'
34926C
34927C-----START POINT-----------------------------------------------------
34928C
34929      ISUBN1='STMO'
34930      ISUBN2='M3  '
34931      IERROR='NO'
34932C
34933      DSUM=0.0D0
34934      DMEAN=0.0D0
34935      DSD=0.0D0
34936C
34937      IF(IBUGA3.EQ.'ON')THEN
34938        WRITE(ICOUT,999)
34939  999   FORMAT(1X)
34940        CALL DPWRST('XXX','BUG ')
34941        WRITE(ICOUT,51)
34942   51   FORMAT('***** AT THE BEGINNING OF STMOM3--')
34943        CALL DPWRST('XXX','BUG ')
34944        WRITE(ICOUT,52)IBUGA3,N
34945   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
34946        CALL DPWRST('XXX','BUG ')
34947        DO55I=1,N
34948          WRITE(ICOUT,56)I,X(I)
34949   56     FORMAT('I,X(I) = ',I8,G15.7)
34950          CALL DPWRST('XXX','BUG ')
34951   55   CONTINUE
34952      ENDIF
34953C
34954C               *************************************************
34955C               **  COMPUTE STANDARDIZED THIRD CENTRAL MOMENT  **
34956C               *************************************************
34957C
34958C               ********************************************
34959C               **  STEP 1--                              **
34960C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34961C               ********************************************
34962C
34963      AN=N
34964C
34965      IF(N.LT.1)THEN
34966        IERROR='YES'
34967        WRITE(ICOUT,999)
34968        CALL DPWRST('XXX','BUG ')
34969        WRITE(ICOUT,111)
34970  111   FORMAT('***** ERROR IN STMOM3--')
34971        CALL DPWRST('XXX','BUG ')
34972        WRITE(ICOUT,112)
34973  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
34974        CALL DPWRST('XXX','BUG ')
34975        WRITE(ICOUT,113)
34976  113   FORMAT('      VARIABLE IS NON-POSITIVE.')
34977        CALL DPWRST('XXX','BUG ')
34978        WRITE(ICOUT,117)N
34979  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
34980        CALL DPWRST('XXX','BUG ')
34981        GOTO9000
34982      ENDIF
34983C
34984      IF(N.EQ.1)THEN
34985CCCCC   WRITE(ICOUT,999)
34986CCCCC   CALL DPWRST('XXX','BUG ')
34987CCCCC   WRITE(ICOUT,121)
34988CC121   FORMAT('***** WARNING IN STMOM3--')
34989CCCCC   CALL DPWRST('XXX','BUG ')
34990CCCCC   WRITE(ICOUT,123)
34991CC123   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
34992CCCCC   CALL DPWRST('XXX','BUG ')
34993CCCCC   WRITE(ICOUT,125)
34994CC125   FORMAT('      VARIABLE IS EXACTLY ONE.')
34995CCCCC   CALL DPWRST('XXX','BUG ')
34996        XSMOM3=0.0
34997        GOTO9000
34998      ENDIF
34999C
35000      HOLD=X(1)
35001      DO135I=2,N
35002      IF(X(I).NE.HOLD)GOTO139
35003  135 CONTINUE
35004CCCCC WRITE(ICOUT,999)
35005CCCCC CALL DPWRST('XXX','BUG ')
35006CCCCC WRITE(ICOUT,121)
35007CCCCC CALL DPWRST('XXX','BUG ')
35008CCCCC WRITE(ICOUT,136)HOLD
35009CC136 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
35010CCCCC CALL DPWRST('XXX','BUG ')
35011      XSMOM3=0.0
35012      GOTO9000
35013  139 CONTINUE
35014C
35015C               ******************************************************
35016C               **  STEP 2--                                        **
35017C               **  COMPUTE THE STANDARDIZED THIRD CENTRAL MOMENT.  **
35018C               ******************************************************
35019C
35020C     2013/04: THE STANDARD DEFINITION OF SKEWNESS USES "N" RATHER
35021C              "N-1" IN COMPUTING THE SECOND AND THIRD MOMENTS.
35022C              THIS IS THE "FISHER-PEARSON" DEFINITION.  WE WERE
35023C              USING "N-1".  REFER TO THIS AS THE "OLD" DEFINITION.
35024C              MANY PROGRAMS (INCLUDING EXCEL, SAS, MINITAB) USE THE
35025C              ADJUSTED FISHER PEARSON WHICH IS THE FISHER-PEARSON
35026C              MULTIPLIED BY THE ADJUSTMENT FACTOR:
35027C
35028C                  SQRT(N*(N-1))/(N-2)
35029C
35030C              THIS IS A SAMPLE SIZE ADJUSTMENT THAT APPROACHES 1
35031C              AS THE SAMPLE SIZE INCREASES.
35032C
35033      DN=N
35034      DSUM=0.0D0
35035      DO200I=1,N
35036        DX=X(I)
35037        DSUM=DSUM+DX
35038  200 CONTINUE
35039      DMEAN=DSUM/DN
35040C
35041      DSUM1=0.0D0
35042      DSUM2=0.0D0
35043      DO300I=1,N
35044        DX=X(I)
35045        DSUM1=DSUM1+(DX-DMEAN)**2
35046        DSUM2=DSUM2+(DX-DMEAN)**3
35047  300 CONTINUE
35048      IF(ISKWDF.EQ.'OLD')THEN
35049        DVAR=DSUM1/(DN-1.0D0)
35050        DMOM3=DSUM2/(DN-1.0D0)
35051      ELSE
35052        DVAR=DSUM1/DN
35053        DMOM3=DSUM2/DN
35054      ENDIF
35055      DSD=0.0D0
35056      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
35057C
35058      IF(ISKWDF.EQ.'ADFP')THEN
35059        AN=REAL(N)
35060        ADJ=SQRT(AN*(AN-1.0))/(AN-2.0)
35061        XSMOM3=ADJ*REAL(DMOM3/(DSD**3))
35062      ELSE
35063        XSMOM3=REAL(DMOM3/(DSD**3))
35064      ENDIF
35065C
35066C               *******************************
35067C               **  STEP 3--                 **
35068C               **  WRITE OUT A LINE         **
35069C               **  OF SUMMARY INFORMATION.  **
35070C               *******************************
35071C
35072      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
35073        WRITE(ICOUT,999)
35074        CALL DPWRST('XXX','BUG ')
35075        WRITE(ICOUT,811)N,XSMOM3
35076  811   FORMAT('THE STANDARDIZED THIRD CENTRAL MOMENT OF THE ',I8,
35077     1         ' OBSERVATIONS = ',G15.7)
35078        CALL DPWRST('XXX','BUG ')
35079      ENDIF
35080C
35081C               *****************
35082C               **  STEP 90--  **
35083C               **  EXIT.      **
35084C               *****************
35085C
35086 9000 CONTINUE
35087      IF(IBUGA3.EQ.'ON')THEN
35088        WRITE(ICOUT,999)
35089        CALL DPWRST('XXX','BUG ')
35090        WRITE(ICOUT,9011)
35091 9011   FORMAT('***** AT THE END       OF STMOM3--')
35092        CALL DPWRST('XXX','BUG ')
35093        WRITE(ICOUT,9012)IERROR,XSMOM3
35094 9012   FORMAT('IERROR,XSMOM3 = ',A4,2X,G15.7)
35095        CALL DPWRST('XXX','BUG ')
35096        WRITE(ICOUT,9014)DMEAN,DSD,DSUM1,DSUM2
35097 9014   FORMAT('DMEAN,DSD,DSUM1,DSUM2 = ',4G15.7)
35098        CALL DPWRST('XXX','BUG ')
35099      ENDIF
35100C
35101      RETURN
35102      END
35103      SUBROUTINE STMOM4(X,N,IWRITE,XSMOM4,IBUGA3,IERROR)
35104C
35105C     PURPOSE--THIS SUBROUTINE COMPUTES THE
35106C              SAMPLE STANDARDIZED FOURTH CENTRAL MOMENT
35107C              OF THE DATA IN THE INPUT VECTOR X.
35108C              THE SAMPLE STANDARDIZED FOURTH CENTRAL MOMENT =
35109C              (THE SAMPLE FOURTH CENTRAL MOMENT)/((THE SAMPLE
35110C              STANDARD DEVIATION)**4).
35111C              N (RATHER THAN N-1) HAS BEEN USED IN THE DENOMINATOR
35112C              IN THE CALCULATION OF BOTH THE SAMPLE FOURTH CENTRAL
35113C              MOMENT AND THE SAMPLE STANDARD DEVIATION.
35114C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
35115C                                (UNSORTED OR SORTED) OBSERVATIONS.
35116C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
35117C                                IN THE VECTOR X.
35118C     OUTPUT ARGUMENTS--XSMOM4 = THE SINGLE PRECISION VALUE OF THE
35119C                                COMPUTED SAMPLE STANDARDIZED FOURTH
35120C                                CENTRAL MOMENT.
35121C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
35122C             SAMPLE STANDARDIZED FOURTH CENTRAL MOMENT.
35123C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
35124C                   OF N FOR THIS SUBROUTINE.
35125C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
35126C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
35127C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35128C     LANGUAGE--ANSI FORTRAN (1977)
35129C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
35130C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 85, 243.
35131C               --SNEDECOR AND COCHRAN, STATISTICAL METHODS,
35132C                 EDITION 6, 1967, PAGES 86-90.
35133C     WRITTEN BY--JAMES J. FILLIBEN
35134C                 STATISTICAL ENGINEERING DIVISION
35135C                 INFORMATION TECHNOLOGY LABORATORY
35136C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
35137C                 GAITHERSBURG, MD 20899-8980
35138C                 PHONE--301-975-2855
35139C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35140C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
35141C     LANGUAGE--ANSI FORTRAN (1966)
35142C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
35143C                          DENOTED BY QUOTES RATHER THAN NH.
35144C     VERSION NUMBER--82.6
35145C     ORIGINAL VERSION--JUNE      1972.
35146C     UPDATED         --SEPTEMBER 1975.
35147C     UPDATED         --NOVEMBER  1975.
35148C     UPDATED         --JUNE      1979.
35149C     UPDATED         --AUGUST    1981.
35150C     UPDATED         --MAY       1982.
35151C     UPDATED         --DECEMBER  2014. USE N INSTEAD OF N-1 IN
35152C                                       THE FORMULAS
35153C
35154C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35155C
35156      CHARACTER*4 IWRITE
35157      CHARACTER*4 IBUGA3
35158      CHARACTER*4 IERROR
35159C
35160      CHARACTER*4 ISUBN1
35161      CHARACTER*4 ISUBN2
35162C
35163C---------------------------------------------------------------------
35164C
35165      DOUBLE PRECISION DN
35166      DOUBLE PRECISION DX
35167      DOUBLE PRECISION DSUM
35168      DOUBLE PRECISION DMEAN
35169      DOUBLE PRECISION DVAR
35170      DOUBLE PRECISION DSD
35171      DOUBLE PRECISION DMOM4
35172C
35173      DIMENSION X(*)
35174C
35175C-----COMMON----------------------------------------------------------
35176C
35177      INCLUDE 'DPCOP2.INC'
35178C
35179C-----START POINT-----------------------------------------------------
35180C
35181      ISUBN1='STMO'
35182      ISUBN2='M4  '
35183      IERROR='NO'
35184C
35185      DSUM=0.0D0
35186      DMEAN=0.0D0
35187      DSD=0.0D0
35188      XSMOM4=0.0
35189C
35190      IF(IBUGA3.EQ.'ON')THEN
35191        WRITE(ICOUT,999)
35192  999   FORMAT(1X)
35193        CALL DPWRST('XXX','BUG ')
35194        WRITE(ICOUT,51)
35195   51   FORMAT('***** AT THE BEGINNING OF STMOM4--')
35196        CALL DPWRST('XXX','BUG ')
35197        WRITE(ICOUT,52)IBUGA3,N
35198   52   FORMAT('IBUGA3,N = ',A4,2X,G15.7)
35199        CALL DPWRST('XXX','BUG ')
35200        DO55I=1,N
35201          WRITE(ICOUT,56)I,X(I)
35202   56     FORMAT('I,X(I) = ',I8,G15.7)
35203          CALL DPWRST('XXX','BUG ')
35204   55   CONTINUE
35205      ENDIF
35206C
35207C               **************************************************
35208C               **  COMPUTE STANDARDIZED FOURTH CENTRAL MOMENT  **
35209C               **************************************************
35210C
35211C               ********************************************
35212C               **  STEP 1--                              **
35213C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35214C               ********************************************
35215C
35216      AN=N
35217C
35218      IF(N.LT.1)THEN
35219        IERROR='YES'
35220        WRITE(ICOUT,999)
35221        CALL DPWRST('XXX','BUG ')
35222        WRITE(ICOUT,111)
35223  111   FORMAT('***** ERROR IN KURTOSIS (STMOM4)--')
35224        CALL DPWRST('XXX','BUG ')
35225        WRITE(ICOUT,112)
35226  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE ',
35227     1         'VARIABLE IS NON-POSITIVE.')
35228        CALL DPWRST('XXX','BUG ')
35229        WRITE(ICOUT,117)N
35230  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
35231        CALL DPWRST('XXX','BUG ')
35232        GOTO9000
35233C
35234      ELSEIF(N.EQ.1)THEN
35235CCCCC   WRITE(ICOUT,999)
35236CCCCC   CALL DPWRST('XXX','BUG ')
35237CCCCC   WRITE(ICOUT,121)
35238CC121   FORMAT('***** WARNING IN KURTOSIS (STMOM4)--')
35239CCCCC   CALL DPWRST('XXX','BUG ')
35240CCCCC   WRITE(ICOUT,123)
35241CC123   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE ',
35242CCCCC1         'VARIABLE IS EXACTLY ONE.')
35243CCCCC   CALL DPWRST('XXX','BUG ')
35244        GOTO9000
35245      ENDIF
35246C
35247      HOLD=X(1)
35248      DO135I=2,N
35249        IF(X(I).NE.HOLD)GOTO139
35250  135 CONTINUE
35251CCCCC WRITE(ICOUT,999)
35252CCCCC CALL DPWRST('XXX','BUG ')
35253CCCCC WRITE(ICOUT,121)
35254CCCCC CALL DPWRST('XXX','BUG ')
35255CCCCC WRITE(ICOUT,136)HOLD
35256CC136 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS EQUAL ',
35257CCCCC1       'TO ',G15.7)
35258CCCCC CALL DPWRST('XXX','BUG ')
35259      GOTO9000
35260  139 CONTINUE
35261C
35262C               *******************************************************
35263C               **  STEP 2--                                         **
35264C               **  COMPUTE THE STANDARDIZED FOURTH CENTRAL MOMENT.  **
35265C               *******************************************************
35266C
35267      DN=N
35268      DSUM=0.0D0
35269      DO200I=1,N
35270        DX=X(I)
35271        DSUM=DSUM+DX
35272  200 CONTINUE
35273      DMEAN=DSUM/DN
35274C
35275      DSUM=0.0D0
35276      DO300I=1,N
35277        DX=X(I)
35278        DSUM=DSUM+(DX-DMEAN)**2
35279  300 CONTINUE
35280CCCCC DVAR=DSUM/(DN-1.0D0)
35281      DVAR=DSUM/DN
35282      DSD=0.0D0
35283      IF(DVAR.GT.0.0D0)DSD=DSQRT(DVAR)
35284      XSD=DSD
35285C
35286      DSUM=0.0D0
35287      DO400I=1,N
35288        DX=X(I)
35289        DSUM=DSUM+(DX-DMEAN)**4
35290  400 CONTINUE
35291CCCCC DMOM4=DSUM/(DN-1.0)
35292      DMOM4=DSUM/DN
35293      XSMOM4=DMOM4/(DSD**4)
35294C
35295C               *******************************
35296C               **  STEP 3--                 **
35297C               **  WRITE OUT A LINE         **
35298C               **  OF SUMMARY INFORMATION.  **
35299C               *******************************
35300C
35301      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
35302        WRITE(ICOUT,999)
35303        CALL DPWRST('XXX','BUG ')
35304        WRITE(ICOUT,811)N,XSMOM4
35305  811   FORMAT('THE STANDARDIZED FOURTH CENTRAL MOMENT OF THE ',I8,
35306     1         ' OBSERVATIONS = ',G15.7)
35307        CALL DPWRST('XXX','BUG ')
35308      ENDIF
35309C
35310C               *****************
35311C               **  STEP 90--  **
35312C               **  EXIT.      **
35313C               *****************
35314C
35315 9000 CONTINUE
35316      IF(IBUGA3.EQ.'ON')THEN
35317        WRITE(ICOUT,999)
35318        CALL DPWRST('XXX','BUG ')
35319        WRITE(ICOUT,9011)
35320 9011   FORMAT('***** AT THE END       OF STMOM4--')
35321        CALL DPWRST('XXX','BUG ')
35322        WRITE(ICOUT,9012)IBUGA3,IERROR
35323 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
35324        CALL DPWRST('XXX','BUG ')
35325        WRITE(ICOUT,9014)DMEAN,DSD,DSUM,XSMOM4
35326 9014   FORMAT('DMEAN,DSD,DSUM,XSMOM4 = ',4G15.7)
35327        CALL DPWRST('XXX','BUG ')
35328      ENDIF
35329C
35330      RETURN
35331      END
35332      SUBROUTINE STRDI(T,LDT,N,DET,JOB,INFO)
35333C***BEGIN PROLOGUE  STRDI
35334C***DATE WRITTEN   780814   (YYMMDD)
35335C***REVISION DATE  820801   (YYMMDD)
35336C***CATEGORY NO.  D2A3,D3A3
35337C***KEYWORDS  DETERMINANT,INVERSE,LINEAR ALGEBRA,LINPACK,MATRIX,
35338C             TRIANGULAR
35339C***AUTHOR  MOLER, C. B., (U. OF NEW MEXICO)
35340C***PURPOSE  Computes the determinant and inverse of a real TRIANGULAR
35341C            matrix
35342C***DESCRIPTION
35343C
35344C     STRDI computes the determinant and inverse of a real
35345C     triangular matrix.
35346C
35347C     On Entry
35348C
35349C        T       REAL(LDT,N)
35350C                T contains the triangular matrix.  The zero
35351C                elements of the matrix are not referenced, and
35352C                the corresponding elements of the array can be
35353C                used to store other information.
35354C
35355C        LDT     INTEGER
35356C                LDT is the leading dimension of the array T.
35357C
35358C        N       INTEGER
35359C                N is the order of the system.
35360C
35361C        JOB     INTEGER
35362C                = 010       no det, inverse of lower triangular.
35363C                = 011       no det, inverse of upper triangular.
35364C                = 100       det, no inverse.
35365C                = 110       det, inverse of lower triangular.
35366C                = 111       det, inverse of upper triangular.
35367C
35368C     On Return
35369C
35370C        T       inverse of original matrix if requested.
35371C                Otherwise unchanged.
35372C
35373C        DET     REAL(2)
35374C                determinant of original matrix if requested.
35375C                Otherwise not referenced.
35376C                Determinant = DET(1) * 10.0**DET(2)
35377C                with  1.0 .LE. ABS(DET(1)) .LT. 10.0
35378C                or  DET(1) .EQ. 0.0 .
35379C
35380C        INFO    INTEGER
35381C                INFO contains zero if the system is nonsingular
35382C                and the inverse is requested.
35383C                Otherwise INFO contains the index of
35384C                a zero diagonal element of T.
35385C
35386C
35387C     LINPACK.  This version dated 08/14/78 .
35388C     Cleve Moler, University of New Mexico, Argonne National Lab.
35389C
35390C     Subroutines and Functions
35391C
35392C     BLAS SAXPY,SSCAL
35393C     Fortran ABS,MOD
35394C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
35395C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
35396C***ROUTINES CALLED  SAXPY,SSCAL
35397C***END PROLOGUE  STRDI
35398      INTEGER LDT,N,JOB,INFO
35399      REAL T(LDT,1),DET(2)
35400C
35401      REAL TEMP
35402      REAL TEN
35403      INTEGER I,J,K,KB,KM1,KP1
35404C
35405C     BEGIN BLOCK PERMITTING ...EXITS TO 180
35406C
35407C        COMPUTE DETERMINANT
35408C
35409C***FIRST EXECUTABLE STATEMENT  STRDI
35410         IF (JOB/100 .EQ. 0) GO TO 70
35411            DET(1) = 1.0E0
35412            DET(2) = 0.0E0
35413            TEN = 10.0E0
35414            DO 50 I = 1, N
35415               DET(1) = T(I,I)*DET(1)
35416C           ...EXIT
35417               IF (DET(1) .EQ. 0.0E0) GO TO 60
35418   10          IF (ABS(DET(1)) .GE. 1.0E0) GO TO 20
35419                  DET(1) = TEN*DET(1)
35420                  DET(2) = DET(2) - 1.0E0
35421               GO TO 10
35422   20          CONTINUE
35423   30          IF (ABS(DET(1)) .LT. TEN) GO TO 40
35424                  DET(1) = DET(1)/TEN
35425                  DET(2) = DET(2) + 1.0E0
35426               GO TO 30
35427   40          CONTINUE
35428   50       CONTINUE
35429   60       CONTINUE
35430   70    CONTINUE
35431C
35432C        COMPUTE INVERSE OF UPPER TRIANGULAR
35433C
35434         IF (MOD(JOB/10,10) .EQ. 0) GO TO 170
35435            IF (MOD(JOB,10) .EQ. 0) GO TO 120
35436C              BEGIN BLOCK PERMITTING ...EXITS TO 110
35437                  DO 100 K = 1, N
35438                     INFO = K
35439C              ......EXIT
35440                     IF (T(K,K) .EQ. 0.0E0) GO TO 110
35441                     T(K,K) = 1.0E0/T(K,K)
35442                     TEMP = -T(K,K)
35443                     CALL SSCAL(K-1,TEMP,T(1,K),1)
35444                     KP1 = K + 1
35445                     IF (N .LT. KP1) GO TO 90
35446                     DO 80 J = KP1, N
35447                        TEMP = T(K,J)
35448                        T(K,J) = 0.0E0
35449                        CALL SAXPY(K,TEMP,T(1,K),1,T(1,J),1)
35450   80                CONTINUE
35451   90                CONTINUE
35452  100             CONTINUE
35453                  INFO = 0
35454  110          CONTINUE
35455            GO TO 160
35456  120       CONTINUE
35457C
35458C              COMPUTE INVERSE OF LOWER TRIANGULAR
35459C
35460               DO 150 KB = 1, N
35461                  K = N + 1 - KB
35462                  INFO = K
35463C     ............EXIT
35464                  IF (T(K,K) .EQ. 0.0E0) GO TO 180
35465                  T(K,K) = 1.0E0/T(K,K)
35466                  TEMP = -T(K,K)
35467                  IF (K .NE. N) CALL SSCAL(N-K,TEMP,T(K+1,K),1)
35468                  KM1 = K - 1
35469                  IF (KM1 .LT. 1) GO TO 140
35470                  DO 130 J = 1, KM1
35471                     TEMP = T(K,J)
35472                     T(K,J) = 0.0E0
35473                     CALL SAXPY(N-K+1,TEMP,T(K,K),1,T(K,J),1)
35474  130             CONTINUE
35475  140             CONTINUE
35476  150          CONTINUE
35477               INFO = 0
35478  160       CONTINUE
35479  170    CONTINUE
35480  180 CONTINUE
35481      RETURN
35482      END
35483      SUBROUTINE STREQU(ISTR,NC,NPOSL1,NPOSL2,NPOSR1)
35484C
35485C     PURPOSE--SCAN A STRING AND SEARCH FOR AN "=" CHARACTER.
35486C              RETURN THE START (NPOSL1) AND STOP (NPOSL2) POSITIONS
35487C              OF THE STRING TO THE LEFT OF THE EQUAL SIGN AND THE
35488C              START POSITION OF THE STRING TO THE RIGHT OF THE
35489C              EQUAL SIGN.
35490C
35491C     LANGUAGE--ANSI FORTRAN (1977)
35492C     VERSION NUMBER--2019/02
35493C     ORIGINAL VERSION--FEBRUARY  2019.
35494C
35495C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35496C
35497      CHARACTER*(*) ISTR
35498C
35499C-----COMMON VARIABLES (GENERAL)--------------------------------------
35500C
35501      INCLUDE 'DPCOP2.INC'
35502C
35503C-----START POINT-----------------------------------------------------
35504C
35505      NPOSL1=0
35506      NPOSL2=0
35507      NPOSR1=0
35508C
35509      DO1100I=1,NC
35510        IF(ISTR(I:I).EQ.'=')THEN
35511          DO1110J=1,I-1
35512C
35513C           FIND FIRST NON-BLANK CHARACTER TO LEFT OF EQUAL SIGN
35514C
35515            IF(ISTR(J:J).NE.' ')THEN
35516              NPOSL1=J
35517C
35518C             FIND LAST NON-BLANK CHARACTER TO LEFT OF EQUAL SIGN
35519C
35520              DO1120K=I-1,NPOSL1,-1
35521                IF(ISTR(K:K).NE.' ')THEN
35522                  NPOSL2=K
35523                  GOTO1129
35524                ENDIF
35525 1120         CONTINUE
35526 1129         CONTINUE
35527C
35528C             FIND FIRST NON-BLANK CHARACTER TO RIGHT OF EQUAL SIGN
35529C
35530              DO1130K=I+1,NC
35531                IF(ISTR(K:K).NE.' ')THEN
35532                  NPOSR1=K
35533                  GOTO1139
35534                ENDIF
35535 1130         CONTINUE
35536              NPOSR1=I+1
35537 1139         CONTINUE
35538C
35539              GOTO1119
35540            ENDIF
35541 1110     CONTINUE
35542 1119     CONTINUE
35543        ENDIF
35544 1100 CONTINUE
35545C
35546      RETURN
35547      END
35548      DOUBLE PRECISION FUNCTION STRERR(DN)
35549C
35550C     PURPOSE--THIS FUNCTION IS A UTILITY FUNCTION FOR THE
35551C              BINRAW SUBROUTINE.  ADAPTED FROM ORIGINAL C
35552C              CODE OF CATHERINE LOADER.
35553C
35554C              THIS IS USED TO COMPUTE THE LOG OF THE ERROR TERM
35555C              IN STIRLING'S FORMULA.  FOR N > 15, USE THE SERIES
35556C              1/(12*N) - 1/(360*N**3) + ...
35557C              FOR N <= 15, INTEGERS, OR HALF-INTEGERS, USE STORED
35558C              VALUES.  FOR OTHER N < 15, CALL THE LOG-GAMMA FUNCTION.
35559C
35560C     PRINTING--NONE
35561C     OTHER DATAPAC   SUBROUTINES NEEDED--DLNGAM.
35562C     FORTRAN LIBRARY SUBROUTINES NEEDED--ABS.
35563C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35564C     LANGUAGE--ANSI FORTRAN (1977)
35565C     REFERENCES--CATHERINE LOADER (2000), "FAST AND ACCURATE COMPUTATION
35566C                 OF BINOMIAL PROBABILITIES", BELL LABS?
35567C     WRITTEN BY--JAMES J. FILLIBEN
35568C                 STATISTICAL ENGINEERING DIVISION
35569C                 INFORMATION TECHNOLOGY LABORATORY
35570C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35571C                 GAITHERSBURG, MD 20899-8980
35572C                 PHONE--301-921-3651
35573C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35574C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
35575C     LANGUAGE--ANSI FORTRAN (1977)
35576C     VERSION NUMBER--2009/3
35577C     ORIGINAL VERSION--MARCH     2009.
35578C
35579C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35580C
35581C---------------------------------------------------------------------
35582C
35583      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
35584      DIMENSION SHALVE(31)
35585      DOUBLE PRECISION NN
35586      DOUBLE PRECISION NN2
35587      INTEGER NTEMP
35588C
35589C-----COMMON----------------------------------------------------------
35590C
35591      INCLUDE 'DPCOP2.INC'
35592C
35593C-----DATA STATEMENTS-------------------------------------------------
35594C
35595      DATA S0/0.083333333333333333333/
35596      DATA S1/0.00277777777777777777778/
35597      DATA S2/0.00079365079365079365079365/
35598      DATA S3/0.000595238095238095238095238/
35599      DATA S4/0.0008417508417508417508417508/
35600      DATA DPI2/6.283185307179586476925286766559/
35601C
35602      DATA SHALVE(1)/0.0/
35603      DATA SHALVE(2)/0.1534264097200273452913848/
35604      DATA SHALVE(3)/0.0810614667953272582196702/
35605      DATA SHALVE(4)/0.0548141210519176538961390/
35606      DATA SHALVE(5)/0.0413406959554092940938221/
35607      DATA SHALVE(6)/0.03316287351993628748511048/
35608      DATA SHALVE(7)/0.02767792568499833914878929/
35609      DATA SHALVE(8)/0.02374616365629749597132920/
35610      DATA SHALVE(9)/0.02079067210376509311152277/
35611      DATA SHALVE(10)/0.01848845053267318523077934/
35612      DATA SHALVE(11)/0.01664469118982119216319487/
35613      DATA SHALVE(12)/0.01513497322191737887351255/
35614      DATA SHALVE(13)/0.01387612882307074799874573/
35615      DATA SHALVE(14)/0.01281046524292022692424986/
35616      DATA SHALVE(15)/0.01189670994589177009505572/
35617      DATA SHALVE(16)/0.01110455975820691732662991/
35618      DATA SHALVE(17)/0.010411265261972096497478567/
35619      DATA SHALVE(18)/0.009799416126158803298389475/
35620      DATA SHALVE(19)/0.009255462182712732917728637/
35621      DATA SHALVE(20)/0.008768700134139385462952823/
35622      DATA SHALVE(21)/0.008330563433362871256469318/
35623      DATA SHALVE(22)/0.007934114564314020547248100/
35624      DATA SHALVE(23)/0.007573675487951840794972024/
35625      DATA SHALVE(24)/0.007244554301320383179543912/
35626      DATA SHALVE(25)/0.006942840107209529865664152/
35627      DATA SHALVE(26)/0.006665247032707682442354394/
35628      DATA SHALVE(27)/0.006408994188004207068439631/
35629      DATA SHALVE(28)/0.006171712263039457647532867/
35630      DATA SHALVE(29)/0.005951370112758847735624416/
35631      DATA SHALVE(30)/0.005746216513010115682023589/
35632      DATA SHALVE(31)/0.005554733551962801371038690/
35633C
35634C-----START POINT-----------------------------------------------------
35635C
35636      IF(DN.LE.15.0D0)THEN
35637        NN=DN+DN
35638        NTEMP=INT(NN)
35639        NN2=DBLE(NTEMP)
35640        IF (NN.EQ.NN2) THEN
35641           STRERR=SHALVE(NTEMP+1)
35642        ELSE
35643          DTERM1=DLNGAM(DN + 1.0D0)
35644          DTERM2=(DN + 0.5D0)*LOG(DN)
35645          DTERM3=DN - LOG(DPI2)
35646          STRERR=DLNGAM(DN + 1.0D0) - (DN + 0.5D0)*LOG(DN) +
35647     1           DN - LOG(DPI2)
35648        ENDIF
35649      ELSE
35650        NN=DN*DN
35651        IF(DN.GT.500.D0)THEN
35652          STRERR=(S0-S1/NN)/DN
35653        ELSEIF(DN.GT.80.D0)THEN
35654          STRERR=(S0-(S1-S2/NN)/NN)/DN
35655        ELSEIF(DN.GT.35.D0)THEN
35656          STRERR=(S0-(S1-(S2-S3/NN)/NN)/NN)/DN
35657        ELSE
35658          STRERR=(S0-(S1-(S2-(S3-S4/NN)/NN)/NN)/NN)/DN
35659        ENDIF
35660      ENDIF
35661C
35662      RETURN
35663      END
35664      SUBROUTINE STRLEZ(ISTR80,MAXCHR,LENGTH)
35665C
35666C     PURPOSE--DETERMINE THE LENGTH (OUT TO THE LAST NON-BLANK
35667C              CHARACTER) OF THE 80-CHARACTER STRING    ISTR80.
35668C
35669C     LANGUAGE--ANSI FORTRAN (1977)
35670C     VERSION NUMBER--92/4
35671C     ORIGINAL VERSION--MARCH     1992.
35672C     UPDATED         --MARCH     2005. RENAME TO STRLEZ TO AVOID NAME CONFLICT
35673C                                       ON MAC OSX.
35674C     UPDATED         --APRIL     2020. MAKE LENGTH OF STRING SETTABLE
35675C                                       BY CALLING ROUTINE
35676C
35677C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35678C
35679CCCCC CHARACTER*80 ISTR80
35680      CHARACTER (LEN=*) :: ISTR80
35681C
35682C-----COMMON VARIABLES (GENERAL)--------------------------------------
35683C
35684      INCLUDE 'DPCOP2.INC'
35685C
35686C-----START POINT-----------------------------------------------------
35687C
35688CCCCC IWIDTH=80
35689      IWIDTH=MAXCHR
35690      DO1100I=1,IWIDTH
35691        IREV=IWIDTH-I+1
35692        IF(ISTR80(IREV:IREV).NE.' ')THEN
35693          LENGTH=IREV
35694          GOTO9000
35695        ENDIF
35696 1100 CONTINUE
35697      LENGTH=0
35698C
35699 9000 CONTINUE
35700      RETURN
35701      END
35702      DOUBLE PRECISION FUNCTION STROM(XVALUE)
35703C
35704C  DESCRIPTION:
35705C
35706C    This program calculates Stromgren's integral, defined as
35707C
35708C      STROM(X) = integral 0 to X { t**7 exp(2t)/[exp(t)-1]**3 } dt
35709C
35710C    The code uses a Chebyshev series, the coefficients of which are
35711C    given to an accuracy of 20 decimal places.
35712C
35713C
35714C  ERROR RETURNS:
35715C
35716C    If XVALUE < 0.0, an error message is printed, and the program
35717C    returns the value 0.0.
35718C
35719C
35720C  MACHINE-DEPENDENT CONSTANTS:
35721C
35722C    NTERMS - INTEGER - The number of terms of the array ASTROM to be used.
35723C                       The recommended value is such that
35724C                             ASTROM(NTERMS) < EPS/100
35725C
35726C    XLOW0 - DOUBLE PRECISION - The value below which STROM = 0.0 to machine
35727C                    precision. The recommended value is
35728C                          5th root of (130*XMIN)
35729C
35730C    XLOW1 - DOUBLE PRECISION - The value below which STROM = 3*(X**5)/(4*(pi**4))
35731C                   to machine precision. The recommended value is
35732C                             2*EPSNEG
35733C
35734C    EPSLN - DOUBLE PRECISION - The value of ln(EPS). Used to determine the no.
35735C                   of exponential terms for large X.
35736C
35737C    EPNGLN - DOUBLE PRECISION - The value of ln(EPSNEG). Used to prevent
35738C                    overflow for large X.
35739C
35740C    XHIGH - DOUBLE PRECISION - The value above which
35741C                           STROM = 196.52 - 15*(x**7)*exp(-x)/(4pi**4)
35742C                   to machine precision. The recommended value is
35743C                             7 / EPS
35744C
35745C     For values of EPS, EPSNEG, and XMIN refer to the file MACHCON.TXT
35746C
35747C     The machine-dependent constants are computed internally by
35748C     using the D1MACH subroutine.
35749C
35750C
35751C  INTRINSIC FUNCTIONS USED:
35752C
35753C    EXP, INT, LOG
35754C
35755C
35756C   OTHER MISCFUN SUBROUTINES USED:
35757C
35758C          CHEVAL , ERRPRN, D1MACH
35759C
35760C
35761C  AUTHOR:
35762C
35763C     DR. ALLAN J. MACLEOD,
35764C     DEPT. OF MATHEMATICS AND STATISTICS,
35765C     UNIVERSITY OF PAISLEY,
35766C     HIGH ST.,
35767C     PAISLEY,
35768C     SCOTLAND.
35769C     PA1 2BE.
35770C
35771C     (e-mail: macl_ms0@paisley.ac.uk )
35772C
35773C
35774C  LATEST REVISION:
35775C                  23 January, 1996
35776C
35777C
35778      INTEGER K1,K2,NTERMS,NUMEXP
35779      DOUBLE PRECISION ASTROM(0:26),CHEVAL,EPNGLN,EPSLN,FOUR,
35780     1     F15BP4,HALF,ONE,ONEHUN,ONE30,ONE5LN,PI4B3,RK,
35781     2     SEVEN,SUMEXP,SUM2,T,TWO,VALINF,X,XHIGH,
35782     3     XK,XK1,XLOW0,XLOW1,XVALUE,ZERO
35783CCCCC CHARACTER FNNAME*6,ERRMSG*14
35784C
35785C-----COMMON----------------------------------------------------------
35786C
35787      INCLUDE 'DPCOMC.INC'
35788      INCLUDE 'DPCOP2.INC'
35789C
35790CCCCC DATA FNNAME/'STROM '/
35791CCCCC DATA ERRMSG/'ARGUMENT < 0.0'/
35792      DATA ZERO,HALF,ONE/ 0.0 D 0 , 0.5 D 0 , 1.0 D 0/
35793      DATA TWO,FOUR,SEVEN/ 2.0 D 0 , 4.0 D 0 , 7.0 D 0 /
35794      DATA ONEHUN,ONE30,ONE5LN/ 100.0 D 0 , 130.0 D 0 , 0.4055 D 0 /
35795      DATA F15BP4/0.38497 43345 50662 56959 D -1 /
35796      DATA PI4B3/1.29878 78804 53365 82982 D 2 /
35797      DATA VALINF/196.51956 92086 89882 61257 D 0/
35798      DATA ASTROM(0)/  0.56556 12087 25391 55290  D    0/
35799      DATA ASTROM(1)/  0.45557 31969 10178 5525   D   -1/
35800      DATA ASTROM(2)/ -0.40395 35875 93686 9170   D   -1/
35801      DATA ASTROM(3)/ -0.13339 05720 21486 815    D   -2/
35802      DATA ASTROM(4)/  0.18586 25062 50538 030    D   -2/
35803      DATA ASTROM(5)/ -0.46855 55868 05365 9      D   -4/
35804      DATA ASTROM(6)/ -0.63434 75643 42294 9      D   -4/
35805      DATA ASTROM(7)/  0.57254 87081 43200        D   -5/
35806      DATA ASTROM(8)/  0.15935 28122 16822        D   -5/
35807      DATA ASTROM(9)/ -0.28884 32843 1036         D   -6/
35808      DATA ASTROM(10)/-0.24466 33604 801          D   -7/
35809      DATA ASTROM(11)/ 0.10072 50382 374          D   -7/
35810      DATA ASTROM(12)/-0.12482 98610 4            D   -9/
35811      DATA ASTROM(13)/-0.26300 62528 3            D   -9/
35812      DATA ASTROM(14)/ 0.24904 07578              D  -10/
35813      DATA ASTROM(15)/ 0.48545 4902               D  -11/
35814      DATA ASTROM(16)/-0.10537 8913               D  -11/
35815      DATA ASTROM(17)/-0.36044 17                 D  -13/
35816      DATA ASTROM(18)/ 0.29920 78                 D  -13/
35817      DATA ASTROM(19)/-0.16397 1                  D  -14/
35818      DATA ASTROM(20)/-0.61061                    D  -15/
35819      DATA ASTROM(21)/ 0.9335                     D  -16/
35820      DATA ASTROM(22)/ 0.709                      D  -17/
35821      DATA ASTROM(23)/-0.291                      D  -17/
35822      DATA ASTROM(24)/ 0.8                        D  -19/
35823      DATA ASTROM(25)/ 0.6                        D  -19/
35824      DATA ASTROM(26)/-0.1                        D  -19/
35825C
35826      XLOW0=0.0
35827      XLOW1=0.0
35828C  Start execution
35829C
35830      X = XVALUE
35831C
35832C  Error test
35833C
35834      IF ( X .LT. ZERO ) THEN
35835CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
35836         WRITE(ICOUT,999)
35837         CALL DPWRST('XXX','BUG ')
35838         WRITE(ICOUT,101)X
35839         CALL DPWRST('XXX','BUG ')
35840         STROM = ZERO
35841         RETURN
35842      ENDIF
35843  999 FORMAT(1X)
35844  101 FORMAT('***** ERROR FROM STROM--ARGUMENT MUST BE ',
35845     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
35846C
35847C   Compute the machine-dependent constants.
35848C
35849      XK = D1MACH(3)
35850      T = XK / ONEHUN
35851      IF ( X .LE. FOUR ) THEN
35852         DO 10 NTERMS = 26 , 0 , -1
35853            IF ( ABS(ASTROM(NTERMS)) .GT. T ) GOTO 19
35854 10      CONTINUE
35855 19      XLOW0 = ( ONE30 * D1MACH(1) ) ** (ONE/(SEVEN-TWO))
35856         XLOW1 = TWO * XK
35857      ELSE
35858         EPSLN = LOG ( D1MACH(4) )
35859         EPNGLN = LOG ( XK )
35860         XHIGH = SEVEN / XK
35861      ENDIF
35862C
35863C   Code for x < =  4.0
35864C
35865      IF ( X .LE. FOUR ) THEN
35866         IF ( X .LT. XLOW0 ) THEN
35867            STROM = ZERO
35868         ELSE
35869            IF ( X .LT. XLOW1 ) THEN
35870               STROM = (X**5) / PI4B3
35871            ELSE
35872               T = ( ( X / TWO ) - HALF ) - HALF
35873               STROM = (X**5) * CHEVAL(NTERMS,ASTROM,T) * F15BP4
35874            ENDIF
35875         ENDIF
35876      ELSE
35877C
35878C  Code for x > 4.0
35879C
35880         IF ( X .GT. XHIGH ) THEN
35881            SUMEXP = ONE
35882         ELSE
35883            NUMEXP = INT( EPSLN / (ONE5LN - X ) ) + 1
35884            IF ( NUMEXP .GT. 1 ) THEN
35885               T = EXP( -X )
35886            ELSE
35887               T = ONE
35888            ENDIF
35889            RK = ZERO
35890            DO 100 K1 = 1 , NUMEXP
35891               RK = RK + ONE
35892  100       CONTINUE
35893            SUMEXP = ZERO
35894            DO 300 K1 = 1 , NUMEXP
35895               SUM2 = ONE
35896               XK = ONE / ( RK * X )
35897               XK1 = ONE
35898               DO 200 K2 = 1 , 7
35899                  SUM2 = SUM2 * XK1 * XK + ONE
35900                  XK1 = XK1 + ONE
35901  200          CONTINUE
35902               SUM2 = SUM2 * ( RK + ONE ) / TWO
35903               SUMEXP = SUMEXP * T + SUM2
35904               RK = RK - ONE
35905  300       CONTINUE
35906         ENDIF
35907         T = SEVEN * LOG(X) - X + LOG(SUMEXP)
35908         IF ( T .LT. EPNGLN ) THEN
35909            STROM = VALINF
35910         ELSE
35911            STROM = VALINF - EXP(T) * F15BP4
35912         ENDIF
35913      ENDIF
35914      RETURN
35915      END
35916      SUBROUTINE STRSL(T,LDT,N,B,JOB,INFO)
35917C***BEGIN PROLOGUE  STRSL
35918C***DATE WRITTEN   780814   (YYMMDD)
35919C***REVISION DATE  820801   (YYMMDD)
35920C***CATEGORY NO.  D2A3
35921C***KEYWORDS  LINEAR ALGEBRA,LINPACK,MATRIX,SOLVE,TRIANGULAR
35922C***AUTHOR  STEWART, G. W., (U. OF MARYLAND)
35923C***PURPOSE  Solves systems of the form  T*X=B or TRANS(T)*X=B
35924C            where T is a TRIANGULAR matrix of order N.
35925C***DESCRIPTION
35926C
35927C     STRSL solves systems of the form
35928C
35929C                   T * X = B
35930C     or
35931C                   TRANS(T) * X = B
35932C
35933C     where T is a triangular matrix of order N.  Here TRANS(T)
35934C     denotes the transpose of the matrix T.
35935C
35936C     On Entry
35937C
35938C         T         REAL(LDT,N)
35939C                   T contains the matrix of the system.  The zero
35940C                   elements of the matrix are not referenced, and
35941C                   the corresponding elements of the array can be
35942C                   used to store other information.
35943C
35944C         LDT       INTEGER
35945C                   LDT is the leading dimension of the array T.
35946C
35947C         N         INTEGER
35948C                   N is the order of the system.
35949C
35950C         B         REAL(N).
35951C                   B contains the right hand side of the system.
35952C
35953C         JOB       INTEGER
35954C                   JOB specifies what kind of system is to be solved.
35955C                   If JOB is
35956C
35957C                        00   solve T*X=B, T lower triangular,
35958C                        01   solve T*X=B, T upper triangular,
35959C                        10   solve TRANS(T)*X=B, T lower triangular,
35960C                        11   solve TRANS(T)*X=B, T upper triangular.
35961C
35962C     On Return
35963C
35964C         B         B contains the solution, if INFO .EQ. 0.
35965C                   Otherwise B is unaltered.
35966C
35967C         INFO      INTEGER
35968C                   INFO contains zero if the system is nonsingular.
35969C                   Otherwise INFO contains the index of
35970C                   the first zero diagonal element of T.
35971C
35972C     LINPACK.  This version dated 08/14/78 .
35973C     G. W. Stewart, University of Maryland, Argonne National Lab.
35974C
35975C     Subroutines and Functions
35976C
35977C     BLAS SAXPY,SDOT
35978C     Fortran MOD
35979C***REFERENCES  DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W.,
35980C                 *LINPACK USERS  GUIDE*, SIAM, 1979.
35981C***ROUTINES CALLED  SAXPY,SDOT
35982C***END PROLOGUE  STRSL
35983      INTEGER LDT,N,JOB,INFO
35984      REAL T(LDT,*),B(*)
35985C
35986C
35987      REAL SDOT,TEMP
35988      INTEGER CASE,J,JJ
35989C
35990C     BEGIN BLOCK PERMITTING ...EXITS TO 150
35991C
35992C        CHECK FOR ZERO DIAGONAL ELEMENTS.
35993C
35994C***FIRST EXECUTABLE STATEMENT  STRSL
35995         DO 10 INFO = 1, N
35996C     ......EXIT
35997            IF (T(INFO,INFO) .EQ. 0.0E0) GO TO 150
35998   10    CONTINUE
35999         INFO = 0
36000C
36001C        DETERMINE THE TASK AND GO TO IT.
36002C
36003         CASE = 1
36004         IF (MOD(JOB,10) .NE. 0) CASE = 2
36005         IF (MOD(JOB,100)/10 .NE. 0) CASE = CASE + 2
36006         GO TO (20,50,80,110), CASE
36007C
36008C        SOLVE T*X=B FOR T LOWER TRIANGULAR
36009C
36010   20    CONTINUE
36011            B(1) = B(1)/T(1,1)
36012            IF (N .LT. 2) GO TO 40
36013            DO 30 J = 2, N
36014               TEMP = -B(J-1)
36015               CALL SAXPY(N-J+1,TEMP,T(J,J-1),1,B(J),1)
36016               B(J) = B(J)/T(J,J)
36017   30       CONTINUE
36018   40       CONTINUE
36019         GO TO 140
36020C
36021C        SOLVE T*X=B FOR T UPPER TRIANGULAR.
36022C
36023   50    CONTINUE
36024            B(N) = B(N)/T(N,N)
36025            IF (N .LT. 2) GO TO 70
36026            DO 60 JJ = 2, N
36027               J = N - JJ + 1
36028               TEMP = -B(J+1)
36029               CALL SAXPY(J,TEMP,T(1,J+1),1,B(1),1)
36030               B(J) = B(J)/T(J,J)
36031   60       CONTINUE
36032   70       CONTINUE
36033         GO TO 140
36034C
36035C        SOLVE TRANS(T)*X=B FOR T LOWER TRIANGULAR.
36036C
36037   80    CONTINUE
36038            B(N) = B(N)/T(N,N)
36039            IF (N .LT. 2) GO TO 100
36040            DO 90 JJ = 2, N
36041               J = N - JJ + 1
36042               B(J) = B(J) - SDOT(JJ-1,T(J+1,J),1,B(J+1),1)
36043               B(J) = B(J)/T(J,J)
36044   90       CONTINUE
36045  100       CONTINUE
36046         GO TO 140
36047C
36048C        SOLVE TRANS(T)*X=B FOR T UPPER TRIANGULAR.
36049C
36050  110    CONTINUE
36051            B(1) = B(1)/T(1,1)
36052            IF (N .LT. 2) GO TO 130
36053            DO 120 J = 2, N
36054               B(J) = B(J) - SDOT(J-1,T(1,J),1,B(1),1)
36055               B(J) = B(J)/T(J,J)
36056  120       CONTINUE
36057  130       CONTINUE
36058  140    CONTINUE
36059  150 CONTINUE
36060      RETURN
36061      END
36062      SUBROUTINE STRSWP(A,N1,N2,N3)
36063C
36064C     PURPOSE--XX
36065C
36066C     NOTE--RECOMMENDED DIMENSIONS--
36067C           A(N3-1)
36068C
36069C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
36070C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
36071C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
36072C
36073C---------------------------------------------------------------------
36074C
36075      DIMENSION A(*)
36076C
36077C-----START POINT-----------------------------------------------------
36078C
36079      DO 10 N=N1,N2-1
36080        H=A(N1)
36081        DO 20 I=N1,N3-2
36082          A(I)=A(I+1)
36083 20     CONTINUE
36084        A(N3-1)=H
36085 10   CONTINUE
36086      RETURN
36087      END
36088      DOUBLE PRECISION FUNCTION STUDNT( NU, T )
36089*
36090*     Student t Distribution Function
36091*
36092*                       T
36093*         STUDNT = C   I  ( 1 + y*y/NU )**( -(NU+1)/2 ) dy
36094*                   NU -INF
36095*
36096      INTEGER NU, J
36097      DOUBLE PRECISION T, CSSTHE, SNTHE, POLYN, TT, TS, RN, PI, ZERO
36098      PARAMETER ( PI = 3.14159 26535 89793D0, ZERO = 0 )
36099      IF ( NU .EQ. 1 ) THEN
36100         STUDNT = ( 1.0D0 + 2.0D0*ATAN(T)/PI )/2.0D0
36101      ELSE IF ( NU .EQ. 2) THEN
36102         STUDNT = ( 1.0D0 + T/SQRT( 2.0D0 + T*T ))/2.0D0
36103      ELSE
36104         TT = T*T
36105         CSSTHE = 1.0D0/( 1.0D0 + TT/DBLE(NU) )
36106         POLYN = 1.0D0
36107         DO 100 J = NU-2, 2, -2
36108            POLYN = 1.0D0 + DBLE( J - 1 )*CSSTHE*POLYN/DBLE(J)
36109  100    CONTINUE
36110         IF ( MOD( NU, 2 ) .EQ. 1 ) THEN
36111            RN = NU
36112            TS = T/SQRT(RN)
36113            STUDNT = ( 1.0D0 + 2.0D0*
36114     &             ( ATAN(TS) + TS*CSSTHE*POLYN )/PI )/2.0D0
36115         ELSE
36116            SNTHE = T/SQRT( NU + TT )
36117            STUDNT = ( 1.0D0 + SNTHE*POLYN )/2.0D0
36118         END IF
36119         STUDNT = MAX( ZERO, STUDNT )
36120      ENDIF
36121C
36122      RETURN
36123      END
36124        SUBROUTINE STVH0(X,SH0)
36125C
36126C       =============================================
36127C       Purpose: Compute Struve function H0(x)
36128C       Input :  x   --- Argument of H0(x) ( x � 0 )
36129C       Output:  SH0 --- H0(x)
36130C       =============================================
36131C
36132        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36133        PI=3.141592653589793D0
36134        S=1.0D0
36135        R=1.0D0
36136        IF (X.LE.20.0D0) THEN
36137           A0=2.0*X/PI
36138           DO 10 K=1,60
36139              R=-R*X/(2.0D0*K+1.0D0)*X/(2.0D0*K+1.0D0)
36140              S=S+R
36141              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 15
3614210         CONTINUE
3614315         SH0=A0*S
36144        ELSE
36145           KM=INT(.5*(X+1.0))
36146           IF (X.GE.50.0) KM=25
36147           DO 20 K=1,KM
36148              R=-R*((2.0D0*K-1.0D0)/X)**2
36149              S=S+R
36150              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 25
3615120         CONTINUE
3615225         T=4.0D0/X
36153           T2=T*T
36154           P0=((((-.37043D-5*T2+.173565D-4)*T2-.487613D-4)
36155     &        *T2+.17343D-3)*T2-.1753062D-2)*T2+.3989422793D0
36156           Q0=T*(((((.32312D-5*T2-.142078D-4)*T2+.342468D-4)*
36157     &        T2-.869791D-4)*T2+.4564324D-3)*T2-.0124669441D0)
36158           TA0=X-.25D0*PI
36159           BY0=2.0D0/DSQRT(X)*(P0*DSIN(TA0)+Q0*DCOS(TA0))
36160           SH0=2.0D0/(PI*X)*S+BY0
36161        ENDIF
36162        RETURN
36163        END
36164        SUBROUTINE STVH1(X,SH1)
36165C
36166C       =============================================
36167C       Purpose: Compute Struve function H1(x)
36168C       Input :  x   --- Argument of H1(x) ( x � 0 )
36169C       Output:  SH1 --- H1(x)
36170C       =============================================
36171C
36172        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36173        PI=3.141592653589793D0
36174        R=1.0D0
36175        IF (X.LE.20.0D0) THEN
36176           S=0.0D0
36177           A0=-2.0D0/PI
36178           DO 10 K=1,60
36179              R=-R*X*X/(4.0D0*K*K-1.0D0)
36180              S=S+R
36181              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 15
3618210         CONTINUE
3618315         SH1=A0*S
36184        ELSE
36185           S=1.0D0
36186           KM=INT(.5*X)
36187           IF (X.GT.50.D0) KM=25
36188           DO 20 K=1,KM
36189              R=-R*(4.0D0*K*K-1.0D0)/(X*X)
36190              S=S+R
36191              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 25
3619220         CONTINUE
3619325         T=4.0D0/X
36194           T2=T*T
36195           P1=((((.42414D-5*T2-.20092D-4)*T2+.580759D-4)*T2
36196     &        -.223203D-3)*T2+.29218256D-2)*T2+.3989422819D0
36197           Q1=T*(((((-.36594D-5*T2+.1622D-4)*T2-.398708D-4)*
36198     &        T2+.1064741D-3)*T2-.63904D-3)*T2+.0374008364D0)
36199           TA1=X-.75D0*PI
36200           BY1=2.0D0/DSQRT(X)*(P1*DSIN(TA1)+Q1*DCOS(TA1))
36201           SH1=2.0/PI*(1.0D0+S/(X*X))+BY1
36202        ENDIF
36203        RETURN
36204        END
36205        SUBROUTINE STVHV(V,X,HV)
36206C
36207C       =====================================================
36208C       Purpose: Compute Struve function Hv(x) with an
36209C                arbitrary order v
36210C       Input :  v  --- Order of Hv(x)  ( -8.0  v  12.5 )
36211C                x  --- Argument of Hv(x) ( x � 0 )
36212C       Output:  HV --- Hv(x)
36213C       Routine called: GAMMA to compute the gamma function
36214C       =====================================================
36215C
36216        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36217C
36218        PU0=0.0D0
36219        QU0=0.0D0
36220        BYV=0.0D0
36221C
36222        PI=3.141592653589793D0
36223        IF (X.EQ.0.0D0) THEN
36224           IF (V.GT.-1.0.OR.INT(V)-V.EQ.0.5D0) THEN
36225              HV=0.0D0
36226           ELSE IF (V.LT.-1.0D0) THEN
36227              HV=(-1)**(INT(0.5D0-V)-1)*1.0D+300
36228           ELSE IF (V.EQ.-1.0D0) THEN
36229              HV=2.0D0/PI
36230           ENDIF
36231           RETURN
36232        ENDIF
36233        IF (X.LE.20.0D0) THEN
36234           V0=V+1.5D0
36235CCCCC      CALL GAMMA(V0,GA)
36236           GA=DGAMMA(V0)
36237           S=2.0D0/(DSQRT(PI)*GA)
36238           R1=1.0D0
36239           DO 10 K=1,100
36240              VA=K+1.5D0
36241CCCCC         CALL GAMMA(VA,GA)
36242              GA=DGAMMA(VA)
36243              VB=V+K+1.5D0
36244CCCCC         CALL GAMMA(VB,GB)
36245              GB=DGAMMA(VB)
36246              R1=-R1*(0.5D0*X)**2
36247              R2=R1/(GA*GB)
36248              S=S+R2
36249              IF (DABS(R2).LT.DABS(S)*1.0D-12) GO TO 15
3625010         CONTINUE
3625115         HV=(0.5D0*X)**(V+1.0D0)*S
36252        ELSE
36253           SA=(0.5D0*X)**(V-1.0)/PI
36254           V0=V+0.5D0
36255CCCCC      CALL GAMMA(V0,GA)
36256           GA=DGAMMA(V0)
36257           S=DSQRT(PI)/GA
36258           R1=1.0D0
36259           DO 20 K=1,12
36260              VA=K+0.5D0
36261CCCCC         CALL GAMMA(VA,GA)
36262              GA=DGAMMA(VA)
36263              VB=-K+V+0.5D0
36264CCCCC         CALL GAMMA(VB,GB)
36265              GB=DGAMMA(VB)
36266              R1=R1/(0.5D0*X)**2
36267              S=S+R1*GA/GB
3626820         CONTINUE
36269           S0=SA*S
36270           U=DABS(V)
36271           N=INT(U)
36272           U0=U-N
36273           DO 35 L=0,1
36274              VT=4.0D0*(U0+L)**2
36275              R1=1.0D0
36276              PU1=1.0D0
36277              DO 25 K=1,12
36278                 R1=-0.0078125D0*R1*(VT-(4.0*K-3.0D0)**2)*
36279     &             (VT-(4.0D0*K-1.0)**2)/((2.0D0*K-1.0)*K*X*X)
36280                 PU1=PU1+R1
3628125            CONTINUE
36282              QU1=1.0D0
36283              R2=1.0D0
36284              DO 30 K=1,12
36285                 R2=-0.0078125D0*R2*(VT-(4.0D0*K-1.0)**2)*
36286     &             (VT-(4.0D0*K+1.0)**2)/((2.0D0*K+1.0)*K*X*X)
36287                 QU1=QU1+R2
3628830            CONTINUE
36289              QU1=0.125D0*(VT-1.0D0)/X*QU1
36290              IF (L.EQ.0) THEN
36291                 PU0=PU1
36292                 QU0=QU1
36293              ENDIF
3629435         CONTINUE
36295           T0=X-(0.5*U0+0.25D0)*PI
36296           T1=X-(0.5*U0+0.75D0)*PI
36297           SR=DSQRT(2.0D0/(PI*X))
36298           BY0=SR*(PU0*DSIN(T0)+QU0*DCOS(T0))
36299           BY1=SR*(PU1*DSIN(T1)+QU1*DCOS(T1))
36300           BF0=BY0
36301           BF1=BY1
36302           DO 40 K=2,N
36303              BF=2.0D0*(K-1.0+U0)/X*BF1-BF0
36304              BF0=BF1
36305              BF1=BF
3630640         CONTINUE
36307           IF (N.EQ.0) BYV=BY0
36308           IF (N.EQ.1) BYV=BY1
36309           IF (N.GT.1) BYV=BF
36310           HV=BYV+S0
36311        ENDIF
36312        RETURN
36313        END
36314        SUBROUTINE STVL0(X,SL0)
36315C
36316C       ================================================
36317C       Purpose: Compute modified Struve function L0(x)
36318C       Input :  x   --- Argument of L0(x) ( x � 0 )
36319C       Output:  SL0 --- L0(x)
36320C       ================================================
36321C
36322        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36323        PI=3.141592653589793D0
36324        S=1.0D0
36325        R=1.0D0
36326        IF (X.LE.20.0D0) THEN
36327           A0=2.0D0*X/PI
36328           DO 10 K=1,60
36329              R=R*(X/(2.0D0*K+1.0D0))**2
36330              S=S+R
36331              IF (DABS(R/S).LT.1.0D-12) GO TO 15
3633210         CONTINUE
3633315         SL0=A0*S
36334        ELSE
36335           KM=INT(.5*(X+1.0))
36336           IF (X.GE.50.0) KM=25
36337           DO 20 K=1,KM
36338              R=R*((2.0D0*K-1.0D0)/X)**2
36339              S=S+R
36340              IF (DABS(R/S).LT.1.0D-12) GO TO 25
3634120         CONTINUE
3634225         A1=DEXP(X)/DSQRT(2.0D0*PI*X)
36343           R=1.0D0
36344           BI0=1.0D0
36345           DO 30 K=1,16
36346              R=0.125D0*R*(2.0D0*K-1.0D0)**2/(K*X)
36347              BI0=BI0+R
36348              IF (DABS(R/BI0).LT.1.0D-12) GO TO 35
3634930         CONTINUE
3635035         BI0=A1*BI0
36351           SL0=-2.0D0/(PI*X)*S+BI0
36352        ENDIF
36353        RETURN
36354        END
36355        SUBROUTINE STVL1(X,SL1)
36356C
36357C       ================================================
36358C       Purpose: Compute modified Struve function L1(x)
36359C       Input :  x   --- Argument of L1(x) ( x � 0 )
36360C       Output:  SL1 --- L1(x)
36361C       ================================================
36362C
36363        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36364        PI=3.141592653589793D0
36365        R=1.0D0
36366        IF (X.LE.20.0D0) THEN
36367           S=0.0D0
36368           DO 10 K=1,60
36369              R=R*X*X/(4.0D0*K*K-1.0D0)
36370              S=S+R
36371              IF (DABS(R/S).LT.1.0D-12) GO TO 15
3637210         CONTINUE
3637315         SL1=2.0D0/PI*S
36374        ELSE
36375           S=1.0D0
36376           KM=INT(.50*X)
36377           IF (X.GT.50) KM=25
36378           DO 20 K=1,KM
36379              R=R*(2.0D0*K+3.0D0)*(2.0D0*K+1.0D0)/(X*X)
36380              S=S+R
36381              IF (DABS(R/S).LT.1.0D-12) GO TO 25
3638220            CONTINUE
3638325         SL1=2.0D0/PI*(-1.0D0+1.0D0/(X*X)+3.0D0*S/X**4)
36384           A1=DEXP(X)/DSQRT(2.0D0*PI*X)
36385           R=1.0D0
36386           BI1=1.0D0
36387           DO 30 K=1,16
36388              R=-0.125D0*R*(4.0D0-(2.0D0*K-1.0D0)**2)/(K*X)
36389              BI1=BI1+R
36390              IF (DABS(R/BI1).LT.1.0D-12) GO TO 35
3639130         CONTINUE
3639235         SL1=SL1+A1*BI1
36393        ENDIF
36394        RETURN
36395        END
36396        SUBROUTINE STVLV(V,X,SLV)
36397C
36398C       ======================================================
36399C       Purpose:  Compute modified Struve function Lv(x) with
36400C                 an arbitrary order v
36401C       Input :   v   --- Order of Lv(x)  ( |v|  20 )
36402C                 x   --- Argument of Lv(x) ( x � 0 )
36403C       Output:   SLV --- Lv(x)
36404C       Routine called: GAMMA to compute the gamma function
36405C       ======================================================
36406C
36407        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
36408        PI=3.141592653589793D0
36409        IF (X.EQ.0.0D0) THEN
36410           IF (V.GT.-1.0.OR.INT(V)-V.EQ.0.5D0) THEN
36411              SLV=0.0D0
36412           ELSE IF (V.LT.-1.0D0) THEN
36413              SLV=(-1)**(INT(0.5D0-V)-1)*1.0D+300
36414           ELSE IF (V.EQ.-1.0D0) THEN
36415              SLV=2.0D0/PI
36416           ENDIF
36417           RETURN
36418        ENDIF
36419        IF (X.LE.40.0D0) THEN
36420           V0=V+1.5D0
36421CCCCC      CALL GAMMA(V0,GA)
36422           GA=DGAMMA(V0)
36423           S=2.0D0/(DSQRT(PI)*GA)
36424           R1=1.0D0
36425           DO 10 K=1,100
36426              VA=K+1.5D0
36427CCCCC         CALL GAMMA(VA,GA)
36428              GA=DGAMMA(VA)
36429              VB=V+K+1.5D0
36430CCCCC         CALL GAMMA(VB,GB)
36431              GB=DGAMMA(VB)
36432              R1=R1*(0.5D0*X)**2
36433              R2=R1/(GA*GB)
36434              S=S+R2
36435              IF (DABS(R2/S).LT.1.0D-12) GO TO 15
3643610         CONTINUE
3643715         SLV=(0.5D0*X)**(V+1.0D0)*S
36438        ELSE
36439           SA=-1.0D0/PI*(0.5D0*X)**(V-1.0)
36440           V0=V+0.5D0
36441CCCCC      CALL GAMMA(V0,GA)
36442           GA=DGAMMA(V0)
36443           S=-DSQRT(PI)/GA
36444           R1=-1.0D0
36445           DO 20 K=1,12
36446              VA=K+0.5D0
36447CCCCC         CALL GAMMA(VA,GA)
36448              GA=DGAMMA(VA)
36449              VB=-K+V+0.5D0
36450CCCCC         CALL GAMMA(VB,GB)
36451              GB=DGAMMA(VB)
36452              R1=-R1/(0.5D0*X)**2
36453              S=S+R1*GA/GB
3645420         CONTINUE
36455           S0=SA*S
36456           U=DABS(V)
36457           N=INT(U)
36458           U0=U-N
36459           DO 35 L=0,1
36460              VT=U0+L
36461              R=1.0D0
36462              BIV=1.0D0
36463              DO 25 K=1,16
36464                 R=-0.125*R*(4.0*VT*VT-(2.0*K-1.0D0)**2)/(K*X)
36465                 BIV=BIV+R
36466                 IF (DABS(R/BIV).LT.1.0D-12) GO TO 30
3646725            CONTINUE
3646830            IF (L.EQ.0) BIV0=BIV
3646935         CONTINUE
36470           BF0=BIV0
36471           BF1=BIV
36472           DO 40 K=2,N
36473              BF=-2.0D0*(K-1.0+U0)/X*BF1+BF0
36474              BF0=BF1
36475              BF1=BF
3647640         CONTINUE
36477           IF (N.EQ.0) BIV=BIV0
36478           IF (N.GT.1) BIV=BF
36479           SLV=DEXP(X)/DSQRT(2.0D0*PI*X)*BIV+S0
36480        ENDIF
36481        RETURN
36482        END
36483      SUBROUTINE STWS(X,N,Y,IWRITE,YSTWS,IUPPER,IBUGA3,IERROR)
36484C
36485C     PURPOSE--THIS SUBROUTINE COMPUTES THE
36486C              STANDARDIZED WILK-SHAPIRO STATISTIC
36487C              THE PROTOTYPE NORMAL DISTRIBUTION USED HEREIN
36488C              HAS MEAN = 0 AND STANDARD DEVIATION = 1.
36489C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
36490C              THE PROBABILITY DENSITY FUNCTION
36491C              F(X) = (1/SQRT(2*PI)) * EXP(-X*X/2).
36492C              THE STANDARDIZED WILK-SHAPIRO STATISTIC IS USEFUL IN
36493C              TESTING THE COMPOSITE (THAT IS,
36494C              LOCATION AND SCALE PARAMETERS NEED NOT BE SPECIFIED)
36495C              HYPOTHESIS THAT THE UNDERLYING DISTRIBUTION
36496C              FROM WHICH THE DATA HAVE BEEN RANDOMLY DRAWN
36497C              IS THE NORMAL DISTRIBUTION.
36498C              IF THE HYPOTHESIS IS TRUE, THE STANDARDIZED
36499C              WILK-SHAPIRO STATISTIC SHOULD BE NEAR-ZERO OR POSITIVE.
36500C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
36501C                                (UNSORTED OR SORTED) OBSERVATIONS.
36502C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
36503C                                IN THE VECTOR X.
36504C     OUTPUT ARGUMENTS--YSTWS  = THE SINGLE PRECISION VALUE OF THE
36505C                                COMPUTED STANDARDIZED WILK-SHAPIRO STATISTIC.
36506C     OUTPUT--NONE.
36507C     PRINTING--YES.
36508C     RESTRICTIONS--THE MAXIMUM ALLOWABLE VALUE OF N
36509C                   FOR THIS SUBROUTINE IS 1000.
36510C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, UNIMED, NORPPF.
36511C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
36512C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
36513C     LANGUAGE--ANSI FORTRAN (1977)
36514C     REFERENCES--FILLIBEN, 'TECHNIQUES FOR TAIL LENGTH ANALYSIS',
36515C                 PROCEEDINGS OF THE EIGHTEENTH CONFERENCE
36516C                 ON THE DESIGN OF EXPERIMENTS IN ARMY RESEARCH
36517C                 DEVELOPMENT AND TESTING (ABERDEEN, MARYLAND,
36518C                 OCTOBER, 1972), PAGES 425-450.
36519C               --HAHN AND SHAPIRO, STATISTICAL METHODS IN ENGINEERING,
36520C                 1967, PAGES 260-308.
36521C     WRITTEN BY--JAMES J. FILLIBEN
36522C                 STATISTICAL ENGINEERING DIVISION
36523C                 INFORMATION TECHNOLOGY LABORATORY
36524C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
36525C                 GAITHERSBURG, MD 20899-8980
36526C                 PHONE--301-975-2855
36527C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36528C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36529C     LANGUAGE--ANSI FORTRAN (1966)
36530C     VERSION NUMBER--82.6
36531C     ORIGINAL VERSION (AS A SEPARATE SUBROUTINE)--JULY      1972.
36532C     UPDATED         --JULY      1981.
36533C     UPDATED         --AUGUST    1981.
36534C     UPDATED         --NOVEMBER  1981.
36535C     UPDATED         --MAY       1982.
36536C     UPDATED         --JUNE      1990. TEMPORARY ARRAYS TO GARBAGE COMMON
36537C     UPDATED         --JULY      2019. TWEAK SCRATCH SPACE
36538C
36539C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36540C
36541      CHARACTER*4 IWRITE
36542      CHARACTER*4 IBUGA3
36543      CHARACTER*4 IERROR
36544C
36545      CHARACTER*4 ISUBN1
36546      CHARACTER*4 ISUBN2
36547C
36548C---------------------------------------------------------------------
36549C
36550      DIMENSION X(*)
36551      DIMENSION Y(*)
36552C
36553C-----COMMON----------------------------------------------------------
36554C
36555      INCLUDE 'DPCOP2.INC'
36556C
36557C-----START POINT-----------------------------------------------------
36558C
36559      ISUBN1='STWS'
36560      ISUBN2='    '
36561      IERROR='NO'
36562C
36563      EWILKS=0.0
36564      SDWILK=0.0
36565C
36566      IF(IBUGA3.EQ.'ON')THEN
36567        WRITE(ICOUT,999)
36568  999   FORMAT(1X)
36569        CALL DPWRST('XXX','BUG ')
36570        WRITE(ICOUT,51)
36571   51   FORMAT('***** AT THE BEGINNING OF STWS--')
36572        CALL DPWRST('XXX','BUG ')
36573        WRITE(ICOUT,52)IBUGA3,N,IUPPER
36574   52   FORMAT('IBUGA3,N,IUPPER = ',A4,2X,2I8)
36575        CALL DPWRST('XXX','BUG ')
36576        DO55I=1,N
36577         WRITE(ICOUT,56)I,X(I)
36578   56    FORMAT('I,X(I) = ',I8,G15.7)
36579         CALL DPWRST('XXX','BUG ')
36580   55   CONTINUE
36581      ENDIF
36582C
36583C               ********************************************
36584C               **  STEP 1--                              **
36585C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36586C               ********************************************
36587C
36588      AN=N
36589C
36590      IF(N.LT.1 .OR. N.GT.IUPPER)THEN
36591        IERROR='YES'
36592        WRITE(ICOUT,999)
36593        CALL DPWRST('XXX','BUG ')
36594        WRITE(ICOUT,111)
36595  111   FORMAT('***** ERROR IN STWS--')
36596        CALL DPWRST('XXX','BUG ')
36597        WRITE(ICOUT,112)
36598  112   FORMAT('      THE NUMBER OF OBSERVATIONS IN THE RESPONSE ',
36599     1         'VARIABLE')
36600        CALL DPWRST('XXX','BUG ')
36601        WRITE(ICOUT,114)
36602  114   FORMAT('      FOR WHICH THE STANDARDIZED WILK-SHAPIRO')
36603        CALL DPWRST('XXX','BUG ')
36604        WRITE(ICOUT,115)
36605  115   FORMAT('      STATISTIC IS TO BE COMPUTED')
36606        CALL DPWRST('XXX','BUG ')
36607        WRITE(ICOUT,116)IUPPER
36608  116   FORMAT('      MUST BE BETWEEN 1 AND ',I8,' (INCLUSIVELY).')
36609        CALL DPWRST('XXX','BUG ')
36610        WRITE(ICOUT,117)
36611  117   FORMAT('      SUCH WAS NOT THE CASE HERE.')
36612        CALL DPWRST('XXX','BUG ')
36613        WRITE(ICOUT,118)N
36614  118   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
36615        CALL DPWRST('XXX','BUG ')
36616        GOTO9000
36617      ENDIF
36618C
36619      IF(N.EQ.1)THEN
36620        YSTWS=0.0
36621        IF(IFEEDB.EQ.'ON')THEN
36622          WRITE(ICOUT,999)
36623          CALL DPWRST('XXX','BUG ')
36624          WRITE(ICOUT,121)
36625  121     FORMAT('***** WARNING IN STWS--')
36626          CALL DPWRST('XXX','BUG ')
36627          WRITE(ICOUT,123)
36628  123     FORMAT('      THE NUMBER OF OBSERVATIONS IS ONE.')
36629          CALL DPWRST('XXX','BUG ')
36630          GOTO9000
36631        ENDIF
36632      ENDIF
36633C
36634      HOLD=X(1)
36635      DO135I=2,N
36636        IF(X(I).NE.HOLD)GOTO139
36637  135 CONTINUE
36638      WRITE(ICOUT,999)
36639      CALL DPWRST('XXX','BUG ')
36640      WRITE(ICOUT,121)
36641      CALL DPWRST('XXX','BUG ')
36642      WRITE(ICOUT,136)HOLD
36643  136 FORMAT('      THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
36644      CALL DPWRST('XXX','BUG ')
36645      YSTWS=0.0
36646      GOTO9000
36647  139 CONTINUE
36648C
36649C               ********************************
36650C               **  STEP 2--                  **
36651C               **  COMPUTE THE               **
36652C               **  WILK-SHAPIRO STATISTIC    **
36653C               ********************************
36654C
36655      CALL SORT(X,N,Y)
36656C
36657      AL=LOG10(AN)
36658      GAMMA=.327511+.058212*AL-.009776*AL*AL
36659C
36660      SUM=0.0
36661      DO100I=1,N
36662        SUM=SUM+Y(I)
36663  100 CONTINUE
36664      YBAR=SUM/AN
36665C
36666      SUM=0.0
36667      DO200I=1,N
36668        SUM=SUM+(Y(I)-YBAR)**2
36669  200 CONTINUE
36670      BVAR=SUM/AN
36671      BS=0.0
36672      IF(BVAR.GT.0.0)BS=SQRT(BVAR)
36673C
36674      SUM=0.0
36675      IF(N.LE.20)ARG=N
36676      IF(N.GT.20)ARG=N+1
36677      ASUBN=SQRT((1.0+(1.0/(4.0*ARG)))/SQRT(ARG))
36678      ASUB1=-ASUBN
36679      SUM=SUM+ASUB1*Y(1)+ASUBN*Y(N)
36680      IF(N.GT.2)THEN
36681        NM1=N-1
36682        DO500I=2,NM1
36683          AI=I
36684          PI=(AI-GAMMA)/(AN-2.0*GAMMA+1.0)
36685          CALL NORPPF(PI,EI)
36686          COEFI =2.0*EI  /SQRT(-2.722+4.083*AN)
36687          SUM=SUM+COEFI*Y(I)
36688  500   CONTINUE
36689      ENDIF
36690      WILKSH=SUM*SUM/(AN*BS*BS)
36691C
36692C               ********************************************************
36693C               **  STEP 3--                                          **
36694C               **  COMPUTE THE EXPECTED VALUE AND STANDARD DEVIATION **
36695C               **  OF THE WILK-SHAPIRO STATISTIC UNDER THE NORMALITY **
36696C               **  ASSUMPTION                                        **
36697C               **  REFERENCE--JJF APPROXIMATION TO MOMENTS           **
36698C               **             ON PAGE 601 OF BIOMETRIKA (1965)       **
36699C               ********************************************************
36700C
36701      IF(N.LE.2)EWILKS=1.0
36702      IF(N.EQ.3)EWILKS=.9135
36703      IF(N.EQ.4)EWILKS=.9012
36704      IF(N.GE.5)EWILKS=.9026+(AN-5.0)/(44.608+13.593*SQRT(AN)+10.267*AN)
36705C
36706      IF(N.LE.2)SDWILK=1.0
36707      IF(N.EQ.3)SDWILK=.0755
36708      IF(N.EQ.4)SDWILK=.0719
36709      IF(N.GE.5)SDWILK=.0670+(AN-5.0)/(-42.368-5.026*SQRT(AN)-14.925*AN)
36710      YSTWS=(WILKSH-EWILKS)/SDWILK
36711C
36712C               *******************************
36713C               **  STEP 4--                 **
36714C               **  WRITE OUT A LINE         **
36715C               **  OF SUMMARY INFORMATION.  **
36716C               *******************************
36717C
36718      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
36719        WRITE(ICOUT,999)
36720        CALL DPWRST('XXX','BUG ')
36721        WRITE(ICOUT,811)
36722  811   FORMAT('THE STANDARDIZED WILK-SHAPIRO STATISTIC')
36723        CALL DPWRST('XXX','BUG ')
36724        WRITE(ICOUT,812)N,YSTWS
36725  812   FORMAT('OF THE ',I8,' OBSERVATIONS = ',E15.7)
36726        CALL DPWRST('XXX','BUG ')
36727      ENDIF
36728C
36729C               *****************
36730C               **  STEP 90--  **
36731C               **  EXIT.      **
36732C               *****************
36733C
36734 9000 CONTINUE
36735      IF(IBUGA3.EQ.'ON')THEN
36736        WRITE(ICOUT,999)
36737        CALL DPWRST('XXX','BUG ')
36738        WRITE(ICOUT,9011)
36739 9011   FORMAT('***** AT THE END       OF STWS--')
36740        CALL DPWRST('XXX','BUG ')
36741        WRITE(ICOUT,9015)YSTWS,IERROR
36742 9015   FORMAT('YSTWS,IERROR = ',G15.7,2X,A4)
36743        CALL DPWRST('XXX','BUG ')
36744      ENDIF
36745C
36746      RETURN
36747      END
36748      SUBROUTINE SUBSAM(Y1,Y2,N1,N2,IWRITE,
36749     1                  Y3,N3,IBUGA3,ISUBRO,IERROR)
36750C
36751C     PURPOSE--EXTRACT A RANDOM SUBSAMPLE OF THE DATA IN Y1(.) BASED
36752C              ON THE INDICES IN Y2(.).
36753C              NOTE--CONTRARY TO BOOTSS, N2 NEED NOT BE THE SAME AS N1.
36754C
36755C     INPUT  ARGUMENTS--Y1     =  ORIGINAL SAMPLE
36756C                     --Y2     =  INDEX FOR RANDOM SUBSAMPLE
36757C     OUTPUT ARGUMENTS--Y3     =  RANDOM SUBSAMPLE
36758C
36759C     NOTE--IT IS PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y3(.)
36760C           BEING IDENTICAL TO EITHER OF THE INPUT VECTORS Y1(.) OR Y2(.)
36761C     NOTE--IF AN ELEMENT OF THE INPUT INDEX (Y2) IS SMALLER THAN 1
36762C           OR LARGER THAN N1, THEN THIS WILL BE INTERPRETED AS
36763C           A NON-OPERATION.
36764C     WRITTEN BY--JAMES J. FILLIBEN
36765C                 STATISTICAL ENGINEERING DIVISION
36766C                 INFORMATION TECHNOLOGY LABORATORY
36767C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36768C                 GAITHERSBURG, MD 20899-8980
36769C                 PHONE--301-975-2855
36770C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36771C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36772C     LANGUAGE--ANSI FORTRAN (1977)
36773C     VERSION NUMBER--90/2
36774C     ORIGINAL VERSION--JANUARY  1990.
36775C
36776C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36777C
36778      CHARACTER*4 IWRITE
36779      CHARACTER*4 IBUGA3
36780      CHARACTER*4 ISUBRO
36781      CHARACTER*4 IERROR
36782C
36783      CHARACTER*4 ISUBN1
36784      CHARACTER*4 ISUBN2
36785C
36786C---------------------------------------------------------------------
36787C
36788      INCLUDE 'DPCOPA.INC'
36789C
36790      DIMENSION Y1(*)
36791      DIMENSION Y2(*)
36792      DIMENSION Y3(*)
36793C
36794C-----COMMON----------------------------------------------------------
36795C
36796      INCLUDE 'DPCOP2.INC'
36797C
36798C-----START POINT-----------------------------------------------------
36799C
36800      ISUBN1='SUBS'
36801      ISUBN2='AM  '
36802      IERROR='NO'
36803C
36804      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'BSAM')THEN
36805        WRITE(ICOUT,999)
36806  999   FORMAT(1X)
36807        CALL DPWRST('XXX','BUG ')
36808        WRITE(ICOUT,51)
36809   51   FORMAT('***** AT THE BEGINNING OF SUBSAM--')
36810        CALL DPWRST('XXX','BUG ')
36811        WRITE(ICOUT,52)IBUGA3,ISUBRO,IWRITE,N1,N2
36812   52   FORMAT('IBUGA3,ISUBRO,IWRITE,N1,N2 = ',3(A4,2X),2I8)
36813        CALL DPWRST('XXX','BUG ')
36814        DO55I=1,N1
36815          WRITE(ICOUT,56)I,Y1(I)
36816   56     FORMAT('I,Y1(I) = ',I8,G15.7)
36817          CALL DPWRST('XXX','BUG ')
36818   55   CONTINUE
36819        DO65I=1,N2
36820          WRITE(ICOUT,66)I,Y2(I)
36821   66     FORMAT('I,Y2(I) = ',I8,G15.7)
36822          CALL DPWRST('XXX','BUG ')
36823   65   CONTINUE
36824      ENDIF
36825C
36826C               *************************************
36827C               **  CONSTRUCT A   RANDOM SUBSAMPLE **
36828C               *************************************
36829C
36830C               ********************************************
36831C               **  STEP 11--                             **
36832C               **  CHECK NUMBER OF INPUT OBSERVATIONS.   **
36833C               ********************************************
36834C
36835      IF(N1.LT.1)THEN
36836        IERROR='YES'
36837        WRITE(ICOUT,999)
36838        CALL DPWRST('XXX','BUG ')
36839        WRITE(ICOUT,1111)
36840 1111   FORMAT('***** ERROR IN SUBSAMPLE--')
36841        CALL DPWRST('XXX','BUG ')
36842        WRITE(ICOUT,1112)
36843 1112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
36844     1         'VARIABLE')
36845        CALL DPWRST('XXX','BUG ')
36846        WRITE(ICOUT,1115)
36847 1115   FORMAT('      MUST BE 1 OR LARGER.  SUCH WAS NOT THE CASE ',
36848     1         'HERE.')
36849        CALL DPWRST('XXX','BUG ')
36850        WRITE(ICOUT,1117)N1
36851 1117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8)
36852        CALL DPWRST('XXX','BUG ')
36853        GOTO9000
36854      ENDIF
36855C
36856      IF(N2.LT.1)THEN
36857        IERROR='YES'
36858        WRITE(ICOUT,999)
36859        CALL DPWRST('XXX','BUG ')
36860        WRITE(ICOUT,1111)
36861        CALL DPWRST('XXX','BUG ')
36862        WRITE(ICOUT,1122)
36863 1122   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE INDEX ',
36864     1         'VARIABLE')
36865        CALL DPWRST('XXX','BUG ')
36866        WRITE(ICOUT,1115)
36867        CALL DPWRST('XXX','BUG ')
36868        WRITE(ICOUT,1127)N2
36869 1127   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8)
36870        CALL DPWRST('XXX','BUG ')
36871        GOTO9000
36872      ENDIF
36873C
36874      J=0
36875      DO1300I=1,N2
36876        INDEX=INT(Y2(I)+0.1)
36877        IF(INDEX.LT.1.OR.INDEX.GT.N1)GOTO1300
36878        J=J+1
36879        Y3(J)=Y1(INDEX)
36880 1300 CONTINUE
36881      N3=J
36882C
36883C               *****************
36884C               **  STEP 90--  **
36885C               **  EXIT.      **
36886C               *****************
36887C
36888 9000 CONTINUE
36889C
36890      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'BSAM')THEN
36891        WRITE(ICOUT,999)
36892        CALL DPWRST('XXX','BUG ')
36893        WRITE(ICOUT,9011)
36894 9011   FORMAT('***** AT THE END       OF SUBSAM--')
36895        CALL DPWRST('XXX','BUG ')
36896        WRITE(ICOUT,9013)IERROR,N3
36897 9013   FORMAT('IERROR,N3 = ',A4,2X,I8)
36898        CALL DPWRST('XXX','BUG ')
36899        IF(N3.GE.1)THEN
36900          DO9041I=1,N3
36901            WRITE(ICOUT,9042)I,Y3(I)
36902 9042       FORMAT('I,Y3(I) = ',I8,G15.7)
36903            CALL DPWRST('XXX','BUG ')
36904 9041     CONTINUE
36905        ENDIF
36906      ENDIF
36907C
36908      RETURN
36909      END
36910      SUBROUTINE SUFIT (XBAR, SD, RB1, B2, GAMMA, DELTA, XLAM, XI)
36911C
36912C        ALGORITHM AS 99.1  APPL. STATIST. (1976) VOL.25, P.180
36913C
36914C        FINDS PARAMETERS OF JOHNSON SU CURVE WITH
36915C        GIVEN FIRST FOUR MOMENTS
36916C
36917      REAL XBAR, SD, RB1, B2, GAMMA, DELTA, XLAM, XI, TOL, B1,
36918     $  B3, W, Y, W1, WM1, Z, V, A, B, X, ZERO, ONE, TWO, THREE,
36919     $  FOUR, SIX, SEVEN, EIGHT, NINE, TEN, HALF, ONE5, TWO8,
36920CCCCC$  SIXTEN, ZABS, ZEXP, ZLOG, ZSIGN, ZSQRT
36921     $  SIXTEN, ZABS, ZEXP, ZLOG, ZSQRT
36922C
36923      DATA TOL /0.01/
36924      DATA ZERO,  ONE,  TWO,  THREE, FOUR,  SIX, SEVEN,
36925     $    EIGHT, NINE,  TEN, SIXTEN, HALF, ONE5,  TWO8
36926     $     /0.0,  1.0,  2.0,    3.0,  4.0,  6.0,   7.0,
36927     $      8.0,  9.0, 10.0,   16.0,  0.5,  1.5,   2.8/
36928C
36929      ZABS(X) = ABS(X)
36930      ZEXP(X) = EXP(X)
36931      ZLOG(X) = LOG(X)
36932CCCCC ZSIGN(X, Y) = SIGN(X, Y)
36933      ZSQRT(X) = SQRT(X)
36934C
36935      B1 = RB1 * RB1
36936      B3 = B2 - THREE
36937C
36938C        W IS FIRST ESTIMATE OF EXP(DELTA ** (-2))
36939C
36940      W = ZSQRT(TWO * B2 - TWO8 * B1 - TWO)
36941      W = ZSQRT(W-ONE)
36942      IF (ZABS(RB1) .GT. TOL) GOTO 10
36943C
36944C        SYMMETRICAL CASE - RESULTS ARE KNOWN
36945C
36946      Y = ZERO
36947      GOTO 20
36948C
36949C        JOHNSON ITERATION (USING Y FOR HIS M)
36950C
36951   10 W1 = W + ONE
36952      WM1 = W - ONE
36953      Z = W1 * B3
36954      V = W * (SIX + W * (THREE + W))
36955      A = EIGHT * (WM1 * (THREE + W * (SEVEN + V)) - Z)
36956      B = SIXTEN * (WM1 * (SIX + V) - B3)
36957      Y = (ZSQRT(A * A - TWO * B * (WM1 * (THREE + W *
36958     $  (NINE + W * (TEN + V))) - TWO * W1 * Z)) - A) / B
36959      Z = Y * WM1 * (FOUR * (W + TWO) * Y + THREE * W1 * W1) ** 2 /
36960     $  (TWO * (TWO * Y + W1) ** 3)
36961      V = W * W
36962      W = ZSQRT(ONE - TWO * (ONE5 - B2 + (B1 *
36963     $  (B2 - ONE5 - V * (ONE + HALF * V))) / Z))
36964      W = ZSQRT(W-ONE)
36965      IF (ZABS(B1 - Z) .GT. TOL) GOTO 10
36966C
36967C        END OF ITERATION
36968C
36969      Y = Y / W
36970      Y = ZLOG(ZSQRT(Y) + ZSQRT(Y + ONE))
36971      IF (RB1 .GT. ZERO) Y = -Y
36972   20 X = ZSQRT(ONE / ZLOG(W))
36973      DELTA = X
36974      GAMMA = Y * X
36975      Y = ZEXP(Y)
36976      Z = Y * Y
36977      X = SD / ZSQRT(HALF * (W - ONE) * (HALF * W *
36978     $  (Z + ONE / Z) + ONE))
36979      XLAM = X
36980      XI = (HALF * ZSQRT(W) * (Y - ONE / Y)) * X + XBAR
36981      RETURN
36982      END
36983      SUBROUTINE SUMDP(X,N,IWRITE,XSUM,IBUGA3,IERROR)
36984C
36985C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE SUM
36986C              OF THE DATA IN THE INPUT VECTOR X.
36987C              THE SAMPLE SUM = SUM OF ALL OBSERVATIONS IN X.
36988C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
36989C                                (UNSORTED OR SORTED) OBSERVATIONS.
36990C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
36991C                                IN THE VECTOR X.
36992C     OUTPUT ARGUMENTS--XSUM   = THE SINGLE PRECISION VALUE OF THE
36993C                                COMPUTED SAMPLE SUM.
36994C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
36995C             SAMPLE SUM.
36996C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
36997C                   OF N FOR THIS SUBROUTINE.
36998C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36999C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
37000C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
37001C     LANGUAGE--ANSI FORTRAN (1977)
37002C     REFERENCES--KENDALL AND STUART, THE ADVANCED THEORY OF
37003C                 STATISTICS, VOLUME 2, EDITION 1, 1961, PAGE 4.
37004C               --MOOD AND GRABLE, INTRODUCTION TO THE THEORY
37005C                 OF STATISTICS, EDITION 2, 1963, PAGE 146.
37006C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
37007C                 ANALYSIS, EDITION 2, 1957, PAGE 14.
37008C     WRITTEN BY--JAMES J. FILLIBEN
37009C                 STATISTICAL ENGINEERING DIVISION
37010C                 INFORMATION TECHNOLOGY LABORATORY
37011C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
37012C                 GAITHERSBURG, MD 20899-8980
37013C                 PHONE--301-975-2855
37014C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37015C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
37016C     LANGUAGE--ANSI FORTRAN (1966)
37017C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
37018C                          DENOTED BY QUOTES RATHER THAN NH.
37019C     VERSION NUMBER--82.6
37020C     ORIGINAL VERSION--JUNE      1972.
37021C     UPDATED         --SEPTEMBER 1975.
37022C     UPDATED         --NOVEMBER  1975.
37023C     UPDATED         --OCTOBER   1978.
37024C     UPDATED         --JUNE      1979.
37025C     UPDATED         --JULY      1979.
37026C     UPDATED         --AUGUST    1981.
37027C     UPDATED         --MAY       1982.
37028C     UPDATED         --MAY       2008. ALL RESPONSE ELEMENTS NOT
37029C                                       EQUAL SHOULD NOT BE CONSIDERED
37030C                                       AN ERROR (OR EVEN A WARNING)
37031C     UPDATED         --NOVEMBER  2009. RENAME "SUM" TO "SUMDP".  THIS
37032C                                       IS SIMPLY TO AVOID COMPILATION
37033C                                       ISSUES WITH VERSION 11 OF THE
37034C                                       INTEL COMPILER ON WINDOWS
37035C                                       (CONFLICTS WITH INTRINSIC
37036C                                       SUM FUNCTION EVEN IF AN EXTERNAL
37037C                                       STATEMENT IS USED)
37038C
37039C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37040C
37041      CHARACTER*4 IWRITE
37042      CHARACTER*4 IBUGA3
37043      CHARACTER*4 IERROR
37044C
37045      CHARACTER*4 ISUBN1
37046      CHARACTER*4 ISUBN2
37047C
37048C---------------------------------------------------------------------
37049C
37050      DOUBLE PRECISION DX
37051      DOUBLE PRECISION DSUM
37052C
37053      DIMENSION X(*)
37054C
37055C-----COMMON----------------------------------------------------------
37056C
37057      INCLUDE 'DPCOP2.INC'
37058C
37059C-----START POINT-----------------------------------------------------
37060C
37061      ISUBN1='SUMD'
37062      ISUBN2='P   '
37063      IERROR='NO'
37064C
37065      IF(IBUGA3.EQ.'ON')THEN
37066        WRITE(ICOUT,999)
37067  999   FORMAT(1X)
37068        CALL DPWRST('XXX','BUG ')
37069        WRITE(ICOUT,51)
37070   51   FORMAT('***** AT THE BEGINNING OF SUMDP--')
37071        CALL DPWRST('XXX','BUG ')
37072        WRITE(ICOUT,52)IBUGA3,N
37073   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
37074        CALL DPWRST('XXX','BUG ')
37075        DO55I=1,N
37076          WRITE(ICOUT,56)I,X(I)
37077   56     FORMAT('I,X(I) = ',I8,G15.7)
37078          CALL DPWRST('XXX','BUG ')
37079   55   CONTINUE
37080      ENDIF
37081C
37082C               *******************
37083C               **  COMPUTE SUM  **
37084C               *******************
37085C
37086C               ********************************************
37087C               **  STEP 1--                              **
37088C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
37089C               ********************************************
37090C
37091      AN=N
37092C
37093      IF(N.LT.1)THEN
37094        IERROR='YES'
37095        WRITE(ICOUT,999)
37096        CALL DPWRST('XXX','BUG ')
37097        WRITE(ICOUT,111)
37098  111   FORMAT('***** ERROR IN SUM--')
37099        CALL DPWRST('XXX','BUG ')
37100        WRITE(ICOUT,112)
37101  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
37102        CALL DPWRST('XXX','BUG ')
37103        WRITE(ICOUT,115)
37104  115   FORMAT('      VARIABLE IS LESS THAN ONE.')
37105        CALL DPWRST('XXX','BUG ')
37106        WRITE(ICOUT,117)N
37107  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,'.')
37108        CALL DPWRST('XXX','BUG ')
37109        GOTO9000
37110      ENDIF
37111C
37112CCCCC IF(N.EQ.1)GOTO120
37113CCCCC GOTO129
37114CC120 CONTINUE
37115CCCCC WRITE(ICOUT,999)
37116CCCCC CALL DPWRST('XXX','BUG ')
37117CCCCC WRITE(ICOUT,121)
37118CC121 FORMAT('***** NON-FATAL DIAGNOSTIC IN SUM--',
37119CCCCC1'THE 2ND INPUT ARGUMENT (N) HAS THE VALUE 1')
37120CCCCC CALL DPWRST('XXX','BUG ')
37121CCCCC XSUM=X(1)
37122CCCCC GOTO9000
37123CC129 CONTINUE
37124C
37125CCCCC HOLD=X(1)
37126CCCCC DO135I=2,N
37127CCCCC IF(X(I).NE.HOLD)GOTO139
37128CC135 CONTINUE
37129CCCCC WRITE(ICOUT,999)
37130CCCCC CALL DPWRST('XXX','BUG ')
37131CCCCC WRITE(ICOUT,136)HOLD
37132CC136 FORMAT('***** NON-FATAL DIAGNOSTIC IN SUM--',
37133CCCCC1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
37134CCCCC CALL DPWRST('XXX','BUG ')
37135CCCCC XSUM=AN*HOLD
37136CCCCC GOTO9000
37137CC139 CONTINUE
37138C
37139C               ************************
37140C               **  STEP 2--          **
37141C               **  COMPUTE THE SUM.  **
37142C               ************************
37143C
37144      DSUM=0.0D0
37145      DO200I=1,N
37146      DX=X(I)
37147      DSUM=DSUM+DX
37148  200 CONTINUE
37149      XSUM=DSUM
37150C
37151C               *******************************
37152C               **  STEP 3--                 **
37153C               **  WRITE OUT A LINE         **
37154C               **  OF SUMMARY INFORMATION.  **
37155C               *******************************
37156C
37157      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
37158        WRITE(ICOUT,999)
37159        CALL DPWRST('XXX','BUG ')
37160        WRITE(ICOUT,811)N,XSUM
37161  811   FORMAT('THE SUM OF THE ',I8,' OBSERVATIONS = ',E15.7)
37162        CALL DPWRST('XXX','BUG ')
37163      ENDIF
37164C
37165C               *****************
37166C               **  STEP 90--  **
37167C               **  EXIT.      **
37168C               *****************
37169C
37170 9000 CONTINUE
37171      IF(IBUGA3.EQ.'ON')THEN
37172        WRITE(ICOUT,999)
37173        CALL DPWRST('XXX','BUG ')
37174        WRITE(ICOUT,9011)
37175 9011   FORMAT('***** AT THE END       OF SUMDP--')
37176        CALL DPWRST('XXX','BUG ')
37177        WRITE(ICOUT,9012)IERROR,XSUM
37178 9012   FORMAT('IERROR,XSUM = ',A4,2X,G15.7)
37179        CALL DPWRST('XXX','BUG ')
37180      ENDIF
37181C
37182      RETURN
37183      END
37184      SUBROUTINE SUMRAW(Y,N,IDIST,IFLAG,
37185     1XMEAN,XVAR,XSD,XMIN,XMAX,
37186     1ISUBRO,IBUGA3,IERROR)
37187C
37188C     PURPOSE--THIS ROUTINE COMPUTES SEVERAL SUMMARY STATISTICS
37189C              FOR RAW DATA.  IN PARTICULAR, THIS IS CALLED BY
37190C              MOST OF THE DISTRIBUTIONAL FITTING ROUTINES.
37191C              CURRENTLY, IT COMPUTES:
37192C
37193C                  MEAN
37194C                  VARIANCE
37195C                  STANDARD DEVIATION
37196C                  MINIMUM
37197C                  MAXIMUM
37198C
37199C               IN ADDITION, IF IFLAG = 1, IT WILL CHECK FOR
37200C               NEGATIVE NUMBERS OR IF IFLAG = 2 IT WILL CHECK FOR
37201C               NON-POSITIVE NUMBERS.
37202C
37203C     WRITTEN BY--JAMES J. FILLIBEN
37204C                 STATISTICAL ENGINEERING DIVISION
37205C                 INFORMATION TECHNOLOGY LABORATORY
37206C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37207C                 GAITHERSBURG, MD 20899-8980
37208C                 PHONE--301-975-2855
37209C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37210C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37211C     LANGUAGE--ANSI FORTRAN (1977)
37212C     VERSION NUMBER--2009/3
37213C     ORIGINAL VERSION--MARCH     2009.
37214C
37215C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37216C
37217      CHARACTER*40 IDIST
37218C
37219      CHARACTER*4 ISUBRO
37220      CHARACTER*4 IBUGA3
37221      CHARACTER*4 IERROR
37222C
37223      CHARACTER*4 IWRITE
37224      CHARACTER*4 ISUBN1
37225      CHARACTER*4 ISUBN2
37226      CHARACTER*4 ISTEPN
37227C
37228      DIMENSION Y(*)
37229C
37230      INCLUDE 'DPCOP2.INC'
37231C
37232C-----START POINT-----------------------------------------------------
37233C
37234      ISUBN1='SUMR'
37235      ISUBN2='AW  '
37236      IERROR='NO'
37237      IWRITE='OFF'
37238C
37239      XMEAN=CPUMIN
37240      XSD=CPUMIN
37241      XVAR=CPUMIN
37242      XMIN=CPUMIN
37243      XMAX=CPUMIN
37244C
37245      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MRAW')THEN
37246        WRITE(ICOUT,999)
37247  999   FORMAT(1X)
37248        CALL DPWRST('XXX','WRIT')
37249        WRITE(ICOUT,51)
37250   51   FORMAT('**** AT THE BEGINNING OF SUMRAW--')
37251        CALL DPWRST('XXX','WRIT')
37252        WRITE(ICOUT,55)N
37253   55   FORMAT('N = ',I8)
37254        CALL DPWRST('XXX','WRIT')
37255        DO56I=1,MIN(N,100)
37256          WRITE(ICOUT,57)I,Y(I)
37257   57     FORMAT('I,Y(I) = ',I8,G15.7)
37258          CALL DPWRST('XXX','WRIT')
37259   56   CONTINUE
37260      ENDIF
37261C
37262C               ********************************************
37263C               **  STEP 1--                              **
37264C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
37265C               ********************************************
37266C
37267      ISTEPN='1'
37268      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37269     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37270C
37271      IF(N.LE.2)THEN
37272        WRITE(ICOUT,999)
37273        CALL DPWRST('XXX','WRIT')
37274        WRITE(ICOUT,1111)IDIST
37275 1111   FORMAT('***** ERROR IN ',A60)
37276        CALL DPWRST('XXX','WRIT')
37277        WRITE(ICOUT,1113)
37278 1113   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
37279     1         'VARIABLE IS LESS THAN 3.')
37280        CALL DPWRST('XXX','WRIT')
37281        WRITE(ICOUT,1115)N
37282 1115   FORMAT('SAMPLE SIZE = ',I8)
37283        CALL DPWRST('XXX','WRIT')
37284        IERROR='YES'
37285        GOTO9000
37286      ENDIF
37287C
37288C               ******************************************
37289C               **  STEP 2--                            **
37290C               **  COMPUTE THE SUMMARY STATISTICS      **
37291C               ******************************************
37292C
37293      ISTEPN='2'
37294      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MRAW')
37295     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37296C
37297      IERROR='NO'
37298      IWRITE='OFF'
37299C
37300      CALL MEAN(Y,N,IWRITE,XMEAN,IBUGA3,IERROR)
37301      CALL SD(Y,N,IWRITE,XSD,IBUGA3,IERROR)
37302      CALL MINIM(Y,N,IWRITE,XMIN,IBUGA3,IERROR)
37303      CALL MAXIM(Y,N,IWRITE,XMAX,IBUGA3,IERROR)
37304      XVAR=XSD**2
37305C
37306C               ******************************************
37307C               **  STEP 3--                            **
37308C               **  CHECK FOR NEGATIVE VALUES           **
37309C               ******************************************
37310C
37311      IF(IFLAG.EQ.1 .AND. XMIN.LT.0.0)THEN
37312        DO3100I=1,N
37313          IF(Y(I).LT.0.0)THEN
37314            WRITE(ICOUT,1111)IDIST
37315            CALL DPWRST('XXX','WRIT')
37316            WRITE(ICOUT,3113)I,Y(I)
37317 3113       FORMAT('      ROW ',I8,' IS NEGATIVE.  THE VALUE IS ',
37318     1             G15.7)
37319            CALL DPWRST('XXX','WRIT')
37320            IERROR='YES'
37321            GOTO9000
37322          ENDIF
37323 3100   CONTINUE
37324      ENDIF
37325C
37326      IF(IFLAG.EQ.2 .AND. XMIN.LE.0.0)THEN
37327        DO3200I=1,N
37328          IF(Y(I).LE.0.0)THEN
37329            WRITE(ICOUT,1111)IDIST
37330            CALL DPWRST('XXX','WRIT')
37331            WRITE(ICOUT,3213)I,Y(I)
37332 3213       FORMAT('      ROW ',I8,' IS NON-POSITIVE.  THE VALUE IS ',
37333     1             G15.7)
37334            CALL DPWRST('XXX','WRIT')
37335            IERROR='YES'
37336            GOTO9000
37337          ENDIF
37338 3200   CONTINUE
37339      ENDIF
37340C
37341 9000 CONTINUE
37342      RETURN
37343      END
37344      SUBROUTINE SUMGRP(Y,X,N,IDIST,IFLAG1,IFLAG2,
37345     1                  TEMP1,TEMP2,TEMP3,MAXNXT,
37346     1                  XMEAN,XVAR,XSD,XMIN,XMAX,NTOT,
37347     1                  ISUBRO,IBUGA3,IERROR)
37348C
37349C     PURPOSE--THIS ROUTINE COMPUTES SEVERAL SUMMARY STATISTICS
37350C              FOR GROUPED DATA.  IN PARTICULAR, THIS IS CALLED BY
37351C              MOST OF THE DISTRIBUTIONAL FITTING ROUTINES.
37352C              CURRENTLY, IT COMPUTES:
37353C
37354C                  MEAN
37355C                  VARIANCE
37356C                  STANDARD DEVIATION
37357C                  MINIMUM
37358C                  MAXIMUM
37359C
37360C               ALSO DO THE FOLLOWING:
37361C
37362C               1) SORT BY THE FREQUENCY VARIABLE
37363C               2) CHECK FOR NEGATIVE FREQUENCIES
37364C               3) CHECK FOR NEGATIVE CLASS VALUES
37365C                  (ONLY IF IFLAG1 = 1)
37366C               4) COPY X AND Y TO TEMP3 ARRAY (FOR
37367C                  OPTIMIZATION ROUTINE)
37368C                  (ONLY IF IFLAG2 = 1)
37369C
37370C     WRITTEN BY--ALAN HECKERT
37371C                 STATISTICAL ENGINEERING DIVISION
37372C                 INFORMATION TECHNOLOGY LABORATORY
37373C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37374C                 GAITHERSBURG, MD 20899-8980
37375C                 PHONE--301-975-2899
37376C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37377C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37378C     LANGUAGE--ANSI FORTRAN (1977)
37379C     VERSION NUMBER--2009/3
37380C     ORIGINAL VERSION--MARCH     2009.
37381C
37382C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37383C
37384      CHARACTER*40 IDIST
37385C
37386      CHARACTER*4 ISUBRO
37387      CHARACTER*4 IBUGA3
37388      CHARACTER*4 IERROR
37389C
37390      CHARACTER*4 IWRITE
37391      CHARACTER*4 ISUBN1
37392      CHARACTER*4 ISUBN2
37393      CHARACTER*4 ISTEPN
37394C
37395      DIMENSION Y(*)
37396      DIMENSION X(*)
37397      DIMENSION TEMP1(*)
37398      DIMENSION TEMP2(*)
37399      DIMENSION TEMP3(*)
37400C
37401      INCLUDE 'DPCOP2.INC'
37402C
37403C-----START POINT-----------------------------------------------------
37404C
37405      ISUBN1='SUMG'
37406      ISUBN2='RP  '
37407C
37408      IERROR='NO'
37409      IWRITE='OFF'
37410      XMEAN=CPUMIN
37411      XSD=CPUMIN
37412      XVAR=CPUMIN
37413      XMIN=CPUMIN
37414      XMAX=CPUMIN
37415C
37416      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGRP')THEN
37417        WRITE(ICOUT,999)
37418  999   FORMAT(1X)
37419        CALL DPWRST('XXX','WRIT')
37420        WRITE(ICOUT,51)
37421   51   FORMAT('**** AT THE BEGINNING OF SUMGRP--')
37422        CALL DPWRST('XXX','WRIT')
37423        WRITE(ICOUT,55)N,MAXNXT
37424   55   FORMAT('N,MAXNXT = ',2I8)
37425        CALL DPWRST('XXX','WRIT')
37426        DO56I=1,N
37427          WRITE(ICOUT,57)I,X(I),Y(I)
37428   57     FORMAT('I,X(I),Y(I) = ',I8,2G15.7)
37429          CALL DPWRST('XXX','WRIT')
37430   56   CONTINUE
37431      ENDIF
37432C
37433C               ********************************************
37434C               **  STEP 1--                              **
37435C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
37436C               ********************************************
37437C
37438      ISTEPN='1'
37439      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37440     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37441C
37442      IF(N.LE.0)THEN
37443        WRITE(ICOUT,999)
37444        CALL DPWRST('XXX','WRIT')
37445        WRITE(ICOUT,1111)IDIST
37446 1111   FORMAT('***** ERROR IN ',A40)
37447        CALL DPWRST('XXX','WRIT')
37448        WRITE(ICOUT,1113)
37449 1113   FORMAT('      THE NUMBER OF FREQUENCY CLASSES IS LESS ',
37450     1         'THAN 1.')
37451        CALL DPWRST('XXX','WRIT')
37452        WRITE(ICOUT,1115)N
37453 1115   FORMAT('NUMBER OF FREQUENCY CLASSES = ',I8)
37454        CALL DPWRST('XXX','WRIT')
37455        IERROR='YES'
37456        GOTO9000
37457      ENDIF
37458C
37459      CALL SORTC(X,Y,N,TEMP1,TEMP2)
37460      ATOT=0.0
37461      DO1210I=1,N
37462        X(I)=TEMP1(I)
37463        Y(I)=TEMP2(I)
37464        ATOT=ATOT + Y(I)
37465 1210 CONTINUE
37466      NTOT=INT(ATOT+0.1)
37467C
37468      DO1220I=1,N
37469        IF(Y(I).LT.0.0)THEN
37470          WRITE(ICOUT,999)
37471          CALL DPWRST('XXX','WRIT')
37472          WRITE(ICOUT,1111)IDIST
37473          CALL DPWRST('XXX','WRIT')
37474          WRITE(ICOUT,1223)
37475 1223     FORMAT('      A NEGATIVE FREQUENCY WAS SPECIFIED.')
37476          CALL DPWRST('XXX','WRIT')
37477          WRITE(ICOUT,1225)I,Y(I)
37478 1225     FORMAT('      ROW ',I8,' (AFTER SORTING) HAS FREQUENCY ',
37479     1           G15.7)
37480          CALL DPWRST('XXX','WRIT')
37481          IERROR='YES'
37482          GOTO9000
37483        ENDIF
37484 1220 CONTINUE
37485C
37486      IF(IFLAG1.EQ.1 .AND. X(1).LT.0.0)THEN
37487        WRITE(ICOUT,999)
37488        CALL DPWRST('XXX','WRIT')
37489        WRITE(ICOUT,1111)IDIST
37490        CALL DPWRST('XXX','WRIT')
37491        WRITE(ICOUT,1233)
37492 1233   FORMAT('      THE VALUE FOR THE FIRST CLASS IS NEGATIVE.')
37493        CALL DPWRST('XXX','WRIT')
37494        WRITE(ICOUT,1235)I,X(I)
37495 1235   FORMAT('      ROW ',I8,' (AFTER SORTING) HAS CLASS VALUE ',
37496     1         G15.7)
37497        CALL DPWRST('XXX','WRIT')
37498        IERROR='YES'
37499        GOTO9000
37500      ENDIF
37501C
37502C               ******************************************
37503C               **  STEP 2--                            **
37504C               **  COMPUTE THE SUMMARY STATISTICS      **
37505C               ******************************************
37506C
37507      ISTEPN='2'
37508      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGRP')
37509     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37510C
37511      IERROR='NO'
37512      IWRITE='OFF'
37513C
37514      XMIN=X(1)
37515      XMAX=X(N)
37516      CALL WEMEAN(X,Y,N,IWRITE,XMEAN,IBUGA3,IERROR)
37517      CALL WESD(X,Y,N,IWRITE,XSD,IBUGA3,IERROR)
37518      XVAR=XSD**2
37519C
37520      IF(IFLAG2.EQ.1)THEN
37521        IINDX=MAXNXT/2
37522        IF(N.LE.IINDX)THEN
37523          DO2210I=1,N
37524            TEMP3(I)=Y(I)
37525            TEMP3(IINDX+I)=X(I)
37526 2210     CONTINUE
37527        ENDIF
37528      ENDIF
37529C
37530 9000 CONTINUE
37531C
37532      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGRP')THEN
37533        WRITE(ICOUT,999)
37534        CALL DPWRST('XXX','WRIT')
37535        WRITE(ICOUT,9051)
37536 9051   FORMAT('**** AT THE END OF SUMGRP--')
37537        CALL DPWRST('XXX','WRIT')
37538        WRITE(ICOUT,9055)NTOT,XMEAN,XSD,XMIN,XMAX
37539 9055   FORMAT('NTOT,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
37540        CALL DPWRST('XXX','WRIT')
37541      ENDIF
37542C
37543      RETURN
37544      END
37545      SUBROUTINE SUMGR2(Y,XLOW,XHIGH,N,IDIST,IFLAG1,IFLAG2,
37546     1                  TEMP1,TEMP2,TEMP3,MAXNXT,
37547     1                  XMEAN,XVAR,XSD,XMIN,XMAX,NTOT,
37548     1                  ISUBRO,IBUGA3,IERROR)
37549C
37550C     PURPOSE--THIS ROUTINE COMPUTES SEVERAL SUMMARY STATISTICS
37551C              FOR GROUPED DATA WHERE THE BINS ARE NOT NECESSARILY
37552C              EQUI-SPACED.  IN PARTICULAR, THIS IS CALLED BY
37553C              MOST OF THE DISTRIBUTIONAL FITTING ROUTINES.
37554C              CURRENTLY, IT COMPUTES:
37555C
37556C                  MEAN
37557C                  VARIANCE
37558C                  STANDARD DEVIATION
37559C                  MINIMUM
37560C                  MAXIMUM
37561C
37562C               ALSO DO THE FOLLOWING:
37563C
37564C               1) SORT BY THE FREQUENCY VARIABLE
37565C               2) CHECK FOR NEGATIVE FREQUENCIES
37566C               3) CHECK FOR NEGATIVE CLASS VALUES
37567C                  (ONLY IF IFLAG1 = 1)
37568C
37569C     WRITTEN BY--JAMES J. FILLIBEN
37570C                 STATISTICAL ENGINEERING DIVISION
37571C                 INFORMATION TECHNOLOGY LABORATORY
37572C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37573C                 GAITHERSBURG, MD 20899-8980
37574C                 PHONE--301-975-2855
37575C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37576C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37577C     LANGUAGE--ANSI FORTRAN (1977)
37578C     VERSION NUMBER--2009/11
37579C     ORIGINAL VERSION--NOVEMBER  2009.
37580C
37581C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37582C
37583      CHARACTER*40 IDIST
37584C
37585      CHARACTER*4 ISUBRO
37586      CHARACTER*4 IBUGA3
37587      CHARACTER*4 IERROR
37588C
37589      CHARACTER*4 IWRITE
37590      CHARACTER*4 ISUBN1
37591      CHARACTER*4 ISUBN2
37592      CHARACTER*4 ISTEPN
37593C
37594      DIMENSION Y(*)
37595      DIMENSION XLOW(*)
37596      DIMENSION XHIGH(*)
37597      DIMENSION TEMP1(*)
37598      DIMENSION TEMP2(*)
37599      DIMENSION TEMP3(*)
37600C
37601      INCLUDE 'DPCOP2.INC'
37602C
37603C-----START POINT-----------------------------------------------------
37604C
37605      ISUBN1='SUMG'
37606      ISUBN2='R2  '
37607      IERROR='NO'
37608      IWRITE='OFF'
37609C
37610      XMEAN=CPUMIN
37611      XSD=CPUMIN
37612      XVAR=CPUMIN
37613      XMIN=CPUMIN
37614      XMAX=CPUMIN
37615C
37616      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGRP')THEN
37617        WRITE(ICOUT,999)
37618  999   FORMAT(1X)
37619        CALL DPWRST('XXX','WRIT')
37620        WRITE(ICOUT,51)
37621   51   FORMAT('**** AT THE BEGINNING OF SUMGR2--')
37622        CALL DPWRST('XXX','WRIT')
37623        WRITE(ICOUT,55)N,MAXNXT,IFLAG1,IFLAG2
37624   55   FORMAT('N,MAXNXT,IFLAG1,IFLAG2 = ',2I8,2I5)
37625        CALL DPWRST('XXX','WRIT')
37626        DO56I=1,N
37627          WRITE(ICOUT,57)I,XLOW(I),XHIGH(I),Y(I)
37628   57     FORMAT('I,XLOW(I),XHIGH(I),Y(I) = ',I8,3G15.7)
37629          CALL DPWRST('XXX','WRIT')
37630   56   CONTINUE
37631      ENDIF
37632C
37633C               ********************************************
37634C               **  STEP 1--                              **
37635C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
37636C               ********************************************
37637C
37638      ISTEPN='1A'
37639      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37640     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37641C
37642C     1A: CHECK THAT NUMBER OF FREQUENCY CLASSES IS POSITIVE
37643C
37644      IF(N.LE.0)THEN
37645        WRITE(ICOUT,999)
37646        CALL DPWRST('XXX','WRIT')
37647        WRITE(ICOUT,1111)IDIST
37648 1111   FORMAT('***** ERROR IN ',A40)
37649        CALL DPWRST('XXX','WRIT')
37650        WRITE(ICOUT,1113)
37651 1113   FORMAT('      THE NUMBER OF FREQUENCY CLASSES IS LESS ',
37652     1         'THAN 1.')
37653        CALL DPWRST('XXX','WRIT')
37654        WRITE(ICOUT,1115)N
37655 1115   FORMAT('NUMBER OF FREQUENCY CLASSES = ',I8)
37656        CALL DPWRST('XXX','WRIT')
37657        IERROR='YES'
37658        GOTO9000
37659      ENDIF
37660C
37661      ISTEPN='1B'
37662      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37663     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37664C
37665C     1B: SORT THE DATA BY XLOW
37666C
37667      CALL SORTC(XLOW,Y,N,TEMP1,TEMP2)
37668      CALL SORTC(XLOW,XHIGH,N,TEMP1,TEMP3)
37669      NTOT=0
37670      DO1210I=1,N
37671        XLOW(I)=TEMP1(I)
37672        XHIGH(I)=TEMP3(I)
37673        Y(I)=TEMP2(I)
37674        ITEMP1=INT(Y(I)+0.5)
37675        Y(I)=REAL(ITEMP1)
37676        NTOT=NTOT + ITEMP1
37677 1210 CONTINUE
37678C
37679      ISTEPN='1C'
37680      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37681     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37682C
37683C     1C: CHECK FOR NEGATIVE FREQUENCIES, UPPER CLASS VALUE
37684C         GREATER THAN LOWER CLASS VALUE
37685C
37686      DO1220I=1,N
37687        IF(Y(I).LT.0.0)THEN
37688          WRITE(ICOUT,999)
37689          CALL DPWRST('XXX','WRIT')
37690          WRITE(ICOUT,1111)IDIST
37691          CALL DPWRST('XXX','WRIT')
37692          WRITE(ICOUT,1221)
37693 1221     FORMAT('      A NEGATIVE FREQUENCY WAS SPECIFIED.')
37694          CALL DPWRST('XXX','WRIT')
37695          WRITE(ICOUT,1223)I,Y(I)
37696 1223     FORMAT('      ROW ',I8,' (AFTER SORTING) HAS FREQUENCY ',
37697     1           G15.7)
37698          CALL DPWRST('XXX','WRIT')
37699          IERROR='YES'
37700          GOTO9000
37701        ELSEIF(XLOW(I).GE.XHIGH(I))THEN
37702          WRITE(ICOUT,999)
37703          CALL DPWRST('XXX','WRIT')
37704          WRITE(ICOUT,1111)IDIST
37705          CALL DPWRST('XXX','WRIT')
37706          WRITE(ICOUT,1226)
37707 1226     FORMAT('      A LOWER CLASS LIMIT IS GREATER THAN OR EQUAL')
37708          CALL DPWRST('XXX','WRIT')
37709          WRITE(ICOUT,1227)
37710 1227     FORMAT('      TO THE CORRESPONDING UPPER CLASS LIMIT.')
37711          CALL DPWRST('XXX','WRIT')
37712          WRITE(ICOUT,1228)I,XLOW(I),XHIGH(I)
37713 1228     FORMAT('      ROW ',I8,' (AFTER SORTING) HAS LOWER CLASS ',
37714     1           ',LIMIT ',G15.7)
37715          CALL DPWRST('XXX','WRIT')
37716          WRITE(ICOUT,1229)XHIGH(I)
37717 1229     FORMAT('      UPPER CLASS LIMIT ',G15.7)
37718          CALL DPWRST('XXX','WRIT')
37719          IERROR='YES'
37720          GOTO9000
37721        ENDIF
37722 1220 CONTINUE
37723C
37724      ISTEPN='1D'
37725      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'MLNB')
37726     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37727C
37728C     1D: CHECK FOR NEGATIVE FREQUENCY CLASS LIMITS
37729C
37730C         IFLAG1 = 1  => FREQUENCY CLASSES MUST BE POSITIVE
37731C
37732      IF(IFLAG1.EQ.1 .AND. XLOW(1).LT.0.0)THEN
37733        WRITE(ICOUT,999)
37734        CALL DPWRST('XXX','WRIT')
37735        WRITE(ICOUT,1111)IDIST
37736        CALL DPWRST('XXX','WRIT')
37737        WRITE(ICOUT,1233)
37738 1233   FORMAT('      THE LOWEST CLASS VALUE IS NEGATIVE.')
37739        CALL DPWRST('XXX','WRIT')
37740        WRITE(ICOUT,1235)I,XLOW(I)
37741 1235   FORMAT('      ROW ',I8,' (AFTER SORTING) HAS CLASS VALUE ',
37742     1         G15.7)
37743        CALL DPWRST('XXX','WRIT')
37744        IERROR='YES'
37745        GOTO9000
37746      ENDIF
37747C
37748C               ******************************************
37749C               **  STEP 2--                            **
37750C               **  COMPUTE THE SUMMARY STATISTICS      **
37751C               ******************************************
37752C
37753      ISTEPN='2'
37754      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGRP')
37755     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
37756C
37757      IERROR='NO'
37758      IWRITE='OFF'
37759C
37760      XMIN=XLOW(1)
37761      XMAX=XHIGH(N)
37762C
37763      DSUM1=0.0D0
37764      DO2330I=1,N
37765        TAU=(XLOW(I) + XHIGH(I))/2.0
37766        DSUM1=DSUM1 + DBLE(Y(I)*TAU)
37767 2330 CONTINUE
37768      XMEAN=REAL(DSUM1/DBLE(NTOT))
37769C
37770      DSUM1=0.0D0
37771      DO2350I=1,N
37772        TAU=(XHIGH(I) + XLOW(I))/2.0
37773        DTERM1=DBLE(TAU - XMEAN)
37774        DSUM1= DSUM1 + DBLE(Y(I))*(DTERM1**2)
377752350  CONTINUE
37776      XVAR=REAL(DSUM1/DBLE(NTOT))
37777      XSD=SQRT(XVAR)
37778C
37779 9000 CONTINUE
37780C
37781      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MGR2')THEN
37782        WRITE(ICOUT,999)
37783        CALL DPWRST('XXX','WRIT')
37784        WRITE(ICOUT,9051)
37785 9051   FORMAT('**** AT THE END OF SUMGR2--')
37786        CALL DPWRST('XXX','WRIT')
37787        WRITE(ICOUT,9055)NTOT,XMEAN,XSD,XMIN,XMAX
37788 9055   FORMAT('NTOT,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
37789        CALL DPWRST('XXX','WRIT')
37790      ENDIF
37791C
37792      RETURN
37793      END
37794      REAL FUNCTION SUNIF(IR)
37795CCCCC DATAPLOT NOTE (5/2002): CURRENTLY, ONLY USE THE UNIFORM
37796CCCCC RANDOM NUMBER GENERATOR FROM THIS PACKAGE (ACTIVATE BY:
37797CCCCC SET RANDOM NUMBER GENERATOR MULTIPLICATIVE CONGRUENTIAL
37798C
37799C     ALGORITHM 599, COLLECTED ALGORITHMS FROM ACM.
37800C     ALGORITHM APPEARED IN ACM-TRANS. MATH. SOFTWARE, VOL.9, NO. 2,
37801C     JUN., 1983, P. 255-257.
37802C**********************************************************************CSUN   10
37803C**********************************************************************CSUN   20
37804C**********************************************************************CSUN   30
37805C                                                                      CSUN   40
37806C                                                                      CSUN   50
37807C                                                                      CSUN   60
37808C     F O R T R A N  SOFTWARE PACKAGE FOR RANDOM NUMBER GENERATION     CSUN   70
37809C                                                                      CSUN   80
37810C                                                                      CSUN   90
37811C                                                                      CSUN  100
37812C**********************************************************************CSUN  110
37813C**********************************************************************CSUN  120
37814C**********************************************************************CSUN  130
37815C                                                                       SUN  140
37816C                                                                       SUN  150
37817C                                                                       SUN  160
37818C     CONTENTS:                                                         SUN  170
37819C                                                                       SUN  180
37820C     1) SUNIF  -  0,1 -UNIFORM DISTRIBUTION                            SUN  190
37821C                                                                       SUN  200
37822C     2) SEXPO  - (STANDARD-) EXPONENTIAL DISTRIBUTION                  SUN  210
37823C                                                                       SUN  220
37824C     3) SNORM  - (STANDARD-) NORMAL DISTRIBUTION                       SUN  230
37825C                                                                       SUN  240
37826C     4) SGAMMA - (STANDARD-) GAMMA DISTRIBUTION                        SUN  250
37827C                                                                       SUN  260
37828C     5) KPOISS - POISSON DISTRIBUTION                                  SUN  270
37829C                                                                       SUN  280
37830C                                                                       SUN  290
37831C     THIS PACKAGE CONSTITUTES A FORTRAN-77 DOCUMENTATION OF A SET OF   SUN  300
37832C     ASSEMBLER FUNCTIONS FOR SAMPLING FROM THE ABOVE DISTRIBUTIONS.    SUN  310
37833C     ALL ROUTINES MAKE AMPLE USE OF BINARY REPRESENTATIONS OF NUMBERS, SUN  320
37834C     THEY ARE AMONG THE MOST ACCURATE AND FAST SAMPLING FUNCTIONS      SUN  330
37835C     KNOWN. THE FORTRAN PROGRAMS BELOW YIELD THE SAME RANDOM NUMBER    SUN  340
37836C     SEQUENCES AS THE ONES FROM OUR ASSEMBLER PACKAGE, BUT THEY ARE    SUN  350
37837C     OF COURSE MUCH SLOWER (BY FACTORS 5-8 ON OUR SIEMENS 7760         SUN  360
37838C     COMPUTER.)                                                        SUN  370
37839C     THE SET OF ROUTINES WILL ALSO BE ACCEPTABLE TO FORTRAN IV         SUN  380
37840C     COMPILERS WHICH ALLOW DATA STATEMENTS FOR ARRAYS WITHOUT          SUN  390
37841C     IMPLICIT DO-LOOPS.                                                SUN  400
37842C                                                                       SUN  410
37843C                                                                       SUN  420
37844C     REMARKS:                                                          SUN  430
37845C                                                                       SUN  440
37846C     -  NO CARE IS TAKEN TO ENSURE THAT THE PARAMETER VALUES LIE       SUN  450
37847C        IN THE ALLOWED RANGE (E.G. A/MU > 0.0 FOR SGAMMA/KPOISS).      SUN  460
37848C                                                                       SUN  470
37849C     -  THE PARAMETER 'IR' MUST BE SET TO SOME  4*K+1 > 0  BEFORE      SUN  480
37850C        THE FIRST CALL OF ANY OF THE GENERATORS. THEREAFTER IR         SUN  490
37851C        MUST NOT BE ALTERED UNTIL A NEW INITIALIZATION IS DESIRED.     SUN  500
37852C                                                                       SUN  510
37853C     -  THE PACKAGE PROVIDES RANDOM DEVIATES OF 6-7 DIGITS ACCURACY.   SUN  520
37854C        ON MORE ACCURATE COMPUTERS THE CONSTANTS IN SEXPO, SNORM,      SUN  530
37855C        SGAMMA AND KPOISS OUGHT TO BE ADJUSTED ACCORDING TO LOCAL      SUN  540
37856C        COMMENTS OR WITH THE AID OF THE TABLES IN THE LITERATURE       SUN  550
37857C        QUOTED AT THE BEGINNING OF EACH FUNCTION.                      SUN  560
37858C                                                                       SUN  570
37859C                                                                       SUN  580
37860C**********************************************************************CSUN  590
37861C**********************************************************************CSUN  600
37862C                                                                      CSUN  610
37863C                                                                      CSUN  620
37864C       0 , 1   - U N I F O R M  DISTRIBUTION                          CSUN  630
37865C                                                                      CSUN  640
37866C                                                                      CSUN  650
37867C**********************************************************************CSUN  660
37868C**********************************************************************CSUN  670
37869C                                                                      CSUN  680
37870C     FOR DETAILS SEE:                                                 CSUN  690
37871C                                                                      CSUN  700
37872C               AHRENS, J.H., DIETER, U. AND GRUBE, A.                 CSUN  710
37873C               PSEUDO-RANDOM NUMBERS:  A NEW PROPOSAL                 CSUN  720
37874C                     FOR THE CHOICE OF MULTIPLICATORS                 CSUN  730
37875C               COMPUTING, 6 (1970), 121 - 138                         CSUN  740
37876C                                                                      CSUN  750
37877C**********************************************************************CSUN  760
37878C                                                                       SUN  770
37879      DOUBLE PRECISION R,FACTOR,TWO28
37880      SAVE R
37881C
37882C     FACTOR - INTEGER OF THE FORM 8*K+5 AS CLOSE AS POSSIBLE
37883C              TO  2**26 * (SQRT(5)-1)/2     (GOLDEN SECTION)
37884C     TWO28  = 2**28  (I.E. 28 SIGNIFICANT BITS FOR DEVIATES)
37885C
37886      DATA FACTOR /41475557.0D0/, TWO28 /268435456.0D0/
37887C
37888C     RETURNS SAMPLE U FROM THE  0,1 -UNIFORM DISTRIBUTION
37889C     BY A MULTIPLICATIVE CONGRUENTIAL GENERATOR OF THE FORM
37890C        R := R * FACTOR (MOD 1) .
37891C     IN THE FIRST CALL R IS INITIALIZED TO
37892C        R := IR / 2**28 ,
37893C     WHERE IR MUST BE OF THE FORM  IR = 4*K+1.
37894C     THEN R ASSUMES ALL VALUES  0 < (4*K+1)/2**28 < 1 DURING
37895C     A FULL PERIOD 2**26 OF SUNIF.
37896C     THE PARAMETER IR IS USED ONLY IN THE FIRST CALL FOR
37897C     INITIALIZATION OF SUNIF. THEREAFTER (WHEN NEGATIVE)
37898C     IR BECOMES A DUMMY VARIABLE.
37899C
37900      IF (IR .GE. 0) GO TO 1
37901C
37902C     STANDARD CASE:  SAMPLING
37903C
37904      R=DMOD(R*FACTOR,1.0D0)
37905      SUNIF=SNGL(R)
37906      RETURN
37907C
37908C     FIRST CALL: INITIALIZATION
37909C
379101     R=DBLE(FLOAT(IR))/TWO28
37911      R=DMOD(R*FACTOR,1.0D0)
37912      SUNIF=SNGL(R)
37913      IR=-1
37914      RETURN
37915      END
37916      SUBROUTINE SWILK (INIT, X, N, N1, N2, A, W, PW, IFAULT)
37917C
37918C        ALGORITHM AS R94 APPL. STATIST. (1995) VOL.44, NO.4
37919C
37920C        Calculates the Shapiro-Wilk W test and its significance level
37921C
37922      INTEGER N, N1, N2, IFAULT
37923      REAL X(*), A(*), PW, W
37924      REAL C1(6), C2(6), C3(4), C4(4), C5(4), C6(3), C7(2)
37925      REAL C8(2), C9(2), G(2)
37926      REAL Z90, Z95, Z99, ZM, ZSS, BF1, XX90, XX95, ZERO, ONE, TWO
37927      REAL THREE, SQRTH, QTR, TH, SMALL, PI6, STQR
37928      REAL SUMM2, SSUMM2, FAC, RSN, AN, AN25, A1, A2, DELTA, RANGE
37929      REAL SA, SX, SSX, SSA, SAX, ASA, XSX, SSASSX, W1, Y, XX, XI
37930      REAL GAMMA, M, S, LD, BF, Z90F, Z95F, Z99F, ZFM, ZSD, ZBAR
37931C
37932C        Auxiliary routines
37933C
37934      REAL PPND, POLY
37935      DOUBLE PRECISION ALNORM
37936C
37937      INTEGER NCENS, NN2, I, I1, J
37938      LOGICAL INIT, UPPER
37939C
37940      DATA C1 /0.0E0, 0.221157E0, -0.147981E0, -0.207119E1,
37941     *     0.4434685E1, -0.2706056E1/
37942      DATA C2 /0.0E0, 0.42981E-1, -0.293762E0, -0.1752461E1,
37943     *     0.5682633E1, -0.3582633E1/
37944      DATA C3 /0.5440E0, -0.39978E0, 0.25054E-1, -0.6714E-3/
37945      DATA C4 /0.13822E1, -0.77857E0, 0.62767E-1, -0.20322E-2/
37946      DATA C5 /-0.15861E1, -0.31082E0, -0.83751E-1, 0.38915E-2/
37947      DATA C6 /-0.4803E0, -0.82676E-1, 0.30302E-2/
37948      DATA C7 /0.164E0, 0.533E0/
37949      DATA C8 /0.1736E0, 0.315E0/
37950      DATA C9 /0.256E0, -0.635E-2/
37951      DATA G  /-0.2273E1, 0.459E0/
37952      DATA Z90, Z95, Z99 /0.12816E1, 0.16449E1, 0.23263E1/
37953      DATA ZM, ZSS /0.17509E1, 0.56268E0/
37954      DATA BF1 /0.8378E0/, XX90, XX95 /0.556E0, 0.622E0/
37955      DATA ZERO /0.0E0/, ONE/1.0E0/, TWO/2.0E0/, THREE/3.0E0/
37956      DATA SQRTH /0.70711E0/, QTR/0.25E0/, TH/0.375E0/, SMALL/1E-19/
37957      DATA PI6 /0.1909859E1/, STQR/0.1047198E1/, UPPER/.TRUE./
37958C
37959      PW  =  ONE
37960      IF (W .GE. ZERO) W = ONE
37961      AN = N
37962      IFAULT = 3
37963      NN2 = N/2
37964      IF (N2 .LT. NN2) RETURN
37965      IFAULT = 1
37966      IF (N .LT. 3) RETURN
37967C
37968C        If INIT is false, calculates coefficients for the test
37969C
37970      IF (.NOT. INIT) THEN
37971        IF (N .EQ. 3) THEN
37972           A(1) = SQRTH
37973        ELSE
37974           AN25 = AN + QTR
37975           SUMM2 = ZERO
37976           DO 30 I = 1, N2
37977              A(I) = PPND((REAL(I) - TH)/AN25,IFAULT)
37978              SUMM2 = SUMM2 + A(I) ** 2
3797930          CONTINUE
37980           SUMM2 = SUMM2 * TWO
37981           SSUMM2 = SQRT(SUMM2)
37982           RSN = ONE / SQRT(AN)
37983           A1 = POLY(C1, 6, RSN) - A(1) / SSUMM2
37984C
37985C        Normalize coefficients
37986C
37987           IF (N .GT. 5) THEN
37988              I1 = 3
37989              A2 = -A(2)/SSUMM2 + POLY(C2,6,RSN)
37990              FAC = SQRT((SUMM2 - TWO * A(1) ** 2 - TWO *
37991     *               A(2) ** 2)/(ONE - TWO * A1 ** 2 - TWO * A2 ** 2))
37992              A(1) = A1
37993              A(2) = A2
37994           ELSE
37995              I1 = 2
37996              FAC = SQRT((SUMM2 - TWO * A(1) ** 2)/
37997     *                   (ONE - TWO * A1 ** 2))
37998              A(1) = A1
37999           END IF
38000           DO 40 I = I1, NN2
38001              A(I) = -A(I)/FAC
38002   40       CONTINUE
38003        END IF
38004        INIT = .TRUE.
38005      END IF
38006      IF (N1 .LT. 3) RETURN
38007      NCENS = N - N1
38008      IFAULT = 4
38009      IF (NCENS .LT. 0 .OR. (NCENS .GT. 0 .AND. N .LT. 20)) RETURN
38010      IFAULT = 5
38011      DELTA = FLOAT(NCENS)/AN
38012      IF (DELTA .GT. 0.8) RETURN
38013C
38014C        If W input as negative, calculate significance level of -W
38015C
38016      IF (W .LT. ZERO) THEN
38017        W1 = ONE + W
38018        IFAULT = 0
38019        GOTO 70
38020      END IF
38021C
38022C        Check for zero range
38023C
38024      IFAULT = 6
38025      RANGE = X(N1) - X(1)
38026      IF (RANGE .LT. SMALL) RETURN
38027C
38028C        Check for correct sort order on range - scaled X
38029C
38030      IFAULT = 7
38031      XX = X(1)/RANGE
38032      SX = XX
38033      SA = -A(1)
38034      J = N - 1
38035      DO 50 I = 2, N1
38036        XI = X(I)/RANGE
38037CCCCC   IF (XX-XI .GT. SMALL) PRINT *,' ANYTHING'
38038        SX = SX + XI
38039        IF (I .NE. J) SA = SA + SIGN(1, I - J) * A(MIN(I, J))
38040        XX = XI
38041        J = J - 1
3804250    CONTINUE
38043      IFAULT = 0
38044      IF (N .GT. 5000) IFAULT = 2
38045C
38046C        Calculate W statistic as squared correlation
38047C        between data and coefficients
38048C
38049      SA = SA/N1
38050      SX = SX/N1
38051      SSA = ZERO
38052      SSX = ZERO
38053      SAX = ZERO
38054      J = N
38055      DO 60 I = 1, N1
38056        IF (I .NE. J) THEN
38057           ASA = SIGN(1, I - J) * A(MIN(I, J)) - SA
38058        ELSE
38059           ASA = -SA
38060        END IF
38061        XSX = X(I)/RANGE - SX
38062        SSA = SSA + ASA * ASA
38063        SSX = SSX + XSX * XSX
38064        SAX = SAX + ASA * XSX
38065        J = J - 1
38066   60 CONTINUE
38067C
38068C        W1 equals (1-W) claculated to avoid excessive rounding error
38069C        for W very near 1 (a potential problem in very large samples)
38070C
38071      SSASSX = SQRT(SSA * SSX)
38072      W1 = (SSASSX - SAX) * (SSASSX + SAX)/(SSA * SSX)
38073   70 W = ONE - W1
38074C
38075C        Calculate significance level for W (exact for N=3)
38076C
38077      IF (N .EQ. 3) THEN
38078         PW = PI6 * (ASIN(SQRT(W)) - STQR)
38079         RETURN
38080      END IF
38081      Y = LOG(W1)
38082      XX = LOG(AN)
38083      M = ZERO
38084      S = ONE
38085      IF (N .LE. 11) THEN
38086        GAMMA = POLY(G, 2, AN)
38087        IF (Y .GE. GAMMA) THEN
38088           PW = SMALL
38089           RETURN
38090        END IF
38091        Y = -LOG(GAMMA - Y)
38092        M = POLY(C3, 4, AN)
38093        S = EXP(POLY(C4, 4, AN))
38094      ELSE
38095        M = POLY(C5, 4, XX)
38096        S = EXP(POLY(C6, 3, XX))
38097      END IF
38098      IF (NCENS .GT. 0) THEN
38099C
38100C        Censoring by proportion NCENS/N.  Calculate mean and sd
38101C        of normal equivalent deviate of W.
38102C
38103        LD = -LOG(DELTA)
38104        BF = ONE + XX * BF1
38105        Z90F = Z90 + BF * POLY(C7, 2, XX90 ** XX) ** LD
38106        Z95F = Z95 + BF * POLY(C8, 2, XX95 ** XX) ** LD
38107        Z99F = Z99 + BF * POLY(C9, 2, XX) ** LD
38108C
38109C        Regress Z90F,...,Z99F on normal deviates Z90,...,Z99 to get
38110C        pseudo-mean and pseudo-sd of z as the slope and intercept
38111C
38112        ZFM = (Z90F + Z95F + Z99F)/THREE
38113        ZSD = (Z90*(Z90F-ZFM)+Z95*(Z95F-ZFM)+Z99*(Z99F-ZFM))/ZSS
38114        ZBAR = ZFM - ZSD * ZM
38115        M = M + ZBAR * S
38116        S = S * ZSD
38117      END IF
38118      PW = REAL(ALNORM(DBLE((Y - M)/S), UPPER))
38119C
38120      RETURN
38121      END
38122      SUBROUTINE SYMINV(N, LOWINV, DET)
38123*
38124*     Computes lower symmetric inverse and determinant in situ
38125*
38126      INTEGER I, II, N
38127      DOUBLE PRECISION LOWINV(*), DET
38128      CALL CHOLSK(N, LOWINV)
38129      DET = 1
38130      II = 0
38131      DO 100 I = 1,N
38132         II = II + I
38133         DET = DET*LOWINV(II)
38134  100 CONTINUE
38135      DET = DET*DET
38136      CALL CHOLNV(N, LOWINV)
38137      CALL CHOLPI(N, LOWINV)
38138C
38139      RETURN
38140      END
38141      DOUBLE PRECISION FUNCTION SYNCH1(XVALUE)
38142C
38143C   DESCRIPTION:
38144C
38145C      This function calculates the synchrotron radiation function
38146C      defined as
38147C
38148C         SYNCH1(x) = x * Integral{x to inf} K(5/3)(t) dt,
38149C
38150C      where K(5/3) is a modified Bessel function of order 5/3.
38151C
38152C      The code uses Chebyshev expansions, the coefficients of which
38153C      are given to 20 decimal places.
38154C
38155C
38156C   ERROR RETURNS:
38157C
38158C      The function is undefined if x < 0.0. If XVALUE < 0.0,
38159C      an error message is printed and the function returns
38160C      the value 0.0.
38161C
38162C
38163C   MACHINE-DEPENDENT CONSTANTS:
38164C
38165C      NTERM1 - INTEGER - The no. of terms needed from the array
38166C                         ASYNC1. The recommended value is such that
38167C                            ABS(ASYNC1(NTERM1)) < EPS/100.
38168C
38169C      NTERM2 - INTEGER - The no. of terms needed from the array
38170C                         ASYNC2. The recommended value is such that
38171C                            ABS(ASYNC2(NTERM2)) < EPS/100.
38172C
38173C      NTERM3 - INTEGER - The no. of terms needed from the array
38174C                         ASYNCA. The recommended value is such that
38175C                            ABS(ASYNCA(NTERM3)) < EPS/100.
38176C
38177C      XLOW - DOUBLE PRECISION - The value below which
38178C                        SYNCH1(x) = 2.14952.. * (x**(1/3))
38179C                    to machine precision. The recommended value
38180C                    is     sqrt (8*EPSNEG)
38181C
38182C      XHIGH1 - DOUBLE PRECISION - The value above which
38183C                          SYNCH1(x) = 0.0
38184C                      to machine precision. The recommended value
38185C                      is     -8*LN(XMIN)/7
38186C
38187C      XHIGH2 - DOUBLE PRECISION - The value of LN(XMIN). This is used
38188C                      to prevent underflow in calculations
38189C                      for large x.
38190C
38191C     For values of EPS, EPSNEG, and XMIN refer to the file MACHCON.TXT
38192C
38193C     The machine-dependent constants are computed internally by
38194C     using the D1MACH subroutine.
38195C
38196C
38197C   INTRINSIC FUNCTIONS USED:
38198C
38199C      EXP , LOG , SQRT
38200C
38201C
38202C   OTHER MISCFUN SUBROUTINES USED:
38203C
38204C          CHEVAL , ERRPRN, D1MACH
38205C
38206C
38207C   AUTHOR:
38208C          Dr. Allan J. MacLeod,
38209C          Dept. of Mathematics and Statistics,
38210C          University of Paisley,
38211C          Paisley,
38212C          SCOTLAND
38213C          PA1 2BE
38214C
38215C          ( e-mail:  macl_ms0@paisley.ac.uk )
38216C
38217C
38218C   LATEST UPDATE:
38219C                  23 January, 1996
38220C
38221C
38222      INTEGER NTERM1,NTERM2,NTERM3
38223      DOUBLE PRECISION ASYNC1(0:13),ASYNC2(0:11),ASYNCA(0:24),
38224     1     CHEB1,CHEB2,CHEVAL,CONLOW,EIGHT,FOUR,HALF,
38225     2     LNRTP2,ONE,ONEHUN,PIBRT3,T,THREE,TWELVE,X,XHIGH1,
38226     3     XHIGH2,XLOW,XPOWTH,XVALUE,ZERO
38227CCCCC CHARACTER FNNAME*6,ERRMSG*14
38228C
38229C-----COMMON----------------------------------------------------------
38230C
38231      INCLUDE 'DPCOMC.INC'
38232      INCLUDE 'DPCOP2.INC'
38233C
38234CCCCC DATA FNNAME/'SYNCH1'/
38235CCCCC DATA ERRMSG/'ARGUMENT < 0.0'/
38236      DATA ZERO,HALF,ONE/ 0.0 D 0 , 0.5 D 0 , 1.0 D 0 /
38237      DATA THREE,FOUR/ 3.0 D 0 , 4.0 D 0 /
38238      DATA EIGHT,TWELVE/ 8.0 D 0 , 12.0 D 0 /
38239      DATA ONEHUN/ 100.0 D 0 /
38240      DATA CONLOW/2.14952 82415 34478 63671 D 0/
38241      DATA PIBRT3/1.81379 93642 34217 85059 D 0/
38242      DATA LNRTP2/0.22579 13526 44727 43236 D 0/
38243      DATA ASYNC1/30.36468 29825 01076 27340  D    0,
38244     1            17.07939 52774 08394 57449  D    0,
38245     2             4.56013 21335 45072 88887  D    0,
38246     3             0.54928 12467 30419 97963  D    0,
38247     4             0.37297 60750 69301 1724   D   -1,
38248     5             0.16136 24302 01041 242    D   -2,
38249     6             0.48191 67721 20370 7      D   -4,
38250     7             0.10512 42528 89384        D   -5,
38251     8             0.17463 85046 697          D   -7,
38252     9             0.22815 48654 4            D   -9,
38253     X             0.24044 3082               D  -11,
38254     1             0.20865 88                 D  -13,
38255     2             0.15167                    D  -15,
38256     3             0.94                       D  -18/
38257      DATA ASYNC2/0.44907 21623 53266 08443  D    0,
38258     1            0.89835 36779 94187 2179   D   -1,
38259     2            0.81044 57377 21512 894    D   -2,
38260     3            0.42617 16991 08916 19     D   -3,
38261     4            0.14760 96312 70746 0      D   -4,
38262     5            0.36286 33615 3998         D   -6,
38263     6            0.66634 80749 84           D   -8,
38264     7            0.94907 71655              D  -10,
38265     8            0.10791 2491               D  -11,
38266     9            0.10022 01                 D  -13,
38267     X            0.7745                     D  -16,
38268     1            0.51                       D  -18/
38269      DATA ASYNCA(0)/ 2.13293 05161 35500 09848  D    0/
38270      DATA ASYNCA(1)/ 0.74135 28649 54200 2401   D   -1/
38271      DATA ASYNCA(2)/ 0.86968 09990 99641 978    D   -2/
38272      DATA ASYNCA(3)/ 0.11703 82624 87756 921    D   -2/
38273      DATA ASYNCA(4)/ 0.16451 05798 61919 15     D   -3/
38274      DATA ASYNCA(5)/ 0.24020 10214 20640 3      D   -4/
38275      DATA ASYNCA(6)/ 0.35827 75638 93885        D   -5/
38276      DATA ASYNCA(7)/ 0.54477 47626 9837         D   -6/
38277      DATA ASYNCA(8)/ 0.83880 28561 957          D   -7/
38278      DATA ASYNCA(9)/ 0.13069 88268 416          D   -7/
38279      DATA ASYNCA(10)/0.20530 99071 44           D   -8/
38280      DATA ASYNCA(11)/0.32518 75368 8            D   -9/
38281      DATA ASYNCA(12)/0.51791 40412              D  -10/
38282      DATA ASYNCA(13)/0.83002 9881               D  -11/
38283      DATA ASYNCA(14)/0.13352 7277               D  -11/
38284      DATA ASYNCA(15)/0.21591 498                D  -12/
38285      DATA ASYNCA(16)/0.34996 73                 D  -13/
38286      DATA ASYNCA(17)/0.56994 2                  D  -14/
38287      DATA ASYNCA(18)/0.92906                    D  -15/
38288      DATA ASYNCA(19)/0.15222                    D  -15/
38289      DATA ASYNCA(20)/0.2491                     D  -16/
38290      DATA ASYNCA(21)/0.411                      D  -17/
38291      DATA ASYNCA(22)/0.67                       D  -18/
38292      DATA ASYNCA(23)/0.11                       D  -18/
38293      DATA ASYNCA(24)/0.2                        D  -19/
38294C
38295      XLOW=0.0
38296C
38297C   Start calculation
38298C
38299      X = XVALUE
38300      IF ( X .LT. ZERO ) THEN
38301CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
38302         WRITE(ICOUT,999)
38303         CALL DPWRST('XXX','BUG ')
38304         WRITE(ICOUT,101)X
38305         CALL DPWRST('XXX','BUG ')
38306         SYNCH1 = ZERO
38307         RETURN
38308      ENDIF
38309  999 FORMAT(1X)
38310  101 FORMAT('***** ERROR FROM SYNCH1--ARGUMENT MUST BE ',
38311     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
38312C
38313C   Compute the machine-dependent constants.
38314C
38315      CHEB1 = D1MACH(3)
38316      T = CHEB1 / ONEHUN
38317      IF ( X .LE. FOUR ) THEN
38318         DO 10 NTERM1 = 13 , 0 , -1
38319            IF ( ABS(ASYNC1(NTERM1)) .GT. T ) GOTO 19
38320 10      CONTINUE
38321 19      DO 20 NTERM2 = 11 , 0 , -1
38322            IF ( ABS(ASYNC2(NTERM2)) .GT. T ) GOTO 29
38323 20      CONTINUE
38324 29      XLOW = SQRT ( EIGHT * CHEB1 )
38325      ELSE
38326         DO 40 NTERM3 = 24 , 0 , -1
38327            IF ( ABS(ASYNCA(NTERM3)) .GT. T ) GOTO 49
38328 40      CONTINUE
38329 49      XHIGH2 = LOG(D1MACH(1))
38330         XHIGH1 = -EIGHT * XHIGH2 / ( EIGHT - ONE )
38331      ENDIF
38332C
38333C   Code for 0 <= x <= 4
38334C
38335      IF ( X .LE. FOUR ) THEN
38336         XPOWTH = X ** ( ONE / THREE )
38337         IF ( X .LT. XLOW ) THEN
38338            SYNCH1 = CONLOW * XPOWTH
38339         ELSE
38340            T = ( X * X / EIGHT - HALF ) - HALF
38341            CHEB1 = CHEVAL(NTERM1,ASYNC1,T)
38342            CHEB2 = CHEVAL(NTERM2,ASYNC2,T)
38343            T = XPOWTH * CHEB1 - ( XPOWTH**11 ) * CHEB2
38344            SYNCH1 = T - PIBRT3 * X
38345         ENDIF
38346      ELSE
38347         IF ( X .GT. XHIGH1 ) THEN
38348            SYNCH1 = ZERO
38349         ELSE
38350            T = ( TWELVE - X ) / ( X + FOUR )
38351            CHEB1 = CHEVAL(NTERM3,ASYNCA,T)
38352            T = LNRTP2 - X + LOG( SQRT(X) * CHEB1 )
38353            IF ( T .LT. XHIGH2 ) THEN
38354               SYNCH1 = ZERO
38355            ELSE
38356               SYNCH1 = EXP(T)
38357            ENDIF
38358         ENDIF
38359      ENDIF
38360      RETURN
38361      END
38362      DOUBLE PRECISION FUNCTION SYNCH2(XVALUE)
38363C
38364C   DESCRIPTION:
38365C
38366C      This function calculates the synchrotron radiation function
38367C      defined as
38368C
38369C         SYNCH2(x) = x * K(2/3)(x)
38370C
38371C      where K(2/3) is a modified Bessel function of order 2/3.
38372C
38373C      The code uses Chebyshev expansions, the coefficients of which
38374C      are given to 20 decimal places.
38375C
38376C
38377C   ERROR RETURNS:
38378C
38379C      The function is undefined if x < 0.0. If XVALUE < 0.0,
38380C      an error message is printed and the function returns
38381C      the value 0.0.
38382C
38383C
38384C   MACHINE-DEPENDENT CONSTANTS:
38385C
38386C      NTERM1 - INTEGER - The no. of terms needed from the array
38387C                         ASYNC1. The recommended value is such that
38388C                            ABS(ASYN21(NTERM1)) < EPS/100.
38389C
38390C      NTERM2 - INTEGER - The no. of terms needed from the array
38391C                         ASYNC2. The recommended value is such that
38392C                            ABS(ASYN22(NTERM2)) < EPS/100.
38393C
38394C      NTERM3 - INTEGER - The no. of terms needed from the array
38395C                         ASYNCA. The recommended value is such that
38396C                            ABS(ASYN2A(NTERM3)) < EPS/100.
38397C
38398C      XLOW - DOUBLE PRECISION - The value below which
38399C                        SYNCH2(x) = 1.074764... * (x**(1/3))
38400C                    to machine precision. The recommended value
38401C                    is     sqrt (8*EPSNEG)
38402C
38403C      XHIGH1 - DOUBLE PRECISION - The value above which
38404C                          SYNCH2(x) = 0.0
38405C                      to machine precision. The recommended value
38406C                      is     -8*LN(XMIN)/7
38407C
38408C      XHIGH2 - DOUBLE PRECISION - The value of LN(XMIN). This is used
38409C                      to prevent underflow in calculations
38410C                      for large x.
38411C
38412C     For values of EPS, EPSNEG, and XMIN refer to the file MACHCON.TXT
38413C
38414C     The machine-dependent constants are computed internally by
38415C     using the D1MACH subroutine.
38416C
38417C
38418C   INTRINSIC FUNCTIONS USED:
38419C
38420C      EXP , LOG , SQRT
38421C
38422C
38423C   OTHER MISCFUN SUBROUTINES USED:
38424C
38425C          CHEVAL , ERRPRN, D1MACH
38426C
38427C
38428C   AUTHOR:
38429C          Dr. Allan J. MacLeod,
38430C          Dept. of Mathematics and Statistics,
38431C          University of Paisley,
38432C          Paisley,
38433C          SCOTLAND
38434C          PA1 2BE
38435C
38436C          (e-mail:  macl_ms0@paisley.ac.uk)
38437C
38438C
38439C   LATEST UPDATE:
38440C                  23 January, 1996
38441C
38442      INTEGER NTERM1,NTERM2,NTERM3
38443      DOUBLE PRECISION ASYN21(0:14),ASYN22(0:13),ASYN2A(0:18),
38444     1     CHEB1,CHEB2,CHEVAL,CONLOW,EIGHT,FOUR,HALF,
38445     2     LNRTP2,ONE,ONEHUN,T,TEN,THREE,TWO,X,XHIGH1,
38446     3     XHIGH2,XLOW,XPOWTH,XVALUE,ZERO
38447CCCCC CHARACTER FNNAME*6,ERRMSG*14
38448C
38449C-----COMMON----------------------------------------------------------
38450C
38451      INCLUDE 'DPCOMC.INC'
38452      INCLUDE 'DPCOP2.INC'
38453C
38454CCCCC DATA FNNAME/'SYNCH2'/
38455CCCCC DATA ERRMSG/'ARGUMENT < 0.0'/
38456      DATA ZERO,HALF,ONE/ 0.0 D 0 , 0.5 D 0 , 1.0 D 0 /
38457      DATA TWO,THREE,FOUR/ 2.0 D 0 , 3.0 D 0 , 4.0 D 0 /
38458      DATA EIGHT,TEN,ONEHUN/ 8.0 D 0 , 10.0 D 0 , 100.0 D 0/
38459      DATA CONLOW/1.07476 41207 67239 31836 D 0/
38460      DATA LNRTP2/0.22579 13526 44727 43236 D 0/
38461      DATA ASYN21/38.61783 99238 43085 48014  D    0,
38462     1            23.03771 55949 63734 59697  D    0,
38463     2             5.38024 99868 33570 59676  D    0,
38464     3             0.61567 93806 99571 07760  D    0,
38465     4             0.40668 80046 68895 5843   D   -1,
38466     5             0.17296 27455 26484 141    D   -2,
38467     6             0.51061 25883 65769 9      D   -4,
38468     7             0.11045 95950 22012        D   -5,
38469     8             0.18235 53020 649          D   -7,
38470     9             0.23707 69803 4            D   -9,
38471     X             0.24887 2963               D  -11,
38472     1             0.21528 68                 D  -13,
38473     2             0.15607                    D  -15,
38474     3             0.96                       D  -18,
38475     4             0.1                        D  -19/
38476      DATA ASYN22/7.90631 48270 66080 42875  D    0,
38477     1            3.13534 63612 85342 56841  D    0,
38478     2            0.48548 79477 45371 45380  D    0,
38479     3            0.39481 66758 27237 2337   D   -1,
38480     4            0.19661 62233 48088 022    D   -2,
38481     5            0.65907 89322 93042 0      D   -4,
38482     6            0.15857 56134 98559        D   -5,
38483     7            0.28686 53011 233          D   -7,
38484     8            0.40412 02359 5            D   -9,
38485     9            0.45568 4443               D  -11,
38486     X            0.42045 90                 D  -13,
38487     1            0.32326                    D  -15,
38488     2            0.210                      D  -17,
38489     3            0.1                        D  -19/
38490      DATA ASYN2A/2.02033 70941 70713 60032  D    0,
38491     1            0.10956 23712 18074 0443   D   -1,
38492     2            0.85423 84730 11467 55     D   -3,
38493     3            0.72343 02421 32822 2      D   -4,
38494     4            0.63124 42796 26992        D   -5,
38495     5            0.56481 93141 1744         D   -6,
38496     6            0.51283 24801 375          D   -7,
38497     7            0.47196 53291 45           D   -8,
38498     8            0.43807 44214 3            D   -9,
38499     9            0.41026 81493              D  -10,
38500     X            0.38623 0721               D  -11,
38501     1            0.36613 228                D  -12,
38502     2            0.34802 32                 D  -13,
38503     3            0.33301 0                  D  -14,
38504     4            0.31856                    D  -15,
38505     5            0.3074                     D  -16,
38506     6            0.295                      D  -17,
38507     7            0.29                       D  -18,
38508     8            0.3                        D  -19/
38509C
38510      XLOW=0.0
38511C
38512C   Start calculation
38513C
38514      X = XVALUE
38515      IF ( X .LT. ZERO ) THEN
38516CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
38517         WRITE(ICOUT,999)
38518         CALL DPWRST('XXX','BUG ')
38519         WRITE(ICOUT,101)X
38520         CALL DPWRST('XXX','BUG ')
38521         SYNCH2 = ZERO
38522         RETURN
38523      ENDIF
38524  999 FORMAT(1X)
38525  101 FORMAT('***** ERROR FROM SYNCH2--ARGUMENT MUST BE ',
38526     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
38527C
38528C   Compute the machine-dependent constants.
38529C
38530      CHEB1 = D1MACH(3)
38531      T = CHEB1 / ONEHUN
38532      IF ( X .LE. FOUR ) THEN
38533         DO 10 NTERM1 = 14 , 0 , -1
38534            IF ( ABS(ASYN21(NTERM1)) .GT. T ) GOTO 19
38535 10      CONTINUE
38536 19      DO 20 NTERM2 = 13 , 0 , -1
38537            IF ( ABS(ASYN22(NTERM2)) .GT. T ) GOTO 29
38538 20      CONTINUE
38539 29      XLOW = SQRT ( EIGHT * CHEB1 )
38540      ELSE
38541         DO 40 NTERM3 = 18 , 0 , -1
38542            IF ( ABS(ASYN2A(NTERM3)) .GT. T ) GOTO 49
38543 40      CONTINUE
38544 49      XHIGH2 = LOG(D1MACH(1))
38545         XHIGH1 = -EIGHT * XHIGH2 / ( EIGHT - ONE )
38546      ENDIF
38547C
38548C   Code for 0 <= x <= 4
38549C
38550      IF ( X .LE. FOUR ) THEN
38551         XPOWTH = X ** ( ONE / THREE )
38552         IF ( X .LT. XLOW ) THEN
38553            SYNCH2 = CONLOW * XPOWTH
38554         ELSE
38555            T = ( X * X / EIGHT - HALF ) - HALF
38556            CHEB1 = CHEVAL(NTERM1,ASYN21,T)
38557            CHEB2 = CHEVAL(NTERM2,ASYN22,T)
38558            SYNCH2 = XPOWTH * CHEB1 - ( XPOWTH**5 ) * CHEB2
38559         ENDIF
38560      ELSE
38561         IF ( X .GT. XHIGH1 ) THEN
38562            SYNCH2 = ZERO
38563         ELSE
38564            T = ( TEN - X ) / ( X + TWO )
38565            CHEB1 = CHEVAL(NTERM3,ASYN2A,T)
38566            T = LNRTP2 - X + LOG( SQRT(X) * CHEB1 )
38567            IF ( T .LT. XHIGH2 ) THEN
38568               SYNCH2 = ZERO
38569            ELSE
38570               SYNCH2 = EXP(T)
38571            ENDIF
38572         ENDIF
38573      ENDIF
38574      RETURN
38575      END
38576