1      SUBROUTINE AAD(X,N,IWRITE,XTEMP,MAXNXT,XAAD,ICASE,IBUGA3,IERROR)
2C
3C     PURPOSE--THIS SUBROUTINE COMPUTES THE SAMPLE AVERAGE ABSOLUTE
4C              DEVIATION (WITH DENOMINATOR N) OF THE DATA IN THE INPUT
5C              VECTOR X.  NOTE THAT THERE ARE TWO VARIATIONS OF THIS
6C              STATISTIC:
7C
8C              1) THE SAMPLE AVERAGE ABSOLUTE DEVIATION = (THE SUM OF
9C                 THE ABSOLUTE DEVIATIONS ABOUT THE SAMPLE MEDIAN) / N).
10C
11C              2) THE SAMPLE AVERAGE ABSOLUTE DEVIATION = (THE SUM OF
12C                 THE ABSOLUTE DEVIATIONS ABOUT THE SAMPLE MEAN) / N).
13C
14C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
15C                                (UNSORTED OR SORTED) OBSERVATIONS.
16C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
17C                                IN THE VECTOR X.
18C                     --ICASE  = EITHER "MEAN" OR "MEDI" TO SPECIFY
19C                                WHICH OF THE TWO CASES TO COMPUTE.
20C     OUTPUT ARGUMENTS--XAAD   = THE SINGLE PRECISION VALUE OF THE
21C                                COMPUTED SAMPLE AVERAGE ABSOLUTE
22C                                DEVIATION.
23C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SAMPLE AVERAGE
24C             ABSOLUTE DEVIATION (WITH DENOMINATOR N).
25C     OTHER DATAPAC   SUBROUTINES NEEDED--MEAN, MEDIAN AND SORT.
26C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
28C     LANGUAGE--ANSI FORTRAN (1977)
29C     REFERENCES--SNEDECOR AND COCHRAN, STATISTICAL METHODS,
30C                 EDITION 6, 1967, PAGE 44.
31C               --DIXON AND MASSEY, INTRODUCTION TO STATISTICAL
32C                 ANALYSIS, EDITION 2, 1957, PAGES 19, 76.
33C     WRITTEN BY--JAMES J. FILLIBEN
34C                 STATISTICAL ENGINEERING DIVISION
35C                 INFORMATION TECHNOLOGY LABORATORY
36C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37C                 GAITHERSBURG, MD 20899-8980
38C                 PHONE--301-921-3651
39C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
40C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
41C     LANGUAGE--ANSI FORTRAN (1966)
42C     VERSION NUMBER--82/7
43C     ORIGINAL VERSION--JULY      1981.
44C     UPDATED         --AUGUST    1981.
45C     UPDATED         --MAY       1982.
46C     UPDATED         --JANUARY   1989. FIX COMPUTATIONAL BUG (ALAN)
47C     UPDATED         --JULY      2014. ADD ICASE ARGUMRNT TO ALLOW
48C                                       EITHER DEVIATIONS FROM THE
49C                                       MEAN OR FROM THE MEDIAN
50C
51C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
52C
53      CHARACTER*4 IWRITE
54      CHARACTER*4 ICASE
55      CHARACTER*4 IBUGA3
56      CHARACTER*4 IERROR
57C
58      CHARACTER*4 IWRIT2
59      CHARACTER*4 ISUBN1
60      CHARACTER*4 ISUBN2
61C
62C---------------------------------------------------------------------
63C
64      DOUBLE PRECISION DN
65      DOUBLE PRECISION DX
66      DOUBLE PRECISION DDEL
67      DOUBLE PRECISION DSUM
68      DOUBLE PRECISION DMED
69C
70      DIMENSION X(*)
71      DIMENSION XTEMP(*)
72C
73C---------------------------------------------------------------------
74C
75      INCLUDE 'DPCOP2.INC'
76C
77C-----START POINT-----------------------------------------------------
78C
79      ISUBN1='AAD '
80      ISUBN2='    '
81C
82      IERROR='NO'
83C
84      DMED=0.0D0
85      DDEL=0.0D0
86C
87      IF(IBUGA3.EQ.'ON')THEN
88        WRITE(ICOUT,999)
89  999   FORMAT(1X)
90        CALL DPWRST('XXX','BUG ')
91        WRITE(ICOUT,51)
92   51   FORMAT('***** AT THE BEGINNING OF AAD--')
93        CALL DPWRST('XXX','BUG ')
94        WRITE(ICOUT,52)IBUGA3,ICASE,N
95   52   FORMAT('IBUGA3,ICASE,N = ',2(A4,2X),I8)
96        CALL DPWRST('XXX','BUG ')
97        DO55I=1,N
98          WRITE(ICOUT,56)I,X(I)
99   56     FORMAT('I,X(I) = ',I8,G15.7)
100          CALL DPWRST('XXX','BUG ')
101   55   CONTINUE
102      ENDIF
103C
104C               ******************************************
105C               **  COMPUTE AVERAGE ABSOLUTE DEVIATION  **
106C               ******************************************
107C
108C               ********************************************
109C               **  STEP 1--                              **
110C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
111C               ********************************************
112C
113      AN=N
114C
115      IF(N.LT.1)THEN
116        IERROR='YES'
117        WRITE(ICOUT,999)
118        CALL DPWRST('XXX','BUG ')
119        WRITE(ICOUT,111)
120  111   FORMAT('***** ERROR IN AVERAGE ABSOLUTE DEVIATION--')
121        CALL DPWRST('XXX','BUG ')
122        WRITE(ICOUT,112)
123  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
124        CALL DPWRST('XXX','BUG ')
125        WRITE(ICOUT,113)
126  113   FORMAT('      VARIABLE IS LESS THAN 1.')
127        CALL DPWRST('XXX','BUG ')
128        WRITE(ICOUT,117)N
129  117   FORMAT('      THE NUMBER OF OBSERVATIONS HERE = ',I8,'.')
130        CALL DPWRST('XXX','BUG ')
131        GOTO9000
132      ELSEIF(N.EQ.1)THEN
133        XAAD=0.0
134        GOTO9000
135      ENDIF
136C
137      HOLD=X(1)
138      DO135I=2,N
139        IF(X(I).NE.HOLD)GOTO139
140  135 CONTINUE
141      WRITE(ICOUT,999)
142      CALL DPWRST('XXX','BUG ')
143      WRITE(ICOUT,136)
144  136 FORMAT('***** WARNING IN AVERAGE ABSOLUTE DEVIATION--')
145      CALL DPWRST('XXX','BUG ')
146      WRITE(ICOUT,137)HOLD
147  137 FORMAT('***** THE RESPONSE VARIABLE HAS ALL ELEMENTS = ',G15.7)
148      CALL DPWRST('XXX','BUG ')
149      XAAD=0.0
150      GOTO9000
151  139 CONTINUE
152C
153C               ***********************************************
154C               **  STEP 2--                                 **
155C               **  COMPUTE THE AVERAGE ABSOLUTE DEVIATION.  **
156C               ***********************************************
157C
158      IWRIT2='OFF'
159      IF(ICASE.EQ.'MEDI')THEN
160        CALL MEDIAN(X,N,IWRIT2,XTEMP,MAXNXT,XMED,IBUGA3,IERROR)
161        DMED=XMED
162      ELSE
163        CALL MEAN(X,N,IWRIT2,XMED,IBUGA3,IERROR)
164        DMED=XMED
165      ENDIF
166C
167      DN=N
168      DSUM=0.0D0
169      DO300I=1,N
170        DX=X(I)
171        DDEL=DX-DMED
172        IF(DDEL.LT.0.0D0)DDEL=-DDEL
173        DSUM=DSUM+DDEL
174  300 CONTINUE
175C
176C     BUG FIX: AUGUST, 1987
177CCCCC XAAD=DDEL/DN
178C
179      XAAD=DSUM/DN
180C
181C  END BUG FIX
182C
183C               *******************************
184C               **  STEP 3--                 **
185C               **  WRITE OUT A LINE         **
186C               **  OF SUMMARY INFORMATION.  **
187C               *******************************
188C
189      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
190        IF(ICASE.EQ.'MEDI')THEN
191          WRITE(ICOUT,999)
192          CALL DPWRST('XXX','BUG ')
193          WRITE(ICOUT,813)N,XAAD
194  813     FORMAT('THE AVERAGE ABSOLUTE DEVIATION (FROM THE MEDIAN) OF ',
195     1           I8,' THE OBSERVATIONS = ',G15.7)
196          CALL DPWRST('XXX','BUG ')
197        ELSE
198          WRITE(ICOUT,999)
199          CALL DPWRST('XXX','BUG ')
200          WRITE(ICOUT,811)N,XAAD
201  811     FORMAT('THE AVERAGE ABSOLUTE DEVIATION (FROM THE MEAN) OF ',
202     1           I8,' THE OBSERVATIONS = ',G15.7)
203          CALL DPWRST('XXX','BUG ')
204        ENDIF
205      ENDIF
206C
207C               *****************
208C               **  STEP 90--  **
209C               **  EXIT.      **
210C               *****************
211C
212 9000 CONTINUE
213      IF(IBUGA3.EQ.'ON')THEN
214        WRITE(ICOUT,999)
215        CALL DPWRST('XXX','BUG ')
216        WRITE(ICOUT,9011)
217 9011   FORMAT('***** AT THE END       OF AAD--')
218        CALL DPWRST('XXX','BUG ')
219        WRITE(ICOUT,9012)IERROR,DMED,XAAD
220 9012   FORMAT('IERROR,DMED,XAAD = ',A4,2X,2G15.7)
221        CALL DPWRST('XXX','BUG ')
222      ENDIF
223C
224      RETURN
225      END
226      DOUBLE PRECISION FUNCTION ABRAM0(XVALUE)
227C
228C   DESCRIPTION:
229C      This function calculates the Abramowitz function of order 0,
230C      defined as
231C
232C       ABRAM0(x) = integral{ 0 to infinity } exp( -t*t - x/t ) dt
233C
234C       The code uses Chebyshev expansions with the coefficients
235C       given to an accuracy of 20 decimal places.
236C
237C
238C   ERROR RETURNS:
239C      If XVALUE < 0.0, the function prints a message and returns the
240C      value 0.0.
241C
242C
243C   MACHINE-DEPENDENT CONSTANTS:
244C
245C      NTERMF - INTEGER - No. of terms needed for the array AB0F.
246C               Recommended value such that
247C                     ABS( AB0F(NTERMF) ) < EPS/100
248C
249C      NTERMG - INTEGER - No. of terms needed for array AB0G.
250C               Recommended value such that
251C                     ABS( AB0G(NTERMG) ) < EPS/100
252C
253C      NTERMH - INTEGER - No. of terms needed for array AB0H.
254C               Recommended value such that
255C                     ABS( AB0H(NTERMH) ) < EPS/100
256C
257C      NTERMA - INTEGER - No. of terms needed for array AB0AS.
258C               Recommended value such that
259C                     ABS( AB0AS(NTERMA) ) < EPS/100
260C
261C     XLOW1 - DOUBLE PRECISION - The value below which
262C              ABRAM0 = root(pi)/2 + X ( ln X - GVAL0 )
263C             Recommended value is SQRT(2*EPSNEG)
264C
265C     LNXMIN - DOUBLE PRECISION - The value of ln XMIN. Used to prevent
266C              exponential underflow for large X.
267C
268C     For values of EPS, EPSNEG, XMIN refer to the file MACHCON.TXT.
269C
270C     The machine-dependent constants are computed internally by
271C     using the D1MACH subroutine.
272C
273C
274C   INTRINSIC FUNCTIONS USED:
275C
276C     LOG, EXP, SQRT
277C
278C
279C   OTHER MISCFUN SUBROUTINES USED:
280C
281C          CHEVAL , ERRPRN, D1MACH
282C
283C
284C   AUTHOR:
285C
286C      DR. ALLAN J. MACLEOD,
287C      DEPT. OF MATHEMATICS AND STATISTICS,
288C      UNIVERSITY OF PAISLEY ,
289C      HIGH ST.,
290C      PAISLEY,
291C      SCOTLAND.
292C      PA1 2BE
293C
294C      ( e-mail: macl_ms0@paisley.ac.uk )
295C
296C
297C   LATEST REVISION:   23 January
298C
299C
300      INTEGER NTERMA,NTERMF,NTERMG,NTERMH
301      DOUBLE PRECISION AB0F(0:8),AB0G(0:8),AB0H(0:8),AB0AS(0:27),
302     &     ASLN,ASVAL,CHEVAL,FVAL,GVAL,GVAL0,HALF,HVAL,
303     &     LNXMIN,ONEHUN,ONERPI,RTPIB2,RT3BPI,SIX,T,
304     &     THREE,TWO,V,X,XLOW1,XVALUE,ZERO
305CCCCC CHARACTER FNNAME*6,ERRMSG*33
306C
307C-----COMMON----------------------------------------------------------
308C
309      INCLUDE 'DPCOMC.INC'
310      INCLUDE 'DPCOP2.INC'
311C
312CCCCC DATA FNNAME/'ABRAM0'/
313CCCCC DATA ERRMSG/'FUNCTION CALLED WITH ARGUMENT < 0'/
314      DATA AB0F/-0.68121 92709 35494 69816  D    0,
315     1          -0.78867 91981 61492 52495  D    0,
316     2           0.51215 81776 81881 9543   D   -1,
317     3          -0.71092 35289 45412 96     D   -3,
318     4           0.36868 18085 04287        D   -5,
319     5          -0.91783 23372 37           D   -8,
320     6           0.12702 02563              D  -10,
321     7          -0.10768 88                 D  -13,
322     8           0.599                      D  -17/
323      DATA AB0G/-0.60506 03943 08682 73190  D    0,
324     1          -0.41950 39816 32017 79803  D    0,
325     2           0.17032 65125 19037 0333   D   -1,
326     3          -0.16938 91784 24913 97     D   -3,
327     4           0.67638 08951 9710         D   -6,
328     5          -0.13572 36362 55           D   -8,
329     6           0.15629 7065               D  -11,
330     7          -0.11288 7                  D  -14,
331     8           0.55                       D  -18/
332      DATA AB0H/1.38202 65523 05749 89705  D    0,
333     1         -0.30097 92907 39749 04355  D    0,
334     2          0.79428 88093 64887 241    D   -2,
335     3         -0.64319 10276 84756 3      D   -4,
336     4          0.22549 83068 4374         D   -6,
337     5         -0.41220 96619 5            D   -9,
338     6          0.44185 282                D  -12,
339     7         -0.30123                    D  -15,
340     8          0.14                       D  -18/
341      DATA AB0AS(0)/  1.97755 49972 36930 67407  D    0/
342      DATA AB0AS(1)/ -0.10460 24792 00481 9485   D   -1/
343      DATA AB0AS(2)/  0.69680 79025 36253 66     D   -3/
344      DATA AB0AS(3)/ -0.58982 98299 99659 9      D   -4/
345      DATA AB0AS(4)/  0.57716 44553 05320        D   -5/
346      DATA AB0AS(5)/ -0.61523 01336 5756         D   -6/
347      DATA AB0AS(6)/  0.67853 96884 767          D   -7/
348      DATA AB0AS(7)/ -0.72306 25379 07           D   -8/
349      DATA AB0AS(8)/  0.63306 62736 5            D   -9/
350      DATA AB0AS(9)/ -0.98945 3793               D  -11/
351      DATA AB0AS(10)/-0.16819 80530              D  -10/
352      DATA AB0AS(11)/ 0.67379 9551               D  -11/
353      DATA AB0AS(12)/-0.20099 7939               D  -11/
354      DATA AB0AS(13)/ 0.54055 903                D  -12/
355      DATA AB0AS(14)/-0.13816 679                D  -12/
356      DATA AB0AS(15)/ 0.34222 05                 D  -13/
357      DATA AB0AS(16)/-0.82668 6                  D  -14/
358      DATA AB0AS(17)/ 0.19456 6                  D  -14/
359      DATA AB0AS(18)/-0.44268                    D  -15/
360      DATA AB0AS(19)/ 0.9562                     D  -16/
361      DATA AB0AS(20)/-0.1883                     D  -16/
362      DATA AB0AS(21)/ 0.301                      D  -17/
363      DATA AB0AS(22)/-0.19                       D  -18/
364      DATA AB0AS(23)/-0.14                       D  -18/
365      DATA AB0AS(24)/ 0.11                       D  -18/
366      DATA AB0AS(25)/-0.4                        D  -19/
367      DATA AB0AS(26)/ 0.2                        D  -19/
368      DATA AB0AS(27)/-0.1                        D  -19/
369      DATA ZERO,HALF,TWO/ 0.0 D 0 , 0.5 D 0, 2.0 D 0/
370      DATA THREE,SIX,ONEHUN/ 3.0 D 0, 6.0 D 0 , 100.0 D 0/
371      DATA RT3BPI/0.97720 50238 05839 84317 D 0/
372      DATA RTPIB2/0.88622 69254 52758 01365 D 0/
373      DATA GVAL0/0.13417 65026 47700 70909 D 0/
374      DATA ONERPI/0.56418 95835 47756 28695 D 0/
375C
376      XLOW=0.0
377      XLOW1=0.0
378C
379C   Start computation
380C
381      X = XVALUE
382C
383C   Error test
384C
385      IF ( X .LT. ZERO ) THEN
386CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
387         WRITE(ICOUT,999)
388         CALL DPWRST('XXX','BUG ')
389         WRITE(ICOUT,101)X
390         CALL DPWRST('XXX','BUG ')
391         ABRAM0 = ZERO
392         RETURN
393      ENDIF
394  999 FORMAT(1X)
395  101 FORMAT('***** ERROR FROM ABRAM0--ARGUMENT MUST BE ',
396     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
397C
398C   Compute the machine-dependent constants.
399C
400      T = D1MACH(4) / ONEHUN
401      IF ( X .LE. TWO ) THEN
402         DO 10 NTERMF = 8 , 0 , -1
403            IF ( ABS(AB0F(NTERMF)) .GT. T ) GOTO 19
404 10      CONTINUE
405 19      DO 20 NTERMG = 8 , 0 , -1
406            IF ( ABS(AB0G(NTERMG)) .GT. T ) GOTO 29
407 20      CONTINUE
408 29      DO 30 NTERMH = 8 , 0 , -1
409            IF ( ABS(AB0H(NTERMH)) .GT. T ) GOTO 39
410 30      CONTINUE
411 39      XLOW1 = SQRT ( TWO * D1MACH(3) )
412      ELSE
413         DO 40 NTERMA = 27 , 0 , -1
414            IF ( ABS(AB0AS(NTERMA)) .GT. T ) GOTO 49
415 40      CONTINUE
416 49      LNXMIN = LOG(D1MACH(1))
417      ENDIF
418C
419C   Code for 0 <= XVALUE <= 2
420C
421      IF ( X .LE. TWO ) THEN
422         IF ( X .EQ. ZERO ) THEN
423            ABRAM0 = RTPIB2
424            RETURN
425         ENDIF
426         IF ( X .LT. XLOW1 ) THEN
427            ABRAM0 = RTPIB2 + X * ( LOG( X ) - GVAL0 )
428            RETURN
429         ELSE
430            T =  ( X * X / TWO - HALF ) - HALF
431            FVAL = CHEVAL( NTERMF,AB0F,T )
432            GVAL = CHEVAL( NTERMG,AB0G,T )
433            HVAL = CHEVAL( NTERMH,AB0H,T )
434            ABRAM0 = FVAL/ONERPI + X * ( LOG( X ) * HVAL- GVAL )
435            RETURN
436         ENDIF
437      ELSE
438C
439C   Code for XVALUE > 2
440C
441         V = THREE *  ( (X / TWO) ** ( TWO / THREE ) )
442         T =  ( SIX/V - HALF ) - HALF
443         ASVAL = CHEVAL( NTERMA,AB0AS,T )
444         ASLN = LOG( ASVAL / RT3BPI ) - V
445         IF ( ASLN .LT. LNXMIN ) THEN
446            ABRAM0 = ZERO
447         ELSE
448            ABRAM0 = EXP( ASLN )
449         ENDIF
450         RETURN
451      ENDIF
452      END
453      DOUBLE PRECISION FUNCTION ABRAM1(XVALUE)
454C
455C   DESCRIPTION:
456C      This function calculates the Abramowitz function of order 1,
457C      defined as
458C
459C       ABRAM1(x) = integral{ 0 to infinity } t * exp( -t*t - x/t ) dt
460C
461C       The code uses Chebyshev expansions with the coefficients
462C       given to an accuracy of 20 decimal places.
463C
464C
465C   ERROR RETURNS:
466C      If XVALUE < 0.0, the function prints a message and returns the
467C      value 0.0.
468C
469C
470C   MACHINE-DEPENDENT CONSTANTS:
471C
472C      NTERMF - INTEGER - No. of terms needed for the array AB1F.
473C               Recommended value such that
474C                     ABS( AB1F(NTERMF) ) < EPS/100
475C
476C      NTERMG - INTEGER - No. of terms needed for array AB1G.
477C               Recommended value such that
478C                     ABS( AB1G(NTERMG) ) < EPS/100
479C
480C      NTERMH - INTEGER - No. of terms needed for array AB1H.
481C               Recommended value such that
482C                     ABS( AB1H(NTERMH) ) < EPS/100
483C
484C      NTERMA - INTEGER - No. of terms needed for array AB1AS.
485C               Recommended value such that
486C                     ABS( AB1AS(NTERMA) ) < EPS/100
487C
488C      XLOW - DOUBLE PRECISION - The value below which
489C                ABRAM1(x) = 0.5 to machine precision.
490C             The recommended value is EPSNEG/2
491C
492C      XLOW1 - DOUBLE PRECISION - The value below which
493C                ABRAM1(x) = (1 - x ( sqrt(pi) + xln(x) ) / 2
494C              Recommended value is SQRT(2*EPSNEG)
495C
496C      LNXMIN - DOUBLE PRECISION - The value of ln XMIN. Used to prevent
497C              exponential underflow for large X.
498C
499C      For values of EPS, EPSNEG, XMIN refer to the file MACHCON.TXT
500C
501C      The machine-dependent constants are computed internally by using
502C      the D1MACH subroutine.
503C
504C
505C   INTRINSIC FUNCTIONS USED:
506C
507C     LOG, EXP, SQRT
508C
509C
510C   OTHER MISCFUN SUBROUTINES USED:
511C
512C          CHEVAL , ERRPRN, D1MACH
513C
514C
515C   AUTHOR:
516C
517C      DR. ALLAN J. MACLEOD,
518C      DEPT. OF MATHEMATICS AND STATISTICS,
519C      UNIVERSITY OF PAISLEY,
520C      HIGH ST.,
521C      PAISLEY,
522C      SCOTLAND.
523C      PA1 2BE
524C
525C      ( e-mail: macl_ms0@paisley.ac.uk )
526C
527C
528C   LATEST REVISION:   23 January, 1996
529C
530C
531      INTEGER NTERMA,NTERMF,NTERMG,NTERMH
532      DOUBLE PRECISION AB1F(0:9),AB1G(0:8),AB1H(0:8),AB1AS(0:27),
533     &     ASLN,ASVAL,CHEVAL,FVAL,GVAL,HALF,HVAL,
534     &     LNXMIN,ONE,ONEHUN,ONERPI,RT3BPI,SIX,T,THREE,TWO,
535     &     V,X,XLOW,XLOW1,XVALUE,ZERO
536CCCCC CHARACTER FNNAME*6,ERRMSG*33
537C
538C-----COMMON----------------------------------------------------------
539C
540      INCLUDE 'DPCOMC.INC'
541      INCLUDE 'DPCOP2.INC'
542C
543CCCCC DATA FNNAME/'ABRAM1'/
544CCCCC DATA ERRMSG/'FUNCTION CALLED WITH ARGUMENT < 0'/
545      DATA AB1F/1.47285 19257 79788 07369  D    0,
546     1          0.10903 49757 01689 56257  D    0,
547     2         -0.12430 67536 00565 69753  D    0,
548     3          0.30619 79468 53493 315    D   -2,
549     4         -0.22184 10323 07651 1      D   -4,
550     5          0.69899 78834 451          D   -7,
551     6         -0.11597 07644 4            D   -9,
552     7          0.11389 776                D  -12,
553     8         -0.7173                     D  -16,
554     9          0.3                        D  -19/
555      DATA AB1G/0.39791 27794 90545 03528  D    0,
556     1         -0.29045 28522 64547 20849  D    0,
557     2          0.10487 84695 46536 3504   D   -1,
558     3         -0.10249 86952 26913 36     D   -3,
559     4          0.41150 27939 9110         D   -6,
560     5         -0.83652 63894 0            D   -9,
561     6          0.97862 595                D  -12,
562     7         -0.71868                    D  -15,
563     8          0.35                       D  -18/
564      DATA AB1H/0.84150 29215 22749 47030  D    0,
565     1         -0.77900 50698 77414 3395   D   -1,
566     2          0.13399 24558 78390 993    D   -2,
567     3         -0.80850 39071 52788        D   -5,
568     4          0.22618 58281 728          D   -7,
569     5         -0.34413 95838              D  -10,
570     6          0.31598 58                 D  -13,
571     7         -0.1884                     D  -16,
572     8          0.1                        D  -19/
573      DATA AB1AS(0)/  2.13013 64342 90655 49448  D    0/
574      DATA AB1AS(1)/  0.63715 26795 21853 9933   D   -1/
575      DATA AB1AS(2)/ -0.12933 49174 77510 647    D   -2/
576      DATA AB1AS(3)/  0.56783 28753 22826 5      D   -4/
577      DATA AB1AS(4)/ -0.27943 49391 77646        D   -5/
578      DATA AB1AS(5)/  0.56002 14736 787          D   -7/
579      DATA AB1AS(6)/  0.23920 09242 798          D   -7/
580      DATA AB1AS(7)/ -0.75098 48650 09           D   -8/
581      DATA AB1AS(8)/  0.17301 53307 76           D   -8/
582      DATA AB1AS(9)/ -0.36648 87795 5            D   -9/
583      DATA AB1AS(10)/ 0.75207 58307              D  -10/
584      DATA AB1AS(11)/-0.15179 90208              D  -10/
585      DATA AB1AS(12)/ 0.30171 3710               D  -11/
586      DATA AB1AS(13)/-0.58596 718                D  -12/
587      DATA AB1AS(14)/ 0.10914 455                D  -12/
588      DATA AB1AS(15)/-0.18705 36                 D  -13/
589      DATA AB1AS(16)/ 0.26254 2                  D  -14/
590      DATA AB1AS(17)/-0.14627                    D  -15/
591      DATA AB1AS(18)/-0.9500                     D  -16/
592      DATA AB1AS(19)/ 0.5873                     D  -16/
593      DATA AB1AS(20)/-0.2420                     D  -16/
594      DATA AB1AS(21)/ 0.868                      D  -17/
595      DATA AB1AS(22)/-0.290                      D  -17/
596      DATA AB1AS(23)/ 0.93                       D  -18/
597      DATA AB1AS(24)/-0.29                       D  -18/
598      DATA AB1AS(25)/ 0.9                        D  -19/
599      DATA AB1AS(26)/-0.3                        D  -19/
600      DATA AB1AS(27)/ 0.1                        D  -19/
601      DATA ZERO,HALF,ONE/ 0.0 D 0, 0.5 D 0, 1.0 D 0/
602      DATA TWO,THREE,SIX/ 2.0 D 0, 3.0 D 0, 6.0 D 0/
603      DATA ONEHUN/100.0 D 0/
604      DATA RT3BPI/ 0.97720 50238 05839 84317 D 0/
605      DATA ONERPI/ 0.56418 95835 47756 28695 D 0/
606C
607      XLOW=0.0D0
608      XLOW1=0.0D0
609C
610C   Start calculation
611C
612      X = XVALUE
613C
614C   Error test
615C
616      IF ( X .LT. ZERO ) THEN
617CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
618         WRITE(ICOUT,999)
619         CALL DPWRST('XXX','BUG ')
620         WRITE(ICOUT,101)X
621         CALL DPWRST('XXX','BUG ')
622         ABRAM1 = ZERO
623         RETURN
624      ENDIF
625  999 FORMAT(1X)
626  101 FORMAT('***** ERROR FROM ABRAM1--ARGUMENT MUST BE ',
627     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
628C
629C   Compute the machine-dependent constants.
630C
631      T = D1MACH(4) / ONEHUN
632      IF ( X .LE. TWO ) THEN
633         DO 10 NTERMF = 9 , 0 , -1
634            IF ( ABS(AB1F(NTERMF)) .GT. T ) GOTO 19
635 10      CONTINUE
636 19      DO 20 NTERMG = 8 , 0 , -1
637            IF ( ABS(AB1G(NTERMG)) .GT. T ) GOTO 29
638 20      CONTINUE
639 29      DO 30 NTERMH = 8 , 0 , -1
640            IF ( ABS(AB1H(NTERMH)) .GT. T ) GOTO 39
641 30      CONTINUE
642 39      T = D1MACH(3)
643         XLOW1 = SQRT ( TWO * T )
644         XLOW = T / TWO
645      ELSE
646         DO 40 NTERMA = 27 , 0 , -1
647            IF ( ABS(AB1AS(NTERMA)) .GT. T ) GOTO 49
648 40      CONTINUE
649 49      LNXMIN = LOG(D1MACH(1))
650      ENDIF
651C
652C   Code for 0 <= XVALUE <= 2
653C
654      IF ( X .LE. TWO ) THEN
655         IF ( X .EQ. ZERO ) THEN
656            ABRAM1 = HALF
657            RETURN
658         ENDIF
659         IF ( X .LT. XLOW1 ) THEN
660            IF ( X .LT. XLOW ) THEN
661               ABRAM1 = HALF
662            ELSE
663               ABRAM1 = ( ONE - X / ONERPI - X * X * LOG( X ) ) * HALF
664            ENDIF
665            RETURN
666         ELSE
667            T =  ( X * X / TWO - HALF ) - HALF
668            FVAL = CHEVAL( NTERMF,AB1F,T )
669            GVAL = CHEVAL( NTERMG,AB1G,T )
670            HVAL = CHEVAL( NTERMH,AB1H,T )
671            ABRAM1 = FVAL - X * ( GVAL / ONERPI + X * LOG( X ) * HVAL )
672            RETURN
673         ENDIF
674      ELSE
675C
676C   Code for XVALUE > 2
677C
678         V = THREE *  ( (X / TWO) ** ( TWO / THREE ) )
679         T =  ( SIX / V - HALF ) - HALF
680         ASVAL = CHEVAL( NTERMA,AB1AS,T )
681         ASLN = LOG( ASVAL * SQRT ( V / THREE ) / RT3BPI ) - V
682         IF ( ASLN .LT. LNXMIN ) THEN
683            ABRAM1 = ZERO
684         ELSE
685            ABRAM1 = EXP( ASLN )
686         ENDIF
687         RETURN
688      ENDIF
689      END
690      DOUBLE PRECISION FUNCTION ABRAM2(XVALUE)
691C
692C   DESCRIPTION:
693C      This function calculates the Abramowitz function of order 2,
694C      defined as
695C
696C       ABRAM2(x) = integral{ 0 to infinity } (t**2) * exp( -t*t - x/t ) dt
697C
698C      The code uses Chebyshev expansions with the coefficients
699C      given to an accuracy of 20 decimal places.
700C
701C
702C   ERROR RETURNS:
703C      If XVALUE < 0.0, the function prints a message and returns the
704C      value 0.0.
705C
706C
707C   MACHINE-DEPENDENT CONSTANTS:
708C
709C      NTERMF - INTEGER - No. of terms needed for the array AB2F.
710C               Recommended value such that
711C                     ABS( AB2F(NTERMF) ) < EPS/100
712C
713C      NTERMG - INTEGER - No. of terms needed for array AB2G.
714C               Recommended value such that
715C                     ABS( AB2G(NTERMG) ) < EPS/100
716C
717C      NTERMH - INTEGER - No. of terms needed for array AB2H.
718C               Recommended value such that
719C                     ABS( AB2H(NTERMH) ) < EPS/100
720C
721C      NTERMA - INTEGER - No. of terms needed for array AB2AS.
722C               Recommended value such that
723C                     ABS( AB2AS(NTERMA) ) < EPS/100
724C
725C      XLOW - DOUBLE PRECISION - The value below which
726C               ABRAM2 = root(pi)/4 to machine precision.
727C             The recommended value is EPSNEG
728C
729C      XLOW1 - DOUBLE PRECISION - The value below which
730C                ABRAM2 = root(pi)/4 - x/2 + x**3ln(x)/6
731C              Recommended value is SQRT(2*EPSNEG)
732C
733C      LNXMIN - DOUBLE PRECISION - The value of ln XMIN. Used to prevent
734C               exponential underflow for large X.
735C
736C     For values of EPS, EPSNEG, XMIN refer to the file MACHCON.TXT
737C
738C     The machine-dependent constants are computed internally by
739C     using the D1MACH subroutine.
740C
741C
742C   INTRINSIC FUNCTIONS USED:
743C
744C     LOG, EXP
745C
746C
747C   OTHER MISCFUN SUBROUTINES USED:
748C
749C          CHEVAL , ERRPRN, D1MACH
750C
751C
752C   AUTHOR:
753C
754C      DR. ALLAN J. MACLEOD,
755C      DEPT. OF MATHEMATICS AND STATISTICS,
756C      UNIVERSITY OF PAISLEY,
757C      HIGH ST.,
758C      PAISLEY,
759C      SCOTLAND.
760C      PA1 2BE
761C
762C      ( e-mail: macl_ms0@paisley.ac.uk )
763C
764C
765C   LATEST REVISION:   23 January, 1996
766C
767C
768      INTEGER NTERMA,NTERMF,NTERMG,NTERMH
769      DOUBLE PRECISION AB2F(0:9),AB2G(0:8),AB2H(0:7),AB2AS(0:26),
770     &     ASLN,ASVAL,CHEVAL,FVAL,GVAL,HALF,HVAL,LNXMIN,
771     &     ONEHUN,ONERPI,RTPIB4,RT3BPI,SIX,T,THREE,TWO,
772     &     V,X,XLOW,XLOW1,XVALUE,ZERO
773CCCCC CHARACTER FNNAME*6,ERRMSG*33
774C
775C-----COMMON----------------------------------------------------------
776C
777      INCLUDE 'DPCOMC.INC'
778      INCLUDE 'DPCOP2.INC'
779C
780CCCCC DATA FNNAME/'ABRAM2'/
781CCCCC DATA ERRMSG/'FUNCTION CALLED WITH ARGUMENT < 0'/
782      DATA AB2F/1.03612 16280 42437 13846  D    0,
783     1          0.19371 24662 67945 70012  D    0,
784     2         -0.72587 58839 23300 7378   D   -1,
785     3          0.17479 05908 64327 399    D   -2,
786     4         -0.12812 23233 75654 9      D   -4,
787     5          0.41150 18153 651          D   -7,
788     6         -0.69710 47256              D  -10,
789     7          0.69901 83                 D  -13,
790     8         -0.4492                     D  -16,
791     9          0.2                        D  -19/
792      DATA AB2G/1.46290 15719 86307 41150  D    0,
793     1          0.20189 46688 31540 14317  D    0,
794     2         -0.29082 92087 99712 9022   D   -1,
795     3          0.47061 04903 52700 50     D   -3,
796     4         -0.25792 20803 59333        D   -5,
797     5          0.65613 37129 46           D   -8,
798     6         -0.91411 0203               D  -11,
799     7          0.77427 6                  D  -14,
800     8         -0.429                      D  -17/
801      DATA AB2H/0.30117 22501 09104 88881  D    0,
802     1         -0.15886 67818 31762 3783   D   -1,
803     2          0.19295 93693 55845 26     D   -3,
804     3         -0.90199 58784 9300         D   -6,
805     4          0.20610 50418 37           D   -8,
806     5         -0.26511 1806               D  -11,
807     6          0.21086 4                  D  -14,
808     7         -0.111                      D  -17/
809      DATA AB2AS(0)/  2.46492 32530 43348 56893  D    0/
810      DATA AB2AS(1)/  0.23142 79742 22489 05432  D    0/
811      DATA AB2AS(2)/ -0.94068 17301 00857 73     D   -3/
812      DATA AB2AS(3)/  0.82902 70038 08973 3      D   -4/
813      DATA AB2AS(4)/ -0.88389 47042 45866        D   -5/
814      DATA AB2AS(5)/  0.10663 85435 67985        D   -5/
815      DATA AB2AS(6)/ -0.13991 12853 8529         D   -6/
816      DATA AB2AS(7)/  0.19397 93208 445          D   -7/
817      DATA AB2AS(8)/ -0.27704 99383 75           D   -8/
818      DATA AB2AS(9)/  0.39590 68718 6            D   -9/
819      DATA AB2AS(10)/-0.54083 54342              D  -10/
820      DATA AB2AS(11)/ 0.63554 6076               D  -11/
821      DATA AB2AS(12)/-0.38461 613                D  -12/
822      DATA AB2AS(13)/-0.11696 067                D  -12/
823      DATA AB2AS(14)/ 0.68966 71                 D  -13/
824      DATA AB2AS(15)/-0.25031 13                 D  -13/
825      DATA AB2AS(16)/ 0.78558 6                  D  -14/
826      DATA AB2AS(17)/-0.23033 4                  D  -14/
827      DATA AB2AS(18)/ 0.64914                    D  -15/
828      DATA AB2AS(19)/-0.17797                    D  -15/
829      DATA AB2AS(20)/ 0.4766                     D  -16/
830      DATA AB2AS(21)/-0.1246                     D  -16/
831      DATA AB2AS(22)/ 0.316                      D  -17/
832      DATA AB2AS(23)/-0.77                       D  -18/
833      DATA AB2AS(24)/ 0.18                       D  -18/
834      DATA AB2AS(25)/-0.4                        D  -19/
835      DATA AB2AS(26)/ 0.1                        D  -19/
836      DATA ZERO,HALF,TWO/ 0.0 D 0 , 0.5 D 0, 2.0 D 0/
837      DATA THREE,SIX,ONEHUN/ 3.0 D 0, 6.0 D 0 , 100.0 D 0/
838      DATA RT3BPI/ 0.97720 50238 05839 84317 D 0/
839      DATA RTPIB4/ 0.44311 34627 26379 00682 D 0/
840      DATA ONERPI/ 0.56418 95835 47756 28695 D 0/
841C
842      XLOW=0.0
843      XLOW1=0.0
844C
845C   Start calculation
846C
847      X = XVALUE
848C
849C   Error test
850C
851      IF ( X .LT. ZERO ) THEN
852CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
853         WRITE(ICOUT,999)
854         CALL DPWRST('XXX','BUG ')
855         WRITE(ICOUT,101)X
856         CALL DPWRST('XXX','BUG ')
857         ABRAM2 = ZERO
858         RETURN
859      ENDIF
860  999 FORMAT(1X)
861  101 FORMAT('***** ERROR FROM ABRAM2--ARGUMENT MUST BE ',
862     1       'NON-NEGATIVE, ARGUMENT = ',G15.7)
863C
864C   Compute the machine-dependent constants.
865C
866      T = D1MACH(4) / ONEHUN
867      IF ( X .LE. TWO ) THEN
868         DO 10 NTERMF = 9 , 0 , -1
869            IF ( ABS(AB2F(NTERMF)) .GT. T ) GOTO 19
870 10      CONTINUE
871 19      DO 20 NTERMG = 8 , 0 , -1
872            IF ( ABS(AB2G(NTERMG)) .GT. T ) GOTO 29
873 20      CONTINUE
874 29      DO 30 NTERMH = 7 , 0 , -1
875            IF ( ABS(AB2H(NTERMH)) .GT. T ) GOTO 39
876 30      CONTINUE
877 39      XLOW = D1MACH(3)
878         XLOW1 = SQRT ( TWO * XLOW )
879      ELSE
880         DO 40 NTERMA = 26 , 0 , -1
881            IF ( ABS(AB2AS(NTERMA)) .GT. T ) GOTO 49
882 40      CONTINUE
883 49      LNXMIN = LOG(D1MACH(1))
884      ENDIF
885C
886C   Code for 0 <= XVALUE <= 2
887C
888      IF ( X .LE. TWO ) THEN
889         IF ( X .EQ. ZERO ) THEN
890            ABRAM2 = RTPIB4
891            RETURN
892         ENDIF
893         IF ( X .LT. XLOW1 ) THEN
894            IF ( X .LT. XLOW ) THEN
895               ABRAM2 = RTPIB4
896            ELSE
897               ABRAM2 = RTPIB4 - HALF * X + X * X * X * LOG( X ) / SIX
898            ENDIF
899            RETURN
900         ELSE
901            T =  ( X * X / TWO - HALF ) - HALF
902            FVAL = CHEVAL( NTERMF,AB2F,T )
903            GVAL = CHEVAL( NTERMG,AB2G,T )
904            HVAL = CHEVAL( NTERMH,AB2H,T )
905            ABRAM2 = FVAL/ONERPI + X * ( X * X * LOG(X) * HVAL- GVAL )
906            RETURN
907         ENDIF
908      ELSE
909C
910C   Code for XVALUE > 2
911C
912         V = THREE *  ( (X / TWO) ** ( TWO / THREE ) )
913         T =  ( SIX / V - HALF ) - HALF
914         ASVAL = CHEVAL( NTERMA,AB2AS,T )
915         ASLN = LOG( ASVAL / RT3BPI ) + LOG( V / THREE ) - V
916         IF ( ASLN .LT. LNXMIN ) THEN
917            ABRAM2 = ZERO
918         ELSE
919            ABRAM2 = EXP( ASLN )
920         ENDIF
921         RETURN
922      ENDIF
923      END
924      SUBROUTINE ADAPT(NDIM, MINCLS, MAXCLS, FUNCTN,
925     &     ABSREQ, RELREQ, LENWRK, WORK, ABSEST, FINEST, INFORM)
926*
927*   Adaptive Multidimensional Integration Subroutine
928*
929*   Author: Alan Genz
930*           Department of Mathematics
931*           Washington State University
932*           Pullman, WA 99164-3113 USA
933*
934*  This subroutine computes an approximation to the integral
935*
936*      1 1     1
937*     I I ... I       FUNCTN(NDIM,X)  dx(NDIM)...dx(2)dx(1)
938*      0 0     0
939*
940***************  Parameters for ADAPT  ********************************
941*
942****** Input Parameters
943*
944*  NDIM    Integer number of integration variables.
945*  MINCLS  Integer minimum number of FUNCTN calls to be allowed; MINCLS
946*          must not exceed MAXCLS. If MINCLS < 0, then ADAPT assumes
947*          that a previous call of ADAPT has been made with the same
948*          integrand and continues that calculation.
949*  MAXCLS  Integer maximum number of FUNCTN calls to be used; MAXCLS
950*          must be >= RULCLS, the number of function calls required for
951*          one application of the basic integration rule.
952*           IF ( NDIM .EQ. 1 ) THEN
953*              RULCLS = 11
954*           ELSE IF ( NDIM .LT. 15 ) THEN
955*              RULCLS = 2**NDIM + 2*NDIM*(NDIM+3) + 1
956*           ELSE
957*              RULCLS = 1 + NDIM*(24-NDIM*(6-NDIM*4))/3
958*           ENDIF
959*  FUNCTN  Externally declared real user defined integrand. Its
960*          parameters must be (NDIM, Z), where Z is a real array of
961*          length NDIM.
962*  ABSREQ  Real required absolute accuracy.
963*  RELREQ  Real required relative accuracy.
964*  LENWRK  Integer length of real array WORK (working storage); ADAPT
965*          needs LENWRK >= 16*NDIM + 27. For maximum efficiency LENWRK
966*          should be about 2*NDIM*MAXCLS/RULCLS if MAXCLS FUNCTN
967*          calls are needed. If LENWRK is significantly less than this,
968*          ADAPT may be less efficient.
969*
970****** Output Parameters
971*
972*  MINCLS  Actual number of FUNCTN calls used by ADAPT.
973*  WORK    Real array (length LENWRK) of working storage. This contains
974*          information that is needed for additional calls of ADAPT
975*          using the same integrand (input MINCLS < 0).
976*  ABSEST  Real estimated absolute accuracy.
977*  FINEST  Real estimated value of integral.
978*  INFORM  INFORM = 0 for normal exit, when ABSEST <= ABSREQ or
979*                     ABSEST <= |FINEST|*RELREQ with MINCLS <= MAXCLS.
980*          INFORM = 1 if MAXCLS was too small for ADAPT to obtain the
981*                     result FINEST to within the requested accuracy.
982*          INFORM = 2 if MINCLS > MAXCLS, LENWRK < 16*NDIM + 27 or
983*                     RULCLS > MAXCLS.
984*
985************************************************************************
986*
987*     Begin driver routine. This routine partitions the working storage
988*      array and then calls the main subroutine ADBASE.
989*
990      EXTERNAL FUNCTN
991      INTEGER NDIM, MINCLS, MAXCLS, LENWRK, INFORM
992      DOUBLE PRECISION
993     &     FUNCTN, ABSREQ, RELREQ, WORK(LENWRK), ABSEST, FINEST
994      INTEGER SBRGNS, MXRGNS, RULCLS, LENRUL,
995     & INERRS, INVALS, INPTRS, INLWRS, INUPRS, INMSHS, INPNTS, INWGTS,
996     & INLOWR, INUPPR, INWDTH, INMESH, INWORK
997C
998      IF ( NDIM .EQ. 1 ) THEN
999         LENRUL = 5
1000         RULCLS = 9
1001      ELSE IF ( NDIM .LT. 12 ) THEN
1002         LENRUL = 6
1003         RULCLS = 2**NDIM + 2*NDIM*(NDIM+2) + 1
1004      ELSE
1005         LENRUL = 6
1006         RULCLS = 1 + 2*NDIM*(1+2*NDIM)
1007      ENDIF
1008      IF ( LENWRK .GE. LENRUL*(NDIM+4) + 10*NDIM + 3 .AND.
1009     &     RULCLS. LE. MAXCLS .AND. MINCLS .LE. MAXCLS ) THEN
1010        MXRGNS = ( LENWRK - LENRUL*(NDIM+4) - 7*NDIM )/( 3*NDIM + 3 )
1011        INERRS = 1
1012        INVALS = INERRS + MXRGNS
1013        INPTRS = INVALS + MXRGNS
1014        INLWRS = INPTRS + MXRGNS
1015        INUPRS = INLWRS + MXRGNS*NDIM
1016        INMSHS = INUPRS + MXRGNS*NDIM
1017        INWGTS = INMSHS + MXRGNS*NDIM
1018        INPNTS = INWGTS + LENRUL*4
1019        INLOWR = INPNTS + LENRUL*NDIM
1020        INUPPR = INLOWR + NDIM
1021        INWDTH = INUPPR + NDIM
1022        INMESH = INWDTH + NDIM
1023        INWORK = INMESH + NDIM
1024        IF ( MINCLS .LT. 0 ) SBRGNS = INT(WORK(LENWRK))
1025        CALL ADBASE(NDIM, MINCLS, MAXCLS, FUNCTN, ABSREQ, RELREQ,
1026     &       ABSEST, FINEST, SBRGNS, MXRGNS, RULCLS, LENRUL,
1027     &       WORK(INERRS), WORK(INVALS), WORK(INPTRS), WORK(INLWRS),
1028     &       WORK(INUPRS), WORK(INMSHS), WORK(INWGTS), WORK(INPNTS),
1029     &       WORK(INLOWR), WORK(INUPPR), WORK(INWDTH), WORK(INMESH),
1030     &       WORK(INWORK), INFORM)
1031        WORK(LENWRK) = SBRGNS
1032       ELSE
1033        INFORM = 2
1034        MINCLS = RULCLS
1035      ENDIF
1036C
1037      RETURN
1038      END
1039      SUBROUTINE ADBASE(NDIM, MINCLS, MAXCLS, FUNCTN, ABSREQ, RELREQ,
1040     &     ABSEST, FINEST, SBRGNS, MXRGNS, RULCLS, LENRUL,
1041     &     ERRORS, VALUES, PONTRS, LOWERS,
1042     &     UPPERS, MESHES, WEGHTS, POINTS,
1043     &     LOWER, UPPER, WIDTH, MESH, WORK, INFORM)
1044*
1045*        Main adaptive integration subroutine
1046*
1047      EXTERNAL FUNCTN
1048      INTEGER I, J, NDIM, MINCLS, MAXCLS, SBRGNS, MXRGNS,
1049     &     RULCLS, LENRUL, INFORM, NWRGNS
1050      DOUBLE PRECISION FUNCTN, ABSREQ, RELREQ, ABSEST, FINEST,
1051     &     ERRORS(*), VALUES(*), PONTRS(*),
1052     &     LOWERS(NDIM,*), UPPERS(NDIM,*),
1053     &     MESHES(NDIM,*),WEGHTS(*), POINTS(*),
1054     &     LOWER(*), UPPER(*), WIDTH(*), MESH(*), WORK(*)
1055      INTEGER DIVAXN, TOP, RGNCLS, FUNCLS, DIFCLS
1056
1057*
1058*     Initialization of subroutine
1059*
1060      INFORM = 2
1061      FUNCLS = 0
1062      CALL BSINIT(NDIM, WEGHTS, LENRUL, POINTS)
1063      IF ( MINCLS .GE. 0) THEN
1064*
1065*       When MINCLS >= 0 determine initial subdivision of the
1066*       integration region and apply basic rule to each subregion.
1067*
1068         SBRGNS = 0
1069         DO 100 I = 1,NDIM
1070            LOWER(I) = 0
1071            MESH(I) = 1
1072            WIDTH(I) = 1/(2*MESH(I))
1073            UPPER(I) = 1
1074 100     CONTINUE
1075         DIVAXN = 0
1076         RGNCLS = RULCLS
1077         NWRGNS = 1
1078 10      CALL DIFFER(NDIM, LOWER, UPPER, WIDTH, WORK, WORK(NDIM+1),
1079     &        FUNCTN, DIVAXN, DIFCLS)
1080         FUNCLS = FUNCLS + DIFCLS
1081         IF ( FUNCLS +
1082     &        RGNCLS*INT((MESH(DIVAXN)+1.0D0)/MESH(DIVAXN))
1083     &        .LE. MINCLS ) THEN
1084            RGNCLS = RGNCLS*INT((MESH(DIVAXN)+1.0D0)/MESH(DIVAXN))
1085            NWRGNS = NWRGNS*INT((MESH(DIVAXN)+1.0D0)/MESH(DIVAXN))
1086            MESH(DIVAXN) = MESH(DIVAXN) + 1.0D0
1087            WIDTH(DIVAXN) = 1.0D0/( 2.0D0*MESH(DIVAXN) )
1088            GO TO 10
1089         ENDIF
1090         IF ( NWRGNS .LE. MXRGNS ) THEN
1091            DO 200 I = 1,NDIM
1092               UPPER(I) = LOWER(I) + 2*WIDTH(I)
1093               MESH(I) = 1.0D0
1094 200        CONTINUE
1095         ENDIF
1096*
1097*     Apply basic rule to subregions and store results in heap.
1098*
1099 20      SBRGNS = SBRGNS + 1
1100         CALL BASRUL(NDIM, LOWER, UPPER, WIDTH, FUNCTN,
1101     &        WEGHTS, LENRUL, POINTS, WORK, WORK(NDIM+1),
1102     &        ERRORS(SBRGNS),VALUES(SBRGNS))
1103         CALL TRESTR(SBRGNS, SBRGNS, PONTRS, ERRORS)
1104         DO 300 I = 1,NDIM
1105            LOWERS(I,SBRGNS) = LOWER(I)
1106            UPPERS(I,SBRGNS) = UPPER(I)
1107            MESHES(I,SBRGNS) = MESH(I)
1108  300    CONTINUE
1109         DO 400 I = 1,NDIM
1110            LOWER(I) = UPPER(I)
1111            UPPER(I) = LOWER(I) + 2*WIDTH(I)
1112            IF ( LOWER(I)+WIDTH(I) .LT. 1 )  GO TO 20
1113            LOWER(I) = 0
1114            UPPER(I) = LOWER(I) + 2*WIDTH(I)
1115  400    CONTINUE
1116         FUNCLS = FUNCLS + SBRGNS*RULCLS
1117      ENDIF
1118*
1119*     Check for termination
1120*
1121 30   FINEST = 0
1122      ABSEST = 0
1123      DO 500 I = 1, SBRGNS
1124         FINEST = FINEST + VALUES(I)
1125         ABSEST = ABSEST + ERRORS(I)
1126 500  CONTINUE
1127      IF ( ABSEST .GT. MAX( ABSREQ, RELREQ*ABS(FINEST) )
1128     &     .OR. FUNCLS .LT. MINCLS ) THEN
1129*
1130*     Prepare to apply basic rule in (parts of) subregion with
1131*     largest error.
1132*
1133         TOP = INT(PONTRS(1))
1134         RGNCLS = RULCLS
1135         DO 600 I = 1,NDIM
1136            LOWER(I) = LOWERS(I,TOP)
1137            UPPER(I) = UPPERS(I,TOP)
1138            MESH(I) = MESHES(I,TOP)
1139            WIDTH(I) = (UPPER(I)-LOWER(I))/(2*MESH(I))
1140            RGNCLS = INT(DBLE(RGNCLS)*MESH(I))
1141  600    CONTINUE
1142         CALL DIFFER(NDIM, LOWER, UPPER, WIDTH, WORK, WORK(NDIM+1),
1143     &        FUNCTN, DIVAXN, DIFCLS)
1144         FUNCLS = FUNCLS + DIFCLS
1145         RGNCLS = INT(DBLE(RGNCLS)*(MESH(DIVAXN)+1.0D0)/MESH(DIVAXN))
1146         IF ( FUNCLS + RGNCLS .LE. MAXCLS ) THEN
1147            IF ( SBRGNS + 1 .LE. MXRGNS ) THEN
1148*
1149*     Prepare to subdivide into two pieces.
1150*
1151               NWRGNS = 1
1152               WIDTH(DIVAXN) = WIDTH(DIVAXN)/2
1153            ELSE
1154               NWRGNS = 0
1155               WIDTH(DIVAXN) = WIDTH(DIVAXN)
1156     &                        *MESH(DIVAXN)/( MESH(DIVAXN) + 1 )
1157               MESHES(DIVAXN,TOP) = MESH(DIVAXN) + 1
1158            ENDIF
1159            IF ( NWRGNS .GT. 0 ) THEN
1160*
1161*     Only allow local subdivision when space is available.
1162*
1163               DO 700 J = SBRGNS+1,SBRGNS+NWRGNS
1164                  DO 800 I = 1,NDIM
1165                     LOWERS(I,J) = LOWER(I)
1166                     UPPERS(I,J) = UPPER(I)
1167                     MESHES(I,J) = MESH(I)
1168  800             CONTINUE
1169  700          CONTINUE
1170               UPPERS(DIVAXN,TOP) = LOWER(DIVAXN) + 2*WIDTH(DIVAXN)
1171               LOWERS(DIVAXN,SBRGNS+1) = UPPERS(DIVAXN,TOP)
1172            ENDIF
1173            FUNCLS = FUNCLS + RGNCLS
1174            CALL BASRUL(NDIM, LOWERS(1,TOP), UPPERS(1,TOP), WIDTH,
1175     &           FUNCTN, WEGHTS, LENRUL, POINTS, WORK, WORK(NDIM+1),
1176     &           ERRORS(TOP), VALUES(TOP))
1177            CALL TRESTR(TOP, SBRGNS, PONTRS, ERRORS)
1178            DO 900 I = SBRGNS+1, SBRGNS+NWRGNS
1179*
1180*     Apply basic rule and store results in heap.
1181*
1182               CALL BASRUL(NDIM, LOWERS(1,I), UPPERS(1,I), WIDTH,
1183     &              FUNCTN, WEGHTS, LENRUL, POINTS, WORK, WORK(NDIM+1),
1184     &              ERRORS(I), VALUES(I))
1185               CALL TRESTR(I, I, PONTRS, ERRORS)
1186  900       CONTINUE
1187            SBRGNS = SBRGNS + NWRGNS
1188            GO TO 30
1189         ELSE
1190            INFORM = 1
1191         ENDIF
1192      ELSE
1193         INFORM = 0
1194      ENDIF
1195      MINCLS = FUNCLS
1196C
1197      RETURN
1198      END
1199      SUBROUTINE ADECDF(X,AK,IADEDF,CDF)
1200C
1201C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
1202C              FUNCTION VALUE FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1203C              (OR ASYMMETRIC DOUBLE EXPONENTIAL)
1204C              WITH SHAPE PARAMETER = K.
1205C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
1206C              THE PROBABILITY DENSITY FUNCTION
1207C                 ADECDF(X,K) = 1 - (1/(1+K*K))*
1208C                               EXP(-SQRT(2)*K*ABS(X))    X >= 0
1209C                 ADECDF(X,K) = (K*K/(1+K*K))*
1210C                               EXP((-SQRT(2)/K)*ABS(X))  X >= 0
1211C                 ADECDF(X,K) = (SQRT(2)*K/(1+K^2))*
1212C                               EXP((-SQRT(2)/K)*ABS(X))  X < 0
1213C     INPUT  ARGUMENTS--X     = THE SINGLE PRECISION VALUE AT
1214C                               WHICH THE CUMULATIVE DISTRIBUTION
1215C                               FUNCTION IS TO BE EVALUATED.
1216C                               X SHOULD BE NON-NEGATIVE.
1217C                     --AK    = THE SHAPE PARAMETER
1218C     OUTPUT ARGUMENTS--CDF   = THE SINGLE PRECISION CUMULATIVE
1219C                               DISTRIBUTION FUNCTION VALUE.
1220C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION FUNCTION
1221C             VALUE CDF FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1222C             WITH SHAPE PARAMETER = K.
1223C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1224C     RESTRICTIONS--NONE.
1225C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
1226C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
1227C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
1228C     LANGUAGE--ANSI FORTRAN (1977)
1229C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
1230C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
1231C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
1232C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
1233C                 PP. 134.
1234C     WRITTEN BY--JAMES J. FILLIBEN
1235C                 STATISTICAL ENGINEERING DIVISION
1236C                 INFORMATION TECHNOLOGY LABORATORY
1237C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
1238C                 GAITHERSBURG, MD 20899-8980
1239C                 PHONE--301-975-2855
1240C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1241C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1242C     LANGUAGE--ANSI FORTRAN (1977)
1243C     VERSION NUMBER--2004.6
1244C     ORIGINAL VERSION--JUNE      2004.
1245C
1246C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1247C
1248C---------------------------------------------------------------------
1249C
1250      DOUBLE PRECISION DX
1251      DOUBLE PRECISION DK
1252      DOUBLE PRECISION DCDF
1253      DOUBLE PRECISION DTERM1
1254C
1255      CHARACTER*4 IADEDF
1256C
1257C---------------------------------------------------------------------
1258C
1259      INCLUDE 'DPCOP2.INC'
1260C
1261C-----DATA STATEMENTS-------------------------------------------------
1262C
1263C-----START POINT-----------------------------------------------------
1264C
1265C               ************************************
1266C               **  STEP 1--                      **
1267C               **  COMPUTE THE CDF     FUNCTION  **
1268C               ************************************
1269C
1270      IF(IADEDF.EQ.'K')THEN
1271        IF(AK.LE.0.0)THEN
1272          WRITE(ICOUT,5)
1273          CALL DPWRST('XXX','WRIT')
1274          WRITE(ICOUT,48)AK
1275          CALL DPWRST('XXX','WRIT')
1276          CDF=0.0
1277          GOTO9000
1278        ENDIF
1279      ELSE
1280        AK=SQRT(2.0)/(AK + SQRT(2.0 + AK*AK))
1281      ENDIF
1282    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER (K) IN ADECDF ',
1283     1       'ROUTINE IS NEGATIVE.')
1284   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
1285C
1286      DX=DBLE(X)
1287      DK=DBLE(AK)
1288C
1289      IF(X.LT.0.0)THEN
1290        DTERM1=DK*DK/(1.0D0 + DK*DK)
1291        DCDF=DTERM1*DEXP((-DSQRT(2.0D0)/DK)*DABS(DX))
1292      ELSE
1293        DTERM1=1.0D0/(1.0D0 + DK*DK)
1294        DCDF=1.0D0 - DTERM1*DEXP(-DSQRT(2.0D0)*DK*DABS(DX))
1295      ENDIF
1296      CDF=REAL(DCDF)
1297C
1298 9000 CONTINUE
1299      RETURN
1300      END
1301      SUBROUTINE ADEML1(Y,N,MAXNXT,
1302     1                  TEMP1,DALPHA,DBETA,DH,
1303     1                  XMEAN,XMED,XSD,XVAR,XMIN,XMAX,
1304     1                  ALOCML,SCALML,AKML,
1305     1                  ISUBRO,IBUGA3,IERROR)
1306C
1307C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
1308C              FOR THE ASYMMETRIC DOUBLE EXPONENTIAL DISTRIBUTION FOR
1309C              THE RAW DATA CASE (I.E., NO CENSORING AND NO GROUPING).
1310C              THIS ROUTINE RETURNS ONLY THE POINT ESTIMATES (CONFIDENCE
1311C              INTERVALS WILL BE COMPUTED IN A SEPARATE ROUTINE).
1312C
1313C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
1314C              PERFORMED.
1315C
1316C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
1317C              FROM MULTIPLE PLACES (DPMLAD WILL GENERATE THE OUTPUT
1318C              FOR THE ASYMMETRIC DOUBLE EXPONENTIAL MLE COMMAND).
1319C
1320C              THE ALGORITHM IS:
1321C
1322C              1) SORT THE DATA
1323C
1324C              2) COMPUTE
1325C
1326C                 h(x(j)) = 2*LOG[alpha(theta)) + SQRT(beta(theta))] +
1327C                           SQRT(alpha(theta)*SQRT(beta(theta))
1328C
1329C                 WHERE
1330C
1331C                 alpha(theta) = (1/N)*SUM[j=1 to N][(x(j) - theta)+]
1332C                 beta(theta)  = (1/N)*SUM[j=1 to N][(x(j) - theta)-]
1333C
1334C                 WHERE
1335C
1336C                 (x(j) - theta)+ = x(j) - theta       x(j) >= theta
1337C                                 = 0                  x(j) < theta
1338C                 (x(j) - theta)- = theta - x(j)       x(j) <= theta
1339C                                 = 0                  x(j) > theta
1340C
1341C              3) SET R EQUAL TO THE VALUE OF J WHERE H(x(j)) HAS
1342C                 IT'S MINIMUM VALUE.
1343C
1344C              4) IF R=1 OR R=N, THE MAXIMUM LIKELIHOOD ESTIMATES
1345C                 DO NOT EXIST.  HOWEVER, THESE CASES SUGGEST
1346C                 POSITIVE AND NEGATIVE EXPONENTIAL DISTRIBUTIONS,
1347C                 RESPECTIVELY.
1348C
1349C              5) OTHERWISE, THE MAXIMUM LIKELIHOOD ESTIMATES ARE:
1350C
1351C                 THETAHAT = X(R)
1352C
1353C                 KHAT     = (BETA(THETAHAT))**(1/4)/
1354C                            (ALPHA(THETAHAT))**(1/4)
1355C
1356C                 SIGMAHAT = SQRT(2)*(BETA(THETAHAT))**(1/4)*
1357C                            (ALPHA(THETAHAT))**(1/4)*
1358C                            (SQRT(ALPHA(THETAHAT)) +
1359C                            SQRT(BETA(THETAHAT)))
1360C
1361C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
1362C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
1363C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
1364C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
1365C                 PP. 133-178.
1366C     WRITTEN BY--ALAN HECKERT
1367C                 STATISTICAL ENGINEERING DIVISION
1368C                 INFORMATION TECHNOLOGY LABORATORY
1369C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
1370C                 GAITHERSBURG, MD 20899-8980
1371C                 PHONE--301-975-2899
1372C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1373C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
1374C     LANGUAGE--ANSI FORTRAN (1977)
1375C     VERSION NUMBER--2010/07
1376C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
1377C                                       SUBROUTINE (FROM DPMLAD)
1378C
1379C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1380C
1381      DIMENSION Y(*)
1382      DIMENSION TEMP1(*)
1383      DOUBLE PRECISION DALPHA(*)
1384      DOUBLE PRECISION DBETA(*)
1385      DOUBLE PRECISION DH(*)
1386C
1387      DOUBLE PRECISION DHMIN
1388      DOUBLE PRECISION DSUM1
1389      DOUBLE PRECISION DSUM2
1390      DOUBLE PRECISION DTERM1
1391      DOUBLE PRECISION DTERM2
1392      DOUBLE PRECISION DTERM3
1393      DOUBLE PRECISION DTERM4
1394C
1395      CHARACTER*4 ISUBRO
1396      CHARACTER*4 IBUGA3
1397      CHARACTER*4 IERROR
1398C
1399      CHARACTER*4 IWRITE
1400      CHARACTER*40 IDIST
1401C
1402      CHARACTER*4 ISUBN1
1403      CHARACTER*4 ISUBN2
1404      CHARACTER*4 ISTEPN
1405C
1406C---------------------------------------------------------------------
1407C
1408      INCLUDE 'DPCOP2.INC'
1409C
1410C-----START POINT-----------------------------------------------------
1411C
1412      ISUBN1='ADEM'
1413      ISUBN2='L1  '
1414C
1415      IERROR='NO'
1416      IWRITE='OFF'
1417      AN=REAL(N)
1418      ALOCML=CPUMIN
1419      SCALML=CPUMIN
1420      AKML=CPUMIN
1421C
1422      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'EML1')THEN
1423        WRITE(ICOUT,999)
1424  999   FORMAT(1X)
1425        CALL DPWRST('XXX','WRIT')
1426        WRITE(ICOUT,51)
1427   51   FORMAT('**** AT THE BEGINNING OF ADEML1--')
1428        CALL DPWRST('XXX','WRIT')
1429        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
1430   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
1431        CALL DPWRST('XXX','WRIT')
1432        DO56I=1,MIN(N,100)
1433          WRITE(ICOUT,57)I,Y(I)
1434   57     FORMAT('I,Y(I) = ',I8,G15.7)
1435          CALL DPWRST('XXX','WRIT')
1436   56   CONTINUE
1437      ENDIF
1438C
1439C               *****************************************************
1440C               **  STEP 2--                                       **
1441C               **  CARRY OUT CALCULATIONS                         **
1442C               **  FOR ASYMMETRIC DOUBLE EXPONENTIAL MLE ESTIMATE **
1443C               *****************************************************
1444C
1445      ISTEPN='2'
1446      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'EML1')
1447     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
1448C
1449      IDIST='ASYMMETRIC DOUBLE EXPONENTIAL'
1450      IFLAG=0
1451      CALL SUMRAW(Y,N,IDIST,IFLAG,
1452     1            XMEAN,XVAR,XSD,XMIN,XMAX,
1453     1            ISUBRO,IBUGA3,IERROR)
1454      IF(IERROR.EQ.'YES')GOTO9000
1455C
1456      CALL MEDIAN(Y,N,IWRITE,TEMP1,MAXNXT,XMED,IBUGA3,IERROR)
1457      CALL SORT(Y,N,Y)
1458C
1459      DHMIN=DBLE(CPUMAX)
1460      DO2110I=1,N
1461        THETA=Y(I)
1462        DSUM1=0.0D0
1463        DSUM2=0.0D0
1464        DO2120J=1,N
1465          IF(Y(J).GE.THETA)DSUM1=DSUM1 + DBLE(Y(J) - THETA)
1466          IF(Y(J).LE.THETA)DSUM2=DSUM2 + DBLE(THETA - Y(J))
1467 2120   CONTINUE
1468        DALPHA(I)=DSUM1/DBLE(N)
1469        DBETA(I)=DSUM2/DBLE(N)
1470        DH(I)=2.0D0*DLOG(DSQRT(DALPHA(I)) + DSQRT(DBETA(I)))
1471     1        + DSQRT(DALPHA(I))*DSQRT(DBETA(I))
1472        IF(DH(I).LT.DHMIN)THEN
1473          DHMIN=DH(I)
1474          IR=I
1475        ENDIF
1476C
1477        IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'EML1')THEN
1478          WRITE(ICOUT,999)
1479          CALL DPWRST('XXX','WRIT')
1480          WRITE(ICOUT,2125)I,IR,Y(I),DALPHA(I),DBETA(I),DH(I),DHMIN
1481 2125     FORMAT('I,IR,Y(I),DALPHA(I),DBETA(I),DH(I),DHMIN = ',
1482     1           2I8,5G15.7)
1483          CALL DPWRST('XXX','WRIT')
1484        ENDIF
1485C
1486 2110 CONTINUE
1487C
1488      IF(IR.EQ.1)THEN
1489        WRITE(ICOUT,999)
1490        CALL DPWRST('XXX','WRIT')
1491        WRITE(ICOUT,2131)
1492 2131   FORMAT('***** ERROR IN ASYMMETRIC DOUBLE EXPONENTIAL ',
1493     1       'MAXIMUM LIKELIHOOD--')
1494        CALL DPWRST('XXX','WRIT')
1495        WRITE(ICOUT,2133)
1496 2133   FORMAT('      ESTIMATE OF LOCATION PARAMTER EQUALS DATA ',
1497     1       'MINIMUM.  THE MAXIMUM')
1498        CALL DPWRST('XXX','WRIT')
1499        WRITE(ICOUT,2135)
1500 2135   FORMAT('      LIKELIHOOD ESTIMATES DO NOT EXIST.  HOWEVER, ')
1501        CALL DPWRST('XXX','WRIT')
1502        WRITE(ICOUT,2137)
1503 2137   FORMAT('      THIS IMPLIES THAT AN EXPONENTIAL MODEL IS ',
1504     1         'APPROPRIATE.')
1505        CALL DPWRST('XXX','WRIT')
1506        IERROR='YES'
1507        GOTO9000
1508      ELSEIF(IR.EQ.N)THEN
1509        WRITE(ICOUT,999)
1510        CALL DPWRST('XXX','WRIT')
1511        WRITE(ICOUT,2131)
1512        CALL DPWRST('XXX','WRIT')
1513        WRITE(ICOUT,2143)
1514 2143   FORMAT('      ESTIMATE OF LOCATION PARAMTER EQUALS DATA ',
1515     1       'MAXIMUM.  THE MAXIMUM')
1516        CALL DPWRST('XXX','WRIT')
1517        WRITE(ICOUT,2145)
1518 2145   FORMAT('      LIKELIHOOD ESTIMATES DO NOT EXIST.  HOWEVER, ')
1519        CALL DPWRST('XXX','WRIT')
1520        WRITE(ICOUT,2147)
1521 2147   FORMAT('      THIS IMPLIES THAT A NEGATIVE EXPONENTIAL ',
1522     1         'MODEL IS APPROPRIATE.')
1523        CALL DPWRST('XXX','WRIT')
1524        IERROR='YES'
1525        GOTO9000
1526      ELSE
1527        ALOCML=Y(IR)
1528      ENDIF
1529C
1530      DTERM1=DBETA(IR)**(1.0D0/4.0D0)
1531      DTERM2=DALPHA(IR)**(1.0D0/4.0D0)
1532      DTERM3=DSQRT(DBETA(IR))
1533      DTERM4=DSQRT(DALPHA(IR))
1534      IF(DTERM2.LE.0.0D0)THEN
1535        WRITE(ICOUT,999)
1536        CALL DPWRST('XXX','WRIT')
1537        WRITE(ICOUT,2131)
1538        CALL DPWRST('XXX','WRIT')
1539        WRITE(ICOUT,2153)
1540 2153   FORMAT('      INFINITE VALUE FOR THE SHAPE PARAMETER.')
1541        CALL DPWRST('XXX','WRIT')
1542        WRITE(ICOUT,2155)
1543 2155   FORMAT('      THE CAUSE OF THIS IS TIES FOR THE ',
1544     1         'MAXIMUM DATA VALUE AND')
1545        CALL DPWRST('XXX','WRIT')
1546        WRITE(ICOUT,2157)
1547 2157   FORMAT('      THE ESTIMATE OF THE LOCATION PARAMETER ',
1548     1         'OCCURS AT THE DATA MAXIMUM.')
1549        CALL DPWRST('XXX','WRIT')
1550        IERROR='YES'
1551        GOTO9000
1552      ENDIF
1553      AKML=DTERM1/DTERM2
1554      SCALML=DSQRT(2.0D0)*DTERM2*DTERM1*(DTERM3 + DTERM4)
1555C
1556 9000 CONTINUE
1557      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'EML1')THEN
1558        WRITE(ICOUT,999)
1559        CALL DPWRST('XXX','WRIT')
1560        WRITE(ICOUT,9011)
1561 9011   FORMAT('**** AT THE END OF ADEML1--')
1562        CALL DPWRST('XXX','WRIT')
1563        WRITE(ICOUT,9013)N,XMEAN,XSD,XMIN,XMAX
1564 9013   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
1565        CALL DPWRST('XXX','WRIT')
1566        WRITE(ICOUT,9019)ALOCML,SCALML,AKML
1567 9019   FORMAT('ALOCML,SCALML,AKML =  ',3G15.7)
1568        CALL DPWRST('XXX','WRIT')
1569        WRITE(ICOUT,9021)IERROR
1570 9021   FORMAT('IERROR = ',A4)
1571        CALL DPWRST('XXX','WRIT')
1572      ENDIF
1573C
1574      RETURN
1575      END
1576      SUBROUTINE ADEPDF(X,AK,IADEDF,PDF)
1577C
1578C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
1579C              FUNCTION VALUE FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1580C              (OR ASYMMETRIC DOUBLE EXPONENTIAL)
1581C              WITH SHAPE PARAMETER = K.
1582C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
1583C              THE PROBABILITY DENSITY FUNCTION
1584C                 ADEPDF(X,K) = (SQRT(2)*K/(1+K^2))*
1585C                               EXP(-SQRT(2)*K*ABS(X))  X >= 0
1586C                 ADEPDF(X,K) = (SQRT(2)*K/(1+K^2))*
1587C                               EXP((-SQRT(2)/K)*ABS(X))  X < 0
1588C     INPUT  ARGUMENTS--X     = THE SINGLE PRECISION VALUE AT
1589C                               WHICH THE PROBABILITY DENSITY
1590C                               FUNCTION IS TO BE EVALUATED.
1591C                               X SHOULD BE NON-NEGATIVE.
1592C                     --AK    = THE SHAPE PARAMETER
1593C     OUTPUT ARGUMENTS--PDF   = THE SINGLE PRECISION PROBABILITY
1594C                               DENSITY FUNCTION VALUE.
1595C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY FUNCTION
1596C             VALUE PDF FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1597C             WITH SHAPE PARAMETER = K.
1598C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1599C     RESTRICTIONS--NONE.
1600C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
1601C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
1602C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
1603C     LANGUAGE--ANSI FORTRAN (1977)
1604C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
1605C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
1606C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
1607C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
1608C                 PP. 134.
1609C     WRITTEN BY--JAMES J. FILLIBEN
1610C                 STATISTICAL ENGINEERING DIVISION
1611C                 INFORMATION TECHNOLOGY LABORATORY
1612C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
1613C                 GAITHERSBURG, MD 20899-8980
1614C                 PHONE--301-975-2855
1615C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1616C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1617C     LANGUAGE--ANSI FORTRAN (1977)
1618C     VERSION NUMBER--2004.6
1619C     ORIGINAL VERSION--JUNE      2004.
1620C
1621C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1622C
1623C---------------------------------------------------------------------
1624C
1625      DOUBLE PRECISION DX
1626      DOUBLE PRECISION DK
1627      DOUBLE PRECISION DPDF
1628      DOUBLE PRECISION DTERM1
1629C
1630      CHARACTER*4 IADEDF
1631C
1632C---------------------------------------------------------------------
1633C
1634      INCLUDE 'DPCOP2.INC'
1635C
1636C-----DATA STATEMENTS-------------------------------------------------
1637C
1638C-----START POINT-----------------------------------------------------
1639C
1640C               ************************************
1641C               **  STEP 1--                      **
1642C               **  COMPUTE THE DENSITY FUNCTION  **
1643C               ************************************
1644C
1645      IF(IADEDF.EQ.'K')THEN
1646        IF(AK.LE.0.0)THEN
1647          WRITE(ICOUT,5)
1648          CALL DPWRST('XXX','WRIT')
1649          WRITE(ICOUT,48)AK
1650          CALL DPWRST('XXX','WRIT')
1651          PDF=0.0
1652          GOTO9000
1653        ENDIF
1654      ELSE
1655        AK=SQRT(2.0)/(AK + SQRT(2.0 + AK*AK))
1656      ENDIF
1657    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER (K) IN ADEPDF ',
1658     1       'ROUTINE IS NEGATIVE.')
1659   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
1660C
1661      DX=DBLE(X)
1662      DK=DBLE(AK)
1663C
1664      DTERM1=DSQRT(2.0D0)*DK/(1.0D0+DK*DK)
1665      IF(X.LT.0.0)THEN
1666        DPDF=DTERM1*DEXP((-DSQRT(2.0D0)/DK)*DABS(DX))
1667      ELSE
1668        DPDF=DTERM1*DEXP(-DSQRT(2.0D0)*DK*DABS(DX))
1669      ENDIF
1670      PDF=REAL(DPDF)
1671C
1672 9000 CONTINUE
1673      RETURN
1674      END
1675      SUBROUTINE ADEPPF(P,AK,IADEDF,PPF)
1676C
1677C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
1678C              FUNCTION VALUE FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1679C              (OR ASYMMETRIC DOUBLE EXPONENTIAL)
1680C              WITH SHAPE PARAMETER = K.
1681C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
1682C              THE PERCENT POINT FUNCTION
1683C                 G(P,K) = (K/SQRT(2))*LOG[((1+K**2)/K**2)*P]
1684C                               0 < P < K**2/(1+K**2)
1685C                 G(P,K) = (-1/(K*SQRT(2)))*LOG[((1+K**2)*(1-P)]
1686C                               K**2/(1+K**2) < P < 1
1687C     INPUT  ARGUMENTS--P     = THE SINGLE PRECISION VALUE AT
1688C                               WHICH THE PERCENT POINT
1689C                               FUNCTION IS TO BE EVALUATED.
1690C                               P SHOULD BE IN THE INTERVAL (0,1).
1691C                     --AK    = THE SHAPE PARAMETER
1692C     OUTPUT ARGUMENTS--PPF   = THE SINGLE PRECISION PERCENT POINT
1693C                               FUNCTION VALUE.
1694C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION
1695C             VALUE PPF FOR THE ASYMMETRIC LAPLACE DISTRIBUTION
1696C             WITH SHAPE PARAMETER = K.
1697C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1698C     RESTRICTIONS--NONE.
1699C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
1700C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
1701C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
1702C     LANGUAGE--ANSI FORTRAN (1977)
1703C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
1704C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
1705C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
1706C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
1707C                 PP. 134.
1708C     WRITTEN BY--JAMES J. FILLIBEN
1709C                 STATISTICAL ENGINEERING DIVISION
1710C                 INFORMATION TECHNOLOGY LABORATORY
1711C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
1712C                 GAITHERSBURG, MD 20899-8980
1713C                 PHONE--301-975-2855
1714C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1715C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1716C     LANGUAGE--ANSI FORTRAN (1977)
1717C     VERSION NUMBER--2004.6
1718C     ORIGINAL VERSION--JUNE      2004.
1719C
1720C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1721C
1722C---------------------------------------------------------------------
1723C
1724      DOUBLE PRECISION DP
1725      DOUBLE PRECISION DK
1726      DOUBLE PRECISION DPPF
1727C
1728      CHARACTER*4 IADEDF
1729C
1730C---------------------------------------------------------------------
1731C
1732      INCLUDE 'DPCOP2.INC'
1733C
1734C-----DATA STATEMENTS-------------------------------------------------
1735C
1736C-----START POINT-----------------------------------------------------
1737C
1738C               ************************************
1739C               **  STEP 1--                      **
1740C               **  COMPUTE THE DENSITY FUNCTION  **
1741C               ************************************
1742C
1743      IF(P.LE.0.0.OR.P.GE.1.0)THEN
1744         WRITE(ICOUT,61)
1745   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
1746     1          'TO THE ADEPPF SUBROUTINE ')
1747         CALL DPWRST('XXX','BUG ')
1748         WRITE(ICOUT,62)
1749   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
1750         CALL DPWRST('XXX','BUG ')
1751         WRITE(ICOUT,63)P
1752   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
1753         CALL DPWRST('XXX','BUG ')
1754         PPF=0.0
1755         GOTO9000
1756      ENDIF
1757C
1758C
1759      IF(IADEDF.EQ.'K')THEN
1760        IF(AK.LE.0.0)THEN
1761          WRITE(ICOUT,5)
1762          CALL DPWRST('XXX','WRIT')
1763          WRITE(ICOUT,48)AK
1764          CALL DPWRST('XXX','WRIT')
1765          PPF=0.0
1766          GOTO9000
1767        ENDIF
1768      ELSE
1769        AK=SQRT(2.0)/(AK + SQRT(2.0 + AK*AK))
1770      ENDIF
1771    5 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER (K) IN ADEPPF ',
1772     1       'ROUTINE IS NEGATIVE.')
1773   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
1774C
1775      DP=DBLE(P)
1776      DK=DBLE(AK)
1777      PCUT=AK**2/(1.0+AK**2)
1778C
1779      IF(P.LT.PCUT)THEN
1780        DPPF=(DK/DSQRT(2.0D0))*DLOG(((1.0D0+DK*DK)/(DK*DK))*DP)
1781      ELSE
1782        DPPF=(-1.0D0/(DSQRT(2.0D0)*DK))*DLOG((1.0D0+DK*DK)*(1.0D0-DP))
1783      ENDIF
1784      PPF=REAL(DPPF)
1785C
1786 9000 CONTINUE
1787      RETURN
1788      END
1789      SUBROUTINE ADERAN(N,AK,IADEDF,ISEED,X)
1790C
1791C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
1792C              FROM THE ASYMMETRIC DOUBLE EXPONENTIAL (LAPLACE)
1793C              DISTRIBUTION WITH SHAPE PARAMETER = AK.
1794C              THIS DISTRIBUTION IS DEFINED FOR ALL X AND HAS
1795C              THE PROBABILITY DENSITY FUNCTION
1796C                 ADEPDF(X,K) = (SQRT(2)*K/(1+K^2))*
1797C                               EXP(-SQRT(2)*K*ABS(X))  X >= 0
1798C                 ADEPDF(X,K) = (SQRT(2)*K/(1+K^2))*
1799C                               EXP((-SQRT(2)/K)*ABS(X))  X < 0
1800C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
1801C                                OF RANDOM NUMBERS TO BE
1802C                                GENERATED.
1803C                     --AK     = THE SHAPE (PARAMETER) FOR THE
1804C                                ASYMMETRIC DOUBLE EXPONENTIAL
1805C                                DISTRIBUTION.
1806C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
1807C                                (OF DIMENSION AT LEAST N)
1808C                                INTO WHICH THE GENERATED
1809C                                RANDOM SAMPLE WILL BE PLACED.
1810C     OUTPUT--A RANDOM SAMPLE OF SIZE N
1811C             FROM THE ASYMMETRIC DOUBLE EXPONENTIAL DISTRIBUTION
1812C             WITH SHAPE PARAMETER = AK.
1813C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
1814C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
1815C                   OF N FOR THIS SUBROUTINE.
1816C                 --AK CAN BE ANY REAL NUMBER.
1817C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
1818C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
1819C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
1820C     LANGUAGE--ANSI FORTRAN (1977)
1821C     REFERENCES--KOTZ, KOZUBOWSKI, AND PODGORSKI, "THE LAPLACE
1822C                 DISTRIBUTION AND GENERALIZATIONS: A REVISIT WITH
1823C                 APPLICATIONS TO COMMUNICATIONS, ECONOMICS,
1824C                 ENGINEERING, AND FINANCE", BIRKHAUSR, 2001,
1825C                 PP. 134-149.
1826C     WRITTEN BY--JAMES J. FILLIBEN
1827C                 STATISTICAL ENGINEERING DIVISION
1828C                 INFORMATION TECHNOLOGY LABORATORY
1829C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
1830C                 GAITHERSBURG, MD 20899-8980
1831C                 PHONE--301-975-2855
1832C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1833C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
1834C     LANGUAGE--ANSI FORTRAN (1977)
1835C     VERSION NUMBER--2004.6
1836C     ORIGINAL VERSION--JUNE      2004.
1837C
1838C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1839C
1840C---------------------------------------------------------------------
1841C
1842      DIMENSION X(*)
1843      DIMENSION Y(2)
1844C
1845      CHARACTER*4 IADEDF
1846C
1847      DOUBLE PRECISION U1
1848      DOUBLE PRECISION U2
1849      DOUBLE PRECISION DK
1850      DOUBLE PRECISION DPPF
1851C
1852C---------------------------------------------------------------------
1853C
1854      INCLUDE 'DPCOP2.INC'
1855C
1856C-----DATA STATEMENTS-------------------------------------------------
1857C
1858C-----START POINT-----------------------------------------------------
1859C
1860C     CHECK THE INPUT ARGUMENTS FOR ERRORS
1861C
1862      IF(N.LT.1)THEN
1863        WRITE(ICOUT,5)
1864        CALL DPWRST('XXX','BUG ')
1865        WRITE(ICOUT,6)
1866        CALL DPWRST('XXX','BUG ')
1867        WRITE(ICOUT,47)N
1868        CALL DPWRST('XXX','BUG ')
1869        GOTO9999
1870      ENDIF
1871      IF(IADEDF.EQ.'K')THEN
1872        IF(AK.LE.0.0)THEN
1873          WRITE(ICOUT,15)
1874          CALL DPWRST('XXX','WRIT')
1875          WRITE(ICOUT,48)AK
1876          CALL DPWRST('XXX','WRIT')
1877          PDF=0.0
1878          GOTO9999
1879        ENDIF
1880      ELSE
1881        AK=SQRT(2.0)/(AK + SQRT(2.0 + AK*AK))
1882      ENDIF
1883   15 FORMAT('***** ERROR: VALUE OF SHAPE PARAMETER (K) IS ',
1884     1       'NON-POSITIVE.')
1885C
1886    5 FORMAT('***** ERROR--FOR THE ASYMMETRIC DOUBLE EXPONENTIAL ',
1887     1       'DISTRIBUTION,')
1888    6 FORMAT('       THE REQUESTED NUMBER OF RANDOM NUMBERS WAS ',
1889     1      'NON-POSITIVE.')
1890   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
1891   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
1892C
1893C     USE PERCENT POINT TRANSFORMATION METHOD.
1894C
1895      NTEMP=2
1896      DK=DBLE(AK)
1897      DO100I=1,N
1898        CALL UNIRAN(NTEMP,ISEED,Y)
1899        U1=DBLE(Y(1))
1900        U2=DBLE(Y(2))
1901        DPPF=(1.0D0/DSQRT(2.0D0))*DLOG(U1**DK/(U2**(1.0D0/DK)))
1902        X(I)=REAL(DPPF)
1903  100 CONTINUE
1904C
1905 9999 CONTINUE
1906      RETURN
1907      END
1908      SUBROUTINE ADJUS2(IHARG,IHARG2,IARG,ARG,IARGT,NUMARG)
1909C
1910C     PURPOSE--PACK < = INTO <=
1911C              PACK = < INTO =<
1912C              PACK > = INTO >=
1913C              PACK = > INTO =>
1914C              PACK < > INTO <>
1915C      NOTE--THIS PACKING IS DONE BECAUSE SUBROUTINE DPTYPE
1916C            AUTOMATICALLY PUTS SPACES AROUND
1917C            AN EQUAL SIGN AND PUTS THE EQUAL SIGN
1918C            IN A SEPARATE WORD.
1919C     NOTE--NUMARG IS CHANGED BY THIS SUBROUTINE.
1920C     WRITTEN BY--JAMES J. FILLIBEN
1921C                 STATISTICAL ENGINEERING DIVISION
1922C                 INFORMATION TECHNOLOGY LABORATORY
1923C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
1924C                 GAITHERSBURG, MD 20899-8980
1925C                 PHONE--301-921-3651
1926C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
1927C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
1928C     LANGUAGE--ANSI FORTRAN (1977)
1929C     VERSION NUMBER--82/7
1930C     ORIGINAL VERSION--SEPTEMBER 1981.
1931C     UPDATED         --MAY       1982.
1932C     UPDATED         --MARCH     1988. ALLOW    NOT EQUAL   <> >< NOT=
1933C
1934C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
1935C
1936      CHARACTER*4 IHARG
1937      CHARACTER*4 IHARG2
1938      CHARACTER*4 IARGT
1939C
1940      CHARACTER*4 ISUBN1
1941      CHARACTER*4 ISUBN2
1942C
1943C---------------------------------------------------------------------
1944C
1945      DIMENSION IHARG(*)
1946      DIMENSION IHARG2(*)
1947      DIMENSION IARG(*)
1948      DIMENSION ARG(*)
1949      DIMENSION IARGT(*)
1950C
1951C---------------------------------------------------------------------
1952C
1953      INCLUDE 'DPCOP2.INC'
1954C
1955C-----START POINT-----------------------------------------------------
1956C
1957      ISUBN1='ADJU'
1958      ISUBN2='S2  '
1959C
1960      IMAX=NUMARG-1
1961      IF(1.GT.IMAX)GOTO9000
1962      DO100I=1,IMAX
1963      IP1=I+1
1964      IF(IP1.GT.NUMARG)GOTO9000
1965      IF(IHARG(I).EQ.'<   '.AND.IHARG(IP1).EQ.'=   ')GOTO110
1966      IF(IHARG(I).EQ.'=   '.AND.IHARG(IP1).EQ.'<   ')GOTO120
1967      IF(IHARG(I).EQ.'>   '.AND.IHARG(IP1).EQ.'=   ')GOTO130
1968      IF(IHARG(I).EQ.'=   '.AND.IHARG(IP1).EQ.'>   ')GOTO140
1969      IF(IHARG(I).EQ.'<   '.AND.IHARG(IP1).EQ.'>   ')GOTO150
1970      IF(IHARG(I).EQ.'>   '.AND.IHARG(IP1).EQ.'<   ')GOTO160
1971      IF(IHARG(I).EQ.'NOT '.AND.IHARG(IP1).EQ.'=   ')GOTO170
1972      GOTO100
1973C
1974  110 CONTINUE
1975      IHARG(I)='<=  '
1976      IHARG2(I)='    '
1977      GOTO250
1978  120 CONTINUE
1979      IHARG(I)='=<  '
1980      IHARG2(I)='    '
1981      GOTO250
1982  130 CONTINUE
1983      IHARG(I)='>=  '
1984      IHARG2(I)='    '
1985      GOTO250
1986  140 CONTINUE
1987      IHARG(I)='=>  '
1988      IHARG2(I)='    '
1989      GOTO250
1990  150 CONTINUE
1991      IHARG(I)='<>  '
1992      IHARG2(I)='    '
1993      GOTO250
1994  160 CONTINUE
1995      IHARG(I)='><  '
1996      IHARG2(I)='    '
1997      GOTO250
1998  170 CONTINUE
1999      IHARG(I)='NOT='
2000      IHARG2(I)='    '
2001      GOTO250
2002C
2003  250 CONTINUE
2004      JMAX=NUMARG-1
2005      IF(IP1.GT.JMAX)GOTO265
2006      DO260J=IP1,JMAX
2007      JP1=J+1
2008      IHARG(J)=IHARG(JP1)
2009      IHARG2(J)=IHARG2(JP1)
2010      IARGT(J)=IARGT(JP1)
2011      IARG(J)=IARG(JP1)
2012      ARG(J)=ARG(JP1)
2013  260 CONTINUE
2014  265 CONTINUE
2015      NUMARG=NUMARG-1
2016  100 CONTINUE
2017C
2018 9000 CONTINUE
2019C
2020      RETURN
2021      END
2022      SUBROUTINE ADJUST(ILASTC,IHARG,IHARG2,IARG,ARG,IARGT,NUMARG)
2023C
2024C     PURPOSE--ADJUST THE IHARG,IHARG2, IARG, ARG, AND IARGT VECTORS
2025C              AS WELL AS THE VALUE OF NUMARG
2026C              WHEN HAVE MULTIPLE-WORD COMMANDS;
2027C              THE ADJUSTMENT RESULTS IN THE
2028C              FIRST ARGUMENT AFTER THE LAST WORD OF THE COMMAND
2029C              BEING MAPPED INTO IHARG(1), ETC.
2030C     NOTE--ILASTC IS THE CURRENT ARGUMENT NUMBER IN IHARG
2031C           OF THE CURRENT LAST WORD IN THE COMMAND PART
2032C           OF THE COMMAND STATEMENT.
2033C     WRITTEN BY--JAMES J. FILLIBEN
2034C                 STATISTICAL ENGINEERING DIVISION
2035C                 INFORMATION TECHNOLOGY LABORATORY
2036C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
2037C                 GAITHERSBURG, MD 20899-8980
2038C                 PHONE--301-921-3651
2039C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
2040C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
2041C     LANGUAGE--ANSI FORTRAN (1977)
2042C     VERSION NUMBER--82/7
2043C     ORIGINAL VERSION--APRIL     1978.
2044C     UPDATED         --JUNE      1978.
2045C     UPDATED         --JANUARY   1981.
2046C     UPDATED         --JULY      1981.
2047C     UPDATED         --NOVEMBER  1981.
2048C     UPDATED         --MAY       1982.
2049C
2050C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
2051C
2052      CHARACTER*4 IHARG
2053      CHARACTER*4 IHARG2
2054      CHARACTER*4 IARGT
2055C
2056      CHARACTER*4 IBUGAD
2057C
2058C---------------------------------------------------------------------
2059C
2060      DIMENSION IHARG(*)
2061      DIMENSION IHARG2(*)
2062      DIMENSION IARG(*)
2063      DIMENSION ARG(*)
2064      DIMENSION IARGT(*)
2065C
2066C---------------------------------------------------------------------
2067C
2068      INCLUDE 'DPCOP2.INC'
2069C
2070C-----START POINT-----------------------------------------------------
2071C
2072      IBUGAD='OFF'
2073C
2074      IF(IBUGAD.EQ.'OFF')GOTO90
2075      WRITE(ICOUT,999)
2076  999 FORMAT(1X)
2077      CALL DPWRST('XXX','BUG ')
2078      WRITE(ICOUT,51)
2079   51 FORMAT('***** AT THE BEGINNING OF ADJUST--')
2080      CALL DPWRST('XXX','BUG ')
2081      WRITE(ICOUT,52)ILASTC,NUMARG
2082   52 FORMAT('ILASTC,NUMARG = ',2I8)
2083      CALL DPWRST('XXX','BUG ')
2084      DO55I=1,NUMARG
2085      WRITE(ICOUT,56)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
2086   56 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
2087     1I8,2X,A4,A4,I8,E15.7,2X,A4)
2088      CALL DPWRST('XXX','BUG ')
2089   55 CONTINUE
2090   90 CONTINUE
2091C
2092      ILASTP=ILASTC+1
2093      IF(ILASTP.GT.NUMARG)GOTO150
2094      J=0
2095      DO100I=ILASTP,NUMARG
2096      J=J+1
2097      IHARG(J)=IHARG(I)
2098      IHARG2(J)=IHARG2(I)
2099      IARG(J)=IARG(I)
2100      ARG(J)=ARG(I)
2101      IARGT(J)=IARGT(I)
2102  100 CONTINUE
2103      NUMARG=J
2104      GOTO9000
2105C
2106  150 CONTINUE
2107      NUMARG=0
2108      GOTO9000
2109C
2110C               *****************
2111C               **  STEP 90--  **
2112C               **  EXIT       **
2113C               *****************
2114C
2115 9000 CONTINUE
2116      IF(IBUGAD.EQ.'OFF')GOTO9090
2117      WRITE(ICOUT,999)
2118      CALL DPWRST('XXX','BUG ')
2119      WRITE(ICOUT,9011)
2120 9011 FORMAT('***** AT THE END       OF ADJUST--')
2121      CALL DPWRST('XXX','BUG ')
2122      WRITE(ICOUT,9012)ILASTC,NUMARG
2123 9012 FORMAT('ILASTC,NUMARG = ',2I8)
2124      CALL DPWRST('XXX','BUG ')
2125      DO9015I=1,NUMARG
2126      WRITE(ICOUT,9016)I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I)
2127 9016 FORMAT('I,IHARG(I),IHARG2(I),IARG(I),ARG(I),IARGT(I) = ',
2128     1I8,2X,A4,A4,I8,E15.7,2X,A4)
2129      CALL DPWRST('XXX','BUG ')
2130 9015 CONTINUE
2131 9090 CONTINUE
2132C
2133      RETURN
2134      END
2135      SUBROUTINE ADJUS3(NVAR, X, Y, Z, LOCZ, NX, NY, NZ, DIM, CONFIG, D)
2136C
2137C     NOTE: FOR DATAPLOT, RENAME TO AVOID NAME CONFLICT.
2138C
2139CCCCC SUBROUTINE ADJUST(NVAR, X, Y, Z, LOCZ, NX, NY, NZ, DIM, CONFIG, D)
2140C
2141C        ALGORITHM AS 51.2  APPL. STATIST. (1972) VOL.21, P.218
2142C
2143C        MAKES PROPORTIONAL ADJUSTMENT CORRESPONDING TO CONFIG.
2144C        ALL PARAMETERS ARE ASSUMED VALID WITHOUT TEST.
2145C
2146C        IF THE VALUE OF NVAR IS TO BE GREATER THAN 7, THE
2147C        DIMENSIONS IN THE DECLARATIONS OF SIZE AND COORD MUST
2148C        BE INCREASED TO NVAR+1 AND NVAR RESPECTIVELY.
2149C
2150      INTEGER SIZE(8), DIM(NVAR), CONFIG(NVAR), COORD(7)
2151      REAL X(NX), Y(NY), Z(NZ), D, E, ZERO, ZABS
2152C
2153      DATA ZERO /0.0/
2154C
2155      ZABS(E) = ABS(E)
2156C
2157C        SET SIZE ARRAY
2158C
2159      SIZE(1) = 1
2160      DO 10 K = 1, NVAR
2161         L = CONFIG(K)
2162         IF (L .EQ. 0) GOTO 20
2163         SIZE(K + 1) = SIZE(K) * DIM(L)
2164   10 CONTINUE
2165C
2166C        FIND NUMBER OF VARIABLES IN CONFIGURATION
2167C
2168      K = NVAR + 1
2169   20 CONTINUE
2170      N = K - 1
2171C
2172C        TEST SIZE OF DEVIATION
2173C
2174      L = SIZE(K)
2175      J = 1
2176      K = LOCZ
2177      DO 30 I = 1, L
2178         E = ZABS(Z(K) - Y(J))
2179         IF (E .GT. D) D = E
2180         J = J + 1
2181         K = K + 1
2182   30 CONTINUE
2183C
2184C        INITIALIZE COORDINATES
2185C
2186      DO 40 K = 1, NVAR
2187         COORD(K) = 0
2188   40 CONTINUE
2189      I = 1
2190C
2191C        PERFORM ADJUSTMENT
2192C
2193   50 CONTINUE
2194      J = 0
2195      DO 60 K = 1, N
2196         L = CONFIG(K)
2197         J = J + COORD(L) * SIZE(K)
2198   60 CONTINUE
2199      K = J + LOCZ
2200      J = J + 1
2201C
2202C        NOTE THAT Y(J) SHOULD BE NON-NEGATIVE
2203C
2204      IF (Y(J) .LE. ZERO) X(I) = ZERO
2205      IF (Y(J) .GT. ZERO) X(I) = X(I) * Z(K) / Y(J)
2206C
2207C        UPDATE COORDINATES
2208C
2209      I = I + 1
2210      DO 70 K = 1, NVAR
2211         COORD(K) = COORD(K) + 1
2212         IF (COORD(K) .LT. DIM(K)) GOTO 50
2213         COORD(K) = 0
2214   70 CONTINUE
2215C
2216      RETURN
2217      END
2218      FUNCTION AI (X)
2219C***BEGIN PROLOGUE  AI
2220C***PURPOSE  Evaluate the Airy function.
2221C***LIBRARY   SLATEC (FNLIB)
2222C***CATEGORY  C10D
2223C***TYPE      SINGLE PRECISION (AI-S, DAI-D)
2224C***KEYWORDS  AIRY FUNCTION, FNLIB, SPECIAL FUNCTIONS
2225C***AUTHOR  Fullerton, W., (LANL)
2226C***DESCRIPTION
2227C
2228C AI(X) computes the Airy function Ai(X)
2229C Series for AIF        on the interval -1.00000D+00 to  1.00000D+00
2230C                                        with weighted error   1.09E-19
2231C                                         log weighted error  18.96
2232C                               significant figures required  17.76
2233C                                    decimal places required  19.44
2234C
2235C Series for AIG        on the interval -1.00000D+00 to  1.00000D+00
2236C                                        with weighted error   1.51E-17
2237C                                         log weighted error  16.82
2238C                               significant figures required  15.19
2239C                                    decimal places required  17.27
2240C
2241C***REFERENCES  (NONE)
2242C***ROUTINES CALLED  AIE, CSEVL, INITS, R1MACH, R9AIMP, XERMSG
2243C***REVISION HISTORY  (YYMMDD)
2244C   770701  DATE WRITTEN
2245C   890531  Changed all specific intrinsics to generic.  (WRB)
2246C   890531  REVISION DATE from Version 3.2
2247C   891214  Prologue converted to Version 4.0 format.  (BAB)
2248C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
2249C   900326  Removed duplicate information from DESCRIPTION section.
2250C           (WRB)
2251C   920618  Removed space from variable names.  (RWC, WRB)
2252C***END PROLOGUE  AI
2253C
2254C-----COMMON----------------------------------------------------------
2255C
2256      INCLUDE 'DPCOMC.INC'
2257      INCLUDE 'DPCOP2.INC'
2258C
2259      DIMENSION AIFCS(9), AIGCS(8)
2260      LOGICAL FIRST
2261      SAVE AIFCS, AIGCS, NAIF, NAIG, X3SML, XMAX, FIRST
2262      DATA AIFCS( 1) /   -.0379713584 9666999750E0 /
2263      DATA AIFCS( 2) /    .0591918885 3726363857E0 /
2264      DATA AIFCS( 3) /    .0009862928 0577279975E0 /
2265      DATA AIFCS( 4) /    .0000068488 4381907656E0 /
2266      DATA AIFCS( 5) /    .0000000259 4202596219E0 /
2267      DATA AIFCS( 6) /    .0000000000 6176612774E0 /
2268      DATA AIFCS( 7) /    .0000000000 0010092454E0 /
2269      DATA AIFCS( 8) /    .0000000000 0000012014E0 /
2270      DATA AIFCS( 9) /    .0000000000 0000000010E0 /
2271      DATA AIGCS( 1) /    .0181523655 8116127E0 /
2272      DATA AIGCS( 2) /    .0215725631 6601076E0 /
2273      DATA AIGCS( 3) /    .0002567835 6987483E0 /
2274      DATA AIGCS( 4) /    .0000014265 2141197E0 /
2275      DATA AIGCS( 5) /    .0000000045 7211492E0 /
2276      DATA AIGCS( 6) /    .0000000000 0952517E0 /
2277      DATA AIGCS( 7) /    .0000000000 0001392E0 /
2278      DATA AIGCS( 8) /    .0000000000 0000001E0 /
2279      DATA FIRST /.TRUE./
2280C***FIRST EXECUTABLE STATEMENT  AI
2281      IF (FIRST) THEN
2282         NAIF = INITS (AIFCS, 9, 0.1*R1MACH(3))
2283         NAIG = INITS (AIGCS, 8, 0.1*R1MACH(3))
2284C
2285         X3SML = R1MACH(3)**0.3334
2286         XMAXT = (-1.5*LOG(R1MACH(1)))**0.6667
2287         XMAX = XMAXT - XMAXT*LOG(XMAXT)/
2288     *                   (4.0*SQRT(XMAXT)+1.0) - 0.01
2289      ENDIF
2290      FIRST = .FALSE.
2291C
2292      IF (X.GE.(-1.0)) GO TO 20
2293      CALL R9AIMP (X, XM, THETA)
2294      AI = XM * COS(THETA)
2295      RETURN
2296C
2297 20   IF (X.GT.1.0) GO TO 30
2298      Z = 0.0
2299      IF (ABS(X).GT.X3SML) Z = X**3
2300      AI = 0.375 + (CSEVL (Z, AIFCS, NAIF) - X*(0.25 +
2301     1  CSEVL (Z, AIGCS, NAIG)) )
2302      RETURN
2303C
2304 30   IF (X.GT.XMAX) GO TO 40
2305      AI = AIE(X) * EXP(-2.0*X*SQRT(X)/3.0)
2306      RETURN
2307C
2308 40   AI = 0.0
2309      WRITE(ICOUT,1)
2310      CALL DPWRST('XXX','BUG ')
2311    1 FORMAT('***** WARNING FROM AI, UNDERFLOW BECAUSE THE ',
2312     1       'VALUE OF X IS SO BIG.  ****')
2313      RETURN
2314C
2315      END
2316      FUNCTION AIE (X)
2317C***BEGIN PROLOGUE  AIE
2318C***PURPOSE  Calculate the Airy function for a negative argument and an
2319C            exponentially scaled Airy function for a non-negative
2320C            argument.
2321C***LIBRARY   SLATEC (FNLIB)
2322C***CATEGORY  C10D
2323C***TYPE      SINGLE PRECISION (AIE-S, DAIE-D)
2324C***KEYWORDS  EXPONENTIALLY SCALED AIRY FUNCTION, FNLIB,
2325C             SPECIAL FUNCTIONS
2326C***AUTHOR  Fullerton, W., (LANL)
2327C***DESCRIPTION
2328C
2329C AIE(X) computes the exponentially scaled Airy function for
2330C non-negative X.  It evaluates AI(X) for X .LE. 0.0 and
2331C EXP(ZETA)*AI(X) for X .GE. 0.0 where ZETA = (2.0/3.0)*(X**1.5).
2332C
2333C Series for AIF        on the interval -1.00000D+00 to  1.00000D+00
2334C                                        with weighted error   1.09E-19
2335C                                         log weighted error  18.96
2336C                               significant figures required  17.76
2337C                                    decimal places required  19.44
2338C
2339C Series for AIG        on the interval -1.00000D+00 to  1.00000D+00
2340C                                        with weighted error   1.51E-17
2341C                                         log weighted error  16.82
2342C                               significant figures required  15.19
2343C                                    decimal places required  17.27
2344C
2345C Series for AIP        on the interval  0.          to  1.00000D+00
2346C                                        with weighted error   5.10E-17
2347C                                         log weighted error  16.29
2348C                               significant figures required  14.41
2349C                                    decimal places required  17.06
2350C
2351C***REFERENCES  (NONE)
2352C***ROUTINES CALLED  CSEVL, INITS, R1MACH, R9AIMP
2353C***REVISION HISTORY  (YYMMDD)
2354C   770701  DATE WRITTEN
2355C   890206  REVISION DATE from Version 3.2
2356C   891214  Prologue converted to Version 4.0 format.  (BAB)
2357C   920618  Removed space from variable names.  (RWC, WRB)
2358C***END PROLOGUE  AIE
2359C
2360C-----COMMON----------------------------------------------------------
2361C
2362      INCLUDE 'DPCOMC.INC'
2363      INCLUDE 'DPCOP2.INC'
2364C
2365      DIMENSION AIFCS(9), AIGCS(8), AIPCS(34)
2366      LOGICAL FIRST
2367      SAVE AIFCS, AIGCS, AIPCS, NAIF, NAIG,
2368     1 NAIP, X3SML, X32SML, XBIG, FIRST
2369      DATA AIFCS( 1) /   -.0379713584 9666999750E0 /
2370      DATA AIFCS( 2) /    .0591918885 3726363857E0 /
2371      DATA AIFCS( 3) /    .0009862928 0577279975E0 /
2372      DATA AIFCS( 4) /    .0000068488 4381907656E0 /
2373      DATA AIFCS( 5) /    .0000000259 4202596219E0 /
2374      DATA AIFCS( 6) /    .0000000000 6176612774E0 /
2375      DATA AIFCS( 7) /    .0000000000 0010092454E0 /
2376      DATA AIFCS( 8) /    .0000000000 0000012014E0 /
2377      DATA AIFCS( 9) /    .0000000000 0000000010E0 /
2378      DATA AIGCS( 1) /    .0181523655 8116127E0 /
2379      DATA AIGCS( 2) /    .0215725631 6601076E0 /
2380      DATA AIGCS( 3) /    .0002567835 6987483E0 /
2381      DATA AIGCS( 4) /    .0000014265 2141197E0 /
2382      DATA AIGCS( 5) /    .0000000045 7211492E0 /
2383      DATA AIGCS( 6) /    .0000000000 0952517E0 /
2384      DATA AIGCS( 7) /    .0000000000 0001392E0 /
2385      DATA AIGCS( 8) /    .0000000000 0000001E0 /
2386      DATA AIPCS( 1) /   -.0187519297 793868E0 /
2387      DATA AIPCS( 2) /   -.0091443848 250055E0 /
2388      DATA AIPCS( 3) /    .0009010457 337825E0 /
2389      DATA AIPCS( 4) /   -.0001394184 127221E0 /
2390      DATA AIPCS( 5) /    .0000273815 815785E0 /
2391      DATA AIPCS( 6) /   -.0000062750 421119E0 /
2392      DATA AIPCS( 7) /    .0000016064 844184E0 /
2393      DATA AIPCS( 8) /   -.0000004476 392158E0 /
2394      DATA AIPCS( 9) /    .0000001334 635874E0 /
2395      DATA AIPCS(10) /   -.0000000420 735334E0 /
2396      DATA AIPCS(11) /    .0000000139 021990E0 /
2397      DATA AIPCS(12) /   -.0000000047 831848E0 /
2398      DATA AIPCS(13) /    .0000000017 047897E0 /
2399      DATA AIPCS(14) /   -.0000000006 268389E0 /
2400      DATA AIPCS(15) /    .0000000002 369824E0 /
2401      DATA AIPCS(16) /   -.0000000000 918641E0 /
2402      DATA AIPCS(17) /    .0000000000 364278E0 /
2403      DATA AIPCS(18) /   -.0000000000 147475E0 /
2404      DATA AIPCS(19) /    .0000000000 060851E0 /
2405      DATA AIPCS(20) /   -.0000000000 025552E0 /
2406      DATA AIPCS(21) /    .0000000000 010906E0 /
2407      DATA AIPCS(22) /   -.0000000000 004725E0 /
2408      DATA AIPCS(23) /    .0000000000 002076E0 /
2409      DATA AIPCS(24) /   -.0000000000 000924E0 /
2410      DATA AIPCS(25) /    .0000000000 000417E0 /
2411      DATA AIPCS(26) /   -.0000000000 000190E0 /
2412      DATA AIPCS(27) /    .0000000000 000087E0 /
2413      DATA AIPCS(28) /   -.0000000000 000040E0 /
2414      DATA AIPCS(29) /    .0000000000 000019E0 /
2415      DATA AIPCS(30) /   -.0000000000 000009E0 /
2416      DATA AIPCS(31) /    .0000000000 000004E0 /
2417      DATA AIPCS(32) /   -.0000000000 000002E0 /
2418      DATA AIPCS(33) /    .0000000000 000001E0 /
2419      DATA AIPCS(34) /   -.0000000000 000000E0 /
2420      DATA FIRST /.TRUE./
2421C***FIRST EXECUTABLE STATEMENT  AIE
2422      IF (FIRST) THEN
2423         ETA = 0.1*R1MACH(3)
2424         NAIF  = INITS (AIFCS, 9, ETA)
2425         NAIG  = INITS (AIGCS, 8, ETA)
2426         NAIP  = INITS (AIPCS, 34, ETA)
2427C
2428         X3SML = ETA**0.3333
2429         X32SML = 1.3104*X3SML**2
2430         XBIG = R1MACH(2)**0.6666
2431      ENDIF
2432      FIRST = .FALSE.
2433C
2434      IF (X.GE.(-1.0)) GO TO 20
2435      CALL R9AIMP (X, XM, THETA)
2436      AIE = XM * COS(THETA)
2437      RETURN
2438C
2439 20   IF (X.GT.1.0) GO TO 30
2440      Z = 0.0
2441      IF (ABS(X).GT.X3SML) Z = X**3
2442      AIE = 0.375 + (CSEVL (Z, AIFCS, NAIF) - X*(0.25 +
2443     1  CSEVL (Z, AIGCS, NAIG)) )
2444      IF (X.GT.X32SML) AIE = AIE * EXP(2.0*X*SQRT(X)/3.0)
2445      RETURN
2446C
2447 30   SQRTX = SQRT(X)
2448      Z = -1.0
2449      IF (X.LT.XBIG) Z = 2.0/(X*SQRTX) - 1.0
2450      AIE = (.28125 + CSEVL (Z, AIPCS, NAIP))/SQRT(SQRTX)
2451      RETURN
2452C
2453      END
2454      DOUBLE PRECISION FUNCTION AIRINT(XVALUE)
2455C
2456C   DESCRIPTION:
2457C
2458C      This function calculates the integral of the Airy function Ai,
2459C      defined as
2460C
2461C         AIRINT(x) = {integral 0 to x} Ai(t) dt
2462C
2463C      The program uses Chebyshev expansions, the coefficients of which
2464C      are given to 20 decimal places.
2465C
2466C
2467C   ERROR RETURNS:
2468C
2469C      If the argument is too large and negative, it is impossible
2470C      to accurately compute the necessary SIN and COS functions.
2471C      An error message is printed, and the program returns the
2472C      value -2/3 (the value at -infinity).
2473C
2474C
2475C   MACHINE-DEPENDENT CONSTANTS:
2476C
2477C      NTERM1 - INTEGER - The no. of terms to be used from the array
2478C                          AAINT1. The recommended value is such that
2479C                             ABS(AAINT1(NTERM1)) < EPS/100,
2480C                          subject to 1 <= NTERM1 <= 25.
2481C
2482C      NTERM2 - INTEGER - The no. of terms to be used from the array
2483C                          AAINT2. The recommended value is such that
2484C                             ABS(AAINT2(NTERM2)) < EPS/100,
2485C                          subject to 1 <= NTERM2 <= 21.
2486C
2487C      NTERM3 - INTEGER - The no. of terms to be used from the array
2488C                          AAINT3. The recommended value is such that
2489C                             ABS(AAINT3(NTERM3)) < EPS/100,
2490C                          subject to 1 <= NTERM3 <= 40.
2491C
2492C      NTERM4 - INTEGER - The no. of terms to be used from the array
2493C                          AAINT4. The recommended value is such that
2494C                             ABS(AAINT4(NTERM4)) < EPS/100,
2495C                          subject to 1 <= NTERM4 <= 17.
2496C
2497C      NTERM5 - INTEGER - The no. of terms to be used from the array
2498C                          AAINT5. The recommended value is such that
2499C                             ABS(AAINT5(NTERM5)) < EPS/100,
2500C                          subject to 1 <= NTERM5 <= 17.
2501C
2502C      XLOW1 - DOUBLE PRECISION - The value such that, if |x| < XLOW1,
2503C                          AIRINT(x) = x * Ai(0)
2504C                     to machine precision. The recommended value is
2505C                          2 * EPSNEG.
2506C
2507C      XHIGH1 - DOUBLE PRECISION - The value such that, if x > XHIGH1,
2508C                          AIRINT(x) = 1/3,
2509C                      to machine precision. The recommended value is
2510C                          (-1.5*LOG(EPSNEG)) ** (2/3).
2511C
2512C      XNEG1 - DOUBLE PRECISION - The value such that, if x < XNEG1,
2513C                     the trigonometric functions in the asymptotic
2514C                     expansion cannot be calculated accurately.
2515C                     The recommended value is
2516C                          -(1/((EPS)**2/3))
2517C
2518C      For values of EPS and EPSNEG, refer to the file MACHCON.TXT.
2519C
2520C     The machine-dependent constants are computed internally by
2521C     using the D1MACH subroutine.
2522C
2523C
2524C   INTRINSIC FUNCTIONS USED:
2525C                            COS, EXP, SIN, SQRT
2526C
2527C
2528C   OTHER MISCFUN SUBROUTINES USED:
2529C
2530C          CHEVAL , ERRPRN, D1MACH
2531C
2532C
2533C   AUTHOR: Dr. Allan J. MacLeod,
2534C           Dept. of Mathematics and Statistics,
2535C           Univ. of Paisley,
2536C           High St.,
2537C           Paisley,
2538C           SCOTLAND.
2539C           PA1 2BE
2540C
2541C           (e-mail:macl_ms0@paisley.ac.uk)
2542C
2543C
2544C   LATEST REVISION:  23 January, 1996
2545C
2546      INTEGER NTERM1,NTERM2,NTERM3,NTERM4,NTERM5
2547      DOUBLE PRECISION AAINT1(0:25),AAINT2(0:21),AAINT3(0:40),
2548     1     AAINT4(0:17),AAINT5(0:17),
2549     2     AIRZER,ARG,CHEVAL,EIGHT,FORTY1,FOUR,FR996,GVAL,
2550     3     HVAL,NINE,NINHUN,ONE,ONEHUN,PIBY4,PITIM6,RT2B3P,T,TEMP,
2551     4     THREE,TWO,X,XHIGH1,XLOW1,XNEG1,XVALUE,Z,ZERO
2552CCCCC CHARACTER FNNAME*6,ERRMSG*46
2553CCCCC DATA FNNAME/'AIRINT'/
2554CCCCC DATA ERRMSG/'FUNCTION TOO NEGATIVE FOR ACCURATE COMPUTATION'/
2555C
2556C-----COMMON----------------------------------------------------------
2557C
2558      INCLUDE 'DPCOMC.INC'
2559      INCLUDE 'DPCOP2.INC'
2560C
2561      DATA AAINT1(0)/  0.37713 51769 46836 95526  D    0/
2562      DATA AAINT1(1)/ -0.13318 86843 24079 47431  D    0/
2563      DATA AAINT1(2)/  0.31524 97374 78288 4809   D   -1/
2564      DATA AAINT1(3)/ -0.31854 30764 36574 077    D   -2/
2565      DATA AAINT1(4)/ -0.87398 76469 86219 15     D   -3/
2566      DATA AAINT1(5)/  0.46699 49765 53969 71     D   -3/
2567      DATA AAINT1(6)/ -0.95449 36738 98369 2      D   -4/
2568      DATA AAINT1(7)/  0.54270 56871 56716        D   -5/
2569      DATA AAINT1(8)/  0.23949 64062 52188        D   -5/
2570      DATA AAINT1(9)/ -0.75690 27020 5649         D   -6/
2571      DATA AAINT1(10)/ 0.90501 38584 518          D   -7/
2572      DATA AAINT1(11)/ 0.32052 94560 43           D   -8/
2573      DATA AAINT1(12)/-0.30382 55364 44           D   -8/
2574      DATA AAINT1(13)/ 0.48900 11859 6            D   -9/
2575      DATA AAINT1(14)/-0.18398 20572              D  -10/
2576      DATA AAINT1(15)/-0.71124 7519               D  -11/
2577      DATA AAINT1(16)/ 0.15177 4419               D  -11/
2578      DATA AAINT1(17)/-0.10801 922                D  -12/
2579      DATA AAINT1(18)/-0.96354 2                  D  -14/
2580      DATA AAINT1(19)/ 0.31342 5                  D  -14/
2581      DATA AAINT1(20)/-0.29446                    D  -15/
2582      DATA AAINT1(21)/-0.477                      D  -17/
2583      DATA AAINT1(22)/ 0.461                      D  -17/
2584      DATA AAINT1(23)/-0.53                       D  -18/
2585      DATA AAINT1(24)/ 0.1                        D  -19/
2586      DATA AAINT1(25)/ 0.1                        D  -19/
2587      DATA AAINT2(0)/  1.92002 52408 19840 09769  D    0/
2588      DATA AAINT2(1)/ -0.42200 49417 25628 7021   D   -1/
2589      DATA AAINT2(2)/ -0.23945 77229 65939 223    D   -2/
2590      DATA AAINT2(3)/ -0.19564 07048 33529 71     D   -3/
2591      DATA AAINT2(4)/ -0.15472 52891 05611 2      D   -4/
2592      DATA AAINT2(5)/ -0.14049 01861 37889        D   -5/
2593      DATA AAINT2(6)/ -0.12128 01427 1367         D   -6/
2594      DATA AAINT2(7)/ -0.11791 86050 192          D   -7/
2595      DATA AAINT2(8)/ -0.10431 55787 88           D   -8/
2596      DATA AAINT2(9)/ -0.10908 20929 3            D   -9/
2597      DATA AAINT2(10)/-0.92963 3045               D  -11/
2598      DATA AAINT2(11)/-0.11094 6520               D  -11/
2599      DATA AAINT2(12)/-0.78164 83                 D  -13/
2600      DATA AAINT2(13)/-0.13196 61                 D  -13/
2601      DATA AAINT2(14)/-0.36823                    D  -15/
2602      DATA AAINT2(15)/-0.21505                    D  -15/
2603      DATA AAINT2(16)/ 0.1238                     D  -16/
2604      DATA AAINT2(17)/-0.557                      D  -17/
2605      DATA AAINT2(18)/ 0.84                       D  -18/
2606      DATA AAINT2(19)/-0.21                       D  -18/
2607      DATA AAINT2(20)/ 0.4                        D  -19/
2608      DATA AAINT2(21)/-0.1                        D  -19/
2609      DATA AAINT3(0)/  0.47985 89326 47910 52053  D    0/
2610      DATA AAINT3(1)/ -0.19272 37512 61696 08863  D    0/
2611      DATA AAINT3(2)/  0.20511 54129 52542 8189   D   -1/
2612      DATA AAINT3(3)/  0.63320 00070 73248 8786   D   -1/
2613      DATA AAINT3(4)/ -0.50933 22261 84575 4082   D   -1/
2614      DATA AAINT3(5)/  0.12844 24078 66166 3016   D   -1/
2615      DATA AAINT3(6)/  0.27601 37088 98947 9413   D   -1/
2616      DATA AAINT3(7)/ -0.15470 66673 86664 9507   D   -1/
2617      DATA AAINT3(8)/ -0.14968 64655 38931 6026   D   -1/
2618      DATA AAINT3(9)/  0.33661 76141 73574 541    D   -2/
2619      DATA AAINT3(10)/ 0.53085 11635 18892 985    D   -2/
2620      DATA AAINT3(11)/ 0.41371 22645 85550 81     D   -3/
2621      DATA AAINT3(12)/-0.10249 05799 26726 266    D   -2/
2622      DATA AAINT3(13)/-0.32508 22167 20258 53     D   -3/
2623      DATA AAINT3(14)/ 0.86086 60957 16921 3      D   -4/
2624      DATA AAINT3(15)/ 0.66713 67298 12077 5      D   -4/
2625      DATA AAINT3(16)/ 0.44920 59993 18095        D   -5/
2626      DATA AAINT3(17)/-0.67042 72309 58249        D   -5/
2627      DATA AAINT3(18)/-0.19663 65700 85009        D   -5/
2628      DATA AAINT3(19)/ 0.22229 67740 7226         D   -6/
2629      DATA AAINT3(20)/ 0.22332 22294 9137         D   -6/
2630      DATA AAINT3(21)/ 0.28033 13766 457          D   -7/
2631      DATA AAINT3(22)/-0.11556 51663 619          D   -7/
2632      DATA AAINT3(23)/-0.43306 98217 36           D   -8/
2633      DATA AAINT3(24)/-0.62277 77938              D  -10/
2634      DATA AAINT3(25)/ 0.26432 66490 3            D   -9/
2635      DATA AAINT3(26)/ 0.53338 81114              D  -10/
2636      DATA AAINT3(27)/-0.52295 7269               D  -11/
2637      DATA AAINT3(28)/-0.38222 9283               D  -11/
2638      DATA AAINT3(29)/-0.40958 233                D  -12/
2639      DATA AAINT3(30)/ 0.11515 622                D  -12/
2640      DATA AAINT3(31)/ 0.38757 66                 D  -13/
2641      DATA AAINT3(32)/ 0.14028 3                  D  -14/
2642      DATA AAINT3(33)/-0.14152 6                  D  -14/
2643      DATA AAINT3(34)/-0.28746                    D  -15/
2644      DATA AAINT3(35)/ 0.923                      D  -17/
2645      DATA AAINT3(36)/ 0.1224                     D  -16/
2646      DATA AAINT3(37)/ 0.157                      D  -17/
2647      DATA AAINT3(38)/-0.19                       D  -18/
2648      DATA AAINT3(39)/-0.8                        D  -19/
2649      DATA AAINT3(40)/-0.1                        D  -19/
2650      DATA AAINT4/1.99653 30582 85227 30048  D    0,
2651     1           -0.18754 11776 05417 759    D   -2,
2652     2           -0.15377 53628 03057 50     D   -3,
2653     3           -0.12831 12967 68234 9      D   -4,
2654     4           -0.10812 84819 64162        D   -5,
2655     5           -0.91821 31174 057          D   -7,
2656     6           -0.78416 05909 60           D   -8,
2657     7           -0.67292 45387 8            D   -9,
2658     8           -0.57963 25198              D  -10,
2659     9           -0.50104 0991               D  -11,
2660     X           -0.43420 222                D  -12,
2661     1           -0.37743 05                 D  -13,
2662     2           -0.32847 3                  D  -14,
2663     3           -0.28700                    D  -15,
2664     4           -0.2502                     D  -16,
2665     5           -0.220                      D  -17,
2666     6           -0.19                       D  -18,
2667     7           -0.2                        D  -19/
2668      DATA AAINT5/1.13024 60203 44657 16133  D    0,
2669     1           -0.46471 80646 39872 334    D   -2,
2670     2           -0.35137 41338 26932 03     D   -3,
2671     3           -0.27681 17872 54518 5      D   -4,
2672     4           -0.22205 74525 58107        D   -5,
2673     5           -0.18089 14236 5974         D   -6,
2674     6           -0.14876 13383 373          D   -7,
2675     7           -0.12351 53881 68           D   -8,
2676     8           -0.10310 10425 7            D   -9,
2677     9           -0.86749 3013               D  -11,
2678     X           -0.73080 054                D  -12,
2679     1           -0.62235 61                 D  -13,
2680     2           -0.52512 8                  D  -14,
2681     3           -0.45677                    D  -15,
2682     4           -0.3748                     D  -16,
2683     5           -0.356                      D  -17,
2684     6           -0.23                       D  -18,
2685     7           -0.4                        D  -19/
2686      DATA ZERO,ONE,TWO/ 0.0 D 0 , 1.0 D 0 , 2.0 D 0 /
2687      DATA THREE,FOUR,EIGHT/ 3.0 D 0 , 4.0 D 0 , 8.0 D 0 /
2688      DATA NINE,FORTY1,ONEHUN/ 9.0 D 0 , 41.0 D 0 , 100.0 D 0/
2689      DATA NINHUN,FR996/ 900.0 D 0 , 4996.0 D 0 /
2690      DATA PIBY4/0.78539 81633 97448 30962 D 0/
2691      DATA PITIM6/18.84955 59215 38759 43078 D 0/
2692      DATA RT2B3P/0.46065 88659 61780 63902 D 0/
2693      DATA AIRZER/0.35502 80538 87817 23926 D 0/
2694C
2695      XHIGH1=0.0
2696C
2697C   Start computation
2698C
2699      X = XVALUE
2700C
2701C   Compute the machine-dependent constants.
2702C
2703      Z = D1MACH(3)
2704      XLOW1 = TWO * Z
2705      ARG = D1MACH(4)
2706      XNEG1 = - ONE / ( ARG ** (TWO/THREE) )
2707C
2708C   Error test
2709C
2710      IF ( X .LT. XNEG1 ) THEN
2711CCCCCC   CALL ERRPRN(FNNAME,ERRMSG)
2712         WRITE(ICOUT,999)
2713         CALL DPWRST('XXX','BUG ')
2714         WRITE(ICOUT,101)X
2715         CALL DPWRST('XXX','BUG ')
2716         AIRINT = -TWO / THREE
2717         RETURN
2718      ENDIF
2719  999 FORMAT(1X)
2720  101 FORMAT('***** ERROR FROM AIRINT--FUNCTION TOO NEGATIVE FOR ',
2721     1       'ACCURATE COMPUTATION, ARGUMENT = ',G15.7)
2722C
2723C  continue with machine-dependent constants
2724C
2725      T = ARG / ONEHUN
2726      IF ( X .GE. ZERO ) THEN
2727         DO 10 NTERM1 = 25 , 0 , -1
2728            IF ( ABS(AAINT1(NTERM1)) .GT. T ) GOTO 19
2729 10      CONTINUE
2730 19      DO 20 NTERM2 = 21 , 0 , -1
2731            IF ( ABS(AAINT2(NTERM2)) .GT. T ) GOTO 29
2732 20      CONTINUE
2733 29      XHIGH1 = ( -THREE*LOG(Z)/TWO ) ** (TWO/THREE)
2734      ELSE
2735         DO 30 NTERM3 = 40 , 0 , -1
2736            IF ( ABS(AAINT3(NTERM3)) .GT. T ) GOTO 39
2737 30      CONTINUE
2738 39      DO 40 NTERM4 = 17 , 0 , -1
2739            IF ( ABS(AAINT4(NTERM4)) .GT. T ) GOTO 49
2740 40      CONTINUE
2741 49      DO 50 NTERM5 = 17 , 0 , -1
2742            IF ( ABS(AAINT5(NTERM5)) .GT. T ) GOTO 59
2743 50      CONTINUE
2744 59      CONTINUE
2745      ENDIF
2746C
2747C   Code for x >= 0
2748C
2749      IF ( X .GE. ZERO ) THEN
2750         IF ( X .LE. FOUR ) THEN
2751            IF ( X .LT. XLOW1 ) THEN
2752               AIRINT = AIRZER * X
2753            ELSE
2754               T = X / TWO - ONE
2755               AIRINT = CHEVAL(NTERM1,AAINT1,T) * X
2756            ENDIF
2757         ELSE
2758            IF ( X .GT. XHIGH1 ) THEN
2759               TEMP = ZERO
2760            ELSE
2761               Z = ( X + X ) * SQRT(X) / THREE
2762               TEMP = THREE * Z
2763               T = ( FORTY1 - TEMP ) / ( NINE + TEMP )
2764               TEMP = EXP(-Z) * CHEVAL(NTERM2,AAINT2,T) / SQRT(PITIM6*Z)
2765            ENDIF
2766            AIRINT = ONE / THREE - TEMP
2767         ENDIF
2768      ELSE
2769C
2770C   Code for x < 0
2771C
2772         IF ( X .GE. -EIGHT ) THEN
2773            IF ( X .GT. -XLOW1 ) THEN
2774               AIRINT = AIRZER * X
2775            ELSE
2776               T = -X / FOUR - ONE
2777               AIRINT = X * CHEVAL(NTERM3,AAINT3,T)
2778            ENDIF
2779         ELSE
2780            Z = - ( X + X ) * SQRT(-X) / THREE
2781            ARG = Z + PIBY4
2782            TEMP = NINE * Z * Z
2783            T = ( FR996 - TEMP ) / ( NINHUN + TEMP)
2784            GVAL = CHEVAL(NTERM4,AAINT4,T)
2785            HVAL = CHEVAL(NTERM5,AAINT5,T)
2786            TEMP = GVAL * COS(ARG) + HVAL * SIN(ARG) / Z
2787            AIRINT = RT2B3P * TEMP / SQRT(Z) - TWO / THREE
2788         ENDIF
2789      ENDIF
2790      RETURN
2791      END
2792      DOUBLE PRECISION FUNCTION AIRYGI(XVALUE)
2793C
2794C   DESCRIPTION:
2795C
2796C      This subroutine computes the modified Airy function Gi(x),
2797C      defined as
2798C
2799C        AIRYGI(x) = [ Integral{0 to infinity} sin(x*t+t^3/3) dt ] / pi
2800C
2801C      The approximation uses Chebyshev expansions with the coefficients
2802C      given to 20 decimal places.
2803C
2804C
2805C   ERROR RETURNS:
2806C
2807C      If x < -XHIGH1*XHIGH1 (see below for definition of XHIGH1), then
2808C      the trig. functions needed for the asymptotic expansion of Bi(x)
2809C      cannot be computed to any accuracy. An error message is printed
2810C      and the code returns the value 0.0.
2811C
2812C
2813C   MACHINE-DEPENDENT CONSTANTS:
2814C
2815C      NTERM1 - INTEGER - The no. of terms to be used from the array
2816C                         ARGIP1. The recommended value is such that
2817C                                ABS(ARGIP1(NTERM1)) < EPS/100
2818C                         subject to 1 <= NTERM1 <= 30.
2819C
2820C      NTERM2 - INTEGER - The no. of terms to be used from the array
2821C                         ARGIP2. The recommended value is such that
2822C                                ABS(ARGIP2(NTERM2)) < EPS/100
2823C                         subject to 1 <= NTERM2 <= 29.
2824C
2825C      NTERM3 - INTEGER - The no. of terms to be used from the array
2826C                         ARGIN1. The recommended value is such that
2827C                                ABS(ARGIN1(NTERM3)) < EPS/100
2828C                         subject to 1 <= NTERM3 <= 42.
2829C
2830C      NTERM4 - INTEGER - The no. of terms to be used from the array
2831C                         ARBIN1. The recommended value is such that
2832C                                ABS(ARBIN1(NTERM4)) < EPS/100
2833C                         subject to 1 <= NTERM4 <= 10.
2834C
2835C      NTERM5 - INTEGER - The no. of terms to be used from the array
2836C                         ARBIN2. The recommended value is such that
2837C                                ABS(ARBIN2(NTERM5)) < EPS/100
2838C                         subject to 1 <= NTERM5 <= 11.
2839C
2840C      NTERM6 - INTEGER - The no. of terms to be used from the array
2841C                         ARGH2. The recommended value is such that
2842C                                ABS(ARHIN1(NTERM6)) < EPS/100
2843C                         subject to 1 <= NTERM6 <= 15.
2844C
2845C      XLOW1 - DOUBLE PRECISION - The value such that, if -XLOW1 < x < XLOW1,
2846C                     then AIRYGI = Gi(0) to machine precision.
2847C                     The recommended value is   EPS.
2848C
2849C      XHIGH1 - DOUBLE PRECISION - The value such that, if x > XHIGH1, then
2850C                      AIRYGI = 1/(Pi*x) to machine precision.
2851C                      Also used for error test - see above.
2852C                      The recommended value is
2853C                          cube root( 2/EPS ).
2854C
2855C      XHIGH2 - DOUBLE PRECISION - The value above which AIRYGI = 0.0.
2856C                      The recommended value is
2857C                          1/(Pi*XMIN).
2858C
2859C      XHIGH3 - DOUBLE PRECISION - The value such that, if x < XHIGH3,
2860C                      then the Chebyshev expansions for the
2861C                      asymptotic form of Bi(x) are not needed.
2862C                      The recommended value is
2863C                          -8 * cube root( 2/EPSNEG ).
2864C
2865C      For values of EPS, EPSNEG, and XMIN refer to the file
2866C      MACHCON.TXT.
2867C
2868C     The machine-dependent constants are computed internally by
2869C     using the D1MACH subroutine.
2870C
2871C
2872C   INTRINSIC FUNCTIONS USED:
2873C                             COS , SIN , SQRT
2874C
2875C
2876C   OTHER MISCFUN SUBROUTINES USED:
2877C
2878C          CHEVAL , ERRPRN, D1MACH
2879C
2880C
2881C   AUTHOR:
2882C          Dr. Allan J. Macleod,
2883C          Dept. of Mathematics and Statistics,
2884C          University of Paisley,
2885C          High St.,
2886C          Paisley,
2887C          SCOTLAND.
2888C
2889C          (e-mail: macl_ms0@paisley.ac.uk)
2890C
2891C
2892C   LATEST UPDATE:
2893C                 23 January, 1996
2894C
2895      INTEGER NTERM1,NTERM2,NTERM3,NTERM4,NTERM5,NTERM6
2896      DOUBLE PRECISION ARGIP1(0:30),ARGIP2(0:29),ARGIN1(0:42),
2897     1     ARBIN1(0:10),ARBIN2(0:11),ARHIN1(0:15),
2898     2     ARG,BI,CHEB1,CHEB2,CHEVAL,COSZ,FIVE,FIVE14,FOUR,
2899     3     GIZERO,MINATE,NINE,ONE,ONEBPI,ONEHUN,ONE76,ONE024,PIBY4,
2900     4     RTPIIN,SEVEN,SEVEN2,SINZ,T,TEMP,THREE,TWELHU,TWENT8,
2901     5     X,XCUBE,XHIGH1,XHIGH2,XHIGH3,XLOW1,XMINUS,
2902     6     XVALUE,Z,ZERO,ZETA
2903CCCCC CHARACTER FNNAME*6,ERRMSG*46
2904CCCCC DATA FNNAME/'AIRYGI'/
2905CCCCC DATA ERRMSG/'ARGUMENT TOO NEGATIVE FOR ACCURATE COMPUTATION'/
2906C
2907C-----COMMON----------------------------------------------------------
2908C
2909      INCLUDE 'DPCOMC.INC'
2910      INCLUDE 'DPCOP2.INC'
2911C
2912      DATA ARGIP1(0)/  0.26585 77079 50227 45082  D    0/
2913      DATA ARGIP1(1)/ -0.10500 33309 75019 22907  D    0/
2914      DATA ARGIP1(2)/  0.84134 74753 28454 492    D   -2/
2915      DATA ARGIP1(3)/  0.20210 67387 81343 9541   D   -1/
2916      DATA ARGIP1(4)/ -0.15595 76113 86355 2234   D   -1/
2917      DATA ARGIP1(5)/  0.56434 29390 43256 481    D   -2/
2918      DATA ARGIP1(6)/ -0.59776 84482 66558 09     D   -3/
2919      DATA ARGIP1(7)/ -0.42833 85026 48677 28     D   -3/
2920      DATA ARGIP1(8)/  0.22605 66238 09090 27     D   -3/
2921      DATA ARGIP1(9)/ -0.36083 32945 59226 0      D   -4/
2922      DATA ARGIP1(10)/-0.78551 89887 88901        D   -5/
2923      DATA ARGIP1(11)/ 0.47325 24807 46370        D   -5/
2924      DATA ARGIP1(12)/-0.59743 51397 7694         D   -6/
2925      DATA ARGIP1(13)/-0.15917 60916 5602         D   -6/
2926      DATA ARGIP1(14)/ 0.63361 29065 570          D   -7/
2927      DATA ARGIP1(15)/-0.27609 02326 48           D   -8/
2928      DATA ARGIP1(16)/-0.25606 41540 85           D   -8/
2929      DATA ARGIP1(17)/ 0.47798 67685 6            D   -9/
2930      DATA ARGIP1(18)/ 0.44881 31863              D  -10/
2931      DATA ARGIP1(19)/-0.23465 08882              D  -10/
2932      DATA ARGIP1(20)/ 0.76839 085                D  -12/
2933      DATA ARGIP1(21)/ 0.73227 985                D  -12/
2934      DATA ARGIP1(22)/-0.85136 87                 D  -13/
2935      DATA ARGIP1(23)/-0.16302 01                 D  -13/
2936      DATA ARGIP1(24)/ 0.35676 9                  D  -14/
2937      DATA ARGIP1(25)/ 0.25001                    D  -15/
2938      DATA ARGIP1(26)/-0.10859                    D  -15/
2939      DATA ARGIP1(27)/-0.158                      D  -17/
2940      DATA ARGIP1(28)/ 0.275                      D  -17/
2941      DATA ARGIP1(29)/-0.5                        D  -19/
2942      DATA ARGIP1(30)/-0.6                        D  -19/
2943      DATA ARGIP2(0)/  2.00473 71227 58014 86391  D    0/
2944      DATA ARGIP2(1)/  0.29418 41393 64406 724    D   -2/
2945      DATA ARGIP2(2)/  0.71369 24900 63401 67     D   -3/
2946      DATA ARGIP2(3)/  0.17526 56343 05022 67     D   -3/
2947      DATA ARGIP2(4)/  0.43591 82094 02988 2      D   -4/
2948      DATA ARGIP2(5)/  0.10926 26947 60430 7      D   -4/
2949      DATA ARGIP2(6)/  0.27238 24183 99029        D   -5/
2950      DATA ARGIP2(7)/  0.66230 90094 7687         D   -6/
2951      DATA ARGIP2(8)/  0.15425 32337 0315         D   -6/
2952      DATA ARGIP2(9)/  0.34184 65242 306          D   -7/
2953      DATA ARGIP2(10)/ 0.72815 77248 94           D   -8/
2954      DATA ARGIP2(11)/ 0.15158 85254 52           D   -8/
2955      DATA ARGIP2(12)/ 0.30940 04803 9            D   -9/
2956      DATA ARGIP2(13)/ 0.61496 72614              D  -10/
2957      DATA ARGIP2(14)/ 0.12028 77045              D  -10/
2958      DATA ARGIP2(15)/ 0.23369 0586               D  -11/
2959      DATA ARGIP2(16)/ 0.43778 068                D  -12/
2960      DATA ARGIP2(17)/ 0.79964 47                 D  -13/
2961      DATA ARGIP2(18)/ 0.14940 75                 D  -13/
2962      DATA ARGIP2(19)/ 0.24679 0                  D  -14/
2963      DATA ARGIP2(20)/ 0.37672                    D  -15/
2964      DATA ARGIP2(21)/ 0.7701                     D  -16/
2965      DATA ARGIP2(22)/ 0.354                      D  -17/
2966      DATA ARGIP2(23)/-0.49                       D  -18/
2967      DATA ARGIP2(24)/ 0.62                       D  -18/
2968      DATA ARGIP2(25)/-0.40                       D  -18/
2969      DATA ARGIP2(26)/-0.1                        D  -19/
2970      DATA ARGIP2(27)/ 0.2                        D  -19/
2971      DATA ARGIP2(28)/-0.3                        D  -19/
2972      DATA ARGIP2(29)/ 0.1                        D  -19/
2973      DATA ARGIN1(0)/ -0.20118 96505 67320 89130  D    0/
2974      DATA ARGIN1(1)/ -0.72441 75303 32453 0499   D   -1/
2975      DATA ARGIN1(2)/  0.45050 18923 89478 0120   D   -1/
2976      DATA ARGIN1(3)/ -0.24221 37112 20787 91099  D    0/
2977      DATA ARGIN1(4)/  0.27178 84964 36167 8294   D   -1/
2978      DATA ARGIN1(5)/ -0.57293 21004 81817 9697   D   -1/
2979      DATA ARGIN1(6)/ -0.18382 10786 03377 63587  D    0/
2980      DATA ARGIN1(7)/  0.77515 46082 14947 5511   D   -1/
2981      DATA ARGIN1(8)/  0.18386 56473 39275 60387  D    0/
2982      DATA ARGIN1(9)/  0.29215 04250 18556 7173   D   -1/
2983      DATA ARGIN1(10)/-0.61422 94846 78801 8811   D   -1/
2984      DATA ARGIN1(11)/-0.29993 12505 79461 6238   D   -1/
2985      DATA ARGIN1(12)/ 0.58593 71183 27706 636    D   -2/
2986      DATA ARGIN1(13)/ 0.82222 16584 97402 529    D   -2/
2987      DATA ARGIN1(14)/ 0.13257 98171 66846 893    D   -2/
2988      DATA ARGIN1(15)/-0.96248 31076 65651 26     D   -3/
2989      DATA ARGIN1(16)/-0.45065 51599 82118 07     D   -3/
2990      DATA ARGIN1(17)/ 0.77242 34743 25474        D   -5/
2991      DATA ARGIN1(18)/ 0.54818 74134 75805 2      D   -4/
2992      DATA ARGIN1(19)/ 0.12458 98039 74287 6      D   -4/
2993      DATA ARGIN1(20)/-0.24619 68910 92083        D   -5/
2994      DATA ARGIN1(21)/-0.16915 41835 45285        D   -5/
2995      DATA ARGIN1(22)/-0.16769 15316 9442         D   -6/
2996      DATA ARGIN1(23)/ 0.96365 09337 672          D   -7/
2997      DATA ARGIN1(24)/ 0.32533 14928 030          D   -7/
2998      DATA ARGIN1(25)/ 0.50918 04231              D  -10/
2999      DATA ARGIN1(26)/-0.20918 04535 53           D   -8/
3000      DATA ARGIN1(27)/-0.41237 38787 0            D   -9/
3001      DATA ARGIN1(28)/ 0.41633 38253              D  -10/
3002      DATA ARGIN1(29)/ 0.30325 32117              D  -10/
3003      DATA ARGIN1(30)/ 0.34058 0529               D  -11/
3004      DATA ARGIN1(31)/-0.88444 592                D  -12/
3005      DATA ARGIN1(32)/-0.31639 612                D  -12/
3006      DATA ARGIN1(33)/-0.15050 76                 D  -13/
3007      DATA ARGIN1(34)/ 0.11041 48                 D  -13/
3008      DATA ARGIN1(35)/ 0.24650 8                  D  -14/
3009      DATA ARGIN1(36)/-0.3107                     D  -16/
3010      DATA ARGIN1(37)/-0.9851                     D  -16/
3011      DATA ARGIN1(38)/-0.1453                     D  -16/
3012      DATA ARGIN1(39)/ 0.118                      D  -17/
3013      DATA ARGIN1(40)/ 0.67                       D  -18/
3014      DATA ARGIN1(41)/ 0.6                        D  -19/
3015      DATA ARGIN1(42)/-0.1                        D  -19/
3016      DATA ARBIN1/1.99983 76358 35861 55980  D    0,
3017     1           -0.81046 60923 66941 8      D   -4,
3018     2            0.13475 66598 4689         D   -6,
3019     3           -0.70855 84714 3            D   -9,
3020     4            0.74818 4187               D  -11,
3021     5           -0.12902 774                D  -12,
3022     6            0.32250 4                  D  -14,
3023     7           -0.10809                    D  -15,
3024     8            0.460                      D  -17,
3025     9           -0.24                       D  -18,
3026     X            0.1                        D  -19/
3027      DATA ARBIN2/0.13872 35645 38791 20276  D    0,
3028     1           -0.82392 86225 55822 8      D   -4,
3029     2            0.26720 91950 9866         D   -6,
3030     3           -0.20742 36853 68           D   -8,
3031     4            0.28733 92593              D  -10,
3032     5           -0.60873 521                D  -12,
3033     6            0.17924 89                 D  -13,
3034     7           -0.68760                    D  -15,
3035     8            0.3280                     D  -16,
3036     9           -0.188                      D  -17,
3037     X            0.13                       D  -18,
3038     1           -0.1                        D  -19/
3039      DATA ARHIN1/1.99647 72039 97796 50525  D    0,
3040     1           -0.18756 37794 07173 213    D   -2,
3041     2           -0.12186 47089 77873 39     D   -3,
3042     3           -0.81402 16096 59287        D   -5,
3043     4           -0.55050 92595 3537         D   -6,
3044     5           -0.37630 08043 303          D   -7,
3045     6           -0.25885 83623 65           D   -8,
3046     7           -0.17931 82926 5            D   -9,
3047     8           -0.12459 16873              D  -10,
3048     9           -0.87171 247                D  -12,
3049     X           -0.60849 43                 D  -13,
3050     1           -0.43117 8                  D  -14,
3051     2           -0.29787                    D  -15,
3052     3           -0.2210                     D  -16,
3053     4           -0.136                      D  -17,
3054     5           -0.14                       D  -18/
3055      DATA ZERO,ONE,THREE,FOUR/ 0.0 D 0 , 1.0 D 0 , 3.0 D 0 , 4.0 D 0 /
3056      DATA FIVE,SEVEN,MINATE/ 5.0 D 0 , 7.0 D 0 , -8.0 D 0 /
3057      DATA NINE,TWENT8,SEVEN2/ 9.0 D 0 , 28.0 D 0 , 72.0 D 0 /
3058      DATA ONEHUN,ONE76,FIVE14/ 100.0 D 0 , 176.0 D 0 , 514.0 D 0 /
3059      DATA ONE024,TWELHU/ 1024.0 D 0 , 1200.0 D 0 /
3060      DATA GIZERO/0.20497 55424 82000 24505 D 0/
3061      DATA ONEBPI/0.31830 98861 83790 67154 D 0/
3062      DATA PIBY4/0.78539 81633 97448 30962 D 0/
3063      DATA RTPIIN/0.56418 95835 47756 28695 D 0/
3064C
3065      XHIGH2=0.0
3066C
3067C   Start computation
3068C
3069      X = XVALUE
3070C
3071C   Compute the machine-dependent constants.
3072C
3073      Z = D1MACH(3)
3074      XLOW1 = Z
3075      ARG = D1MACH(4)
3076      XHIGH1 = ONE / ARG
3077      XHIGH1 = ( XHIGH1 + XHIGH1 ) ** (ONE/THREE)
3078C
3079C   Error test
3080C
3081      IF ( X .LT. -XHIGH1*XHIGH1 ) THEN
3082CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
3083         WRITE(ICOUT,999)
3084         CALL DPWRST('XXX','BUG ')
3085         WRITE(ICOUT,101)X
3086         CALL DPWRST('XXX','BUG ')
3087         AIRYGI = ZERO
3088         RETURN
3089      ENDIF
3090  999 FORMAT(1X)
3091  101 FORMAT('***** ERROR FROM AIRYGI--ARGUMENT TOO NEGATIVE ',
3092     1       'FOR ACCURATE COMPUTATION, ARGUMENT = ',G15.7)
3093C
3094C  continue with machine-dependent constants
3095C
3096      T = ARG / ONEHUN
3097      IF ( X .GE. ZERO ) THEN
3098         DO 10 NTERM1 = 30 , 0 , -1
3099            IF ( ABS(ARGIP1(NTERM1)) .GT. T ) GOTO 19
3100 10      CONTINUE
3101 19      DO 20 NTERM2 = 29 , 0 , -1
3102            IF ( ABS(ARGIP2(NTERM2)) .GT. T ) GOTO 29
3103 20      CONTINUE
3104 29      TEMP = FOUR * PIBY4
3105         XHIGH2 = ONE / ( TEMP * D1MACH(1) )
3106      ELSE
3107         DO 30 NTERM3 = 42 , 0 , -1
3108            IF ( ABS(ARGIN1(NTERM3)) .GT. T ) GOTO 39
3109 30      CONTINUE
3110 39      DO 40 NTERM4 = 10 , 0 , -1
3111            IF ( ABS(ARBIN1(NTERM4)) .GT. T ) GOTO 49
3112 40      CONTINUE
3113 49      DO 50 NTERM5 = 11 , 0 , -1
3114            IF ( ABS(ARBIN2(NTERM5)) .GT. T ) GOTO 59
3115 50      CONTINUE
3116 59      DO 60 NTERM6 = 15 , 0 , -1
3117            IF ( ABS(ARHIN1(NTERM6)) .GT. T ) GOTO 69
3118 60      CONTINUE
3119 69      TEMP = ONE / Z
3120         XHIGH3 = MINATE * ( TEMP + TEMP ) ** (ONE/THREE)
3121      ENDIF
3122C
3123C   Code for x >= 0.0
3124C
3125      IF ( X .GE. ZERO ) THEN
3126         IF ( X .LE. SEVEN ) THEN
3127            IF ( X .LT. XLOW1 ) THEN
3128               AIRYGI = GIZERO
3129            ELSE
3130               T = ( NINE * X - TWENT8 ) / ( X + TWENT8 )
3131               AIRYGI = CHEVAL ( NTERM1 , ARGIP1 , T )
3132            ENDIF
3133         ELSE
3134            IF ( X .GT. XHIGH1 ) THEN
3135               IF ( X .GT. XHIGH2 ) THEN
3136                  AIRYGI = ZERO
3137               ELSE
3138                  AIRYGI = ONEBPI/X
3139               ENDIF
3140            ELSE
3141               XCUBE = X * X * X
3142               T = ( TWELHU - XCUBE ) / ( FIVE14 + XCUBE )
3143               AIRYGI = ONEBPI * CHEVAL(NTERM2,ARGIP2,T) / X
3144            ENDIF
3145         ENDIF
3146      ELSE
3147C
3148C   Code for x < 0.0
3149C
3150         IF ( X .GE. MINATE ) THEN
3151            IF ( X .GT. -XLOW1 ) THEN
3152               AIRYGI = GIZERO
3153            ELSE
3154               T = -( X + FOUR ) / FOUR
3155               AIRYGI = CHEVAL(NTERM3,ARGIN1,T)
3156            ENDIF
3157         ELSE
3158            XMINUS = -X
3159            T = XMINUS * SQRT(XMINUS)
3160            ZETA = ( T + T ) / THREE
3161            TEMP = RTPIIN / SQRT(SQRT(XMINUS))
3162            COSZ = COS ( ZETA + PIBY4 )
3163            SINZ = SIN ( ZETA + PIBY4 ) / ZETA
3164            XCUBE = X * X * X
3165            IF ( X .GT. XHIGH3 ) THEN
3166               T = - ( ONE024 / ( XCUBE ) + ONE )
3167               CHEB1 = CHEVAL(NTERM4,ARBIN1,T)
3168               CHEB2 = CHEVAL(NTERM5,ARBIN2,T)
3169               BI = ( COSZ * CHEB1 + SINZ * CHEB2 ) * TEMP
3170            ELSE
3171               BI = ( COSZ + SINZ * FIVE / SEVEN2 ) * TEMP
3172            ENDIF
3173            T = ( XCUBE + TWELHU ) / ( ONE76 - XCUBE )
3174            AIRYGI = BI + CHEVAL(NTERM6,ARHIN1,T) * ONEBPI / X
3175         ENDIF
3176      ENDIF
3177      RETURN
3178      END
3179      DOUBLE PRECISION FUNCTION AIRYHI(XVALUE)
3180C
3181C   DESCRIPTION:
3182C
3183C      This subroutine computes the modified Airy function Hi(x),
3184C      defined as
3185C
3186C         AIRYHI(x) = [ Integral{0 to infinity} exp(x*t-t^3/3) dt ] / pi
3187C
3188C      The approximation uses Chebyshev expansions with the coefficients
3189C      given to 20 decimal places.
3190C
3191C
3192C   ERROR RETURNS:
3193C
3194C      If x > XHIGH1 (see below for definition of XHIGH1), then
3195C      the asymptotic expansion of Hi(x) will cause an overflow.
3196C      An error message is printed and the code returns the largest
3197C      floating-pt number as the result.
3198C
3199C
3200C   MACHINE-DEPENDENT CONSTANTS:
3201C
3202C      NTERM1 - INTEGER - The no. of terms to be used from the array
3203C                         ARHIP. The recommended value is such that
3204C                                ABS(ARHIP(NTERM1)) < EPS/100
3205C                         subject to 1 <= NTERM1 <= 31.
3206C
3207C      NTERM2 - INTEGER - The no. of terms to be used from the array
3208C                         ARBIP. The recommended value is such that
3209C                                ABS(ARBIP(NTERM2)) < EPS/100
3210C                         subject to 1 <= NTERM2 <= 23.
3211C
3212C      NTERM3 - INTEGER - The no. of terms to be used from the array
3213C                         ARGIP. The recommended value is such that
3214C                                ABS(ARGIP1(NTERM3)) < EPS/100
3215C                         subject to 1 <= NTERM3 <= 29.
3216C
3217C      NTERM4 - INTEGER - The no. of terms to be used from the array
3218C                         ARHIN1. The recommended value is such that
3219C                                ABS(ARHIN1(NTERM4)) < EPS/100
3220C                         subject to 1 <= NTERM4 <= 21.
3221C
3222C      NTERM5 - INTEGER - The no. of terms to be used from the array
3223C                         ARHIN2. The recommended value is such that
3224C                                ABS(ARHIN2(NTERM5)) < EPS/100
3225C                         subject to 1 <= NTERM5 <= 15.
3226C
3227C      XLOW1 - DOUBLE PRECISION - The value such that, if -XLOW1 < x < XLOW1,
3228C                     then AIRYGI = Hi(0) to machine precision.
3229C                     The recommended value is   EPS.
3230C
3231C      XHIGH1 - DOUBLE PRECISION - The value such that, if x > XHIGH1, then
3232C                      overflow might occur. The recommended value is
3233C                      computed as follows:
3234C                           compute Z = 1.5*LOG(XMAX)
3235C                        XHIGH1 = ( Z + LOG(Z)/4 + LOG(PI)/2 )**(2/3)
3236C
3237C      XNEG1 - DOUBLE PRECISION - The value below which AIRYHI = 0.0.
3238C                     The recommended value is
3239C                          -1/(Pi*XMIN).
3240C
3241C      XNEG2 - DOUBLE PRECISION - The value such that, if x < XNEG2, then
3242C                      AIRYHI = -1/(Pi*x) to machine precision.
3243C                      The recommended value is
3244C                          -cube root( 2/EPS ).
3245C
3246C      XMAX - DOUBLE PRECISION - The largest possible floating-pt. number.
3247C                    This is the value given to the function
3248C                    if x > XHIGH1.
3249C
3250C      For values of EPS, EPSNEG, XMIN  and XMAX refer to the file
3251C      MACHCON.TXT.
3252C
3253C     The machine-dependent constants are computed internally by
3254C     using the D1MACH subroutine.
3255C
3256C
3257C   INTRINSIC FUNCTIONS USED:
3258C                            EXP , LOG , SQRT
3259C
3260C
3261C   OTHER MISCFUN SUBROUTINES USED:
3262C
3263C          CHEVAL , ERRPRN, D1MACH
3264C
3265C
3266C   AUTHOR:
3267C          Dr. Allan J. Macleod,
3268C          Dept. of Mathematics and Statistics,
3269C          University of Paisley,
3270C          High St.,
3271C          Paisley,
3272C          SCOTLAND.
3273C
3274C          (e-mail: macl_ms0@paisley.ac.uk)
3275C
3276C
3277C   LATEST UPDATE:
3278C                  23 January, 1996
3279C
3280      INTEGER NTERM1,NTERM2,NTERM3,NTERM4,NTERM5
3281      DOUBLE PRECISION ARHIP(0:31),ARBIP(0:23),ARGIP1(0:29),
3282     1     ARHIN1(0:21),ARHIN2(0:15),
3283     2     BI,CHEVAL,FIVE14,FOUR,GI,HIZERO,LNRTPI,
3284     3     MINATE,ONE,ONEBPI,ONEHUN,ONE76,SEVEN,T,TEMP,
3285     4     THREE,THRE43,TWELHU,TWELVE,TWO,X,XCUBE,
3286     5     XHIGH1,XLOW1,XMAX,XNEG1,XNEG2,XVALUE,
3287     6     Z,ZERO,ZETA
3288CCCCC CHARACTER FNNAME*6,ERRMSG*30
3289CCCCC DATA FNNAME/'AIRYHI'/
3290CCCCC DATA ERRMSG/'ARGUMENT TO FUNCTION TOO LARGE'/
3291C
3292C-----COMMON----------------------------------------------------------
3293C
3294      INCLUDE 'DPCOMC.INC'
3295      INCLUDE 'DPCOP2.INC'
3296C
3297      DATA ARHIP(0)/ 1.24013 56256 17628 31114  D    0/
3298      DATA ARHIP(1)/ 0.64856 34197 39265 35804  D    0/
3299      DATA ARHIP(2)/ 0.55236 25259 21149 03246  D    0/
3300      DATA ARHIP(3)/ 0.20975 12207 38575 66794  D    0/
3301      DATA ARHIP(4)/ 0.12025 66911 80523 73568  D    0/
3302      DATA ARHIP(5)/ 0.37682 24931 09539 3785   D   -1/
3303      DATA ARHIP(6)/ 0.16510 88671 54807 1651   D   -1/
3304      DATA ARHIP(7)/ 0.45592 27552 11570 993    D   -2/
3305      DATA ARHIP(8)/ 0.16182 84804 77635 013    D   -2/
3306      DATA ARHIP(9)/ 0.40841 28250 81266 63     D   -3/
3307      DATA ARHIP(10)/0.12196 47972 13940 51     D   -3/
3308      DATA ARHIP(11)/0.28650 64098 65761 0      D   -4/
3309      DATA ARHIP(12)/0.74222 15564 24344        D   -5/
3310      DATA ARHIP(13)/0.16353 62319 32831        D   -5/
3311      DATA ARHIP(14)/0.37713 90818 8749         D   -6/
3312      DATA ARHIP(15)/0.78158 00336 008          D   -7/
3313      DATA ARHIP(16)/0.16384 47121 370          D   -7/
3314      DATA ARHIP(17)/0.31985 76659 92           D   -8/
3315      DATA ARHIP(18)/0.61933 90530 7            D   -9/
3316      DATA ARHIP(19)/0.11411 16119 1            D   -9/
3317      DATA ARHIP(20)/0.20649 23454              D  -10/
3318      DATA ARHIP(21)/0.36001 8664               D  -11/
3319      DATA ARHIP(22)/0.61401 849                D  -12/
3320      DATA ARHIP(23)/0.10162 125                D  -12/
3321      DATA ARHIP(24)/0.16437 01                 D  -13/
3322      DATA ARHIP(25)/0.25908 4                  D  -14/
3323      DATA ARHIP(26)/0.39931                    D  -15/
3324      DATA ARHIP(27)/0.6014                     D  -16/
3325      DATA ARHIP(28)/0.886                      D  -17/
3326      DATA ARHIP(29)/0.128                      D  -17/
3327      DATA ARHIP(30)/0.18                       D  -18/
3328      DATA ARHIP(31)/0.3                        D  -19/
3329      DATA ARBIP(0)/  2.00582 13820 97590 64905  D    0/
3330      DATA ARBIP(1)/  0.29447 84491 70441 549    D   -2/
3331      DATA ARBIP(2)/  0.34897 54514 77535 5      D   -4/
3332      DATA ARBIP(3)/  0.83389 73337 4343         D   -6/
3333      DATA ARBIP(4)/  0.31362 15471 813          D   -7/
3334      DATA ARBIP(5)/  0.16786 53060 15           D   -8/
3335      DATA ARBIP(6)/  0.12217 93405 9            D   -9/
3336      DATA ARBIP(7)/  0.11915 84139              D  -10/
3337      DATA ARBIP(8)/  0.15414 2553               D  -11/
3338      DATA ARBIP(9)/  0.24844 455                D  -12/
3339      DATA ARBIP(10)/ 0.42130 12                 D  -13/
3340      DATA ARBIP(11)/ 0.50529 3                  D  -14/
3341      DATA ARBIP(12)/-0.60032                    D  -15/
3342      DATA ARBIP(13)/-0.65474                    D  -15/
3343      DATA ARBIP(14)/-0.22364                    D  -15/
3344      DATA ARBIP(15)/-0.3015                     D  -16/
3345      DATA ARBIP(16)/ 0.959                      D  -17/
3346      DATA ARBIP(17)/ 0.616                      D  -17/
3347      DATA ARBIP(18)/ 0.97                       D  -18/
3348      DATA ARBIP(19)/-0.37                       D  -18/
3349      DATA ARBIP(20)/-0.21                       D  -18/
3350      DATA ARBIP(21)/-0.1                        D  -19/
3351      DATA ARBIP(22)/ 0.2                        D  -19/
3352      DATA ARBIP(23)/ 0.1                        D  -19/
3353      DATA ARGIP1(0)/  2.00473 71227 58014 86391  D    0/
3354      DATA ARGIP1(1)/  0.29418 41393 64406 724    D   -2/
3355      DATA ARGIP1(2)/  0.71369 24900 63401 67     D   -3/
3356      DATA ARGIP1(3)/  0.17526 56343 05022 67     D   -3/
3357      DATA ARGIP1(4)/  0.43591 82094 02988 2      D   -4/
3358      DATA ARGIP1(5)/  0.10926 26947 60430 7      D   -4/
3359      DATA ARGIP1(6)/  0.27238 24183 99029        D   -5/
3360      DATA ARGIP1(7)/  0.66230 90094 7687         D   -6/
3361      DATA ARGIP1(8)/  0.15425 32337 0315         D   -6/
3362      DATA ARGIP1(9)/  0.34184 65242 306          D   -7/
3363      DATA ARGIP1(10)/ 0.72815 77248 94           D   -8/
3364      DATA ARGIP1(11)/ 0.15158 85254 52           D   -8/
3365      DATA ARGIP1(12)/ 0.30940 04803 9            D   -9/
3366      DATA ARGIP1(13)/ 0.61496 72614              D  -10/
3367      DATA ARGIP1(14)/ 0.12028 77045              D  -10/
3368      DATA ARGIP1(15)/ 0.23369 0586               D  -11/
3369      DATA ARGIP1(16)/ 0.43778 068                D  -12/
3370      DATA ARGIP1(17)/ 0.79964 47                 D  -13/
3371      DATA ARGIP1(18)/ 0.14940 75                 D  -13/
3372      DATA ARGIP1(19)/ 0.24679 0                  D  -14/
3373      DATA ARGIP1(20)/ 0.37672                    D  -15/
3374      DATA ARGIP1(21)/ 0.7701                     D  -16/
3375      DATA ARGIP1(22)/ 0.354                      D  -17/
3376      DATA ARGIP1(23)/-0.49                       D  -18/
3377      DATA ARGIP1(24)/ 0.62                       D  -18/
3378      DATA ARGIP1(25)/-0.40                       D  -18/
3379      DATA ARGIP1(26)/-0.1                        D  -19/
3380      DATA ARGIP1(27)/ 0.2                        D  -19/
3381      DATA ARGIP1(28)/-0.3                        D  -19/
3382      DATA ARGIP1(29)/ 0.1                        D  -19/
3383      DATA ARHIN1(0)/  0.31481 01720 64234 04116  D    0/
3384      DATA ARHIN1(1)/ -0.16414 49921 65889 64341  D    0/
3385      DATA ARHIN1(2)/  0.61766 51597 73091 3071   D   -1/
3386      DATA ARHIN1(3)/ -0.19718 81185 93593 3028   D   -1/
3387      DATA ARHIN1(4)/  0.53690 28300 23331 343    D   -2/
3388      DATA ARHIN1(5)/ -0.12497 70684 39663 038    D   -2/
3389      DATA ARHIN1(6)/  0.24835 51559 69949 33     D   -3/
3390      DATA ARHIN1(7)/ -0.41870 24096 74663 0      D   -4/
3391      DATA ARHIN1(8)/  0.59094 54379 79124        D   -5/
3392      DATA ARHIN1(9)/ -0.68063 54118 4345         D   -6/
3393      DATA ARHIN1(10)/ 0.60728 97629 164          D   -7/
3394      DATA ARHIN1(11)/-0.36713 03492 42           D   -8/
3395      DATA ARHIN1(12)/ 0.70780 17552              D  -10/
3396      DATA ARHIN1(13)/ 0.11878 94334              D  -10/
3397      DATA ARHIN1(14)/-0.12089 8723               D  -11/
3398      DATA ARHIN1(15)/ 0.11896 56                 D  -13/
3399      DATA ARHIN1(16)/ 0.59412 8                  D  -14/
3400      DATA ARHIN1(17)/-0.32257                    D  -15/
3401      DATA ARHIN1(18)/-0.2290                     D  -16/
3402      DATA ARHIN1(19)/ 0.253                      D  -17/
3403      DATA ARHIN1(20)/ 0.9                        D  -19/
3404      DATA ARHIN1(21)/-0.2                        D  -19/
3405      DATA ARHIN2/1.99647 72039 97796 50525  D    0,
3406     1           -0.18756 37794 07173 213    D   -2,
3407     2           -0.12186 47089 77873 39     D   -3,
3408     3           -0.81402 16096 59287        D   -5,
3409     4           -0.55050 92595 3537         D   -6,
3410     5           -0.37630 08043 303          D   -7,
3411     6           -0.25885 83623 65           D   -8,
3412     7           -0.17931 82926 5            D   -9,
3413     8           -0.12459 16873              D  -10,
3414     9           -0.87171 247                D  -12,
3415     X           -0.60849 43                 D  -13,
3416     1           -0.43117 8                  D  -14,
3417     2           -0.29787                    D  -15,
3418     3           -0.2210                     D  -16,
3419     4           -0.136                      D  -17,
3420     5           -0.14                       D  -18/
3421      DATA ZERO,ONE,TWO/ 0.0 D 0 , 1.0 D 0 , 2.0 D 0/
3422      DATA THREE,FOUR,SEVEN/ 3.0 D 0 , 4.0 D 0 , 7.0 D 0 /
3423      DATA MINATE,TWELVE,ONE76/ -8.0 D 0 , 12.0 D 0 , 176.0 D 0 /
3424      DATA THRE43,FIVE14,TWELHU/ 343.0 D 0 , 514.0 D 0 , 1200.0 D 0 /
3425      DATA ONEHUN/100.0 D 0/
3426      DATA HIZERO/0.40995 10849 64000 49010 D 0/
3427      DATA LNRTPI/0.57236 49429 24700 08707 D 0/
3428      DATA ONEBPI/0.31830 98861 83790 67154 D 0/
3429C
3430C   Start computation
3431C
3432      X = XVALUE
3433C
3434C   Compute the machine-dependent constants.
3435C
3436      XMAX = D1MACH(2)
3437      TEMP = THREE * LOG(XMAX) / TWO
3438      ZETA = ( TEMP + LOG(TEMP)/FOUR - LOG(ONEBPI)/TWO )
3439      XHIGH1 = ZETA ** (TWO/THREE)
3440C
3441C   Error test
3442C
3443      IF ( X .GT. XHIGH1 ) THEN
3444CCCCC    CALL ERRPRN(FNNAME,ERRMSG)
3445         WRITE(ICOUT,999)
3446         CALL DPWRST('XXX','BUG ')
3447         WRITE(ICOUT,101)X
3448         CALL DPWRST('XXX','BUG ')
3449         AIRYHI = XMAX
3450         RETURN
3451      ENDIF
3452  999 FORMAT(1X)
3453  101 FORMAT('***** ERROR FROM AIRYHI--ARGUMENT TO FUNCTION ',
3454     1        'TOO LARGE, ARGUMENT = ',G15.7)
3455C
3456C  continue with machine-dependent constants
3457C
3458      Z = D1MACH(3)
3459      XLOW1 = Z
3460      T = Z / ONEHUN
3461      IF ( X .GE. ZERO ) THEN
3462         DO 10 NTERM1 = 31 , 0 , -1
3463            IF ( ABS(ARHIP(NTERM1)) .GT. T ) GOTO 19
3464 10      CONTINUE
3465 19      DO 20 NTERM2 = 23 , 0 , -1
3466            IF ( ABS(ARBIP(NTERM2)) .GT. T ) GOTO 29
3467 20      CONTINUE
3468 29      DO 30 NTERM3 = 29 , 0 , -1
3469            IF ( ABS(ARGIP1(NTERM3)) .GT. T ) GOTO 39
3470 30      CONTINUE
3471 39      CONTINUE
3472      ELSE
3473         DO 40 NTERM4 = 21 , 0 , -1
3474            IF ( ABS(ARHIN1(NTERM4)) .GT. T ) GOTO 49
3475 40      CONTINUE
3476 49      DO 50 NTERM5 = 15 , 0 , -1
3477            IF ( ABS(ARHIN2(NTERM5)) .GT. T ) GOTO 59
3478 50      CONTINUE
3479 59      TEMP = ONE / ONEBPI
3480         XNEG1 = - ONE / ( TEMP * D1MACH(1) )
3481         XNEG2 = - ( ( TWO / Z ) ** (ONE/THREE) )
3482      ENDIF
3483C
3484C   Code for x >= 0.0
3485C
3486      IF ( X .GE. ZERO ) THEN
3487         IF ( X .LE. SEVEN ) THEN
3488            IF ( X .LT. XLOW1 ) THEN
3489               AIRYHI = HIZERO
3490            ELSE
3491               T = ( X + X ) / SEVEN - ONE
3492               TEMP = ( X + X + X ) / TWO
3493               AIRYHI = EXP(TEMP) * CHEVAL(NTERM1,ARHIP,T)
3494            ENDIF
3495         ELSE
3496            XCUBE = X * X * X
3497            TEMP = SQRT(XCUBE)
3498            ZETA = ( TEMP + TEMP ) / THREE
3499            T = TWO * ( SQRT(THRE43/XCUBE) ) - ONE
3500            TEMP = CHEVAL(NTERM2,ARBIP,T)
3501            TEMP = ZETA + LOG(TEMP) - LOG(X) / FOUR - LNRTPI
3502            BI = EXP(TEMP)
3503            T = ( TWELHU - XCUBE ) / ( XCUBE + FIVE14 )
3504            GI = CHEVAL(NTERM3,ARGIP1,T) * ONEBPI / X
3505            AIRYHI = BI - GI
3506         ENDIF
3507      ELSE
3508C
3509C   Code for x < 0.0
3510C
3511         IF ( X .GE. MINATE ) THEN
3512            IF ( X .GT. -XLOW1 ) THEN
3513               AIRYHI = HIZERO
3514            ELSE
3515               T = ( FOUR * X + TWELVE ) / ( X - TWELVE )
3516               AIRYHI = CHEVAL(NTERM4,ARHIN1,T)
3517            ENDIF
3518         ELSE
3519            IF ( X .LT. XNEG1 ) THEN
3520               AIRYHI = ZERO
3521            ELSE
3522               IF ( X .LT. XNEG2 ) THEN
3523                  TEMP = ONE
3524               ELSE
3525                  XCUBE = X * X * X
3526                  T = ( XCUBE + TWELHU ) / ( ONE76 - XCUBE )
3527                  TEMP = CHEVAL(NTERM5,ARHIN2,T)
3528               ENDIF
3529               AIRYHI = - TEMP * ONEBPI / X
3530            ENDIF
3531         ENDIF
3532      ENDIF
3533      RETURN
3534      END
3535      FUNCTION ALI (X)
3536C***BEGIN PROLOGUE  ALI
3537C***PURPOSE  Compute the logarithmic integral.
3538C***LIBRARY   SLATEC (FNLIB)
3539C***CATEGORY  C5
3540C***TYPE      SINGLE PRECISION (ALI-S, DLI-D)
3541C***KEYWORDS  FNLIB, LOGARITHMIC INTEGRAL, SPECIAL FUNCTIONS
3542C***AUTHOR  Fullerton, W., (LANL)
3543C***DESCRIPTION
3544C
3545C ALI(X) computes the logarithmic integral; i.e., the
3546C integral from 0.0 to X of (1.0/ln(t))dt.
3547C
3548C***REFERENCES  (NONE)
3549C***ROUTINES CALLED  EI, XERMSG
3550C***REVISION HISTORY  (YYMMDD)
3551C   770601  DATE WRITTEN
3552C   890531  Changed all specific intrinsics to generic.  (WRB)
3553C   890531  REVISION DATE from Version 3.2
3554C   891214  Prologue converted to Version 4.0 format.  (BAB)
3555C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
3556C   900326  Removed duplicate information from DESCRIPTION section.
3557C           (WRB)
3558C***END PROLOGUE  ALI
3559C***FIRST EXECUTABLE STATEMENT  ALI
3560C
3561C-----COMMON----------------------------------------------------------
3562C
3563      INCLUDE 'DPCOMC.INC'
3564      INCLUDE 'DPCOP2.INC'
3565C
3566      ALI = CPUMIN
3567C
3568      IF (X .LE. 0.0) THEN
3569        WRITE(ICOUT,1)
3570        CALL DPWRST('XXX','BUG ')
3571    1   FORMAT('***** ERORR FROM ALI, THE LOG INTEGRAL IS UNDEFINED ',
3572     1         'FOR NON-POSITIVE X.  *****')
3573        RETURN
3574      ENDIF
3575      IF (X .EQ. 1.0) THEN
3576        WRITE(ICOUT,2)
3577    2   FORMAT('***** ERORR FROM ALI, THE LOG INTEGRAL IS UNDEFINED ',
3578     1         'FOR X = 1.  *****')
3579        CALL DPWRST('XXX','BUG ')
3580        RETURN
3581      ENDIF
3582C
3583      ALI = EI (LOG(X) )
3584C
3585      RETURN
3586      END
3587      FUNCTION ALNREL(X)
3588C***BEGIN PROLOGUE  ALNREL
3589C***DATE WRITTEN   770401   (YYMMDD)
3590C***REVISION DATE  820801   (YYMMDD)
3591C***CATEGORY NO.  C4B
3592C***KEYWORDS  ELEMENTARY FUNCTION,LOGARITHM,RELATIVE
3593C***AUTHOR  FULLERTON, W., (LANL)
3594C***PURPOSE  Evaluates ln(1+X) accurate in the sense of relative error.
3595C***DESCRIPTION
3596C
3597C ALNREL(X) evaluates ln(1+X) accurately in the sense of relative
3598C error when X is very small.  This routine must be used to
3599C maintain relative error accuracy whenever X is small and
3600C accurately known.
3601C
3602C Series for ALNR       on the interval -3.75000D-01 to  3.75000D-01
3603C                                        with weighted error   1.93E-17
3604C                                         log weighted error  16.72
3605C                               significant figures required  16.44
3606C                                    decimal places required  17.40
3607C***REFERENCES  (NONE)
3608C***ROUTINES CALLED  CSEVL,INITS,R1MACH,XERROR
3609C***END PROLOGUE  ALNREL
3610      DIMENSION ALNRCS(23)
3611C
3612      INCLUDE 'DPCOMC.INC'
3613      INCLUDE 'DPCOP2.INC'
3614C
3615      DATA ALNRCS( 1) /   1.0378693562 743770E0 /
3616      DATA ALNRCS( 2) /   -.1336430150 4908918E0 /
3617      DATA ALNRCS( 3) /    .0194082491 35520563E0 /
3618      DATA ALNRCS( 4) /   -.0030107551 12753577E0 /
3619      DATA ALNRCS( 5) /    .0004869461 47971548E0 /
3620      DATA ALNRCS( 6) /   -.0000810548 81893175E0 /
3621      DATA ALNRCS( 7) /    .0000137788 47799559E0 /
3622      DATA ALNRCS( 8) /   -.0000023802 21089435E0 /
3623      DATA ALNRCS( 9) /    .0000004164 04162138E0 /
3624      DATA ALNRCS(10) /   -.0000000735 95828378E0 /
3625      DATA ALNRCS(11) /    .0000000131 17611876E0 /
3626      DATA ALNRCS(12) /   -.0000000023 54670931E0 /
3627      DATA ALNRCS(13) /    .0000000004 25227732E0 /
3628      DATA ALNRCS(14) /   -.0000000000 77190894E0 /
3629      DATA ALNRCS(15) /    .0000000000 14075746E0 /
3630      DATA ALNRCS(16) /   -.0000000000 02576907E0 /
3631      DATA ALNRCS(17) /    .0000000000 00473424E0 /
3632      DATA ALNRCS(18) /   -.0000000000 00087249E0 /
3633      DATA ALNRCS(19) /    .0000000000 00016124E0 /
3634      DATA ALNRCS(20) /   -.0000000000 00002987E0 /
3635      DATA ALNRCS(21) /    .0000000000 00000554E0 /
3636      DATA ALNRCS(22) /   -.0000000000 00000103E0 /
3637      DATA ALNRCS(23) /    .0000000000 00000019E0 /
3638      DATA NLNREL, XMIN /0, 0./
3639C***FIRST EXECUTABLE STATEMENT  ALNREL
3640C
3641      ALNREL=CPUMIN
3642C
3643      IF (NLNREL.NE.0) GO TO 10
3644      NLNREL = INITS (ALNRCS, 23, 0.1*R1MACH(3))
3645      XMIN = -1.0 + SQRT(R1MACH(4))
3646C
3647 10   IF (X.LE.(-1.0)) THEN
3648CCCCC   CALL XERROR ( 'ALNREL  X IS LE -1', 18, 2, 2)
3649        WRITE(ICOUT,101)
3650        CALL DPWRST('XXX','BUG ')
3651        RETURN
3652      ENDIF
3653 101  FORMAT('***** INTERNAL ERROR FROM ALNREL: ARGUMENT LESS THAN ',
3654     1'OR EQUAL TO -1')
3655      IF (X.LT.XMIN) THEN
3656CCCCC    CALL XERROR ( 'ALNREL  ANSWER LT HALF PRECISION BEC
3657CCCCC1AUSE X TOO NEAR -1', 54,    1, 1)
3658        WRITE(ICOUT,102)
3659        CALL DPWRST('XXX','BUG ')
3660CCCCC   RETURN
3661      ENDIF
3662 102  FORMAT('***** INTERNAL WARNING FROM ALNREL: ANSWER IS LESS THAN'
3663     1,' HALF PRECISION BECAUSE ARGUMENT TOO NEAR -1')
3664C
3665      IF (ABS(X).LE.0.375) ALNREL = X*(1. -
3666     1  X*CSEVL (X/.375, ALNRCS, NLNREL))
3667      IF (ABS(X).GT.0.375) ALNREL = LOG (1.0+X)
3668C
3669      RETURN
3670      END
3671      DOUBLE PRECISION FUNCTION ALNORM(X, UPPER)
3672C
3673C       EVALUATES THE TAIL AREA OF THE STANDARDIZED NORMAL CURVE FROM
3674C       X TO INFINITY IF UPPER IS .TRUE. OR FROM MINUS INFINITY TO X
3675C       IF UPPER IS .FALSE.
3676C
3677C  NOTE NOVEMBER 2001: MODIFY UTZERO.  ALTHOUGH NOT NECESSARY
3678C  WHEN USING ALNORM FOR SIMPLY COMPUTING PERCENT POINTS,
3679C  EXTENDING RANGE IS HELPFUL FOR USE WITH FUNCTIONS THAT
3680C  USE ALNORM IN INTERMEDIATE COMPUTATIONS.
3681C
3682      DOUBLE PRECISION LTONE,UTZERO,ZERO,HALF,ONE,CON,
3683     $ A1,A2,A3,A4,A5,A6,A7,B1,B2,
3684     $ B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,X,Y,Z,ZEXP
3685      LOGICAL UPPER,UP
3686C
3687C       LTONE AND UTZERO MUST BE SET TO SUIT THE PARTICULAR COMPUTER
3688C
3689CCCCC DATA LTONE, UTZERO /7.0D0, 18.66D0/
3690      DATA LTONE, UTZERO /7.0D0, 38.00D0/
3691CCCCC DATA LTONE, UTZERO /7.0D0, 100.00D0/
3692      DATA ZERO,HALF,ONE,CON /0.0D0,0.5D0,1.0D0,1.28D0/
3693      DATA          A1,             A2,            A3,
3694     $              A4,             A5,            A6,
3695     $              A7
3696     $ /0.398942280444D0, 0.399903438504D0, 5.75885480458D0,
3697     $   29.8213557808D0,  2.62433121679D0, 48.6959930692D0,
3698     $   5.92885724438D0/
3699      DATA          B1,             B2,             B3,
3700     $              B4,             B5,             B6,
3701     $              B7,             B8,             B9,
3702     $             B10,            B11,            B12
3703     $ /0.398942280385D0,      3.8052D-8,    1.00000615302D0,
3704     $   3.98064794D-4,     1.98615381364D0, 0.151679116635D0,
3705     $   5.29330324926D0,   4.8385912808D0,  15.1508972451D0,
3706     $  0.742380924027D0,   30.789933034D0,  3.99019417011D0/
3707C
3708      ZEXP(Z) = DEXP(Z)
3709C
3710      UP = UPPER
3711      Z = X
3712      IF (Z .GE. ZERO) GOTO 10
3713      UP = .NOT. UP
3714      Z = -Z
3715  10  IF (Z .LE. LTONE .OR. UP .AND. Z .LE. UTZERO) GOTO 20
3716      ALNORM = ZERO
3717      GOTO 40
3718  20  Y = HALF * Z * Z
3719      IF (Z .GT. CON) GOTO 30
3720C
3721      ALNORM = HALF - Z * (A1- A2 * Y / (Y + A3- A4 / (Y + A5 + A6 /
3722     $ (Y + A7))))
3723      GOTO 40
3724C
3725  30  ALNORM = B1* ZEXP(-Y)/(Z - B2 + B3/ (Z +B4 +B5/(Z -B6 +B7/
3726     $ (Z +B8 -B9/ (Z +B10 +B11/ (Z + B12))))))
3727C
3728  40  IF (.NOT. UP) ALNORM = ONE - ALNORM
3729      RETURN
3730      END
3731      double precision function alogam (x, ifault)
3732c-----------------------------------------------------------------------
3733c  Name:       ALOGAM
3734c
3735c  Purpose:    Value of the log-gamma function.
3736c
3737c  Usage:      ALOGAM (X, IFAULT)
3738c
3739c  Arguments:
3740c     X      - Value at which the log-gamma function is to be evaluated.
3741c              (Input)
3742c     IFAULT  - Error indicator.  (Output)
3743c               IFAULT  DEFINITION
3744c                 0     No error
3745c                 1     X .LT. 0
3746c     ALGAMA - The value of the log-gamma function at XX.  (Output)
3747c-----------------------------------------------------------------------
3748c
3749c        Algorithm ACM 291, Comm. ACM. (1966) Vol. 9, P. 684
3750c
3751c        Evaluates natural logarithm of gamma(x)
3752c        for X greater than zero.
3753c
3754c                                  SPECIFICATIONS FOR ARGUMENTS
3755      integer    ifault
3756      double precision x
3757c                                  SPECIFICATIONS FOR LOCAL VARIABLES
3758      double precision f, y, z
3759c                                  SPECIFICATIONS FOR SAVE VARIABLES
3760      double precision a1, a2, a3, a4, a5, half, one, seven, zero
3761      save       a1, a2, a3, a4, a5, half, one, seven, zero
3762c                                  SPECIFICATIONS FOR INTRINSICS
3763      intrinsic  dlog
3764ccccc double precision dlog
3765      double precision zlog
3766c
3767c        The following constants are dlog(2PI)/2,
3768c        half, zero, one, seven
3769c
3770      data a1, a2, a3, a4, a5/0.918938533204673d0, 0.000595238095238d0,
3771     &     0.000793650793651d0, 0.002777777777778d0,
3772     &     0.083333333333333d0/
3773      data half, zero, one, seven/0.5d0, 0.0d0, 1.0d0, 7.0d0/
3774c
3775      zlog(f) = dlog(f)
3776c
3777      alogam = zero
3778      ifault = 1
3779      if (x .lt. zero) return
3780      ifault = 0
3781      y      = x
3782      f      = zero
3783      if (y .ge. seven) go to 30
3784      f = y
3785   10 y = y + one
3786      if (y .ge. seven) go to 20
3787      f = f*y
3788      go to 10
3789   20 f = -zlog(f)
3790   30 z = one/(y*y)
3791      alogam = f + (y-half)*zlog(y) - y + a1 + (((-a2*z+a3)*z-a4)*z+a5)
3792     &         /y
3793      return
3794      end
3795      SUBROUTINE ALDCDF(X,ALPHA,BETA,CDF)
3796C
3797C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
3798C              FUNCTION VALUE FOR THE
3799C              ASYMMETRIC LOG DOUBLE EXPONENTIAL (LAPLACE)
3800C              DISTRIBUTION.
3801C              THIS DISTRIBUTION IS DEFINED FOR ALL POSITIVE X AND
3802C              HAS THE CUMULATIVE DISTRIBUTION FUNCTION
3803C              F(X;ALPHA,BETA)
3804C                  = (ALPHA/(ALPHA+BETA))*X**BETA          0 < X < 1
3805C                  = 1 - (BETA/(ALPHA+BETA))*X**(-ALPHA)   X >= 1
3806C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
3807C                                WHICH THE CUMULATIVE DISTRIBUTION
3808C                                FUNCTION IS TO BE EVALUATED.
3809C                     --ALPHA  = THE DOUBLE PRECISION FIRST
3810C                                SHAPE PARAMETER
3811C                     --BETA   = THE DOUBLE PRECISION SECOND
3812C                                SHAPE PARAMETER
3813C     OUTPUT ARGUMENTS--CDF    = THE DOUBLE PRECISION CUMULATIVE
3814C                                DISTRIBUTION FUNCTION VALUE.
3815C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
3816C             FUNCTION VALUE CDF.
3817C     PRINTING--NONE.
3818C     RESTRICTIONS--NONE.
3819C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
3820C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, LOG.
3821C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
3822C     LANGUAGE--ANSI FORTRAN.
3823C     REFERENCES--KOZUBOWSKI AND PODGORSKI (2003), "LOG-LAPLACE
3824C                 DISTRIBUTIONS", INTERNATIONAL MATHEMATICAL
3825C                 JOURNAL, 3, 467-495.
3826C     WRITTEN BY--JAMES J. FILLIBEN
3827C                 STATISTICAL ENGINEERING LABORATORY (205.03)
3828C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
3829C                 GAITHERSBURG, MD 20899
3830C                 PHONE:  301-975-2899
3831C     ORIGINAL VERSION--MARCH     2006.
3832C
3833C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3834C
3835      DOUBLE PRECISION X
3836      DOUBLE PRECISION ALPHA
3837      DOUBLE PRECISION BETA
3838      DOUBLE PRECISION CDF
3839      DOUBLE PRECISION DC
3840C
3841C---------------------------------------------------------------------
3842C
3843      INCLUDE 'DPCOP2.INC'
3844C
3845C---------------------------------------------------------------------
3846C
3847C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
3848C
3849      CDF=0.0D0
3850C
3851      IF(ALPHA.LE.0.0D0)THEN
3852        WRITE(ICOUT,25)
3853   25   FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO THE ',
3854     1         'ALDCDF SUBROUTINE IS NON-POSITIVE')
3855        CALL DPWRST('XXX','BUG ')
3856        WRITE(ICOUT,46)ALPHA
3857   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
3858        CALL DPWRST('XXX','BUG ')
3859        GOTO9000
3860      ENDIF
3861C
3862      IF(BETA.LE.0.0D0)THEN
3863        WRITE(ICOUT,35)
3864   35   FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO THE ',
3865     1         'ALDCDF SUBROUTINE IS NON-POSITIVE')
3866        CALL DPWRST('XXX','BUG ')
3867        WRITE(ICOUT,46)BETA
3868        CALL DPWRST('XXX','BUG ')
3869        GOTO9000
3870      ENDIF
3871C
3872C
3873C-----START POINT-----------------------------------------------------
3874C
3875      IF(X.LE.0.0D0)THEN
3876        CDF=0.0D0
3877      ELSEIF(X.LT.1.0D0)THEN
3878        DC=DLOG(ALPHA) - DLOG(ALPHA+BETA)
3879        CDF=DC + BETA*DLOG(X)
3880        CDF=DEXP(CDF)
3881      ELSE
3882        DC=DLOG(BETA) - DLOG(ALPHA+BETA)
3883        CDF=(-ALPHA)*DLOG(X)
3884        CDF=1.0D0 - DEXP(DC+CDF)
3885      ENDIF
3886C
3887 9000 CONTINUE
3888      RETURN
3889      END
3890      SUBROUTINE ALDPDF(X,ALPHA,BETA,PDF)
3891C
3892C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
3893C              FUNCTION VALUE FOR THE
3894C              ASYMMETRIC LOG DOUBLE EXPONENTIAL (LAPLACE)
3895C              DISTRIBUTION.
3896C              THIS DISTRIBUTION IS DEFINED FOR ALL POSITIVE X AND
3897C              HAS THE PROBABILITY DENSITY FUNCTION
3898C              f(X;ALPHA,BETA)
3899C                  = C*X**(BETA-1)      0 < X < 1
3900C                  = C*X**(-ALPHA-1)    X >= 1
3901C                                       ALPHA, BETA > 0
3902C              WITH C = ALPHA*BETA/(ALPHA + BETA)
3903C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
3904C                                WHICH THE PROBABILITY DENSITY
3905C                                FUNCTION IS TO BE EVALUATED.
3906C                     --ALPHA  = THE DOUBLE PRECISION FIRST
3907C                                SHAPE PARAMETER
3908C                     --BETA   = THE DOUBLE PRECISION SECOND
3909C                                SHAPE PARAMETER
3910C     OUTPUT ARGUMENTS--PDF    = THE DOUBLE PRECISION PROBABILITY
3911C                                DENSITY FUNCTION VALUE.
3912C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
3913C             FUNCTION VALUE PDF.
3914C     PRINTING--NONE.
3915C     RESTRICTIONS--NONE.
3916C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
3917C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, LOG.
3918C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
3919C     LANGUAGE--ANSI FORTRAN.
3920C     REFERENCES--KOZUBOWSKI AND PODGORSKI (2003), "LOG-LAPLACE
3921C                 DISTRIBUTIONS", INTERNATIONAL MATHEMATICAL
3922C                 JOURNAL, 3, 467-495.
3923C     WRITTEN BY--JAMES J. FILLIBEN
3924C                 STATISTICAL ENGINEERING LABORATORY (205.03)
3925C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
3926C                 GAITHERSBURG, MD 20899
3927C                 PHONE:  301-975-2899
3928C     ORIGINAL VERSION--MARCH     2006.
3929C
3930C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
3931C
3932      DOUBLE PRECISION X
3933      DOUBLE PRECISION ALPHA
3934      DOUBLE PRECISION BETA
3935      DOUBLE PRECISION PDF
3936      DOUBLE PRECISION DC
3937      DOUBLE PRECISION DTERM
3938C
3939C---------------------------------------------------------------------
3940C
3941      INCLUDE 'DPCOP2.INC'
3942C
3943C---------------------------------------------------------------------
3944C
3945C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
3946C
3947      PDF=0.0D0
3948C
3949      IF(X.LE.0.0D0)THEN
3950        WRITE(ICOUT,15)
3951   15   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO THE ',
3952     1         'ALDPDF SUBROUTINE IS NON-POSITIVE')
3953        CALL DPWRST('XXX','BUG ')
3954        WRITE(ICOUT,46)X
3955   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
3956        CALL DPWRST('XXX','BUG ')
3957        GOTO9000
3958      ENDIF
3959C
3960      IF(ALPHA.LE.0.0D0)THEN
3961        WRITE(ICOUT,25)
3962   25   FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO THE ',
3963     1         'ALDPDF SUBROUTINE IS NON-POSITIVE')
3964        CALL DPWRST('XXX','BUG ')
3965        WRITE(ICOUT,46)ALPHA
3966        CALL DPWRST('XXX','BUG ')
3967        GOTO9000
3968      ENDIF
3969C
3970      IF(BETA.LE.0.0D0)THEN
3971        WRITE(ICOUT,35)
3972   35   FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO THE ',
3973     1         'ALDPDF SUBROUTINE IS NON-POSITIVE')
3974        CALL DPWRST('XXX','BUG ')
3975        WRITE(ICOUT,46)BETA
3976        CALL DPWRST('XXX','BUG ')
3977        GOTO9000
3978      ENDIF
3979C
3980C-----START POINT-----------------------------------------------------
3981C
3982      DC=DLOG(ALPHA) + DLOG(BETA) - DLOG(ALPHA+BETA)
3983C
3984      IF(X.LT.1.0D0)THEN
3985        DTERM=(BETA-1.0D0)*DLOG(X)
3986      ELSE
3987        DTERM=(-ALPHA-1.0D0)*DLOG(X)
3988      ENDIF
3989      PDF=DEXP(DC + DTERM)
3990C
3991 9000 CONTINUE
3992      RETURN
3993      END
3994      SUBROUTINE ALDPPF(P,ALPHA,BETA,PPF)
3995C
3996C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
3997C              FUNCTION VALUE FOR THE
3998C              ASYMMETRIC LOG DOUBLE EXPONENTIAL
3999C              (LAPLACE) DISTRIBUTION.
4000C              THIS DISTRIBUTION IS DEFINED FOR ALL POSITIVE X AND
4001C              HAS THE PERCENT POINT FUNCTION
4002C              G(P;ALPHA,BETA) = [P**((ALPHA+BETA)/ALPHA)]**(1/BETA)
4003C                                0 <= P <= ALPHA/(ALPHA+BETA)
4004C                              = [(1-P)**((ALPHA+BETA)/BETA)]**(-1/ALPHA)
4005C                                ALPHA/(ALPHA+BETA) < P < 1
4006C              NOTE THAT THE PERCENT POINT FUNCTION OF A DISTRIBUTION
4007C              IS IDENTICALLY THE SAME AS THE INVERSE CUMULATIVE
4008C              DISTRIBUTION FUNCTION OF THE DISTRIBUTION.
4009C     INPUT  ARGUMENTS--P      = THE DOUBLE PRECISION VALUE
4010C                                (BETWEEN 0.0 AND 1.0)
4011C                                AT WHICH THE PERCENT POINT
4012C                                FUNCTION IS TO BE EVALUATED.
4013C                     --ALPHA  = THE DOUBLE PRECISION FIRST
4014C                                SHAPE PARAMETER
4015C                     --BETA   = THE DOUBLE PRECISION SECOND
4016C                                SHAPE PARAMETER
4017C     OUTPUT ARGUMENTS--PPF    = THE DOUBLE PRECISION PERCENT
4018C                                POINT FUNCTION VALUE.
4019C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
4020C             FUNCTION VALUE PPF.
4021C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
4022C     RESTRICTIONS--P SHOULD BE BETWEEN 0.0 AND 1.0, EXCLUSIVELY.
4023C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
4024C     FORTRAN LIBRARY SUBROUTINES NEEDED--DLOG, DEXP.
4025C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
4026C     LANGUAGE--ANSI FORTRAN (1977)
4027C     REFERENCES--KOZUBOWSKI AND PODGORSKI (2003), "LOG-LAPLACE
4028C                 DISTRIBUTIONS", INTERNATIONAL MATHEMATICAL
4029C                 JOURNAL, 3, 467-495.
4030C     WRITTEN BY--JAMES J. FILLIBEN
4031C                 STATISTICAL ENGINEERING DIVISION
4032C                 INFORMATION TECHNOLOGY LABORATORY
4033C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4034C                 GAITHERSBURG, MD 20899-8980
4035C                 PHONE--301-975-2899
4036C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4037C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4038C     LANGUAGE--ANSI FORTRAN (1977)
4039C     VERSION NUMBER--2006/3
4040C     ORIGINAL VERSION--MARCH     2006.
4041C
4042C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4043C
4044      DOUBLE PRECISION P
4045      DOUBLE PRECISION ALPHA
4046      DOUBLE PRECISION BETA
4047      DOUBLE PRECISION PPF
4048      DOUBLE PRECISION DTERM1
4049      DOUBLE PRECISION DTERM2
4050C
4051C---------------------------------------------------------------------
4052C
4053      INCLUDE 'DPCOP2.INC'
4054C
4055C-----START POINT-----------------------------------------------------
4056C
4057C     CHECK THE INPUT ARGUMENTS FOR ERRORS
4058C
4059      PPF=0.0D0
4060C
4061      IF(P.LT.0.0D0 .OR. P.GE.1.0D0)THEN
4062        WRITE(ICOUT,15)
4063   15   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO THE ',
4064     1         'ALDPPF SUBROUTINE')
4065        CALL DPWRST('XXX','BUG ')
4066        WRITE(ICOUT,16)
4067   16   FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1] INTERVAL.')
4068        CALL DPWRST('XXX','BUG ')
4069        WRITE(ICOUT,46)P
4070   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
4071        CALL DPWRST('XXX','BUG ')
4072        GOTO9000
4073      ENDIF
4074C
4075      IF(ALPHA.LE.0.0D0)THEN
4076        WRITE(ICOUT,25)
4077   25   FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER TO THE ',
4078     1         'ALDPPF SUBROUTINE IS NON-POSITIVE')
4079        CALL DPWRST('XXX','BUG ')
4080        WRITE(ICOUT,46)ALPHA
4081        CALL DPWRST('XXX','BUG ')
4082        GOTO9000
4083      ENDIF
4084C
4085      IF(BETA.LE.0.0D0)THEN
4086        WRITE(ICOUT,35)
4087   35   FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER TO THE ',
4088     1         'ALDPPF SUBROUTINE IS NON-POSITIVE')
4089        CALL DPWRST('XXX','BUG ')
4090        WRITE(ICOUT,46)BETA
4091        CALL DPWRST('XXX','BUG ')
4092        GOTO9000
4093      ENDIF
4094C
4095      DCUT=ALPHA/(ALPHA+BETA)
4096      IF(P.EQ.0.0D0)THEN
4097        PPF=0.0D0
4098      ELSEIF(P.LE.DCUT)THEN
4099        DTERM1=(ALPHA+BETA)/ALPHA
4100        DTERM2=(1.0D0/BETA)*DLOG(P*DTERM1)
4101        PPF=DEXP(DTERM2)
4102      ELSE
4103        DTERM1=(ALPHA+BETA)/BETA
4104        DTERM2=(-1.0D0/ALPHA)*DLOG((1.0D0-P)*DTERM1)
4105        PPF=DEXP(DTERM2)
4106      ENDIF
4107C
4108 9000 CONTINUE
4109      RETURN
4110      END
4111      SUBROUTINE ALDRAN(N,ALPHA,BETA,ISEED,X)
4112C
4113C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
4114C              FROM THE ASYMMETRIC LOG DOUBLE EXPONENTIAL DISTRIBUTION
4115C              WITH TAIL LENGTH PARAMETERS ALPHA AND BETA.
4116C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
4117C                                OF RANDOM NUMBERS TO BE
4118C                                GENERATED.
4119C                     --ALPHA  = THE SINGLE PRECISION VALUE OF THE
4120C                                FIRST (POSITIVE) SHAPE PARAMETER.
4121C                     --BETA   = THE SINGLE PRECISION VALUE OF THE
4122C                                SECOND (POSITIVE) SHAPE PARAMETER.
4123C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
4124C                                (OF DIMENSION AT LEAST N)
4125C                                INTO WHICH THE GENERATED
4126C                                RANDOM SAMPLE WILL BE PLACED.
4127C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE
4128C             ASYMMETRIC LOG DOUBLE EXPONENTIAL DISTRIBUTION
4129C             WITH SHAPE PARAMETERS ALPHA AND BETA.
4130C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
4131C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
4132C                   OF N FOR THIS SUBROUTINE.
4133C                 --ALPHA AND BETA SHOULD BE POSITIVE.
4134C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
4135C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
4136C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
4137C     LANGUAGE--ANSI FORTRAN (1977)
4138C     REFERENCES--KOZUBOWSKI AND PODGORSKI, "LOG-LAPLACE
4139C                 DISTRIBUTIONS", PAPER DOWNLOADED FROM THEIR
4140C                 WEB SITE.
4141C     WRITTEN BY--JAMES J. FILLIBEN
4142C                 STATISTICAL ENGINEERING DIVISION
4143C                 INFORMATION TECHNOLOGY LABORATORY
4144C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4145C                 GAITHERSBURG, MD 20899-8980
4146C                 PHONE--301-975-2855
4147C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4148C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4149C     LANGUAGE--ANSI FORTRAN (1977)
4150C     VERSION NUMBER--2006.3
4151C     ORIGINAL VERSION--MARCH     2006.
4152C
4153C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4154C
4155C---------------------------------------------------------------------
4156C
4157      DIMENSION X(*)
4158      DIMENSION Y(2)
4159C
4160      DOUBLE PRECISION DALPHA
4161      DOUBLE PRECISION DBETA
4162      DOUBLE PRECISION DY1
4163      DOUBLE PRECISION DY2
4164      DOUBLE PRECISION DTEMP
4165C
4166C---------------------------------------------------------------------
4167C
4168      INCLUDE 'DPCOP2.INC'
4169C
4170C-----START POINT-----------------------------------------------------
4171C
4172C     CHECK THE INPUT ARGUMENTS FOR ERRORS
4173C
4174      IF(N.LT.1)THEN
4175        WRITE(ICOUT, 5)
4176        CALL DPWRST('XXX','BUG ')
4177        WRITE(ICOUT, 6)
4178        CALL DPWRST('XXX','BUG ')
4179        WRITE(ICOUT,47)N
4180        CALL DPWRST('XXX','BUG ')
4181        GOTO9000
4182      ENDIF
4183      IF(ALPHA.LE.0.0)THEN
4184        WRITE(ICOUT,15)
4185        CALL DPWRST('XXX','BUG ')
4186        WRITE(ICOUT,16)
4187        CALL DPWRST('XXX','BUG ')
4188        WRITE(ICOUT,46)ALPHA
4189        CALL DPWRST('XXX','BUG ')
4190        GOTO9000
4191      ENDIF
4192      IF(BETA.LE.0.0)THEN
4193        WRITE(ICOUT,25)
4194        CALL DPWRST('XXX','BUG ')
4195        WRITE(ICOUT,16)
4196        CALL DPWRST('XXX','BUG ')
4197        WRITE(ICOUT,46)BETA
4198        CALL DPWRST('XXX','BUG ')
4199        GOTO9000
4200      ENDIF
4201    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ASYMMETRIC ',
4202     1       'LOG DOUBLE EXPONENTIAL')
4203    6 FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
4204   15 FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER FOR THE')
4205   25 FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER FOR THE')
4206   16 FORMAT('      ASYMMETRIC LOG DOUBLE EXPONENTIAL RANDOM ',
4207     1       'NUMBERS IS NON-POSITIVE.')
4208   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
4209   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
4210C
4211C     NOTE 3/2006: ASYMMETRIC LOG DOUBLE EXPONENTIAL CAN BE
4212C                  REPRESENTED AS
4213C                     U1**(1/ALPHA)/U2**(1/BETA)
4214C
4215C     EARLY TESTING INDICATES THAT RATIO OF UNIFORMS METHOD
4216C     SEEMS TO GENERATE SOME EXCESSIVELY LARGE RANDOM NUMBERS,
4217C     SO STICK WITH PPF METHOD FOR NOW.
4218C
4219      DALPHA=DBLE(ALPHA)
4220      DBETA=DBLE(BETA)
4221C
4222      IALG=0
4223      IF(IALG.EQ.0)THEN
4224        CALL UNIRAN(N,ISEED,X)
4225        DO100I=1,N
4226          CALL ALDPPF(DBLE(X(I)),DALPHA,DBETA,DTEMP)
4227          X(I)=REAL(DTEMP)
4228  100   CONTINUE
4229      ELSE
4230        NTEMP=2
4231        DO200I=1,N
4232          CALL UNIRAN(NTEMP,ISEED,Y)
4233          DY1=DBLE(Y(1))
4234          DY2=DBLE(Y(2))
4235          X(I)=REAL(DY1**(1.0D0/DBETA)/DY2**(1.0D0/DALPHA))
4236  200   CONTINUE
4237      ENDIF
4238C
4239 9000 CONTINUE
4240      RETURN
4241      END
4242      DOUBLE PRECISION FUNCTION algdiv(a,b)
4243C-----------------------------------------------------------------------
4244C
4245C     COMPUTATION OF LN(GAMMA(B)/GAMMA(A+B)) WHEN B .GE. 8
4246C
4247C                         --------
4248C
4249C     IN THIS ALGORITHM, DEL(X) IS THE FUNCTION DEFINED BY
4250C     LN(GAMMA(X)) = (X - 0.5)*LN(X) - X + 0.5*LN(2*PI) + DEL(X).
4251C
4252C-----------------------------------------------------------------------
4253C     .. Scalar Arguments ..
4254      DOUBLE PRECISION a,b
4255C     ..
4256C     .. Local Scalars ..
4257      DOUBLE PRECISION c,c0,c1,c2,c3,c4,c5,d,h,s11,s3,s5,s7,s9,t,u,v,w,
4258     +                 x,x2
4259C     ..
4260C     .. External Functions ..
4261      DOUBLE PRECISION alnrel
4262      EXTERNAL alnrel
4263C     ..
4264C     .. Intrinsic Functions ..
4265      INTRINSIC dlog
4266C     ..
4267C     .. Data statements ..
4268      DATA c0/.833333333333333D-01/,c1/-.277777777760991D-02/,
4269     +     c2/.793650666825390D-03/,c3/-.595202931351870D-03/,
4270     +     c4/.837308034031215D-03/,c5/-.165322962780713D-02/
4271C     ..
4272C     .. Executable Statements ..
4273C------------------------
4274      IF (a.LE.b) GO TO 10
4275      h = b/a
4276      c = 1.0D0/ (1.0D0+h)
4277      x = h/ (1.0D0+h)
4278      d = a + (b-0.5D0)
4279      GO TO 20
4280
4281   10 h = a/b
4282      c = h/ (1.0D0+h)
4283      x = 1.0D0/ (1.0D0+h)
4284      d = b + (a-0.5D0)
4285C
4286C                SET SN = (1 - X**N)/(1 - X)
4287C
4288   20 x2 = x*x
4289      s3 = 1.0D0 + (x+x2)
4290      s5 = 1.0D0 + (x+x2*s3)
4291      s7 = 1.0D0 + (x+x2*s5)
4292      s9 = 1.0D0 + (x+x2*s7)
4293      s11 = 1.0D0 + (x+x2*s9)
4294C
4295C                SET W = DEL(B) - DEL(A + B)
4296C
4297      t = (1.0D0/b)**2
4298      w = ((((c5*s11*t+c4*s9)*t+c3*s7)*t+c2*s5)*t+c1*s3)*t + c0
4299      w = w* (c/b)
4300C
4301C                    COMBINE THE RESULTS
4302C
4303      u = d*alnrel(a/b)
4304      v = a* (dlog(b)-1.0D0)
4305      IF (u.LE.v) GO TO 30
4306      algdiv = (w-v) - u
4307      RETURN
4308
4309   30 algdiv = (w-u) - v
4310      RETURN
4311
4312      END
4313      SUBROUTINE ALPCDF(DX,DALPHA,DCDF)
4314CCCCC SUBROUTINE ALPCDF(X,ALPHA,BETA,CDF)
4315C
4316C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
4317C              FUNCTION VALUE FOR THE ALPHA DISTRIBUTION
4318C              WITH SHAPE PARAMETER ALPHA AND SCALE PARAMETER BETA.
4319C              THIS DISTRIBUTION IS DEFINED FOR ALL
4320C              NON-NEGATIVE X, AND HAS THE CUMULATIVE DISTRIBUTION
4321C              FUNCTION
4322C
4323C                F(X;ALPHA) = NORCDF(ALPHA-BETA/X)/NORCDF(ALPHA)
4324C
4325C              NOTE 11/2007: ROUTINE PREVIOSLY TREATED BETA AS A
4326C                            SHAPE PARAMETER.  CORRECT SO THAT
4327C                            BETA IS A SCALE PARAMETER (AND
4328C                            SO CAN BE ASSUMED TO BE 1 IN THIS
4329C                            ROUTINE).
4330C
4331C     WRITTEN BY--JAMES J. FILLIBEN
4332C                 STATISTICAL ENGINEERING DIVISION
4333C                 INFORMATION TECHNOLOGY LABORATORY
4334C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4335C                 GAITHERSBURG, MD 20899-8980
4336C                 PHONE--301-975-2855
4337C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4338C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4339C     LANGUAGE--ANSI FORTRAN (1977)
4340C     VERSION NUMBER--95/4
4341C     ORIGINAL VERSION--APRIL     1995.
4342C     UPDATED         --NOVEMBER  2007. BETA IS A SCALE PARAMETER,
4343C                                       SO ASSUME = 1
4344C     UPDATED         --NOVEMBER  2007. MAKE ARGUMENTS DOUBLE PRECISON
4345C
4346C
4347C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4348C
4349C
4350      DOUBLE PRECISION DX
4351      DOUBLE PRECISION DALPHA
4352      DOUBLE PRECISION DCDF
4353      DOUBLE PRECISION DTERM1
4354      DOUBLE PRECISION DTERM2
4355      DOUBLE PRECISION DTERM3
4356C
4357      INCLUDE 'DPCOP2.INC'
4358C
4359C-----START POINT-----------------------------------------------------
4360C
4361      DCDF=0.0D0
4362      IF(DX.LT.0.0D0)THEN
4363        WRITE(ICOUT,4)
4364        CALL DPWRST('XXX','BUG ')
4365        WRITE(ICOUT,47)DX
4366        CALL DPWRST('XXX','BUG ')
4367        GOTO9999
4368      ELSEIF(DX.EQ.0.0D0)THEN
4369        GOTO9999
4370      ELSEIF(DALPHA.LE.0.0D0)THEN
4371        WRITE(ICOUT,14)
4372        CALL DPWRST('XXX','BUG ')
4373        WRITE(ICOUT,47)DALPHA
4374        CALL DPWRST('XXX','BUG ')
4375        GOTO9999
4376      ENDIF
4377    4 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ALPCDF IS NEGATIVE.')
4378   14 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ALPCDF IS ',
4379     1       'NON-POSITIVE.')
4380   47 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
4381C
4382      CALL NODCDF(DALPHA,DTERM1)
4383      DTERM2=DALPHA-(1.0D0/DX)
4384      CALL NODCDF(DTERM2,DTERM3)
4385      IF(DTERM1.GT.0.0D0)THEN
4386        DCDF=DTERM3/DTERM1
4387      ELSE
4388        DCDF=0.0D0
4389      ENDIF
4390C
4391 9999 CONTINUE
4392      RETURN
4393      END
4394      SUBROUTINE ALPCHA(DX,DALPHA,DHAZ)
4395CCCCC SUBROUTINE ALPCHA(X,ALPHA,BETA,HAZ)
4396C
4397C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE HAZARD
4398C              FUNCTION VALUE FOR THE ALPHA DISTRIBUTION
4399C              WITH SHAPE PARAMETER ALPHA AND SCALE PARAMETER
4400C              BETA.  THIS DISTRIBUTION IS DEFINED FOR ALL
4401C              NON-NEGATIVE X, AND HAS THE CUMULATIVE HAZARD
4402C              FUNCTION
4403C
4404C              H(X;ALPHA) = -LOG(1 - NORCDF(ALPHA-BETA/X)/NORCDF(ALPHA))
4405C
4406C              NOTE 11/2007: ROUTINE PREVIOSLY TREATED BETA AS A
4407C                            SHAPE PARAMETER.  CORRECT SO THAT
4408C                            BETA IS A SCALE PARAMETER (AND
4409C                            SO CAN BE ASSUMED TO BE 1 IN THIS
4410C                            ROUTINE).
4411C
4412C     WRITTEN BY--JAMES J. FILLIBEN
4413C                 STATISTICAL ENGINEERING DIVISION
4414C                 INFORMATION TECHNOLOGY LABORATORY
4415C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4416C                 GAITHERSBURG, MD 20899-8980
4417C                 PHONE--301-975-2855
4418C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4419C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4420C     LANGUAGE--ANSI FORTRAN (1977)
4421C     VERSION NUMBER--98/4
4422C     ORIGINAL VERSION--APRIL     1998.
4423C     UPDATED         --NOVEMBER  2007. ALPHA IS A SCALE PARAMETER,
4424C                                       SO ASSUME = 1
4425C     UPDATED         --NOVEMBER  2007. MAKE ARGUMENTS DOUBLE PRECISON
4426C
4427C
4428C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4429C
4430      DOUBLE PRECISION DX
4431      DOUBLE PRECISION DALPHA
4432      DOUBLE PRECISION DHAZ
4433      DOUBLE PRECISION DTERM1
4434      DOUBLE PRECISION DTERM2
4435      DOUBLE PRECISION DTERM3
4436      DOUBLE PRECISION DCDF
4437C
4438      INCLUDE 'DPCOP2.INC'
4439C
4440C-----START POINT-----------------------------------------------------
4441C
4442      DHAZ=0.0D0
4443      IF(DX.LT.0.0D0)THEN
4444        WRITE(ICOUT,4)
4445        CALL DPWRST('XXX','BUG ')
4446        WRITE(ICOUT,47)DX
4447        CALL DPWRST('XXX','BUG ')
4448        GOTO9999
4449      ELSEIF(DX.EQ.0.0D0)THEN
4450        GOTO9999
4451      ELSEIF(DALPHA.LE.0.0D0)THEN
4452        WRITE(ICOUT,14)
4453        CALL DPWRST('XXX','BUG ')
4454        WRITE(ICOUT,47)DALPHA
4455        CALL DPWRST('XXX','BUG ')
4456        GOTO9999
4457      ENDIF
4458    4 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ALPCHAZ IS NEGATIVE.')
4459   14 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ALPCHAZ IS ',
4460     1       'NON-POSITIVE.')
4461   47 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
4462C
4463      CALL NODCDF(DALPHA,DTERM1)
4464      DTERM2=DALPHA - (1.0D0/DX)
4465      CALL NODCDF(DTERM2,DTERM3)
4466      DCDF=1.0D0 - DTERM3/DTERM1
4467C
4468      IF(DCDF.GT.0.0D0)THEN
4469        DHAZ=-DLOG(DCDF)
4470      ELSE
4471        DHAZ=0.0D0
4472        WRITE(ICOUT,301)
4473        CALL DPWRST('XXX','BUG ')
4474        WRITE(ICOUT,302)
4475        CALL DPWRST('XXX','BUG ')
4476        WRITE(ICOUT,303)
4477        CALL DPWRST('XXX','BUG ')
4478        WRITE(ICOUT,304)DX
4479        CALL DPWRST('XXX','BUG ')
4480      ENDIF
4481  301 FORMAT('**** ERROR FROM ALPCHAZ--')
4482  302 FORMAT('     THE CDF VALUE IS ESSENTIALLY 1, SO THE CUMULATIVE')
4483  303 FORMAT('     HAZARD IS UNDEFINED (SET TO 0).')
4484  304 FORMAT('     THE VALUE OF THE FIRST INPUT ARGUMENT IS ',G15.7)
4485C
4486 9999 CONTINUE
4487      RETURN
4488      END
4489      SUBROUTINE ALPHAZ(DX,DALPHA,DHAZ)
4490CCCCC SUBROUTINE ALPHAZ(X,ALPHA,BETA,HAZ)
4491C
4492C     PURPOSE--THIS SUBROUTINE COMPUTES THE HAZARD
4493C              FUNCTION VALUE FOR THE ALPHA DISTRIBUTION
4494C              WITH SHAPE PARAMETER ALPHA AND SCALE PARAMETER BETA.
4495C              THIS DISTRIBUTION IS DEFINED FOR ALL
4496C              NON-NEGATIVE X, AND HAS THE HAZARD FUNCTION
4497C
4498C              H(X;ALPHA) = BETA*NORPDF(T)/
4499C                           (X**2*(NORCDF(ALPHA)-NORCDF(T))
4500C
4501C              WHERE T = ALPHA - BETA/X
4502C
4503C              NOTE 11/2007: ROUTINE PREVIOSLY TREATED BETA AS A
4504C                            SHAPE PARAMETER.  CORRECT SO THAT
4505C                            BETA IS A SCALE PARAMETER (AND
4506C                            SO CAN BE ASSUMED TO BE 1 IN THIS
4507C                            ROUTINE).
4508C
4509C     WRITTEN BY--JAMES J. FILLIBEN
4510C                 STATISTICAL ENGINEERING DIVISION
4511C                 INFORMATION TECHNOLOGY LABORATORY
4512C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4513C                 GAITHERSBURG, MD 20899-8980
4514C                 PHONE--301-975-2855
4515C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4516C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4517C     LANGUAGE--ANSI FORTRAN (1977)
4518C     VERSION NUMBER--98/4
4519C     ORIGINAL VERSION--APRIL     1998.
4520C     UPDATED         --NOVEMBER  2007. ALPHA IS A SCALE PARAMETER,
4521C                                       SO ASSUME = 1
4522C     UPDATED         --NOVEMBER  2007. MAKE ARGUMENTS DOUBLE PRECISON
4523C
4524C
4525C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4526C
4527      DOUBLE PRECISION DX
4528      DOUBLE PRECISION DALPHA
4529      DOUBLE PRECISION DHAZ
4530C
4531      DOUBLE PRECISION DTERM1
4532      DOUBLE PRECISION DTERM2
4533      DOUBLE PRECISION DTERM3
4534      DOUBLE PRECISION DNUM
4535      DOUBLE PRECISION DDENOM
4536      DOUBLE PRECISION DT
4537C
4538      INCLUDE 'DPCOP2.INC'
4539C
4540C-----START POINT-----------------------------------------------------
4541C
4542      DHAZ=0.0D0
4543      IF(DX.LE.0.0D0)THEN
4544        WRITE(ICOUT,4)
4545    4   FORMAT('***** ERROR--THE FIRST ARGUMENT TO ALPHAZ IS ',
4546     1         'NON-POSITIVE.')
4547        CALL DPWRST('XXX','BUG ')
4548        WRITE(ICOUT,47)DX
4549   47   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
4550        CALL DPWRST('XXX','BUG ')
4551        GOTO9999
4552      ELSEIF(DALPHA.LE.0.0D0)THEN
4553        WRITE(ICOUT,14)
4554   14   FORMAT('***** ERROR--THE SECOND ARGUMENT TO ALPHAZ IS ',
4555     1         'NON-POSITIVE.')
4556        CALL DPWRST('XXX','BUG ')
4557        WRITE(ICOUT,47)DALPHA
4558        CALL DPWRST('XXX','BUG ')
4559        GOTO9999
4560      ENDIF
4561C
4562      DT=DALPHA - (1.0D0/DX)
4563C
4564      CALL NODCDF(DT,DTERM2)
4565      CALL NODCDF(DALPHA,DTERM3)
4566      DTERM1=DTERM3-DTERM2
4567      CALL NODPDF(DT,DNUM)
4568      DDENOM=(DX**2)*DTERM1
4569      IF(DDENOM.NE.0.0D0)THEN
4570        DHAZ=DNUM/DDENOM
4571      ELSE
4572        WRITE(ICOUT,101)
4573        CALL DPWRST('XXX','BUG ')
4574        WRITE(ICOUT,102)DX
4575        CALL DPWRST('XXX','BUG ')
4576      ENDIF
4577  101 FORMAT('***** ERROR IN ALPHAZ--HAZARD FUNCTION IS UNDEFINED.')
4578  102 FORMAT('      VALUE OF THE ARGUMENT IS ',G15.7,'.')
4579C
4580 9999 CONTINUE
4581      RETURN
4582      END
4583      SUBROUTINE ALPFUN (N, X, FVEC, IFLAG, XDATA, NOBS)
4584C
4585C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
4586C              ALPHA MAXIMUM LIKELIHOOD EQUATIONS.
4587C
4588C              BETA*SUM[i=1 to N][1/X(i)] - N*ALPHA - N*Z = 0
4589C
4590C              (N/BETA) + BETA*SUM[i=1 to N][1/X(i)**2] -
4591C              ALPHA*SUM[i=1 to N][1/X(i)] = 0
4592C
4593C              WHERE
4594C
4595C              Z        = d/dalpha LOG(NORCDF(ALPHA))
4596C
4597C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
4598C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
4599C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
4600C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
4601C     EXAMPLE--ALPHA MAXIMUM LIKELIHOOD Y
4602C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994), "CONTINUOUS
4603C                UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
4604C                WILEY, P. 173.
4605C              --SALVIA (1985), "RELIABILITY APPLICATIONS OF THE
4606C                ALPHA DISTRIBUTION", IEEE TRANSACTIONS ON
4607C                RELIABILITY, VOL. R-34, NO. 3, PP. 251-252.
4608C     WRITTEN BY--JAMES J. FILLIBEN
4609C                 STATISTICAL ENGINEERING DIVISION
4610C                 INFORMATION TECHNOLOGY LABORATORY
4611C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4612C                 GAITHERSBURG, MD 20899-8980
4613C                 PHONE--301-975-2855
4614C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4615C           OF THE NATIONAL BUREAU OF STANDARDS.
4616C     LANGUAGE--ANSI FORTRAN (1977)
4617C     VERSION NUMBER--2007/12
4618C     ORIGINAL VERSION--DECEMBER  2007.
4619C
4620C---------------------------------------------------------------------
4621C
4622      DOUBLE PRECISION X(*)
4623      DOUBLE PRECISION FVEC(*)
4624      REAL XDATA(*)
4625C
4626      DOUBLE PRECISION DBETA
4627      DOUBLE PRECISION DALPHA
4628      DOUBLE PRECISION DN
4629      DOUBLE PRECISION DX
4630      DOUBLE PRECISION H
4631      DOUBLE PRECISION DSUM1
4632      DOUBLE PRECISION DSUM2
4633      DOUBLE PRECISION DTERM1
4634      DOUBLE PRECISION DTERM2
4635      DOUBLE PRECISION DTERM3
4636      DOUBLE PRECISION DTERM4
4637      DOUBLE PRECISION DTERM5
4638C
4639C---------------------------------------------------------------------
4640C
4641      INCLUDE 'DPCOP2.INC'
4642C
4643      DOUBLE PRECISION ERR
4644      DOUBLE PRECISION CON
4645      DOUBLE PRECISION CON2
4646      DOUBLE PRECISION BIG
4647      DOUBLE PRECISION SAFE
4648      DOUBLE PRECISION ERRT
4649      DOUBLE PRECISION FAC
4650      DOUBLE PRECISION HH
4651      DOUBLE PRECISION DZ
4652      INTEGER I
4653      INTEGER J
4654      PARAMETER (CON=1.4D0)
4655      PARAMETER (CON2=CON*CON)
4656      PARAMETER (BIG=1.D30)
4657      PARAMETER (NTAB=10)
4658      PARAMETER (SAFE=2.D0)
4659C
4660      DOUBLE PRECISION A(NTAB,NTAB)
4661C
4662C-----START POINT-----------------------------------------------------
4663C
4664C  COMPUTE SOME SUMS
4665C
4666      N=2
4667      IFLAG=0
4668C
4669      DN=DBLE(NOBS)
4670      DALPHA=DBLE(X(1))
4671      DBETA=DBLE(X(2))
4672      DZ=0.0D0
4673C
4674C     COMPUTE Z USING RIDDER'S METHOD:
4675C
4676      H=0.3D0
4677      HH=H
4678      CALL NODCDF(DALPHA+HH,DTERM4)
4679      DTERM4=DLOG(DTERM4)
4680      CALL NODCDF(DALPHA-HH,DTERM5)
4681      DTERM5=DLOG(DTERM5)
4682      DTERM2=(DTERM4 - DTERM5)/(2.0D0*HH)
4683      A(1,1)=DTERM2
4684      ERR=BIG
4685      DO10I=2,NTAB
4686        HH=HH/CON
4687        CALL NODCDF(DALPHA+HH,DTERM4)
4688        DTERM4=DLOG(DTERM4)
4689        CALL NODCDF(DALPHA-HH,DTERM5)
4690        DTERM5=DLOG(DTERM5)
4691        DTERM2=(DTERM4 - DTERM5)/(2.0D0*HH)
4692        A(1,I)=DTERM2
4693        FAC=CON2
4694        DO20J=2,I
4695          A(J,I)=(A(J-1,I)*FAC - A(J-1,I-1))/(FAC-1.0D0)
4696          FAC=CON2*FAC
4697          ERRT=MAX(DABS(A(J,I)-A(J-1,I)),DABS(A(J,I)-A(J-1,I-1)))
4698          IF(ERRT.LE.ERR)THEN
4699            ERR=ERRT
4700            DZ=A(J,I)
4701          ENDIF
4702   20   CONTINUE
4703        IF(DABS(A(I,I)-A(I-1,I-1)).GE.SAFE*ERR)GOTO99
4704   10 CONTINUE
4705   99 CONTINUE
4706C
4707      DTERM1=DN*DALPHA
4708      DTERM2=DN*DZ
4709      DTERM3=DN/DBETA
4710      DSUM1=0.0D0
4711      DSUM2=0.0D0
4712C
4713      DO200I=1,NOBS
4714C
4715        DX=1.0D0/DBLE(XDATA(I))
4716C
4717        DSUM1=DSUM1 + DX
4718        DSUM2=DSUM2 + DX*DX
4719C
4720  200 CONTINUE
4721C
4722      FVEC(1)=DBETA*DSUM1 - DTERM1 - DTERM2
4723      FVEC(2)=DTERM3 + DBETA*DSUM2 - DALPHA*DSUM1
4724C
4725      RETURN
4726      END
4727      SUBROUTINE ALPPDF(DX,DALPHA,DPDF)
4728CCCCC SUBROUTINE ALPPDF(X,ALPHA,BETA,PDF)
4729C
4730C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
4731C              FUNCTION VALUE FOR THE ALPHA DISTRIBUTION
4732C              WITH SHAPE PARAMETER ALPHA AND SCALE PARAMETER BETA.
4733C              THIS DISTRIBUTION IS DEFINED FOR ALL
4734C              NON-NEGATIVE X, AND HAS THE PROBABILITY DENSITY
4735C              FUNCTION
4736C
4737C              f(X;ALPHA,BETA) = BETA*NORPDF(ALPHA-BETA/X)/
4738C                                [X**2*NORCDF(ALPHA)]
4739C
4740C              NOTE 11/2007: ROUTINE PREVIOSLY TREATED BETA AS A
4741C                            SHAPE PARAMETER.  CORRECT SO THAT
4742C                            BETA IS A SCALE PARAMETER (AND
4743C                            SO CAN BE ASSUMED TO BE 1 IN THIS
4744C                            ROUTINE).
4745C
4746C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994), "CONTINUOUS
4747C                UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
4748C                WILEY, P. 173.
4749C              --SALVIA (1985), "RELIABILITY APPLICATIONS OF THE
4750C                ALPHA DISTRIBUTION", IEEE TRANSACTIONS ON
4751C                RELIABILITY, VOL. R-34, NO. 3, PP. 251-252.
4752C     WRITTEN BY--JAMES J. FILLIBEN
4753C                 STATISTICAL ENGINEERING DIVISION
4754C                 INFORMATION TECHNOLOGY LABORATORY
4755C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4756C                 GAITHERSBURG, MD 20899-8980
4757C                 PHONE--301-975-2855
4758C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4759C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4760C     LANGUAGE--ANSI FORTRAN (1977)
4761C     VERSION NUMBER--95/4
4762C     ORIGINAL VERSION--APRIL     1995.
4763C     UPDATED         --JULY      1995. DEFINE DPDF AS DOUBLE PREC.
4764C     UPDATED         --NOVEMBER  2007. ALPHA IS A SCALE PARAMETER,
4765C                                       SO ASSUME = 1
4766C     UPDATED         --NOVEMBER  2007. MAKE ARGUMENTS DOUBLE PRECISON
4767C
4768C
4769C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4770C
4771      DOUBLE PRECISION DX
4772      DOUBLE PRECISION DALPHA
4773      DOUBLE PRECISION DPDF
4774C
4775      DOUBLE PRECISION DT
4776      DOUBLE PRECISION DTERM1
4777      DOUBLE PRECISION DTERM2
4778C
4779      INCLUDE 'DPCOP2.INC'
4780C
4781CCCCC DATA EPS/0.1E-16/
4782C
4783C-----START POINT-----------------------------------------------------
4784C
4785      DPDF=0.0D0
4786      IF(DX.LE.0.0D0)THEN
4787        WRITE(ICOUT,4)
4788        CALL DPWRST('XXX','BUG ')
4789        WRITE(ICOUT,47)DX
4790        CALL DPWRST('XXX','BUG ')
4791        GOTO9999
4792      ELSEIF(DALPHA.LE.0.0D0)THEN
4793        WRITE(ICOUT,14)
4794        CALL DPWRST('XXX','BUG ')
4795        WRITE(ICOUT,47)ALPHA
4796        CALL DPWRST('XXX','BUG ')
4797        GOTO9999
4798      ENDIF
4799    4 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ALPPDF IS ',
4800     1       'NON-POSITIVE.')
4801   14 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ALPPDF IS ',
4802     1       'NON-POSITIVE.')
4803   47 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
4804C
4805C
4806      DT=DALPHA - (1.0D0/DX)
4807      CALL NODPDF(DT,DTERM1)
4808      CALL NODCDF(DALPHA,DTERM2)
4809      DPDF=DTERM1/(DTERM2*(DX**2))
4810C
4811 9999 CONTINUE
4812      RETURN
4813      END
4814      SUBROUTINE ALPML1(Y,N,ALPHSV,SCALSV,MAXNXT,
4815     1                  TEMP1,TEMP2,DISPAR,DTEMP1,
4816     1                  XMEAN,XSD,XVAR,XMIN,XMAX,
4817     1                  ALPHMO,SCALMO,ALPHML,SCALML,
4818     1                  ISUBRO,IBUGA3,IERROR)
4819C
4820C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
4821C              FOR THE ALPHA DISTRIBUTION FOR THE RAW DATA CASE (I.E.,
4822C              NO CENSORING AND NO GROUPING).  THIS ROUTINE RETURNS ONLY
4823C              THE POINT ESTIMATES.
4824C
4825C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
4826C              PERFORMED.
4827C
4828C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
4829C              FROM MULTIPLE PLACES (DPMLAL WILL GENERATE THE OUTPUT
4830C              FOR THE ALPHA MLE COMMAND).
4831C
4832C     NOTE--THE MAXIMIUM LIKELIHOOD ESTIMATES ARE THE SOLUTIONS
4833C           TO THE FOLLOWING EQUATIONS:
4834C
4835C             BETA*SUM[i=1 to N][1/X(i)] - N*ALPHA - N*Z = 0
4836C
4837C             (N/BETA) + BETA*SUM[i=1 to N][1/X(i)**2] -
4838C             ALPHA*SUM[i=1 to N][1/X(i)] = 0
4839C
4840C           WHERE
4841C
4842C             Z        = d/dalpha LOG(NORCDF(ALPHA))
4843C
4844C           THE MOMENT ESTIMATES ARE
4845C
4846C           ALPHAHAT = M/S
4847C           BETAHAT = M**2/S
4848C
4849C           WHERE M AND S ARE THE SAMPLE MEAN AND SAMPLE SD.
4850C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994), "CONTINUOUS
4851C                UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
4852C                WILEY, P. 173.
4853C              --SALVIA (1985), "RELIABILITY APPLICATIONS OF THE
4854C                ALPHA DISTRIBUTION", IEEE TRANSACTIONS ON
4855C                RELIABILITY, VOL. R-34, NO. 3, PP. 251-252.
4856C     WRITTEN BY--ALAN HECKERT
4857C                 STATISTICAL ENGINEERING DIVISION
4858C                 INFORMATION TECHNOLOGY LABORATORY
4859C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
4860C                 GAITHERSBURG, MD 20899-8980
4861C                 PHONE--301-975-2899
4862C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
4863C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
4864C     LANGUAGE--ANSI FORTRAN (1977)
4865C     VERSION NUMBER--2010/7
4866C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
4867C                                       SUBROUTINE (FROM DPMLAL)
4868C
4869C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
4870C
4871      DIMENSION Y(*)
4872      DIMENSION TEMP1(*)
4873      DIMENSION TEMP2(*)
4874      DIMENSION DISPAR(*)
4875      DIMENSION DISPA2(1)
4876      INTEGER   IPPCAP(2)
4877      DOUBLE PRECISION DTEMP1(*)
4878C
4879      EXTERNAL ALPFUN
4880C
4881      DOUBLE PRECISION DPPF
4882      DOUBLE PRECISION TOL
4883      DOUBLE PRECISION XPAR(2)
4884      DOUBLE PRECISION FVEC(2)
4885C
4886      CHARACTER*4 ISUBRO
4887      CHARACTER*4 IBUGA3
4888      CHARACTER*4 IERROR
4889C
4890      CHARACTER*4 IWRITE
4891      CHARACTER*40 IDIST
4892C
4893      CHARACTER*4 ISUBN1
4894      CHARACTER*4 ISUBN2
4895      CHARACTER*4 ISTEPN
4896C
4897      CHARACTER*4 IADEDF
4898      CHARACTER*4 IGEPDF
4899      CHARACTER*4 IMAKDF
4900      CHARACTER*4 IBEIDF
4901      CHARACTER*4 ILGADF
4902      CHARACTER*4 ISKNDF
4903      CHARACTER*4 IGLDDF
4904      CHARACTER*4 IBGEDF
4905      CHARACTER*4 IGETDF
4906      CHARACTER*4 ICONDF
4907      CHARACTER*4 IGOMDF
4908      CHARACTER*4 IKATDF
4909      CHARACTER*4 IGIGDF
4910      CHARACTER*4 IGEODF
4911      CHARACTER*4 ICASPL
4912      CHARACTER*4 ICASP2
4913C
4914C---------------------------------------------------------------------
4915C
4916      INCLUDE 'DPCOP2.INC'
4917C
4918C-----START POINT-----------------------------------------------------
4919C
4920      ISUBN1='ALPM'
4921      ISUBN2='L1  '
4922      IERROR='NO'
4923      IWRITE='OFF'
4924C
4925      SHAPE1=0.0
4926      SCALE2=0.0
4927      ALPHMO=0.0
4928      ALPHML=0.0
4929      SCALMO=0.0
4930      SCALML=0.0
4931C
4932      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'PML1')THEN
4933        WRITE(ICOUT,999)
4934  999   FORMAT(1X)
4935        CALL DPWRST('XXX','WRIT')
4936        WRITE(ICOUT,51)
4937   51   FORMAT('**** AT THE BEGINNING OF ALPML1--')
4938        CALL DPWRST('XXX','WRIT')
4939        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
4940   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
4941        CALL DPWRST('XXX','WRIT')
4942        DO56I=1,MIN(N,100)
4943          WRITE(ICOUT,57)I,Y(I)
4944   57     FORMAT('I,Y(I) = ',I8,G15.7)
4945          CALL DPWRST('XXX','WRIT')
4946   56   CONTINUE
4947      ENDIF
4948C
4949C               ****************************************************
4950C               **  STEP 2--                                      **
4951C               **  CARRY OUT CALCULATIONS                        **
4952C               **  FOR ALPHA MLE ESTIMATE                        **
4953C               ****************************************************
4954C
4955      ISTEPN='2'
4956      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'PML1')
4957     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
4958C
4959      IDIST='ALPHA'
4960      SCALMO=CPUMIN
4961      SHAPMO=CPUMIN
4962      SCALML=CPUMIN
4963      SHAPML=CPUMIN
4964C
4965      IFLAG=2
4966      CALL SUMRAW(Y,N,IDIST,IFLAG,
4967     1            XMEAN,XVAR,XSD,XMIN,XMAX,
4968     1            ISUBRO,IBUGA3,IERROR)
4969      IF(IERROR.EQ.'YES')GOTO9000
4970C
4971C               **********************************
4972C               **  STEP 21--                   **
4973C               **  CARRY OUT CALCULATIONS      **
4974C               **  FOR ALPHA MLE               **
4975C               **  ESTIMATE (FULL SAMPLE CASE) **
4976C               **********************************
4977C
4978      ISTEPN='21'
4979      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'MLAL')
4980     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
4981C
4982      DO1125I=1,N
4983        TEMP1(I)=1.0/Y(I)
4984 1125 CONTINUE
4985      CALL MEAN(TEMP1,N,IWRITE,ZMEAN,IBUGA3,IERROR)
4986      CALL SD(TEMP1,N,IWRITE,ZSD,IBUGA3,IERROR)
4987C
4988      ALPHMO=ZMEAN/ZSD
4989      SCALMO=ZMEAN**2/ZSD
4990C
4991      IF(ALPHSV.GT.0.0 .AND. SCALSV.GT.0.0)THEN
4992        XPAR(1)=DBLE(ALPHSV)
4993        XPAR(2)=DBLE(SCALSV)
4994      ELSE
4995C
4996C       IF NO STARTING VALUES SPECIFIED, COMPUTE STARTING
4997C       VALUES BASED ON PPCC METHOD.
4998C
4999        CALL UNIMED(N,TEMP1)
5000        CALL SORT(Y,N,Y)
5001        ICASP2='ALPH'
5002        ICASPL='PPCC'
5003        IPPCAP(1)=100
5004        IPPCAP(2)=1
5005C
5006C       OBTAIN LOWER/UPPER LIMITS FOR SHAPE PARAMETER
5007C
5008        CALL EXTPA2(ICASP2,IDIST,A,B,
5009     1              SHAP11,SHAP12,SHAP21,SHAP22,
5010     1              SHAPE1,SHAPE2,SHAPE3,SHAPE4,SHAPE5,
5011     1              IADEDF,IGEPDF,IMAKDF,IBEIDF,
5012     1              ILGADF,ISKNDF,IGLDDF,IBGEDF,
5013     1              IGETDF,ICONDF,IGOMDF,IKATDF,
5014     1              IGIGDF,IGEODF,
5015     1              ISUBRO,IBUGA3,IERROR)
5016C
5017C       CREATE ARRAY FOR THE CANDIDATE VALUES OF SHAPE PARAMETER
5018C
5019        NUMSHA=1
5020        NUMDIS=50
5021        CALL DPPPC7(ICASPL,ICASP2,IPPCAP,
5022     1              SHAP11,SHAP12,SHAP21,SHAP22,
5023     1              SHAPE1,SHAPE2,SHAPE3,SHAPE4,
5024     1              XMIN,XMAX,A,B,
5025     1              DISPAR,DISPA2,NUMDIS,NUMSHA,
5026     1              IADEDF,IGEPDF,IMAKDF,IBEIDF,
5027     1              ILGADF,ISKNDF,IGLDDF,IBGEDF,IGETDF,
5028     1              ICONDF,IGOMDF,IKATDF,IGIGDF,IGEODF,
5029     1              IBUGA3,ISUBRO,IERROR)
5030C
5031        CORRMX=-1.0
5032        IWRITE='OFF'
5033        DO1010IDIS=1,NUMDIS
5034          SHAPE=DISPAR(IDIS)
5035          DO1020I=1,N
5036            CALL ALPPPF(DBLE(TEMP1(I)),DBLE(SHAPE),DPPF)
5037            TEMP2(I)=REAL(DPPF)
5038 1020     CONTINUE
5039          CALL CORR(Y,TEMP2,N,IWRITE,CC,IBUGA3,IERROR)
5040          IF(CC.GT.CORRMX)THEN
5041            SHAPE1=SHAPE
5042            CALL LINFI2(Y,TEMP2,N,PPA0,PPA1,ISUBRO,IBUGA3,IERROR)
5043            CORRMX=CC
5044            SCALE2=PPA1
5045          ENDIF
5046 1010   CONTINUE
5047        XPAR(1)=DBLE(SHAPE1)
5048        XPAR(2)=DBLE(SCALE2)
5049      ENDIF
5050C
5051      IOPT=2
5052      TOL=1.0D-5
5053      NVAR=2
5054      NPRINT=-1
5055      INFO=0
5056      CALL DNSQE(ALPFUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
5057     1           DTEMP1,MAXNXT,Y,N)
5058C
5059      ALPHML=REAL(XPAR(1))
5060      SCALML=REAL(XPAR(2))
5061C
5062 9000 CONTINUE
5063      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'PML1')THEN
5064        WRITE(ICOUT,999)
5065        CALL DPWRST('XXX','WRIT')
5066        WRITE(ICOUT,9011)
5067 9011   FORMAT('**** AT THE END OF ALPML1--')
5068        CALL DPWRST('XXX','WRIT')
5069        WRITE(ICOUT,9013)N,XMEAN,XSD,XMIN,XMAX
5070 9013   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
5071        CALL DPWRST('XXX','WRIT')
5072        WRITE(ICOUT,9017)ALPHML,SCALML,ALPHMO,SCALMO
5073 9017   FORMAT('ALPPML,SCALML,ALPHMO,SCALMO =  ',4G15.7)
5074        CALL DPWRST('XXX','WRIT')
5075      ENDIF
5076C
5077      RETURN
5078      END
5079      SUBROUTINE ALPPPF(DP,DALPHA,DPPF)
5080CCCCC SUBROUTINE ALPPPF(P,ALPHA,BETA,PPF)
5081C
5082C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
5083C              FUNCTION VALUE FOR THE ALPHA DISTRIBUTION
5084C              WITH SHAPE PARAMETER ALPHA AND SCALE PARAMETER BETA.
5085C              THIS DISTRIBUTION IS DEFINED FOR ALL
5086C              NON-NEGATIVE X, AND HAS THE PERCENT POINT FUNCTION
5087C
5088C              G(P;ALPHA,BETA) = BETA/
5089C                                [ALPHA - NORPPF(P*NORCDF(ALPHA))]
5090C     WRITTEN BY--JAMES J. FILLIBEN
5091C                 STATISTICAL ENGINEERING DIVISION
5092C                 INFORMATION TECHNOLOGY LABORATORY
5093C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5094C                 GAITHERSBURG, MD 20899-8980
5095C                 PHONE--301-975-2855
5096C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5097C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5098C     LANGUAGE--ANSI FORTRAN (1977)
5099C     VERSION NUMBER--95/4
5100C     ORIGINAL VERSION--APRIL     1995.
5101C     UPDATED         --JULY      1995.   DEFINE DPPF AS DOUBLE PREC.
5102C     UPDATED         --NOVEMBER  2007. ALPHA IS A SCALE PARAMETER,
5103C                                       SO ASSUME = 1
5104C     UPDATED         --NOVEMBER  2007. MAKE ARGUMENTS DOUBLE PRECISON
5105C
5106C
5107C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5108C
5109C
5110      DOUBLE PRECISION DP
5111      DOUBLE PRECISION DALPHA
5112      DOUBLE PRECISION DPPF
5113      DOUBLE PRECISION DTERM1
5114      DOUBLE PRECISION DTERM2
5115      DOUBLE PRECISION DTERM3
5116C
5117      INCLUDE 'DPCOP2.INC'
5118C
5119C-----START POINT-----------------------------------------------------
5120C
5121      DPPF=0.0D0
5122      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
5123        WRITE(ICOUT,4)
5124        CALL DPWRST('XXX','BUG ')
5125        WRITE(ICOUT,47)DP
5126        CALL DPWRST('XXX','BUG ')
5127        GOTO9999
5128      ELSEIF(DALPHA.LE.0.0D0)THEN
5129        WRITE(ICOUT,14)
5130        CALL DPWRST('XXX','BUG ')
5131        WRITE(ICOUT,47)DALPHA
5132        CALL DPWRST('XXX','BUG ')
5133        GOTO9999
5134      ENDIF
5135    4 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ALPPPF IS ',
5136     1       'OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
5137   14 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ALPCDF IS ',
5138     1       'NON-POSITIVE.')
5139   47 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
5140C
5141      CALL NODCDF(DALPHA,DTERM1)
5142      DTERM2=DP*DTERM1
5143      CALL NODPPF(DTERM2,DTERM3)
5144      DDENOM=DALPHA - DTERM3
5145      IF(DDENOM.NE.0.0D0)THEN
5146        DPPF=1.0D0/DDENOM
5147      ELSE
5148        WRITE(ICOUT,301)
5149        CALL DPWRST('XXX','BUG ')
5150        WRITE(ICOUT,302)
5151        CALL DPWRST('XXX','BUG ')
5152        WRITE(ICOUT,304)DP
5153        CALL DPWRST('XXX','BUG ')
5154      ENDIF
5155  301 FORMAT('**** ERROR FROM ALPPPF--')
5156  302 FORMAT('     AN INFINITE PPF VALUE IS ENCOUNTERED (SET TO 0).')
5157  304 FORMAT('     THE VALUE OF THE FIRST INPUT ARGUMENT IS ',G15.7)
5158C
5159 9999 CONTINUE
5160      RETURN
5161      END
5162      SUBROUTINE ALPRAN(N,ALPHA,ISEED,X)
5163CCCCC SUBROUTINE ALPRAN(N,ALPHA,BETA,ISEED,X)
5164C
5165C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
5166C              FROM THE ALPHA DISTRIBUTION
5167C              WITH SHAPE PARAMETER ALPHA.
5168C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
5169C                                OF RANDOM NUMBERS TO BE
5170C                                GENERATED.
5171C                     --ALPHA  = THE SINGLE PRECISION VALUE OF THE
5172C                                FIRST SHAPE PARAMETER.
5173C                                ALPHA SHOULD BE POSITIVE.
5174C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
5175C                                (OF DIMENSION AT LEAST N)
5176C                                INTO WHICH THE GENERATED
5177C                                RANDOM SAMPLE WILL BE PLACED.
5178C     OUTPUT--A RANDOM SAMPLE OF SIZE N
5179C             FROM THE ALPHA DISTRIBUTION
5180C             WITH SHAPE PARAMETER ALPHA.
5181C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
5182C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
5183C                   OF N FOR THIS SUBROUTINE.
5184C                 --ALPHA SHOULD BE POSITIVE.
5185C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
5186C     FORTRAN LIBRARY SUBROUTINES NEEDED--ALPPPF.
5187C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
5188C     LANGUAGE--ANSI FORTRAN (1977)
5189C     WRITTEN BY--JAMES J. FILLIBEN
5190C                 STATISTICAL ENGINEERING DIVISION
5191C                 INFORMATION TECHNOLOGY LABORATORY
5192C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5193C                 GAITHERSBURG, MD 20899-8980
5194C                 PHONE--301-975-2855
5195C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5196C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5197C     LANGUAGE--ANSI FORTRAN (1977)
5198C     VERSION NUMBER--2001.10
5199C     ORIGINAL VERSION--OCTOBER   2001.
5200C     UPDATED         --NOVEMBER  2007. BETA IS REALLY A SCALE
5201C                                       PARAMETER.
5202C     UPDATED         --NOVEMBER  2007. CALL LIST TO ALPPPF
5203C
5204C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5205C
5206C---------------------------------------------------------------------
5207C
5208      DIMENSION X(*)
5209C
5210      DOUBLE PRECISION DTEMP
5211C
5212C---------------------------------------------------------------------
5213C
5214      INCLUDE 'DPCOP2.INC'
5215C
5216C-----START POINT-----------------------------------------------------
5217C
5218C     CHECK THE INPUT ARGUMENTS FOR ERRORS
5219C
5220      IF(N.LT.1)THEN
5221        WRITE(ICOUT, 5)
5222        CALL DPWRST('XXX','BUG ')
5223        WRITE(ICOUT,46)N
5224        CALL DPWRST('XXX','BUG ')
5225        GOTO9000
5226      ENDIF
5227    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ALPHA RANDOM ',
5228     1       'NUMBERS IS NON-POSITIVE.')
5229   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
5230C
5231      IF(ALPHA.LE.0.0)THEN
5232        WRITE(ICOUT,14)
5233        CALL DPWRST('XXX','BUG ')
5234        WRITE(ICOUT,47)ALPHA
5235        CALL DPWRST('XXX','BUG ')
5236        GOTO9000
5237      ENDIF
5238   14 FORMAT('***** ERROR--THE VALUE OF THE ALPHA SHAPE ',
5239     1       'PARAMETER IS NON-POSITIVE.')
5240   47 FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
5241C
5242C
5243C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
5244C
5245      CALL UNIRAN(N,ISEED,X)
5246C
5247C     GENERATE N ALPHA DISTRIBUTION RANDOM NUMBERS
5248C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
5249C
5250      DO100I=1,N
5251        CALL ALPPPF(DBLE(X(I)),DBLE(ALPHA),DTEMP)
5252        X(I)=REAL(DTEMP)
5253  100 CONTINUE
5254C
5255 9000 CONTINUE
5256      RETURN
5257      END
5258      SUBROUTINE ANDYK (NTOT, NBCH, XPS, XPSU,
5259     $           IPBCH, NTIE, ISIZE, WK3, IWK2, ADKSTA)
5260      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
5261      DIMENSION XPS(*), XPSU(*), NTIE(*),
5262     $          ISIZE(*), WK3(*),   IWK2(*),
5263     $          IPBCH(*)
5264C
5265C       NTOT  -- TOTAL NUMBER OF DATA VALUES (INPUT)
5266C       NBCH  -- NUMBER OF BATCHES (INPUT)
5267C       XPS   -- DATA, POOLED AND SORTED (INPUT)
5268C       XPSU  -- UNIQUE VALUES OF XPS (OUTPUT)
5269C       IPBCH -- BATCH NUMBERS FOR XPS (INPUT)
5270C       NTIE  -- NUMBER OF TIES AT EACH VALUE OF XPSU (OUTPUT)
5271C       ISIZE -- BATCH SIZES (INPUT)
5272C       WK3, IWK2  -- SCRATCH WORK ARRAYS
5273C       ADKSTA  -- K-SAMPLE A-D STATISTIC (OUTPUT)
5274C
5275C         K-SAMPLE ANDERSON-DARLING TEST --
5276C            INCLUDING CORRECTION FOR TIES.
5277C
5278      ADKSTA = 0.D0
5279      DO 10 K=1, NBCH
5280         CALL ANDY2 (K, ADVAL,
5281     $           NTOT, NBCH, XPS, XPSU, IPBCH, NTIE,
5282     $           ISIZE, WK3, IWK2)
5283      ADKSTA = ADKSTA +ADVAL
528410    CONTINUE
5285C
5286      ADKSTA = ADKSTA *(NTOT -1.D0) /(NTOT *(NBCH -1.D0))
5287      RETURN
5288      END
5289      SUBROUTINE ANDY2  (K, ADVAL,
5290     $           NTOT, NBCH, XPS, XPSU, IPBCH,
5291     $           NTIE, ISIZE, WK3, IWK2)
5292      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
5293      DIMENSION XPS(NTOT),   XPSU(NTOT), IPBCH(NTOT),
5294     $          NTIE(NTOT),  ISIZE(NBCH), WK3(NTOT),
5295     $          IWK2(NTOT)
5296C
5297C      -- DETERMINE THE UNIQUE VALUES, NUMBER OF TIES AND
5298C         NUMBER OF TIES IN KTH BATCH.
5299      DO 10 I=1, NTOT
5300         XPSU (I) = XPS (I)
5301         NTIE (I) = 1
5302         IF (IPBCH (I) .EQ. K) THEN
5303            IWK2  (I) = 1
5304         ELSE
5305            IWK2  (I) = 0
5306         END IF
530710    CONTINUE
5308C
5309      I    = 2
5310      NDIS = NTOT
5311C     DO WHILE (I .LE. NDIS)
531211    CONTINUE
5313      IF (I .GT. NDIS) GO TO 12
5314         IF (XPSU (I) .EQ. XPSU (I-1)) THEN
5315            NTIE  (I-1) = NTIE  (I-1) + NTIE  (I)
5316            IWK2  (I-1) = IWK2  (I-1) + IWK2  (I)
5317            NDIS        = NDIS -1
5318            DO 20 J=I, NDIS
5319               XPSU  (J) = XPSU  (J+1)
5320               NTIE  (J) = NTIE  (J+1)
5321               IWK2  (J) = IWK2  (J+1)
532220         CONTINUE
5323         ELSE
5324            I = I +1
5325         END IF
5326      GO TO 11
532712    CONTINUE
5328C     END DO
5329C
5330C      -- DETERMINE THE FIJ.
5331      XOLD = 0.0D0
5332      IOLD = 0
5333      DO 30 I=1, NDIS
5334         WK3 (I) = XOLD  +.5D0 *(IWK2 (I)  +IOLD)
5335         XOLD    = WK3 (I)
5336         IOLD    = IWK2 (I)
533730    CONTINUE
5338C
5339C     -- CALCULATE THE ANDERSON-DARLING STATISTIC
5340      ADVAL = 0.D0
5341      NSUM  = 0
5342      DO 50 I=1, NDIS
5343         FIJ   = WK3 (I)
5344         HJ    = NSUM    + .5D0 *NTIE  (I)
5345         NSUM  = NSUM    +       NTIE (I)
5346         ADVAL = ADVAL   + NTIE (I) *(NTOT*FIJ -ISIZE(K)*HJ) **2
5347     $                  /(HJ *(NTOT-HJ) -.25D0 *NTOT*NTIE(I))
534850    CONTINUE
5349      ADVAL = ADVAL / (ISIZE (K) *NTOT)
5350      RETURN
5351      END
5352      SUBROUTINE ANGCDF(X,CDF)
5353C
5354C     NOTE--ANGLIT CDF IS:
5355C              ANGCDF(X) = [SIN(X + PI/4)]**2  -PI/4 <= X <= PI/4
5356C     WRITTEN BY--JAMES J. FILLIBEN
5357C                 STATISTICAL ENGINEERING DIVISION
5358C                 INFORMATION TECHNOLOGY LABORATORY
5359C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5360C                 GAITHERSBURG, MD 20899-8980
5361C                 PHONE--301-975-2855
5362C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5363C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5364C     LANGUAGE--ANSI FORTRAN (1977)
5365C     VERSION NUMBER--95/9
5366C     ORIGINAL VERSION--SEPTEMBER 1995.
5367C
5368C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5369C
5370C
5371      INCLUDE 'DPCOP2.INC'
5372C
5373      DATA PI/3.1415926535898E0/
5374C
5375C-----START POINT-----------------------------------------------------
5376C
5377      CDF=0.0
5378      IF(X.LT.-PI/4.0)THEN
5379        CDF=0.0
5380      ELSEIF(X.GT.PI/4.0)THEN
5381        CDF=1.0
5382      ELSE
5383        CDF=SIN(X+PI/4.0)*SIN(X+PI/4)
5384      ENDIF
5385C
5386      RETURN
5387      END
5388      SUBROUTINE ANGPDF(X,PDF)
5389C
5390C     NOTE--ANGLIT PDF IS:
5391C              ANGPDF(X) = SIN(2X + PI/2)  -PI/4 <= X <= PI/4
5392C     WRITTEN BY--JAMES J. FILLIBEN
5393C                 STATISTICAL ENGINEERING DIVISION
5394C                 INFORMATION TECHNOLOGY LABORATORY
5395C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5396C                 GAITHERSBURG, MD 20899-8980
5397C                 PHONE--301-975-2855
5398C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5399C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5400C     LANGUAGE--ANSI FORTRAN (1977)
5401C     VERSION NUMBER--95/9
5402C     ORIGINAL VERSION--SEPTEMBER 1995.
5403C
5404C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5405C
5406C
5407      INCLUDE 'DPCOP2.INC'
5408C
5409      DATA PI/3.1415926535898E0/
5410C
5411C-----START POINT-----------------------------------------------------
5412C
5413      PDF=0.0
5414      IF(X.LT.-PI/4.0 .OR. X.GT.PI/4.0)THEN
5415        WRITE(ICOUT,301)
5416        CALL DPWRST('XXX','BUG ')
5417        WRITE(ICOUT,302)X
5418        CALL DPWRST('XXX','BUG ')
5419        GOTO9999
5420      ENDIF
5421  301 FORMAT('***** FATAL DIAGNOSTIC--THE INPUT ARGUMENT IS NOT IN
5422     1       THE INTERVAL (-PI/4,PI/4).')
5423  302 FORMAT('      IT HAS THE VALUE ',E15.7)
5424C
5425      PDF=SIN(2*X+PI/2.0)
5426C
5427 9999 CONTINUE
5428      RETURN
5429      END
5430      SUBROUTINE ANGPPF(P,PPF)
5431C
5432C     NOTE--ALGORITHM ADDED SEPTEMBER 1995
5433C           G(P) = ARCSIN(SQRT(P))-PI/4
5434C     WRITTEN BY--JAMES J. FILLIBEN
5435C                 STATISTICAL ENGINEERING DIVISION
5436C                 INFORMATION TECHNOLOGY LABORATORY
5437C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5438C                 GAITHERSBURG, MD 20899-8980
5439C                 PHONE--301-975-2855
5440C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5441C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5442C     LANGUAGE--ANSI FORTRAN (1977)
5443C     VERSION NUMBER--95/9
5444C     ORIGINAL VERSION--SEPTEMBER 1995.
5445C
5446C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5447C
5448      INCLUDE 'DPCOP2.INC'
5449C
5450      DATA PI/3.1415926535898E0/
5451C
5452C-----START POINT-----------------------------------------------------
5453C
5454C     CHECK THE INPUT ARGUMENTS FOR ERRORS
5455C
5456      PPF=0.0
5457      IF(P.LT.0.0.OR.P.GT.1.0)THEN
5458        WRITE(ICOUT,1)
5459    1   FORMAT('***** ERROR--THE FIRST ARGUMENT TO ANGPPF ',
5460     1         'IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
5461        CALL DPWRST('XXX','BUG ')
5462        WRITE(ICOUT,46)P
5463   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
5464        CALL DPWRST('XXX','BUG ')
5465        GOTO9000
5466      ENDIF
5467C
5468      PPF=ASIN(SQRT(P))-PI/4.0
5469C
5470 9000 CONTINUE
5471      RETURN
5472      END
5473      FUNCTION ANGRAD (X1,Y1,X2,Y2,X3,Y3,IBUGA3)
5474C
5475C     PURPOSE--RETURNS THE ANGLE SWEPT OUT BETEEN TWO RAYS
5476C              IN 2D.
5477C     WRITTEN BY--ALAN HECKERT
5478C                 STATISTICAL ENGINEERING DIVISION
5479C                 INFORMATION TECHNOLOGY LABORATORY
5480C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5481C                 GAITHERSBURG, MD 20899-8980
5482C                 PHONE--301-975-2899
5483C     NOTE--THIS USES THE CODE FROM JOHN BURKARDT "geometry.f90"
5484C           LIBRARY.  WE CODE IT IN FORTRAN 77, BUT MAKE NO
5485C           SUBSTANTIVE CHANGES OTHERWISE.
5486C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5487C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5488C     LANGUAGE--ANSI FORTRAN (1977)
5489C     VERSION NUMBER--2012.10
5490C     ORIGINAL VERSION--OCTOBER   2012.
5491C
5492C-----NON-COMMON VARIABLES (GRAPHICS)-------------------------------------
5493C
5494      CHARACTER*4 IBUGA3
5495C
5496      REAL X1
5497      REAL Y1
5498      REAL X2
5499      REAL Y2
5500      REAL X3
5501      REAL Y3
5502      REAL X
5503      REAL Y
5504      REAL PI
5505C
5506C-----COMMON VARIABLES (GENERAL)--------------------------------------
5507C
5508      INCLUDE 'DPCOP2.INC'
5509C
5510      DATA PI/3.14159265358979/
5511C
5512C-----START POINT-----------------------------------------------------
5513C
5514      IF(IBUGA3.EQ.'ON')THEN
5515        WRITE(ICOUT,51)
5516   51   FORMAT('AT THE BEGININNING OF ANGRAD')
5517        CALL DPWRST('XXX','BUG ')
5518        WRITE(ICOUT,53)X1,Y1,X2,Y2,X3,Y3
5519   53   FORMAT('X1,Y1,X2,Y2,X3,Y3 = ',6G15.7)
5520        CALL DPWRST('XXX','BUG ')
5521      ENDIF
5522C
5523      X=(X1 - X2)*(X3 - X2) + (Y1 - Y2)*(Y3 - Y2)
5524      Y=(X1 - X2)*(Y3 - Y2) - (Y1 - Y2)*(X3 - X2)
5525C
5526      IF(X.EQ.0.0 .AND. Y.EQ.0.0)THEN
5527        ANGRAD = 0.0
5528      ELSE
5529         ANGRAD = ATAN2(Y,X)
5530         IF(ANGRAD .LT. 0.0)THEN
5531           ANGRAD = ANGRAD + 2.0*PI
5532         ENDIF
5533      ENDIF
5534C
5535C     WE WANT THE ANGLE BETWEEN 0 AND PI
5536C
5537      IF(IBUGA3.EQ.'ON')THEN
5538        WRITE(ICOUT,9051)
5539 9051   FORMAT('AT THE END OF ANGRAD')
5540        CALL DPWRST('XXX','BUG ')
5541        WRITE(ICOUT,9053)X,Y,ANGRAD
5542 9053   FORMAT('X,Y,ANGRAD = ',3G15.7)
5543        CALL DPWRST('XXX','BUG ')
5544      ENDIF
5545C
5546      RETURN
5547      END
5548      SUBROUTINE ANGRAN(N,ISEED,X)
5549C
5550C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
5551C              FROM THE ANGLIT DISTRIBUTION
5552C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
5553C                                OF RANDOM NUMBERS TO BE
5554C                                GENERATED.
5555C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
5556C                                (OF DIMENSION AT LEAST N)
5557C                                INTO WHICH THE GENERATED
5558C                                RANDOM SAMPLE WILL BE PLACED.
5559C     OUTPUT--A RANDOM SAMPLE OF SIZE N
5560C             FROM THE ANGLIT DISTRIBUTION
5561C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
5562C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
5563C                   OF N FOR THIS SUBROUTINE.
5564C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
5565C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
5566C     LANGUAGE--ANSI FORTRAN (1977)
5567C     WRITTEN BY--JAMES J. FILLIBEN
5568C                 STATISTICAL ENGINEERING DIVISION
5569C                 INFORMATION TECHNOLOGY LABORATORY
5570C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
5571C                 GAITHERSBURG, MD 20899-8980
5572C                 PHONE--301-975-2855
5573C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
5574C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
5575C     LANGUAGE--ANSI FORTRAN (1977)
5576C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
5577C                          DENOTED BY QUOTES RATHER THAN NH.
5578C     VERSION NUMBER--2001/10
5579C     ORIGINAL VERSION--OCTOBER   2001.
5580C
5581C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
5582C
5583C---------------------------------------------------------------------
5584C
5585      DIMENSION X(*)
5586C
5587C---------------------------------------------------------------------
5588C
5589      INCLUDE 'DPCOP2.INC'
5590C
5591C-----START POINT-----------------------------------------------------
5592C
5593C     CHECK THE INPUT ARGUMENTS FOR ERRORS
5594C
5595      IF(N.LT.1)GOTO50
5596      GOTO90
5597   50 WRITE(ICOUT, 5)
5598      CALL DPWRST('XXX','BUG ')
5599      WRITE(ICOUT,47)N
5600      CALL DPWRST('XXX','BUG ')
5601      RETURN
5602   90 CONTINUE
5603    5 FORMAT('***** FATAL ERROR--THE 1ST INPUT ARGUMENT TO THE ',
5604     1'ANGRAN SUBROUTINE IS NON-POSITIVE *****')
5605   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
5606C
5607C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
5608C
5609      CALL UNIRAN(N,ISEED,X)
5610C
5611C     GENERATE N ANGLIT RANDOM NUMBERS
5612C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
5613C
5614      DO100I=1,N
5615      CALL ANGPPF(X(I),XTEMP)
5616      X(I)=XTEMP
5617  100 CONTINUE
5618C
5619      RETURN
5620      END
5621      DOUBLE PRECISION FUNCTION ANORM(ARG)
5622CS    REAL FUNCTION ANORM(ARG)
5623C------------------------------------------------------------------
5624C
5625C This function evaluates the normal distribution function:
5626C
5627C                              / x
5628C                     1       |       -t*t/2
5629C          P(x) = ----------- |      e       dt
5630C                 sqrt(2 pi)  |
5631C                             /-oo
5632C
5633C   The main computation evaluates near-minimax approximations
5634C   derived from those in "Rational Chebyshev approximations for
5635C   the error function" by W. J. Cody, Math. Comp., 1969, 631-637.
5636C   This transportable program uses rational functions that
5637C   theoretically approximate the normal distribution function to
5638C   at least 18 significant decimal digits.  The accuracy achieved
5639C   depends on the arithmetic system, the compiler, the intrinsic
5640C   functions, and proper selection of the machine-dependent
5641C   constants.
5642C
5643C*******************************************************************
5644C*******************************************************************
5645C
5646C Explanation of machine-dependent constants.  Let
5647C
5648C   XMIN  = the smallest positive floating-point number.
5649C
5650C Then the following machine-dependent constants must be declared
5651C   in DATA statements.  IEEE values are provided as a default.
5652C
5653C   EPS   = argument below which anorm(x) may be represented by
5654C           0.5  and above which  x*x  will not underflow.
5655C           A conservative value is the largest machine number X
5656C           such that   1.0 + X = 1.0   to machine precision.
5657C   XLOW  = the most negative argument for which ANORM does not
5658C           vanish.  This is the negative of the solution to
5659C                    W(x) * (1-1/x**2) = XMIN,
5660C           where W(x) = exp(-x*x/2)/[x*sqrt(2*pi)].
5661C   XUPPR = positive argument beyond which anorm = 1.0.  A
5662C           conservative value is the solution to the equation
5663C                    exp(-x*x/2) = EPS,
5664C           i.e., XUPPR = sqrt[-2 ln(eps)].
5665C
5666C   Approximate values for some important machines are:
5667C
5668C                          XMIN        EPS        XLOW    XUPPR
5669C
5670C  CDC 7600      (S.P.)  3.13E-294   7.11E-15   -36.641   8.072
5671C  CRAY-1        (S.P.)  4.58E-246   7.11E-157 -106.521  26.816
5672C  IEEE (IBM/XT,
5673C    SUN, etc.)  (S.P.)  1.18E-38    5.96E-8    -12.949   5.768
5674C  IEEE (IBM/XT,
5675C    SUN, etc.)  (D.P.)  2.23D-308   1.11D-16   -37.519   8.572
5676C  IBM 195       (D.P.)  5.40D-79    1.39D-17   -18.781   8.811
5677C  VAX D-Format  (D.P.)  2.94D-39    1.39D-17   -13.055   8.811
5678C  VAX G-Format  (D.P.)  5.56D-309   1.11D-16   -37.556   8.572
5679C
5680C*******************************************************************
5681C*******************************************************************
5682C
5683C Error returns
5684C
5685C  The program returns  ANORM = 0     for  ARG .LE. XLOW.
5686C
5687C
5688C Intrinsic functions required are:
5689C
5690C     ABS, AINT, EXP
5691C
5692C
5693C  Author: W. J. Cody
5694C          Mathematics and Computer Science Division
5695C          Argonne National Laboratory
5696C          Argonne, IL 60439
5697C
5698C  Latest modification: March 15, 1992
5699C
5700C------------------------------------------------------------------
5701      INTEGER I
5702CS    REAL
5703      DOUBLE PRECISION
5704     1     A,ARG,B,C,D,DEL,EPS,HALF,P,ONE,Q,RESULT,SIXTEN,
5705     2     SQRPI,THRSH,ROOT32,X,XLOW,XDEN,XNUM,Y,XSQ,XUPPR,ZERO
5706      DIMENSION A(5),B(4),C(9),D(8),P(6),Q(5)
5707C------------------------------------------------------------------
5708C  Mathematical constants
5709C
5710C  SQRPI = 1 / sqrt(2*pi), ROOT32 = sqrt(32), and
5711C  THRSH is the argument for which anorm = 0.75.
5712C------------------------------------------------------------------
5713CS    DATA ONE,HALF,ZERO,SIXTEN/1.0E0,0.5E0,0.0E0,1.60E1/,
5714CS   1     SQRPI/3.9894228040143267794E-1/,THRSH/0.66291E0/,
5715CS   2     ROOT32/5.656854248E0/
5716      DATA ONE,HALF,ZERO,SIXTEN/1.0D0,0.5D0,0.0D0,1.60D1/,
5717     1     SQRPI/3.9894228040143267794D-1/,THRSH/0.67441D0/,
5718CCCCC1     SQRPI/3.9894228040143267794D-1/,THRSH/0.66291D0/,
5719     2     ROOT32/5.656854248D0/
5720C------------------------------------------------------------------
5721C  Machine-dependent constants
5722C------------------------------------------------------------------
5723CS    DATA EPS/5.96E-8/,XLOW/-12.949E0/,XUPPR/5.768E0/
5724      DATA EPS/1.11D-16/,XLOW/-37.519D0/,XUPPR/8.572D0/
5725C------------------------------------------------------------------
5726C  Coefficients for approximation in first interval
5727C------------------------------------------------------------------
5728CS    DATA A/2.2352520354606839287E00,1.6102823106855587881E02,
5729CS   1       1.0676894854603709582E03,1.8154981253343561249E04,
5730CS   2       6.5682337918207449113E-2/
5731CS    DATA B/4.7202581904688241870E01,9.7609855173777669322E02,
5732CS   1       1.0260932208618978205E04,4.5507789335026729956E04/
5733      DATA A/2.2352520354606839287D00,1.6102823106855587881D02,
5734     1       1.0676894854603709582D03,1.8154981253343561249D04,
5735     2       6.5682337918207449113D-2/
5736      DATA B/4.7202581904688241870D01,9.7609855173777669322D02,
5737     1       1.0260932208618978205D04,4.5507789335026729956D04/
5738C------------------------------------------------------------------
5739C  Coefficients for approximation in second interval
5740C------------------------------------------------------------------
5741CS    DATA C/3.9894151208813466764E-1,8.8831497943883759412E00,
5742CS   1       9.3506656132177855979E01,5.9727027639480026226E02,
5743CS   2       2.4945375852903726711E03,6.8481904505362823326E03,
5744CS   3       1.1602651437647350124E04,9.8427148383839780218E03,
5745CS   4       1.0765576773720192317E-8/
5746CS    DATA D/2.2266688044328115691E01,2.3538790178262499861E02,
5747CS   1       1.5193775994075548050E03,6.4855582982667607550E03,
5748CS   2       1.8615571640885098091E04,3.4900952721145977266E04,
5749CS   3       3.8912003286093271411E04,1.9685429676859990727E04/
5750      DATA C/3.9894151208813466764D-1,8.8831497943883759412D00,
5751     1       9.3506656132177855979D01,5.9727027639480026226D02,
5752     2       2.4945375852903726711D03,6.8481904505362823326D03,
5753     3       1.1602651437647350124D04,9.8427148383839780218D03,
5754     4       1.0765576773720192317D-8/
5755      DATA D/2.2266688044328115691D01,2.3538790178262499861D02,
5756     1       1.5193775994075548050D03,6.4855582982667607550D03,
5757     2       1.8615571640885098091D04,3.4900952721145977266D04,
5758     3       3.8912003286093271411D04,1.9685429676859990727D04/
5759C------------------------------------------------------------------
5760C  Coefficients for approximation in third interval
5761C------------------------------------------------------------------
5762CS    DATA P/2.1589853405795699E-1,1.274011611602473639E-1,
5763CS   1       2.2235277870649807E-2,1.421619193227893466E-3,
5764CS   2       2.9112874951168792E-5,2.307344176494017303E-2/
5765CS    DATA Q/1.28426009614491121E00,4.68238212480865118E-1,
5766CS   1       6.59881378689285515E-2,3.78239633202758244E-3,
5767CS   2       7.29751555083966205E-5/
5768      DATA P/2.1589853405795699D-1,1.274011611602473639D-1,
5769     1       2.2235277870649807D-2,1.421619193227893466D-3,
5770     2       2.9112874951168792D-5,2.307344176494017303D-2/
5771      DATA Q/1.28426009614491121D00,4.68238212480865118D-1,
5772     1       6.59881378689285515D-2,3.78239633202758244D-3,
5773     2       7.29751555083966205D-5/
5774C------------------------------------------------------------------
5775      X = ARG
5776      Y = ABS(X)
5777      IF (Y .LE. THRSH) THEN
5778C------------------------------------------------------------------
5779C  Evaluate  anorm  for  |X| <= 0.66291
5780C                               0.6744 (= NORPPF(0.75)
5781C------------------------------------------------------------------
5782            XSQ = ZERO
5783            IF (Y .GT. EPS) XSQ = X * X
5784            XNUM = A(5)*XSQ
5785            XDEN = XSQ
5786            DO 20 I = 1, 3
5787               XNUM = (XNUM + A(I)) * XSQ
5788               XDEN = (XDEN + B(I)) * XSQ
5789   20       CONTINUE
5790            RESULT = X * (XNUM + A(4)) / (XDEN + B(4))
5791            RESULT = HALF + RESULT
5792C------------------------------------------------------------------
5793C  Evaluate  anorm  for 0.66291 <= |X| <= sqrt(32)
5794C------------------------------------------------------------------
5795         ELSE IF (Y .LE. ROOT32) THEN
5796            XNUM = C(9)*Y
5797            XDEN = Y
5798            DO 120 I = 1, 7
5799               XNUM = (XNUM + C(I)) * Y
5800               XDEN = (XDEN + D(I)) * Y
5801  120       CONTINUE
5802            RESULT = (XNUM + C(8)) / (XDEN + D(8))
5803            XSQ = AINT(Y*SIXTEN)/SIXTEN
5804            DEL = (Y-XSQ)*(Y+XSQ)
5805            RESULT = EXP(-XSQ*XSQ*HALF)*EXP(-DEL*HALF)*RESULT
5806            IF (X .GT. ZERO) RESULT = ONE - RESULT
5807C------------------------------------------------------------------
5808C  Evaluate  anorm  for |X| > sqrt(32)
5809C------------------------------------------------------------------
5810         ELSE
5811            RESULT = ZERO
5812            IF ((X .GE. XLOW) .AND. (X .LT. XUPPR)) THEN
5813               XSQ = ONE / (X * X)
5814               XNUM = P(6)*XSQ
5815               XDEN = XSQ
5816               DO 240 I = 1, 4
5817                  XNUM = (XNUM + P(I)) * XSQ
5818                  XDEN = (XDEN + Q(I)) * XSQ
5819  240          CONTINUE
5820               RESULT = XSQ *(XNUM + P(5)) / (XDEN + Q(5))
5821               RESULT = (SQRPI -  RESULT) / Y
5822               XSQ = AINT(X*SIXTEN)/SIXTEN
5823               DEL = (X-XSQ)*(X+XSQ)
5824               RESULT = EXP(-XSQ*XSQ*HALF)*EXP(-DEL*HALF)*RESULT
5825            END IF
5826            IF (X .GT. ZERO) RESULT = ONE - RESULT
5827      END IF
5828C------------------------------------------------------------------
5829C  Fix up for negative argument, erf, etc.
5830C------------------------------------------------------------------
5831      ANORM = RESULT
5832C---------- Last card of ANORM ----------
5833C
5834      RETURN
5835      END
5836      SUBROUTINE ARL2(DELTA, K, H, S0, ARL, ARLFIR, IFAULT)
5837C
5838C        ALGORITHM AS 258.1  APPL.STATIST. (1990), VOL.39, NO.3
5839C
5840C        Computes the average run length for a cumulative
5841C        sum control scheme
5842C
5843      REAL DELTA, K, H, S0, ARL, ARLFIR
5844      INTEGER IFAULT
5845      REAL ARLH, ARLHF, ARLL, ARLLF, BIGARL, BIGDEL
5846      INTEGER JFAULT
5847      DATA BIGARL / 1.E30 / , BIGDEL / 5.0 /
5848C
5849      IFAULT = 0
5850      IF (DELTA .LT. 0.0) THEN
5851         IFAULT = 1
5852      ELSE
5853C
5854C        Compute ARL's for upper tail.
5855C
5856         CALL ARL1(DELTA, K, H, S0, ARLH, ARLHF, IFAULT)
5857         IF (IFAULT .EQ. 0) THEN
5858C
5859C        If DELTA=0, then ARL's for lower tail are the same as for
5860C        the upper.
5861C
5862            IF (DELTA .EQ. 0.0) THEN
5863               ARLLF = ARLHF
5864               ARLL = ARLH
5865C
5866C        If DELTA is too large, skip the low-side ARL calculation.
5867C
5868            ELSE IF (DELTA .GT. BIGDEL) THEN
5869               ARLL = BIGARL
5870               ARLLF = BIGARL
5871            ELSE
5872C
5873C        Otherwise compute ARL's for lower tail.
5874C
5875               CALL ARL1(-DELTA, K, H, S0, ARLL, ARLLF, JFAULT)
5876C
5877C        Set lower ARL's large if negative JFAULT .GT. 0
5878C
5879               IF (ARLL .LE. ARLH .OR. ARLLF .LE. ARLHF .OR.
5880     *             ARLL .LT. ARLLF .OR. JFAULT .GT. 0) THEN
5881                  ARLL = BIGARL
5882                  ARLLF = BIGARL
5883               END IF
5884            END IF
5885C
5886C        Compute two-sided ARL for S0=0.0
5887C
5888            ARL = ARLH / (1.0 + ARLH / ARLL)
5889C
5890C        Compute two-sided ARL for specified value of S0.
5891C
5892            ARLFIR = ARLHF / (1.0 + ARLH / ARLL) +
5893     *               ARLH / (ARLH / ARLLF + ARLL / ARLLF) - ARL
5894C
5895C        Set IFAULT=3 if two-sided ARL's are lower bounds.
5896C
5897            IF (IFAULT .EQ. 0 .AND. S0 .GT. H / 2.0 + K) IFAULT = 3
5898         END IF
5899      END IF
5900      RETURN
5901      END
5902      SUBROUTINE ARL1(DELTA, K, H, S0, ARL, ARLFIR, IFAULT)
5903C
5904C        ALGORITHM AS 258.2  APPL.STATIST. (1990), VOL.39, NO.3
5905C
5906      REAL DELTA, K, H, S0, ARL, ARLFIR
5907      INTEGER IFAULT
5908      INTEGER N, N1, N2, I, J
5909      REAL XN
5910      DOUBLE PRECISION XCOND
5911      PARAMETER (N=12, N1=N + 1, N2=N + 2, XN=N, XCOND=100.D0)
5912      INTEGER IPVT(N1)
5913CCCCC REAL P1, P2
5914      DOUBLE PRECISION ALNORM
5915      DOUBLE PRECISION A(N1, N1), B(N1), R(N1), W(N2),
5916     *                 C, E1, E2, RCOND, S, T
5917      EXTERNAL ALNORM
5918C
5919C        N is the degree of the polynomial approximation.
5920C        XCOND defines the criterion for singularity:
5921C              XCOND+RCOND .LE. XCOND,
5922C        where RCOND is the reciprocal of the condition number.
5923C
5924      IFAULT = 0
5925      IF (K .LT. 0.0 .OR. H .LT. 0.0 .OR. S0 .LT. 0.0 .OR.
5926     *    S0 .GT. H) THEN
5927         IFAULT = 1
5928      ELSE IF (H .EQ. 0.0) THEN
5929         AK=REAL(K)
5930         ARL = 1.0 / ALNORM(DBLE(DELTA - AK), .FALSE.)
5931         ARLFIR = ARL
5932      ELSE
5933C
5934C        Set C.
5935C
5936         C = MAX(0.0, K - DELTA)
5937C
5938C        For each point S at which the polynomial approximation is to be
5939C        evaluated...
5940C
5941         DO 40 I = 0, N
5942C
5943C        Compute S
5944C
5945            S = H * I / XN
5946C
5947C        Calculate necessary exponentials in S.
5948C
5949            E1 = EXP(C * S)
5950            E2 = EXP((S + DELTA - K) * C + C * C / 2.0)
5951C
5952C        Apply left-hand-side of integral equation.
5953C
5954            T = E1
5955            DO 10 J = 1, N + 1
5956               A(I + 1, J) = T
5957               T = T * S
5958   10       CONTINUE
5959C
5960C        Apply lower integration limit.
5961C
5962            CALL MOMENT(-S - DELTA - C + K, -S - DELTA - C + K, N, R, W)
5963            DO 20 J = 1, N + 1
5964               A(I + 1, J) = A(I + 1, J) - R(J) * E2
5965   20       CONTINUE
5966C
5967C        Apply upper integration limit.
5968C
5969            CALL MOMENT(H - S - DELTA - C + K, -S - DELTA - C + K, N, R,
5970     *                  W)
5971            DO 30 J = 1, N + 1
5972               A(I + 1, J) = A(I + 1, J) + R(J) * E2
5973   30       CONTINUE
5974C
5975C        Apply term '1 + L(0) F(-S-DELTA+K)'.
5976C
5977            AK=REAL(K)
5978            A(I + 1, 1) = A(I + 1, 1) - ALNORM(-S - DELTA + AK,
5979     *                    .FALSE.)
5980            B(I + 1) = 1.0
5981   40    CONTINUE
5982C
5983C        Normalize the simultaneous equations
5984C
5985         DO 70 I = 1, N + 1
5986            S = 0.0
5987            DO 50 J = 1, N + 1
5988               S = MAX(S, ABS(A(I, J)))
5989   50       CONTINUE
5990            B(I) = B(I) / S
5991            DO 60 J = 1, N + 1
5992               A(I, J) = A(I, J) / S
5993   60       CONTINUE
5994   70    CONTINUE
5995         DO 100 J = 1, N + 1
5996            W(J) = 0.0
5997            DO 80 I = 1, N + 1
5998               W(J) = MAX(W(J), ABS(A(I, J)))
5999   80       CONTINUE
6000            DO 90 I = 1, N + 1
6001               A(I, J) = A(I, J) / W(J)
6002   90       CONTINUE
6003  100    CONTINUE
6004C
6005C        Factor matrix A.  If equations are singular to working
6006C        precision, IFAULT=2.
6007C
6008C        ***************************************
6009C        SUBROUTINE DGECO(A,LDA,N,IPVT,RCOND,Z)
6010C        on entry:
6011C        A:     the matrix to be factored.
6012C        LDA:   the leading dimension of array A.
6013C        N:     the order of the matrix A.
6014C        on return:
6015C        A:     the lu factorization of A.
6016C        IPVT:  pivot indices.
6017C        RCOND: an estimate of the reciprocal condition of A.
6018C        Z:     a working vector.
6019C        ***************************************
6020C
6021         CALL DGECO(A, N + 1, N + 1, IPVT, RCOND, R)
6022         IF (XCOND + RCOND .EQ. XCOND) THEN
6023            IFAULT = 2
6024         ELSE
6025C
6026C        Solve for the polynomial coefficients
6027C
6028C        ***************************************
6029C        SUBROUTINE DGESL(A,LDA,N,IPVT,B,JOB)
6030C        on entry:
6031C        A:     the output from dgeco.
6032C        LDA:   the leading dimension of array A.
6033C        N:     the order of the matrix A.
6034C        IPVT:  the pivot vector from dgeco.
6035C        B:     the right hand side vector.
6036C        JOB:   = 0       to solve A*X=B.
6037C               = nonzero to solve trans(A)*X=B.
6038C        on return:
6039C        B:     the solution vector X.
6040C        ***************************************
6041C
6042            CALL DGESL(A, N + 1, N + 1, IPVT, B, 0)
6043C
6044C        Get ARL and ARLFIR.
6045C
6046            ARL = B(1) / W(1)
6047            ARLFIR = 0.0
6048            DO 110 I = 0, N
6049               ARLFIR = S0 * ARLFIR + B(N - I + 1) / W(N - I + 1)
6050  110       CONTINUE
6051            ARLFIR = ARLFIR * EXP(C * S0)
6052         END IF
6053      END IF
6054      RETURN
6055      END
6056      SUBROUTINE ARSCDF(X,CDF)
6057C
6058C     NOTE--ARCSIN CDF IS:
6059C              ARSCDF(X) = (2/PI)*ARCSIN(SQRT(X))  0 < X < 1
6060C     WRITTEN BY--ALAN HECKERT
6061C                 STATISTICAL ENGINEERING DIVISION
6062C                 INFORMATION TECHNOLOGY LABORATORY
6063C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6064C                 GAITHERSBURG, MD 20899-8980
6065C                 PHONE--301-975-2899
6066C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6067C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6068C     LANGUAGE--ANSI FORTRAN (1977)
6069C     VERSION NUMBER--95/9
6070C     ORIGINAL VERSION--SEPTEMBER 1995.
6071C
6072C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6073C
6074C
6075      INCLUDE 'DPCOP2.INC'
6076C
6077      DATA PI/3.1415926535898E0/
6078C
6079C-----START POINT-----------------------------------------------------
6080C
6081      CDF=0.0
6082      IF(X.LE.0.0)THEN
6083        CDF=0.0
6084      ELSEIF(X.GE.1.0)THEN
6085        CDF=1.0
6086      ELSE
6087        CDF=(2.0/PI)*ASIN(SQRT(X))
6088      ENDIF
6089C
6090      RETURN
6091      END
6092      SUBROUTINE ARSPDF(X,PDF)
6093C
6094C     NOTE--ARCSIN PDF IS:
6095C              ARSPDF(X) = (1/PI)*(1/SQRT(X*(1-x)))  0 < x < 1
6096C     WRITTEN BY--ALAN HECKERT
6097C                 STATISTICAL ENGINEERING DIVISION
6098C                 INFORMATION TECHNOLOGY LABORATORY
6099C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6100C                 GAITHERSBURG, MD 20899-8980
6101C                 PHONE--301-975-2899
6102C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6103C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6104C     LANGUAGE--ANSI FORTRAN (1977)
6105C     VERSION NUMBER--95/9
6106C     ORIGINAL VERSION--SEPTEMBER 1995.
6107C
6108C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6109C
6110      INCLUDE 'DPCOP2.INC'
6111C
6112      DATA PI/3.1415926535898E0/
6113C
6114C-----START POINT-----------------------------------------------------
6115C
6116      PDF=0.0
6117      IF(X.LE.0.0 .OR. X.GE.1.0)THEN
6118        WRITE(ICOUT,301)
6119        CALL DPWRST('XXX','BUG ')
6120        WRITE(ICOUT,302)X
6121        CALL DPWRST('XXX','BUG ')
6122        GOTO9999
6123      ENDIF
6124  301 FORMAT('***** ERROR--THE INPUT ARGUMENT TO ARSPDF IS NOT IN '
6125     1       'THE INTERVAL (0,1).')
6126  302 FORMAT('      IT HAS THE VALUE ',G15.7)
6127C
6128      PDF=1.0/(PI*SQRT(X*(1.0-X)))
6129C
6130 9999 CONTINUE
6131      RETURN
6132      END
6133      SUBROUTINE ARSPPF(P,PPF)
6134C
6135C     NOTE--ALGORITHM ADDED SEPTEMBER 1995
6136C           ARSPPF(P) = (SIN(PI*P/2))**2
6137C     WRITTEN BY--ALAN HECKERT
6138C                 STATISTICAL ENGINEERING DIVISION
6139C                 INFORMATION TECHNOLOGY LABORATORY
6140C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6141C                 GAITHERSBURG, MD 20899-8980
6142C                 PHONE--301-975-2899
6143C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6144C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6145C     LANGUAGE--ANSI FORTRAN (1977)
6146C     VERSION NUMBER--95/9
6147C     ORIGINAL VERSION--SEPTEMBER 1995.
6148C
6149C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6150C
6151      INCLUDE 'DPCOP2.INC'
6152C
6153      DATA PI/3.1415926535898E0/
6154C
6155C-----START POINT-----------------------------------------------------
6156C
6157C     CHECK THE INPUT ARGUMENTS FOR ERRORS
6158C
6159      IF(P.LT.0.0.OR.P.GT.1.0)THEN
6160        WRITE(ICOUT,1)
6161        CALL DPWRST('XXX','BUG ')
6162        WRITE(ICOUT,46)P
6163        CALL DPWRST('XXX','BUG ')
6164        PPF=0.0
6165        GOTO9000
6166      ENDIF
6167    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ARSPPF IS ',
6168     1       'OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
6169   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
6170C
6171      PPF=SIN(PI*P/2.0)*SIN(PI*P/2.0)
6172C
6173 9000 CONTINUE
6174      RETURN
6175      END
6176      SUBROUTINE ARSRAN(N,ISEED,X)
6177C
6178C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
6179C              FROM THE ARCSIN DISTRIBUTION
6180C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
6181C                                OF RANDOM NUMBERS TO BE
6182C                                GENERATED.
6183C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
6184C                                (OF DIMENSION AT LEAST N)
6185C                                INTO WHICH THE GENERATED
6186C                                RANDOM SAMPLE WILL BE PLACED.
6187C     OUTPUT--A RANDOM SAMPLE OF SIZE N
6188C             FROM THE ARCSIN DISTRIBUTION
6189C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
6190C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
6191C                   OF N FOR THIS SUBROUTINE.
6192C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
6193C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
6194C     LANGUAGE--ANSI FORTRAN (1977)
6195C     WRITTEN BY--ALAN HECKERT
6196C                 STATISTICAL ENGINEERING DIVISION
6197C                 INFORMATION TECHNOLOGY LABORATORY
6198C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
6199C                 GAITHERSBURG, MD 20899-8980
6200C                 PHONE--301-975-2899
6201C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
6202C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
6203C     LANGUAGE--ANSI FORTRAN (1977)
6204C     VERSION NUMBER--2001/10
6205C     ORIGINAL VERSION--OCTOBER   2001.
6206C
6207C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
6208C
6209C---------------------------------------------------------------------
6210C
6211      DIMENSION X(*)
6212C
6213C---------------------------------------------------------------------
6214C
6215      INCLUDE 'DPCOP2.INC'
6216C
6217C-----START POINT-----------------------------------------------------
6218C
6219C     CHECK THE INPUT ARGUMENTS FOR ERRORS
6220C
6221      IF(N.LT.1)THEN
6222        WRITE(ICOUT, 5)
6223        CALL DPWRST('XXX','BUG ')
6224        WRITE(ICOUT,47)N
6225        CALL DPWRST('XXX','BUG ')
6226        GOTO9000
6227      ENDIF
6228    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ARCSIN RANDOM ',
6229     1       'NUMBERS IS NON-POSITIVE.')
6230   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
6231C
6232C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
6233C
6234      CALL UNIRAN(N,ISEED,X)
6235C
6236C     GENERATE N ARCSIN RANDOM NUMBERS
6237C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
6238C
6239      DO100I=1,N
6240      CALL ARSPPF(X(I),XTEMP)
6241      X(I)=XTEMP
6242  100 CONTINUE
6243C
6244 9000 CONTINUE
6245      RETURN
6246      END
6247      DOUBLE PRECISION FUNCTION apser(a,b,x,eps)
6248C-----------------------------------------------------------------------
6249C     APSER YIELDS THE INCOMPLETE BETA RATIO I(SUB(1-X))(B,A) FOR
6250C     A .LE. MIN(EPS,EPS*B), B*X .LE. 1, AND X .LE. 0.5. USED WHEN
6251C     A IS VERY SMALL. USE ONLY IF ABOVE INEQUALITIES ARE SATISFIED.
6252C-----------------------------------------------------------------------
6253C     .. Scalar Arguments ..
6254      DOUBLE PRECISION a,b,eps,x
6255C     ..
6256C     .. Local Scalars ..
6257      DOUBLE PRECISION aj,bx,c,g,j,s,t,tol
6258C     ..
6259C     .. External Functions ..
6260      DOUBLE PRECISION psi
6261      EXTERNAL psi
6262C     ..
6263C     .. Intrinsic Functions ..
6264      INTRINSIC abs,dlog
6265C     ..
6266C     .. Data statements ..
6267C--------------------
6268      DATA g/.577215664901533D0/
6269C     ..
6270C     .. Executable Statements ..
6271C--------------------
6272      bx = b*x
6273      t = x - bx
6274      IF (b*eps.GT.2.D-2) GO TO 10
6275      c = dlog(x) + psi(b) + g + t
6276      GO TO 20
6277
6278   10 c = dlog(bx) + g + t
6279C
6280   20 tol = 5.0D0*eps*abs(c)
6281      j = 1.0D0
6282      s = 0.0D0
6283   30 j = j + 1.0D0
6284      t = t* (x-bx/j)
6285      aj = t/j
6286      s = s + aj
6287      IF (abs(aj).GT.tol) GO TO 30
6288C
6289      apser = -a* (c+s)
6290      RETURN
6291
6292      END
6293      SUBROUTINE ASYIK (X, FNU, KODE, FLGIK, RA, ARG, IN, Y)
6294C***BEGIN PROLOGUE  ASYIK
6295C***SUBSIDIARY
6296C***PURPOSE  Subsidiary to BESI and BESK
6297C***LIBRARY   SLATEC
6298C***TYPE      SINGLE PRECISION (ASYIK-S, DASYIK-D)
6299C***AUTHOR  Amos, D. E., (SNLA)
6300C***DESCRIPTION
6301C
6302C                    ASYIK computes Bessel functions I and K
6303C                  for arguments X.GT.0.0 and orders FNU.GE.35
6304C                  on FLGIK = 1 and FLGIK = -1 respectively.
6305C
6306C                                    INPUT
6307C
6308C      X    - argument, X.GT.0.0E0
6309C      FNU  - order of first Bessel function
6310C      KODE - a parameter to indicate the scaling option
6311C             KODE=1 returns Y(I)=        I/SUB(FNU+I-1)/(X), I=1,IN
6312C                    or      Y(I)=        K/SUB(FNU+I-1)/(X), I=1,IN
6313C                    on FLGIK = 1.0E0 or FLGIK = -1.0E0
6314C             KODE=2 returns Y(I)=EXP(-X)*I/SUB(FNU+I-1)/(X), I=1,IN
6315C                    or      Y(I)=EXP( X)*K/SUB(FNU+I-1)/(X), I=1,IN
6316C                    on FLGIK = 1.0E0 or FLGIK = -1.0E0
6317C     FLGIK - selection parameter for I or K function
6318C             FLGIK =  1.0E0 gives the I function
6319C             FLGIK = -1.0E0 gives the K function
6320C        RA - SQRT(1.+Z*Z), Z=X/FNU
6321C       ARG - argument of the leading exponential
6322C        IN - number of functions desired, IN=1 or 2
6323C
6324C                                    OUTPUT
6325C
6326C         Y - a vector whose first in components contain the sequence
6327C
6328C     Abstract
6329C         ASYIK implements the uniform asymptotic expansion of
6330C         the I and K Bessel functions for FNU.GE.35 and real
6331C         X.GT.0.0E0. The forms are identical except for a change
6332C         in sign of some of the terms. This change in sign is
6333C         accomplished by means of the flag FLGIK = 1 or -1.
6334C
6335C***SEE ALSO  BESI, BESK
6336C***ROUTINES CALLED  R1MACH
6337C***REVISION HISTORY  (YYMMDD)
6338C   750101  DATE WRITTEN
6339C   890531  Changed all specific intrinsics to generic.  (WRB)
6340C   891214  Prologue converted to Version 4.0 format.  (BAB)
6341C   900328  Added TYPE section.  (WRB)
6342C   910408  Updated the AUTHOR section.  (WRB)
6343C***END PROLOGUE  ASYIK
6344C
6345C-----COMMON----------------------------------------------------------
6346C
6347      INCLUDE 'DPCOMC.INC'
6348      INCLUDE 'DPCOP2.INC'
6349C
6350C
6351      INTEGER IN, J, JN, K, KK, KODE, L
6352      REAL AK,AP,ARG,C, COEF,CON,ETX,FLGIK,FN, FNU,GLN,RA,S1,S2,
6353     1 T, TOL, T2, X, Y, Z
6354      DIMENSION Y(*), C(65), CON(2)
6355      SAVE CON, C
6356      DATA CON(1), CON(2)  /
6357     1        3.98942280401432678E-01,    1.25331413731550025E+00/
6358      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
6359     1     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
6360     2     C(19), C(20), C(21), C(22), C(23), C(24)/
6361     3       -2.08333333333333E-01,        1.25000000000000E-01,
6362     4        3.34201388888889E-01,       -4.01041666666667E-01,
6363     5        7.03125000000000E-02,       -1.02581259645062E+00,
6364     6        1.84646267361111E+00,       -8.91210937500000E-01,
6365     7        7.32421875000000E-02,        4.66958442342625E+00,
6366     8       -1.12070026162230E+01,        8.78912353515625E+00,
6367     9       -2.36408691406250E+00,        1.12152099609375E-01,
6368     1       -2.82120725582002E+01,        8.46362176746007E+01,
6369     2       -9.18182415432400E+01,        4.25349987453885E+01,
6370     3       -7.36879435947963E+00,        2.27108001708984E-01,
6371     4        2.12570130039217E+02,       -7.65252468141182E+02,
6372     5        1.05999045252800E+03,       -6.99579627376133E+02/
6373      DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
6374     1     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
6375     2     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
6376     3        2.18190511744212E+02,       -2.64914304869516E+01,
6377     4        5.72501420974731E-01,       -1.91945766231841E+03,
6378     5        8.06172218173731E+03,       -1.35865500064341E+04,
6379     6        1.16553933368645E+04,       -5.30564697861340E+03,
6380     7        1.20090291321635E+03,       -1.08090919788395E+02,
6381     8        1.72772750258446E+00,        2.02042913309661E+04,
6382     9       -9.69805983886375E+04,        1.92547001232532E+05,
6383     1       -2.03400177280416E+05,        1.22200464983017E+05,
6384     2       -4.11926549688976E+04,        7.10951430248936E+03,
6385     3       -4.93915304773088E+02,        6.07404200127348E+00,
6386     4       -2.42919187900551E+05,        1.31176361466298E+06,
6387     5       -2.99801591853811E+06,        3.76327129765640E+06/
6388      DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
6389     1     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
6390     2     C(65)/
6391     3       -2.81356322658653E+06,        1.26836527332162E+06,
6392     4       -3.31645172484564E+05,        4.52187689813627E+04,
6393     5       -2.49983048181121E+03,        2.43805296995561E+01,
6394     6        3.28446985307204E+06,       -1.97068191184322E+07,
6395     7        5.09526024926646E+07,       -7.41051482115327E+07,
6396     8        6.63445122747290E+07,       -3.75671766607634E+07,
6397     9        1.32887671664218E+07,       -2.78561812808645E+06,
6398     1        3.08186404612662E+05,       -1.38860897537170E+04,
6399     2        1.10017140269247E+02/
6400C***FIRST EXECUTABLE STATEMENT  ASYIK
6401      TOL = R1MACH(3)
6402      TOL = MAX(TOL,1.0E-15)
6403      FN = FNU
6404      Z  = (3.0E0-FLGIK)/2.0E0
6405      KK = INT(Z)
6406      DO 50 JN=1,IN
6407        IF (JN.EQ.1) GO TO 10
6408        FN = FN - FLGIK
6409        Z = X/FN
6410        RA = SQRT(1.0E0+Z*Z)
6411        GLN = LOG((1.0E0+RA)/Z)
6412        ETX = KODE - 1
6413        T = RA*(1.0E0-ETX) + ETX/(Z+RA)
6414        ARG = FN*(T-GLN)*FLGIK
6415   10   COEF = EXP(ARG)
6416        T = 1.0E0/RA
6417        T2 = T*T
6418        T = T/FN
6419        T = SIGN(T,FLGIK)
6420        S2 = 1.0E0
6421        AP = 1.0E0
6422        L = 0
6423        DO 30 K=2,11
6424          L = L + 1
6425          S1 = C(L)
6426          DO 20 J=2,K
6427            L = L + 1
6428            S1 = S1*T2 + C(L)
6429   20     CONTINUE
6430          AP = AP*T
6431          AK = AP*S1
6432          S2 = S2 + AK
6433          IF (MAX(ABS(AK),ABS(AP)) .LT. TOL) GO TO 40
6434   30   CONTINUE
6435   40   CONTINUE
6436      T = ABS(T)
6437      Y(JN) = S2*COEF*SQRT(T)*CON(KK)
6438   50 CONTINUE
6439      RETURN
6440      END
6441      SUBROUTINE ASYJY (FUNJY, X, FNU, FLGJY, IN, Y, WK, IFLW)
6442C***BEGIN PROLOGUE  ASYJY
6443C***SUBSIDIARY
6444C***PURPOSE  Subsidiary to BESJ and BESY
6445C***LIBRARY   SLATEC
6446C***TYPE      SINGLE PRECISION (ASYJY-S, DASYJY-D)
6447C***AUTHOR  Amos, D. E., (SNLA)
6448C***DESCRIPTION
6449C
6450C                 ASYJY computes Bessel functions J and Y
6451C               for arguments X.GT.0.0 and orders FNU.GE.35.0
6452C               on FLGJY = 1 and FLGJY = -1 respectively
6453C
6454C                                  INPUT
6455C
6456C      FUNJY - external function JAIRY or YAIRY
6457C          X - argument, X.GT.0.0E0
6458C        FNU - order of the first Bessel function
6459C      FLGJY - selection flag
6460C              FLGJY =  1.0E0 gives the J function
6461C              FLGJY = -1.0E0 gives the Y function
6462C         IN - number of functions desired, IN = 1 or 2
6463C
6464C                                  OUTPUT
6465C
6466C         Y  - a vector whose first in components contain the sequence
6467C       IFLW - a flag indicating underflow or overflow
6468C                    return variables for BESJ only
6469C      WK(1) = 1 - (X/FNU)**2 = W**2
6470C      WK(2) = SQRT(ABS(WK(1)))
6471C      WK(3) = ABS(WK(2) - ATAN(WK(2)))  or
6472C              ABS(LN((1 + WK(2))/(X/FNU)) - WK(2))
6473C            = ABS((2/3)*ZETA**(3/2))
6474C      WK(4) = FNU*WK(3)
6475C      WK(5) = (1.5*WK(3)*FNU)**(1/3) = SQRT(ZETA)*FNU**(1/3)
6476C      WK(6) = SIGN(1.,W**2)*WK(5)**2 = SIGN(1.,W**2)*ZETA*FNU**(2/3)
6477C      WK(7) = FNU**(1/3)
6478C
6479C     Abstract
6480C         ASYJY implements the uniform asymptotic expansion of
6481C         the J and Y Bessel functions for FNU.GE.35 and real
6482C         X.GT.0.0E0. The forms are identical except for a change
6483C         in sign of some of the terms. This change in sign is
6484C         accomplished by means of the flag FLGJY = 1 or -1. On
6485C         FLGJY = 1 the AIRY functions AI(X) and DAI(X) are
6486C         supplied by the external function JAIRY, and on
6487C         FLGJY = -1 the AIRY functions BI(X) and DBI(X) are
6488C         supplied by the external function YAIRY.
6489C
6490C***SEE ALSO  BESJ, BESY
6491C***ROUTINES CALLED  I1MACH, R1MACH
6492C***REVISION HISTORY  (YYMMDD)
6493C   750101  DATE WRITTEN
6494C   890531  Changed all specific intrinsics to generic.  (WRB)
6495C   891009  Removed unreferenced variable.  (WRB)
6496C   891214  Prologue converted to Version 4.0 format.  (BAB)
6497C   900328  Added TYPE section.  (WRB)
6498C   910408  Updated the AUTHOR section.  (WRB)
6499C***END PROLOGUE  ASYJY
6500C
6501C-----COMMON----------------------------------------------------------
6502C
6503      INCLUDE 'DPCOMC.INC'
6504      INCLUDE 'DPCOP2.INC'
6505C
6506      INTEGER I, IFLW, IN, J, JN,JR,JU,K, KB,KLAST,KMAX,KP1, KS, KSP1,
6507     * KSTEMP, L, LR, LRP1, ISETA, ISETB
6508      REAL ABW2, AKM, ALFA, ALFA1, ALFA2, AP, AR, ASUM, AZ,
6509     * BETA, BETA1, BETA2, BETA3, BR, BSUM, C, CON1, CON2,
6510     * CON548,CR,CRZ32, DFI,ELIM, DR,FI, FLGJY, FN, FNU,
6511     * FN2, GAMA, PHI,  RCZ, RDEN, RELB, RFN2,  RTZ, RZDEN,
6512     * SA, SB, SUMA, SUMB, S1, TA, TAU, TB, TFN, TOL, TOLS, T2, UPOL,
6513     *  WK, X, XX, Y, Z, Z32
6514      DIMENSION Y(*), WK(*), C(65)
6515      DIMENSION ALFA(26,4), BETA(26,5)
6516      DIMENSION ALFA1(26,2), ALFA2(26,2)
6517      DIMENSION BETA1(26,2), BETA2(26,2), BETA3(26,1)
6518      DIMENSION GAMA(26), KMAX(5), AR(8), BR(10), UPOL(10)
6519      DIMENSION CR(10), DR(10)
6520      EQUIVALENCE (ALFA(1,1),ALFA1(1,1))
6521      EQUIVALENCE (ALFA(1,3),ALFA2(1,1))
6522      EQUIVALENCE (BETA(1,1),BETA1(1,1))
6523      EQUIVALENCE (BETA(1,3),BETA2(1,1))
6524      EQUIVALENCE (BETA(1,5),BETA3(1,1))
6525      SAVE TOLS, CON1, CON2, CON548, AR, BR, C, ALFA1, ALFA2,
6526     1 BETA1, BETA2, BETA3, GAMA
6527      DATA TOLS            /-6.90775527898214E+00/
6528      DATA CON1,CON2,CON548/
6529     1 6.66666666666667E-01, 3.33333333333333E-01, 1.04166666666667E-01/
6530      DATA  AR(1),  AR(2),  AR(3),  AR(4),  AR(5),  AR(6),  AR(7),
6531     A      AR(8)          / 8.35503472222222E-02, 1.28226574556327E-01,
6532     1 2.91849026464140E-01, 8.81627267443758E-01, 3.32140828186277E+00,
6533     2 1.49957629868626E+01, 7.89230130115865E+01, 4.74451538868264E+02/
6534      DATA  BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8),
6535     A      BR(9), BR(10)  /-1.45833333333333E-01,-9.87413194444444E-02,
6536     1-1.43312053915895E-01,-3.17227202678414E-01,-9.42429147957120E-01,
6537     2-3.51120304082635E+00,-1.57272636203680E+01,-8.22814390971859E+01,
6538     3-4.92355370523671E+02,-3.31621856854797E+03/
6539      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
6540     1     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
6541     2     C(19), C(20), C(21), C(22), C(23), C(24)/
6542     3       -2.08333333333333E-01,        1.25000000000000E-01,
6543     4        3.34201388888889E-01,       -4.01041666666667E-01,
6544     5        7.03125000000000E-02,       -1.02581259645062E+00,
6545     6        1.84646267361111E+00,       -8.91210937500000E-01,
6546     7        7.32421875000000E-02,        4.66958442342625E+00,
6547     8       -1.12070026162230E+01,        8.78912353515625E+00,
6548     9       -2.36408691406250E+00,        1.12152099609375E-01,
6549     A       -2.82120725582002E+01,        8.46362176746007E+01,
6550     B       -9.18182415432400E+01,        4.25349987453885E+01,
6551     C       -7.36879435947963E+00,        2.27108001708984E-01,
6552     D        2.12570130039217E+02,       -7.65252468141182E+02,
6553     E        1.05999045252800E+03,       -6.99579627376133E+02/
6554      DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
6555     1     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
6556     2     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
6557     3        2.18190511744212E+02,       -2.64914304869516E+01,
6558     4        5.72501420974731E-01,       -1.91945766231841E+03,
6559     5        8.06172218173731E+03,       -1.35865500064341E+04,
6560     6        1.16553933368645E+04,       -5.30564697861340E+03,
6561     7        1.20090291321635E+03,       -1.08090919788395E+02,
6562     8        1.72772750258446E+00,        2.02042913309661E+04,
6563     9       -9.69805983886375E+04,        1.92547001232532E+05,
6564     A       -2.03400177280416E+05,        1.22200464983017E+05,
6565     B       -4.11926549688976E+04,        7.10951430248936E+03,
6566     C       -4.93915304773088E+02,        6.07404200127348E+00,
6567     D       -2.42919187900551E+05,        1.31176361466298E+06,
6568     E       -2.99801591853811E+06,        3.76327129765640E+06/
6569      DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
6570     1     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
6571     2     C(65)/
6572     3       -2.81356322658653E+06,        1.26836527332162E+06,
6573     4       -3.31645172484564E+05,        4.52187689813627E+04,
6574     5       -2.49983048181121E+03,        2.43805296995561E+01,
6575     6        3.28446985307204E+06,       -1.97068191184322E+07,
6576     7        5.09526024926646E+07,       -7.41051482115327E+07,
6577     8        6.63445122747290E+07,       -3.75671766607634E+07,
6578     9        1.32887671664218E+07,       -2.78561812808645E+06,
6579     A        3.08186404612662E+05,       -1.38860897537170E+04,
6580     B        1.10017140269247E+02/
6581      DATA ALFA1(1,1), ALFA1(2,1), ALFA1(3,1), ALFA1(4,1), ALFA1(5,1),
6582     1     ALFA1(6,1), ALFA1(7,1), ALFA1(8,1), ALFA1(9,1), ALFA1(10,1),
6583     2     ALFA1(11,1),ALFA1(12,1),ALFA1(13,1),ALFA1(14,1),ALFA1(15,1),
6584     3     ALFA1(16,1),ALFA1(17,1),ALFA1(18,1),ALFA1(19,1),ALFA1(20,1),
6585     4     ALFA1(21,1),ALFA1(22,1),ALFA1(23,1),ALFA1(24,1),ALFA1(25,1),
6586     5     ALFA1(26,1)     /-4.44444444444444E-03,-9.22077922077922E-04,
6587     6-8.84892884892885E-05, 1.65927687832450E-04, 2.46691372741793E-04,
6588     7 2.65995589346255E-04, 2.61824297061501E-04, 2.48730437344656E-04,
6589     8 2.32721040083232E-04, 2.16362485712365E-04, 2.00738858762752E-04,
6590     9 1.86267636637545E-04, 1.73060775917876E-04, 1.61091705929016E-04,
6591     1 1.50274774160908E-04, 1.40503497391270E-04, 1.31668816545923E-04,
6592     2 1.23667445598253E-04, 1.16405271474738E-04, 1.09798298372713E-04,
6593     3 1.03772410422993E-04, 9.82626078369363E-05, 9.32120517249503E-05,
6594     4 8.85710852478712E-05, 8.42963105715700E-05, 8.03497548407791E-05/
6595      DATA ALFA1(1,2), ALFA1(2,2), ALFA1(3,2), ALFA1(4,2), ALFA1(5,2),
6596     1     ALFA1(6,2), ALFA1(7,2), ALFA1(8,2), ALFA1(9,2), ALFA1(10,2),
6597     2     ALFA1(11,2),ALFA1(12,2),ALFA1(13,2),ALFA1(14,2),ALFA1(15,2),
6598     3     ALFA1(16,2),ALFA1(17,2),ALFA1(18,2),ALFA1(19,2),ALFA1(20,2),
6599     4     ALFA1(21,2),ALFA1(22,2),ALFA1(23,2),ALFA1(24,2),ALFA1(25,2),
6600     5     ALFA1(26,2)     / 6.93735541354589E-04, 2.32241745182922E-04,
6601     6-1.41986273556691E-05,-1.16444931672049E-04,-1.50803558053049E-04,
6602     7-1.55121924918096E-04,-1.46809756646466E-04,-1.33815503867491E-04,
6603     8-1.19744975684254E-04,-1.06184319207974E-04,-9.37699549891194E-05,
6604     9-8.26923045588193E-05,-7.29374348155221E-05,-6.44042357721016E-05,
6605     1-5.69611566009369E-05,-5.04731044303562E-05,-4.48134868008883E-05,
6606     2-3.98688727717599E-05,-3.55400532972042E-05,-3.17414256609022E-05,
6607     3-2.83996793904175E-05,-2.54522720634871E-05,-2.28459297164725E-05,
6608     4-2.05352753106481E-05,-1.84816217627666E-05,-1.66519330021394E-05/
6609      DATA ALFA2(1,1), ALFA2(2,1), ALFA2(3,1), ALFA2(4,1), ALFA2(5,1),
6610     1     ALFA2(6,1), ALFA2(7,1), ALFA2(8,1), ALFA2(9,1), ALFA2(10,1),
6611     2     ALFA2(11,1),ALFA2(12,1),ALFA2(13,1),ALFA2(14,1),ALFA2(15,1),
6612     3     ALFA2(16,1),ALFA2(17,1),ALFA2(18,1),ALFA2(19,1),ALFA2(20,1),
6613     4     ALFA2(21,1),ALFA2(22,1),ALFA2(23,1),ALFA2(24,1),ALFA2(25,1),
6614     5     ALFA2(26,1)     /-3.54211971457744E-04,-1.56161263945159E-04,
6615     6 3.04465503594936E-05, 1.30198655773243E-04, 1.67471106699712E-04,
6616     7 1.70222587683593E-04, 1.56501427608595E-04, 1.36339170977445E-04,
6617     8 1.14886692029825E-04, 9.45869093034688E-05, 7.64498419250898E-05,
6618     9 6.07570334965197E-05, 4.74394299290509E-05, 3.62757512005344E-05,
6619     1 2.69939714979225E-05, 1.93210938247939E-05, 1.30056674793963E-05,
6620     2 7.82620866744497E-06, 3.59257485819352E-06, 1.44040049814252E-07,
6621     3-2.65396769697939E-06,-4.91346867098486E-06,-6.72739296091248E-06,
6622     4-8.17269379678658E-06,-9.31304715093561E-06,-1.02011418798016E-05/
6623      DATA ALFA2(1,2), ALFA2(2,2), ALFA2(3,2), ALFA2(4,2), ALFA2(5,2),
6624     1     ALFA2(6,2), ALFA2(7,2), ALFA2(8,2), ALFA2(9,2), ALFA2(10,2),
6625     2     ALFA2(11,2),ALFA2(12,2),ALFA2(13,2),ALFA2(14,2),ALFA2(15,2),
6626     3     ALFA2(16,2),ALFA2(17,2),ALFA2(18,2),ALFA2(19,2),ALFA2(20,2),
6627     4     ALFA2(21,2),ALFA2(22,2),ALFA2(23,2),ALFA2(24,2),ALFA2(25,2),
6628     5     ALFA2(26,2)     / 3.78194199201773E-04, 2.02471952761816E-04,
6629     6-6.37938506318862E-05,-2.38598230603006E-04,-3.10916256027362E-04,
6630     7-3.13680115247576E-04,-2.78950273791323E-04,-2.28564082619141E-04,
6631     8-1.75245280340847E-04,-1.25544063060690E-04,-8.22982872820208E-05,
6632     9-4.62860730588116E-05,-1.72334302366962E-05, 5.60690482304602E-06,
6633     1 2.31395443148287E-05, 3.62642745856794E-05, 4.58006124490189E-05,
6634     2 5.24595294959114E-05, 5.68396208545815E-05, 5.94349820393104E-05,
6635     3 6.06478527578422E-05, 6.08023907788436E-05, 6.01577894539460E-05,
6636     4 5.89199657344698E-05, 5.72515823777593E-05, 5.52804375585853E-05/
6637      DATA BETA1(1,1), BETA1(2,1), BETA1(3,1), BETA1(4,1), BETA1(5,1),
6638     1     BETA1(6,1), BETA1(7,1), BETA1(8,1), BETA1(9,1), BETA1(10,1),
6639     2     BETA1(11,1),BETA1(12,1),BETA1(13,1),BETA1(14,1),BETA1(15,1),
6640     3     BETA1(16,1),BETA1(17,1),BETA1(18,1),BETA1(19,1),BETA1(20,1),
6641     4     BETA1(21,1),BETA1(22,1),BETA1(23,1),BETA1(24,1),BETA1(25,1),
6642     5     BETA1(26,1)     / 1.79988721413553E-02, 5.59964911064388E-03,
6643     6 2.88501402231133E-03, 1.80096606761054E-03, 1.24753110589199E-03,
6644     7 9.22878876572938E-04, 7.14430421727287E-04, 5.71787281789705E-04,
6645     8 4.69431007606482E-04, 3.93232835462917E-04, 3.34818889318298E-04,
6646     9 2.88952148495752E-04, 2.52211615549573E-04, 2.22280580798883E-04,
6647     1 1.97541838033063E-04, 1.76836855019718E-04, 1.59316899661821E-04,
6648     2 1.44347930197334E-04, 1.31448068119965E-04, 1.20245444949303E-04,
6649     3 1.10449144504599E-04, 1.01828770740567E-04, 9.41998224204238E-05,
6650     4 8.74130545753834E-05, 8.13466262162801E-05, 7.59002269646219E-05/
6651      DATA BETA1(1,2), BETA1(2,2), BETA1(3,2), BETA1(4,2), BETA1(5,2),
6652     1     BETA1(6,2), BETA1(7,2), BETA1(8,2), BETA1(9,2), BETA1(10,2),
6653     2     BETA1(11,2),BETA1(12,2),BETA1(13,2),BETA1(14,2),BETA1(15,2),
6654     3     BETA1(16,2),BETA1(17,2),BETA1(18,2),BETA1(19,2),BETA1(20,2),
6655     4     BETA1(21,2),BETA1(22,2),BETA1(23,2),BETA1(24,2),BETA1(25,2),
6656     5     BETA1(26,2)     /-1.49282953213429E-03,-8.78204709546389E-04,
6657     6-5.02916549572035E-04,-2.94822138512746E-04,-1.75463996970783E-04,
6658     7-1.04008550460816E-04,-5.96141953046458E-05,-3.12038929076098E-05,
6659     8-1.26089735980230E-05,-2.42892608575730E-07, 8.05996165414274E-06,
6660     9 1.36507009262147E-05, 1.73964125472926E-05, 1.98672978842134E-05,
6661     1 2.14463263790823E-05, 2.23954659232457E-05, 2.28967783814713E-05,
6662     2 2.30785389811178E-05, 2.30321976080909E-05, 2.28236073720349E-05,
6663     3 2.25005881105292E-05, 2.20981015361991E-05, 2.16418427448104E-05,
6664     4 2.11507649256221E-05, 2.06388749782171E-05, 2.01165241997082E-05/
6665      DATA BETA2(1,1), BETA2(2,1), BETA2(3,1), BETA2(4,1), BETA2(5,1),
6666     1     BETA2(6,1), BETA2(7,1), BETA2(8,1), BETA2(9,1), BETA2(10,1),
6667     2     BETA2(11,1),BETA2(12,1),BETA2(13,1),BETA2(14,1),BETA2(15,1),
6668     3     BETA2(16,1),BETA2(17,1),BETA2(18,1),BETA2(19,1),BETA2(20,1),
6669     4     BETA2(21,1),BETA2(22,1),BETA2(23,1),BETA2(24,1),BETA2(25,1),
6670     5     BETA2(26,1)     / 5.52213076721293E-04, 4.47932581552385E-04,
6671     6 2.79520653992021E-04, 1.52468156198447E-04, 6.93271105657044E-05,
6672     7 1.76258683069991E-05,-1.35744996343269E-05,-3.17972413350427E-05,
6673     8-4.18861861696693E-05,-4.69004889379141E-05,-4.87665447413787E-05,
6674     9-4.87010031186735E-05,-4.74755620890087E-05,-4.55813058138628E-05,
6675     1-4.33309644511266E-05,-4.09230193157750E-05,-3.84822638603221E-05,
6676     2-3.60857167535411E-05,-3.37793306123367E-05,-3.15888560772110E-05,
6677     3-2.95269561750807E-05,-2.75978914828336E-05,-2.58006174666884E-05,
6678     4-2.41308356761280E-05,-2.25823509518346E-05,-2.11479656768913E-05/
6679      DATA BETA2(1,2), BETA2(2,2), BETA2(3,2), BETA2(4,2), BETA2(5,2),
6680     1     BETA2(6,2), BETA2(7,2), BETA2(8,2), BETA2(9,2), BETA2(10,2),
6681     2     BETA2(11,2),BETA2(12,2),BETA2(13,2),BETA2(14,2),BETA2(15,2),
6682     3     BETA2(16,2),BETA2(17,2),BETA2(18,2),BETA2(19,2),BETA2(20,2),
6683     4     BETA2(21,2),BETA2(22,2),BETA2(23,2),BETA2(24,2),BETA2(25,2),
6684     5     BETA2(26,2)     /-4.74617796559960E-04,-4.77864567147321E-04,
6685     6-3.20390228067038E-04,-1.61105016119962E-04,-4.25778101285435E-05,
6686     7 3.44571294294968E-05, 7.97092684075675E-05, 1.03138236708272E-04,
6687     8 1.12466775262204E-04, 1.13103642108481E-04, 1.08651634848774E-04,
6688     9 1.01437951597662E-04, 9.29298396593364E-05, 8.40293133016090E-05,
6689     1 7.52727991349134E-05, 6.69632521975731E-05, 5.92564547323195E-05,
6690     2 5.22169308826976E-05, 4.58539485165361E-05, 4.01445513891487E-05,
6691     3 3.50481730031328E-05, 3.05157995034347E-05, 2.64956119950516E-05,
6692     4 2.29363633690998E-05, 1.97893056664022E-05, 1.70091984636413E-05/
6693      DATA BETA3(1,1), BETA3(2,1), BETA3(3,1), BETA3(4,1), BETA3(5,1),
6694     1     BETA3(6,1), BETA3(7,1), BETA3(8,1), BETA3(9,1), BETA3(10,1),
6695     2     BETA3(11,1),BETA3(12,1),BETA3(13,1),BETA3(14,1),BETA3(15,1),
6696     3     BETA3(16,1),BETA3(17,1),BETA3(18,1),BETA3(19,1),BETA3(20,1),
6697     4     BETA3(21,1),BETA3(22,1),BETA3(23,1),BETA3(24,1),BETA3(25,1),
6698     5     BETA3(26,1)     / 7.36465810572578E-04, 8.72790805146194E-04,
6699     6 6.22614862573135E-04, 2.85998154194304E-04, 3.84737672879366E-06,
6700     7-1.87906003636972E-04,-2.97603646594555E-04,-3.45998126832656E-04,
6701     8-3.53382470916038E-04,-3.35715635775049E-04,-3.04321124789040E-04,
6702     9-2.66722723047613E-04,-2.27654214122820E-04,-1.89922611854562E-04,
6703     1-1.55058918599094E-04,-1.23778240761874E-04,-9.62926147717644E-05,
6704     2-7.25178327714425E-05,-5.22070028895634E-05,-3.50347750511901E-05,
6705     3-2.06489761035552E-05,-8.70106096849767E-06, 1.13698686675100E-06,
6706     4 9.16426474122779E-06, 1.56477785428873E-05, 2.08223629482467E-05/
6707      DATA GAMA(1),   GAMA(2),   GAMA(3),   GAMA(4),   GAMA(5),
6708     1     GAMA(6),   GAMA(7),   GAMA(8),   GAMA(9),   GAMA(10),
6709     2     GAMA(11),  GAMA(12),  GAMA(13),  GAMA(14),  GAMA(15),
6710     3     GAMA(16),  GAMA(17),  GAMA(18),  GAMA(19),  GAMA(20),
6711     4     GAMA(21),  GAMA(22),  GAMA(23),  GAMA(24),  GAMA(25),
6712     5     GAMA(26)        / 6.29960524947437E-01, 2.51984209978975E-01,
6713     6 1.54790300415656E-01, 1.10713062416159E-01, 8.57309395527395E-02,
6714     7 6.97161316958684E-02, 5.86085671893714E-02, 5.04698873536311E-02,
6715     8 4.42600580689155E-02, 3.93720661543510E-02, 3.54283195924455E-02,
6716     9 3.21818857502098E-02, 2.94646240791158E-02, 2.71581677112934E-02,
6717     1 2.51768272973862E-02, 2.34570755306079E-02, 2.19508390134907E-02,
6718     2 2.06210828235646E-02, 1.94388240897881E-02, 1.83810633800683E-02,
6719     3 1.74293213231963E-02, 1.65685837786612E-02, 1.57865285987918E-02,
6720     4 1.50729501494096E-02, 1.44193250839955E-02, 1.38184805735342E-02/
6721C***FIRST EXECUTABLE STATEMENT  ASYJY
6722      TA = R1MACH(3)
6723      TOL = MAX(TA,1.0E-15)
6724      TB = R1MACH(5)
6725      JU = I1MACH(12)
6726      IF(FLGJY.EQ.1.0E0) GO TO 6
6727      JR = I1MACH(11)
6728      ELIM = -2.303E0*TB*(JU+JR)
6729      GO TO 7
6730    6 CONTINUE
6731      ELIM = -2.303E0*(TB*JU+3.0E0)
6732    7 CONTINUE
6733      FN = FNU
6734      IFLW = 0
6735      DO 170 JN=1,IN
6736        XX = X/FN
6737        WK(1) = 1.0E0 - XX*XX
6738        ABW2 = ABS(WK(1))
6739        WK(2) = SQRT(ABW2)
6740        WK(7) = FN**CON2
6741        IF (ABW2.GT.0.27750E0) GO TO 80
6742C
6743C     ASYMPTOTIC EXPANSION
6744C     CASES NEAR X=FN, ABS(1.-(X/FN)**2).LE.0.2775
6745C     COEFFICIENTS OF ASYMPTOTIC EXPANSION BY SERIES
6746C
6747C     ZETA AND TRUNCATION FOR A(ZETA) AND B(ZETA) SERIES
6748C
6749C     KMAX IS TRUNCATION INDEX FOR A(ZETA) AND B(ZETA) SERIES=MAX(2,SA)
6750C
6751        SA = 0.0E0
6752        IF (ABW2.EQ.0.0E0) GO TO 10
6753        SA = TOLS/LOG(ABW2)
6754   10   SB = SA
6755        DO 20 I=1,5
6756          AKM = MAX(SA,2.0E0)
6757          KMAX(I) = INT(AKM)
6758          SA = SA + SB
6759   20   CONTINUE
6760        KB = KMAX(5)
6761        KLAST = KB - 1
6762        SA = GAMA(KB)
6763        DO 30 K=1,KLAST
6764          KB = KB - 1
6765          SA = SA*WK(1) + GAMA(KB)
6766   30   CONTINUE
6767        Z = WK(1)*SA
6768        AZ = ABS(Z)
6769        RTZ = SQRT(AZ)
6770        WK(3) = CON1*AZ*RTZ
6771        WK(4) = WK(3)*FN
6772        WK(5) = RTZ*WK(7)
6773        WK(6) = -WK(5)*WK(5)
6774        IF(Z.LE.0.0E0) GO TO 35
6775        IF(WK(4).GT.ELIM) GO TO 75
6776        WK(6) = -WK(6)
6777   35   CONTINUE
6778        PHI = SQRT(SQRT(SA+SA+SA+SA))
6779C
6780C     B(ZETA) FOR S=0
6781C
6782        KB = KMAX(5)
6783        KLAST = KB - 1
6784        SB = BETA(KB,1)
6785        DO 40 K=1,KLAST
6786          KB = KB - 1
6787          SB = SB*WK(1) + BETA(KB,1)
6788   40   CONTINUE
6789        KSP1 = 1
6790        FN2 = FN*FN
6791        RFN2 = 1.0E0/FN2
6792        RDEN = 1.0E0
6793        ASUM = 1.0E0
6794        RELB = TOL*ABS(SB)
6795        BSUM = SB
6796        DO 60 KS=1,4
6797          KSP1 = KSP1 + 1
6798          RDEN = RDEN*RFN2
6799C
6800C     A(ZETA) AND B(ZETA) FOR S=1,2,3,4
6801C
6802          KSTEMP = 5 - KS
6803          KB = KMAX(KSTEMP)
6804          KLAST = KB - 1
6805          SA = ALFA(KB,KS)
6806          SB = BETA(KB,KSP1)
6807          DO 50 K=1,KLAST
6808            KB = KB - 1
6809            SA = SA*WK(1) + ALFA(KB,KS)
6810            SB = SB*WK(1) + BETA(KB,KSP1)
6811   50     CONTINUE
6812          TA = SA*RDEN
6813          TB = SB*RDEN
6814          ASUM = ASUM + TA
6815          BSUM = BSUM + TB
6816          IF (ABS(TA).LE.TOL .AND. ABS(TB).LE.RELB) GO TO 70
6817   60   CONTINUE
6818   70   CONTINUE
6819        BSUM = BSUM/(FN*WK(7))
6820        GO TO 160
6821C
6822   75   CONTINUE
6823        IFLW = 1
6824        RETURN
6825C
6826   80   CONTINUE
6827        UPOL(1) = 1.0E0
6828        TAU = 1.0E0/WK(2)
6829        T2 = 1.0E0/WK(1)
6830        IF (WK(1).GE.0.0E0) GO TO 90
6831C
6832C     CASES FOR (X/FN).GT.SQRT(1.2775)
6833C
6834        WK(3) = ABS(WK(2)-ATAN(WK(2)))
6835        WK(4) = WK(3)*FN
6836        RCZ = -CON1/WK(4)
6837        Z32 = 1.5E0*WK(3)
6838        RTZ = Z32**CON2
6839        WK(5) = RTZ*WK(7)
6840        WK(6) = -WK(5)*WK(5)
6841        GO TO 100
6842   90   CONTINUE
6843C
6844C     CASES FOR (X/FN).LT.SQRT(0.7225)
6845C
6846        WK(3) = ABS(LOG((1.0E0+WK(2))/XX)-WK(2))
6847        WK(4) = WK(3)*FN
6848        RCZ = CON1/WK(4)
6849        IF(WK(4).GT.ELIM) GO TO 75
6850        Z32 = 1.5E0*WK(3)
6851        RTZ = Z32**CON2
6852        WK(7) = FN**CON2
6853        WK(5) = RTZ*WK(7)
6854        WK(6) = WK(5)*WK(5)
6855  100   CONTINUE
6856        PHI = SQRT((RTZ+RTZ)*TAU)
6857        TB = 1.0E0
6858        ASUM = 1.0E0
6859        TFN = TAU/FN
6860        RDEN=1.0E0/FN
6861        RFN2=RDEN*RDEN
6862        RDEN=1.0E0
6863        UPOL(2) = (C(1)*T2+C(2))*TFN
6864        CRZ32 = CON548*RCZ
6865        BSUM = UPOL(2) + CRZ32
6866        RELB = TOL*ABS(BSUM)
6867        AP = TFN
6868        KS = 0
6869        KP1 = 2
6870        RZDEN = RCZ
6871        L = 2
6872        ISETA=0
6873        ISETB=0
6874        DO 140 LR=2,8,2
6875C
6876C     COMPUTE TWO U POLYNOMIALS FOR NEXT A(ZETA) AND B(ZETA)
6877C
6878          LRP1 = LR + 1
6879          DO 120 K=LR,LRP1
6880            KS = KS + 1
6881            KP1 = KP1 + 1
6882            L = L + 1
6883            S1 = C(L)
6884            DO 110 J=2,KP1
6885              L = L + 1
6886              S1 = S1*T2 + C(L)
6887  110       CONTINUE
6888            AP = AP*TFN
6889            UPOL(KP1) = AP*S1
6890            CR(KS) = BR(KS)*RZDEN
6891            RZDEN = RZDEN*RCZ
6892            DR(KS) = AR(KS)*RZDEN
6893  120     CONTINUE
6894          SUMA = UPOL(LRP1)
6895          SUMB = UPOL(LR+2) + UPOL(LRP1)*CRZ32
6896          JU = LRP1
6897          DO 130 JR=1,LR
6898            JU = JU - 1
6899            SUMA = SUMA + CR(JR)*UPOL(JU)
6900            SUMB = SUMB + DR(JR)*UPOL(JU)
6901  130     CONTINUE
6902          RDEN=RDEN*RFN2
6903          TB = -TB
6904          IF (WK(1).GT.0.0E0) TB = ABS(TB)
6905          IF (RDEN.LT.TOL) GO TO 131
6906          ASUM = ASUM + SUMA*TB
6907          BSUM = BSUM + SUMB*TB
6908          GO TO 140
6909  131     IF(ISETA.EQ.1) GO TO 132
6910          IF(ABS(SUMA).LT.TOL) ISETA=1
6911          ASUM=ASUM+SUMA*TB
6912  132     IF(ISETB.EQ.1) GO TO 133
6913          IF(ABS(SUMB).LT.RELB) ISETB=1
6914          BSUM=BSUM+SUMB*TB
6915  133     IF(ISETA.EQ.1 .AND. ISETB.EQ.1) GO TO 150
6916  140   CONTINUE
6917  150   TB = WK(5)
6918        IF (WK(1).GT.0.0E0) TB = -TB
6919        BSUM = BSUM/TB
6920C
6921  160   CONTINUE
6922        CALL FUNJY(WK(6), WK(5), WK(4), FI, DFI)
6923        TA=1.0E0/TOL
6924        TB=R1MACH(1)*TA*1.0E+3
6925        IF(ABS(FI).GT.TB) GO TO 165
6926        FI=FI*TA
6927        DFI=DFI*TA
6928        PHI=PHI*TOL
6929  165   CONTINUE
6930        Y(JN) = FLGJY*PHI*(FI*ASUM+DFI*BSUM)/WK(7)
6931        FN = FN - FLGJY
6932  170 CONTINUE
6933      RETURN
6934      END
6935      DOUBLE PRECISION FUNCTION ATNINT(XVALUE)
6936C
6937C DESCRIPTION:
6938C
6939C   The function ATNINT calculates the value of the
6940C   inverse-tangent integral defined by
6941C
6942C       ATNINT(x) = integral 0 to x ( (arctan t)/t ) dt
6943C
6944C   The approximation uses Chebyshev series with the coefficients
6945C   given to an accuracy of 20D.
6946C
6947C
6948C ERROR RETURNS:
6949C
6950C   There are no error returns from this program.
6951C
6952C
6953C MACHINE-DEPENDENT CONSTANTS:
6954C
6955C   NTERMS - INTEGER - The no. of terms of the array ATNINTT.
6956C                      The recommended value is such that
6957C                          ATNINA(NTERMS) < EPS/100
6958C
6959C   XLOW - DOUBLE PRECISION - A bound below which ATNINT(x) = x to machine
6960C                 precision. The recommended value is
6961C                     sqrt(EPSNEG/2).
6962C
6963C   XUPPER - DOUBLE PRECISION - A bound on x, above which, to machine precision
6964C                   ATNINT(x) = (pi/2)ln x
6965C                   The recommended value is 1/EPS.
6966C
6967C     For values of EPSNEG and EPS for various machine/compiler
6968C     combinations refer to the text file MACHCON.TXT
6969C
6970C     The machine-dependent constants are computed internally by
6971C     using the D1MACH subroutine.
6972C
6973C
6974C INTRINSIC FUNCTIONS USED:
6975C
6976C    ABS , LOG
6977C
6978C
6979C   OTHER MISCFUN SUBROUTINES USED:
6980C
6981C          CHEVAL ,  D1MACH
6982C
6983C
6984C AUTHOR: Dr. Allan J. MacLeod,
6985C         Dept. of Mathematics and Statistics,
6986C         University of Paisley,
6987C         High St.,
6988C         PAISLEY
6989C         SCOTLAND
6990C
6991C         (e-mail  macl_ms0@paisley.ac.uk )
6992C
6993C
6994C LATEST MODIFICATION:  23 January, 1996
6995C
6996C
6997C
6998      INTEGER IND,NTERMS
6999      DOUBLE PRECISION ATNINA(0:22),CHEVAL,HALF,ONE,ONEHUN,T,TWOBPI,
7000     &     X,XLOW,XUPPER,XVALUE,ZERO
7001C
7002C-----COMMON----------------------------------------------------------
7003C
7004      INCLUDE 'DPCOMC.INC'
7005      INCLUDE 'DPCOP2.INC'
7006C
7007      DATA ZERO,HALF,ONE/0.0 D 0 , 0.5 D 0 , 1.0 D 0/
7008      DATA ONEHUN/100.0 D 0/
7009      DATA TWOBPI/0.63661 97723 67581 34308 D 0/
7010      DATA ATNINA(0)/  1.91040 36129 62359 37512  D    0/
7011      DATA ATNINA(1)/ -0.41763 51437 65674 6940   D   -1/
7012      DATA ATNINA(2)/  0.27539 25507 86367 434    D   -2/
7013      DATA ATNINA(3)/ -0.25051 80952 62488 81     D   -3/
7014      DATA ATNINA(4)/  0.26669 81285 12117 1      D   -4/
7015      DATA ATNINA(5)/ -0.31189 05141 07001        D   -5/
7016      DATA ATNINA(6)/  0.38833 85313 2249         D   -6/
7017      DATA ATNINA(7)/ -0.50572 74584 964          D   -7/
7018      DATA ATNINA(8)/  0.68122 52829 49           D   -8/
7019      DATA ATNINA(9)/ -0.94212 56165 4            D   -9/
7020      DATA ATNINA(10)/ 0.13307 87881 6            D   -9/
7021      DATA ATNINA(11)/-0.19126 78075              D  -10/
7022      DATA ATNINA(12)/ 0.27891 2620               D  -11/
7023      DATA ATNINA(13)/-0.41174 820                D  -12/
7024      DATA ATNINA(14)/ 0.61429 87                 D  -13/
7025      DATA ATNINA(15)/-0.92492 9                  D  -14/
7026      DATA ATNINA(16)/ 0.14038 7                  D  -14/
7027      DATA ATNINA(17)/-0.21460                    D  -15/
7028      DATA ATNINA(18)/ 0.3301                     D  -16/
7029      DATA ATNINA(19)/-0.511                      D  -17/
7030      DATA ATNINA(20)/ 0.79                       D  -18/
7031      DATA ATNINA(21)/-0.12                       D  -18/
7032      DATA ATNINA(22)/ 0.2                        D  -19/
7033C
7034C   Compute the machine-dependent constants.
7035C
7036      T = D1MACH(4) / ONEHUN
7037      DO 10 NTERMS = 22 , 0 , -1
7038         IF ( ABS(ATNINA(NTERMS)) .GT. T ) GOTO 19
7039 10   CONTINUE
7040 19   T = D1MACH(3)
7041      XLOW = SQRT( T / ( ONE + ONE ) )
7042      XUPPER = ONE / T
7043C
7044C   Start calculation
7045C
7046      IND = 1
7047      X = XVALUE
7048      IF ( X .LT. ZERO ) THEN
7049         X = -X
7050         IND = -1
7051      ENDIF
7052C
7053C   Code for X < =  1.0
7054C
7055      IF ( X .LE. ONE ) THEN
7056         IF ( X .LT. XLOW ) THEN
7057            ATNINT = X
7058         ELSE
7059            T = X * X
7060            T =  ( T - HALF ) + ( T - HALF )
7061            ATNINT = X * CHEVAL( NTERMS , ATNINA , T )
7062         ENDIF
7063      ELSE
7064C
7065C   Code for X > 1.0
7066C
7067         IF ( X .GT. XUPPER ) THEN
7068            ATNINT = LOG( X ) / TWOBPI
7069         ELSE
7070            T = ONE / ( X * X )
7071            T =  ( T - HALF ) + ( T - HALF )
7072            ATNINT = LOG( X ) / TWOBPI + CHEVAL( NTERMS,ATNINA,T ) / X
7073         ENDIF
7074      ENDIF
7075      IF ( IND .LT. 0 ) ATNINT = - ATNINT
7076      RETURN
7077      END
7078      SUBROUTINE ATNCDF(X,PHI,ALPHA,CDF)
7079C
7080C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
7081C              FUNCTION VALUE FOR THE ARCTANGENT DISTRIBUTION
7082C
7083C              THIS DISTRIBUTION IS DEFINED FOR X >= 0 AND HAS
7084C              THE CUMULATIVE DISTRIBUTION FUNCTION
7085C
7086C              F(X;PHI,ALPHA) = 1 - ARCTAN(ALPHA*(PHI - X) + PI/2]/
7087C                               (ARCTAN(ALPHA*PHI) + PI/2)
7088C                               X >= 0, ALPHA > 0
7089C
7090C              NOTE THAT PHI AND ALPHA ARE ANALOGOUS TO LOCATION AND
7091C              SCALE PARAMETERS.  HOWEVER, THEY ARE NOT TRUE LOCATION
7092C              AND SCALE PARAMETERS IN THE SENSE THAT
7093C
7094C                  F(X;PHI,ALPHA) = F((X-PHI)/ALPHA;0,1)
7095C
7096C              DOES NOT HOLD.
7097C
7098C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
7099C                                WHICH THE CUMULATIVE DISTRIBUTION
7100C                                FUNCTION IS TO BE EVALUATED.
7101C                     --PHI    = THE DOUBLE PRECISION PHASE SHIFT
7102C                                PARAMETER
7103C                     --ALPHA  = THE DOUBLE PRECISION SCALING PARAMETER
7104C     OUTPUT ARGUMENTS--CDF    = THE DOUBLE PRECISION CUMULATIVE
7105C                                DISTRIBUTION FUNCTION VALUE.
7106C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION FUNCTION
7107C             VALUE CDF.
7108C     PRINTING--NONE.
7109C     RESTRICTIONS--NONE.
7110C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7111C     FORTRAN LIBRARY SUBROUTINES NEEDED--ATAN.
7112C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7113C     LANGUAGE--ANSI FORTRAN.
7114C     REFERENCES--GLEN AND LEMIS (1997), "THE ARCTANGENT SURVIVAL
7115C                 DISTRIBUTION", JOURNAL OF QUALITY TECHNOLOGY,
7116C                 VOL. 29, NO. 2.
7117C     WRITTEN BY--ALAN HECKERT
7118C                 STATISTICAL ENGINEERING LABORATORY
7119C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7120C                 GAITHERSBURG, MD 20899-8980
7121C                 PHONE:  301-975-2899
7122C     ORIGINAL VERSION--JANUIARY  2010.
7123C
7124C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7125C
7126C---------------------------------------------------------------------
7127C
7128      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
7129C
7130      INCLUDE 'DPCOP2.INC'
7131C
7132C---------------------------------------------------------------------
7133C
7134      DATA PI/ 3.14159265358979D+00/
7135C
7136C-----START POINT-----------------------------------------------------
7137C
7138C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
7139C
7140      CDF=0.0D0
7141      IF(X.LT.0.0D0)THEN
7142        CDF=0.0D0
7143        GOTO9000
7144      ELSEIF(ALPHA.LE.0.0D0)THEN
7145        WRITE(ICOUT,2)
7146    2   FORMAT('***** ERROR--THE SECOND ARGUMENT TO ATNCDF IS ',
7147     1         'NON-POSITIVE.')
7148        CALL DPWRST('XXX','BUG ')
7149        WRITE(ICOUT,46)ALPHA
7150   46   FORMAT('      THE ARGUMENT HAS THE VALUE ',G15.7,'.')
7151        CALL DPWRST('XXX','BUG ')
7152        GOTO9000
7153      ENDIF
7154C
7155      TERM1=ATAN(ALPHA*(PHI - X)) + PI/2.0D0
7156      TERM2=ATAN(ALPHA*PHI) + PI/2.0D0
7157      CDF=1.0D0 - (TERM1/TERM2)
7158C
7159 9000 CONTINUE
7160      RETURN
7161      END
7162      SUBROUTINE ATNHAZ(X,PHI,ALPHA,HAZ)
7163C
7164C     PURPOSE--THIS SUBROUTINE COMPUTES THE HAZARD
7165C              FUNCTION VALUE FOR THE ARCTANGENT DISTRIBUTION
7166C
7167C              THIS DISTRIBUTION IS DEFINED FOR X >= 0 AND HAS
7168C              THE HAZARD FUNCTION
7169C
7170C              h(X;PHI,ALPHA) = ALPHA/
7171C                               [ARCTAN(ALPHA*(PHI-X)) + PI/2]*
7172C                               [1 + ALPHA**2*(X - PHI)**2]
7173C                               X >= 0, ALPHA > 0
7174C
7175C              NOTE THAT PHI AND ALPHA ARE ANALOGOUS TO LOCATION AND
7176C              SCALE PARAMETERS.  HOWEVER, THEY ARE NOT TRUE LOCATION
7177C              AND SCALE PARAMETERS IN THE SENSE THAT
7178C
7179C                  h(X;PHI,ALPHA) = (1/ALPHA)*h((X-PHI)/ALPHA;0,1)
7180C
7181C              DOES NOT HOLD.
7182C
7183C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
7184C                                WHICH THE HAZARD
7185C                                FUNCTION IS TO BE EVALUATED.
7186C                     --PHI    = THE DOUBLE PRECISION PHASE SHIFT
7187C                                PARAMETER
7188C                     --ALPHA  = THE DOUBLE PRECISION SCALING PARAMETER
7189C     OUTPUT ARGUMENTS--HAZ    = THE DOUBLE PRECISION HAZARD
7190C                                FUNCTION VALUE.
7191C     OUTPUT--THE DOUBLE PRECISION HAZARD FUNCTION VALUE HAZ.
7192C     PRINTING--NONE.
7193C     RESTRICTIONS--NONE.
7194C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7195C     FORTRAN LIBRARY SUBROUTINES NEEDED--ARCTAN.
7196C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7197C     LANGUAGE--ANSI FORTRAN.
7198C     REFERENCES--GLEN AND LEMIS (1997), "THE ARCTANGENT SURVIVAL
7199C                 DISTRIBUTION", JOURNAL OF QUALITY TECHNOLOGY,
7200C                 VOL. 29, NO. 2.
7201C     WRITTEN BY--ALAN HECKERT
7202C                 STATISTICAL ENGINEERING LABORATORY
7203C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7204C                 GAITHERSBURG, MD 20899-8980
7205C                 PHONE:  301-975-2899
7206C     ORIGINAL VERSION--JANUARY  2011.
7207C
7208C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7209C
7210C---------------------------------------------------------------------
7211C
7212      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
7213C
7214      INCLUDE 'DPCOP2.INC'
7215C
7216C---------------------------------------------------------------------
7217C
7218      DATA PI/ 3.14159265358979D+00/
7219C
7220C-----START POINT-----------------------------------------------------
7221C
7222C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
7223C
7224      IF(X.LT.0.0D0)THEN
7225        WRITE(ICOUT,1)
7226        CALL DPWRST('XXX','BUG ')
7227        WRITE(ICOUT,46)X
7228        CALL DPWRST('XXX','BUG ')
7229        GOTO9000
7230      ELSEIF(ALPHA.LE.0.0D0)THEN
7231        WRITE(ICOUT,2)
7232        CALL DPWRST('XXX','BUG ')
7233        WRITE(ICOUT,46)ALPHA
7234        CALL DPWRST('XXX','BUG ')
7235        GOTO9000
7236      ENDIF
7237    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ATNHAZ IS NEGATIVE.')
7238    2 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ATNHAZ IS ',
7239     1       'NON-POSITIVE.')
7240   46 FORMAT('      THE ARGUMENT HAS THE VALUE ',G15.7)
7241C
7242      TERM1=ATAN(ALPHA*(PHI-X)) + PI/2.0D0
7243      TERM2=1.0D0 + ALPHA**2*(X - PHI)**2
7244      HAZ=ALPHA/(TERM1*TERM2)
7245C
7246 9000 CONTINUE
7247      RETURN
7248      END
7249      SUBROUTINE ATNPDF(X,PHI,ALPHA,PDF)
7250C
7251C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
7252C              FUNCTION VALUE FOR THE ARCTANGENT DISTRIBUTION
7253C
7254C              THIS DISTRIBUTION IS DEFINED FOR X >= 0 AND HAS
7255C              THE PROBABILITY DENSITY FUNCTION
7256C
7257C              f(X;PHI,ALPHA) = ALPHA/
7258C                               [ARCTAN(ALPHA*PHI) + PI/2]*
7259C                               [1 + ALPHA**2*(X - PHI)**2]
7260C                               X >= 0, ALPHA > 0
7261C
7262C              NOTE THAT PHI AND ALPHA ARE ANALOGOUS TO LOCATION AND
7263C              SCALE PARAMETERS.  HOWEVER, THEY ARE NOT TRUE LOCATION
7264C              AND SCALE PARAMETERS IN THE SENSE THAT
7265C
7266C                  f(X;PHI,ALPHA) = (1/ALPHA)*f((X-PHI)/ALPHA;0,1)
7267C
7268C              DOES NOT HOLD.
7269C
7270C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
7271C                                WHICH THE PROBABILITY DENSITY
7272C                                FUNCTION IS TO BE EVALUATED.
7273C                     --PHI    = THE DOUBLE PRECISION PHASE SHIFT
7274C                                PARAMETER
7275C                     --ALPHA  = THE DOUBLE PRECISION SCALING PARAMETER
7276C     OUTPUT ARGUMENTS--PDF    = THE DOUBLE PRECISION PROBABILITY DENSITY
7277C                                FUNCTION VALUE.
7278C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY FUNCTION VALUE PDF.
7279C     PRINTING--NONE.
7280C     RESTRICTIONS--NONE.
7281C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7282C     FORTRAN LIBRARY SUBROUTINES NEEDED--ARCTAN.
7283C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7284C     LANGUAGE--ANSI FORTRAN.
7285C     REFERENCES--GLEN AND LEMIS (1997), "THE ARCTANGENT SURVIVAL
7286C                 DISTRIBUTION", JOURNAL OF QUALITY TECHNOLOGY,
7287C                 VOL. 29, NO. 2.
7288C     WRITTEN BY--ALAN HECKERT
7289C                 STATISTICAL ENGINEERING LABORATORY
7290C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7291C                 GAITHERSBURG, MD 20899-8980
7292C                 PHONE:  301-975-2899
7293C     ORIGINAL VERSION--JANUARY  2010.
7294C
7295C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7296C
7297C---------------------------------------------------------------------
7298C
7299      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
7300C
7301      INCLUDE 'DPCOP2.INC'
7302C
7303C---------------------------------------------------------------------
7304C
7305      DATA PI/ 3.14159265358979D+00/
7306C
7307C-----START POINT-----------------------------------------------------
7308C
7309C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
7310C
7311      IF(X.LT.0.0D0)THEN
7312        WRITE(ICOUT,1)
7313        CALL DPWRST('XXX','BUG ')
7314        WRITE(ICOUT,46)X
7315        CALL DPWRST('XXX','BUG ')
7316        GOTO9000
7317      ELSEIF(ALPHA.LE.0.0D0)THEN
7318        WRITE(ICOUT,2)
7319        CALL DPWRST('XXX','BUG ')
7320        WRITE(ICOUT,46)ALPHA
7321        CALL DPWRST('XXX','BUG ')
7322        GOTO9000
7323      ENDIF
7324    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ATNPDF IS NEGATIVE.')
7325    2 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ATNPDF IS ',
7326     1       'NON-POSITIVE.')
7327   46 FORMAT('      THE ARGUMENT HAS THE VALUE ',G15.7)
7328C
7329      TERM1=ATAN(ALPHA*PHI) + PI/2.0D0
7330      TERM2=1.0D0 + ALPHA**2*(X - PHI)**2
7331      PDF=ALPHA/(TERM1*TERM2)
7332C
7333 9000 CONTINUE
7334      RETURN
7335      END
7336      SUBROUTINE ATNPPF(P,PHI,ALPHA,PPF)
7337C
7338C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
7339C              FUNCTION VALUE FOR THE ARCTANGENT DISTRIBUTION
7340C
7341C              THIS DISTRIBUTION IS DEFINED FOR X >= 0 AND HAS
7342C              THE PERCENT POINT FUNCTION
7343C
7344C              G(P;PHI,ALPHA) = PHI + (1/ALPHA)*
7345C                               TAN((PI/2) - (1 - P)*(ARCTAN(ALPHA*PHI) +
7346C                               (PI/2))
7347C                               0 <= P < 1, ALPHA > 0
7348C
7349C              NOTE THAT PHI AND ALPHA ARE ANALOGOUS TO LOCATION AND
7350C              SCALE PARAMETERS.  HOWEVER, THEY ARE NOT TRUE LOCATION
7351C              AND SCALE PARAMETERS IN THE SENSE THAT
7352C
7353C                  G(P;PHI,ALPHA) = PHI * ALPHA*G(P;0,1)
7354C
7355C              DOES NOT HOLD.
7356C
7357C     INPUT  ARGUMENTS--P      = THE DOUBLE PRECISION VALUE AT
7358C                                WHICH THE PERCENT POINT
7359C                                FUNCTION IS TO BE EVALUATED.
7360C                     --PHI    = THE DOUBLE PRECISION PHASE SHIFT
7361C                                PARAMETER
7362C                     --ALPHA  = THE DOUBLE PRECISION SCALING PARAMETER
7363C     OUTPUT ARGUMENTS--PPF    = THE DOUBLE PRECISION PERCENT POINT
7364C                                FUNCTION VALUE.
7365C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT FUNCTION
7366C             VALUE PPF.
7367C     PRINTING--NONE.
7368C     RESTRICTIONS--NONE.
7369C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7370C     FORTRAN LIBRARY SUBROUTINES NEEDED--ATAN, TAN.
7371C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7372C     LANGUAGE--ANSI FORTRAN.
7373C     REFERENCES--GLEN AND LEMIS (1997), "THE ARCTANGENT SURVIVAL
7374C                 DISTRIBUTION", JOURNAL OF QUALITY TECHNOLOGY,
7375C                 VOL. 29, NO. 2.
7376C     WRITTEN BY--ALAN HECKERT
7377C                 STATISTICAL ENGINEERING LABORATORY
7378C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7379C                 GAITHERSBURG, MD 20899-8980
7380C                 PHONE:  301-975-2899
7381C     ORIGINAL VERSION--JANUIARY  2010.
7382C
7383C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7384C
7385C---------------------------------------------------------------------
7386C
7387      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
7388C
7389      INCLUDE 'DPCOP2.INC'
7390C
7391C---------------------------------------------------------------------
7392C
7393      DATA PI/ 3.14159265358979D+00/
7394C
7395C-----START POINT-----------------------------------------------------
7396C
7397C     CHECK THE INPUT ARGUMENTS FOR ERRORS.
7398C
7399      PPF=0.0D0
7400      IF(P.LT.0.0D0 .OR. P.GE.1.0D0)THEN
7401        WRITE(ICOUT,1)
7402        CALL DPWRST('XXX','BUG ')
7403        WRITE(ICOUT,46)P
7404        CALL DPWRST('XXX','BUG ')
7405        GOTO9000
7406      ELSEIF(ALPHA.LE.0.0D0)THEN
7407        WRITE(ICOUT,2)
7408        CALL DPWRST('XXX','BUG ')
7409        WRITE(ICOUT,46)ALPHA
7410        CALL DPWRST('XXX','BUG ')
7411        GOTO9000
7412      ENDIF
7413    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ATNPPF IS OUTSIDE ',
7414     1       'THE (0,1] INTERVAL.')
7415    2 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ATNPPF IS ',
7416     1       'NON-POSITIVE.')
7417   46 FORMAT('      THE ARGUMENT HAS THE VALUE ',G15.7)
7418C
7419      TERM1=(PI/2.0D0) - (1.0D0 - P)*(ATAN(ALPHA*PHI) + (PI/2.0D0))
7420      TERM2=TAN(TERM1)
7421      PPF=PHI + (1.0D0/ALPHA)*TERM2
7422C
7423 9000 CONTINUE
7424      RETURN
7425      END
7426      SUBROUTINE ATNRAN(N,PHI,ALPHA,ISEED,X)
7427C
7428C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
7429C              FROM THE ARCTANGENT DISTRIBUTION WITH SHAPE PARAMETERS
7430C              PHI AND ALPHA.
7431C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER OF RANDOM
7432C                                NUMBERS TO BE GENERATED.
7433C                     --PHI    = THE SINGLE PRECISION PHASE SHIFT
7434C                                PARAMETER.
7435C                     --ALPHA  = THE SINGLE PRECISION SCALING PARAMETER.
7436C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR (OF DIMENSION
7437C                                AT LEAST N) INTO WHICH THE GENERATED
7438C                                RANDOM SAMPLE WILL BE PLACED.
7439C     OUTPUT--A RANDOM SAMPLE OF SIZE N
7440C             FROM THE ARCTANGENT DISTRIBUTION
7441C             WITH SHAPE PARAMETERS PHI AND ALPHA.
7442C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
7443C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
7444C                   OF N FOR THIS SUBROUTINE.
7445C                 --ALPHA > 0
7446C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, ATNPPF.
7447C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
7448C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
7449C     LANGUAGE--ANSI FORTRAN (1977)
7450C     REFERENCES--GLEN AND LEMIS (1997), "THE ARCTANGENT SURVIVAL
7451C                 DISTRIBUTION", JOURNAL OF QUALITY TECHNOLOGY,
7452C                 VOL. 29, NO. 2.
7453C     WRITTEN BY--ALAN HECKERT
7454C                 STATISTICAL ENGINEERING DIVISION
7455C                 INFORMATION TECHNOLOGY LABORATORY
7456C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7457C                 GAITHERSBURG, MD 20899-8980
7458C                 PHONE--301-975-2899
7459C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
7460C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
7461C     LANGUAGE--ANSI FORTRAN (1977)
7462C     VERSION NUMBER--2011.1
7463C     ORIGINAL VERSION--JANUARY   2011.
7464C
7465C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7466C
7467C---------------------------------------------------------------------
7468C
7469      DIMENSION X(*)
7470C
7471      DOUBLE PRECISION DXOUT
7472C
7473C---------------------------------------------------------------------
7474C
7475      INCLUDE 'DPCOP2.INC'
7476C
7477C-----START POINT-----------------------------------------------------
7478C
7479C     CHECK THE INPUT ARGUMENTS FOR ERRORS
7480C
7481      IF(N.LT.1)THEN
7482        WRITE(ICOUT, 5)
7483        CALL DPWRST('XXX','BUG ')
7484        WRITE(ICOUT,47)N
7485        CALL DPWRST('XXX','BUG ')
7486        GOTO9000
7487      ENDIF
7488      IF(ALPHA.LE.0.0)THEN
7489        WRITE(ICOUT,15)
7490        CALL DPWRST('XXX','BUG ')
7491        WRITE(ICOUT,46)ALPHA
7492        CALL DPWRST('XXX','BUG ')
7493        GOTO9000
7494      ENDIF
7495    5 FORMAT('***** ERROR--THE NUMBER OF ARCTANGENT RANDOM ',
7496     1'NUMBERS IS NON-POSITIVE.')
7497   15 FORMAT('***** ERROR--THE SHAPE PARAMETER ALPHA FOR THE ',
7498     1'ARCTANGENT RANDOM NUMBERS IS NON-POSITIVE.')
7499   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
7500   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
7501C
7502C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
7503C
7504      CALL UNIRAN(N,ISEED,X)
7505C
7506C     GENERATE N ARCTANGENT DISTRIBUTION RANDOM NUMBERS
7507C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
7508C
7509      DO100I=1,N
7510        CALL ATNPPF(DBLE(X(I)),DBLE(PHI),DBLE(ALPHA),DXOUT)
7511        X(I)=REAL(DXOUT)
7512  100 CONTINUE
7513C
7514 9000 CONTINUE
7515      RETURN
7516      END
7517      SUBROUTINE AUTOCR(X,N,IWRITE,XAUTCR,IBUGA3,IERROR)
7518C
7519C     PURPOSE--THIS SUBROUTINE COMPUTES THE
7520C              SAMPLE AUTOCORRELATION COEFFICIENT
7521C              OF THE DATA IN THE INPUT VECTOR X.
7522C              THE SAMPLE AUTOCORRELATION COEFFICIENT =  THE CORRELATION
7523C              BETWEEN X(I) AND X(I+1) OVER THE ENTIRE SAMPLE.
7524C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
7525C                                (UNSORTED) OBSERVATIONS.
7526C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
7527C                                IN THE VECTOR X.
7528C     OUTPUT ARGUMENTS--XAUTCR = THE SINGLE PRECISION VALUE OF THE
7529C                                COMPUTED SAMPLE AUTOCORRELATION
7530C                                COEFFICIENT.
7531C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
7532C             SAMPLE AUTOCORRELATION COEFFICIENT.
7533C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
7534C                   OF N FOR THIS SUBROUTINE.
7535C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7536C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT.
7537C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
7538C     LANGUAGE--ANSI FORTRAN (1977)
7539C     REFERENCES--JENKINS AND WATTS, SPECTRAL ANALYSIS AND
7540C                 ITS APPLICATIONS, 1968, PAGES 5, 182,
7541C                 FORMULA 5.3.33
7542C     WRITTEN BY--JAMES J. FILLIBEN
7543C                 STATISTICAL ENGINEERING DIVISION
7544C                 INFORMATION TECHNOLOGY LABORATORY
7545C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7546C                 GAITHERSBURG, MD 20899-8980
7547C                 PHONE--301-921-3651
7548C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
7549C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
7550C     LANGUAGE--ANSI FORTRAN (1977)
7551C     VERSION NUMBER--82/7
7552C     ORIGINAL VERSION--JUNE      1972.
7553C     UPDATED         --SEPTEMBER 1975.
7554C     UPDATED         --NOVEMBER  1975.
7555C     UPDATED         --JUNE      1979.
7556C     UPDATED         --AUGUST    1981.
7557C     UPDATED         --MAY       1982.
7558C     UPDATED         --JULY      1993.CHANGE DEF. TO BJ, 182, 5.3.33
7559C
7560C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7561C
7562      CHARACTER*4 IWRITE
7563      CHARACTER*4 IBUGA3
7564      CHARACTER*4 IERROR
7565C
7566      CHARACTER*4 ISUBN1
7567      CHARACTER*4 ISUBN2
7568C
7569C---------------------------------------------------------------------
7570C
7571      DOUBLE PRECISION DN
7572      DOUBLE PRECISION DX
7573      DOUBLE PRECISION DX1
7574      DOUBLE PRECISION DX2
7575      DOUBLE PRECISION DSUM
7576      DOUBLE PRECISION DMEAN
7577      DOUBLE PRECISION DDENOM
7578      DOUBLE PRECISION DSUM12
7579C
7580      DIMENSION X(*)
7581C
7582C---------------------------------------------------------------------
7583C
7584      INCLUDE 'DPCOP2.INC'
7585C
7586C-----START POINT-----------------------------------------------------
7587C
7588      ISUBN1='AUTO'
7589      ISUBN2='CR  '
7590      IERROR='NO'
7591C
7592      DN=0.0D0
7593      DMEAN=0.0D0
7594      DSUM12=0.0D0
7595      DDENOM=0.0D0
7596C
7597      IF(IBUGA3.EQ.'ON')THEN
7598        WRITE(ICOUT,999)
7599  999   FORMAT(1X)
7600        CALL DPWRST('XXX','BUG ')
7601        WRITE(ICOUT,51)
7602   51   FORMAT('***** AT THE BEGINNING OF AUTOCR--')
7603        CALL DPWRST('XXX','BUG ')
7604        WRITE(ICOUT,52)IBUGA3,N
7605   52   FORMAT('IBUGA3,N = ',A4,2X,I10)
7606        CALL DPWRST('XXX','BUG ')
7607        DO55I=1,N
7608          WRITE(ICOUT,56)I,X(I)
7609   56     FORMAT('I,X(I) = ',I8,G15.7)
7610          CALL DPWRST('XXX','BUG ')
7611   55   CONTINUE
7612      ENDIF
7613C
7614C               *******************************************
7615C               **  COMPUTE AUTOCORRELATION COEFFICIENT  **
7616C               *******************************************
7617C
7618C               ********************************************
7619C               **  STEP 1--                              **
7620C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
7621C               ********************************************
7622C
7623      AN=N
7624C
7625      IF(N.LT.1)THEN
7626        WRITE(ICOUT,999)
7627        CALL DPWRST('XXX','BUG ')
7628        WRITE(ICOUT,111)
7629  111   FORMAT('***** ERROR IN AUTOCORRELATION--')
7630        CALL DPWRST('XXX','BUG ')
7631        WRITE(ICOUT,112)
7632  112   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
7633     1         'VARIABLE')
7634        CALL DPWRST('XXX','BUG ')
7635        WRITE(ICOUT,115)
7636  115   FORMAT('      COMPUTED, MUST BE 1 OR LARGER.')
7637        CALL DPWRST('XXX','BUG ')
7638        WRITE(ICOUT,117)N
7639  117   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
7640        CALL DPWRST('XXX','BUG ')
7641        IERROR='YES'
7642        GOTO9000
7643      ENDIF
7644C
7645      IF(N.EQ.1)THEN
7646        XAUTCR=1.0
7647        GOTO9000
7648      ENDIF
7649C
7650      HOLD=X(1)
7651      DO135I=2,N
7652      IF(X(I).NE.HOLD)GOTO139
7653  135 CONTINUE
7654CCCCC WRITE(ICOUT,999)
7655CCCCC CALL DPWRST('XXX','BUG ')
7656CCCCC WRITE(ICOUT,136)HOLD
7657CC136 FORMAT('***** NON-FATAL DIAGNOSTIC IN AUTOCR--',
7658CCCCC1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
7659CCCCC CALL DPWRST('XXX','BUG ')
7660      XAUTCR=1.0
7661      GOTO9000
7662  139 CONTINUE
7663C
7664C               ************************************************
7665C               **  STEP 2--                                  **
7666C               **  COMPUTE THE AUTOCORRELATION COEFFICIENT.  **
7667C               ************************************************
7668C
7669CCCCC THE FOLLOWING SECTION WAS REWRITTEN JULY 1993
7670      DN=N
7671      DSUM=0.0D0
7672      DO200I=1,N
7673        DX=X(I)
7674        DSUM=DSUM+DX
7675  200 CONTINUE
7676      DMEAN=DSUM/DN
7677C
7678CCCCC THE FOLLOWING SECTION WAS ADDED  JULY 1993
7679      DSUM=0.0D0
7680      DO250I=1,N
7681        DX=X(I)
7682        DSUM=DSUM+(DX-DMEAN)**2
7683  250 CONTINUE
7684      DDENOM=DSUM
7685C
7686CCCCC THE FOLLOWING SECTION WAS REWRITTEN JULY 1993
7687      NM1=N-1
7688      DSUM12=0.0D0
7689      DO300I=1,NM1
7690        IP1=I+1
7691        DX1=X(I)
7692        DX2=X(IP1)
7693        DSUM12=DSUM12+(DX1-DMEAN)*(DX2-DMEAN)
7694  300 CONTINUE
7695      XAUTCR=1.0
7696      IF(DDENOM.GT.0.0D0)XAUTCR=DSUM12/DDENOM
7697C
7698C               *******************************
7699C               **  STEP 3--                 **
7700C               **  WRITE OUT A LINE         **
7701C               **  OF SUMMARY INFORMATION.  **
7702C               *******************************
7703C
7704      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
7705        WRITE(ICOUT,999)
7706        CALL DPWRST('XXX','BUG ')
7707        WRITE(ICOUT,811)N,XAUTCR
7708  811   FORMAT('THE LAG-ONE AUTOCORRELATION COEFFICIENT OF THE ',
7709     1         I8,' OBSERVATIONS = ',G15.7)
7710        CALL DPWRST('XXX','BUG ')
7711      ENDIF
7712C
7713C               *****************
7714C               **  STEP 90--  **
7715C               **  EXIT.      **
7716C               *****************
7717C
7718 9000 CONTINUE
7719      IF(IBUGA3.EQ.'ON')THEN
7720        WRITE(ICOUT,999)
7721        CALL DPWRST('XXX','BUG ')
7722        WRITE(ICOUT,9011)
7723 9011   FORMAT('***** AT THE END       OF AUTOCR--')
7724        CALL DPWRST('XXX','BUG ')
7725        WRITE(ICOUT,9014)DN,DMEAN,DDENOM,DSUM12
7726 9014   FORMAT('DN,DMEAN,DDENOM,DSUM12 = ',4D15.7)
7727        CALL DPWRST('XXX','BUG ')
7728        WRITE(ICOUT,9015)XAUTCR,IERROR
7729 9015   FORMAT('XAUTCR,IERROR = ',G15.7,2X,A4)
7730        CALL DPWRST('XXX','BUG ')
7731      ENDIF
7732C
7733      RETURN
7734      END
7735      SUBROUTINE AUTOCV(X,N,IWRITE,XAUTCV,IBUGA3,IERROR)
7736C
7737C     PURPOSE--THIS SUBROUTINE COMPUTES THE
7738C              SAMPLE AUTOCOVARIANCE COEFFICIENT
7739C              OF THE DATA IN THE INPUT VECTOR X.
7740C              THE SAMPLE AUTOCOVARIANCE COEFFICIENT =  THE COVARIANCE
7741C              BETWEEN X(I) AND X(I+1) OVER THE ENTIRE SAMPLE.
7742C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
7743C                                (UNSORTED) OBSERVATIONS.
7744C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
7745C                                IN THE VECTOR X.
7746C     OUTPUT ARGUMENTS--XAUTCV = THE SINGLE PRECISION VALUE OF THE
7747C                                COMPUTED SAMPLE AUTOCOVARIANCE
7748C                                COEFFICIENT.
7749C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
7750C             SAMPLE AUTOCOVARIANCE COEFFICIENT.
7751C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
7752C                   OF N FOR THIS SUBROUTINE.
7753C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
7754C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
7755C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
7756C     LANGUAGE--ANSI FORTRAN (1977)
7757C     REFERENCES--JENKINS AND WATTS, SPECTRAL ANALYSIS AND
7758C                 ITS APPLICATIONS, 1968, PAGES 5, 180,
7759C                 FORMULA 5.3.25.
7760C     WRITTEN BY--JAMES J. FILLIBEN
7761C                 STATISTICAL ENGINEERING DIVISION
7762C                 INFORMATION TECHNOLOGY LABORATORY
7763C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
7764C                 GAITHERSBURG, MD 20899-8980
7765C                 PHONE--301-921-3651
7766C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
7767C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
7768C     LANGUAGE--ANSI FORTRAN (1966)
7769C     VERSION NUMBER--82/7
7770C     ORIGINAL VERSION--JUNE      1972.
7771C     UPDATED         --SEPTEMBER 1975.
7772C     UPDATED         --NOVEMBER  1975.
7773C     UPDATED         --JUNE      1979.
7774C     UPDATED         --AUGUST    1981.
7775C     UPDATED         --MAY       1982.
7776C     UPDATED         --JULY      1993.CHANGE DEF. TO BJ, 180, 5.3.25
7777C
7778C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
7779C
7780      CHARACTER*4 IWRITE
7781      CHARACTER*4 IBUGA3
7782      CHARACTER*4 IERROR
7783C
7784      CHARACTER*4 ISUBN1
7785      CHARACTER*4 ISUBN2
7786C
7787C---------------------------------------------------------------------
7788C
7789      DOUBLE PRECISION DN
7790      DOUBLE PRECISION DX
7791      DOUBLE PRECISION DX1
7792      DOUBLE PRECISION DX2
7793      DOUBLE PRECISION DSUM
7794CCCCC DOUBLE PRECISION DSUM1
7795CCCCC DOUBLE PRECISION DSUM2
7796      DOUBLE PRECISION DSUM12
7797      DOUBLE PRECISION DMEAN
7798C
7799      DIMENSION X(*)
7800C
7801C---------------------------------------------------------------------
7802C
7803      INCLUDE 'DPCOP2.INC'
7804C
7805C-----START POINT-----------------------------------------------------
7806C
7807      ISUBN1='AUTO'
7808      ISUBN2='CV  '
7809C
7810      IERROR='NO'
7811C
7812      DN=0.0D0
7813      DMEAN=0.0D0
7814      DSUM12=0.0D0
7815C
7816      IF(IBUGA3.EQ.'OFF')GOTO90
7817      WRITE(ICOUT,999)
7818  999 FORMAT(1X)
7819      CALL DPWRST('XXX','BUG ')
7820      WRITE(ICOUT,51)
7821   51 FORMAT('***** AT THE BEGINNING OF AUTOCV--')
7822      CALL DPWRST('XXX','BUG ')
7823      WRITE(ICOUT,52)IBUGA3
7824   52 FORMAT('IBUGA3 = ',A4)
7825      CALL DPWRST('XXX','BUG ')
7826      WRITE(ICOUT,53)N
7827   53 FORMAT('N = ',I8)
7828      CALL DPWRST('XXX','BUG ')
7829      DO55I=1,N
7830      WRITE(ICOUT,56)I,X(I)
7831   56 FORMAT('I,X(I) = ',I8,E15.7)
7832      CALL DPWRST('XXX','BUG ')
7833   55 CONTINUE
7834   90 CONTINUE
7835C
7836C               *******************************************
7837C               **  COMPUTE AUTOCOVARIANCE  COEFFICIENT  **
7838C               *******************************************
7839C
7840C               ********************************************
7841C               **  STEP 1--                              **
7842C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
7843C               ********************************************
7844C
7845      AN=N
7846C
7847      IF(N.GE.1)GOTO119
7848      IERROR='YES'
7849      WRITE(ICOUT,999)
7850      CALL DPWRST('XXX','BUG ')
7851      WRITE(ICOUT,111)
7852  111 FORMAT('***** ERROR IN AUTOCV--')
7853      CALL DPWRST('XXX','BUG ')
7854      WRITE(ICOUT,112)
7855  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
7856      CALL DPWRST('XXX','BUG ')
7857      WRITE(ICOUT,113)
7858  113 FORMAT('      IN THE VARIABLE FOR WHICH')
7859      CALL DPWRST('XXX','BUG ')
7860      WRITE(ICOUT,114)
7861  114 FORMAT('      THE AUTOCOVARIANCE COEFFICIENT IS TO BE')
7862      CALL DPWRST('XXX','BUG ')
7863      WRITE(ICOUT,115)
7864  115 FORMAT('      COMPUTED, MUST BE 1 OR LARGER.')
7865      CALL DPWRST('XXX','BUG ')
7866      WRITE(ICOUT,116)
7867  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
7868      CALL DPWRST('XXX','BUG ')
7869      WRITE(ICOUT,117)N
7870  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
7871     1'.')
7872      CALL DPWRST('XXX','BUG ')
7873      GOTO9000
7874  119 CONTINUE
7875C
7876      IF(N.EQ.1)GOTO120
7877      GOTO129
7878  120 CONTINUE
7879      WRITE(ICOUT,999)
7880      CALL DPWRST('XXX','BUG ')
7881      WRITE(ICOUT,121)
7882  121 FORMAT('***** NON-FATAL DIAGNOSTIC IN AUTOCV--',
7883     1'THE SECOND INPUT ARGUMENT (N) HAS THE VALUE 1')
7884      CALL DPWRST('XXX','BUG ')
7885      XAUTCV=0.0
7886      GOTO9000
7887  129 CONTINUE
7888C
7889      HOLD=X(1)
7890      DO135I=2,N
7891      IF(X(I).NE.HOLD)GOTO139
7892  135 CONTINUE
7893      WRITE(ICOUT,999)
7894      CALL DPWRST('XXX','BUG ')
7895      WRITE(ICOUT,136)HOLD
7896  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN AUTOCV--',
7897     1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
7898      CALL DPWRST('XXX','BUG ')
7899      XAUTCV=0.0
7900      GOTO9000
7901  139 CONTINUE
7902C
7903C               ************************************************
7904C               **  STEP 2--                                  **
7905C               **  COMPUTE THE AUTOCOVARIANCE  COEFFICIENT.  **
7906C               ************************************************
7907C
7908CCCCC THE FOLLOWING SECTION WAS CHANGED JULY 1993
7909      DN=N
7910      DSUM=0.0D0
7911      DO200I=1,N
7912      DX=X(I)
7913      DSUM=DSUM+DX
7914  200 CONTINUE
7915      DMEAN=DSUM/DN
7916C
7917CCCCC THE FOLLOWING SECTION WAS CHANGED JULY 1993
7918      NM1=N-1
7919      DSUM12=0.0D0
7920      DO300I=1,NM1
7921      IP1=I+1
7922      DX1=X(I)
7923      DX2=X(IP1)
7924      DSUM12=DSUM12+(DX1-DMEAN)*(DX2-DMEAN)
7925  300 CONTINUE
7926      XAUTCV=DSUM12/DN
7927C
7928C               *******************************
7929C               **  STEP 3--                 **
7930C               **  WRITE OUT A LINE         **
7931C               **  OF SUMMARY INFORMATION.  **
7932C               *******************************
7933C
7934      IF(IFEEDB.EQ.'OFF')GOTO890
7935      IF(IWRITE.EQ.'OFF')GOTO890
7936      WRITE(ICOUT,999)
7937      CALL DPWRST('XXX','BUG ')
7938      WRITE(ICOUT,811)N,XAUTCV
7939  811 FORMAT('THE LAG-ONE AUTOCOVARIANCE COEFFICIENT OF THE ',
7940     1I8,' OBSERVATIONS = ',E15.7)
7941      CALL DPWRST('XXX','BUG ')
7942  890 CONTINUE
7943C
7944C               *****************
7945C               **  STEP 90--  **
7946C               **  EXIT.      **
7947C               *****************
7948C
7949 9000 CONTINUE
7950      IF(IBUGA3.EQ.'OFF')GOTO9090
7951      WRITE(ICOUT,999)
7952      CALL DPWRST('XXX','BUG ')
7953      WRITE(ICOUT,9011)
7954 9011 FORMAT('***** AT THE END       OF AUTOCV--')
7955      CALL DPWRST('XXX','BUG ')
7956      WRITE(ICOUT,9012)IBUGA3,IERROR
7957 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
7958      CALL DPWRST('XXX','BUG ')
7959      WRITE(ICOUT,9013)N
7960 9013 FORMAT('N = ',I8)
7961      CALL DPWRST('XXX','BUG ')
7962      WRITE(ICOUT,9014)DN,DMEAN,DSUM12
7963 9014 FORMAT('DN,DMEAN,DSUM12 = ',3D15.7)
7964      CALL DPWRST('XXX','BUG ')
7965      WRITE(ICOUT,9015)XAUTCV
7966 9015 FORMAT('XAUTCV = ',E15.7)
7967      CALL DPWRST('XXX','BUG ')
7968 9090 CONTINUE
7969C
7970      RETURN
7971      END
7972      REAL FUNCTION AJV(SNV, ITYPE, GAMMA, DELTA, XLAM, XI, IFAULT)
7973CSTART OF AS 100
7974C
7975C        ALGORITHM AS 100.1  APPL. STATIST. (1976) VOL.25, P.190
7976C
7977C        CONVERTS A STANDARD NORMAL VARIATE (SNV) TO A
7978C        JOHNSON VARIATE (AJV)
7979C
7980      REAL SNV, GAMMA, DELTA, XLAM, XI, V, W, ZERO, HALF, ONE,
7981     $  ZABS, ZEXP, ZSIGN
7982C
7983      DATA ZERO, HALF, ONE /0.0, 0.5, 1.0/
7984C
7985      ZABS(W) = ABS(W)
7986      ZEXP(W) = EXP(W)
7987      ZSIGN(W, V) = SIGN(W, V)
7988C
7989      AJV = ZERO
7990      IFAULT = 1
7991      IF (ITYPE .LT. 1 .OR. ITYPE .GT. 4) RETURN
7992      IFAULT = 0
7993      GOTO (10, 20, 30, 40), ITYPE
7994C
7995C        SL DISTRIBUTION
7996C
7997   10 AJV = XLAM * ZEXP((XLAM * SNV - GAMMA) / DELTA) + XI
7998      RETURN
7999C
8000C        SU DISTRIBUTION
8001C
8002   20 W = ZEXP((SNV - GAMMA) / DELTA)
8003      W = HALF * (W - ONE / W)
8004      AJV = XLAM * W + XI
8005      RETURN
8006C
8007C        SB DISTRIBUTION
8008C
8009   30 W = (SNV - GAMMA) / DELTA
8010      V = ZEXP(-ZABS(W))
8011      V = (ONE - V) / (ONE + V)
8012      AJV = HALF * XLAM * (ZSIGN(V, W) + ONE) + XI
8013      RETURN
8014C
8015C        NORMAL DISTRIBUTION
8016C
8017   40 AJV = (SNV - GAMMA) / DELTA
8018      RETURN
8019      END
8020      SUBROUTINE B2INK(X,NX,Y,NY,FCN,LDF,KX,KY,TX,TY,BCOEF,
8021     1                 WORK,ISPACE,IFLAG)
8022C***BEGIN PROLOGUE  B2INK
8023C***DATE WRITTEN   25 MAY 1982
8024C***REVISION DATE  25 MAY 1982
8025C***CATEGORY NO.  E1A
8026C***KEYWORDS  INTERPOLATION, TWO-DIMENSIONS, GRIDDED DATA, SPLINES,
8027C             PIECEWISE POLYNOMIALS
8028C***AUTHOR  BOISVERT, RONALD, NBS
8029C             SCIENTIFIC COMPUTING DIVISION
8030C             NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
8031C             WASHINGTON, DC 20234
8032C***PURPOSE  B2INK DETERMINES A PIECEWISE POLYNOMIAL FUNCTION THAT
8033C            INTERPOLATES TWO-DIMENSIONAL GRIDDED DATA. USERS SPECIFY
8034C            THE POLYNOMIAL ORDER (DEGREE+1) OF THE INTERPOLANT AND
8035C            (OPTIONALLY) THE KNOT SEQUENCE.
8036C***DESCRIPTION
8037C
8038C   B2INK determines the parameters of a function that interpolates the
8039C   two-dimensional gridded data (X(i),Y(j),FCN(i,j)) for i=1,..,NX and
8040C   j=1,..,NY. The  interpolating  function  and  its  derivatives  may
8041C   subsequently be evaluated by the function B2VAL.
8042C
8043C   The interpolating  function  is  a  piecewise  polynomial  function
8044C   represented as a tensor product of one-dimensional  B-splines.  The
8045C   form of this function is
8046C
8047C                          NX   NY
8048C              S(x,y)  =  SUM  SUM  a   U (x) V (y)
8049C                         i=1  j=1   ij  i     j
8050C
8051C   where the functions U(i)  and  V(j)  are  one-dimensional  B-spline
8052C   basis functions. The coefficients a(i,j) are chosen so that
8053C
8054C         S(X(i),Y(j)) = FCN(i,j)   for i=1,..,NX and j=1,..,NY
8055C
8056C   Note that  for  each  fixed  value  of  y  S(x,y)  is  a  piecewise
8057C   polynomial function of x alone, and for each fixed value of x  S(x,
8058C   y) is a piecewise polynomial function of y alone. In one  dimension
8059C   a piecewise polynomial may  be  created  by  partitioning  a  given
8060C   interval into subintervals and defining a distinct polynomial piece
8061C   on each one. The points where adjacent subintervals meet are called
8062C   knots. Each of the functions U(i) and V(j)  above  is  a  piecewise
8063C   polynomial.
8064C
8065C   Users of B2INK choose the order (degree+1) of the polynomial pieces
8066C   used to define the piecewise polynomial in each  of  the  x  and  y
8067C   directions (KX and KY).  Users  also  may  define  their  own  knot
8068C   sequence in x and y separately (TX and TY).  If  IFLAG=0,  however,
8069C   B2INK will choose sequences of knots that  result  in  a  piecewise
8070C   polynomial interpolant with KX-2 continuous partial derivatives  in
8071C   x and KY-2 continuous partial derivatives in y. (KX knots are taken
8072C   near each endpoint, not-a-knot end conditions  are  used,  and  the
8073C   remaining knots are placed at data points  if  KX  is  even  or  at
8074C   midpoints between data points if KX is  odd.  The  y  direction  is
8075C   treated similarly.)
8076C
8077C   After a call to B2INK, all  information  necessary  to  define  the
8078C   interpolating function are contained in the parameters NX, NY,  KX,
8079C   KY, TX, TY, and BCOEF. These quantities should not be altered until
8080C   after the last call of the evaluation routine B2VAL.
8081C
8082C
8083C   I N P U T
8084C   ---------
8085C
8086C   X       Real 1D array (size NX)
8087C           Array of x abcissae. Must be strictly increasing.
8088C
8089C   NX      Integer scalar (.GE. 3)
8090C           Number of x abcissae.
8091C
8092C   Y       Real 1D array (size NY)
8093C           Array of y abcissae. Must be strictly increasing.
8094C
8095C   NY      Integer scalar (.GE. 3)
8096C           Number of y abcissae.
8097C
8098C   FCN     Real 2D array (size LDF by NY)
8099C           Array of function values to interpolate. FCN(I,J) should
8100C           contain the function value at the point (X(I),Y(J))
8101C
8102C   LDF     Integer scalar (.GE. NX)
8103C           The actual leading dimension of FCN used in the calling
8104C           calling program.
8105C
8106C   KX      Integer scalar (.GE. 2, .LT. NX)
8107C           The order of spline pieces in x.
8108C           (Order = polynomial degree + 1)
8109C
8110C   KY      Integer scalar (.GE. 2, .LT. NY)
8111C           The order of spline pieces in y.
8112C           (Order = polynomial degree + 1)
8113C
8114C
8115C   I N P U T   O R   O U T P U T
8116C   -----------------------------
8117C
8118C   TX      Real 1D array (size NX+KX)
8119C           The knots in the x direction for the spline interpolant.
8120C           If IFLAG=0 these are chosen by B2INK.
8121C           If IFLAG=1 these are specified by the user.
8122C                      (Must be non-decreasing.)
8123C
8124C   TY      Real 1D array (size NY+KY)
8125C           The knots in the y direction for the spline interpolant.
8126C           If IFLAG=0 these are chosen by B2INK.
8127C           If IFLAG=1 these are specified by the user.
8128C                      (Must be non-decreasing.)
8129C
8130C
8131C   O U T P U T
8132C   -----------
8133C
8134C   BCOEF   Real 2D array (size NX by NY)
8135C           Array of coefficients of the B-spline interpolant.
8136C           This may be the same array as FCN.
8137C
8138C
8139C   M I S C E L L A N E O U S
8140C   -------------------------
8141C
8142C   WORK    Real 1D array (size NX*NY + max( 2*KX*(NX+1),
8143C                                  2*KY*(NY+1) ))
8144C           Array of working storage.
8145C
8146C   IFLAG   Integer scalar.
8147C           On input:  0 == knot sequence chosen by B2INK
8148C                      1 == knot sequence chosen by user.
8149C           On output: 1 == successful execution
8150C                      2 == IFLAG out of range
8151C                      3 == NX out of range
8152C                      4 == KX out of range
8153C                      5 == X not strictly increasing
8154C                      6 == TX not non-decreasing
8155C                      7 == NY out of range
8156C                      8 == KY out of range
8157C                      9 == Y not strictly increasing
8158C                     10 == TY not non-decreasing
8159C
8160C***REFERENCES  CARL DE BOOR, A PRACTICAL GUIDE TO SPLINES,
8161C                 SPRINGER-VERLAG, NEW YORK, 1978.
8162C               CARL DE BOOR, EFFICIENT COMPUTER MANIPULATION OF TENSOR
8163C                 PRODUCTS, ACM TRANSACTIONS ON MATHEMATICAL SOFTWARE,
8164C                 VOL. 5 (1979), PP. 173-182.
8165C***ROUTINES CALLED  BTPCF,BKNOT
8166C***END PROLOGUE  B2INK
8167C
8168C  ------------
8169C  DECLARATIONS
8170C  ------------
8171C
8172C  PARAMETERS
8173C
8174      INTEGER
8175     *        NX, NY, LDF, KX, KY, IFLAG
8176      REAL
8177     *     X(NX), Y(NY), FCN(LDF,NY), TX(*), TY(*), BCOEF(NX,NY),
8178     *     WORK(*)
8179C
8180C  LOCAL VARIABLES
8181C
8182      INTEGER
8183     *        I, IW, NPK
8184C
8185C---------------------------------------------------------------------
8186C
8187      INCLUDE 'DPCOP2.INC'
8188C
8189C
8190C  -----------------------
8191C  CHECK VALIDITY OF INPUT
8192C  -----------------------
8193C
8194C***FIRST EXECUTABLE STATEMENT
8195      IF ((IFLAG .LT. 0) .OR. (IFLAG .GT. 1))  THEN
8196         WRITE(ICOUT,999)
8197  999    FORMAT(1X)
8198         CALL DPWRST('XXX','BUG ')
8199         WRITE(ICOUT,921)IFLAG
8200  921    FORMAT('***** FROM B2INK -   IFLAG = ',I2,
8201     1          ' IS OUT OF RANGE. **')
8202         CALL DPWRST('XXX','BUG ')
8203         IFLAG = 2
8204         GO TO 9999
8205      ELSE IF (NX .LT. 3) THEN
8206         IFLAG = 3
8207         WRITE(ICOUT,999)
8208         CALL DPWRST('XXX','BUG ')
8209         WRITE(ICOUT,931)NX
8210         CALL DPWRST('XXX','BUG ')
8211  931    FORMAT('***** FROM B2INK -  NX = ',I4,
8212     1          ' IS OUT OF RANGE. *****')
8213         GO TO 9999
8214      ELSE IF (NY .LT. 3) THEN
8215         IFLAG = 7
8216         WRITE(ICOUT,999)
8217         CALL DPWRST('XXX','BUG ')
8218         WRITE(ICOUT,971)NY
8219         CALL DPWRST('XXX','BUG ')
8220  971    FORMAT('***** FROM B2INK - NY = ',I4,
8221     1          ' IS OUT OF RANGE. ****')
8222         GO TO 9999
8223      ELSE IF ((KX .LT. 2) .OR. (KX .GE. NX)) THEN
8224         IFLAG = 4
8225         WRITE(ICOUT,999)
8226         CALL DPWRST('XXX','BUG ')
8227         WRITE(ICOUT,941)KX
8228         CALL DPWRST('XXX','BUG ')
8229  941    FORMAT('***** FROM B2INK - KX = ',I4,
8230     1          ' IS OUT OF RANGE. *****')
8231         GO TO 9999
8232      ELSE IF ((KY .LT. 2) .OR. (KY .GE. NY)) THEN
8233         IFLAG = 8
8234         WRITE(ICOUT,999)
8235         CALL DPWRST('XXX','BUG ')
8236         WRITE(ICOUT,981)KY
8237         CALL DPWRST('XXX','BUG ')
8238  981    FORMAT('***** FROM B2INK - KY = ',I4,
8239     1          ' IS OUT OF RANGE. *****')
8240         GO TO 9999
8241      ELSE
8242        IVAL1=NX*NY
8243        IVAL2=2*KX*(NX+1)
8244        IVAL3=2*KY*(NY+1)
8245        IVAL=IVAL1 + MAX(IVAL2,IVAL3)
8246        IF(IVAL.GT.ISPACE)THEN
8247          IFLAG = 11
8248          WRITE(ICOUT,999)
8249          CALL DPWRST('XXX','BUG ')
8250          WRITE(ICOUT,1011)
8251 1011     FORMAT('***** FROM B2INK - INSUFFICIENT WORK SPACE.')
8252          CALL DPWRST('XXX','BUG ')
8253          WRITE(ICOUT,1013)IVAL
8254 1013     FORMAT('      REQUIRED WORK SPACE:  ',I10)
8255          CALL DPWRST('XXX','BUG ')
8256          WRITE(ICOUT,1015)ISPACE
8257 1015     FORMAT('      AVAILABLE WORK SPACE: ',I10)
8258          CALL DPWRST('XXX','BUG ')
8259          GO TO 9999
8260        ENDIF
8261      ENDIF
8262C
8263      DO 10 I=2,NX
8264         IF (X(I) .LE. X(I-1)) THEN
8265            IFLAG = 5
8266            WRITE(ICOUT,999)
8267            CALL DPWRST('XXX','BUG ')
8268            WRITE(ICOUT,951)
8269            CALL DPWRST('XXX','BUG ')
8270  951       FORMAT('***** FROM B2INK - X ARRAY MUST BE STRICTLY ',
8271     1             'INCREASING.')
8272            GO TO 9999
8273         ENDIF
8274   10 CONTINUE
8275C
8276      DO 20 I=2,NY
8277         IF (Y(I) .LE. Y(I-1)) THEN
8278            IFLAG = 9
8279            WRITE(ICOUT,999)
8280            CALL DPWRST('XXX','BUG ')
8281            WRITE(ICOUT,991)
8282            CALL DPWRST('XXX','BUG ')
8283  991       FORMAT('***** FROM B2INK - Y ARRAY MUST BE STRICTLY ',
8284     1             'INCREASING.')
8285            GO TO 9999
8286         ENDIF
8287   20 CONTINUE
8288C
8289      IF (IFLAG .EQ. 0)  GO TO 50
8290         NPK = NX + KX
8291         DO 30 I=2,NPK
8292            IF (TX(I) .LT. TX(I-1)) THEN
8293               IFLAG = 6
8294               WRITE(ICOUT,999)
8295               CALL DPWRST('XXX','BUG ')
8296               WRITE(ICOUT,961)
8297               CALL DPWRST('XXX','BUG ')
8298  961          FORMAT('***** FROM B2INK -   TX ARRAY MUST BE ',
8299     1                'NON-DECREASING.')
8300               GO TO 9999
8301            ENDIF
8302   30    CONTINUE
8303         NPK = NY + KY
8304         DO 40 I=2,NPK
8305            IF (TY(I) .LT. TY(I-1)) THEN
8306               IFLAG = 10
8307               WRITE(ICOUT,999)
8308               CALL DPWRST('XXX','BUG ')
8309               WRITE(ICOUT,1001)
8310               CALL DPWRST('XXX','BUG ')
8311 1001          FORMAT('***** FROM B2INK - TY ARRAY MUST BE ',
8312     1                'NON-DECREASING. ***')
8313               GO TO 9999
8314            ENDIF
8315   40    CONTINUE
8316   50 CONTINUE
8317C
8318C  ------------
8319C  CHOOSE KNOTS
8320C  ------------
8321C
8322      IF (IFLAG .NE. 0)  GO TO 100
8323         CALL BKNOT(X,NX,KX,TX)
8324         CALL BKNOT(Y,NY,KY,TY)
8325  100 CONTINUE
8326C
8327C  -------------------------------
8328C  CONSTRUCT B-SPLINE COEFFICIENTS
8329C  -------------------------------
8330C
8331      IFLAG = 1
8332      IW = NX*NY + 1
8333      CALL BTPCF(X,NX,FCN,LDF,NY,TX,KX,WORK,WORK(IW))
8334      CALL BTPCF(Y,NY,WORK,NY,NX,TY,KY,BCOEF,WORK(IW))
8335      GO TO 9999
8336C
8337C  -----
8338C  EXITS
8339C  -----
8340C
8341C
8342 9999 CONTINUE
8343      RETURN
8344      END
8345      REAL FUNCTION B2VAL(XVAL,YVAL,IDX,IDY,TX,TY,NX,NY,
8346     *  KX,KY,BCOEF,WORK)
8347C***BEGIN PROLOGUE  B2VAL
8348C***DATE WRITTEN   25 MAY 1982
8349C***REVISION DATE  25 MAY 1982
8350C***CATEGORY NO.  E1A
8351C***KEYWORDS  INTERPOLATION, TWO-DIMENSIONS, GRIDDED DATA, SPLINES,
8352C             PIECEWISE POLYNOMIALS
8353C***AUTHOR  BOISVERT, RONALD, NBS
8354C             SCIENTIFIC COMPUTING DIVISION
8355C             NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
8356C             WASHINGTON, DC 20234
8357C***PURPOSE  B2VAL EVALUATES THE PIECEWISE POLYNOMIAL INTERPOLATING
8358C            FUNCTION CONSTRUCTED BY THE ROUTINE B2INK OR ONE OF ITS
8359C            PARTIAL DERIVATIVES.
8360C***DESCRIPTION
8361C
8362C   B2VAL evaluates the tensor product piecewise polynomial interpolant
8363C   constructed by the routine B2INK or one of its derivatives  at  the
8364C   point (XVAL,YVAL). To evaluate the interpolant itself, set IDX=IDY=
8365C   0, to evaluate the first partial with respect to x, set  IDX=1,IDY=
8366C   0, and so on.
8367C
8368C   B2VAL returns 0.0E0 if (XVAL,YVAL) is out of range. That is, if
8369C            XVAL.LT.TX(1) .OR. XVAL.GT.TX(NX+KX) .OR.
8370C            YVAL.LT.TY(1) .OR. YVAL.GT.TY(NY+NY)
8371C   If the knots  TX  and  TY  were  chosen  by  B2INK,  then  this  is
8372C   equivalent to
8373C            XVAL.LT.X(1) .OR. XVAL.GT.X(NX)+EPSX .OR.
8374C            YVAL.LT.Y(1) .OR. YVAL.GT.Y(NY)+EPSY
8375C   where EPSX = 0.1*(X(NX)-X(NX-1)) and EPSY = 0.1*(Y(NY)-Y(NY-1)).
8376C
8377C   The input quantities TX, TY, NX, NY, KX, KY, and  BCOEF  should  be
8378C   unchanged since the last call of B2INK.
8379C
8380C
8381C   I N P U T
8382C   ---------
8383C
8384C   XVAL    Real scalar
8385C           X coordinate of evaluation point.
8386C
8387C   YVAL    Real scalar
8388C           Y coordinate of evaluation point.
8389C
8390C   IDX     Integer scalar
8391C           X derivative of piecewise polynomial to evaluate.
8392C
8393C   IDY     Integer scalar
8394C           Y derivative of piecewise polynomial to evaluate.
8395C
8396C   TX      Real 1D array (size NX+KX)
8397C           Sequence of knots defining the piecewise polynomial in
8398C           the x direction.  (Same as in last call to B2INK.)
8399C
8400C   TY      Real 1D array (size NY+KY)
8401C           Sequence of knots defining the piecewise polynomial in
8402C           the y direction.  (Same as in last call to B2INK.)
8403C
8404C   NX      Integer scalar
8405C           The number of interpolation points in x.
8406C           (Same as in last call to B2INK.)
8407C
8408C   NY      Integer scalar
8409C           The number of interpolation points in y.
8410C           (Same as in last call to B2INK.)
8411C
8412C   KX      Integer scalar
8413C           Order of polynomial pieces in x.
8414C           (Same as in last call to B2INK.)
8415C
8416C   KY      Integer scalar
8417C           Order of polynomial pieces in y.
8418C           (Same as in last call to B2INK.)
8419C
8420C   BCOEF   Real 2D array (size NX by NY)
8421C           The B-spline coefficients computed by B2INK.
8422C
8423C   WORK    Real 1D array (size 3*max(KX,KY) + KY)
8424C           A working storage array.
8425C
8426C***REFERENCES  CARL DE BOOR, A PRACTICAL GUIDE TO SPLINES,
8427C                 SPRINGER-VERLAG, NEW YORK, 1978.
8428C***ROUTINES CALLED  INTRV,BVALU
8429C***END PROLOGUE  B2VAL
8430C
8431C  ------------
8432C  DECLARATIONS
8433C  ------------
8434C
8435C  PARAMETERS
8436C
8437      INTEGER
8438     *        IDX, IDY, NX, NY, KX, KY
8439      REAL
8440     *     XVAL, YVAL, TX(*), TY(*), BCOEF(NX,NY), WORK(*)
8441C
8442C  LOCAL VARIABLES
8443C
8444      INTEGER
8445     *        ILOY, INBVX, INBV, K, LEFTY, MFLAG, KCOL, IW
8446      REAL
8447     *     BVALU
8448C
8449      DATA ILOY /1/,  INBVX /1/
8450C     SAVE ILOY    ,  INBVX
8451C
8452C
8453C***FIRST EXECUTABLE STATEMENT
8454      B2VAL = 0.0E0
8455      CALL INTRV(TY,NY+KY,YVAL,ILOY,LEFTY,MFLAG)
8456      IF (MFLAG .NE. 0)  GO TO 100
8457         IW = KY + 1
8458         KCOL = LEFTY - KY
8459         DO 50 K=1,KY
8460            KCOL = KCOL + 1
8461            WORK(K) = BVALU(TX,BCOEF(1,KCOL),NX,KX,IDX,XVAL,INBVX,
8462     *                      WORK(IW))
8463   50    CONTINUE
8464         INBV = 1
8465         KCOL = LEFTY - KY + 1
8466         B2VAL = BVALU(TY(KCOL),WORK,KY,KY,IDY,YVAL,INBV,WORK(IW))
8467  100 CONTINUE
8468      RETURN
8469      END
8470      SUBROUTINE BACK25(X2,M,N,RIGHT2,B,IBUGA3)
8471C
8472C     PURPOSE--BACK SOLVE A TRIANGULARIZED SYSTEM
8473C     WHICH (IT IS ASSUMED) HAS BEEN TRIANGULARIZED
8474C     AND RESIDES IN THE UPPER TRIANGLE OF X2(.,.)
8475C     AND THE RESPONSE VECTOR HAS BEEN CARRIED ALONG
8476C     AND THE MODIFIED RESPONSE VECTOR NOW RESIDES IN
8477C     THE (N+1)ST COLUMN OF X
8478C     NOTE--A CALL TO BACK25 IS TYPICALLY
8479C           PRECEEDED BY A CALL TO TRIA25
8480C           WHICH WILL CARRY OUT THE
8481C           TRIANGULARIZATION OF THE MATRIX.
8482C     NOTE--THE DIMENSIONS OF X2 MUST BE THE SAME
8483C           IN THE CALLING ROUTINE AS IN THIS SUBROUTINE.
8484C           THEY HAVE BEEN SET HEREIN TO 25 BY 25,
8485C           AND HENCE THE 25 IN THE NAME OF THIS SUBROUTINE (BACK25).
8486C     NOTE--BACK25 IS IDENTICAL TO BACK50 AND BACKSO
8487C           EXCEPT FOR THE DIMENSIONS.
8488C     WRITTEN BY--JAMES J. FILLIBEN
8489C                 STATISTICAL ENGINEERING DIVISION
8490C                 INFORMATION TECHNOLOGY LABORATORY
8491C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
8492C                 GAITHERSBURG, MD 20899-8980
8493C                 PHONE--301-921-3651
8494C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
8495C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
8496C     LANGUAGE--ANSI FORTRAN (1977)
8497C     VERSION NUMBER--82/7
8498C     ORIGINAL VERSION--FEBRUARY  1978.
8499C     UPDATED         --JULY      1981.
8500C     UPDATED         --AUGUST    1981.
8501C     UPDATED         --MAY       1982.
8502C
8503C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8504C
8505      CHARACTER*4 IBUGA3
8506C
8507      CHARACTER*4 ISUBN1
8508      CHARACTER*4 ISUBN2
8509C
8510C---------------------------------------------------------------------
8511C
8512      DIMENSION X2(25,25)
8513      DIMENSION RIGHT2(*)
8514      DIMENSION B(*)
8515C
8516C---------------------------------------------------------------------
8517C
8518      INCLUDE 'DPCOP2.INC'
8519C
8520C-----START POINT-----------------------------------------------------
8521C
8522      ISUBN1='BACK'
8523      ISUBN2='25  '
8524C
8525      IF(IBUGA3.EQ.'OFF')GOTO90
8526      WRITE(ICOUT,999)
8527  999 FORMAT(1X)
8528      CALL DPWRST('XXX','BUG ')
8529      WRITE(ICOUT,51)
8530   51 FORMAT('***** AT THE BEGINNING OF BACK25--')
8531      CALL DPWRST('XXX','BUG ')
8532      WRITE(ICOUT,52)M,N,IBUGA3
8533   52 FORMAT('M,N,IBUGA3 = ',2I8,2X,A4)
8534      CALL DPWRST('XXX','BUG ')
8535      DO55I=1,M
8536      WRITE(ICOUT,56)I,(X2(I,J),J=1,N)
8537   56 FORMAT('I,X2(I,.)  = ',I8,10E10.3)
8538      CALL DPWRST('XXX','BUG ')
8539   55 CONTINUE
8540      DO60I=1,M
8541      WRITE(ICOUT,61)I,RIGHT2(I)
8542   61 FORMAT('I,RIGHT2(I)= ',I8,E10.3)
8543      CALL DPWRST('XXX','BUG ')
8544   60 CONTINUE
8545   90 CONTINUE
8546C
8547      I=M
8548  100 CONTINUE
8549      SUM=0.0
8550      IP1=I+1
8551      IF(IP1.GT.M)GOTO250
8552      DO200J=IP1,M
8553      SUM=SUM+B(J)*X2(I,J)
8554  200 CONTINUE
8555  250 CONTINUE
8556      DEL=RIGHT2(I)-SUM
8557      B(I)=DEL/X2(I,I)
8558      I=I-1
8559      IF(I.GE.1)GOTO100
8560C
8561C               *****************
8562C               **  STEP 90--  **
8563C               **  EXIT       **
8564C               *****************
8565C
8566      IF(IBUGA3.EQ.'OFF')GOTO9090
8567      WRITE(ICOUT,999)
8568      CALL DPWRST('XXX','BUG ')
8569      WRITE(ICOUT,9011)
8570 9011 FORMAT('***** AT THE END       OF BACK25--')
8571      CALL DPWRST('XXX','BUG ')
8572      WRITE(ICOUT,9012)M,N,IBUGA3
8573 9012 FORMAT('M,N,IBUGA3 = ',2I8,2X,A4)
8574      CALL DPWRST('XXX','BUG ')
8575      DO9015I=1,M
8576      WRITE(ICOUT,9016)I,(X2(I,J),J=1,N)
8577 9016 FORMAT('I,X2(I,.)  = ',I8,10E10.3)
8578      CALL DPWRST('XXX','BUG ')
8579 9015 CONTINUE
8580      DO9020I=1,M
8581      WRITE(ICOUT,9021)I,RIGHT2(I),B(I)
8582 9021 FORMAT('I,RIGHT2(I),B(I) = ',I8,2E10.3)
8583      CALL DPWRST('XXX','BUG ')
8584 9020 CONTINUE
8585 9090 CONTINUE
8586C
8587      RETURN
8588      END
8589      SUBROUTINE BACK50(X2,M,N,RIGHT2,B,IBUGA3)
8590C
8591C     PURPOSE--BACK SOLVE A TRIANGULARIZED SYSTEM
8592C     WHICH (IT IS ASSUMED) HAS BEEN TRIANGULARIZED
8593C     AND RESIDES IN THE UPPER TRIANGLE OF X2(.,.)
8594C     AND THE RESPONSE VECTOR HAS BEEN CARRIED ALONG
8595C     AND THE MODIFIED RESPONSE VECTOR NOW RESIDES IN
8596C     THE (N+1)ST COLUMN OF X
8597C     NOTE--A CALL TO BACK50 IS TYPICALLY
8598C           PRECEEDED BY A CALL TO TRIA50
8599C           WHICH WILL CARRY OUT THE
8600C           TRIANGULARIZATION OF THE MATRIX.
8601C     NOTE--THE DIMENSIONS OF X2 MUST BE THE SAME
8602C           IN THE CALLING ROUTINE AS IN THIS SUBROUTINE.
8603C           THEY HAVE BEEN SET HEREIN TO 50 BY 50,
8604C           AND HENCE THE 50 IN THE NAME OF THIS SUBROUTINE (BACK50).
8605C     NOTE--BACK50 IS IDENTICAL TO BACK25 AND BACKSO
8606C           EXCEPT FOR THE DIMENSIONS.
8607C     WRITTEN BY--JAMES J. FILLIBEN
8608C                 STATISTICAL ENGINEERING DIVISION
8609C                 INFORMATION TECHNOLOGY LABORATORY
8610C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
8611C                 GAITHERSBURG, MD 20899-8980
8612C                 PHONE--301-921-3651
8613C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
8614C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
8615C     LANGUAGE--ANSI FORTRAN (1977)
8616C     VERSION NUMBER--82/7
8617C     ORIGINAL VERSION--FEBRUARY  1978.
8618C     UPDATED         --JULY      1981.
8619C     UPDATED         --AUGUST    1981.
8620C     UPDATED         --MAY       1982.
8621C
8622C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8623C
8624      CHARACTER*4 IBUGA3
8625C
8626      CHARACTER*4 ISUBN1
8627      CHARACTER*4 ISUBN2
8628C
8629C---------------------------------------------------------------------
8630C
8631      DIMENSION X2(50,50)
8632      DIMENSION RIGHT2(*)
8633      DIMENSION B(*)
8634C
8635C---------------------------------------------------------------------
8636C
8637      INCLUDE 'DPCOP2.INC'
8638C
8639C-----START POINT-----------------------------------------------------
8640C
8641      ISUBN1='BACK'
8642      ISUBN2='50  '
8643C
8644      IF(IBUGA3.EQ.'OFF')GOTO90
8645      WRITE(ICOUT,999)
8646  999 FORMAT(1X)
8647      CALL DPWRST('XXX','BUG ')
8648      WRITE(ICOUT,51)
8649   51 FORMAT('***** AT THE BEGINNING OF BACK25--')
8650      CALL DPWRST('XXX','BUG ')
8651      WRITE(ICOUT,52)M,N,IBUGA3
8652   52 FORMAT('M,N,IBUGA3 = ',2I8,2X,A4)
8653      CALL DPWRST('XXX','BUG ')
8654      DO55I=1,M
8655      WRITE(ICOUT,56)I,(X2(I,J),J=1,N)
8656   56 FORMAT('I,X2(I,.)  = ',I8,10E10.3)
8657      CALL DPWRST('XXX','BUG ')
8658   55 CONTINUE
8659      DO60I=1,M
8660      WRITE(ICOUT,61)I,RIGHT2(I)
8661   61 FORMAT('I,RIGHT2(I)= ',I8,E10.3)
8662      CALL DPWRST('XXX','BUG ')
8663   60 CONTINUE
8664   90 CONTINUE
8665C
8666      I=M
8667  100 CONTINUE
8668      SUM=0.0
8669      IP1=I+1
8670      IF(IP1.GT.M)GOTO250
8671      DO200J=IP1,M
8672      SUM=SUM+B(J)*X2(I,J)
8673  200 CONTINUE
8674  250 CONTINUE
8675      DEL=RIGHT2(I)-SUM
8676      B(I)=DEL/X2(I,I)
8677      I=I-1
8678      IF(I.GE.1)GOTO100
8679C
8680C               *****************
8681C               **  STEP 90--  **
8682C               **  EXIT       **
8683C               *****************
8684C
8685      IF(IBUGA3.EQ.'OFF')GOTO9090
8686      WRITE(ICOUT,999)
8687      CALL DPWRST('XXX','BUG ')
8688      WRITE(ICOUT,9011)
8689 9011 FORMAT('***** AT THE END       OF BACK25--')
8690      CALL DPWRST('XXX','BUG ')
8691      WRITE(ICOUT,9012)M,N,IBUGA3
8692 9012 FORMAT('M,N,IBUGA3 = ',2I8,2X,A4)
8693      CALL DPWRST('XXX','BUG ')
8694      DO9015I=1,M
8695      WRITE(ICOUT,9016)I,(X2(I,J),J=1,N)
8696 9016 FORMAT('I,X2(I,.)  = ',I8,10E10.3)
8697      CALL DPWRST('XXX','BUG ')
8698 9015 CONTINUE
8699      DO9020I=1,M
8700      WRITE(ICOUT,9021)I,RIGHT2(I),B(I)
8701 9021 FORMAT('I,RIGHT2(I),B(I) = ',I8,2E10.3)
8702      CALL DPWRST('XXX','BUG ')
8703 9020 CONTINUE
8704 9090 CONTINUE
8705C
8706      RETURN
8707      END
8708      DOUBLE PRECISION FUNCTION BD0(DX,DNP)
8709C
8710C     PURPOSE--THIS FUNCTION IS A UTILITY FUNCTION FOR THE
8711C              BINRAW SUBROUTINE.  ADAPTED FROM ORIGINAL C
8712C              CODE OF CATHERINE LOADER.
8713C     PRINTING--NONE
8714C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
8715C     FORTRAN LIBRARY SUBROUTINES NEEDED--ABS.
8716C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
8717C     LANGUAGE--ANSI FORTRAN (1977)
8718C     REFERENCES--CATHERINE LOADER (2000), "FAST AND ACCURATE COMPUTATION
8719C                 OF BINOMIAL PROBABILITIES", BELL LABS?
8720C     WRITTEN BY--JAMES J. FILLIBEN
8721C                 STATISTICAL ENGINEERING DIVISION
8722C                 INFORMATION TECHNOLOGY LABORATORY
8723C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
8724C                 GAITHERSBURG, MD 20899-8980
8725C                 PHONE--301-921-3651
8726C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
8727C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
8728C     LANGUAGE--ANSI FORTRAN (1977)
8729C     VERSION NUMBER--2009/3
8730C     ORIGINAL VERSION--MARCH     2009.
8731C
8732C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
8733C
8734C---------------------------------------------------------------------
8735C
8736      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
8737C
8738C---------------------------------------------------------------------
8739C
8740      INCLUDE 'DPCOP2.INC'
8741C
8742C-----DATA STATEMENTS-------------------------------------------------
8743C
8744C-----START POINT-----------------------------------------------------
8745C
8746      IF(DNP.EQ.0.0D0)THEN
8747        BD0=CPUMIN
8748        GOTO9000
8749      ENDIF
8750C
8751      IF(ABS(DX-DNP).LT.0.1D0*(DX+DNP))THEN
8752        V=(DX-DNP)/(DX+DNP)
8753        S=(DX-DNP)*V
8754        EJ=2.0D0*DX*V
8755        V=V*V
8756        J=1
8757  100   CONTINUE
8758          EJ=EJ*V
8759          S1=S+(EJ/(DBLE(2*J+1)))
8760          IF(S1.EQ.S)THEN
8761            BD0=S1
8762            GOTO9000
8763          ENDIF
8764          S=S1
8765          GOTO100
8766      ELSE
8767        BD0=DX*LOG(DX/DNP)+DNP-DX
8768      ENDIF
8769C
8770 9000 CONTINUE
8771      RETURN
8772      END
8773      SUBROUTINE BACKLC(Z,AA,NN,B)
8774C BACKLC RECEIVES FROM ROUTINE BESLCF Z,AA, AND NN SUCH THAT BESLCR
8775C WANTS TO CALCULATE BESSEL FUNCTIONS J-SUB-(NN+AA)-OF-Z (AND LOWER
8776C ORDERS).  IT RETURNS NN AND B (=J-SUB-NN+A) WITH WHICH TO START THE
8777C BACK-RECURSION.  THE METHOD IS DESCRIBED IN REFERENCES (3) AND (4)
8778C LISTED IN BESLCF.
8779C
8780C
8781C-----COMMON----------------------------------------------------------
8782C
8783      INCLUDE 'DPCOMC.INC'
8784      INCLUDE 'DPCOP2.INC'
8785C
8786      COMPLEX B,P,PLAST,POLD,PSAVE,TEMPC,Z,ZINV,ZDUMMY
8787C---------------------------------------------------------------------
8788C
8789C  MACHINE DEPENDENT CONSTANTS.
8790C  ---------------------------
8791C
8792C       EXPLANATION OF MACHINE-DEPENDENT CONSTANTS
8793C
8794C DYOUK WORKING ACCURACY OF THE COMPUTER.
8795C DYOUKI 1./DYOUK
8796C SQRDKI SQRT(DYOUKI)
8797C TOVER DYOUK/(SMALLEST POSITIVE MACHINE-REPRESENTABLE REAL NUMBER)
8798C
8799      SAVE ISAVE,DYOUK,DYOUKI,SQRDKI,TOVER,LOU
8800      DATA ISAVE /1/
8801C
8802C Definition of real and imaginary parts of complex number,
8803C standard Fortran and will work on Convex with -r8 -i8.
8804      REALP(ZDUMMY) = REAL(ZDUMMY)
8805      AIMAGP(ZDUMMY) = REAL((0,-1)*ZDUMMY)
8806C
8807      IF (ISAVE.GT.0) THEN
8808        ISAVE = 0
8809        DYOUK = R1MACH (4)
8810        DYOUKI = 1.0 / DYOUK
8811        SQRDKI = SQRT (DYOUKI)
8812        TOVER = DYOUK / R1MACH (1)
8813        LOU = I1MACH(2)
8814      ENDIF
8815C
8816C-----------------------------------------------------------------------
8817      A=AA
8818      ZINV=2./Z
8819      ZMAG=ABS(Z)
8820      MAGZ=INT(ZMAG-A)
8821      NB=NN
8822      NB1=NB+1
8823      N=MAGZ+1
8824      NSTART=N+1
8825      PLAST = (1.0, 0.0)
8826      P=ZINV*(REAL(N)+A)
8827      TEST=DYOUKI
8828      M=0
8829      IF(NSTART.GT.NB) GO TO 6
8830C CALCULATE P*S UNTIL N=NB, AND CHECK FOR POSSIBLE OVERFLOW.
8831C Set C here to avoid Univac FTN compiler warning that
8832C arises because it does not know that NSTART cannot exceed NB.
8833      C = 0.0
8834      DO 5 N=NSTART,NB
8835      POLD=PLAST
8836      PLAST=P
8837      P=(REAL(N)+A)*PLAST*ZINV-POLD
8838      C=MAX(ABS(REALP(P)),ABS(AIMAGP(P)))
8839      IF(C.GT.TOVER) GO TO 7
8840    5 CONTINUE
8841      N=NB
8842      TEST=SQRDKI*C
8843      C=1./C
8844      TEST=TEST*SQRT(ABS((P*C)*(PLAST*C)))
8845      TEST=MAX(TEST,DYOUKI)
8846C CALCULATE P*S UNTIL THE SIGNIFICANCE TEST ABOVE IS PASSED.
8847    6 N=N+1
8848      POLD=PLAST
8849      PLAST=P
8850      P=(REAL(N)+A)*PLAST*ZINV-POLD
8851      C=MAX(ABS(REALP(P)),ABS(AIMAGP(P)))
8852      IF(C.LT.TEST) GO TO 6
8853      IF(M.EQ.1) GO TO 12
8854C CALCULATE STRICT VARIANT OF SIGNIFICANCE TEST, AND
8855C CALCULATE P*S UNTIL THIS TEST IS PASSED.
8856      M=1
8857      E=ABS(P)/ABS(PLAST)
8858      D=(REAL(N+1)+A)/ZMAG
8859      IF(E+1./E.GT.2.*D) E=D+SQRT(D*D-1.)
8860      E=E-1./E
8861      IF(E.GE.(TEST/C)**2) GO TO 12
8862      TEST=TEST/SQRT(E)
8863      GO TO 6
8864    7 NSTART=N+1
8865C TO AVOID OVERFLOW, NORMALIZE P*S BY DIVIDING BY TOVER.
8866C CALCULATE P*S UNTIL UNNORMALIZED P WOULD OVERFLOW.
8867      P=CMPLX(REALP(P)/TOVER,AIMAGP(P)/TOVER)
8868      PLAST=CMPLX(REALP(PLAST)/TOVER,AIMAGP(PLAST)/TOVER)
8869      PSAVE=P
8870      TEMPC=PLAST
8871    8 N=N+1
8872      POLD=PLAST
8873      PLAST=P
8874      P=(REAL(N)+A)*PLAST*ZINV-POLD
8875      IF(ABS(REALP(P))+ABS(AIMAGP(P)).LE.DYOUKI) GO TO 8
8876C CALCULATE BACKWARD TEST, AND FIND NCALC, THE HIGHEST N
8877C SUCH THAT THE TEST IS PASSED.
8878      C=(REAL(N)+A)/ZMAG
8879      D=ABS(PLAST/POLD)
8880      E=(REALP(PLAST)**2+AIMAGP(PLAST)**2)*(REALP(POLD)**2+
8881     1  AIMAGP(POLD)**2)
8882      IF(D+1./D.GT.2.*C) D=C+SQRT(C*C-1.)
8883      TEST=E*(DYOUK*(1.-D**(-2)))**2
8884      P=PLAST*CMPLX(TOVER,0.)
8885      N=N-1
8886      NEND=MIN(N,NB1)
8887      DO 9 NCALC=NSTART,NEND
8888      POLD=TEMPC
8889      TEMPC=PSAVE
8890      PSAVE=(REAL(N)+A)*TEMPC*ZINV-POLD
8891      POLD=PSAVE*TEMPC
8892      IF(REALP(POLD)**2+AIMAGP(POLD)**2.GE.TEST) GO TO 10
8893    9 CONTINUE
8894      NCALC=NEND+1
8895   10 IF (NCALC .LE. NB) THEN
8896        WRITE (ICOUT,11) Z
8897        CALL DPWRST('XXX','BUG ')
8898        WRITE (ICOUT,13) A, NCALC
8899        CALL DPWRST('XXX','BUG ')
8900      ENDIF
8901   11 FORMAT('***** WARNING FROM BACKLC--- FOR Z = ', 2(1PE22.14))
8902   13 FORMAT('      AND A = ',F15.12,' BJ(N) FOR N GREATER THAN ',I5,
8903     1       ' HAS LOW ACCURACY DUE TO UNDERFLOW')
8904      C=TOVER
8905   12 P=1./CMPLX(REALP(P)/C,AIMAGP(P)/C)
8906      B=   CMPLX(REALP(P)/C,AIMAGP(P)/C)
8907      NN=N
8908      RETURN
8909      END
8910      SUBROUTINE BAKSLV(NR,N,A,X,B)
8911      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8912C
8913C PURPOSE
8914C -------
8915C SOLVE  AX=B  WHERE A IS UPPER TRIANGULAR MATRIX.
8916C NOTE THAT A IS INPUT AS A LOWER TRIANGULAR MATRIX AND
8917C THAT THIS ROUTINE TAKES ITS TRANSPOSE IMPLICITLY.
8918C
8919C PARAMETERS
8920C ----------
8921C NR           --> ROW DIMENSION OF MATRIX
8922C N            --> DIMENSION OF PROBLEM
8923C A(N,N)       --> LOWER TRIANGULAR MATRIX (PRESERVED)
8924C X(N)        <--  SOLUTION VECTOR
8925C B(N)         --> RIGHT-HAND SIDE VECTOR
8926C
8927C NOTE
8928C ----
8929C IF B IS NO LONGER REQUIRED BY CALLING ROUTINE,
8930C THEN VECTORS B AND X MAY SHARE THE SAME STORAGE.
8931C
8932      DIMENSION A(NR,1),X(N),B(N)
8933C
8934C SOLVE (L-TRANSPOSE)X=B. (BACK SOLVE)
8935C
8936      I=N
8937      X(I)=B(I)/A(I,I)
8938      IF(N.EQ.1) RETURN
8939   30 IP1=I
8940      I=I-1
8941      SUM=0.D0
8942      DO 40 J=IP1,N
8943        SUM=SUM+A(J,I)*X(J)
8944   40 CONTINUE
8945      X(I)=(B(I)-SUM)/A(I,I)
8946      IF(I.GT.1) GO TO 30
8947      RETURN
8948      END
8949      SUBROUTINE BALANC(NM,N,A,LOW,IGH,SCALE)
8950C***BEGIN PROLOGUE  BALANC
8951C***DATE WRITTEN   760101   (YYMMDD)
8952C***REVISION DATE  830518   (YYMMDD)
8953C***CATEGORY NO.  D4C1A
8954C***KEYWORDS  EIGENVALUES,EIGENVECTORS,EISPACK
8955C***AUTHOR  SMITH, B. T., ET AL.
8956C***PURPOSE  Balances a general real matrix and isolates eigenvalue
8957C            whenever possible.
8958C***DESCRIPTION
8959C
8960C     This subroutine is a translation of the ALGOL procedure BALANCE,
8961C     NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
8962C     HANDBOOk FOR AUTO. COMP., Vol.II-LINEAR ALGEBRA, 315-326(1971).
8963C
8964C     This subroutine balances a REAL matrix and isolates
8965C     eigenvalues whenever possible.
8966C
8967C     On INPUT
8968C
8969C        NM must be set to the row dimension of two-dimensional
8970C          array parameters as declared in the calling program
8971C          dimension statement.
8972C
8973C        N is the order of the matrix.
8974C
8975C        A contains the input matrix to be balanced.
8976C
8977C     On OUTPUT
8978C
8979C        A contains the balanced matrix.
8980C
8981C        LOW and IGH are two integers such that A(I,J)
8982C          is equal to zero if
8983C           (1) I is greater than J and
8984C           (2) J=1,...,LOW-1 or I=IGH+1,...,N.
8985C
8986C        SCALE contains information determining the
8987C           permutations and scaling factors used.
8988C
8989C     Suppose that the principal submatrix in rows LOW through IGH
8990C     has been balanced, that P(J) denotes the index interchanged
8991C     with J during the permutation step, and that the elements
8992C     of the diagonal matrix used are denoted by D(I,J).  Then
8993C        SCALE(J) = P(J),    for J = 1,...,LOW-1
8994C                 = D(J,J),      J = LOW,...,IGH
8995C                 = P(J)         J = IGH+1,...,N.
8996C     The order in which the interchanges are made is N to IGH+1,
8997C     then 1 TO LOW-1.
8998C
8999C     Note that 1 is returned for IGH if IGH is zero formally.
9000C
9001C     The ALGOL procedure EXC contained in BALANCE appears in
9002C     BALANC  in line.  (Note that the ALGOL roles of identifiers
9003C     K,L have been reversed.)
9004C
9005C     Questions and comments should be directed to B. S. Garbow,
9006C     Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
9007C     ------------------------------------------------------------------
9008C***REFERENCES  B. T. SMITH, J. M. BOYLE, J. J. DONGARRA, B. S. GARBOW,
9009C                 Y. IKEBE, V. C. KLEMA, C. B. MOLER, *MATRIX EIGEN-
9010C                 SYSTEM ROUTINES - EISPACK GUIDE*, SPRINGER-VERLAG,
9011C                 1976.
9012C***ROUTINES CALLED  (NONE)
9013C***END PROLOGUE  BALANC
9014C
9015      INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
9016      REAL A(NM,N),SCALE(N)
9017      REAL C,F,G,R,S,B2,RADIX
9018      LOGICAL NOCONV
9019C
9020C***FIRST EXECUTABLE STATEMENT  BALANC
9021      RADIX = 16
9022C
9023      B2 = RADIX * RADIX
9024      K = 1
9025      L = N
9026      GO TO 100
9027C     .......... IN-LINE PROCEDURE FOR ROW AND
9028C                COLUMN EXCHANGE ..........
9029   20 SCALE(M) = J
9030      IF (J .EQ. M) GO TO 50
9031C
9032      DO 30 I = 1, L
9033         F = A(I,J)
9034         A(I,J) = A(I,M)
9035         A(I,M) = F
9036   30 CONTINUE
9037C
9038      DO 40 I = K, N
9039         F = A(J,I)
9040         A(J,I) = A(M,I)
9041         A(M,I) = F
9042   40 CONTINUE
9043C
9044   50 GO TO (80,130), IEXC
9045C     .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
9046C                AND PUSH THEM DOWN ..........
9047   80 IF (L .EQ. 1) GO TO 280
9048      L = L - 1
9049C     .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
9050  100 DO 120 JJ = 1, L
9051         J = L + 1 - JJ
9052C
9053         DO 110 I = 1, L
9054            IF (I .EQ. J) GO TO 110
9055            IF (A(J,I) .NE. 0.0E0) GO TO 120
9056  110    CONTINUE
9057C
9058         M = L
9059         IEXC = 1
9060         GO TO 20
9061  120 CONTINUE
9062C
9063      GO TO 140
9064C     .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
9065C                AND PUSH THEM LEFT ..........
9066  130 K = K + 1
9067C
9068  140 DO 170 J = K, L
9069C
9070         DO 150 I = K, L
9071            IF (I .EQ. J) GO TO 150
9072            IF (A(I,J) .NE. 0.0E0) GO TO 170
9073  150    CONTINUE
9074C
9075         M = K
9076         IEXC = 2
9077         GO TO 20
9078  170 CONTINUE
9079C     .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
9080      DO 180 I = K, L
9081        SCALE(I) = 1.0E0
9082  180 CONTINUE
9083C     .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
9084  190 NOCONV = .FALSE.
9085C
9086      DO 270 I = K, L
9087         C = 0.0E0
9088         R = 0.0E0
9089C
9090         DO 200 J = K, L
9091            IF (J .EQ. I) GO TO 200
9092            C = C + ABS(A(J,I))
9093            R = R + ABS(A(I,J))
9094  200    CONTINUE
9095C     .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
9096         IF (C .EQ. 0.0E0 .OR. R .EQ. 0.0E0) GO TO 270
9097         G = R / RADIX
9098         F = 1.0E0
9099         S = C + R
9100  210    IF (C .GE. G) GO TO 220
9101         F = F * RADIX
9102         C = C * B2
9103         GO TO 210
9104  220    G = R * RADIX
9105  230    IF (C .LT. G) GO TO 240
9106         F = F / RADIX
9107         C = C / B2
9108         GO TO 230
9109C     .......... NOW BALANCE ..........
9110  240    IF ((C + R) / F .GE. 0.95E0 * S) GO TO 270
9111         G = 1.0E0 / F
9112         SCALE(I) = SCALE(I) * F
9113         NOCONV = .TRUE.
9114C
9115         DO 250 J = K, N
9116           A(I,J) = A(I,J) * G
9117  250    CONTINUE
9118C
9119         DO 260 J = 1, L
9120           A(J,I) = A(J,I) * F
9121  260    CONTINUE
9122C
9123  270 CONTINUE
9124C
9125      IF (NOCONV) GO TO 190
9126C
9127  280 LOW = K
9128      IGH = L
9129      RETURN
9130      END
9131      SUBROUTINE BALBAK(NM,N,LOW,IGH,SCALE,M,Z)
9132C***BEGIN PROLOGUE  BALBAK
9133C***DATE WRITTEN   760101   (YYMMDD)
9134C***REVISION DATE  830518   (YYMMDD)
9135C***CATEGORY NO.  D4C4
9136C***KEYWORDS  EIGENVALUES,EIGENVECTORS,EISPACK
9137C***AUTHOR  SMITH, B. T., ET AL.
9138C***PURPOSE  Forms eigenvectors of real general matrix from
9139C            eigenvectors of matrix output from BALANC.
9140C***DESCRIPTION
9141C
9142C     This subroutine is a translation of the ALGOL procedure BALBAK,
9143C     NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
9144C     HANDBOOK FOR AUTO. COMP., Vol.II-LINEAR ALGEBRA, 315-326(1971).
9145C
9146C     This subroutine forms the eigenvectors of a REAL GENERAL
9147C     matrix by back transforming those of the corresponding
9148C     balanced matrix determined by  BALANC.
9149C
9150C     On INPUT
9151C
9152C        NM must be set to the row dimension of two-dimensional
9153C          array parameters as declared in the calling program
9154C          dimension statement.
9155C
9156C        N is the order of the matrix.
9157C
9158C        LOW and IGH are integers determined by  BALANC.
9159C
9160C        SCALE contains information determining the permutations
9161C          and scaling factors used by  BALANC.
9162C
9163C        M is the number of columns of Z to be back transformed.
9164C
9165C        Z contains the real and imaginary parts of the eigen-
9166C          vectors to be back transformed in its first M columns.
9167C
9168C     On OUTPUT
9169C
9170C        Z contains the real and imaginary parts of the
9171C          transformed eigenvectors in its first M columns.
9172C
9173C     Questions and comments should be directed to B. S. Garbow,
9174C     Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
9175C     ------------------------------------------------------------------
9176C***REFERENCES  B. T. SMITH, J. M. BOYLE, J. J. DONGARRA, B. S. GARBOW,
9177C                 Y. IKEBE, V. C. KLEMA, C. B. MOLER, *MATRIX EIGEN-
9178C                 SYSTEM ROUTINES - EISPACK GUIDE*, SPRINGER-VERLAG,
9179C                 1976.
9180C***ROUTINES CALLED  (NONE)
9181C***END PROLOGUE  BALBAK
9182C
9183      INTEGER I,J,K,M,N,II,NM,IGH,LOW
9184      REAL SCALE(N),Z(NM,M)
9185      REAL S
9186C
9187C***FIRST EXECUTABLE STATEMENT  BALBAK
9188      IF (M .EQ. 0) GO TO 200
9189      IF (IGH .EQ. LOW) GO TO 120
9190C
9191      DO 110 I = LOW, IGH
9192         S = SCALE(I)
9193C     .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED
9194C                IF THE FOREGOING STATEMENT IS REPLACED BY
9195C                S=1.0E0/SCALE(I). ..........
9196         DO 100 J = 1, M
9197           Z(I,J) = Z(I,J) * S
9198  100    CONTINUE
9199C
9200  110 CONTINUE
9201C     ......... FOR I=LOW-1 STEP -1 UNTIL 1,
9202C               IGH+1 STEP 1 UNTIL N DO -- ..........
9203  120 CONTINUE
9204      DO 140 II = 1, N
9205         I = II
9206         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 140
9207         IF (I .LT. LOW) I = LOW - II
9208         K = INT(SCALE(I) + 0.1)
9209         IF (K .EQ. I) GO TO 140
9210C
9211         DO 130 J = 1, M
9212            S = Z(I,J)
9213            Z(I,J) = Z(K,J)
9214            Z(K,J) = S
9215  130    CONTINUE
9216C
9217  140 CONTINUE
9218C
9219  200 RETURN
9220      END
9221      SUBROUTINE BASRUL( NDIM, A, B, WIDTH, FUNCTN, W, LENRUL, G,
9222     &     CENTER, Z, RGNERT, BASEST )
9223*
9224*     For application of basic integration rule
9225*
9226      EXTERNAL FUNCTN
9227      INTEGER I, LENRUL, NDIM
9228      DOUBLE PRECISION
9229     &     A(NDIM), B(NDIM), WIDTH(NDIM), FUNCTN, W(LENRUL,4),
9230     &     G(NDIM,LENRUL), CENTER(NDIM), Z(NDIM), RGNERT, BASEST
9231      DOUBLE PRECISION
9232     &     FULSUM, FSYMSM, RGNCMP, RGNVAL, RGNVOL, RGNCPT, RGNERR
9233*
9234*     Compute Volume and Center of Subregion
9235*
9236      RGNVOL = 1
9237      DO 100 I = 1,NDIM
9238         RGNVOL = 2*RGNVOL*WIDTH(I)
9239         CENTER(I) = A(I) + WIDTH(I)
9240  100 CONTINUE
9241      BASEST = 0
9242      RGNERT = 0
9243*
9244*     Compute basic rule and error
9245*
9246 10   RGNVAL = 0
9247      RGNERR = 0
9248      RGNCMP = 0
9249      RGNCPT = 0
9250      DO 200 I = 1,LENRUL
9251         FSYMSM = FULSUM(NDIM, CENTER, WIDTH, Z, G(1,I), FUNCTN)
9252*     Basic Rule
9253         RGNVAL = RGNVAL + W(I,1)*FSYMSM
9254*     First comparison rule
9255         RGNERR = RGNERR + W(I,2)*FSYMSM
9256*     Second comparison rule
9257         RGNCMP = RGNCMP + W(I,3)*FSYMSM
9258*     Third Comparison rule
9259         RGNCPT = RGNCPT + W(I,4)*FSYMSM
9260  200 CONTINUE
9261*
9262*     Error estimation
9263*
9264      RGNERR = SQRT(RGNCMP**2 + RGNERR**2)
9265      RGNCMP = SQRT(RGNCPT**2 + RGNCMP**2)
9266      IF ( 4*RGNERR .LT. RGNCMP ) RGNERR = RGNERR/2
9267      IF ( 2*RGNERR .GT. RGNCMP ) RGNERR = MAX( RGNERR, RGNCMP )
9268      RGNERT = RGNERT +  RGNVOL*RGNERR
9269      BASEST = BASEST +  RGNVOL*RGNVAL
9270*
9271*     When subregion has more than one piece, determine next piece and
9272*      loop back to apply basic rule.
9273*
9274      DO 300 I = 1,NDIM
9275         CENTER(I) = CENTER(I) + 2*WIDTH(I)
9276         IF ( CENTER(I) .LT. B(I) ) GO TO 10
9277         CENTER(I) = A(I) + WIDTH(I)
9278  300 CONTINUE
9279C
9280      RETURN
9281      END
9282      DOUBLE PRECISION FUNCTION basym(a,b,lambda,eps)
9283C-----------------------------------------------------------------------
9284C     ASYMPTOTIC EXPANSION FOR IX(A,B) FOR LARGE A AND B.
9285C     LAMBDA = (A + B)*Y - B  AND EPS IS THE TOLERANCE USED.
9286C     IT IS ASSUMED THAT LAMBDA IS NONNEGATIVE AND THAT
9287C     A AND B ARE GREATER THAN OR EQUAL TO 15.
9288C-----------------------------------------------------------------------
9289C     .. Scalar Arguments ..
9290      DOUBLE PRECISION a,b,eps,lambda
9291C     ..
9292C     .. Local Scalars ..
9293      DOUBLE PRECISION bsum,dsum,e0,e1,f,h,h2,hn,j0,j1,r,r0,r1,s,sum,t,
9294     +                 t0,t1,u,w,w0,z,z0,z2,zn,znm1
9295      INTEGER i,im1,imj,j,m,mm1,mmj,n,np1,num
9296C     ..
9297C     .. Local Arrays ..
9298      DOUBLE PRECISION a0(21),b0(21),c(21),d(21)
9299C     ..
9300C     .. External Functions ..
9301      DOUBLE PRECISION bcorr,erfc1,rlog1
9302      EXTERNAL bcorr,erfc1,rlog1
9303C     ..
9304C     .. Intrinsic Functions ..
9305      INTRINSIC abs,exp,sqrt
9306C     ..
9307C     .. Data statements ..
9308C------------------------
9309C     ****** NUM IS THE MAXIMUM VALUE THAT N CAN TAKE IN THE DO LOOP
9310C            ENDING AT STATEMENT 50. IT IS REQUIRED THAT NUM BE EVEN.
9311C            THE ARRAYS A0, B0, C, D HAVE DIMENSION NUM + 1.
9312C
9313C------------------------
9314C     E0 = 2/SQRT(PI)
9315C     E1 = 2**(-3/2)
9316C------------------------
9317      DATA num/20/
9318      DATA e0/1.12837916709551D0/,e1/.353553390593274D0/
9319C     ..
9320C     .. Executable Statements ..
9321C------------------------
9322      basym = 0.0D0
9323      IF (a.GE.b) GO TO 10
9324      h = a/b
9325      r0 = 1.0D0/ (1.0D0+h)
9326      r1 = (b-a)/b
9327      w0 = 1.0D0/sqrt(a* (1.0D0+h))
9328      GO TO 20
9329
9330   10 h = b/a
9331      r0 = 1.0D0/ (1.0D0+h)
9332      r1 = (b-a)/a
9333      w0 = 1.0D0/sqrt(b* (1.0D0+h))
9334C
9335   20 f = a*rlog1(-lambda/a) + b*rlog1(lambda/b)
9336      t = exp(-f)
9337      IF (t.EQ.0.0D0) RETURN
9338      z0 = sqrt(f)
9339      z = 0.5D0* (z0/e1)
9340      z2 = f + f
9341C
9342      a0(1) = (2.0D0/3.0D0)*r1
9343      c(1) = -0.5D0*a0(1)
9344      d(1) = -c(1)
9345      j0 = (0.5D0/e0)*erfc1(1,z0)
9346      j1 = e1
9347      sum = j0 + d(1)*w0*j1
9348C
9349      s = 1.0D0
9350      h2 = h*h
9351      hn = 1.0D0
9352      w = w0
9353      znm1 = z
9354      zn = z2
9355      DO 70 n = 2,num,2
9356          hn = h2*hn
9357          a0(n) = 2.0D0*r0* (1.0D0+h*hn)/ (n+2.0D0)
9358          np1 = n + 1
9359          s = s + hn
9360          a0(np1) = 2.0D0*r1*s/ (n+3.0D0)
9361C
9362          DO 60 i = n,np1
9363              r = -0.5D0* (i+1.0D0)
9364              b0(1) = r*a0(1)
9365              DO 40 m = 2,i
9366                  bsum = 0.0D0
9367                  mm1 = m - 1
9368                  DO 30 j = 1,mm1
9369                      mmj = m - j
9370                      bsum = bsum + (j*r-mmj)*a0(j)*b0(mmj)
9371   30             CONTINUE
9372                  b0(m) = r*a0(m) + bsum/m
9373   40         CONTINUE
9374              c(i) = b0(i)/ (i+1.0D0)
9375C
9376              dsum = 0.0D0
9377              im1 = i - 1
9378              DO 50 j = 1,im1
9379                  imj = i - j
9380                  dsum = dsum + d(imj)*c(j)
9381   50         CONTINUE
9382              d(i) = - (dsum+c(i))
9383   60     CONTINUE
9384C
9385          j0 = e1*znm1 + (n-1.0D0)*j0
9386          j1 = e1*zn + n*j1
9387          znm1 = z2*znm1
9388          zn = z2*zn
9389          w = w0*w
9390          t0 = d(n)*w*j0
9391          w = w0*w
9392          t1 = d(np1)*w*j1
9393          sum = sum + (t0+t1)
9394          IF ((abs(t0)+abs(t1)).LE.eps*sum) GO TO 80
9395   70 CONTINUE
9396C
9397   80 u = exp(-bcorr(a,b))
9398      basym = e0*t*u*sum
9399      RETURN
9400
9401      END
9402      SUBROUTINE BBNCDF(X,V,W,N,CDF)
9403C
9404C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
9405C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
9406C              FOR THE BETA-BINOMIAL DISTRIBUTION
9407C              WITH SINGLE PRECISION PARAMETERS V AND W
9408C              AND INTEGER 'NUMBER OF BERNOULLI TRIALS'
9409C              PARAMETER = N.
9410C              IF V AND W ARE INTEGERS, THIS BECOMES THE NEGATIVE
9411C              HYPERGEOMETRIC DISTRIBUTION.
9412C              THIS DISTRIBUTION IS DEFINED FOR ALL
9413C              DISCRETE INTEGER X BETWEEN 0 (INCLUSIVELY)
9414C              AND N (INCLUSIVELY).
9415C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
9416C              F(X) = B(N-X+V,X+B)/[(N+1)*B(N-X+1,X+1)*B(V,W)
9417C              WHERE B(A,B) IS THE BETA FUNCTION.
9418C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
9419C                                AT WHICH THE CUMULATIVE DISTRIBUTION
9420C                                FUNCTION IS TO BE EVALUATED.
9421C                                X SHOULD BE INTEGRAL-VALUED,
9422C                                AND BETWEEN 0.0 (INCLUSIVELY)
9423C                                AND N (INCLUSIVELY).
9424C                     --V      = THE SINGLE PRECISION VALUE
9425C                                OF THE FIRST SHAPE PARAMETER.
9426C                     --W      = THE SINGLE PRECISION VALUE
9427C                                OF THE SECOND SHAPE PARAMETER.
9428C                     --N      = THE INTEGER VALUE
9429C                                OF THE 'NUMBER OF BERNOULLI TRIALS'
9430C                                PARAMETER.
9431C                                N SHOULD BE A POSITIVE INTEGER.
9432C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
9433C                                DISTRIBUTION FUNCTION VALUE.
9434C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
9435C             FUNCTION VALUE CDF
9436C             FOR THE BINOMIAL DISTRIBUTION
9437C             WITH 'BERNOULLI PROBABILITY' PARAMETER = P
9438C             AND 'NUMBER OF BERNOULLI TRIALS' PARAMETER = N.
9439C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
9440C     RESTRICTIONS--X SHOULD BE INTEGRAL-VALUED,
9441C                   AND BETWEEN 0.0 (INCLUSIVELY)
9442C                   AND N (INCLUSIVELY).
9443C                 --P SHOULD BE BETWEEN 0.0 (EXCLUSIVELY)
9444C                   AND 1.0 (EXCLUSIVELY).
9445C                 --N SHOULD BE A POSITIVE INTEGER.
9446C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
9447C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT, DATAN.
9448C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9449C     LANGUAGE--ANSI FORTRAN (1977)
9450C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
9451C                 DISTRIBUTIONS--2ND ED., CHAPTER 5
9452C     WRITTEN BY--JAMES J. FILLIBEN
9453C                 STATISTICAL ENGINEERING DIVISION
9454C                 INFORMATION TECHNOLOGY LABORATORY
9455C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
9456C                 GAITHERSBURG, MD 20899-8980
9457C                 PHONE--301-975-2855
9458C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9459C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
9460C     LANGUAGE--ANSI FORTRAN (1966)
9461C     VERSION NUMBER--96/2
9462C     ORIGINAL VERSION--FEBRUARY  1996.
9463C
9464C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9465C
9466C---------------------------------------------------------------------
9467C
9468      DOUBLE PRECISION DX, DV, DW, DN, DCDF
9469      DOUBLE PRECISION DTERM1, DTERM2, DTERM3, DTERM4
9470      DOUBLE PRECISION DLBETA
9471      DOUBLE PRECISION DSUM1, DSUM2
9472C
9473C---------------------------------------------------------------------
9474C
9475      INCLUDE 'DPCOP2.INC'
9476C
9477C-----START POINT-----------------------------------------------------
9478C
9479      CDF=0.0
9480C
9481C     CHECK THE INPUT ARGUMENTS FOR ERRORS
9482C
9483      AN=N
9484      IF(V.LE.0.0)THEN
9485        WRITE(ICOUT,11)
9486        CALL DPWRST('XXX','BUG ')
9487        WRITE(ICOUT,46)V
9488        CALL DPWRST('XXX','BUG ')
9489        CDF=0.0
9490        GOTO9999
9491      ENDIF
9492      IF(W.LE.0.0)THEN
9493        WRITE(ICOUT,12)
9494        CALL DPWRST('XXX','BUG ')
9495        WRITE(ICOUT,46)V
9496        CALL DPWRST('XXX','BUG ')
9497        CDF=0.0
9498        GOTO9999
9499      ENDIF
9500      IF(N.LE.0)THEN
9501        WRITE(ICOUT,25)
9502        CALL DPWRST('XXX','BUG ')
9503        WRITE(ICOUT,47)N
9504        CALL DPWRST('XXX','BUG ')
9505        CDF=0.0
9506        GOTO9999
9507      ENDIF
9508      INTX=INT(X+0.0001)
9509      FINTX=REAL(INTX)
9510      DEL=X-FINTX
9511      IF(DEL.LT.0.0)DEL=-DEL
9512      IF(DEL.GT.0.001)THEN
9513        WRITE(ICOUT,5)
9514        CALL DPWRST('XXX','BUG ')
9515        WRITE(ICOUT,6)INT(FINTX)
9516        CALL DPWRST('XXX','BUG ')
9517        WRITE(ICOUT,46)X
9518        CALL DPWRST('XXX','BUG ')
9519      ENDIF
9520      IF(FINTX.LT.0.0 .OR. FINTX.GT.AN)THEN
9521        WRITE(ICOUT,4)N
9522        CALL DPWRST('XXX','BUG ')
9523        WRITE(ICOUT,46)X
9524        CALL DPWRST('XXX','BUG ')
9525        GOTO9999
9526      ENDIF
9527C
9528    4 FORMAT('***** FATAL ERROR--THE FIRST INPUT ',
9529     1'ARGUMENT TO THE BBNCDF SUBROUTINE IS OUTSIDE THE USUAL ',
9530     1'(0,N) = (0,',I8,') INTERVAL')
9531    5 FORMAT('***** NON-FATAL DIAGNOSTIC--THE FIRST INPUT ',
9532     1'ARGUMENT TO THE BBNCDF SUBROUTINE IS NON-INTEGRAL *****')
9533    6 FORMAT('      IT HAS BEEN SET TO ',I8)
9534   11 FORMAT('***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE ',
9535     1' BBNCDF SUBROUTINE IS NON-POSITIVE')
9536   12 FORMAT('***** FATAL ERROR--THE THIRD INPUT ARGUMENT TO THE ',
9537     1' BBNCDF SUBROUTINE IS NON-POSITIVE')
9538   25 FORMAT('***** FATAL ERROR--THE FOURTH INPUT ARGUMENT TO THE ',
9539     1' BBNCDF SUBROUTINE IS NON-POSITIVE *****')
9540   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
9541   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
9542C
9543      DV=DBLE(V)
9544      DW=DBLE(W)
9545      DN=DBLE(N)
9546      DSUM1=0.0D0
9547      DSUM2=0.0D0
9548C
9549      DMEAN=DN*DV/(DV+DW)
9550      ICUT=INT(DMEAN)+1
9551C
9552C  SUM TERMS UP TO AND INCLUDING MEAN
9553C
9554      DO1000I=0,MIN(ICUT,INTX),1
9555        DX=DBLE(I)
9556        DTERM1=DLOG(DN+1.0D0)
9557        DTERM2=DLBETA(DN-DX+DV,DX+DW)
9558        DTERM3=DLBETA(DN-DX+1.0D0,DX+1.0D0)
9559        DTERM4=DLBETA(DV,DW)
9560        DCDF=DEXP(DTERM2-DTERM1-DTERM3-DTERM4)
9561        DSUM1=DSUM1+DCDF
9562 1000 CONTINUE
9563C
9564C  SUM TERMS FROM X DOWN TO MEAN MEAN
9565C
9566      IF(INTX.GT.ICUT)THEN
9567        DO2000I=INTX,ICUT+1,-1
9568          DX=DBLE(I)
9569          DTERM1=DLOG(DN+1.0D0)
9570          DTERM2=DLBETA(DN-DX+DV,DX+DW)
9571          DTERM3=DLBETA(DN-DX+1.0D0,DX+1.0D0)
9572          DTERM4=DLBETA(DV,DW)
9573          DCDF=DEXP(DTERM2-DTERM1-DTERM3-DTERM4)
9574          DSUM2=DSUM2+DCDF
9575 2000   CONTINUE
9576      ENDIF
9577      DCDF=DSUM1+DSUM2
9578      CDF=REAL(DCDF)
9579C
9580 9999 CONTINUE
9581      RETURN
9582      END
9583      SUBROUTINE BBNL(MEW, THETA, RL, MRL, LM, RNL)
9584C
9585C        ALGORITHM AS 189.3 APPL. STATIST. (1983) VOL.32, NO.2
9586C
9587C        SUBROUTINE FOR CALCULATION OF THE BETA BINOMIAL LOG
9588C        LIKELIHOOD
9589C
9590      DOUBLE PRECISION MEW, THETA, RNL, A
9591      INTEGER RL(MRL,3), LM(3)
9592C
9593      RNL = 0.0D0
9594      MLM = LM(3)
9595      DO 5 I = 1,MLM
9596        A = DBLE(I-1)*THETA
9597        IF(I.LE.LM(1))RNL = RNL + DBLE(RL(I,1))*DLOG(MEW+A)
9598        IF(I.LE.LM(2))RNL = RNL + DBLE(RL(I,2))*DLOG(1.0D0-MEW+A)
9599        RNL = RNL - DBLE(RL(I,3))*DLOG(1.0D0+A)
9600    5 CONTINUE
9601      RETURN
9602      END
9603      SUBROUTINE BBNME(N, IX, IN, W, P, INF, MEW, THETA)
9604C
9605C        ALGORITHM AS 189.1 APPL. STATIST. (1983) VOL.32, NO.2
9606C
9607C        SUBROUTINE TO ESTIMATE MEW AND THETA OF THE BETA BINOMIAL
9608C        DISTRIBUTION BY THE METHOD OF MOMENTS
9609C
9610      DOUBLE PRECISION W(N), P(N), INF, MEW, THETA, D1, D2, R, S
9611      DOUBLE PRECISION TP, WT
9612      INTEGER IX(N), IN(N)
9613      LOGICAL J
9614C
9615      J = .FALSE.
9616      DO 5 I = 1,N
9617        W(I) = DBLE(IN(I))
9618        P(I) = DBLE(IX(I))/W(I)
9619    5 CONTINUE
9620   10 WT = 0.0D0
9621      TP = 0.0D0
9622      DO 15 I = 1,N
9623        WT = WT+W(I)
9624        TP = TP+W(I)*P(I)
9625   15 CONTINUE
9626      TP = TP/WT
9627      S = 0.0D0
9628      D1 = 0.0D0
9629      D2 = 0.0D0
9630      DO 20 I = 1,N
9631        R = P(I)-TP
9632        S = S+W(I)*R*R
9633        R = W(I)*(1.0D0-W(I)/WT)
9634        D1 = D1+R/DBLE(IN(I))
9635        D2 = D2+R
9636   20 CONTINUE
9637      S = DBLE(N-1)*S/DBLE(N)
9638      R = TP*(1.0D0-TP)
9639      IF(R.EQ.0.0D0) GOTO 30
9640      R = (S-R*D1)/(R*(D2-D1))
9641      IF(R.LT.0.0) R = 0.0D0
9642      IF(J) GOTO 30
9643      DO 25 I = 1,N
9644        W(I) = W(I)/(1.0D0+R*(W(I)-1.0D0))
9645   25 CONTINUE
9646      J = .TRUE.
9647      GOTO 10
9648   30 CONTINUE
9649      MEW = TP
9650      IF(R.GE.1.0D0) GOTO 35
9651      THETA = R/(1.0D0-R)
9652      IF(THETA.LE.INF) RETURN
9653   35 THETA = INF
9654      RETURN
9655      END
9656      SUBROUTINE BBNML(N,IX,IN,W,P,RL,MRL,ITER,CCRIT,MEW,THETA,
9657     *  SEM, SETH, RNL, IFAULT)
9658C UKC NETLIB DISTRIBUTION COPYRIGHT 1990 RSS
9659C
9660C
9661C        ALGORITHM AS189 APPL. STATIST. (1983) VOL.32, NO.2
9662C
9663C        SUBROUTINE FOR CALCULATING THE MAXIMUM LIKELIHOOD ESTIMATES
9664C        OF THE PARAMETERS OF THE BETA BINOMIAL DISTRIBUTION
9665C
9666      DOUBLE PRECISION W(N), P(N), CCRIT, MEW, THETA, SEM, SETH
9667      DOUBLE PRECISION RNL, INF, DUM
9668      DOUBLE PRECISION  FD(2), SD(3), TD(4), UB(2), DEL, EPS
9669      DOUBLE PRECISION A, B, C, D, E, F
9670      INTEGER IX(N), IN(N), RL(MRL,3), LM(3), RD1(2,2), RD2(2,3),
9671     *  RD3(2,4)
9672      LOGICAL MC
9673      PARAMETER (INF = 1.0D6)
9674      DATA
9675     *  RD1(1,1), RD1(2,1), RD1(1,2), RD1(2,2)/1,-1,1,1/,
9676     *  RD2(1,1), RD2(2,1), RD2(1,2), RD2(2,2),
9677     *  RD2(1,3), RD2(2,3)/-1,-1,-1,1,-1,-1/,
9678     *  RD3(1,1), RD3(2,1), RD3(1,2), RD3(2,2), RD3(1,3),
9679     *  RD3(2,3), RD3(1,4), RD3(2,4)/2,-2,2,2,2,-2,2,2/
9680C
9681      I = ITER
9682      ITER = 0
9683      MC = .TRUE.
9684      UB(1) = 0.01D0
9685      UB(2) = 0.01D0
9686C
9687C        SET THE ARRAYS RL AND LM
9688C
9689      CALL BBNSET(N, IX, IN, RL, MRL, LM, IFAULT)
9690      IF(IFAULT.NE.0) RETURN
9691      SEM = -1.0D0
9692      SETH = -1.0D0
9693      NND = 0
9694C
9695C        CALCULATION OF INITIAL ESTIMATES (BY MOMENTS)
9696C
9697      CALL BBNME(N, IX, IN, W, P, INF, MEW, THETA)
9698      IF(THETA.EQ.INF) GOTO 50
9699C
9700C        NEWTON-RAPHSON ITERATION ON FIRST DERIVATIVES
9701C
9702    5 IF(ITER.LE.I) GOTO 10
9703      IFAULT = 7
9704      GOTO 60
9705C
9706C        CALCULATE FIRST DERIVATIVES OF LOG LIKELIHOOD
9707C
9708   10 CALL GDER(MEW, THETA, RL, MRL, LM, 2, RD1, FD)
9709C
9710C        CALCULATE SECOND DERIVATIVES OF LOG_LIKELIHOOD
9711C
9712      CALL GDER(MEW, THETA, RL, MRL, LM, 3, RD2, SD)
9713C
9714C        CALCULATE THIRD DERIVATIVES OF LOG LIKELIHOOD
9715C
9716      CALL GDER(MEW, THETA, RL, MRL, LM, 4, RD3, TD)
9717C
9718C        CALCULATE INCREMENTS
9719C
9720      DUM = SD(1)*SD(3) - SD(2)*SD(2)
9721      IF(SD(1).LT.0.0D0.AND.DUM.GT.0.0D0) GOTO 15
9722C
9723C        NON NEGATIVE DEFINITE MATRIX
9724C
9725      NND = NND+1
9726C
9727C        SD(1) IS ALWAYS NEGATIVE SO A GRADIENT STEP IS MADE ON MEW
9728C
9729      A = MEW - FD(1)/SD(1)
9730      B = THETA
9731      IF(FD(2).NE.0.0D0) B = B + SIGN(UB(2),FD(2))
9732      IF(A.LE.0.0D0) A = 0.0001D0
9733      IF(A.GE.1.0D0) A = 0.9999D0
9734      IF(B.LT.0.0D0) B = 0.0D0
9735      IF(B.GT.INF) B = INF
9736      CALL BBNL(MEW, THETA, RL, MRL, LM, C)
9737      CALL BBNL(A, B, RL, MRL, LM, D)
9738      IF(NND.GT.10.OR.C.GE.D) GOTO 40
9739      ITER = ITER+1
9740      MEW = A
9741      THETA = B
9742      GOTO 5
9743   15 DEL = (FD(2)*SD(2) - FD(1)*SD(3))/DUM
9744      EPS = (FD(1)*SD(2) - FD(2)*SD(1))/DUM
9745C
9746C        CHECK LIPSCHITZ CONDITION SATISFIED
9747C
9748      A = SD(2)*TD(2) - TD(1)*SD(3)
9749      B = SD(2)*TD(3) - TD(2)*SD(3)
9750      C = TD(1)*SD(2) - TD(2)*SD(1)
9751      D = SD(2)*TD(2) - SD(1)*TD(3)
9752      E = SD(2)*TD(4) - TD(3)*SD(3)
9753      F = TD(3)*SD(2) - TD(4)*SD(1)
9754      A = DEL*A + EPS*B
9755      C = DEL*C + EPS*D
9756      E = DEL*B + EPS*E
9757      F = DEL*D + EPS*F
9758      DUM = (A*A + C*C + E*E + F*F)/(DUM*DUM)
9759      IF(DUM.GE.1.0D0) GOTO 20
9760      IF(ABS(DEL).LE.CCRIT.AND.ABS(EPS).LE.CCRIT) MC = .FALSE.
9761      GOTO 45
9762C
9763C        FAILURE OF LIPSCHITZ CONDITION. A STEP IN THE DIRECTION OF THE
9764C        GRADIENT IS MADE.
9765C
9766   20 A = FD(1)*FD(1)
9767      B = FD(2)*FD(2)
9768      C = A*SD(1) + 2.0D0*SD(2)*FD(1)*FD(2) + B*SD(3)
9769      IF(C.NE.0.0D0) GOTO 25
9770      DEL = 0.0D0
9771      IF(FD(1).NE.0.0D0) DEL = SIGN(UB(1),FD(1))
9772      EPS = 0.0D0
9773      IF(FD(2).NE.0.0D0) EPS = SIGN(UB(2),FD(2))
9774      GOTO 30
9775   25 C = -(A+B)/C
9776      DEL = C*FD(1)
9777      EPS = C*FD(2)
9778      IF(ABS(DEL).GT.UB(1)) DEL = SIGN(UB(1),DEL)
9779      UB(1) = 2.0D0*DABS(DEL)
9780      IF(DABS(EPS).GT.UB(2)) EPS = SIGN(UB(2),EPS)
9781      UB(2) = 2.0D0*ABS(EPS)
9782   30 CALL BBNL(MEW, THETA, RL, MRL, LM, C)
9783   35 A = MEW + DEL
9784      B = THETA + EPS
9785      IF(A.LE.0.0D0) A = 0.0001D0
9786      IF(A.GE.1.0D0) A = 0.9999D0
9787      DEL = A - MEW
9788      IF(B.LT.0.0D0) B = 0.0D0
9789      IF(B.GT.INF) B = INF
9790      EPS = B - THETA
9791      CALL BBNL(A, B, RL, MRL, LM, D)
9792C
9793C        CHECK TO SEE IF GRADIENT STEP HAS INCREASED LOG LIKELIHOOD
9794C
9795      IF(D.GT.C) GOTO 45
9796      DEL = DEL/2.0D0
9797      EPS = EPS/2.0D0
9798      IF(DABS(DEL).GT.CCRIT.OR.DABS(EPS).GT.CCRIT) GOTO 35
9799   40 IFAULT = 8
9800      GOTO 60
9801   45 ITER = ITER + 1
9802      A = MEW + DEL
9803      B = THETA + EPS
9804      IF(A.GT.0.0D0.AND.A.LT.1.0D0.AND.B.GE.0.0D0.AND.B.LE.INF) GOTO 55
9805      IF(A.LE.0.0D0) MEW = 0.0D0
9806      IF(A.GE.1.0D0) MEW = 1.0D0
9807      IF(B.LT.0.0D0) THETA = 0.0D0
9808      IF(B.GT.INF) THETA = INF
9809   50 IFAULT = 6
9810      GOTO 60
9811   55 MEW = A
9812      THETA = B
9813      IF(MC) GOTO 5
9814C
9815C        CALCULATE LOG LIKELIHOOD AND S.E.S
9816C
9817      IF(SD(1).LT.0.0D0) SEM = DSQRT(-1.0D0/SD(1))
9818      IF(SD(3).LT.0.0D0) SETH = DSQRT(-1.0D0/SD(3))
9819   60 CALL BBNL(MEW, THETA, RL, MRL, LM, RNL)
9820      RETURN
9821      END
9822      SUBROUTINE BBNPDF(X,V,W,N,PDF)
9823C
9824C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
9825C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
9826C              FOR THE BETA-BINOMIAL DISTRIBUTION
9827C              WITH SINGLE PRECISION PARAMETERS V AND W
9828C              AND INTEGER 'NUMBER OF BERNOULLI TRIALS'
9829C              PARAMETER = N.
9830C              IF V AND W ARE INTEGERS, THIS BECOMES THE NEGATIVE
9831C              HYPERGEOMETRIC DISTRIBUTION.
9832C              THIS DISTRIBUTION IS DEFINED FOR ALL
9833C              DISCRETE INTEGER X BETWEEN 0 (INCLUSIVELY)
9834C              AND N (INCLUSIVELY).
9835C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
9836C              F(X) = B(N-X+V,X+B)/[(N+1)*B(N-X+1,X+1)*B(V,W)
9837C              WHERE B(A,B) IS THE BETA FUNCTION.
9838C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
9839C                                AT WHICH THE PROBABILITY DENSITY
9840C                                FUNCTION IS TO BE EVALUATED.
9841C                                X SHOULD BE INTEGRAL-VALUED,
9842C                                AND BETWEEN 0.0 (INCLUSIVELY)
9843C                                AND N (INCLUSIVELY).
9844C                     --V      = THE SINGLE PRECISION VALUE
9845C                                OF THE FIRST SHAPE PARAMETER.
9846C                     --W      = THE SINGLE PRECISION VALUE
9847C                                OF THE SECOND SHAPE PARAMETER.
9848C                     --N      = THE INTEGER VALUE
9849C                                OF THE 'NUMBER OF BERNOULLI TRIALS'
9850C                                PARAMETER.
9851C                                N SHOULD BE A POSITIVE INTEGER.
9852C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
9853C                                DENSITY FUNCTION VALUE.
9854C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
9855C             FUNCTION VALUE PDF
9856C             FOR THE BETA-BINOMIAL DISTRIBUTION
9857C             WITH 'BERNOULLI PROBABILITY' PARAMETER = P
9858C             AND 'NUMBER OF BERNOULLI TRIALS' PARAMETER = N.
9859C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
9860C     RESTRICTIONS--X SHOULD BE INTEGRAL-VALUED,
9861C                   AND BETWEEN 0.0 (INCLUSIVELY)
9862C                   AND N (INCLUSIVELY).
9863C                 --P SHOULD BE BETWEEN 0.0 (EXCLUSIVELY)
9864C                   AND 1.0 (EXCLUSIVELY).
9865C                 --N SHOULD BE A POSITIVE INTEGER.
9866C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
9867C     FORTRAN LIBRARY SUBROUTINES NEEDED--DSQRT, DATAN.
9868C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
9869C     LANGUAGE--ANSI FORTRAN (1977)
9870C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
9871C                 DISTRIBUTIONS--2ND ED., CHAPTER 5
9872C     WRITTEN BY--JAMES J. FILLIBEN
9873C                 STATISTICAL ENGINEERING DIVISION
9874C                 INFORMATION TECHNOLOGY LABORATORY
9875C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
9876C                 GAITHERSBURG, MD 20899-8980
9877C                 PHONE--301-975-2855
9878C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
9879C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
9880C     LANGUAGE--ANSI FORTRAN (1966)
9881C     VERSION NUMBER--96/2
9882C     ORIGINAL VERSION--FEBRUARY  1996.
9883C
9884C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
9885C
9886C---------------------------------------------------------------------
9887C
9888      DOUBLE PRECISION DX, DV, DW, DN, DPDF
9889      DOUBLE PRECISION DTERM1, DTERM2, DTERM3, DTERM4
9890      DOUBLE PRECISION DLBETA
9891C
9892C---------------------------------------------------------------------
9893C
9894      INCLUDE 'DPCOP2.INC'
9895C
9896C-----START POINT-----------------------------------------------------
9897C
9898      PDF=0.0
9899C
9900C     CHECK THE INPUT ARGUMENTS FOR ERRORS
9901C
9902      AN=N
9903      IF(V.LE.0.0)THEN
9904        WRITE(ICOUT,11)
9905        CALL DPWRST('XXX','BUG ')
9906        WRITE(ICOUT,46)V
9907        CALL DPWRST('XXX','BUG ')
9908        GOTO9999
9909      ELSEIF(W.LE.0.0)THEN
9910        WRITE(ICOUT,12)
9911        CALL DPWRST('XXX','BUG ')
9912        WRITE(ICOUT,46)V
9913        CALL DPWRST('XXX','BUG ')
9914        GOTO9999
9915      ELSEIF(N.LE.0)THEN
9916        WRITE(ICOUT,25)
9917        CALL DPWRST('XXX','BUG ')
9918        WRITE(ICOUT,47)N
9919        CALL DPWRST('XXX','BUG ')
9920        GOTO9999
9921      ENDIF
9922C
9923      INTX=INT(X+0.0001)
9924      FINTX=REAL(INTX)
9925      DEL=X-FINTX
9926      IF(DEL.LT.0.0)DEL=-DEL
9927      IF(DEL.GT.0.001)THEN
9928        WRITE(ICOUT,5)
9929        CALL DPWRST('XXX','BUG ')
9930        WRITE(ICOUT,6)INT(FINTX)
9931        CALL DPWRST('XXX','BUG ')
9932        WRITE(ICOUT,46)X
9933        CALL DPWRST('XXX','BUG ')
9934      ELSEIF(FINTX.LT.0.0 .OR. FINTX.GT.AN)THEN
9935        WRITE(ICOUT,4)N
9936        CALL DPWRST('XXX','BUG ')
9937        WRITE(ICOUT,46)X
9938        CALL DPWRST('XXX','BUG ')
9939        GOTO9999
9940      ENDIF
9941C
9942    4 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BBNPDF IS OUTSIDE ',
9943     1       'THE (0,',I8,') INTERVAL.')
9944    5 FORMAT('***** WARNING--THE FIRST ARGUMENT TO BBNPDF IS ',
9945     1        'NON-INTEGRAL.')
9946    6 FORMAT('      IT HAS BEEN SET TO ',I8)
9947   11 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ',
9948     1       'BBNPDF IS NON-POSITIVE.')
9949   12 FORMAT('***** ERROR--THE THIRD ARGUMENT TO ',
9950     1       ' BBNPDF IS NON-POSITIVE.')
9951   25 FORMAT('***** ERROR--THE FOURTH ARGUMENT TO ',
9952     1       ' BBNPDF SUBROUTINE IS NON-POSITIVE.')
9953   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
9954   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
9955C
9956      DX=DBLE(FINTX)
9957      DV=DBLE(V)
9958      DW=DBLE(W)
9959      DN=DBLE(N)
9960C
9961      DTERM1=DLOG(DN+1.0D0)
9962      DTERM2=DLBETA(DN-DX+DV,DX+DW)
9963      DTERM3=DLBETA(DN-DX+1.0D0,DX+1.0D0)
9964      DTERM4=DLBETA(DV,DW)
9965      DPDF=DTERM2-DTERM1-DTERM3-DTERM4
9966      IF(DPDF.LE.-80.D0)THEN
9967        PDF=0.0
9968      ELSEIF(DPDF.GT.80.D0)THEN
9969        WRITE(ICOUT,101)
9970        CALL DPWRST('XXX','BUG ')
9971        WRITE(ICOUT,46)X
9972        CALL DPWRST('XXX','BUG ')
9973        PDF=0.0
9974      ELSE
9975        DPDF=DEXP(DPDF)
9976        PDF=SNGL(DPDF)
9977      ENDIF
9978  101 FORMAT('****** FATAL ERROR--OVERFLOW IN BBNPDF ROUTINE.')
9979C
9980 9999 CONTINUE
9981      RETURN
9982      END
9983      SUBROUTINE BBNPPF(P,V,W,N,PPF)
9984C
9985C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
9986C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE P
9987C              FOR THE BETA-BINOMIAL DISTRIBUTION
9988C              WITH SINGLE PRECISION PARAMETERS V AND W
9989C              AND INTEGER 'NUMBER OF BERNOULLI TRIALS'
9990C              PARAMETER = N.
9991C              IF V AND W ARE INTEGERS, THIS BECOMES THE NEGATIVE
9992C              HYPERGEOMETRIC DISTRIBUTION.
9993C              THIS DISTRIBUTION IS DEFINED FOR ALL
9994C              DISCRETE INTEGER X BETWEEN 0 (INCLUSIVELY)
9995C              AND N (INCLUSIVELY).
9996C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
9997C              F(X) = B(N-X+V,X+B)/[(N+1)*B(N-X+1,X+1)*B(V,W)
9998C              WHERE B(A,B) IS THE BETA FUNCTION.
9999C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
10000C                                (BETWEEN 0.0 (INCLUSIVELY)
10001C                                AND 1.0 (INCLUSIVELY))
10002C                                AT WHICH THE PERCENT POINT
10003C                                FUNCTION IS TO BE EVALUATED.
10004C                     --V      = THE SINGLE PRECISION VALUE
10005C                                OF THE FIRST SHAPE PARAMETER.
10006C                     --W      = THE SINGLE PRECISION VALUE
10007C                                OF THE SECOND SHAPE PARAMETER.
10008C                     --N      = THE INTEGER VALUE
10009C                                OF THE 'NUMBER OF BERNOULLI TRIALS'
10010C                                PARAMETER.
10011C                                N SHOULD BE A POSITIVE INTEGER.
10012C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT
10013C                                POINT FUNCTION VALUE.
10014C     OUTPUT--THE SINGLE PRECISION PERCENT POINT  .
10015C             FUNCTION VALUE PPF
10016C             FOR THE BETA-BINOMIAL DISTRIBUTION
10017C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10018C     RESTRICTIONS--N SHOULD BE A POSITIVE INTEGER.
10019C                 --P SHOULD BE BETWEEN 0.0 (INCLUSIVELY)
10020C                   AND 1.0 (INCLUSIVELY).
10021C     OTHER DATAPAC   SUBROUTINES NEEDED--BBNCDF
10022C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION AND DOUBLE PRECISION.
10023C     LANGUAGE--ANSI FORTRAN (1977)
10024C     COMMENT--NOTE THAT EVEN THOUGH THE OUTPUT
10025C              FROM THIS DISCRETE DISTRIBUTION
10026C              PERCENT POINT FUNCTION
10027C              SUBROUTINE MUST NECESSARILY BE A
10028C              DISCRETE INTEGER VALUE,
10029C              THE OUTPUT VARIABLE PPF IS SINGLE
10030C              PRECISION IN MODE.
10031C              PPF HAS BEEN SPECIFIED AS SINGLE
10032C              PRECISION SO AS TO CONFORM WITH THE DATAPAC
10033C              CONVENTION THAT ALL OUTPUT VARIABLES FROM ALL
10034C              DATAPAC SUBROUTINES ARE SINGLE PRECISION.
10035C              THIS CONVENTION IS BASED ON THE BELIEF THAT
10036C              1) A MIXTURE OF MODES (FLOATING POINT
10037C              VERSUS INTEGER) IS INCONSISTENT AND
10038C              AN UNNECESSARY COMPLICATION
10039C              IN A DATA ANALYSIS; AND
10040C              2) FLOATING POINT MACHINE ARITHMETIC
10041C              (AS OPPOSED TO INTEGER ARITHMETIC)
10042C              IS THE MORE NATURAL MODE FOR DOING
10043C              DATA ANALYSIS.
10044C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
10045C                 DISTRIBUTIONS--2ND. ED., 1994, CHAPTER 5
10046C     WRITTEN BY--JAMES J. FILLIBEN
10047C                 STATISTICAL ENGINEERING DIVISION
10048C                 INFORMATION TECHNOLOGY LABORATORY
10049C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
10050C                 GAITHERSBURG, MD 20899-8980
10051C                 PHONE--301-975-2855
10052C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10053C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
10054C     LANGUAGE--ANSI FORTRAN (1966)
10055C     VERSION NUMBER--96/2
10056C     ORIGINAL VERSION--FEBRUARY  1996.
10057C     UPDATED         --MAY       1996. TEST FOR LOWER BOUND
10058C     UPDATED         --MARCH     2004. MODIFY THE ALGORITHM
10059C
10060C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10061C
10062C---------------------------------------------------------------------
10063C
10064C---------------------------------------------------------------------
10065C
10066      DOUBLE PRECISION DX, DV, DW, DN, DCDF
10067      DOUBLE PRECISION DTERM1, DTERM2, DTERM3, DTERM4
10068      DOUBLE PRECISION DLBETA
10069      DOUBLE PRECISION DSUM1
10070      DOUBLE PRECISION DP
10071C
10072      INCLUDE 'DPCOP2.INC'
10073C
10074C-----START POINT-----------------------------------------------------
10075C
10076C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10077C
10078      IF(P.LT.0.0.OR.P.GT.1.0)THEN
10079        WRITE(ICOUT,1)
10080        CALL DPWRST('XXX','BUG ')
10081        WRITE(ICOUT,46)P
10082        CALL DPWRST('XXX','BUG ')
10083        PPF=0.0
10084        GOTO9999
10085      ENDIF
10086      IF(V.LE.0.0)THEN
10087        WRITE(ICOUT,11)
10088        CALL DPWRST('XXX','BUG ')
10089        WRITE(ICOUT,46)V
10090        CALL DPWRST('XXX','BUG ')
10091        PDF=0.0
10092        GOTO9999
10093      ENDIF
10094      IF(W.LE.0.0)THEN
10095        WRITE(ICOUT,12)
10096        CALL DPWRST('XXX','BUG ')
10097        WRITE(ICOUT,46)V
10098        CALL DPWRST('XXX','BUG ')
10099        PDF=0.0
10100        GOTO9999
10101      ENDIF
10102      IF(N.LE.0)THEN
10103        WRITE(ICOUT,25)
10104        CALL DPWRST('XXX','BUG ')
10105        WRITE(ICOUT,47)N
10106        CALL DPWRST('XXX','BUG ')
10107        PDF=0.0
10108        GOTO9999
10109      ENDIF
10110    1 FORMAT('***** FATAL ERROR--THE FIRST INPUT ARGUMENT TO THE ',
10111     1' BBNPPF SUBROUTINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
10112   11 FORMAT('***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE ',
10113     1' BBNPPF SUBROUTINE IS NON-POSITIVE')
10114   12 FORMAT('***** FATAL ERROR--THE THIRD INPUT ARGUMENT TO THE ',
10115     1' BBNPPF SUBROUTINE IS NON-POSITIVE')
10116   25 FORMAT('***** FATAL ERROR--THE FOURTH INPUT ARGUMENT TO THE ',
10117     1' BBNPPF SUBROUTINE IS NON-POSITIVE *****')
10118   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
10119   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
10120C
10121      AN=N
10122      PPF=0.0
10123C
10124C     TREAT CERTAIN SPECIAL CASES IMMEDIATELY--
10125C     1) P = 0.0
10126C     2) P = 1.0
10127C
10128      IF(P.EQ.0.0)THEN
10129        PPF=0.0
10130        GOTO9999
10131      ENDIF
10132C
10133      IF(P.EQ.1.0)THEN
10134        PPF=REAL(N)
10135        GOTO9999
10136      ENDIF
10137C
10138C     COMPUTE THE BBNCDF, TERMINATE WHEN CDF IS GREATER THAN OR
10139C     EQUAL TO P.  COMPARISON PEFORMED ON LOG SCALE.
10140C
10141      DP=DBLE(P)
10142      DN=DBLE(N)
10143      DV=DBLE(V)
10144      DW=DBLE(W)
10145      DSUM1=0.0D0
10146      DO1000I=0,N
10147        DX=DBLE(I)
10148        DTERM1=DLOG(DN+1.0D0)
10149        DTERM2=DLBETA(DN-DX+DV,DX+DW)
10150        DTERM3=DLBETA(DN-DX+1.0D0,DX+1.0D0)
10151        DTERM4=DLBETA(DV,DW)
10152        DCDF=DEXP(DTERM2-DTERM1-DTERM3-DTERM4)
10153        DSUM1=DSUM1+DCDF
10154        IF(DSUM1.GE.DP)THEN
10155          PPF=REAL(I)
10156          GOTO9999
10157        ENDIF
10158 1000 CONTINUE
10159      PPF=REAL(N)
10160C
10161 9999 CONTINUE
10162      RETURN
10163      END
10164      SUBROUTINE BBNRAN(ALPHA,BETA,NPAR,N,ISEED,X)
10165C
10166C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
10167C              FROM THE BETA-BINOMIAL DISTRIBUTION
10168C              WITH SINGLE PRECISION 'BERNOULLI PROBABILITY'
10169C              PARAMETER = P FOLLOWING A BETA DISTRIBUTION WITH
10170C              SHAPE PARAMETERS ALPHA AND BETA,
10171C              AND INTEGER 'NUMBER OF BERNOULLI TRIALS'
10172C              PARAMETER = NPAR.
10173C              THIS DISTRIBUTION IS DEFINED FOR ALL
10174C              DISCRETE INTEGER X BETWEEN 0 (INCLUSIVELY)
10175C              AND NPAR (INCLUSIVELY).
10176C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
10177C                                OF RANDOM NUMBERS TO BE
10178C                                GENERATED.
10179C                     --ALPHA  = THE SINGLE PRECISION VALUE
10180C                                OF THE FIRST SHAPE PARAMETER OF THE
10181C                                BETA DISTRIBUTION.
10182C                                ALPHA > 0.
10183C                     --BETA   = THE SINGLE PRECISION VALUE
10184C                                OF THE SECOND SHAPE PARAMETER OF THE
10185C                                BETA DISTRIBUTION.
10186C                                BETA > 0.
10187C                     --NPAR   = THE INTEGER VALUE
10188C                                OF THE 'NUMBER OF BERNOULLI TRIALS'
10189C                                PARAMETER.
10190C                                NPAR SHOULD BE A POSITIVE INTEGER.
10191C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
10192C                                (OF DIMENSION AT LEAST N)
10193C                                INTO WHICH THE GENERATED
10194C                                RANDOM SAMPLE WILL BE PLACED.
10195C     OUTPUT--A RANDOM SAMPLE OF SIZE N
10196C             FROM THE BETA-BINOMIAL DISTRIBUTION.
10197C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10198C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
10199C                   OF N FOR THIS SUBROUTINE.
10200C                 --ALPHA, BETA > 0
10201C                 --NPAR SHOULD BE A POSITIVE INTEGER.
10202C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, GEORAN.
10203C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10204C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10205C     LANGUAGE--ANSI FORTRAN (1977)
10206C     COMMENT--NOTE THAT EVEN THOUGH THE OUTPUT
10207C              FROM THIS DISCRETE RANDOM NUMBER
10208C              GENERATOR MUST NECESSARILY BE A
10209C              SEQUENCE OF ***INTEGER*** VALUES,
10210C              THE OUTPUT VECTOR X IS SINGLE
10211C              PRECISION IN MODE.
10212C              X HAS BEEN SPECIFIED AS SINGLE
10213C              PRECISION SO AS TO CONFORM WITH THE DATAPAC
10214C              CONVENTION THAT ALL OUTPUT VECTORS FROM ALL
10215C              DATAPAC SUBROUTINES ARE SINGLE PRECISION.
10216C              THIS CONVENTION IS BASED ON THE BELIEF THAT
10217C              1) A MIXTURE OF MODES (FLOATING POINT
10218C              VERSUS INTEGER) IS INCONSISTENT AND
10219C              AN UNNECESSARY COMPLICATION
10220C              IN A DATA ANALYSIS; AND
10221C              2) FLOATING POINT MACHINE ARITHMETIC
10222C              (AS OPPOSED TO INTEGER ARITHMETIC)
10223C              IS THE MORE NATURAL MODE FOR DOING
10224C              DATA ANALYSIS.
10225C     REFERENCES--JOHNSON AND KOTZ, DISCRETE
10226C                 DISTRIBUTIONS, 1969, PAGES 50-86.
10227C               --HASTINGS AND PEACOCK, STATISTICAL
10228C                 DISTRIBUTIONS--A HANDBOOK FOR
10229C                 STUDENTS AND PRACTITIONERS, 1975,
10230C                 PAGE 41.
10231C               --FELLER, AN INTRODUCTION TO PROBABILITY
10232C                 THEORY AND ITS APPLICATIONS, VOLUME 1,
10233C                 EDITION 2, 1957, PAGES 135-142.
10234C               --NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY APPLIED MATHEMATICS
10235C                 SERIES 55, 1964, PAGE 929.
10236C               --KENDALL AND STUART, THE ADVANCED THEORY OF
10237C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 120-125.
10238C               --MOOD AND GRABLE, INTRODUCTION TO THE THEORY
10239C                 OF STATISTICS, EDITION 2, 1963, PAGES 64-69.
10240C               --TOCHER, THE ART OF SIMULATION,
10241C                 1963, PAGES 39-40.
10242C     WRITTEN BY--JAMES J. FILLIBEN
10243C                 STATISTICAL ENGINEERING DIVISION
10244C                 INFORMATION TECHNOLOGY LABORATORY
10245C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
10246C                 GAITHERSBURG, MD 20899-8980
10247C                 PHONE--301-921-3651
10248C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10249C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
10250C     LANGUAGE--ANSI FORTRAN (1966)
10251C     VERSION NUMBER--2001/12
10252C     ORIGINAL VERSION--DECEMBER  2001.
10253C
10254C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10255C
10256C---------------------------------------------------------------------
10257C
10258      DIMENSION X(*)
10259C
10260      DIMENSION U(2)
10261      DIMENSION G(2)
10262C
10263C---------------------------------------------------------------------
10264C
10265      INCLUDE 'DPCOP2.INC'
10266C
10267C-----START POINT-----------------------------------------------------
10268C
10269C     CHECK THE INPUT ARGUMENTS FOR ERRORS
10270C
10271      IF(N.LT.1)THEN
10272        WRITE(ICOUT, 5)
10273        CALL DPWRST('XXX','BUG ')
10274        WRITE(ICOUT,47)N
10275        CALL DPWRST('XXX','BUG ')
10276        GOTO9000
10277      ENDIF
10278      IF(ALPHA.LE.0.0)THEN
10279        WRITE(ICOUT,11)
10280        CALL DPWRST('XXX','BUG ')
10281        WRITE(ICOUT,46)ALPHA
10282        CALL DPWRST('XXX','BUG ')
10283        GOTO9000
10284      ENDIF
10285      IF(BETA.LE.0.0)THEN
10286        WRITE(ICOUT,12)
10287        CALL DPWRST('XXX','BUG ')
10288        WRITE(ICOUT,46)BETA
10289        CALL DPWRST('XXX','BUG ')
10290        GOTO9000
10291      ENDIF
10292      IF(NPAR.LT.1)THEN
10293        WRITE(ICOUT,25)
10294        CALL DPWRST('XXX','BUG ')
10295        WRITE(ICOUT,47)NPAR
10296        CALL DPWRST('XXX','BUG ')
10297        GOTO9000
10298      ENDIF
10299    5 FORMAT('***** FATAL ERROR--NUMBER OF BETA-BINOMIAL RANDOM ',
10300     1'NUMBERS REQUESTED < 1')
10301   11 FORMAT('***** FATAL ERROR--THE ALPHA SHAPE PARAMETER ARGUMENT',
10302     1' TO THE BBNRAN SUBROUTINE IS <= 0')
10303   12 FORMAT('***** FATAL ERROR--THE BETA SHAPE PARAMETER ARGUMENT',
10304     1' TO THE BBNRAN SUBROUTINE IS <= 0')
10305   25 FORMAT('***** FATAL ERROR--THE NUMBER OF TRIALS ARGUMENT TO THE',
10306     1' BBNRAN SUBROUTINE IS NON-POSITIVE *****')
10307   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
10308   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
10309C
10310C     FIRST, GENERATE N BETA RANDOM NUMBERS.
10311C
10312      CALL BETRAN(N,ALPHA,BETA,ISEED,X)
10313C
10314C     CHECK ON THE MAGNITUDE OF P,
10315C     AND BRANCH TO THE FASTER
10316C     GENERATION METHOD ACCORDINGLY.
10317C
10318      DO100I=1,N
10319C
10320      P=X(I)
10321C
10322      IF(P.LT.0.1)THEN
10323C
10324C       IF P IS SMALL, GENERATE N BINOMIAL NUMBERS
10325C       USING THE FACT THAT THE WAITING TIME FOR 1 SUCCESS IN
10326C       BERNOULLI TRIALS HAS A GEOMETRIC DISTRIBUTION.
10327C
10328        ISUM=0
10329        J=1
10330  550   CONTINUE
10331        CALL GEORAN(1,P,ISEED,G)
10332        IG=INT(G(1)+0.5)
10333        ISUM=ISUM+IG+1
10334        IF(ISUM.GT.NPAR)GOTO650
10335        J=J+1
10336        GOTO550
10337  650   CONTINUE
10338        X(I)=J-1
10339      ELSE
10340C
10341C       IF P IS MODERATE OR LARGE,
10342C       GENERATE N BINOMIAL RANDOM NUMBERS
10343C       USING THE REJECTION METHOD.
10344C
10345        ISUM=0
10346        DO200J=1,NPAR
10347          CALL UNIRAN(1,ISEED,U)
10348          IF(U(1).LE.P)ISUM=ISUM+1
10349  200   CONTINUE
10350        X(I)=ISUM
10351      ENDIF
10352C
10353  100 CONTINUE
10354C
10355 9000 CONTINUE
10356      RETURN
10357C
10358      END
10359      SUBROUTINE BBNSET(N, IX, IN, RL, MRL, LM, IFAULT)
10360C
10361C        ALGORITHM AS 189.2 APPL. STATIST. (1983) VOL.32, NO.2
10362C
10363C        SUBROUTINE FOR SETTING UP ARRAY FOR CALCULATION OF
10364C        THE BETA BINOMIAL LOG LIKELIHOOD AND ITS DERIVATIVES
10365C
10366      INTEGER IX(N), IN(N), RL(MRL,3), LM(3)
10367C
10368C     TEST ADMISSIBILITY OF DATA
10369C
10370      IF(N.GT.1) GOTO 5
10371      IFAULT = 1
10372      RETURN
10373    5 DO 10 I = 1,N
10374        IF(IX(I).GT.0) GOTO 15
10375   10 CONTINUE
10376      IFAULT = 2
10377      RETURN
10378   15 CONTINUE
10379      DO 20 I = 1,N
10380        IF(IX(I).LT.IN(I)) GOTO 25
10381   20 CONTINUE
10382      IFAULT = 3
10383      RETURN
10384C
10385C        FORM MATRIX OF COUNTS
10386C
10387   25 CONTINUE
10388      IFAULT = 4
10389      DO 30 I = 1,3
10390        LM(I) = 0
10391        DO 32 J = 1,MRL
10392          RL(J,I) = 0
10393   32   CONTINUE
10394   30 CONTINUE
10395      DO 65 I = 1,N
10396        JJ = IX(I)
10397        MAR = 1
10398        GOTO 45
10399   35   JJ = IN(I)-IX(I)
10400        MAR = 2
10401        GOTO 45
10402   40   JJ = IN(I)
10403        MAR = 3
10404   45   CONTINUE
10405CCCCC   IF(JJ) 50,60,55
10406        IF(JJ.LT.0)THEN
10407          GOTO50
10408        ELSEIF(JJ.EQ.0)THEN
10409          GOTO60
10410        ELSEIF(JJ.GT.0)THEN
10411          GOTO55
10412        ENDIF
10413   50   IFAULT = 5
10414        RETURN
10415   55   IF(JJ.GT.MRL) RETURN
10416        IF(JJ.GT.LM(MAR)) LM(MAR) = JJ
10417        RL(JJ,MAR) = RL(JJ,MAR)+1
10418   60   GOTO(35,40,65) MAR
10419   65 CONTINUE
10420      IFAULT = 0
10421C
10422C        EVALUATE NUMBER OF CALLS TO DIFFERENT TERMS OF LIKELIHOOD
10423C        FUNCTION
10424C
10425      DO 75 I = 1,3
10426        JJ = LM(I)-1
10427        IF(JJ.LE.0) GOTO 75
10428        K = JJ
10429        DO 70 J = 1,JJ
10430          RL(K,I) = RL(K,I)+RL(K+1,I)
10431          K = K-1
10432   70   CONTINUE
10433   75 CONTINUE
10434      RETURN
10435      END
10436      SUBROUTINE BCNORM(Y,N,X2TEMP,Y2TEMP,D2TEMP,
10437     1                  PPCC,ALAMBA,
10438     1                  IBUGA3,ISUBRO,IERROR)
10439C
10440C     PURPOSE--THIS SUBROUTINE COMPUTES THE PPCC VALUE AND THE
10441C              OPTIMAL LAMBDA VALUE FOR THE BOX-COX NORMALITY
10442C              TRANSFORMATION.
10443C     INPUT  ARGUMENTS--Y      = THE SINGLE PRECISION VECTOR OF
10444C                                (UNSORTED OR SORTED) OBSERVATIONS.
10445C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
10446C                                IN THE VECTOR X.
10447C     OUTPUT ARGUMENTS--PPCC   = THE SINGLE PRECISION VALUE OF THE
10448C                                COMPUTED NORMAL PPCC FOR THE OPTIMAL
10449C                                VALUE OF LAMBDA FOR THE BOX-COX
10450C                                TRANSFORMATION.
10451C                     --ALAMB  = THE SINGLE PRECISION VALUE OF THE
10452C                                LAMBDA PARAMETER THAT RESULTS IN THE
10453C                                MAXIMUM NORMAL PPCC VALUE.
10454C     OUTPUT--NONE.
10455C     PRINTING--YES.
10456C     OTHER DATAPAC   SUBROUTINES NEEDED--SORT, UNIMED, NORPPF.
10457C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
10458C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
10459C     LANGUAGE--ANSI FORTRAN (1977)
10460C     WRITTEN BY--ALAN HECKERT
10461C                 STATISTICAL ENGINEERING DIVISION
10462C                 INFORMATION TECHNOLOGY LABORATORY
10463C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
10464C                 GAITHERSBURG, MD 20899-8980
10465C                 PHONE--301-975-2855
10466C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10467C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
10468C     LANGUAGE--ANSI FORTRAN (1977)
10469C     VERSION NUMBER--2014.7
10470C     ORIGINAL VERSION (AS A SEPARATE SUBROUTINE)--JULY      2014.
10471C
10472C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10473C
10474      CHARACTER*4 IBUGA3
10475      CHARACTER*4 ISUBRO
10476      CHARACTER*4 IERROR
10477C
10478      CHARACTER*4 ISUBN1
10479      CHARACTER*4 ISUBN2
10480C
10481C---------------------------------------------------------------------
10482C
10483      DIMENSION Y(*)
10484      DIMENSION X2TEMP(*)
10485      DIMENSION Y2TEMP(*)
10486      DIMENSION D2TEMP(*)
10487C
10488C---------------------------------------------------------------------
10489C
10490      INCLUDE 'DPCOP2.INC'
10491C
10492C-----START POINT-----------------------------------------------------
10493C
10494      ISUBN1='BCNO'
10495      ISUBN2='RM  '
10496      IERROR='NO'
10497C
10498C     COMPUTE NORMAL ORDER STATISTIC MEDIANS
10499C
10500      CALL UNIMED(N,X2TEMP)
10501      DO110I=1,N
10502        CALL NORPPF(X2TEMP(I),X2OUT)
10503        X2TEMP(I)=X2OUT
10504  110 CONTINUE
10505C
10506C     SORT DATA AND SHIFT DATA TO MAKE IT POSITIVE
10507C
10508      CALL SORT(Y,N,D2TEMP)
10509      XMIN=D2TEMP(1)
10510      IF(XMIN.LE.0.0)THEN
10511        DO112I=1,N
10512          D2TEMP(I)=D2TEMP(I)-XMIN+1.0
10513  112   CONTINUE
10514      ENDIF
10515C
10516      ALAMBA=-2.0
10517      ALAMSV=ALAMBA
10518      AINC=0.1
10519      CCMAX=CPUMIN
10520C
10521      DO140IDIS=1,41
10522C
10523C       LOG TRANSFORMATION
10524C
10525        IF(-0.001.LE.ALAMBA.AND.ALAMBA.LE.0.001)THEN
10526          ALAMBA=0.0
10527          DO141I=1,N
10528            Y2TEMP(I)=LOG(D2TEMP(I))
10529  141     CONTINUE
10530        ELSE
10531          DO146I=1,N
10532            Y2TEMP(I)=((D2TEMP(I)**ALAMBA)-1.0)/ALAMBA
10533  146     CONTINUE
10534        ENDIF
10535C
10536        AN1=N
10537        SUMY=0.0
10538        DO151I=1,N
10539          SUMY=SUMY+Y2TEMP(I)
10540  151   CONTINUE
10541        XBAR=0.0
10542        YBAR=SUMY/AN1
10543C
10544        SUMX=0.0
10545        SUMY=0.0
10546        SUMXY=0.0
10547        DO152I=1,N
10548          SUMX=SUMX+(X2TEMP(I)-XBAR)*(X2TEMP(I)-XBAR)
10549          SUMY=SUMY+(Y2TEMP(I)-YBAR)*(Y2TEMP(I)-YBAR)
10550          SUMXY=SUMXY+(X2TEMP(I)-XBAR)*(Y2TEMP(I)-YBAR)
10551  152   CONTINUE
10552        ARG=SUMX*SUMY
10553        CC=0.0
10554        IF(ARG.GT.0.0)CC=SUMXY/SQRT(ARG)
10555        IF(CC.GT.CCMAX)THEN
10556          CCMAX=CC
10557          ALAMSV=ALAMBA
10558        ENDIF
10559C
10560        ALAMBA=ALAMBA + AINC
10561C
10562  140 CONTINUE
10563C
10564      ALAMBA=ALAMSV
10565      PPCC=CCMAX
10566C
10567C               *****************
10568C               **  STEP 90--  **
10569C               **  EXIT.      **
10570C               *****************
10571C
10572      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NORM')THEN
10573        WRITE(ICOUT,999)
10574  999   FORMAT(1X)
10575        CALL DPWRST('XXX','BUG ')
10576        WRITE(ICOUT,9011)
10577 9011   FORMAT('***** AT THE END       OF BCNORM--')
10578        CALL DPWRST('XXX','BUG ')
10579        WRITE(ICOUT,9012)IBUGA3,IERROR
10580 9012   FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
10581        CALL DPWRST('XXX','BUG ')
10582        WRITE(ICOUT,9014)ALAMBA,PPCC
10583 9014   FORMAT('ALAMBA,PPCC = ',2G15.7)
10584        CALL DPWRST('XXX','BUG ')
10585      ENDIF
10586C
10587      RETURN
10588      END
10589      DOUBLE PRECISION FUNCTION bcorr(a0,b0)
10590C-----------------------------------------------------------------------
10591C
10592C     EVALUATION OF  DEL(A0) + DEL(B0) - DEL(A0 + B0)  WHERE
10593C     LN(GAMMA(A)) = (A - 0.5)*LN(A) - A + 0.5*LN(2*PI) + DEL(A).
10594C     IT IS ASSUMED THAT A0 .GE. 8 AND B0 .GE. 8.
10595C
10596C-----------------------------------------------------------------------
10597C     .. Scalar Arguments ..
10598      DOUBLE PRECISION a0,b0
10599C     ..
10600C     .. Local Scalars ..
10601      DOUBLE PRECISION a,b,c,c0,c1,c2,c3,c4,c5,h,s11,s3,s5,s7,s9,t,w,x,
10602     +                 x2
10603C     ..
10604C     .. Intrinsic Functions ..
10605      INTRINSIC dmax1,dmin1
10606C     ..
10607C     .. Data statements ..
10608      DATA c0/.833333333333333D-01/,c1/-.277777777760991D-02/,
10609     +     c2/.793650666825390D-03/,c3/-.595202931351870D-03/,
10610     +     c4/.837308034031215D-03/,c5/-.165322962780713D-02/
10611C     ..
10612C     .. Executable Statements ..
10613C------------------------
10614      a = dmin1(a0,b0)
10615      b = dmax1(a0,b0)
10616C
10617      h = a/b
10618      c = h/ (1.0D0+h)
10619      x = 1.0D0/ (1.0D0+h)
10620      x2 = x*x
10621C
10622C                SET SN = (1 - X**N)/(1 - X)
10623C
10624      s3 = 1.0D0 + (x+x2)
10625      s5 = 1.0D0 + (x+x2*s3)
10626      s7 = 1.0D0 + (x+x2*s5)
10627      s9 = 1.0D0 + (x+x2*s7)
10628      s11 = 1.0D0 + (x+x2*s9)
10629C
10630C                SET W = DEL(B) - DEL(A + B)
10631C
10632      t = (1.0D0/b)**2
10633      w = ((((c5*s11*t+c4*s9)*t+c3*s7)*t+c2*s5)*t+c1*s3)*t + c0
10634      w = w* (c/b)
10635C
10636C                   COMPUTE  DEL(A) + W
10637C
10638      t = (1.0D0/a)**2
10639      bcorr = (((((c5*t+c4)*t+c3)*t+c2)*t+c1)*t+c0)/a + w
10640      RETURN
10641
10642      END
10643      SUBROUTINE BEICDF(X,S1SQ,S2SQ,NU,IBEIDF,DCDF)
10644C
10645C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
10646C              FUNCTION VALUE FOR THE BESSEL I-FUNCTION
10647C              DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ, AND
10648C              NU.  THE CUMULATIVE DISTRIBUTION IS COMPUTED BY
10649C              NUMERICALLY INTEGRATING THE PDF FUNCTION.
10650C     INPUT  ARGUMENTS--X       = THE SINGLE PRECISION VALUE AT
10651C                                 WHICH THE CUMULATIVE DISTRIBUTION
10652C                                 FUNCTION IS TO BE EVALUATED.
10653C                     --S1SQ    = THE FIRST SHAPE PARAMETER
10654C                     --S2SQ    = THE SECOND SHAPE PARAMETER
10655C                     --NU      = THE THIRD SHAPE PARAMETER
10656C     OUTPUT ARGUMENTS--CDF     = THE SINGLE PRECISION CUMULATIVE
10657C                                 DISTRIBUTION FUNCTION VALUE.
10658C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
10659C             FUNCTION VALUE FOR THE BESSEL I-FUNCTION
10660C             DISTRIBUTION WITH SHAPE PARAMETERS S1SQ,
10661C             S2SQ, AND NU.
10662C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10663C     RESTRICTIONS--NONE.
10664C     OTHER DATAPAC   SUBROUTINES NEEDED--DQAGI.
10665C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10666C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
10667C     LANGUAGE--ANSI FORTRAN (1977)
10668C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, (1994), "CONTINUOUS
10669C                 UNIVARIATE DISTRIBUTIONS--VOLUME 1", SECOND EDITION,
10670C                 WILEY, PP. 50-52.
10671C     WRITTEN BY--JAMES J. FILLIBEN
10672C                 STATISTICAL ENGINEERING DIVISION
10673C                 INFORMATION TECHNOLOGY LABORATORY
10674C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
10675C                 GAITHERSBURG, MD 20899-8980
10676C                 PHONE--301-975-2855
10677C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10678C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10679C     LANGUAGE--ANSI FORTRAN (1977)
10680C     VERSION NUMBER--2004.8
10681C     ORIGINAL VERSION--AUGUST    2004.
10682C
10683C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
10684C
10685C---------------------------------------------------------------------
10686C
10687      CHARACTER*4 IBEIDF
10688C
10689      INTEGER LIMIT
10690      INTEGER LENW
10691      PARAMETER(LIMIT=100)
10692      PARAMETER(LENW=4*LIMIT)
10693CCCCC INTEGER INF
10694      INTEGER NEVAL
10695      INTEGER IER
10696      INTEGER LAST
10697      INTEGER IWORK(LIMIT)
10698      DOUBLE PRECISION S1SQ
10699      DOUBLE PRECISION S2SQ
10700      DOUBLE PRECISION NU
10701      DOUBLE PRECISION EPSABS
10702      DOUBLE PRECISION EPSREL
10703CCCCC DOUBLE PRECISION RESULT
10704      DOUBLE PRECISION DCDF
10705      DOUBLE PRECISION DEPS
10706      DOUBLE PRECISION DLOW
10707      DOUBLE PRECISION DUPP
10708      DOUBLE PRECISION X
10709CCCCC DOUBLE PRECISION DX
10710      DOUBLE PRECISION DB
10711      DOUBLE PRECISION DC
10712      DOUBLE PRECISION DM
10713      DOUBLE PRECISION ABSERR
10714      DOUBLE PRECISION WORK(LENW)
10715C
10716      DOUBLE PRECISION BEIFUN
10717      EXTERNAL BEIFUN
10718C
10719      DOUBLE PRECISION DS1SQ
10720      DOUBLE PRECISION DS2SQ
10721      DOUBLE PRECISION DNU
10722      CHARACTER*4 IBEID2
10723      COMMON/BEICOM/DS1SQ,DS2SQ,DNU,IBEID2
10724C
10725C---------------------------------------------------------------------
10726C
10727      INCLUDE 'DPCOP2.INC'
10728C
10729C-----DATA STATEMENTS-------------------------------------------------
10730C
10731C-----START POINT-----------------------------------------------------
10732C
10733C               ********************************************
10734C               **  STEP 1--                              **
10735C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
10736C               ********************************************
10737C
10738      IF(IBEIDF.EQ.'1')THEN
10739        DB=4.0D0*S1SQ*S2SQ/(S1SQ - S2SQ)
10740        DC=(S1SQ + S2SQ)/(S1SQ - S2SQ)
10741        DM=2.0D0*NU + 1.0D0
10742      ELSE
10743        DB=S1SQ
10744        DC=S2SQ
10745        DM=NU
10746      ENDIF
10747C
10748      IF(DABS(DC).LE.1.0D0)THEN
10749        WRITE(ICOUT,9)
10750        CALL DPWRST('XXX','WRIT')
10751        WRITE(ICOUT,10)
10752        CALL DPWRST('XXX','WRIT')
10753        WRITE(ICOUT,11)
10754        CALL DPWRST('XXX','WRIT')
10755        WRITE(ICOUT,12)S1SQ
10756        CALL DPWRST('XXX','WRIT')
10757        WRITE(ICOUT,13)S2SQ
10758        CALL DPWRST('XXX','WRIT')
10759        WRITE(ICOUT,14)DC
10760        CALL DPWRST('XXX','WRIT')
10761        CDF=0.0D0
10762        GOTO9000
10763      ENDIF
10764    9 FORMAT('***** ERROR: ABSOLUTE VALUE OF 1 - C**2 <= 1 ',
10765     1       'IN BEICDF ROUTINE.')
10766   10 FORMAT('      C = (S1**2 + S2**2)/(S1**2 - S2**2) WHERE ',
10767     1       'S1**2 AND S2**2')
10768   11 FORMAT('      ARE THE FIRST AND SECOND SHAPE PARAMETERS, ',
10769     1       'RESPECTIVELY.')
10770   12 FORMAT('      VALUE OF S1**2 IS: ',G15.7)
10771   13 FORMAT('      VALUE OF S2**2 IS: ',G15.7)
10772   14 FORMAT('      VALUE OF C IS:     ',G15.7)
10773      IF(DC.GT.0.0D0 .AND. X.LE.0.0D0)THEN
10774        WRITE(ICOUT,24)
10775        CALL DPWRST('XXX','WRIT')
10776        WRITE(ICOUT,25)
10777        CALL DPWRST('XXX','WRIT')
10778        WRITE(ICOUT,48)X
10779        CALL DPWRST('XXX','WRIT')
10780        CDF=0.0D0
10781        GOTO9000
10782      ENDIF
10783   24 FORMAT('***** ERROR: VALUE OF THE INPUT ARGUMENT ',
10784     1       'IN BEICDF ROUTINE IS NON-POSITIVE')
10785   25 FORMAT('      FOR THE CASE WHERE S1**2 > S2**2 (THESE ARE THE ',
10786     1       'FIRST AND SECOND SHAPE PARAMETERS).')
10787      IF(DC.LT.0.0D0 .AND. X.GE.0.0D0)THEN
10788        WRITE(ICOUT,34)
10789        CALL DPWRST('XXX','WRIT')
10790        WRITE(ICOUT,35)
10791        CALL DPWRST('XXX','WRIT')
10792        WRITE(ICOUT,48)X
10793        CALL DPWRST('XXX','WRIT')
10794        CDF=0.0D0
10795        GOTO9000
10796      ENDIF
10797   34 FORMAT('***** ERROR: VALUE OF THE INPUT ARGUMENT ',
10798     1       'IN BEICDF ROUTINE IS NON-NEGATIVE')
10799   35 FORMAT('      FOR THE CASE WHERE S1**2 < S2**2 (THESE ARE THE ',
10800     1       'FIRST AND SECOND SHAPE PARAMETERS).')
10801      IF(S1SQ.LE.0.0D0)THEN
10802        WRITE(ICOUT,5)
10803        CALL DPWRST('XXX','WRIT')
10804        WRITE(ICOUT,48)S1SQ
10805        CALL DPWRST('XXX','WRIT')
10806        CDF=0.0D0
10807        GOTO9000
10808      ENDIF
10809    5 FORMAT('***** ERROR: VALUE OF FIRST SHAPE PARAMETER (SIGMA1**2)',
10810     1       ' IN BEICDF ROUTINE IS NON-POSITIVE.')
10811      IF(S2SQ.LE.0.0D0)THEN
10812        WRITE(ICOUT,6)
10813        CALL DPWRST('XXX','WRIT')
10814        WRITE(ICOUT,48)S2SQ
10815        CALL DPWRST('XXX','WRIT')
10816        CDF=0.0D0
10817        GOTO9000
10818      ENDIF
10819    6 FORMAT('***** ERROR: VALUE OF SECOND SHAPE PARAMETER ',
10820     1       '(SIGMA2**2) IN BEICDF ROUTINE IS NON-POSITIVE.')
10821      IF(IBEIDF.EQ.'1')THEN
10822        IF(NU.LE.-0.25D0)THEN
10823          WRITE(ICOUT,7)
10824          CALL DPWRST('XXX','WRIT')
10825          WRITE(ICOUT,48)NU
10826          CALL DPWRST('XXX','WRIT')
10827          CDF=0.0D0
10828          GOTO9000
10829        ENDIF
10830      ELSE
10831        IF(DM.LE.0.5D0)THEN
10832          WRITE(ICOUT,8)
10833          CALL DPWRST('XXX','WRIT')
10834          WRITE(ICOUT,48)DM
10835          CALL DPWRST('XXX','WRIT')
10836          CDF=0.0D0
10837          GOTO9000
10838        ENDIF
10839      ENDIF
10840    7 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (NU) IN ',
10841     1       'BEICDF ROUTINE IS < -0.25.')
10842    8 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (M) IN ',
10843     1       'BEICDF ROUTINE IS <= 0.5.')
10844C
10845   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
10846C
10847C
10848C               ************************************
10849C               **  STEP 1--                      **
10850C               **  COMPUTE THE DENSITY FUNCTION  **
10851C               ************************************
10852C
10853      EPSABS=0.0D0
10854      EPSREL=1.0D-7
10855      IER=0
10856      IKEY=3
10857      DEPS=1.0D-12
10858C
10859      DS1SQ=S1SQ
10860      DS2SQ=S2SQ
10861      DNU=NU
10862      IBEID2=IBEIDF
10863      DCDF=0.0D0
10864C
10865      IF(DC.GT.0.0D0)THEN
10866        IF(X.LE.DEPS)THEN
10867          DCDF=0.0D0
10868          GOTO9000
10869        ENDIF
10870        DLOW=DEPS
10871        DUPP=X
10872      ELSE
10873        IF(DABS(X).LE.DEPS)THEN
10874          DCDF=1.0D0
10875          GOTO9000
10876        ENDIF
10877        DLOW=X
10878        DUPP=-DEPS
10879      ENDIF
10880C
10881      CALL DQAG(BEIFUN,DLOW,DUPP,EPSABS,EPSREL,IKEY,DCDF,ABSERR,NEVAL,
10882     1          IER,LIMIT,LENW,LAST,IWORK,WORK)
10883C
10884      IF(DC.LT.0.0D0)THEN
10885        DCDF=1.0D0 - DCDF
10886      ENDIF
10887C
10888      IF(IER.EQ.1)THEN
10889        WRITE(ICOUT,999)
10890  999   FORMAT(1X)
10891        CALL DPWRST('XXX','BUG ')
10892        WRITE(ICOUT,111)
10893  111   FORMAT('***** ERROR FROM BEICDF--')
10894        CALL DPWRST('XXX','BUG ')
10895        WRITE(ICOUT,113)
10896  113   FORMAT('      MAXIMUM NUMBER OF SUBDIVISIONS EXCEEDED.')
10897        CALL DPWRST('XXX','BUG ')
10898      ELSEIF(IER.EQ.2)THEN
10899        WRITE(ICOUT,999)
10900        CALL DPWRST('XXX','BUG ')
10901        WRITE(ICOUT,121)
10902  121   FORMAT('***** ERROR FROM BEICDF--')
10903        CALL DPWRST('XXX','BUG ')
10904        WRITE(ICOUT,123)
10905  123   FORMAT('      ROUNDOFF ERROR PREVENTS REQUESTED TOLERANCE ',
10906     1         'FROM BEING ACHIEVED.')
10907        CALL DPWRST('XXX','BUG ')
10908      ELSEIF(IER.EQ.3)THEN
10909        WRITE(ICOUT,999)
10910        CALL DPWRST('XXX','BUG ')
10911        WRITE(ICOUT,131)
10912  131   FORMAT('***** ERROR FROM BEICDF--')
10913        CALL DPWRST('XXX','BUG ')
10914        WRITE(ICOUT,133)
10915  133   FORMAT('      BAD INTEGRAND BEHAVIOUR DETECTED.')
10916        CALL DPWRST('XXX','BUG ')
10917      ELSEIF(IER.EQ.4)THEN
10918        WRITE(ICOUT,999)
10919        CALL DPWRST('XXX','BUG ')
10920        WRITE(ICOUT,141)
10921  141   FORMAT('***** ERROR FROM BEICDF--')
10922        CALL DPWRST('XXX','BUG ')
10923        WRITE(ICOUT,143)
10924  143   FORMAT('      INTEGRATION DID NOT CONVERGE.')
10925        CALL DPWRST('XXX','BUG ')
10926      ELSEIF(IER.EQ.5)THEN
10927        WRITE(ICOUT,999)
10928        CALL DPWRST('XXX','BUG ')
10929        WRITE(ICOUT,151)
10930  151   FORMAT('***** ERROR FROM BEICDF--')
10931        CALL DPWRST('XXX','BUG ')
10932        WRITE(ICOUT,153)
10933  153   FORMAT('      THE INTEGRATION IS PROBABLY DIVERGENT.')
10934        CALL DPWRST('XXX','BUG ')
10935      ELSEIF(IER.EQ.6)THEN
10936        WRITE(ICOUT,999)
10937        CALL DPWRST('XXX','BUG ')
10938        WRITE(ICOUT,161)
10939  161   FORMAT('***** ERROR FROM BEICDF--')
10940        CALL DPWRST('XXX','BUG ')
10941        WRITE(ICOUT,163)
10942  163   FORMAT('      INVALID INPUT TO THE INTEGRATION ROUTINE.')
10943        CALL DPWRST('XXX','BUG ')
10944      ENDIF
10945C
10946 9000 CONTINUE
10947      RETURN
10948      END
10949      DOUBLE PRECISION FUNCTION BEIFUN(DX)
10950C
10951C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
10952C              FUNCTION VALUE FOR THE BESSEL I-FUNCTION
10953C              DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ, AND NU.
10954C              THIS DISTRIBUTION IS DEFINED FOR POSITIVE X
10955C              AND HAS THE PROBABILITY DENSITY FUNCTION
10956C
10957C                 BEIPDF(X,S1AQ,S2SQ,ANU) =
10958C                        K*X**M*EXP(-C*X/B)*PI*I(X/B,M)      X > 0
10959C              WITH
10960C                 B = 4*S1SQ**2*S2SQ**2/(S1SQ**2 - S2SQ**2)
10961C                 C = (S1SQ**2 + S2SQ**2/(S1SQ**2 - S2SQ**2)
10962C                 M = 2*NU + 1
10963C              AND
10964C                 K = |1 - C**2|**(M+0.5)/[SQRT(PI)*2**M*b**(M+1)*
10965C                     GAMMA(M+0.5)]
10966C                 I(Z,N) IS THE MODIFIED BESSEL FUNCTION OF THE
10967C                        FIRST KIND
10968C                 GAMMA IS THE GAMMA FUNCTION
10969C
10970C              THE BEIPDF ROUTINE IS CALLED TO COMPUTE THE
10971C              PROBABILITY DENSITY.  DEFINE AS FUNCTION TO BE USED FOR
10972C              INTEGRATION CODE CALLED BY BEICDF.  THIS ROUTINE USES
10973C              DOUBLE PRECISION ARITHMETIC.
10974C     INPUT  ARGUMENTS--DX      = THE DOUBLE PRECISION VALUE AT
10975C                                 WHICH THE PROBABILITY DENSITY
10976C                                 FUNCTION IS TO BE EVALUATED.
10977C     OUTPUT ARGUMENTS--BEIFUN  = THE DOUBLE PRECISION PROBABILITY
10978C                                 DENSITY FUNCTION VALUE.
10979C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
10980C             FUNCTION VALUE PDF FOR THE BESSEL I-FUNCTION
10981C             DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ, AND NU.
10982C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
10983C     RESTRICTIONS--NONE.
10984C     OTHER DATAPAC   SUBROUTINES NEEDED--BEIPDF.
10985C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
10986C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
10987C     LANGUAGE--ANSI FORTRAN (1977)
10988C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, (1994), "CONTINUOUS
10989C                 UNIVARIATE DISTRIBUTIONS--VOLUME 1", SECOND EDITION,
10990C                 WILEY, PP. 50-53.
10991C     WRITTEN BY--JAMES J. FILLIBEN
10992C                 STATISTICAL ENGINEERING DIVISION
10993C                 INFORMATION TECHNOLOGY LABORATORY
10994C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
10995C                 GAITHERSBURG, MD 20899-8980
10996C                 PHONE--301-975-2855
10997C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
10998C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
10999C     LANGUAGE--ANSI FORTRAN (1977)
11000C     VERSION NUMBER--2004.8
11001C     ORIGINAL VERSION--AUGUST    2004.
11002C
11003C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11004C
11005C---------------------------------------------------------------------
11006C
11007      DOUBLE PRECISION DTERM
11008C
11009      DOUBLE PRECISION DX
11010      DOUBLE PRECISION DS1SQ
11011      DOUBLE PRECISION DS2SQ
11012      DOUBLE PRECISION DNU
11013      CHARACTER*4 IBEID2
11014      COMMON/BEICOM/DS1SQ,DS2SQ,DNU,IBEID2
11015C
11016C---------------------------------------------------------------------
11017C
11018      INCLUDE 'DPCOP2.INC'
11019C
11020C-----DATA STATEMENTS-------------------------------------------------
11021C
11022C-----START POINT-----------------------------------------------------
11023C
11024C               ************************************
11025C               **  STEP 1--                      **
11026C               **  COMPUTE THE DENSITY FUNCTION  **
11027C               ************************************
11028C
11029CCCCC CALL BEIPD2(DX,DS1SQ,DS2SQ,DNU,DTERM)
11030      CALL BEIPDF(DX,DS1SQ,DS2SQ,DNU,IBEID2,DTERM)
11031      BEIFUN=DTERM
11032C
11033      RETURN
11034      END
11035      DOUBLE PRECISION FUNCTION BEIFU2(DX)
11036C
11037C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
11038C              FUNCTION VALUE FOR THE BESSEL I-FUNCTION
11039C              DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ, AND
11040C              NU.  THIS DISTRIBUTION IS DEFINED FOR POSITIVE X
11041C              AND HAS THE PROBABILITY DENSITY FUNCTION
11042C
11043C                 BEIPDF(X,S1AQ,S2SQ,ANU) =
11044C                        K*X**M*EXP(-C*X/B)*PI*I(X/B,M)      X > 0
11045C              WITH
11046C                 B = 4*S1SQ**2*S2SQ**2/(S1SQ**2 - S2SQ**2)
11047C                 C = (S1SQ**2 + S2SQ**2)/(S1SQ**2 - S2SQ**2)
11048C                 M = 2*NU + 1
11049C              AND
11050C                 K = |1 - C**2|**(M+0.5)/[SQRT(PI)*2**M*b**(M+1)*
11051C                     GAMMA(M+0.5)]
11052C                 I(Z,N) IS THE MODIFIED BESSEL FUNCTION OF THE
11053C                        FIRST KIND
11054C                 GAMMA IS THE GAMMA FUNCTION
11055C
11056C              THE BEICDF ROUTINE IS CALLED TO COMPUTE THE
11057C              CUMULATIVE DISTRIBUTION.
11058C              DEFINE AS FUNCTION TO BE USED FOR INTEGRATION
11059C              CODE CALLED BY BEICDF.  THIS ROUTINE USES
11060C              DOUBLE PRECISION ARITHMETIC.
11061C     INPUT  ARGUMENTS--DX      = THE DOUBLE PRECISION VALUE AT
11062C                                 WHICH THE PROBABILITY DENSITY
11063C                                 FUNCTION IS TO BE EVALUATED.
11064C     OUTPUT ARGUMENTS--BEIFU2  = THE DOUBLE PRECISION PROBABILITY
11065C                                 DENSITY FUNCTION VALUE.
11066C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
11067C             FUNCTION VALUE PDF FOR THE GENERALIZED INVERSE
11068C             GAUSSIAN DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ,
11069C             AND NU.
11070C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
11071C     RESTRICTIONS--NONE.
11072C     OTHER DATAPAC   SUBROUTINES NEEDED--BEICDF.
11073C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
11074C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
11075C     LANGUAGE--ANSI FORTRAN (1977)
11076C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, (1994), "CONTINUOUS
11077C                 UNIVARIATE DISTRIBUTIONS--VOLUME 1", SECOND EDITION,
11078C                 WILEY, PP. 50-53.
11079C     WRITTEN BY--JAMES J. FILLIBEN
11080C                 STATISTICAL ENGINEERING DIVISION
11081C                 INFORMATION TECHNOLOGY LABORATORY
11082C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11083C                 GAITHERSBURG, MD 20899-8980
11084C                 PHONE--301-975-2855
11085C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11086C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
11087C     LANGUAGE--ANSI FORTRAN (1977)
11088C     VERSION NUMBER--2004.8
11089C     ORIGINAL VERSION--AUGUST    2004.
11090C
11091C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11092C
11093C---------------------------------------------------------------------
11094C
11095      DOUBLE PRECISION DX
11096      DOUBLE PRECISION DCDF
11097C
11098      DOUBLE PRECISION DP
11099      COMMON/BE2COM/DP
11100C
11101      DOUBLE PRECISION DS1SQ
11102      DOUBLE PRECISION DS2SQ
11103      DOUBLE PRECISION DNU
11104      CHARACTER*4 IBEID2
11105      COMMON/BEICOM/DS1SQ,DS2SQ,DNU,IBEID2
11106C
11107C---------------------------------------------------------------------
11108C
11109      INCLUDE 'DPCOP2.INC'
11110C
11111C-----DATA STATEMENTS-------------------------------------------------
11112C
11113C-----START POINT-----------------------------------------------------
11114C
11115C               ************************************
11116C               **  STEP 1--                      **
11117C               **  COMPUTE THE CDF     FUNCTION  **
11118C               ************************************
11119C
11120      CALL BEICDF(DX,DS1SQ,DS2SQ,DNU,IBEID2,DCDF)
11121      BEIFU2=DP - DCDF
11122C
11123      RETURN
11124      END
11125      SUBROUTINE BEIPDF(X,S1SQ,S2SQ,NU,IBEIDF,PDF)
11126C
11127C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
11128C              FUNCTION VALUE FOR THE BESSEL I-FUNCTION
11129C              DISTRIBUTION.  IT HAS SHAPE PARAMETERS
11130C              SIGMA1, SIGMA2, AND NU.  THIS DISTRIBUTION IS DEFINED
11131C              FOR POSITIVE X AND HAS THE PROBABILITY DENSITY FUNCTION
11132C
11133C                 BEIPDF(X,S1AQ,S2SQ,NU) =
11134C                        K*X**M*EXP(-C*X/B)*PI*I(X/B,M)      X > 0
11135C              WITH
11136C                 B = 4*S1SQ**2*S2SQ**2/(S1SQ**2 - S2SQ**2)
11137C                 C = (S1SQ**2 + S2SQ**2)/(S1SQ**2 - S2SQ**2)
11138C                 M = 2*NU + 1
11139C              AND
11140C                 K = |1 - C**2|**(M+0.5)/[SQRT(PI)*2**M*b**(M+1)*
11141C                     GAMMA(M+0.5)]
11142C                 I(Z,N) IS THE MODIFIED BESSEL FUNCTION OF THE
11143C                        FIRST KIND
11144C                 GAMMA IS THE GAMMA FUNCTION
11145C
11146C     NOTE--ARGUMENTS TO THIS ROUTINE ARE IN DOUBLE PRECISION.
11147C     INPUT  ARGUMENTS--X       = THE DOUBLE PRECISION VALUE AT
11148C                                 WHICH THE PROBABILITY DENSITY
11149C                                 FUNCTION IS TO BE EVALUATED.
11150C                                 X SHOULD BE POSITIVE
11151C                     --S1SQ    = THE FIRST SHAPE PARAMETER
11152C                     --S2SQ    = THE SECOND SHAPE PARAMETER
11153C                     --NU      = THE THIRD SHAPE PARAMETER
11154C     OUTPUT ARGUMENTS--PDF     = THE DOUBLE PRECISION PROBABILITY
11155C                                 DENSITY FUNCTION VALUE.
11156C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY FUNCTION
11157C             VALUE PDF FOR THE BESSEL-I DISTRIBUTION
11158C             WITH SHAPE PARAMETERS = S1SQ, S2SQ, AND NU.
11159C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
11160C     RESTRICTIONS--NONE.
11161C     OTHER DATAPAC   SUBROUTINES NEEDED--DBESI.
11162C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP, DLOG.
11163C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
11164C     LANGUAGE--ANSI FORTRAN (1977)
11165C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISNAN, "CONTINUOUS
11166C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
11167C                 WILEY, 1994, PP. 50-53.
11168C     WRITTEN BY--JAMES J. FILLIBEN
11169C                 STATISTICAL ENGINEERING DIVISION
11170C                 INFORMATION TECHNOLOGY LABORATORY
11171C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11172C                 GAITHERSBURG, MD 20899-8980
11173C                 PHONE--301-975-2855
11174C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11175C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
11176C     LANGUAGE--ANSI FORTRAN (1977)
11177C     VERSION NUMBER--2004.8
11178C     ORIGINAL VERSION--AUGUST    2004.
11179C
11180C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11181C
11182C---------------------------------------------------------------------
11183C
11184      CHARACTER*4 IBEIDF
11185C
11186      DOUBLE PRECISION X
11187      DOUBLE PRECISION NU
11188      DOUBLE PRECISION S1SQ
11189      DOUBLE PRECISION S2SQ
11190      DOUBLE PRECISION PDF
11191      DOUBLE PRECISION DTERM1
11192      DOUBLE PRECISION DTERM2
11193      DOUBLE PRECISION DTERM3
11194      DOUBLE PRECISION DTERM4
11195      DOUBLE PRECISION DTERM5
11196      DOUBLE PRECISION DC1
11197      DOUBLE PRECISION DC2
11198      DOUBLE PRECISION DC
11199      DOUBLE PRECISION DB
11200      DOUBLE PRECISION DM
11201      DOUBLE PRECISION DPI
11202CCCCC DOUBLE PRECISION DGAMMA
11203CCCCC EXTERNAL DGAMMA
11204      DOUBLE PRECISION DLNGAM
11205      EXTERNAL DLNGAM
11206C
11207      DOUBLE PRECISION DTEMP1(10)
11208C
11209C---------------------------------------------------------------------
11210C
11211      INCLUDE 'DPCOP2.INC'
11212C
11213C-----DATA STATEMENTS-------------------------------------------------
11214C
11215      DATA DPI / 3.14159265358979D+00/
11216C
11217C-----START POINT-----------------------------------------------------
11218C
11219C               *****************************************
11220C               **  STEP 1--                           **
11221C               **  CHECK FOR VALID PARAMETERS         **
11222C               *****************************************
11223C
11224      IF(IBEIDF.EQ.'1')THEN
11225        DB=4.0D0*S1SQ*S2SQ/(S1SQ - S2SQ)
11226        DC=(S1SQ + S2SQ)/(S1SQ - S2SQ)
11227        DM=2.0D0*NU + 1.0D0
11228      ELSE
11229        DB=S1SQ
11230        DC=S2SQ
11231        DM=NU
11232      ENDIF
11233C
11234      IF(DABS(DC).LE.1.0D0)THEN
11235        WRITE(ICOUT,9)
11236        CALL DPWRST('XXX','WRIT')
11237        WRITE(ICOUT,10)
11238        CALL DPWRST('XXX','WRIT')
11239        WRITE(ICOUT,11)
11240        CALL DPWRST('XXX','WRIT')
11241        WRITE(ICOUT,12)S1SQ
11242        CALL DPWRST('XXX','WRIT')
11243        WRITE(ICOUT,13)S2SQ
11244        CALL DPWRST('XXX','WRIT')
11245        WRITE(ICOUT,14)DC
11246        CALL DPWRST('XXX','WRIT')
11247        PDF=0.0D0
11248        GOTO9000
11249      ENDIF
11250    9 FORMAT('***** ERROR: ABSOLUTE VALUE OF 1 - C**2 <= 1 ',
11251     1       'IN BEIPDF ROUTINE.')
11252   10 FORMAT('      C = (S1**2 + S2**2)/(S1**2 - S2**2) WHERE ',
11253     1       'S1**2 AND S2**2')
11254   11 FORMAT('      ARE THE FIRST AND SECOND SHAPE PARAMETERS, ',
11255     1       'RESPECTIVELY.')
11256   12 FORMAT('      VALUE OF S1**2 IS: ',G15.7)
11257   13 FORMAT('      VALUE OF S2**2 IS: ',G15.7)
11258   14 FORMAT('      VALUE OF C IS:     ',G15.7)
11259      IF(DC.GT.0.0D0 .AND. X.LE.0.0D0)THEN
11260        WRITE(ICOUT,24)
11261        CALL DPWRST('XXX','WRIT')
11262        WRITE(ICOUT,25)
11263        CALL DPWRST('XXX','WRIT')
11264        WRITE(ICOUT,48)X
11265        CALL DPWRST('XXX','WRIT')
11266        PDF=0.0D0
11267        GOTO9000
11268      ENDIF
11269   24 FORMAT('***** ERROR: VALUE OF THE INPUT ARGUMENT ',
11270     1       'IN BEIPDF ROUTINE IS NON-POSITIVE')
11271   25 FORMAT('      FOR THE CASE WHERE S1**2 > S2**2 (THESE ARE THE ',
11272     1       'FIRST AND SECOND SHAPE PARAMETERS).')
11273      IF(DC.LT.0.0D0 .AND. X.GE.0.0D0)THEN
11274        WRITE(ICOUT,34)
11275        CALL DPWRST('XXX','WRIT')
11276        WRITE(ICOUT,35)
11277        CALL DPWRST('XXX','WRIT')
11278        WRITE(ICOUT,48)X
11279        CALL DPWRST('XXX','WRIT')
11280        PDF=0.0D0
11281        GOTO9000
11282      ENDIF
11283   34 FORMAT('***** ERROR: VALUE OF THE INPUT ARGUMENT ',
11284     1       'IN BEIPDF ROUTINE IS NON-NEGATIVE')
11285   35 FORMAT('      FOR THE CASE WHERE S1**2 < S2**2 (THESE ARE THE ',
11286     1       'FIRST AND SECOND SHAPE PARAMETERS).')
11287      IF(S1SQ.LE.0.0D0)THEN
11288        WRITE(ICOUT,5)
11289        CALL DPWRST('XXX','WRIT')
11290        WRITE(ICOUT,48)S1SQ
11291        CALL DPWRST('XXX','WRIT')
11292        PDF=0.0D0
11293        GOTO9000
11294      ENDIF
11295    5 FORMAT('***** ERROR: VALUE OF FIRST SHAPE PARAMETER (SIGMA1**2)',
11296     1       ' IN BEIPDF ROUTINE IS NON-POSITIVE.')
11297      IF(S2SQ.LE.0.0D0)THEN
11298        WRITE(ICOUT,6)
11299        CALL DPWRST('XXX','WRIT')
11300        WRITE(ICOUT,48)S2SQ
11301        CALL DPWRST('XXX','WRIT')
11302        PDF=0.0D0
11303        GOTO9000
11304      ENDIF
11305    6 FORMAT('***** ERROR: VALUE OF SECOND SHAPE PARAMETER ',
11306     1       '(SIGMA2**2) IN BEIPDF ROUTINE IS NON-POSITIVE.')
11307      IF(IBEIDF.EQ.'1')THEN
11308        IF(NU.LE.-0.25D0)THEN
11309          WRITE(ICOUT,7)
11310          CALL DPWRST('XXX','WRIT')
11311          WRITE(ICOUT,48)NU
11312          CALL DPWRST('XXX','WRIT')
11313          CDF=0.0D0
11314          GOTO9000
11315        ENDIF
11316      ELSE
11317        IF(DM.LE.0.5D0)THEN
11318          WRITE(ICOUT,8)
11319          CALL DPWRST('XXX','WRIT')
11320          WRITE(ICOUT,48)DM
11321          CALL DPWRST('XXX','WRIT')
11322          CDF=0.0D0
11323          GOTO9000
11324        ENDIF
11325      ENDIF
11326    7 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (NU) IN ',
11327     1       'BEIPDF ROUTINE IS < -0.25.')
11328    8 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (M) IN ',
11329     1       'BEIPDF ROUTINE IS <= 0.5.')
11330C
11331   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
11332C
11333C               *****************************************
11334C               **  STEP 2--                           **
11335C               **  COMPUTE THE DENSITY FUNCTION.  FOR **
11336C               **  BETTER NUMERICAL STABILITY, DO THE **
11337C               **  FOLLOWING:                         **
11338C               **  1) COMPUTE LOGARIGHMS.             **
11339C               **  2) COMPUTE THE SCALED VERSION OF   **
11340C               **     THE BESSEL FUNCTION (ADDS A     **
11341C               **     EXP(-X) TERM, SO DIVIDE RESULT  **
11342C               **     BY EXP(-X)                      **
11343C               *****************************************
11344C
11345C
11346C  COMPUTE BESSEL FUNCTION FIRST.  IF THIS IS 0, SET PDF TO
11347C  0 AND RETURN.
11348C
11349      IARG1=1
11350      ISCALE=1
11351      CALL DBESI(DABS(X/DB),DM,ISCALE,IARG1,DTEMP1,NZERO)
11352      DTERM3=DTEMP1(IARG1)
11353      IF(DTERM3.LE.0.0D0)THEN
11354        PDF=0.0D0
11355        GOTO9000
11356      ENDIF
11357      DTERM3=DLOG(DTERM3)
11358C
11359      DC1=(DM+0.5D0)*DLOG(DABS(1.0D0-DC**2)) + 0.5D0*DLOG(DPI)
11360      DC2=DM*DLOG(2.0D0) + (DM+1.0D0)*DLOG(DB) + DLNGAM(DM+0.5D0)
11361      DTERM1=DC1 - DC2
11362CCCCC DC1=DABS(1.0D0-DC**2)**(DM+0.5D0)
11363CCCCC DC2=DSQRT(DPI)*(2.0D0**DM)*(DB**(DM+1.0D0))*DGAMMA(DM+0.5D0)
11364CCCCC DTERM1=DLOG(DC1/DC2)
11365      DTERM2=DM*DLOG(X)
11366      DTERM4=-DC*X/DB
11367C
11368      DTERM5=DTERM1+DTERM2+DTERM4+DTERM3
11369      PDF=DEXP(DTERM5)
11370C
11371 9000 CONTINUE
11372      RETURN
11373      END
11374      SUBROUTINE BEIPPF(P,S1SQ,S2SQ,NU,IBEIDF,PPF)
11375C
11376C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
11377C              FUNCTION VALUE FOR THE BESSEL I-FUNCTION
11378C              DISTRIBUTION.  IT HAS SHAPE PARAMETERS S1SQ, S2SQ,
11379C              AND NU.  THIS DISTRIBUTION IS DEFINED FOR POSITIVE
11380C              X AND HAS THE PROBABILITY DENSITY FUNCTION
11381C
11382C                 BEIPDF(X,S1AQ,S2SQ,NU) =
11383C                        K*X**M*EXP(-C*X/B)*PI*I(X/B,M)      X > 0
11384C              WITH
11385C                 B = 4*S1SQ**2*S2SQ**2/(S1SQ**2 - S2SQ**2)
11386C                 C = (S1SQ**2 + S2SQ**2)/(S1SQ**2 - S2SQ**2)
11387C                 M = 2*NU + 1
11388C              AND
11389C                 K = |1 - C**2|**(M+0.5)/[SQRT(PI)*2**M*b**(M+1)*
11390C                     GAMMA(M+0.5)]
11391C                 I(Z,N) IS THE MODIFIED BESSEL FUNCTION OF THE
11392C                        FIRST KIND
11393C                 GAMMA IS THE GAMMA FUNCTION
11394C
11395C              THE PERCENT POINT FUNCTION IS COMPUTED BY NUMERICALLY
11396C              INVERTING THE BESSEL I-FUNCTION CUMULATIVE
11397C              DISTRIBUTION FUNCTION (WHICH IN TURN IS COMPUTED BY
11398C              NUMERICAL INTEGRATION OF THE PROBABILITYT DENSITY.
11399C
11400C     INPUT  ARGUMENTS--P       = THE DOUBLE PRECISION VALUE AT
11401C                                 WHICH THE PERCENT POINT
11402C                                 FUNCTION IS TO BE EVALUATED.
11403C                                 0 < P < 1
11404C                     --S1SQ    = THE FIRST SHAPE PARAMETER
11405C                     --S2SQ    = THE THIRD SHAPE PARAMETER
11406C                     --NU      = THE THIRD SHAPE PARAMETER
11407C     OUTPUT ARGUMENTS--PPF     = THE SINGLE PRECISION PERCENT POINT
11408C                                 FUNCTION VALUE.
11409C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION
11410C             VALUE PPF FOR THE BESSEL I-FUNCTION
11411C             DISTRIBUTION WITH SHAPE PARAMETERS = S1SQ, S2SQ, NU.
11412C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
11413C     RESTRICTIONS--NONE.
11414C     OTHER DATAPAC   SUBROUTINES NEEDED--DFZERO.
11415C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE
11416C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
11417C     LANGUAGE--ANSI FORTRAN (1977)
11418C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, (1994), "CONTINUOUS
11419C                 UNIVARIATE DISTRIBUTIONS--VOLUME 1", SECOND EDITION,
11420C                 WILEY, PP. 50-53.
11421C     WRITTEN BY--JAMES J. FILLIBEN
11422C                 STATISTICAL ENGINEERING DIVISION
11423C                 INFORMATION TECHNOLOGY LABORATORY
11424C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
11425C                 GAITHERSBURG, MD 20899-8980
11426C                 PHONE--301-975-2855
11427C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11428C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
11429C     LANGUAGE--ANSI FORTRAN (1977)
11430C     VERSION NUMBER--2004.8
11431C     ORIGINAL VERSION--AUGUST    2004.
11432C
11433C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11434C
11435C---------------------------------------------------------------------
11436C
11437      CHARACTER*4 IBEIDF
11438C
11439      DOUBLE PRECISION P
11440      DOUBLE PRECISION PTEMP
11441      DOUBLE PRECISION S1SQ
11442      DOUBLE PRECISION S2SQ
11443      DOUBLE PRECISION NU
11444      DOUBLE PRECISION PPF
11445      DOUBLE PRECISION DMEAN
11446      DOUBLE PRECISION DSD
11447      DOUBLE PRECISION DM
11448      DOUBLE PRECISION DB
11449      DOUBLE PRECISION DC
11450CCCCC DOUBLE PRECISION DTERM1
11451CCCCC DOUBLE PRECISION DTERM2
11452CCCCC DOUBLE PRECISION DTERM3
11453C
11454      DOUBLE PRECISION XUP
11455      DOUBLE PRECISION XUP2
11456      DOUBLE PRECISION XLOW
11457      DOUBLE PRECISION RE
11458      DOUBLE PRECISION AE
11459C
11460      DOUBLE PRECISION BEIFU2
11461      EXTERNAL BEIFU2
11462C
11463      DOUBLE PRECISION DP
11464      COMMON/BE2COM/DP
11465C
11466      DOUBLE PRECISION DS1SQ
11467      DOUBLE PRECISION DS2SQ
11468      DOUBLE PRECISION DANU
11469      CHARACTER*4 IBEID2
11470      COMMON/BEICOM/DS1SQ,DS2SQ,DANU,IBEID2
11471C
11472C---------------------------------------------------------------------
11473C
11474      INCLUDE 'DPCOP2.INC'
11475C
11476C-----START POINT-----------------------------------------------------
11477C
11478C               *****************************************
11479C               **  STEP 1--                           **
11480C               **  CHECK FOR VALID PARAMETERS         **
11481C               *****************************************
11482C
11483      IF(P.LE.0.0D0 .OR. P.GE.1.0D0)THEN
11484        WRITE(ICOUT,3)
11485        CALL DPWRST('XXX','WRIT')
11486        WRITE(ICOUT,4)
11487        CALL DPWRST('XXX','WRIT')
11488        WRITE(ICOUT,48)P
11489        CALL DPWRST('XXX','WRIT')
11490        PPF=0.0D0
11491        GOTO9000
11492      ENDIF
11493    3 FORMAT('***** ERROR: VALUE OF INPUT ARGUMENT (P) IN ',
11494     1       'BEIPPF ROUTINE')
11495    4 FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
11496C
11497      IF(IBEIDF.EQ.'1')THEN
11498        DB=4.0D0*S1SQ*S2SQ/(S1SQ - S2SQ)
11499        DC=(S1SQ + S2SQ)/(S1SQ - S2SQ)
11500        DM=2.0D0*NU + 1.0D0
11501      ELSE
11502        DB=S1SQ
11503        DC=S2SQ
11504        DM=NU
11505      ENDIF
11506C
11507      IF(DABS(DC).LE.1.0D0)THEN
11508        WRITE(ICOUT,9)
11509        CALL DPWRST('XXX','WRIT')
11510        WRITE(ICOUT,10)
11511        CALL DPWRST('XXX','WRIT')
11512        WRITE(ICOUT,11)
11513        CALL DPWRST('XXX','WRIT')
11514        WRITE(ICOUT,12)S1SQ
11515        CALL DPWRST('XXX','WRIT')
11516        WRITE(ICOUT,13)S2SQ
11517        CALL DPWRST('XXX','WRIT')
11518        WRITE(ICOUT,14)DC
11519        CALL DPWRST('XXX','WRIT')
11520        PPF=0.0D0
11521        GOTO9000
11522      ENDIF
11523    9 FORMAT('***** ERROR: ABSOLUTE VALUE OF 1 - C**2 <= 1 ',
11524     1       'IN BEIPPF ROUTINE.')
11525   10 FORMAT('      C = (S1**2 + S2**2)/(S1**2 - S2**2) WHERE ',
11526     1       'S1**2 AND S2**2')
11527   11 FORMAT('      ARE THE FIRST AND SECOND SHAPE PARAMETERS, ',
11528     1       'RESPECTIVELY.')
11529   12 FORMAT('      VALUE OF S1**2 IS: ',G15.7)
11530   13 FORMAT('      VALUE OF S2**2 IS: ',G15.7)
11531   14 FORMAT('      VALUE OF C IS:     ',G15.7)
11532      IF(S1SQ.LE.0.0D0)THEN
11533        WRITE(ICOUT,5)
11534        CALL DPWRST('XXX','WRIT')
11535        WRITE(ICOUT,48)S1SQ
11536        CALL DPWRST('XXX','WRIT')
11537        PPF=0.0D0
11538        GOTO9000
11539      ENDIF
11540    5 FORMAT('***** ERROR: VALUE OF FIRST SHAPE PARAMETER (SIGMA1**2)',
11541     1       ' IN BEIPPF ROUTINE IS NON-POSITIVE.')
11542      IF(S2SQ.LE.0.0D0)THEN
11543        WRITE(ICOUT,6)
11544        CALL DPWRST('XXX','WRIT')
11545        WRITE(ICOUT,48)S2SQ
11546        CALL DPWRST('XXX','WRIT')
11547        PPF=0.0D0
11548        GOTO9000
11549      ENDIF
11550    6 FORMAT('***** ERROR: VALUE OF SECOND SHAPE PARAMETER ',
11551     1       '(SIGMA2**2) IN BEIPPF ROUTINE IS NON-POSITIVE.')
11552      IF(IBEIDF.EQ.'1')THEN
11553        IF(NU.LE.-0.25D0)THEN
11554          WRITE(ICOUT,7)
11555          CALL DPWRST('XXX','WRIT')
11556          WRITE(ICOUT,48)NU
11557          CALL DPWRST('XXX','WRIT')
11558          CDF=0.0D0
11559          GOTO9000
11560        ENDIF
11561      ELSE
11562        IF(DM.LE.0.5D0)THEN
11563          WRITE(ICOUT,8)
11564          CALL DPWRST('XXX','WRIT')
11565          WRITE(ICOUT,48)DM
11566          CALL DPWRST('XXX','WRIT')
11567          CDF=0.0D0
11568          GOTO9000
11569        ENDIF
11570      ENDIF
11571    7 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (NU) IN ',
11572     1       'BEICDF ROUTINE IS < -0.25.')
11573    8 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (M) IN ',
11574     1       'BEICDF ROUTINE IS <= 0.5.')
11575   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
11576C
11577C               *****************************************
11578C               **  STEP 2--                           **
11579C               **  COMPUTE THE PERCENT POINT FUNCTION.**
11580C               *****************************************
11581C
11582C  STEP 1: FIND BRACKETING INTERVAL.  LOWER BOUND IS ZERO.  START
11583C          WITH UPPER BOUND = MEAN:
11584C             MEAN=(2*M+1)*B*C/(C**2-1)
11585C          INCREMENT IN INTERVALS OF 1 STANDARD DEVIATION:
11586C             VARIANCE=2*M+1)*B**2*(C**2+1)/(C2-1)**2
11587C                      K(ANU)(SQRT(S2SQ*S1SQ))
11588C
11589      XLOW=1.0D-12
11590      CALL BEICDF(XLOW,S1SQ,S2SQ,NU,IBEIDF,PTEMP)
11591      IF(P.LE.PTEMP)THEN
11592        PPF=XLOW
11593        GOTO9000
11594      ENDIF
11595C
11596      DMEAN=(2.0D0*DM+1.0D0)*DB*DC/(DC**2-1.0D0)
11597      DSD=(2.0D0*DM+1.0D0)*DB*(DC**2+1.0D0)/(DC**2-1.0D0)**2
11598      IF(DSD.GE.0.0D0)DSD=DSQRT(DSD)
11599C
11600      MAXIT=1000
11601      NIT=0
11602C
11603      XUP2=DMEAN
11604  200 CONTINUE
11605        IF(NIT.GT.MAXIT)THEN
11606          PPF=0.0D0
11607          WRITE(ICOUT,999)
11608          CALL DPWRST('XXX','BUG ')
11609          WRITE(ICOUT,131)
11610          CALL DPWRST('XXX','BUG ')
11611          WRITE(ICOUT,133)
11612          CALL DPWRST('XXX','BUG ')
11613          GOTO9000
11614        ENDIF
11615        CALL BEICDF(XUP2,S1SQ,S2SQ,NU,IBEIDF,PTEMP)
11616        IF(PTEMP.GT.P)THEN
11617          XUP=XUP2
11618        ELSE
11619          XLOW=XUP2
11620          XUP2=XUP2 + DSD
11621          NIT=NIT+1
11622          GOTO200
11623        ENDIF
11624C
11625      AE=1.D-7
11626      RE=1.D-7
11627      DS1SQ=S1SQ
11628      DS2SQ=S2SQ
11629      DANU=NU
11630      DP=P
11631      CALL DFZERO(BEIFU2,XLOW,XUP,XUP,RE,AE,IFLAG)
11632C
11633      PPF=XLOW
11634C
11635      IF(IFLAG.EQ.2)THEN
11636C
11637C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
11638CCCCC   WRITE(ICOUT,999)
11639  999   FORMAT(1X)
11640CCCCC   CALL DPWRST('XXX','BUG ')
11641CCCCC   WRITE(ICOUT,111)
11642CC111   FORMAT('***** WARNING FROM BEIPPF--')
11643CCCCC   CALL DPWRST('XXX','BUG ')
11644CCCCC   WRITE(ICOUT,113)
11645CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
11646CCCCC1         'TOLERANCE.')
11647CCCCC   CALL DPWRST('XXX','BUG ')
11648      ELSEIF(IFLAG.EQ.3)THEN
11649        WRITE(ICOUT,999)
11650        CALL DPWRST('XXX','BUG ')
11651        WRITE(ICOUT,121)
11652  121   FORMAT('***** WARNING FROM BEIPPF--')
11653        CALL DPWRST('XXX','BUG ')
11654        WRITE(ICOUT,123)
11655  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
11656        CALL DPWRST('XXX','BUG ')
11657      ELSEIF(IFLAG.EQ.4)THEN
11658        WRITE(ICOUT,999)
11659        CALL DPWRST('XXX','BUG ')
11660        WRITE(ICOUT,131)
11661  131   FORMAT('***** ERROR FROM BEIPPF--')
11662        CALL DPWRST('XXX','BUG ')
11663        WRITE(ICOUT,133)
11664  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
11665        CALL DPWRST('XXX','BUG ')
11666      ELSEIF(IFLAG.EQ.5)THEN
11667        WRITE(ICOUT,999)
11668        CALL DPWRST('XXX','BUG ')
11669        WRITE(ICOUT,141)
11670  141   FORMAT('***** WARNING FROM BEIPPF--')
11671        CALL DPWRST('XXX','BUG ')
11672        WRITE(ICOUT,143)
11673  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
11674        CALL DPWRST('XXX','BUG ')
11675      ENDIF
11676C
11677C
11678 9000 CONTINUE
11679      RETURN
11680      END
11681      SUBROUTINE BEIRAN(N,S1SQ,S2SQ,NU,IBEIDF,ISEED,X)
11682C
11683C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
11684C              FROM THE BESSEL I-FUNCTION DISTRIBUTION WITH SHAPE
11685C              PARAMETERS S1SQ, S2SQ, AND NU.  THIS DISTRIBUTION IS
11686C              DEFINED FOR POSITIVE X AND HAS THE PROBABILITY DENSITY
11687C              FUNCTION
11688C
11689C                 BEIPDF(X,S1AQ,S2SQ,NU) =
11690C                        K*X**M*EXP(-C*X/B)*PI*I(X/B,M)      X > 0
11691C              WITH
11692C                 B = 4*S1SQ**2*S2SQ**2/(S1SQ**2 - S2SQ**2)
11693C                 C = (S1SQ**2 + S2SQ**2/(S1SQ**2 - S2SQ**2)
11694C                 M = 2*NU + 1
11695C              AND
11696C                 K = |1 - C**2|**(M+0.5)/[SQRT(PI)*2**M*b**(M+1)*
11697C                     GAMMA(M+0.5)]
11698C                 I(Z,N) IS THE MODIFIED BESSEL FUNCTION OF THE
11699C                        FIRST KIND
11700C                 GAMMA IS THE GAMMA FUNCTION
11701C
11702C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
11703C                                OF RANDOM NUMBERS TO BE
11704C                                GENERATED.
11705C                     --S1SQ   = THE FIRST SHAPE PARAMETER
11706C                     --S2SQ   = THE SECOND SHAPE PARAMETER
11707C                     --NU     = THE THIRD SHAPE PARAMETER
11708C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
11709C                                (OF DIMENSION AT LEAST N)
11710C                                INTO WHICH THE GENERATED
11711C                                RANDOM SAMPLE WILL BE PLACED.
11712C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE BESSEL I-FUNCTION
11713C             DISTRIBUTION WITH SHAPE PARAMETERS S1SQ, S2SQ, AND NU.
11714C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
11715C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
11716C                   OF N FOR THIS SUBROUTINE.
11717C     OTHER DATAPAC   SUBROUTINES NEEDED--CHIRAN.
11718C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
11719C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
11720C     LANGUAGE--ANSI FORTRAN (1977)
11721C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISNAN, "CONTINUOUS
11722C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
11723C                 WILEY, 1994, PP. 50-53.
11724C     WRITTEN BY--JAMES J. FILLIBEN
11725C                 STATISTICAL ENGINEERING DIVISION
11726C                 INFORMATION TECHNOLOGY LABORATORY
11727C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
11728C                 GAITHERSBURG, MD 20899-8980
11729C                 PHONE--301-975-2855
11730C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
11731C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
11732C     LANGUAGE--ANSI FORTRAN (1977)
11733C     VERSION NUMBER--2004.8
11734C     ORIGINAL VERSION--AUGUST    2004.
11735C
11736C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
11737C
11738C---------------------------------------------------------------------
11739C
11740      CHARACTER*4 IBEIDF
11741C
11742      DIMENSION X(*)
11743CCCCC DIMENSION Y(2)
11744      DOUBLE PRECISION DPPF
11745C
11746C---------------------------------------------------------------------
11747C
11748      INCLUDE 'DPCOP2.INC'
11749C
11750C-----DATA STATEMENTS-------------------------------------------------
11751C
11752C-----START POINT-----------------------------------------------------
11753C
11754C     CHECK THE INPUT ARGUMENTS FOR ERRORS
11755C
11756      IF(N.LT.1)THEN
11757        WRITE(ICOUT,5)
11758        CALL DPWRST('XXX','BUG ')
11759        WRITE(ICOUT,6)
11760        CALL DPWRST('XXX','BUG ')
11761        WRITE(ICOUT,47)N
11762        CALL DPWRST('XXX','BUG ')
11763        GOTO9999
11764      ENDIF
11765C
11766    5 FORMAT('***** ERROR--FOR THE BESSEL I-FUNCTION DISTRIBUTION, ',
11767     1       'THE REQUESTED')
11768    6 FORMAT('      NUMBER OF RANDOM NUMBERS WAS NON-POSITIVE.')
11769   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
11770C
11771      IF(IBEIDF.EQ.'1')THEN
11772        DB=4.0D0*S1SQ*S2SQ/(S1SQ - S2SQ)
11773        DC=(S1SQ + S2SQ)/(S1SQ - S2SQ)
11774        DM=2.0D0*NU + 1.0D0
11775      ELSE
11776        DB=S1SQ
11777        DC=S2SQ
11778        DM=NU
11779      ENDIF
11780C
11781      IF(ABS(DC).LE.1.0)THEN
11782        WRITE(ICOUT,9)
11783        CALL DPWRST('XXX','WRIT')
11784        WRITE(ICOUT,10)
11785        CALL DPWRST('XXX','WRIT')
11786        WRITE(ICOUT,11)
11787        CALL DPWRST('XXX','WRIT')
11788        WRITE(ICOUT,12)S1SQ
11789        CALL DPWRST('XXX','WRIT')
11790        WRITE(ICOUT,13)S2SQ
11791        CALL DPWRST('XXX','WRIT')
11792        WRITE(ICOUT,14)DC
11793        CALL DPWRST('XXX','WRIT')
11794        GOTO9999
11795      ENDIF
11796    9 FORMAT('***** ERROR: ABSOLUTE VALUE OF 1 - C**2 <= 1 ',
11797     1       'IN BEIRAN ROUTINE.')
11798   10 FORMAT('      C = (S1**2 + S2**2)/(S1**2 - S2**2) WHERE ',
11799     1       'S1**2 AND S2**2')
11800   11 FORMAT('      ARE THE FIRST AND SECOND SHAPE PARAMETERS, ',
11801     1       'RESPECTIVELY.')
11802   12 FORMAT('      VALUE OF S1**2 IS: ',G15.7)
11803   13 FORMAT('      VALUE OF S2**2 IS: ',G15.7)
11804   14 FORMAT('      VALUE OF C IS:     ',G15.7)
11805      IF(S1SQ.LE.0.0)THEN
11806        WRITE(ICOUT,15)
11807        CALL DPWRST('XXX','WRIT')
11808        WRITE(ICOUT,48)S1SQ
11809        CALL DPWRST('XXX','WRIT')
11810        GOTO9999
11811      ENDIF
11812   15 FORMAT('***** ERROR: VALUE OF FIRST SHAPE PARAMETER (SIGMA1**2)',
11813     1       ' IN BEIRAN ROUTINE IS NON-POSITIVE.')
11814      IF(S2SQ.LE.0.0)THEN
11815        WRITE(ICOUT,16)
11816        CALL DPWRST('XXX','WRIT')
11817        WRITE(ICOUT,48)S2SQ
11818        CALL DPWRST('XXX','WRIT')
11819        GOTO9999
11820      ENDIF
11821   16 FORMAT('***** ERROR: VALUE OF SECOND SHAPE PARAMETER ',
11822     1       '(SIGMA2**2) IN BEIRAN ROUTINE IS NON-POSITIVE.')
11823      IF(IBEIDF.EQ.'1')THEN
11824        IF(NU.LE.-0.25D0)THEN
11825          WRITE(ICOUT,17)
11826          CALL DPWRST('XXX','WRIT')
11827          WRITE(ICOUT,48)NU
11828          CALL DPWRST('XXX','WRIT')
11829          CDF=0.0D0
11830          GOTO9999
11831        ENDIF
11832      ELSE
11833        IF(DM.LE.0.5D0)THEN
11834          WRITE(ICOUT,18)
11835          CALL DPWRST('XXX','WRIT')
11836          WRITE(ICOUT,48)DM
11837          CALL DPWRST('XXX','WRIT')
11838          CDF=0.0D0
11839          GOTO9999
11840        ENDIF
11841      ENDIF
11842   17 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (NU) IN ',
11843     1       'BEIANF ROUTINE IS < -0.25.')
11844   18 FORMAT('***** ERROR: VALUE OF THIRD SHAPE PARAMETER (M) IN ',
11845     1       'BEIRAN ROUTINE IS <= 0.5.')
11846C
11847   48 FORMAT('      VALUE OF ARGUMENT IS: ',G15.7)
11848C
11849C     BESSEL I-FUNCTION IS DISTRIBUTION OF
11850C         S1SQ*X1 + S2SQ*X2
11851C     WHERE X1 AND X2 ARE CHI-SQUARE RANDOM NUMBERS WITH DEGREES
11852C     OF FREEDOM PARAMETERS NU.
11853C
11854C     NOTE: ABOVE ALGORITHM DOES NOT SEEM TO CORRESPOND TO
11855C           BESSEL I-FUNCTION PDF, SO FOR NOW USE PERCENT POINT
11856C           FUNCTION.
11857C
11858      CALL UNIRAN(N,ISEED,X)
11859CCCCC NTEMP=2
11860      DO100I=1,N
11861CCCCC   CALL CHSRAN(NTEMP,NU,ISEED,Y)
11862CCCCC   X(I)=S1SQ*Y(1) + S2SQ*Y(2)
11863        PTEMP=X(I)
11864        CALL BEIPPF(DBLE(PTEMP),DBLE(S1SQ),DBLE(S2SQ),DBLE(NU),
11865     1              IBEIDF,DPPF)
11866        X(I)=REAL(DPPF)
11867  100 CONTINUE
11868C
11869 9999 CONTINUE
11870      RETURN
11871      END
11872      SUBROUTINE BERNOB(N,BN)
11873C
11874C       ======================================
11875C       Purpose: Compute Bernoulli number Bn
11876C       Input :  n --- Serial number
11877C       Output:  BN(n) --- Bn
11878C       ======================================
11879C
11880        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11881        DIMENSION BN(0:N)
11882C
11883      INCLUDE 'DPCOP2.INC'
11884C
11885        TPI=6.283185307179586D0
11886        BN(0)=1.0D0
11887        BN(1)=-0.5D0
11888        BN(2)=1.0D0/6.0D0
11889        DO1I=3,N
11890        BN(I)=0.0D0
11891 1      CONTINUE
11892        IF(N.LE.3)RETURN
11893        R1=(2.0D0/TPI)**2
11894        IFLAG=0
11895        DO 20 M=4,N,2
11896           IF(IFLAG.EQ.1)THEN
11897             BN(M)=DBLE(CPUMAX)
11898             GOTO20
11899           ENDIF
11900           R1=-R1*(M-1)*M/(TPI*TPI)
11901           R2=1.0D0
11902           DO 10 K=2,10000
11903              S=(1.0D0/K)**M
11904              R2=R2+S
11905              IF (S.LT.1.0D-15) GOTO 29
1190610         CONTINUE
1190729         CONTINUE
11908           BN(M)=R1*R2
11909           IF(BN(M).GE.DBLE(CPUMAX))THEN
11910             WRITE(ICOUT,90)M
11911             CALL DPWRST('XXX','BUG ')
11912 90          FORMAT('***** ERROR: BN OVERFLOWS AT N = ',I8)
11913             IFLAG=1
11914           ENDIF
11915 20     CONTINUE
11916        RETURN
11917        END
11918      SUBROUTINE BERNPN(X,N,BN)
11919C
11920C       ======================================
11921C       Purpose: Compute Bernoulli polynomial of order n for X
11922C       Input :  n --- Order of Bernoulli polynomial
11923C                x --- value at which to compute the polynomial
11924C       Output:  BN--- computed value
11925C       ======================================
11926C
11927      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11928C
11929      DIMENSION DTEMP(200)
11930C
11931      INCLUDE 'DPCOP2.INC'
11932C
11933      TERM6=1.0
11934C
11935      IF(N.EQ.0)THEN
11936        BN=0.D0
11937      ELSEIF(N.EQ.1)THEN
11938        BN=-0.5D0+X
11939      ELSE
11940        TERM1=X
11941        TERM2=DBLE(N-1)
11942        IF(X.EQ.0.0D0 .AND. N-1.EQ.0)THEN
11943          TERM3=1.0D0
11944        ELSE
11945          TERM3=X**(N-1)
11946        ENDIF
11947        SUM=TERM3*(X-REAL(N)/2.0D0)
11948        DO100I=1,N/2
11949          CALL BERNOB(2*I,DTEMP)
11950          TERM4=DTEMP(2*I+1)
11951          TERM5=DBINOM(N,2*I)
11952          SUM=SUM + TERM4*TERM5*TERM6
11953          IF(X.EQ.0.0D0 .AND. N-1.EQ.0)THEN
11954            TERM6=1.0D0
11955          ELSE
11956            TERM6=X**(N-2*I)
11957          ENDIF
11958  100   CONTINUE
11959        BN=SUM
11960      ENDIF
11961C
11962      RETURN
11963      END
11964      SUBROUTINE BESI (X, ALPHA, KODE, N, Y, NZ)
11965C***BEGIN PROLOGUE  BESI
11966C***PURPOSE  Compute an N member sequence of I Bessel functions
11967C            I/SUB(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
11968C            EXP(-X)*I/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative
11969C            ALPHA and X.
11970C***LIBRARY   SLATEC
11971C***CATEGORY  C10B3
11972C***TYPE      SINGLE PRECISION (BESI-S, DBESI-D)
11973C***KEYWORDS  I BESSEL FUNCTION, SPECIAL FUNCTIONS
11974C***AUTHOR  Amos, D. E., (SNLA)
11975C           Daniel, S. L., (SNLA)
11976C***DESCRIPTION
11977C
11978C     Abstract
11979C         BESI computes an N member sequence of I Bessel functions
11980C         I/sub(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
11981C         EXP(-X)*I/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
11982C         and X.  A combination of the power series, the asymptotic
11983C         expansion for X to infinity, and the uniform asymptotic
11984C         expansion for NU to infinity are applied over subdivisions of
11985C         the (NU,X) plane.  For values not covered by one of these
11986C         formulae, the order is incremented by an integer so that one
11987C         of these formulae apply.  Backward recursion is used to reduce
11988C         orders by integer values.  The asymptotic expansion for X to
11989C         infinity is used only when the entire sequence (specifically
11990C         the last member) lies within the region covered by the
11991C         expansion.  Leading terms of these expansions are used to test
11992C         for over or underflow where appropriate.  If a sequence is
11993C         requested and the last member would underflow, the result is
11994C         set to zero and the next lower order tried, etc., until a
11995C         member comes on scale or all are set to zero.  An overflow
11996C         cannot occur with scaling.
11997C
11998C     Description of Arguments
11999C
12000C         Input
12001C           X      - X .GE. 0.0E0
12002C           ALPHA  - order of first member of the sequence,
12003C                    ALPHA .GE. 0.0E0
12004C           KODE   - a parameter to indicate the scaling option
12005C                    KODE=1 returns
12006C                           Y(K)=        I/sub(ALPHA+K-1)/(X),
12007C                                K=1,...,N
12008C                    KODE=2 returns
12009C                           Y(K)=EXP(-X)*I/sub(ALPHA+K-1)/(X),
12010C                                K=1,...,N
12011C           N      - number of members in the sequence, N .GE. 1
12012C
12013C         Output
12014C           Y      - a vector whose first N components contain
12015C                    values for I/sub(ALPHA+K-1)/(X) or scaled
12016C                    values for EXP(-X)*I/sub(ALPHA+K-1)/(X),
12017C                    K=1,...,N depending on KODE
12018C           NZ     - number of components of Y set to zero due to
12019C                    underflow,
12020C                    NZ=0   , normal return, computation completed
12021C                    NZ .NE. 0, last NZ components of Y set to zero,
12022C                             Y(K)=0.0E0, K=N-NZ+1,...,N.
12023C
12024C     Error Conditions
12025C         Improper input arguments - a fatal error
12026C         Overflow with KODE=1 - a fatal error
12027C         Underflow - a non-fatal error (NZ .NE. 0)
12028C
12029C***REFERENCES  D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
12030C                 subroutines IBESS and JBESS for Bessel functions
12031C                 I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
12032C                 Transactions on Mathematical Software 3, (1977),
12033C                 pp. 76-92.
12034C               F. W. J. Olver, Tables of Bessel Functions of Moderate
12035C                 or Large Orders, NPL Mathematical Tables 6, Her
12036C                 Majesty's Stationery Office, London, 1962.
12037C***ROUTINES CALLED  ALNGAM, ASYIK, I1MACH, R1MACH, XERMSG
12038C***REVISION HISTORY  (YYMMDD)
12039C   750101  DATE WRITTEN
12040C   890531  Changed all specific intrinsics to generic.  (WRB)
12041C   890531  REVISION DATE from Version 3.2
12042C   891214  Prologue converted to Version 4.0 format.  (BAB)
12043C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
12044C   900326  Removed duplicate information from DESCRIPTION section.
12045C           (WRB)
12046C   920501  Reformatted the REFERENCES section.  (WRB)
12047C***END PROLOGUE  BESI
12048C
12049C-----COMMON----------------------------------------------------------
12050C
12051      INCLUDE 'DPCOMC.INC'
12052      INCLUDE 'DPCOP2.INC'
12053C
12054      INTEGER I, IALP, IN, INLIM, IS, I1, K, KK, KM, KODE, KT,
12055     1 N, NN, NS, NZ
12056      REAL AIN, AK, AKM, ALPHA, ANS, AP, ARG, ATOL, TOLLN, DFN,
12057     1 DTM, DX, EARG, ELIM, ETX, FLGIK,FN, FNF, FNI,FNP1,FNU,GLN,RA,
12058     2 RTTPI, S, SX, SXO2, S1, S2, T, TA, TB, TEMP, TFN, TM, TOL,
12059     3 TRX, T2, X, XO2, XO2L, Y, Z
12060      DOUBLE PRECISION DLNGAM
12061      DIMENSION Y(*), TEMP(3)
12062      SAVE RTTPI, INLIM
12063      DATA RTTPI           / 3.98942280401433E-01/
12064      DATA INLIM           /          80         /
12065C***FIRST EXECUTABLE STATEMENT  BESI
12066      KM = 0
12067      NS = 0
12068      NZ = 0
12069      KT = 1
12070C     I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
12071C     I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
12072      RA = R1MACH(3)
12073      TOL = MAX(RA,1.0E-15)
12074      I1 = -I1MACH(12)
12075      GLN = R1MACH(5)
12076      ELIM = 2.303E0*(I1*GLN-3.0E0)
12077C     TOLLN = -LN(TOL)
12078      I1 = I1MACH(11)+1
12079      TOLLN = 2.303E0*GLN*I1
12080      TOLLN = MIN(TOLLN,34.5388E0)
12081CCCCC IF (N-1) 590, 10, 20
12082      IF (N-1.LE.0)THEN
12083         GOTO590
12084      ELSEIF (N-1.EQ.0)THEN
12085         GOTO10
12086      ELSEIF (N-1.GT.0)THEN
12087         GOTO20
12088      ENDIF
12089   10 KT = 2
12090   20 NN = N
12091      IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 570
12092CCCCC IF (X) 600, 30, 80
12093      IF (X.LT.0.0)THEN
12094         GOTO600
12095      ELSEIF (X.EQ.0.0)THEN
12096         GOTO30
12097      ELSEIF (X.GT.0.0)THEN
12098         GOTO80
12099      ENDIF
12100   30 CONTINUE
12101CCCCC IF (ALPHA) 580, 40, 50
12102      IF (ALPHA.LT.0.0) THEN
12103         GOTO580
12104      ELSEIF (ALPHA.EQ.0.0) THEN
12105         GOTO40
12106      ELSEIF (ALPHA.GT.0.0) THEN
12107         GOTO50
12108      ENDIF
12109   40 Y(1) = 1.0E0
12110      IF (N.EQ.1) RETURN
12111      I1 = 2
12112      GO TO 60
12113   50 I1 = 1
12114   60 DO 70 I=I1,N
12115        Y(I) = 0.0E0
12116   70 CONTINUE
12117      RETURN
12118   80 CONTINUE
12119      IF (ALPHA.LT.0.0E0) GO TO 580
12120C
12121      IALP = INT(ALPHA)
12122      FNI = IALP + N - 1
12123      FNF = ALPHA - IALP
12124      DFN = FNI + FNF
12125      FNU = DFN
12126      IN = 0
12127      XO2 = X*0.5E0
12128      SXO2 = XO2*XO2
12129      ETX = KODE - 1
12130      SX = ETX*X
12131C
12132C     DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
12133C     TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
12134C     APPLIED.
12135C
12136      IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
12137      IF (X.LE.12.0E0) GO TO 110
12138      FN = 0.55E0*FNU*FNU
12139      FN = MAX(17.0E0,FN)
12140      IF (X.GE.FN) GO TO 430
12141      ANS = MAX(36.0E0-FNU,0.0E0)
12142      NS = INT(ANS)
12143      FNI = FNI + NS
12144      DFN = FNI + FNF
12145      FN = DFN
12146      IS = KT
12147      KM = N - 1 + NS
12148      IF (KM.GT.0) IS = 3
12149      GO TO 120
12150   90 FN = FNU
12151      FNP1 = FN + 1.0E0
12152      XO2L = LOG(XO2)
12153      IS = KT
12154      IF (X.LE.0.5E0) GO TO 230
12155      NS = 0
12156  100 FNI = FNI + NS
12157      DFN = FNI + FNF
12158      FN = DFN
12159      FNP1 = FN + 1.0E0
12160      IS = KT
12161      IF (N-1+NS.GT.0) IS = 3
12162      GO TO 230
12163  110 XO2L = LOG(XO2)
12164      NS = INT(SXO2-FNU)
12165      GO TO 100
12166  120 CONTINUE
12167C
12168C     OVERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
12169C
12170      IF (KODE.EQ.2) GO TO 130
12171      IF (ALPHA.LT.1.0E0) GO TO 150
12172      Z = X/ALPHA
12173      RA = SQRT(1.0E0+Z*Z)
12174      GLN = LOG((1.0E0+RA)/Z)
12175      T = RA*(1.0E0-ETX) + ETX/(Z+RA)
12176      ARG = ALPHA*(T-GLN)
12177      IF (ARG.GT.ELIM) GO TO 610
12178      IF (KM.EQ.0) GO TO 140
12179  130 CONTINUE
12180C
12181C     UNDERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
12182C
12183      Z = X/FN
12184      RA = SQRT(1.0E0+Z*Z)
12185      GLN = LOG((1.0E0+RA)/Z)
12186      T = RA*(1.0E0-ETX) + ETX/(Z+RA)
12187      ARG = FN*(T-GLN)
12188  140 IF (ARG.LT.(-ELIM)) GO TO 280
12189      GO TO 190
12190  150 IF (X.GT.ELIM) GO TO 610
12191      GO TO 130
12192C
12193C     UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
12194C
12195  160 IF (KM.NE.0) GO TO 170
12196      Y(1) = TEMP(3)
12197      RETURN
12198  170 TEMP(1) = TEMP(3)
12199      IN = NS
12200      KT = 1
12201      I1 = 0
12202  180 CONTINUE
12203      IS = 2
12204      FNI = FNI - 1.0E0
12205      DFN = FNI + FNF
12206      FN = DFN
12207      IF(I1.EQ.2) GO TO 350
12208      Z = X/FN
12209      RA = SQRT(1.0E0+Z*Z)
12210      GLN = LOG((1.0E0+RA)/Z)
12211      T = RA*(1.0E0-ETX) + ETX/(Z+RA)
12212      ARG = FN*(T-GLN)
12213  190 CONTINUE
12214      I1 = ABS(3-IS)
12215      I1 = MAX(I1,1)
12216      FLGIK = 1.0E0
12217      CALL ASYIK(X,FN,KODE,FLGIK,RA,ARG,I1,TEMP(IS))
12218      GO TO (180, 350, 510), IS
12219C
12220C     SERIES FOR (X/2)**2.LE.NU+1
12221C
12222  230 CONTINUE
12223      GLN = REAL(DLNGAM(DBLE(FNP1)))
12224      ARG = FN*XO2L - GLN - SX
12225      IF (ARG.LT.(-ELIM)) GO TO 300
12226      EARG = EXP(ARG)
12227  240 CONTINUE
12228      S = 1.0E0
12229      IF (X.LT.TOL) GO TO 260
12230      AK = 3.0E0
12231      T2 = 1.0E0
12232      T = 1.0E0
12233      S1 = FN
12234      DO 250 K=1,17
12235        S2 = T2 + S1
12236        T = T*SXO2/S2
12237        S = S + T
12238        IF (ABS(T).LT.TOL) GO TO 260
12239        T2 = T2 + AK
12240        AK = AK + 2.0E0
12241        S1 = S1 + FN
12242  250 CONTINUE
12243  260 CONTINUE
12244      TEMP(IS) = S*EARG
12245      GO TO (270, 350, 500), IS
12246  270 EARG = EARG*FN/XO2
12247      FNI = FNI - 1.0E0
12248      DFN = FNI + FNF
12249      FN = DFN
12250      IS = 2
12251      GO TO 240
12252C
12253C     SET UNDERFLOW VALUE AND UPDATE PARAMETERS
12254C
12255  280 Y(NN) = 0.0E0
12256      NN = NN - 1
12257      FNI = FNI - 1.0E0
12258      DFN = FNI + FNF
12259      FN = DFN
12260CCCCC IF (NN-1) 340, 290, 130
12261      IF (NN-1.LT.0)THEN
12262         GOTO340
12263      ELSEIF (NN-1.EQ.0)THEN
12264         GOTO290
12265      ELSEIF (NN-1.GT.0)THEN
12266         GOTO130
12267      ENDIF
12268  290 KT = 2
12269      IS = 2
12270      GO TO 130
12271  300 Y(NN) = 0.0E0
12272      NN = NN - 1
12273      FNP1 = FN
12274      FNI = FNI - 1.0E0
12275      DFN = FNI + FNF
12276      FN = DFN
12277CCCCC IF (NN-1) 340, 310, 320
12278      IF (NN-1.LT.0)THEN
12279         GOTO340
12280      ELSEIF (NN-1.EQ.0)THEN
12281         GOTO310
12282      ELSEIF (NN-1.GT.0)THEN
12283         GOTO320
12284      ENDIF
12285  310 KT = 2
12286      IS = 2
12287  320 IF (SXO2.LE.FNP1) GO TO 330
12288      GO TO 130
12289  330 ARG = ARG - XO2L + LOG(FNP1)
12290      IF (ARG.LT.(-ELIM)) GO TO 300
12291      GO TO 230
12292  340 NZ = N - NN
12293      RETURN
12294C
12295C     BACKWARD RECURSION SECTION
12296C
12297  350 CONTINUE
12298      NZ = N - NN
12299  360 CONTINUE
12300      IF(KT.EQ.2) GO TO 420
12301      S1 = TEMP(1)
12302      S2 = TEMP(2)
12303      TRX = 2.0E0/X
12304      DTM = FNI
12305      TM = (DTM+FNF)*TRX
12306      IF (IN.EQ.0) GO TO 390
12307C     BACKWARD RECUR TO INDEX ALPHA+NN-1
12308      DO 380 I=1,IN
12309        S = S2
12310        S2 = TM*S2 + S1
12311        S1 = S
12312        DTM = DTM - 1.0E0
12313        TM = (DTM+FNF)*TRX
12314  380 CONTINUE
12315      Y(NN) = S1
12316      IF (NN.EQ.1) RETURN
12317      Y(NN-1) = S2
12318      IF (NN.EQ.2) RETURN
12319      GO TO 400
12320  390 CONTINUE
12321C     BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
12322      Y(NN) = S1
12323      Y(NN-1) = S2
12324      IF (NN.EQ.2) RETURN
12325  400 K = NN + 1
12326      DO 410 I=3,NN
12327        K = K - 1
12328        Y(K-2) = TM*Y(K-1) + Y(K)
12329        DTM = DTM - 1.0E0
12330        TM = (DTM+FNF)*TRX
12331  410 CONTINUE
12332      RETURN
12333  420 Y(1) = TEMP(2)
12334      RETURN
12335C
12336C     ASYMPTOTIC EXPANSION FOR X TO INFINITY
12337C
12338  430 CONTINUE
12339      EARG = RTTPI/SQRT(X)
12340      IF (KODE.EQ.2) GO TO 440
12341      IF (X.GT.ELIM) GO TO 610
12342      EARG = EARG*EXP(X)
12343  440 ETX = 8.0E0*X
12344      IS = KT
12345      IN = 0
12346      FN = FNU
12347  450 DX = FNI + FNI
12348      TM = 0.0E0
12349      IF (FNI.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 460
12350      TM = 4.0E0*FNF*(FNI+FNI+FNF)
12351  460 CONTINUE
12352      DTM = DX*DX
12353      S1 = ETX
12354      TRX = DTM - 1.0E0
12355      DX = -(TRX+TM)/ETX
12356      T = DX
12357      S = 1.0E0 + DX
12358      ATOL = TOL*ABS(S)
12359      S2 = 1.0E0
12360      AK = 8.0E0
12361      DO 470 K=1,25
12362        S1 = S1 + ETX
12363        S2 = S2 + AK
12364        DX = DTM - S2
12365        AP = DX + TM
12366        T = -T*AP/S1
12367        S = S + T
12368        IF (ABS(T).LE.ATOL) GO TO 480
12369        AK = AK + 8.0E0
12370  470 CONTINUE
12371  480 TEMP(IS) = S*EARG
12372      IF(IS.EQ.2) GO TO 360
12373      IS = 2
12374      FNI = FNI - 1.0E0
12375      DFN = FNI + FNF
12376      FN = DFN
12377      GO TO 450
12378C
12379C     BACKWARD RECURSION WITH NORMALIZATION BY
12380C     ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
12381C
12382  500 CONTINUE
12383C     COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
12384      AKM = MAX(3.0E0-FN,0.0E0)
12385      KM = INT(AKM)
12386      TFN = FN + KM
12387      TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
12388      TA = XO2L - TA
12389      TB = -(1.0E0-1.0E0/TFN)/TFN
12390      AIN = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
12391      IN = INT(AIN)
12392      IN = IN + KM
12393      GO TO 520
12394  510 CONTINUE
12395C     COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
12396      T = 1.0E0/(FN*RA)
12397      AIN = TOLLN/(GLN+SQRT(GLN*GLN+T*TOLLN)) + 1.5E0
12398      IN = INT(AIN)
12399      IF (IN.GT.INLIM) GO TO 160
12400  520 CONTINUE
12401      TRX = 2.0E0/X
12402      DTM = FNI + IN
12403      TM = (DTM+FNF)*TRX
12404      TA = 0.0E0
12405      TB = TOL
12406      KK = 1
12407  530 CONTINUE
12408C
12409C     BACKWARD RECUR UNINDEXED
12410C
12411      DO 540 I=1,IN
12412        S = TB
12413        TB = TM*TB + TA
12414        TA = S
12415        DTM = DTM - 1.0E0
12416        TM = (DTM+FNF)*TRX
12417  540 CONTINUE
12418C     NORMALIZATION
12419      IF (KK.NE.1) GO TO 550
12420      TA = (TA/TB)*TEMP(3)
12421      TB = TEMP(3)
12422      KK = 2
12423      IN = NS
12424      IF (NS.NE.0) GO TO 530
12425  550 Y(NN) = TB
12426      NZ = N - NN
12427      IF (NN.EQ.1) RETURN
12428      TB = TM*TB + TA
12429      K = NN - 1
12430      Y(K) = TB
12431      IF (NN.EQ.2) RETURN
12432      DTM = DTM - 1.0E0
12433      TM = (DTM+FNF)*TRX
12434      KM = K - 1
12435C
12436C     BACKWARD RECUR INDEXED
12437C
12438      DO 560 I=1,KM
12439        Y(K-1) = TM*Y(K) + Y(K+1)
12440        DTM = DTM - 1.0E0
12441        TM = (DTM+FNF)*TRX
12442        K = K - 1
12443  560 CONTINUE
12444      RETURN
12445C
12446C
12447C
12448  570 CONTINUE
12449      WRITE(ICOUT,571)
12450  571 FORMAT('***** ERORR FROM BESI, KODE IS NOT 1 OR 2. ***')
12451      CALL DPWRST('XXX','BUG ')
12452      RETURN
12453  580 CONTINUE
12454      WRITE(ICOUT,581)
12455  581 FORMAT('***** ERORR FROM BESI, THE ORDER ALPHA IS NEGATIVE. ***')
12456      CALL DPWRST('XXX','BUG ')
12457      RETURN
12458  590 CONTINUE
12459      WRITE(ICOUT,591)
12460  591 FORMAT('***** ERORR FROM BESI, N IS LESS THAN ONE.. ***')
12461      CALL DPWRST('XXX','BUG ')
12462      RETURN
12463  600 CONTINUE
12464      WRITE(ICOUT,601)
12465  601 FORMAT('***** ERORR FROM BESI, X IS LESS THAN ZERO.. ***')
12466      CALL DPWRST('XXX','BUG ')
12467      RETURN
12468  610 CONTINUE
12469      WRITE(ICOUT,611)
12470  611 FORMAT('**** ERORR FROM BESI, OVERFLOW BECAUSE X IS TOO BIG.. *')
12471      CALL DPWRST('XXX','BUG ')
12472      RETURN
12473      END
12474      FUNCTION BESI0 (X)
12475C***BEGIN PROLOGUE  BESI0
12476C***PURPOSE  Compute the hyperbolic Bessel function of the first kind
12477C            of order zero.
12478C***LIBRARY   SLATEC (FNLIB)
12479C***CATEGORY  C10B1
12480C***TYPE      SINGLE PRECISION (BESI0-S, DBESI0-D)
12481C***KEYWORDS  FIRST KIND, FNLIB, HYPERBOLIC BESSEL FUNCTION,
12482C             MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS
12483C***AUTHOR  Fullerton, W., (LANL)
12484C***DESCRIPTION
12485C
12486C BESI0(X) computes the modified (hyperbolic) Bessel function
12487C of the first kind of order zero and real argument X.
12488C
12489C Series for BI0        on the interval  0.          to  9.00000D+00
12490C                                        with weighted error   2.46E-18
12491C                                         log weighted error  17.61
12492C                               significant figures required  17.90
12493C                                    decimal places required  18.15
12494C
12495C***REFERENCES  (NONE)
12496C***ROUTINES CALLED  BESI0E, CSEVL, INITS, R1MACH, XERMSG
12497C***REVISION HISTORY  (YYMMDD)
12498C   770401  DATE WRITTEN
12499C   890531  Changed all specific intrinsics to generic.  (WRB)
12500C   890531  REVISION DATE from Version 3.2
12501C   891214  Prologue converted to Version 4.0 format.  (BAB)
12502C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
12503C   900326  Removed duplicate information from DESCRIPTION section.
12504C           (WRB)
12505C***END PROLOGUE  BESI0
12506C
12507C-----COMMON----------------------------------------------------------
12508C
12509      INCLUDE 'DPCOMC.INC'
12510      INCLUDE 'DPCOP2.INC'
12511C
12512      DIMENSION BI0CS(12)
12513      LOGICAL FIRST
12514      SAVE BI0CS, NTI0, XSML, XMAX, FIRST
12515      DATA BI0CS( 1) /   -.0766054725 2839144951E0 /
12516      DATA BI0CS( 2) /   1.9273379539 93808270E0 /
12517      DATA BI0CS( 3) /    .2282644586 920301339E0 /
12518      DATA BI0CS( 4) /    .0130489146 6707290428E0 /
12519      DATA BI0CS( 5) /    .0004344270 9008164874E0 /
12520      DATA BI0CS( 6) /    .0000094226 5768600193E0 /
12521      DATA BI0CS( 7) /    .0000001434 0062895106E0 /
12522      DATA BI0CS( 8) /    .0000000016 1384906966E0 /
12523      DATA BI0CS( 9) /    .0000000000 1396650044E0 /
12524      DATA BI0CS(10) /    .0000000000 0009579451E0 /
12525      DATA BI0CS(11) /    .0000000000 0000053339E0 /
12526      DATA BI0CS(12) /    .0000000000 0000000245E0 /
12527      DATA FIRST /.TRUE./
12528C***FIRST EXECUTABLE STATEMENT  BESI0
12529      BESI0 = 0.0
12530C
12531      IF (FIRST) THEN
12532         NTI0 = INITS (BI0CS, 12, 0.1*R1MACH(3))
12533         XSML = SQRT (4.5*R1MACH(3))
12534         XMAX = LOG (R1MACH(2))
12535      ENDIF
12536      FIRST = .FALSE.
12537C
12538      Y = ABS(X)
12539      IF (Y.GT.3.0) GO TO 20
12540C
12541      BESI0 = 1.0
12542      IF (Y.GT.XSML) BESI0 = 2.75 + CSEVL (Y*Y/4.5-1.0, BI0CS, NTI0)
12543      RETURN
12544C
12545 20   CONTINUE
12546      IF (Y.GT.XMAX) THEN
12547        WRITE(ICOUT,1)
12548        CALL DPWRST('XXX','BUG ')
12549        BESI0 = 0.0
12550        RETURN
12551      ENDIF
12552    1 FORMAT('***** ERORR FROM BESI0, OVERFLOW BECAUSE THE ',
12553     1       'ABSOLUTE VALUE OF X IS TOO BIG.  ****')
12554C
12555      BESI0 = EXP(Y) * BESI0E(X)
12556C
12557      RETURN
12558      END
12559      FUNCTION BESI0E (X)
12560C***BEGIN PROLOGUE  BESI0E
12561C***PURPOSE  Compute the exponentially scaled modified (hyperbolic)
12562C            Bessel function of the first kind of order zero.
12563C***LIBRARY   SLATEC (FNLIB)
12564C***CATEGORY  C10B1
12565C***TYPE      SINGLE PRECISION (BESI0E-S, DBSI0E-D)
12566C***KEYWORDS  EXPONENTIALLY SCALED, FIRST KIND, FNLIB,
12567C             HYPERBOLIC BESSEL FUNCTION, MODIFIED BESSEL FUNCTION,
12568C             ORDER ZERO, SPECIAL FUNCTIONS
12569C***AUTHOR  Fullerton, W., (LANL)
12570C***DESCRIPTION
12571C
12572C BESI0E(X) calculates the exponentially scaled modified (hyperbolic)
12573C Bessel function of the first kind of order zero for real argument X;
12574C i.e., EXP(-ABS(X))*I0(X).
12575C
12576C
12577C Series for BI0        on the interval  0.          to  9.00000D+00
12578C                                        with weighted error   2.46E-18
12579C                                         log weighted error  17.61
12580C                               significant figures required  17.90
12581C                                    decimal places required  18.15
12582C
12583C
12584C Series for AI0        on the interval  1.25000D-01 to  3.33333D-01
12585C                                        with weighted error   7.87E-17
12586C                                         log weighted error  16.10
12587C                               significant figures required  14.69
12588C                                    decimal places required  16.76
12589C
12590C
12591C Series for AI02       on the interval  0.          to  1.25000D-01
12592C                                        with weighted error   3.79E-17
12593C                                         log weighted error  16.42
12594C                               significant figures required  14.86
12595C                                    decimal places required  17.09
12596C
12597C***REFERENCES  (NONE)
12598C***ROUTINES CALLED  CSEVL, INITS, R1MACH
12599C***REVISION HISTORY  (YYMMDD)
12600C   770701  DATE WRITTEN
12601C   890313  REVISION DATE from Version 3.2
12602C   891214  Prologue converted to Version 4.0 format.  (BAB)
12603C***END PROLOGUE  BESI0E
12604C
12605C-----COMMON----------------------------------------------------------
12606C
12607      INCLUDE 'DPCOMC.INC'
12608      INCLUDE 'DPCOP2.INC'
12609C
12610      DIMENSION BI0CS(12), AI0CS(21), AI02CS(22)
12611      LOGICAL FIRST
12612      SAVE BI0CS, AI0CS, AI02CS, NTI0, NTAI0, NTAI02, XSML, FIRST
12613      DATA BI0CS( 1) /   -.0766054725 2839144951E0 /
12614      DATA BI0CS( 2) /   1.9273379539 93808270E0 /
12615      DATA BI0CS( 3) /    .2282644586 920301339E0 /
12616      DATA BI0CS( 4) /    .0130489146 6707290428E0 /
12617      DATA BI0CS( 5) /    .0004344270 9008164874E0 /
12618      DATA BI0CS( 6) /    .0000094226 5768600193E0 /
12619      DATA BI0CS( 7) /    .0000001434 0062895106E0 /
12620      DATA BI0CS( 8) /    .0000000016 1384906966E0 /
12621      DATA BI0CS( 9) /    .0000000000 1396650044E0 /
12622      DATA BI0CS(10) /    .0000000000 0009579451E0 /
12623      DATA BI0CS(11) /    .0000000000 0000053339E0 /
12624      DATA BI0CS(12) /    .0000000000 0000000245E0 /
12625      DATA AI0CS( 1) /    .0757599449 4023796E0 /
12626      DATA AI0CS( 2) /    .0075913808 1082334E0 /
12627      DATA AI0CS( 3) /    .0004153131 3389237E0 /
12628      DATA AI0CS( 4) /    .0000107007 6463439E0 /
12629      DATA AI0CS( 5) /   -.0000079011 7997921E0 /
12630      DATA AI0CS( 6) /   -.0000007826 1435014E0 /
12631      DATA AI0CS( 7) /    .0000002783 8499429E0 /
12632      DATA AI0CS( 8) /    .0000000082 5247260E0 /
12633      DATA AI0CS( 9) /   -.0000000120 4463945E0 /
12634      DATA AI0CS(10) /    .0000000015 5964859E0 /
12635      DATA AI0CS(11) /    .0000000002 2925563E0 /
12636      DATA AI0CS(12) /   -.0000000001 1916228E0 /
12637      DATA AI0CS(13) /    .0000000000 1757854E0 /
12638      DATA AI0CS(14) /    .0000000000 0112822E0 /
12639      DATA AI0CS(15) /   -.0000000000 0114684E0 /
12640      DATA AI0CS(16) /    .0000000000 0027155E0 /
12641      DATA AI0CS(17) /   -.0000000000 0002415E0 /
12642      DATA AI0CS(18) /   -.0000000000 0000608E0 /
12643      DATA AI0CS(19) /    .0000000000 0000314E0 /
12644      DATA AI0CS(20) /   -.0000000000 0000071E0 /
12645      DATA AI0CS(21) /    .0000000000 0000007E0 /
12646      DATA AI02CS( 1) /    .0544904110 1410882E0 /
12647      DATA AI02CS( 2) /    .0033691164 7825569E0 /
12648      DATA AI02CS( 3) /    .0000688975 8346918E0 /
12649      DATA AI02CS( 4) /    .0000028913 7052082E0 /
12650      DATA AI02CS( 5) /    .0000002048 9185893E0 /
12651      DATA AI02CS( 6) /    .0000000226 6668991E0 /
12652      DATA AI02CS( 7) /    .0000000033 9623203E0 /
12653      DATA AI02CS( 8) /    .0000000004 9406022E0 /
12654      DATA AI02CS( 9) /    .0000000000 1188914E0 /
12655      DATA AI02CS(10) /   -.0000000000 3149915E0 /
12656      DATA AI02CS(11) /   -.0000000000 1321580E0 /
12657      DATA AI02CS(12) /   -.0000000000 0179419E0 /
12658      DATA AI02CS(13) /    .0000000000 0071801E0 /
12659      DATA AI02CS(14) /    .0000000000 0038529E0 /
12660      DATA AI02CS(15) /    .0000000000 0001539E0 /
12661      DATA AI02CS(16) /   -.0000000000 0004151E0 /
12662      DATA AI02CS(17) /   -.0000000000 0000954E0 /
12663      DATA AI02CS(18) /    .0000000000 0000382E0 /
12664      DATA AI02CS(19) /    .0000000000 0000176E0 /
12665      DATA AI02CS(20) /   -.0000000000 0000034E0 /
12666      DATA AI02CS(21) /   -.0000000000 0000027E0 /
12667      DATA AI02CS(22) /    .0000000000 0000003E0 /
12668      DATA FIRST /.TRUE./
12669C
12670      BESI0E = 0.0
12671C
12672C***FIRST EXECUTABLE STATEMENT  BESI0E
12673      IF (FIRST) THEN
12674         NTI0 = INITS (BI0CS, 12, 0.1*R1MACH(3))
12675         NTAI0 = INITS (AI0CS, 21, 0.1*R1MACH(3))
12676         NTAI02 = INITS (AI02CS, 22, 0.1*R1MACH(3))
12677         XSML = SQRT (4.5*R1MACH(3))
12678      ENDIF
12679      FIRST = .FALSE.
12680C
12681      Y = ABS(X)
12682      IF (Y.GT.3.0) GO TO 20
12683C
12684      BESI0E = 1.0 - X
12685      IF (Y.GT.XSML) BESI0E = EXP(-Y) * ( 2.75 +
12686     1  CSEVL (Y*Y/4.5-1.0, BI0CS, NTI0) )
12687      RETURN
12688C
12689 20   IF (Y.LE.8.) BESI0E = (.375 + CSEVL ((48./Y-11.)/5., AI0CS, NTAI0)
12690     1  ) / SQRT(Y)
12691      IF (Y.GT.8.) BESI0E = (.375 + CSEVL (16./Y-1., AI02CS, NTAI02))
12692     1  / SQRT(Y)
12693C
12694      RETURN
12695      END
12696      FUNCTION BESI1 (X)
12697C***BEGIN PROLOGUE  BESI1
12698C***PURPOSE  Compute the modified (hyperbolic) Bessel function of the
12699C            first kind of order one.
12700C***LIBRARY   SLATEC (FNLIB)
12701C***CATEGORY  C10B1
12702C***TYPE      SINGLE PRECISION (BESI1-S, DBESI1-D)
12703C***KEYWORDS  FIRST KIND, FNLIB, HYPERBOLIC BESSEL FUNCTION,
12704C             MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS
12705C***AUTHOR  Fullerton, W., (LANL)
12706C***DESCRIPTION
12707C
12708C BESI1(X) calculates the modified (hyperbolic) Bessel function
12709C of the first kind of order one for real argument X.
12710C
12711C Series for BI1        on the interval  0.          to  9.00000D+00
12712C                                        with weighted error   2.40E-17
12713C                                         log weighted error  16.62
12714C                               significant figures required  16.23
12715C                                    decimal places required  17.14
12716C
12717C***REFERENCES  (NONE)
12718C***ROUTINES CALLED  BESI1E, CSEVL, INITS, R1MACH, XERMSG
12719C***REVISION HISTORY  (YYMMDD)
12720C   770401  DATE WRITTEN
12721C   890531  Changed all specific intrinsics to generic.  (WRB)
12722C   890531  REVISION DATE from Version 3.2
12723C   891214  Prologue converted to Version 4.0 format.  (BAB)
12724C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
12725C   900326  Removed duplicate information from DESCRIPTION section.
12726C           (WRB)
12727C***END PROLOGUE  BESI1
12728C
12729C-----COMMON----------------------------------------------------------
12730C
12731      INCLUDE 'DPCOMC.INC'
12732      INCLUDE 'DPCOP2.INC'
12733C
12734      DIMENSION BI1CS(11)
12735      LOGICAL FIRST
12736      SAVE BI1CS, NTI1, XMIN, XSML, XMAX, FIRST
12737      DATA BI1CS( 1) /   -.0019717132 61099859E0 /
12738      DATA BI1CS( 2) /    .4073488766 7546481E0 /
12739      DATA BI1CS( 3) /    .0348389942 99959456E0 /
12740      DATA BI1CS( 4) /    .0015453945 56300123E0 /
12741      DATA BI1CS( 5) /    .0000418885 21098377E0 /
12742      DATA BI1CS( 6) /    .0000007649 02676483E0 /
12743      DATA BI1CS( 7) /    .0000000100 42493924E0 /
12744      DATA BI1CS( 8) /    .0000000000 99322077E0 /
12745      DATA BI1CS( 9) /    .0000000000 00766380E0 /
12746      DATA BI1CS(10) /    .0000000000 00004741E0 /
12747      DATA BI1CS(11) /    .0000000000 00000024E0 /
12748      DATA FIRST /.TRUE./
12749C***FIRST EXECUTABLE STATEMENT  BESI1
12750      IF (FIRST) THEN
12751         NTI1 = INITS (BI1CS, 11, 0.1*R1MACH(3))
12752         XMIN = 2.0*R1MACH(1)
12753         XSML = SQRT (4.5*R1MACH(3))
12754         XMAX = LOG (R1MACH(2))
12755      ENDIF
12756      FIRST = .FALSE.
12757C
12758      Y = ABS(X)
12759      IF (Y.GT.3.0) GO TO 20
12760C
12761      BESI1 = 0.0
12762      IF (Y.EQ.0.0)  RETURN
12763C
12764      IF (Y .LE. XMIN) THEN
12765        WRITE(ICOUT,2)
12766        CALL DPWRST('XXX','BUG ')
12767      ENDIF
12768    2 FORMAT('***** WARNING FROM BESI1, UNDERFLOW BECAUSE THE ',
12769     1       'ABSOLUTE VALUE OF X IS SO SMALL.  ****')
12770      IF (Y.GT.XMIN)BESI1 = 0.5*X
12771      IF (Y.GT.XSML)BESI1 = X * (.875 + CSEVL(Y*Y/4.5-1., BI1CS, NTI1))
12772      RETURN
12773C
12774 20   CONTINUE
12775      IF (Y.GT.XMAX) THEN
12776        WRITE(ICOUT,1)
12777        CALL DPWRST('XXX','BUG ')
12778        BESI1 = 0.0
12779        RETURN
12780      ENDIF
12781    1 FORMAT('***** ERORR FROM BESI1, OVERFLOW BECAUSE THE ',
12782     1       'ABSOLUTE VALUE OF X IS TOO BIG.  ****')
12783C
12784      BESI1 = EXP(Y) * BESI1E(X)
12785C
12786      RETURN
12787      END
12788      FUNCTION BESI1E (X)
12789C***BEGIN PROLOGUE  BESI1E
12790C***PURPOSE  Compute the exponentially scaled modified (hyperbolic)
12791C            Bessel function of the first kind of order one.
12792C***LIBRARY   SLATEC (FNLIB)
12793C***CATEGORY  C10B1
12794C***TYPE      SINGLE PRECISION (BESI1E-S, DBSI1E-D)
12795C***KEYWORDS  EXPONENTIALLY SCALED, FIRST KIND, FNLIB,
12796C             HYPERBOLIC BESSEL FUNCTION, MODIFIED BESSEL FUNCTION,
12797C             ORDER ONE, SPECIAL FUNCTIONS
12798C***AUTHOR  Fullerton, W., (LANL)
12799C***DESCRIPTION
12800C
12801C BESI1E(X) calculates the exponentially scaled modified (hyperbolic)
12802C Bessel function of the first kind of order one for real argument X;
12803C i.e., EXP(-ABS(X))*I1(X).
12804C
12805C Series for BI1        on the interval  0.          to  9.00000D+00
12806C                                        with weighted error   2.40E-17
12807C                                         log weighted error  16.62
12808C                               significant figures required  16.23
12809C                                    decimal places required  17.14
12810C
12811C Series for AI1        on the interval  1.25000D-01 to  3.33333D-01
12812C                                        with weighted error   6.98E-17
12813C                                         log weighted error  16.16
12814C                               significant figures required  14.53
12815C                                    decimal places required  16.82
12816C
12817C Series for AI12       on the interval  0.          to  1.25000D-01
12818C                                        with weighted error   3.55E-17
12819C                                         log weighted error  16.45
12820C                               significant figures required  14.69
12821C                                    decimal places required  17.12
12822C
12823C***REFERENCES  (NONE)
12824C***ROUTINES CALLED  CSEVL, INITS, R1MACH, XERMSG
12825C***REVISION HISTORY  (YYMMDD)
12826C   770401  DATE WRITTEN
12827C   890210  REVISION DATE from Version 3.2
12828C   891214  Prologue converted to Version 4.0 format.  (BAB)
12829C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
12830C   900326  Removed duplicate information from DESCRIPTION section.
12831C           (WRB)
12832C   920618  Removed space from variable names.  (RWC, WRB)
12833C***END PROLOGUE  BESI1E
12834C
12835C-----COMMON----------------------------------------------------------
12836C
12837      INCLUDE 'DPCOMC.INC'
12838      INCLUDE 'DPCOP2.INC'
12839C
12840      DIMENSION BI1CS(11), AI1CS(21), AI12CS(22)
12841      LOGICAL FIRST
12842      SAVE BI1CS, AI1CS, AI12CS, NTI1, NTAI1, NTAI12, XMIN, XSML, FIRST
12843      DATA BI1CS( 1) /   -.0019717132 61099859E0 /
12844      DATA BI1CS( 2) /    .4073488766 7546481E0 /
12845      DATA BI1CS( 3) /    .0348389942 99959456E0 /
12846      DATA BI1CS( 4) /    .0015453945 56300123E0 /
12847      DATA BI1CS( 5) /    .0000418885 21098377E0 /
12848      DATA BI1CS( 6) /    .0000007649 02676483E0 /
12849      DATA BI1CS( 7) /    .0000000100 42493924E0 /
12850      DATA BI1CS( 8) /    .0000000000 99322077E0 /
12851      DATA BI1CS( 9) /    .0000000000 00766380E0 /
12852      DATA BI1CS(10) /    .0000000000 00004741E0 /
12853      DATA BI1CS(11) /    .0000000000 00000024E0 /
12854      DATA AI1CS( 1) /   -.0284674418 1881479E0 /
12855      DATA AI1CS( 2) /   -.0192295323 1443221E0 /
12856      DATA AI1CS( 3) /   -.0006115185 8579437E0 /
12857      DATA AI1CS( 4) /   -.0000206997 1253350E0 /
12858      DATA AI1CS( 5) /    .0000085856 1914581E0 /
12859      DATA AI1CS( 6) /    .0000010494 9824671E0 /
12860      DATA AI1CS( 7) /   -.0000002918 3389184E0 /
12861      DATA AI1CS( 8) /   -.0000000155 9378146E0 /
12862      DATA AI1CS( 9) /    .0000000131 8012367E0 /
12863      DATA AI1CS(10) /   -.0000000014 4842341E0 /
12864      DATA AI1CS(11) /   -.0000000002 9085122E0 /
12865      DATA AI1CS(12) /    .0000000001 2663889E0 /
12866      DATA AI1CS(13) /   -.0000000000 1664947E0 /
12867      DATA AI1CS(14) /   -.0000000000 0166665E0 /
12868      DATA AI1CS(15) /    .0000000000 0124260E0 /
12869      DATA AI1CS(16) /   -.0000000000 0027315E0 /
12870      DATA AI1CS(17) /    .0000000000 0002023E0 /
12871      DATA AI1CS(18) /    .0000000000 0000730E0 /
12872      DATA AI1CS(19) /   -.0000000000 0000333E0 /
12873      DATA AI1CS(20) /    .0000000000 0000071E0 /
12874      DATA AI1CS(21) /   -.0000000000 0000006E0 /
12875      DATA AI12CS( 1) /    .0285762350 1828014E0 /
12876      DATA AI12CS( 2) /   -.0097610974 9136147E0 /
12877      DATA AI12CS( 3) /   -.0001105889 3876263E0 /
12878      DATA AI12CS( 4) /   -.0000038825 6480887E0 /
12879      DATA AI12CS( 5) /   -.0000002512 2362377E0 /
12880      DATA AI12CS( 6) /   -.0000000263 1468847E0 /
12881      DATA AI12CS( 7) /   -.0000000038 3538039E0 /
12882      DATA AI12CS( 8) /   -.0000000005 5897433E0 /
12883      DATA AI12CS( 9) /   -.0000000000 1897495E0 /
12884      DATA AI12CS(10) /    .0000000000 3252602E0 /
12885      DATA AI12CS(11) /    .0000000000 1412580E0 /
12886      DATA AI12CS(12) /    .0000000000 0203564E0 /
12887      DATA AI12CS(13) /   -.0000000000 0071985E0 /
12888      DATA AI12CS(14) /   -.0000000000 0040836E0 /
12889      DATA AI12CS(15) /   -.0000000000 0002101E0 /
12890      DATA AI12CS(16) /    .0000000000 0004273E0 /
12891      DATA AI12CS(17) /    .0000000000 0001041E0 /
12892      DATA AI12CS(18) /   -.0000000000 0000382E0 /
12893      DATA AI12CS(19) /   -.0000000000 0000186E0 /
12894      DATA AI12CS(20) /    .0000000000 0000033E0 /
12895      DATA AI12CS(21) /    .0000000000 0000028E0 /
12896      DATA AI12CS(22) /   -.0000000000 0000003E0 /
12897      DATA FIRST /.TRUE./
12898C***FIRST EXECUTABLE STATEMENT  BESI1E
12899      BESI1E = 0.0
12900C
12901      IF (FIRST) THEN
12902         NTI1 = INITS (BI1CS, 11, 0.1*R1MACH(3))
12903         NTAI1 = INITS (AI1CS, 21, 0.1*R1MACH(3))
12904         NTAI12 = INITS (AI12CS, 22, 0.1*R1MACH(3))
12905C
12906         XMIN = 2.0*R1MACH(1)
12907         XSML = SQRT (4.5*R1MACH(3))
12908      ENDIF
12909      FIRST = .FALSE.
12910C
12911      Y = ABS(X)
12912      IF (Y.GT.3.0) GO TO 20
12913C
12914      BESI1E = 0.0
12915      IF (Y.EQ.0.0)  RETURN
12916C
12917      IF (Y .LE. XMIN) THEN
12918        WRITE(ICOUT,1)
12919        CALL DPWRST('XXX','BUG ')
12920      ENDIF
12921    1 FORMAT('***** WARNING FROM BESI1E, UNDERFLOW BECAUSE THE ',
12922     1       'ABSOLUTE VALUE OF X IS SO SMALL.  ****')
12923      IF (Y.GT.XMIN) BESI1E = 0.5*X
12924      IF (Y.GT.XSML) BESI1E = X * (.875 + CSEVL(Y*Y/4.5-1., BI1CS,NTI1))
12925      BESI1E = EXP(-Y) * BESI1E
12926      RETURN
12927C
12928 20   IF (Y.LE.8.) BESI1E = (.375 + CSEVL ((48./Y-11.)/5., AI1CS, NTAI1)
12929     1  ) / SQRT(Y)
12930      IF (Y.GT.8.) BESI1E = (.375 + CSEVL (16./Y-1.0, AI12CS, NTAI12))
12931     1  / SQRT(Y)
12932      BESI1E = SIGN (BESI1E, X)
12933C
12934      RETURN
12935      END
12936      SUBROUTINE BESJ (X, ALPHA, N, Y, NZ)
12937C***BEGIN PROLOGUE  BESJ
12938C***PURPOSE  Compute an N member sequence of J Bessel functions
12939C            J/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
12940C            and X.
12941C***LIBRARY   SLATEC
12942C***CATEGORY  C10A3
12943C***TYPE      SINGLE PRECISION (BESJ-S, DBESJ-D)
12944C***KEYWORDS  J BESSEL FUNCTION, SPECIAL FUNCTIONS
12945C***AUTHOR  Amos, D. E., (SNLA)
12946C           Daniel, S. L., (SNLA)
12947C           Weston, M. K., (SNLA)
12948C***DESCRIPTION
12949C
12950C     Abstract
12951C         BESJ computes an N member sequence of J Bessel functions
12952C         J/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA and X.
12953C         A combination of the power series, the asymptotic expansion
12954C         for X to infinity and the uniform asymptotic expansion for
12955C         NU to infinity are applied over subdivisions of the (NU,X)
12956C         plane.  For values of (NU,X) not covered by one of these
12957C         formulae, the order is incremented or decremented by integer
12958C         values into a region where one of the formulae apply. Backward
12959C         recursion is applied to reduce orders by integer values except
12960C         where the entire sequence lies in the oscillatory region.  In
12961C         this case forward recursion is stable and values from the
12962C         asymptotic expansion for X to infinity start the recursion
12963C         when it is efficient to do so.  Leading terms of the series
12964C         and uniform expansion are tested for underflow.  If a sequence
12965C         is requested and the last member would underflow, the result
12966C         is set to zero and the next lower order tried, etc., until a
12967C         member comes on scale or all members are set to zero.
12968C         Overflow cannot occur.
12969C
12970C     Description of Arguments
12971C
12972C         Input
12973C           X      - X .GE. 0.0E0
12974C           ALPHA  - order of first member of the sequence,
12975C                    ALPHA .GE. 0.0E0
12976C           N      - number of members in the sequence, N .GE. 1
12977C
12978C         Output
12979C           Y      - a vector whose first  N components contain
12980C                    values for J/sub(ALPHA+K-1)/(X), K=1,...,N
12981C           NZ     - number of components of Y set to zero due to
12982C                    underflow,
12983C                    NZ=0   , normal return, computation completed
12984C                    NZ .NE. 0, last NZ components of Y set to zero,
12985C                             Y(K)=0.0E0, K=N-NZ+1,...,N.
12986C
12987C     Error Conditions
12988C         Improper input arguments - a fatal error
12989C         Underflow  - a non-fatal error (NZ .NE. 0)
12990C
12991C***REFERENCES  D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
12992C                 subroutines IBESS and JBESS for Bessel functions
12993C                 I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
12994C                 Transactions on Mathematical Software 3, (1977),
12995C                 pp. 76-92.
12996C               F. W. J. Olver, Tables of Bessel Functions of Moderate
12997C                 or Large Orders, NPL Mathematical Tables 6, Her
12998C                 Majesty's Stationery Office, London, 1962.
12999C***ROUTINES CALLED  ALNGAM, ASYJY, I1MACH, JAIRY, R1MACH, XERMSG
13000C***REVISION HISTORY  (YYMMDD)
13001C   750101  DATE WRITTEN
13002C   890531  Changed all specific intrinsics to generic.  (WRB)
13003C   890531  REVISION DATE from Version 3.2
13004C   891214  Prologue converted to Version 4.0 format.  (BAB)
13005C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
13006C   900326  Removed duplicate information from DESCRIPTION section.
13007C           (WRB)
13008C   920501  Reformatted the REFERENCES section.  (WRB)
13009C***END PROLOGUE  BESJ
13010C
13011C-----COMMON----------------------------------------------------------
13012C
13013      INCLUDE 'DPCOMC.INC'
13014      INCLUDE 'DPCOP2.INC'
13015C
13016      EXTERNAL JAIRY
13017      INTEGER I,IALP,IDALP,IFLW,IN,INLIM,IS,I1,I2,K,KK,KM,KT,N,NN,
13018     1        NS,NZ
13019      REAL       AK,AKM,ALPHA,ANS,AP,ARG,COEF,DALPHA,DFN,DTM,EARG,
13020     1           ELIM1,ETX,FIDAL,FLGJY,FN,FNF,FNI,FNP1,FNU,FNULIM,
13021     2           GLN,PDF,PIDT,PP,RDEN,RELB,RTTP,RTWO,RTX,RZDEN,
13022     3           S,SA,SB,SXO2,S1,S2,T,TA,TAU,TB,TEMP,TFN,TM,TOL,
13023     4           TOLLN,TRX,TX,T1,T2,WK,X,XO2,XO2L,Y,RTOL,SLIM
13024      SAVE RTWO, PDF, RTTP, PIDT, PP, INLIM, FNULIM
13025      DOUBLE PRECISION DLNGAM
13026      DIMENSION Y(*), TEMP(3), FNULIM(2), PP(4), WK(7)
13027      DATA RTWO,PDF,RTTP,PIDT                    / 1.34839972492648E+00,
13028     1 7.85398163397448E-01, 7.97884560802865E-01, 1.57079632679490E+00/
13029      DATA  PP(1),  PP(2),  PP(3),  PP(4)        / 8.72909153935547E+00,
13030     1 2.65693932265030E-01, 1.24578576865586E-01, 7.70133747430388E-04/
13031      DATA INLIM           /      150            /
13032      DATA FNULIM(1), FNULIM(2) /      100.0E0,     60.0E0     /
13033C***FIRST EXECUTABLE STATEMENT  BESJ
13034      NZ = 0
13035      KT = 1
13036      NS=0
13037C     I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
13038C     I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
13039      TA = R1MACH(3)
13040      TOL = MAX(TA,1.0E-15)
13041      I1 = I1MACH(11) + 1
13042      I2 = I1MACH(12)
13043      TB = R1MACH(5)
13044      ELIM1 = -2.303E0*(I2*TB+3.0E0)
13045      RTOL=1.0E0/TOL
13046      SLIM=R1MACH(1)*1.0E+3*RTOL
13047C     TOLLN = -LN(TOL)
13048      TOLLN = 2.303E0*TB*I1
13049      TOLLN = MIN(TOLLN,34.5388E0)
13050CCCCC IF (N-1) 720, 10, 20
13051      IF (N-1.LT.0)THEN
13052         GOTO720
13053      ELSEIF (N-1.EQ.0)THEN
13054         GOTO10
13055      ELSEIF (N-1.GT.0)THEN
13056         GOTO20
13057      ENDIF
13058   10 KT = 2
13059   20 NN = N
13060CCCCC IF (X) 730, 30, 80
13061      IF (X.LT.0.0)THEN
13062         GOTO730
13063      ELSEIF (X.EQ.0.0)THEN
13064         GOTO30
13065      ELSEIF (X.GT.0.0)THEN
13066         GOTO80
13067      ENDIF
13068   30 CONTINUE
13069CCCCC IF (ALPHA) 710, 40, 50
13070      IF (ALPHA.LT.0.0)THEN
13071         GOTO710
13072      ELSEIF (ALPHA.EQ.0.0)THEN
13073         GOTO40
13074      ELSEIF (ALPHA.GT.0.0)THEN
13075         GOTO50
13076      ENDIF
13077   40 Y(1) = 1.0E0
13078      IF (N.EQ.1) RETURN
13079      I1 = 2
13080      GO TO 60
13081   50 I1 = 1
13082   60 DO 70 I=I1,N
13083        Y(I) = 0.0E0
13084   70 CONTINUE
13085      RETURN
13086   80 CONTINUE
13087      IF (ALPHA.LT.0.0E0) GO TO 710
13088C
13089      IALP = INT(ALPHA)
13090      FNI = IALP + N - 1
13091      FNF = ALPHA - IALP
13092      DFN = FNI + FNF
13093      FNU = DFN
13094      XO2 = X*0.5E0
13095      SXO2 = XO2*XO2
13096C
13097C     DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
13098C     TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
13099C     APPLIED.
13100C
13101      IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
13102      TA = MAX(20.0E0,FNU)
13103      IF (X.GT.TA) GO TO 120
13104      IF (X.GT.12.0E0) GO TO 110
13105      XO2L = LOG(XO2)
13106      NS = INT(SXO2-FNU) + 1
13107      GO TO 100
13108   90 FN = FNU
13109      FNP1 = FN + 1.0E0
13110      XO2L = LOG(XO2)
13111      IS = KT
13112      IF (X.LE.0.50E0) GO TO 330
13113      NS = 0
13114  100 FNI = FNI + NS
13115      DFN = FNI + FNF
13116      FN = DFN
13117      FNP1 = FN + 1.0E0
13118      IS = KT
13119      IF (N-1+NS.GT.0) IS = 3
13120      GO TO 330
13121  110 ANS = MAX(36.0E0-FNU,0.0E0)
13122      NS = INT(ANS)
13123      FNI = FNI + NS
13124      DFN = FNI + FNF
13125      FN = DFN
13126      IS = KT
13127      IF (N-1+NS.GT.0) IS = 3
13128      GO TO 130
13129  120 CONTINUE
13130      RTX = SQRT(X)
13131      TAU = RTWO*RTX
13132      TA = TAU + FNULIM(KT)
13133      IF (FNU.LE.TA) GO TO 480
13134      FN = FNU
13135      IS = KT
13136C
13137C     UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
13138C
13139  130 CONTINUE
13140      I1 = ABS(3-IS)
13141      I1 = MAX(I1,1)
13142      FLGJY = 1.0E0
13143      CALL ASYJY(JAIRY,X,FN,FLGJY,I1,TEMP(IS),WK,IFLW)
13144      IF(IFLW.NE.0) GO TO 380
13145      GO TO (320, 450, 620), IS
13146  310 TEMP(1) = TEMP(3)
13147      KT = 1
13148  320 IS = 2
13149      FNI = FNI - 1.0E0
13150      DFN = FNI + FNF
13151      FN = DFN
13152      IF(I1.EQ.2) GO TO 450
13153      GO TO 130
13154C
13155C     SERIES FOR (X/2)**2.LE.NU+1
13156C
13157  330 CONTINUE
13158      GLN = REAL(DLNGAM(DBLE(FNP1)))
13159      ARG = FN*XO2L - GLN
13160      IF (ARG.LT.(-ELIM1)) GO TO 400
13161      EARG = EXP(ARG)
13162  340 CONTINUE
13163      S = 1.0E0
13164      IF (X.LT.TOL) GO TO 360
13165      AK = 3.0E0
13166      T2 = 1.0E0
13167      T = 1.0E0
13168      S1 = FN
13169      DO 350 K=1,17
13170        S2 = T2 + S1
13171        T = -T*SXO2/S2
13172        S = S + T
13173        IF (ABS(T).LT.TOL) GO TO 360
13174        T2 = T2 + AK
13175        AK = AK + 2.0E0
13176        S1 = S1 + FN
13177  350 CONTINUE
13178  360 CONTINUE
13179      TEMP(IS) = S*EARG
13180      GO TO (370, 450, 610), IS
13181  370 EARG = EARG*FN/XO2
13182      FNI = FNI - 1.0E0
13183      DFN = FNI + FNF
13184      FN = DFN
13185      IS = 2
13186      GO TO 340
13187C
13188C     SET UNDERFLOW VALUE AND UPDATE PARAMETERS
13189C     UNDERFLOW CAN ONLY OCCUR FOR NS=0 SINCE THE ORDER MUST BE
13190C     LARGER THAN 36. THEREFORE, NS NEED NOT BE CONSIDERED.
13191C
13192  380 Y(NN) = 0.0E0
13193      NN = NN - 1
13194      FNI = FNI - 1.0E0
13195      DFN = FNI + FNF
13196      FN = DFN
13197CCCCC IF (NN-1) 440, 390, 130
13198      IF (NN-1.LT.0) THEN
13199         GOTO440
13200      ELSEIF (NN-1.EQ.0)THEN
13201         GOTO390
13202      ELSEIF (NN-1.GT.0)THEN
13203         GOTO130
13204      ENDIF
13205  390 KT = 2
13206      IS = 2
13207      GO TO 130
13208  400 Y(NN) = 0.0E0
13209      NN = NN - 1
13210      FNP1 = FN
13211      FNI = FNI - 1.0E0
13212      DFN = FNI + FNF
13213      FN = DFN
13214CCCCC IF (NN-1) 440, 410, 420
13215      IF (NN-1.LT.0)THEN
13216         GOTO440
13217      ELSEIF (NN-1.EQ.0)THEN
13218         GOTO410
13219      ELSEIF (NN-1.GT.0)THEN
13220         GOTO420
13221      ENDIF
13222  410 KT = 2
13223      IS = 2
13224  420 IF (SXO2.LE.FNP1) GO TO 430
13225      GO TO 130
13226  430 ARG = ARG - XO2L + LOG(FNP1)
13227      IF (ARG.LT.(-ELIM1)) GO TO 400
13228      GO TO 330
13229  440 NZ = N - NN
13230      RETURN
13231C
13232C     BACKWARD RECURSION SECTION
13233C
13234  450 CONTINUE
13235      IF(NS.NE.0) GO TO 451
13236      NZ = N - NN
13237      IF (KT.EQ.2) GO TO 470
13238C     BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
13239      Y(NN) = TEMP(1)
13240      Y(NN-1) = TEMP(2)
13241      IF (NN.EQ.2) RETURN
13242  451 CONTINUE
13243      TRX = 2.0E0/X
13244      DTM = FNI
13245      TM = (DTM+FNF)*TRX
13246      AK=1.0E0
13247      TA=TEMP(1)
13248      TB=TEMP(2)
13249      IF(ABS(TA).GT.SLIM) GO TO 455
13250      TA=TA*RTOL
13251      TB=TB*RTOL
13252      AK=TOL
13253  455 CONTINUE
13254      KK=2
13255      IN=NS-1
13256      IF(IN.EQ.0) GO TO 690
13257      IF(NS.NE.0) GO TO 670
13258      K=NN-2
13259      DO 460 I=3,NN
13260        S=TB
13261        TB=TM*TB-TA
13262        TA=S
13263        Y(K)=TB*AK
13264        K=K-1
13265        DTM = DTM - 1.0E0
13266        TM = (DTM+FNF)*TRX
13267  460 CONTINUE
13268      RETURN
13269  470 Y(1) = TEMP(2)
13270      RETURN
13271C
13272C     ASYMPTOTIC EXPANSION FOR X TO INFINITY WITH FORWARD RECURSION IN
13273C     OSCILLATORY REGION X.GT.MAX(20, NU), PROVIDED THE LAST MEMBER
13274C     OF THE SEQUENCE IS ALSO IN THE REGION.
13275C
13276  480 CONTINUE
13277      IN = INT(ALPHA-TAU+2.0E0)
13278      IF (IN.LE.0) GO TO 490
13279      IDALP = IALP - IN - 1
13280      KT = 1
13281      GO TO 500
13282  490 CONTINUE
13283      IDALP = IALP
13284      IN = 0
13285  500 IS = KT
13286      FIDAL = IDALP
13287      DALPHA = FIDAL + FNF
13288      ARG = X - PIDT*DALPHA - PDF
13289      SA = SIN(ARG)
13290      SB = COS(ARG)
13291      COEF = RTTP/RTX
13292      ETX = 8.0E0*X
13293  510 CONTINUE
13294      DTM = FIDAL + FIDAL
13295      DTM = DTM*DTM
13296      TM = 0.0E0
13297      IF (FIDAL.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 520
13298      TM = 4.0E0*FNF*(FIDAL+FIDAL+FNF)
13299  520 CONTINUE
13300      TRX = DTM - 1.0E0
13301      T2 = (TRX+TM)/ETX
13302      S2 = T2
13303      RELB = TOL*ABS(T2)
13304      T1 = ETX
13305      S1 = 1.0E0
13306      FN = 1.0E0
13307      AK = 8.0E0
13308      DO 530 K=1,13
13309        T1 = T1 + ETX
13310        FN = FN + AK
13311        TRX = DTM - FN
13312        AP = TRX + TM
13313        T2 = -T2*AP/T1
13314        S1 = S1 + T2
13315        T1 = T1 + ETX
13316        AK = AK + 8.0E0
13317        FN = FN + AK
13318        TRX = DTM - FN
13319        AP = TRX + TM
13320        T2 = T2*AP/T1
13321        S2 = S2 + T2
13322        IF (ABS(T2).LE.RELB) GO TO 540
13323        AK = AK + 8.0E0
13324  530 CONTINUE
13325  540 TEMP(IS) = COEF*(S1*SB-S2*SA)
13326      IF(IS.EQ.2) GO TO 560
13327      FIDAL = FIDAL + 1.0E0
13328      DALPHA = FIDAL + FNF
13329      IS = 2
13330      TB = SA
13331      SA = -SB
13332      SB = TB
13333      GO TO 510
13334C
13335C     FORWARD RECURSION SECTION
13336C
13337  560 IF (KT.EQ.2) GO TO 470
13338      S1 = TEMP(1)
13339      S2 = TEMP(2)
13340      TX = 2.0E0/X
13341      TM = DALPHA*TX
13342      IF (IN.EQ.0) GO TO 580
13343C
13344C     FORWARD RECUR TO INDEX ALPHA
13345C
13346      DO 570 I=1,IN
13347        S = S2
13348        S2 = TM*S2 - S1
13349        TM = TM + TX
13350        S1 = S
13351  570 CONTINUE
13352      IF (NN.EQ.1) GO TO 600
13353      S = S2
13354      S2 = TM*S2 - S1
13355      TM = TM + TX
13356      S1 = S
13357  580 CONTINUE
13358C
13359C     FORWARD RECUR FROM INDEX ALPHA TO ALPHA+N-1
13360C
13361      Y(1) = S1
13362      Y(2) = S2
13363      IF (NN.EQ.2) RETURN
13364      DO 590 I=3,NN
13365        Y(I) = TM*Y(I-1) - Y(I-2)
13366        TM = TM + TX
13367  590 CONTINUE
13368      RETURN
13369  600 Y(1) = S2
13370      RETURN
13371C
13372C     BACKWARD RECURSION WITH NORMALIZATION BY
13373C     ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
13374C
13375  610 CONTINUE
13376C     COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
13377      AKM = MAX(3.0E0-FN,0.0E0)
13378      KM = INT(AKM)
13379      TFN = FN + KM
13380      TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
13381      TA = XO2L - TA
13382      TB = -(1.0E0-1.5E0/TFN)/TFN
13383      AKM = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
13384      IN = KM + INT(AKM)
13385      GO TO 660
13386  620 CONTINUE
13387C     COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
13388      GLN = WK(3) + WK(2)
13389      IF (WK(6).GT.30.0E0) GO TO 640
13390      RDEN = (PP(4)*WK(6)+PP(3))*WK(6) + 1.0E0
13391      RZDEN = PP(1) + PP(2)*WK(6)
13392      TA = RZDEN/RDEN
13393      IF (WK(1).LT.0.10E0) GO TO 630
13394      TB = GLN/WK(5)
13395      GO TO 650
13396  630 TB=(1.259921049E0+(0.1679894730E0+0.0887944358E0*WK(1))*WK(1))
13397     1 /WK(7)
13398      GO TO 650
13399  640 CONTINUE
13400      TA = 0.5E0*TOLLN/WK(4)
13401      TA=((0.0493827160E0*TA-0.1111111111E0)*TA+0.6666666667E0)*TA*WK(6)
13402      IF (WK(1).LT.0.10E0) GO TO 630
13403      TB = GLN/WK(5)
13404  650 IN = INT(TA/TB+1.5E0)
13405      IF (IN.GT.INLIM) GO TO 310
13406  660 CONTINUE
13407      DTM = FNI + IN
13408      TRX = 2.0E0/X
13409      TM = (DTM+FNF)*TRX
13410      TA = 0.0E0
13411      TB = TOL
13412      KK = 1
13413      AK=1.0E0
13414  670 CONTINUE
13415C
13416C     BACKWARD RECUR UNINDEXED AND SCALE WHEN MAGNITUDES ARE CLOSE TO
13417C     UNDERFLOW LIMITS (LESS THAN SLIM=R1MACH(1)*1.0E+3/TOL)
13418C
13419      DO 680 I=1,IN
13420        S = TB
13421        TB = TM*TB - TA
13422        TA = S
13423        DTM = DTM - 1.0E0
13424        TM = (DTM+FNF)*TRX
13425  680 CONTINUE
13426C     NORMALIZATION
13427      IF (KK.NE.1) GO TO 690
13428      S=TEMP(3)
13429      SA=TA/TB
13430      TA=S
13431      TB=S
13432      IF(ABS(S).GT.SLIM) GO TO 685
13433      TA=TA*RTOL
13434      TB=TB*RTOL
13435      AK=TOL
13436  685 CONTINUE
13437      TA=TA*SA
13438      KK = 2
13439      IN = NS
13440      IF (NS.NE.0) GO TO 670
13441  690 Y(NN) = TB*AK
13442      NZ = N - NN
13443      IF (NN.EQ.1) RETURN
13444      K = NN - 1
13445      S=TB
13446      TB = TM*TB - TA
13447      TA=S
13448      Y(K)=TB*AK
13449      IF (NN.EQ.2) RETURN
13450      DTM = DTM - 1.0E0
13451      TM = (DTM+FNF)*TRX
13452      K=NN-2
13453C
13454C     BACKWARD RECUR INDEXED
13455C
13456      DO 700 I=3,NN
13457        S=TB
13458        TB = TM*TB - TA
13459        TA=S
13460        Y(K)=TB*AK
13461        DTM = DTM - 1.0E0
13462        TM = (DTM+FNF)*TRX
13463        K = K - 1
13464  700 CONTINUE
13465      RETURN
13466C
13467C
13468C
13469  710 CONTINUE
13470      WRITE(ICOUT,711)
13471  711 FORMAT('***** ERORR FROM BESJ, THE ORDER ALPHA IS NEGATIVE. ***')
13472      CALL DPWRST('XXX','BUG ')
13473      RETURN
13474  720 CONTINUE
13475      WRITE(ICOUT,721)
13476  721 FORMAT('***** ERORR FROM BESJ, N IS LESS THAN ONE.. ***')
13477      CALL DPWRST('XXX','BUG ')
13478      RETURN
13479  730 CONTINUE
13480      WRITE(ICOUT,731)
13481  731 FORMAT('***** ERORR FROM BESJ, X IS LESS THAN ZERO.. ***')
13482      CALL DPWRST('XXX','BUG ')
13483      RETURN
13484      END
13485      FUNCTION BESJ0DP(X)
13486CCCCC RENAME TO AVOID CONFLICT WITH INTRINSIC BESJ0 FUNCTION
13487CCCCC FUNCTION BESJ0(X)
13488C***BEGIN PROLOGUE  BESJ0
13489C***DATE WRITTEN   770401   (YYMMDD)
13490C***REVISION DATE  820801   (YYMMDD)
13491C***CATEGORY NO.  C10A1
13492C***KEYWORDS  BESSEL FUNCTION,FIRST KIND,ORDER ZERO,SPECIAL FUNCTION
13493C***AUTHOR  FULLERTON, W., (LANL)
13494C***PURPOSE  Computes the Bessel function of the first kind of order
13495C            zero
13496C***DESCRIPTION
13497C
13498C BESJ0(X) calculates the Bessel function of the first kind of
13499C order zero for real argument X.
13500C
13501C Series for BJ0        on the interval  0.          to  1.60000D+01
13502C                                        with weighted error   7.47E-18
13503C                                         log weighted error  17.13
13504C                               significant figures required  16.98
13505C                                    decimal places required  17.68
13506C
13507C Series for BM0        on the interval  0.          to  6.25000D-02
13508C                                        with weighted error   4.98E-17
13509C                                         log weighted error  16.30
13510C                               significant figures required  14.97
13511C                                    decimal places required  16.96
13512C
13513C Series for BTH0       on the interval  0.          to  6.25000D-02
13514C                                        with weighted error   3.67E-17
13515C                                         log weighted error  16.44
13516C                               significant figures required  15.53
13517C                                    decimal places required  17.13
13518C***REFERENCES  (NONE)
13519C***ROUTINES CALLED  CSEVL,INITS,R1MACH,XERROR
13520C***END PROLOGUE  BESJ0
13521C
13522C-----COMMON----------------------------------------------------------
13523C
13524      INCLUDE 'DPCOMC.INC'
13525      INCLUDE 'DPCOP2.INC'
13526C
13527      DIMENSION BJ0CS(13), BM0CS(21), BTH0CS(24)
13528      DATA BJ0 CS( 1) /    .1002541619 68939137E0 /
13529      DATA BJ0 CS( 2) /   -.6652230077 64405132E0 /
13530      DATA BJ0 CS( 3) /    .2489837034 98281314E0 /
13531      DATA BJ0 CS( 4) /   -.0332527231 700357697E0 /
13532      DATA BJ0 CS( 5) /    .0023114179 304694015E0 /
13533      DATA BJ0 CS( 6) /   -.0000991127 741995080E0 /
13534      DATA BJ0 CS( 7) /    .0000028916 708643998E0 /
13535      DATA BJ0 CS( 8) /   -.0000000612 108586630E0 /
13536      DATA BJ0 CS( 9) /    .0000000009 838650793E0 /
13537      DATA BJ0 CS(10) /   -.0000000000 124235515E0 /
13538      DATA BJ0 CS(11) /    .0000000000 001265433E0 /
13539      DATA BJ0 CS(12) /   -.0000000000 000010619E0 /
13540      DATA BJ0 CS(13) /    .0000000000 000000074E0 /
13541      DATA BM0 CS( 1) /    .0928496163 7381644E0 /
13542      DATA BM0 CS( 2) /   -.0014298770 7403484E0 /
13543      DATA BM0 CS( 3) /    .0000283057 9271257E0 /
13544      DATA BM0 CS( 4) /   -.0000014330 0611424E0 /
13545      DATA BM0 CS( 5) /    .0000001202 8628046E0 /
13546      DATA BM0 CS( 6) /   -.0000000139 7113013E0 /
13547      DATA BM0 CS( 7) /    .0000000020 4076188E0 /
13548      DATA BM0 CS( 8) /   -.0000000003 5399669E0 /
13549      DATA BM0 CS( 9) /    .0000000000 7024759E0 /
13550      DATA BM0 CS(10) /   -.0000000000 1554107E0 /
13551      DATA BM0 CS(11) /    .0000000000 0376226E0 /
13552      DATA BM0 CS(12) /   -.0000000000 0098282E0 /
13553      DATA BM0 CS(13) /    .0000000000 0027408E0 /
13554      DATA BM0 CS(14) /   -.0000000000 0008091E0 /
13555      DATA BM0 CS(15) /    .0000000000 0002511E0 /
13556      DATA BM0 CS(16) /   -.0000000000 0000814E0 /
13557      DATA BM0 CS(17) /    .0000000000 0000275E0 /
13558      DATA BM0 CS(18) /   -.0000000000 0000096E0 /
13559      DATA BM0 CS(19) /    .0000000000 0000034E0 /
13560      DATA BM0 CS(20) /   -.0000000000 0000012E0 /
13561      DATA BM0 CS(21) /    .0000000000 0000004E0 /
13562      DATA BTH0CS( 1) /   -.2463916377 4300119E0 /
13563      DATA BTH0CS( 2) /    .0017370983 07508963E0 /
13564      DATA BTH0CS( 3) /   -.0000621836 33402968E0 /
13565      DATA BTH0CS( 4) /    .0000043680 50165742E0 /
13566      DATA BTH0CS( 5) /   -.0000004560 93019869E0 /
13567      DATA BTH0CS( 6) /    .0000000621 97400101E0 /
13568      DATA BTH0CS( 7) /   -.0000000103 00442889E0 /
13569      DATA BTH0CS( 8) /    .0000000019 79526776E0 /
13570      DATA BTH0CS( 9) /   -.0000000004 28198396E0 /
13571      DATA BTH0CS(10) /    .0000000001 02035840E0 /
13572      DATA BTH0CS(11) /   -.0000000000 26363898E0 /
13573      DATA BTH0CS(12) /    .0000000000 07297935E0 /
13574      DATA BTH0CS(13) /   -.0000000000 02144188E0 /
13575      DATA BTH0CS(14) /    .0000000000 00663693E0 /
13576      DATA BTH0CS(15) /   -.0000000000 00215126E0 /
13577      DATA BTH0CS(16) /    .0000000000 00072659E0 /
13578      DATA BTH0CS(17) /   -.0000000000 00025465E0 /
13579      DATA BTH0CS(18) /    .0000000000 00009229E0 /
13580      DATA BTH0CS(19) /   -.0000000000 00003448E0 /
13581      DATA BTH0CS(20) /    .0000000000 00001325E0 /
13582      DATA BTH0CS(21) /   -.0000000000 00000522E0 /
13583      DATA BTH0CS(22) /    .0000000000 00000210E0 /
13584      DATA BTH0CS(23) /   -.0000000000 00000087E0 /
13585      DATA BTH0CS(24) /    .0000000000 00000036E0 /
13586      DATA PI4 / 0.7853981633 9744831E0 /
13587      DATA NTJ0, NTM0, NTTH0, XSML, XMAX / 3*0, 2*0./
13588C***FIRST EXECUTABLE STATEMENT  BESJ0
13589      IF (NTJ0.NE.0) GO TO 10
13590      NTJ0 = INITS (BJ0CS, 13, 0.1*R1MACH(3))
13591      NTM0 = INITS (BM0CS, 21, 0.1*R1MACH(3))
13592      NTTH0 = INITS (BTH0CS, 24, 0.1*R1MACH(3))
13593C
13594      XSML = SQRT (4.0*R1MACH(3))
13595      XMAX = 1.0/R1MACH(4)
13596C
13597 10   Y = ABS(X)
13598      IF (Y.GT.4.0) GO TO 20
13599C
13600      BESJ0DP = 1.0
13601      IF (Y.GT.XSML) BESJ0DP = CSEVL (.125*Y*Y-1., BJ0CS, NTJ0)
13602      RETURN
13603C
13604 20   CONTINUE
13605      IF (Y.GT.XMAX) THEN
13606        WRITE(ICOUT,1)
13607        CALL DPWRST('XXX','BUG ')
13608        BESJ0DP = 0.0
13609        RETURN
13610      ENDIF
13611    1 FORMAT('***** ERORR FROM BESJ0DP, NO PRECISION BECAUSE THE ',
13612     1       'ABSOLUTE VALUE OF X IS TOO BIG.  ****')
13613C
13614      Z = 32.0/Y**2 - 1.0
13615      AMPL = (0.75 + CSEVL (Z, BM0CS, NTM0)) / SQRT(Y)
13616      THETA = Y - PI4 + CSEVL (Z, BTH0CS, NTTH0) / Y
13617      BESJ0DP = AMPL * COS (THETA)
13618C
13619      RETURN
13620      END
13621      FUNCTION BESJ1DP(X)
13622CCCCC RENAME TO AVOID CONFLICT WITH INTRINSIC BESJ1 FUNCTION
13623CCCCC FUNCTION BESJ1(X)
13624C***BEGIN PROLOGUE  BESJ1
13625C***DATE WRITTEN   780601   (YYMMDD)
13626C***REVISION DATE  820801   (YYMMDD)
13627C***CATEGORY NO.  C10A1
13628C***KEYWORDS  BESSEL FUNCTION,FIRST KIND,ORDER ONE,SPECIAL FUNCTION
13629C***AUTHOR  FULLERTON, W., (LANL)
13630C***PURPOSE  Computes the Bessel function of the first kind of order one
13631C***DESCRIPTION
13632C
13633C BESJ1(X) calculates the Bessel function of the first kind of
13634C order one for real argument X.
13635C
13636C Series for BJ1        on the interval  0.          to  1.60000D+01
13637C                                        with weighted error   4.48E-17
13638C                                         log weighted error  16.35
13639C                               significant figures required  15.77
13640C                                    decimal places required  16.89
13641C
13642C Series for BM1        on the interval  0.          to  6.25000D-02
13643C                                        with weighted error   5.61E-17
13644C                                         log weighted error  16.25
13645C                               significant figures required  14.97
13646C                                    decimal places required  16.91
13647C
13648C Series for BTH1       on the interval  0.          to  6.25000D-02
13649C                                        with weighted error   4.10E-17
13650C                                         log weighted error  16.39
13651C                               significant figures required  15.96
13652C                                    decimal places required  17.08
13653C***REFERENCES  (NONE)
13654C***ROUTINES CALLED  CSEVL,INITS,R1MACH,XERROR
13655C***END PROLOGUE  BESJ1
13656C
13657C-----COMMON----------------------------------------------------------
13658C
13659      INCLUDE 'DPCOMC.INC'
13660      INCLUDE 'DPCOP2.INC'
13661C
13662      DIMENSION BJ1CS(12), BM1CS(21), BTH1CS(24)
13663      DATA BJ1 CS( 1) /   -.1172614151 3332787E0 /
13664      DATA BJ1 CS( 2) /   -.2536152183 0790640E0 /
13665      DATA BJ1 CS( 3) /    .0501270809 84469569E0 /
13666      DATA BJ1 CS( 4) /   -.0046315148 09625081E0 /
13667      DATA BJ1 CS( 5) /    .0002479962 29415914E0 /
13668      DATA BJ1 CS( 6) /   -.0000086789 48686278E0 /
13669      DATA BJ1 CS( 7) /    .0000002142 93917143E0 /
13670      DATA BJ1 CS( 8) /   -.0000000039 36093079E0 /
13671      DATA BJ1 CS( 9) /    .0000000000 55911823E0 /
13672      DATA BJ1 CS(10) /   -.0000000000 00632761E0 /
13673      DATA BJ1 CS(11) /    .0000000000 00005840E0 /
13674      DATA BJ1 CS(12) /   -.0000000000 00000044E0 /
13675      DATA BM1 CS( 1) /    .1047362510 931285E0 /
13676      DATA BM1 CS( 2) /    .0044244389 3702345E0 /
13677      DATA BM1 CS( 3) /   -.0000566163 9504035E0 /
13678      DATA BM1 CS( 4) /    .0000023134 9417339E0 /
13679      DATA BM1 CS( 5) /   -.0000001737 7182007E0 /
13680      DATA BM1 CS( 6) /    .0000000189 3209930E0 /
13681      DATA BM1 CS( 7) /   -.0000000026 5416023E0 /
13682      DATA BM1 CS( 8) /    .0000000004 4740209E0 /
13683      DATA BM1 CS( 9) /   -.0000000000 8691795E0 /
13684      DATA BM1 CS(10) /    .0000000000 1891492E0 /
13685      DATA BM1 CS(11) /   -.0000000000 0451884E0 /
13686      DATA BM1 CS(12) /    .0000000000 0116765E0 /
13687      DATA BM1 CS(13) /   -.0000000000 0032265E0 /
13688      DATA BM1 CS(14) /    .0000000000 0009450E0 /
13689      DATA BM1 CS(15) /   -.0000000000 0002913E0 /
13690      DATA BM1 CS(16) /    .0000000000 0000939E0 /
13691      DATA BM1 CS(17) /   -.0000000000 0000315E0 /
13692      DATA BM1 CS(18) /    .0000000000 0000109E0 /
13693      DATA BM1 CS(19) /   -.0000000000 0000039E0 /
13694      DATA BM1 CS(20) /    .0000000000 0000014E0 /
13695      DATA BM1 CS(21) /   -.0000000000 0000005E0 /
13696      DATA BTH1CS( 1) /    .7406014102 6313850E0 /
13697      DATA BTH1CS( 2) /   -.0045717556 59637690E0 /
13698      DATA BTH1CS( 3) /    .0001198185 10964326E0 /
13699      DATA BTH1CS( 4) /   -.0000069645 61891648E0 /
13700      DATA BTH1CS( 5) /    .0000006554 95621447E0 /
13701      DATA BTH1CS( 6) /   -.0000000840 66228945E0 /
13702      DATA BTH1CS( 7) /    .0000000133 76886564E0 /
13703      DATA BTH1CS( 8) /   -.0000000024 99565654E0 /
13704      DATA BTH1CS( 9) /    .0000000005 29495100E0 /
13705      DATA BTH1CS(10) /   -.0000000001 24135944E0 /
13706      DATA BTH1CS(11) /    .0000000000 31656485E0 /
13707      DATA BTH1CS(12) /   -.0000000000 08668640E0 /
13708      DATA BTH1CS(13) /    .0000000000 02523758E0 /
13709      DATA BTH1CS(14) /   -.0000000000 00775085E0 /
13710      DATA BTH1CS(15) /    .0000000000 00249527E0 /
13711      DATA BTH1CS(16) /   -.0000000000 00083773E0 /
13712      DATA BTH1CS(17) /    .0000000000 00029205E0 /
13713      DATA BTH1CS(18) /   -.0000000000 00010534E0 /
13714      DATA BTH1CS(19) /    .0000000000 00003919E0 /
13715      DATA BTH1CS(20) /   -.0000000000 00001500E0 /
13716      DATA BTH1CS(21) /    .0000000000 00000589E0 /
13717      DATA BTH1CS(22) /   -.0000000000 00000237E0 /
13718      DATA BTH1CS(23) /    .0000000000 00000097E0 /
13719      DATA BTH1CS(24) /   -.0000000000 00000040E0 /
13720      DATA PI4 / 0.7853981633 9744831E0 /
13721      DATA NTJ1, NTM1, NTTH1, XSML, XMIN, XMAX / 3*0, 3*0./
13722C***FIRST EXECUTABLE STATEMENT  BESJ1
13723      IF (NTJ1.NE.0) GO TO 10
13724      NTJ1 = INITS (BJ1CS, 12, 0.1*R1MACH(3))
13725      NTM1 = INITS (BM1CS, 21, 0.1*R1MACH(3))
13726      NTTH1 = INITS (BTH1CS, 24, 0.1*R1MACH(3))
13727C
13728      XSML = SQRT (8.0*R1MACH(3))
13729      XMIN = 2.0*R1MACH(1)
13730      XMAX = 1.0/R1MACH(4)
13731C
13732 10   Y = ABS(X)
13733      IF (Y.GT.4.0) GO TO 20
13734C
13735      BESJ1DP = 0.
13736      IF (Y.EQ.0.0) RETURN
13737      IF (Y.LT.XMIN) THEN
13738        WRITE(ICOUT,2)
13739        CALL DPWRST('XXX','BUG ')
13740      ENDIF
13741    2 FORMAT('***** WARNING FROM BESJ1DP, UNDERFLOW BECAUSE THE ',
13742     1       'ABSOLUTE VALUE OF X IS TOO SMALL.  ****')
13743      IF (Y.GT.XMIN) BESJ1DP = 0.5*X
13744      IF (Y.GT.XSML) BESJ1DP = X *
13745     1   (.25 + CSEVL(.125*Y*Y-1., BJ1CS, NTJ1))
13746      RETURN
13747C
13748 20   CONTINUE
13749      IF (Y.GT.XMAX) THEN
13750        WRITE(ICOUT,1)
13751        CALL DPWRST('XXX','BUG ')
13752        BESJ1DP = 0.0
13753        RETURN
13754      ENDIF
13755    1 FORMAT('***** ERORR FROM BESJ1DP, NO PRECISION BECAUSE THE ',
13756     1       'ABSOLUTE VALUE OF X IS TOO BIG.  ****')
13757      Z = 32.0/Y**2 - 1.0
13758      AMPL = (0.75 + CSEVL (Z, BM1CS, NTM1)) / SQRT(Y)
13759      THETA = Y - 3.0*PI4 + CSEVL (Z, BTH1CS, NTTH1) / Y
13760      BESJ1DP = SIGN (AMPL, X) * COS (THETA)
13761C
13762      RETURN
13763      END
13764      SUBROUTINE BESK (X, FNU, KODE, N, Y, NZ)
13765C***BEGIN PROLOGUE  BESK
13766C***PURPOSE  Implement forward recursion on the three term recursion
13767C            relation for a sequence of non-negative order Bessel
13768C            functions K/SUB(FNU+I-1)/(X), or scaled Bessel functions
13769C            EXP(X)*K/SUB(FNU+I-1)/(X), I=1,...,N for real, positive
13770C            X and non-negative orders FNU.
13771C***LIBRARY   SLATEC
13772C***CATEGORY  C10B3
13773C***TYPE      SINGLE PRECISION (BESK-S, DBESK-D)
13774C***KEYWORDS  K BESSEL FUNCTION, SPECIAL FUNCTIONS
13775C***AUTHOR  Amos, D. E., (SNLA)
13776C***DESCRIPTION
13777C
13778C     Abstract
13779C         BESK implements forward recursion on the three term
13780C         recursion relation for a sequence of non-negative order Bessel
13781C         functions K/sub(FNU+I-1)/(X), or scaled Bessel functions
13782C         EXP(X)*K/sub(FNU+I-1)/(X), I=1,...,N for real X .GT. 0.0E0 and
13783C         non-negative orders FNU.  If FNU .LT. NULIM, orders FNU and
13784C         FNU+1 are obtained from BESKNU to start the recursion.  If
13785C         FNU .GE. NULIM, the uniform asymptotic expansion is used for
13786C         orders FNU and FNU+1 to start the recursion.  NULIM is 35 or
13787C         70 depending on whether N=1 or N .GE. 2.  Under and overflow
13788C         tests are made on the leading term of the asymptotic expansion
13789C         before any extensive computation is done.
13790C
13791C     Description of Arguments
13792C
13793C         Input
13794C           X      - X .GT. 0.0E0
13795C           FNU    - order of the initial K function, FNU .GE. 0.0E0
13796C           KODE   - a parameter to indicate the scaling option
13797C                    KODE=1 returns Y(I)=       K/sub(FNU+I-1)/(X),
13798C                                        I=1,...,N
13799C                    KODE=2 returns Y(I)=EXP(X)*K/sub(FNU+I-1)/(X),
13800C                                        I=1,...,N
13801C           N      - number of members in the sequence, N .GE. 1
13802C
13803C         Output
13804C           y      - a vector whose first n components contain values
13805C                    for the sequence
13806C                    Y(I)=       K/sub(FNU+I-1)/(X), I=1,...,N  or
13807C                    Y(I)=EXP(X)*K/sub(FNU+I-1)/(X), I=1,...,N
13808C                    depending on KODE
13809C           NZ     - number of components of Y set to zero due to
13810C                    underflow with KODE=1,
13811C                    NZ=0   , normal return, computation completed
13812C                    NZ .NE. 0, first NZ components of Y set to zero
13813C                             due to underflow, Y(I)=0.0E0, I=1,...,NZ
13814C
13815C     Error Conditions
13816C         Improper input arguments - a fatal error
13817C         Overflow - a fatal error
13818C         Underflow with KODE=1 -  a non-fatal error (NZ .NE. 0)
13819C
13820C***REFERENCES  F. W. J. Olver, Tables of Bessel Functions of Moderate
13821C                 or Large Orders, NPL Mathematical Tables 6, Her
13822C                 Majesty's Stationery Office, London, 1962.
13823C               N. M. Temme, On the numerical evaluation of the modified
13824C                 Bessel function of the third kind, Journal of
13825C                 Computational Physics 19, (1975), pp. 324-337.
13826C***ROUTINES CALLED  ASYIK, BESK0, BESK0E, BESK1, BESK1E, BESKNU,
13827C                    I1MACH, R1MACH, XERMSG
13828C***REVISION HISTORY  (YYMMDD)
13829C   790201  DATE WRITTEN
13830C   890531  Changed all specific intrinsics to generic.  (WRB)
13831C   890531  REVISION DATE from Version 3.2
13832C   891214  Prologue converted to Version 4.0 format.  (BAB)
13833C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
13834C   900326  Removed duplicate information from DESCRIPTION section.
13835C           (WRB)
13836C   920501  Reformatted the REFERENCES section.  (WRB)
13837C***END PROLOGUE  BESK
13838C
13839C-----COMMON----------------------------------------------------------
13840C
13841      INCLUDE 'DPCOMC.INC'
13842      INCLUDE 'DPCOP2.INC'
13843C
13844      INTEGER I, J, K, KODE, MZ, N, NB, ND, NN, NUD, NULIM, NZ
13845      REAL CN, DNU, ELIM, ETX, FLGIK,FN, FNN, FNU,GLN,GNU,RTZ,S,S1,S2,
13846     1 T, TM, TRX, W, X, XLIM, Y, ZN
13847      REAL BESK0, BESK1, BESK1E, BESK0E
13848      DIMENSION W(2), NULIM(2), Y(*)
13849      SAVE NULIM
13850      DATA NULIM(1),NULIM(2) / 35 , 70 /
13851C***FIRST EXECUTABLE STATEMENT  BESK
13852C
13853      S2=0.0
13854      TRX=0.0
13855      TM=0.0
13856      NN = -I1MACH(12)
13857C
13858      ELIM = 2.303E0*(NN*R1MACH(5)-3.0E0)
13859      XLIM = R1MACH(1)*1.0E+3
13860      IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 280
13861      IF (FNU.LT.0.0E0) GO TO 290
13862      IF (X.LE.0.0E0) GO TO 300
13863      IF (X.LT.XLIM) GO TO 320
13864      IF (N.LT.1) GO TO 310
13865      ETX = KODE - 1
13866C
13867C     ND IS A DUMMY VARIABLE FOR N
13868C     GNU IS A DUMMY VARIABLE FOR FNU
13869C     NZ = NUMBER OF UNDERFLOWS ON KODE=1
13870C
13871      ND = N
13872      NZ = 0
13873      NUD = INT(FNU)
13874      DNU = FNU - NUD
13875      GNU = FNU
13876      NN = MIN(2,ND)
13877      FN = FNU + N - 1
13878      FNN = FN
13879      IF (FN.LT.2.0E0) GO TO 150
13880C
13881C     OVERFLOW TEST  (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
13882C     FOR THE LAST ORDER, FNU+N-1.GE.NULIM
13883C
13884      ZN = X/FN
13885      IF (ZN.EQ.0.0E0) GO TO 320
13886      RTZ = SQRT(1.0E0+ZN*ZN)
13887      GLN = LOG((1.0E0+RTZ)/ZN)
13888      T = RTZ*(1.0E0-ETX) + ETX/(ZN+RTZ)
13889      CN = -FN*(T-GLN)
13890      IF (CN.GT.ELIM) GO TO 320
13891      IF (NUD.LT.NULIM(NN)) GO TO 30
13892      IF (NN.EQ.1) GO TO 20
13893   10 CONTINUE
13894C
13895C     UNDERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
13896C     FOR THE FIRST ORDER, FNU.GE.NULIM
13897C
13898      FN = GNU
13899      ZN = X/FN
13900      RTZ = SQRT(1.0E0+ZN*ZN)
13901      GLN = LOG((1.0E0+RTZ)/ZN)
13902      T = RTZ*(1.0E0-ETX) + ETX/(ZN+RTZ)
13903      CN = -FN*(T-GLN)
13904   20 CONTINUE
13905      IF (CN.LT.-ELIM) GO TO 230
13906C
13907C     ASYMPTOTIC EXPANSION FOR ORDERS FNU AND FNU+1.GE.NULIM
13908C
13909      FLGIK = -1.0E0
13910      CALL ASYIK(X,GNU,KODE,FLGIK,RTZ,CN,NN,Y)
13911      IF (NN.EQ.1) GO TO 240
13912      TRX = 2.0E0/X
13913      TM = (GNU+GNU+2.0E0)/X
13914      GO TO 130
13915C
13916   30 CONTINUE
13917      IF (KODE.EQ.2) GO TO 40
13918C
13919C     UNDERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION IN X)
13920C     FOR ORDER DNU
13921C
13922      IF (X.GT.ELIM) GO TO 230
13923   40 CONTINUE
13924      IF (DNU.NE.0.0E0) GO TO 80
13925      IF (KODE.EQ.2) GO TO 50
13926      S1 = BESK0(X)
13927      GO TO 60
13928   50 S1 = BESK0E(X)
13929   60 CONTINUE
13930      IF (NUD.EQ.0 .AND. ND.EQ.1) GO TO 120
13931      IF (KODE.EQ.2) GO TO 70
13932      S2 = BESK1(X)
13933      GO TO 90
13934   70 S2 = BESK1E(X)
13935      GO TO 90
13936   80 CONTINUE
13937      NB = 2
13938      IF (NUD.EQ.0 .AND. ND.EQ.1) NB = 1
13939      CALL BESKNU(X, DNU, KODE, NB, W, NZ)
13940      S1 = W(1)
13941      IF (NB.EQ.1) GO TO 120
13942      S2 = W(2)
13943   90 CONTINUE
13944      TRX = 2.0E0/X
13945      TM = (DNU+DNU+2.0E0)/X
13946C     FORWARD RECUR FROM DNU TO FNU+1 TO GET Y(1) AND Y(2)
13947      IF (ND.EQ.1) NUD = NUD - 1
13948      IF (NUD.GT.0) GO TO 100
13949      IF (ND.GT.1) GO TO 120
13950      S1 = S2
13951      GO TO 120
13952  100 CONTINUE
13953      DO 110 I=1,NUD
13954        S = S2
13955        S2 = TM*S2 + S1
13956        S1 = S
13957        TM = TM + TRX
13958  110 CONTINUE
13959      IF (ND.EQ.1) S1 = S2
13960  120 CONTINUE
13961      Y(1) = S1
13962      IF (ND.EQ.1) GO TO 240
13963      Y(2) = S2
13964  130 CONTINUE
13965      IF (ND.EQ.2) GO TO 240
13966C     FORWARD RECUR FROM FNU+2 TO FNU+N-1
13967      DO 140 I=3,ND
13968        Y(I) = TM*Y(I-1) + Y(I-2)
13969        TM = TM + TRX
13970  140 CONTINUE
13971      GO TO 240
13972C
13973  150 CONTINUE
13974C     UNDERFLOW TEST FOR KODE=1
13975      IF (KODE.EQ.2) GO TO 160
13976      IF (X.GT.ELIM) GO TO 230
13977  160 CONTINUE
13978C     OVERFLOW TEST
13979      IF (FN.LE.1.0E0) GO TO 170
13980      IF (-FN*(LOG(X)-0.693E0).GT.ELIM) GO TO 320
13981  170 CONTINUE
13982      IF (DNU.EQ.0.0E0) GO TO 180
13983      CALL BESKNU(X, FNU, KODE, ND, Y, MZ)
13984      GO TO 240
13985  180 CONTINUE
13986      J = NUD
13987      IF (J.EQ.1) GO TO 210
13988      J = J + 1
13989      IF (KODE.EQ.2) GO TO 190
13990      Y(J) = BESK0(X)
13991      GO TO 200
13992  190 Y(J) = BESK0E(X)
13993  200 IF (ND.EQ.1) GO TO 240
13994      J = J + 1
13995  210 IF (KODE.EQ.2) GO TO 220
13996      Y(J) = BESK1(X)
13997      GO TO 240
13998  220 Y(J) = BESK1E(X)
13999      GO TO 240
14000C
14001C     UPDATE PARAMETERS ON UNDERFLOW
14002C
14003  230 CONTINUE
14004      NUD = NUD + 1
14005      ND = ND - 1
14006      IF (ND.EQ.0) GO TO 240
14007      NN = MIN(2,ND)
14008      GNU = GNU + 1.0E0
14009      IF (FNN.LT.2.0E0) GO TO 230
14010      IF (NUD.LT.NULIM(NN)) GO TO 230
14011      GO TO 10
14012  240 CONTINUE
14013      NZ = N - ND
14014      IF (NZ.EQ.0) RETURN
14015      IF (ND.EQ.0) GO TO 260
14016      DO 250 I=1,ND
14017        J = N - I + 1
14018        K = ND - I + 1
14019        Y(J) = Y(K)
14020  250 CONTINUE
14021  260 CONTINUE
14022      DO 270 I=1,NZ
14023        Y(I) = 0.0E0
14024  270 CONTINUE
14025      RETURN
14026C
14027C
14028C
14029  280 CONTINUE
14030      WRITE(ICOUT,281)
14031  281 FORMAT('***** ERORR FROM BESK, KODE IS NOT 1 OR 2. ***')
14032      CALL DPWRST('XXX','BUG ')
14033      RETURN
14034  290 CONTINUE
14035      WRITE(ICOUT,291)
14036  291 FORMAT('***** ERORR FROM BESK, THE ORDER FNU IS NEGATIVE. ***')
14037      CALL DPWRST('XXX','BUG ')
14038      RETURN
14039  300 CONTINUE
14040      WRITE(ICOUT,301)
14041  301 FORMAT('**** ERORR FROM BESK, X IS LESS THAN OR EQUAL TO ZERO. ')
14042      CALL DPWRST('XXX','BUG ')
14043      RETURN
14044  310 CONTINUE
14045      WRITE(ICOUT,311)
14046  311 FORMAT('***** ERORR FROM BESK, N IS LESS THAN ONE.. ***')
14047      CALL DPWRST('XXX','BUG ')
14048      RETURN
14049  320 CONTINUE
14050      WRITE(ICOUT,321)
14051  321 FORMAT('***** ERORR FROM BESK, OVERFLOW, FNU OR N TOO LARGE OR ',
14052     1       'X TOO SMALL. *****')
14053      CALL DPWRST('XXX','BUG ')
14054      RETURN
14055      END
14056      SUBROUTINE BESKNU (X, FNU, KODE, N, Y, NZ)
14057C***BEGIN PROLOGUE  BESKNU
14058C***SUBSIDIARY
14059C***PURPOSE  Subsidiary to BESK
14060C***LIBRARY   SLATEC
14061C***TYPE      SINGLE PRECISION (BESKNU-S, DBSKNU-D)
14062C***AUTHOR  Amos, D. E., (SNLA)
14063C***DESCRIPTION
14064C
14065C     Abstract
14066C         BESKNU computes N member sequences of K Bessel functions
14067C         K/SUB(FNU+I-1)/(X), I=1,N for non-negative orders FNU and
14068C         positive X. Equations of the references are implemented on
14069C         small orders DNU for K/SUB(DNU)/(X) and K/SUB(DNU+1)/(X).
14070C         Forward recursion with the three term recursion relation
14071C         generates higher orders FNU+I-1, I=1,...,N. The parameter
14072C         KODE permits K/SUB(FNU+I-1)/(X) values or scaled values
14073C         EXP(X)*K/SUB(FNU+I-1)/(X), I=1,N to be returned.
14074C
14075C         To start the recursion FNU is normalized to the interval
14076C         -0.5.LE.DNU.LT.0.5. A special form of the power series is
14077C         implemented on 0.LT.X.LE.X1 while the Miller algorithm for the
14078C         K Bessel function in terms of the confluent hypergeometric
14079C         function U(FNU+0.5,2*FNU+1,X) is implemented on X1.LT.X.LE.X2.
14080C         For X.GT.X2, the asymptotic expansion for large X is used.
14081C         When FNU is a half odd integer, a special formula for
14082C         DNU=-0.5 and DNU+1.0=0.5 is used to start the recursion.
14083C
14084C         BESKNU assumes that a significant digit SINH(X) function is
14085C         available.
14086C
14087C     Description of Arguments
14088C
14089C         Input
14090C           X      - X.GT.0.0E0
14091C           FNU    - Order of initial K function, FNU.GE.0.0E0
14092C           N      - Number of members of the sequence, N.GE.1
14093C           KODE   - A parameter to indicate the scaling option
14094C                    KODE= 1  returns
14095C                             Y(I)=       K/SUB(FNU+I-1)/(X)
14096C                                  I=1,...,N
14097C                        = 2  returns
14098C                             Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X)
14099C                                  I=1,...,N
14100C
14101C         Output
14102C           Y      - A vector whose first N components contain values
14103C                    for the sequence
14104C                    Y(I)=       K/SUB(FNU+I-1)/(X), I=1,...,N or
14105C                    Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X), I=1,...,N
14106C                    depending on KODE
14107C           NZ     - Number of components set to zero due to
14108C                    underflow,
14109C                    NZ= 0   , Normal return
14110C                    NZ.NE.0 , First NZ components of Y set to zero
14111C                              due to underflow, Y(I)=0.0E0,I=1,...,NZ
14112C
14113C     Error Conditions
14114C         Improper input arguments - a fatal error
14115C         Overflow - a fatal error
14116C         Underflow with KODE=1 - a non-fatal error (NZ.NE.0)
14117C
14118C***SEE ALSO  BESK
14119C***REFERENCES  N. M. Temme, On the numerical evaluation of the modified
14120C                 Bessel function of the third kind, Journal of
14121C                 Computational Physics 19, (1975), pp. 324-337.
14122C***ROUTINES CALLED  GAMMA, I1MACH, R1MACH, XERMSG
14123C***REVISION HISTORY  (YYMMDD)
14124C   790201  DATE WRITTEN
14125C   890531  Changed all specific intrinsics to generic.  (WRB)
14126C   891214  Prologue converted to Version 4.0 format.  (BAB)
14127C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
14128C   900326  Removed duplicate information from DESCRIPTION section.
14129C           (WRB)
14130C   900328  Added TYPE section.  (WRB)
14131C   900727  Added EXTERNAL statement.  (WRB)
14132C   910408  Updated the AUTHOR and REFERENCES sections.  (WRB)
14133C   920501  Reformatted the REFERENCES section.  (WRB)
14134C***END PROLOGUE  BESKNU
14135C
14136C
14137C-----COMMON----------------------------------------------------------
14138C
14139      INCLUDE 'DPCOMC.INC'
14140      INCLUDE 'DPCOP2.INC'
14141C
14142      INTEGER I, IFLAG, INU, J, K, KK, KODE, KODED, N, NN, NZ
14143      REAL A, AK, A1, A2, B, BK, CC, CK, COEF, CX, DK, DNU, DNU2, ELIM,
14144     1 ETEST, EX, F, FC, FHS, FK, FKS, FLRX, FMU, FNU, G1, G2, P, PI,
14145     2 PT, P1, P2, Q, RTHPI, RX, S, SMU, SQK, ST, S1, S2, TM, TOL, T1,
14146     3 T2, X, X1, X2, Y
14147      DOUBLE PRECISION DGAMMA
14148      DIMENSION A(160), B(160), Y(*), CC(8)
14149      EXTERNAL DGAMMA
14150      SAVE X1, X2, PI, RTHPI, CC
14151      DATA X1, X2 / 2.0E0, 17.0E0 /
14152      DATA PI,RTHPI        / 3.14159265358979E+00, 1.25331413731550E+00/
14153      DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)
14154     1                     / 5.77215664901533E-01,-4.20026350340952E-02,
14155     2-4.21977345555443E-02, 7.21894324666300E-03,-2.15241674114900E-04,
14156     3-2.01348547807000E-05, 1.13302723200000E-06, 6.11609500000000E-09/
14157C***FIRST EXECUTABLE STATEMENT  BESKNU
14158C
14159      S2=0.0
14160      DNU2=0.0
14161C
14162      KK = -I1MACH(12)
14163      ELIM = 2.303E0*(KK*R1MACH(5)-3.0E0)
14164      AK = R1MACH(3)
14165      TOL = MAX(AK,1.0E-15)
14166      IF (X.LE.0.0E0) GO TO 350
14167      IF (FNU.LT.0.0E0) GO TO 360
14168      IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 370
14169      IF (N.LT.1) GO TO 380
14170      NZ = 0
14171      IFLAG = 0
14172      KODED = KODE
14173      RX = 2.0E0/X
14174      INU = INT(FNU+0.5E0)
14175      DNU = FNU - INU
14176      IF (ABS(DNU).EQ.0.5E0) GO TO 120
14177      DNU2 = 0.0E0
14178      IF (ABS(DNU).LT.TOL) GO TO 10
14179      DNU2 = DNU*DNU
14180   10 CONTINUE
14181      IF (X.GT.X1) GO TO 120
14182C
14183C     SERIES FOR X.LE.X1
14184C
14185      A1 = 1.0E0 - DNU
14186      A2 = 1.0E0 + DNU
14187      T1 = 1.0E0/DGAMMA(DBLE(A1))
14188      T2 = 1.0E0/DGAMMA(DBLE(A2))
14189      IF (ABS(DNU).GT.0.1E0) GO TO 40
14190C     SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
14191      S = CC(1)
14192      AK = 1.0E0
14193      DO 20 K=2,8
14194        AK = AK*DNU2
14195        TM = CC(K)*AK
14196        S = S + TM
14197        IF (ABS(TM).LT.TOL) GO TO 30
14198   20 CONTINUE
14199   30 G1 = -S
14200      GO TO 50
14201   40 CONTINUE
14202      G1 = (T1-T2)/(DNU+DNU)
14203   50 CONTINUE
14204      G2 = (T1+T2)*0.5E0
14205      SMU = 1.0E0
14206      FC = 1.0E0
14207      FLRX = LOG(RX)
14208      FMU = DNU*FLRX
14209      IF (DNU.EQ.0.0E0) GO TO 60
14210      FC = DNU*PI
14211      FC = FC/SIN(FC)
14212      IF (FMU.NE.0.0E0) SMU = SINH(FMU)/FMU
14213   60 CONTINUE
14214      F = FC*(G1*COSH(FMU)+G2*FLRX*SMU)
14215      FC = EXP(FMU)
14216      P = 0.5E0*FC/T2
14217      Q = 0.5E0/(FC*T1)
14218      AK = 1.0E0
14219      CK = 1.0E0
14220      BK = 1.0E0
14221      S1 = F
14222      S2 = P
14223      IF (INU.GT.0 .OR. N.GT.1) GO TO 90
14224      IF (X.LT.TOL) GO TO 80
14225      CX = X*X*0.25E0
14226   70 CONTINUE
14227      F = (AK*F+P+Q)/(BK-DNU2)
14228      P = P/(AK-DNU)
14229      Q = Q/(AK+DNU)
14230      CK = CK*CX/AK
14231      T1 = CK*F
14232      S1 = S1 + T1
14233      BK = BK + AK + AK + 1.0E0
14234      AK = AK + 1.0E0
14235      S = ABS(T1)/(1.0E0+ABS(S1))
14236      IF (S.GT.TOL) GO TO 70
14237   80 CONTINUE
14238      Y(1) = S1
14239      IF (KODED.EQ.1) RETURN
14240      Y(1) = S1*EXP(X)
14241      RETURN
14242   90 CONTINUE
14243      IF (X.LT.TOL) GO TO 110
14244      CX = X*X*0.25E0
14245  100 CONTINUE
14246      F = (AK*F+P+Q)/(BK-DNU2)
14247      P = P/(AK-DNU)
14248      Q = Q/(AK+DNU)
14249      CK = CK*CX/AK
14250      T1 = CK*F
14251      S1 = S1 + T1
14252      T2 = CK*(P-AK*F)
14253      S2 = S2 + T2
14254      BK = BK + AK + AK + 1.0E0
14255      AK = AK + 1.0E0
14256      S = ABS(T1)/(1.0E0+ABS(S1)) + ABS(T2)/(1.0E0+ABS(S2))
14257      IF (S.GT.TOL) GO TO 100
14258  110 CONTINUE
14259      S2 = S2*RX
14260      IF (KODED.EQ.1) GO TO 170
14261      F = EXP(X)
14262      S1 = S1*F
14263      S2 = S2*F
14264      GO TO 170
14265  120 CONTINUE
14266      COEF = RTHPI/SQRT(X)
14267      IF (KODED.EQ.2) GO TO 130
14268      IF (X.GT.ELIM) GO TO 330
14269      COEF = COEF*EXP(-X)
14270  130 CONTINUE
14271      IF (ABS(DNU).EQ.0.5E0) GO TO 340
14272      IF (X.GT.X2) GO TO 280
14273C
14274C     MILLER ALGORITHM FOR X1.LT.X.LE.X2
14275C
14276      ETEST = COS(PI*DNU)/(PI*X*TOL)
14277      FKS = 1.0E0
14278      FHS = 0.25E0
14279      FK = 0.0E0
14280      CK = X + X + 2.0E0
14281      P1 = 0.0E0
14282      P2 = 1.0E0
14283      K = 0
14284  140 CONTINUE
14285      K = K + 1
14286      FK = FK + 1.0E0
14287      AK = (FHS-DNU2)/(FKS+FK)
14288      BK = CK/(FK+1.0E0)
14289      PT = P2
14290      P2 = BK*P2 - AK*P1
14291      P1 = PT
14292      A(K) = AK
14293      B(K) = BK
14294      CK = CK + 2.0E0
14295      FKS = FKS + FK + FK + 1.0E0
14296      FHS = FHS + FK + FK
14297      IF (ETEST.GT.FK*P1) GO TO 140
14298      KK = K
14299      S = 1.0E0
14300      P1 = 0.0E0
14301      P2 = 1.0E0
14302      DO 150 I=1,K
14303        PT = P2
14304        P2 = (B(KK)*P2-P1)/A(KK)
14305        P1 = PT
14306        S = S + P2
14307        KK = KK - 1
14308  150 CONTINUE
14309      S1 = COEF*(P2/S)
14310      IF (INU.GT.0 .OR. N.GT.1) GO TO 160
14311      GO TO 200
14312  160 CONTINUE
14313      S2 = S1*(X+DNU+0.5E0-P1/P2)/X
14314C
14315C     FORWARD RECURSION ON THE THREE TERM RECURSION RELATION
14316C
14317  170 CONTINUE
14318      CK = (DNU+DNU+2.0E0)/X
14319      IF (N.EQ.1) INU = INU - 1
14320      IF (INU.GT.0) GO TO 180
14321      IF (N.GT.1) GO TO 200
14322      S1 = S2
14323      GO TO 200
14324  180 CONTINUE
14325      DO 190 I=1,INU
14326        ST = S2
14327        S2 = CK*S2 + S1
14328        S1 = ST
14329        CK = CK + RX
14330  190 CONTINUE
14331      IF (N.EQ.1) S1 = S2
14332  200 CONTINUE
14333      IF (IFLAG.EQ.1) GO TO 220
14334      Y(1) = S1
14335      IF (N.EQ.1) RETURN
14336      Y(2) = S2
14337      IF (N.EQ.2) RETURN
14338      DO 210 I=3,N
14339        Y(I) = CK*Y(I-1) + Y(I-2)
14340        CK = CK + RX
14341  210 CONTINUE
14342      RETURN
14343C     IFLAG=1 CASES
14344  220 CONTINUE
14345      S = -X + LOG(S1)
14346      Y(1) = 0.0E0
14347      NZ = 1
14348      IF (S.LT.-ELIM) GO TO 230
14349      Y(1) = EXP(S)
14350      NZ = 0
14351  230 CONTINUE
14352      IF (N.EQ.1) RETURN
14353      S = -X + LOG(S2)
14354      Y(2) = 0.0E0
14355      NZ = NZ + 1
14356      IF (S.LT.-ELIM) GO TO 240
14357      NZ = NZ - 1
14358      Y(2) = EXP(S)
14359  240 CONTINUE
14360      IF (N.EQ.2) RETURN
14361      KK = 2
14362      IF (NZ.LT.2) GO TO 260
14363      DO 250 I=3,N
14364        KK = I
14365        ST = S2
14366        S2 = CK*S2 + S1
14367        S1 = ST
14368        CK = CK + RX
14369        S = -X + LOG(S2)
14370        NZ = NZ + 1
14371        Y(I) = 0.0E0
14372        IF (S.LT.-ELIM) GO TO 250
14373        Y(I) = EXP(S)
14374        NZ = NZ - 1
14375        GO TO 260
14376  250 CONTINUE
14377      RETURN
14378  260 CONTINUE
14379      IF (KK.EQ.N) RETURN
14380      S2 = S2*CK + S1
14381      CK = CK + RX
14382      KK = KK + 1
14383      Y(KK) = EXP(-X+LOG(S2))
14384      IF (KK.EQ.N) RETURN
14385      KK = KK + 1
14386      DO 270 I=KK,N
14387        Y(I) = CK*Y(I-1) + Y(I-2)
14388        CK = CK + RX
14389  270 CONTINUE
14390      RETURN
14391C
14392C     ASYMPTOTIC EXPANSION FOR LARGE X, X.GT.X2
14393C
14394C     IFLAG=0 MEANS NO UNDERFLOW OCCURRED
14395C     IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
14396C     KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
14397C     RECURSION
14398  280 CONTINUE
14399      NN = 2
14400      IF (INU.EQ.0 .AND. N.EQ.1) NN = 1
14401      DNU2 = DNU + DNU
14402      FMU = 0.0E0
14403      IF (ABS(DNU2).LT.TOL) GO TO 290
14404      FMU = DNU2*DNU2
14405  290 CONTINUE
14406      EX = X*8.0E0
14407      S2 = 0.0E0
14408      DO 320 K=1,NN
14409        S1 = S2
14410        S = 1.0E0
14411        AK = 0.0E0
14412        CK = 1.0E0
14413        SQK = 1.0E0
14414        DK = EX
14415        DO 300 J=1,30
14416          CK = CK*(FMU-SQK)/DK
14417          S = S + CK
14418          DK = DK + EX
14419          AK = AK + 8.0E0
14420          SQK = SQK + AK
14421          IF (ABS(CK).LT.TOL) GO TO 310
14422  300   CONTINUE
14423  310   S2 = S*COEF
14424        FMU = FMU + 8.0E0*DNU + 4.0E0
14425  320 CONTINUE
14426      IF (NN.GT.1) GO TO 170
14427      S1 = S2
14428      GO TO 200
14429  330 CONTINUE
14430      KODED = 2
14431      IFLAG = 1
14432      GO TO 120
14433C
14434C     FNU=HALF ODD INTEGER CASE
14435C
14436  340 CONTINUE
14437      S1 = COEF
14438      S2 = COEF
14439      GO TO 170
14440C
14441C
14442  350 CONTINUE
14443      WRITE(ICOUT,351)
14444  351 FORMAT('** ERROR FROM BESKNU, X IS LESS THAN OR EQUAL TO ZERO. ')
14445      CALL DPWRST('XXX','BUG ')
14446      RETURN
14447  360 CONTINUE
14448      WRITE(ICOUT,361)
14449  361 FORMAT('***** ERROR FROM BESKNU, THE ORDER FNU IS NEGATIVE. ***')
14450      CALL DPWRST('XXX','BUG ')
14451      RETURN
14452  370 CONTINUE
14453      WRITE(ICOUT,371)
14454  371 FORMAT('***** ERROR FROM BESKNU, KODE IS NOT 1 OR 2. ***')
14455      CALL DPWRST('XXX','BUG ')
14456      RETURN
14457  380 CONTINUE
14458      WRITE(ICOUT,381)
14459  381 FORMAT('***** ERROR FROM BESKNU, N IS LESS THAN ONE.. ***')
14460      CALL DPWRST('XXX','BUG ')
14461      RETURN
14462      END
14463      FUNCTION BESK0 (X)
14464C***BEGIN PROLOGUE  BESK0
14465C***PURPOSE  Compute the modified (hyperbolic) Bessel function of the
14466C            third kind of order zero.
14467C***LIBRARY   SLATEC (FNLIB)
14468C***CATEGORY  C10B1
14469C***TYPE      SINGLE PRECISION (BESK0-S, DBESK0-D)
14470C***KEYWORDS  FNLIB, HYPERBOLIC BESSEL FUNCTION,
14471C             MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS,
14472C             THIRD KIND
14473C***AUTHOR  Fullerton, W., (LANL)
14474C***DESCRIPTION
14475C
14476C BESK0(X) calculates the modified (hyperbolic) Bessel function
14477C of the third kind of order zero for real argument X .GT. 0.0.
14478C
14479C Series for BK0        on the interval  0.          to  4.00000D+00
14480C                                        with weighted error   3.57E-19
14481C                                         log weighted error  18.45
14482C                               significant figures required  17.99
14483C                                    decimal places required  18.97
14484C
14485C***REFERENCES  (NONE)
14486C***ROUTINES CALLED  BESI0, BESK0E, CSEVL, INITS, R1MACH, XERMSG
14487C***REVISION HISTORY  (YYMMDD)
14488C   770401  DATE WRITTEN
14489C   890531  Changed all specific intrinsics to generic.  (WRB)
14490C   890531  REVISION DATE from Version 3.2
14491C   891214  Prologue converted to Version 4.0 format.  (BAB)
14492C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
14493C   900326  Removed duplicate information from DESCRIPTION section.
14494C           (WRB)
14495C***END PROLOGUE  BESK0
14496C
14497C-----COMMON----------------------------------------------------------
14498C
14499      INCLUDE 'DPCOMC.INC'
14500      INCLUDE 'DPCOP2.INC'
14501C
14502      DIMENSION BK0CS(11)
14503      LOGICAL FIRST
14504      SAVE BK0CS, NTK0, XSML, XMAX, FIRST
14505      DATA BK0CS( 1) /   -.0353273932 3390276872E0 /
14506      DATA BK0CS( 2) /    .3442898999 246284869E0 /
14507      DATA BK0CS( 3) /    .0359799365 1536150163E0 /
14508      DATA BK0CS( 4) /    .0012646154 1144692592E0 /
14509      DATA BK0CS( 5) /    .0000228621 2103119451E0 /
14510      DATA BK0CS( 6) /    .0000002534 7910790261E0 /
14511      DATA BK0CS( 7) /    .0000000019 0451637722E0 /
14512      DATA BK0CS( 8) /    .0000000000 1034969525E0 /
14513      DATA BK0CS( 9) /    .0000000000 0004259816E0 /
14514      DATA BK0CS(10) /    .0000000000 0000013744E0 /
14515      DATA BK0CS(11) /    .0000000000 0000000035E0 /
14516      DATA FIRST /.TRUE./
14517C***FIRST EXECUTABLE STATEMENT  BESK0
14518      IF (FIRST) THEN
14519         NTK0 = INITS (BK0CS, 11, 0.1*R1MACH(3))
14520         XSML = SQRT (4.0*R1MACH(3))
14521         XMAXT = -LOG(R1MACH(1))
14522         XMAX = XMAXT - 0.5*XMAXT*LOG(XMAXT)/(XMAXT+0.5) - 0.01
14523      ENDIF
14524      FIRST = .FALSE.
14525C
14526      IF (X .LE. 0.) THEN
14527        WRITE(ICOUT,1)
14528    1   FORMAT('***** ERORR FROM BESK0, X IS ZERO OR NEGATIVE.  *****')
14529        CALL DPWRST('XXX','BUG ')
14530        BESK0 = 0.0
14531        RETURN
14532      ENDIF
14533      IF (X.GT.2.) GO TO 20
14534C
14535      Y = 0.
14536      IF (X.GT.XSML) Y = X*X
14537      BESK0 = -LOG(0.5*X)*BESI0(X) - .25 + CSEVL (.5*Y-1., BK0CS, NTK0)
14538      RETURN
14539C
14540 20   BESK0 = 0.
14541      IF (X.GT.XMAX) THEN
14542        WRITE(ICOUT,2)
14543        CALL DPWRST('XXX','BUG ')
14544        BESK0 = 0.0
14545        RETURN
14546      ENDIF
14547    2 FORMAT('***** ERORR FROM BESK0, UNDERFLOWS BECAUSE THE ',
14548     1       'VALUE OF X IS TOO BIG.  ****')
14549      IF (X.GT.XMAX) RETURN
14550C
14551      BESK0 = EXP(-X) * BESK0E(X)
14552C
14553      RETURN
14554      END
14555      FUNCTION BESK0E (X)
14556C***BEGIN PROLOGUE  BESK0E
14557C***PURPOSE  Compute the exponentially scaled modified (hyperbolic)
14558C            Bessel function of the third kind of order zero.
14559C***LIBRARY   SLATEC (FNLIB)
14560C***CATEGORY  C10B1
14561C***TYPE      SINGLE PRECISION (BESK0E-S, DBSK0E-D)
14562C***KEYWORDS  EXPONENTIALLY SCALED, FNLIB, HYPERBOLIC BESSEL FUNCTION,
14563C             MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS,
14564C             THIRD KIND
14565C***AUTHOR  Fullerton, W., (LANL)
14566C***DESCRIPTION
14567C
14568C BESK0E(X) computes the exponentially scaled modified (hyperbolic)
14569C Bessel function of third kind of order zero for real argument
14570C X .GT. 0.0, i.e., EXP(X)*K0(X).
14571C
14572C Series for BK0        on the interval  0.          to  4.00000D+00
14573C                                        with weighted error   3.57E-19
14574C                                         log weighted error  18.45
14575C                               significant figures required  17.99
14576C                                    decimal places required  18.97
14577C
14578C Series for AK0        on the interval  1.25000D-01 to  5.00000D-01
14579C                                        with weighted error   5.34E-17
14580C                                         log weighted error  16.27
14581C                               significant figures required  14.92
14582C                                    decimal places required  16.89
14583C
14584C Series for AK02       on the interval  0.          to  1.25000D-01
14585C                                        with weighted error   2.34E-17
14586C                                         log weighted error  16.63
14587C                               significant figures required  14.67
14588C                                    decimal places required  17.20
14589C
14590C***REFERENCES  (NONE)
14591C***ROUTINES CALLED  BESI0, CSEVL, INITS, R1MACH, XERMSG
14592C***REVISION HISTORY  (YYMMDD)
14593C   770401  DATE WRITTEN
14594C   890531  Changed all specific intrinsics to generic.  (WRB)
14595C   890531  REVISION DATE from Version 3.2
14596C   891214  Prologue converted to Version 4.0 format.  (BAB)
14597C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
14598C   900326  Removed duplicate information from DESCRIPTION section.
14599C           (WRB)
14600C***END PROLOGUE  BESK0E
14601C
14602C-----COMMON----------------------------------------------------------
14603C
14604      INCLUDE 'DPCOMC.INC'
14605      INCLUDE 'DPCOP2.INC'
14606C
14607      DIMENSION BK0CS(11), AK0CS(17), AK02CS(14)
14608      LOGICAL FIRST
14609      SAVE BK0CS, AK0CS, AK02CS, NTK0, NTAK0, NTAK02, XSML, FIRST
14610      DATA BK0CS( 1) /   -.0353273932 3390276872E0 /
14611      DATA BK0CS( 2) /    .3442898999 246284869E0 /
14612      DATA BK0CS( 3) /    .0359799365 1536150163E0 /
14613      DATA BK0CS( 4) /    .0012646154 1144692592E0 /
14614      DATA BK0CS( 5) /    .0000228621 2103119451E0 /
14615      DATA BK0CS( 6) /    .0000002534 7910790261E0 /
14616      DATA BK0CS( 7) /    .0000000019 0451637722E0 /
14617      DATA BK0CS( 8) /    .0000000000 1034969525E0 /
14618      DATA BK0CS( 9) /    .0000000000 0004259816E0 /
14619      DATA BK0CS(10) /    .0000000000 0000013744E0 /
14620      DATA BK0CS(11) /    .0000000000 0000000035E0 /
14621      DATA AK0CS( 1) /   -.0764394790 3327941E0 /
14622      DATA AK0CS( 2) /   -.0223565260 5699819E0 /
14623      DATA AK0CS( 3) /    .0007734181 1546938E0 /
14624      DATA AK0CS( 4) /   -.0000428100 6688886E0 /
14625      DATA AK0CS( 5) /    .0000030817 0017386E0 /
14626      DATA AK0CS( 6) /   -.0000002639 3672220E0 /
14627      DATA AK0CS( 7) /    .0000000256 3713036E0 /
14628      DATA AK0CS( 8) /   -.0000000027 4270554E0 /
14629      DATA AK0CS( 9) /    .0000000003 1694296E0 /
14630      DATA AK0CS(10) /   -.0000000000 3902353E0 /
14631      DATA AK0CS(11) /    .0000000000 0506804E0 /
14632      DATA AK0CS(12) /   -.0000000000 0068895E0 /
14633      DATA AK0CS(13) /    .0000000000 0009744E0 /
14634      DATA AK0CS(14) /   -.0000000000 0001427E0 /
14635      DATA AK0CS(15) /    .0000000000 0000215E0 /
14636      DATA AK0CS(16) /   -.0000000000 0000033E0 /
14637      DATA AK0CS(17) /    .0000000000 0000005E0 /
14638      DATA AK02CS( 1) /   -.0120186982 6307592E0 /
14639      DATA AK02CS( 2) /   -.0091748526 9102569E0 /
14640      DATA AK02CS( 3) /    .0001444550 9317750E0 /
14641      DATA AK02CS( 4) /   -.0000040136 1417543E0 /
14642      DATA AK02CS( 5) /    .0000001567 8318108E0 /
14643      DATA AK02CS( 6) /   -.0000000077 7011043E0 /
14644      DATA AK02CS( 7) /    .0000000004 6111825E0 /
14645      DATA AK02CS( 8) /   -.0000000000 3158592E0 /
14646      DATA AK02CS( 9) /    .0000000000 0243501E0 /
14647      DATA AK02CS(10) /   -.0000000000 0020743E0 /
14648      DATA AK02CS(11) /    .0000000000 0001925E0 /
14649      DATA AK02CS(12) /   -.0000000000 0000192E0 /
14650      DATA AK02CS(13) /    .0000000000 0000020E0 /
14651      DATA AK02CS(14) /   -.0000000000 0000002E0 /
14652      DATA FIRST /.TRUE./
14653C***FIRST EXECUTABLE STATEMENT  BESK0E
14654C
14655      BESK0E=CPUMIN
14656C
14657      IF (FIRST) THEN
14658         NTK0 = INITS (BK0CS, 11, 0.1*R1MACH(3))
14659         NTAK0 = INITS (AK0CS, 17, 0.1*R1MACH(3))
14660         NTAK02 = INITS (AK02CS, 14, 0.1*R1MACH(3))
14661         XSML = SQRT (4.0*R1MACH(3))
14662      ENDIF
14663      FIRST = .FALSE.
14664C
14665      IF (X .LE. 0.) THEN
14666        WRITE(ICOUT,1)
14667    1   FORMAT('***** ERORR FROM BESK0E, X ZERO OR NEGATIVE.  *******')
14668        CALL DPWRST('XXX','BUG ')
14669        BESK0E=0.0
14670        RETURN
14671      ENDIF
14672      IF (X.GT.2.) GO TO 20
14673C
14674      Y = 0.
14675      IF (X.GT.XSML) Y = X*X
14676      BESK0E = EXP(X) * (-LOG(0.5*X)*BESI0(X)
14677     1  - .25 + CSEVL (.5*Y-1., BK0CS, NTK0) )
14678      RETURN
14679C
14680 20   IF (X.LE.8.) BESK0E = (1.25 + CSEVL ((16./X-5.)/3., AK0CS, NTAK0))
14681     1  / SQRT(X)
14682      IF (X.GT.8.) BESK0E = (1.25 + CSEVL (16./X-1., AK02CS, NTAK02))
14683     1  / SQRT(X)
14684C
14685      RETURN
14686      END
14687      FUNCTION BESK1 (X)
14688C***BEGIN PROLOGUE  BESK1
14689C***PURPOSE  Compute the modified (hyperbolic) Bessel function of the
14690C            third kind of order one.
14691C***LIBRARY   SLATEC (FNLIB)
14692C***CATEGORY  C10B1
14693C***TYPE      SINGLE PRECISION (BESK1-S, DBESK1-D)
14694C***KEYWORDS  FNLIB, HYPERBOLIC BESSEL FUNCTION,
14695C             MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS,
14696C             THIRD KIND
14697C***AUTHOR  Fullerton, W., (LANL)
14698C***DESCRIPTION
14699C
14700C BESK1(X) computes the modified (hyperbolic) Bessel function of third
14701C kind of order one for real argument X, where X .GT. 0.
14702C
14703C Series for BK1        on the interval  0.          to  4.00000D+00
14704C                                        with weighted error   7.02E-18
14705C                                         log weighted error  17.15
14706C                               significant figures required  16.73
14707C                                    decimal places required  17.67
14708C
14709C***REFERENCES  (NONE)
14710C***ROUTINES CALLED  BESI1, BESK1E, CSEVL, INITS, R1MACH, XERMSG
14711C***REVISION HISTORY  (YYMMDD)
14712C   770401  DATE WRITTEN
14713C   890531  Changed all specific intrinsics to generic.  (WRB)
14714C   890531  REVISION DATE from Version 3.2
14715C   891214  Prologue converted to Version 4.0 format.  (BAB)
14716C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
14717C   900326  Removed duplicate information from DESCRIPTION section.
14718C           (WRB)
14719C***END PROLOGUE  BESK1
14720C
14721C-----COMMON----------------------------------------------------------
14722C
14723      INCLUDE 'DPCOMC.INC'
14724      INCLUDE 'DPCOP2.INC'
14725C
14726      DIMENSION BK1CS(11)
14727      LOGICAL FIRST
14728      SAVE BK1CS, NTK1, XMIN, XSML, XMAX, FIRST
14729      DATA BK1CS( 1) /    .0253002273 389477705E0 /
14730      DATA BK1CS( 2) /   -.3531559607 76544876E0 /
14731      DATA BK1CS( 3) /   -.1226111808 22657148E0 /
14732      DATA BK1CS( 4) /   -.0069757238 596398643E0 /
14733      DATA BK1CS( 5) /   -.0001730288 957513052E0 /
14734      DATA BK1CS( 6) /   -.0000024334 061415659E0 /
14735      DATA BK1CS( 7) /   -.0000000221 338763073E0 /
14736      DATA BK1CS( 8) /   -.0000000001 411488392E0 /
14737      DATA BK1CS( 9) /   -.0000000000 006666901E0 /
14738      DATA BK1CS(10) /   -.0000000000 000024274E0 /
14739      DATA BK1CS(11) /   -.0000000000 000000070E0 /
14740      DATA FIRST /.TRUE./
14741C***FIRST EXECUTABLE STATEMENT  BESK1
14742      IF (FIRST) THEN
14743         NTK1 = INITS (BK1CS, 11, 0.1*R1MACH(3))
14744         XMIN = EXP (MAX(LOG(R1MACH(1)), -LOG(R1MACH(2))) + .01)
14745         XSML = SQRT (4.0*R1MACH(3))
14746         XMAXT = -LOG(R1MACH(1))
14747         XMAX = XMAXT - 0.5*XMAXT*LOG(XMAXT)/(XMAXT+0.5)
14748      ENDIF
14749      FIRST = .FALSE.
14750C
14751      IF (X .LE. 0.) THEN
14752        WRITE(ICOUT,1)
14753    1   FORMAT('***** ERORR FROM BESK1, X ZERO OR NEGATIVE.  *******')
14754        CALL DPWRST('XXX','BUG ')
14755        BESK1=0.0
14756        RETURN
14757      ENDIF
14758      IF (X.GT.2.0) GO TO 20
14759C
14760      IF (X .LE. XMIN) THEN
14761        WRITE(ICOUT,2)
14762        CALL DPWRST('XXX','BUG ')
14763      ENDIF
14764    2 FORMAT('***** WARNING FROM BESK1, UNDERFLOW BECAUSE THE ',
14765     1       'VALUE OF X IS SO SMALL.  ****')
14766      Y = 0.
14767      IF (X.GT.XSML) Y = X*X
14768      BESK1 = LOG(0.5*X)*BESI1(X) +
14769     1  (0.75 + CSEVL (.5*Y-1., BK1CS, NTK1))/X
14770      RETURN
14771C
14772 20   BESK1 = 0.
14773      IF (X.GT.XMAX) THEN
14774        WRITE(ICOUT,3)
14775        CALL DPWRST('XXX','BUG ')
14776        BESK1 = 0.0
14777        RETURN
14778      ENDIF
14779    3 FORMAT('***** ERORR FROM BESK1, UNDERFLOW BECAUSE THE ',
14780     1       'VALUE OF X IS TOO BIG.  ****')
14781      IF (X.GT.XMAX) RETURN
14782C
14783      BESK1 = EXP(-X) * BESK1E(X)
14784C
14785      RETURN
14786      END
14787      FUNCTION BESK1E (X)
14788C***BEGIN PROLOGUE  BESK1E
14789C***PURPOSE  Compute the exponentially scaled modified (hyperbolic)
14790C            Bessel function of the third kind of order one.
14791C***LIBRARY   SLATEC (FNLIB)
14792C***CATEGORY  C10B1
14793C***TYPE      SINGLE PRECISION (BESK1E-S, DBSK1E-D)
14794C***KEYWORDS  EXPONENTIALLY SCALED, FNLIB, HYPERBOLIC BESSEL FUNCTION,
14795C             MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS,
14796C             THIRD KIND
14797C***AUTHOR  Fullerton, W., (LANL)
14798C***DESCRIPTION
14799C
14800C BESK1E(X) computes the exponentially scaled modified (hyperbolic)
14801C Bessel function of third kind of order one for real argument
14802C X .GT. 0.0, i.e., EXP(X)*K1(X).
14803C
14804C Series for BK1        on the interval  0.          to  4.00000D+00
14805C                                        with weighted error   7.02E-18
14806C                                         log weighted error  17.15
14807C                               significant figures required  16.73
14808C                                    decimal places required  17.67
14809C
14810C Series for AK1        on the interval  1.25000D-01 to  5.00000D-01
14811C                                        with weighted error   6.06E-17
14812C                                         log weighted error  16.22
14813C                               significant figures required  15.41
14814C                                    decimal places required  16.83
14815C
14816C Series for AK12       on the interval  0.          to  1.25000D-01
14817C                                        with weighted error   2.58E-17
14818C                                         log weighted error  16.59
14819C                               significant figures required  15.22
14820C                                    decimal places required  17.16
14821C
14822C***REFERENCES  (NONE)
14823C***ROUTINES CALLED  BESI1, CSEVL, INITS, R1MACH, XERMSG
14824C***REVISION HISTORY  (YYMMDD)
14825C   770401  DATE WRITTEN
14826C   890531  Changed all specific intrinsics to generic.  (WRB)
14827C   890531  REVISION DATE from Version 3.2
14828C   891214  Prologue converted to Version 4.0 format.  (BAB)
14829C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
14830C   900326  Removed duplicate information from DESCRIPTION section.
14831C           (WRB)
14832C***END PROLOGUE  BESK1E
14833C
14834C-----COMMON----------------------------------------------------------
14835C
14836      INCLUDE 'DPCOMC.INC'
14837      INCLUDE 'DPCOP2.INC'
14838C
14839      DIMENSION BK1CS(11), AK1CS(17), AK12CS(14)
14840      LOGICAL FIRST
14841      SAVE BK1CS, AK1CS, AK12CS, NTK1, NTAK1, NTAK12, XMIN, XSML,
14842     1 FIRST
14843      DATA BK1CS( 1) /    .0253002273 389477705E0 /
14844      DATA BK1CS( 2) /   -.3531559607 76544876E0 /
14845      DATA BK1CS( 3) /   -.1226111808 22657148E0 /
14846      DATA BK1CS( 4) /   -.0069757238 596398643E0 /
14847      DATA BK1CS( 5) /   -.0001730288 957513052E0 /
14848      DATA BK1CS( 6) /   -.0000024334 061415659E0 /
14849      DATA BK1CS( 7) /   -.0000000221 338763073E0 /
14850      DATA BK1CS( 8) /   -.0000000001 411488392E0 /
14851      DATA BK1CS( 9) /   -.0000000000 006666901E0 /
14852      DATA BK1CS(10) /   -.0000000000 000024274E0 /
14853      DATA BK1CS(11) /   -.0000000000 000000070E0 /
14854      DATA AK1CS( 1) /    .2744313406 973883E0 /
14855      DATA AK1CS( 2) /    .0757198995 3199368E0 /
14856      DATA AK1CS( 3) /   -.0014410515 5647540E0 /
14857      DATA AK1CS( 4) /    .0000665011 6955125E0 /
14858      DATA AK1CS( 5) /   -.0000043699 8470952E0 /
14859      DATA AK1CS( 6) /    .0000003540 2774997E0 /
14860      DATA AK1CS( 7) /   -.0000000331 1163779E0 /
14861      DATA AK1CS( 8) /    .0000000034 4597758E0 /
14862      DATA AK1CS( 9) /   -.0000000003 8989323E0 /
14863      DATA AK1CS(10) /    .0000000000 4720819E0 /
14864      DATA AK1CS(11) /   -.0000000000 0604783E0 /
14865      DATA AK1CS(12) /    .0000000000 0081284E0 /
14866      DATA AK1CS(13) /   -.0000000000 0011386E0 /
14867      DATA AK1CS(14) /    .0000000000 0001654E0 /
14868      DATA AK1CS(15) /   -.0000000000 0000248E0 /
14869      DATA AK1CS(16) /    .0000000000 0000038E0 /
14870      DATA AK1CS(17) /   -.0000000000 0000006E0 /
14871      DATA AK12CS( 1) /    .0637930834 3739001E0 /
14872      DATA AK12CS( 2) /    .0283288781 3049721E0 /
14873      DATA AK12CS( 3) /   -.0002475370 6739052E0 /
14874      DATA AK12CS( 4) /    .0000057719 7245160E0 /
14875      DATA AK12CS( 5) /   -.0000002068 9392195E0 /
14876      DATA AK12CS( 6) /    .0000000097 3998344E0 /
14877      DATA AK12CS( 7) /   -.0000000005 5853361E0 /
14878      DATA AK12CS( 8) /    .0000000000 3732996E0 /
14879      DATA AK12CS( 9) /   -.0000000000 0282505E0 /
14880      DATA AK12CS(10) /    .0000000000 0023720E0 /
14881      DATA AK12CS(11) /   -.0000000000 0002176E0 /
14882      DATA AK12CS(12) /    .0000000000 0000215E0 /
14883      DATA AK12CS(13) /   -.0000000000 0000022E0 /
14884      DATA AK12CS(14) /    .0000000000 0000002E0 /
14885      DATA FIRST /.TRUE./
14886C***FIRST EXECUTABLE STATEMENT  BESK1E
14887C
14888      BESK1E=CPUMIN
14889C
14890      IF (FIRST) THEN
14891         NTK1 = INITS (BK1CS, 11, 0.1*R1MACH(3))
14892         NTAK1 = INITS (AK1CS, 17, 0.1*R1MACH(3))
14893         NTAK12 = INITS (AK12CS, 14, 0.1*R1MACH(3))
14894C
14895         XMIN = EXP (MAX(LOG(R1MACH(1)), -LOG(R1MACH(2))) + .01)
14896         XSML = SQRT (4.0*R1MACH(3))
14897      ENDIF
14898      FIRST = .FALSE.
14899C
14900      IF (X .LE. 0.) THEN
14901        WRITE(ICOUT,1)
14902    1   FORMAT('***** ERORR FROM BESK1E, X ZERO OR NEGATIVE.  *******')
14903        CALL DPWRST('XXX','BUG ')
14904        BESK1E=0.0
14905        RETURN
14906      ENDIF
14907      IF (X.GT.2.0) GO TO 20
14908C
14909      IF (X .LT. XMIN) THEN
14910        WRITE(ICOUT,2)
14911        CALL DPWRST('XXX','BUG ')
14912        BESK1E = 0.0
14913        RETURN
14914      ENDIF
14915    2 FORMAT('***** ERROR FROM BESK1E, OVERRFLOW BECAUSE THE ',
14916     1       'VALUE OF X IS SO SMALL.  ****')
14917      Y = 0.
14918      IF (X.GT.XSML) Y = X*X
14919      BESK1E = EXP(X) * (LOG(0.5*X)*BESI1(X) +
14920     1  (0.75 + CSEVL (.5*Y-1., BK1CS, NTK1))/X )
14921      RETURN
14922C
14923 20   IF (X.LE.8.) BESK1E = (1.25 + CSEVL ((16./X-5.)/3., AK1CS, NTAK1))
14924     1  / SQRT(X)
14925      IF (X.GT.8.) BESK1E = (1.25 + CSEVL (16./X-1., AK12CS, NTAK12))
14926     1  / SQRT(X)
14927C
14928      RETURN
14929      END
14930      SUBROUTINE BESICF(ZZ,AA,NMAX,BI)
14931C THIS ROUTINE CALCULATES BESSEL FUNCTIONS I OF COMPLEX ARGUMENT AND
14932C REAL ORDER.  ARGUMENTS ARE AS FOR BESJCF, EXCEPT THAT HERE, IT IS REAL
14933C PART OF ZZ THAT MUST NOT EXCEED EXPARG IN ABSOLUTE VALUE
14934C EQUATION 9.6.3 OF REFERENCE 1 AS LISTED IN BESJCF IS USED
14935      COMPLEX ZZ,BI(*),BB,CC,ZDUMMY
14936C
14937C Definition of real and imaginary parts of complex number,
14938C standard Fortran and will work on Convex with -r8 -i8.
14939CCCCC REALP(ZDUMMY) = REAL(ZDUMMY)
14940      AIMAGP(ZDUMMY) = REAL((0,-1)*ZDUMMY)
14941C
14942      CC=(0.,1.)
14943      IF(AIMAGP(ZZ).LT.0.) CC=-CC
14944      BB=-CC*ZZ
14945      CALL BESJCF(BB,AA,NMAX,BI)
14946      ANGLE= 1.5707963267949*AA*AIMAGP(CC)
14947      BB=CMPLX(COS(ANGLE),SIN(ANGLE))
14948      BI(1)=-CC*BB*BI(1)
14949      MAXP=NMAX+2
14950      DO 1 N=2,MAXP
14951        BI(N)=BI(N)*BB
14952        BB=CC*BB
14953    1 CONTINUE
14954      RETURN
14955      END
14956      SUBROUTINE BESJCF(ZZ,AA,NMAX,BJ)
14957C THIS ROUTINE CALCULATES BESSEL FUNCTIONS J OF COMPLEX ARGUMENT AND
14958C REAL ORDER
14959C ROUTINE WRITTEN AND TESTED BY DAVID SAGIN (SOOKNE), COMPUTER CENTER,
14960C TEL-AVIV UNIVERSITY.  ROUTINE DATED 3/3/77
14961C
14962C DESCRIPTION OF VARIABLES IN THE CALLING VECTOR
14963C
14964C ZZ   COMPLEX ARGUMENT. LIMITATIONS ARE  ABS(AIMAG(ZZ)).LT.EXPARG (SEE
14965C      BELOW), AND ZZ*CONJG(ZZ) NOT ZERO IN THE COMPUTER
14966C AA   FRACTIONAL PART OF REAL ORDER FOR WHICH J*S AND/OR Y*S ARE TO BE
14967C      CALCULATED.  AA MUST BE GREATER THAN -.5 AND AT MOST +.5.
14968C NMAX NON-NEGATIVE INTEGER SUCH THAT NMAX+AA IS THE HIGHEST ORDER YOU
14969C      WANT.
14970C BJ   COMPLEX VECTOR OF LENGTH NMAX+2, IN
14971C      WHICH BESLCF RETURNS J*S OF ORDERS AA-1, AA, AA+1,...AA+NMAX.
14972C
14973C NUMBERS IN PARENTHESES (IN COMMENT CARDS BELOW) REFER TO THESE
14974C REFERENCES
14975C 1) MILTON ABRAMOWITZ AND IRENE A. STEGUN, HANDBOOK OF MATHEMATICAL
14976C    FUNCTIONS, NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY, 1964
14977C 2) M. GOLDSTEIN AND R. M. THALER, RECURRENCE TECHNIQUES FOR THE CALCU-
14978C    LATION OF BESSEL FUNCTIONS, MATHEMATICS OF COMPUTATION, VOLUME 13,
14979C    APRIL 1959, PAGE 102
14980C 3) F. W. J. OLVER AND D. J. SOOKNE, NOTE ON BACKWARD RECURRENCE ALGO-
14981C    RITHMS, MATHEMATICS OF COMPUTATION, VOLUME 26, OCT. 1972, PAGE 941
14982C 4) DAVID J. SOOKNE, BESSEL FUNCTIONS OF COMPLEX ARGUMENT AND INTEGER
14983C    ORDER, JOURNAL OF RESEARCH OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY,
14984C    SERIES B, VOLUME 77A, JULY-DEC. 1973, PAGE 111
14985C 5) A. ERDELYI ET AL., HIGHER TRANSCENDENTAL FUNCTIONS, VOLUME 2
14986C    CHAPTER 7, MCGRAW-HILL, NEW YORK, 1953
14987C
14988C  NOTE.
14989C     THIS ROUTINE CALLS A FUNCTION GAM1(X) WHICH RETURNS THE GAMMA
14990C     FUNCTION OF X FOR POSITIVE X .LE. GAML. SEE THE DEFINITION OF
14991C     GAML UNDER MACHINE DEPENDENT CONSTANTS BELOW.
14992C
14993C
14994C-----COMMON----------------------------------------------------------
14995C
14996      DOUBLE PRECISION DGAMMA
14997      INCLUDE 'DPCOMC.INC'
14998      INCLUDE 'DPCOP2.INC'
14999C
15000      COMPLEX BJ(*),B,BA1,BB,BBB,BD,FAC,SUM,Z,ZI,ZP,ZZ,ZDUMMY
15001C Note: Old variable LOG changed to LOGICL by D.W. Lozier, 4/27/88, to
15002C avoid conflict with generic function.
15003      LOGICAL LOGICL(4)
15004C-----------------------------------------------------------------------
15005C
15006C  MACHINE DEPENDENT CONSTANTS.
15007C  ---------------------------
15008C
15009      SAVE ISAVE, SQRTPI, DYOUK, EXPARG, GAML, LOU
15010      DATA ISAVE /1/
15011C
15012C Definition of real and imaginary parts of complex number,
15013C standard Fortran and will work on Convex with -r8 -i8.
15014      REALP(ZDUMMY) = REAL(ZDUMMY)
15015      AIMAGP(ZDUMMY) = REAL((0,-1)*ZDUMMY)
15016C
15017      IF (ISAVE.GT.0) THEN
15018        ISAVE = 0
15019C SQUARE ROOT OF PI, MACHINE ACCURACY, AND LIMIT ON ARGUMENT TO EXP
15020        SQRTPI = SQRT (4.0*ATAN (1.0))
15021        DYOUK = R1MACH (4)
15022        EXPARG = LOG (R1MACH (2))
15023C GAML IS AN INTEGER (PREFERABLY THE SMALLEST) SUCH THAT
15024C 1./(1680*LGAMMA(GAML)*GAML**7).LE.DYOUK.   SEE FORMULA 6.1.41 OF (1)
15025C Note: Code changed 4/27/88 by D.W. Lozier to prevent integer overflow.
15026C Previously, an integer factorial was formed, then the log was taken.
15027C In IEEE double precision, GAML=32 and i! overflows, causing the old
15028C code to fail.
15029        I = 2
15030        GAMLF = LOG(2.0)
15031    6   I = I + 1
15032        GAML = I
15033        GAMLF = GAMLF + LOG(GAML)
15034        IF ((1680.0*GAMLF*(GAML**7)*DYOUK) .LT. 1.0) GO TO 6
15035        LOU = I1MACH(2)
15036      ENDIF
15037C
15038C-----------------------------------------------------------------------
15039      Z=ZZ
15040      A=AA
15041      N=NMAX
15042      E=REALP(Z)**2+AIMAGP(Z)**2
15043C CHECK THAT INPUT DATA IS LEGAL
15044      IF ((A .LE. -0.5) .OR. (A .GT. 0.5) .OR.
15045     *  (ABS(AIMAGP(Z)) .GT. EXPARG) .OR. (E .EQ. 0.) .OR. (N .LT. 0))
15046     *  GO TO 86
15047      MAXN=N
15048      MAXP=2+MAXN
15049C AVOID UNDERFLOW OR OVERFLOW IN COMPLEX DIVIDE
15050      F=1./MAX(ABS(REALP(Z)),ABS(AIMAGP(Z)))
15051      ZI=2.*F/(Z*F)
15052      BD=LOG(.5*Z)
15053      ZP=EXP(A*BD)
15054      BBB=ZP/REAL(DGAMMA(DBLE(1.+A)))
15055      LOGICL(1)=MAXN.LE.0
15056      LOGICL(3)=E.LE.DYOUK
15057      LOGICL(4)=A.EQ.0.
15058      FAC = (1.0, 0.0)
15059      IF(LOGICL(3)) GO TO 72
15060C ROUTINE BACALC RETURNS N AND B (=J-SUB(N+A)OF-X) WITH WHICH TO START
15061C CALCULATING J*S VIA BACK RECURSION
15062      CALL BACKLC(Z,A,N,B)
15063      K=(N+1)/2
15064      IF(N.LE.MAXN) GO TO 80
15065C
15066C INITIALIZE VARIABLES FOR THE BACK-RECURSION.  COEF IS THE COEFFICIENT
15067C OF THE NORMALIZATION SUM, AND FAC IS USED IN CALCULATING THE NORMALI-
15068C ZATION FACTOR.  THESE ARE CALCULATED VIA EQUATION 44 OF CHAPTER 7.15
15069C OF (5) IF A.NE.0.  IN THIS CASE, COS(PHI) IS ZERO OR 1 DEPENDING ON
15070C WHETHER ABS(COS(Z)) IS LESS THAN 1 OR GREATER THAN 1 RESPECTIVELY.
15071C IF A.EQ.0, THE NORMALIZATION IS VIA EQUATION 9.1.46 OR 9.1.47 OF (1),
15072C DEPENDING OR COS(Z).
15073C
15074    8 COEF=2.
15075      KD=1
15076      BB=COS(Z)
15077      LOGICL(2)=.FALSE.
15078      IF(ABS(BB).LE.1.) GO TO 11
15079      KD=2
15080      FAC=BB
15081      LOGICL(2)=.TRUE.
15082   11 IF(LOGICL(4)) GO TO 14
15083      D=REAL(KD*K)
15084      G=A*REAL(KD)
15085      C=D+G
15086      F=2.+A/REAL(K)
15087      IF(LOGICL(2)) F=F*SQRTPI/(REAL(DGAMMA(DBLE(A+.5)))*2.**(2.*A))
15088      IF(C.GT.GAML) GO TO 12
15089      COEF=F*REAL(DGAMMA(DBLE(C)))/REAL(DGAMMA(DBLE(D)))
15090      GO TO 14
15091   12 E=C*D
15092      COEF=(D-.5)*LOG(C/D)+G*(LOG(C)-1.-
15093     1(1.-(C*C+E+D*D-(C**4+C*C*E+E*E+D*D*E+D**4)/(3.5*E*E))/(30.*E*E))
15094     2/(12.*E))
15095      COEF=F*EXP(COEF)
15096   14 BB = (0.0, 0.0)
15097      SUM = (0.0, 0.0)
15098      G=1.
15099      IF(LOGICL(2).AND.K.NE.2*(K/2)) COEF=-COEF
15100      LOGICL(3)=2*K.NE.N
15101      IF(LOGICL(3)) GO TO 20
15102      SUM=COEF*B
15103C USING 9.1.27 OF (1) (EQUATION 1 OF (4) IS THE ANALOG FOR INTEGER
15104C ORDERS), CALCULATE UNNORMALIZED J*S OF ORDERS N-1+A, N-2+A,...A.
15105C ACCUMULATE THE NORMALIZATION SUM AS DESCRIBED ABOVE.
15106   20 E=REAL(N)+A
15107      N=N-1
15108      BBB=BB
15109      BB=B
15110      B=(ZI*E)*BB-BBB
15111      IF(LOGICL(1)) GO TO 22
15112      IF(N.LE.MAXN) BJ(N+2)=B
15113   22 LOGICL(3)=.NOT.LOGICL(3)
15114      IF(LOGICL(3)) GO TO 20
15115      D=REAL(K)
15116      K=K-1
15117      F=REAL(K)+A
15118      IF(LOGICL(4)) GO TO 24
15119      G=D*(REAL(N)+A)/(F*(E+1.))
15120      COEF=COEF*G
15121      IF(LOGICL(2)) COEF=COEF*REAL(N+1)/(2.*F+1.)
15122   24 IF(LOGICL(2)) COEF=-COEF
15123      IF(N.EQ.0) GO TO 28
15124      SUM=SUM+COEF*B
15125      GO TO 20
15126   28 BA1=(ZI*A)*B-BB
15127      IF(LOGICL(4)) COEF=1.
15128C THE BACK-RECURSION IS FINISHED.  CALCULATE THE NORMALIZATION FACTOR
15129      SUM=SUM+COEF*B
15130      F=1./MAX(ABS(REALP(SUM)),ABS(AIMAGP(SUM)))
15131      FAC=ZP*(F*(FAC/(CMPLX(REALP(SUM)*F,AIMAGP(SUM)*F))))
15132      BJ(1)=BA1*FAC
15133      BJ(2)=B*FAC
15134      IF(MAXN.EQ.0) GO TO 70
15135      DO 34 M=3,MAXP
15136        BJ(M)=FAC*BJ(M)
15137   34 CONTINUE
15138C
15139C THIS IS THE ONLY RETURN STATEMENT IN THE ROUTINE
15140C
15141   70 CONTINUE
15142      RETURN
15143C
15144C FOR VERY SMALL Z, CALCULATE J*S VIA ASYMPTOTIC FORMULA 9.1.7 OF (1)
15145C
15146   72 CONTINUE
15147      BJ(2)=BBB
15148      BB=(Z*BJ(2))*(.5/(1.+A))
15149      BJ(1)=-BB
15150      IF(.NOT.LOGICL(4)) BJ(1)=(ZI*BJ(2))*AA
15151      IF(MAXP.GE.3) BJ(3)=BB
15152      IF(MAXP.LT.4) GO TO 70
15153      DO 74 N=4,MAXP
15154        BJ(N)=(Z*BJ(N-1))*(.5/(A+REAL(N-2)))
15155   74 CONTINUE
15156      GO TO 70
15157C UNDERFLOW. SET J*S ZERO
15158   80 CONTINUE
15159      DO 81 M=N,MAXN
15160        BJ(M + 2) = (0.0, 0.0)
15161   81 CONTINUE
15162      BJ(N+2)=B
15163      GO TO 8
15164C CONK OUT
15165   86 CONTINUE
15166      WRITE (ICOUT, 88)
15167      CALL DPWRST('XXX','BUG ')
15168      WRITE (ICOUT, 89) N, A, Z
15169      CALL DPWRST('XXX','BUG ')
15170   88 FORMAT('***** FATAL ERROR (BESJCF) --- INVALID INPUT ')
15171   89 FORMAT('      NMAX = ',I6,' A = ',1PE22.14,' Z = ',2(1PE22.14))
15172      RETURN
15173      END
15174      SUBROUTINE BESKCF(ZZ,AA,NMAX,BK)
15175C THIS ROUTINE CALCULATES BESSEL FUNCTIONS K OF COMPLEX ARGUMENT AND
15176C REAL ORDER.  ARGUMENTS ARE AS FOR ROUTINE BESJCF, EXCEPT HERE IT IS
15177C REAL(ZZ) WHICH MUST NOT EXCEED EXPARG IN ABSOLUTE VALUE
15178C K*S ARE CALCULATED BY FORWARD RECURSION, USING EQUATION 1.9 OF THE
15179C REFERENCE LISTED IN ROUTINE RECIPG.  TO START THE RECURSION, FUNCTION
15180C VALUES OF ORDERS A AND A+1 ARE CALCULATED IF A.LE.0, WHILE ORDERS A
15181C AND A-1 ARE CALCULATED IF A.GT.0.
15182C NOTE  IF ANY K-VALUE IS SO BIG THAT ITS CALCULATION WOULD CAUSE OVER-
15183C FLOW, IT (AND ALL HIGHER ORDERS) ARE SET TO ZERO.
15184C
15185C-----COMMON----------------------------------------------------------
15186C
15187      INCLUDE 'DPCOMC.INC'
15188      INCLUDE 'DPCOP2.INC'
15189C
15190      COMPLEX AK(21),AK1(21),BK(*),BB,CC,DD,EE,FF,GG,HH,PP,QQ,SS,Z,ZINV,
15191     1 ZZ,RR,ZDUMMY
15192C-----------------------------------------------------------------------
15193C
15194C  MACHINE DEPENDENT CONSTANTS.
15195C  ---------------------------
15196C
15197C MACHINE-DEPENDENT CONSTANTS ARE EXPLAINED IN
15198C ROUTINES BESJCF, BACKLC, AND BESYCF.
15199C
15200      SAVE ISAVE,PI,SQRTPI,GADOL,EXPARG,DYOUK,DYOUKH,NTERM,DYOUKI,LOU
15201      DATA ISAVE /1/
15202C
15203C Definition of real and imaginary parts of complex number,
15204C standard Fortran and will work on Convex with -r8 -i8.
15205      REALP(ZDUMMY) = REAL(ZDUMMY)
15206      AIMAGP(ZDUMMY) = REAL((0,-1)*ZDUMMY)
15207C
15208      IF (ISAVE.GT.0) THEN
15209        ISAVE = 0
15210        PI = 4.0*ATAN (1.0)
15211        SQRTPI = SQRT (PI)
15212        GADOL = R1MACH (2)
15213        EXPARG = LOG (GADOL)
15214        DYOUK = R1MACH (4)
15215        DYOUKH = SQRT (DYOUK)
15216        NTERM = 20
15217        DYOUKI = 1.0 / DYOUK
15218        LOU = I1MACH(2)
15219      ENDIF
15220C
15221C-----------------------------------------------------------------------
15222      Z=ZZ
15223      A=AA
15224      MAXP=NMAX+2
15225      Q=ABS(REALP(Z))
15226      E=Q*Q+AIMAGP(Z)**2
15227      IF ((A .LE. - 0.5) .OR. (A .GT. 0.5) .OR. (MAXP .LT. 2) .OR.
15228     *   (E .EQ. 0.0) .OR. (Q .GT. EXPARG)) GO TO 86
15229      F=SQRT(E)
15230      BIG=GADOL*MIN(.25,F/REAL(4*MAX(1,NMAX)))
15231C AVOID UNDERFLOW OR OVERFLOW IN COMPLEX DIVIDE
15232      F=1./F
15233      ZINV=2.*F/(Z*F)
15234      IF(A.EQ..5.OR.E.GE.196.) GO TO 30
15235      IF(E.GE.9.) GO TO 20
15236C FOR SMALL Z, CALCULATE K*S VIA EQUATIONS 2.1 OF THE REFERENCE LISTED
15237C IN ROUTINE RECIPG
15238      BB=.5*Z
15239      DD=-LOG(BB)
15240      EE=A*DD
15241      C=1.
15242      IF(PI*ABS(A).GT.DYOUKH) C=PI*A/SIN(PI*A)
15243      SS = (1.0, 0.0)
15244      IF ((REALP (EE) ** 2 + AIMAGP (EE) ** 2) .GT. DYOUK)
15245     *   SS = CMPLX (0.0, - 1.0) * SIN (CMPLX (0., 1.0) * EE) / EE
15246      EE=EXP(EE)
15247      CALL RECIPG(A,P,Q,G)
15248      GG=G*EE
15249      EE=.5*(EE+1./EE)
15250      FF=C*(P*EE+Q*SS*DD)
15251      E=A*A
15252      PP=.5*C*GG
15253      QQ=.5/GG
15254      CC = (1.0, 0.0)
15255      DD=BB*BB
15256      AK(1)=FF
15257C IF A.GT.0, CALCULATE KSUB(A-1) BY SUBSTITUTING EQUATIONS 2.1 AND 2.9
15258C INTO 1.9
15259      AK1(1)=PP
15260C IF A.LE.0, CALCULATE KSUB(A+1) VIA 2.9
15261      IF(A.GT.0.) AK1(1)=QQ
15262      TEST=DYOUK*MAX(ABS(REALP(AK(1))),ABS(AIMAGP(AK(1))))
15263      DO 10 N=1,NTERM
15264      EN=N
15265      G=1./(EN*EN-E)
15266      IF(A.GT.0.) GO TO 6
15267      HH=-G*(EN*(EN*FF+QQ)-A*PP)
15268      GO TO 8
15269    6 CONTINUE
15270      HH=-G*(EN*(EN*FF+PP)+A*QQ)
15271    8 CONTINUE
15272      FF=G*(EN*FF+PP+QQ)
15273      CC=CC*DD/EN
15274      AK(N+1) =CC*FF
15275      AK1(N+1)=CC*HH
15276      IF(MAX(ABS(REALP(AK(N+1))),ABS(AIMAGP(AK(N+1)))).LE.TEST) GO TO 12
15277      PP=PP/(EN-A)
15278      QQ=QQ/(EN+A)
15279   10 CONTINUE
15280      RETURN
15281   12 N=N+1
15282      M=N+1
15283      GG = (0.0, 0.0)
15284      HH = (0.0, 0.0)
15285      DO 14 L=1,N
15286         ITEMP = M - L
15287         GG=GG+AK(ITEMP)
15288         HH=HH+AK1(ITEMP)
15289   14 CONTINUE
15290      BK(2)=GG
15291      BK(1)=HH*ZINV
15292      GO TO 40
15293C FOR ABS(Z) BETWEEN 3 AND 14, CALCULATE K*S VIA THE ALGORITHM GIVEN
15294C IN SECTION 3 OF THE REFERENCE.  THE ALGORITHM IS GIVEN FOR REAL Z, BUT
15295C CAN BE USED WHEN THE REAL PART OF Z IS NON-NEGATIVE.
15296   20 CONTINUE
15297      TEST=DYOUKI*COS(A*PI)/(E*PI)
15298      E=1.
15299      PP = (1.0, 0.0)
15300      QQ = (0.0, 0.0)
15301      FF=Z
15302      IF(REALP(Z).LT.0.) FF=-Z
15303      C=.25-A*A
15304      DO 22 N=1,99
15305      AN=(REAL(N*N-N)+C)/REAL(N*N+N)
15306      E=E*AN
15307      EN=1./REAL(N+1)
15308      BB=2.*EN*(REAL(N)+FF)
15309      RR=QQ
15310      QQ=PP
15311      PP=BB*QQ-AN*RR
15312      IF(MAX(ABS(REALP(PP)),ABS(AIMAGP(PP))).GE.EN*TEST) GO TO 23
15313   22 CONTINUE
15314      RETURN
15315   23 CONTINUE
15316      PP=E/PP
15317      QQ = (0.0, 0.0)
15318      EE=PP
15319      M=N
15320      N=N+1
15321      DO 25 L=1,M
15322      N=N-1
15323      RR=QQ
15324      QQ=PP
15325      AINV=REAL(N*N+N)/(REAL(N*N-N)+C)
15326      BB=2.*(REAL(N)+FF)/REAL(N+1)
15327      PP=(BB*QQ-RR)*AINV
15328      EE=EE+PP
15329   25 CONTINUE
15330      BB=LOG(2.*FF)
15331      GG=EXP(-BB*(A+.5))/EE
15332      BK(2)=SQRTPI*EXP(A*BB-FF)*GG*PP
15333      E=A
15334      IF(A.GT.0.) E=-A
15335      BK(1)=.5*BK(2)*(FF-QQ/PP+(.5+E))*ZINV
15336      IF(REALP(Z).GE.0.) GO TO 40
15337C REAL(Z) IS NEGATIVE, SO USE EQUATION 9.6.31 OF REFERENCE (1) OF BESJCF
15338      BK(1)=-BK(1)
15339   26 ZINV=-ZINV
15340      HH=BK(1)
15341      GG=BK(2)
15342      QQ=HH
15343      IF(A.GT.0.) HH=QQ+A*(ZINV*GG)
15344      IF(A.LE.0.) QQ=HH-A*(ZINV*GG)
15345C NOW QQ, GG, HH ARE FUNCTIONS K OF ARGUMENT (-Z) AND ORDER A-1, A, A+1
15346      CALL BESICF(FF,A,NMAX,BK)
15347      E=1.
15348      IF(AIMAGP(Z).GE.0.) E=-1.
15349      DD=CMPLX(0.,E)
15350      E=-E*PI
15351      EE=CMPLX(0.,E)
15352      E=-E*A
15353      IF(A.NE..5) DD=CMPLX(COS(E),SIN(E))
15354      BK(1)=-DD*QQ-EE*BK(1)
15355      BK(2)=DD*GG-EE*BK(2)
15356      IF(MAXP.LE.2) GO TO 70
15357      DD=-DD
15358      BK(3)=DD*HH-EE*BK(3)
15359      IF(MAXP.EQ.3) GO TO 70
15360C USE FORMULA 9.6.31, RECURRING FORWARD ON K OF ARGUMENT (-Z)
15361      DO 28 N=4,MAXP
15362      IF(MAX(ABS(REALP(HH)),ABS(AIMAGP(HH))).GT.BIG) GO TO 82
15363      FF=GG
15364      GG=HH
15365      DD=-DD
15366        HH=(ZINV*(A+REAL(N-3)))*GG+FF
15367        BK(N)=DD*HH-EE*BK(N)
15368   28 CONTINUE
15369      GO TO 70
15370C FOR LARGE Z, CALCULATE K*S VIA PHASE-AMPLITUDE EQUATION 9.7.2 OF
15371C REFERENCE (1) LISTED IN BESJCF.
15372   30 CONTINUE
15373      FF=Z
15374      EE=ZINV
15375      IF(REALP(Z).LT.0.) FF=-FF
15376      IF(REALP(Z).LT.0.) EE=-EE
15377      DD=SQRT(.25*PI*EE)*EXP(-FF)
15378      C=A
15379      R=1.
15380      IF(A.GT.0.) R=-1.
15381      DO 32 M=1,2
15382        IF(M.EQ.2) C=C+R
15383        CALL PHASMP(C,EE,1,PP,QQ)
15384        ITEMP = 3 - M
15385        BK(ITEMP) = DD * PP
15386   32 CONTINUE
15387      IF(REALP(Z).LT.0.) GO TO 26
15388   40 CONTINUE
15389      M=3
15390      IF(A.GT.0.) GO TO 60
15391      M=4
15392      IF(MAXP.GE.3) BK(3)=BK(1)
15393      BK(1)=BK(1)-(A*ZINV)*BK(2)
15394C CALCULATE K*S VIA FORWARD RECURSION, CHECKING FOR POSSIBLE OVERFLOW
15395   60 IF(M.GT.MAXP) GO TO 70
15396      DO 65 N=M,MAXP
15397      IF(MAX(ABS(REALP(BK(N-1))),ABS(AIMAGP(BK(N-1)))).GT.BIG) GO TO 82
15398      BK(N)=(ZINV*(A+REAL(N-3)))*BK(N-1)+BK(N-2)
15399   65 CONTINUE
15400   70 CONTINUE
15401      RETURN
15402   82 CONTINUE
15403      DO 83 M=N,MAXP
15404         BK(M) = (0.0, 0.0)
15405   83 CONTINUE
15406      GO TO 70
15407   86 CONTINUE
15408      WRITE (ICOUT, 88)NMAX
15409      CALL DPWRST('XXX','BUG ')
15410      WRITE (ICOUT, 89)A,Z
15411      CALL DPWRST('XXX','BUG ')
15412   88 FORMAT('***** ERROR (BESKCF) --- INVALID INPUT, NMAX = ', I6)
15413   89 FORMAT('      A = ', 1PE22.14,' Z = ',2(1PE22.14))
15414      RETURN
15415      END
15416      FUNCTION BESRAT(V)
15417C
15418C     ROUTINE NEEDED BY VKAPPA FOR COMPUTING MAXIMUM LIKELIHOOD
15419C     ESTIMATES FOR KAPPA (SHAPE PARAMETER OF VON MISES
15420C     DISTRIBUTION).  FROM:
15421C
15422C ACM ALGORITHM 571
15423C
15424C STATISTICS FOR VON MISES' AND FISCHER'S DISTRIBUTIONS
15425C
15426C BY G.W. HILL
15427C
15428C ACM TRANSACTIONS ON MATHEMATICAL SOFTWARE, JUNE 1981
15429C
15430C ----------------------------------------------------------------
15431C RETURNS BESRAT = A(K) FOR K = ABS(V), WHERE A(K) IS THE EXPECTED
15432C MODULUS OF THE MEAN VECTOR SUM OF UNIT VECTORS SAMPLED FROM THE
15433C VON MISES DISTRIBUTION OF DIRECTIONS IN 2D WITH PARAMETER = K.
15434C A(V) = THE RATIO OF MODIFIED BESSEL FUNCTIONS OF THE FIRST KIND
15435C OF ORDERS 1 AND 0, I.E., A(V) = I1(V)/I0(V).
15436C ----------------------------------------------------------------
15437C
15438C  ADJUST TO S DECIMAL DIGIT PRECISION BY SETTING DATA CONSTANTS -
15439C     C1 = (S+9.0-8.0/S)*0.0351
15440C     C2 = ((S-5.0)**3/180.0+S-5.0)/10.0
15441C     CX = S*0.5 + 11.0
15442C  FOR S IN RANGE (5,14).  THUS FOR S = 9.3 :
15443      DATA C1 /0.613/, C2 /0.475/, CX /15.65/
15444C
15445      Y = 0.0
15446      X = ABS(V)
15447      IF (X.GT.CX) GO TO 20
15448C
15449C  FOR SMALL X, RATIO = X/(2+X*X/(4+X*X/(6+X*X/(8+ ... )))
15450      N = INT((X+16.0-16.0/(X+C1+0.75))*C1)
15451      X = X*0.5
15452      XX = X*X
15453      DO 10 J=1,N
15454        Y = XX/(FLOAT(N-J+2)+Y)
15455   10 CONTINUE
15456      BESRAT = X/(1.0+Y)
15457      RETURN
15458C
15459C  FOR LARGE X, RATIO = 1-2/(4X-1-1/(4X/3-2-1/(4X/5-2- ... )))
15460   20 N = INT((68.0/X+1.0)*C2) + 1
15461      X = X*4.0
15462      XX = FLOAT(N*2+1)
15463      DO 30 J=1,N
15464        Y = XX/((-2.0-Y)*XX+X)
15465        XX = XX - 2.0
15466   30 CONTINUE
15467      BESRAT = 1.0 - 2.0/(X-1.0-Y)
15468      RETURN
15469      END
15470      SUBROUTINE BESY (X, FNU, N, Y)
15471C***BEGIN PROLOGUE  BESY
15472C***PURPOSE  Implement forward recursion on the three term recursion
15473C            relation for a sequence of non-negative order Bessel
15474C            functions Y/SUB(FNU+I-1)/(X), I=1,...,N for real, positive
15475C            X and non-negative orders FNU.
15476C***LIBRARY   SLATEC
15477C***CATEGORY  C10A3
15478C***TYPE      SINGLE PRECISION (BESY-S, DBESY-D)
15479C***KEYWORDS  SPECIAL FUNCTIONS, Y BESSEL FUNCTION
15480C***AUTHOR  Amos, D. E., (SNLA)
15481C***DESCRIPTION
15482C
15483C     Abstract
15484C         BESY implements forward recursion on the three term
15485C         recursion relation for a sequence of non-negative order Bessel
15486C         functions Y/sub(FNU+I-1)/(X), I=1,N for real X .GT. 0.0E0 and
15487C         non-negative orders FNU.  If FNU .LT. NULIM, orders FNU and
15488C         FNU+1 are obtained from BESYNU which computes by a power
15489C         series for X .LE. 2, the K Bessel function of an imaginary
15490C         argument for 2 .LT. X .LE. 20 and the asymptotic expansion for
15491C         X .GT. 20.
15492C
15493C         If FNU .GE. NULIM, the uniform asymptotic expansion is coded
15494C         in ASYJY for orders FNU and FNU+1 to start the recursion.
15495C         NULIM is 70 or 100 depending on whether N=1 or N .GE. 2.  An
15496C         overflow test is made on the leading term of the asymptotic
15497C         expansion before any extensive computation is done.
15498C
15499C     Description of Arguments
15500C
15501C         Input
15502C           X      - X .GT. 0.0E0
15503C           FNU    - order of the initial Y function, FNU .GE. 0.0E0
15504C           N      - number of members in the sequence, N .GE. 1
15505C
15506C         Output
15507C           Y      - a vector whose first N components contain values
15508C                    for the sequence Y(I)=Y/sub(FNU+I-1)/(X), I=1,N.
15509C
15510C     Error Conditions
15511C         Improper input arguments - a fatal error
15512C         Overflow - a fatal error
15513C
15514C***REFERENCES  F. W. J. Olver, Tables of Bessel Functions of Moderate
15515C                 or Large Orders, NPL Mathematical Tables 6, Her
15516C                 Majesty's Stationery Office, London, 1962.
15517C               N. M. Temme, On the numerical evaluation of the modified
15518C                 Bessel function of the third kind, Journal of
15519C                 Computational Physics 19, (1975), pp. 324-337.
15520C               N. M. Temme, On the numerical evaluation of the ordinary
15521C                 Bessel function of the second kind, Journal of
15522C                 Computational Physics 21, (1976), pp. 343-350.
15523C***ROUTINES CALLED  ASYJY, BESY0, BESY1, BESYNU, I1MACH, R1MACH,
15524C                    XERMSG, YAIRY
15525C***REVISION HISTORY  (YYMMDD)
15526C   800501  DATE WRITTEN
15527C   890531  Changed all specific intrinsics to generic.  (WRB)
15528C   890531  REVISION DATE from Version 3.2
15529C   891214  Prologue converted to Version 4.0 format.  (BAB)
15530C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
15531C   900326  Removed duplicate information from DESCRIPTION section.
15532C           (WRB)
15533C   920501  Reformatted the REFERENCES section.  (WRB)
15534C***END PROLOGUE  BESY
15535C
15536C-----COMMON----------------------------------------------------------
15537C
15538      INCLUDE 'DPCOMC.INC'
15539      INCLUDE 'DPCOP2.INC'
15540C
15541      EXTERNAL YAIRY, BESY0DP, BESY1DP
15542      INTEGER I, IFLW, J, N, NB, ND, NN, NUD, NULIM
15543      REAL       AZN,CN,DNU,ELIM,FLGJY,FN,FNU,RAN,S,S1,S2,TM,TRX,
15544     1           W,WK,W2N,X,XLIM,XXN,Y
15545      REAL BESY0DP, BESY1DP
15546      DIMENSION W(2), NULIM(2), Y(*), WK(7)
15547      SAVE NULIM
15548C
15549      DATA NULIM(1),NULIM(2) / 70 , 100 /
15550C***FIRST EXECUTABLE STATEMENT  BESY
15551C
15552      S2=0.0
15553      TRX=0.0
15554      TM=0.0
15555      NN = -I1MACH(12)
15556C
15557      ELIM = 2.303E0*(NN*R1MACH(5)-3.0E0)
15558      XLIM = R1MACH(1)*1.0E+3
15559      IF (FNU.LT.0.0E0) GO TO 140
15560      IF (X.LE.0.0E0) GO TO 150
15561      IF (X.LT.XLIM) GO TO 170
15562      IF (N.LT.1) GO TO 160
15563C
15564C     ND IS A DUMMY VARIABLE FOR N
15565C
15566      ND = N
15567      NUD = INT(FNU)
15568      DNU = FNU - NUD
15569      NN = MIN(2,ND)
15570      FN = FNU + N - 1
15571      IF (FN.LT.2.0E0) GO TO 100
15572C
15573C     OVERFLOW TEST  (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
15574C     FOR THE LAST ORDER, FNU+N-1.GE.NULIM
15575C
15576      XXN = X/FN
15577      W2N = 1.0E0-XXN*XXN
15578      IF(W2N.LE.0.0E0) GO TO 10
15579      RAN = SQRT(W2N)
15580      AZN = LOG((1.0E0+RAN)/XXN) - RAN
15581      CN = FN*AZN
15582      IF(CN.GT.ELIM) GO TO 170
15583   10 CONTINUE
15584      IF (NUD.LT.NULIM(NN)) GO TO 20
15585C
15586C     ASYMPTOTIC EXPANSION FOR ORDERS FNU AND FNU+1.GE.NULIM
15587C
15588      FLGJY = -1.0E0
15589      CALL ASYJY(YAIRY,X,FNU,FLGJY,NN,Y,WK,IFLW)
15590      IF(IFLW.NE.0) GO TO 170
15591      IF (NN.EQ.1) RETURN
15592      TRX = 2.0E0/X
15593      TM = (FNU+FNU+2.0E0)/X
15594      GO TO 80
15595C
15596   20 CONTINUE
15597      IF (DNU.NE.0.0E0) GO TO 30
15598      S1 = BESY0DP(X)
15599      IF (NUD.EQ.0 .AND. ND.EQ.1) GO TO 70
15600      S2 = BESY1DP(X)
15601      GO TO 40
15602   30 CONTINUE
15603      NB = 2
15604      IF (NUD.EQ.0 .AND. ND.EQ.1) NB = 1
15605      CALL BESYNU(X, DNU, NB, W)
15606      S1 = W(1)
15607      IF (NB.EQ.1) GO TO 70
15608      S2 = W(2)
15609   40 CONTINUE
15610      TRX = 2.0E0/X
15611      TM = (DNU+DNU+2.0E0)/X
15612C     FORWARD RECUR FROM DNU TO FNU+1 TO GET Y(1) AND Y(2)
15613      IF (ND.EQ.1) NUD = NUD - 1
15614      IF (NUD.GT.0) GO TO 50
15615      IF (ND.GT.1) GO TO 70
15616      S1 = S2
15617      GO TO 70
15618   50 CONTINUE
15619      DO 60 I=1,NUD
15620        S = S2
15621        S2 = TM*S2 - S1
15622        S1 = S
15623        TM = TM + TRX
15624   60 CONTINUE
15625      IF (ND.EQ.1) S1 = S2
15626   70 CONTINUE
15627      Y(1) = S1
15628      IF (ND.EQ.1) RETURN
15629      Y(2) = S2
15630   80 CONTINUE
15631      IF (ND.EQ.2) RETURN
15632C     FORWARD RECUR FROM FNU+2 TO FNU+N-1
15633      DO 90 I=3,ND
15634        Y(I) = TM*Y(I-1) - Y(I-2)
15635        TM = TM + TRX
15636   90 CONTINUE
15637      RETURN
15638C
15639  100 CONTINUE
15640C     OVERFLOW TEST
15641      IF (FN.LE.1.0E0) GO TO 110
15642      IF (-FN*(LOG(X)-0.693E0).GT.ELIM) GO TO 170
15643  110 CONTINUE
15644      IF (DNU.EQ.0.0E0) GO TO 120
15645      CALL BESYNU(X, FNU, ND, Y)
15646      RETURN
15647  120 CONTINUE
15648      J = NUD
15649      IF (J.EQ.1) GO TO 130
15650      J = J + 1
15651      Y(J) = BESY0DP(X)
15652      IF (ND.EQ.1) RETURN
15653      J = J + 1
15654  130 CONTINUE
15655      Y(J) = BESY1DP(X)
15656      IF (ND.EQ.1) RETURN
15657      TRX = 2.0E0/X
15658      TM = TRX
15659      GO TO 80
15660C
15661C
15662C
15663  140 CONTINUE
15664      WRITE(ICOUT,141)
15665  141 FORMAT('***** ERORR FROM BESY, THE ORDER FNU IS NEGATIVE. ***')
15666      CALL DPWRST('XXX','BUG ')
15667      RETURN
15668  150 CONTINUE
15669      WRITE(ICOUT,151)
15670  151 FORMAT('**** ERORR FROM BESY, X IS LESS THAN OR EQUAL TO ZERO. ')
15671      CALL DPWRST('XXX','BUG ')
15672      RETURN
15673  160 CONTINUE
15674      WRITE(ICOUT,161)
15675  161 FORMAT('***** ERORR FROM BESY, N IS LESS THAN ONE.. ***')
15676      CALL DPWRST('XXX','BUG ')
15677      RETURN
15678  170 CONTINUE
15679      WRITE(ICOUT,171)
15680  171 FORMAT('***** ERORR FROM BESY, OVERFLOW, FNU OR N TOO LARGE OR ',
15681     1       'X TOO SMALL. *****')
15682      RETURN
15683      END
15684      SUBROUTINE BESYNU (X, FNU, N, Y)
15685C***BEGIN PROLOGUE  BESYNU
15686C***SUBSIDIARY
15687C***PURPOSE  Subsidiary to BESY
15688C***LIBRARY   SLATEC
15689C***TYPE      SINGLE PRECISION (BESYNU-S, DBSYNU-D)
15690C***AUTHOR  Amos, D. E., (SNLA)
15691C***DESCRIPTION
15692C
15693C     Abstract
15694C         BESYNU computes N member sequences of Y Bessel functions
15695C         Y/SUB(FNU+I-1)/(X), I=1,N for non-negative orders FNU and
15696C         positive X. Equations of the references are implemented on
15697C         small orders DNU for Y/SUB(DNU)/(X) and Y/SUB(DNU+1)/(X).
15698C         Forward recursion with the three term recursion relation
15699C         generates higher orders FNU+I-1, I=1,...,N.
15700C
15701C         To start the recursion FNU is normalized to the interval
15702C         -0.5.LE.DNU.LT.0.5. A special form of the power series is
15703C         implemented on 0.LT.X.LE.X1 while the Miller algorithm for the
15704C         K Bessel function in terms of the confluent hypergeometric
15705C         function U(FNU+0.5,2*FNU+1,I*X) is implemented on X1.LT.X.LE.X
15706C         Here I is the complex number SQRT(-1.).
15707C         For X.GT.X2, the asymptotic expansion for large X is used.
15708C         When FNU is a half odd integer, a special formula for
15709C         DNU=-0.5 and DNU+1.0=0.5 is used to start the recursion.
15710C
15711C         BESYNU assumes that a significant digit SINH(X) function is
15712C         available.
15713C
15714C     Description of Arguments
15715C
15716C         Input
15717C           X      - X.GT.0.0E0
15718C           FNU    - Order of initial Y function, FNU.GE.0.0E0
15719C           N      - Number of members of the sequence, N.GE.1
15720C
15721C         Output
15722C           Y      - A vector whose first N components contain values
15723C                    for the sequence Y(I)=Y/SUB(FNU+I-1), I=1,N.
15724C
15725C     Error Conditions
15726C         Improper input arguments - a fatal error
15727C         Overflow - a fatal error
15728C
15729C***SEE ALSO  BESY
15730C***REFERENCES  N. M. Temme, On the numerical evaluation of the ordinary
15731C                 Bessel function of the second kind, Journal of
15732C                 Computational Physics 21, (1976), pp. 343-350.
15733C               N. M. Temme, On the numerical evaluation of the modified
15734C                 Bessel function of the third kind, Journal of
15735C                 Computational Physics 19, (1975), pp. 324-337.
15736C***ROUTINES CALLED  GAMMA, R1MACH, XERMSG
15737C***REVISION HISTORY  (YYMMDD)
15738C   800501  DATE WRITTEN
15739C   890531  Changed all specific intrinsics to generic.  (WRB)
15740C   891214  Prologue converted to Version 4.0 format.  (BAB)
15741C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
15742C   900326  Removed duplicate information from DESCRIPTION section.
15743C           (WRB)
15744C   900328  Added TYPE section.  (WRB)
15745C   900727  Added EXTERNAL statement.  (WRB)
15746C   910408  Updated the AUTHOR and REFERENCES sections.  (WRB)
15747C   920501  Reformatted the REFERENCES section.  (WRB)
15748C***END PROLOGUE  BESYNU
15749C
15750C-----COMMON----------------------------------------------------------
15751C
15752      INCLUDE 'DPCOMC.INC'
15753      INCLUDE 'DPCOP2.INC'
15754C
15755      INTEGER I, INU, J, K, KK, N, NN
15756      REAL A, AK, ARG, A1, A2, BK, CB, CBK, CC, CCK, CK, COEF, CPT,
15757     1 CP1, CP2, CS, CS1, CS2, CX, DNU, DNU2, ETEST, ETX, F, FC, FHS,
15758     2 FK, FKS, FLRX, FMU, FN, FNU, FX, G, G1, G2, HPI, P, PI, PT, Q,
15759     3 RB, RBK, RCK, RELB, RPT, RP1, RP2, RS, RS1, RS2, RTHPI, RX, S,
15760     4 SA, SB, SMU, SS, ST, S1, S2, TB, TM, TOL, T1, T2, X, X1, X2, Y
15761      DIMENSION A(120), RB(120), CB(120), Y(*), CC(8)
15762      DOUBLE PRECISION DGAMMA
15763      EXTERNAL DGAMMA
15764      SAVE X1, X2, PI, RTHPI, HPI, CC
15765      DATA X1, X2 / 3.0E0, 20.0E0 /
15766      DATA PI,RTHPI        / 3.14159265358979E+00, 7.97884560802865E-01/
15767      DATA HPI             / 1.57079632679490E+00/
15768      DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)
15769     1                     / 5.77215664901533E-01,-4.20026350340952E-02,
15770     2-4.21977345555443E-02, 7.21894324666300E-03,-2.15241674114900E-04,
15771     3-2.01348547807000E-05, 1.13302723200000E-06, 6.11609500000000E-09/
15772C***FIRST EXECUTABLE STATEMENT  BESYNU
15773C
15774      S1=0.0
15775      S2=0.0
15776      CK=0.0
15777C
15778      AK = R1MACH(3)
15779      TOL = MAX(AK,1.0E-15)
15780      IF (X.LE.0.0E0) GO TO 270
15781      IF (FNU.LT.0.0E0) GO TO 280
15782      IF (N.LT.1) GO TO 290
15783      RX = 2.0E0/X
15784      INU = INT(FNU+0.5E0)
15785      DNU = FNU - INU
15786      IF (ABS(DNU).EQ.0.5E0) GO TO 260
15787      DNU2 = 0.0E0
15788      IF (ABS(DNU).LT.TOL) GO TO 10
15789      DNU2 = DNU*DNU
15790   10 CONTINUE
15791      IF (X.GT.X1) GO TO 120
15792C
15793C     SERIES FOR X.LE.X1
15794C
15795      A1 = 1.0E0 - DNU
15796      A2 = 1.0E0 + DNU
15797      T1 = 1.0E0/REAL(DGAMMA(DBLE(A1)))
15798      T2 = 1.0E0/REAL(DGAMMA(DBLE(A2)))
15799      IF (ABS(DNU).GT.0.1E0) GO TO 40
15800C     SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
15801      S = CC(1)
15802      AK = 1.0E0
15803      DO 20 K=2,8
15804        AK = AK*DNU2
15805        TM = CC(K)*AK
15806        S = S + TM
15807        IF (ABS(TM).LT.TOL) GO TO 30
15808   20 CONTINUE
15809   30 G1 = -(S+S)
15810      GO TO 50
15811   40 CONTINUE
15812      G1 = (T1-T2)/DNU
15813   50 CONTINUE
15814      G2 = T1 + T2
15815      SMU = 1.0E0
15816      FC = 1.0E0/PI
15817      FLRX = LOG(RX)
15818      FMU = DNU*FLRX
15819      TM = 0.0E0
15820      IF (DNU.EQ.0.0E0) GO TO 60
15821      TM = SIN(DNU*HPI)/DNU
15822      TM = (DNU+DNU)*TM*TM
15823      FC = DNU/SIN(DNU*PI)
15824      IF (FMU.NE.0.0E0) SMU = SINH(FMU)/FMU
15825   60 CONTINUE
15826      F = FC*(G1*COSH(FMU)+G2*FLRX*SMU)
15827      FX = EXP(FMU)
15828      P = FC*T1*FX
15829      Q = FC*T2/FX
15830      G = F + TM*Q
15831      AK = 1.0E0
15832      CK = 1.0E0
15833      BK = 1.0E0
15834      S1 = G
15835      S2 = P
15836      IF (INU.GT.0 .OR. N.GT.1) GO TO 90
15837      IF (X.LT.TOL) GO TO 80
15838      CX = X*X*0.25E0
15839   70 CONTINUE
15840      F = (AK*F+P+Q)/(BK-DNU2)
15841      P = P/(AK-DNU)
15842      Q = Q/(AK+DNU)
15843      G = F + TM*Q
15844      CK = -CK*CX/AK
15845      T1 = CK*G
15846      S1 = S1 + T1
15847      BK = BK + AK + AK + 1.0E0
15848      AK = AK + 1.0E0
15849      S = ABS(T1)/(1.0E0+ABS(S1))
15850      IF (S.GT.TOL) GO TO 70
15851   80 CONTINUE
15852      Y(1) = -S1
15853      RETURN
15854   90 CONTINUE
15855      IF (X.LT.TOL) GO TO 110
15856      CX = X*X*0.25E0
15857  100 CONTINUE
15858      F = (AK*F+P+Q)/(BK-DNU2)
15859      P = P/(AK-DNU)
15860      Q = Q/(AK+DNU)
15861      G = F + TM*Q
15862      CK = -CK*CX/AK
15863      T1 = CK*G
15864      S1 = S1 + T1
15865      T2 = CK*(P-AK*G)
15866      S2 = S2 + T2
15867      BK = BK + AK + AK + 1.0E0
15868      AK = AK + 1.0E0
15869      S = ABS(T1)/(1.0E0+ABS(S1)) + ABS(T2)/(1.0E0+ABS(S2))
15870      IF (S.GT.TOL) GO TO 100
15871  110 CONTINUE
15872      S2 = -S2*RX
15873      S1 = -S1
15874      GO TO 160
15875  120 CONTINUE
15876      COEF = RTHPI/SQRT(X)
15877      IF (X.GT.X2) GO TO 210
15878C
15879C     MILLER ALGORITHM FOR X1.LT.X.LE.X2
15880C
15881      ETEST = COS(PI*DNU)/(PI*X*TOL)
15882      FKS = 1.0E0
15883      FHS = 0.25E0
15884      FK = 0.0E0
15885      RCK = 2.0E0
15886      CCK = X + X
15887      RP1 = 0.0E0
15888      CP1 = 0.0E0
15889      RP2 = 1.0E0
15890      CP2 = 0.0E0
15891      K = 0
15892  130 CONTINUE
15893      K = K + 1
15894      FK = FK + 1.0E0
15895      AK = (FHS-DNU2)/(FKS+FK)
15896      PT = FK + 1.0E0
15897      RBK = RCK/PT
15898      CBK = CCK/PT
15899      RPT = RP2
15900      CPT = CP2
15901      RP2 = RBK*RPT - CBK*CPT - AK*RP1
15902      CP2 = CBK*RPT + RBK*CPT - AK*CP1
15903      RP1 = RPT
15904      CP1 = CPT
15905      RB(K) = RBK
15906      CB(K) = CBK
15907      A(K) = AK
15908      RCK = RCK + 2.0E0
15909      FKS = FKS + FK + FK + 1.0E0
15910      FHS = FHS + FK + FK
15911      PT = MAX(ABS(RP1),ABS(CP1))
15912      FC = (RP1/PT)**2 + (CP1/PT)**2
15913      PT = PT*SQRT(FC)*FK
15914      IF (ETEST.GT.PT) GO TO 130
15915      KK = K
15916      RS = 1.0E0
15917      CS = 0.0E0
15918      RP1 = 0.0E0
15919      CP1 = 0.0E0
15920      RP2 = 1.0E0
15921      CP2 = 0.0E0
15922      DO 140 I=1,K
15923        RPT = RP2
15924        CPT = CP2
15925        RP2 = (RB(KK)*RPT-CB(KK)*CPT-RP1)/A(KK)
15926        CP2 = (CB(KK)*RPT+RB(KK)*CPT-CP1)/A(KK)
15927        RP1 = RPT
15928        CP1 = CPT
15929        RS = RS + RP2
15930        CS = CS + CP2
15931        KK = KK - 1
15932  140 CONTINUE
15933      PT = MAX(ABS(RS),ABS(CS))
15934      FC = (RS/PT)**2 + (CS/PT)**2
15935      PT = PT*SQRT(FC)
15936      RS1 = (RP2*(RS/PT)+CP2*(CS/PT))/PT
15937      CS1 = (CP2*(RS/PT)-RP2*(CS/PT))/PT
15938      FC = HPI*(DNU-0.5E0) - X
15939      P = COS(FC)
15940      Q = SIN(FC)
15941      S1 = (CS1*Q-RS1*P)*COEF
15942      IF (INU.GT.0 .OR. N.GT.1) GO TO 150
15943      Y(1) = S1
15944      RETURN
15945  150 CONTINUE
15946      PT = MAX(ABS(RP2),ABS(CP2))
15947      FC = (RP2/PT)**2 + (CP2/PT)**2
15948      PT = PT*SQRT(FC)
15949      RPT = DNU + 0.5E0 - (RP1*(RP2/PT)+CP1*(CP2/PT))/PT
15950      CPT = X - (CP1*(RP2/PT)-RP1*(CP2/PT))/PT
15951      CS2 = CS1*CPT - RS1*RPT
15952      RS2 = RPT*CS1 + RS1*CPT
15953      S2 = (RS2*Q+CS2*P)*COEF/X
15954C
15955C     FORWARD RECURSION ON THE THREE TERM RECURSION RELATION
15956C
15957  160 CONTINUE
15958      CK = (DNU+DNU+2.0E0)/X
15959      IF (N.EQ.1) INU = INU - 1
15960      IF (INU.GT.0) GO TO 170
15961      IF (N.GT.1) GO TO 190
15962      S1 = S2
15963      GO TO 190
15964  170 CONTINUE
15965      DO 180 I=1,INU
15966        ST = S2
15967        S2 = CK*S2 - S1
15968        S1 = ST
15969        CK = CK + RX
15970  180 CONTINUE
15971      IF (N.EQ.1) S1 = S2
15972  190 CONTINUE
15973      Y(1) = S1
15974      IF (N.EQ.1) RETURN
15975      Y(2) = S2
15976      IF (N.EQ.2) RETURN
15977      DO 200 I=3,N
15978        Y(I) = CK*Y(I-1) - Y(I-2)
15979        CK = CK + RX
15980  200 CONTINUE
15981      RETURN
15982C
15983C     ASYMPTOTIC EXPANSION FOR LARGE X, X.GT.X2
15984C
15985  210 CONTINUE
15986      NN = 2
15987      IF (INU.EQ.0 .AND. N.EQ.1) NN = 1
15988      DNU2 = DNU + DNU
15989      FMU = 0.0E0
15990      IF (ABS(DNU2).LT.TOL) GO TO 220
15991      FMU = DNU2*DNU2
15992  220 CONTINUE
15993      ARG = X - HPI*(DNU+0.5E0)
15994      SA = SIN(ARG)
15995      SB = COS(ARG)
15996      ETX = 8.0E0*X
15997      DO 250 K=1,NN
15998        S1 = S2
15999        T2 = (FMU-1.0E0)/ETX
16000        SS = T2
16001        RELB = TOL*ABS(T2)
16002        T1 = ETX
16003        S = 1.0E0
16004        FN = 1.0E0
16005        AK = 0.0E0
16006        DO 230 J=1,13
16007          T1 = T1 + ETX
16008          AK = AK + 8.0E0
16009          FN = FN + AK
16010          T2 = -T2*(FMU-FN)/T1
16011          S = S + T2
16012          T1 = T1 + ETX
16013          AK = AK + 8.0E0
16014          FN = FN + AK
16015          T2 = T2*(FMU-FN)/T1
16016          SS = SS + T2
16017          IF (ABS(T2).LE.RELB) GO TO 240
16018  230   CONTINUE
16019  240   S2 = COEF*(S*SA+SS*SB)
16020        FMU = FMU + 8.0E0*DNU + 4.0E0
16021        TB = SA
16022        SA = -SB
16023        SB = TB
16024  250 CONTINUE
16025      IF (NN.GT.1) GO TO 160
16026      S1 = S2
16027      GO TO 190
16028C
16029C     FNU=HALF ODD INTEGER CASE
16030C
16031  260 CONTINUE
16032      COEF = RTHPI/SQRT(X)
16033      S1 = COEF*SIN(X)
16034      S2 = -COEF*COS(X)
16035      GO TO 160
16036C
16037C
16038  270 CONTINUE
16039      WRITE(ICOUT,271)
16040  271 FORMAT('**** ERORR FROM BESYNU, X IS NOT POSITIVE.')
16041      CALL DPWRST('XXX','BUG ')
16042      RETURN
16043  280 CONTINUE
16044      WRITE(ICOUT,281)
16045  281 FORMAT('***** ERORR FROM BESYNU, THE ORDER FNU IS NEGATIVE. ***')
16046      CALL DPWRST('XXX','BUG ')
16047      RETURN
16048 290  CONTINUE
16049      WRITE(ICOUT,291)
16050  291 FORMAT('***** ERORR FROM BESYNU, N IS LESS THAN ONE.. ***')
16051      CALL DPWRST('XXX','BUG ')
16052      RETURN
16053      END
16054      FUNCTION BESY0DP (X)
16055CCCCC RENAME TO AVOID CONFLICT WITH INTRINSIC BESY0 FUNCTION
16056CCCCC FUNCTION BESY0 (X)
16057C***BEGIN PROLOGUE  BESY0
16058C***PURPOSE  Compute the Bessel function of the second kind of order
16059C            zero.
16060C***LIBRARY   SLATEC (FNLIB)
16061C***CATEGORY  C10A1
16062C***TYPE      SINGLE PRECISION (BESY0-S, DBESY0-D)
16063C***KEYWORDS  BESSEL FUNCTION, FNLIB, ORDER ZERO, SECOND KIND,
16064C             SPECIAL FUNCTIONS
16065C***AUTHOR  Fullerton, W., (LANL)
16066C***DESCRIPTION
16067C
16068C BESY0(X) calculates the Bessel function of the second kind
16069C of order zero for real argument X.
16070C
16071C Series for BY0        on the interval  0.          to  1.60000D+01
16072C                                        with weighted error   1.20E-17
16073C                                         log weighted error  16.92
16074C                               significant figures required  16.15
16075C                                    decimal places required  17.48
16076C
16077C Series for BM0        on the interval  0.          to  6.25000D-02
16078C                                        with weighted error   4.98E-17
16079C                                         log weighted error  16.30
16080C                               significant figures required  14.97
16081C                                    decimal places required  16.96
16082C
16083C Series for BTH0       on the interval  0.          to  6.25000D-02
16084C                                        with weighted error   3.67E-17
16085C                                         log weighted error  16.44
16086C                               significant figures required  15.53
16087C                                    decimal places required  17.13
16088C
16089C***REFERENCES  (NONE)
16090C***ROUTINES CALLED  BESJ0, CSEVL, INITS, R1MACH, XERMSG
16091C***REVISION HISTORY  (YYMMDD)
16092C   770401  DATE WRITTEN
16093C   890531  Changed all specific intrinsics to generic.  (WRB)
16094C   890531  REVISION DATE from Version 3.2
16095C   891214  Prologue converted to Version 4.0 format.  (BAB)
16096C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
16097C   900326  Removed duplicate information from DESCRIPTION section.
16098C           (WRB)
16099C***END PROLOGUE  BESY0
16100C
16101C-----COMMON----------------------------------------------------------
16102C
16103      INCLUDE 'DPCOMC.INC'
16104      INCLUDE 'DPCOP2.INC'
16105C
16106      EXTERNAL BESJ0DP, CSEVL
16107C
16108      DIMENSION BY0CS(13), BM0CS(21), BTH0CS(24)
16109      LOGICAL FIRST
16110      SAVE BY0CS, BM0CS, BTH0CS, TWODPI, PI4,
16111     1 NTY0, NTM0, NTTH0, XSML, XMAX, FIRST
16112      DATA BY0CS( 1) /   -.0112778393 92865573E0 /
16113      DATA BY0CS( 2) /   -.1283452375 6042035E0 /
16114      DATA BY0CS( 3) /   -.1043788479 9794249E0 /
16115      DATA BY0CS( 4) /    .0236627491 83969695E0 /
16116      DATA BY0CS( 5) /   -.0020903916 47700486E0 /
16117      DATA BY0CS( 6) /    .0001039754 53939057E0 /
16118      DATA BY0CS( 7) /   -.0000033697 47162423E0 /
16119      DATA BY0CS( 8) /    .0000000772 93842676E0 /
16120      DATA BY0CS( 9) /   -.0000000013 24976772E0 /
16121      DATA BY0CS(10) /    .0000000000 17648232E0 /
16122      DATA BY0CS(11) /   -.0000000000 00188105E0 /
16123      DATA BY0CS(12) /    .0000000000 00001641E0 /
16124      DATA BY0CS(13) /   -.0000000000 00000011E0 /
16125      DATA BM0CS( 1) /    .0928496163 7381644E0 /
16126      DATA BM0CS( 2) /   -.0014298770 7403484E0 /
16127      DATA BM0CS( 3) /    .0000283057 9271257E0 /
16128      DATA BM0CS( 4) /   -.0000014330 0611424E0 /
16129      DATA BM0CS( 5) /    .0000001202 8628046E0 /
16130      DATA BM0CS( 6) /   -.0000000139 7113013E0 /
16131      DATA BM0CS( 7) /    .0000000020 4076188E0 /
16132      DATA BM0CS( 8) /   -.0000000003 5399669E0 /
16133      DATA BM0CS( 9) /    .0000000000 7024759E0 /
16134      DATA BM0CS(10) /   -.0000000000 1554107E0 /
16135      DATA BM0CS(11) /    .0000000000 0376226E0 /
16136      DATA BM0CS(12) /   -.0000000000 0098282E0 /
16137      DATA BM0CS(13) /    .0000000000 0027408E0 /
16138      DATA BM0CS(14) /   -.0000000000 0008091E0 /
16139      DATA BM0CS(15) /    .0000000000 0002511E0 /
16140      DATA BM0CS(16) /   -.0000000000 0000814E0 /
16141      DATA BM0CS(17) /    .0000000000 0000275E0 /
16142      DATA BM0CS(18) /   -.0000000000 0000096E0 /
16143      DATA BM0CS(19) /    .0000000000 0000034E0 /
16144      DATA BM0CS(20) /   -.0000000000 0000012E0 /
16145      DATA BM0CS(21) /    .0000000000 0000004E0 /
16146      DATA BTH0CS( 1) /   -.2463916377 4300119E0 /
16147      DATA BTH0CS( 2) /    .0017370983 07508963E0 /
16148      DATA BTH0CS( 3) /   -.0000621836 33402968E0 /
16149      DATA BTH0CS( 4) /    .0000043680 50165742E0 /
16150      DATA BTH0CS( 5) /   -.0000004560 93019869E0 /
16151      DATA BTH0CS( 6) /    .0000000621 97400101E0 /
16152      DATA BTH0CS( 7) /   -.0000000103 00442889E0 /
16153      DATA BTH0CS( 8) /    .0000000019 79526776E0 /
16154      DATA BTH0CS( 9) /   -.0000000004 28198396E0 /
16155      DATA BTH0CS(10) /    .0000000001 02035840E0 /
16156      DATA BTH0CS(11) /   -.0000000000 26363898E0 /
16157      DATA BTH0CS(12) /    .0000000000 07297935E0 /
16158      DATA BTH0CS(13) /   -.0000000000 02144188E0 /
16159      DATA BTH0CS(14) /    .0000000000 00663693E0 /
16160      DATA BTH0CS(15) /   -.0000000000 00215126E0 /
16161      DATA BTH0CS(16) /    .0000000000 00072659E0 /
16162      DATA BTH0CS(17) /   -.0000000000 00025465E0 /
16163      DATA BTH0CS(18) /    .0000000000 00009229E0 /
16164      DATA BTH0CS(19) /   -.0000000000 00003448E0 /
16165      DATA BTH0CS(20) /    .0000000000 00001325E0 /
16166      DATA BTH0CS(21) /   -.0000000000 00000522E0 /
16167      DATA BTH0CS(22) /    .0000000000 00000210E0 /
16168      DATA BTH0CS(23) /   -.0000000000 00000087E0 /
16169      DATA BTH0CS(24) /    .0000000000 00000036E0 /
16170      DATA TWODPI / 0.6366197723 6758134E0 /
16171      DATA PI4 / 0.7853981633 9744831E0 /
16172      DATA FIRST /.TRUE./
16173C***FIRST EXECUTABLE STATEMENT  BESY0
16174C
16175      BESY0DP = CPUMIN
16176C
16177      IF (FIRST) THEN
16178         NTY0 = INITS (BY0CS, 13, 0.1*R1MACH(3))
16179         NTM0 = INITS (BM0CS, 21, 0.1*R1MACH(3))
16180         NTTH0 = INITS (BTH0CS, 24, 0.1*R1MACH(3))
16181C
16182         XSML = SQRT (4.0*R1MACH(3))
16183         XMAX = 1.0/R1MACH(4)
16184      ENDIF
16185      FIRST = .FALSE.
16186C
16187      IF (X .LE. 0.) THEN
16188        WRITE(ICOUT,1)
16189    1   FORMAT('***** ERORR FROM BESY0DP, X ZERO OR NEGATIVE.  *******')
16190        CALL DPWRST('XXX','BUG ')
16191        BESY0DP=0.0
16192        RETURN
16193      ENDIF
16194      IF (X.GT.4.0) GO TO 20
16195C
16196      Y = 0.
16197      IF (X.GT.XSML) Y = X*X
16198      BESY0DP = TWODPI*LOG(0.5*X)*BESJ0DP(X) + .375 + CSEVL (.125*Y-1.,
16199     1  BY0CS, NTY0)
16200      RETURN
16201C
16202 20   CONTINUE
16203      IF (X.GT.XMAX) THEN
16204        WRITE(ICOUT,2)
16205        CALL DPWRST('XXX','BUG ')
16206        BESY0 = 0.0
16207        RETURN
16208      ENDIF
16209    2 FORMAT('***** ERORR FROM BESY0DP, NO PRECISION BECAUSE THE ',
16210     1       'VALUE OF X IS TOO BIG.  ****')
16211C
16212      Z = 32.0/X**2 - 1.0
16213      AMPL = (0.75 + CSEVL (Z, BM0CS, NTM0)) / SQRT(X)
16214      THETA = X - PI4 + CSEVL (Z, BTH0CS, NTTH0) / X
16215      BESY0DP = AMPL * SIN (THETA)
16216C
16217      RETURN
16218      END
16219      FUNCTION BESY1DP (X)
16220CCCCC RENAME TO AVOID CONFLICT WITH INTRINSIC BESY1 FUNCTION
16221CCCCC FUNCTION BESY1 (X)
16222C***BEGIN PROLOGUE  BESY1
16223C***PURPOSE  Compute the Bessel function of the second kind of order
16224C            one.
16225C***LIBRARY   SLATEC (FNLIB)
16226C***CATEGORY  C10A1
16227C***TYPE      SINGLE PRECISION (BESY1-S, DBESY1-D)
16228C***KEYWORDS  BESSEL FUNCTION, FNLIB, ORDER ONE, SECOND KIND,
16229C             SPECIAL FUNCTIONS
16230C***AUTHOR  Fullerton, W., (LANL)
16231C***DESCRIPTION
16232C
16233C BESY1(X) calculates the Bessel function of the second kind of
16234C order one for real argument X.
16235C
16236C Series for BY1        on the interval  0.          to  1.60000D+01
16237C                                        with weighted error   1.87E-18
16238C                                         log weighted error  17.73
16239C                               significant figures required  17.83
16240C                                    decimal places required  18.30
16241C
16242C Series for BM1        on the interval  0.          to  6.25000D-02
16243C                                        with weighted error   5.61E-17
16244C                                         log weighted error  16.25
16245C                               significant figures required  14.97
16246C                                    decimal places required  16.91
16247C
16248C Series for BTH1       on the interval  0.          to  6.25000D-02
16249C                                        with weighted error   4.10E-17
16250C                                         log weighted error  16.39
16251C                               significant figures required  15.96
16252C                                    decimal places required  17.08
16253C
16254C***REFERENCES  (NONE)
16255C***ROUTINES CALLED  BESJ1, CSEVL, INITS, R1MACH, XERMSG
16256C***REVISION HISTORY  (YYMMDD)
16257C   770401  DATE WRITTEN
16258C   890531  Changed all specific intrinsics to generic.  (WRB)
16259C   890531  REVISION DATE from Version 3.2
16260C   891214  Prologue converted to Version 4.0 format.  (BAB)
16261C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
16262C   900326  Removed duplicate information from DESCRIPTION section.
16263C           (WRB)
16264C***END PROLOGUE  BESY1
16265C
16266C-----COMMON----------------------------------------------------------
16267C
16268      INCLUDE 'DPCOMC.INC'
16269      INCLUDE 'DPCOP2.INC'
16270C
16271      EXTERNAL BESJ1DP, CSEVL
16272C
16273      DIMENSION BY1CS(14), BM1CS(21), BTH1CS(24)
16274      LOGICAL FIRST
16275      SAVE BY1CS, BM1CS, BTH1CS, TWODPI, PI4,
16276     1 NTY1, NTM1, NTTH1, XMIN, XSML, XMAX, FIRST
16277      DATA BY1CS( 1) /    .0320804710 0611908629E0 /
16278      DATA BY1CS( 2) /   1.2627078974 33500450E0 /
16279      DATA BY1CS( 3) /    .0064999618 9992317500E0 /
16280      DATA BY1CS( 4) /   -.0893616452 8860504117E0 /
16281      DATA BY1CS( 5) /    .0132508812 2175709545E0 /
16282      DATA BY1CS( 6) /   -.0008979059 1196483523E0 /
16283      DATA BY1CS( 7) /    .0000364736 1487958306E0 /
16284      DATA BY1CS( 8) /   -.0000010013 7438166600E0 /
16285      DATA BY1CS( 9) /    .0000000199 4539657390E0 /
16286      DATA BY1CS(10) /   -.0000000003 0230656018E0 /
16287      DATA BY1CS(11) /    .0000000000 0360987815E0 /
16288      DATA BY1CS(12) /   -.0000000000 0003487488E0 /
16289      DATA BY1CS(13) /    .0000000000 0000027838E0 /
16290      DATA BY1CS(14) /   -.0000000000 0000000186E0 /
16291      DATA BM1CS( 1) /    .1047362510 931285E0 /
16292      DATA BM1CS( 2) /    .0044244389 3702345E0 /
16293      DATA BM1CS( 3) /   -.0000566163 9504035E0 /
16294      DATA BM1CS( 4) /    .0000023134 9417339E0 /
16295      DATA BM1CS( 5) /   -.0000001737 7182007E0 /
16296      DATA BM1CS( 6) /    .0000000189 3209930E0 /
16297      DATA BM1CS( 7) /   -.0000000026 5416023E0 /
16298      DATA BM1CS( 8) /    .0000000004 4740209E0 /
16299      DATA BM1CS( 9) /   -.0000000000 8691795E0 /
16300      DATA BM1CS(10) /    .0000000000 1891492E0 /
16301      DATA BM1CS(11) /   -.0000000000 0451884E0 /
16302      DATA BM1CS(12) /    .0000000000 0116765E0 /
16303      DATA BM1CS(13) /   -.0000000000 0032265E0 /
16304      DATA BM1CS(14) /    .0000000000 0009450E0 /
16305      DATA BM1CS(15) /   -.0000000000 0002913E0 /
16306      DATA BM1CS(16) /    .0000000000 0000939E0 /
16307      DATA BM1CS(17) /   -.0000000000 0000315E0 /
16308      DATA BM1CS(18) /    .0000000000 0000109E0 /
16309      DATA BM1CS(19) /   -.0000000000 0000039E0 /
16310      DATA BM1CS(20) /    .0000000000 0000014E0 /
16311      DATA BM1CS(21) /   -.0000000000 0000005E0 /
16312      DATA BTH1CS( 1) /    .7406014102 6313850E0 /
16313      DATA BTH1CS( 2) /   -.0045717556 59637690E0 /
16314      DATA BTH1CS( 3) /    .0001198185 10964326E0 /
16315      DATA BTH1CS( 4) /   -.0000069645 61891648E0 /
16316      DATA BTH1CS( 5) /    .0000006554 95621447E0 /
16317      DATA BTH1CS( 6) /   -.0000000840 66228945E0 /
16318      DATA BTH1CS( 7) /    .0000000133 76886564E0 /
16319      DATA BTH1CS( 8) /   -.0000000024 99565654E0 /
16320      DATA BTH1CS( 9) /    .0000000005 29495100E0 /
16321      DATA BTH1CS(10) /   -.0000000001 24135944E0 /
16322      DATA BTH1CS(11) /    .0000000000 31656485E0 /
16323      DATA BTH1CS(12) /   -.0000000000 08668640E0 /
16324      DATA BTH1CS(13) /    .0000000000 02523758E0 /
16325      DATA BTH1CS(14) /   -.0000000000 00775085E0 /
16326      DATA BTH1CS(15) /    .0000000000 00249527E0 /
16327      DATA BTH1CS(16) /   -.0000000000 00083773E0 /
16328      DATA BTH1CS(17) /    .0000000000 00029205E0 /
16329      DATA BTH1CS(18) /   -.0000000000 00010534E0 /
16330      DATA BTH1CS(19) /    .0000000000 00003919E0 /
16331      DATA BTH1CS(20) /   -.0000000000 00001500E0 /
16332      DATA BTH1CS(21) /    .0000000000 00000589E0 /
16333      DATA BTH1CS(22) /   -.0000000000 00000237E0 /
16334      DATA BTH1CS(23) /    .0000000000 00000097E0 /
16335      DATA BTH1CS(24) /   -.0000000000 00000040E0 /
16336      DATA TWODPI / 0.6366197723 6758134E0 /
16337      DATA PI4 / 0.7853981633 9744831E0 /
16338      DATA FIRST /.TRUE./
16339C***FIRST EXECUTABLE STATEMENT  BESY1
16340      IF (FIRST) THEN
16341         NTY1 = INITS (BY1CS, 14, 0.1*R1MACH(3))
16342         NTM1 = INITS (BM1CS, 21, 0.1*R1MACH(3))
16343         NTTH1 = INITS (BTH1CS, 24, 0.1*R1MACH(3))
16344C
16345         XMIN = 1.571*EXP ( MAX(LOG(R1MACH(1)), -LOG(R1MACH(2)))+.01)
16346         XSML = SQRT (4.0*R1MACH(3))
16347         XMAX = 1.0/R1MACH(4)
16348      ENDIF
16349      FIRST = .FALSE.
16350C
16351      IF (X .LE. 0.) THEN
16352        WRITE(ICOUT,1)
16353    1   FORMAT('***** ERORR FROM BESY1DP, X ZERO OR NEGATIVE.  *******')
16354        CALL DPWRST('XXX','BUG ')
16355        BESY1DP=0.0
16356        RETURN
16357      ENDIF
16358      IF (X.GT.4.0) GO TO 20
16359C
16360      IF (X .LE. XMIN) THEN
16361        WRITE(ICOUT,2)
16362        CALL DPWRST('XXX','BUG ')
16363      ENDIF
16364    2 FORMAT('***** WARNING FROM BESY1DP, UNDERFLOW BECAUSE THE ',
16365     1       'VALUE OF X IS SO SMALL.  ****')
16366      Y = 0.
16367      IF (X.GT.XSML) Y = X*X
16368      BESY1DP = TWODPI*LOG(0.5*X)*BESJ1DP(X) +
16369     1  (0.5 + CSEVL (.125*Y-1., BY1CS, NTY1))/X
16370      RETURN
16371C
16372 20   CONTINUE
16373      IF (X.GT.XMAX) THEN
16374        WRITE(ICOUT,3)
16375        CALL DPWRST('XXX','BUG ')
16376        BESY1DP = 0.0
16377        RETURN
16378      ENDIF
16379    3 FORMAT('***** ERORR FROM BESY1DP, NO PRECISION BECAUSE THE ',
16380     1       'VALUE OF X IS TOO BIG.  ****')
16381C
16382      Z = 32.0/X**2 - 1.0
16383      AMPL = (0.75 + CSEVL (Z, BM1CS, NTM1)) / SQRT(X)
16384      THETA = X - 3.0*PI4 + CSEVL (Z, BTH1CS, NTTH1) / X
16385      BESY1DP = AMPL * SIN (THETA)
16386C
16387      RETURN
16388      END
16389      SUBROUTINE BESYCF(ZZ,AA,NMAX,BY)
16390C THIS ROUTINE CALCULATES BESSEL FUNCTIONS Y OF COMPLEX ARGUMENT AND
16391C REAL ORDER.  ARGUMENTS ARE AS FOR ROUTINE BESJCF.
16392C Y*S ARE CALCULATED BY FORWARD RECURSION, USING EQUATION 9.1.27 OF
16393C REFERENCE (1) LISTED IN BESJCF.  TO START THE RECURSION, FUNCTION
16394C VALUES OF ORDERS A AND A+1 ARE CALCULATED IF A.LE.0, WHILE ORDERS A
16395C AND A-1 ARE CALCULATED IF A.GT.0.
16396C NOTE  IF ANY Y-VALUE IS SO BIG THAT ITS CALCULATION WOULD CAUSE OVER-
16397C FLOW, IT (AND ALL HIGHER ORDERS) ARE SET TO ZERO.
16398C
16399C-----COMMON----------------------------------------------------------
16400C
16401      INCLUDE 'DPCOMC.INC'
16402      INCLUDE 'DPCOP2.INC'
16403C
16404      COMPLEX BY(*),BB,CC,DD,EE,FF,GG,HH,PP,QQ,SS,YA(21),YA1(21),Z,ZINV,
16405     1 ZZ,ZDUMMY
16406      DOUBLE PRECISION PIDBL
16407C-----------------------------------------------------------------------
16408C
16409C  MACHINE DEPENDENT CONSTANTS.
16410C  ---------------------------
16411C
16412      SAVE ISAVE,PI,PINV,PIDBL,GADOL,EXPARG,DYOUK,DYOUKH,NTERM,LOU
16413      DATA ISAVE /1/
16414C
16415C Definition of real and imaginary parts of complex number,
16416C standard Fortran and will work on Convex with -r8 -i8.
16417      REALP(ZDUMMY) = REAL(ZDUMMY)
16418      AIMAGP(ZDUMMY) = REAL((0,-1)*ZDUMMY)
16419C
16420      IF (ISAVE.GT.0) THEN
16421        ISAVE = 0
16422C PI AND 1/PI
16423        PI = 4.0*ATAN (1.0)
16424        PINV = 1.0 / PI
16425        PIDBL = 4.0D0 * ATAN (1.0D0)
16426C MACHINE-DEPENDENT CONSTANTS  LARGEST REAL NUMBER (APPROX), LIMIT ON
16427C ARGUMENT TO LIBRARY EXP ROUTINE, MACHINE ACCURACY, ITS SQUARE ROOT,
16428C AND LENGTH OF VECTORS YA1 AND YA, MINUS 1.  FOR ABS(Z).LE.3, 21 TERMS
16429C ARE SUFFICIENT FOR 14 SIGNIFICANT FIGURE (SEE REFERENCE LISTED BELOW).
16430        GADOL = R1MACH (2)
16431        EXPARG = LOG (GADOL)
16432        DYOUK = R1MACH (4)
16433        DYOUKH = SQRT (DYOUK)
16434        NTERM = 20
16435        LOU = I1MACH(2)
16436      ENDIF
16437C
16438C-----------------------------------------------------------------------
16439      Z=ZZ
16440      A=AA
16441      MAXP=NMAX+2
16442      Q=REALP(Z)
16443      R=ABS(AIMAGP(Z))
16444      E=Q*Q+R*R
16445      IF ((A. LE. - 0.5) .OR. (A .GT. 0.5) .OR. (MAXP .LT. 2) .OR.
16446     *   (E .EQ. 0.0) .OR. (R. GT. EXPARG)) GO TO 86
16447      F=SQRT(E)
16448      BIG=GADOL*MIN(.25,F/REAL(4*MAX(1,NMAX)))
16449C AVOID UNDERFLOW OR OVERFLOW IN COMPLEX DIVIDE
16450      F=1./F
16451      ZINV=2.*F/(Z*F)
16452C Following statement rewritten to make compilation possible
16453C on Convex with -r8 -i8.
16454C     IF(MIN(R,REAL(MAXP)).GT.3.) GO TO 20
16455      IF(R.GT.3.0 .AND. MAXP.GT.3) GO TO 20
16456      IF(E.GE.196.) GO TO 30
16457      IF(E.GE.9.) GO TO 20
16458C FOR SMALL Z, Y IS CALCULATED VIA EQUATIONS 2.1 OR N. M. TEMME, ON THE
16459C NUMERICAL EVALUATION OF THE ORDINARY BESSEL FUNCTION OF THE SECOND
16460C KIND, REPORT TW152/75, STICHTING MATHEMATISCH CENTRUM, AMSTERDAM, 9/75
16461      BB=.5*Z
16462      DD=-LOG(BB)
16463      EE=A*DD
16464      C=PINV
16465      IF(ABS(A).GT.DYOUKH) C=A/SIN(PI*A)
16466      SS = (1.0, 0.0)
16467      IF ((REALP (EE) ** 2 + AIMAGP (EE) ** 2) .GT. DYOUK)
16468     *   SS =  CMPLX (0.0, - 1.0) * SIN (CMPLX (0.0, 1.0) * EE) / EE
16469      EE=EXP(EE)
16470      CALL RECIPG(A,P,Q,G)
16471      GG=G*EE
16472      EE=.5*(EE+1./EE)
16473      FF=(2.*C)*(P*EE+Q*SS*DD)
16474      E=A*A
16475      PP=C*GG
16476      QQ=PINV/GG
16477      C=.5*PI*A
16478      R=1.
16479      IF(ABS(C).GT.DYOUKH) R=SIN(C)/C
16480      R=PI*C*R*R
16481      CC = (1.0, 0.0)
16482      DD=-BB*BB
16483      GG=FF+R*QQ
16484      C=0.
16485      IF(A.NE..5) C=DCOS(PIDBL*DBLE(A))
16486      IF(C.LE..5) GG=(PP-QQ*C)/A
16487      YA(1)=GG
16488C IF A.LE.0, CALCULATE YA1=YSUB(A+1) AS IN THE REFERENCE
16489      YA1(1)=PP
16490C IF A.GT.0, CALCULATE YA1=YSUB(A-1)=SUM(N=0 TO INFINITY) OF
16491C CN*(N*GN-QN*COSPI*A), WHICH CAN BE DERIVED BY SUBSTITUTING 2.2 AND 2.3
16492C OF THE REFERENCE INTO 1.3.
16493      IF(A.GT.0.) YA1(1)=-C*QQ
16494      TEST =DYOUK*MAX(ABS(REALP(YA(1))),ABS(AIMAGP(YA(1))))
16495      DO 10 N=1,NTERM
16496      EN=N
16497      G=1./(EN*EN-E)
16498      IF(A.GT.0.) GO TO 6
16499C RECUR DIRECTLY ON GG AND HH WITHOUT USING FF AS IN THE ORIGINAL PROG.
16500      HH=-G*(EN*(EN*GG+C*QQ)-A*PP)
16501      GO TO 8
16502    6 CONTINUE
16503      HH= G*(EN*(EN*GG+PP)+A*C*QQ)
16504    8 CONTINUE
16505      GG=G*(EN*GG+PP+C*QQ)
16506      CC=CC*DD/EN
16507      YA(N+1)=CC*GG
16508      YA1(N+1)=CC*HH
16509      IF(MAX(ABS(REALP(YA(N+1))),ABS(AIMAGP(YA(N+1)))).LE.TEST)GOTO12
16510      PP=PP/(EN-A)
16511      QQ=QQ/(EN+A)
16512   10 CONTINUE
16513      RETURN
16514   12 N=N+1
16515      M=N+1
16516      GG = (0.0, 0.0)
16517      HH = (0.0, 0.0)
16518      DO 14 L=1,N
16519         ITEMP = M - L
16520         GG=GG+YA(ITEMP)
16521         HH=HH+YA1(ITEMP)
16522   14 CONTINUE
16523      BY(2)=-GG
16524      BY(1)=-HH*ZINV
16525      M=3
16526CCCCC IF(A) 40,40,60
16527      IF(A.LE.0.0)THEN
16528        GOTO40
16529      ELSE
16530        GOTO60
16531      ENDIF
16532C FOR MAG(Z) BETWEEN 3 AND 14, OR FOR ABS(IM(Z)).GT.3, CALCULATE Y VIA
16533C EQUATIONS 9.6.3 AND 9.6.5 OF REFERENCE 1 LISTED IN BESJCF
16534   20 CONTINUE
16535      CALL BESJCF(Z,A,NMAX,BY)
16536      C=-1.
16537      IF(AIMAGP(Z).LT.0.) C=1.
16538      CC=CMPLX(0.,C)
16539      DD=CC*Z
16540      CALL BESKCF(DD,A,1,YA1)
16541      C=.5*C*PI*A
16542      DD=2.*PINV*CMPLX(COS(C),SIN(C))
16543      BY(1)=CC*(DD*YA1(1)-BY(1))
16544      GG=YA1(2)
16545      BY(2)=-CC*BY(2)-DD*GG
16546      IF(MAXP.LE.2) GO TO 70
16547      HH=YA1(3)
16548      DD=CC*DD
16549      BY(3)=-CC*BY(3)-DD*HH
16550      IF(MAXP.EQ.3) GO TO 70
16551      ZINV=-CC*ZINV
16552C IN THIS LOOP, HH IS THE FUNCTION K (OF ARGUMENT IZ OR -IZ) AND CAN BE
16553C CALCULATED BY FORWARD RECURSION, SINCE THE REAL PART OF THE ARGUMENT
16554C IS NON-NEGATIVE
16555      DO 24 N=4,MAXP
16556        IF(MAX(ABS(REALP(HH)),ABS(AIMAGP(HH))).GT.BIG) GO TO 82
16557        FF=GG
16558        GG=HH
16559        DD=CC*DD
16560        HH=(ZINV*(A+REAL(N-3)))*GG+FF
16561        BY(N)=-CC*BY(N)-DD*HH
16562   24 CONTINUE
16563      GO TO 70
16564C FOR LARGE Z, USE PHASE-AMPLITUDE EQUATIONS 9.2.5 AND 9.2.6 OF REFER-
16565C ENCE 1 AS LISTED IN BESJCF
16566   30 CONTINUE
16567      BB=Z
16568      EE=ZINV
16569C Set FF and GG here to avoid Univac FTN compiler warnings
16570C that arise due to logic here and in 38-loop below.
16571      FF = (0.0,0.0)
16572      GG = (0.0,0.0)
16573      IF(REALP(Z).GE.0.) GO TO 32
16574      BB=-BB
16575      EE=-EE
16576      E=1.
16577      IF(AIMAGP(Z).LT.0.) E=-1.
16578      C=0.
16579      IF(A.NE..5) C=DCOS(PIDBL*DBLE(A))
16580      S=SIN(-E*A*PI)
16581      FF=CMPLX(C,S)
16582      GG=CMPLX(0.,2.*E*C)
16583   32 CONTINUE
16584      BB=BB-.5*PI*(A+.5)
16585      CC=COS(BB)
16586      SS=SIN(BB)
16587      DD=SQRT(PINV*EE)
16588      C=A
16589      DO 38 M=1,2
16590      CALL PHASMP(C,EE,0,PP,QQ)
16591      IF(REALP(Z).LT.0.) GO TO 34
16592C REAL(Z).GE.0, SO USE EQUATION 9.2.6
16593      ITEMP = 3 - M
16594      BY(ITEMP)=DD*(PP*SS+QQ*CC)
16595CCCCC IF(M-1) 36,36,38
16596      IF(M-1.LE.0)THEN
16597        GOTO36
16598      ELSE
16599        GOTO38
16600      ENDIF
16601C REAL(Z).LT.0, SO SUBSTITUTE 9.2.5 AND 9.2.6 INTO 9.1.36
16602   34 PP=PP*(FF*SS+GG*CC)
16603      QQ=QQ*(FF*CC-GG*SS)
16604      ITEMP = 3 - M
16605      BY(ITEMP)=DD*(PP+QQ)
16606      IF(M.EQ.2) GO TO 38
16607      FF=-FF
16608      GG=-GG
16609   36 IF(A.GT.0.) GO TO 37
16610      C=C+1.
16611      BB=-CC
16612      CC=SS
16613      SS=BB
16614      GO TO 38
16615   37 C=C-1.
16616      BB=-SS
16617      SS=CC
16618      CC=BB
16619   38 CONTINUE
16620      M=3
16621      IF(A.GT.0.) GO TO 60
16622   40 IF(MAXP.GE.3) BY(3)=BY(1)
16623      BY(1)=(A*ZINV)*BY(2)-BY(1)
16624      M=4
16625C CALCULATE Y*S BY FORWARD RECURSION, CHECKING FOR POSSIBLE OVERFLOW
16626   60 IF(M.GT.MAXP) GO TO 70
16627      DO 65 N=M,MAXP
16628      IF(MAX(ABS(REALP(BY(N-1))),ABS(AIMAGP(BY(N-1)))).GT.BIG) GO TO 82
16629      BY(N)=(ZINV*(A+REAL(N-3)))*BY(N-1)-BY(N-2)
16630   65 CONTINUE
16631   70 CONTINUE
16632      RETURN
16633   82 CONTINUE
16634      DO 83 L=N,MAXP
16635         BY(L) = (0.0, 0.0)
16636   83 CONTINUE
16637      GO TO 70
16638   86 CONTINUE
16639      WRITE (ICOUT, 88)NMAX
16640      CALL DPWRST('XXX','BUG ')
16641      WRITE (ICOUT, 89)A,Z
16642      CALL DPWRST('XXX','BUG ')
16643   88 FORMAT('***** ERROR (BESYCF) --- INVALID INPUT, NMAX = ', I6)
16644   89 FORMAT('      A = ', 1PE22.14,' Z = ',2(1PE22.14))
16645      RETURN
16646      END
16647      DOUBLE PRECISION FUNCTION betaln(a0,b0)
16648C-----------------------------------------------------------------------
16649C     EVALUATION OF THE LOGARITHM OF THE BETA FUNCTION
16650C-----------------------------------------------------------------------
16651C     E = 0.5*LN(2*PI)
16652C--------------------------
16653C     .. Scalar Arguments ..
16654      DOUBLE PRECISION a0,b0
16655C     ..
16656C     .. Local Scalars ..
16657      DOUBLE PRECISION a,b,c,e,h,u,v,w,z
16658      INTEGER i,n
16659C     ..
16660C     .. External Functions ..
16661      DOUBLE PRECISION algdiv,alnrel,bcorr,gamln,gsumln
16662      EXTERNAL algdiv,alnrel,bcorr,gamln,gsumln
16663C     ..
16664C     .. Intrinsic Functions ..
16665      INTRINSIC dlog,dmax1,dmin1
16666C     ..
16667C     .. Data statements ..
16668      DATA e/.918938533204673D0/
16669C     ..
16670C     .. Executable Statements ..
16671C--------------------------
16672      a = dmin1(a0,b0)
16673      b = dmax1(a0,b0)
16674      IF (a.GE.8.0D0) GO TO 100
16675      IF (a.GE.1.0D0) GO TO 20
16676C-----------------------------------------------------------------------
16677C                   PROCEDURE WHEN A .LT. 1
16678C-----------------------------------------------------------------------
16679      IF (b.GE.8.0D0) GO TO 10
16680      betaln = gamln(a) + (gamln(b)-gamln(a+b))
16681      RETURN
16682
16683   10 betaln = gamln(a) + algdiv(a,b)
16684      RETURN
16685C-----------------------------------------------------------------------
16686C                PROCEDURE WHEN 1 .LE. A .LT. 8
16687C-----------------------------------------------------------------------
16688   20 IF (a.GT.2.0D0) GO TO 40
16689      IF (b.GT.2.0D0) GO TO 30
16690      betaln = gamln(a) + gamln(b) - gsumln(a,b)
16691      RETURN
16692
16693   30 w = 0.0D0
16694      IF (b.LT.8.0D0) GO TO 60
16695      betaln = gamln(a) + algdiv(a,b)
16696      RETURN
16697C
16698C                REDUCTION OF A WHEN B .LE. 1000
16699C
16700   40 IF (b.GT.1000.0D0) GO TO 80
16701      n = int(a - 1.0D0)
16702      w = 1.0D0
16703      DO 50 i = 1,n
16704          a = a - 1.0D0
16705          h = a/b
16706          w = w* (h/ (1.0D0+h))
16707   50 CONTINUE
16708      w = dlog(w)
16709      IF (b.LT.8.0D0) GO TO 60
16710      betaln = w + gamln(a) + algdiv(a,b)
16711      RETURN
16712C
16713C                 REDUCTION OF B WHEN B .LT. 8
16714C
16715   60 n = int(b - 1.0D0)
16716      z = 1.0D0
16717      DO 70 i = 1,n
16718          b = b - 1.0D0
16719          z = z* (b/ (a+b))
16720   70 CONTINUE
16721      betaln = w + dlog(z) + (gamln(a)+ (gamln(b)-gsumln(a,b)))
16722      RETURN
16723C
16724C                REDUCTION OF A WHEN B .GT. 1000
16725C
16726   80 n = int(a - 1.0D0)
16727      w = 1.0D0
16728      DO 90 i = 1,n
16729          a = a - 1.0D0
16730          w = w* (a/ (1.0D0+a/b))
16731   90 CONTINUE
16732      betaln = (dlog(w)-n*dlog(b)) + (gamln(a)+algdiv(a,b))
16733      RETURN
16734C-----------------------------------------------------------------------
16735C                   PROCEDURE WHEN A .GE. 8
16736C-----------------------------------------------------------------------
16737  100 w = bcorr(a,b)
16738      h = a/b
16739      c = h/ (1.0D0+h)
16740      u = - (a-0.5D0)*dlog(c)
16741      v = b*alnrel(h)
16742      IF (u.LE.v) GO TO 110
16743      betaln = (((-0.5D0*dlog(b)+e)+w)-v) - u
16744      RETURN
16745
16746  110 betaln = (((-0.5D0*dlog(b)+e)+w)-u) - v
16747      RETURN
16748
16749      END
16750      SUBROUTINE BETCDF(X,ALPHA,BETA,CDF)
16751C
16752C     NOTE--ALGORITHM ADDED SEPTEMBER 1994 (ALAN)
16753C           USE DBETAI ROUTINE FROM SLATEC.  THIS USES THE
16754C           BOSTEN AND BATTISTE ALGORITHM.
16755C     WRITTEN BY--JAMES J. FILLIBEN
16756C                 STATISTICAL ENGINEERING DIVISION
16757C                 INFORMATION TECHNOLOGY LABORATORY
16758C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
16759C                 GAITHERSBURG, MD 20899-8980
16760C                 PHONE--301-921-3651
16761C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16762C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
16763C     LANGUAGE--ANSI FORTRAN (1977)
16764C     VERSION NUMBER--94/8
16765C     ORIGINAL VERSION--SEPTEMBER 1994.
16766C
16767C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
16768C
16769      DOUBLE PRECISION DCDF
16770      DOUBLE PRECISION DALPHA
16771      DOUBLE PRECISION DBETA
16772      DOUBLE PRECISION DX
16773      DOUBLE PRECISION DBETAI
16774C
16775C---------------------------------------------------------------------
16776C
16777      INCLUDE 'DPCOP2.INC'
16778C
16779C-----START POINT-----------------------------------------------------
16780C
16781      CDF=0.0
16782      IF(ALPHA.LE.0.0 .OR. BETA.LE.0.0)THEN
16783        WRITE(ICOUT,101)
16784        CALL DPWRST('XXX','BUG ')
16785        WRITE(ICOUT,103)ALPHA
16786        CALL DPWRST('XXX','BUG ')
16787        WRITE(ICOUT,104)BETA
16788        CALL DPWRST('XXX','BUG ')
16789        GOTO9999
16790      ENDIF
16791      IF(X.LE.0.0)THEN
16792CCCCC   WRITE(ICOUT,301)X
16793CCCCC   CALL DPWRST('XXX','BUG ')
16794        CDF=0.0
16795        GOTO9999
16796      ENDIF
16797      IF(X.GE.1.0)THEN
16798CCCCC   WRITE(ICOUT,401)X
16799CCCCC   CALL DPWRST('XXX','BUG ')
16800        CDF=1.0
16801        GOTO9999
16802      ENDIF
16803  101 FORMAT('***** ERROR IN BETCDF--EITHER THE ALPHA OR BETA IS ',
16804     1       'NON-POSITIVE.')
16805  103 FORMAT('      THE VALUE OF ALPHA IS ',G15.7)
16806  104 FORMAT('      THE VALUE OF BETA IS ',G15.7,'       ******')
16807CC301 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETCDF IS ',
16808CCCCC1       'NON-POSITIVE.  IT HAS THE VALUE ',G15.7)
16809CC401 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETCDF IS GREATER ',
16810CCCCC1       'THAN 1.  IT HAS THE VALUE ',G15.7)
16811C
16812      DX=DBLE(X)
16813      DALPHA=DBLE(ALPHA)
16814      DBETA=DBLE(BETA)
16815      DCDF=DBETAI(DX,DALPHA,DBETA)
16816      CDF=REAL(DCDF)
16817C
16818 9999 CONTINUE
16819      RETURN
16820      END
16821      SUBROUTINE BETFUN (N, X, FVEC, IFLAG, XDATA, NOBS)
16822C
16823C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
16824C              BETA MAXIMUM LIKELIHOOD EQUATIONS.
16825C
16826C              DIGAMMA(PHAT) - DIGAMMA(PHAT + QHAT) -
16827C                 SUM[I=1 TO N][LOG((X(I)-A)/(B-A))] = 0
16828C
16829C              DIGAMMA(QHAT) - DIGAMMA(PHAT + QHAT) -
16830C                 SUM[I=1 TO N][LOG((B - X(I))/(B-A))] = 0
16831C
16832C              WITH A AND B DENOTING THE LOWER AND UPPER LIMIT
16833C              PARAMETERS, RESPECTIVELY.
16834C
16835C              WE FOLLOW THE TECHNIQUE OF SETTING A AND B TO THE
16836C              DATA MINIMUM AND MAXIMUM, RESPECTIVELY AND TREATING
16837C              THEM AS "KNOWN" AS OPPOSSED TO THE FULL 4-PARAMETER
16838C              MAXIMUM LIKELIHOOD SOLUTION.
16839C
16840C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
16841C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
16842C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
16843C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
16844C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
16845C     REFERENCE--JOHNSON, KOTZ, AND BALAKRISHNAN (1994).  "CONTINUOUS
16846C                UNIVARIATE DISTRIBUTIONS: VOLUME 2", SECOND EDITION,
16847C                JOHN WILEY, P. 223.
16848C     WRITTEN BY--JAMES J. FILLIBEN
16849C                 STATISTICAL ENGINEERING DIVISION
16850C                 CENTER FOR APPLIED MATHEMATICS
16851C                 NATIONAL BUREAU OF STANDARDS
16852C                 WASHINGTON, D. C. 20234
16853C                 PHONE--301-975-2855
16854C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16855C           OF THE NATIONAL BUREAU OF STANDARDS.
16856C     LANGUAGE--ANSI FORTRAN (1977)
16857C     VERSION NUMBER--2003/11
16858C     ORIGINAL VERSION--NOVEMBER  2003.
16859C
16860C---------------------------------------------------------------------
16861C
16862      DOUBLE PRECISION X(*)
16863      DOUBLE PRECISION FVEC(*)
16864      REAL XDATA(*)
16865C
16866      DOUBLE PRECISION DPSI
16867      DOUBLE PRECISION DN
16868      DOUBLE PRECISION DX
16869      DOUBLE PRECISION DA
16870      DOUBLE PRECISION DB
16871      DOUBLE PRECISION DP
16872      DOUBLE PRECISION DQ
16873      DOUBLE PRECISION DSUM1
16874      DOUBLE PRECISION DSUM2
16875      DOUBLE PRECISION DTERM1
16876      DOUBLE PRECISION DTERM2
16877      DOUBLE PRECISION DTERM3
16878      DOUBLE PRECISION DTERM4
16879      DOUBLE PRECISION DTERM5
16880C
16881C---------------------------------------------------------------------
16882C
16883      COMMON /BETMLE/ BETALL, BETAUL
16884      INCLUDE 'DPCOP2.INC'
16885C
16886C-----START POINT-----------------------------------------------------
16887C
16888C  ALLOW FOR USER SPECIFIED LOWER/UPPER LIMITS, OTHERWISE USE DATA
16889C  MINIMUM AND MAXIMUM
16890C
16891      N=2
16892      IFLAG=0
16893C
16894      IF(BETALL.EQ.CPUMIN .OR. BETAUL.EQ.CPUMIN)THEN
16895        A=XDATA(1)
16896        B=XDATA(1)
16897        DO100I=1,NOBS
16898          IF(XDATA(I).LT.A)A=XDATA(I)
16899          IF(XDATA(I).GT.B)B=XDATA(I)
16900  100   CONTINUE
16901      ELSE
16902        A=BETALL
16903        B=BETAUL
16904      ENDIF
16905C
16906C  COMPUTE SOME SUMS
16907C
16908      DA=DBLE(A)
16909      DB=DBLE(B)
16910C
16911      DN=DBLE(NOBS)
16912      DSUM1=0.0D0
16913      DSUM2=0.0D0
16914      DP=DBLE(X(1))
16915      DQ=DBLE(X(2))
16916C
16917      DTERM1=DPSI(DP)
16918      DTERM2=DPSI(DQ)
16919      DTERM3=DPSI(DP+DQ)
16920C
16921C  IN ORDER TO AVOID LOG OF NON-POSITIVE NUMBER, EXCLUDE VALUES
16922C  THAT ARE EQUAL TO A OR B
16923C
16924      DSUM1=0.0D0
16925      DSUM2=0.0D0
16926      N1=0
16927      N2=0
16928      DO200I=1,NOBS
16929        DX=DBLE(XDATA(I))
16930        DTERM4=(DX - DA)/(DB - DA)
16931        DTERM5=(DB - DX)/(DB - DA)
16932        IF(DTERM4.GT.0.0D0)THEN
16933          DSUM1=DSUM1 + DLOG(DTERM4)
16934          N1=N1+1
16935        ENDIF
16936        IF(DTERM5.GT.0.0D0)THEN
16937          DSUM2=DSUM2 + DLOG(DTERM5)
16938          N2=N2+1
16939        ENDIF
16940  200 CONTINUE
16941C
16942      IF(N1.GT.0)THEN
16943        FVEC(1)=DTERM1 - DTERM3 - DSUM1/DBLE(N1)
16944      ELSE
16945        FVEC(1)=0.0
16946      ENDIF
16947      IF(N2.GT.0)THEN
16948        FVEC(2)=DTERM2 - DTERM3 - DSUM2/DBLE(N2)
16949      ELSE
16950        FVEC(2)=0.0
16951      ENDIF
16952C
16953CCCCC if(iflag.eq.0)then
16954CCCCC   print *,'nobs,a,b=',nobs,a,b
16955CCCCC   print *,'dp,dq=',dp,dq
16956CCCCC   print *,'dterm1,dterm2,dterm3=',dterm1,dterm2,dterm3
16957CCCCC   print *,'dsum1,dsum2=',dsum1,dsum2
16958CCCCC   print *,'fvec(1),fvec(2)=',fvec(1),fvec(2)
16959CCCCC endif
16960C
16961      RETURN
16962      END
16963      DOUBLE PRECISION FUNCTION BETFU2 (DALPHA,DX)
16964C
16965C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE LIKELIHOOD RATIO
16966C              BASED CONFIDECE INTERVAL FOR THE 2-PARAMETER BETA
16967C              MODEL (FULL SAMPLE).  THIS FUNCTION FINDS THE ROOT
16968C              OF THE EQUATION:
16969C
16970C                 2*LL(ALPHA,BETA) - 2*LL(ALPHA,BETA(ALPHA)) -
16971C                                    CHSPPF(alpha,1)
16972C
16973C              WITH
16974C
16975C                 LL(ALPHA,BETA) = -N*LOG(BETA(ALPHA,BETA)) +
16976C                          N*(ALPHA-1)*S3 +N*(BETA-1)*S4
16977C
16978C              GIVEN CURRENT VALUE OF ALPHA, WE COMPUTE VALUE OF
16979C              BETA(ALPHA).  WE THEN COMPUTE THE LIKELIHOOD FUNCTION.
16980C              NOTE THAT LL(ALPHA,BETA) IS COMPUTED ONCE IN DPMLBE
16981C              AND PASSED VIA COMMON.
16982C
16983C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
16984C              FUNCTION.
16985C
16986C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
16987C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
16988C                CAMBRIDGE UNIVERSITY PRESS, 1999, CHAPTER 13 (SEE
16989C                EXAMPLE 13.3).
16990C     WRITTEN BY--JAMES J. FILLIBEN
16991C                 STATISTICAL ENGINEERING DIVISION
16992C                 INFORMATION TECHNOLOGY LABORATORY
16993C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
16994C                 GAITHERSBUG, MD 20899-8980
16995C                 PHONE--301-975-2855
16996C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
16997C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
16998C     LANGUAGE--ANSI FORTRAN (1977)
16999C     VERSION NUMBER--2004/12
17000C     ORIGINAL VERSION--DECEMBER   2004.
17001C
17002C---------------------------------------------------------------------
17003C
17004      DOUBLE PRECISION DALPHA
17005      DOUBLE PRECISION DX(*)
17006C
17007      INTEGER N
17008      DOUBLE PRECISION DSUM3
17009      DOUBLE PRECISION DSUM4
17010      DOUBLE PRECISION DLLAB
17011      DOUBLE PRECISION DK
17012      COMMON/BETCO9/DSUM3,DSUM4,DLLAB,DK,N
17013C
17014      DOUBLE PRECISION DBETA
17015      COMMON/BETCO2/DBETA
17016C
17017      DOUBLE PRECISION DALPH2
17018      COMMON/BETCO4/DALPH2
17019C
17020      DOUBLE PRECISION DLBETA
17021      EXTERNAL DLBETA
17022      DOUBLE PRECISION BETFU4
17023      EXTERNAL BETFU4
17024C
17025      DOUBLE PRECISION AE
17026      DOUBLE PRECISION RE
17027      DOUBLE PRECISION XLOW
17028      DOUBLE PRECISION XUP
17029      DOUBLE PRECISION XSTRT
17030      DOUBLE PRECISION DBETA2
17031      DOUBLE PRECISION DN
17032      DOUBLE PRECISION DTERM1
17033      DOUBLE PRECISION DTERM2
17034      DOUBLE PRECISION DTERM3
17035      DOUBLE PRECISION DTERM4
17036C
17037C---------------------------------------------------------------------
17038C
17039      INCLUDE 'DPCOP2.INC'
17040C
17041C-----START POINT-----------------------------------------------------
17042C
17043      DALPH2=DALPHA
17044      DBETA2=DBETA
17045      AE=1.D-7
17046      RE=1.D-7
17047      XSTRT=DBETA2
17048      XLOW=XSTRT/3.0D0
17049      XUP=XSTRT*3.0D0
17050      CALL DFZER3(BETFU4,XLOW,XUP,XSTRT,RE,AE,IFLAG,DX)
17051      DBETA2=XLOW
17052C
17053C  COMPUTE LL(ALPHA,BETA)
17054C
17055      DN=DBLE(N)
17056      DTERM1=0.0D0
17057      IF(DALPHA.GT.0.0D0 .AND. DBETA.GT.0.0D0)THEN
17058        DTERM1=-DN*DLBETA(DALPHA,DBETA2)
17059      ENDIF
17060      DTERM2=DN*(DALPHA-1.0D0)*DSUM3
17061      DTERM3=DN*(DBETA2-1.0D0)*DSUM4
17062      DTERM4=DTERM1 + DTERM2 + DTERM3
17063C
17064      BETFU2=2.0*DLLAB - 2.0D0*DTERM4 - DK
17065C
17066      RETURN
17067      END
17068      DOUBLE PRECISION FUNCTION BETFU5 (DBETA,DX)
17069C
17070C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE LIKELIHOOD RATIO
17071C              BASED CONFIDECE INTERVAL FOR THE 2-PARAMETER BETA
17072C              MODEL (FULL SAMPLE).  THIS FUNCTION FINDS THE ROOT
17073C              OF THE EQUATION:
17074C
17075C                 2*LL(ALPHA,BETA) - 2*LL(ALPHA,ALPHA(BETA)) -
17076C                                    CHSPPF(alpha,1)
17077C
17078C              WITH
17079C
17080C                 LL(ALPHA,BETA) = -N*LOG(BETA(ALPHA,BETA)) +
17081C                          N*(ALPHA-1)*S3 +N*(BETA-1)*S4
17082C
17083C              GIVEN CURRENT VALUE OF BETA, WE COMPUTE VALUE OF
17084C              ALPHA(BETA).  WE THEN COMPUTE THE LIKELIHOOD FUNCTION.
17085C              NOTE THAT LL(ALPHA,BETA) IS COMPUTED ONCE IN DPMLBE
17086C              AND PASSED VIA COMMON.
17087C
17088C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
17089C              FUNCTION.
17090C
17091C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17092C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
17093C                CAMBRIDGE UNIVERSITY PRESS, 1999, CHAPTER 14 (SEE
17094C                EXAMPLE 14.3).
17095C     WRITTEN BY--JAMES J. FILLIBEN
17096C                 STATISTICAL ENGINEERING DIVISION
17097C                 INFORMATION TECHNOLOGY LABORATORY
17098C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17099C                 GAITHERSBUG, MD 20899-8980
17100C                 PHONE--301-975-2855
17101C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17102C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17103C     LANGUAGE--ANSI FORTRAN (1977)
17104C     VERSION NUMBER--2004/12
17105C     ORIGINAL VERSION--DECEMBER   2004.
17106C
17107C---------------------------------------------------------------------
17108C
17109      DOUBLE PRECISION DBETA
17110      DOUBLE PRECISION DX(*)
17111C
17112      INTEGER N
17113      DOUBLE PRECISION DSUM3
17114      DOUBLE PRECISION DSUM4
17115      DOUBLE PRECISION DLLAB
17116      DOUBLE PRECISION DK
17117      COMMON/BETCO9/DSUM3,DSUM4,DLLAB,DK,N
17118C
17119      DOUBLE PRECISION DALPHA
17120      COMMON/BETCO5/DALPHA
17121C
17122      DOUBLE PRECISION DBETA2
17123      COMMON/BETCO3/DBETA2
17124C
17125      DOUBLE PRECISION DLBETA
17126      EXTERNAL DLBETA
17127      DOUBLE PRECISION BETFU3
17128      EXTERNAL BETFU3
17129C
17130      DOUBLE PRECISION AE
17131      DOUBLE PRECISION RE
17132      DOUBLE PRECISION XLOW
17133      DOUBLE PRECISION XUP
17134      DOUBLE PRECISION XSTRT
17135      DOUBLE PRECISION DALPH2
17136      DOUBLE PRECISION DN
17137      DOUBLE PRECISION DTERM1
17138      DOUBLE PRECISION DTERM2
17139      DOUBLE PRECISION DTERM3
17140      DOUBLE PRECISION DTERM4
17141C
17142C---------------------------------------------------------------------
17143C
17144      INCLUDE 'DPCOP2.INC'
17145C
17146C-----START POINT-----------------------------------------------------
17147C
17148      DBETA2=DBETA
17149      DALPH2=DALPHA
17150      AE=1.D-7
17151      RE=1.D-7
17152      XSTRT=DALPH2
17153      XLOW=XSTRT/3.0D0
17154      XUP=XSTRT*3.0D0
17155      CALL DFZER3(BETFU3,XLOW,XUP,XSTRT,RE,AE,IFLAG,DX)
17156      DALPH2=XLOW
17157C
17158C  COMPUTE LL(ALPHA,BETA)
17159C
17160      DN=DBLE(N)
17161      DTERM1=0.0D0
17162      IF(DALPHA.GT.0.0D0 .AND. DBETA.GT.0.0D0)THEN
17163        DTERM1=-DN*DLBETA(DALPH2,DBETA)
17164      ENDIF
17165      DTERM2=DN*(DALPH2-1.0D0)*DSUM3
17166      DTERM3=DN*(DBETA-1.0D0)*DSUM4
17167      DTERM4=DTERM1 + DTERM2 + DTERM3
17168C
17169      BETFU5=2.0*DLLAB - 2.0D0*DTERM4 - DK
17170C
17171      RETURN
17172      END
17173      DOUBLE PRECISION FUNCTION BETFU3 (DALPHA,DX)
17174C
17175C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE LIKELIHOOD RATIO
17176C              BASED CONFIDENCE INTERVAL FOR THE ALPHA SHAPE PARAMETER
17177C              OF A 2-PARAMETER BETA MODEL (FULL SAMPLE).  THIS
17178C              FUNCTION FINDS THE ROOT OF THE EQUATION:
17179C
17180C                 DIGAMMA(BETA) - DIGAMMA(ALPHA + BETA) - SUM4
17181C
17182C              WITH
17183C
17184C                 SUM4 = (1/N)*SUM[i=1 to N][LOG((B - X(i))]/(B-A)
17185C                 N        = SAMPLE SIZE
17186C                 A        = LOWER LIMIT
17187C                 B        = UPPER LIMIT
17188C
17189C              NOTE THAT DIGAMMA(BETA) AND SUM4 DO NOT DEPEND ON
17190C              THE VALUE OF ALPHA, SO THESE ARE COMPUTED ONCE AND
17191C              PASSED VIA COMMON BLOCKS.
17192C
17193C              GIVEN A VALUE FOR THE BETA SHAPE PARAMETER (DBETA), WE
17194C              NEED TO DETERMINE THE VALUE OF THE ALPHA SHAPE PARAMETER
17195C              (DALPHA).
17196C
17197C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
17198C              FUNCTION.  DFZER2 IS MODIFIED VERSION OF DFZERO THAT
17199C              PASSES ALONG THE DATA ARRAY.
17200C
17201C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17202C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
17203C                CAMBRIDGE UNIVERSITY PRESS, 1999, CHAPTER 14 (SEE
17204C                EXAMPLE 14.3).
17205C     WRITTEN BY--JAMES J. FILLIBEN
17206C                 STATISTICAL ENGINEERING DIVISION
17207C                 INFORMATION TECHNOLOGY LABORATORY
17208C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17209C                 GAITHERSBUG, MD 20899-8980
17210C                 PHONE--301-975-2855
17211C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17212C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17213C     LANGUAGE--ANSI FORTRAN (1977)
17214C     VERSION NUMBER--2004/12
17215C     ORIGINAL VERSION--DECEMBER   2004.
17216C
17217C---------------------------------------------------------------------
17218C
17219      DOUBLE PRECISION DALPHA
17220      DOUBLE PRECISION DX(*)
17221C
17222      INTEGER N
17223      DOUBLE PRECISION DSUM3
17224      DOUBLE PRECISION DSUM4
17225      DOUBLE PRECISION DLLAB
17226      DOUBLE PRECISION DK
17227      COMMON/BETCO9/DSUM3,DSUM4,DLLAB,DK,N
17228C
17229      DOUBLE PRECISION DBETA
17230      COMMON/BETCO3/DBETA
17231C
17232      DOUBLE PRECISION DN
17233C
17234      DOUBLE PRECISION DPSI
17235      EXTERNAL DPSI
17236C
17237C---------------------------------------------------------------------
17238C
17239      INCLUDE 'DPCOBE.INC'
17240      INCLUDE 'DPCOP2.INC'
17241C
17242C-----START POINT-----------------------------------------------------
17243C
17244      IF(ISUBG4.EQ.'TFU3')THEN
17245        WRITE(ICOUT,11)DX(1)
17246   11   FORMAT('**** AT THE BEGINNING OF BETFU3--DX(1) = ',G15.7)
17247        CALL DPWRST('XXX','WRIT')
17248      ENDIF
17249C
17250      DN=DBLE(N)
17251      BETFU3=DPSI(DALPHA) - DPSI(DALPHA + DBETA) - DSUM3
17252C
17253      RETURN
17254      END
17255      DOUBLE PRECISION FUNCTION BETFU4 (DBETA,DX)
17256C
17257C     PURPOSE--THIS ROUTINE IS USED IN FINDING THE LIKELIHOOD RATIO
17258C              BASED CONFIDENCE INTERVAL FOR THE BETA SHAPE PARAMETER
17259C              OF A 2-PARAMETER BETA MODEL (FULL SAMPLE).  THIS
17260C              FUNCTION FINDS THE ROOT OF THE EQUATION:
17261C
17262C                 DIGAMMA(ALPHA) - DIGAMMA(ALPHA + BETA) - SUM3
17263C
17264C              WITH
17265C
17266C                 SUM3 = (1/N)*SUM[i=1 to N][LOG((X(i) - A)]/(B-A)
17267C                 N        = SAMPLE SIZE
17268C                 A        = LOWER LIMIT
17269C                 B        = UPPER LIMIT
17270C
17271C              NOTE THAT DIGAMMA(ALPHA) AND SUM3 DO NOT DEPEND ON
17272C              THE VALUE OF BETA, SO THESE ARE COMPUTED ONCE AND
17273C              PASSED VIA COMMON BLOCKS.
17274C
17275C              GIVEN A VALUE FOR THE ALPHA SHAPE PARAMETER (DALPHA),
17276C              DETERMINE VALUE OF BETA.  THIS IS
17277C              THE ROOT OF THE ABOVE EQUATION.
17278C
17279C              CALLED BY DFZER2 ROUTINE FOR FINDING THE ROOT OF A
17280C              FUNCTION.  DFZER2 IS MODIFIED VERSION OF DFZERO THAT
17281C              PASSES ALONG THE DATA ARRAY.
17282C
17283C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17284C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
17285C                CAMBRIDGE UNIVERSITY PRESS, 1999, CHAPTER 14 (SEE
17286C                EXAMPLE 14.3).
17287C     WRITTEN BY--JAMES J. FILLIBEN
17288C                 STATISTICAL ENGINEERING DIVISION
17289C                 INFORMATION TECHNOLOGY LABORATORY
17290C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17291C                 GAITHERSBUG, MD 20899-8980
17292C                 PHONE--301-975-2855
17293C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17294C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17295C     LANGUAGE--ANSI FORTRAN (1977)
17296C     VERSION NUMBER--2004/12
17297C     ORIGINAL VERSION--DECEMBER   2004.
17298C
17299C---------------------------------------------------------------------
17300C
17301      DOUBLE PRECISION DBETA
17302      DOUBLE PRECISION DX(*)
17303C
17304      INTEGER N
17305      DOUBLE PRECISION DSUM3
17306      DOUBLE PRECISION DSUM4
17307      DOUBLE PRECISION DLLAB
17308      DOUBLE PRECISION DK
17309      COMMON/BETCO9/DSUM3,DSUM4,DLLAB,DK,N
17310C
17311      DOUBLE PRECISION DALPHA
17312      COMMON/BETCO4/DALPHA
17313C
17314      DOUBLE PRECISION DN
17315C
17316      DOUBLE PRECISION DPSI
17317      EXTERNAL DPSI
17318C
17319C---------------------------------------------------------------------
17320C
17321      INCLUDE 'DPCOBE.INC'
17322      INCLUDE 'DPCOP2.INC'
17323C
17324C-----START POINT-----------------------------------------------------
17325C
17326      IF(ISUBG4.EQ.'TFU3')THEN
17327        WRITE(ICOUT,11)DX(1)
17328   11   FORMAT('**** AT THE BEGINNING OF BETFU3--DX(1) = ',G15.7)
17329        CALL DPWRST('XXX','WRIT')
17330      ENDIF
17331C
17332      DN=DBLE(N)
17333      BETFU4=DPSI(DBETA) - DPSI(DALPHA + DBETA) - DSUM4
17334C
17335      RETURN
17336      END
17337      REAL FUNCTION BETFU7(ALPHA)
17338C
17339C     PURPOSE--THIS ROUTINE IS USED IN FINDING CONFIDENCE LIMITS
17340C              FOR PERCENTILES OF THE BETA DISTRIBUTION (BASED ON
17341C              MAXIMUM LIKELIHOOD ESTIMATION).  THIS FUNCTION
17342C              COMPUTES THE DERIVATIVE OF THE BETA PERCENT POINT
17343C              FUNCTION WITH RESPECT TO THE ALPHA SHAPE PARAMETER.
17344C
17345C              CALLED BY DIFF ROUTINE FOR FINDING THE DERIVATIVE
17346C              OF A FUNCTION.
17347C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17348C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN
17349C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
17350C                1999, CHAPTER 13.
17351C     WRITTEN BY--JAMES J. FILLIBEN
17352C                 STATISTICAL ENGINEERING DIVISION
17353C                 INFORMATION TECHNOLOGY LABORATORY
17354C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17355C                 GAITHERSBUG, MD 20899-8980
17356C                 PHONE--301-975-2855
17357C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17358C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17359C     LANGUAGE--ANSI FORTRAN (1977)
17360C     VERSION NUMBER--2004/12
17361C     ORIGINAL VERSION--DECEMBER   2004.
17362C
17363C---------------------------------------------------------------------
17364C
17365      REAL ALPHA
17366C
17367      COMMON/BETCO7/P,BETA
17368C
17369C---------------------------------------------------------------------
17370C
17371      INCLUDE 'DPCOP2.INC'
17372C
17373C-----START POINT-----------------------------------------------------
17374C
17375      CALL BETPPF(P,ALPHA,BETA,APPF)
17376      BETFU7=APPF
17377C
17378      RETURN
17379      END
17380      REAL FUNCTION BETFU8(BETA)
17381C
17382C     PURPOSE--THIS ROUTINE IS USED IN FINDING CONFIDENCE LIMITS
17383C              FOR PERCENTILES OF THE BETA DISTRIBUTION (BASED ON
17384C              MAXIMUM LIKELIHOOD ESTIMATION).  THIS FUNCTION
17385C              COMPUTES THE DERIVATIVE OF THE BETA PERCENT POINT
17386C              FUNCTION WITH RESPECT TO THE BETA SHAPE PARAMETER.
17387C
17388C              CALLED BY DIFF ROUTINE FOR FINDING THE DERIVATIVE
17389C              OF A FUNCTION.
17390C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17391C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN
17392C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
17393C                1999, CHAPTER 13.
17394C     WRITTEN BY--JAMES J. FILLIBEN
17395C                 STATISTICAL ENGINEERING DIVISION
17396C                 INFORMATION TECHNOLOGY LABORATORY
17397C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17398C                 GAITHERSBUG, MD 20899-8980
17399C                 PHONE--301-975-2855
17400C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17401C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17402C     LANGUAGE--ANSI FORTRAN (1977)
17403C     VERSION NUMBER--2004/12
17404C     ORIGINAL VERSION--DECEMBER   2004.
17405C
17406C---------------------------------------------------------------------
17407C
17408      REAL BETA
17409C
17410      COMMON/BETCO8/P,ALPHA
17411C
17412C---------------------------------------------------------------------
17413C
17414      INCLUDE 'DPCOP2.INC'
17415C
17416C-----START POINT-----------------------------------------------------
17417C
17418      CALL BETPPF(P,ALPHA,BETA,APPF)
17419      BETFU8=APPF
17420C
17421      RETURN
17422      END
17423      SUBROUTINE BETLI1(Y,N,NP,
17424     1                  A,B,ALPHA,BETA,
17425     1                  ALIK,AIC,AICC,BIC,
17426     1                  ISUBRO,IBUGA3,IERROR)
17427C
17428C     PURPOSE--THIS ROUTINE COMPUTES THE LOG-LIKIHOOD FUNCTION FOR
17429C              THE BETA DISTRIBUTION.  THIS IS FOR THE RAW
17430C              DATA CASE (I.E., NO GROUPING AND NO CENSORING).
17431C
17432C              NOTE THAT THE LOWER AND UPPER LIMITS MUST BE EXPLICITLY
17433C              GIVEN.  THE ARGUMENT NP SHOULD BE 2 FOR A 2-PARAMETER
17434C              BETA AND 4 FOR A 4-PARAMETER BETA.
17435C
17436C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN
17437C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
17438C                1999, CHAPTER 14.
17439C     WRITTEN BY--ALAN HECKERT
17440C                 STATISTICAL ENGINEERING DIVISION
17441C                 INFORMATION TECHNOLOGY LABORATORY
17442C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17443C                 GAITHERSBURG, MD 20899-8980
17444C                 PHONE--301-975-2899
17445C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17446C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17447C     LANGUAGE--ANSI FORTRAN (1977)
17448C     VERSION NUMBER--2013/06
17449C     ORIGINAL VERSION--JUNE      2013.
17450C
17451      CHARACTER*4 ISUBRO
17452      CHARACTER*4 IBUGA3
17453      CHARACTER*4 IERROR
17454C
17455      CHARACTER*4 IWRITE
17456      CHARACTER*4 ISUBN1
17457      CHARACTER*4 ISUBN2
17458      CHARACTER*4 ISTEPN
17459C
17460      DOUBLE PRECISION DBETA
17461      EXTERNAL DBETA
17462C
17463      DOUBLE PRECISION DX
17464      DOUBLE PRECISION DA
17465      DOUBLE PRECISION DB
17466      DOUBLE PRECISION DALPHA
17467      DOUBLE PRECISION DBETAZ
17468      DOUBLE PRECISION DN
17469      DOUBLE PRECISION DNP
17470      DOUBLE PRECISION DLIK
17471      DOUBLE PRECISION DSUM1
17472      DOUBLE PRECISION DSUM2
17473      DOUBLE PRECISION DTERM1
17474      DOUBLE PRECISION DTERM2
17475      DOUBLE PRECISION DTERM3
17476C
17477C---------------------------------------------------------------------
17478C
17479      DIMENSION Y(*)
17480C
17481C---------------------------------------------------------------------
17482C
17483      INCLUDE 'DPCOP2.INC'
17484C
17485C-----START POINT-----------------------------------------------------
17486C
17487      ISUBN1='BETL'
17488      ISUBN2='I1  '
17489C
17490      IWRITE='OFF'
17491      IERROR='NO'
17492      ALIK=CPUMIN
17493      AIC=CPUMIN
17494      AICC=CPUMIN
17495      BIC=CPUMIN
17496C
17497      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')THEN
17498        WRITE(ICOUT,999)
17499  999   FORMAT(1X)
17500        CALL DPWRST('XXX','WRIT')
17501        WRITE(ICOUT,51)
17502   51   FORMAT('**** AT THE BEGINNING OF BETLI1--')
17503        CALL DPWRST('XXX','WRIT')
17504        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,A,B,ALPHA,BETA
17505   52   FORMAT('IBUGA3,ISUBRO,N,A,B,ALPHA,BETA = ',2(A4,2X),I8,4G15.7)
17506        CALL DPWRST('XXX','WRIT')
17507        DO56I=1,MIN(N,100)
17508          WRITE(ICOUT,57)I,Y(I)
17509   57     FORMAT('I,Y(I) = ',I8,G15.7)
17510          CALL DPWRST('XXX','WRIT')
17511   56   CONTINUE
17512      ENDIF
17513C
17514C               ******************************************
17515C               **  STEP 1--                            **
17516C               **  COMPUTE LIKELIHOOD FUNCTION         **
17517C               ******************************************
17518C
17519      ISTEPN='1'
17520      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')
17521     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
17522C
17523      CALL MINIM(Y,N,IWRITE,YMIN,IBUGA3,IERROR)
17524      CALL MAXIM(Y,N,IWRITE,YMAX,IBUGA3,IERROR)
17525      IF(A.GE.YMIN .OR. B.LE.YMAX)THEN
17526        WRITE(ICOUT,999)
17527        CALL DPWRST('XXX','WRIT')
17528        WRITE(ICOUT,101)
17529  101   FORMAT('**** ERROR IN BETA LOG-LIKELIHOOD--')
17530        CALL DPWRST('XXX','WRIT')
17531        WRITE(ICOUT,103)
17532  103   FORMAT('     INVALID LIMITS:')
17533        CALL DPWRST('XXX','WRIT')
17534        WRITE(ICOUT,105)A
17535  105   FORMAT('     LOWER LIMIT    = ',G15.7)
17536        CALL DPWRST('XXX','WRIT')
17537        WRITE(ICOUT,106)YMIN
17538  106   FORMAT('     DATA MINIMUM   = ',G15.7)
17539        CALL DPWRST('XXX','WRIT')
17540        WRITE(ICOUT,107)B
17541  107   FORMAT('     UPPER LIMIT    = ',G15.7)
17542        CALL DPWRST('XXX','WRIT')
17543        WRITE(ICOUT,108)YMAX
17544  108   FORMAT('     DATA MAXIMUM   = ',G15.7)
17545        CALL DPWRST('XXX','WRIT')
17546        IERROR='YES'
17547        GOTO9000
17548      ENDIF
17549C
17550C     THE LOG-LIKLIHOOD FUNCTION FOR THE BETA DISTRIBUTION IS:
17551C
17552C     (ALPHA-1)*SUM[LOG(Y(i) - A)] + (BETA-1)*SUM[LOG(B - Y(i))]  -
17553C     N*LOG(B'(2,BETA)) - N*(ALPHA+BETA-1)*LOG(B-A)
17554C
17555      DN=DBLE(N)
17556      DALPHA=DBLE(ALPHA)
17557      DBETAZ=DBLE(BETA)
17558      DA=DBLE(A)
17559      DB=DBLE(B)
17560C
17561      DTERM2=DBETA(DALPHA,DBETAZ)
17562      DTERM1=-DN*DLOG(DTERM2) - DN*(DALPHA+DBETAZ-1.0D0)*DLOG(DB-DA)
17563C
17564      DSUM1=0.0D0
17565      DSUM2=0.0D0
17566      DO1000I=1,N
17567        DX=DBLE(Y(I))
17568        DSUM1=DSUM1 + DLOG(DX - DA)
17569        DSUM2=DSUM2 + DLOG(DB - DX)
17570 1000 CONTINUE
17571C
17572      DLIK=(DALPHA-1.0D0)*DSUM1 + (DBETAZ-1.0D0)*DSUM2 + DTERM1
17573      ALIK=REAL(DLIK)
17574      IF(NP.EQ.2)THEN
17575        DNP=2.0D0
17576      ELSEIF(NP.EQ.4)THEN
17577        DNP=4.0D0
17578      ELSE
17579        DNP=4.0D0
17580      ENDIF
17581      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
17582      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
17583      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
17584      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
17585C
17586 9000 CONTINUE
17587      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TLI1')THEN
17588        WRITE(ICOUT,999)
17589        CALL DPWRST('XXX','WRIT')
17590        WRITE(ICOUT,9011)
17591 9011   FORMAT('**** AT THE END OF BETLI1--')
17592        CALL DPWRST('XXX','WRIT')
17593        WRITE(ICOUT,9055)DTERM1,DSUM1,DSUM2
17594 9055   FORMAT('DTERM1,DSUM1,DSUM2,DLIK = ',4G15.7)
17595        CALL DPWRST('XXX','WRIT')
17596        WRITE(ICOUT,9057)AIC,AICC,BIC
17597 9057   FORMAT('AIC,AICC,BIC = ',3G15.7)
17598        CALL DPWRST('XXX','WRIT')
17599      ENDIF
17600C
17601      RETURN
17602      END
17603      SUBROUTINE BETML1(Y,N,DTEMP1,MAXNXT,AUSER,BUSER,
17604     1                  XMIN,XMAX,XMEAN,XSD,XVAR,
17605     1                  A,B,
17606     1                  ALPHMO,BETAMO,
17607     1                  ALPHML,BETAML,
17608     1                  ISUBRO,IBUGA3,IERROR)
17609C
17610C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD AND
17611C              METHOD OF MOMENT ESTIMATES FOR THE BETA DISTRIBUTION.
17612C              THIS IS FOR THE 2-PARAMETER CASE (I.E., THE LOWER
17613C              AND UPPER LIMITS ARE ASSUMED KNOWN AND FIXED).
17614C
17615C
17616C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
17617C     REFERENCE--EVANS, HASTINGS, AND PEACOCK.  "STATISTICAL
17618C                DISTRIBUTIONS", THIRD EDITION, WILEY, 2000,
17619C                PP. 34-42.
17620C                JOHNSON, KOTZ, AND BALAKRISHNAN.  "CONTINUOUS
17621C                UNIVARIATE DISTRIBUTIONS, VOLUME II", SECOND
17622C                EDITION, WILEY, 1994.
17623C              --KARL BURY, "STATISTICAL DISTRIBUTIONS IN
17624C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
17625C                1999, CHAPTER 14.
17626C     WRITTEN BY--ALAN HECKERT
17627C                 STATISTICAL ENGINEERING DIVISION
17628C                 INFORMATION TECHNOLOGY LABORATORY
17629C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17630C                 GAITHERSBURG, MD 20899-8980
17631C                 PHONE--301-975-2899
17632C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17633C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17634C     LANGUAGE--ANSI FORTRAN (1977)
17635C     VERSION NUMBER--2010/07
17636C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
17637C                                       SUBROUTINE (FROM DPMLTO)
17638C
17639      CHARACTER*4 ISUBRO
17640      CHARACTER*4 IBUGA3
17641      CHARACTER*4 IERROR
17642C
17643      CHARACTER*4 IWRITE
17644      CHARACTER*40 IDIST
17645      CHARACTER*4 ISUBN1
17646      CHARACTER*4 ISUBN2
17647      CHARACTER*4 ISTEPN
17648C
17649      INTEGER IFLAG
17650C
17651      DOUBLE PRECISION TOL
17652      DOUBLE PRECISION XPAR(2)
17653      DOUBLE PRECISION FVEC(2)
17654CCCCC DOUBLE PRECISION DAE
17655CCCCC DOUBLE PRECISION DRE
17656CCCCC DOUBLE PRECISION DXSTRT
17657CCCCC DOUBLE PRECISION DXLOW
17658CCCCC DOUBLE PRECISION DXUP
17659C
17660      DOUBLE PRECISION DTERM1
17661      DOUBLE PRECISION DTERM2
17662      DOUBLE PRECISION DPROD1
17663      DOUBLE PRECISION DPROD2
17664      DOUBLE PRECISION DN
17665C
17666      EXTERNAL BETFUN
17667      COMMON /BETMLE/ BETALL, BETAUL
17668C
17669C---------------------------------------------------------------------
17670C
17671      DIMENSION Y(*)
17672      DOUBLE PRECISION DTEMP1(*)
17673C
17674C---------------------------------------------------------------------
17675C
17676      INCLUDE 'DPCOP2.INC'
17677C
17678C-----START POINT-----------------------------------------------------
17679C
17680      ISUBN1='BETM'
17681      ISUBN2='L1  '
17682C
17683      IWRITE='OFF'
17684      IERROR='NO'
17685C
17686      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
17687        WRITE(ICOUT,999)
17688  999   FORMAT(1X)
17689        CALL DPWRST('XXX','WRIT')
17690        WRITE(ICOUT,51)
17691   51   FORMAT('**** AT THE BEGINNING OF BETML1--')
17692        CALL DPWRST('XXX','WRIT')
17693        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,MAXNXT
17694   52   FORMAT('IBUGA3,ISUBRO,N,MAXNXT = ',A4,2X,A4,2X,2I8)
17695        CALL DPWRST('XXX','WRIT')
17696        WRITE(ICOUT,53)AUSER,BUSER
17697   53   FORMAT('AUSER,BUSER = ',2G15.7)
17698        CALL DPWRST('XXX','WRIT')
17699        DO56I=1,MIN(N,100)
17700          WRITE(ICOUT,57)I,Y(I)
17701   57     FORMAT('I,Y(I) = ',I8,G15.7)
17702          CALL DPWRST('XXX','WRIT')
17703   56   CONTINUE
17704      ENDIF
17705C
17706C               ******************************************
17707C               **  STEP 1--                            **
17708C               **  CARRY OUT CALCULATIONS              **
17709C               **  FOR BETA MLE ESTIMATE               **
17710C               ******************************************
17711C
17712      ISTEPN='1'
17713      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')
17714     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
17715C
17716      IDIST='BETA'
17717      IFLAG=0
17718      CALL SORT(Y,N,Y)
17719      CALL SUMRAW(Y,N,IDIST,IFLAG,
17720     1            XMEAN,XVAR,XSD,XMIN,XMAX,
17721     1            ISUBRO,IBUGA3,IERROR)
17722      IF(IERROR.EQ.'YES')GOTO9000
17723C
17724C     NOTE 2013/06: IF NO USER LIMITS GIVEN, SET FUDGE FACTOR TO
17725C                   1% (INSTEAD OF A VERY SMALL FIXED EPSION VALUE).
17726C
17727      IF((AUSER.EQ.CPUMIN .OR. BUSER.EQ.CPUMIN) .OR.
17728     1   (AUSER.GE.XMIN .OR. BUSER.LE.XMAX))THEN
17729        IF((XMIN.GE.0.0 .AND. XMIN.LE.1.0) .AND.
17730     1     (XMAX.GE.0.0 .AND. XMAX.LE.1.0))THEN
17731          A=0.0
17732          B=1.0
17733        ELSE
17734          EPS=(XMAX - XMIN)*0.01
17735          A=XMIN - EPS
17736          B=XMAX + EPS
17737        ENDIF
17738        BETALL=A
17739        BETAUL=B
17740      ELSE
17741        BETALL=AUSER
17742        BETAUL=BUSER
17743        A=AUSER
17744        B=BUSER
17745      ENDIF
17746C
17747      XMEAN1=(XMEAN-A)/(B-A)
17748      VAR1=XVAR/((B-A)**2)
17749      ALPHMO=XMEAN1*(XMEAN1*(1.0-XMEAN1)/VAR1 - 1.0)
17750      BETAMO=(1.0-XMEAN1)*(XMEAN1*(1.0-XMEAN1)/VAR1 - 1.0)
17751C
17752      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
17753        WRITE(ICOUT,1001)A,B,BETALL,BETAUL
17754 1001   FORMAT('A,B,BETALL,BETAUL = ',4G15.7)
17755        CALL DPWRST('XXX','WRIT')
17756        WRITE(ICOUT,1003)XVAR,VAR1,XMEAN1,ALPHMO,BETAMO
17757 1003   FORMAT('XVAR,VAR1,XMEAN1,ALPHMO,BETAMO = ',5G15.7)
17758        CALL DPWRST('XXX','WRIT')
17759      ENDIF
17760C
17761      XPAR(1)=DBLE(ALPHMO)
17762      XPAR(2)=DBLE(BETAMO)
17763      DPROD1=1.0D0
17764      DPROD2=1.0D0
17765      DN=DBLE(N)
17766C
17767      DO3101I=1,N
17768        DTERM1=DBLE((B-Y(I))/(B-A))**(1.0D0/DN)
17769        DTERM2=DBLE( (Y(I)-A)/(B-A))**(1.0D0/DN)
17770        IF(DTERM1.NE.0.0D0)DPROD1=DPROD1*DTERM1
17771        IF(DTERM2.NE.0.0D0)DPROD2=DPROD2*DTERM2
17772 3101 CONTINUE
17773CCCCC XPAR(1)=0.5D0*(1.0D0 - DPROD1)/(1.0D0 - DPROD2 - DPROD1)
17774C
17775      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
17776        WRITE(ICOUT,1011)DPROD1,DPROD2,XPAR(1)
17777 1011   FORMAT('DPROD1,DPROD2,XPAR(1) = ',3G15.7)
17778        CALL DPWRST('XXX','WRIT')
17779      ENDIF
17780C
17781      DO3103I=1,N
17782        DTERM1=DBLE((Y(I)-A)/(B-A))**(1.0D0/DN)
17783        DTERM2=DBLE( (B-Y(I))/(B-A))**(1.0D0/DN)
17784        IF(DTERM1.NE.0.0D0)DPROD1=DPROD1*DTERM1
17785        IF(DTERM2.NE.0.0D0)DPROD2=DPROD2*DTERM2
17786 3103 CONTINUE
17787CCCCC XPAR(2)=0.5D0*(1.0D0 - DPROD1)/(1.0D0 - DPROD1 - DPROD2)
17788C
17789      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
17790        WRITE(ICOUT,1013)DPROD1,DPROD2,XPAR(2)
17791 1013   FORMAT('DPROD1,DPROD2,XPAR(2) = ',3G15.7)
17792        CALL DPWRST('XXX','WRIT')
17793      ENDIF
17794C
17795      IOPT=2
17796      TOL=1.0D-6
17797      NVAR=2
17798      NPRINT=-1
17799      INFO=0
17800      LWA=MAXNXT
17801      CALL DNSQE(BETFUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
17802     1           DTEMP1,MAXNXT,Y,N)
17803C
17804      ALPHML=REAL(XPAR(1))
17805      BETAML=REAL(XPAR(2))
17806C
17807 9000 CONTINUE
17808      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML1')THEN
17809        WRITE(ICOUT,999)
17810        CALL DPWRST('XXX','WRIT')
17811        WRITE(ICOUT,9011)
17812 9011   FORMAT('**** AT THE END OF BETML1--')
17813        CALL DPWRST('XXX','WRIT')
17814        WRITE(ICOUT,9055)N,XMEAN,XSD,XMIN,XMAX
17815 9055   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
17816        CALL DPWRST('XXX','WRIT')
17817        WRITE(ICOUT,9057)ALPHMO,BETAMO,ALPHML,BETAML
17818 9057   FORMAT('ALPHMO,BETAMO,ALPHML,BETAML = ',4G15.7)
17819        CALL DPWRST('XXX','WRIT')
17820      ENDIF
17821C
17822      RETURN
17823      END
17824      SUBROUTINE BETML4(Y,N,DTEMP1,MAXNXT,
17825     1                  XMIN,XMAX,XMEAN,XSD,XVAR,
17826     1                  AMOM,BMOM,ALPHMO,BETAMO,
17827     1                  AML,BML,ALPHML,BETAML,MLFLAG,
17828     1                  ISUBRO,IBUGA3,IERROR)
17829C
17830C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD AND
17831C              METHOD OF MOMENT ESTIMATES FOR THE BETA DISTRIBUTION.
17832C              THIS IS FOR THE 4-PARAMETER CASE (I.E., THE LOWER
17833C              AND UPPER LIMITS ARE ESTIMATED FROM THE DATA).
17834C
17835C              NOTE THAT ML ESTIMATION CAN BE PROBLEMATIC FOR THE
17836C              4-PARAMETER BETA, PARTICULARLY FOR SMALL SAMPLES.
17837C              RETURN A FLAG THAT INDICATES WHETHER OR NOT ML
17838C              PROCEDURE CONVERGED.
17839C
17840C     EXAMPLE--4-PARAMETER BETA MAXIMUM LIKELIHOOD Y
17841C     REFERENCE--EVANS, HASTINGS, AND PEACOCK.  "STATISTICAL
17842C                DISTRIBUTIONS", THIRD EDITION, WILEY, 2000,
17843C                PP. 34-42.
17844C                JOHNSON, KOTZ, AND BALAKRISHNAN.  "CONTINUOUS
17845C                UNIVARIATE DISTRIBUTIONS, VOLUME II", SECOND
17846C                EDITION, WILEY, 1994.
17847C              --KARL BURY, "STATISTICAL DISTRIBUTIONS IN
17848C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
17849C                1999, CHAPTER 14.
17850C     WRITTEN BY--ALAN HECKERT
17851C                 STATISTICAL ENGINEERING DIVISION
17852C                 INFORMATION TECHNOLOGY LABORATORY
17853C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
17854C                 GAITHERSBURG, MD 20899-8980
17855C                 PHONE--301-975-2899
17856C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
17857C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
17858C     LANGUAGE--ANSI FORTRAN (1977)
17859C     VERSION NUMBER--2010/07
17860C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
17861C                                       SUBROUTINE (FROM DPMLB4)
17862C     UPDATED         --JUNE      2013. IF "IDFTTY" IS SET TO MOMENTS,
17863C                                       THEN SKIP ML STEP
17864C
17865      CHARACTER*4 ISUBRO
17866      CHARACTER*4 IBUGA3
17867      CHARACTER*4 IERROR
17868C
17869      CHARACTER*4 IWRITE
17870      CHARACTER*40 IDIST
17871      CHARACTER*4 ISUBN1
17872      CHARACTER*4 ISUBN2
17873      CHARACTER*4 ISTEPN
17874C
17875      INTEGER IFLAG
17876C
17877      DOUBLE PRECISION TOL
17878      DOUBLE PRECISION XPAR(2)
17879      DOUBLE PRECISION FVEC(2)
17880CCCCC DOUBLE PRECISION DAE
17881CCCCC DOUBLE PRECISION DRE
17882CCCCC DOUBLE PRECISION DXSTRT
17883CCCCC DOUBLE PRECISION DXLOW
17884CCCCC DOUBLE PRECISION DXUP
17885C
17886      DOUBLE PRECISION BE4FUN
17887      EXTERNAL BE4FUN
17888      DOUBLE PRECISION BE4FU2
17889      EXTERNAL BE4FU2
17890C
17891CCCCC DOUBLE PRECISION DEPS
17892      DOUBLE PRECISION DN
17893CCCCC DOUBLE PRECISION DANS(10)
17894      DOUBLE PRECISION DA
17895      DOUBLE PRECISION DB
17896CCCCC DOUBLE PRECISION DC
17897CCCCC DOUBLE PRECISION DALPHA
17898CCCCC DOUBLE PRECISION DBETA
17899CCCCC DOUBLE PRECISION DALPBE
17900      DOUBLE PRECISION DTERM1
17901      DOUBLE PRECISION DTERM2
17902CCCCC DOUBLE PRECISION DTERM3
17903CCCCC DOUBLE PRECISION DTERM4
17904CCCCC DOUBLE PRECISION DTERM5
17905CCCCC DOUBLE PRECISION DTERM6
17906CCCCC DOUBLE PRECISION DTERM7
17907CCCCC DOUBLE PRECISION DTERM8
17908      DOUBLE PRECISION DSUM1
17909      DOUBLE PRECISION DSUM2
17910      DOUBLE PRECISION DSUM3
17911      DOUBLE PRECISION DSUM4
17912C
17913C---------------------------------------------------------------------
17914C
17915      DOUBLE PRECISION DM1
17916      DOUBLE PRECISION DM2
17917      DOUBLE PRECISION DM3
17918      DOUBLE PRECISION DM4
17919C
17920      DOUBLE PRECISION DM1P
17921      DOUBLE PRECISION DM2P
17922      DOUBLE PRECISION DM3P
17923      DOUBLE PRECISION DM4P
17924      COMMON /BET4ML/ DM2P, DM3P, DM4P
17925C
17926      DOUBLE PRECISION SIGMA
17927      DOUBLE PRECISION S5
17928      DOUBLE PRECISION S6
17929      DOUBLE PRECISION S7
17930      DOUBLE PRECISION S8
17931      DOUBLE PRECISION DXMIN
17932      DOUBLE PRECISION DXMAX
17933      COMMON /BET4M2/ S5, S6, S7, S8, SIGMA, DXMIN, DXMAX
17934C
17935C---------------------------------------------------------------------
17936C
17937      DIMENSION Y(*)
17938      DOUBLE PRECISION DTEMP1(*)
17939C
17940      INCLUDE 'DPCOST.INC'
17941C
17942C---------------------------------------------------------------------
17943C
17944      INCLUDE 'DPCOP2.INC'
17945C
17946C-----START POINT-----------------------------------------------------
17947C
17948      ISUBN1='BETM'
17949      ISUBN2='L4  '
17950C
17951      IWRITE='OFF'
17952      IERROR='NO'
17953C
17954      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML4')THEN
17955        WRITE(ICOUT,999)
17956  999   FORMAT(1X)
17957        CALL DPWRST('XXX','WRIT')
17958        WRITE(ICOUT,51)
17959   51   FORMAT('**** AT THE BEGINNING OF BETML1--')
17960        CALL DPWRST('XXX','WRIT')
17961        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,MAXNXT
17962   52   FORMAT('IBUGA3,ISUBRO,N,MAXNXT = ',A4,2X,A4,2X,2I8)
17963        CALL DPWRST('XXX','WRIT')
17964        WRITE(ICOUT,53)AUSER,BUSER
17965   53   FORMAT('AUSER,BUSER = ',2G15.7)
17966        CALL DPWRST('XXX','WRIT')
17967        DO56I=1,MIN(N,100)
17968          WRITE(ICOUT,57)I,Y(I)
17969   57     FORMAT('I,Y(I) = ',I8,G15.7)
17970          CALL DPWRST('XXX','WRIT')
17971   56   CONTINUE
17972      ENDIF
17973C
17974C               ******************************************
17975C               **  STEP 1--                            **
17976C               **  CARRY OUT CALCULATIONS              **
17977C               **  FOR BETA MLE ESTIMATE               **
17978C               ******************************************
17979C
17980      ISTEPN='1'
17981      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML4')
17982     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
17983C
17984      AMOM=CPUMIN
17985      BMOM=CPUMIN
17986      ALPHMO=CPUMIN
17987      BETAMO=CPUMIN
17988      AML=CPUMIN
17989      BML=CPUMIN
17990      ALPHML=CPUMIN
17991      BETAML=CPUMIN
17992C
17993      IDIST='BETA'
17994      IFLAG=0
17995      CALL SORT(Y,N,Y)
17996      CALL SUMRAW(Y,N,IDIST,IFLAG,
17997     1            XMEAN,XVAR,XSD,XMIN,XMAX,
17998     1            ISUBRO,IBUGA3,IERROR)
17999      IF(IERROR.EQ.'YES')GOTO9000
18000C
18001      DN=DBLE(N)
18002      DSUM1=0.0D0
18003      DSUM2=0.0D0
18004      DSUM3=0.0D0
18005      DSUM4=0.0D0
18006      DO1010I=1,N
18007        DSUM1=DSUM1 + DBLE(Y(I))
18008        DSUM2=DSUM2 + DBLE(Y(I))**2
18009        DSUM3=DSUM3 + DBLE(Y(I))**3
18010        DSUM4=DSUM4 + DBLE(Y(I))**4
18011 1010 CONTINUE
18012      DM1=DSUM1/DN
18013      DM2=DSUM2/DN
18014      DM3=DSUM3/DN
18015      DM4=DSUM4/DN
18016      DM1P=DM1
18017      DM2P=DM2 - DM1**2
18018      DM3P=DM3 - 3.0D0*DM1*DM2 + 2.0D0*(DM1**3)
18019      DM4P=DM4 - 4.0D0*DM1*DM3 + 6.0D0*(DM1**2)*DM2 - 3.0D0*(DM1**4)
18020C
18021      XPAR(1)=1.0D0
18022      XPAR(2)=1.0D0
18023C
18024      IOPT=2
18025      TOL=1.0D-6
18026      NVAR=2
18027      NPRINT=-1
18028      INFO=0
18029      LWA=MAXNXT
18030      CALL DNSQE(BE4FUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
18031     1           DTEMP1,MAXNXT,Y,N)
18032C
18033      ALPHMO=REAL(XPAR(1))
18034      BETAMO=REAL(XPAR(2))
18035C
18036      EPS=DBLE(XMAX - XMIN)*0.001D0
18037      DA=DBLE(ALPHMO)
18038      DB=DBLE(BETAMO)
18039      DTERM1=DA*(DA+DB+1.0D0)
18040      DTERM2=DB
18041      AMOM=DM1 - DSQRT(DM2P)*DSQRT(DTERM1/DTERM2)
18042      DTERM1=DB*(DA+DB+1.0D0)
18043      DTERM2=DA
18044      BMOM=DM1 + DSQRT(DM2P)*DSQRT(DTERM1/DTERM2)
18045      IF(AMOM.GE.XMIN)AMOM=XMIN - EPS
18046      IF(BMOM.LE.XMAX)BMOM=XMAX + EPS
18047C
18048C     NOW ATTEMPT ML ESTIMATION
18049C
18050      IF(IDFTTY.EQ.'MOME')THEN
18051        AML=CPUMIN
18052        BML=CPUMIN
18053        ALPHML=CPUMIN
18054        BETAML=CPUMIN
18055        GOTO9000
18056      ENDIF
18057C
18058      XPAR(1)=DBLE(AMOM)
18059      XPAR(2)=DBLE(BMOM)
18060C
18061      DXMIN=DBLE(XMIN)
18062      DXMAX=DBLE(XMAX)
18063C
18064      IF(DA.GE.DXMIN)THEN
18065        XPAR(1)=DXMIN - 0.1*(DXMAX-DXMIN)
18066      ENDIF
18067      IF(DB.LE.DXMAX)THEN
18068        XPAR(2)=DXMAX + 0.1*(DXMAX-DXMIN)
18069      ENDIF
18070C
18071      IOPT=2
18072      TOL=1.0D-5
18073      NVAR=2
18074      NPRINT=-1
18075      INFO=0
18076      LWA=MAXNXT
18077      CALL DNSQE(BE4FU2,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
18078     1           DTEMP1,MAXNXT,Y,N)
18079C
18080      IF(INFO.NE.1)THEN
18081        MLFLAG=1
18082        GOTO4099
18083      ELSE
18084        MLFLAG=0
18085      ENDIF
18086      AML=REAL(XPAR(1))
18087      BML=REAL(XPAR(2))
18088C
18089C     SOMETIMES WE CAN GET "CONVERGENCE" TO AN UNREASONABLE VALUE.
18090C     CHECK THAT LOWER/UPPER LIMITS WITHIN 3 TIMES THE WIDTH
18091C     OF THE DATA.
18092C
18093      XWIDTH=XMAX - XMIN
18094      XUPP=XMAX + 3.0*XWIDTH
18095      XLOW=XMIN - 3.0*XWIDTH
18096      IF(AML.LT.XLOW .OR. BML.GT.XUPP)THEN
18097        MLFLAG=1
18098        GOTO4099
18099      ENDIF
18100C
18101      ALPHML=REAL(S5*(SIGMA*S6-1.0D0)/(S6*(SIGMA*S5-1.0D0)-S5))
18102      BETAML=REAL(S6*(SIGMA*S5-1.0D0)/(S6*(SIGMA*S5-1.0D0)-S5))
18103C
18104 4099 CONTINUE
18105C
18106 9000 CONTINUE
18107      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'TML4')THEN
18108        WRITE(ICOUT,999)
18109        CALL DPWRST('XXX','WRIT')
18110        WRITE(ICOUT,9011)
18111 9011   FORMAT('**** AT THE END OF BETML1--')
18112        CALL DPWRST('XXX','WRIT')
18113        WRITE(ICOUT,9055)N,XMEAN,XSD,XMIN,XMAX
18114 9055   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
18115        CALL DPWRST('XXX','WRIT')
18116        WRITE(ICOUT,9056)AMON,BMOM,ALPHMO,BETAMO
18117 9056   FORMAT('AMON,BMOM,ALPHMO,BETAMO = ',4G15.7)
18118        CALL DPWRST('XXX','WRIT')
18119        WRITE(ICOUT,9057)MLFLAG,AML,BML,ALPHML,BETAML
18120 9057   FORMAT('MLFLAG,AML,BML,ALPHML,BETAML = ',I5,4G15.7)
18121        CALL DPWRST('XXX','WRIT')
18122      ENDIF
18123C
18124      RETURN
18125      END
18126      SUBROUTINE BETPDF(X,ALPHA,BETA,PDF)
18127C
18128C     NOTE--BETA PDF IS:
18129C              BETPDF(X,A,B) = X**(A-1)*(1-X)**(B-1)/BETA(A,B)
18130C           WHERE BETA(A,B) IS THE COMPLETE BETA FUNCTION.
18131C           USE LOGARITHMS TO OBTAIN:
18132C              LN(BETAPDF) = (A-1)*LN(X)+(B-1)*LN(1-X)-LN(BETA(A,B))
18133C           AND THEN TAKE EXPONENT.
18134C     WRITTEN BY--JAMES J. FILLIBEN
18135C                 STATISTICAL ENGINEERING DIVISION
18136C                 INFORMATION TECHNOLOGY LABORATORY
18137C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18138C                 GAITHERSBURG, MD 20899-8980
18139C                 PHONE--301-921-3651
18140C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18141C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
18142C     LANGUAGE--ANSI FORTRAN (1977)
18143C     VERSION NUMBER--94/8
18144C     ORIGINAL VERSION--SEPTEMBER 1994.
18145C
18146C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
18147C
18148C
18149      DOUBLE PRECISION DPDF
18150      DOUBLE PRECISION DALPHA
18151      DOUBLE PRECISION DBETA
18152      DOUBLE PRECISION DX
18153      DOUBLE PRECISION DTERM1
18154      DOUBLE PRECISION DTERM2
18155      DOUBLE PRECISION DTERM3
18156      DOUBLE PRECISION DTERM4
18157      DOUBLE PRECISION DLBETA
18158C---------------------------------------------------------------------
18159C
18160      INCLUDE 'DPCOP2.INC'
18161C
18162C-----START POINT-----------------------------------------------------
18163C
18164      PDF=0.0
18165      IF(ALPHA.LE.0.0 .OR. BETA.LE.0.0)THEN
18166        WRITE(ICOUT,101)
18167        CALL DPWRST('XXX','BUG ')
18168        WRITE(ICOUT,103)ALPHA
18169        CALL DPWRST('XXX','BUG ')
18170        WRITE(ICOUT,104)BETA
18171        CALL DPWRST('XXX','BUG ')
18172        GOTO9999
18173      ENDIF
18174C
18175C     IF ALPHA < 1, UNDEFINED AT 0
18176C     IF BETA  < 1, UNDEFINED AT 1
18177C
18178      IF(ALPHA.LT.1.0 .AND. BETA.LT.1.0)THEN
18179        IF(X.LE.0.0)THEN
18180          WRITE(ICOUT,301)X
18181          CALL DPWRST('XXX','BUG ')
18182          PDF=0.0
18183          GOTO9999
18184        ELSEIF(X.GE.1.0)THEN
18185          WRITE(ICOUT,402)X
18186          CALL DPWRST('XXX','BUG ')
18187          PDF=0.0
18188          GOTO9999
18189        ENDIF
18190      ELSEIF(ALPHA.LT.1.0)THEN
18191        IF(X.LE.0.0)THEN
18192          WRITE(ICOUT,301)X
18193          CALL DPWRST('XXX','BUG ')
18194          PDF=0.0
18195          GOTO9999
18196        ENDIF
18197        IF(X.GT.1.0)THEN
18198          WRITE(ICOUT,401)X
18199          CALL DPWRST('XXX','BUG ')
18200          PDF=0.0
18201          GOTO9999
18202        ENDIF
18203      ELSEIF(BETA.LT.1.0)THEN
18204        IF(X.LT.0.0)THEN
18205          WRITE(ICOUT,302)X
18206          CALL DPWRST('XXX','BUG ')
18207          PDF=0.0
18208          GOTO9999
18209        ENDIF
18210        IF(X.GE.1.0)THEN
18211          WRITE(ICOUT,402)X
18212          CALL DPWRST('XXX','BUG ')
18213          PDF=0.0
18214          GOTO9999
18215        ENDIF
18216      ENDIF
18217  101 FORMAT('***** ERROR IN BETCDF--EITHER THE ALPHA OR BETA IS ',
18218     1       'NON-POSITIVE.')
18219  103 FORMAT('      THE VALUE OF ALPHA IS ',G15.7)
18220  104 FORMAT('      THE VALUE OF BETA IS  ',G15.7)
18221  301 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETPDF IS ',
18222     1       'NON-POSITIVE.  IT HAS THE VALUE ',G15.7)
18223  302 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETPDF IS ',
18224     1       'NEGATIVE.  IT HAS THE VALUE ',G15.7)
18225  401 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETPDF IS GREATER ',
18226     1       'THAN 1.  IT HAS THE VALUE ',G15.7)
18227  402 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BETPDF IS GREATER ',
18228     1       'THAN OR EQUAL TO 1.  IT HAS THE VALUE ',G15.7)
18229C
18230CCCCC IF(X.LE.0.0.OR.X.GE.1.0)GOTO900
18231      IF(X.LE.0.0)THEN
18232        IF(ALPHA.EQ.1.0 .AND. BETA.EQ.1.0)THEN
18233          PDF=1.0
18234        ELSE
18235          PDF=0.0
18236        ENDIF
18237      ELSEIF(X.GE.1.0)THEN
18238        IF(ALPHA.EQ.1.0 .AND. BETA.EQ.1.0)THEN
18239          PDF=1.0
18240        ELSE
18241          PDF=0.0
18242        ENDIF
18243      ELSE
18244        DX=DBLE(X)
18245        DALPHA=DBLE(ALPHA)
18246        DBETA=DBLE(BETA)
18247        DTERM3=DLBETA(DALPHA,DBETA)
18248        DTERM1=(DALPHA-1.D0)*DLOG(DX)
18249        DTERM2=(DBETA-1.D0)*DLOG(1.D0-DX)
18250        DTERM4=DTERM1 + DTERM2 - DTERM3
18251        DPDF=DEXP(DTERM4)
18252        PDF=REAL(DPDF)
18253      ENDIF
18254C
18255 9999 CONTINUE
18256      RETURN
18257      END
18258      SUBROUTINE BETPPF(P,ALPHA,BETA,PPF)
18259C
18260C     NOTE--ALGORITHM ADDED SEPTEMBER 1994 (ALAN)
18261C           USE ALGORITHM FROM KENNEDY AND GENTLE (PP. 109-112) WITH
18262C           THE MODIFICATION THAT WE USE OUR BETA CDF ROUTINE.
18263C     WRITTEN BY--JAMES J. FILLIBEN
18264C                 STATISTICAL ENGINEERING DIVISION
18265C                 INFORMATION TECHNOLOGY LABORATORY
18266C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18267C                 GAITHERSBURG, MD 20899-8980
18268C                 PHONE--301-921-3651
18269C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18270C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
18271C     LANGUAGE--ANSI FORTRAN (1977)
18272C     VERSION NUMBER--82/7
18273C     ORIGINAL VERSION--JULY      1981.
18274C     UPDATED         --FEBRUARY  1982.
18275C     UPDATED         --MAY       1982.
18276C
18277C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
18278C
18279      DOUBLE PRECISION DCDF
18280      DOUBLE PRECISION DALPHA
18281      DOUBLE PRECISION DBETA
18282      DOUBLE PRECISION DX
18283      DOUBLE PRECISION DBETAI
18284C
18285C---------------------------------------------------------------------
18286C
18287      INCLUDE 'DPCOP2.INC'
18288C
18289      DATA EPS /1.0E-6/
18290      DATA SIG /1.0E-5/
18291      DATA ZERO /0./
18292      DATA MAXIT /200/
18293C
18294C-----START POINT-----------------------------------------------------
18295C
18296C     CHECK THE INPUT ARGUMENTS FOR ERRORS
18297C
18298      IF(P.LT.0.0.OR.P.GT.1.0)GOTO50
18299      IF(ALPHA.LE.0.0)GOTO55
18300      IF(BETA.LE.0.0)GOTO60
18301      GOTO90
18302   50 WRITE(ICOUT,1)
18303      CALL DPWRST('XXX','BUG ')
18304      WRITE(ICOUT,46)P
18305      CALL DPWRST('XXX','BUG ')
18306      PPF=0.0
18307      RETURN
18308   55 WRITE(ICOUT,11)
18309      CALL DPWRST('XXX','BUG ')
18310      WRITE(ICOUT,46)ALPHA
18311      CALL DPWRST('XXX','BUG ')
18312      PPF=0.0
18313      RETURN
18314   60 WRITE(ICOUT,25)
18315      CALL DPWRST('XXX','BUG ')
18316      WRITE(ICOUT,46)BETA
18317      CALL DPWRST('XXX','BUG ')
18318      PPF=0.0
18319      GOTO9999
18320   90 CONTINUE
18321    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO ',
18322     1       'BETPPF IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
18323   11 FORMAT('***** ERROR--THE SECOND ARGUMENT TO ',
18324     1       'BETPPF IS NON-POSITIVE')
18325   25 FORMAT('***** ERROR--THE THIRD ARGUMENT TO ',
18326     1       'BETPPF IS NON-POSITIVE')
18327   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
18328C
18329      A = ALPHA
18330      B = BETA
18331C
18332      IERR=0
18333      IC = 0
18334      AB = A/B
18335      XL = 0.0
18336      XR = 1.0
18337      FXL = -P
18338      FXR = 1.0 - P
18339CCCCC INVALID P EXPLICITLY CHECKED FOR EARLIER.
18340      IF(FXL*FXR .GT. ZERO)GOTO50
18341C
18342C  BISECTION METHOD
18343C
18344  105 CONTINUE
18345      X = (XL+XR)*0.5
18346      DX=DBLE(X)
18347      DALPHA=DBLE(A)
18348      DBETA=DBLE(B)
18349      DCDF=DBETAI(DX,DALPHA,DBETA)
18350      P1=REAL(DCDF)
18351      PPF=X
18352CCCCC IF(IERR.NE.0)THEN
18353CCCCC   WRITE(ICOUT,120)
18354CCCCC   CALL DPWRST('XXX','BUG ')
18355CCCCC ENDIF
18356CC120 FORMAT('***** FATAL ERROR--ERROR IN BETCDF ROUTINE.  *****')
18357      FCS = P1 - P
18358      IF(FCS*FXL.GT.ZERO)GOTO110
18359      XR = X
18360      FXR = FCS
18361      GOTO115
18362  110 CONTINUE
18363      XL = X
18364      FXL = FCS
18365  115 CONTINUE
18366      XRML = XR - XL
18367      IF(XRML.LE.SIG .AND. ABS(FCS).LE.EPS)GOTO9999
18368      IC = IC + 1
18369      IF(IC.LE.MAXIT)GOTO105
18370      WRITE(ICOUT,130)
18371      CALL DPWRST('XXX','BUG ')
18372  130 FORMAT('***** FATAL ERROR--BETPPF ROUTINE DID NOT CONVERGE. ***')
18373      GOTO9999
18374C
18375 9999 CONTINUE
18376      RETURN
18377      END
18378      SUBROUTINE BETRAN(N,ALPHA,BETA,ISEED,X)
18379C
18380C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
18381C              FROM THE BETA DISTRIBUTION
18382C          WITH SINGLE PRECISION SHAPE
18383C          PARAMETERS = ALPHA AND BETA.
18384C              THE PROTOTYPE BETA DISTRIBUTION USED
18385C              HEREIN HAS MEAN = ALPHA/(ALPHA+BETA)
18386C              AND STANDARD DEVIATION =
18387C              SQRT((ALPHA*BETA) / ((ALPHA+BETA)**2)*(ALPHA+BETA+1))
18388C              THIS DISTRIBUTION IS DEFINED FOR ALL X
18389C              BETWEEN 0.0 (INCLUSIVELY) AND 1.0 (INCLUSIVELY).
18390C              AND HAS THE PROBABILITY DENSITY FUNCTION
18391C              F(X) = (1/CONSTANT) * X**(ALPHA-1) * (1.0-X)**(BETA-1)
18392C              WHERE THE CONSTANT = THE BETA FUNCTION EVALUATED
18393C              AT THE VALUES ALPHA AND BETA.
18394C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
18395C                                OF RANDOM NUMBERS TO BE
18396C                                GENERATED.
18397C                     --ALPHA  = THE SINGLE PRECISION VALUE OF THE
18398C                                FIRST  SHAPE PARAMETER.
18399C                                ALPHA SHOULD BE GREATER THAN
18400C                                OR EQUAL TO 1.0.
18401C                     --BETA   = THE SINGLE PRECISION VALUE OF THE
18402C                                SECOND SHAPE PARAMETER.
18403C                                BETA  SHOULD BE GREATER THAN
18404C                                OR EQUAL TO 1.0.
18405C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
18406C                                (OF DIMENSION AT LEAST N)
18407C                                INTO WHICH THE GENERATED
18408C                                RANDOM SAMPLE WILL BE PLACED.
18409C     OUTPUT--A RANDOM SAMPLE OF SIZE N
18410C             FROM THE BETA DISTRIBUTION
18411C             WITH SHAPE PARAMETER VALUES = ALPHA AND BETA.
18412C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
18413C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
18414C                   OF N FOR THIS SUBROUTINE.
18415C                 --ALPHA SHOULD BE GREATER THAN
18416C                   OR EQUAL TO 1.0.
18417C                 --BETA  SHOULD BE GREATER THAN
18418C                   OR EQUAL TO 1.0.
18419C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, NORRAN.
18420C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT, EXP.
18421C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
18422C     LANGUAGE--ANSI FORTRAN (1977)
18423C     REFERENCES--GREENWOOD, 'A FAST GENERATOR FOR
18424C                 BETA-DISTRIBUTED RANDOM VARIABLES',
18425C                 COMPSTAT 1974, PROCEEDINGS IN
18426C                 COMPUTATIONAL STATISTICS, VIENNA,
18427C                 SEPTEMBER, 1974, PAGES 19-27.
18428C               --TOCHER, THE ART OF SIMULATION,
18429C                 1963, PAGES 24-27.
18430C               --HAMMERSLEY AND HANDSCOMB, MONTE CARLO METHODS,
18431C                 1964, PAGES 36-37.
18432C               --JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
18433C                 DISTRIBUTIONS--2, 1970, PAGES 37-56.
18434C               --HASTINGS AND PEACOCK, STATISTICAL
18435C                 DISTRIBUTIONS--A HANDBOOK FOR
18436C                 STUDENTS AND PRACTITIONERS, 1975,
18437C                 PAGES 30-35.
18438C               --NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY APPLIED MATHEMATICS
18439C                 SERIES 55, 1964, PAGE 952.
18440C     WRITTEN BY--JAMES J. FILLIBEN
18441C                 STATISTICAL ENGINEERING DIVISION
18442C                 INFORMATION TECHNOLOGY LABORATORY
18443C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18444C                 GAITHERSBURG, MD 20899-8980
18445C                 PHONE--301-921-3651
18446C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18447C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
18448C     LANGUAGE--ANSI FORTRAN (1966)
18449C     VERSION NUMBER--82.3
18450C     ORIGINAL VERSION--NOVEMBER  1975.
18451C     UPDATED         --FEBRUARY  1976.
18452C     UPDATED         --JUNE      1978.
18453C     UPDATED         --DECEMBER  1981.
18454C     UPDATED         --DECEMBER  2001. FOR ALPHA < 1 OR BETA < 1,
18455C                                       USE PERCENT POINT METHOD
18456C     UPDATED         --NOVEMBER  2001. FOR ALPHA < 1 OR BETA < 1,
18457C                                       USE JOHNK'S ALGORITHM
18458C
18459C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
18460C
18461C---------------------------------------------------------------------
18462C
18463      DIMENSION X(*)
18464C
18465      DIMENSION XN(2)
18466      DIMENSION U(2)
18467C
18468C---------------------------------------------------------------------
18469C
18470      INCLUDE 'DPCOP2.INC'
18471C
18472C-----DATA STATEMENTS-------------------------------------------------
18473C
18474      DATA ATHIRD/0.33333333/
18475      DATA SQRT3 /1.73205081/
18476C
18477C-----START POINT-----------------------------------------------------
18478C
18479C     CHECK THE INPUT ARGUMENTS FOR ERRORS
18480C
18481      IF(N.LT.1)GOTO50
18482      IF(ALPHA.LE.0.0)GOTO60
18483      IF(BETA.LT.0.0)GOTO65
18484      GOTO90
18485   50 WRITE(ICOUT, 5)
18486      CALL DPWRST('XXX','BUG ')
18487      WRITE(ICOUT,47)N
18488      CALL DPWRST('XXX','BUG ')
18489      RETURN
18490   60 WRITE(ICOUT,16)
18491      CALL DPWRST('XXX','BUG ')
18492      WRITE(ICOUT,46)ALPHA
18493      CALL DPWRST('XXX','BUG ')
18494      RETURN
18495   65 WRITE(ICOUT,26)
18496      CALL DPWRST('XXX','BUG ')
18497      WRITE(ICOUT,46)BETA
18498      CALL DPWRST('XXX','BUG ')
18499      RETURN
18500   90 CONTINUE
18501    5 FORMAT('***** FATAL ERROR--THE FIRST  INPUT ARGUMENT TO THE ',
18502     1' BETRAN SUBROUTINE IS NON-POSITIVE *****')
18503   16 FORMAT('***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE ',
18504     1' BETRAN SUBROUTINE IS SMALLER THAN 0.0 *****')
18505   26 FORMAT('***** FATAL ERROR--THE THIRD  INPUT ARGUMENT TO THE ',
18506     1' BETRAN SUBROUTINE IS SMALLER THAN 0.0 *****')
18507   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
18508   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
18509C
18510C     GENERATE N BETA RANDOM NUMBERS
18511C     BY USING THE FACT THAT
18512C     IF X1 IS A GAMMA VARIATE WITH PARAMETER ALPHA
18513C     AND IF X2 IS A GAMMA VARIATE WITH PARAMETER BETA,
18514C     THEN THE RATIO X1/(X1+X2) IS A BETA VARIATE
18515C     WITH PARAMETERS ALPHA AND BETA.
18516C
18517C     TO GENERATE N GAMMA DISTRIBUTION RANDOM NUMBERS,
18518C     USE GREENWOOD'S REJECTION ALGORITHM--
18519C     1) GENERATE A NORMAL RANDOM NUMBER;
18520C     2) TRANSFORM THE NORMAL VARIATE TO AN APPROXIMATE
18521C        GAMMA VARIATE USING THE WILSON-HILFERTY
18522C        APPROXIMATION (SEE THE JOHNSON AND KOTZ
18523C        REFERENCE, PAGE 176);
18524C     3) FORM THE REJECTION FUNCTION VALUE, BASED
18525C        ON THE PROBABILITY DENSITY FUNCTION VALUE
18526C        OF THE ACTUAL DISTRIBUTION OF THE PSEUDO-GAMMA
18527C        VARIATE, AND THE PROBABILITY DENSITY FUNCTION VALUE
18528C        OF A TRUE GAMMA VARIATE.
18529C     4) GENERATE A UNIFORM RANDOM NUMBER;
18530C     5) IF THE UNIFORM RANDOM NUMBER IS LESS THAN
18531C        THE REJECTION FUNCTION VALUE, THEN ACCEPT
18532C        THE PSEUDO-RANDOM NUMBER AS A GAMMA VARIATE;
18533C        IF THE UNIFORM RANDOM NUMBER IS LARGER THAN
18534C        THE REJECTION FUNCTION VALUE, THEN REJECT
18535C        THE PSEUDO-RANDOM NUMBER AS A GAMMA VARIATE.
18536C
18537C     FOR ALPHA < 1 AND BETA < 1, USE JOHNK'S ALGORITHM
18538C     (JAMES GENTLE, "RANDOM NUMBER GENERATION AND MONTE CARLO
18539C     METHODS", SECOND EDITION, SPRINGER-VERLANG, 2003.
18540C     FOR ALPHA OR BETA <= 0, THEN USE THE PERCENT POINT METHOD.
18541C
18542      IF(ALPHA.EQ.1.0 .AND. BETA.EQ.1.0)THEN
18543        CALL UNIRAN(N,ISEED,X)
18544        GOTO9000
18545      ENDIF
18546C
18547      IF(ALPHA.LT.1.0 .AND. BETA.LT.1.0)THEN
18548        NTEMP=1
18549        DO400I=1,N
18550  401     CONTINUE
18551          CALL UNIRAN(NTEMP,ISEED,X(I))
18552          U1=X(I)
18553          CALL UNIRAN(NTEMP,ISEED,X(I))
18554          U2=X(I)
18555          V1=U1**(1.0/ALPHA)
18556          V2=U2**(1.0/BETA)
18557          W=V1 + V2
18558          IF(W.GT.1)GOTO401
18559          X(I)=V1/W
18560  400   CONTINUE
18561        GOTO9000
18562      ENDIF
18563C
18564C     FOR CASE WHERE ALPHA < 1 AND BETA > 1 (OR SIMILARLY,
18565C     WHEN ALPHA > 1 AND BETA < 1), USE ALGORITHM GIVEN BY
18566C     IN: "A FAMILY OF SWITCHING ALGORITHMS FOR THE COMPUTER
18567C     GENERATION OF BETA RANDOM VARIABLES", A. C. ATKINSON,
18568C     BIOMETRIKA, 1979, 66, 1, PP. 141-145.
18569C
18570      IF(ALPHA.LE.1.0 .AND. BETA.GE.1.0)THEN
18571        NTEMP=2
18572        P=ALPHA
18573        Q=BETA
18574        S1=1.0
18575CCCCC   T=(ALPHA-1.0)/(BETA+1.0-ALPHA)
18576        T=(1.0-ALPHA)/(BETA+1.0-ALPHA)
18577        S2=T**(ALPHA-1.0)
18578        R=BETA*T/(BETA*T + ALPHA*(1.0-T)**BETA)
18579C
18580        DO600I=1,N
18581  610     CONTINUE
18582          CALL UNIRAN(NTEMP,ISEED,U)
18583          U1=U(1)
18584          U2=U(2)
18585          IF(U1.LE.R)THEN
18586            XTEMP=T*(U1/R)**(1.0/P)
18587            H1=XTEMP**(ALPHA-P)*(1.0-XTEMP)**(BETA-1.0)
18588            IF(S1*U2.LE.H1)THEN
18589              X(I)=XTEMP
18590              GOTO600
18591            ELSE
18592              GOTO610
18593            ENDIF
18594          ELSE
18595            XTEMP=1.0 - (1.0-T)*((1.0-U1)/(1.0-R))**(1.0/Q)
18596            H2=XTEMP**(ALPHA-1.0)
18597            IF(S2*U2.LE.H2)THEN
18598              X(I)=XTEMP
18599              GOTO600
18600            ELSE
18601              GOTO610
18602            ENDIF
18603          ENDIF
18604  600   CONTINUE
18605CCCCC   DO600I=1,N
18606CCCCC     CALL BETPPF(X(I),ALPHA,BETA,XTEMP)
18607CCCCC     X(I)=XTEMP
18608CC600   CONTINUE
18609        GOTO9000
18610      ENDIF
18611      IF(ALPHA.GE.1.0 .AND. BETA.LE.1.0)THEN
18612C
18613        ALPSAV=ALPHA
18614        BETSAV=BETA
18615        ALPHA=BETSAV
18616        BETA=ALPSAV
18617C
18618        NTEMP=2
18619        P=ALPHA
18620        Q=BETA
18621        S1=1.0
18622        T=(1.0-ALPHA)/(BETA+1.0-ALPHA)
18623        S2=T**(ALPHA-1.0)
18624        R=BETA*T/(BETA*T + ALPHA*(1.0-T)**BETA)
18625C
18626        DO700I=1,N
18627  710     CONTINUE
18628          CALL UNIRAN(NTEMP,ISEED,U)
18629          U1=U(1)
18630          U2=U(2)
18631          IF(U1.LE.R)THEN
18632            XTEMP=T*(U1/R)**(1.0/P)
18633            H1=XTEMP**(ALPHA-P)*(1.0-XTEMP)**(BETA-1.0)
18634            IF(S1*U2.LE.H1)THEN
18635              X(I)=1.0-XTEMP
18636              GOTO700
18637            ELSE
18638              GOTO710
18639            ENDIF
18640          ELSE
18641            XTEMP=1.0 - (1.0-T)*((1.0-U1)/(1.0-R))**(1.0/Q)
18642            H2=XTEMP**(ALPHA-1.0)*(1.0-XTEMP)**(BETA-Q)
18643            IF(S2*U2.LE.H2)THEN
18644              X(I)=1.0-XTEMP
18645              GOTO700
18646            ELSE
18647              GOTO710
18648            ENDIF
18649          ENDIF
18650  700   CONTINUE
18651        ALPHA=ALPSAV
18652        BETA=BETSAV
18653        GOTO9000
18654      ENDIF
18655C
18656      A1=1.0/(9.0*ALPHA)
18657      B1=SQRT(A1)
18658      XN01=-SQRT3+B1
18659      XG01=ALPHA*(1.0-A1+B1*XN01)**3
18660      A2=1.0/(9.0*BETA)
18661      B2=SQRT(A2)
18662      XN02=-SQRT3+B2
18663      XG02=BETA*(1.0-A2+B2*XN02)**3
18664C
18665      DO100I=1,N
18666C
18667  150 CALL NORRAN(1,ISEED,XN)
18668      XG=ALPHA*(1.0-A1+B1*XN(1))**3
18669      IF(XG.LT.0.0)GOTO150
18670      TERM=(XG/XG01)**(ALPHA-ATHIRD)
18671      ARG=0.5*XN(1)*XN(1)-XG-0.5*XN01*XN01+XG01
18672      FUNCT=TERM*EXP(ARG)
18673      CALL UNIRAN(1,ISEED,U)
18674      IF(U(1).LE.FUNCT)GOTO170
18675      GOTO150
18676  170 XG1=XG
18677C
18678  250 CALL NORRAN(1,ISEED,XN)
18679      XG=BETA*(1.0-A2+B2*XN(1))**3
18680      IF(XG.LT.0.0)GOTO250
18681      TERM=(XG/XG02)**(BETA-ATHIRD)
18682      ARG=0.5*XN(1)*XN(1)-XG-0.5*XN02*XN02+XG02
18683      FUNCT=TERM*EXP(ARG)
18684      CALL UNIRAN(1,ISEED,U)
18685      IF(U(1).LE.FUNCT)GOTO270
18686      GOTO250
18687  270 XG2=XG
18688C
18689      X(I)=XG1/(XG1+XG2)
18690C
18691  100 CONTINUE
18692C
18693 9000 CONTINUE
18694      RETURN
18695      END
18696      SUBROUTINE BE4FUN (N,X,FVEC,IFLAG,XDATA,NOBS)
18697C
18698C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
18699C              FOUR-PARAMETER BETA METHOD OF MOMENT EQUATIONS
18700C              TO ESTIMATE THE ALPHA AND BETA SHAPE PARAMETERS:
18701C
18702C              {2*(BETA-ALPHA)/(ALPHA+BETA+2)}*
18703C              SQRT((ALPHA+BETA+1)/(ALPHA*BETA)) - M3/M2**(3/2)=0
18704C
18705C              3*(ALPHA+BETA+1)*[2*(ALPHA+BETA)**2 +
18706C              ALPHA*APHA2*(ALPHA+BETA-6)]/
18707C              {ALPHA*BETA*(ALPHA+BETA+2)*(ALPHA+BETA+3)} -
18708C              M4/M2**2 = 0
18709C
18710C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
18711C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
18712C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
18713C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
18714C     EXAMPLE--BETA MAXIMUM LIKELIHOOD Y
18715C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN
18716C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
18717C                1999, CHAPTER 14.
18718C     WRITTEN BY--ALAN HECKERT
18719C                 STATISTICAL ENGINEERING DIVISION
18720C                 INFORMATION TECHNOLOGY LABORATORY
18721C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18722C                 GAITHERSBURG, MD 20899-8980
18723C                 PHONE--301-975-2899
18724C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18725C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
18726C     LANGUAGE--ANSI FORTRAN (1977)
18727C     VERSION NUMBER--2007/6
18728C     ORIGINAL VERSION--JUNE      2007.
18729C
18730C---------------------------------------------------------------------
18731C
18732      DOUBLE PRECISION X(*)
18733      DOUBLE PRECISION FVEC(*)
18734      REAL XDATA(*)
18735C
18736      DOUBLE PRECISION DA
18737      DOUBLE PRECISION DB
18738      DOUBLE PRECISION DTERM1
18739      DOUBLE PRECISION DTERM2
18740      DOUBLE PRECISION DTERM3
18741      DOUBLE PRECISION DTERM4
18742      DOUBLE PRECISION DTERM5
18743      DOUBLE PRECISION DTERM6
18744      DOUBLE PRECISION DTERM7
18745C
18746C---------------------------------------------------------------------
18747C
18748      DOUBLE PRECISION DM2, DM3, DM4
18749      COMMON /BET4ML/ DM2, DM3, DM4
18750C
18751      INCLUDE 'DPCOBE.INC'
18752      INCLUDE 'DPCOP2.INC'
18753C
18754C-----START POINT-----------------------------------------------------
18755C
18756      N=2
18757      IFLAG=0
18758C
18759      IF(ISUBG4.EQ.'4FUN')THEN
18760        WRITE(ICOUT,52)NOBS,XDATA(1)
18761   52   FORMAT('NOBS,XDATA(1) = ',I8,G15.7)
18762        CALL DPWRST('XXX','BUG ')
18763      ENDIF
18764C
18765      DA=X(1)
18766      DB=X(2)
18767C
18768      DTERM1=2.0D0*(DB-DA)/(DA+DB+2.0D0)
18769      DTERM2=DSQRT((DA+DB+1.0D0)/(DA*DB))
18770      DTERM3=DM3/(DM2**1.5)
18771C
18772      DTERM4=3.0D0*(DA+DB+1.0D0)
18773      DTERM5=2.0D0*(DA+DB)**2 + DA*DB*(DA+DB-6.0D0)
18774      DTERM6=DA*DB*(DA+DB+2.0D0)*(DA+DB+3.0D0)
18775      DTERM7=DM4/(DM2**2)
18776C
18777      FVEC(1)=(DTERM1*DTERM2) - DTERM3
18778      FVEC(2)=(DTERM4*DTERM5/DTERM6) - DTERM7
18779C
18780      RETURN
18781      END
18782      SUBROUTINE BE4FU2 (N, X, FVEC, IFLAG, XDATA, NOBS)
18783C
18784C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
18785C              FOUR-PARAMETER BETA MAXIMUM LIKELIHOOD EQUATIONS
18786C              TO ESTIMATE THE A AND B LOWER AND UPPER LIMIT
18787C              PARAMETERS:
18788C
18789C              PSI(S5*(SIGMA*S6-1)/(S6*(SIGMA*S5-1)-S5)) -
18790C              PSI(1 + S5*SIGMA*S6/(S6*(SIGMA*S5-1)-S5)) -
18791C              S7 - LOG(SIGMA) = 0
18792C
18793C              PSI(S6*(SIGMA*S5-1)/(S6*(SIGMA*S5-1)-S5)) -
18794C              PSI(1 + S5*SIGMA*S6/(S6*(SIGMA*S5-1)-S5)) -
18795C              S8 - LOG(SIGMA) = 0
18796C
18797C              WHERE
18798C
18799C              PSI = DIGAMMA FUNCTION
18800C              S5 = (1/N)*SUM[1/(X(I) - A)]
18801C              S6 = (1/N)*SUM[1/(X(I) - B)]
18802C              S7 = (1/N)*SUM[LOG(X(I) - A)]
18803C              S8 = (1/N)*SUM[LOG(B - X(I))]
18804C              SIGMA = B - A
18805C
18806C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
18807C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
18808C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
18809C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
18810C     EXAMPLE--FOUR PARAMETER BETA MAXIMUM LIKELIHOOD Y
18811C     REFERENCE--KARL BURY, "STATISTICAL DISTRIBUTIONS IN
18812C                ENGINEERING", CAMBRIDGE UNIVERSITY PRESS,
18813C                1999, CHAPTER 14.
18814C     WRITTEN BY--JAMES J. FILLIBEN
18815C                 STATISTICAL ENGINEERING DIVISION
18816C                 INFORMATION TECHNOLOGY LABORATORY
18817C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
18818C                 GAITHERSBURG, MD 20899-8980
18819C                 PHONE--301-975-2855
18820C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
18821C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
18822C     LANGUAGE--ANSI FORTRAN (1977)
18823C     VERSION NUMBER--2007/6
18824C     ORIGINAL VERSION--JUNE      2007.
18825C
18826C---------------------------------------------------------------------
18827C
18828      DOUBLE PRECISION X(*)
18829      DOUBLE PRECISION FVEC(*)
18830      REAL XDATA(*)
18831C
18832      DOUBLE PRECISION DA
18833      DOUBLE PRECISION DB
18834      DOUBLE PRECISION DTERM1
18835      DOUBLE PRECISION DTERM2
18836      DOUBLE PRECISION DTERM3
18837      DOUBLE PRECISION DENOM
18838      DOUBLE PRECISION DX
18839      DOUBLE PRECISION DN
18840      DOUBLE PRECISION DLGSIG
18841      DOUBLE PRECISION DPSI
18842C
18843      EXTERNAL DPSI
18844C
18845C---------------------------------------------------------------------
18846C
18847      DOUBLE PRECISION SIGMA
18848      DOUBLE PRECISION S5
18849      DOUBLE PRECISION S6
18850      DOUBLE PRECISION S7
18851      DOUBLE PRECISION S8
18852      DOUBLE PRECISION DXMIN
18853      DOUBLE PRECISION DXMAX
18854      COMMON /BET4M2/ S5, S6, S7, S8, SIGMA, DXMIN, DXMAX
18855C
18856      INCLUDE 'DPCOP2.INC'
18857C
18858C-----START POINT-----------------------------------------------------
18859C
18860      N=2
18861      IFLAG=0
18862C
18863      DA=X(1)
18864      DB=X(2)
18865      SIGMA=DB - DA
18866      DLGSIG=DLOG(SIGMA)
18867      DN=DBLE(NOBS)
18868      IF(DA.GE.DXMIN .OR. DB.LE.DXMAX) THEN
18869        FVEC(1)=99.0D0
18870        FVEC(2)=99.0D0
18871        GOTO9000
18872      ENDIF
18873C
18874      S5=0.0D0
18875      S6=0.0D0
18876      S7=0.0D0
18877      S8=0.0D0
18878C
18879      DO100I=1,NOBS
18880        DX=DBLE(XDATA(I))
18881        S5=S5 + 1.0D0/(DX-DA)
18882        S6=S6 + 1.0D0/(DB-DX)
18883        S7=S7 + DLOG(DX-DA)
18884        S8=S8 + DLOG(DB-DX)
18885  100 CONTINUE
18886      S5=S5/DN
18887      S6=S6/DN
18888      S7=S7/DN
18889      S8=S8/DN
18890C
18891      DENOM=S6*(SIGMA*S5 - 1.0D0) - S5
18892      DTERM1=S5*(SIGMA*S6 - 1.0D0)
18893      DTERM2=DPSI(DTERM1/DENOM)
18894      DTERM3=DPSI(1.0D0 + (SIGMA*S5*S6/DENOM))
18895      FVEC(1)=DTERM2 - DTERM3 - S7 + DLGSIG
18896C
18897      DTERM1=S6*(SIGMA*S5 - 1.0D0)
18898      DTERM2=DPSI(DTERM1/DENOM)
18899      DTERM3=DPSI(1.0D0 + (SIGMA*S5*S6/DENOM))
18900      FVEC(2)=DTERM2 - DTERM3 - S8 + DLGSIG
18901C
18902 9000 CONTINUE
18903      RETURN
18904      END
18905      FUNCTION BI (X)
18906C***BEGIN PROLOGUE  BI
18907C***PURPOSE  Evaluate the Bairy function (the Airy function of the
18908C            second kind).
18909C***LIBRARY   SLATEC (FNLIB)
18910C***CATEGORY  C10D
18911C***TYPE      SINGLE PRECISION (BI-S, DBI-D)
18912C***KEYWORDS  BAIRY FUNCTION, FNLIB, SPECIAL FUNCTIONS
18913C***AUTHOR  Fullerton, W., (LANL)
18914C***DESCRIPTION
18915C
18916C BI(X) calculates the Airy function of the second kind for real
18917C argument X.
18918C
18919C Series for BIF        on the interval -1.00000D+00 to  1.00000D+00
18920C                                        with weighted error   1.88E-19
18921C                                         log weighted error  18.72
18922C                               significant figures required  17.74
18923C                                    decimal places required  19.20
18924C
18925C Series for BIG        on the interval -1.00000D+00 to  1.00000D+00
18926C                                        with weighted error   2.61E-17
18927C                                         log weighted error  16.58
18928C                               significant figures required  15.17
18929C                                    decimal places required  17.03
18930C
18931C Series for BIF2       on the interval  1.00000D+00 to  8.00000D+00
18932C                                        with weighted error   1.11E-17
18933C                                         log weighted error  16.95
18934C                        approx significant figures required  16.5
18935C                                    decimal places required  17.45
18936C
18937C Series for BIG2       on the interval  1.00000D+00 to  8.00000D+00
18938C                                        with weighted error   1.19E-18
18939C                                         log weighted error  17.92
18940C                        approx significant figures required  17.2
18941C                                    decimal places required  18.42
18942C
18943C***REFERENCES  (NONE)
18944C***ROUTINES CALLED  BIE, CSEVL, INITS, R1MACH, R9AIMP, XERMSG
18945C***REVISION HISTORY  (YYMMDD)
18946C   770701  DATE WRITTEN
18947C   890531  Changed all specific intrinsics to generic.  (WRB)
18948C   890531  REVISION DATE from Version 3.2
18949C   891214  Prologue converted to Version 4.0 format.  (BAB)
18950C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
18951C   900326  Removed duplicate information from DESCRIPTION section.
18952C           (WRB)
18953C***END PROLOGUE  BI
18954C
18955C-----COMMON----------------------------------------------------------
18956C
18957      INCLUDE 'DPCOMC.INC'
18958      INCLUDE 'DPCOP2.INC'
18959C
18960      DIMENSION BIFCS(9), BIGCS(8), BIF2CS(10), BIG2CS(10)
18961      LOGICAL FIRST
18962      SAVE BIFCS, BIGCS, BIF2CS, BIG2CS, NBIF, NBIG, NBIF2,
18963     1 NBIG2, X3SML, XMAX, FIRST
18964      DATA BIFCS( 1) /   -.0167302164 7198664948E0 /
18965      DATA BIFCS( 2) /    .1025233583 424944561E0 /
18966      DATA BIFCS( 3) /    .0017083092 5073815165E0 /
18967      DATA BIFCS( 4) /    .0000118625 4546774468E0 /
18968      DATA BIFCS( 5) /    .0000000449 3290701779E0 /
18969      DATA BIFCS( 6) /    .0000000001 0698207143E0 /
18970      DATA BIFCS( 7) /    .0000000000 0017480643E0 /
18971      DATA BIFCS( 8) /    .0000000000 0000020810E0 /
18972      DATA BIFCS( 9) /    .0000000000 0000000018E0 /
18973      DATA BIGCS( 1) /    .0224662232 4857452E0 /
18974      DATA BIGCS( 2) /    .0373647754 5301955E0 /
18975      DATA BIGCS( 3) /    .0004447621 8957212E0 /
18976      DATA BIGCS( 4) /    .0000024708 0756363E0 /
18977      DATA BIGCS( 5) /    .0000000079 1913533E0 /
18978      DATA BIGCS( 6) /    .0000000000 1649807E0 /
18979      DATA BIGCS( 7) /    .0000000000 0002411E0 /
18980      DATA BIGCS( 8) /    .0000000000 0000002E0 /
18981      DATA BIF2CS( 1) /   0.0998457269 3816041E0 /
18982      DATA BIF2CS( 2) /    .4786249778 63005538E0 /
18983      DATA BIF2CS( 3) /    .0251552119 604330118E0 /
18984      DATA BIF2CS( 4) /    .0005820693 885232645E0 /
18985      DATA BIF2CS( 5) /    .0000074997 659644377E0 /
18986      DATA BIF2CS( 6) /    .0000000613 460287034E0 /
18987      DATA BIF2CS( 7) /    .0000000003 462753885E0 /
18988      DATA BIF2CS( 8) /    .0000000000 014288910E0 /
18989      DATA BIF2CS( 9) /    .0000000000 000044962E0 /
18990      DATA BIF2CS(10) /    .0000000000 000000111E0 /
18991      DATA BIG2CS( 1) /    .0333056621 45514340E0 /
18992      DATA BIG2CS( 2) /    .1613092151 23197068E0 /
18993      DATA BIG2CS( 3) /    .0063190073 096134286E0 /
18994      DATA BIG2CS( 4) /    .0001187904 568162517E0 /
18995      DATA BIG2CS( 5) /    .0000013045 345886200E0 /
18996      DATA BIG2CS( 6) /    .0000000093 741259955E0 /
18997      DATA BIG2CS( 7) /    .0000000000 474580188E0 /
18998      DATA BIG2CS( 8) /    .0000000000 001783107E0 /
18999      DATA BIG2CS( 9) /    .0000000000 000005167E0 /
19000      DATA BIG2CS(10) /    .0000000000 000000011E0 /
19001      DATA FIRST /.TRUE./
19002C***FIRST EXECUTABLE STATEMENT  BI
19003      IF (FIRST) THEN
19004         ETA = 0.1*R1MACH(3)
19005         NBIF  = INITS (BIFCS , 9, ETA)
19006         NBIG  = INITS (BIGCS , 8, ETA)
19007         NBIF2 = INITS (BIF2CS, 10, ETA)
19008         NBIG2 = INITS (BIG2CS, 10, ETA)
19009C
19010         X3SML = ETA**0.3333
19011         XMAX = (1.5*LOG(R1MACH(2)))**0.6666
19012      ENDIF
19013      FIRST = .FALSE.
19014C
19015      IF (X.GE.(-1.0)) GO TO 20
19016      CALL R9AIMP (X, XM, THETA)
19017      BI = XM * SIN(THETA)
19018      RETURN
19019C
19020 20   IF (X.GT.1.0) GO TO 30
19021      Z = 0.0
19022      IF (ABS(X).GT.X3SML) Z = X**3
19023      BI = 0.625 + CSEVL (Z, BIFCS, NBIF) + X*(0.4375 +
19024     1  CSEVL (Z, BIGCS, NBIG))
19025      RETURN
19026C
19027 30   IF (X.GT.2.0) GO TO 40
19028      Z = (2.0*X**3 - 9.0) / 7.0
19029      BI = 1.125 + CSEVL (Z, BIF2CS, NBIF2) + X*(0.625 +
19030     1  CSEVL (Z, BIG2CS, NBIG2))
19031      RETURN
19032C
19033 40   IF (X .GT. XMAX) THEN
19034        WRITE(ICOUT,1)
19035        CALL DPWRST('XXX','BUG ')
19036        BI = 0.0
19037        RETURN
19038      ENDIF
19039    1 FORMAT('***** ERORR FROM BI, OVERFLOWS BECAUSE THE ',
19040     1       'VALUE OF X IS TOO BIG.  ****')
19041C
19042      BI = BIE(X) * EXP(2.0*X*SQRT(X)/3.0)
19043      RETURN
19044C
19045      END
19046      FUNCTION BIE (X)
19047C***BEGIN PROLOGUE  BIE
19048C***PURPOSE  Calculate the Bairy function for a negative argument and an
19049C            exponentially scaled Bairy function for a non-negative
19050C            argument.
19051C***LIBRARY   SLATEC (FNLIB)
19052C***CATEGORY  C10D
19053C***TYPE      SINGLE PRECISION (BIE-S, DBIE-D)
19054C***KEYWORDS  BAIRY FUNCTION, EXPONENTIALLY SCALED, FNLIB,
19055C             SPECIAL FUNCTIONS
19056C***AUTHOR  Fullerton, W., (LANL)
19057C***DESCRIPTION
19058C
19059C Evaluate BI(X) for X .LE. 0  and  BI(X)*EXP(ZETA)  where
19060C ZETA = 2/3 * X**(3/2)  for X .GE. 0.0
19061C
19062C Series for BIF        on the interval -1.00000D+00 to  1.00000D+00
19063C                                        with weighted error   1.88E-19
19064C                                         log weighted error  18.72
19065C                               significant figures required  17.74
19066C                                    decimal places required  19.20
19067C
19068C Series for BIG        on the interval -1.00000D+00 to  1.00000D+00
19069C                                        with weighted error   2.61E-17
19070C                                         log weighted error  16.58
19071C                               significant figures required  15.17
19072C                                    decimal places required  17.03
19073C
19074C Series for BIF2       on the interval  1.00000D+00 to  8.00000D+00
19075C                                        with weighted error   1.11E-17
19076C                                         log weighted error  16.95
19077C                        approx significant figures required  16.5
19078C                                    decimal places required  17.45
19079C
19080C Series for BIG2       on the interval  1.00000D+00 to  8.00000D+00
19081C                                        with weighted error   1.19E-18
19082C                                         log weighted error  17.92
19083C                        approx significant figures required  17.2
19084C                                    decimal places required  18.42
19085C
19086C Series for BIP        on the interval  1.25000D-01 to  3.53553D-01
19087C                                        with weighted error   1.91E-17
19088C                                         log weighted error  16.72
19089C                               significant figures required  15.35
19090C                                    decimal places required  17.41
19091C
19092C Series for BIP2       on the interval  0.          to  1.25000D-01
19093C                                        with weighted error   1.05E-18
19094C                                         log weighted error  17.98
19095C                               significant figures required  16.74
19096C                                    decimal places required  18.71
19097C
19098C***REFERENCES  (NONE)
19099C***ROUTINES CALLED  CSEVL, INITS, R1MACH, R9AIMP
19100C***REVISION HISTORY  (YYMMDD)
19101C   770701  DATE WRITTEN
19102C   890206  REVISION DATE from Version 3.2
19103C   891214  Prologue converted to Version 4.0 format.  (BAB)
19104C***END PROLOGUE  BIE
19105C
19106C-----COMMON----------------------------------------------------------
19107C
19108      INCLUDE 'DPCOMC.INC'
19109      INCLUDE 'DPCOP2.INC'
19110C
19111      LOGICAL FIRST
19112      DIMENSION BIFCS(9), BIGCS(8), BIF2CS(10), BIG2CS(10), BIPCS(24),
19113     1  BIP2CS(29)
19114      SAVE BIFCS, BIGCS, BIF2CS, BIG2CS, BIPCS, BIP2CS, ATR, BTR,
19115     1 NBIF, NBIG, NBIF2, NBIG2, NBIP, NBIP2, X3SML, X32SML, XBIG, FIRST
19116      DATA BIFCS( 1) /   -.0167302164 7198664948E0 /
19117      DATA BIFCS( 2) /    .1025233583 424944561E0 /
19118      DATA BIFCS( 3) /    .0017083092 5073815165E0 /
19119      DATA BIFCS( 4) /    .0000118625 4546774468E0 /
19120      DATA BIFCS( 5) /    .0000000449 3290701779E0 /
19121      DATA BIFCS( 6) /    .0000000001 0698207143E0 /
19122      DATA BIFCS( 7) /    .0000000000 0017480643E0 /
19123      DATA BIFCS( 8) /    .0000000000 0000020810E0 /
19124      DATA BIFCS( 9) /    .0000000000 0000000018E0 /
19125      DATA BIGCS( 1) /    .0224662232 4857452E0 /
19126      DATA BIGCS( 2) /    .0373647754 5301955E0 /
19127      DATA BIGCS( 3) /    .0004447621 8957212E0 /
19128      DATA BIGCS( 4) /    .0000024708 0756363E0 /
19129      DATA BIGCS( 5) /    .0000000079 1913533E0 /
19130      DATA BIGCS( 6) /    .0000000000 1649807E0 /
19131      DATA BIGCS( 7) /    .0000000000 0002411E0 /
19132      DATA BIGCS( 8) /    .0000000000 0000002E0 /
19133      DATA BIF2CS( 1) /   0.0998457269 3816041E0 /
19134      DATA BIF2CS( 2) /    .4786249778 63005538E0 /
19135      DATA BIF2CS( 3) /    .0251552119 604330118E0 /
19136      DATA BIF2CS( 4) /    .0005820693 885232645E0 /
19137      DATA BIF2CS( 5) /    .0000074997 659644377E0 /
19138      DATA BIF2CS( 6) /    .0000000613 460287034E0 /
19139      DATA BIF2CS( 7) /    .0000000003 462753885E0 /
19140      DATA BIF2CS( 8) /    .0000000000 014288910E0 /
19141      DATA BIF2CS( 9) /    .0000000000 000044962E0 /
19142      DATA BIF2CS(10) /    .0000000000 000000111E0 /
19143      DATA BIG2CS( 1) /    .0333056621 45514340E0 /
19144      DATA BIG2CS( 2) /    .1613092151 23197068E0 /
19145      DATA BIG2CS( 3) /    .0063190073 096134286E0 /
19146      DATA BIG2CS( 4) /    .0001187904 568162517E0 /
19147      DATA BIG2CS( 5) /    .0000013045 345886200E0 /
19148      DATA BIG2CS( 6) /    .0000000093 741259955E0 /
19149      DATA BIG2CS( 7) /    .0000000000 474580188E0 /
19150      DATA BIG2CS( 8) /    .0000000000 001783107E0 /
19151      DATA BIG2CS( 9) /    .0000000000 000005167E0 /
19152      DATA BIG2CS(10) /    .0000000000 000000011E0 /
19153      DATA BIPCS( 1) /   -.0832204747 7943447E0 /
19154      DATA BIPCS( 2) /    .0114611892 7371174E0 /
19155      DATA BIPCS( 3) /    .0004289644 0718911E0 /
19156      DATA BIPCS( 4) /   -.0001490663 9379950E0 /
19157      DATA BIPCS( 5) /   -.0000130765 9726787E0 /
19158      DATA BIPCS( 6) /    .0000063275 9839610E0 /
19159      DATA BIPCS( 7) /   -.0000004222 6696982E0 /
19160      DATA BIPCS( 8) /   -.0000001914 7186298E0 /
19161      DATA BIPCS( 9) /    .0000000645 3106284E0 /
19162      DATA BIPCS(10) /   -.0000000078 4485467E0 /
19163      DATA BIPCS(11) /   -.0000000009 6077216E0 /
19164      DATA BIPCS(12) /    .0000000007 0004713E0 /
19165      DATA BIPCS(13) /   -.0000000001 7731789E0 /
19166      DATA BIPCS(14) /    .0000000000 2272089E0 /
19167      DATA BIPCS(15) /    .0000000000 0165404E0 /
19168      DATA BIPCS(16) /   -.0000000000 0185171E0 /
19169      DATA BIPCS(17) /    .0000000000 0059576E0 /
19170      DATA BIPCS(18) /   -.0000000000 0012194E0 /
19171      DATA BIPCS(19) /    .0000000000 0001334E0 /
19172      DATA BIPCS(20) /    .0000000000 0000172E0 /
19173      DATA BIPCS(21) /   -.0000000000 0000145E0 /
19174      DATA BIPCS(22) /    .0000000000 0000049E0 /
19175      DATA BIPCS(23) /   -.0000000000 0000011E0 /
19176      DATA BIPCS(24) /    .0000000000 0000001E0 /
19177      DATA BIP2CS( 1) /   -.1135967375 85988679E0 /
19178      DATA BIP2CS( 2) /    .0041381473 947881595E0 /
19179      DATA BIP2CS( 3) /    .0001353470 622119332E0 /
19180      DATA BIP2CS( 4) /    .0000104273 166530153E0 /
19181      DATA BIP2CS( 5) /    .0000013474 954767849E0 /
19182      DATA BIP2CS( 6) /    .0000001696 537405438E0 /
19183      DATA BIP2CS( 7) /   -.0000000100 965008656E0 /
19184      DATA BIP2CS( 8) /   -.0000000167 291194937E0 /
19185      DATA BIP2CS( 9) /   -.0000000045 815364485E0 /
19186      DATA BIP2CS(10) /    .0000000003 736681366E0 /
19187      DATA BIP2CS(11) /    .0000000005 766930320E0 /
19188      DATA BIP2CS(12) /    .0000000000 621812650E0 /
19189      DATA BIP2CS(13) /   -.0000000000 632941202E0 /
19190      DATA BIP2CS(14) /   -.0000000000 149150479E0 /
19191      DATA BIP2CS(15) /    .0000000000 078896213E0 /
19192      DATA BIP2CS(16) /    .0000000000 024960513E0 /
19193      DATA BIP2CS(17) /   -.0000000000 012130075E0 /
19194      DATA BIP2CS(18) /   -.0000000000 003740493E0 /
19195      DATA BIP2CS(19) /    .0000000000 002237727E0 /
19196      DATA BIP2CS(20) /    .0000000000 000474902E0 /
19197      DATA BIP2CS(21) /   -.0000000000 000452616E0 /
19198      DATA BIP2CS(22) /   -.0000000000 000030172E0 /
19199      DATA BIP2CS(23) /    .0000000000 000091058E0 /
19200      DATA BIP2CS(24) /   -.0000000000 000009814E0 /
19201      DATA BIP2CS(25) /   -.0000000000 000016429E0 /
19202      DATA BIP2CS(26) /    .0000000000 000005533E0 /
19203      DATA BIP2CS(27) /    .0000000000 000002175E0 /
19204      DATA BIP2CS(28) /   -.0000000000 000001737E0 /
19205      DATA BIP2CS(29) /   -.0000000000 000000010E0 /
19206      DATA ATR / 8.750690570 8484345 E0 /
19207      DATA BTR / -2.093836321 356054 E0 /
19208      DATA FIRST /.TRUE./
19209C***FIRST EXECUTABLE STATEMENT  BIE
19210      IF (FIRST) THEN
19211         ETA = 0.1*R1MACH(3)
19212         NBIF = INITS (BIFCS, 9, ETA)
19213         NBIG = INITS (BIGCS, 8, ETA)
19214         NBIF2 = INITS (BIF2CS, 10, ETA)
19215         NBIG2 = INITS (BIG2CS, 10, ETA)
19216         NBIP  = INITS (BIPCS , 24, ETA)
19217         NBIP2 = INITS (BIP2CS, 29, ETA)
19218C
19219         X3SML = ETA**0.3333
19220         X32SML = 1.3104*X3SML**2
19221         XBIG = R1MACH(2)**0.6666
19222      ENDIF
19223      FIRST = .FALSE.
19224C
19225      IF (X.GE.(-1.0)) GO TO 20
19226      CALL R9AIMP (X, XM, THETA)
19227      BIE = XM * SIN(THETA)
19228      RETURN
19229C
19230 20   IF (X.GT.1.0) GO TO 30
19231      Z = 0.0
19232      IF (ABS(X).GT.X3SML) Z = X**3
19233      BIE = 0.625 + CSEVL (Z, BIFCS, NBIF) + X*(0.4375 +
19234     1  CSEVL (Z, BIGCS, NBIG))
19235      IF (X.GT.X32SML) BIE = BIE * EXP(-2.0*X*SQRT(X)/3.0)
19236      RETURN
19237C
19238 30   IF (X.GT.2.0) GO TO 40
19239      Z = (2.0*X**3 - 9.0) / 7.0
19240      BIE = EXP(-2.0*X*SQRT(X)/3.0) * (1.125 + CSEVL (Z, BIF2CS, NBIF2)
19241     1  + X*(0.625 + CSEVL (Z, BIG2CS, NBIG2)) )
19242      RETURN
19243C
19244 40   IF (X.GT.4.0) GO TO 50
19245      SQRTX = SQRT(X)
19246      Z = ATR/(X*SQRTX) + BTR
19247      BIE = (0.625 + CSEVL (Z, BIPCS, NBIP)) / SQRT(SQRTX)
19248      RETURN
19249C
19250 50   SQRTX = SQRT(X)
19251      Z = -1.0
19252      IF (X.LT.XBIG) Z = 16.0/(X*SQRTX) - 1.0
19253      BIE = (0.625 + CSEVL (Z, BIP2CS, NBIP2))/SQRT(SQRTX)
19254      RETURN
19255C
19256      END
19257      DOUBLE PRECISION FUNCTION bfrac(a,b,x,y,lambda,eps)
19258C-----------------------------------------------------------------------
19259C     CONTINUED FRACTION EXPANSION FOR IX(A,B) WHEN A,B .GT. 1.
19260C     IT IS ASSUMED THAT  LAMBDA = (A + B)*Y - B.
19261C-----------------------------------------------------------------------
19262C     .. Scalar Arguments ..
19263      DOUBLE PRECISION a,b,eps,lambda,x,y
19264C     ..
19265C     .. Local Scalars ..
19266      DOUBLE PRECISION alpha,an,anp1,beta,bn,bnp1,c,c0,c1,e,n,p,r,r0,s,
19267     +                 t,w,yp1
19268C     ..
19269C     .. External Functions ..
19270      DOUBLE PRECISION brcomp
19271      EXTERNAL brcomp
19272C     ..
19273C     .. Intrinsic Functions ..
19274      INTRINSIC abs
19275C     ..
19276C     .. Executable Statements ..
19277C--------------------
19278      bfrac = brcomp(a,b,x,y)
19279      IF (bfrac.EQ.0.0D0) RETURN
19280C
19281      c = 1.0D0 + lambda
19282      c0 = b/a
19283      c1 = 1.0D0 + 1.0D0/a
19284      yp1 = y + 1.0D0
19285C
19286      n = 0.0D0
19287      p = 1.0D0
19288      s = a + 1.0D0
19289      an = 0.0D0
19290      bn = 1.0D0
19291      anp1 = 1.0D0
19292      bnp1 = c/c1
19293      r = c1/c
19294C
19295C        CONTINUED FRACTION CALCULATION
19296C
19297   10 n = n + 1.0D0
19298      t = n/a
19299      w = n* (b-n)*x
19300      e = a/s
19301      alpha = (p* (p+c0)*e*e)* (w*x)
19302      e = (1.0D0+t)/ (c1+t+t)
19303      beta = n + w/s + e* (c+n*yp1)
19304      p = 1.0D0 + t
19305      s = s + 2.0D0
19306C
19307C        UPDATE AN, BN, ANP1, AND BNP1
19308C
19309      t = alpha*an + beta*anp1
19310      an = anp1
19311      anp1 = t
19312      t = alpha*bn + beta*bnp1
19313      bn = bnp1
19314      bnp1 = t
19315C
19316      r0 = r
19317      r = anp1/bnp1
19318      IF (abs(r-r0).LE.eps*r) GO TO 20
19319C
19320C        RESCALE AN, BN, ANP1, AND BNP1
19321C
19322      an = an/bnp1
19323      bn = bn/bnp1
19324      anp1 = r
19325      bnp1 = 1.0D0
19326      GO TO 10
19327C
19328C                 TERMINATION
19329C
19330   20 bfrac = bfrac*r
19331      RETURN
19332
19333      END
19334      SUBROUTINE BFRCDF(X,ALPHA,BETA,R,CDF)
19335C
19336C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
19337C              FUNCTION VALUE FOR THE BRITTLE FRACTURE DISTRIBUTION
19338C              WITH DOUBLE PRECISION SHAPE PARAMETERS ALPHA, BETA,
19339C              AND R.  THE BRITTLE FRACTURE DISTRIBUTION HAS
19340C              THE CUMULATIVE DISTRIBUTION FUNCTION
19341C
19342C              F(X;ALPHA,BETA,R) = 1 - EXP(-ALPHA*X**(2*R)*
19343C                                  EXP(-BETA/X**2))
19344C                                  X > 0; ALPHA, R > 0; BETA >= 0
19345C
19346C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE
19347C                                AT WHICH THE CUMULATIVE DISTRIBUTION
19348C                                FUNCTION IS TO BE EVALUATED.
19349C                     --ALPHA  = THE DOUBLE PRECISION VALUE
19350C                                OF THE FIRST SHAPE PARAMETER.
19351C                     --BETA   = THE DOUBLE PRECISION VALUE
19352C                                OF THE SECOND SHAPE PARAMETER.
19353C                     --R      = THE DOUBLE PRECISION VALUE
19354C                                OF THE THIRD SHAPE PARAMETER.
19355C     OUTPUT ARGUMENTS--CDF    = THE DOUBLE PRECISION CUMULATIVE
19356C                                DISTRIBUTION FUNCTION VALUE.
19357C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
19358C             FUNCTION VALUE CDF FOR THE BRITTLE FRACTURE
19359C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA, BETA AND R.
19360C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
19361C     RESTRICTIONS--ALPHA AND R SHOULD BE POSITIVE AND BETA SHOULD BE
19362C                   NON-NEGATIVE.
19363C                 --X SHOULD BE POSITIVE.
19364C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
19365C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
19366C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19367C     LANGUAGE--ANSI FORTRAN.
19368C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19369C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19370C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19371C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19372C                 COMPUTATION, VOL. 19, PP. 809-825
19373C     WRITTEN BY--JAMES J. FILLIBEN
19374C                 STATISTICAL ENGINEERING LABORATORY
19375C                 INFORMATION TECHNOLOGY LABORATORY
19376C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19377C                 GAITHERSBURG, MD 20899-8980
19378C                 PHONE:  301-975-2855
19379C     ORIGINAL VERSION--MARCH     2008.
19380C
19381C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19382C
19383C---------------------------------------------------------------------
19384C
19385      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
19386C
19387      INCLUDE 'DPCOP2.INC'
19388C
19389C---------------------------------------------------------------------
19390C
19391C     CHECK THE INPUT ARGUMENTS FOR ERRORS
19392C
19393      CDF=0.0D0
19394      IF(X.LE.0.0D0)THEN
19395        GOTO9000
19396      ELSEIF(ALPHA.LE.0.0D0)THEN
19397        WRITE(ICOUT,15)
19398   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRCDF IS ',
19399     1       'NON-POSITIVE.')
19400        CALL DPWRST('XXX','BUG ')
19401        WRITE(ICOUT,46)ALPHA
19402        CALL DPWRST('XXX','BUG ')
19403        GOTO9000
19404      ELSEIF(BETA.LT.0.0D0)THEN
19405        WRITE(ICOUT,25)
19406   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRCDF IS ',
19407     1       'NEGATIVE.')
19408        CALL DPWRST('XXX','BUG ')
19409        WRITE(ICOUT,46)BETA
19410        CALL DPWRST('XXX','BUG ')
19411        GOTO9000
19412      ELSEIF(R.LE.0.0D0)THEN
19413        WRITE(ICOUT,35)
19414   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRCDF IS ',
19415     1       'NON-POSITIVE.')
19416        CALL DPWRST('XXX','BUG ')
19417        WRITE(ICOUT,46)R
19418        CALL DPWRST('XXX','BUG ')
19419        GOTO9000
19420      ENDIF
19421   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
19422C
19423C-----START POINT-----------------------------------------------------
19424C
19425      DTERM1=DEXP(-BETA/X**2)
19426      DTERM2=DEXP(-ALPHA*X**(2.0D0*R)*DTERM1)
19427      CDF=1.0D0 - DTERM2
19428C
19429 9000 CONTINUE
19430      RETURN
19431      END
19432      SUBROUTINE BFRCHA(X,ALPHA,BETA,R,HAZ)
19433C
19434C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE HAZARD
19435C              FUNCTION VALUE FOR THE BRITTLE FRACTURE DISTRIBUTION
19436C              WITH DOUBLE PRECISION SHAPE PARAMETERS ALPHA, BETA,
19437C              AND R.  THE BRITTLE FRACTURE DISTRIBUTION HAS
19438C              THE CUMULATIVE HAZARD FUNCTION
19439C
19440C              H(X;ALPHA,BETA,R) = -ALPHA*X**(2*R)*EXP(-BETA/X**2)
19441C                                  X > 0; ALPHA, R > 0; BETA >= 0
19442C
19443C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE
19444C                                AT WHICH THE CUMULATIVE HAZARD
19445C                                FUNCTION IS TO BE EVALUATED.
19446C                     --ALPHA  = THE DOUBLE PRECISION VALUE
19447C                                OF THE FIRST SHAPE PARAMETER.
19448C                     --BETA   = THE DOUBLE PRECISION VALUE
19449C                                OF THE SECOND SHAPE PARAMETER.
19450C                     --R      = THE DOUBLE PRECISION VALUE
19451C                                OF THE THIRD SHAPE PARAMETER.
19452C     OUTPUT ARGUMENTS--HAZ    = THE DOUBLE PRECISION CUMULATIVE
19453C                                HAZARD FUNCTION VALUE.
19454C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE HAZARD
19455C             FUNCTION VALUE HAZ FOR THE BRITTLE FRACTURE
19456C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA, BETA AND R.
19457C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
19458C     RESTRICTIONS--ALPHA AND R SHOULD BE POSITIVE AND BETA SHOULD BE
19459C                   NON-NEGATIVE.
19460C                 --X SHOULD BE POSITIVE.
19461C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
19462C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
19463C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19464C     LANGUAGE--ANSI FORTRAN.
19465C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19466C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19467C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19468C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19469C                 COMPUTATION, VOL. 19, PP. 809-825
19470C     WRITTEN BY--JAMES J. FILLIBEN
19471C                 STATISTICAL ENGINEERING LABORATORY
19472C                 INFORMATION TECHNOLOGY LABORATORY
19473C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19474C                 GAITHERSBURG, MD 20899-8980
19475C                 PHONE:  301-975-2855
19476C     ORIGINAL VERSION--MARCH     2008.
19477C
19478C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19479C
19480C---------------------------------------------------------------------
19481C
19482      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
19483C
19484      INCLUDE 'DPCOP2.INC'
19485C
19486C---------------------------------------------------------------------
19487C
19488C     CHECK THE INPUT ARGUMENTS FOR ERRORS
19489C
19490      HAZ=0.0D0
19491      IF(X.LE.0.0D0)THEN
19492        GOTO9000
19493      ELSEIF(ALPHA.LE.0.0D0)THEN
19494        WRITE(ICOUT,15)
19495   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRCHAZ IS ',
19496     1       'NON-POSITIVE.')
19497        CALL DPWRST('XXX','BUG ')
19498        WRITE(ICOUT,46)ALPHA
19499        CALL DPWRST('XXX','BUG ')
19500        GOTO9000
19501      ELSEIF(BETA.LT.0.0D0)THEN
19502        WRITE(ICOUT,25)
19503   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRCHAZ IS ',
19504     1       'NEGATIVE.')
19505        CALL DPWRST('XXX','BUG ')
19506        WRITE(ICOUT,46)BETA
19507        CALL DPWRST('XXX','BUG ')
19508        GOTO9000
19509      ELSEIF(R.LE.0.0D0)THEN
19510        WRITE(ICOUT,35)
19511   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRCHAZ IS ',
19512     1       'NON-POSITIVE.')
19513        CALL DPWRST('XXX','BUG ')
19514        WRITE(ICOUT,46)R
19515        CALL DPWRST('XXX','BUG ')
19516        GOTO9000
19517      ENDIF
19518   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
19519C
19520C-----START POINT-----------------------------------------------------
19521C
19522CCCCC DTERM1=DEXP(-BETA/X**2)
19523CCCCC HAZ=ALPHA*X**(2.0D0*R)*DTERM1
19524      DTERM1=DLOG(ALPHA) + (2.0D0*R)*DLOG(X) - BETA/X**2
19525      HAZ=DEXP(DTERM1)
19526C
19527 9000 CONTINUE
19528      RETURN
19529      END
19530      SUBROUTINE BFRFUN (N, X, FVEC, IFLAG, XDATA, NOBS)
19531C
19532C     PURPOSE-THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
19533C             BRITTLE FRACTURE MAXIMUM LIKELIHOOD EQUATIONS.
19534C             SPECIFICALLY IT SOLVES FOR BETA AND R BY
19535C             SOLVING THE EQUATIONS:
19536C
19537C             0 = (ANUM/ADEN) + SUM[i=1 to N][1/(r*X(i)**2 + BETA) -
19538C                 SUM[i=1 to N][X(i)**2]
19539C
19540C                 ANUM = N*SUM[i=1 TO N][X(i)**2**(2*R-2)*
19541C                        EXP(-BETA/X(i)**2)
19542C                 ADEN = SUM[i=1 TO N][X(i)**(2*R)*EXP(-BETA/X(i)**2)]
19543C
19544C             0 = 2*SUM[i=1 TO N][LOG(X(i))] +
19545C                 SUM[i=1 TO N][1/(R + BETA/X(i)**2)] - (ANUM/ADEN)
19546C
19547C                 ANUM = 2*SUM[i=1 TO N][LOG(X(i))*X(i)**(2*R)*
19548C                        EXP(-BETA/X(i)**2)]
19549C                 ADEN = SUM[i=1 TO N][X(i)**(2*R)*EXP(-BETA/X(i)**2)]
19550C
19551C             CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
19552C             NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
19553C             DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
19554C             OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
19555C     EXAMPLE--BRITTLE FRACTURE MAXIMUM LIKELIHOOD Y
19556C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19557C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19558C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19559C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19560C                 COMPUTATION, VOL. 19, PP. 809-825
19561C     WRITTEN BY--JAMES J. FILLIBEN
19562C                 STATISTICAL ENGINEERING DIVISION
19563C                 INFORMATION TECHNOLOGY LABORATORY
19564C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19565C                 GAITHERSBURG, MD 20899-8980
19566C                 PHONE--301-975-2855
19567C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19568C           OF THE NATIONAL BUREAU OF STANDARDS.
19569C     LANGUAGE--ANSI FORTRAN (1977)
19570C     VERSION NUMBER--2008/3
19571C     ORIGINAL VERSION--MARCH     2008.
19572C
19573C---------------------------------------------------------------------
19574C
19575      DOUBLE PRECISION X(*)
19576      DOUBLE PRECISION FVEC(*)
19577      REAL XDATA(*)
19578C
19579      DOUBLE PRECISION DBETA
19580      DOUBLE PRECISION DR
19581      DOUBLE PRECISION DN
19582      DOUBLE PRECISION DX
19583      DOUBLE PRECISION DX2
19584      DOUBLE PRECISION DSUM1
19585      DOUBLE PRECISION DSUM2
19586      DOUBLE PRECISION DSUM3
19587      DOUBLE PRECISION DSUM4
19588      DOUBLE PRECISION DSUM5
19589      DOUBLE PRECISION DSUM6
19590      DOUBLE PRECISION DSUM7
19591      DOUBLE PRECISION DSUM8
19592      DOUBLE PRECISION DTERM1
19593C
19594C---------------------------------------------------------------------
19595C
19596      INCLUDE 'DPCOP2.INC'
19597C
19598C-----START POINT-----------------------------------------------------
19599C
19600C  COMPUTE SOME SUMS
19601C
19602      N=2
19603      IFLAG=0
19604C
19605      DN=DBLE(NOBS)
19606      DBETA=DBLE(X(1))
19607      DR=DBLE(X(2))
19608C
19609      DSUM1=0.0D0
19610      DSUM2=0.0D0
19611      DSUM3=0.0D0
19612      DSUM4=0.0D0
19613      DSUM5=0.0D0
19614      DSUM6=0.0D0
19615      DSUM7=0.0D0
19616      DSUM8=0.0D0
19617C
19618      DO200I=1,NOBS
19619C
19620        DX=DBLE(XDATA(I))
19621        DX2=DX*DX
19622        DTERM1=DEXP(-DBETA/DX2)
19623C
19624        DSUM1=DSUM1 + DX**(2.0D0*DR - 2.0D0)*DTERM1
19625        DSUM2=DSUM2 + DX**(2.0D0*DR)*DTERM1
19626        DSUM3=DSUM3 + 1.0D0/(DR*DX2 + DBETA)
19627        DSUM4=DSUM4 + DX2
19628C
19629        DSUM5=DSUM5 + DLOG(DX)
19630        DSUM6=DSUM6 + 1.0D0/(DR + DBETA/DX2)
19631        DSUM7=DSUM7 + DLOG(DX)*DX**(2.0D0*DR)*DTERM1
19632        DSUM8=DSUM8 + DX**(2.0D0*DR)*DTERM1
19633C
19634  200 CONTINUE
19635C
19636      FVEC(1)=DN*(DSUM1/DSUM2) + DSUM3 - DSUM4
19637      FVEC(2)=2.0D0*DSUM5 + DSUM6 - (2.0D0*DN*DSUM7/DSUM8)
19638C
19639      RETURN
19640      END
19641      SUBROUTINE BFRHAZ(X,ALPHA,BETA,R,HAZ)
19642C
19643C     PURPOSE--THIS SUBROUTINE COMPUTES THE HAZARD
19644C              FUNCTION VALUE FOR THE BRITTLE FRACTURE DISTRIBUTION
19645C              WITH DOUBLE PRECISION SHAPE PARAMETERS ALPHA, BETA,
19646C              AND R.  THE BRITTLE FRACTURE DISTRIBUTION HAS
19647C              THE HAZARD FUNCTION
19648C
19649C              h(X;ALPHA,BETA,R) = f(x;ALPHA,BETA,R)/
19650C                                  (1 - F(X;ALPHA,BETA,R)
19651C                                  X > 0; ALPHA, R > 0; BETA >= 0
19652C              WITH f AND F DENOTING THE BRITTLE FRACTURE
19653C              PROBABILITY DENISTY AND CUMULATIVE DISTRIBUTION
19654c              FUNCTIONS, RESPECTIVELY.
19655C
19656C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE
19657C                                AT WHICH THE HAZARD
19658C                                FUNCTION IS TO BE EVALUATED.
19659C                     --ALPHA  = THE DOUBLE PRECISION VALUE
19660C                                OF THE FIRST SHAPE PARAMETER.
19661C                     --BETA   = THE DOUBLE PRECISION VALUE
19662C                                OF THE SECOND SHAPE PARAMETER.
19663C                     --R      = THE DOUBLE PRECISION VALUE
19664C                                OF THE THIRD SHAPE PARAMETER.
19665C     OUTPUT ARGUMENTS--HAZ    = THE DOUBLE PRECISION HAZARD
19666C                                FUNCTION VALUE.
19667C     OUTPUT--THE DOUBLE PRECISION HAZARD
19668C             FUNCTION VALUE HAZ FOR THE BRITTLE FRACTURE
19669C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA, BETA AND R.
19670C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
19671C     RESTRICTIONS--ALPHA AND R SHOULD BE POSITIVE AND BETA SHOULD BE
19672C                   NON-NEGATIVE.
19673C                 --X SHOULD BE POSITIVE.
19674C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
19675C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
19676C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19677C     LANGUAGE--ANSI FORTRAN.
19678C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19679C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19680C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19681C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19682C                 COMPUTATION, VOL. 19, PP. 809-825
19683C     WRITTEN BY--JAMES J. FILLIBEN
19684C                 STATISTICAL ENGINEERING LABORATORY
19685C                 INFORMATION TECHNOLOGY LABORATORY
19686C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19687C                 GAITHERSBURG, MD 20899-8980
19688C                 PHONE:  301-975-2855
19689C     ORIGINAL VERSION--MARCH     2008.
19690C
19691C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19692C
19693C---------------------------------------------------------------------
19694C
19695      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
19696C
19697      INCLUDE 'DPCOP2.INC'
19698C
19699C---------------------------------------------------------------------
19700C
19701C     CHECK THE INPUT ARGUMENTS FOR ERRORS
19702C
19703      HAZ=0.0D0
19704      IF(X.LE.0.0D0)THEN
19705        WRITE(ICOUT,5)
19706    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BFRHAZ IS ',
19707     1       'NON-POSITIVE.')
19708        CALL DPWRST('XXX','BUG ')
19709        WRITE(ICOUT,46)X
19710        CALL DPWRST('XXX','BUG ')
19711        GOTO9000
19712      ELSEIF(ALPHA.LE.0.0D0)THEN
19713        WRITE(ICOUT,15)
19714   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRHAZ IS ',
19715     1       'NON-POSITIVE.')
19716        CALL DPWRST('XXX','BUG ')
19717        WRITE(ICOUT,46)ALPHA
19718        CALL DPWRST('XXX','BUG ')
19719        GOTO9000
19720      ELSEIF(BETA.LT.0.0D0)THEN
19721        WRITE(ICOUT,25)
19722   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRHAZ IS ',
19723     1       'NEGATIVE.')
19724        CALL DPWRST('XXX','BUG ')
19725        WRITE(ICOUT,46)BETA
19726        CALL DPWRST('XXX','BUG ')
19727        GOTO9000
19728      ELSEIF(R.LE.0.0D0)THEN
19729        WRITE(ICOUT,35)
19730   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRHAZ IS ',
19731     1       'NON-POSITIVE.')
19732        CALL DPWRST('XXX','BUG ')
19733        WRITE(ICOUT,46)R
19734        CALL DPWRST('XXX','BUG ')
19735        GOTO9000
19736      ENDIF
19737   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
19738C
19739C-----START POINT-----------------------------------------------------
19740C
19741      DTERM1=DLOG(2.0D0) + DLOG(ALPHA) + (2.0D0*R - 1.0D0)*DLOG(X)
19742      DTERM2=DLOG((BETA/X**2) + R)
19743      DTERM3=-(BETA/X**2) - ALPHA*X**(2.0D0*R)*EXP(-BETA/X**2)
19744      PDFLOG=DTERM1 + DTERM2 + DTERM3
19745C
19746      DTERM1=DEXP(-BETA/X**2)
19747      CDFLOG=-ALPHA*X**(2.0D0*R)*DTERM1
19748C
19749      HAZ=DEXP(PDFLOG - CDFLOG)
19750C
19751 9000 CONTINUE
19752      RETURN
19753      END
19754      SUBROUTINE BFRLI1(Y,N,
19755     1                  ALPHA,BETA,R,
19756     1                  ALIK,AIC,AICC,BIC,
19757     1                  ISUBRO,IBUGA3,IERROR)
19758C
19759C     PURPOSE--THIS ROUTINE COMPUTES THE LIKELIHOOD FUNCTION FOR THE
19760C              BRITTLE FRACTURE DISTRIBUTION.  THIS IS FOR THE RAW DATA
19761C              CASE (I.E., NO GROUPING AND NO CENSORING).
19762C
19763C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
19764C              PERFORMED.
19765C
19766C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19767C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19768C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19769C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19770C                 COMPUTATION, VOL. 19, PP. 809-825
19771C     WRITTEN BY--ALAN HECKERT
19772C                 STATISTICAL ENGINEERING DIVISION
19773C                 INFORMATION TECHNOLOGY LABORATORY
19774C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19775C                 GAITHERSBURG, MD 20899-8980
19776C                 PHONE--301-975-2899
19777C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
19778C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
19779C     LANGUAGE--ANSI FORTRAN (1977)
19780C     VERSION NUMBER--2010/8
19781C     ORIGINAL VERSION--AUGUST    2010.
19782C
19783C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19784C
19785      CHARACTER*4 ISUBRO
19786      CHARACTER*4 IBUGA3
19787      CHARACTER*4 IERROR
19788C
19789      CHARACTER*4 IWRITE
19790C
19791      CHARACTER*4 ISUBN1
19792      CHARACTER*4 ISUBN2
19793      CHARACTER*4 ISTEPN
19794C
19795      DOUBLE PRECISION DX
19796      DOUBLE PRECISION DA
19797      DOUBLE PRECISION DB
19798      DOUBLE PRECISION DR
19799      DOUBLE PRECISION DN
19800      DOUBLE PRECISION DNP
19801      DOUBLE PRECISION DLIK
19802      DOUBLE PRECISION DSUM1
19803      DOUBLE PRECISION DSUM2
19804      DOUBLE PRECISION DSUM3
19805      DOUBLE PRECISION DSUM4
19806      DOUBLE PRECISION DTERM1
19807      DOUBLE PRECISION DTERM2
19808      DOUBLE PRECISION DTERM3
19809C
19810C---------------------------------------------------------------------
19811C
19812      DIMENSION Y(*)
19813C
19814C---------------------------------------------------------------------
19815C
19816      INCLUDE 'DPCOP2.INC'
19817C
19818C-----START POINT-----------------------------------------------------
19819C
19820      ISUBN1='BFRL'
19821      ISUBN2='I1  '
19822C
19823      IERROR='NO'
19824C
19825      ALIK=-99.0
19826      AIC=-99.0
19827      AICC=-99.0
19828      BIC=-99.0
19829C
19830      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'RLI1')THEN
19831        WRITE(ICOUT,999)
19832  999   FORMAT(1X)
19833        CALL DPWRST('XXX','WRIT')
19834        WRITE(ICOUT,51)
19835   51   FORMAT('**** AT THE BEGINNING OF BFRLI1--')
19836        CALL DPWRST('XXX','WRIT')
19837        WRITE(ICOUT,52)IBUGA3,ISUBRO,N,ALPHA,BETA,R
19838   52   FORMAT('IBUGA3,ISUBRO,N,ALPHA,BETA,R = ',2(A4,2X),I8,3G15.7)
19839        CALL DPWRST('XXX','WRIT')
19840        DO56I=1,MIN(N,100)
19841          WRITE(ICOUT,57)I,Y(I)
19842   57     FORMAT('I,Y(I) = ',I8,G15.7)
19843          CALL DPWRST('XXX','WRIT')
19844   56   CONTINUE
19845      ENDIF
19846C
19847C               ******************************************
19848C               **  STEP 1--                            **
19849C               **  COMPUTE LIKELIHOOD FUNCTION         **
19850C               ******************************************
19851C
19852      ISTEPN='1'
19853      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'RLI1')
19854     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
19855C
19856      IERFLG=0
19857      IERROR='NO'
19858      IWRITE='OFF'
19859C
19860C     LOG-LIKELIHOOD FUNCTION IS:
19861C
19862C     N*LOG(2) + N*LOG(ALPHA) +
19863C     (2*R-1)*SUM[i=1 to N][LOG(X(i))] +
19864C     SUM[i=1 to N][LOG(R + B/X(i)**2)] -
19865C     BETA*SUM[i=1 to N][X(i)**-2] -
19866C     ALPHA*SUM[i=1 to N][X(i)**(2*R)*EXP(-BETA/X(i)**2)]
19867C
19868      DN=DBLE(N)
19869      DR=DBLE(R)
19870      DB=DBLE(BETA)
19871      DA=DBLE(ALPHA)
19872      DTERM1=DN*DLOG(2.0D0) + DN*DLOG(DA)
19873      DTERM2=2.D0*DR - 1.0D0
19874      DSUM1=0.0D0
19875      DSUM2=0.0D0
19876      DSUM3=0.0D0
19877      DSUM4=0.0D0
19878      DO1000I=1,N
19879        DX=DBLE(Y(I))
19880        DSUM1=DSUM1 + DLOG(DX)
19881        DSUM2=DSUM2 + DLOG(DR + (DB/DX**2))
19882        DSUM3=DSUM3 + 1.0D0/DX**2
19883        DSUM4=DSUM4 + DX**(2.0D0*DR)*DEXP(-DB/DX**2)
19884 1000 CONTINUE
19885C
19886      DLIK=DTERM1 + DTERM2*DSUM1 + DSUM2 - DB*DSUM3 - DA*DSUM4
19887      ALIK=REAL(DLIK)
19888      DNP=3.0D0
19889      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
19890      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
19891      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
19892      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
19893C
19894      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'RLI1')THEN
19895        WRITE(ICOUT,999)
19896        CALL DPWRST('XXX','WRIT')
19897        WRITE(ICOUT,9011)
19898 9011   FORMAT('**** AT THE END OF BFRLI1--')
19899        CALL DPWRST('XXX','WRIT')
19900        WRITE(ICOUT,9012)DSUM1,DSUM2,DSUM3,DSUM4
19901 9012   FORMAT('DSUM1,DSUM2,DSUM3,DSUM4 = ',4G15.7)
19902        CALL DPWRST('XXX','WRIT')
19903        WRITE(ICOUT,9013)DTERM1,DTERM2,DTERM3
19904 9013   FORMAT('DTERM1,DTERM2,DTERM3 = ',3G15.7)
19905        CALL DPWRST('XXX','WRIT')
19906        WRITE(ICOUT,9014)ALIK,AIC,AICC,BIC
19907 9014   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
19908        CALL DPWRST('XXX','WRIT')
19909      ENDIF
19910C
19911      RETURN
19912      END
19913      SUBROUTINE BFRPDF(X,ALPHA,BETA,R,PDF)
19914C
19915C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
19916C              FUNCTION VALUE FOR THE BRITTLE FRACTURE DISTRIBUTION
19917C              WITH DOUBLE PRECISION SHAPE PARAMETERS ALPHA, BETA,
19918C              AND R.  THE BRITTLE FRACTURE DISTRIBUTION HAS
19919C              THE PROBABILITY DENSITY FUNCTION
19920C
19921C              f(X;ALPHA,BETA,R) = 2*ALPHA*X**(2*R-1)*
19922C                                  (BETA/X**2 + R)*
19923C                                  EXP[-(BETA/X**2)-ALPHA*X**(2*R)*
19924C                                  EXP(-BETA/X**2)]
19925C                                 X > 0; ALPHA, R > 0; BETA >= 0
19926C
19927C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE
19928C                                AT WHICH THE PROBABILITY DENSITY
19929C                                FUNCTION IS TO BE EVALUATED.
19930C                     --ALPHA  = THE DOUBLE PRECISION VALUE
19931C                                OF THE FIRST SHAPE PARAMETER.
19932C                     --BETA   = THE DOUBLE PRECISION VALUE
19933C                                OF THE SECOND SHAPE PARAMETER.
19934C                     --R      = THE DOUBLE PRECISION VALUE
19935C                                OF THE THIRD SHAPE PARAMETER.
19936C     OUTPUT ARGUMENTS--PDF    = THE DOUBLE PRECISION PROBABILITY
19937C                                DENSITY FUNCTION VALUE.
19938C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
19939C             FUNCTION VALUE PDF FOR THE BRITTLE FRACTURE
19940C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA, BETA AND R.
19941C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
19942C     RESTRICTIONS--ALPHA AND R SHOULD BE POSITIVE AND BETA SHOULD BE
19943C                   NON-NEGATIVE.
19944C                 --X SHOULD BE POSITIVE.
19945C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
19946C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
19947C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
19948C     LANGUAGE--ANSI FORTRAN.
19949C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
19950C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
19951C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
19952C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
19953C                 COMPUTATION, VOL. 19, PP. 809-825
19954C     WRITTEN BY--JAMES J. FILLIBEN
19955C                 STATISTICAL ENGINEERING LABORATORY
19956C                 INFORMATION TECHNOLOGY LABORATORY
19957C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
19958C                 GAITHERSBURG, MD 20899-8980
19959C                 PHONE:  301-975-2855
19960C     ORIGINAL VERSION--MARCH     2008.
19961C
19962C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
19963C
19964C---------------------------------------------------------------------
19965C
19966      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
19967C
19968      INCLUDE 'DPCOP2.INC'
19969C
19970C---------------------------------------------------------------------
19971C
19972C     CHECK THE INPUT ARGUMENTS FOR ERRORS
19973C
19974      PDF=0.0D0
19975      IF(X.LE.0.0D0)THEN
19976        WRITE(ICOUT,5)
19977    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BFRPDF IS ',
19978     1       'NON-POSITIVE.')
19979        CALL DPWRST('XXX','BUG ')
19980        WRITE(ICOUT,46)X
19981        CALL DPWRST('XXX','BUG ')
19982        GOTO9000
19983      ELSEIF(ALPHA.LE.0.0D0)THEN
19984        WRITE(ICOUT,15)
19985   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRPDF IS ',
19986     1       'NON-POSITIVE.')
19987        CALL DPWRST('XXX','BUG ')
19988        WRITE(ICOUT,46)ALPHA
19989        CALL DPWRST('XXX','BUG ')
19990        GOTO9000
19991      ELSEIF(BETA.LT.0.0D0)THEN
19992        WRITE(ICOUT,25)
19993   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRPDF IS ',
19994     1       'NEGATIVE.')
19995        CALL DPWRST('XXX','BUG ')
19996        WRITE(ICOUT,46)BETA
19997        CALL DPWRST('XXX','BUG ')
19998        GOTO9000
19999      ELSEIF(R.LE.0.0D0)THEN
20000        WRITE(ICOUT,35)
20001   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRPDF IS ',
20002     1       'NON-POSITIVE.')
20003        CALL DPWRST('XXX','BUG ')
20004        WRITE(ICOUT,46)R
20005        CALL DPWRST('XXX','BUG ')
20006        GOTO9000
20007      ENDIF
20008   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
20009C
20010C-----START POINT-----------------------------------------------------
20011C
20012      DTERM1=DLOG(2.0D0) + DLOG(ALPHA) + (2.0D0*R - 1.0D0)*DLOG(X)
20013      DTERM2=DLOG((BETA/X**2) + R)
20014      DTERM3=-(BETA/X**2) - ALPHA*X**(2.0D0*R)*EXP(-BETA/X**2)
20015      PDF=DEXP(DTERM1 + DTERM2 + DTERM3)
20016C
20017 9000 CONTINUE
20018      RETURN
20019      END
20020      SUBROUTINE BFRPPF(DP,DALPHA,DBETA,DR,DPPF)
20021C
20022C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
20023C              FUNCTION VALUE FOR THE BRITTLE FRACTURE DISTRIBTION.
20024C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
20025C
20026C              F(X;ALPHA,BETA,R) = 1 - EXP(-ALPHA*X**2*EXP(-BETA/X**2))
20027C                                X > 0; ALPHA, R > 0; BETA >= 0
20028C
20029C              THE PERCENT POINT FUNCTION IS COMPUTED BY
20030C              NUMERICALLY INVERTING THE CDF FUNCTION.
20031C
20032C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
20033C                                WHICH THE PERCENT POINT
20034C                                FUNCTION IS TO BE EVALUATED.
20035C                     --DALPHA = THE FIRST SHAPE PARAMETER
20036C                     --DBETA  = THE SECOND SHAPE PARAMETER
20037C                     --DR     = THE THIRD SHAPE PARAMETER
20038C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
20039C                                FUNCTION VALUE.
20040C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
20041C             FUNCTION VALUE PPF FOR THE BRITTLE FRACTURE DISTRIBUTION
20042C             WITH SHAPE PARAMETERS ALPHA, BETA, AND R.
20043C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
20044C     RESTRICTIONS--NONE.
20045C     OTHER DATAPAC   SUBROUTINES NEEDED--BFRCDF.
20046C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
20047C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
20048C     LANGUAGE--ANSI FORTRAN (1977)
20049C     WRITTEN BY--JAMES J. FILLIBEN
20050C                 STATISTICAL ENGINEERING DIVISION
20051C                 INFORMATION TECHNOLOGY LABORATORY
20052C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20053C                 GAITHERSBURG, MD 20899-8980
20054C                 PHONE--301-975-2899
20055C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20056C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20057C     LANGUAGE--ANSI FORTRAN (1977)
20058C     VERSION NUMBER--2008/3
20059C     ORIGINAL VERSION--MARCH     2008.
20060C
20061C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20062C
20063      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
20064C
20065C---------------------------------------------------------------------
20066C
20067      INCLUDE 'DPCOP2.INC'
20068C
20069      DATA EPS /1.0D-9/
20070      DATA SIG /1.0D-8/
20071      DATA ZERO /0.D0/
20072      DATA MAXIT /1000/
20073CCCCC DATA EPS2 /1.0D-12/
20074C
20075C-----START POINT-----------------------------------------------------
20076C
20077C     CHECK THE INPUT ARGUMENTS FOR ERRORS
20078C
20079      DPPF=0.0D0
20080C
20081      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
20082        WRITE(ICOUT,11)
20083   11   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BFRPPF IS ',
20084     1         'OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
20085        CALL DPWRST('XXX','BUG ')
20086        WRITE(ICOUT,46)DP
20087        CALL DPWRST('XXX','BUG ')
20088        GOTO9000
20089      ELSEIF(DALPHA.LE.0.0D0)THEN
20090        WRITE(ICOUT,15)
20091   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRPPF IS ',
20092     1       'NON-POSITIVE.')
20093        CALL DPWRST('XXX','BUG ')
20094        WRITE(ICOUT,46)DALPHA
20095        CALL DPWRST('XXX','BUG ')
20096        GOTO9000
20097      ELSEIF(DBETA.LT.0.0D0)THEN
20098        WRITE(ICOUT,25)
20099   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRPPF IS ',
20100     1       'NEGATIVE.')
20101        CALL DPWRST('XXX','BUG ')
20102        WRITE(ICOUT,46)BETA
20103        CALL DPWRST('XXX','BUG ')
20104        GOTO9000
20105      ELSEIF(DR.LE.0.0D0)THEN
20106        WRITE(ICOUT,35)
20107   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRPPF IS ',
20108     1       'NON-POSITIVE.')
20109        CALL DPWRST('XXX','BUG ')
20110        WRITE(ICOUT,46)DR
20111        CALL DPWRST('XXX','BUG ')
20112        GOTO9000
20113      ENDIF
20114   46 FORMAT('****** THE VALUE OF THE ARGUMENT IS ',G15.7)
20115C
20116      XL = 0.0D0
20117      XR = 10.0D0
20118      ICOUNT=0
20119      MAXCNT=10000
20120      DINC=10.0D0
20121C
20122   91 CONTINUE
20123      IF(XL.LE.0.0D0)XL=0.0D0
20124      IF(XR.LE.0.0D0)XR=XL+DINC
20125      CALL BFRCDF(XL,DALPHA,DBETA,DR,CDFL)
20126      CALL BFRCDF(XR,DALPHA,DBETA,DR,CDFR)
20127      IF(CDFL.LT.DP .AND. CDFR.LT.DP)THEN
20128        XL=XR
20129        XR=XL+DINC
20130      ELSEIF(CDFL.GT.DP .AND. CDFR.GT.DP)THEN
20131        XL=XL-DINC
20132        IF(XL.LT.0.0D0)XL=0.0D0
20133      ELSE
20134        GOTO99
20135      ENDIF
20136      ICOUNT=ICOUNT+1
20137      IF(ICOUNT.GT.MAXCNT)THEN
20138        WRITE(ICOUT,96)
20139        CALL DPWRST('XXX','BUG ')
20140        PPF=0.0
20141        GOTO9000
20142      ENDIF
20143   96 FORMAT('***** ERROR--BFRPPF UNABLE TO FIND BRACKETING INTERVAL.')
20144      GOTO91
20145C
20146C
20147C  BISECTION METHOD
20148C
20149   99 CONTINUE
20150      IC = 0
20151      FXL=-DP
20152      FXR=1.0D0 - DP
20153C
20154  105 CONTINUE
20155      DX = (XL+XR)*0.5D0
20156      CALL BFRCDF(DX,DALPHA,DBETA,DR,DCDF)
20157      P1=DCDF
20158      DPPF=DX
20159      FCS = P1 - DP
20160      IF(FCS*FXL.GT.ZERO)GOTO110
20161      XR = DX
20162      FXR = FCS
20163      GOTO115
20164  110 CONTINUE
20165      XL = DX
20166      FXL = FCS
20167  115 CONTINUE
20168      XRML = XR - XL
20169      IF(XRML.LE.SIG .AND. ABS(FCS).LE.EPS)GOTO9000
20170      IC = IC + 1
20171      IF(IC.LE.MAXIT)GOTO105
20172      WRITE(ICOUT,130)
20173  130 FORMAT('***** ERROR--BFRPPF ROUTINE DID NOT CONVERGE.')
20174      CALL DPWRST('XXX','BUG ')
20175      GOTO9000
20176C
20177 9000 CONTINUE
20178      RETURN
20179      END
20180      SUBROUTINE BFRRAN(N,ALPHA,BETA,R,ISEED,X)
20181C
20182C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
20183C              FROM THE BRITTLE FRACTURE DISTRIBUTION WITH SHAPE
20184C              PARAMETERS ALPHA, BETA, AND R.
20185C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER RMBER
20186C                                OF RANDOM NUMBERS TO BE
20187C                                GENERATED.
20188C                     --ALPHA  = THE SINGLE PRECISION VALUE OF THE
20189C                                FIRST SHAPE PARAMETER.
20190C                     --A      = THE SINGLE PRECISION VALUE
20191C                                OF THE SECOND SHAPE PARAMETER.
20192C                     --R      = THE SINGLE PRECISION VALUE OF THE
20193C                                THIRD SHAPE PARAMETER.
20194C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
20195C                                (OF DIMENSION AT LEAST N)
20196C                                INTO WHICH THE GENERATED
20197C                                RANDOM SAMPLE WILL BE PLACED.
20198C     OUTPUT--A RANDOM SAMPLE OF SIZE N
20199C             FROM THE BRITTLE FRACTURE DISTRIBUTION
20200C             WITH SHAPE PARAMETERS ALPHA, BETA, AND R.
20201C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
20202C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
20203C                   OF N FOR THIS SUBROUTINE.
20204C                 --ALPHA AND R SHOULD BE POSITIVE, BETA SHOULD BE
20205C                   NON-NEGATIVE.
20206C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BFRPPF.
20207C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
20208C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
20209C     LANGUAGE--ANSI FORTRAN (1977)
20210C     REFERENCES--BLACK, DURHAM, AND PADGETT (1990), "PARAMETER
20211C                 ESTIMATION FOR A NEW DISTRIBUTION FOR THE STRENGTH
20212C                 OF BRITTLE FIBERS: A SIMULATION STUDY",
20213C                 COMMUNICATIONS IN STATISTICS--SIMULATION AND
20214C                 COMPUTATION, VOL. 19, PP. 809-825
20215C     WRITTEN BY--JAMES J. FILLIBEN
20216C                 STATISTICAL ENGINEERING DIVISION
20217C                 INFORMATION TECHNOLOGY LABORATORY
20218C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20219C                 GAITHERSBURG, MD 20899-8980
20220C                 PHONE--301-975-2855
20221C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20222C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20223C     LANGUAGE--ANSI FORTRAN (1977)
20224C     VERSION RMBER--2008.3
20225C     ORIGINAL VERSION--MARCH     2008.
20226C
20227C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20228C
20229C---------------------------------------------------------------------
20230C
20231      DIMENSION X(*)
20232      DOUBLE PRECISION DTEMP
20233C
20234C---------------------------------------------------------------------
20235C
20236      INCLUDE 'DPCOP2.INC'
20237C
20238C-----START POINT-----------------------------------------------------
20239C
20240C     CHECK THE INPUT ARGUMENTS FOR ERRORS
20241C
20242      IF(N.LT.1)THEN
20243        WRITE(ICOUT, 5)
20244    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF BRITTLE ',
20245     1         'FRACTURE RANDOM NUMBERS IS NON-POSITIVE.')
20246        CALL DPWRST('XXX','BUG ')
20247        WRITE(ICOUT,47)N
20248        CALL DPWRST('XXX','BUG ')
20249        GOTO9000
20250      ELSEIF(ALPHA.LE.0.0)THEN
20251        WRITE(ICOUT,15)
20252   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFRRAN IS ',
20253     1         'NON-POSITIVE.')
20254        CALL DPWRST('XXX','BUG ')
20255        WRITE(ICOUT,46)ALPHA
20256        CALL DPWRST('XXX','BUG ')
20257        GOTO9000
20258      ELSEIF(BETA.LT.0.0)THEN
20259        WRITE(ICOUT,25)
20260   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFRRAN ',
20261     1         'IS NEGATIVE.')
20262        CALL DPWRST('XXX','BUG ')
20263        WRITE(ICOUT,46)BETA
20264        CALL DPWRST('XXX','BUG ')
20265        GOTO9000
20266      ELSEIF(R.LE.0.0)THEN
20267        WRITE(ICOUT,35)
20268   35   FORMAT('***** ERROR--THE FOURTH ARGUMENT TO BFRRAN IS ',
20269     1         'NON-POSITIVE.')
20270        CALL DPWRST('XXX','BUG ')
20271        WRITE(ICOUT,46)R
20272        CALL DPWRST('XXX','BUG ')
20273      ENDIF
20274   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
20275   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
20276C
20277      CALL UNIRAN(N,ISEED,X)
20278C
20279      DO100I=1,N
20280        CALL BFRPPF(DBLE(X(I)),DBLE(ALPHA),DBLE(BETA),DBLE(R),DTEMP)
20281        X(I)=REAL(DTEMP)
20282  100 CONTINUE
20283C
20284 9000 CONTINUE
20285      RETURN
20286      END
20287      SUBROUTINE BFWCDF(X,GAMMA,AL,CDF)
20288C
20289C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
20290C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
20291C              DISTRIBUTION WITH TAIL LENGTH PARAMETER GAMMA AND
20292C              GAUGE LENGTH PARAMETER L.
20293C
20294C              THE BRITTLE FIBER WEIBULL DISTRIBUTION USED HEREIN IS
20295C              DEFINED FOR ALL POSITIVE X AND HAS THE
20296C              CUMULATIVE DISTRIBUTION FUNCTION
20297C
20298C                 F(P;GAMMA,L,SCALE) = 1 - EXP[-L*(X/SCALE)**GAMMA]
20299C
20300C              THE SCALE PARAMETER IS SET TO 1 IN THIS ROUTINE.
20301C     INPUT  ARGUMENTS--X      = THE VALUE AT WHICH THE CUMULATIVE
20302C                                DISTRIBUTION FUNCTION IS TO BE EVALUATED.
20303C                                X SHOULD BE NON-NEGATIVE.
20304C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
20305C                     --AL     = THE GAUGE LENGTH PARAMETER L.
20306C     OUTPUT ARGUMENTS--CDF    = THE CUMULATIVE DISTRIBUTION FUNCTION
20307C                                VALUE.
20308C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
20309C             FUNCTION VALUE CDF FOR THE BRITTLE FIBER WEIBULL
20310C             DISTRIBUTION WITH TAIL LENGTH PARAMETER GAMMA AND
20311C             GAUGE LENGTH PARAMETER L.
20312C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
20313C     RESTRICTIONS--X SHOULD BE NON-NEGATIVE.
20314C                 --GAMMA AND AL SHOULD BE POSITIVE.
20315C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
20316C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
20317C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
20318C     LANGUAGE--ANSI FORTRAN (1977)
20319C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
20320C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
20321C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
20322C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
20323C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
20324C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
20325C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
20326C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
20327C     WRITTEN BY--ALAN HECKERT
20328C                 STATISTICAL ENGINEERING DIVISION
20329C                 INFORMATION TECHNOLOGY LABORATORY
20330C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20331C                 GAITHERSBURG, MD 20899-8980
20332C                 PHONE--301-975-2899
20333C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20334C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20335C     LANGUAGE--ANSI FORTRAN (1977)
20336C     VERSION NUMBER--2010.8
20337C     ORIGINAL VERSION--AUGUST    2010.
20338C
20339C---------------------------------------------------------------------
20340C
20341      DOUBLE PRECISION X
20342      DOUBLE PRECISION AL
20343      DOUBLE PRECISION GAMMA
20344      DOUBLE PRECISION CDF
20345C
20346      INCLUDE 'DPCOP2.INC'
20347C
20348C-----START POINT-----------------------------------------------------
20349C
20350C     CHECK THE INPUT ARGUMENTS FOR ERRORS
20351C
20352      CDF=0.0D0
20353      IF(GAMMA.LE.0.0D0)THEN
20354        WRITE(ICOUT,15)
20355   15   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BFWCDF IS ',
20356     1         'NON-POSITIVE')
20357        CALL DPWRST('XXX','BUG ')
20358        WRITE(ICOUT,46)GAMMA
20359   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
20360        CALL DPWRST('XXX','BUG ')
20361        GOTO9000
20362      ELSEIF(AL.LE.0.0D0)THEN
20363        WRITE(ICOUT,25)
20364   25   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BFWCDF IS ',
20365     1         'NON-POSITIVE')
20366        CALL DPWRST('XXX','BUG ')
20367        WRITE(ICOUT,46)AL
20368        CALL DPWRST('XXX','BUG ')
20369        GOTO9000
20370      ENDIF
20371C
20372      IF(X.GT.0.0D0)THEN
20373        CDF=1.0D0 - DEXP(-AL*(X**GAMMA))
20374      ENDIF
20375C
20376 9000 CONTINUE
20377      RETURN
20378      END
20379      SUBROUTINE BFWCD2(X,NX,LI,PI,NI,GAMMA,ALOC,SCALE,
20380     1                  CDF,
20381     1                  ISUBRO,IBUGA2,IERROR)
20382C
20383C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
20384C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
20385C              DISTRIBUTION WITH TAIL LENGTH PARAMETER = GAMMA AND
20386C              GAUGE LENGTH PARAMETER L.
20387C
20388C              THE BRITTLE FIBER WEIBULL DISTRIBUTION USED HEREIN IS
20389C              HAS THE CUMULATIVE DISTRIBUTION FUNCTION
20390C
20391C              F(P;GAMMA,L,SCALE) = 1 - EXP[-L*(X/SCALE)**GAMMA]
20392C
20393C              THE BFWCDF ROUTINE COMPUTES THIS FUNCTION FOR A SINGLE
20394C              VALUE OF L.  THIS ROUTINE COMPUTES THIS FUNCTION FOR
20395C              MULTIPLE VALUES OF L.  IT DOES THIS USING A MIXTURE
20396C              APPROACH.  THAT IS
20397C
20398C              F(X;GAMMA,L,LOC,SCALE) = SUM[i=1 to NI]
20399C                  [p(i)*BFWCDF(X;GAMMA,L(i),LOC,SCALE)]
20400C
20401C              WHERE NI IS THE NUMBER OF DISTINCT VALUES FOR L.
20402C
20403C              THIS ROUTINE ASSUMES THAT THE LOCATION/SCALE/SHAPE
20404C              PARAMETERS ARE FIXED (I.E., ONLY L VARIES).
20405C
20406C              CURRENTLY, WE RESTRICT L TO A MAXIMUM OF 10 DISTINCT
20407C              LEVELS.
20408C
20409C     INPUT  ARGUMENTS--X      = A VARIABLE CONTAINING THE VALUES AT WHICH
20410C                                THE CUMULATIVE DISTRIBUTION FUNCTION IS
20411C                                TO BE EVALUATED.
20412C                     --NX     = A PARAMETER THAT SPECIFIES THE NUMBER
20413C                                OF VALUES FOR X.
20414C                     --LI     = A VARIABLE CONTAINING THE GAUGE LENGTH
20415C                                PARAMETER L.
20416C                     --PI     = A VARIABLE CONTAINING THE "MIXING"
20417C                                PROPORTIONS FOR LI.
20418C                     --NI     = A PARAMETER THAT SPECIFIES THE NUMBER
20419C                                OF VALUES FOR LI AND PI.
20420C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
20421C                     --ALOC   = THE LOCATION PARAMETER.
20422C                     --SCALE  = THE SCALE PARAMETER.
20423C     OUTPUT ARGUMENTS--CDF    = A VARIABLE CONTAINING THE CUMULATIVE
20424C                                DISTRIBUTION FUNCTION VALUES.
20425C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION FUNCTION
20426C             VALUES.
20427C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
20428C     OTHER DATAPAC   SUBROUTINES NEEDED--BFWCDF.
20429C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
20430C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
20431C     LANGUAGE--ANSI FORTRAN (1977)
20432C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
20433C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
20434C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
20435C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
20436C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
20437C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
20438C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
20439C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
20440C     WRITTEN BY--ALAN HECKERT
20441C                 STATISTICAL ENGINEERING DIVISION
20442C                 INFORMATION TECHNOLOGY LABORATORY
20443C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20444C                 GAITHERSBURG, MD 20899-8980
20445C                 PHONE--301-975-2899
20446C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20447C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20448C     LANGUAGE--ANSI FORTRAN (1977)
20449C     VERSION NUMBER--2010.8
20450C     ORIGINAL VERSION--OCTOBER   2010.
20451C
20452C---------------------------------------------------------------------
20453C
20454      DOUBLE PRECISION X(*)
20455      DOUBLE PRECISION LI(*)
20456      DOUBLE PRECISION PI(*)
20457      DOUBLE PRECISION CDF(*)
20458      DOUBLE PRECISION GAMMA
20459      DOUBLE PRECISION ALOC
20460      DOUBLE PRECISION SCALE
20461      DOUBLE PRECISION DSUM1
20462      DOUBLE PRECISION DTERM1
20463      DOUBLE PRECISION DTERM2
20464C
20465      CHARACTER*4 ISUBRO
20466      CHARACTER*4 IBUGA2
20467      CHARACTER*4 IERROR
20468C
20469      INCLUDE 'DPCOP2.INC'
20470C
20471C-----START POINT-----------------------------------------------------
20472C
20473C     CHECK THE INPUT ARGUMENTS FOR ERRORS
20474C
20475      IF(IBUGA2.EQ.'ON' .OR. ISUBRO.EQ.'WCD2')THEN
20476        WRITE(ICOUT,31)IBUGA2,ISUBRO
20477   31   FORMAT('AT THE BEGINNING OF BFWCD2')
20478        CALL DPWRST('XXX','BUG ')
20479      ENDIF
20480C
20481      IF(NX.LT.1)THEN
20482        WRITE(ICOUT,1)
20483    1   FORMAT('***** ERROR IN BRITTLE FIBER WEIBULL CDF--')
20484        CALL DPWRST('XXX','BUG ')
20485        WRITE(ICOUT,3)
20486    3   FORMAT('      THE NUMBER OF REQUESTED CDF VALUES IS ',
20487     1         'NON-POSITIVE.')
20488        CALL DPWRST('XXX','BUG ')
20489        WRITE(ICOUT,5)NX
20490    5   FORMAT('      THE NUMBER OF REQUESTED CDF VALUES  = ',I8)
20491        CALL DPWRST('XXX','BUG ')
20492        IERROR='YES'
20493        GOTO9000
20494      ELSEIF(NI.LT.1)THEN
20495        WRITE(ICOUT,1)
20496        CALL DPWRST('XXX','BUG ')
20497        WRITE(ICOUT,13)
20498   13   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
20499     1         'IS NON-POSITIVE.')
20500        CALL DPWRST('XXX','BUG ')
20501        WRITE(ICOUT,15)NI
20502   15   FORMAT('      THE NUMBER OF REQUESTED L VALUES  = ',I8)
20503        CALL DPWRST('XXX','BUG ')
20504        IERROR='YES'
20505        GOTO9000
20506      ELSEIF(NI.GT.10)THEN
20507        WRITE(ICOUT,1)
20508        CALL DPWRST('XXX','BUG ')
20509        WRITE(ICOUT,18)
20510   18   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
20511     1         'IS GREATER THAN 10.')
20512        CALL DPWRST('XXX','BUG ')
20513        WRITE(ICOUT,15)NI
20514        CALL DPWRST('XXX','BUG ')
20515        IERROR='YES'
20516        GOTO9000
20517      ELSEIF(GAMMA.LE.0.0D0)THEN
20518        WRITE(ICOUT,1)
20519        CALL DPWRST('XXX','BUG ')
20520        WRITE(ICOUT,23)
20521   23   FORMAT('      THE VALUE OF THE SHAPE PARAMETER (GAMMA) ',
20522     1         'IS NON-POSITIVE.')
20523        CALL DPWRST('XXX','BUG ')
20524        WRITE(ICOUT,25)GAMMA
20525   25   FORMAT('      THE VALUE OF GAMMA  = ',G15.7)
20526        CALL DPWRST('XXX','BUG ')
20527        IERROR='YES'
20528        GOTO9000
20529      ELSEIF(SCALE.LE.0.0D0)THEN
20530        WRITE(ICOUT,1)
20531        CALL DPWRST('XXX','BUG ')
20532        WRITE(ICOUT,33)
20533   33   FORMAT('      THE VALUE OF THE SCALE PARAMETER IS ',
20534     1         'NON-POSITIVE.')
20535        CALL DPWRST('XXX','BUG ')
20536        WRITE(ICOUT,35)SCALE
20537   35   FORMAT('      THE VALUE OF THE SCALE PARAMETER  = ',G15.7)
20538        CALL DPWRST('XXX','BUG ')
20539        IERROR='YES'
20540        GOTO9000
20541      ENDIF
20542C
20543      DSUM1=0.0D0
20544      DO50I=1,NI
20545        IF(LI(I).LE.0.0D0)THEN
20546          WRITE(ICOUT,1)
20547          CALL DPWRST('XXX','BUG ')
20548          WRITE(ICOUT,52)I
20549   52     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE GAUGE LENGTH ',
20550     1           'ARGUMENT (L) IS NON-POSITIVE.')
20551          CALL DPWRST('XXX','BUG ')
20552          WRITE(ICOUT,54)LI(I)
20553   54     FORMAT('      THE VALUE OF L(I)  = ',G15.7)
20554          CALL DPWRST('XXX','BUG ')
20555          GOTO9000
20556          IERROR='YES'
20557        ELSEIF(PI(I).LE.0.0D0 .OR. PI(I).GT.1.0D0)THEN
20558          WRITE(ICOUT,1)
20559          CALL DPWRST('XXX','BUG ')
20560          WRITE(ICOUT,57)I
20561   57     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE MIXING ',
20562     1           'ARGUMENT (P)')
20563          CALL DPWRST('XXX','BUG ')
20564          WRITE(ICOUT,58)
20565   58     FORMAT('      OUTSIDE THE (0,1) INTERVAL).')
20566          CALL DPWRST('XXX','BUG ')
20567          WRITE(ICOUT,59)PI(I)
20568   59     FORMAT('      THE VALUE OF P(I)  = ',G15.7)
20569          CALL DPWRST('XXX','BUG ')
20570          GOTO9000
20571          IERROR='YES'
20572        ENDIF
20573        DSUM1=DSUM1 + PI(I)
20574   50 CONTINUE
20575C
20576C     CHECK THAT MIXING PROPORTIONS SUM TO 1
20577C
20578      IF(ABS(DSUM1 - 1.0D0).GT.0.000001D0)THEN
20579        WRITE(ICOUT,1)
20580        CALL DPWRST('XXX','BUG ')
20581        WRITE(ICOUT,63)
20582   63   FORMAT('      THE MIXING PROPORTIONS DO NOT SUM TO ONE.')
20583        CALL DPWRST('XXX','BUG ')
20584        WRITE(ICOUT,65)REAL(DSUM1)
20585   65   FORMAT('      THE SUM OF THE MIXING PROPORTIONS  = ',G15.7)
20586        CALL DPWRST('XXX','BUG ')
20587      ENDIF
20588C
20589C     NOW COMPUTE THE CDF BY SUMMING OVER THE L(I) CASES
20590C
20591      DO100I=1,NX
20592        DSUM1=0.0D0
20593        DO200J=1,NI
20594          DTERM1=(X(I)-ALOC)/SCALE
20595          CALL BFWCDF(DTERM1,GAMMA,LI(J),DTERM2)
20596          DSUM1=DSUM1 + PI(J)*DTERM2
20597  200   CONTINUE
20598        CDF(I)=DSUM1
20599  100 CONTINUE
20600C
20601 9000 CONTINUE
20602      RETURN
20603      END
20604      SUBROUTINE BFWFUN (N, X, FVEC, IFLAG, XDATA, NOBS)
20605C
20606C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
20607C              BRITTLE FIBER WEIBULL MAXIMUM LIKELIHOOD
20608C              EQUATIONS.
20609C
20610C              SIGMA - (SUM[i=1 to N][L(i)*X(i)**G]/N)**(1/G)
20611C
20612C              N/G - N*LOG(SIGMA) + SUM[i=1 to n][LOG(X(i))] -
20613C                    SUM[i=1 to n][L(i)*(X(i)/G)**G*LOG(X(i)/G]
20614C
20615C              WITH G AND SIGMA DENOTING THE SHAPE PARAMETER GAMMA AND
20616C              SCALE PARAMETER SIGMA, RESPECTIVELY.
20617C
20618C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
20619C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
20620C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
20621C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
20622C
20623C              THE L(i) ARE THE GAUGE LENGTHS.  THESE CAN EITHER
20624C              BE CONSTANT (I.E., WE ARE FITTING A SINGLE LEVEL OF
20625C              L) OR VARIABLE.  THE L VALUES ARE STORED IN THE UPPER
20626C              HALF OF THE DATA ARRAY.
20627C
20628C     EXAMPLE--BRITTLE FIBER WEIBULL MAXIMUM LIKELIHOOD Y L
20629C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
20630C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
20631C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
20632C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
20633C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
20634C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
20635C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
20636C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
20637C     WRITTEN BY--ALAN HECKERT
20638C                 STATISTICAL ENGINEERING DIVISION
20639C                 INFORMATION TECHNOLOGY LABORATORY
20640C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20641C                 GAITHERSBUG, MD 20899-8980
20642C                 PHONE--301-975-2899
20643C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20644C           OF THE NATIONAL BUREAU OF STANDARDS.
20645C     LANGUAGE--ANSI FORTRAN (1977)
20646C     VERSION NUMBER--2010/11
20647C     ORIGINAL VERSION--NOVEMBER  2010.
20648C
20649C---------------------------------------------------------------------
20650C
20651      DOUBLE PRECISION X(*)
20652      DOUBLE PRECISION FVEC(*)
20653      REAL XDATA(*)
20654C
20655      DOUBLE PRECISION DN
20656      DOUBLE PRECISION DX
20657      DOUBLE PRECISION DG
20658      DOUBLE PRECISION DS
20659      DOUBLE PRECISION DL
20660      DOUBLE PRECISION DSUM1
20661      DOUBLE PRECISION DSUM2
20662      DOUBLE PRECISION DSUM3
20663      DOUBLE PRECISION DTERM1
20664      DOUBLE PRECISION DTERM2
20665      DOUBLE PRECISION DTERM3
20666C
20667C---------------------------------------------------------------------
20668C
20669      INCLUDE 'DPCOP2.INC'
20670C
20671C-----START POINT-----------------------------------------------------
20672C
20673C  COMPUTE SOME SUMS
20674C
20675      N=2
20676      IFLAG=0
20677C
20678      DG=X(1)
20679      DS=X(2)
20680      DN=DBLE(NOBS)
20681C
20682      DTERM1=(DN/DG) - DN*DLOG(DS)
20683      DSUM1=0.0D0
20684      DSUM2=0.0D0
20685      DSUM3=0.0D0
20686C
20687      DO200I=1,NOBS
20688        DX=DBLE(XDATA(I))
20689        DL=DBLE(XDATA(NOBS+I))
20690        DTERM2=DLOG(DX)
20691        DTERM3=DX/DS
20692        DSUM1=DSUM1+DLOG(DX)
20693        DSUM2=DSUM2 + DL*(DTERM3**DG)*DLOG(DTERM3)
20694        DSUM3=DSUM3 + DL*(DX**DG)
20695  200 CONTINUE
20696C
20697      FVEC(1)=DTERM1 + DSUM1 - DSUM2
20698      FVEC(2)=(DSUM3/DS**DG) - DN
20699C
20700      RETURN
20701      END
20702      SUBROUTINE BFWLI1(Y,XL,N,ICASPL,MINMAX,ALOC,SCALE,SHAPE,
20703     1                  ALIK,AIC,AICC,BIC,
20704     1                  ISUBRO,IBUGA3,IERROR)
20705C
20706C     PURPOSE--THIS ROUTINE COMPUTES THE LIKELIHOOD FUNCTION FOR
20707C              THE 3-PARAMETER BRITTLE FIBER WEIBULL DISTRIBUTION.
20708C              THIS IS FOR THE RAW DATA CASE (I.E., NO GROUPING AND
20709C              NO CENSORING).
20710C
20711C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
20712C              PERFORMED.
20713C
20714C              THE BRITTLE FIBER DISTRIBUTION IS A RE-PARAMETERIZED
20715C              VERSION OF THE WEIBULL DISTRIBUTION.  IT INCLUDES A
20716C              GAUGE LENGTH PARAMETER (ASSUMED KNOWN).
20717C
20718C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
20719C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
20720C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
20721C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
20722C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
20723C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
20724C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
20725C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
20726C              --KARL BURY, "STATISTICAL DISTRIBUTIONS IN ENGINEERING",
20727C                CAMBRIDGE UNIVERSITY PRESS, 1999, CHAPTER 17.
20728C     WRITTEN BY--ALAN HECKERT
20729C                 STATISTICAL ENGINEERING DIVISION
20730C                 INFORMATION TECHNOLOGY LABORATORY
20731C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20732C                 GAITHERSBURG, MD 20899-8980
20733C                 PHONE--301-975-2899
20734C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20735C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20736C     LANGUAGE--ANSI FORTRAN (1977)
20737C     VERSION NUMBER--2010/9
20738C     ORIGINAL VERSION--SEPTEMBER 2010.
20739C
20740C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20741C
20742      CHARACTER*4 ICASPL
20743      CHARACTER*4 ISUBRO
20744      CHARACTER*4 IBUGA3
20745      CHARACTER*4 IERROR
20746C
20747      CHARACTER*4 IWRITE
20748      CHARACTER*4 ISUBN1
20749      CHARACTER*4 ISUBN2
20750      CHARACTER*4 ISTEPN
20751C
20752      DOUBLE PRECISION DX
20753      DOUBLE PRECISION DL
20754      DOUBLE PRECISION DS
20755      DOUBLE PRECISION DU
20756      DOUBLE PRECISION DG
20757      DOUBLE PRECISION DN
20758      DOUBLE PRECISION DNP
20759      DOUBLE PRECISION DLIK
20760      DOUBLE PRECISION DSUM1
20761      DOUBLE PRECISION DSUM2
20762      DOUBLE PRECISION DSUM3
20763      DOUBLE PRECISION DTERM1
20764      DOUBLE PRECISION DTERM3
20765C
20766C---------------------------------------------------------------------
20767C
20768      DIMENSION Y(*)
20769      DIMENSION XL(*)
20770C
20771C---------------------------------------------------------------------
20772C
20773      INCLUDE 'DPCOP2.INC'
20774C
20775C-----START POINT-----------------------------------------------------
20776C
20777      ISUBN1='BFWL'
20778      ISUBN2='I1  '
20779      IERROR='NO'
20780C
20781      ALIK=-99.0
20782      AIC=-99.0
20783      AICC=-99.0
20784      BIC=-99.0
20785C
20786      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WLI1')THEN
20787        WRITE(ICOUT,999)
20788  999   FORMAT(1X)
20789        CALL DPWRST('XXX','WRIT')
20790        WRITE(ICOUT,51)
20791   51   FORMAT('**** AT THE BEGINNING OF BFWLI1--')
20792        CALL DPWRST('XXX','WRIT')
20793        WRITE(ICOUT,52)IBUGA3,ISUBRO,MINMAX
20794   52   FORMAT('IBUGA3,ISUBRO,MINMAX = ',2(A4,2X),I8)
20795        CALL DPWRST('XXX','WRIT')
20796        WRITE(ICOUT,55)N,ALOC,SCALE
20797   55   FORMAT('N,ALOC,SCALE = ',I8,2G15.7)
20798        CALL DPWRST('XXX','WRIT')
20799        DO56I=1,MIN(N,100)
20800          WRITE(ICOUT,57)I,Y(I),XL(I)
20801   57     FORMAT('I,Y(I),XL(I) = ',I8,2G15.7)
20802          CALL DPWRST('XXX','WRIT')
20803   56   CONTINUE
20804      ENDIF
20805C
20806C               ******************************************
20807C               **  STEP 1--                            **
20808C               **  COMPUTE LIKELIHOOD FUNCTION         **
20809C               ******************************************
20810C
20811      ISTEPN='1'
20812      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WLI1')
20813     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
20814C
20815      IERFLG=0
20816      IERROR='NO'
20817      IWRITE='OFF'
20818      IF(ICASPL.EQ.'BFWE')ALOC=0.0
20819C
20820C     LOG-LIKELIHOOD FUNCTION IS:
20821C
20822C     SUM[i=1 to n][LOG(L(i)] +
20823C     N*(LOG(SHAPE) - SHAPE*LOG(SCALE)) +
20824C     (SHAPE-1)*SUM[i=1 to n][LOG(X(i) - LOC] -
20825C     SUM[i=1 to n][-L(i)*((X(i) - LOC)/SCALE)**SHAPE]
20826C
20827C     L IS THE GAUGE LENGTH PARAMETER.  THE "XL" ARRAY ALLOWS
20828C     DIFFERENT VALUES OF L
20829C
20830      DN=DBLE(N)
20831      DS=DBLE(SCALE)
20832      DU=DBLE(ALOC)
20833      DG=DBLE(SHAPE)
20834      DTERM1=DN*(DLOG(DG) - DG*DLOG(DS))
20835      DSUM1=0.0D0
20836      DSUM2=0.0D0
20837      DSUM3=0.0D0
20838      DO1000I=1,N
20839        DX=DBLE(Y(I))
20840        DL=DBLE(XL(I))
20841        DSUM1=DSUM1 + DLOG(DX - DU)
20842        DSUM2=DSUM2 + DL*((DX-DU)/DS)**DG
20843        DSUM3=DSUM3 + DLOG(DL)
20844 1000 CONTINUE
20845C
20846      DLIK=DTERM1 + (DG-1.0D0)*DSUM1 - DSUM2
20847      ALIK=REAL(DLIK)
20848      DNP=2.0D0
20849      IF(ICASPL.EQ.'3BFW')DNP=3.0
20850      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
20851      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
20852      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
20853      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
20854C
20855      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WLI1')THEN
20856        WRITE(ICOUT,999)
20857        CALL DPWRST('XXX','WRIT')
20858        WRITE(ICOUT,9011)
20859 9011   FORMAT('**** AT THE END OF BFWLI1--')
20860        CALL DPWRST('XXX','WRIT')
20861        WRITE(ICOUT,9013)DSUM1,DSUM2,DTERM1,DTERM3
20862 9013   FORMAT('DSUM1,DSUM2,DTERM1,DTERM3 = ',3G15.7)
20863        CALL DPWRST('XXX','WRIT')
20864        WRITE(ICOUT,9014)ALIK,AIC,AICC,BIC
20865 9014   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
20866        CALL DPWRST('XXX','WRIT')
20867      ENDIF
20868C
20869      RETURN
20870      END
20871      SUBROUTINE BFWML1(Y,AL,N,MAXNXT,
20872     1                  TEMP1,TEMP2,DTEMP1,
20873     1                  XMEAN,XSD,XVAR,XMIN,XMAX,
20874     1                  SCALSV,SHAPSV,SCALML,SHAPML,
20875     1                  ISUBRO,IBUGA3,IERROR)
20876C
20877C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
20878C              FOR THE 2-PARAMETER BRITTLE FIBER WEIBULL DISTRIBUTION FOR
20879C              THE RAW DATA CASE (I.E., NO CENSORING AND NO GROUPING).
20880C              THIS ROUTINE CURRENTLY RETURNS ONLY THE POINT ESTIMATES.
20881C
20882C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
20883C              PERFORMED.
20884C
20885C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
20886C              FROM MULTIPLE PLACES (DPMBFW WILL GENERATE THE OUTPUT
20887C              FOR THE BRITTLE FIBER WEIBULL MLE COMMAND).
20888C
20889C              THE MLE ESTIMATES ARE THE SOLUTION TO THE FOLLOWING
20890C              TWO SIMULTANEOUS NON-LINEAR EQUATIONS:
20891C
20892C              SIGMA - (SUM[i=1 to N][L(i)*X(i)**G]/N)**(1/G)
20893C
20894C              N/G - N*LOG(SIGMA) + SUM[i=1 to n][LOG(X(i))] -
20895C                    SUM[i=1 to n][L(i)*(X(i)/G)**G*LOG(X(i)/G]
20896C
20897C              WITH G AND SIGMA DENOTING THE SHAPE PARAMETER GAMMA AND
20898C              SCALE PARAMETER SIGMA, RESPECTIVELY.
20899C
20900C              THE L(i) ARE THE GAUGE LENGTHS.  THESE CAN EITHER
20901C              BE CONSTANT (I.E., WE ARE FITTING A SINGLE LEVEL OF
20902C              L) OR VARIABLE.  THE L VALUES ARE STORED IN THE UPPER
20903C              HALF OF THE DATA ARRAY.
20904C
20905C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
20906C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
20907C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
20908C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
20909C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
20910C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
20911C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
20912C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
20913C     WRITTEN BY--ALAN HECKERT
20914C                 STATISTICAL ENGINEERING DIVISION
20915C                 INFORMATION TECHNOLOGY LABORATORY
20916C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
20917C                 GAITHERSBURG, MD 20899-8980
20918C                 PHONE--301-975-2899
20919C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
20920C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
20921C     LANGUAGE--ANSI FORTRAN (1977)
20922C     VERSION NUMBER--2010/11
20923C     ORIGINAL VERSION--NOVEMBER  2010.
20924C     UPDATED         --JUNE      2011. MODIFIED ALGORITHM FOR
20925C                                       DETERMINING STARTING VALUES
20926C     UPDATED         --MAY       2012. MODIFIED ALGORITHM FOR
20927C                                       DETERMINING STARTING VALUES
20928C
20929C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
20930C
20931      DIMENSION Y(*)
20932      DIMENSION AL(*)
20933      DIMENSION TEMP1(*)
20934      DIMENSION TEMP2(*)
20935      DOUBLE PRECISION DTEMP1(*)
20936C
20937      DOUBLE PRECISION TOL
20938      DOUBLE PRECISION XPAR(2)
20939      DOUBLE PRECISION FVEC(2)
20940C
20941      EXTERNAL BFWFUN
20942C
20943      CHARACTER*4 ISUBRO
20944      CHARACTER*4 IBUGA3
20945      CHARACTER*4 IERROR
20946C
20947      CHARACTER*40 IDIST
20948      CHARACTER*4 ISUBN1
20949      CHARACTER*4 ISUBN2
20950      CHARACTER*4 ISTEPN
20951      CHARACTER*4 IWEIBC
20952      CHARACTER*4 IWEIFL
20953C
20954C---------------------------------------------------------------------
20955C
20956      INCLUDE 'DPCOP2.INC'
20957C
20958C-----START POINT-----------------------------------------------------
20959C
20960      ISUBN1='BFWM'
20961      ISUBN2='L1  '
20962      IERROR='NO'
20963C
20964      DO11I=1,MAXNXT
20965        TEMP1(I)=0.0
20966        TEMP2(I)=0.0
20967   11 CONTINUE
20968C
20969      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WML1')THEN
20970        WRITE(ICOUT,999)
20971  999   FORMAT(1X)
20972        CALL DPWRST('XXX','WRIT')
20973        WRITE(ICOUT,51)
20974   51   FORMAT('**** AT THE BEGINNING OF BFWML1--')
20975        CALL DPWRST('XXX','WRIT')
20976        WRITE(ICOUT,52)IBUGA3,ISUBRO,IERROR,N
20977   52   FORMAT('IBUGA3,ISUBRO,IERROR,N = ',3(A4,2X),I8)
20978        CALL DPWRST('XXX','WRIT')
20979        DO56I=1,MIN(N,100)
20980          WRITE(ICOUT,57)I,Y(I),AL(I)
20981   57     FORMAT('I,Y(I),AL(I) = ',I8,2G15.7)
20982          CALL DPWRST('XXX','WRIT')
20983   56   CONTINUE
20984      ENDIF
20985C
20986C               ********************************************
20987C               **  STEP 1--                              **
20988C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
20989C               ********************************************
20990C
20991      ISTEPN='1'
20992      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'WML1')
20993     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
20994C
20995C               *****************************************************
20996C               **  STEP 2--                                       **
20997C               **  CARRY OUT CALCULATIONS                         **
20998C               **  FOR BRITTLE FIBER WEIBULL MLE ESTIMATE         **
20999C               *****************************************************
21000C
21001      ISTEPN='2'
21002      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WML1')
21003     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
21004C
21005      IDIST='2-PARAMETER BRITTLE FIBER WEIBULL'
21006C
21007      IFLAG=2
21008      CALL SUMRAW(Y,N,IDIST,IFLAG,
21009     1            XMEAN,XVAR,XSD,XMIN,XMAX,
21010     1            ISUBRO,IBUGA3,IERROR)
21011C
21012      SHAPML=CPUMIN
21013      SCALML=CPUMIN
21014C
21015      IF(SHAPSV.GT.0.0 .AND. SCALSV.GT.0.0)THEN
21016        XPAR(1)=DBLE(SHAPSV)
21017        XPAR(2)=DBLE(SCALSV)
21018      ELSE
21019C
21020C       IF NO STARTING VALUES SPECIFIED, COMPUTE STARTING
21021C       VALUES BASED ON STANDARD 2-PARAMETER WEIBULL.
21022C
21023C       THIS IS NOT REALLY SATISFACTORY AS THE "L" PARAMETER
21024C       MAY DISTORT THE SCALE PARAMETER.
21025C
21026C       2011/6: MODIFY ALGORITHM FOR STARTING VALUES.  USE
21027C
21028C               1) ESTIMATE SHAPE BASED ON THE STANDARD WEIBULL
21029C                  SINCE THE SHAPE PARAMETER FOR STANDARD WEIBULL
21030C                  AND BRITTLE FIBER WEIBULL SHOULD BASICALLY BE
21031C                  EQUIVALENT.
21032C
21033C               2) BASED ON THIS ESTIMATE OF GAMMA, GENERATE
21034C                  A PROBABILITY PLOT AND USE THE ESTIMATE OF
21035C                  SCALE (PPA1) FROM THIS.
21036C
21037C                  NOTE: 2012/5 - JUST USE THE EQUATION
21038C
21039C                        SIGMA = (SUM[i=1 to N][L(i)*X(i)**G]/N)**(1/G)
21040C
21041        IWEIBC='OFF'
21042        IWEIFL='WEIB'
21043        MINMAX=1
21044        CALL WEIML1(Y,N,IWEIBC,IWEIFL,MINMAX,
21045     1              TEMP1,DTEMP1,
21046     1              XMEAN,XSD,XVAR,XMIN,XMAX,
21047     1              ZMEAN,ZSD,
21048     1              SCALML,SCALSE,GHAT,SHAPSE,
21049     1              SHAPBC,SHABSE,COVSE,COVBSE,
21050     1              ISUBRO,IBUGA3,IERROR)
21051C
21052CCCCC   IWRITE='OFF'
21053CCCCC   AN=REAL(N)
21054CCCCC   CALL MEAN(AL,N,IWRITE,ALMEAN,IBUGA3,IERROR)
21055C
21056CCCCC   CALL SORT(Y,N,Y)
21057CCCCC   CALL UNIMED(N,TEMP1)
21058CCCCC   DO120I=1,N
21059CCCCC     CALL BFWPPF(DBLE(TEMP1(I)),DBLE(GHAT),DBLE(ALMEAN),DWOUT)
21060CCCCC     TEMP1(I)=REAL(DWOUT)
21061CC120   CONTINUE
21062CCCCC   CALL LINFIT(Y,TEMP1,N,
21063CCCCC1              PPA0,PPA1,XRESSD,XRESDF,PPCC,SDPPA0,SDPPA,CCALBE,
21064CCCCC1              ISUBRO,IBUGA3,IERROR)
21065C
21066        DSUM1=0.0D0
21067        DO120I=1,N
21068          DSUM1=DSUM1 + DBLE(AL(I))*DBLE(Y(I))**DBLE(GHAT)
21069  120   CONTINUE
21070        DSCALE=(DSUM1/DBLE(N))**(1.0D0/DBLE(GHAT))
21071C
21072        XPAR(1)=DBLE(GHAT)
21073CCCCC   XPAR(2)=DBLE(PPA1)
21074        XPAR(2)=DSCALE
21075      ENDIF
21076C
21077      DO1010I=1,N
21078        IINDX=I+N
21079        IF(IINDX.GT.MAXNXT)THEN
21080          WRITE(ICOUT,999)
21081          CALL DPWRST('XXX','WRIT')
21082          WRITE(ICOUT,1111)
21083 1111     FORMAT('**** ERROR IN 2-PARAMETER BRITTLE FIBER WEIBULL ',
21084     1           'MAXIMUM LIKELIHOOD')
21085          CALL DPWRST('XXX','WRIT')
21086          WRITE(ICOUT,1113)MAXNXT/2
21087 1113     FORMAT('     MAXIMUM NUMBER OF ROWS (',I8,') EXCEEDED.')
21088          CALL DPWRST('XXX','WRIT')
21089          SHAPML=CPUMIN
21090          SCALML=CPUMIN
21091          IERROR='YES'
21092          GOTO9000
21093        ENDIF
21094        Y(I+N)=AL(I)
21095 1010 CONTINUE
21096C
21097      IOPT=2
21098      TOL=1.0D-6
21099      NVAR=2
21100      NPRINT=-1
21101      INFO=0
21102      LWA=MAXNXT
21103      CALL DNSQE(BFWFUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
21104     1           DTEMP1,MAXNXT,Y,N)
21105C
21106      SHAPML=REAL(XPAR(1))
21107      SCALML=REAL(XPAR(2))
21108C
21109 9000 CONTINUE
21110      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'WML1')THEN
21111        WRITE(ICOUT,999)
21112        CALL DPWRST('XXX','WRIT')
21113        WRITE(ICOUT,9011)
21114 9011   FORMAT('**** AT THE END OF BFWML1--')
21115        CALL DPWRST('XXX','WRIT')
21116        WRITE(ICOUT,9013)N,XMEAN,XSD,XMIN,XMAX
21117 9013   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
21118        CALL DPWRST('XXX','WRIT')
21119        WRITE(ICOUT,9017)SHAPSV,SCALSV,SHAPML,SCALML
21120 9017   FORMAT('SHAPSV,SCALSV,SHAPML,SCALML =  ',4G15.7)
21121        CALL DPWRST('XXX','WRIT')
21122        WRITE(ICOUT,9019)XPAR(1),XPAR(2),INFO
21123 9019   FORMAT('XPAR(1),XPAR(2),INFO =  ',2G15.7,I8)
21124        CALL DPWRST('XXX','WRIT')
21125      ENDIF
21126C
21127      RETURN
21128      END
21129      SUBROUTINE BFWPDF(X,GAMMA,AL,PDF)
21130C
21131C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
21132C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
21133C              DISTRIBUTION WITH TAIL LENGTH PARAMETER = GAMMA AND
21134C              GAUGE LENGTH PARAMETER L.
21135C
21136C              THE BRITTLE FIBER WEIBULL DISTRIBUTION USED HEREIN IS
21137C              DEFINED FOR ALL POSITIVE X AND HAS THE
21138C              PROBABILITY DENSITY FUNCTION
21139C
21140C              f(X;GAMMA,L,SCALE) = L*GAMMA*(X**(GAMMA-1))*
21141C                                   EXP(-L*((X/SCALE)**GAMMA))/
21142C                                   (SCALE**GAMMA)
21143C
21144C              THE S PARAMETER IS THE SCALE PARAMETER AND IS SET TO
21145C              1 FOR THIS SUBROUTINE.
21146C     INPUT  ARGUMENTS--X      = THE VALUE AT WHICH THE
21147C                                PROBABILITY DENSITY FUNCTION IS TO
21148C                                BE EVALUATED.  X SHOULD BE NON-NEGATIVE.
21149C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
21150C                     --AL     = THE GAUGE LENGTH PARAMETER L.
21151C     OUTPUT ARGUMENTS--PDF    = THE PROBABILITY DENSITY FUNCTION VALUE.
21152C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY FUNCTION VALUE
21153C             PDF FOR THE BRITTLE FIBER WEIBULL DISTRIBUTION WITH
21154C             TAIL LENGTH PARAMETER = GAMMA AND GAUGE LENGTH PARAMETER L.
21155C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
21156C     RESTRICTIONS--X SHOULD BE NON-NEGATIVE.
21157C                 --GAMMA AND AL SHOULD BE POSITIVE.
21158C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
21159C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
21160C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
21161C     LANGUAGE--ANSI FORTRAN (1977)
21162C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
21163C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
21164C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
21165C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
21166C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
21167C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
21168C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
21169C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
21170C     WRITTEN BY--ALAN HECKERT
21171C                 STATISTICAL ENGINEERING DIVISION
21172C                 INFORMATION TECHNOLOGY LABORATORY
21173C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
21174C                 GAITHERSBURG, MD 20899-8980
21175C                 PHONE--301-975-2899
21176C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
21177C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
21178C     LANGUAGE--ANSI FORTRAN (1977)
21179C     VERSION NUMBER--2010.8
21180C     ORIGINAL VERSION--AUGUST    2010.
21181C
21182C---------------------------------------------------------------------
21183C
21184      DOUBLE PRECISION X
21185      DOUBLE PRECISION AL
21186      DOUBLE PRECISION GAMMA
21187      DOUBLE PRECISION PDF
21188      DOUBLE PRECISION DTERM1
21189      DOUBLE PRECISION DTERM2
21190C
21191      INCLUDE 'DPCOP2.INC'
21192C
21193C-----START POINT-----------------------------------------------------
21194C
21195C     CHECK THE INPUT ARGUMENTS FOR ERRORS
21196C
21197      PDF=0.0D0
21198      IF(X.LT.0.0D0)THEN
21199        WRITE(ICOUT,5)
21200    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BFWPDF IS ',
21201     1         'NEGATIVE.')
21202        CALL DPWRST('XXX','BUG ')
21203        WRITE(ICOUT,46)GAMMA
21204   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
21205        CALL DPWRST('XXX','BUG ')
21206        GOTO9000
21207      ELSEIF(X.EQ.0.0D0)THEN
21208        IF(GAMMA.EQ.1.0D0)THEN
21209          PDF=1.0D0
21210          GOTO9000
21211        ELSEIF(GAMMA.GT.1.0D0)THEN
21212          PDF=0.0D0
21213          GOTO9000
21214        ELSE
21215          WRITE(ICOUT,7)
21216    7     FORMAT('***** ERROR--THE FIRST ARGUMENT TO BFWPDF IS ',
21217     1           'ZERO.')
21218          CALL DPWRST('XXX','BUG ')
21219          GOTO9000
21220        ENDIF
21221      ELSEIF(GAMMA.LE.0.0D0)THEN
21222        WRITE(ICOUT,15)
21223   15   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BFWPDF IS ',
21224     1         'NON-POSITIVE')
21225        CALL DPWRST('XXX','BUG ')
21226        WRITE(ICOUT,46)GAMMA
21227        CALL DPWRST('XXX','BUG ')
21228        GOTO9000
21229      ELSEIF(AL.LE.0.0D0)THEN
21230        WRITE(ICOUT,25)
21231   25   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BFWPDF IS ',
21232     1         'NON-POSITIVE')
21233        CALL DPWRST('XXX','BUG ')
21234        WRITE(ICOUT,46)AL
21235        CALL DPWRST('XXX','BUG ')
21236        GOTO9000
21237      ENDIF
21238C
21239      DTERM1=AL*GAMMA*(X**(GAMMA-1.0))
21240      DTERM2=DEXP(-AL*(X**GAMMA))
21241      PDF=DTERM1*DTERM2
21242C
21243 9000 CONTINUE
21244      RETURN
21245      END
21246      SUBROUTINE BFWPD2(X,NX,LI,PI,NI,GAMMA,ALOC,SCALE,
21247     1                  PDF,
21248     1                  ISUBRO,IBUGA2,IERROR)
21249C
21250C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
21251C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
21252C              DISTRIBUTION WITH TAIL LENGTH PARAMETER = GAMMA AND
21253C              GAUGE LENGTH PARAMETER L.
21254C
21255C              THE BRITTLE FIBER WEIBULL DISTRIBUTION USED HEREIN IS
21256C              HAS THE PROBABILITY DENSITY FUNCTION
21257C
21258C              f(X;GAMMA,L,SCALE) = L*GAMMA*(X**(GAMMA-1))*
21259C                                   EXP(-L*((X/SCALE)**GAMMA))/
21260C                                   (SCALE**GAMMA)
21261C
21262C              THE BFWPDF ROUTINE COMPUTES THIS FUNCTION FOR A SINGLE
21263C              VALUE OF L.  THIS ROUTINE COMPUTES THIS FUNCTION FOR
21264C              MULTIPLE VALUES OF L.  IT DOES THIS USING A MIXTURE
21265C              APPROACH.  THAT IS
21266C
21267C              f(X;GAMMA,L,LOC,SCALE) = SUM[i=1 to NI]
21268C                  [p(i)*BFWPDF(X;GAMMA,L(i),LOC,SCALE)]
21269C
21270C              WHERE NI IS THE NUMBER OF DISTINCT VALUES FOR L.
21271C
21272C              THIS ROUTINE ASSUMES THAT THE LOCATION/SCALE/SHAPE
21273C              PARAMETERS ARE FIXED (I.E., ONLY L VARIES).
21274C
21275C              CURRENTLY, WE RESTRICT L TO A MAXIMUM OF 10 DISTINCT
21276C              LEVELS.
21277C
21278C     INPUT  ARGUMENTS--X      = A VARIABLE CONTAINING THE VALUES AT WHICH
21279C                                THE PROBABILITY DENSITY FUNCTION IS TO
21280C                                BE EVALUATED.
21281C                     --NX     = A PARAMETER THAT SPECIFIES THE NUMBER
21282C                                OF VALUES FOR X.
21283C                     --LI     = A VARIABLE CONTAINING THE GAUGE LENGTH
21284C                                PARAMETER L.
21285C                     --PI     = A VARIABLE CONTAINING THE "MIXING"
21286C                                PROPORTIONS FOR LI.
21287C                     --NI     = A PARAMETER THAT SPECIFIES THE NUMBER
21288C                                OF VALUES FOR LI AND PI.
21289C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
21290C                     --ALOC   = THE LOCATION PARAMETER.
21291C                     --SCALE  = THE SCALE PARAMETER.
21292C     OUTPUT ARGUMENTS--PDF    = A VARIABLE CONTAINING THE PROBABILITY
21293C                                DENSITY FUNCTION VALUES.
21294C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY FUNCTION VALUES.
21295C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
21296C     RESTRICTIONS--X SHOULD BE NON-NEGATIVE.
21297C                 --GAMMA AND AL SHOULD BE POSITIVE.
21298C     OTHER DATAPAC   SUBROUTINES NEEDED--BFWPDF.
21299C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
21300C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
21301C     LANGUAGE--ANSI FORTRAN (1977)
21302C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
21303C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
21304C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
21305C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
21306C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
21307C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
21308C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
21309C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
21310C     WRITTEN BY--ALAN HECKERT
21311C                 STATISTICAL ENGINEERING DIVISION
21312C                 INFORMATION TECHNOLOGY LABORATORY
21313C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
21314C                 GAITHERSBURG, MD 20899-8980
21315C                 PHONE--301-975-2899
21316C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
21317C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
21318C     LANGUAGE--ANSI FORTRAN (1977)
21319C     VERSION NUMBER--2010.8
21320C     ORIGINAL VERSION--OCTOBER   2010.
21321C
21322C---------------------------------------------------------------------
21323C
21324      DOUBLE PRECISION X(*)
21325      DOUBLE PRECISION LI(*)
21326      DOUBLE PRECISION PI(*)
21327      DOUBLE PRECISION PDF(*)
21328      DOUBLE PRECISION GAMMA
21329      DOUBLE PRECISION ALOC
21330      DOUBLE PRECISION SCALE
21331      DOUBLE PRECISION DSUM1
21332      DOUBLE PRECISION DTERM1
21333      DOUBLE PRECISION DTERM2
21334C
21335      CHARACTER*4 ISUBRO
21336      CHARACTER*4 IBUGA2
21337      CHARACTER*4 IERROR
21338C
21339      INCLUDE 'DPCOP2.INC'
21340C
21341C-----START POINT-----------------------------------------------------
21342C
21343C     CHECK THE INPUT ARGUMENTS FOR ERRORS
21344C
21345      IF(IBUGA2.EQ.'ON' .OR. ISUBRO.EQ.'WCD2')THEN
21346        WRITE(ICOUT,31)IBUGA2,ISUBRO
21347   31   FORMAT('AT THE BEGINNING OF BFWCD2')
21348        CALL DPWRST('XXX','BUG ')
21349      ENDIF
21350C
21351      IF(NX.LT.1)THEN
21352        WRITE(ICOUT,1)
21353    1   FORMAT('***** ERROR IN BRITTLE FIBER WEIBULL PDF--')
21354        CALL DPWRST('XXX','BUG ')
21355        WRITE(ICOUT,3)
21356    3   FORMAT('      THE NUMBER OF REQUESTED PDF VALUES IS ',
21357     1         'NON-POSITIVE.')
21358        CALL DPWRST('XXX','BUG ')
21359        WRITE(ICOUT,5)NX
21360    5   FORMAT('      THE NUMBER OF REQUESTED PDF VALUES  = ',I8)
21361        CALL DPWRST('XXX','BUG ')
21362        IERROR='YES'
21363        GOTO9000
21364      ELSEIF(NI.LT.1)THEN
21365        WRITE(ICOUT,1)
21366        CALL DPWRST('XXX','BUG ')
21367        WRITE(ICOUT,13)
21368   13   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
21369     1         'IS NON-POSITIVE.')
21370        CALL DPWRST('XXX','BUG ')
21371        WRITE(ICOUT,15)NI
21372   15   FORMAT('      THE NUMBER OF REQUESTED L VALUES  = ',I8)
21373        CALL DPWRST('XXX','BUG ')
21374        IERROR='YES'
21375        GOTO9000
21376      ELSEIF(NI.GT.10)THEN
21377        WRITE(ICOUT,1)
21378        CALL DPWRST('XXX','BUG ')
21379        WRITE(ICOUT,18)
21380   18   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
21381     1         'IS GREATER THAN 10.')
21382        CALL DPWRST('XXX','BUG ')
21383        WRITE(ICOUT,15)NI
21384        CALL DPWRST('XXX','BUG ')
21385        IERROR='YES'
21386        GOTO9000
21387      ELSEIF(GAMMA.LE.0.0D0)THEN
21388        WRITE(ICOUT,1)
21389        CALL DPWRST('XXX','BUG ')
21390        WRITE(ICOUT,23)
21391   23   FORMAT('      THE VALUE OF THE SHAPE PARAMETER (GAMMA) ',
21392     1         'IS NON-POSITIVE.')
21393        CALL DPWRST('XXX','BUG ')
21394        WRITE(ICOUT,25)GAMMA
21395   25   FORMAT('      THE VALUE OF GAMMA  = ',G15.7)
21396        CALL DPWRST('XXX','BUG ')
21397        IERROR='YES'
21398        GOTO9000
21399      ELSEIF(SCALE.LE.0.0D0)THEN
21400        WRITE(ICOUT,1)
21401        CALL DPWRST('XXX','BUG ')
21402        WRITE(ICOUT,33)
21403   33   FORMAT('      THE VALUE OF THE SCALE PARAMETER IS ',
21404     1         'NON-POSITIVE.')
21405        CALL DPWRST('XXX','BUG ')
21406        WRITE(ICOUT,35)SCALE
21407   35   FORMAT('      THE VALUE OF THE SCALE PARAMETER  = ',G15.7)
21408        CALL DPWRST('XXX','BUG ')
21409        IERROR='YES'
21410        GOTO9000
21411      ENDIF
21412C
21413      DO40I=1,NX
21414        IF((GAMMA.GE.1.0D0 .AND. X(I).LT.ALOC) .OR.
21415     1     (GAMMA.LT.1.0D0 .AND. X(I).LE.ALOC))THEN
21416          WRITE(ICOUT,1)
21417          CALL DPWRST('XXX','BUG ')
21418          WRITE(ICOUT,45)I
21419   45     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE INPUT ',
21420     1           'ARGUMENT IS ')
21421          CALL DPWRST('XXX','BUG ')
21422          WRITE(ICOUT,47)
21423   47     FORMAT('      LESS THAN OR EQUAL TO THE LOCATION PARAMETER.')
21424          CALL DPWRST('XXX','BUG ')
21425          WRITE(ICOUT,48)X(I)
21426   48     FORMAT('      THE VALUE OF X(I)                    = ',G15.7)
21427          CALL DPWRST('XXX','BUG ')
21428          WRITE(ICOUT,49)ALOC
21429   49     FORMAT('      THE VALUE OF THE LOCATION PARAMETER  = ',G15.7)
21430          CALL DPWRST('XXX','BUG ')
21431          GOTO9000
21432          IERROR='YES'
21433        ENDIF
21434   40 CONTINUE
21435C
21436      DSUM1=0.0D0
21437      DO50I=1,NI
21438        IF(LI(I).LE.0.0D0)THEN
21439          WRITE(ICOUT,1)
21440          CALL DPWRST('XXX','BUG ')
21441          WRITE(ICOUT,52)I
21442   52     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE GAUGE LENGTH ',
21443     1           'ARGUMENT (L) IS NON-POSITIVE.')
21444          CALL DPWRST('XXX','BUG ')
21445          WRITE(ICOUT,54)LI(I)
21446   54     FORMAT('      THE VALUE OF L(I)  = ',G15.7)
21447          CALL DPWRST('XXX','BUG ')
21448          GOTO9000
21449          IERROR='YES'
21450        ELSEIF(PI(I).LE.0.0D0 .OR. PI(I).GT.1.0D0)THEN
21451          WRITE(ICOUT,1)
21452          CALL DPWRST('XXX','BUG ')
21453          WRITE(ICOUT,57)I
21454   57     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE MIXING ',
21455     1           'ARGUMENT (P)')
21456          CALL DPWRST('XXX','BUG ')
21457          WRITE(ICOUT,58)
21458   58     FORMAT('      OUTSIDE THE (0,1) INTERVAL).')
21459          CALL DPWRST('XXX','BUG ')
21460          WRITE(ICOUT,59)PI(I)
21461   59     FORMAT('      THE VALUE OF P(I)  = ',G15.7)
21462          CALL DPWRST('XXX','BUG ')
21463          GOTO9000
21464          IERROR='YES'
21465        ENDIF
21466        DSUM1=DSUM1 + PI(I)
21467   50 CONTINUE
21468C
21469C     CHECK THAT MIXING PROPORTIONS SUM TO 1
21470C
21471      IF(ABS(DSUM1 - 1.0D0).GT.0.000001D0)THEN
21472        WRITE(ICOUT,1)
21473        CALL DPWRST('XXX','BUG ')
21474        WRITE(ICOUT,63)
21475   63   FORMAT('      THE MIXING PROPORTIONS DO NOT SUM TO ONE.')
21476        CALL DPWRST('XXX','BUG ')
21477        WRITE(ICOUT,65)REAL(DSUM1)
21478   65   FORMAT('      THE SUM OF THE MIXING PROPORTIONS  = ',G15.7)
21479        CALL DPWRST('XXX','BUG ')
21480      ENDIF
21481C
21482C     NOW COMPUTE THE PDF BY SUMMING OVER THE L(I) CASES
21483C
21484      DO100I=1,NX
21485        DSUM1=0.0D0
21486        DO200J=1,NI
21487          DTERM1=(X(I)-ALOC)/SCALE
21488          CALL BFWPDF(DTERM1,GAMMA,LI(J),DTERM2)
21489          DSUM1=DSUM1 + PI(J)*(DTERM2/SCALE)
21490  200   CONTINUE
21491        PDF(I)=DSUM1
21492  100 CONTINUE
21493C
21494 9000 CONTINUE
21495      RETURN
21496      END
21497      SUBROUTINE BFWPPF(P,GAMMA,AL,PPF)
21498C
21499C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
21500C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
21501C              DISTRIBUTION WITH TAIL LENGTH PARAMETER GAMMA AND
21502C              GAUGE LENGTH PARAMETER L.
21503C
21504C              THE BRITTLE FIBER WEIBULL DISTRIBUTION USED HEREIN IS
21505C              DEFINED FOR ALL POSITIVE X AND HAS THE PERCENT POINT
21506C              FUNCTION
21507C
21508C                 G(P;GAMMA,L) = [LOG(1/(1-P))/L]**(1/GAMMA)
21509C
21510C     INPUT  ARGUMENTS--P      = THE VALUE AT WHICH THE PERCENT POINT
21511C                                FUNCTION IS TO BE EVALUATED.  P SHOULD
21512C                                BE IN THE INTERVAL (0,1).
21513C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
21514C                     --AL     = THE GAUGE LENGTH PARAMETER L.
21515C     OUTPUT ARGUMENTS--PPF    = THE PERCENT POINT FUNCTION VALUE.
21516C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
21517C             FUNCTION VALUE PPF FOR THE BRITTLE FIBER WEIBULL
21518C             DISTRIBUTION WITH TAIL LENGTH PARAMETER GAMMA AND
21519C             GAUGE LENGTH PARAMETER L.
21520C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
21521C     RESTRICTIONS--P SHOULD BE IN THE INTERVAL (0,1).
21522C                 --GAMMA AND AL SHOULD BE POSITIVE.
21523C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
21524C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
21525C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
21526C     LANGUAGE--ANSI FORTRAN (1977)
21527C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
21528C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
21529C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
21530C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
21531C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
21532C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
21533C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
21534C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
21535C     WRITTEN BY--ALAN HECKERT
21536C                 STATISTICAL ENGINEERING DIVISION
21537C                 INFORMATION TECHNOLOGY LABORATORY
21538C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
21539C                 GAITHERSBURG, MD 20899-8980
21540C                 PHONE--301-975-2899
21541C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
21542C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
21543C     LANGUAGE--ANSI FORTRAN (1977)
21544C     VERSION NUMBER--2010.8
21545C     ORIGINAL VERSION--AUGUST    2010.
21546C
21547C---------------------------------------------------------------------
21548C
21549      DOUBLE PRECISION P
21550      DOUBLE PRECISION AL
21551      DOUBLE PRECISION GAMMA
21552      DOUBLE PRECISION PPF
21553      DOUBLE PRECISION DTERM1
21554C
21555      INCLUDE 'DPCOP2.INC'
21556C
21557C-----START POINT-----------------------------------------------------
21558C
21559C     CHECK THE INPUT ARGUMENTS FOR ERRORS
21560C
21561      PPF=0.0D0
21562      IF(P.LT.0.0D0 .OR. P.GE.1.0D0)THEN
21563        WRITE(ICOUT,5)
21564    5   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BFWPPF IS ',
21565     1         'OUTSIDE THE (0,1) INTERVAL.')
21566        CALL DPWRST('XXX','BUG ')
21567        WRITE(ICOUT,46)P
21568        CALL DPWRST('XXX','BUG ')
21569        GOTO9000
21570      ELSEIF(1.0D0 - P.LE.0.0D0)THEN
21571        WRITE(ICOUT,8)
21572    8   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BFWPPF IS ',
21573     1         'TOO CLOSE TO 1 TO COMPUTE.')
21574        CALL DPWRST('XXX','BUG ')
21575        WRITE(ICOUT,46)P
21576        CALL DPWRST('XXX','BUG ')
21577        GOTO9000
21578      ELSEIF(GAMMA.LE.0.0D0)THEN
21579        WRITE(ICOUT,15)
21580   15   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BFWPPF IS ',
21581     1         'NON-POSITIVE')
21582        CALL DPWRST('XXX','BUG ')
21583        WRITE(ICOUT,46)GAMMA
21584   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
21585        CALL DPWRST('XXX','BUG ')
21586        GOTO9000
21587      ELSEIF(AL.LE.0.0D0)THEN
21588        WRITE(ICOUT,25)
21589   25   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BFWPPF IS ',
21590     1         'NON-POSITIVE')
21591        CALL DPWRST('XXX','BUG ')
21592        WRITE(ICOUT,46)AL
21593        CALL DPWRST('XXX','BUG ')
21594        GOTO9000
21595      ENDIF
21596C
21597      IF(P.EQ.0.0D0)THEN
21598        PPF=0.0D0
21599      ELSE
21600        DTERM1=DLOG(1.0D0/(1.0D0 - P))
21601        PPF=(DTERM1/AL)**(1.0D0/GAMMA)
21602      ENDIF
21603C
21604 9000 CONTINUE
21605      RETURN
21606      END
21607      SUBROUTINE BFWPP2(P,NX,LI,PI,NI,GAMMA,ALOC,SCALE,
21608     1                  PPF,
21609     1                  ISUBRO,IBUGA2,IERROR)
21610C
21611C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
21612C              FUNCTION VALUE FOR THE BRITTLE FIBER WEIBULL
21613C              DISTRIBUTION.
21614C
21615C              THE BFWPPF ROUTINE COMPUTES THIS FUNCTION FOR A SINGLE
21616C              VALUE OF L.  THIS ROUTINE COMPUTES THIS FUNCTION FOR
21617C              MULTIPLE VALUES OF L.  IT DOES THIS USING A MIXTURE
21618C              APPROACH.  ALTHOUGH BFWPPF COMPUTES THIS USING AN
21619C              CLOSED FORMULA, BFWPP2 NEEDS TO COMPUTE IT BY
21620C              NUMERICALLY INVERTING THE CUMULATIVE DISTRIBUTION
21621C              FUNCTION.
21622C
21623C              THIS ROUTINE ASSUMES THAT THE LOCATION/SCALE/SHAPE
21624C              PARAMETERS ARE FIXED (I.E., ONLY L VARIES).
21625C
21626C              CURRENTLY, WE RESTRICT L TO A MAXIMUM OF 10 DISTINCT
21627C              LEVELS.
21628C
21629C     INPUT  ARGUMENTS--P      = A VARIABLE CONTAINING THE VALUES AT WHICH
21630C                                THE PERCENT POINT FUNCTION IS
21631C                                TO BE EVALUATED.
21632C                     --NX     = A PARAMETER THAT SPECIFIES THE NUMBER
21633C                                OF VALUES FOR P.
21634C                     --LI     = A VARIABLE CONTAINING THE GAUGE LENGTH
21635C                                PARAMETER L.
21636C                     --PI     = A VARIABLE CONTAINING THE "MIXING"
21637C                                PROPORTIONS FOR LI.
21638C                     --NI     = A PARAMETER THAT SPECIFIES THE NUMBER
21639C                                OF VALUES FOR LI AND PI.
21640C                     --GAMMA  = THE SHAPE PARAMETER GAMMA.
21641C                     --ALOC   = THE LOCATION PARAMETER.
21642C                     --SCALE  = THE SCALE PARAMETER.
21643C     OUTPUT ARGUMENTS--PPF    = A VARIABLE CONTAINING THE CUMULATIVE
21644C                                DISTRIBUTION FUNCTION VALUES.
21645C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT FUNCTION VALUES.
21646C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
21647C     OTHER DATAPAC   SUBROUTINES NEEDED--BFWCD2.
21648C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
21649C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
21650C     LANGUAGE--ANSI FORTRAN (1977)
21651C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
21652C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
21653C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
21654C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
21655C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
21656C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
21657C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
21658C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
21659C     WRITTEN BY--ALAN HECKERT
21660C                 STATISTICAL ENGINEERING DIVISION
21661C                 INFORMATION TECHNOLOGY LABORATORY
21662C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
21663C                 GAITHERSBURG, MD 20899-8980
21664C                 PHONE--301-975-2899
21665C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
21666C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
21667C     LANGUAGE--ANSI FORTRAN (1977)
21668C     VERSION NUMBER--2010.8
21669C     ORIGINAL VERSION--OCTOBER   2010.
21670C
21671C---------------------------------------------------------------------
21672C
21673      DOUBLE PRECISION P(*)
21674      DOUBLE PRECISION LI(*)
21675      DOUBLE PRECISION PI(*)
21676      DOUBLE PRECISION PPF(*)
21677      DOUBLE PRECISION GAMMA
21678      DOUBLE PRECISION ALOC
21679      DOUBLE PRECISION SCALE
21680C
21681      DOUBLE PRECISION DCDF(1)
21682      DOUBLE PRECISION DX(1)
21683C
21684      DOUBLE PRECISION DTERM1
21685      DOUBLE PRECISION DTERM2
21686      DOUBLE PRECISION DSUM1
21687      DOUBLE PRECISION DP
21688      DOUBLE PRECISION DP1
21689      DOUBLE PRECISION DPPF
21690      DOUBLE PRECISION DCDFL
21691      DOUBLE PRECISION DCDFR
21692      DOUBLE PRECISION DXL
21693      DOUBLE PRECISION DXR
21694      DOUBLE PRECISION DFXL
21695      DOUBLE PRECISION DFXR
21696      DOUBLE PRECISION DFCS
21697      DOUBLE PRECISION DXRML
21698      DOUBLE PRECISION DSIG
21699      DOUBLE PRECISION DEPS
21700      DOUBLE PRECISION LMIN
21701      DOUBLE PRECISION LMAX
21702C
21703      CHARACTER*4 ISUBRO
21704      CHARACTER*4 IBUGA2
21705      CHARACTER*4 IERROR
21706C
21707      INCLUDE 'DPCOP2.INC'
21708C
21709      DATA DEPS /1.0D-14/
21710      DATA DSIG /1.0D-14/
21711      DATA MAXIT /1000/
21712C
21713C-----START POINT-----------------------------------------------------
21714C
21715C     CHECK THE INPUT ARGUMENTS FOR ERRORS
21716C
21717      IF(IBUGA2.EQ.'ON' .OR. ISUBRO.EQ.'WCD2')THEN
21718        WRITE(ICOUT,31)IBUGA2,ISUBRO
21719   31   FORMAT('AT THE BEGINNING OF BFWCD2')
21720        CALL DPWRST('XXX','BUG ')
21721      ENDIF
21722C
21723      IF(NX.LT.1)THEN
21724        WRITE(ICOUT,1)
21725    1   FORMAT('***** ERROR IN BRITTLE FIBER WEIBULL PPF--')
21726        CALL DPWRST('XXX','BUG ')
21727        WRITE(ICOUT,3)
21728    3   FORMAT('      THE NUMBER OF REQUESTED PPF VALUES IS ',
21729     1         'NON-POSITIVE.')
21730        CALL DPWRST('XXX','BUG ')
21731        WRITE(ICOUT,5)NX
21732    5   FORMAT('      THE NUMBER OF REQUESTED PPF VALUES  = ',I8)
21733        CALL DPWRST('XXX','BUG ')
21734        IERROR='YES'
21735        GOTO9000
21736      ELSEIF(NI.LT.1)THEN
21737        WRITE(ICOUT,1)
21738        CALL DPWRST('XXX','BUG ')
21739        WRITE(ICOUT,13)
21740   13   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
21741     1         'IS NON-POSITIVE.')
21742        CALL DPWRST('XXX','BUG ')
21743        WRITE(ICOUT,15)NI
21744   15   FORMAT('      THE NUMBER OF REQUESTED L VALUES  = ',I8)
21745        CALL DPWRST('XXX','BUG ')
21746        IERROR='YES'
21747        GOTO9000
21748      ELSEIF(NI.GT.10)THEN
21749        WRITE(ICOUT,1)
21750        CALL DPWRST('XXX','BUG ')
21751        WRITE(ICOUT,18)
21752   18   FORMAT('      THE NUMBER OF DISTINCT GAUGE LENGTH (L) VALUES ',
21753     1         'IS GREATER THAN 10.')
21754        CALL DPWRST('XXX','BUG ')
21755        WRITE(ICOUT,15)NI
21756        CALL DPWRST('XXX','BUG ')
21757        IERROR='YES'
21758        GOTO9000
21759      ELSEIF(GAMMA.LE.0.0D0)THEN
21760        WRITE(ICOUT,1)
21761        CALL DPWRST('XXX','BUG ')
21762        WRITE(ICOUT,23)
21763   23   FORMAT('      THE VALUE OF THE SHAPE PARAMETER (GAMMA) ',
21764     1         'IS NON-POSITIVE.')
21765        CALL DPWRST('XXX','BUG ')
21766        WRITE(ICOUT,25)GAMMA
21767   25   FORMAT('      THE VALUE OF GAMMA  = ',G15.7)
21768        CALL DPWRST('XXX','BUG ')
21769        IERROR='YES'
21770        GOTO9000
21771      ELSEIF(SCALE.LE.0.0D0)THEN
21772        WRITE(ICOUT,1)
21773        CALL DPWRST('XXX','BUG ')
21774        WRITE(ICOUT,33)
21775   33   FORMAT('      THE VALUE OF THE SCALE PARAMETER IS ',
21776     1         'NON-POSITIVE.')
21777        CALL DPWRST('XXX','BUG ')
21778        WRITE(ICOUT,35)SCALE
21779   35   FORMAT('      THE VALUE OF THE SCALE PARAMETER  = ',G15.7)
21780        CALL DPWRST('XXX','BUG ')
21781        IERROR='YES'
21782        GOTO9000
21783      ENDIF
21784C
21785      DSUM1=0.0D0
21786      DO50I=1,NI
21787        IF(LI(I).LE.0.0D0)THEN
21788          WRITE(ICOUT,1)
21789          CALL DPWRST('XXX','BUG ')
21790          WRITE(ICOUT,52)I
21791   52     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE GAUGE LENGTH ',
21792     1           'ARGUMENT (L) IS NON-POSITIVE.')
21793          CALL DPWRST('XXX','BUG ')
21794          WRITE(ICOUT,54)LI(I)
21795   54     FORMAT('      THE VALUE OF L(I)  = ',G15.7)
21796          CALL DPWRST('XXX','BUG ')
21797          GOTO9000
21798          IERROR='YES'
21799        ELSEIF(PI(I).LE.0.0D0 .OR. PI(I).GT.1.0D0)THEN
21800          WRITE(ICOUT,1)
21801          CALL DPWRST('XXX','BUG ')
21802          WRITE(ICOUT,57)I
21803   57     FORMAT('      FOR ROW ',I8,' THE VALUE OF THE MIXING ',
21804     1           'ARGUMENT (P)')
21805          CALL DPWRST('XXX','BUG ')
21806          WRITE(ICOUT,58)
21807   58     FORMAT('      OUTSIDE THE (0,1) INTERVAL).')
21808          CALL DPWRST('XXX','BUG ')
21809          WRITE(ICOUT,59)PI(I)
21810   59     FORMAT('      THE VALUE OF P(I)  = ',G15.7)
21811          CALL DPWRST('XXX','BUG ')
21812          GOTO9000
21813          IERROR='YES'
21814        ENDIF
21815        DSUM1=DSUM1 + PI(I)
21816   50 CONTINUE
21817C
21818C     CHECK THAT MIXING PROPORTIONS SUM TO 1
21819C
21820      IF(ABS(DSUM1 - 1.0D0).GT.0.000001D0)THEN
21821        WRITE(ICOUT,1)
21822        CALL DPWRST('XXX','BUG ')
21823        WRITE(ICOUT,63)
21824   63   FORMAT('      THE MIXING PROPORTIONS DO NOT SUM TO ONE.')
21825        CALL DPWRST('XXX','BUG ')
21826        WRITE(ICOUT,65)REAL(DSUM1)
21827   65   FORMAT('      THE SUM OF THE MIXING PROPORTIONS  = ',G15.7)
21828        CALL DPWRST('XXX','BUG ')
21829      ENDIF
21830C
21831C     NOW COMPUTE THE PPF BY NUMERICALLY INVERTING THE CDF FUNCTION
21832C
21833      NTEMP=1
21834      LMIN=LI(1)
21835      LMAX=LI(1)
21836      DO90I=1,NI
21837        IF(LI(I).LT.LMIN)LMIN=LI(I)
21838        IF(LI(I).GT.LMAX)LMAX=LI(I)
21839   90 CONTINUE
21840C
21841      DO100I=1,NX
21842        DP=P(I)
21843C
21844        IF(DP.LT.0.0D0 .OR. DP.GE.1.0D0)THEN
21845          WRITE(ICOUT,1)
21846          CALL DPWRST('XXX','BUG ')
21847          WRITE(ICOUT,105)I
21848  105     FORMAT('      FOR ROW ',I8,' THE PROBABILITY PARAMETER (P) ',
21849     1           'IS OUTSIDE THE (0,1) INTERVAL.')
21850          CALL DPWRST('XXX','BUG ')
21851          WRITE(ICOUT,106)DP
21852  106     FORMAT('      THE VALUE OF P  = ',G15.7)
21853          CALL DPWRST('XXX','BUG ')
21854          IERROR='YES'
21855          GOTO9000
21856        ELSEIF(1.0D0 - DP.LE.0.0D0)THEN
21857          WRITE(ICOUT,1)
21858          CALL DPWRST('XXX','BUG ')
21859          WRITE(ICOUT,108)I
21860  108     FORMAT('      FOR ROW ',I8,' THE PROBABILITY PARAMETER (P) ',
21861     1           'IS TOO CLOSE TO 1 TO COMPUTE.')
21862          CALL DPWRST('XXX','BUG ')
21863          WRITE(ICOUT,106)DP
21864          CALL DPWRST('XXX','BUG ')
21865          IERROR='YES'
21866          GOTO9000
21867        ENDIF
21868        IF(DP.EQ.0.0D0)THEN
21869          PPF(I)=ALOC
21870          GOTO100
21871        ENDIF
21872C
21873C       STEP 1: FIND BRACKETING INTERVAL
21874C
21875        CALL BFWPPF(DP,GAMMA,LMIN,DTERM1)
21876        DTERM1=ALOC + SCALE*DTERM1
21877        CALL BFWPPF(DP,GAMMA,LMAX,DTERM2)
21878        DTERM2=ALOC + SCALE*DTERM2
21879        DXL=MIN(DTERM1,DTERM2)
21880        DXR=MAX(DTERM1,DTERM2)
21881        IF(DXL.EQ.DXR)THEN
21882          PPF(I)=DXL
21883          GOTO100
21884        ENDIF
21885        NTEMP=1
21886        DX(1)=DXL
21887        CALL BFWCD2(DX,NTEMP,LI,PI,NI,GAMMA,ALOC,SCALE,DCDF,
21888     1              ISUBRO,IBUGA2,IERROR)
21889        DCDFL=DCDF(1)
21890        DX(1)=DXR
21891        CALL BFWCD2(DX,NTEMP,LI,PI,NI,GAMMA,ALOC,SCALE,DCDF,
21892     1              ISUBRO,IBUGA2,IERROR)
21893        DCDFR=DCDF(1)
21894C
21895        IF(DCDFL.LT.DP .AND. DCDFR.LT.DP)THEN
21896          PPF(I)=CPUMIN
21897          GOTO100
21898        ELSEIF(DCDFL.GT.DP .AND. DCDFR.GT.DP)THEN
21899          PPF(I)=CPUMIN
21900          GOTO100
21901        ENDIF
21902C
21903C       STEP 2: BISECTION METHOD
21904C
21905        IC = 0
21906        DFXL = -DP
21907        DFXR = 1.0D0 - DP
21908  205   CONTINUE
21909        DX(1)=(DXL+DXR)*0.5D0
21910        CALL BFWCD2(DX,NTEMP,LI,PI,NI,GAMMA,ALOC,SCALE,DCDF,
21911     1              ISUBRO,IBUGA2,IERROR)
21912        DP1=DCDF(1)
21913        DPPF=DX(1)
21914        DFCS = DP1 - DP
21915C
21916        IF(DFCS*DFXL.GT.0.0D0)THEN
21917          DXL = DX(1)
21918          DFXL = DFCS
21919        ELSE
21920          DXR = DX(1)
21921          DFXR = DFCS
21922        ENDIF
21923C
21924        DXRML = DXR - DXL
21925        IF(DXRML.LE.DSIG .AND. DABS(DFCS).LE.DEPS)THEN
21926          PPF(I)=DPPF
21927          GOTO100
21928        ENDIF
21929C
21930C       STEP 3: ERROR MESSAGE FOR NO CONVERGENCE
21931C
21932        IC = IC + 1
21933        IF(IC.LE.MAXIT)GOTO205
21934        WRITE(ICOUT,1)
21935        CALL DPWRST('XXX','BUG ')
21936        WRITE(ICOUT,230)I,DP
21937  230   FORMAT('      FOR ROW ',I8,' (P = ',G15.7,'), THERE WAS ',
21938     1         'NO CONVERGENCE')
21939        CALL DPWRST('XXX','BUG ')
21940        WRITE(ICOUT,233)
21941  233   FORMAT('      LAST VALUE OBTAINED WILL BE USED.')
21942        CALL DPWRST('XXX','BUG ')
21943        PPF(I)=DPPF
21944        GOTO100
21945C
21946  100 CONTINUE
21947C
21948 9000 CONTINUE
21949      RETURN
21950      END
21951      SUBROUTINE BFWRAN(N,GAMMA,AL,ISEED,X)
21952C
21953C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
21954C              FROM THE BRITTLE FIBER WEIBULL DISTRIBUTION
21955C              WITH TAIL LENGTH PARAMETER VALUE = GAMMA.  NOT THAT THE
21956C              "GAUGE LENGTH" PARAMETER, L, IS ASSUMED FIXED AND KNOWN.
21957C              THIS IS ESSENTIALLY A RE-PARAMETERIZED WEIBULL
21958C              DISTRIBUTION THAT HAS THE PROBABILITY DENSITY FUNCTION
21959C
21960C              F(X;GAMMA,L,SCALE) = L*GAMMA*(X**(GAMMA-1))*
21961C                                   EXP(-L*((X/SCALE)**GAMMA))/
21962C                                   (SCALE**GAMMA)
21963C
21964C              SCALE IS SET TO 1 IN THIS ROUTINE.
21965C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
21966C                                OF RANDOM NUMBERS TO BE
21967C                                GENERATED.
21968C                     --GAMMA  = THE SINGLE PRECISION VALUE OF THE
21969C                                TAIL LENGTH PARAMETER.
21970C                                GAMMA SHOULD BE POSITIVE.
21971C                     --AL     = THE SINGLE PRECISION VALUE THAT SPECIEIS
21972C                                THE GAUGE LENGTH PARAMETER.
21973C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
21974C                                (OF DIMENSION AT LEAST N)
21975C                                INTO WHICH THE GENERATED
21976C                                RANDOM SAMPLE WILL BE PLACED.
21977C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE BRITTLE FRACTURE WEIBULL
21978C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = GAMMA.
21979C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
21980C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
21981C                   OF N FOR THIS SUBROUTINE.
21982C                 --GAMMA SHOULD BE POSITIVE.
21983C                 --AL    SHOULD BE POSITIVE.
21984C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BFWPPF.
21985C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
21986C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
21987C     LANGUAGE--ANSI FORTRAN (1977)
21988C     REFERENCES--STONER, EDIE, AND DURHAM (1994), "AN END-EFFECT MODEL
21989C                 FOR THE SINGLE-FILAMENT TENSILE TEST", JOURNAL OF
21990C                 OF MATERIALS SCIENCE, 29, PP. 6561-6574.
21991C               --NEWELL AND SAGENDORF (1999), "EXPERIMENTAL VERIFICATION
21992C                 OF THE END-EFFECT WEIBULL MODEL AS A PREDICTOR OF THE
21993C                 TENSILE STRENGTH OF KEVLAR-29 (POLY
21994C                 p-PHENYLENETEREPHTHALAMIDE) FIBRES AT DIFFERENCE GAUGE
21995C                 LENGTHS", HIGH PERFORMANCE POLYMERS, 11, PP. 297-305.
21996C     WRITTEN BY--ALAN HECKERT
21997C                 STATISTICAL ENGINEERING DIVISION
21998C                 INFORMATION TECHNOLOGY LABORATORY
21999C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22000C                 GAITHERSBURG, MD 20899-8980
22001C                 PHONE--301-975-2899
22002C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22003C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22004C     LANGUAGE--ANSI FORTRAN (1977)
22005C     VERSION NUMBER--2010.8
22006C     ORIGINAL VERSION--AUGUST    2010.
22007C
22008C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22009C
22010C---------------------------------------------------------------------
22011C
22012      DIMENSION X(*)
22013C
22014      DOUBLE PRECISION DPPF
22015C
22016C---------------------------------------------------------------------
22017C
22018      INCLUDE 'DPCOP2.INC'
22019C
22020C-----START POINT-----------------------------------------------------
22021C
22022C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22023C
22024      IF(N.LT.1)THEN
22025        WRITE(ICOUT, 5)
22026    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF BRITTLE FIBER ',
22027     1         'WEIBULL RANDOM NUMBERS IS NON-POSITIVE.')
22028        CALL DPWRST('XXX','BUG ')
22029        WRITE(ICOUT,47)N
22030   47   FORMAT('***** THE REQUESTED NUMBER OF RANDOM NUMBERS IS ',I8)
22031        CALL DPWRST('XXX','BUG ')
22032        GOTO9000
22033      ELSEIF(GAMMA.LE.0.0)THEN
22034        WRITE(ICOUT,15)
22035   15   FORMAT('***** ERROR--THE VALUE OF THE SHAPE PARAMETER (GAMMA) ',
22036     1         'FOR THE BRITTLE FIBER WEIBULL')
22037        CALL DPWRST('XXX','BUG ')
22038        WRITE(ICOUT,17)
22039   17   FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
22040        CALL DPWRST('XXX','BUG ')
22041        WRITE(ICOUT,46)GAMMA
22042   46   FORMAT('***** THE VALUE OF GAMMA IS ',G15.7)
22043        CALL DPWRST('XXX','BUG ')
22044        GOTO9000
22045      ELSEIF(AL.LE.0.0)THEN
22046        WRITE(ICOUT,25)
22047   25   FORMAT('***** ERROR--THE VALUE OF THE GAUGE LENGTH PARAMETER ',
22048     1         '(L) FOR THE BRITTLE FIBER WEIBULL')
22049        CALL DPWRST('XXX','BUG ')
22050        WRITE(ICOUT,27)
22051   27   FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
22052        CALL DPWRST('XXX','BUG ')
22053        WRITE(ICOUT,45)AL
22054   45   FORMAT('***** THE VALUE OF L IS ',G15.7)
22055        CALL DPWRST('XXX','BUG ')
22056        GOTO9000
22057      ENDIF
22058C
22059C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
22060C
22061      CALL UNIRAN(N,ISEED,X)
22062C
22063C     GENERATE N BRITTLE FIBER WEIBULL DISTRIBUTION RANDOM NUMBERS
22064C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
22065C
22066      DO100I=1,N
22067        CALL BFWPPF(DBLE(X(I)),DBLE(GAMMA),DBLE(AL),DPPF)
22068        X(I)=REAL(DPPF)
22069  100 CONTINUE
22070C
22071 9000 CONTINUE
22072      RETURN
22073      END
22074      SUBROUTINE BGECDF(X,ALPHA,BETA,CDF)
22075C
22076C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
22077C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
22078C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22079C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22080C              THIS DISTRIBUTION IS DEFINED FOR ALL
22081C              NON-NEGATIVE INTEGER X.
22082C
22083C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22084C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA-1)/BETA(ALPHA,BETA)
22085C              WHERE B(A,B) IS THE BETA FUNCTION.
22086C              NOTE THAT HESSELAGER GIVES THIS AS
22087C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22088C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22089C              CDF).
22090C
22091C              HESSELAGER'S RECURRENCE FORMULA FOR THE CUMULATIVE
22092C              DISTRIBUTION FUNCTION IS:
22093C
22094C                p(X;ALHA,BETA) - [(X+ALPHA-1)/(X+ALPHA+BETA)]*
22095C                                 p(X-1;ALPHA,BETA)
22096C
22097C              CONVERTING THIS TO THE MORE COMMON PARAMETERIZATION
22098C              YIELDS
22099C
22100C                p(X;ALHA,BETA) - [(X+BETA-2)/(X+ALPHA+BETA-1)]*
22101C                                 p(X-1;ALPHA,BETA)
22102C
22103C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
22104C                                AT WHICH THE CUMULATIVE DISTRIBUTION
22105C                                FUNCTION IS TO BE EVALUATED.
22106C                                X SHOULD BE A NON-NEGATIVE INTEGR
22107C                     --ALPHA  = THE SINGLE PRECISION VALUE
22108C                                OF THE FIRST SHAPE PARAMETER.
22109C                     --BETA   = THE SINGLE PRECISION VALUE
22110C                                OF THE SECOND SHAPE PARAMETER.
22111C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
22112C                                DISTRIBUTION FUNCTION VALUE.
22113C     OUTPUT--THE SINGLE PRECISION PROBABILITY DISTRIBUTION
22114C             FUNCTION VALUE CDF
22115C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22116C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22117C     RESTRICTIONS--X SHOULD BE A NON-NEGATIVE INTEGER
22118C                 --ALPHA AND BETA SHOULD BE POSITIVE
22119C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22120C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22121C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22122C     LANGUAGE--ANSI FORTRAN (1977)
22123C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
22124C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
22125C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
22126C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
22127C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
22128C                 WILEY, CHAPTER 6.
22129C     WRITTEN BY--JAMES J. FILLIBEN
22130C                 STATISTICAL ENGINEERING DIVISION
22131C                 INFORMATION TECHNOLOGY LABORATORY
22132C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22133C                 GAITHERSBURG< MD 20899-8980
22134C                 PHONE--301-975-2855
22135C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22136C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22137C     LANGUAGE--ANSI FORTRAN (1977)
22138C     VERSION NUMBER--2006/5
22139C     ORIGINAL VERSION--MAY       2006.
22140C
22141C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22142C
22143C---------------------------------------------------------------------
22144C
22145      DOUBLE PRECISION DX
22146      DOUBLE PRECISION DALPHA
22147      DOUBLE PRECISION DBETA
22148      DOUBLE PRECISION DTERM1
22149      DOUBLE PRECISION DTERM2
22150      DOUBLE PRECISION DTERM3
22151      DOUBLE PRECISION DLBETA
22152      DOUBLE PRECISION DSUM
22153      DOUBLE PRECISION DPDF
22154      DOUBLE PRECISION DPDFSV
22155C
22156      INCLUDE 'DPCOMC.INC'
22157C
22158C---------------------------------------------------------------------
22159C
22160      INCLUDE 'DPCOP2.INC'
22161C
22162C-----START POINT-----------------------------------------------------
22163C
22164      CDF=0.0
22165C
22166C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22167C
22168      IF(ALPHA.LE.0.0)THEN
22169        WRITE(ICOUT,11)
22170   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BGECDF ',
22171     1        ' BGECDF IS NON-POSITIVE')
22172        CALL DPWRST('XXX','BUG ')
22173        WRITE(ICOUT,46)ALPHA
22174   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
22175        CALL DPWRST('XXX','BUG ')
22176        GOTO9999
22177      ELSEIF(BETA.LE.0.0)THEN
22178        WRITE(ICOUT,12)
22179   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BGECDF ',
22180     1         'IS NON-POSITIVE.')
22181        CALL DPWRST('XXX','BUG ')
22182        WRITE(ICOUT,46)BETA
22183        CALL DPWRST('XXX','BUG ')
22184        GOTO9999
22185      ENDIF
22186C
22187      INTX=INT(X+0.5)
22188      FINTX=REAL(INTX)
22189      IF(INTX.LT.1)THEN
22190        CDF=0.0
22191        GOTO9999
22192      ENDIF
22193C
22194      DX=DBLE(FINTX)
22195      IF(DX.GT.DBLE(I1MACH(9)))THEN
22196        WRITE(ICOUT,55)
22197   55   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BGECDF IS GREATER ',
22198     1         'THAN THE LARGEST MACHINE INTEGER.')
22199        CALL DPWRST('XXX','BUG ')
22200        WRITE(ICOUT,46)X
22201        CALL DPWRST('XXX','BUG ')
22202        GOTO9999
22203      ENDIF
22204C
22205      DALPHA=DBLE(ALPHA)
22206      DBETA=DBLE(BETA)
22207      DSUM=0.0D0
22208C
22209C     COMPUTE PDF FOR X = 1
22210C
22211      DTERM1=DLBETA(DALPHA+1.0D0,DBETA)
22212      DTERM2=DLBETA(DALPHA,DBETA)
22213      DTERM3=DTERM1-DTERM2
22214      DPDFSV=DEXP(DTERM3)
22215      DSUM=DPDFSV
22216C
22217      IF(INTX.GT.1)THEN
22218        DO100I=2,INTX
22219CCCCC     DPDF= DPDFSV*(DBLE(I)+DALPHA-1.0D0)/(DBLE(I)+DALPHA+DBETA)
22220          DPDF= DPDFSV*(DBLE(I)+DBETA-2.0D0)/
22221     1          (DBLE(I)+DALPHA+DBETA-1.0D0)
22222          DPDFSV=DPDF
22223          DSUM=DSUM + DPDF
22224  100   CONTINUE
22225        CDF=REAL(DSUM)
22226      ELSE
22227        CDF=REAL(DPDFSV)
22228      ENDIF
22229C
22230 9999 CONTINUE
22231      RETURN
22232      END
22233      SUBROUTINE BG2CDF(X,ALPHA,BETA,CDF)
22234C
22235C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
22236C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
22237C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22238C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22239C              THIS DISTRIBUTION IS DEFINED FOR ALL
22240C              NON-NEGATIVE INTEGER X.
22241C
22242C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22243C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA)/BETA(ALPHA,BETA)
22244C              WHERE B(A,B) IS THE BETA FUNCTION.
22245C              NOTE THAT HESSELAGER GIVES THIS AS
22246C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22247C              THAT IS, THE ALPHA AND BETA ARE REVERSED.
22248C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22249C              CDF).
22250C
22251C              HESSELAGER'S RECURRENCE FORMULA FOR THE CUMULATIVE
22252C              DISTRIBUTION FUNCTION IS:
22253C
22254C                p(X;ALHA,BETA) - [(X+ALPHA-1)/(X+ALPHA+BETA)]*
22255C                                 p(X-1;ALPHA,BETA)
22256C
22257C              REVERSING THE ALPHA AND BETA YIELDS
22258C
22259C                p(X;ALHA,BETA) - [(X+BETA-1)/(X+ALPHA+BETA)]*
22260C                                 p(X-1;ALPHA,BETA)
22261C
22262C              NOTE THAT THE BGECDF ROUTINE IS THE BETA-GEOMETRIC
22263C              THAT STARTS WITH X = 1 WHEREAS THIS ROUTINE IS
22264C              SHIFTED TO START AT X = 0.
22265C
22266C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
22267C                                AT WHICH THE CUMULATIVE DISTRIBUTION
22268C                                FUNCTION IS TO BE EVALUATED.
22269C                                X SHOULD BE A NON-NEGATIVE INTEGR
22270C                     --ALPHA  = THE SINGLE PRECISION VALUE
22271C                                OF THE FIRST SHAPE PARAMETER.
22272C                     --BETA   = THE SINGLE PRECISION VALUE
22273C                                OF THE SECOND SHAPE PARAMETER.
22274C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
22275C                                DISTRIBUTION FUNCTION VALUE.
22276C     OUTPUT--THE SINGLE PRECISION PROBABILITY DISTRIBUTION
22277C             FUNCTION VALUE CDF
22278C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22279C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22280C     RESTRICTIONS--X SHOULD BE A NON-NEGATIVE INTEGER
22281C                 --ALPHA AND BETA SHOULD BE POSITIVE
22282C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22283C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22284C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22285C     LANGUAGE--ANSI FORTRAN (1977)
22286C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
22287C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
22288C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
22289C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
22290C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
22291C                 WILEY, CHAPTER 6.
22292C     WRITTEN BY--JAMES J. FILLIBEN
22293C                 STATISTICAL ENGINEERING DIVISION
22294C                 INFORMATION TECHNOLOGY LABORATORY
22295C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22296C                 GAITHERSBURG< MD 20899-8980
22297C                 PHONE--301-975-2855
22298C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22299C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22300C     LANGUAGE--ANSI FORTRAN (1977)
22301C     VERSION NUMBER--2006/5
22302C     ORIGINAL VERSION--MAY       2006.
22303C
22304C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22305C
22306C---------------------------------------------------------------------
22307C
22308      DOUBLE PRECISION DX
22309      DOUBLE PRECISION DALPHA
22310      DOUBLE PRECISION DBETA
22311      DOUBLE PRECISION DTERM1
22312      DOUBLE PRECISION DTERM2
22313      DOUBLE PRECISION DTERM3
22314      DOUBLE PRECISION DLBETA
22315      DOUBLE PRECISION DSUM
22316      DOUBLE PRECISION DPDF
22317      DOUBLE PRECISION DPDFSV
22318C
22319      INCLUDE 'DPCOMC.INC'
22320C
22321C---------------------------------------------------------------------
22322C
22323      INCLUDE 'DPCOP2.INC'
22324C
22325C-----START POINT-----------------------------------------------------
22326C
22327      CDF=0.0
22328C
22329C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22330C
22331      IF(ALPHA.LE.0.0)THEN
22332        WRITE(ICOUT,11)
22333   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BG2CDF ',
22334     1         'IS NON-POSITIVE.')
22335        CALL DPWRST('XXX','BUG ')
22336        WRITE(ICOUT,46)ALPHA
22337   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
22338        CALL DPWRST('XXX','BUG ')
22339        GOTO9999
22340      ELSEIF(BETA.LE.0.0)THEN
22341        WRITE(ICOUT,12)
22342   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BG2CDF ',
22343     1         'IS NON-POSITIVE.')
22344        CALL DPWRST('XXX','BUG ')
22345        WRITE(ICOUT,46)BETA
22346        CALL DPWRST('XXX','BUG ')
22347        GOTO9999
22348      ENDIF
22349C
22350      INTX=INT(X+0.5)
22351      FINTX=REAL(INTX)
22352      IF(INTX.LT.0)THEN
22353        CDF=0.0
22354        GOTO9999
22355      ENDIF
22356C
22357      DX=DBLE(FINTX)
22358      IF(DX.GT.DBLE(I1MACH(9)))THEN
22359        WRITE(ICOUT,55)
22360   55   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO THE ',
22361     1         'BG2CDF SUBROUTINE IS GREATER THAN')
22362        CALL DPWRST('XXX','BUG ')
22363        WRITE(ICOUT,56)
22364   56   FORMAT('      THE LARGEST MACHINE INTEGER.')
22365        CALL DPWRST('XXX','BUG ')
22366        WRITE(ICOUT,46)X
22367        CALL DPWRST('XXX','BUG ')
22368        CDF=0.0
22369        GOTO9999
22370      ENDIF
22371C
22372      DALPHA=DBLE(ALPHA)
22373      DBETA=DBLE(BETA)
22374      DSUM=0.0D0
22375C
22376C     COMPUTE PDF FOR X = 0
22377C
22378      DTERM1=DLBETA(DALPHA+1.0D0,DBETA)
22379      DTERM2=DLBETA(DALPHA,DBETA)
22380      DTERM3=DTERM1-DTERM2
22381      DPDFSV=DEXP(DTERM3)
22382      DSUM=DPDFSV
22383C
22384      IF(INTX.GT.0)THEN
22385        DO100I=1,INTX
22386          DPDF= DPDFSV*(DBLE(I)+DBETA-1.0D0)/
22387     1          (DBLE(I)+DALPHA+DBETA)
22388          DPDFSV=DPDF
22389          DSUM=DSUM + DPDF
22390  100   CONTINUE
22391        CDF=REAL(DSUM)
22392      ELSE
22393        CDF=REAL(DPDFSV)
22394      ENDIF
22395C
22396 9999 CONTINUE
22397      RETURN
22398      END
22399      SUBROUTINE BGEFUN(N,X,FVEC,IFLAG,XDATA,NOBS)
22400C
22401C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
22402C              BETA-GEOMETRIC MAXIMUM LIKELIHOOD EQUATIONS.
22403C
22404C              (N/PI) - SUM[i=1 to N]{SUM[r=1 to Y(i)-1]
22405C                       [1/(1-PI+(r-1)*THETA)]} = 0
22406C
22407C              SUM[i=1 to N]{SUM[r=1 to Y(i)-1]
22408C                       [(r-1)/(1-PI+(r-1)*THETA)] - SUM[r=1 to Y*i]
22409C                       [(r-1)/(1+(r-1)*THETA)] = 0
22410C
22411C              WITH THETA AND PI DENOTING THE SHAPE PARAMETERS.
22412C
22413C              NOTE THAT
22414C
22415C                 PI = ALPHA/(ALPHA+BETA)
22416C                 THETA = 1/(ALPHA + BETA)
22417C
22418C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
22419C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
22420C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
22421C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
22422C     EXAMPLE--BETA-GEOMETRIC MAXIMUM LIKELIHOOD Y
22423C     REFERENCE --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
22424C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
22425C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
22426C                 MARCEL-DEKKER, PP.431-436.
22427C     WRITTEN BY--JAMES J. FILLIBEN
22428C                 STATISTICAL ENGINEERING DIVISION
22429C                 INFORMATION TECHNOLOGY LABORATORY
22430C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22431C                 GAITHERSBUG, MD 20899-8980
22432C                 PHONE--301-975-2855
22433C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22434C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22435C     LANGUAGE--ANSI FORTRAN (1977)
22436C     VERSION NUMBER--2006/5
22437C     ORIGINAL VERSION--MAY       2006.
22438C
22439C---------------------------------------------------------------------
22440C
22441      DOUBLE PRECISION X(*)
22442      DOUBLE PRECISION FVEC(*)
22443      REAL XDATA(*)
22444C
22445      DOUBLE PRECISION DN
22446      DOUBLE PRECISION DX
22447      DOUBLE PRECISION DTHETA
22448      DOUBLE PRECISION DPI
22449      DOUBLE PRECISION DC1
22450      DOUBLE PRECISION DC2
22451      DOUBLE PRECISION DSUM1
22452      DOUBLE PRECISION DSUM2
22453      DOUBLE PRECISION DSUM3
22454      DOUBLE PRECISION DSUM4
22455      DOUBLE PRECISION DSUM5
22456C
22457C---------------------------------------------------------------------
22458C
22459      INCLUDE 'DPCOP2.INC'
22460C
22461C-----START POINT-----------------------------------------------------
22462C
22463C  COMPUTE SOME SUMS
22464C
22465      N=2
22466      IFLAG=0
22467C
22468      DTHETA=X(1)
22469      DPI=X(2)
22470      DN=DBLE(NOBS)
22471C
22472      DC1=DN/DPI
22473      DSUM1=0.0D0
22474      DSUM2=0.0D0
22475C
22476      DO200I=1,NOBS
22477        DSUM3=0.0D0
22478        DSUM4=0.0D0
22479        DSUM5=0.0D0
22480C
22481        DX=DBLE(XDATA(I))
22482        IX1=INT(DX+0.01) - 1
22483        IX2=IX1+1
22484        IF(IX1.GE.1)THEN
22485          DO300IR=1,IX1
22486            DR=DBLE(IR)
22487            DC2=1.0D0-DPI+(DR-1.0D0)*DTHETA
22488            DSUM3=DSUM3 + 1.0D0/DC2
22489            DSUM4=DSUM4 + (DR-1.0D0)/DC2
22490  300     CONTINUE
22491          DSUM1=DSUM1 + DSUM3
22492        ENDIF
22493C
22494        IF(IX2.GE.1)THEN
22495          DO400IR=1,IX2
22496            DR=DBLE(IR)
22497            DC2=1.0D0 + (DR-1.0D0)*DTHETA
22498            DSUM5=DSUM5 + (DR-1.0D0)/DC2
22499  400     CONTINUE
22500          DSUM2=DSUM2 + (DSUM4 - DSUM5)
22501        ENDIF
22502C
22503  200 CONTINUE
22504C
22505      FVEC(1)=DC1 - DSUM1
22506      FVEC(2)=DSUM2
22507C
22508      RETURN
22509      END
22510      SUBROUTINE BGEPDF(X,ALPHA,BETA,PDF)
22511C
22512C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
22513C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
22514C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22515C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22516C              THIS DISTRIBUTION IS DEFINED FOR ALL
22517C              POSITIVE INTEGER X.
22518C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22519C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA-1)/BETA(ALPHA,BETA)
22520C              WHERE B(A,B) IS THE BETA FUNCTION.
22521C              NOTE THAT HESSELAGER GIVES THIS AS
22522C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22523C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22524C              CDF).
22525C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
22526C                                AT WHICH THE PROBABILITY DENSITY
22527C                                FUNCTION IS TO BE EVALUATED.
22528C                                X SHOULD BE A NON-NEGATIVE INTEGR
22529C                     --ALPHA  = THE SINGLE PRECISION VALUE
22530C                                OF THE FIRST SHAPE PARAMETER.
22531C                     --BETA   = THE SINGLE PRECISION VALUE
22532C                                OF THE SECOND SHAPE PARAMETER.
22533C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
22534C
22535C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
22536C             FUNCTION VALUE PDF
22537C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22538C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22539C     RESTRICTIONS--X SHOULD BE A POSITIVE INTEGER
22540C                 --ALPHA AND BETA SHOULD BE POSITIVE
22541C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22542C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22543C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22544C     LANGUAGE--ANSI FORTRAN (1977)
22545C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
22546C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
22547C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
22548C               --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
22549C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
22550C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
22551C                 MARCEL-DEKKER, PP.431-436.
22552C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
22553C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
22554C                 WILEY, CHAPTER 6.
22555C     WRITTEN BY--JAMES J. FILLIBEN
22556C                 STATISTICAL ENGINEERING DIVISION
22557C                 INFORMATION TECHNOLOGY LABORATORY
22558C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22559C                 GAITHERSBURG< MD 20899-8980
22560C                 PHONE--301-975-2855
22561C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22562C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22563C     LANGUAGE--ANSI FORTRAN (1977)
22564C     VERSION NUMBER--2006/5
22565C     ORIGINAL VERSION--MAY       2006.
22566C
22567C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22568C
22569C---------------------------------------------------------------------
22570C
22571      DOUBLE PRECISION DX
22572      DOUBLE PRECISION DALPHA
22573      DOUBLE PRECISION DBETA
22574      DOUBLE PRECISION DPDF
22575      DOUBLE PRECISION DTERM1
22576      DOUBLE PRECISION DTERM2
22577      DOUBLE PRECISION DTERM3
22578      DOUBLE PRECISION DLBETA
22579C
22580C---------------------------------------------------------------------
22581C
22582      INCLUDE 'DPCOP2.INC'
22583C
22584C-----START POINT-----------------------------------------------------
22585C
22586      PDF=0.0
22587C
22588C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22589C
22590      IF(ALPHA.LE.0.0)THEN
22591        WRITE(ICOUT,11)
22592   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BGEPDF ',
22593     1         'IS NON-POSITIVE.')
22594        CALL DPWRST('XXX','BUG ')
22595        WRITE(ICOUT,46)ALPHA
22596   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
22597        CALL DPWRST('XXX','BUG ')
22598        GOTO9999
22599      ELSEIF(BETA.LE.0.0)THEN
22600        WRITE(ICOUT,12)
22601   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BGEPDF ',
22602     1         'IS NON-POSITIVE.')
22603        CALL DPWRST('XXX','BUG ')
22604        WRITE(ICOUT,46)BETA
22605        CALL DPWRST('XXX','BUG ')
22606        GOTO9999
22607      ENDIF
22608C
22609      INTX=INT(X+0.5)
22610      FINTX=REAL(INTX)
22611      IF(INTX.LT.1)THEN
22612        WRITE(ICOUT,5)
22613    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BGEPDF ',
22614     1         'IS NON-POSITIVE.')
22615        CALL DPWRST('XXX','BUG ')
22616        WRITE(ICOUT,46)X
22617        CALL DPWRST('XXX','BUG ')
22618        PDF=0.0
22619        GOTO9999
22620      ENDIF
22621C
22622      DX=DBLE(FINTX)
22623      DALPHA=DBLE(ALPHA)
22624      DBETA=DBLE(BETA)
22625C
22626      DTERM1=DLBETA(DALPHA+1.0D0,DX+DBETA-1.0D0)
22627      DTERM2=DLBETA(DALPHA,DBETA)
22628      DTERM3=DTERM1-DTERM2
22629      DPDF=DEXP(DTERM3)
22630      PDF=REAL(DPDF)
22631C
22632 9999 CONTINUE
22633      RETURN
22634      END
22635      SUBROUTINE BG2PDF(X,ALPHA,BETA,PDF)
22636C
22637C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
22638C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
22639C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22640C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22641C              THIS DISTRIBUTION IS DEFINED FOR ALL
22642C              NON-NEGATIVE INTEGER X.
22643C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22644C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA)/BETA(ALPHA,BETA)
22645C              WHERE B(A,B) IS THE BETA FUNCTION.
22646C              NOTE THAT HESSELAGER GIVES THIS AS
22647C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22648C              THAT IS, THE ALPHA AND BETA ARE REVERSED.
22649C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22650C              CDF).
22651C
22652C              NOTE THAT THE BGEPDF ROUTINE IS THE BETA-GEOMETRIC
22653C              THAT STARTS WITH X = 1 WHEREAS THIS ROUTINE IS
22654C              SHIFTED TO START AT X = 0.
22655C
22656C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
22657C                                AT WHICH THE PROBABILITY DENSITY
22658C                                FUNCTION IS TO BE EVALUATED.
22659C                                X SHOULD BE A NON-NEGATIVE INTEGR
22660C                     --ALPHA  = THE SINGLE PRECISION VALUE
22661C                                OF THE FIRST SHAPE PARAMETER.
22662C                     --BETA   = THE SINGLE PRECISION VALUE
22663C                                OF THE SECOND SHAPE PARAMETER.
22664C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
22665C
22666C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
22667C             FUNCTION VALUE PDF
22668C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22669C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22670C     RESTRICTIONS--X SHOULD BE A NON-NEGATIVE INTEGER
22671C                 --ALPHA AND BETA SHOULD BE POSITIVE
22672C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22673C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22674C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22675C     LANGUAGE--ANSI FORTRAN (1977)
22676C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
22677C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
22678C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
22679C               --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
22680C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
22681C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
22682C                 MARCEL-DEKKER, PP.431-436.
22683C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
22684C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
22685C                 WILEY, CHAPTER 6.
22686C     WRITTEN BY--JAMES J. FILLIBEN
22687C                 STATISTICAL ENGINEERING DIVISION
22688C                 INFORMATION TECHNOLOGY LABORATORY
22689C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22690C                 GAITHERSBURG< MD 20899-8980
22691C                 PHONE--301-975-2855
22692C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22693C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22694C     LANGUAGE--ANSI FORTRAN (1977)
22695C     VERSION NUMBER--2006/5
22696C     ORIGINAL VERSION--MAY       2006.
22697C
22698C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22699C
22700C---------------------------------------------------------------------
22701C
22702      DOUBLE PRECISION DX
22703      DOUBLE PRECISION DALPHA
22704      DOUBLE PRECISION DBETA
22705      DOUBLE PRECISION DPDF
22706      DOUBLE PRECISION DTERM1
22707      DOUBLE PRECISION DTERM2
22708      DOUBLE PRECISION DTERM3
22709      DOUBLE PRECISION DLBETA
22710C
22711C---------------------------------------------------------------------
22712C
22713      INCLUDE 'DPCOP2.INC'
22714C
22715C-----START POINT-----------------------------------------------------
22716C
22717      PDF=0.0
22718C
22719C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22720C
22721      IF(ALPHA.LE.0.0)THEN
22722        WRITE(ICOUT,11)
22723   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO THE ',
22724     1' BG2PDF SUBROUTINE IS NON-POSITIVE')
22725        CALL DPWRST('XXX','BUG ')
22726        WRITE(ICOUT,46)ALPHA
22727   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
22728        CALL DPWRST('XXX','BUG ')
22729        GOTO9999
22730      ELSEIF(BETA.LE.0.0)THEN
22731        WRITE(ICOUT,12)
22732   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BG2PDF ',
22733     1         'IS NON-POSITIVE.')
22734        CALL DPWRST('XXX','BUG ')
22735        WRITE(ICOUT,46)BETA
22736        CALL DPWRST('XXX','BUG ')
22737        GOTO9999
22738      ENDIF
22739C
22740      INTX=INT(X+0.5)
22741      FINTX=REAL(INTX)
22742      IF(INTX.LT.0)THEN
22743        WRITE(ICOUT,5)
22744    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BG2PDF ',
22745     1         'IS NEGATIVE.')
22746        CALL DPWRST('XXX','BUG ')
22747        WRITE(ICOUT,46)X
22748        CALL DPWRST('XXX','BUG ')
22749        PDF=0.0
22750        GOTO9999
22751      ENDIF
22752C
22753      DX=DBLE(FINTX)
22754      DALPHA=DBLE(ALPHA)
22755      DBETA=DBLE(BETA)
22756C
22757      DTERM1=DLBETA(DALPHA+1.0D0,DX+DBETA)
22758      DTERM2=DLBETA(DALPHA,DBETA)
22759      DTERM3=DTERM1-DTERM2
22760      DPDF=DEXP(DTERM3)
22761      PDF=REAL(DPDF)
22762C
22763 9999 CONTINUE
22764      RETURN
22765      END
22766      SUBROUTINE BGEPPF(P,ALPHA,BETA,PPF)
22767C
22768C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
22769C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE P
22770C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22771C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22772C              THIS DISTRIBUTION IS DEFINED FOR 0 <= P < 1.
22773C
22774C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22775C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA-1)/BETA(ALPHA,BETA)
22776C              WHERE B(A,B) IS THE BETA FUNCTION.
22777C              NOTE THAT HESSELAGER GIVES THIS AS
22778C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22779C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22780C              CDF).
22781C
22782C              HESSELAGER'S RECURRENCE FORMULA FOR THE CUMULATIVE
22783C              DISTRIBUTION FUNCTION IS:
22784C
22785C                p(X;ALHA,BETA) - [(X+ALPHA-1)/(X+ALPHA+BETA)]*
22786C                                 p(X-1;ALPHA,BETA)
22787C
22788C              CONVERTING THIS TO THE MORE COMMON PARAMETERIZATION
22789C              YIELDS
22790C
22791C                p(X;ALHA,BETA) - [(X+BETA-2)/(X+ALPHA+BETA-1)]*
22792C                                 p(X-1;ALPHA,BETA)
22793C
22794C              WE CURRENTLY COMPUTE THE PERCENT POINT FUNCTION
22795C              VIA BRUTE FORCE.  THAT IS, WE COMPUTE THE
22796C              CUMULATIVE DISTRIBUTION FUNCTION UNTIL IT EXCEEDS
22797C              THE SPECIFIED VALUE OF P.
22798C
22799C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
22800C                                AT WHICH THE PERCENT POINT
22801C                                FUNCTION IS TO BE EVALUATED.
22802C                                0 <= P < 1.
22803C                     --ALPHA  = THE SINGLE PRECISION VALUE
22804C                                OF THE FIRST SHAPE PARAMETER.
22805C                     --BETA   = THE SINGLE PRECISION VALUE
22806C                                OF THE SECOND SHAPE PARAMETER.
22807C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT POINT
22808C                                FUNCTION VALUE.
22809C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION VALUE PPF
22810C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22811C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22812C     RESTRICTIONS--0 <= P < 1
22813C                 --ALPHA AND BETA SHOULD BE POSITIVE
22814C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22815C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22816C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22817C     LANGUAGE--ANSI FORTRAN (1977)
22818C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
22819C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
22820C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
22821C               --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
22822C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
22823C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
22824C                 MARCEL-DEKKER, PP.431-436.
22825C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
22826C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
22827C                 WILEY, CHAPTER 6.
22828C     WRITTEN BY--JAMES J. FILLIBEN
22829C                 STATISTICAL ENGINEERING DIVISION
22830C                 INFORMATION TECHNOLOGY LABORATORY
22831C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
22832C                 GAITHERSBURG< MD 20899-8980
22833C                 PHONE--301-975-2855
22834C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
22835C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
22836C     LANGUAGE--ANSI FORTRAN (1977)
22837C     VERSION NUMBER--2006/5
22838C     ORIGINAL VERSION--MAY       2006.
22839C
22840C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
22841C
22842C---------------------------------------------------------------------
22843C
22844CCCCC DOUBLE PRECISION DX
22845      DOUBLE PRECISION DP
22846      DOUBLE PRECISION DALPHA
22847      DOUBLE PRECISION DBETA
22848      DOUBLE PRECISION DTERM1
22849      DOUBLE PRECISION DTERM2
22850      DOUBLE PRECISION DTERM3
22851      DOUBLE PRECISION DLBETA
22852      DOUBLE PRECISION DSUM
22853      DOUBLE PRECISION DPDF
22854      DOUBLE PRECISION DPDFSV
22855      DOUBLE PRECISION DEPS
22856C
22857      INCLUDE 'DPCOMC.INC'
22858C
22859C---------------------------------------------------------------------
22860C
22861      INCLUDE 'DPCOP2.INC'
22862C
22863C-----START POINT---------------------------------------------------
22864C
22865      PPF=0.0
22866C
22867C     CHECK THE INPUT ARGUMENTS FOR ERRORS
22868C
22869      IF(ALPHA.LE.0.0)THEN
22870        WRITE(ICOUT,11)
22871   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BGEPPF ',
22872     1         'IS NON-POSITIVE.')
22873        CALL DPWRST('XXX','BUG ')
22874        WRITE(ICOUT,46)ALPHA
22875   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
22876        CALL DPWRST('XXX','BUG ')
22877        GOTO9999
22878      ELSEIF(BETA.LE.0.0)THEN
22879        WRITE(ICOUT,12)
22880   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BGEPPF ',
22881     1         'IS NON-POSITIVE.')
22882        CALL DPWRST('XXX','BUG ')
22883        WRITE(ICOUT,46)BETA
22884        CALL DPWRST('XXX','BUG ')
22885        GOTO9999
22886      ELSEIF(P.LT.0.0.OR.P.GE.1.0)THEN
22887        WRITE(ICOUT,1)
22888    1   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BGEPPF ',
22889     1         'IS OUTSIDE THE ALLOWABLE (0,1] INTERVAL.')
22890        CALL DPWRST('XXX','BUG ')
22891        WRITE(ICOUT,46)P
22892        CALL DPWRST('XXX','BUG ')
22893      ENDIF
22894C
22895      DALPHA=DBLE(ALPHA)
22896      DBETA=DBLE(BETA)
22897      DSUM=0.0D0
22898      DP=DBLE(P)
22899      DEPS=1.0D-6
22900C
22901C     COMPUTE PDF FOR X = 1
22902C
22903      IF(P.EQ.0.0)THEN
22904        PPF=0.0
22905        GOTO9999
22906      ENDIF
22907C
22908      DTERM1=DLBETA(DALPHA+1.0D0,DBETA)
22909      DTERM2=DLBETA(DALPHA,DBETA)
22910      DTERM3=DTERM1-DTERM2
22911      DPDFSV=DEXP(DTERM3)
22912      DSUM=DPDFSV
22913      IF(DSUM.GE.DP-DEPS)THEN
22914        PPF=1.0
22915        GOTO9999
22916      ENDIF
22917      I=1
22918C
22919  100 CONTINUE
22920        I=I+1
22921        IF(DBLE(I).GE.DBLE(I1MACH(9)))THEN
22922          WRITE(ICOUT,55)
22923   55     FORMAT('***** ERROR--THE COMPUTED PERCENT POINT VALUE ',
22924     1           'EXCEEDS THE LARGEST MACHINE INTEGER.')
22925          CALL DPWRST('XXX','BUG ')
22926          PPF=0.0
22927          GOTO9999
22928        ENDIF
22929CCCCC   DPDF=DPDFSV*(DBLE(I)+DALPHA-1.0D0)/(DBLE(I)+DALPHA+DBETA)
22930        DPDF=DPDFSV*(DBLE(I)+DBETA-2.0D0)/
22931     1       (DBLE(I)+DALPHA+DBETA-1.0D0)
22932        DPDFSV=DPDF
22933        DSUM=DSUM + DPDF
22934        IF(DSUM.GE.DP-DEPS)THEN
22935          PPF=REAL(I)
22936          GOTO9999
22937        ENDIF
22938      GOTO100
22939C
22940 9999 CONTINUE
22941      RETURN
22942      END
22943      SUBROUTINE BG2PPF(P,ALPHA,BETA,PPF)
22944C
22945C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
22946C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE P
22947C              FOR THE BETA-GEOMETRIC DISTRIBUTION
22948C              WITH SINGLE PRECISION SHAPE PARAMETERS ALPHA AND BETA.
22949C              THIS DISTRIBUTION IS DEFINED FOR 0 <= P < 1.
22950C
22951C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
22952C              p(X;ALPHA,BETA) = B(ALPHA+1,X+BETA-1)/BETA(ALPHA,BETA)
22953C              WHERE B(A,B) IS THE BETA FUNCTION.
22954C              NOTE THAT HESSELAGER GIVES THIS AS
22955C              p(X;ALPHA,BETA) = B(X+ALPHA,BETA+1)/BETA(ALPHA,BETA)
22956C              THAT IS, THE ALPHA AND BETA ARE REVERSED.
22957C              (WE USE HESSELAGER'S RECCURENCE FORMUALAS FOR THE
22958C              CDF).
22959C
22960C              HESSELAGER'S RECURRENCE FORMULA FOR THE CUMULATIVE
22961C              DISTRIBUTION FUNCTION IS:
22962C
22963C                p(X;ALHA,BETA) - [(X+ALPHA-1)/(X+ALPHA+BETA)]*
22964C                                 p(X-1;ALPHA,BETA)
22965C
22966C              REVERSING THE ALPHA AND BETA YIELDS
22967C
22968C                p(X;ALHA,BETA) - [(X+BETA-1)/(X+ALPHA+BETA)]*
22969C                                 p(X-1;ALPHA,BETA)
22970C
22971C              WE CURRENTLY COMPUTE THE PERCENT POINT FUNCTION
22972C              VIA BRUTE FORCE.  THAT IS, WE COMPUTE THE
22973C              CUMULATIVE DISTRIBUTION FUNCTION UNTIL IT EXCEEDS
22974C              THE SPECIFIED VALUE OF P.
22975C
22976C              NOTE THAT THE BGEPPF ROUTINE IS THE BETA-GEOMETRIC
22977C              THAT STARTS WITH X = 1 WHEREAS THIS ROUTINE IS
22978C              SHIFTED TO START AT X = 0.
22979C
22980C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
22981C                                AT WHICH THE PERCENT POINT
22982C                                FUNCTION IS TO BE EVALUATED.
22983C                                0 <= P < 1.
22984C                     --ALPHA  = THE SINGLE PRECISION VALUE
22985C                                OF THE FIRST SHAPE PARAMETER.
22986C                     --BETA   = THE SINGLE PRECISION VALUE
22987C                                OF THE SECOND SHAPE PARAMETER.
22988C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT POINT
22989C                                FUNCTION VALUE.
22990C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION VALUE PPF
22991C             FOR THE BETA-GEOMETRIC DISTRIBUTION
22992C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
22993C     RESTRICTIONS--0 <= P < 1
22994C                 --ALPHA AND BETA SHOULD BE POSITIVE
22995C     OTHER DATAPAC   SUBROUTINES NEEDED--DLBETA.
22996C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP
22997C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
22998C     LANGUAGE--ANSI FORTRAN (1977)
22999C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
23000C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
23001C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
23002C               --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
23003C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
23004C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
23005C                 MARCEL-DEKKER, PP.431-436.
23006C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
23007C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
23008C                 WILEY, CHAPTER 6.
23009C     WRITTEN BY--JAMES J. FILLIBEN
23010C                 STATISTICAL ENGINEERING DIVISION
23011C                 INFORMATION TECHNOLOGY LABORATORY
23012C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
23013C                 GAITHERSBURG< MD 20899-8980
23014C                 PHONE--301-975-2855
23015C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23016C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
23017C     LANGUAGE--ANSI FORTRAN (1977)
23018C     VERSION NUMBER--2006/5
23019C     ORIGINAL VERSION--MAY       2006.
23020C
23021C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23022C
23023C---------------------------------------------------------------------
23024C
23025CCCCC DOUBLE PRECISION DX
23026      DOUBLE PRECISION DP
23027      DOUBLE PRECISION DALPHA
23028      DOUBLE PRECISION DBETA
23029      DOUBLE PRECISION DTERM1
23030      DOUBLE PRECISION DTERM2
23031      DOUBLE PRECISION DTERM3
23032      DOUBLE PRECISION DLBETA
23033      DOUBLE PRECISION DSUM
23034      DOUBLE PRECISION DPDF
23035      DOUBLE PRECISION DPDFSV
23036C
23037      INCLUDE 'DPCOMC.INC'
23038C
23039C---------------------------------------------------------------------
23040C
23041      INCLUDE 'DPCOP2.INC'
23042C
23043C-----START POINT---------------------------------------------------
23044C
23045      PPF=0.0
23046C
23047C     CHECK THE INPUT ARGUMENTS FOR ERRORS
23048C
23049      IF(ALPHA.LE.0.0)THEN
23050        WRITE(ICOUT,11)
23051   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BG2PPF ',
23052     1         'IS NON-POSITIVE.')
23053        CALL DPWRST('XXX','BUG ')
23054        WRITE(ICOUT,46)ALPHA
23055   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
23056        CALL DPWRST('XXX','BUG ')
23057        GOTO9999
23058      ELSEIF(BETA.LE.0.0)THEN
23059        WRITE(ICOUT,12)
23060   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BG2PPF ',
23061     1         'IS NON-POSITIVE.')
23062        CALL DPWRST('XXX','BUG ')
23063        WRITE(ICOUT,46)BETA
23064        CALL DPWRST('XXX','BUG ')
23065        GOTO9999
23066      ELSEIF(P.LT.0.0.OR.P.GE.1.0)THEN
23067        WRITE(ICOUT,1)
23068    1   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BG2PPF ',
23069     1         'IS OUTSIDE THE ALLOWABLE (0,1] INTERVAL.')
23070        CALL DPWRST('XXX','BUG ')
23071        WRITE(ICOUT,46)P
23072        CALL DPWRST('XXX','BUG ')
23073      ENDIF
23074C
23075      DALPHA=DBLE(ALPHA)
23076      DBETA=DBLE(BETA)
23077      DSUM=0.0D0
23078      DP=DBLE(P)
23079C
23080C     COMPUTE PDF FOR X = 1
23081C
23082      DTERM1=DLBETA(DALPHA+1.0D0,DBETA)
23083      DTERM2=DLBETA(DALPHA,DBETA)
23084      DTERM3=DTERM1-DTERM2
23085      DPDFSV=DEXP(DTERM3)
23086      DSUM=DPDFSV
23087      IF(DSUM.GE.DP)THEN
23088        PPF=0.0
23089        GOTO9999
23090      ENDIF
23091      I=0
23092C
23093  100 CONTINUE
23094        I=I+1
23095        IF(DBLE(I).GE.DBLE(I1MACH(9)))THEN
23096          WRITE(ICOUT,55)
23097   55     FORMAT('***** ERROR--THE COMPUTED PERCENT POINT VALUE ',
23098     1           'EXCEEDS THE LARGEST MACHINE INTEGER.')
23099          CALL DPWRST('XXX','BUG ')
23100          PPF=0.0
23101          GOTO9999
23102        ENDIF
23103        DPDF=DPDFSV*(DBLE(I)+DBETA-1.0D0)/
23104     1       (DBLE(I)+DALPHA+DBETA)
23105        DPDFSV=DPDF
23106        DSUM=DSUM + DPDF
23107        IF(DSUM.GE.DP)THEN
23108          PPF=REAL(I)
23109          GOTO9999
23110        ENDIF
23111      GOTO100
23112C
23113 9999 CONTINUE
23114      RETURN
23115      END
23116      SUBROUTINE BGERAN(ALPHA,BETA,N,ISEED,X,IBGEDF)
23117C
23118C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
23119C              FROM THE BETA-GEOMETRIC DISTRIBUTION
23120C              WITH SINGLE PRECISION 'BERNOULLI PROBABILITY'
23121C              PARAMETER = P FOLLOWING A BETA DISTRIBUTION WITH
23122C              SHAPE PARAMETERS ALPHA AND BETA.
23123C              AND NPAR (INCLUSIVELY).
23124C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
23125C                                OF RANDOM NUMBERS TO BE
23126C                                GENERATED.
23127C                     --ALPHA  = THE SINGLE PRECISION VALUE
23128C                                OF THE FIRST SHAPE PARAMETER OF THE
23129C                                BETA DISTRIBUTION.
23130C                                ALPHA > 0.
23131C                     --BETA   = THE SINGLE PRECISION VALUE
23132C                                OF THE SECOND SHAPE PARAMETER OF THE
23133C                                BETA DISTRIBUTION.
23134C                                BETA > 0.
23135C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
23136C                                (OF DIMENSION AT LEAST N)
23137C                                INTO WHICH THE GENERATED
23138C                                RANDOM SAMPLE WILL BE PLACED.
23139C     OUTPUT--A RANDOM SAMPLE OF SIZE N
23140C             FROM THE BETA-GEOMETRIC DISTRIBUTION.
23141C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
23142C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
23143C                   OF N FOR THIS SUBROUTINE.
23144C                 --ALPHA, BETA > 0
23145C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, GEORAN.
23146C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
23147C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
23148C     LANGUAGE--ANSI FORTRAN (1977)
23149C     COMMENT--NOTE THAT EVEN THOUGH THE OUTPUT
23150C              FROM THIS DISCRETE RANDOM NUMBER
23151C              GENERATOR MUST NECESSARILY BE A
23152C              SEQUENCE OF ***INTEGER*** VALUES,
23153C              THE OUTPUT VECTOR X IS SINGLE
23154C              PRECISION IN MODE.
23155C              X HAS BEEN SPECIFIED AS SINGLE
23156C              PRECISION SO AS TO CONFORM WITH THE DATAPAC
23157C              CONVENTION THAT ALL OUTPUT VECTORS FROM ALL
23158C              DATAPAC SUBROUTINES ARE SINGLE PRECISION.
23159C              THIS CONVENTION IS BASED ON THE BELIEF THAT
23160C              1) A MIXTURE OF MODES (FLOATING POINT
23161C              VERSUS INTEGER) IS INCONSISTENT AND
23162C              AN UNNECESSARY COMPLICATION
23163C              IN A DATA ANALYSIS; AND
23164C              2) FLOATING POINT MACHINE ARITHMETIC
23165C              (AS OPPOSED TO INTEGER ARITHMETIC)
23166C              IS THE MORE NATURAL MODE FOR DOING
23167C              DATA ANALYSIS.
23168C     REFERENCES--OLE HESSELAGER (1994).  "A RECURSIVE PROCEDURE
23169C                 FOR CALCULATIONS OF SOME COMPOUND DISTRIBUTIONS",
23170C                 ASTIN BULLETIN, VOL. 24, NO. 1, PP. 19-32.
23171C               --SUDHIR R. PAUL (2004).  "APPLICATIONS OF THE
23172C                 BETA DISTRIBUTION" in "HANDBOOK OF THE BETA
23173C                 DISTRIBUTION", EDITED BY GUPTA AND NADARAJAH,
23174C                 MARCEL-DEKKER, PP.431-436.
23175C               --JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
23176C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
23177C                 WILEY, CHAPTER 6.
23178C     WRITTEN BY--JAMES J. FILLIBEN
23179C                 STATISTICAL ENGINEERING DIVISION
23180C                 INFORMATION TECHNOLOGY LABORATORY
23181C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
23182C                 GAITHERSBURG, MD 20899-8980
23183C                 PHONE--301-975-2899
23184C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23185C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
23186C     LANGUAGE--ANSI FORTRAN (1977)
23187C     VERSION NUMBER--2006/5
23188C     ORIGINAL VERSION--MAY       2006.
23189C
23190C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23191C
23192C---------------------------------------------------------------------
23193C
23194      DIMENSION X(*)
23195C
23196      DIMENSION XTEMP(1)
23197C
23198      CHARACTER*4 IBGEDF
23199C
23200C---------------------------------------------------------------------
23201C
23202      INCLUDE 'DPCOP2.INC'
23203C
23204C-----START POINT-----------------------------------------------------
23205C
23206C     CHECK THE INPUT ARGUMENTS FOR ERRORS
23207C
23208      IF(N.LT.1)THEN
23209        WRITE(ICOUT, 5)
23210        CALL DPWRST('XXX','BUG ')
23211        WRITE(ICOUT,47)N
23212        CALL DPWRST('XXX','BUG ')
23213        GOTO9000
23214      ENDIF
23215      IF(ALPHA.LE.0.0)THEN
23216        WRITE(ICOUT,11)
23217        CALL DPWRST('XXX','BUG ')
23218        WRITE(ICOUT,46)ALPHA
23219        CALL DPWRST('XXX','BUG ')
23220        GOTO9000
23221      ENDIF
23222      IF(BETA.LE.0.0)THEN
23223        WRITE(ICOUT,12)
23224        CALL DPWRST('XXX','BUG ')
23225        WRITE(ICOUT,46)BETA
23226        CALL DPWRST('XXX','BUG ')
23227        GOTO9000
23228      ENDIF
23229    5 FORMAT('***** ERROR--NUMBER OF BETA-GEOMETRIC RANDOM ',
23230     1'NUMBERS REQUESTED < 1')
23231   11 FORMAT('***** ERROR--THE ALPHA SHAPE PARAMETER ARGUMENT',
23232     1' TO THE BGERAN SUBROUTINE IS <= 0')
23233   12 FORMAT('***** ERROR--THE BETA SHAPE PARAMETER ARGUMENT',
23234     1' TO THE BGERAN SUBROUTINE IS <= 0')
23235   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.8)
23236   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
23237C
23238C     FIRST, GENERATE N BETA RANDOM NUMBERS.
23239C
23240      CALL BETRAN(N,ALPHA,BETA,ISEED,X)
23241C
23242      NTEMP=1
23243      DO100I=1,N
23244C
23245  110   CONTINUE
23246        P=X(I)
23247        IF(P.LE.0.0 .OR. P.GE.1.0)THEN
23248          CALL BETRAN(NTEMP,ALPHA,BETA,ISEED,X(I))
23249          GOTO110
23250        ENDIF
23251        CALL GE2RAN(NTEMP,P,ISEED,XTEMP)
23252        X(I)=XTEMP(1)
23253        IF(IBGEDF.EQ.'SHIF')X(I)=X(I)-1.0
23254C
23255  100 CONTINUE
23256C
23257 9000 CONTINUE
23258      RETURN
23259      END
23260      SUBROUTINE bgrat(a,b,x,y,w,eps,ierr)
23261C-----------------------------------------------------------------------
23262C     ASYMPTOTIC EXPANSION FOR IX(A,B) WHEN A IS LARGER THAN B.
23263C     THE RESULT OF THE EXPANSION IS ADDED TO W. IT IS ASSUMED
23264C     THAT A .GE. 15 AND B .LE. 1.  EPS IS THE TOLERANCE USED.
23265C     IERR IS A VARIABLE THAT REPORTS THE STATUS OF THE RESULTS.
23266C-----------------------------------------------------------------------
23267C     .. Scalar Arguments ..
23268      DOUBLE PRECISION a,b,eps,w,x,y
23269      INTEGER ierr
23270C     ..
23271C     .. Local Scalars ..
23272      DOUBLE PRECISION bm1,bp2n,cn,coef,dj,j,l,lnx,n2,nu,p,q,r,s,sum,t,
23273     +                 t2,u,v,z
23274      INTEGER i,n,nm1
23275C     ..
23276C     .. Local Arrays ..
23277      DOUBLE PRECISION c(30),d(30)
23278C     ..
23279C     .. External Functions ..
23280      DOUBLE PRECISION algdiv,alnrel,gam1
23281      EXTERNAL algdiv,alnrel,gam1
23282C     ..
23283C     .. External Subroutines ..
23284      EXTERNAL grat1
23285C     ..
23286C     .. Intrinsic Functions ..
23287      INTRINSIC abs,dlog,exp
23288C     ..
23289C     .. Executable Statements ..
23290C
23291      bm1 = (b-0.5D0) - 0.5D0
23292      nu = a + 0.5D0*bm1
23293      IF (y.GT.0.375D0) GO TO 10
23294      lnx = alnrel(-y)
23295      GO TO 20
23296
23297   10 lnx = dlog(x)
23298   20 z = -nu*lnx
23299      IF (b*z.EQ.0.0D0) GO TO 70
23300C
23301C                 COMPUTATION OF THE EXPANSION
23302C                 SET R = EXP(-Z)*Z**B/GAMMA(B)
23303C
23304      r = b* (1.0D0+gam1(b))*exp(b*dlog(z))
23305      r = r*exp(a*lnx)*exp(0.5D0*bm1*lnx)
23306      u = algdiv(b,a) + b*dlog(nu)
23307      u = r*exp(-u)
23308      IF (u.EQ.0.0D0) GO TO 70
23309      CALL grat1(b,z,r,p,q,eps)
23310C
23311      v = 0.25D0* (1.0D0/nu)**2
23312      t2 = 0.25D0*lnx*lnx
23313      l = w/u
23314      j = q/r
23315      sum = j
23316      t = 1.0D0
23317      cn = 1.0D0
23318      n2 = 0.0D0
23319      DO 50 n = 1,30
23320          bp2n = b + n2
23321          j = (bp2n* (bp2n+1.0D0)*j+ (z+bp2n+1.0D0)*t)*v
23322          n2 = n2 + 2.0D0
23323          t = t*t2
23324          cn = cn/ (n2* (n2+1.0D0))
23325          c(n) = cn
23326          s = 0.0D0
23327          IF (n.EQ.1) GO TO 40
23328          nm1 = n - 1
23329          coef = b - n
23330          DO 30 i = 1,nm1
23331              s = s + coef*c(i)*d(n-i)
23332              coef = coef + b
23333   30     CONTINUE
23334   40     d(n) = bm1*cn + s/n
23335          dj = d(n)*j
23336          sum = sum + dj
23337          IF (sum.LE.0.0D0) GO TO 70
23338          IF (abs(dj).LE.eps* (sum+l)) GO TO 60
23339   50 CONTINUE
23340C
23341C                    ADD THE RESULTS TO W
23342C
23343   60 ierr = 0
23344      w = w + u*sum
23345      RETURN
23346C
23347C               THE EXPANSION CANNOT BE COMPUTED
23348C
23349   70 ierr = 1
23350      RETURN
23351
23352      END
23353      SUBROUTINE BILINR(Z,Y,X,N,Y2,X2,N2,IWRITE,Z2,
23354     1                  YTEMP,XTEMP,YDIST,XDIST,
23355     1                  ZDIST,ZTEMP2,ZTEMP,
23356     1                  IBUGG3,ISUBRO,IERROR)
23357C
23358C     PURPOSE--COMPUTE BI-LINEAR INTERPOLATION OF A VARIABLE
23359C              (GENERATE INTERPOLATED POINTS).
23360C     INPUT  ARGUMENTS--Z      = SINGLE PRECISION VARIABLE
23361C                                CONTAINING THE ORIGINAL
23362C                                Z AXIS DATA POINTS.
23363C                     --Y      = SINGLE PRECISION VARIABLE
23364C                                CONTAINING THE ORIGINAL
23365C                                VERTICAL AXIS DATA POINTS.
23366C                     --X      = SINGLE PRECISION VARIABLE
23367C                                CONTAINING THE ORIGINAL
23368C                                HORIZONTAL AXIS DATA POINTS.
23369C                     --Y2     = SINGLE PRECISION VARIABLE
23370C                                CONTAINING THE DESIRED
23371C                                VERTICAL AXIS INTERPOLATION
23372C                     --X2     = SINGLE PRECISION VARIABLE
23373C                                CONTAINING THE DESIRED
23374C                                HORIZONTAL AXIS INTERPOLATION
23375C                                POINTS.
23376C     OUTPUT ARGUMENTS--Z2     = SINGLE PRECISION VARIABLE
23377C                                CONTAINING THE COMPUTED
23378C                                Z AXIS INTERPOLATION
23379C                                POINTS.
23380C     NOTE--IT IS PROBABLY NOT PERMISSIBLE TO HAVE THE OUTPUT VECTOR
23381C           Y2(.) BEING IDENTICAL TO THE INPUT VECTOR Y(.)
23382C     NOTE--THIS SUBROUTINE DOES NOT ASSUME THAT THE INPUT
23383C           DATA IS ALREADY SORTED ACCORDING TO THE
23384C           HORIZONTAL AXIS VARIABLE.
23385C           SUCH SORTING IS DOEN HEREIN.
23386C     NOTE--IT DOES ASSUME THAT THE ORIGINAL (Y,X) POINTS FORM A
23387C           RECTANGULAR GRID (ALTHOUGH THE GRID DOES NOT HAVE TO BE
23388C           PRE-SORTED).
23389C     CAUTION--THE INPUT VECTORS Y AND X ARE SORTED HEREIN
23390C              AND SO MAY BE DIFFERENT UPON LEAVING THIS SUBROUTINE
23391C              THAN UPON ENTERING THIS SUBROUTINE.
23392C     WRITTEN BY--JAMES J. FILLIBEN
23393C                 STATISTICAL ENGINEERING DIVISION
23394C                 INFORMATION TECHNOLOGY LABORATORY
23395C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
23396C                 GAITHERSBURG, MD 20899-8980
23397C                 PHONE--301-975-2855
23398C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23399C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
23400C     LANGUAGE--ANSI FORTRAN (1977)
23401C     VERSION NUMBER--94/5
23402C     ORIGINAL VERSION--MAY       1994.
23403C     UPDATED         --JUNE      2019. DIMENSIONING OF SCRATCH
23404C                                       ARRAYS IN CALLING ROUTINE
23405C
23406C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23407C
23408      CHARACTER*4 IWRITE
23409      CHARACTER*4 IBUGG3
23410      CHARACTER*4 ISUBRO
23411      CHARACTER*4 IERROR
23412C
23413      CHARACTER*4 ISUBN1
23414      CHARACTER*4 ISUBN2
23415      CHARACTER*4 ISTEPN
23416C
23417C---------------------------------------------------------------------
23418C
23419      DIMENSION Z(*)
23420      DIMENSION Y(*)
23421      DIMENSION X(*)
23422      DIMENSION X2(*)
23423      DIMENSION Y2(*)
23424      DIMENSION Z2(*)
23425C
23426      DIMENSION YTEMP(*)
23427      DIMENSION XTEMP(*)
23428      DIMENSION YDIST(*)
23429      DIMENSION XDIST(*)
23430      DIMENSION ZDIST(*)
23431      DIMENSION ZTEMP2(*)
23432      DIMENSION ZTEMP(*)
23433C
23434C-----COMMON VARIABLES (GENERAL)--------------------------------------
23435C
23436      INCLUDE 'DPCOP2.INC'
23437C
23438C-----START POINT-----------------------------------------------------
23439C
23440      ISUBN1='BILI'
23441      ISUBN2='NR  '
23442      IERROR='NO'
23443C
23444      ISTART=0
23445      ILAST=0
23446C
23447      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')THEN
23448        WRITE(ICOUT,999)
23449  999   FORMAT(1X)
23450        CALL DPWRST('XXX','BUG ')
23451        WRITE(ICOUT,51)
23452   51   FORMAT('***** AT THE BEGINNING OF BILINR--')
23453        CALL DPWRST('XXX','BUG ')
23454        WRITE(ICOUT,52)N,N2
23455   52   FORMAT('N,N2 = ',2I8)
23456        CALL DPWRST('XXX','BUG ')
23457        DO55I=1,N
23458          WRITE(ICOUT,56)I,Z(I),Y(I),X(I)
23459   56     FORMAT('I,Z(I),Y(I),X(I) = ',I8,3G15.7)
23460          CALL DPWRST('XXX','BUG ')
23461   55   CONTINUE
23462        DO65I=1,N2
23463          WRITE(ICOUT,66)I,Y2(I),X2(I)
23464   66     FORMAT('I,Y2(I),X2(I) = ',I8,2G15.7)
23465          CALL DPWRST('XXX','BUG ')
23466   65   CONTINUE
23467      ENDIF
23468C
23469C               ****************************************
23470C               **  STEP 11--                         **
23471C               **  SORT THE INPUT DATA ACCORDING     **
23472C               **  TO THE HORIZONTAL AXIS VARIABLE   **
23473C               ****************************************
23474C
23475      ISTEPN='11'
23476      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')
23477     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
23478C
23479      DO1010,I=1,N
23480        XTEMP(I)=X(I)
23481 1010 CONTINUE
23482C
23483      CALL SORTC(X,Y,N,X,Y)
23484      CALL SORTC(XTEMP,Z,N,XTEMP,Z)
23485C
23486C               *******************************************************
23487C               **  STEP 12--                                        **
23488C               **  DETERMINE THE NUMBER OF DISTINCT X VALUES        **
23489C               *******************************************************
23490C
23491      ISTEPN='12'
23492      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')
23493     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
23494C
23495      NDISTX=0
23496      DO1210I=1,N
23497        IF(NDISTX.GT.0)THEN
23498          DO1215I2=1,NDISTX
23499           IF(X(I).EQ.XDIST(I2))GOTO1210
23500 1215     CONTINUE
23501        ENDIF
23502        NDISTX=NDISTX+1
23503        XDIST(NDISTX)=X(I)
23504 1210 CONTINUE
23505C
23506      CALL SORT(XDIST,NDISTX,XDIST)
23507C
23508C               *******************************************************
23509C               **  STEP 13--                                        **
23510C               **  DETERMINE THE NUMBER OF DISTINCT Y VALUES        **
23511C               *******************************************************
23512C
23513      ISTEPN='13'
23514      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')
23515     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
23516C
23517      NDISTY=0
23518      DO1310I=1,N
23519        IF(NDISTY.GT.0)THEN
23520          DO1315I2=1,NDISTY
23521            IF(Y(I).EQ.YDIST(I2))GOTO1310
23522 1315     CONTINUE
23523        ENDIF
23524        NDISTY=NDISTY+1
23525        YDIST(NDISTY)=Y(I)
23526 1310 CONTINUE
23527C
23528      CALL SORT(YDIST,NDISTY,YDIST)
23529C
23530C               *******************************************************
23531C               **  STEP 14--                                        **
23532C               **  SORT Y ASSOCIATED WITH EACH DISTINCT X VALUE     **
23533C               **  CHECK FOR REPLICATION OF POINTS                  **
23534C               **  IF ALL DISTINCT (THAT IS, NO REPLICATION),     **
23535C               **  (THAT IS, HAVE NO REPLICATION),                **
23536C               **  THEN COPY OVER Z VALUES.                       **
23537C               **  IF NOT ALL DISTINCT                            **
23538C               **  (THAT IS, HAVE SOME REPLICATION),              **
23539C               **  THEN COMPUTE A MEAN VALUE OVER THE REPLICATES  **
23540C               **  AND TREAT THAT AS THE COMMON VALUE.            **
23541C               **  THE CORE OF THE INTERPOLATION CODE             **
23542C               **  IS EXPECTING SORTED, DISTINCT X AND Y VALUES.   **
23543C               **  ALSO CHECK THAT X AND Y FORM A RECTANGULAR GRID.**
23544C               *******************************************************
23545C
23546      ISTEPN='14'
23547      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')
23548     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
23549C
23550      NUMZ=0
23551      ISTART=1
23552      DO1410I=1,NDISTX
23553        XT=XDIST(I)
23554        ICOUNT=0
23555        DO1420J=ISTART,N
23556        IF(X(J).EQ.XT)THEN
23557          IF(ICOUNT.EQ.0)IFRST=J
23558          ICOUNT=ICOUNT+1
23559          YTEMP(ICOUNT)=Y(J)
23560          ZTEMP(ICOUNT)=Z(J)
23561          ILAST=J
23562        ELSEIF(X(J).GT.XT)THEN
23563          GOTO1421
23564        ENDIF
23565 1420   CONTINUE
23566 1421   CONTINUE
23567C
23568        ISTART=ILAST+1
23569        CALL SORTC(YTEMP,ZTEMP,ICOUNT,YTEMP,ZTEMP)
23570        DO1471K=1,NDISTY
23571          TAG=YDIST(K)
23572          J=0
23573          DO1472II=1,ICOUNT
23574            IF(YTEMP(II).EQ.TAG)THEN
23575              J=J+1
23576              ZTEMP2(J)=ZTEMP(II)
23577            END IF
23578 1472     CONTINUE
23579          NI=J
23580          IF(NI.EQ.1)THEN
23581            NUMZ=NUMZ+1
23582            ZDIST(NUMZ)=ZTEMP2(1)
23583          ELSE IF(NI.GT.1)THEN
23584            CALL MEAN(ZTEMP2,NI,IWRITE,ZMEAN,IBUGG3,IERROR)
23585            NUMZ=NUMZ+1
23586            ZDIST(NUMZ)=ZMEAN
23587          ELSE
23588            WRITE(ICOUT,999)
23589            CALL DPWRST('XXX','BUG ')
23590            WRITE(ICOUT,1491)
23591            CALL DPWRST('XXX','BUG ')
23592            WRITE(ICOUT,1492)
23593            CALL DPWRST('XXX','BUG ')
23594            IERROR='YES'
23595            GOTO9000
23596          ENDIF
23597 1471   CONTINUE
23598C
23599 1410 CONTINUE
23600C
23601 1491 FORMAT('******* ERROR FROM BILINR.  ORIGINAL X AND Y')
23602 1492 FORMAT('        DATA DO NOT FORM A RECTANGULAR GRID.  ******')
23603C
23604C               ********************************************
23605C               **  STEP 14--                             **
23606C               **  COMPUTE INTERPOLATED VALUES           **
23607C               ********************************************
23608C
23609      CALL BILIN2(ZDIST,YDIST,XDIST,NDISTX,NDISTY,Y2,X2,N2,Z2,
23610     1            IBUGG3,ISUBRO,IERROR)
23611C
23612C               *****************
23613C               **  STEP 90--  **
23614C               **  EXIT.      **
23615C               *****************
23616C
23617 9000 CONTINUE
23618      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'LINR')THEN
23619        WRITE(ICOUT,999)
23620        CALL DPWRST('XXX','BUG ')
23621        WRITE(ICOUT,9011)
23622 9011   FORMAT('***** AT THE END       OF BILINR--')
23623        CALL DPWRST('XXX','BUG ')
23624        DO9042I=1,N2
23625          WRITE(ICOUT,9043)I,X2(I),Y2(I),Z2(I)
23626 9043     FORMAT('I,X2(I),Y2(I),Z2(I) = ',I8,3G15.7)
23627          CALL DPWRST('XXX','BUG ')
23628 9042   CONTINUE
23629        WRITE(ICOUT,9051)NDISTX,NDISTY
23630 9051   FORMAT('NDISTX,NDISTY = ',2I8)
23631        CALL DPWRST('XXX','BUG ')
23632        DO9052I=1,NDISTX
23633          DO9054J=1,NDISTY
23634            WRITE(ICOUT,9053)I,J,XDIST(I),YDIST(J),ZDIST((I-1)*NDISTY+J)
23635 9053       FORMAT('I,J,XDIST(I),YDIST(J),ZDIST = ',2I8,3G15.7)
23636            CALL DPWRST('XXX','BUG ')
23637 9054     CONTINUE
23638 9052   CONTINUE
23639      ENDIF
23640C
23641      RETURN
23642      END
23643      SUBROUTINE BILIN2(Z,Y,X,NX,NY,Y2,X2,N2,Z2,IBUGG3,ISUBRO,IERROR)
23644C
23645C     PURPOSE--COMPUTE BI-LINEAR INTERPOLATION OF A VARIABLE
23646C              (GENERATE INTERPOLATED POINTS).
23647C     INPUT  ARGUMENTS--Z      = SINGLE PRECISION VARIABLE
23648C                                CONTAINING THE ORIGINAL
23649C                                Z AXIS DATA POINTS.
23650C                     --Y      = SINGLE PRECISION VARIABLE
23651C                                CONTAINING THE ORIGINAL
23652C                                VERTICAL AXIS DATA POINTS.
23653C                     --X      = SINGLE PRECISION VARIABLE
23654C                                CONTAINING THE ORIGINAL
23655C                                HORIZONTAL AXIS DATA POINTS.
23656C                     --Y2     = SINGLE PRECISION VARIABLE
23657C                                CONTAINING THE DESIRED
23658C                                VERTICAL AXIS INTERPOLATION
23659C                     --X2     = SINGLE PRECISION VARIABLE
23660C                                CONTAINING THE DESIRED
23661C                                HORIZONTAL AXIS INTERPOLATION
23662C                                POINTS.
23663C     OUTPUT ARGUMENTS--Z2     = SINGLE PRECISION VARIABLE
23664C                                CONTAINING THE COMPUTED
23665C                                VERTICAL AXIS INTERPOLATION
23666C                                POINTS.
23667C     NOTE--IT IS PROBABLY NOT PERMISSIBLE TO HAVE THE OUTPUT VECTOR
23668C           Z2(.) BEING IDENTICAL TO THE INPUT VECTOR Z(.)
23669C     NOTE--THE X AND Y POINTS ARE ASSUMED TO LIE ON A RECTANGULAR GRID
23670C     WRITTEN BY--JAMES J. FILLIBEN
23671C                 STATISTICAL ENGINEERING DIVISION
23672C                 INFORMATION TECHNOLOGY LABORATORY
23673C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
23674C                 GAITHERSBURG, MD 20899-8980
23675C                 PHONE--301-975-2855
23676C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23677C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
23678C     LANGUAGE--ANSI FORTRAN (1977)
23679C     VERSION NUMBER--94/5
23680C     ORIGINAL VERSION--MAY       1994.
23681C
23682C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23683C
23684      CHARACTER*4 IBUGG3
23685      CHARACTER*4 ISUBRO
23686      CHARACTER*4 IERROR
23687C
23688      CHARACTER*4 ISUBN1
23689      CHARACTER*4 ISUBN2
23690C
23691C---------------------------------------------------------------------
23692C
23693C
23694      DIMENSION Z(*)
23695      DIMENSION Y(*)
23696      DIMENSION X(*)
23697      DIMENSION Z2(*)
23698      DIMENSION Y2(*)
23699      DIMENSION X2(*)
23700C
23701C-----COMMON VARIABLES (GENERAL)--------------------------------------
23702C
23703      INCLUDE 'DPCOP2.INC'
23704C
23705C-----START POINT-----------------------------------------------------
23706C
23707      ISUBN1='BILI'
23708      ISUBN2='N2  '
23709      IERROR='NO'
23710C
23711      IY1=0
23712      IY2=0
23713      IX1=0
23714      IX2=0
23715C
23716      DO10I=1,N2
23717        Z2(I)=0.0
23718 10   CONTINUE
23719C
23720      IF(IBUGG3.EQ.'OFF'.AND.ISUBRO.NE.'LIN2')GOTO90
23721      WRITE(ICOUT,999)
23722  999 FORMAT(1X)
23723      CALL DPWRST('XXX','BUG ')
23724      WRITE(ICOUT,51)
23725   51 FORMAT('***** AT THE BEGINNING OF BILIN2--')
23726      CALL DPWRST('XXX','BUG ')
23727      WRITE(ICOUT,52)NX,NY
23728   52 FORMAT('NX, NY = ',2I8)
23729      CALL DPWRST('XXX','BUG ')
23730      DO54I=1,NX
23731      DO55J=1,NY
23732      INDX=(I-1)*NY+J
23733      WRITE(ICOUT,53)I,J,X(I),Y(J),Z(INDX)
23734      CALL DPWRST('XXX','BUG ')
23735 53   FORMAT('I,J,X(I),Y(J),Z = ',2I8,3E15.7)
23736      CALL DPWRST('XXX','BUG ')
23737 55   CONTINUE
23738 54   CONTINUE
23739      WRITE(ICOUT,62)N2
23740   62 FORMAT('N2 = ',I8)
23741      CALL DPWRST('XXX','BUG ')
23742      DO65I=1,N2
23743      WRITE(ICOUT,66)I,Y2(I),X2(I)
23744   66 FORMAT('I,Y2(I),X2(I) = ',I8,2E15.7)
23745      CALL DPWRST('XXX','BUG ')
23746   65 CONTINUE
23747   90 CONTINUE
23748C
23749C               ****************************************
23750C               **  STEP 31--
23751C               **  COMPUTE INTERPOLATION VALUES
23752C               ****************************************
23753C
23754      DO3100J=1,N2
23755      XT=X2(J)
23756      IF(X(1).GT.XT.OR.XT.GT.X(NX))GOTO3110
23757      YT=Y2(J)
23758      IF(Y(1).GT.YT.OR.YT.GT.Y(NY))GOTO3120
23759      GOTO3129
23760C
23761 3110 CONTINUE
23762      WRITE(ICOUT,999)
23763      CALL DPWRST('XXX','BUG ')
23764      WRITE(ICOUT,3111)
23765 3111 FORMAT('***** ERROR IN BILIN2--')
23766      CALL DPWRST('XXX','BUG ')
23767      WRITE(ICOUT,3112)
23768 3112 FORMAT('      AN ATTEMPT WAS MADE TO COMPUTE')
23769      CALL DPWRST('XXX','BUG ')
23770      WRITE(ICOUT,3113)
23771 3113 FORMAT('      A SMOOTHED VALUE BEYOND THE X RANGE')
23772      CALL DPWRST('XXX','BUG ')
23773      WRITE(ICOUT,3114)
23774 3114 FORMAT('      OF THE DATA--SUCH EXTRAPOLATION')
23775      CALL DPWRST('XXX','BUG ')
23776      WRITE(ICOUT,3115)
23777 3115 FORMAT('      IS UNRELIABLE AND NOT PERMITTED.')
23778      CALL DPWRST('XXX','BUG ')
23779      WRITE(ICOUT,3116)X(1)
23780 3116 FORMAT('         SMALLEST DATA POINT X(1)      = ',E15.7)
23781      CALL DPWRST('XXX','BUG ')
23782      WRITE(ICOUT,3117)X(NX)
23783 3117 FORMAT('         LARGEST DATA POINT  X(NX)     = ',E15.7)
23784      CALL DPWRST('XXX','BUG ')
23785      WRITE(ICOUT,3118)XT
23786 3118 FORMAT('         ATTEMPTED EXTRAPOLATION POINT = ',E15.7)
23787      CALL DPWRST('XXX','BUG ')
23788      IERROR='YES'
23789      GOTO9000
23790C
23791 3120 CONTINUE
23792      WRITE(ICOUT,999)
23793      CALL DPWRST('XXX','BUG ')
23794      WRITE(ICOUT,3121)
23795 3121 FORMAT('***** ERROR IN BILIN2--')
23796      CALL DPWRST('XXX','BUG ')
23797      WRITE(ICOUT,3122)
23798 3122 FORMAT('      AN ATTEMPT WAS MADE TO COMPUTE')
23799      CALL DPWRST('XXX','BUG ')
23800      WRITE(ICOUT,3123)
23801 3123 FORMAT('      A SMOOTHED VALUE BEYOND THE Y RANGE')
23802      CALL DPWRST('XXX','BUG ')
23803      WRITE(ICOUT,3124)
23804 3124 FORMAT('      OF THE DATA--SUCH EXTRAPOLATION')
23805      CALL DPWRST('XXX','BUG ')
23806      WRITE(ICOUT,3125)
23807 3125 FORMAT('      IS UNRELIABLE AND NOT PERMITTED.')
23808      CALL DPWRST('XXX','BUG ')
23809      WRITE(ICOUT,3126)Y(1)
23810 3126 FORMAT('         SMALLEST DATA POINT Y(1)      = ',E15.7)
23811      CALL DPWRST('XXX','BUG ')
23812      WRITE(ICOUT,3127)Y(NY)
23813 3127 FORMAT('         LARGEST DATA POINT  Y(NY)     = ',E15.7)
23814      CALL DPWRST('XXX','BUG ')
23815      WRITE(ICOUT,3128)YT
23816 3128 FORMAT('         ATTEMPTED EXTRAPOLATION POINT = ',E15.7)
23817      CALL DPWRST('XXX','BUG ')
23818      IERROR='YES'
23819      GOTO9000
23820C
23821 3129 CONTINUE
23822C
23823      DO3200I=1,NX-1
23824      IF(XT.GE.X(I).AND.XT.LE.X(I+1))THEN
23825        IX1=I
23826        IX2=I+1
23827        GOTO3209
23828      ENDIF
23829 3200 CONTINUE
23830 3209 CONTINUE
23831C
23832      DO3210I=1,NY-1
23833      IF(YT.GE.Y(I).AND.YT.LE.Y(I+1))THEN
23834        IY1=I
23835        IY2=I+1
23836        GOTO3219
23837      ENDIF
23838 3210 CONTINUE
23839 3219 CONTINUE
23840C
23841      A1=Z(NX*(IX1-1)+IY1)
23842      A2=Z(NX*(IX2-1)+IY1)
23843      A3=Z(NX*(IX2-1)+IY2)
23844      A4=Z(NX*(IX1-1)+IY2)
23845      T=XT-X(IX1)/(X(IX2)-X(IX1))
23846      U=YT-Y(IY1)/(Y(IY2)-Y(IY1))
23847      Z2(J)=(1.0-T)*(1.0-U)*A1 + T*(1.0-U)*A2 + T*U*A3 + (1.0-T)*U*A4
23848C
23849 3100 CONTINUE
23850C
23851C               ****************************************
23852C               **  STEP 41--
23853C               **  IF CALLED FOR,
23854C               **  WRITE OUT INTERPOLATION VALUES
23855C               ****************************************
23856C
23857      IF(IBUGG3.EQ.'OFF'.AND.ISUBRO.NE.'LIN2')GOTO4190
23858      DO4100J=1,N2
23859      WRITE(ICOUT,4110)X2(J),Y2(J),Z2(J)
23860      CALL DPWRST('XXX','BUG ')
23861 4110 FORMAT('X2(J),Y2(J),Z2(J) = ',3E15.7)
23862 4100 CONTINUE
23863 4190 CONTINUE
23864C
23865C               *****************
23866C               **  STEP 90--  **
23867C               **  EXIT.      **
23868C               *****************
23869C
23870 9000 CONTINUE
23871      IF(IBUGG3.EQ.'OFF'.AND.ISUBRO.NE.'LIN2')GOTO9090
23872      WRITE(ICOUT,999)
23873      CALL DPWRST('XXX','BUG ')
23874      WRITE(ICOUT,9011)
23875 9011 FORMAT('***** AT THE END       OF BILIN2--')
23876      CALL DPWRST('XXX','BUG ')
23877 9090 CONTINUE
23878C
23879      RETURN
23880      END
23881      SUBROUTINE BINCDF(X,P,N,CDF)
23882C
23883C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
23884C              FUNCTION VALUE AT THE DOUBLE PRECISION VALUE X FOR THE
23885C              BINOMIAL DISTRIBUTION WITH DOUBLE PRECISION 'BERNOULLI
23886C              PROBABILITY' PARAMETER = P, AND INTEGER 'NUMBER OF
23887C              BERNOULLI TRIALS' PARAMETER = N.  THE BINOMIAL
23888C              DISTRIBUTION USED HEREIN HAS MEAN = N*P AND
23889C              STANDARD DEVIATION = SQRT(N*P*(1-P)).  THIS DISTRIBUTION
23890C              IS DEFINED FOR ALL DISCRETE INTEGER X BETWEEN 0
23891C              (INCLUSIVELY) AND N (INCLUSIVELY).
23892C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
23893C
23894C                 p(X;P,N) = C(N,X) * P**X * (1-P)**(N-X).
23895C
23896C              WHERE C(N,X) IS THE COMBINATORIAL FUNCTION
23897C              EQUALING THE NUMBER OF COMBINATIONS OF N ITEMS
23898C              TAKEN X AT A TIME.  THE BINOMIAL DISTRIBUTION IS THE
23899C              DISTRIBUTION OF THE NUMBER OF SUCCESSES IN N BERNOULLI
23900C              (0,1) TRIALS WHERE THE PROBABILITY OF SUCCESS
23901C              IN A SINGLE TRIAL = P.
23902C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT WHICH
23903C                                THE CUMULATIVE DISTRIBUTION FUNCTION
23904C                                IS TO BE EVALUATED.  X SHOULD BE
23905C                                INTEGRAL-VALUED, AND BETWEEN 0.0
23906C                                AND N (INCLUSIVELY).
23907C                     --P      = THE DOUBLE PRECISION VALUE OF THE
23908C                                'BERNOULLI PROBABILITY' PARAMETER FOR
23909C                                THE BINOMIAL DISTRIBUTION.  P SHOULD BE
23910C                                BETWEEN 0.0 (INCLUSIVELY) AND
23911C                                1.0 (INCLUSIVELY).
23912C                     --N      = THE INTEGER VALUE OF THE 'NUMBER OF
23913C                                BERNOULLI TRIALS' PARAMETER.
23914C                                N SHOULD BE A POSITIVE INTEGER.
23915C     OUTPUT ARGUMENTS--CDF    = THE DOUBLE PRECISION CUMULATIVE
23916C                                DISTRIBUTION FUNCTION VALUE.
23917C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
23918C             FUNCTION VALUE CDF FOR THE BINOMIAL DISTRIBUTION
23919C             WITH 'BERNOULLI PROBABILITY' PARAMETER = P
23920C             AND 'NUMBER OF BERNOULLI TRIALS' PARAMETER = N.
23921C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
23922C     RESTRICTIONS--X SHOULD BE INTEGRAL-VALUED, AND BETWEEN 0.0
23923C                  (INCLUSIVELY) AND N (INCLUSIVELY).
23924C                 --P SHOULD BE BETWEEN 0.0 (EXCLUSIVELY) AND 1.0
23925C                   (INCLUSIVELY).
23926C                 --N SHOULD BE A POSITIVE INTEGER.
23927C     OTHER DATAPAC   SUBROUTINES NEEDED--DBETAI.
23928C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE
23929C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
23930C     LANGUAGE--ANSI FORTRAN (1977)
23931C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
23932C                 DISTRIBUTIONS--A HANDBOOK FOR
23933C                 STUDENTS AND PRACTITIONERS, 1975,
23934C                 PAGE 38.
23935C               --NATIONAL BUREAU OF STANDARDS APPLIED MATHEMATICS
23936C                 SERIES 55, 1964, PAGE 945, FORMULAE 26.5.24 AND
23937C                 26.5.28, AND PAGE 929.
23938C               --JOHNSON AND KOTZ, DISCRETE
23939C                 DISTRIBUTIONS, 1969, PAGES 50-86,
23940C                 ESPECIALLY PAGES 63-64.
23941C               --FELLER, AN INTRODUCTION TO PROBABILITY
23942C                 THEORY AND ITS APPLICATIONS, VOLUME 1,
23943C                 EDITION 2, 1957, PAGES 135-142.
23944C               --KENDALL AND STUART, THE ADVANCED THEORY OF
23945C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 120-125.
23946C               --MOOD AND GRABLE, INTRODUCTION TO THE THEORY
23947C                 OF STATISTICS, EDITION 2, 1963, PAGES 64-69.
23948C               --OWEN, HANDBOOK OF STATISTICAL
23949C                 TABLES, 1962, PAGES 264-272.
23950C     WRITTEN BY--JAMES J. FILLIBEN
23951C                 STATISTICAL ENGINEERING DIVISION
23952C                 INFORMATION TECHNOLOGY LABORATORY
23953C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
23954C                 GAITHERSBURG, MD 20899-8980
23955C                 PHONE--301-921-3651
23956C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
23957C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
23958C     LANGUAGE--ANSI FORTRAN (1977)
23959C     VERSION NUMBER--82/7
23960C     ORIGINAL VERSION--NOVEMBER  1975.
23961C     UPDATED         --MAY       1977.
23962C     UPDATED         --DECEMBER  1981.
23963C     UPDATED         --MAY       1982.
23964C     UPDATED         --MARCH     2009. USE DBETAI FUNCTION
23965C
23966C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
23967C
23968C---------------------------------------------------------------------
23969C
23970      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
23971      EXTERNAL DBETAI
23972C
23973C---------------------------------------------------------------------
23974C
23975      INCLUDE 'DPCOP2.INC'
23976C
23977C-----START POINT-----------------------------------------------------
23978C
23979C     CHECK THE INPUT ARGUMENTS FOR ERRORS
23980C
23981      CDF=0.0D0
23982      DN=DBLE(N)
23983C
23984      IF(P.LT.0.0D0 .OR. P.GT.1.0D0)THEN
23985        WRITE(ICOUT,11)
23986        CALL DPWRST('XXX','BUG ')
23987        WRITE(ICOUT,46)P
23988        CALL DPWRST('XXX','BUG ')
23989        GOTO9000
23990      ELSEIF(N.LT.0)THEN
23991        WRITE(ICOUT,25)
23992        CALL DPWRST('XXX','BUG ')
23993        WRITE(ICOUT,47)N
23994        CALL DPWRST('XXX','BUG ')
23995        GOTO9000
23996      ELSEIF(X.LT.0.0D0 .OR. X.GT.DN)THEN
23997        WRITE(ICOUT,4)N
23998        CALL DPWRST('XXX','BUG ')
23999        WRITE(ICOUT,46)X
24000        CALL DPWRST('XXX','BUG ')
24001        IF(X.LT.0.0D0)CDF=0.0D0
24002        IF(X.GT.DN)CDF=1.0D0
24003        GOTO9000
24004      ENDIF
24005    4 FORMAT('***** WARNING--THE FIRST ARGUMENT TO BINCDF IS OUTSIDE ',
24006     1       'THE (0,N) = (0,',I8,') INTERVAL')
24007   11 FORMAT('***** ERROR--THE SECOND ARGUMENT TO BINCDF IS OUTSIDE ',
24008     1       'THE ALLOWABLE (0,1) INTERVAL')
24009   25 FORMAT('***** ERROR--THE THIRD ARGUMENT TO BINCDF IS ',
24010     1       'NON-POSITIVE')
24011   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
24012   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I10)
24013C
24014C     TREAT IMMEDIATELY THE SPECIAL CASE OF X = N,
24015C     IN WHICH CASE CDF = 1.0.
24016C     ALSO TREAT IMMEDIATELY THE SPECIAL CASE OF P = 0.0
24017C     IN WHICH CASE CDF = 1.0 FOR ALL X.
24018C     THIRDLY, TREAT THE SPECIAL CASE IN WHICH P = 1.0
24019C     IN WHICH CASE CDF = 0.0 FOR ALL X SMALLER THAN N
24020C     AND CDF = 1.0 FOR ALL X EQUAL TO OR LARGER
24021C     THAN N.
24022C
24023      INTX=INT(X+0.0001D0)
24024      DX=DBLE(INTX)
24025C
24026      IF(INTX.EQ.N)THEN
24027        CDF=1.0D0
24028      ELSEIF(P.EQ.0.0D0)THEN
24029        CDF=1.0D0
24030      ELSEIF(P.EQ.1.0D0 .AND. INTX.GE.N)THEN
24031        CDF=1.0D0
24032      ELSEIF(P.EQ.1.0D0 .AND. INTX.LT.N)THEN
24033        CDF=0.0
24034      ELSE
24035        CDF=1.0D0 - DBETAI(DBLE(P),DX+1.0D0,DN-DX)
24036      ENDIF
24037C
24038 9000 CONTINUE
24039      RETURN
24040      END
24041      REAL FUNCTION BINFUN(P)
24042C
24043C     PURPOSE--DPMLBI CALLS FZERO TO FIND A ROOT FOR ONE OF
24044C              THE FOLLOWING FUNCTIONS:
24045C
24046C                 BINCDF(X;P,N) - (1 - ALPHA/2) = 0
24047C                 BINCDF(X;P,N) - (ALPHA/2)     = 0
24048C
24049C              WITH X, P, N, AND ALPHA DENOTING THE NUMBER OF
24050C              SUCCESSES, THE PROBABILITY OF SUCCESS PARAMETER,
24051C              THE NUMBER OF TRIALS, AND DESIRED SIGNIFICANCE
24052C              LEVEL RESPECTIVELY.  DPMLBI IS TRYING TO DETERMINE
24053C              AN EXACT CONFIDENCE INTERVAL FOR P.  THE VALUES
24054C              FOR X, N, AND (1 - ALPHA/2) (OR ALPHA/2) ARE PASSED
24055C              IN VIA A COMMON BLOCK.
24056C
24057C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
24058C                                WHICH THE CUMULATIVE DISTRIBUTION
24059C                                FUNCTION IS TO BE EVALUATED.
24060C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
24061C             FUNCTION VALUE BINFUN.
24062C     PRINTING--NONE.
24063C     RESTRICTIONS--NONE.
24064C     OTHER DATAPAC   SUBROUTINES NEEDED--BINCDF.
24065C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
24066C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24067C     LANGUAGE--ANSI FORTRAN (1977)
24068C     REFERENCES--KARL BURY (1999). "STATISTICAL DISTRIBUTIONS IN
24069C                 ENGINEERING", CAMBRIDGE UNIVERSITY PRESS, P. 74.
24070C     WRITTEN BY--JAMES J. FILLIBEN
24071C                 STATISTICAL ENGINEERING DIVISION
24072C                 INFORMATION TECHNOLOGY LABORATORY
24073C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
24074C                 GAITHERSBURG, MD 20899-8980
24075C                 PHONE--301-975-2855
24076C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24077C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
24078C     LANGUAGE--ANSI FORTRAN (1977)
24079C     VERSION NUMBER--2005.8
24080C     ORIGINAL VERSION--AUGUST    2005.
24081C
24082C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24083C
24084C---------------------------------------------------------------------
24085C
24086      DOUBLE PRECISION DCDF
24087C
24088      COMMON/BINCOM/X,CONST,N
24089C
24090      INCLUDE 'DPCOP2.INC'
24091C
24092C-----START POINT-----------------------------------------------------
24093C
24094      CALL BINCDF(DBLE(X),DBLE(P),N,DCDF)
24095      BINFUN=REAL(DCDF) - CONST
24096C
24097      RETURN
24098      END
24099      SUBROUTINE BINMAT(Y1,Y2,N,ICASL7,IWRITE,XIDTEM,STAT,
24100     1                  ISUBRO,IBUGA3,IERROR)
24101C
24102C     PURPOSE--GIVEN TWO BINARY RESPONSE VARIABLES (BINARY IN THE
24103C              SENSE OF BEING EITHER 0 OR 1 VALUES), COMPUTE
24104C              VARIOUS SIMILARITY, DISSIMILARITY AND INDEX VALUES.
24105C
24106C              THIS IS SPECIFICALLY FOR THE 2X2 CASE.  THAT IS,
24107C              EACH VARIABLE HAS TWO MUTUALLY EXCLUSIVE
24108C              CHOICES CODED AS 1 (FOR SUCCESS) OR 0 (FOR
24109C              FAILURE).  A FALSE POSITIVE IS DEFINED AS THE
24110C              ERROR WHERE THE SECOND VARIABLE IS 1 AND THE FIRST
24111C              VARIABLE IS A 0.  THIS DEFINES THE FOLLOWING
24112C              CONTNGENCY TABLE:
24113C
24114C                                    RESPONSE VARIABLE 2
24115C                                             0      1
24116C                                       -----------------
24117C                 RESPONSE VARIABLE 1:  0  |  A      B   |
24118C                                       1  |  C      D   |
24119C                                       -----------------
24120C
24121C              WHERE A, B, C, AND D DENOTE THE COUNTS FOR EACH
24122C              OF THESE CATEGORIES.
24123C
24124C              ROUSSEEUW AND KAUFFMAN DOCUMENT THE FOLLOWING
24125C              MATCHING SCORES THAT ARE OFTEN USED IN CLUSTERING
24126C              APPLICATIONS:
24127C
24128C              SYMMETRIC BINARY VARIABLES
24129C                 SIMILARITY:
24130C                 MATCHING COEFFICIENT:    (A+D)/(A+B+C+D)
24131C                 ROGERS AND TANIMOTO:     (A+D)/((A+D) + 2*(B+C))
24132C                 SOKAL AND SNEATH:        2*(A+D)/(2*(A+D) + (B+C))
24133C                 YULES Q                  (A*D - B*C)/(A*D + B*C)
24134C
24135C                 DISSIMILARITY:
24136C                 MATCHING COEFFICIENT:    (B+C)/(A+B+C+D)
24137C                 ROGERS AND TANIMOTO:     2*(B+C)/((A+D) + 2*(B+C))
24138C                 SOKAL AND SNEATH:        (B+C)/(2*(A+D) + (B+C))
24139C
24140C              ASYMMETRIC BINARY VARIABLES (MOST IMPORTANT VALUE
24141C              CODED AS 1)
24142C                 SIMILARITY:
24143C                 JACCARD COEFFICIENT:    A/(A+B+C)
24144C                 DICE COEFFICIENT:       2*A/(2*A+B+C)
24145C                 SOKAL COEFFICIENT:      A/(A+2(B+C))
24146C
24147C
24148C                 DISSIMILARITY:
24149C                 JACCARD COEFFICIENT:    (A+D)/(A+B+C+D)
24150C                 DICE COEFFICIENT:       (B+C)/(2*A+B+C)
24151C                 SOKAL COEFFICIENT:      2*(B+C)/(A+2(B+C))
24152C
24153C              ASYMMETRIC COEFFICIENTS ARE TYPICALLY USED WHEN
24154C              ONE OUTCOME IS RARE (E.G., MATCHING A RARE OUTCOME
24155C              IS THE IMPORTANT EVENT).
24156C
24157C              YOUDEN'S INDEX IS DEFINED AS
24158C
24159C                  J = (A*D - B*C)/((A+B)*(C+D))
24160C
24161C               YOUDEN'S INDEX IS TYPICALLY USED IN THE CONTEXT
24162C               OF ASSESSING THE PERFORMANCE OF A DIAGNOSTIC TEST
24163C               RATHER THAN AS A SIMILARITY OR DISSIMILARITY
24164C               MEASURE.  SPECIFICALLY, 0 INDICATES A TEST WITH
24165C               NO USEFUL INFORMATION WHILE 1 INDICATES A TEST WITH
24166C               NO FALSE POSITIVE AND NO FALSE NEGATIVES.
24167C
24168C              YULE'S Q (WHICH IS EQUIVALENT TO THE KRUSKAL GOODMAN
24169C              GAMMA COEFFICIENT FOR THIS CASE) IS DEFINED AS
24170C
24171C                  Q = (A*D - B*C)/(A*D + B*C)
24172C
24173C               YULE'S Y IS DEFINED IN TERMS OF THE YULE'S Q AS:
24174C
24175C                  Y = (1 - SQRT(1 - Q**2))/Q
24176C
24177C               OR DIRECTLY AS:
24178C
24179C                  {SQRT(A*D) - SQRT(B*C)}/{SQRT(A*D) + SQRT(B*C)}
24180C
24181C     INPUT  ARGUMENTS--Y1     = THE SINGLE PRECISION VECTOR OF
24182C                                (UNSORTED) OBSERVATIONS
24183C                                WHICH CONSTITUTE THE FIRST SET
24184C                                OF DATA.
24185C                     --Y2     = THE SINGLE PRECISION VECTOR OF
24186C                                (UNSORTED) OBSERVATIONS
24187C                                WHICH CONSTITUTE THE SECOND SET
24188C                                OF DATA.
24189C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
24190C                                IN THE VECTOR X, OR EQUIVALENTLY,
24191C                                THE INTEGER NUMBER OF OBSERVATIONS
24192C                                IN THE VECTOR Y.
24193C     OUTPUT ARGUMENTS--STAT   = THE SINGLE PRECISION VALUE OF THE
24194C                                COMPUTED FALSE POSITIVE PROPORTION
24195C                                BETWEEN THE 2 SETS OF DATA
24196C                                IN THE INPUT VECTORS X AND Y.
24197C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE SAMPLE
24198C             MATCHING COEFFICIENT OF DATA IN THE INPUT VECTORS Y1
24199C             AND Y2.
24200C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
24201C                   OF N FOR THIS SUBROUTINE.
24202C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
24203C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
24204C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
24205C     LANGUAGE--ANSI FORTRAN (1977)
24206C     REFERENCE--KAUFMAN AND ROUSSEEUW (1990), "FINDING GROUPS IN DATA:
24207C                AN INTRODUCTION TO CLUSTER ANALYSIS", WILEY.
24208C              --YOUDEN (1950), "INDEX FOR RATING DIAGNOSTIC TESTS",
24209C                CANCER, 3, PP. 32-35.
24210C     WRITTEN BY--ALAN HECKERT
24211C                 STATISTICAL ENGINEERING DIVISION
24212C                 INFORMATION TECHNOLOGY LABORATORY
24213C                 NATIONAL INSTIUTE OF STANDARDS AND TECHNOLOGY
24214C                 GAITHERSBURG, MD 20899-8980
24215C                 PHONE--301-975-2899
24216C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24217C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
24218C     LANGUAGE--ANSI FORTRAN (1977)
24219C     VERSION NUMBER--2017/08
24220C     ORIGINAL VERSION--AUGUST    2017.
24221C     UPDATED         --JANUARY   2019. YOUDEN INDEX
24222C     UPDATED         --AUGUST    2019. GAMMA COEFFICIENT FOR 2X2 CASE
24223C     UPDATED         --AUGUST    2019. YULE'S Y
24224C
24225C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24226C
24227      CHARACTER*4 ICASL7
24228      CHARACTER*4 IWRITE
24229      CHARACTER*4 IBUGA3
24230      CHARACTER*4 ISUBRO
24231      CHARACTER*4 IERROR
24232C
24233      CHARACTER*4 ISTEPN
24234      CHARACTER*4 ISUBN1
24235      CHARACTER*4 ISUBN2
24236      CHARACTER*33 ISTAT
24237C
24238C---------------------------------------------------------------------
24239C
24240      DIMENSION Y1(*)
24241      DIMENSION Y2(*)
24242      DIMENSION XIDTEM(*)
24243C
24244C---------------------------------------------------------------------
24245C
24246      INCLUDE 'DPCOP2.INC'
24247C
24248C-----START POINT-----------------------------------------------------
24249C
24250      ISUBN1='BINM'
24251      ISUBN2='AT  '
24252      IERROR='NO'
24253C
24254C
24255      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NMAT')THEN
24256        WRITE(ICOUT,999)
24257  999   FORMAT(1X)
24258        CALL DPWRST('XXX','BUG ')
24259        WRITE(ICOUT,51)
24260   51   FORMAT('***** AT THE BEGINNING OF BINMAT--')
24261        CALL DPWRST('XXX','BUG ')
24262        WRITE(ICOUT,52)IBUGA3,ISUBRO,ICASL7,N
24263   52   FORMAT('IBUGA3,ISUBRO,ICASL7,N = ',3(A4,2X),I8)
24264        CALL DPWRST('XXX','BUG ')
24265        DO55I=1,N
24266          WRITE(ICOUT,56)I,Y1(I),Y2(I)
24267   56     FORMAT('I,Y1(I),Y2(I) = ',I8,2G15.7)
24268          CALL DPWRST('XXX','BUG ')
24269   55   CONTINUE
24270      ENDIF
24271C
24272C               ********************************************
24273C               **  STEP 21--                             **
24274C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
24275C               ********************************************
24276C
24277      ISTEPN='21'
24278      IF(IBUGA3.EQ.'ON')CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
24279C
24280      IF(N.LT.1)THEN
24281        WRITE(ICOUT,999)
24282        CALL DPWRST('XXX','WRIT')
24283        WRITE(ICOUT,1201)
24284 1201   FORMAT('***** ERROR IN THE BINARY MATCHING ROUTINE--')
24285        CALL DPWRST('XXX','WRIT')
24286        WRITE(ICOUT,1203)
24287 1203   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE ',
24288     1         'VARIABLES IS LESS THAN ONE.')
24289        CALL DPWRST('XXX','WRIT')
24290        WRITE(ICOUT,1205)N
24291 1205   FORMAT('SAMPLE SIZE = ',I8)
24292        CALL DPWRST('XXX','WRIT')
24293        IERROR='YES'
24294        GOTO9000
24295      ENDIF
24296C
24297C               ********************************************
24298C               **  STEP 22--                             **
24299C               **  CHECK THAT THE VARIABLES HAVE AT MOST **
24300C               **  TWO DISTINCT VALUES (1 INDICATES A    **
24301C               **  SUCCESS, 0 INDICATES A FAILURE).      **
24302C               ********************************************
24303C
24304      ISTEPN='22'
24305      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'NMAT')
24306     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
24307C
24308C     NOTE: CHECK FOR SPECIAL CASE N = 2.  IN THIS CASE,
24309C           ASSUME WE HAVE A 2X2 TABLE OF COUNTS INSTEAD
24310C           OF RAW DATA.
24311C
24312      IF(N.EQ.2)THEN
24313        A=Y1(1)
24314        B=Y2(1)
24315        C=Y1(2)
24316        D=Y2(2)
24317C
24318C       CHECK IF ALL ENTRIES 0 OR 1. IF SO, ASSUME
24319C       RAW DATA CASE.
24320C
24321        IF((A.EQ.0.0 .OR. A.EQ.1.0) .AND.
24322     1     (B.EQ.0.0 .OR. B.EQ.1.0) .AND.
24323     1     (C.EQ.0.0 .OR. C.EQ.1.0) .AND.
24324     1     (D.EQ.0.0 .OR. D.EQ.1.0)) GOTO3000
24325C
24326        IF(A.LT.0.0)THEN
24327          WRITE(ICOUT,999)
24328          CALL DPWRST('XXX','BUG ')
24329          WRITE(ICOUT,1201)
24330          CALL DPWRST('XXX','BUG ')
24331          WRITE(ICOUT,1311)
24332 1311     FORMAT('      ROW 1 COLUMN 1 OF THE COUNTS TABLE IS ',
24333     1           'NEGATIVE.')
24334          CALL DPWRST('XXX','BUG ')
24335        ELSEIF(B.LT.0.0)THEN
24336          WRITE(ICOUT,999)
24337          CALL DPWRST('XXX','BUG ')
24338          WRITE(ICOUT,1201)
24339          CALL DPWRST('XXX','BUG ')
24340          WRITE(ICOUT,1321)
24341 1321     FORMAT('      ROW 2 COLUMN 1 OF THE COUNTS TABLE IS ',
24342     1           'NEGATIVE.')
24343          CALL DPWRST('XXX','BUG ')
24344        ELSEIF(C.LT.0.0)THEN
24345          WRITE(ICOUT,999)
24346          CALL DPWRST('XXX','BUG ')
24347          WRITE(ICOUT,1201)
24348          CALL DPWRST('XXX','BUG ')
24349          WRITE(ICOUT,1331)
24350 1331     FORMAT('      ROW 1 COLUMN 2 OF THE COUNTS TABLE IS ',
24351     1           'NEGATIVE.')
24352          CALL DPWRST('XXX','BUG ')
24353        ELSEIF(D.LT.0.0)THEN
24354          WRITE(ICOUT,999)
24355          CALL DPWRST('XXX','BUG ')
24356          WRITE(ICOUT,1201)
24357          CALL DPWRST('XXX','BUG ')
24358          WRITE(ICOUT,1341)
24359 1341     FORMAT('      ROW 2 COLUMN 2 OF THE COUNTS TABLE IS ',
24360     1           'NEGATIVE.')
24361          CALL DPWRST('XXX','BUG ')
24362        ENDIF
24363C
24364      ENDIF
24365C
24366      CALL DISTIN(Y1,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
24367      IF(NDIST.EQ.1)THEN
24368        AVAL=XIDTEM(1)
24369        IF(ABS(AVAL).LE.0.5)THEN
24370          AVAL=0.0
24371        ELSE
24372          AVAL=1.0
24373        ENDIF
24374        DO2202I=1,N
24375          Y1(I)=1.0
24376 2202   CONTINUE
24377      ELSEIF(NDIST.EQ.2)THEN
24378        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
24379          DO2203I=1,N
24380            IF(Y1(I).NE.1.0)Y1(I)=0.0
24381 2203     CONTINUE
24382        ELSE
24383          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
24384          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
24385          DO2208I=1,N
24386            IF(Y1(I).EQ.ATEMP1)Y1(I)=0.0
24387            IF(Y1(I).EQ.ATEMP2)Y1(I)=1.0
24388 2208     CONTINUE
24389        ENDIF
24390      ELSE
24391        WRITE(ICOUT,999)
24392        CALL DPWRST('XXX','BUG ')
24393        WRITE(ICOUT,1201)
24394        CALL DPWRST('XXX','BUG ')
24395        WRITE(ICOUT,2211)
24396 2211   FORMAT('      RESPONSE VARIABLE ONE SHOULD CONTAIN AT MOST')
24397        CALL DPWRST('XXX','BUG ')
24398        WRITE(ICOUT,2213)
24399 2213   FORMAT('      TWO DISTINCT VALUES.')
24400        CALL DPWRST('XXX','BUG ')
24401        WRITE(ICOUT,2215)NDIST
24402 2215   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
24403        CALL DPWRST('XXX','BUG ')
24404        IERROR='YES'
24405        GOTO9000
24406      ENDIF
24407C
24408      CALL DISTIN(Y2,N,IWRITE,XIDTEM,NDIST,IBUGA3,IERROR)
24409      IF(NDIST.EQ.1)THEN
24410        AVAL=XIDTEM(1)
24411        IF(ABS(AVAL).LE.0.5)THEN
24412          AVAL=0.0
24413        ELSE
24414          AVAL=1.0
24415        ENDIF
24416        DO2302I=1,N
24417          Y2(I)=1.0
24418 2302   CONTINUE
24419      ELSEIF(NDIST.EQ.2)THEN
24420        IF(XIDTEM(1).EQ.1.0 .OR. XIDTEM(2).EQ.1.0)THEN
24421          DO2303I=1,N
24422            IF(Y2(I).NE.1.0)Y2(I)=0.0
24423 2303     CONTINUE
24424        ELSE
24425          ATEMP1=MIN(XIDTEM(1),XIDTEM(2))
24426          ATEMP2=MAX(XIDTEM(1),XIDTEM(2))
24427          DO2308I=1,N
24428            IF(Y2(I).EQ.ATEMP1)Y2(I)=0.0
24429            IF(Y2(I).EQ.ATEMP2)Y2(I)=1.0
24430 2308     CONTINUE
24431        ENDIF
24432      ELSE
24433        WRITE(ICOUT,999)
24434        CALL DPWRST('XXX','BUG ')
24435        WRITE(ICOUT,1201)
24436        CALL DPWRST('XXX','BUG ')
24437        WRITE(ICOUT,2311)
24438 2311   FORMAT('      RESPONSE VARIABLE TWO SHOULD CONTAIN AT MOST')
24439        CALL DPWRST('XXX','BUG ')
24440        WRITE(ICOUT,2313)
24441 2313   FORMAT('      TWO DISTINCT VALUES.')
24442        CALL DPWRST('XXX','BUG ')
24443        WRITE(ICOUT,2315)NDIST
24444 2315   FORMAT('      ',I8,' DISTINCT VALUES FOUND.')
24445        CALL DPWRST('XXX','BUG ')
24446        IERROR='YES'
24447        GOTO9000
24448      ENDIF
24449C
24450      A=0.0
24451      B=0.0
24452      C=0.0
24453      D=0.0
24454      DO2410I=1,N
24455        IF(Y1(I).EQ.1.0 .AND. Y2(I).EQ.1.0)THEN
24456          D=D+1.0
24457        ELSEIF(Y1(I).EQ.0.0 .AND. Y2(I).EQ.0.0)THEN
24458          A=A+1.0
24459        ELSEIF(Y1(I).EQ.1.0 .AND. Y2(I).EQ.0.0)THEN
24460          C=C+1.0
24461        ELSEIF(Y1(I).EQ.0.0 .AND. Y2(I).EQ.1.0)THEN
24462          B=B+1.0
24463        ENDIF
24464 2410 CONTINUE
24465C
24466 3000 CONTINUE
24467C
24468      IF(ICASL7.EQ.'BMDI')THEN
24469        STAT=(B+C)/(A+B+C+D)
24470        ISTAT='MATCHING DISSIMILARITY'
24471      ELSEIF(ICASL7.EQ.'BMSI')THEN
24472        STAT=(A+D)/(A+B+C+D)
24473        ISTAT='MATCHING SIMILARITY'
24474      ELSEIF(ICASL7.EQ.'BMRD')THEN
24475        ANUM=2.0*(B+C)
24476        DENOM=(A+D) + 2.0*(B+C)
24477        STAT=ANUM/DENOM
24478        ISTAT='ROGERS AND TANIMOTO DISSIMILARITY'
24479      ELSEIF(ICASL7.EQ.'BMRS')THEN
24480        ANUM=A+D
24481        DENOM=(A+D) + 2.0*(B+C)
24482        STAT=ANUM/DENOM
24483        ISTAT='ROGERS AND TANIMOTO SIMILARITY'
24484      ELSEIF(ICASL7.EQ.'BMSD')THEN
24485        ANUM=B+C
24486        DENOM=2.0*(A+D) + (B+C)
24487        STAT=ANUM/DENOM
24488        ISTAT='SOKAL AND SNEATH DISSIMILARITY'
24489      ELSEIF(ICASL7.EQ.'BMSS')THEN
24490        ANUM=2.0*(A+D)
24491        DENOM=2.0*(A+D) + (B+C)
24492        STAT=ANUM/DENOM
24493        ISTAT='SOKAL AND SNEATH SIMILARITY'
24494      ELSEIF(ICASL7.EQ.'BJDI')THEN
24495        ANUM=B+C
24496        DENOM=A+B+C
24497        IF(DENOM.GT.0.0)THEN
24498          STAT=ANUM/DENOM
24499        ELSE
24500          STAT=CPUMIN
24501        ENDIF
24502        ISTAT='JACCARD ASYMMETRIC DISSIMILARITY'
24503      ELSEIF(ICASL7.EQ.'BJSI')THEN
24504        ANUM=A
24505        DENOM=A+B+C
24506        IF(DENOM.GT.0.0)THEN
24507          STAT=ANUM/DENOM
24508        ELSE
24509          STAT=CPUMIN
24510        ENDIF
24511        ISTAT='JACCARD ASYMMETRIC SIMILARITY'
24512      ELSEIF(ICASL7.EQ.'BDDI')THEN
24513        ANUM=B+C
24514        DENOM=2.0*A+B+C
24515        IF(DENOM.GT.0.0)THEN
24516          STAT=ANUM/DENOM
24517        ELSE
24518          STAT=CPUMIN
24519        ENDIF
24520        ISTAT='DICE ASYMMETRIC DISSIMILARITY'
24521      ELSEIF(ICASL7.EQ.'BDSI')THEN
24522        ANUM=2.0*A
24523        DENOM=2.0*A+B+C
24524        IF(DENOM.GT.0.0)THEN
24525          STAT=ANUM/DENOM
24526        ELSE
24527          STAT=CPUMIN
24528        ENDIF
24529        ISTAT='DICE ASYMMETRIC SIMILARITY'
24530      ELSEIF(ICASL7.EQ.'BSDI')THEN
24531        ANUM=2.0*(B+C)
24532        DENOM=A+2.0*(B+C)
24533        IF(DENOM.GT.0.0)THEN
24534          STAT=ANUM/DENOM
24535        ELSE
24536          STAT=CPUMIN
24537        ENDIF
24538        ISTAT='SOKAL ASYMMETRIC DISSIMILARITY'
24539      ELSEIF(ICASL7.EQ.'BSSI')THEN
24540        ANUM=A
24541        DENOM=A+2.0*(B+C)
24542        IF(DENOM.GT.0.0)THEN
24543          STAT=ANUM/DENOM
24544        ELSE
24545          STAT=CPUMIN
24546        ENDIF
24547        ISTAT='SOKAL ASYMMETRIC SIMILARITY'
24548      ELSEIF(ICASL7.EQ.'YULQ' .OR. ICASL7.EQ.'GC22')THEN
24549        ANUM=A*D - B*C
24550        DENOM=A*D + B*C
24551        IF(DENOM.GT.0.0)THEN
24552          STAT=ANUM/DENOM
24553        ELSE
24554          STAT=CPUMIN
24555        ENDIF
24556        ISTAT='YULES Q'
24557      ELSEIF(ICASL7.EQ.'YOUD')THEN
24558        ANUM=A*D - B*C
24559        DENOM=(A+B)*(C+D)
24560        IF(DENOM.GT.0.0)THEN
24561          STAT=ANUM/DENOM
24562        ELSE
24563          STAT=CPUMIN
24564        ENDIF
24565        ISTAT='YOUDEN INDEX'
24566      ELSEIF(ICASL7.EQ.'YULY')THEN
24567        ANUM=SQRT(A*D) - SQRT(B*C)
24568        DENOM=SQRT(A*D) + SQRT(B*C)
24569        IF(DENOM.GT.0.0)THEN
24570          STAT=ANUM/DENOM
24571        ELSE
24572          STAT=CPUMIN
24573        ENDIF
24574        ISTAT='YULES Y'
24575      ENDIF
24576C
24577C               *******************************
24578C               **  STEP 3--                 **
24579C               **  WRITE OUT A LINE         **
24580C               **  OF SUMMARY INFORMATION.  **
24581C               *******************************
24582C
24583      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
24584        WRITE(ICOUT,999)
24585        CALL DPWRST('XXX','BUG ')
24586        WRITE(ICOUT,811)ISTAT,STAT
24587  811   FORMAT('THE ',A33,' COEFFICIENT = ',G15.7)
24588        CALL DPWRST('XXX','BUG ')
24589      ENDIF
24590C
24591C               *****************
24592C               **  STEP 90--  **
24593C               **  EXIT.      **
24594C               *****************
24595C
24596 9000 CONTINUE
24597      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'NMAT')THEN
24598        WRITE(ICOUT,999)
24599        CALL DPWRST('XXX','BUG ')
24600        WRITE(ICOUT,9011)
24601 9011   FORMAT('***** AT THE END OF BINMAT--')
24602        CALL DPWRST('XXX','BUG ')
24603        WRITE(ICOUT,9013)IERROR,A,B,C,D,STAT
24604 9013   FORMAT('IERROR,A,B,C,D,STAT = ',A4,2X,5G15.7)
24605        CALL DPWRST('XXX','BUG ')
24606      ENDIF
24607C
24608      RETURN
24609      END
24610      FUNCTION BINOM(N,M)
24611C***BEGIN PROLOGUE  BINOM
24612C***DATE WRITTEN   770701   (YYMMDD)
24613C***REVISION DATE  820801   (YYMMDD)
24614C***CATEGORY NO.  C1
24615C***KEYWORDS  BINOMIAL COEFFICIENTS,SPECIAL FUNCTION
24616C***AUTHOR  FULLERTON, W., (LANL)
24617C***PURPOSE  Computes the binomial coefficients.
24618C***DESCRIPTION
24619C
24620C BINOM(N,M) calculates the binomial coefficient (N!)/((M!)*(N-M)!).
24621C***REFERENCES  (NONE)
24622C***ROUTINES CALLED  ALNREL,R1MACH,R9LGMC,XERROR
24623C***END PROLOGUE  BINOM
24624      DOUBLE PRECISION D9LGMC
24625      INCLUDE 'DPCOMC.INC'
24626C
24627      INCLUDE 'DPCOP2.INC'
24628C
24629      DATA SQ2PIL / 0.9189385332 0467274E0 /
24630      DATA BILNMX, FINTMX / 0.0, 0.0 /
24631C***FIRST EXECUTABLE STATEMENT  BINOM
24632C
24633      BINOM=0.0
24634C
24635      IF (BILNMX.NE.0.0) GO TO 10
24636      BILNMX = LOG (R1MACH(2))
24637      FINTMX = 0.9/R1MACH(3)
24638C
24639 10   CONTINUE
24640      IF(N.LT.0)THEN
24641        WRITE(ICOUT,1)
24642 1      FORMAT('***** ERROR: FIRST ARGUMENT TO BINOM IS NEGATIVE.')
24643        CALL DPWRST('XXX','BUG ')
24644        GOTO9000
24645      ENDIF
24646      IF(M.LT.0)THEN
24647        WRITE(ICOUT,2)
24648 2      FORMAT('***** ERROR: SECOND ARGUMENT TO BINOM IS NEGATIVE.')
24649        CALL DPWRST('XXX','BUG ')
24650        GOTO9000
24651      ENDIF
24652      IF (N.LT.M) THEN
24653        WRITE(ICOUT,3)
24654 3      FORMAT('***** ERROR: FIRST ARGUMENT TO BINOM IS LESS THAN ',
24655     1         'SECOND ARGUMENT.')
24656        CALL DPWRST('XXX','BUG ')
24657        GOTO9000
24658      ENDIF
24659C
24660      K = MIN0 (M, N-M)
24661      IF (K.GT.20) GO TO 30
24662      IF (FLOAT(K)*LOG(AMAX0(N,1)).GT.BILNMX) GO TO 30
24663C
24664      BINOM = 1.
24665      IF (K.EQ.0) GOTO9000
24666C
24667      DO 20 I=1,K
24668        BINOM = BINOM * FLOAT(N-I+1)/FLOAT(I)
24669 20   CONTINUE
24670C
24671      IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
24672      GOTO9000
24673C
24674C IF K.LT.9, APPROX IS NOT VALID AND ANSWER IS CLOSE TO THE OVERFLOW LIM
24675 30   CONTINUE
24676      IF (K.LT.9) THEN
24677        WRITE(ICOUT,31)
24678 31     FORMAT('***** ERROR: BINOM OVERFLOWS BECAUSE ONE (OR BOTH) OF ',
24679     1         'THE ARGUMENTS IS TOO LARGE.')
24680        CALL DPWRST('XXX','BUG ')
24681        GOTO9000
24682      ENDIF
24683C
24684      XN = N + 1
24685      XK = K + 1
24686      XNK = N - K + 1
24687C
24688      CORR = SNGL(D9LGMC(DBLE(XN))) - SNGL(D9LGMC(DBLE(XK))) -
24689     1       SNGL(D9LGMC(DBLE(XNK)))
24690      BINOM = XK*LOG(XNK/XK) - XN*ALNREL(-(XK-1.)/XN)
24691     1  - 0.5*LOG(XN*XNK/XK) + 1.0 - SQ2PIL + CORR
24692C
24693      IF (BINOM.GT.BILNMX) THEN
24694C
24695        WRITE(ICOUT,41)
24696 41     FORMAT('***** ERROR: BINOM OVERFLOWS BECAUSE ONE (OR BOTH) OF ',
24697     1         'THE ARGUMENTS IS TOO LARGE.')
24698        CALL DPWRST('XXX','BUG ')
24699        GOTO9000
24700      ENDIF
24701      BINOM = EXP (BINOM)
24702      IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
24703C
24704 9000 CONTINUE
24705      RETURN
24706      END
24707      SUBROUTINE BINPDF(X,P,N,PDF)
24708C
24709C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY MASS
24710C              FUNCTION VALUE AT THE DOUBLE PRECISION VALUE X FOR THE
24711C              BINOMIAL DISTRIBUTION WITH DOUBLE PRECISION 'BERNOULLI
24712C              PROBABILITY' PARAMETER = P, AND INTEGER 'NUMBER OF
24713C              BERNOULLI TRIALS' PARAMETER = N.  THE BINOMIAL
24714C              DISTRIBUTION USED HEREIN HAS MEAN = N*P AND
24715C              STANDARD DEVIATION = SQRT(N*P*(1-P)).  THIS DISTRIBUTION
24716C              IS DEFINED FOR ALL DISCRETE INTEGER X BETWEEN 0
24717C              (INCLUSIVELY) AND N (INCLUSIVELY).
24718C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
24719C
24720C                 p(X;P,N) = C(N,X) * P**X * (1-P)**(N-X).
24721C
24722C              WHERE C(N,X) IS THE COMBINATORIAL FUNCTION
24723C              EQUALING THE NUMBER OF COMBINATIONS OF N ITEMS
24724C              TAKEN X AT A TIME.  THE BINOMIAL DISTRIBUTION IS THE
24725C              DISTRIBUTION OF THE NUMBER OF SUCCESSES IN N BERNOULLI
24726C              (0,1) TRIALS WHERE THE PROBABILITY OF SUCCESS
24727C              IN A SINGLE TRIAL = P.
24728C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT WHICH
24729C                                THE PORBABILITY MASS FUNCTION
24730C                                IS TO BE EVALUATED.  X SHOULD BE
24731C                                INTEGRAL-VALUED, AND BETWEEN 0.0
24732C                                AND N (INCLUSIVELY).
24733C                     --P      = THE DOUBLE PRECISION VALUE OF THE
24734C                                'BERNOULLI PROBABILITY' PARAMETER FOR
24735C                                THE BINOMIAL DISTRIBUTION.  P SHOULD BE
24736C                                BETWEEN 0.0 (EXCLUSIVELY) AND
24737C                                1.0 (INCLUSIVELY).
24738C                     --N      = THE INTEGER VALUE OF THE 'NUMBER OF
24739C                                BERNOULLI TRIALS' PARAMETER.
24740C                                N SHOULD BE A POSITIVE INTEGER.
24741C     OUTPUT ARGUMENTS--PDF    = THE DOUBLE PRECISION PROBABILITY MASS
24742C                                FUNCTION VALUE.
24743C     OUTPUT--THE DOUBLE PRECISION PROBABILITY MASS FUNCTION VALUE PDF
24744C             FOR THE BINOMIAL DISTRIBUTION WITH 'BERNOULLI PROBABILITY'
24745C             PARAMETER = P AND 'NUMBER OF BERNOULLI TRIALS'
24746C             PARAMETER = N.
24747C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24748C     RESTRICTIONS--X SHOULD BE INTEGRAL-VALUED, AND BETWEEN 0.0
24749C                  (INCLUSIVELY) AND N (INCLUSIVELY).
24750C                 --P SHOULD BE BETWEEN 0.0 (INCLUSIVELY) AND 1.0
24751C                   (INCLUSIVELY).
24752C                 --N SHOULD BE A POSITIVE INTEGER.
24753C     OTHER DATAPAC   SUBROUTINES NEEDED--BINRAW.
24754C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE
24755C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
24756C     LANGUAGE--ANSI FORTRAN (1977)
24757C     REFERENCES--CATHERINE LOADER (2000), "FAST AND ACCURATE COMPUTATION
24758C                 OF BINOMIAL PROBABILITIES", BELL LABS?
24759C     WRITTEN BY--JAMES J. FILLIBEN
24760C                 STATISTICAL ENGINEERING DIVISION
24761C                 INFORMATION TECHNOLOGY LABORATORY
24762C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24763C                 GAITHERSBURG, MD 20899-8980
24764C                 PHONE--301-921-3651
24765C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24766C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
24767C     LANGUAGE--ANSI FORTRAN (1977)
24768C     VERSION NUMBER--2009/3
24769C     ORIGINAL VERSION--MARCH     2009.
24770C
24771C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24772C
24773C---------------------------------------------------------------------
24774C
24775      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
24776C
24777C---------------------------------------------------------------------
24778C
24779      INCLUDE 'DPCOP2.INC'
24780C
24781C-----START POINT-----------------------------------------------------
24782C
24783C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24784C
24785      PDF=0.0D0
24786      DN=DBLE(N)
24787C
24788      IF(P.LT.0.0D0 .OR. P.GT.1.0D0)THEN
24789        WRITE(ICOUT,11)
24790        CALL DPWRST('XXX','BUG ')
24791        WRITE(ICOUT,46)P
24792        CALL DPWRST('XXX','BUG ')
24793        GOTO9000
24794      ELSEIF(N.LT.0)THEN
24795        WRITE(ICOUT,25)
24796        CALL DPWRST('XXX','BUG ')
24797        WRITE(ICOUT,47)N
24798        CALL DPWRST('XXX','BUG ')
24799        GOTO9000
24800      ELSEIF(X.LT.0.0D0 .OR. X.GT.DN)THEN
24801        WRITE(ICOUT,4)N
24802        CALL DPWRST('XXX','BUG ')
24803        WRITE(ICOUT,46)X
24804        CALL DPWRST('XXX','BUG ')
24805        GOTO9000
24806      ENDIF
24807    4 FORMAT('***** WARNING--THE FIRST ARGUMENT TO BINPDF IS OUTSIDE ',
24808     1       'THE (0,N) = (0,',I8,') INTERVAL')
24809   11 FORMAT('***** ERROR--THE SECOND ARGUMENT TO BINPDF IS OUTSIDE ',
24810     1       'THE ALLOWABLE (0,1) INTERVAL')
24811   25 FORMAT('***** ERROR--THE THIRD ARGUMENT TO BINPDF IS ',
24812     1       'NON-POSITIVE')
24813   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
24814   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I10)
24815C
24816      INTX=INT(X+0.0001D0)
24817      DX=DBLE(INTX)
24818      DQ=1.0D0 - P
24819      ILOG=0
24820C
24821      CALL BINRAW(DX,P,DQ,DN,PDF,ILOG)
24822C
24823 9000 CONTINUE
24824      RETURN
24825      END
24826      SUBROUTINE BINPPF(P,PPAR,N,PPF)
24827C
24828C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT FUNCTION
24829C              VALUE AT THE DOUBLE PRECISION VALUE P FOR THE BINOMIAL
24830C              DISTRIBUTION WITH DOUBLE PRECISION 'BERNOULLI PROBABILITY'
24831C              PARAMETER = PPAR, AND INTEGER 'NUMBER OF BERNOULLI
24832C              TRIALS' C              PARAMETER = N.  THE BINOMIAL
24833C              DISTRIBUTION USED HEREIN HAS MEAN = N*PPAR AND
24834C              STANDARD DEVIATION = SQRT(N*PPAR*(1-PPAR)).  THIS
24835C              DISTRIBUTION IS DEFINED FOR ALL DISCRETE INTEGER X
24836C              BETWEEN 0 (INCLUSIVELY) AND N (INCLUSIVELY).
24837C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
24838C
24839C                 p(X;P,N) = C(N,X) * PPAR**X * (1-PPAR)**(N-X).
24840C
24841C              WHERE C(N,X) IS THE COMBINATORIAL FUNCTION EQUALING THE
24842C              NUMBER OF COMBINATIONS OF N ITEMS TAKEN X AT A TIME.
24843C              THE BINOMIAL DISTRIBUTION IS THE DISTRIBUTION OF THE
24844C              NUMBER OF SUCCESSES IN N BERNOULLI (0,1) TRIALS WHERE
24845C              THE PROBABILITY OF SUCCESS IN A SINGLE TRIAL = PPAR.
24846C              NOTE THAT THE PERCENT POINT FUNCTION OF A DISTRIBUTION
24847C              IS IDENTICALLY THE SAME AS THE INVERSE CUMULATIVE
24848C              DISTRIBUTION FUNCTION OF THE DISTRIBUTION.
24849C     INPUT  ARGUMENTS--P      = THE DOUBLE PRECISION VALUE (BETWEEN
24850C                                0.0 (INCLUSIVELY) AND 1.0
24851C                                (INCLUSIVELY)) AT WHICH THE PERCENT
24852C                                POINT FUNCTION IS TO BE EVALUATED.
24853C                     --PPAR   = THE DOUBLE PRECISION VALUE OF THE
24854C                                'BERNOULLI PROBABILITY' PARAMETER FOR
24855C                                THE BINOMIAL DISTRIBUTION.  PPAR SHOULD
24856C                                BE BETWEEN 0.0 (EXCLUSIVELY) AND
24857C                                1.0 (EXCLUSIVELY).
24858C                     --N      = THE INTEGER VALUE OF THE 'NUMBER OF
24859C                                BERNOULLI TRIALS' PARAMETER.  N SHOULD
24860C                                BE A POSITIVE INTEGER.
24861C     OUTPUT ARGUMENTS--PPF    = THE DOUBLE PRECISION PERCENT
24862C                                POINT FUNCTION VALUE.
24863C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT FUNCTION VALUE PPF
24864C             FOR THE BINOMIAL DISTRIBUTION WITH 'BERNOULLI PROBABILITY'
24865C             PARAMETER = PPAR AND 'NUMBER OF BERNOULLI TRIALS'
24866C             PARAMETER = N.
24867C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
24868C     RESTRICTIONS--PPAR SHOULD BE BETWEEN 0.0 (INCLUSIVELY) AND 1.0
24869C                  (EXCLUSIVELY).
24870C                 --N SHOULD BE A POSITIVE INTEGER.
24871C                 --P SHOULD BE BETWEEN 0.0 (INCLUSIVELY) AND 1.0
24872C                   (INCLUSIVELY).
24873C     OTHER DATAPAC   SUBROUTINES NEEDED--NORPPF, BINCDF.
24874C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
24875C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
24876C     LANGUAGE--ANSI FORTRAN (1977)
24877C     REFERENCES--JOHNSON AND KOTZ, DISCRETE
24878C                 DISTRIBUTIONS, 1969, PAGES 50-86,
24879C                 ESPECIALLY PAGE 64, FORMULA 36.
24880C               --HASTINGS AND PEACOCK, STATISTICAL
24881C                 DISTRIBUTIONS--A HANDBOOK FOR
24882C                 STUDENTS AND PRACTITIONERS, 1975,
24883C                 PAGES 36-41.
24884C               --NATIONAL BUREAU OF STANDARDS APPLIED MATHEMATICS
24885C                 SERIES 55, 1964, PAGE 929.
24886C               --FELLER, AN INTRODUCTION TO PROBABILITY
24887C                 THEORY AND ITS APPLICATIONS, VOLUME 1,
24888C                 EDITION 2, 1957, PAGES 135-142.
24889C               --KENDALL AND STUART, THE ADVANCED THEORY OF
24890C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 120-125.
24891C               --MOOD AND GRABLE, INTRODUCTION TO THE THEORY
24892C                 OF STATISTICS, EDITION 2, 1963, PAGES 64-69.
24893C               --OWEN, HANDBOOK OF STATISTICAL
24894C                 TABLES, 1962, PAGES 264-272.
24895C     WRITTEN BY--JAMES J. FILLIBEN
24896C                 STATISTICAL ENGINEERING DIVISION
24897C                 INFORMATION TECHNOLOGY LABORATORY
24898C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
24899C                 GAITHERSBURG, MD 20899-8980
24900C                 PHONE--301-921-3651
24901C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
24902C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
24903C     LANGUAGE--ANSI FORTRAN (1977)
24904C     VERSION NUMBER--82/7
24905C     ORIGINAL VERSION--NOVEMBER  1975.
24906C     UPDATED         --OCTOBER   1978.
24907C     UPDATED         --DECEMBER  1981.
24908C     UPDATED         --MAY       1982.
24909C     UPDATED         --MARCH     2009. MAKE DOUBLE PRECISION
24910C
24911C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
24912C
24913C---------------------------------------------------------------------
24914C
24915      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
24916C
24917C---------------------------------------------------------------------
24918C
24919      INCLUDE 'DPCOP2.INC'
24920C
24921C-----START POINT-----------------------------------------------------
24922C
24923C     CHECK THE INPUT ARGUMENTS FOR ERRORS
24924C
24925      PPF=0.0D0
24926      IF(P.LT.0.0D0 .OR. P.GT.1.0D0)THEN
24927        WRITE(ICOUT,1)
24928        CALL DPWRST('XXX','BUG ')
24929        WRITE(ICOUT,46)P
24930        CALL DPWRST('XXX','BUG ')
24931        GOTO9000
24932      ELSEIF(PPAR.LT.0.0D0 .OR. PPAR.GT.1.0D0)THEN
24933        WRITE(ICOUT,11)
24934        CALL DPWRST('XXX','BUG ')
24935        WRITE(ICOUT,46)PPAR
24936        CALL DPWRST('XXX','BUG ')
24937        GOTO9000
24938      ELSEIF(N.LT.1)THEN
24939        WRITE(ICOUT,25)
24940        CALL DPWRST('XXX','BUG ')
24941        WRITE(ICOUT,47)N
24942        CALL DPWRST('XXX','BUG ')
24943        GOTO9000
24944      ENDIF
24945C
24946    1 FORMAT('***** ERROR--THE FIRST ARGUMENT TO BINPPF IS OUTSIDE ',
24947     1       'THE ALLOWABLE (0,1) INTERVAL')
24948   11 FORMAT('***** ERROR--THE SECOND ARGUMENT TO BINPPF IS OUTSIDE ',
24949     1       'THE ALLOWABLE (0,1) INTERVAL')
24950   25 FORMAT('***** ERROR--THE THIRD ARGUMENT TO BINPPF IS ',
24951     1       'NON-POSITIVE')
24952   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
24953   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
24954C
24955      DN=DBLE(N)
24956      DPPAR=PPAR
24957      IX0=0
24958      IX1=0
24959      IX2=0
24960      P0=0.0D0
24961      P1=0.0D0
24962      P2=0.0D0
24963C
24964C     TREAT CERTAIN SPECIAL CASES IMMEDIATELY--
24965C     1) P = 0.0 OR 1.0
24966C     2) P = 0.5 AND PPAR = 0.5
24967C     3) PPF = 0 OR N
24968C
24969      IF(P.EQ.0.0D0)THEN
24970        PPF=0.0D0
24971        GOTO9000
24972      ELSEIF(P.EQ.1.0D0)THEN
24973        PPF=DBLE(N)
24974        GOTO9000
24975      ELSEIF(P.EQ.0.5D0 .AND. PPAR.EQ.0.5D0)THEN
24976        IPPF=N/2
24977        PPF=DBLE(IPPF)
24978        GOTO9000
24979      ENDIF
24980C
24981      PF0=(1.0D0-DPPAR)**N
24982      QFN=1.0D0-(DPPAR**N)
24983      IF(P.LE.PF0)THEN
24984        PPF=0.0D0
24985        GOTO9000
24986      ELSEIF(P.GT.QFN)THEN
24987        PPF=DBLE(N)
24988        GOTO9000
24989      ENDIF
24990C
24991C     DETERMINE AN INITIAL APPROXIMATION TO THE BINOMIAL
24992C     PERCENT POINT BY USE OF THE NORMAL APPROXIMATION
24993C     TO THE BINOMIAL.
24994C     (SEE JOHNSON AND KOTZ, DISCRETE DISTRIBUTIONS,
24995C     PAGE 64, FORMULA 36).
24996C
24997      AMEAN=DN*DPPAR
24998      SD=SQRT(DN*DPPAR*(1.0D0-DPPAR))
24999      CALL NODPPF(P,ZPPF)
25000      X2=AMEAN-0.5D0+ZPPF*SD
25001      IX2=INT(X2)
25002C
25003C     CHECK AND MODIFY (IF NECESSARY) THIS INITIAL
25004C     ESTIMATE OF THE PERCENT POINT
25005C     TO ASSURE THAT IT BE IN THE CLOSED INTERVAL 0 TO N.
25006C
25007      IF(IX2.LT.0)IX2=0
25008      IF(IX2.GT.N)IX2=N
25009C
25010C     DETERMINE UPPER AND LOWER BOUNDS ON THE DESIRED
25011C     PERCENT POINT BY ITERATING OUT (BOTH BELOW AND ABOVE)
25012C     FROM THE ORIGINAL APPROXIMATION AT STEPS
25013C     OF 1 STANDARD DEVIATION.
25014C     THE RESULTING BOUNDS WILL BE AT MOST
25015C     1 STANDARD DEVIATION APART.
25016C
25017      IX0=0
25018      IX1=N
25019      ISD=INT(SD+1.0D0)
25020      X2=REAL(IX2)
25021      CALL BINCDF(X2,DPPAR,N,P2)
25022C
25023      IF(P2.LT.P)THEN
25024        IX0=IX2
25025        I=0
25026  215   CONTINUE
25027        I=I+1
25028        IF(I.GT.1000000)THEN
25029          WRITE(ICOUT,249)
25030  249     FORMAT('***** INTERNAL ERROR IN BINPPF SUBROUTINE *****')
25031          CALL DPWRST('XXX','BUG ')
25032          WRITE(ICOUT,222)
25033  222     FORMAT('      NO UPPER BOUND FOUND AFTER 10**7 ITERATIONS')
25034          CALL DPWRST('XXX','BUG ')
25035          GOTO950
25036        ENDIF
25037        IX2=IX0+ISD
25038        IF(IX2.GE.IX1)GOTO275
25039        X2=IX2
25040        CALL BINCDF(X2,DPPAR,N,P2)
25041        IF(P2.GE.P)THEN
25042          IX1=IX2
25043          GOTO275
25044        ENDIF
25045        IX0=IX2
25046        GOTO215
25047C
25048      ELSE
25049C
25050        IX1=IX2
25051        I=0
25052  255   CONTINUE
25053        I=I+1
25054        IF(I.GT.1000000)THEN
25055          WRITE(ICOUT,249)
25056          CALL DPWRST('XXX','BUG ')
25057          WRITE(ICOUT,262)
25058  262     FORMAT('      NO LOWER BOUND FOUND AFTER 10**7 ITERATIONS')
25059          CALL DPWRST('XXX','BUG ')
25060          GOTO950
25061        ENDIF
25062        IX2=IX1-ISD
25063        IF(IX2.LE.IX0)GOTO275
25064        X2=IX2
25065        CALL BINCDF(X2,PPAR,N,P2)
25066        IF(P2.LT.P)THEN
25067          IX0=IX2
25068        ELSE
25069          IX1=IX2
25070          GOTO255
25071        ENDIF
25072      ENDIF
25073C
25074  275 CONTINUE
25075      IF(IX0.EQ.IX1)THEN
25076        IF(IX0.EQ.0)THEN
25077          IX1=IX1+1
25078        ELSEIF(IX0.EQ.N)THEN
25079          IX0=IX0-1
25080        ELSE
25081          WRITE(ICOUT,249)
25082          CALL DPWRST('XXX','BUG ')
25083          WRITE(ICOUT,282)
25084  282     FORMAT('      LOWER AND UPPER BOUND IDENTICAL')
25085          CALL DPWRST('XXX','BUG ')
25086          GOTO950
25087        ENDIF
25088      ENDIF
25089C
25090C     COMPUTE BINOMIAL PROBABILITIES FOR THE
25091C     DERIVED LOWER AND UPPER BOUNDS.
25092C
25093      X0=IX0
25094      X1=IX1
25095      CALL BINCDF(X0,PPAR,N,P0)
25096      CALL BINCDF(X1,PPAR,N,P1)
25097C
25098C     CHECK THE PROBABILITIES FOR PROPER ORDERING
25099C
25100      IF(P0.LT.P.AND.P.LE.P1)THEN
25101        GOTO490
25102      ELSEIF(P0.EQ.P)THEN
25103        PPF=DBLE(IX0)
25104        GOTO9000
25105      ELSEIF(P1.EQ.P)THEN
25106        PPF=DBLE(IX1)
25107        GOTO9000
25108      ELSEIF(P0.GT.P1)THEN
25109        WRITE(ICOUT,249)
25110        CALL DPWRST('XXX','BUG ')
25111        WRITE(ICOUT,431)
25112  431   FORMAT('      LOWER BOUND PROBABILITY (P0) GREATER THAN ',
25113     1         'UPPER BOUND PROBABILITY (P1)')
25114        CALL DPWRST('XXX','BUG ')
25115        GOTO950
25116      ELSEIF(P0.GT.P)THEN
25117        WRITE(ICOUT,249)
25118        CALL DPWRST('XXX','BUG ')
25119        WRITE(ICOUT,441)
25120  441   FORMAT('      LOWER BOUND PROBABILITY (P0) GREATER THAN ',
25121     1         'INPUT PROBABILITY (P)')
25122        CALL DPWRST('XXX','BUG ')
25123        GOTO950
25124      ELSEIF(P1.LT.P)THEN
25125        WRITE(ICOUT,249)
25126        CALL DPWRST('XXX','BUG ')
25127        WRITE(ICOUT,451)
25128  451   FORMAT('      UPPER BOUND PROBABILITY (P1) LESS    THAN ',
25129     1         'INPUT PROBABILITY (P)')
25130        CALL DPWRST('XXX','BUG ')
25131        GOTO950
25132      ELSE
25133        WRITE(ICOUT,249)
25134        CALL DPWRST('XXX','BUG ')
25135        WRITE(ICOUT,401)
25136  401   FORMAT('IMPOSSIBLE BRANCH CONDITION ENCOUNTERED')
25137        CALL DPWRST('XXX','BUG ')
25138        GOTO950
25139      ENDIF
25140  490 CONTINUE
25141C
25142C     THE STOPPING CRITERION IS THAT THE LOWER BOUND
25143C     AND UPPER BOUND ARE EXACTLY 1 UNIT APART.
25144C     CHECK TO SEE IF IX1 = IX0 + 1;
25145C     IF SO, THE ITERATIONS ARE COMPLETE;
25146C     IF NOT, THEN BISECT, COMPUTE PROBABILIIES,
25147C     CHECK PROBABILITIES, AND CONTINUE ITERATING
25148C     UNTIL IX1 = IX0 + 1.
25149C
25150  300 CONTINUE
25151C
25152      IX0P1=IX0+1
25153      IF(IX1.EQ.IX0P1)THEN
25154        PPF=IX1
25155        IF(P0.EQ.P)PPF=IX0
25156        GOTO9000
25157      ENDIF
25158      IX2=(IX0+IX1)/2
25159      IF(IX2.EQ.IX0)THEN
25160        WRITE(ICOUT,249)
25161        CALL DPWRST('XXX','BUG ')
25162        WRITE(ICOUT,611)
25163  611   FORMAT('BISECTION VALUE (X2) = LOWER BOUND (X0)')
25164        CALL DPWRST('XXX','BUG ')
25165        GOTO950
25166      ELSEIF(IX2.EQ.IX1)THEN
25167        WRITE(ICOUT,249)
25168        CALL DPWRST('XXX','BUG ')
25169        WRITE(ICOUT,621)
25170  621   FORMAT('BISECTION VALUE (X2) = UPPER BOUND (X1)')
25171        CALL DPWRST('XXX','BUG ')
25172        GOTO950
25173      ENDIF
25174      X2=IX2
25175      CALL BINCDF(X2,PPAR,N,P2)
25176      IF(P0.LT.P2.AND.P2.LT.P1)THEN
25177        IF(P2.LE.P)THEN
25178          IX0=IX2
25179          P0=P2
25180        ELSE
25181          IX1=IX2
25182          P1=P2
25183        ENDIF
25184        GOTO300
25185      ELSEIF(P2.LE.P0)THEN
25186        WRITE(ICOUT,249)
25187        CALL DPWRST('XXX','BUG ')
25188        WRITE(ICOUT,641)
25189  641   FORMAT('BISECTION VALUE PROBABILITY (P2) ',
25190     1         'LESS THAN LOWER BOUND PROBABILITY (P0)')
25191        CALL DPWRST('XXX','BUG ')
25192        GOTO950
25193      ELSEIF(P2.GE.P1)THEN
25194        WRITE(ICOUT,249)
25195        CALL DPWRST('XXX','BUG ')
25196        WRITE(ICOUT,651)
25197  651   FORMAT('BISECTION VALUE PROBABILITY (P2) ',
25198     1         'GREATER THAN UPPER BOUND PROBABILITY (P1)')
25199        CALL DPWRST('XXX','BUG ')
25200        GOTO950
25201      ENDIF
25202C
25203  950 CONTINUE
25204      WRITE(ICOUT,240)IX0,P0
25205  240 FORMAT('IX0  = ',I8,10X,'P0 = ',F14.7)
25206      CALL DPWRST('XXX','BUG ')
25207      WRITE(ICOUT,241)IX1,P1
25208  241 FORMAT('IX1  = ',I8,10X,'P1 = ',F14.7)
25209      CALL DPWRST('XXX','BUG ')
25210      WRITE(ICOUT,242)IX2,P2
25211  242 FORMAT('IX2  = ',I8,10X,'P2 = ',F14.7)
25212      CALL DPWRST('XXX','BUG ')
25213      WRITE(ICOUT,244)P
25214  244 FORMAT('P    = ',F14.7)
25215      CALL DPWRST('XXX','BUG ')
25216      WRITE(ICOUT,245)PPAR,N
25217  245 FORMAT('PPAR = ',F14.7,10X,'N  = ',I8)
25218      CALL DPWRST('XXX','BUG ')
25219      GOTO9000
25220C
25221 9000 CONTINUE
25222      RETURN
25223      END
25224      SUBROUTINE BINRAN(N,P,NPAR,ISEED,X)
25225C
25226C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
25227C              FROM THE BINOMIAL DISTRIBUTION
25228C              WITH SINGLE PRECISION 'BERNOULLI PROBABILITY'
25229C              PARAMETER = P,
25230C              AND INTEGER 'NUMBER OF BERNOULLI TRIALS'
25231C              PARAMETER = NPAR.
25232C              THE BINOMIAL DISTRIBUTION USED
25233C              HEREIN HAS MEAN = NPAR*P
25234C              AND STANDARD DEVIATION = SQRT(NPAR*P*(1-P)).
25235C              THIS DISTRIBUTION IS DEFINED FOR ALL
25236C              DISCRETE INTEGER X BETWEEN 0 (INCLUSIVELY)
25237C              AND NPAR (INCLUSIVELY).
25238C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
25239C              F(X) = C(NPAR,X) * P**X * (1-P)**(NPAR-X).
25240C              WHERE C(NPAR,X) IS THE COMBINATORIAL FUNCTION
25241C              EQUALING THE NUMBER OF COMBINATIONS OF NPAR ITEMS
25242C              TAKEN X AT A TIME.
25243C              THE BINOMIAL DISTRIBUTION IS THE
25244C              DISTRIBUTION OF THE NUMBER OF
25245C              SUCCESSES IN NPAR BERNOULLI (0,1)
25246C              TRIALS WHERE THE PROBABILITY OF SUCCESS
25247C              IN A SINGLE TRIAL = P.
25248C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
25249C                                OF RANDOM NUMBERS TO BE
25250C                                GENERATED.
25251C                     --P      = THE SINGLE PRECISION VALUE
25252C                                OF THE 'BERNOULLI PROBABILITY'
25253C                                PARAMETER FOR THE BINOMIAL
25254C                                DISTRIBUTION.
25255C                                P SHOULD BE BETWEEN
25256C                                0.0 (EXCLUSIVELY) AND
25257C                                1.0 (EXCLUSIVELY).
25258C                     --NPAR   = THE INTEGER VALUE
25259C                                OF THE 'NUMBER OF BERNOULLI TRIALS'
25260C                                PARAMETER.
25261C                                NPAR SHOULD BE A POSITIVE INTEGER.
25262C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
25263C                                (OF DIMENSION AT LEAST N)
25264C                                INTO WHICH THE GENERATED
25265C                                RANDOM SAMPLE WILL BE PLACED.
25266C     OUTPUT--A RANDOM SAMPLE OF SIZE N
25267C             FROM THE BINOMIAL DISTRIBUTION
25268C             WITH 'BERNOULLI PROBABILITY' PARAMETER = P
25269C             AND 'NUMBER OF BERNOULLI TRIALS' PARAMETER = NPAR.
25270C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
25271C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
25272C                   OF N FOR THIS SUBROUTINE.
25273C                 --P SHOULD BE BETWEEN 0.0 (EXCLUSIVELY)
25274C                   AND 1.0 (EXCLUSIVELY).
25275C                 --NPAR SHOULD BE A POSITIVE INTEGER.
25276C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, GEORAN.
25277C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
25278C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
25279C     LANGUAGE--ANSI FORTRAN (1977)
25280C     COMMENT--NOTE THAT EVEN THOUGH THE OUTPUT
25281C              FROM THIS DISCRETE RANDOM NUMBER
25282C              GENERATOR MUST NECESSARILY BE A
25283C              SEQUENCE OF ***INTEGER*** VALUES,
25284C              THE OUTPUT VECTOR X IS SINGLE
25285C              PRECISION IN MODE.
25286C              X HAS BEEN SPECIFIED AS SINGLE
25287C              PRECISION SO AS TO CONFORM WITH THE DATAPAC
25288C              CONVENTION THAT ALL OUTPUT VECTORS FROM ALL
25289C              DATAPAC SUBROUTINES ARE SINGLE PRECISION.
25290C              THIS CONVENTION IS BASED ON THE BELIEF THAT
25291C              1) A MIXTURE OF MODES (FLOATING POINT
25292C              VERSUS INTEGER) IS INCONSISTENT AND
25293C              AN UNNECESSARY COMPLICATION
25294C              IN A DATA ANALYSIS; AND
25295C              2) FLOATING POINT MACHINE ARITHMETIC
25296C              (AS OPPOSED TO INTEGER ARITHMETIC)
25297C              IS THE MORE NATURAL MODE FOR DOING
25298C              DATA ANALYSIS.
25299C     REFERENCES--JOHNSON AND KOTZ, DISCRETE
25300C                 DISTRIBUTIONS, 1969, PAGES 50-86.
25301C               --HASTINGS AND PEACOCK, STATISTICAL
25302C                 DISTRIBUTIONS--A HANDBOOK FOR
25303C                 STUDENTS AND PRACTITIONERS, 1975,
25304C                 PAGE 41.
25305C               --FELLER, AN INTRODUCTION TO PROBABILITY
25306C                 THEORY AND ITS APPLICATIONS, VOLUME 1,
25307C                 EDITION 2, 1957, PAGES 135-142.
25308C               --NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY APPLIED MATHEMATICS
25309C                 SERIES 55, 1964, PAGE 929.
25310C               --KENDALL AND STUART, THE ADVANCED THEORY OF
25311C                 STATISTICS, VOLUME 1, EDITION 2, 1963, PAGES 120-125.
25312C               --MOOD AND GRABLE, INTRODUCTION TO THE THEORY
25313C                 OF STATISTICS, EDITION 2, 1963, PAGES 64-69.
25314C               --TOCHER, THE ART OF SIMULATION,
25315C                 1963, PAGES 39-40.
25316C     WRITTEN BY--JAMES J. FILLIBEN
25317C                 STATISTICAL ENGINEERING DIVISION
25318C                 INFORMATION TECHNOLOGY LABORATORY
25319C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25320C                 GAITHERSBURG, MD 20899-8980
25321C                 PHONE--301-921-3651
25322C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25323C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
25324C     LANGUAGE--ANSI FORTRAN (1966)
25325C     VERSION NUMBER--82/7
25326C     ORIGINAL VERSION--NOVEMBER  1975.
25327C     UPDATED         --DECEMBER  1981.
25328C     UPDATED         --MAY       1982.
25329C
25330C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25331C
25332C---------------------------------------------------------------------
25333C
25334      DIMENSION X(*)
25335C
25336      DIMENSION U(2)
25337      DIMENSION G(2)
25338C
25339C---------------------------------------------------------------------
25340C
25341      INCLUDE 'DPCOP2.INC'
25342C
25343C-----START POINT-----------------------------------------------------
25344C
25345C     CHECK THE INPUT ARGUMENTS FOR ERRORS
25346C
25347      IF(N.LT.1)GOTO50
25348      IF(P.LE.0.0.OR.P.GE.1.0)GOTO55
25349      IF(NPAR.LT.1)GOTO60
25350      GOTO90
25351   50 WRITE(ICOUT, 5)
25352      CALL DPWRST('XXX','BUG ')
25353      WRITE(ICOUT,47)N
25354      CALL DPWRST('XXX','BUG ')
25355      RETURN
25356   55 WRITE(ICOUT,11)
25357      CALL DPWRST('XXX','BUG ')
25358      WRITE(ICOUT,46)P
25359      CALL DPWRST('XXX','BUG ')
25360      RETURN
25361   60 WRITE(ICOUT,25)
25362      CALL DPWRST('XXX','BUG ')
25363      WRITE(ICOUT,47)NPAR
25364      CALL DPWRST('XXX','BUG ')
25365      RETURN
25366   90 CONTINUE
25367    5 FORMAT('***** FATAL ERROR--THE FIRST  INPUT ARGUMENT TO THE ',
25368     1' BINRAN SUBROUTINE IS NON-POSITIVE *****')
25369   11 FORMAT('***** FATAL ERROR--THE 2ND INPUT ARGUMENT TO THE ',
25370     1' BINRAN SUBROUTINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
25371   25 FORMAT('***** FATAL ERROR--THE 3RD INPUT ARGUMENT TO THE ',
25372     1' BINRAN SUBROUTINE IS NON-POSITIVE *****')
25373   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
25374   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
25375C
25376C     CHECK ON THE MAGNITUDE OF P,
25377C     AND BRANCH TO THE FASTER
25378C     GENERATION METHOD ACCORDINGLY.
25379C
25380      IF(P.LT.0.1)GOTO450
25381C
25382C     IF P IS MODERATE OR LARGE,
25383C     GENERATE N BINOMIAL RANDOM NUMBERS
25384C     USING THE REJECTION METHOD.
25385C
25386      DO100I=1,N
25387      ISUM=0
25388      DO200J=1,NPAR
25389      CALL UNIRAN(1,ISEED,U)
25390      IF(U(1).LE.P)ISUM=ISUM+1
25391  200 CONTINUE
25392      X(I)=ISUM
25393  100 CONTINUE
25394      RETURN
25395C
25396C     IF P IS SMALL,
25397C     GENERATE N BINOMIAL NUMBERS
25398C     USING THE FACT THAT THE
25399C     WAITING TIME FOR 1 SUCCESS IN
25400C     BERNOULLI TRIALS HAS A
25401C     GEOMETRIC DISTRIBUTION.
25402C
25403  450 CONTINUE
25404      DO500I=1,N
25405        ISUM=0
25406        J=1
25407  550   CALL GEORAN(1,P,ISEED,G)
25408        IG=INT(G(1)+0.5)
25409        ISUM=ISUM+IG+1
25410        IF(ISUM.GT.NPAR)GOTO650
25411        J=J+1
25412        GOTO550
25413  650   CONTINUE
25414        X(I)=INT(J-1)
25415  500 CONTINUE
25416      RETURN
25417C
25418      END
25419      SUBROUTINE BINRAW(DX,DP,DQ,DN,DPDF,ILOG)
25420C
25421C     PURPOSE--THIS SUBROUTINE IMPLEMENTS CATHERINE LOADER'S
25422C              ALGORITHM FOR THE BINOMIAL PDF.  THIS ROUTINE IS
25423C              CALLED BY SEVERAL OTHER ROUTINES (BINPDF, GEOPDF,
25424C              NBPDF).  THE ERROR CHECKING AND CHECKING FOR
25425C              APPROPRIATE RANGES IS PERFORMED BY THESE HIGHER LEVEL
25426C              CALLS.
25427C
25428C              THIS ALGORITHM IS BASED ON A SADDLE POINT APPROXIMATION.
25429C
25430C              THIS ROUTINE ALLOWS THE OPTION OF RETURNING THE
25431C              LOGARITHM OF THE PDF.
25432C
25433C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT WHICH THE
25434C                                BINOMIAL PDF IS TO BE EVALUATED.
25435C                     --DP     = THE DOUBLE PRECISION VALUE OF THE
25436C                                'BERNOULLI PROBABILITY' PARAMETER FOR
25437C                                THE BINOMIAL DISTRIBUTION.
25438C                     --DN     = THE DOUBLE PRECISION VALUE OF THE
25439C                                'NUMBER OF BERNOULLI TRIALS' PARAMETER.
25440C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY MASS
25441C                                FUNCTION VALUE.
25442C     OUTPUT--THE DOUBLE PRECISION PROBABILITY MASS FUNCTION VALUE DPDF.
25443C     PRINTING--NONE
25444C     RESTRICTIONS--DX SHOULD BE INTEGRAL-VALUED AND BETWEEN 0.0 (INCLUSIVELY)
25445C                   AND DN (INCLUSIVELY).
25446C                 --DP SHOULD BE BETWEEN 0.0 (EXCLUSIVELY) AND 1.0
25447C                   (INCLUSIVELY).
25448C                 --DN SHOULD BE A POSITIVE.
25449C
25450C                   NOTE THAT THE CHECK FOR RESTRICTIONS IS TO BE
25451C                   PERFORMED BY THE CALLING ROUTINES.
25452C
25453C     OTHER DATAPAC   SUBROUTINES NEEDED--STRERR, BD0, DLNREL.
25454C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG, EXP.
25455C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
25456C     LANGUAGE--ANSI FORTRAN (1977)
25457C     REFERENCES--CATHERINE LOADER (2000), "FAST AND ACCURATE COMPUTATION
25458C                 OF BINOMIAL PROBABILITIES", BELL LABS?
25459C     WRITTEN BY--JAMES J. FILLIBEN
25460C                 STATISTICAL ENGINEERING DIVISION
25461C                 INFORMATION TECHNOLOGY LABORATORY
25462C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
25463C                 GAITHERSBURG, MD 20899-8980
25464C                 PHONE--301-921-3651
25465C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
25466C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
25467C     LANGUAGE--ANSI FORTRAN (1977)
25468C     VERSION NUMBER--2009/3
25469C     ORIGINAL VERSION--MARCH     2009.
25470C
25471C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
25472C
25473C---------------------------------------------------------------------
25474C
25475      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
25476      DOUBLE PRECISION LF
25477      DOUBLE PRECISION LC
25478      INTEGER ILOG
25479C
25480C---------------------------------------------------------------------
25481C
25482      INCLUDE 'DPCOP2.INC'
25483C
25484C-----DATA STATEMENTS-------------------------------------------------
25485C
25486      DATA DPI2/6.283185307179586476925286/
25487C
25488C-----START POINT-----------------------------------------------------
25489C
25490C     STEP 1: P = 0 OR P = 1 CASES
25491C
25492      IF(DP.EQ.0.0D0)THEN
25493        IF(DX.EQ.0.0D0)THEN
25494          DPF=1.0D0
25495          IF(ILOG.EQ.1)DPDF=0.0D0
25496        ELSE
25497          DPF=0.0D0
25498          IF(ILOG.EQ.1)DPDF=DBLE(CPUMIN)
25499        ENDIF
25500        GOTO9000
25501      ELSEIF(DQ.EQ.0.0D0)THEN
25502        IF(DX.EQ.DN)THEN
25503          DPF=1.0D0
25504          IF(ILOG.EQ.1)DPDF=0.0D0
25505        ELSE
25506          DPF=0.0D0
25507          IF(ILOG.EQ.1)DPDF=DBLE(CPUMIN)
25508        ENDIF
25509        GOTO9000
25510      ENDIF
25511C
25512C     STEP 2: X = 0 AND X = N CASES
25513C
25514      IF(DX.EQ.0.0D0)THEN
25515        IF(DN.EQ.0.0D0)THEN
25516          DPF=1.0D0
25517          IF(ILOG.EQ.1)DPDF=0.0D0
25518        ELSE
25519          IF(DP.LT.0.1D0)THEN
25520            LC=-BD0(DN,DN*DQ) - DN*DP
25521          ELSE
25522            LC=DN*LOG(DQ)
25523          ENDIF
25524          IF(ILOG.EQ.1)THEN
25525            DPDF=LC
25526          ELSE
25527            DPDF=EXP(LC)
25528          ENDIF
25529        ENDIF
25530        GOTO9000
25531      ELSEIF(DX.EQ.DN)THEN
25532        IF(DQ.LT.0.1D0)THEN
25533          LC=-BD0(DN,DN*DP) - DN*DQ
25534        ELSE
25535          LC=DN*LOG(DP)
25536        ENDIF
25537        IF(ILOG.EQ.1)THEN
25538          DPDF=LC
25539        ELSE
25540          DPDF=EXP(LC)
25541        ENDIF
25542        GOTO9000
25543      ENDIF
25544C
25545      IF(DX.LT.0.0D0 .OR. DX.GT.DN)THEN
25546        IF(ILOG.EQ.1)THEN
25547          DPDF=DBLE(CPUMIN)
25548        ELSE
25549          DPDF=0.0D0
25550        ENDIF
25551      ENDIF
25552C
25553C     STEP 3: GENERAL CASE
25554C
25555      LC=STRERR(DN) - STRERR(DX) - STRERR(DN-DX) - BD0(DX,DN*DP) -
25556     1   BD0(DN-DX,DN*DQ)
25557      LF=LOG(DPI2) + LOG(DX) + DLNREL(-DX/DN)
25558      IF(ILOG.EQ.1)THEN
25559        DPDF=LC - 0.5D0*LF
25560       ELSE
25561        DPDF=EXP(LC - 0.5D0*LF)
25562      ENDIF
25563C
25564 9000 CONTINUE
25565      RETURN
25566      END
25567      SUBROUTINE BINTK(X,Y,T,N,K,BCOEF,Q,WORK)
25568C***BEGIN PROLOGUE  BINTK
25569C***DATE WRITTEN   800901   (YYMMDD)
25570C***REVISION DATE  820801   (YYMMDD)
25571C***CATEGORY NO.  E1A
25572C***KEYWORDS  B-SPLINE,DATA FITTING,INTERPOLATION,SPLINE
25573C***AUTHOR  AMOS, D. E., (SNLA)
25574C***PURPOSE  Produces the B-spline coefficients, BCOEF, of the
25575C            B-spline of order K with knots T(I), I=1,...,N+K, which
25576C            takes on the value Y(I) at X(I), I=1,...,N.
25577C***DESCRIPTION
25578C
25579C     Written by Carl de Boor and modified by D. E. Amos
25580C
25581C     References
25582C
25583C          A Practical Guide to Splines by C. de Boor, Applied
25584C          Mathematics Series 27, Springer, 1979.
25585C
25586C     Abstract
25587C
25588C         BINTK is the SPLINT routine of the reference.
25589C
25590C         BINTK produces the B-spline coefficients, BCOEF, of the
25591C         B-spline of order K with knots T(I), I=1,...,N+K, which
25592C         takes on the value Y(I) at X(I), I=1,...,N.  The spline or
25593C         any of its derivatives can be evaluated by calls to BVALU.
25594C         The I-th equation of the linear system A*BCOEF = B for the
25595C         coefficients of the interpolant enforces interpolation at
25596C         X(I)), I=1,...,N.  Hence, B(I) = Y(I), all I, and A is
25597C         a band matrix with 2K-1 bands if A is invertible. The matrix
25598C         A is generated row by row and stored, diagonal by diagonal,
25599C         in the rows of Q, with the main diagonal going into row K.
25600C         The banded system is then solved by a call to BNFAC (which
25601C         constructs the triangular factorization for A and stores it
25602C         again in Q), followed by a call to BNSLV (which then
25603C         obtains the solution BCOEF by substitution). BNFAC does no
25604C         pivoting, since the total positivity of the matrix A makes
25605C         this unnecessary.  The linear system to be solved is
25606C         (theoretically) invertible if and only if
25607C                 T(I) .LT. X(I)) .LT. T(I+K),        all I.
25608C         Equality is permitted on the left for I=1 and on the right
25609C         for I=N when K knots are used at X(1) or X(N).  Otherwise,
25610C         violation of this condition is certain to lead to an error.
25611C
25612C         BINTK calls BSPVN, BNFAC, BNSLV, XERROR
25613C
25614C     Description of Arguments
25615C         Input
25616C           X       - vector of length N containing data point abscissa
25617C                     in strictly increasing order.
25618C           Y       - corresponding vector of length N containing data
25619C                     point ordinates.
25620C           T       - knot vector of length N+K
25621C                     since T(1),..,T(K) .LE. X(1) and T(N+1),..,T(N+K)
25622C                     .GE. X(N), this leaves only N-K knots (not nec-
25623C                     essarily X(I)) values) interior to (X(1),X(N))
25624C           N       - number of data points, N .GE. K
25625C           K       - order of the spline, K .GE. 1
25626C
25627C         Output
25628C           BCOEF   - a vector of length N containing the B-spline
25629C                     coefficients
25630C           Q       - a work vector of length (2*K-1)*N, containing
25631C                     the triangular factorization of the coefficient
25632C                     matrix of the linear system being solved.  The
25633C                     coefficients for the interpolant of an
25634C                     additional data set (X(I)),YY(I)), I=1,...,N
25635C                     with the same abscissa can be obtained by loading
25636C                     YY into BCOEF and then executing
25637C                         call BNSLV(Q,2K-1,N,K-1,K-1,BCOEF)
25638C           WORK    - work vector of length 2*K
25639C
25640C     Error Conditions
25641C         Improper  input is a fatal error
25642C         Singular system of equations is a fatal error
25643C***REFERENCES  D.E. AMOS, *COMPUTATION WITH SPLINES AND B-SPLINES*,
25644C                 SAND78-1968,SANDIA LABORATORIES,MARCH,1979.
25645C               C. DE BOOR, *PACKAGE FOR CALCULATING WITH B-SPLINES*,
25646C                 SIAM JOURNAL ON NUMERICAL ANALYSIS, VOLUME 14, NO. 3,
25647C                 JUNE 1977, PP. 441-472.
25648C               C. DE BOOR, *A PRACTICAL GUIDE TO SPLINES*, APPLIED
25649C                 MATHEMATICS SERIES 27, SPRINGER, 1979.
25650C***ROUTINES CALLED  BNFAC,BNSLV,BSPVN,XERROR
25651C***END PROLOGUE  BINTK
25652C
25653C
25654      INTEGER IFLAG, IWORK, K, N, I, ILP1MX, J, JJ, KM1, KPKM2, LEFT,
25655     1 LENQ, NP1
25656      REAL BCOEF(N), Y(N), Q(1), T(1), X(N), XI, WORK(1)
25657C     DIMENSION Q(2*K-1,N), T(N+K)
25658C
25659C---------------------------------------------------------------------
25660C
25661      INCLUDE 'DPCOP2.INC'
25662C
25663C***FIRST EXECUTABLE STATEMENT  BINTK
25664      IF(K.LT.1) GO TO 100
25665      IF(N.LT.K) GO TO 105
25666      JJ = N - 1
25667      IF(JJ.EQ.0) GO TO 6
25668      DO 5 I=1,JJ
25669      IF(X(I).GE.X(I+1)) GO TO 110
25670    5 CONTINUE
25671    6 CONTINUE
25672      NP1 = N + 1
25673      KM1 = K - 1
25674      KPKM2 = 2*KM1
25675      LEFT = K
25676C                ZERO OUT ALL ENTRIES OF Q
25677      LENQ = N*(K+KM1)
25678      DO 10 I=1,LENQ
25679        Q(I) = 0.0E0
25680   10 CONTINUE
25681C
25682C  ***   LOOP OVER I TO CONSTRUCT THE  N  INTERPOLATION EQUATIONS
25683      DO 50 I=1,N
25684        XI = X(I)
25685        ILP1MX = MIN0(I+K,NP1)
25686C        *** FIND  LEFT  IN THE CLOSED INTERVAL (I,I+K-1) SUCH THAT
25687C                T(LEFT) .LE. X(I) .LT. T(LEFT+1)
25688C        MATRIX IS SINGULAR IF THIS IS NOT POSSIBLE
25689        LEFT = MAX0(LEFT,I)
25690        IF (XI.LT.T(LEFT)) GO TO 80
25691   20   IF (XI.LT.T(LEFT+1)) GO TO 30
25692        LEFT = LEFT + 1
25693        IF (LEFT.LT.ILP1MX) GO TO 20
25694        LEFT = LEFT - 1
25695        IF (XI.GT.T(LEFT+1)) GO TO 80
25696C        *** THE I-TH EQUATION ENFORCES INTERPOLATION AT XI, HENCE
25697C        A(I,J) = B(J,K,T)(XI), ALL J. ONLY THE  K  ENTRIES WITH  J =
25698C        LEFT-K+1,...,LEFT ACTUALLY MIGHT BE NONZERO. THESE  K  NUMBERS
25699C        ARE RETURNED, IN  BCOEF (USED FOR TEMP.STORAGE HERE), BY THE
25700C        FOLLOWING
25701   30   CALL BSPVN(T, K, K, 1, XI, LEFT, BCOEF, WORK, IWORK)
25702C        WE THEREFORE WANT  BCOEF(J) = B(LEFT-K+J)(XI) TO GO INTO
25703C        A(I,LEFT-K+J), I.E., INTO  Q(I-(LEFT+J)+2*K,(LEFT+J)-K) SINCE
25704C        A(I+J,J)  IS TO GO INTO  Q(I+K,J), ALL I,J,  IF WE CONSIDER  Q
25705C        AS A TWO-DIM. ARRAY , WITH  2*K-1  ROWS (SEE COMMENTS IN
25706C        BNFAC). IN THE PRESENT PROGRAM, WE TREAT  Q  AS AN EQUIVALENT
25707C        ONE-DIMENSIONAL ARRAY (BECAUSE OF FORTRAN RESTRICTIONS ON
25708C        DIMENSION STATEMENTS) . WE THEREFORE WANT  BCOEF(J) TO GO INTO
25709C        ENTRY
25710C            I -(LEFT+J) + 2*K + ((LEFT+J) - K-1)*(2*K-1)
25711C                   =  I-LEFT+1 + (LEFT -K)*(2*K-1) + (2*K-2)*J
25712C        OF  Q .
25713        JJ = I - LEFT + 1 + (LEFT-K)*(K+KM1)
25714        DO 40 J=1,K
25715          JJ = JJ + KPKM2
25716          Q(JJ) = BCOEF(J)
25717   40   CONTINUE
25718   50 CONTINUE
25719C
25720C     ***OBTAIN FACTORIZATION OF  A  , STORED AGAIN IN  Q.
25721      CALL BNFAC(Q, K+KM1, N, KM1, KM1, IFLAG)
25722      GO TO (60, 90), IFLAG
25723C     *** SOLVE  A*BCOEF = Y  BY BACKSUBSTITUTION
25724   60 DO 70 I=1,N
25725        BCOEF(I) = Y(I)
25726   70 CONTINUE
25727      CALL BNSLV(Q, K+KM1, N, KM1, KM1, BCOEF)
25728      RETURN
25729C
25730C
25731   80 CONTINUE
25732      WRITE(ICOUT,999)
25733  999 FORMAT(1X)
25734      CALL DPWRST('XXX','BUG ')
25735      WRITE(ICOUT,81)
25736      CALL DPWRST('XXX','BUG ')
25737      WRITE(ICOUT,82)
25738      CALL DPWRST('XXX','BUG ')
25739      WRITE(ICOUT,83)
25740      CALL DPWRST('XXX','BUG ')
25741   81 FORMAT('***** FROM BINTK,  SOME ABSCISSA WAS NOT IN THE SUPPORT')
25742   82 FORMAT('      OF THE CORRESPONDING BASIS FUNCTION AND THE')
25743   83 FORMAT('      SYSTEM IS SINGULAR.                         *****')
25744      RETURN
25745   90 CONTINUE
25746      WRITE(ICOUT,999)
25747      CALL DPWRST('XXX','BUG ')
25748      WRITE(ICOUT,91)
25749      CALL DPWRST('XXX','BUG ')
25750      WRITE(ICOUT,92)
25751      CALL DPWRST('XXX','BUG ')
25752      WRITE(ICOUT,93)
25753      CALL DPWRST('XXX','BUG ')
25754   91 FORMAT('***** FROM BINTK,  THE SYSTEM OF SOLVER DETECTS A')
25755   92 FORMAT('      SINGULAR SYSTEM ALTHOUGH THE THEORETICAL')
25756   93 FORMAT('      CONDITIONS FOR A SOLUTION WERE SATISFIED.  *****')
25757      RETURN
25758  100 CONTINUE
25759      WRITE(ICOUT,999)
25760      CALL DPWRST('XXX','BUG ')
25761      WRITE(ICOUT,101)
25762      CALL DPWRST('XXX','BUG ')
25763  101 FORMAT('***** FROM BINTK,  K DOES NOT SATISFY K.GE.1 *****')
25764      RETURN
25765  105 CONTINUE
25766      WRITE(ICOUT,999)
25767      CALL DPWRST('XXX','BUG ')
25768      WRITE(ICOUT,106)
25769      CALL DPWRST('XXX','BUG ')
25770  106 FORMAT('***** FROM BINTK,  N DOES NOT SATISFY N.GE.K *****')
25771      RETURN
25772  110 CONTINUE
25773      WRITE(ICOUT,999)
25774      CALL DPWRST('XXX','BUG ')
25775      WRITE(ICOUT,111)
25776      CALL DPWRST('XXX','BUG ')
25777      WRITE(ICOUT,112)
25778      CALL DPWRST('XXX','BUG ')
25779  111 FORMAT('***** FROM BINTK, X(I) DOES NOT SATISFY ')
25780  112 FORMAT('      X(I).LT.X(I+1) FOR SOME I         *****')
25781      RETURN
25782      END
25783      DOUBLE PRECISION FUNCTION BIRINT(XVALUE)
25784C
25785C   DESCRIPTION:
25786C      This function calculates the integral of the Airy function Bi, defined
25787C
25788C          BIRINT(x) = integral{0 to x} Bi(t) dt
25789C
25790C      The program uses Chebyshev expansions, the coefficients of which
25791C      are given to 20 decimal places.
25792C
25793C
25794C   ERROR RETURNS:
25795C
25796C      If the function is too large and positive the correct
25797C      value would overflow. An error message is printed and the
25798C      program returns the value XMAX.
25799C
25800C      If the argument is too large and negative, it is impossible
25801C      to accurately compute the necessary SIN and COS functions,
25802C      for the asymptotic expansion.
25803C      An error message is printed, and the program returns the
25804C      value 0 (the value at -infinity).
25805C
25806C
25807C   MACHINE-DEPENDENT CONSTANTS:
25808C
25809C      NTERM1 - INTEGER - The no. of terms to be used from the array
25810C                          ABINT1. The recommended value is such that
25811C                             ABS(ABINT1(NTERM1)) < EPS/100,
25812C                          subject to 1 <= NTERM1 <= 36.
25813C
25814C      NTERM2 - INTEGER - The no. of terms to be used from the array
25815C                          ABINT2. The recommended value is such that
25816C                             ABS(ABINT2(NTERM2)) < EPS/100,
25817C                          subject to 1 <= NTERM2 <= 37.
25818C
25819C      NTERM3 - INTEGER - The no. of terms to be used from the array
25820C                          ABINT3. The recommended value is such that
25821C                             ABS(ABINT3(NTERM3)) < EPS/100,
25822C                          subject to 1 <= NTERM3 <= 37.
25823C
25824C      NTERM4 - INTEGER - The no. of terms to be used from the array
25825C                          ABINT4. The recommended value is such that
25826C                             ABS(ABINT4(NTERM4)) < EPS/100,
25827C                          subject to 1 <= NTERM4 <= 20.
25828C
25829C      NTERM5 - INTEGER - The no. of terms to be used from the array
25830C                          ABINT5. The recommended value is such that
25831C                             ABS(ABINT5(NTERM5)) < EPS/100,
25832C                          subject to 1 <= NTERM5 <= 20.
25833C
25834C      XLOW1 - DOUBLE PRECISION - The value such that, if |x| < XLOW1,
25835C                          BIRINT(x) = x * Bi(0)
25836C                     to machine precision. The recommended value is
25837C                          2 * EPSNEG.
25838C
25839C      XHIGH1 - DOUBLE PRECISION - The value such that, if x > XHIGH1,
25840C                      the function value would overflow.
25841C                      The recommended value is computed as
25842C                          z = ln(XMAX) + 0.5ln(ln(XMAX)),
25843C                          XHIGH1 = (3z/2)^(2/3)
25844C
25845C      XNEG1 - DOUBLE PRECISION - The value such that, if x < XNEG1,
25846C                     the trigonometric functions in the asymptotic
25847C                     expansion cannot be calculated accurately.
25848C                     The recommended value is
25849C                          -(1/((EPS)**2/3))
25850C
25851C      XMAX - DOUBLE PRECISION - The value of the largest positive floating-pt
25852C                    number. Used in giving a value to the function
25853C                    if x > XHIGH1.
25854C
25855C      For values of EPS, EPSNEG, and XMAX see the file MACHCON.TXT.
25856C
25857C
25858C     The machine-dependent constants are computed internally by
25859C     using the D1MACH subroutine.
25860C
25861C
25862C   INTRINSIC FUNCTIONS USED:
25863C                            COS, EXP, LOG, SIN, SQRT
25864C
25865C
25866C   OTHER MISCFUN SUBROUTINES USED:
25867C
25868C          CHEVAL , ERRPRN, D1MACH
25869C
25870C
25871C   AUTHOR: Dr. Allan J. MacLeod,
25872C           Dept. of Mathematics and Statistics,
25873C           Univ. of Paisley,
25874C           High St.,
25875C           Paisley,
25876C           SCOTLAND.
25877C           PA1 2BE
25878C
25879C           (e-mail: macl_ms0@paisley.ac.uk )
25880C
25881C
25882C   LATEST REVISION:  23 January, 1996
25883C
25884      INTEGER NTERM1,NTERM2,NTERM3,NTERM4,NTERM5
25885      DOUBLE PRECISION ABINT1(0:36),ABINT2(0:37),ABINT3(0:37),
25886     1     ABINT4(0:20),ABINT5(0:20),
25887     2     ARG,BIRZER,CHEVAL,EIGHT,FOUR,F1,F2,NINE,NINHUN,
25888     3     ONE,ONEHUN,ONEPT5,PIBY4,RT2B3P,SIXTEN,SEVEN,T,TEMP,
25889     4     THREE,THR644,X,XLOW1,XHIGH1,XMAX,XNEG1,XVALUE,
25890     5     Z,ZERO
25891CCCCC CHARACTER FNNAME*6,ERMSG1*31,ERMSG2*31
25892CCCCC DATA FNNAME/'BIRINT'/
25893CCCCC DATA ERMSG1/'ARGUMENT TOO LARGE AND POSITIVE'/
25894CCCCC DATA ERMSG2/'ARGUMENT TOO LARGE AND NEGATIVE'/
25895C
25896C-----COMMON----------------------------------------------------------
25897C
25898      INCLUDE 'DPCOMC.INC'
25899      INCLUDE 'DPCOP2.INC'
25900C
25901      DATA ABINT1(0)/  0.38683 35244 50385 43350  D    0/
25902      DATA ABINT1(1)/ -0.88232 13550 88890 8821   D   -1/
25903      DATA ABINT1(2)/  0.21463 93744 03554 29239  D    0/
25904      DATA ABINT1(3)/ -0.42053 47375 89131 5126   D   -1/
25905      DATA ABINT1(4)/  0.59324 22547 49608 6771   D   -1/
25906      DATA ABINT1(5)/ -0.84078 70811 24270 210    D   -2/
25907      DATA ABINT1(6)/  0.87182 47727 78487 955    D   -2/
25908      DATA ABINT1(7)/ -0.12191 60019 96134 55     D   -3/
25909      DATA ABINT1(8)/  0.44024 82178 60232 34     D   -3/
25910      DATA ABINT1(9)/  0.27894 68666 63866 78     D   -3/
25911      DATA ABINT1(10)/-0.70528 04689 78553 7      D   -4/
25912      DATA ABINT1(11)/ 0.59010 80066 77010 0      D   -4/
25913      DATA ABINT1(12)/-0.13708 62587 98214 2      D   -4/
25914      DATA ABINT1(13)/ 0.50596 25737 49073        D   -5/
25915      DATA ABINT1(14)/-0.51598 83776 6735         D   -6/
25916      DATA ABINT1(15)/ 0.39751 13123 49           D   -8/
25917      DATA ABINT1(16)/ 0.95249 85978 055          D   -7/
25918      DATA ABINT1(17)/-0.36814 35887 321          D   -7/
25919      DATA ABINT1(18)/ 0.12483 91688 136          D   -7/
25920      DATA ABINT1(19)/-0.24909 76191 37           D   -8/
25921      DATA ABINT1(20)/ 0.31775 24555 1            D   -9/
25922      DATA ABINT1(21)/ 0.54343 65270              D  -10/
25923      DATA ABINT1(22)/-0.40245 66915              D  -10/
25924      DATA ABINT1(23)/ 0.13938 55527              D  -10/
25925      DATA ABINT1(24)/-0.30381 7509               D  -11/
25926      DATA ABINT1(25)/ 0.40809 511                D  -12/
25927      DATA ABINT1(26)/ 0.16341 16                 D  -13/
25928      DATA ABINT1(27)/-0.26838 09                 D  -13/
25929      DATA ABINT1(28)/ 0.89664 1                  D  -14/
25930      DATA ABINT1(29)/-0.18308 9                  D  -14/
25931      DATA ABINT1(30)/ 0.21333                    D  -15/
25932      DATA ABINT1(31)/ 0.1108                     D  -16/
25933      DATA ABINT1(32)/-0.1276                     D  -16/
25934      DATA ABINT1(33)/ 0.363                      D  -17/
25935      DATA ABINT1(34)/-0.62                       D  -18/
25936      DATA ABINT1(35)/ 0.5                        D  -19/
25937      DATA ABINT1(36)/ 0.1                        D  -19/
25938      DATA ABINT2(0)/  2.04122 07860 25161 35181  D    0/
25939      DATA ABINT2(1)/  0.21241 33918 62122 1230   D   -1/
25940      DATA ABINT2(2)/  0.66617 59976 67062 76     D   -3/
25941      DATA ABINT2(3)/  0.38420 47982 80825 4      D   -4/
25942      DATA ABINT2(4)/  0.36231 03660 20439        D   -5/
25943      DATA ABINT2(5)/  0.50351 99011 5074         D   -6/
25944      DATA ABINT2(6)/  0.79616 48702 253          D   -7/
25945      DATA ABINT2(7)/  0.71780 84423 36           D   -8/
25946      DATA ABINT2(8)/ -0.26777 01591 04           D   -8/
25947      DATA ABINT2(9)/ -0.16848 95146 99           D   -8/
25948      DATA ABINT2(10)/-0.36811 75725 5            D   -9/
25949      DATA ABINT2(11)/ 0.47571 28727              D  -10/
25950      DATA ABINT2(12)/ 0.52636 21945              D  -10/
25951      DATA ABINT2(13)/ 0.77897 3500               D  -11/
25952      DATA ABINT2(14)/-0.46054 6143               D  -11/
25953      DATA ABINT2(15)/-0.18343 3736               D  -11/
25954      DATA ABINT2(16)/ 0.32191 249                D  -12/
25955      DATA ABINT2(17)/ 0.29352 060                D  -12/
25956      DATA ABINT2(18)/-0.16579 35                 D  -13/
25957      DATA ABINT2(19)/-0.44838 08                 D  -13/
25958      DATA ABINT2(20)/ 0.27907                    D  -15/
25959      DATA ABINT2(21)/ 0.71192 1                  D  -14/
25960      DATA ABINT2(22)/-0.1042                     D  -16/
25961      DATA ABINT2(23)/-0.11959 1                  D  -14/
25962      DATA ABINT2(24)/ 0.4606                     D  -16/
25963      DATA ABINT2(25)/ 0.20884                    D  -15/
25964      DATA ABINT2(26)/-0.2416                     D  -16/
25965      DATA ABINT2(27)/-0.3638                     D  -16/
25966      DATA ABINT2(28)/ 0.863                      D  -17/
25967      DATA ABINT2(29)/ 0.591                      D  -17/
25968      DATA ABINT2(30)/-0.256                      D  -17/
25969      DATA ABINT2(31)/-0.77                       D  -18/
25970      DATA ABINT2(32)/ 0.66                       D  -18/
25971      DATA ABINT2(33)/ 0.3                        D  -19/
25972      DATA ABINT2(34)/-0.15                       D  -18/
25973      DATA ABINT2(35)/ 0.2                        D  -19/
25974      DATA ABINT2(36)/ 0.3                        D  -19/
25975      DATA ABINT2(37)/-0.1                        D  -19/
25976      DATA ABINT3(0)/  0.31076 96159 86403 49251  D    0/
25977      DATA ABINT3(1)/ -0.27528 84588 74525 42718  D    0/
25978      DATA ABINT3(2)/  0.17355 96570 61365 43928  D    0/
25979      DATA ABINT3(3)/ -0.55440 17909 49284 3130   D   -1/
25980      DATA ABINT3(4)/ -0.22512 65478 29595 0941   D   -1/
25981      DATA ABINT3(5)/  0.41073 47447 81252 1894   D   -1/
25982      DATA ABINT3(6)/  0.98476 12754 64262 480    D   -2/
25983      DATA ABINT3(7)/ -0.15556 18141 66604 1932   D   -1/
25984      DATA ABINT3(8)/ -0.56087 18707 30279 234    D   -2/
25985      DATA ABINT3(9)/  0.24601 77833 22230 475    D   -2/
25986      DATA ABINT3(10)/ 0.16574 03922 92336 978    D   -2/
25987      DATA ABINT3(11)/-0.32775 87501 43540 2      D   -4/
25988      DATA ABINT3(12)/-0.24434 68086 05149 25     D   -3/
25989      DATA ABINT3(13)/-0.50353 05196 15232 1      D   -4/
25990      DATA ABINT3(14)/ 0.16302 64722 24785 4      D   -4/
25991      DATA ABINT3(15)/ 0.85191 40577 80934        D   -5/
25992      DATA ABINT3(16)/ 0.29790 36300 4664         D   -6/
25993      DATA ABINT3(17)/-0.64389 70789 6401         D   -6/
25994      DATA ABINT3(18)/-0.15046 98814 5803         D   -6/
25995      DATA ABINT3(19)/ 0.15870 13535 823          D   -7/
25996      DATA ABINT3(20)/ 0.12767 66299 622          D   -7/
25997      DATA ABINT3(21)/ 0.14057 85341 99           D   -8/
25998      DATA ABINT3(22)/-0.46564 73974 1            D   -9/
25999      DATA ABINT3(23)/-0.15682 74879 1            D   -9/
26000      DATA ABINT3(24)/-0.40389 3560               D  -11/
26001      DATA ABINT3(25)/ 0.66670 8192               D  -11/
26002      DATA ABINT3(26)/ 0.12886 9380               D  -11/
26003      DATA ABINT3(27)/-0.69686 63                 D  -13/
26004      DATA ABINT3(28)/-0.62543 19                 D  -13/
26005      DATA ABINT3(29)/-0.71839 2                  D  -14/
26006      DATA ABINT3(30)/ 0.11529 6                  D  -14/
26007      DATA ABINT3(31)/ 0.42276                    D  -15/
26008      DATA ABINT3(32)/ 0.2493                     D  -16/
26009      DATA ABINT3(33)/-0.971                      D  -17/
26010      DATA ABINT3(34)/-0.216                      D  -17/
26011      DATA ABINT3(35)/-0.2                        D  -19/
26012      DATA ABINT3(36)/ 0.6                        D  -19/
26013      DATA ABINT3(37)/ 0.1                        D  -19/
26014      DATA ABINT4(0)/  1.99507 95931 33520 47614  D    0/
26015      DATA ABINT4(1)/ -0.27373 63759 70692 738    D   -2/
26016      DATA ABINT4(2)/ -0.30897 11308 12858 50     D   -3/
26017      DATA ABINT4(3)/ -0.35501 01982 79857 7      D   -4/
26018      DATA ABINT4(4)/ -0.41217 92715 20133        D   -5/
26019      DATA ABINT4(5)/ -0.48235 89231 6833         D   -6/
26020      DATA ABINT4(6)/ -0.56787 30727 927          D   -7/
26021      DATA ABINT4(7)/ -0.67187 48103 65           D   -8/
26022      DATA ABINT4(8)/ -0.79811 64985 7            D   -9/
26023      DATA ABINT4(9)/ -0.95142 71478              D  -10/
26024      DATA ABINT4(10)/-0.11374 68966              D  -10/
26025      DATA ABINT4(11)/-0.13635 9969               D  -11/
26026      DATA ABINT4(12)/-0.16381 418                D  -12/
26027      DATA ABINT4(13)/-0.19725 75                 D  -13/
26028      DATA ABINT4(14)/-0.23784 4                  D  -14/
26029      DATA ABINT4(15)/-0.28752                    D  -15/
26030      DATA ABINT4(16)/-0.3475                     D  -16/
26031      DATA ABINT4(17)/-0.422                      D  -17/
26032      DATA ABINT4(18)/-0.51                       D  -18/
26033      DATA ABINT4(19)/-0.6                        D  -19/
26034      DATA ABINT4(20)/-0.1                        D  -19/
26035      DATA ABINT5(0)/  1.12672 08196 17825 66017  D    0/
26036      DATA ABINT5(1)/ -0.67140 55675 25561 198    D   -2/
26037      DATA ABINT5(2)/ -0.69812 91801 78329 69     D   -3/
26038      DATA ABINT5(3)/ -0.75616 89886 42527 6      D   -4/
26039      DATA ABINT5(4)/ -0.83498 55745 10207        D   -5/
26040      DATA ABINT5(5)/ -0.93630 29823 2480         D   -6/
26041      DATA ABINT5(6)/ -0.10608 55629 6250         D   -6/
26042      DATA ABINT5(7)/ -0.12131 28916 741          D   -7/
26043      DATA ABINT5(8)/ -0.13963 11297 65           D   -8/
26044      DATA ABINT5(9)/ -0.16178 91805 4            D   -9/
26045      DATA ABINT5(10)/-0.18823 07907              D  -10/
26046      DATA ABINT5(11)/-0.22027 2985               D  -11/
26047      DATA ABINT5(12)/-0.25816 189                D  -12/
26048      DATA ABINT5(13)/-0.30479 64                 D  -13/
26049      DATA ABINT5(14)/-0.35837 0                  D  -14/
26050      DATA ABINT5(15)/-0.42831                    D  -15/
26051      DATA ABINT5(16)/-0.4993                     D  -16/
26052      DATA ABINT5(17)/-0.617                      D  -17/
26053      DATA ABINT5(18)/-0.68                       D  -18/
26054      DATA ABINT5(19)/-0.10                       D  -18/
26055      DATA ABINT5(20)/-0.1                        D  -19/
26056      DATA ZERO,ONE,ONEPT5/ 0.0 D 0 , 1.0 D 0 , 1.5 D 0 /
26057      DATA THREE,FOUR,SEVEN/ 3.0 D 0 , 4.0 D 0 , 7.0 D 0 /
26058      DATA EIGHT,NINE,SIXTEN/ 8.0 D 0 , 9.0 D 0 , 16.0 D 0 /
26059      DATA ONEHUN,NINHUN,THR644/100.0 D 0 , 900.0 D 0 , 3644.0 D 0 /
26060      DATA PIBY4/0.78539 81633 97448 30962 D 0/
26061      DATA RT2B3P/0.46065 88659 61780 63902 D 0/
26062      DATA BIRZER/0.61492 66274 46000 73515 D 0/
26063C
26064C   Start computation
26065C
26066      X = XVALUE
26067C
26068C   Compute the machine-dependent constants.
26069C
26070      T = D1MACH(3)
26071      F2 = ONE + ONE
26072      XNEG1 = -ONE/(T**(F2/THREE))
26073      XMAX = D1MACH(2)
26074      F1 = LOG(XMAX)
26075      TEMP = F1 + LOG(F1)/F2
26076      XHIGH1 = (THREE*TEMP/F2)**(F2/THREE)
26077C
26078C   Error test
26079C
26080      IF ( X .GT. XHIGH1 ) THEN
26081CCCCC    CALL ERRPRN(FNNAME,ERMSG1)
26082         WRITE(ICOUT,999)
26083         CALL DPWRST('XXX','BUG ')
26084         WRITE(ICOUT,101)X
26085         CALL DPWRST('XXX','BUG ')
26086         BIRINT = XMAX
26087         RETURN
26088      ENDIF
26089  999 FORMAT(1X)
26090  101 FORMAT('***** ERROR FROM BIRINT--ARGUMENT TOO LARGE AND ',
26091     1        'POSITIVE, ARGUMENT = ',G15.7)
26092      IF ( X .LT. XNEG1 ) THEN
26093CCCCc    CALL ERRPRN(FNNAME,ERMSG2)
26094         WRITE(ICOUT,999)
26095         CALL DPWRST('XXX','BUG ')
26096         WRITE(ICOUT,201)X
26097         CALL DPWRST('XXX','BUG ')
26098         BIRINT = ZERO
26099         RETURN
26100      ENDIF
26101  201 FORMAT('***** ERROR FROM BIRINT--ARGUMENT TOO LARGE AND ',
26102     1        'NEGATIVE, ARGUMENT = ',G15.7)
26103CCCCC DATA ERMSG2/'ARGUMENT TOO LARGE AND NEGATIVE'/
26104C
26105C  continue with machine-dependent constants
26106C
26107      XLOW1 = F2 * T
26108      T = T / ONEHUN
26109      IF ( X .GE. ZERO ) THEN
26110         DO 10 NTERM1 = 36 , 0 , -1
26111            IF ( ABS(ABINT1(NTERM1)) .GT. T ) GOTO 19
26112 10      CONTINUE
26113 19      DO 20 NTERM2 = 37 , 0 , -1
26114            IF ( ABS(ABINT2(NTERM2)) .GT. T ) GOTO 29
26115 20      CONTINUE
26116 29      CONTINUE
26117      ELSE
26118         DO 30 NTERM3 = 37 , 0 , -1
26119            IF ( ABS(ABINT3(NTERM3)) .GT. T ) GOTO 39
26120 30      CONTINUE
26121 39      DO 40 NTERM4 = 20 , 0 , -1
26122            IF ( ABS(ABINT4(NTERM4)) .GT. T ) GOTO 49
26123 40      CONTINUE
26124 49      DO 50 NTERM5 = 20 , 0 , -1
26125            IF ( ABS(ABINT5(NTERM5)) .GT. T ) GOTO 59
26126 50      CONTINUE
26127 59      CONTINUE
26128      ENDIF
26129C
26130C   Code for x >= 0.0
26131C
26132      IF ( X .GE. ZERO ) THEN
26133         IF ( X .LT. XLOW1 ) THEN
26134            BIRINT = BIRZER * X
26135         ELSE
26136            IF ( X .LE. EIGHT ) THEN
26137               T = X / FOUR - ONE
26138               BIRINT = X * EXP(ONEPT5*X) * CHEVAL(NTERM1,ABINT1,T)
26139            ELSE
26140               T = SIXTEN * SQRT(EIGHT/X) / X - ONE
26141               Z = ( X + X ) * SQRT(X) / THREE
26142               TEMP = RT2B3P * CHEVAL(NTERM2,ABINT2,T) / SQRT(Z)
26143               TEMP = Z + LOG(TEMP)
26144               BIRINT = EXP(TEMP)
26145            ENDIF
26146         ENDIF
26147      ELSE
26148C
26149C   Code for x < 0.0
26150C
26151         IF ( X .GE. -SEVEN ) THEN
26152            IF ( X .GT. -XLOW1 ) THEN
26153               BIRINT = BIRZER * X
26154            ELSE
26155               T = - ( X + X ) / SEVEN - ONE
26156               BIRINT = X * CHEVAL(NTERM3,ABINT3,T)
26157            ENDIF
26158         ELSE
26159            Z = - ( X + X ) * SQRT(-X) / THREE
26160            ARG = Z + PIBY4
26161            TEMP = NINE * Z * Z
26162            T = (THR644 - TEMP ) / ( NINHUN + TEMP )
26163            F1 = CHEVAL(NTERM4,ABINT4,T) * SIN(ARG)
26164            F2 = CHEVAL(NTERM5,ABINT5,T) * COS(ARG) / Z
26165            BIRINT = ( F2 - F1 ) * RT2B3P / SQRT(Z)
26166         ENDIF
26167      ENDIF
26168      RETURN
26169      END
26170      SUBROUTINE BIVAR(Z,Y,X,N,Y2,X2,N2,IWRITE,Z2,
26171     1                 YTEMP,XTEMP,YDIST,XDIST,ZDIST,
26172     1                 ZTEMP2,ZTEMP,TX,TY,WORK,ISPACE,
26173     1                 IBUGG3,ISUBRO,IERROR)
26174C
26175C     PURPOSE--COMPUTE BI-VARIATE INTERPOLATION OF A VARIABLE
26176C              (GENERATE INTERPOLATED POINTS).  THIS ROUTINE USES THE
26177C              B2INK AND B@VAL ROUTINES FROM CMLIB WRITTEN BY
26178C              RON BOISVERT OF NIST.
26179C     INPUT  ARGUMENTS--Z      = SINGLE PRECISION VARIABLE
26180C                                CONTAINING THE ORIGINAL
26181C                                Z AXIS DATA POINTS.
26182C                     --Y      = SINGLE PRECISION VARIABLE
26183C                                CONTAINING THE ORIGINAL
26184C                                VERTICAL AXIS DATA POINTS.
26185C                     --X      = SINGLE PRECISION VARIABLE
26186C                                CONTAINING THE ORIGINAL
26187C                                HORIZONTAL AXIS DATA POINTS.
26188C                     --Y2     = SINGLE PRECISION VARIABLE
26189C                                CONTAINING THE DESIRED
26190C                                VERTICAL AXIS INTERPOLATION
26191C                     --X2     = SINGLE PRECISION VARIABLE
26192C                                CONTAINING THE DESIRED
26193C                                HORIZONTAL AXIS INTERPOLATION
26194C                                POINTS.
26195C     OUTPUT ARGUMENTS--Z2     = SINGLE PRECISION VARIABLE
26196C                                CONTAINING THE COMPUTED
26197C                                Z AXIS INTERPOLATION
26198C                                POINTS.
26199C     NOTE--IT IS PROBABLY NOT PERMISSIBLE TO HAVE THE OUTPUT VECTOR
26200C           Y2(.) BEING IDENTICAL TO THE INPUT VECTOR Y(.)
26201C     NOTE--THIS SUBROUTINE DOES NOT ASSUME THAT THE INPUT
26202C           DATA IS ALREADY SORTED ACCORDING TO THE
26203C           HORIZONTAL AXIS VARIABLE.
26204C           SUCH SORTING IS DOEN HEREIN.
26205C     NOTE--IT DOES ASSUME THAT THE ORIGINAL (Y,X) POINTS FORM A
26206C           RECTANGULAR GRID (ALTHOUGH THE GRID DOES NOT HAVE TO BE
26207C           PRE-SORTED).
26208C     CAUTION--THE INPUT VECTORS Y AND X ARE SORTED HEREIN
26209C              AND SO MAY BE DIFFERENT UPON LEAVING THIS SUBROUTINE
26210C              THAN UPON ENTERING THIS SUBROUTINE.
26211C     WRITTEN BY--ALAN HECKERT
26212C                 STATISTICAL ENGINEERING DIVISION
26213C                 INFORMATION TECHNOLOGY LABORATORY
26214C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
26215C                 GAITHERSBURG, MD 20899-8980
26216C                 PHONE--301-975-2899
26217C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26218C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
26219C     LANGUAGE--ANSI FORTRAN (1977)
26220C     VERSION NUMBER--94/5
26221C     ORIGINAL VERSION--MAY       1994.
26222C     UPDATED         --JUNE      2019. DIMENSION SCRATCH ARRAYS IN
26223C                                       CALLING ROUTINE
26224C
26225C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26226C
26227      CHARACTER*4 IWRITE
26228      CHARACTER*4 IBUGG3
26229      CHARACTER*4 ISUBRO
26230      CHARACTER*4 IERROR
26231C
26232      CHARACTER*4 ISUBN1
26233      CHARACTER*4 ISUBN2
26234      CHARACTER*4 ISTEPN
26235C
26236      CHARACTER*4 IHP
26237      CHARACTER*4 IHP2
26238      CHARACTER*4 IHWUSE
26239      CHARACTER*4 MESSAG
26240C
26241C---------------------------------------------------------------------
26242C
26243      INCLUDE 'DPCOPA.INC'
26244C
26245      DIMENSION Z(*)
26246      DIMENSION Y(*)
26247      DIMENSION X(*)
26248      DIMENSION X2(*)
26249      DIMENSION Y2(*)
26250      DIMENSION Z2(*)
26251      DIMENSION YTEMP(*)
26252      DIMENSION XTEMP(*)
26253      DIMENSION YDIST(*)
26254      DIMENSION XDIST(*)
26255      DIMENSION ZDIST(*)
26256      DIMENSION ZTEMP2(*)
26257      DIMENSION ZTEMP(*)
26258      DIMENSION TX(*)
26259      DIMENSION TY(*)
26260      DIMENSION WORK(ISPACE)
26261C
26262C-----COMMON VARIABLES (GENERAL)--------------------------------------
26263C
26264      INCLUDE 'DPCOHK.INC'
26265      INCLUDE 'DPCOP2.INC'
26266C
26267C-----START POINT-----------------------------------------------------
26268C
26269      ISUBN1='BIVA'
26270      ISUBN2='R   '
26271      IERROR='NO'
26272C
26273      ISTART=0
26274      ILAST=0
26275C
26276      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')THEN
26277        WRITE(ICOUT,999)
26278  999   FORMAT(1X)
26279        CALL DPWRST('XXX','BUG ')
26280        WRITE(ICOUT,51)
26281   51   FORMAT('***** AT THE BEGINNING OF BIVAR--')
26282        CALL DPWRST('XXX','BUG ')
26283        WRITE(ICOUT,52)N,N2,ISPACE
26284   52   FORMAT('N,N2,ISPACE = ',3I8)
26285        CALL DPWRST('XXX','BUG ')
26286        DO55I=1,N
26287          WRITE(ICOUT,56)I,Z(I),Y(I),X(I)
26288   56     FORMAT('I,Z(I),Y(I),X(I) = ',I8,3G15.7)
26289          CALL DPWRST('XXX','BUG ')
26290   55   CONTINUE
26291        DO65I=1,N2
26292          WRITE(ICOUT,66)I,Y2(I),X2(I)
26293   66     FORMAT('I,Y2(I),X2(I) = ',I8,2G15.7)
26294          CALL DPWRST('XXX','BUG ')
26295   65   CONTINUE
26296      ENDIF
26297C
26298C               ****************************************
26299C               **  STEP 11--                         **
26300C               **  SORT THE INPUT DATA ACCORDING     **
26301C               **  TO THE HORIZONTAL AXIS VARIABLE   **
26302C               ****************************************
26303C
26304      ISTEPN='11'
26305      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')
26306     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
26307C
26308      DO1010,I=1,N
26309        XTEMP(I)=X(I)
26310 1010 CONTINUE
26311C
26312      CALL SORTC(X,Y,N,X,Y)
26313      CALL SORTC(XTEMP,Z,N,XTEMP,Z)
26314C
26315C               *******************************************************
26316C               **  STEP 12--                                        **
26317C               **  DETERMINE THE NUMBER OF DISTINCT X VALUES        **
26318C               *******************************************************
26319C
26320      ISTEPN='12'
26321      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')
26322     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
26323C
26324      NDISTX=0
26325      DO1210I=1,N
26326        IF(NDISTX.GT.0)THEN
26327          DO1215I2=1,NDISTX
26328           IF(X(I).EQ.XDIST(I2))GOTO1210
26329 1215     CONTINUE
26330        ENDIF
26331        NDISTX=NDISTX+1
26332        XDIST(NDISTX)=X(I)
26333 1210 CONTINUE
26334C
26335      CALL SORT(XDIST,NDISTX,XDIST)
26336C
26337C               *******************************************************
26338C               **  STEP 13--                                        **
26339C               **  DETERMINE THE NUMBER OF DISTINCT Y VALUES        **
26340C               *******************************************************
26341C
26342      ISTEPN='13'
26343      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')
26344     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
26345C
26346      NDISTY=0
26347      DO1310I=1,N
26348        IF(NDISTY.GT.0)THEN
26349          DO1315I2=1,NDISTY
26350            IF(Y(I).EQ.YDIST(I2))GOTO1310
26351 1315     CONTINUE
26352        ENDIF
26353        NDISTY=NDISTY+1
26354        YDIST(NDISTY)=Y(I)
26355 1310 CONTINUE
26356C
26357      CALL SORT(YDIST,NDISTY,YDIST)
26358C
26359C               *******************************************************
26360C               **  STEP 14--                                        **
26361C               **  SORT Y ASSOCIATED WITH EACH DISTINCT X VALUE     **
26362C               **  CHECK FOR REPLICATION OF POINTS                  **
26363C               **  IF ALL DISTINCT (THAT IS, NO REPLICATION),     **
26364C               **  (THAT IS, HAVE NO REPLICATION),                **
26365C               **  THEN COPY OVER Z VALUES.                       **
26366C               **  IF NOT ALL DISTINCT                            **
26367C               **  (THAT IS, HAVE SOME REPLICATION),              **
26368C               **  THEN COMPUTE A MEAN VALUE OVER THE REPLICATES  **
26369C               **  AND TREAT THAT AS THE COMMON VALUE.            **
26370C               **  THE CORE OF THE INTERPOLATION CODE             **
26371C               **  IS EXPECTING SORTED, DISTINCT X AND Y VALUES.   **
26372C               **  ALSO CHECK THAT X AND Y FORM A RECTANGULAR GRID.**
26373C               *******************************************************
26374C
26375      ISTEPN='14'
26376      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')
26377     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
26378C
26379      NUMZ=0
26380      ISTART=1
26381      DO1410I=1,NDISTX
26382        XT=XDIST(I)
26383        ICOUNT=0
26384        DO1420J=ISTART,N
26385        IF(X(J).EQ.XT)THEN
26386          IF(ICOUNT.EQ.0)IFRST=J
26387          ICOUNT=ICOUNT+1
26388          YTEMP(ICOUNT)=Y(J)
26389          ZTEMP(ICOUNT)=Z(J)
26390          ILAST=J
26391        ELSEIF(X(J).GT.XT)THEN
26392          GOTO1421
26393        ENDIF
26394 1420   CONTINUE
26395 1421   CONTINUE
26396C
26397        ISTART=ILAST+1
26398        CALL SORTC(YTEMP,ZTEMP,ICOUNT,YTEMP,ZTEMP)
26399        DO1471K=1,NDISTY
26400          TAG=YDIST(K)
26401          J=0
26402          DO1472II=1,ICOUNT
26403            IF(YTEMP(II).EQ.TAG)THEN
26404              J=J+1
26405              ZTEMP2(J)=ZTEMP(II)
26406            END IF
26407 1472     CONTINUE
26408          NI=J
26409          IF(NI.EQ.1)THEN
26410            NUMZ=NUMZ+1
26411            ZDIST(NUMZ)=ZTEMP2(1)
26412          ELSE IF(NI.GT.1)THEN
26413            CALL MEAN(ZTEMP2,NI,IWRITE,ZMEAN,IBUGG3,IERROR)
26414            NUMZ=NUMZ+1
26415            ZDIST(NUMZ)=ZMEAN
26416          ELSE
26417            WRITE(ICOUT,999)
26418            CALL DPWRST('XXX','BUG ')
26419            WRITE(ICOUT,1491)
26420            CALL DPWRST('XXX','BUG ')
26421            WRITE(ICOUT,1492)
26422            CALL DPWRST('XXX','BUG ')
26423            IERROR='YES'
26424            GOTO9000
26425          ENDIF
26426 1471   CONTINUE
26427C
26428 1410 CONTINUE
26429C
26430 1491 FORMAT('******* ERROR FROM BIVAR.  ORIGINAL X AND Y')
26431 1492 FORMAT('        DATA DO NOT FORM A RECTANGULAR GRID.  ******')
26432C
26433C               ********************************************
26434C               **  STEP 15--                             **
26435C               **  CHECK FOR USER PARAMETERS XDEGREE AND **
26436C               **  YDEGREE FOR ORDER OF POLYNOMIALS      **
26437C               ********************************************
26438C
26439      IXDEG=4
26440      IYDEG=4
26441C
26442      XDEG=3.0
26443      IHP='XDEG'
26444      IHP2='REE '
26445      IHWUSE='P'
26446      MESSAG='NO'
26447      CALL CHECKN(IHP,IHP2,IHWUSE,
26448     1            IHNAME,IHNAM2,IUSE,IN,IVALUE,VALUE,NUMNAM,MAXNAM,
26449     1            ISUBN1,ISUBN2,MESSAG,IANS,IWIDTH,ILOCP,IERROR)
26450      IF(IERROR.EQ.'YES')GOTO1510
26451      XDEG=VALUE(ILOCP)
26452 1510 CONTINUE
26453C
26454      IXDEG=INT(XDEG+0.5)
26455      IF(IXDEG.LT.1.OR.IXDEG.GT.3)THEN
26456        WRITE(ICOUT,999)
26457        CALL DPWRST('XXX','BUG ')
26458        WRITE(ICOUT,1511)
26459 1511   FORMAT('***** ERROR IN BIVAR--')
26460        CALL DPWRST('XXX','BUG ')
26461        WRITE(ICOUT,1512)
26462 1512   FORMAT('      THE POLYNOMIAL DEGREE FOR THE B-SPLINE IN THE')
26463        CALL DPWRST('XXX','BUG ')
26464        WRITE(ICOUT,1514)
26465 1514   FORMAT('      X DIRECTION MUST BE BETWEEN 1 AND 3 INCLUSIVE;')
26466        CALL DPWRST('XXX','BUG ')
26467        WRITE(ICOUT,1515)
26468 1515   FORMAT('      SUCH WAS NOT THE CASE HERE.')
26469        CALL DPWRST('XXX','BUG ')
26470        WRITE(ICOUT,1516)XDEG
26471 1516   FORMAT('      THE CURRENT VALUE OF XDEGREE IS ',E15.7)
26472        CALL DPWRST('XXX','BUG ')
26473        WRITE(ICOUT,1517)
26474 1517   FORMAT('      A VALUE OF 3.0 WILL BE USED')
26475        CALL DPWRST('XXX','BUG ')
26476        IXDEG=3
26477      ENDIF
26478      IXDEG=IXDEG+1
26479C
26480      YDEG=3.0
26481      IHP='YDEG'
26482      IHP2='REE '
26483      IHWUSE='P'
26484      MESSAG='NO'
26485      CALL CHECKN(IHP,IHP2,IHWUSE,
26486     1            IHNAME,IHNAM2,IUSE,IN,IVALUE,VALUE,NUMNAM,MAXNAM,
26487     1            ISUBN1,ISUBN2,MESSAG,IANS,IWIDTH,ILOCP,IERROR)
26488      IF(IERROR.EQ.'YES')GOTO1610
26489      YDEG=VALUE(ILOCP)
26490 1610 CONTINUE
26491C
26492      IYDEG=INT(YDEG+0.5)
26493      IF(IYDEG.GE.1.AND.IYDEG.LE.3)GOTO1619
26494      WRITE(ICOUT,999)
26495      CALL DPWRST('XXX','BUG ')
26496      WRITE(ICOUT,1511)
26497      CALL DPWRST('XXX','BUG ')
26498      WRITE(ICOUT,1512)
26499      CALL DPWRST('XXX','BUG ')
26500      WRITE(ICOUT,1614)
26501 1614 FORMAT('      Y DIRECTION MUST BE BETWEEN 1 AND 3 INCLUSIVE;')
26502      CALL DPWRST('XXX','BUG ')
26503      WRITE(ICOUT,1615)
26504 1615 FORMAT('      SUCH WAS NOT THE CASE HERE.')
26505      CALL DPWRST('XXX','BUG ')
26506      WRITE(ICOUT,1616)YDEG
26507 1616 FORMAT('      THE CURRENT VALUE OF YDEGREE IS ',G15.7)
26508      CALL DPWRST('XXX','BUG ')
26509      WRITE(ICOUT,1617)
26510 1617 FORMAT('      A VALUE OF 3.0 WILL BE USED')
26511      CALL DPWRST('XXX','BUG ')
26512      IYDEG=3
26513 1619 CONTINUE
26514      IYDEG=IYDEG+1
26515C
26516C
26517C               ********************************************
26518C               **  STEP 15--                             **
26519C               **  COMPUTE INTERPOLATED VALUES           **
26520C               ********************************************
26521C
26522      CALL BIVAR2(ZDIST,YDIST,XDIST,NDISTX,NDISTY,Y2,X2,N2,Z2,
26523     1            IXDEG,IYDEG,
26524     1            TX,TY,WORK,ISPACE,
26525     1            IBUGG3,ISUBRO,IERROR)
26526C
26527C               *****************
26528C               **  STEP 90--  **
26529C               **  EXIT.      **
26530C               *****************
26531C
26532 9000 CONTINUE
26533      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'IVAR')THEN
26534        WRITE(ICOUT,999)
26535        CALL DPWRST('XXX','BUG ')
26536        WRITE(ICOUT,9011)
26537 9011   FORMAT('***** AT THE END       OF BIVAR--')
26538        CALL DPWRST('XXX','BUG ')
26539        DO9042I=1,N2
26540          WRITE(ICOUT,9043)I,X2(I),Y2(I),Z2(I)
26541 9043     FORMAT('I,X2(I),Y2(I),Z2(I) = ',I8,3G15.7)
26542          CALL DPWRST('XXX','BUG ')
26543 9042   CONTINUE
26544        WRITE(ICOUT,9051)NDISTX,NDISTY
26545 9051   FORMAT('NDISTX,NDISTY = ',2I8)
26546        CALL DPWRST('XXX','BUG ')
26547        DO9052I=1,NDISTX
26548          DO9054J=1,NDISTY
26549            WRITE(ICOUT,9053)I,J,XDIST(I),YDIST(J),ZDIST((I-1)*NDISTY+J)
26550 9053       FORMAT('I,J,XDIST(I),YDIST(J),ZDIST = ',2I8,3G15.7)
26551            CALL DPWRST('XXX','BUG ')
26552 9054     CONTINUE
26553 9052   CONTINUE
26554      ENDIF
26555C
26556      RETURN
26557      END
26558      SUBROUTINE BIVAR2(Z,Y,X,NX,NY,Y2,X2,N2,Z2,
26559     1                  IXDEG,IYDEG,
26560     1                  TX,TY,WORK,ISPACE,
26561     1                  IBUGG3,ISUBRO,IERROR)
26562C
26563C     PURPOSE--COMPUTE BI-LINEAR INTERPOLATION OF A VARIABLE
26564C              (GENERATE INTERPOLATED POINTS).  THIS ROUTINE USES THE
26565C              B2INK AND B2VAL ROUTINES FROM CMLIB WRITTEN BY
26566C              RON BOISVERT OF NIST.
26567C     INPUT  ARGUMENTS--Z      = SINGLE PRECISION VARIABLE
26568C                                CONTAINING THE ORIGINAL
26569C                                Z AXIS DATA POINTS.
26570C                     --Y      = SINGLE PRECISION VARIABLE
26571C                                CONTAINING THE ORIGINAL
26572C                                VERTICAL AXIS DATA POINTS.
26573C                     --X      = SINGLE PRECISION VARIABLE
26574C                                CONTAINING THE ORIGINAL
26575C                                HORIZONTAL AXIS DATA POINTS.
26576C                     --Y2     = SINGLE PRECISION VARIABLE
26577C                                CONTAINING THE DESIRED
26578C                                VERTICAL AXIS INTERPOLATION
26579C                     --X2     = SINGLE PRECISION VARIABLE
26580C                                CONTAINING THE DESIRED
26581C                                HORIZONTAL AXIS INTERPOLATION
26582C                                POINTS.
26583C     OUTPUT ARGUMENTS--Z2     = SINGLE PRECISION VARIABLE
26584C                                CONTAINING THE COMPUTED
26585C                                VERTICAL AXIS INTERPOLATION
26586C                                POINTS.
26587C     NOTE--IT IS PROBABLY NOT PERMISSIBLE TO HAVE THE OUTPUT VECTOR
26588C           Z2(.) BEING IDENTICAL TO THE INPUT VECTOR Z(.)
26589C     NOTE--THE X AND Y POINTS ARE ASSUMED TO LIE ON A RECTANGULAR GRID
26590C     WRITTEN BY--ALAN HECKERT
26591C                 STATISTICAL ENGINEERING DIVISION
26592C                 INFORMATION TECHNOLOGY LABORATORY
26593C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
26594C                 GAITHERSBURG, MD 20899-8980
26595C                 PHONE--301-975-2899
26596C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26597C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
26598C     LANGUAGE--ANSI FORTRAN (1977)
26599C     VERSION NUMBER--94/5
26600C     ORIGINAL VERSION--MAY       1994.
26601C
26602C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26603C
26604      CHARACTER*4 IBUGG3
26605      CHARACTER*4 ISUBRO
26606      CHARACTER*4 IERROR
26607C
26608      CHARACTER*4 ISUBN1
26609      CHARACTER*4 ISUBN2
26610C
26611C---------------------------------------------------------------------
26612C
26613C
26614      DIMENSION Z(*)
26615      DIMENSION Y(*)
26616      DIMENSION X(*)
26617      DIMENSION Z2(*)
26618      DIMENSION Y2(*)
26619      DIMENSION X2(*)
26620      DIMENSION TX(*)
26621      DIMENSION TY(*)
26622      DIMENSION WORK(*)
26623C
26624C-----COMMON VARIABLES (GENERAL)--------------------------------------
26625C
26626      INCLUDE 'DPCOP2.INC'
26627C
26628C-----START POINT-----------------------------------------------------
26629C
26630      ISUBN1='BIVA'
26631      ISUBN2='R2  '
26632      IERROR='NO'
26633C
26634      DO10I=1,N2
26635        Z2(I)=0.0
26636 10   CONTINUE
26637C
26638      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'VAR2')THEN
26639        WRITE(ICOUT,999)
26640  999   FORMAT(1X)
26641        CALL DPWRST('XXX','BUG ')
26642        WRITE(ICOUT,51)
26643   51   FORMAT('***** AT THE BEGINNING OF BIVAR2--')
26644        CALL DPWRST('XXX','BUG ')
26645        WRITE(ICOUT,52)NX,NY,N2
26646   52   FORMAT('NX,NY,N2 = ',3I8)
26647        CALL DPWRST('XXX','BUG ')
26648        DO54I=1,NX
26649          DO55J=1,NY
26650            INDX=(I-1)*NY+J
26651            WRITE(ICOUT,53)I,J,X(I),Y(J),Z(INDX)
26652            CALL DPWRST('XXX','BUG ')
26653 53         FORMAT('I,J,X(I),Y(J),Z = ',2I8,3E15.7)
26654            CALL DPWRST('XXX','BUG ')
26655 55       CONTINUE
26656 54     CONTINUE
26657        DO65I=1,N2
26658          WRITE(ICOUT,66)I,Y2(I),X2(I)
26659   66     FORMAT('I,Y2(I),X2(I) = ',I8,2G15.7)
26660          CALL DPWRST('XXX','BUG ')
26661   65   CONTINUE
26662      ENDIF
26663C
26664C               ****************************************
26665C               **  STEP 31--
26666C               **  COMPUTE INTERPOLATION VALUES
26667C               ****************************************
26668C
26669      DO3100J=1,N2
26670      XT=X2(J)
26671      IF(X(1).GT.XT.OR.XT.GT.X(NX))GOTO3110
26672      YT=Y2(J)
26673      IF(Y(1).GT.YT.OR.YT.GT.Y(NY))GOTO3120
26674      GOTO3129
26675C
26676 3110 CONTINUE
26677      WRITE(ICOUT,999)
26678      CALL DPWRST('XXX','BUG ')
26679      WRITE(ICOUT,3111)
26680 3111 FORMAT('***** ERROR IN BIVAR2--')
26681      CALL DPWRST('XXX','BUG ')
26682      WRITE(ICOUT,3112)
26683 3112 FORMAT('      AN ATTEMPT WAS MADE TO COMPUTE')
26684      CALL DPWRST('XXX','BUG ')
26685      WRITE(ICOUT,3113)
26686 3113 FORMAT('      A SMOOTHED VALUE BEYOND THE X RANGE')
26687      CALL DPWRST('XXX','BUG ')
26688      WRITE(ICOUT,3114)
26689 3114 FORMAT('      OF THE DATA--SUCH EXTRAPOLATION')
26690      CALL DPWRST('XXX','BUG ')
26691      WRITE(ICOUT,3115)
26692 3115 FORMAT('      IS UNRELIABLE AND NOT PERMITTED.')
26693      CALL DPWRST('XXX','BUG ')
26694      WRITE(ICOUT,3116)X(1)
26695 3116 FORMAT('         SMALLEST DATA POINT X(1)      = ',E15.7)
26696      CALL DPWRST('XXX','BUG ')
26697      WRITE(ICOUT,3117)X(NX)
26698 3117 FORMAT('         LARGEST DATA POINT  X(NX)     = ',E15.7)
26699      CALL DPWRST('XXX','BUG ')
26700      WRITE(ICOUT,3118)XT
26701 3118 FORMAT('         ATTEMPTED EXTRAPOLATION POINT = ',E15.7)
26702      CALL DPWRST('XXX','BUG ')
26703      IERROR='YES'
26704      GOTO9000
26705C
26706 3120 CONTINUE
26707      WRITE(ICOUT,999)
26708      CALL DPWRST('XXX','BUG ')
26709      WRITE(ICOUT,3121)
26710 3121 FORMAT('***** ERROR IN BIVAR2--')
26711      CALL DPWRST('XXX','BUG ')
26712      WRITE(ICOUT,3122)
26713 3122 FORMAT('      AN ATTEMPT WAS MADE TO COMPUTE')
26714      CALL DPWRST('XXX','BUG ')
26715      WRITE(ICOUT,3123)
26716 3123 FORMAT('      A SMOOTHED VALUE BEYOND THE Y RANGE')
26717      CALL DPWRST('XXX','BUG ')
26718      WRITE(ICOUT,3124)
26719 3124 FORMAT('      OF THE DATA--SUCH EXTRAPOLATION')
26720      CALL DPWRST('XXX','BUG ')
26721      WRITE(ICOUT,3125)
26722 3125 FORMAT('      IS UNRELIABLE AND NOT PERMITTED.')
26723      CALL DPWRST('XXX','BUG ')
26724      WRITE(ICOUT,3126)Y(1)
26725 3126 FORMAT('         SMALLEST DATA POINT Y(1)      = ',E15.7)
26726      CALL DPWRST('XXX','BUG ')
26727      WRITE(ICOUT,3127)Y(NY)
26728 3127 FORMAT('         LARGEST DATA POINT  Y(NY)     = ',E15.7)
26729      CALL DPWRST('XXX','BUG ')
26730      WRITE(ICOUT,3128)YT
26731 3128 FORMAT('         ATTEMPTED EXTRAPOLATION POINT = ',E15.7)
26732      CALL DPWRST('XXX','BUG ')
26733      IERROR='YES'
26734      GOTO9000
26735C
26736 3129 CONTINUE
26737 3100 CONTINUE
26738C
26739      IFLAG=0
26740      CALL B2INK(X,NX,Y,NY,Z,NX,IXDEG,IYDEG,TX,TY,Z,
26741     1           WORK,ISPACE,IFLAG)
26742      IF(IFLAG.GT.1)THEN
26743        IERROR='YES'
26744        WRITE(ICOUT,3130)IFLAG
26745        CALL DPWRST('XXX','BUG ')
26746 3130   FORMAT('***** B2INK RETURNED ERROR CODE ',I2)
26747        WRITE(ICOUT,3131)
26748        CALL DPWRST('XXX','BUG ')
26749 3131   FORMAT('      NO INTERPOLATION PERFORMED.     *****')
26750        GOTO9000
26751      ENDIF
26752C
26753      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'VAR2')THEN
26754        DO3191J=1,NX+IXDEG
26755          WRITE(ICOUT,3192)J,TX(J)
26756          CALL DPWRST('XXX','BUG ')
26757 3192     FORMAT('J,TX(J) = ',I5,1X,G15.7)
26758 3191   CONTINUE
26759        DO3193J=1,NY+IYDEG
26760          WRITE(ICOUT,3194)J,TY(J)
26761          CALL DPWRST('XXX','BUG ')
26762 3194     FORMAT('J,TY(J) = ',I5,1X,G15.7)
26763 3193   CONTINUE
26764      ENDIF
26765C
26766      IDX=0
26767      IDY=0
26768      DO3200I=1,N2
26769        XVAL=X2(I)
26770        YVAL=Y2(I)
26771        Z2(I)=B2VAL(XVAL,YVAL,IDX,IDY,TX,TY,NX,NY,IXDEG,IYDEG,
26772     1             Z,WORK)
26773 3200 CONTINUE
26774C
26775C               ****************************************
26776C               **  STEP 41--                         **
26777C               **  IF CALLED FOR,                    **
26778C               **  WRITE OUT INTERPOLATION VALUES    **
26779C               ****************************************
26780C
26781      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.NE.'VAR2')THEN
26782        DO4100J=1,N2
26783          WRITE(ICOUT,4110)X2(J),Y2(J),Z2(J)
26784          CALL DPWRST('XXX','BUG ')
26785 4110     FORMAT('X2(J),Y2(J),Z2(J) = ',3G15.7)
26786 4100   CONTINUE
26787      ENDIF
26788C
26789C               *****************
26790C               **  STEP 90--  **
26791C               **  EXIT.      **
26792C               *****************
26793C
26794 9000 CONTINUE
26795      IF(IBUGG3.EQ.'ON'.OR.ISUBRO.EQ.'VAR2')THEN
26796        WRITE(ICOUT,999)
26797        CALL DPWRST('XXX','BUG ')
26798        WRITE(ICOUT,9011)
26799 9011   FORMAT('***** AT THE END       OF BIVAR2--')
26800        CALL DPWRST('XXX','BUG ')
26801      ENDIF
26802C
26803      RETURN
26804      END
26805      SUBROUTINE BIWMCV(X,Y,N,IWRITE,XTEMP,XTEMP2,MAXNXT,XBWCOV,
26806     1IBUGA3,IERROR)
26807C
26808C     PURPOSE--THIS SUBROUTINE COMPUTES THE
26809C              SAMPLE BIWEIGHT MID-COVARIANCE ESTIMATOR
26810C              OF THE DATA IN THE INPUT VECTOR X.
26811C              THE SAMPLE BIWEIGHT MID-COVARIANCE ESTIMATE IS DEFINED AS:
26812C                 s(bxy)**2 = SUM'[{a(i)*(x-x')**2*(1-u**2)**2}*
26813C                             {b(i)*(y-y')**2*(1-v**2)**2}]/
26814C                            {SUM'[a(i)*(1-u**2)*(1-5*u**2)]*
26815C                            SUM'[b(i)*(1-v**2)*(1-5*v**2)]}
26816C              WHERE
26817C                 y' = MEDIAN OF Y
26818C                 x' = MEDIAN OF X
26819C                 MAD = MEDIAN ABSOLUTE DEVIATION
26820C                 u(i) = (X(i) - x')/(9*MAD)
26821C                 v(i) = (Y(i) - y')/(9*MAD)
26822C                 a(i) = 1 if |u(i)| <= 1, 0 otherwise
26823C                 b(i) = 1 if |v(i)| <= 1, 0 otherwise
26824C                 SUM' means the summation is for u**2 < 1 or v**2 < 1
26825C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
26826C                                (UNSORTED OR SORTED) OBSERVATIONS.
26827C                     --Y      = THE SINGLE PRECISION VECTOR OF
26828C                                (UNSORTED OR SORTED) OBSERVATIONS.
26829C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
26830C                                IN THE VECTORS X AND Y.
26831C     OUTPUT ARGUMENTS--XBWCOV    = THE SINGLE PRECISION VALUE OF THE
26832C                                COMPUTED SAMPLE BIWEIGHT MID-COVARIANCE
26833C                                ESTIMATE.
26834C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
26835C             SAMPLE BIWEIGHT LOCATION ESTIMATE.
26836C     OTHER DATAPLOT  SUBROUTINES NEEDED--MEDIAN, MAD
26837C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
26838C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
26839C     LANGUAGE--ANSI FORTRAN (1977)
26840C     REFERENCES--MOSTELLER AND TUKEY, 'DATA ANALYSIS AND REGRESSION'
26841C                 ADDISON AND WESLEY, 1977, PP. 204-206.
26842C     REFERENCES--RAND R. WILCOX, 'INTORIDUCTION TO ROBUST ESTIMATION
26843C                 AND HYPOTHESIS TESTING'
26844C                 ACADEMIC PRESS, 1997. PP. 196-197.
26845C     WRITTEN BY--JAMES J. FILLIBEN
26846C                 STATISTICAL ENGINEERING DIVISION
26847C                 INFORMATION TECHNOLOGY LABORATORY
26848C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
26849C                 GAITHERSBURG, MD 20899-8980
26850C                 PHONE--301-975-2899
26851C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
26852C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
26853C     LANGUAGE--ANSI FORTRAN (1977)
26854C     VERSION NUMBER--2002/7
26855C     ORIGINAL VERSION--JULY      2002.
26856C     UPDATED         --JULY      2010. CALL LIST TO MAD
26857C
26858C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
26859C
26860      CHARACTER*4 IWRITE
26861      CHARACTER*4 IBUGA3
26862      CHARACTER*4 IERROR
26863C
26864      CHARACTER*4 IWRIT2
26865C
26866      CHARACTER*4 ISUBN1
26867      CHARACTER*4 ISUBN2
26868C
26869C---------------------------------------------------------------------
26870C
26871C
26872      DOUBLE PRECISION DSUM1
26873      DOUBLE PRECISION DSUM2
26874      DOUBLE PRECISION DSUM3
26875      DOUBLE PRECISION DUI
26876      DOUBLE PRECISION DSBI
26877C
26878      DIMENSION X(*)
26879      DIMENSION Y(*)
26880      DIMENSION XTEMP(*)
26881      DIMENSION XTEMP2(*)
26882C
26883C---------------------------------------------------------------------
26884C
26885      INCLUDE 'DPCOP2.INC'
26886C
26887C-----START POINT-----------------------------------------------------
26888C
26889      ISUBN1='BIWM'
26890      ISUBN2='CV  '
26891      XBWCOV=0.0
26892C
26893      IERROR='NO'
26894C
26895      IF(IBUGA3.EQ.'ON')THEN
26896        WRITE(ICOUT,999)
26897  999   FORMAT(1X)
26898        CALL DPWRST('XXX','BUG ')
26899        WRITE(ICOUT,51)
26900   51   FORMAT('***** AT THE BEGINNING OF BIWMCV--')
26901        CALL DPWRST('XXX','BUG ')
26902        WRITE(ICOUT,52)IBUGA3,N
26903   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
26904        CALL DPWRST('XXX','BUG ')
26905        DO55I=1,N
26906          WRITE(ICOUT,56)I,X(I)
26907   56     FORMAT('I,X(I) = ',I8,G15.7)
26908          CALL DPWRST('XXX','BUG ')
26909   55   CONTINUE
26910      ENDIF
26911C
26912C               ***********************************************
26913C               **  COMPUTE BIWEIGHT MID-COVARIANCE ESTIMATE **
26914C               ***********************************************
26915C
26916C               ********************************************
26917C               **  STEP 1--                              **
26918C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
26919C               ********************************************
26920C
26921      AN=N
26922C
26923      IF(N.LT.1)THEN
26924        WRITE(ICOUT,999)
26925        CALL DPWRST('XXX','BUG ')
26926        WRITE(ICOUT,111)
26927  111   FORMAT('***** ERROR IN BIWEIGHT MID-COVARIANCE--')
26928        CALL DPWRST('XXX','BUG ')
26929        WRITE(ICOUT,112)
26930  112   FORMAT('      THE RESPONSE VARIABLE HAS LESS THAN ONE ',
26931     1         'OBSERVATION.')
26932        CALL DPWRST('XXX','BUG ')
26933        WRITE(ICOUT,117)N
26934  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
26935        CALL DPWRST('XXX','BUG ')
26936        IERROR='YES'
26937        GOTO9000
26938      ENDIF
26939C
26940      HOLD=X(1)
26941      DO135I=2,N
26942      IF(X(I).NE.HOLD)GOTO139
26943  135 CONTINUE
26944      XBWCOV=0.0
26945      GOTO8000
26946  139 CONTINUE
26947C
26948C               ******************************************************
26949C               **  STEP 2--                                        **
26950C               **  COMPUTE THE BIWEIGHT MID-COVARIANCE ESTIMATE.   **
26951C               ******************************************************
26952C
26953      IWRIT2='OFF'
26954      CALL MEDIAN(X,N,IWRIT2,XTEMP,MAXNXT,XMED,IBUGA3,IERROR)
26955      CALL MAD(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,XMAD,IBUGA3,IERROR)
26956C
26957      CALL MEDIAN(Y,N,IWRIT2,XTEMP,MAXNXT,YMED,IBUGA3,IERROR)
26958      CALL MAD(Y,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,YMAD,IBUGA3,IERROR)
26959C
26960      DSUM1=0.0D0
26961      DSUM2=0.0D0
26962      DSUM3=0.0D0
26963      DO300I=1,N
26964        DUI=DBLE((X(I) - XMED)/(9.0*XMAD))
26965        DVI=DBLE((Y(I) - YMED)/(9.0*YMAD))
26966        IF(DUI*DUI.LE.1.0D0)THEN
26967          DTERM1=DBLE(X(I)-XMED)*(1.0D0 - DUI**2)**2
26968          DSUM2=DSUM2 + (1.0D0 - DUI**2)*(1.0D0 - 5.0D0*DUI**2)
26969        ELSE
26970          DTERM1=0.0D0
26971        ENDIF
26972        IF(DVI*DVI.LE.1.0D0)THEN
26973          DTERM2=DBLE(Y(I)-YMED)*(1.0D0 - DVI**2)**2
26974          DSUM3=DSUM3 + (1.0D0 - DVI**2)*(1.0D0 - 5.0D0*DVI**2)
26975        ELSE
26976          DTERM2=0.0D0
26977        ENDIF
26978        DSUM1=DSUM1 + DTERM1*DTERM2
26979  300 CONTINUE
26980      DSBI=DBLE(N)*DSUM1/(DSUM2*DSUM3)
26981      XBWCOV=REAL(DSBI)
26982C
26983C               *******************************
26984C               **  STEP 3--                 **
26985C               **  WRITE OUT A LINE         **
26986C               **  OF SUMMARY INFORMATION.  **
26987C               *******************************
26988C
26989 8000 CONTINUE
26990      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
26991        WRITE(ICOUT,999)
26992        CALL DPWRST('XXX','BUG ')
26993        WRITE(ICOUT,811)N,XBWCOV
26994  811   FORMAT('THE BIWEIGHT MID-COVARIANCE ESTIMATE OF THE ',I8,
26995     1         ' OBSERVATIONS = ',E15.7)
26996        CALL DPWRST('XXX','BUG ')
26997      ENDIF
26998C
26999C               *****************
27000C               **  STEP 90--  **
27001C               **  EXIT.      **
27002C               *****************
27003C
27004 9000 CONTINUE
27005      IF(IBUGA3.EQ.'ON')THEN
27006        WRITE(ICOUT,999)
27007        CALL DPWRST('XXX','BUG ')
27008        WRITE(ICOUT,9011)
27009 9011   FORMAT('***** AT THE END       OF BIWMCV--')
27010        CALL DPWRST('XXX','BUG ')
27011        WRITE(ICOUT,9012)IBUGA3,IERROR,N
27012 9012   FORMAT('IBUGA3,IERROR,N = ',A4,2X,A4,2X,I8)
27013        CALL DPWRST('XXX','BUG ')
27014        WRITE(ICOUT,9015)XMED,XMAD,YMED,YMAD,XBWCOV
27015 9015   FORMAT('XMED,XMAD,YMED,YMAD,XBWCOV = ',5G15.7)
27016        CALL DPWRST('XXX','BUG ')
27017      ENDIF
27018C
27019      RETURN
27020      END
27021      SUBROUTINE BIWEIG(RES,N,IWRITE,WEIGHT,IBUGA3,IERROR)
27022C
27023C     PURPOSE--DETERMINE THE N VERTICAL (ROBUST) WEIGHTS WEIGHT(.)
27024C              BASED ON A BIWEIGHT WEIGHTING SCHEME OF
27025C              THE RESIDUALS IN RES(.).
27026C     NOTE--IF ALL INPUT RESIDUALS ARE ZERO, THIS SUBROUTINE
27027C           WILL OUTPUT ALL WEIGHTS AS UNITY.
27028C     REFERENCE--CHAMBERS, ET AL.  GRAPHICAL METHODS FOR DATA ANALYSIS.
27029C                WADSWORTH, 11013, PAGES 98-101, 122-123.
27030C     WRITTEN BY--JAMES J. FILLIBEN
27031C                 STATISTICAL ENGINEERING DIVISION
27032C                 INFORMATION TECHNOLOGY LABORATORY
27033C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
27034C                 GAITHERSBURG, MD 20899-8980
27035C                 PHONE--301-921-3651
27036C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27037C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
27038C     LANGUAGE--ANSI FORTRAN (1977)
27039C     VERSION NUMBER--88/2
27040C     ORIGINAL VERSION--FEBRUARY   1988
27041C
27042C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27043C
27044      CHARACTER*4 IWRITE
27045      CHARACTER*4 IBUGA3
27046      CHARACTER*4 IERROR
27047C
27048      CHARACTER*4 ISUBN1
27049      CHARACTER*4 ISUBN2
27050C
27051C---------------------------------------------------------------------
27052C
27053      DIMENSION RES(*)
27054      DIMENSION WEIGHT(*)
27055C
27056C---------------------------------------------------------------------
27057C
27058      INCLUDE 'DPCOP2.INC'
27059C
27060C-----START POINT-----------------------------------------------------
27061C
27062      ISUBN1='BIWE'
27063      ISUBN2='IG  '
27064      IERROR='NO'
27065C
27066      IF(IBUGA3.EQ.'ON')THEN
27067        WRITE(ICOUT,999)
27068  999   FORMAT(1X)
27069        CALL DPWRST('XXX','BUG ')
27070        WRITE(ICOUT,51)
27071   51   FORMAT('***** AT THE BEGINNING OF BIWEIG--')
27072        CALL DPWRST('XXX','BUG ')
27073        WRITE(ICOUT,52)IBUGA3,IERROR,IWRITE,N
27074   52   FORMAT('IBUGA3,IERROR,IWRITE,N = ',3(A4,2X),I8)
27075        CALL DPWRST('XXX','BUG ')
27076        IF(N.GE.1)THEN
27077          DO61I=1,N
27078            WRITE(ICOUT,62)I,RES(I)
27079   62       FORMAT('I,RES(I) = ',I8,G15.7)
27080            CALL DPWRST('XXX','BUG ')
27081   61     CONTINUE
27082        ENDIF
27083      ENDIF
27084C
27085C               ********************************************
27086C               **  STEP 1--                              **
27087C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27088C               ********************************************
27089C
27090      IF(N.LT.1)THEN
27091        WRITE(ICOUT,999)
27092        CALL DPWRST('XXX','BUG ')
27093        WRITE(ICOUT,111)
27094  111   FORMAT('***** ERROR IN BIWEIG--')
27095        CALL DPWRST('XXX','BUG ')
27096        WRITE(ICOUT,112)
27097  112   FORMAT('      THE INPUT FULL SAMPLE SIZE, FOR WHICH BIWEIGHT')
27098        CALL DPWRST('XXX','BUG ')
27099        WRITE(ICOUT,114)
27100  114   FORMAT('      WEIGHTS ARE TO BE COMPUTED, MUST BE 1 OR LARGER.')
27101        CALL DPWRST('XXX','BUG ')
27102        WRITE(ICOUT,115)
27103  115   FORMAT('      SUCH WAS NOT THE CASE HERE.')
27104        CALL DPWRST('XXX','BUG ')
27105        WRITE(ICOUT,116)N
27106  116   FORMAT('      THE FULL SAMPLE SIZE N = ',I8)
27107        CALL DPWRST('XXX','BUG ')
27108        WRITE(ICOUT,999)
27109        CALL DPWRST('XXX','BUG ')
27110        IERROR='YES'
27111        GOTO9000
27112      ENDIF
27113C
27114C               ***************************************************
27115C               **  STEP 11--                                    **
27116C               **  COMPUTE THE BIWEIGHT WEIGHTING               **
27117C               **     1) COMPUTE ABSOLUTE VALUE OF RESIDUALS    **
27118C               **     2) COMPUTE MEDIAN ABSOLUTE VALUE RESIDUAL **
27119C               **     3) COMPUTE CUTOFF = +-6*M.A.R.            **
27120C               **     4) ASSIGN 0 WEIGHTS OUTSIDE OF REGION     **
27121C               **     5) ASSIGN BIWEIGHTS INSIDE OF REGION      **
27122C               ***************************************************
27123C
27124      DO1100I=1,N
27125        WEIGHT(I)=ABS(RES(I))
27126 1100 CONTINUE
27127C
27128      CALL SORT(WEIGHT,N,WEIGHT)
27129      IEVODD=N-(N/2)*2
27130      NMID=N/2
27131      NMIDP1=NMID+1
27132      IF(IEVODD.EQ.0)XMEDAR=(WEIGHT(NMID)+WEIGHT(NMIDP1))/2.0
27133      IF(IEVODD.EQ.1)XMEDAR=WEIGHT(NMIDP1)
27134C
27135      IF(XMEDAR.EQ.0.0)THEN
27136        CONST=(-999.0)
27137        DO1111I=1,N
27138          WEIGHT(I)=1.0
27139 1111   CONTINUE
27140        SUM=REAL(N)
27141      ELSE
27142        CONST=6.0*XMEDAR
27143        SUM=0.0
27144        DO1121I=1,N
27145          U=RES(I)/CONST
27146          WEIGHT(I)=0.0
27147          IF(-1.0.LE.U.AND.U.LE.1.0)WEIGHT(I)=(1.0-U**2)**2
27148          SUM=SUM + WEIGHT(I)
27149 1121   CONTINUE
27150      ENDIF
27151C
27152      IF(SUM.LE.0.0)THEN
27153        DO1131I=1,N
27154          WEIGHT(I)=1.0
27155 1131   CONTINUE
27156      ENDIF
27157C
27158C               *****************
27159C               **  STEP 90--  **
27160C               **  EXIT       **
27161C               *****************
27162C
27163 9000 CONTINUE
27164      IF(IBUGA3.EQ.'ON')THEN
27165        WRITE(ICOUT,999)
27166        CALL DPWRST('XXX','BUG ')
27167        WRITE(ICOUT,9011)
27168 9011   FORMAT('***** AT THE END       OF BIWEIG--')
27169        CALL DPWRST('XXX','BUG ')
27170        WRITE(ICOUT,9012)IBUGA3,IERROR,N,XMEDAR
27171 9012   FORMAT('IBUGA3,IERROR,N,XMEDAR = ',2(A4,2X),I8,G15.7)
27172        CALL DPWRST('XXX','BUG ')
27173        IF(N.GE.1)THEN
27174          DO9021I=1,N
27175            WRITE(ICOUT,9022)I,RES(I),WEIGHT(I)
27176 9022       FORMAT('I,RES(I),WEIGHT(I) = ',I8,2G15.7)
27177            CALL DPWRST('XXX','BUG ')
27178 9021     CONTINUE
27179        ENDIF
27180      ENDIF
27181C
27182      RETURN
27183      END
27184      SUBROUTINE BIWMDV(X,N,IWRITE,XTEMP,XTEMP2,MAXNXT,XBWMDV,
27185     1IBUGA3,IERROR)
27186C
27187C     PURPOSE--THIS SUBROUTINE COMPUTES THE
27188C              SAMPLE BIWEIGHT MIDVARIANCE ESTIMATOR
27189C              OF THE DATA IN THE INPUT VECTOR X.
27190C              THE SAMPLE BIWEIGHT MIDVARIANCE ESTIMATE IS DEFINED AS:
27191C                 s(bi)**2 = SUM'[(y-y')**2*(1-u**2)**4]/
27192C                            {SUM'[1-u**2)*(1-5*u**2)]**2}
27193C              WHERE
27194C                 y' = MEDIAN OF Y
27195C                 MAD = MEDIAN ABSOLUTE DEVIATION
27196C                 u(i) = (Y(i) - y')/(9*MAD)
27197C                 SUM' means the summation is for u**2 <= 1
27198C              NOTE THAT THIS IS A SLIGHT VARIATION OF THE
27199C                   BIWEIGHT SCALE ESTIMATE.
27200C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
27201C                                (UNSORTED OR SORTED) OBSERVATIONS.
27202C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27203C                                IN THE VECTOR X.
27204C     OUTPUT ARGUMENTS--XBWMDV    = THE SINGLE PRECISION VALUE OF THE
27205C                                COMPUTED SAMPLE BIWEIGHT MIDVARIANCE
27206C                                ESTIMATE.
27207C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
27208C             SAMPLE BIWEIGHT LOCATION ESTIMATE.
27209C     OTHER DATAPLOT  SUBROUTINES NEEDED--MEAN, MAD
27210C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27211C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
27212C     LANGUAGE--ANSI FORTRAN (1977)
27213C     REFERENCES--MOSTELLER AND TUKEY, 'DATA ANALYSIS AND REGRESSION'
27214C                 ADDISON AND WESLEY, 1977, PP. 204-206.
27215C     REFERENCES--RAND R. WILCOX, 'INTORIDUCTION TO ROBUST ESTIMATION
27216C                 AND HYPOTHESIS TESTING'
27217C                 ACADEMIC PRESS, 1997.
27218C     WRITTEN BY--JAMES J. FILLIBEN
27219C                 STATISTICAL ENGINEERING DIVISION
27220C                 INFORMATION TECHNOLOGY LABORATORY
27221C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
27222C                 GAITHERSBURG, MD 20899-8980
27223C                 PHONE--301-975-2899
27224C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27225C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
27226C     LANGUAGE--ANSI FORTRAN (1977)
27227C     VERSION NUMBER--2002/7
27228C     ORIGINAL VERSION--JULY      2002.
27229C     UPDATED         --JULY      2010. CALL LIST TO MAD
27230C
27231C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27232C
27233      CHARACTER*4 IWRITE
27234      CHARACTER*4 IBUGA3
27235      CHARACTER*4 IERROR
27236C
27237      CHARACTER*4 IWRIT2
27238C
27239      CHARACTER*4 ISUBN1
27240      CHARACTER*4 ISUBN2
27241C
27242C---------------------------------------------------------------------
27243C
27244      DOUBLE PRECISION DSUM1
27245      DOUBLE PRECISION DSUM2
27246      DOUBLE PRECISION DUI
27247      DOUBLE PRECISION DSBI
27248C
27249      DIMENSION X(*)
27250      DIMENSION XTEMP(*)
27251      DIMENSION XTEMP2(*)
27252C
27253C---------------------------------------------------------------------
27254C
27255      INCLUDE 'DPCOP2.INC'
27256C
27257C-----START POINT-----------------------------------------------------
27258C
27259      ISUBN1='BIWM'
27260      ISUBN2='DV  '
27261      XBWMDV=0.0
27262C
27263      IERROR='NO'
27264C
27265      IF(IBUGA3.EQ.'ON')THEN
27266        WRITE(ICOUT,999)
27267  999   FORMAT(1X)
27268        CALL DPWRST('XXX','BUG ')
27269        WRITE(ICOUT,51)
27270   51   FORMAT('***** AT THE BEGINNING OF BIWMDV--')
27271        CALL DPWRST('XXX','BUG ')
27272        WRITE(ICOUT,52)IBUGA3,N
27273   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
27274        CALL DPWRST('XXX','BUG ')
27275        DO55I=1,N
27276          WRITE(ICOUT,56)I,X(I)
27277   56     FORMAT('I,X(I) = ',I8,G15.7)
27278          CALL DPWRST('XXX','BUG ')
27279   55   CONTINUE
27280      ENDIF
27281C
27282C               ********************************************
27283C               **  COMPUTE BIWEIGHT MIDVARIANCE ESTIMATE **
27284C               ********************************************
27285C
27286C               ********************************************
27287C               **  STEP 1--                              **
27288C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27289C               ********************************************
27290C
27291      AN=N
27292C
27293      IF(N.LT.1)THEN
27294        WRITE(ICOUT,999)
27295        CALL DPWRST('XXX','BUG ')
27296        WRITE(ICOUT,111)
27297  111   FORMAT('***** ERROR IN BIWEIGHT MID-VARIANCE--')
27298        CALL DPWRST('XXX','BUG ')
27299        WRITE(ICOUT,112)
27300  112   FORMAT('      THE RESPONSE VARIABLE HAS LESS THAN ONE ',
27301     1         'OBSERVATION.')
27302        CALL DPWRST('XXX','BUG ')
27303        WRITE(ICOUT,117)N
27304  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
27305        CALL DPWRST('XXX','BUG ')
27306        XBWMDV=CPUMIN
27307        IERROR='YES'
27308        GOTO9000
27309      ENDIF
27310C
27311      HOLD=X(1)
27312      DO135I=2,N
27313      IF(X(I).NE.HOLD)GOTO139
27314  135 CONTINUE
27315      XBWMDV=0.0
27316      GOTO8000
27317  139 CONTINUE
27318C
27319C               ***************************************************
27320C               **  STEP 2--                                     **
27321C               **  COMPUTE THE BIWEIGHT MIDVARIANCE ESTIMATE.   **
27322C               ***************************************************
27323C
27324      IWRIT2='OFF'
27325      CALL MEDIAN(X,N,IWRIT2,XTEMP,MAXNXT,XMED,IBUGA3,IERROR)
27326      CALL MAD(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,XMAD,IBUGA3,IERROR)
27327C
27328      DSUM1=0.0D0
27329      DSUM2=0.0D0
27330      DO300I=1,N
27331        DUI=DBLE((X(I) - XMED)/(9.0*XMAD))
27332        IF(DUI*DUI.LT.1.0D0)THEN
27333          DSUM1=DSUM1 + (DBLE(X(I)-XMED)**2)*(1.0D0 - DUI**2)**4
27334          DSUM2=DSUM2 + (1.0D0 - DUI**2)*(1.0D0 - 5.0D0*DUI**2)
27335        ENDIF
27336  300 CONTINUE
27337      DSBI=DBLE(N)*DSUM1/(DSUM2*DSUM2)
27338      XBWMDV=REAL(DSBI)
27339C
27340C               *******************************
27341C               **  STEP 3--                 **
27342C               **  WRITE OUT A LINE         **
27343C               **  OF SUMMARY INFORMATION.  **
27344C               *******************************
27345C
27346 8000 CONTINUE
27347      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
27348        WRITE(ICOUT,999)
27349        CALL DPWRST('XXX','BUG ')
27350        WRITE(ICOUT,811)N,XBWMDV
27351  811   FORMAT('THE BIWEIGHT MIDVARIANCE ESTIMATE OF THE ',I8,
27352     1         ' OBSERVATIONS = ',E15.7)
27353        CALL DPWRST('XXX','BUG ')
27354      ENDIF
27355C
27356C               *****************
27357C               **  STEP 90--  **
27358C               **  EXIT.      **
27359C               *****************
27360C
27361 9000 CONTINUE
27362      IF(IBUGA3.EQ.'ON')THEN
27363        WRITE(ICOUT,999)
27364        CALL DPWRST('XXX','BUG ')
27365        WRITE(ICOUT,9011)
27366 9011   FORMAT('***** AT THE END       OF BIWMDV--')
27367        CALL DPWRST('XXX','BUG ')
27368        WRITE(ICOUT,9012)IBUGA3,IERROR,N,XBWMDV
27369 9012   FORMAT('IBUGA3,IERROR,N,XBWMDV = ',A4,2X,A4,2X,I8,G15.7)
27370        CALL DPWRST('XXX','BUG ')
27371      ENDIF
27372C
27373      RETURN
27374      END
27375      SUBROUTINE BIWLOC(X,N,IWRITE,XTEMP,XTEMP2,MAXNXT,XBW,
27376     1IBUGA3,IERROR)
27377C
27378C     PURPOSE--THIS SUBROUTINE COMPUTES THE
27379C              SAMPLE BIWEIGHT LOCATION ESTIMATOR
27380C              OF THE DATA IN THE INPUT VECTOR X.
27381C              THE SAMPLE BIWEIGHT LOCATION ESTIMATE IS DEFINED AS:
27382C                 y* = SUM[w(i)*y(i)]/SUM[w(i)]
27383C              WHERE
27384C                 w(i) = (1 - ((y(i) - y*)/(6*MAD))**2)**2
27385C                                    if (y(i) - y*)/(6*MAD))**2   < 1
27386C                      = 0           otherwise
27387C              WHERE MAD IS THE BIWEIGHT LOCATION ESTIMATE
27388C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
27389C                                (UNSORTED OR SORTED) OBSERVATIONS.
27390C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27391C                                IN THE VECTOR X.
27392C     OUTPUT ARGUMENTS--XBW    = THE SINGLE PRECISION VALUE OF THE
27393C                                COMPUTED SAMPLE BIWEIGHT LOCATION
27394C                                ESTIMATE.
27395C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
27396C             SAMPLE BIWEIGHT LOCATION ESTIMATE.
27397C     OTHER DATAPLOT  SUBROUTINES NEEDED--MEAN, MAD
27398C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27399C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
27400C     LANGUAGE--ANSI FORTRAN (1977)
27401C     REFERENCES--MOSTELLER AND TUKEY, 'DATA ANALYSIS AND REGRESSION'
27402C                 ADDISON AND WESLEY, 1977, PP. 204-206.
27403C     WRITTEN BY--JAMES J. FILLIBEN
27404C                 STATISTICAL ENGINEERING DIVISION
27405C                 INFORMATION TECHNOLOGY LABORATORY
27406C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
27407C                 GAITHERSBURG, MD 20899-8980
27408C                 PHONE--301-975-2899
27409C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27410C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
27411C     LANGUAGE--ANSI FORTRAN (1977)
27412C     VERSION NUMBER--2001/11
27413C     ORIGINAL VERSION--NOVEMBER  2001.
27414C
27415C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27416C
27417      CHARACTER*4 IWRITE
27418      CHARACTER*4 IBUGA3
27419      CHARACTER*4 IERROR
27420C
27421      CHARACTER*4 IWRIT2
27422C
27423      CHARACTER*4 ISUBN1
27424      CHARACTER*4 ISUBN2
27425C
27426C---------------------------------------------------------------------
27427C
27428C
27429      DOUBLE PRECISION DSUM1
27430      DOUBLE PRECISION DSUM2
27431      DOUBLE PRECISION DWT
27432C
27433      DIMENSION X(*)
27434      DIMENSION XTEMP(*)
27435      DIMENSION XTEMP2(*)
27436C
27437C---------------------------------------------------------------------
27438C
27439      INCLUDE 'DPCOP2.INC'
27440C
27441C-----START POINT-----------------------------------------------------
27442C
27443      ISUBN1='BIWL'
27444      ISUBN2='OC  '
27445      XBW=0.0
27446C
27447      IERROR='NO'
27448C
27449      IF(IBUGA3.EQ.'OFF')GOTO90
27450      WRITE(ICOUT,999)
27451  999 FORMAT(1X)
27452      CALL DPWRST('XXX','BUG ')
27453      WRITE(ICOUT,51)
27454   51 FORMAT('***** AT THE BEGINNING OF BIWLOC--')
27455      CALL DPWRST('XXX','BUG ')
27456      WRITE(ICOUT,52)IBUGA3
27457   52 FORMAT('IBUGA3 = ',A4)
27458      CALL DPWRST('XXX','BUG ')
27459      WRITE(ICOUT,53)N
27460   53 FORMAT('N = ',I8)
27461      CALL DPWRST('XXX','BUG ')
27462      DO55I=1,N
27463      WRITE(ICOUT,56)I,X(I)
27464   56 FORMAT('I,X(I) = ',I8,E15.7)
27465      CALL DPWRST('XXX','BUG ')
27466   55 CONTINUE
27467   90 CONTINUE
27468C
27469C               ******************************************
27470C               **  COMPUTE BIWEIGHT LOCATION ESTIMATE **
27471C               ******************************************
27472C
27473C               ********************************************
27474C               **  STEP 1--                              **
27475C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27476C               ********************************************
27477C
27478      AN=N
27479C
27480      IF(N.GT.1)GOTO119
27481      IERROR='YES'
27482      WRITE(ICOUT,999)
27483      CALL DPWRST('XXX','BUG ')
27484      WRITE(ICOUT,111)
27485  111 FORMAT('***** ERROR IN BIWLOC--')
27486      CALL DPWRST('XXX','BUG ')
27487      WRITE(ICOUT,112)
27488  112 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS')
27489      CALL DPWRST('XXX','BUG ')
27490      WRITE(ICOUT,113)
27491  113 FORMAT('      IN THE VARIABLE FOR WHICH')
27492      CALL DPWRST('XXX','BUG ')
27493      WRITE(ICOUT,114)
27494  114 FORMAT('      THE BIWEIGHT LOCATION ESTIMATE IS TO BE')
27495      CALL DPWRST('XXX','BUG ')
27496      WRITE(ICOUT,115)
27497  115 FORMAT('      COMPUTED, MUST BE 2 OR LARGER.')
27498      CALL DPWRST('XXX','BUG ')
27499      WRITE(ICOUT,116)
27500  116 FORMAT('      SUCH WAS NOT THE CASE HERE.')
27501      CALL DPWRST('XXX','BUG ')
27502      WRITE(ICOUT,117)N
27503  117 FORMAT('      THE INPUT NUMBER OF OBSERVATIONS HERE = ',I8,
27504     1'.')
27505      CALL DPWRST('XXX','BUG ')
27506      GOTO9000
27507  119 CONTINUE
27508C
27509      HOLD=X(1)
27510      DO135I=2,N
27511      IF(X(I).NE.HOLD)GOTO139
27512  135 CONTINUE
27513      WRITE(ICOUT,999)
27514      CALL DPWRST('XXX','BUG ')
27515      WRITE(ICOUT,136)HOLD
27516  136 FORMAT('***** NON-FATAL DIAGNOSTIC IN BIWLOC--',
27517     1'THE FIRST INPUT ARGUMENT (A VECTOR) HAS ALL ELEMENTS = ',E15.7)
27518      CALL DPWRST('XXX','BUG ')
27519      XBW=HOLD
27520      GOTO9000
27521  139 CONTINUE
27522C
27523C               ***********************************************
27524C               **  STEP 2--                                 **
27525C               **  COMPUTE THE BIWEIGHT LOCATION ESTIMATE.  **
27526C               ***********************************************
27527C
27528      IWRIT2='OFF'
27529C
27530      DO195I=1,N
27531        XTEMP2(I)=X(I)
27532  195 CONTINUE
27533C
27534      CALL MEAN(X,N,IWRIT2,XMEAN,IBUGA3,IERROR)
27535CCCCC CALL MAD(X,N,IWRIT2,XTEMP,MAXNXT,XMAD,IBUGA3,IERROR)
27536      ITER=0
27537C
27538      DO198I=1,N
27539        X(I)=XTEMP2(I)
27540  198 CONTINUE
27541C
27542  200 CONTINUE
27543C
27544      DO205I=1,N
27545        XTEMP2(I)=ABS(X(I)-XMEAN)
27546  205 CONTINUE
27547      CALL MEDIAN(XTEMP2,N,IWRIT2,XTEMP,MAXNXT,XMAD,IBUGA3,IERROR)
27548C
27549      XMEANO=XMEAN
27550      DSUM1=0.0D0
27551      DSUM2=0.0D0
27552      DO300I=1,N
27553      XTEMP(I)=((X(I) - XMEAN)/(6.0*XMAD))**2
27554      IF(XTEMP(I).LT.1.0)THEN
27555        DWT=DBLE(XTEMP(I))
27556        DWT=(1.0D0 - DWT)**2
27557        DSUM1=DSUM1 + DWT*DBLE(X(I))
27558        DSUM2=DSUM2 + DWT
27559      ENDIF
27560  300 CONTINUE
27561      IF(DSUM2.NE.0.0D0)THEN
27562        XMEAN=REAL(DSUM1/DSUM2)
27563      ELSE
27564       XMEAN=0.0
27565      ENDIF
27566      ITER=ITER+1
27567      IF(ABS(XMEAN-XMEANO).GT.0.00001 .AND. ITER.LE.10)GOTO200
27568      XBW=XMEAN
27569C
27570C               *******************************
27571C               **  STEP 3--                 **
27572C               **  WRITE OUT A LINE         **
27573C               **  OF SUMMARY INFORMATION.  **
27574C               *******************************
27575C
27576      IF(IFEEDB.EQ.'OFF')GOTO890
27577      IF(IWRITE.EQ.'OFF')GOTO890
27578      WRITE(ICOUT,999)
27579      CALL DPWRST('XXX','BUG ')
27580      WRITE(ICOUT,811)N,XBW
27581  811 FORMAT('THE BIWEIGHT LOCATION ESTIMATE OF THE ',I8,
27582     1' OBSERVATIONS = ',E15.7)
27583      CALL DPWRST('XXX','BUG ')
27584  890 CONTINUE
27585C
27586C               *****************
27587C               **  STEP 90--  **
27588C               **  EXIT.      **
27589C               *****************
27590C
27591 9000 CONTINUE
27592      IF(IBUGA3.EQ.'OFF')GOTO9090
27593      WRITE(ICOUT,999)
27594      CALL DPWRST('XXX','BUG ')
27595      WRITE(ICOUT,9011)
27596 9011 FORMAT('***** AT THE END       OF BIWLOC--')
27597      CALL DPWRST('XXX','BUG ')
27598      WRITE(ICOUT,9012)IBUGA3,IERROR
27599 9012 FORMAT('IBUGA3,IERROR = ',A4,2X,A4)
27600      CALL DPWRST('XXX','BUG ')
27601      WRITE(ICOUT,9013)N
27602 9013 FORMAT('N = ',I8)
27603      CALL DPWRST('XXX','BUG ')
27604      WRITE(ICOUT,9015)XBW
27605 9015 FORMAT('XBW = ',E15.7)
27606      CALL DPWRST('XXX','BUG ')
276079090  CONTINUE
27608C
27609      RETURN
27610      END
27611      SUBROUTINE BIWSCA(X,N,IWRITE,XTEMP,XTEMP2,MAXNXT,XBS,
27612     1IBUGA3,IERROR)
27613C
27614C     PURPOSE--THIS SUBROUTINE COMPUTES THE
27615C              SAMPLE BIWEIGHT SCALE ESTIMATOR
27616C              OF THE DATA IN THE INPUT VECTOR X.
27617C              THE SAMPLE BIWEIGHT LOCATION ESTIMATE IS DEFINED AS:
27618C                 s(bi)**2= SUM'[(y-y')**2*(1-u**2)**4]/
27619C                           {SUM'[1-u**2)*(1-5*u**2)]*
27620C                           [-1 + SUM'[(1-u**2)*(1-5*u**2)]}
27621C              WHERE
27622C                 y' = MEDIAN OF Y
27623C                 MAD = MEDIAN ABSOLUTE DEVIATION
27624C                 u(i) = (Y(i) - y')/(9*MAD)
27625C                 SUM' means the summation is for u**2 <= 1
27626C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VECTOR OF
27627C                                (UNSORTED OR SORTED) OBSERVATIONS.
27628C                     --N      = THE INTEGER NUMBER OF OBSERVATIONS
27629C                                IN THE VECTOR X.
27630C     OUTPUT ARGUMENTS--XBS    = THE SINGLE PRECISION VALUE OF THE
27631C                                COMPUTED SAMPLE BIWEIGHT LOCATION
27632C                                ESTIMATE.
27633C     OUTPUT--THE COMPUTED SINGLE PRECISION VALUE OF THE
27634C             SAMPLE BIWEIGHT LOCATION ESTIMATE.
27635C     OTHER DATAPLOT  SUBROUTINES NEEDED--MEAN, MAD
27636C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
27637C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
27638C     LANGUAGE--ANSI FORTRAN (1977)
27639C     REFERENCES--MOSTELLER AND TUKEY, 'DATA ANALYSIS AND REGRESSION'
27640C                 ADDISON AND WESLEY, 1977, PP. 204-206.
27641C     WRITTEN BY--JAMES J. FILLIBEN
27642C                 STATISTICAL ENGINEERING DIVISION
27643C                 INFORMATION TECHNOLOGY LABORATORY
27644C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
27645C                 GAITHERSBURG, MD 20899-8980
27646C                 PHONE--301-975-2899
27647C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
27648C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
27649C     LANGUAGE--ANSI FORTRAN (1977)
27650C     VERSION NUMBER--2001/11
27651C     ORIGINAL VERSION--NOVEMBER  2001.
27652C     UPDATED         --JULY      2010. CALL LIST TO MAD
27653C
27654C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
27655C
27656      CHARACTER*4 IWRITE
27657      CHARACTER*4 IBUGA3
27658      CHARACTER*4 IERROR
27659C
27660      CHARACTER*4 IWRIT2
27661C
27662      CHARACTER*4 ISUBN1
27663      CHARACTER*4 ISUBN2
27664C
27665C---------------------------------------------------------------------
27666C
27667      DOUBLE PRECISION DSUM1
27668      DOUBLE PRECISION DSUM2
27669      DOUBLE PRECISION DUI
27670      DOUBLE PRECISION DSBI
27671C
27672      DIMENSION X(*)
27673      DIMENSION XTEMP(*)
27674      DIMENSION XTEMP2(*)
27675C
27676C---------------------------------------------------------------------
27677C
27678      INCLUDE 'DPCOP2.INC'
27679C
27680C-----START POINT-----------------------------------------------------
27681C
27682      ISUBN1='BIWL'
27683      ISUBN2='OC  '
27684      XBS=0.0
27685C
27686      IERROR='NO'
27687C
27688      IF(IBUGA3.EQ.'ON')THEN
27689        WRITE(ICOUT,999)
27690  999   FORMAT(1X)
27691        CALL DPWRST('XXX','BUG ')
27692        WRITE(ICOUT,51)
27693   51   FORMAT('***** AT THE BEGINNING OF BIWSCA--')
27694        CALL DPWRST('XXX','BUG ')
27695        WRITE(ICOUT,52)IBUGA3,N
27696   52   FORMAT('IBUGA3,N = ',A4,2X,I8)
27697        CALL DPWRST('XXX','BUG ')
27698        DO55I=1,N
27699          WRITE(ICOUT,56)I,X(I)
27700   56     FORMAT('I,X(I) = ',I8,G15.7)
27701          CALL DPWRST('XXX','BUG ')
27702   55   CONTINUE
27703      ENDIF
27704C
27705C               ******************************************
27706C               **  COMPUTE BIWEIGHT SCALE ESTIMATE     **
27707C               ******************************************
27708C
27709C               ********************************************
27710C               **  STEP 1--                              **
27711C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
27712C               ********************************************
27713C
27714      AN=N
27715C
27716      IF(N.LT.1)THEN
27717        WRITE(ICOUT,999)
27718        CALL DPWRST('XXX','BUG ')
27719        WRITE(ICOUT,111)
27720  111   FORMAT('***** ERROR IN BIWEIGHT SCALE--')
27721        CALL DPWRST('XXX','BUG ')
27722        WRITE(ICOUT,112)
27723  112   FORMAT('      THE RESPONSE VARIABLE HAS LESS THAN ONE ',
27724     1         'OBSERVATION.')
27725        CALL DPWRST('XXX','BUG ')
27726        WRITE(ICOUT,117)N
27727  117   FORMAT('      THE INPUT NUMBER OF OBSERVATIONS = ',I8,'.')
27728        CALL DPWRST('XXX','BUG ')
27729        XBS=CPUMIN
27730        IERROR='YES'
27731        GOTO9000
27732      ENDIF
27733C
27734      HOLD=X(1)
27735      DO135I=2,N
27736      IF(X(I).NE.HOLD)GOTO139
27737  135 CONTINUE
27738      XBS=0.0
27739      GOTO8000
27740  139 CONTINUE
27741C
27742C               ***********************************************
27743C               **  STEP 2--                                 **
27744C               **  COMPUTE THE BIWEIGHT SCALE ESTIMATE.     **
27745C               ***********************************************
27746C
27747      IWRIT2='OFF'
27748      CALL BIWLOC(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,XBW,IBUGA3,IERROR)
27749      CALL MAD(X,N,IWRIT2,XTEMP,XTEMP2,MAXNXT,XMAD,IBUGA3,IERROR)
27750C
27751      DSUM1=0.0D0
27752      DSUM2=0.0D0
27753      DO300I=1,N
27754        DUI=DBLE((X(I) - XBW)/(9.0*XMAD))
27755        IF(DUI*DUI.LE.1.0D0)THEN
27756          DSUM1=DSUM1 + (DBLE(X(I)-XBW)**2)*(1.0D0 - DUI**2)**4
27757          DSUM2=DSUM2 + (1.0D0 - DUI**2)*(1.0D0 - 5.0D0*DUI**2)
27758        ENDIF
27759  300 CONTINUE
27760      DSBI=DBLE(N)*DSUM1/(DSUM2*(-1.0D0 + DSUM2))
27761      XBS=REAL(DSBI)
27762C
27763C               *******************************
27764C               **  STEP 3--                 **
27765C               **  WRITE OUT A LINE         **
27766C               **  OF SUMMARY INFORMATION.  **
27767C               *******************************
27768C
27769 8000 CONTINUE
27770      IF(IFEEDB.EQ.'ON' .AND. IWRITE.EQ.'ON')THEN
27771        WRITE(ICOUT,999)
27772        CALL DPWRST('XXX','BUG ')
27773        WRITE(ICOUT,811)N,XBS
27774  811   FORMAT('THE BIWEIGHT SCALE ESTIMATE OF THE ',I8,
27775     1         ' OBSERVATIONS = ',E15.7)
27776        CALL DPWRST('XXX','BUG ')
27777      ENDIF
27778C
27779C               *****************
27780C               **  STEP 90--  **
27781C               **  EXIT.      **
27782C               *****************
27783C
27784 9000 CONTINUE
27785      IF(IBUGA3.EQ.'ON')THEN
27786        WRITE(ICOUT,999)
27787        CALL DPWRST('XXX','BUG ')
27788        WRITE(ICOUT,9011)
27789 9011   FORMAT('***** AT THE END       OF BIWSCA--')
27790        CALL DPWRST('XXX','BUG ')
27791        WRITE(ICOUT,9012)IBUGA3,IERROR,N,XBS
27792 9012   FORMAT('IBUGA3,IERROR,N,XBS = ',A4,2X,A4,2X,I8,G15.7)
27793        CALL DPWRST('XXX','BUG ')
27794      ENDIF
27795C
27796      RETURN
27797      END
27798      SUBROUTINE BKNOT(X,N,K,T)
27799C***BEGIN PROLOGUE  BKNOT
27800C***REFER TO  B2INK,B3INK
27801C***ROUTINES CALLED  (NONE)
27802C***END PROLOGUE  BKNOT
27803C
27804C  --------------------------------------------------------------------
27805C  BKNOT CHOOSES A KNOT SEQUENCE FOR INTERPOLATION OF ORDER K AT THE
27806C  DATA POINTS X(I), I=1,..,N.  THE N+K KNOTS ARE PLACED IN THE ARRAY
27807C  T.  K KNOTS ARE PLACED AT EACH ENDPOINT AND NOT-A-KNOT END
27808C  CONDITIONS ARE USED.  THE REMAINING KNOTS ARE PLACED AT DATA POINTS
27809C  IF N IS EVEN AND BETWEEN DATA POINTS IF N IS ODD.  THE RIGHTMOST
27810C  KNOT IS SHIFTED SLIGHTLY TO THE RIGHT TO INSURE PROPER INTERPOLATION
27811C  AT X(N) (SEE PAGE 350 OF THE REFERENCE).
27812C  --------------------------------------------------------------------
27813C
27814C  ------------
27815C  DECLARATIONS
27816C  ------------
27817C
27818C  PARAMETERS
27819C
27820      INTEGER
27821     *        N, K
27822      REAL
27823     *     X(N), T(*)
27824C
27825C  LOCAL VARIABLES
27826C
27827      INTEGER
27828     *        I, J, IPJ, NPJ, IP1
27829      REAL
27830     *     RNOT
27831C
27832C
27833C  ----------------------------
27834C  PUT K KNOTS AT EACH ENDPOINT
27835C  ----------------------------
27836C
27837C     (SHIFT RIGHT ENPOINTS SLIGHTLY -- SEE PG 350 OF REFERENCE)
27838      RNOT = X(N) + 0.10E0*( X(N)-X(N-1) )
27839      DO 110 J=1,K
27840         T(J) = X(1)
27841         NPJ = N + J
27842         T(NPJ) = RNOT
27843  110 CONTINUE
27844C
27845C  --------------------------
27846C  DISTRIBUTE REMAINING KNOTS
27847C  --------------------------
27848C
27849      IF (MOD(K,2) .EQ. 1)  GO TO 150
27850C
27851C     CASE OF EVEN K --  KNOTS AT DATA POINTS
27852C
27853      I = (K/2) - K
27854      JSTRT = K+1
27855      DO 120 J=JSTRT,N
27856         IPJ = I + J
27857         T(J) = X(IPJ)
27858  120 CONTINUE
27859      GO TO 200
27860C
27861C     CASE OF ODD K --  KNOTS BETWEEN DATA POINTS
27862C
27863  150 CONTINUE
27864      I = (K-1)/2 - K
27865      IP1 = I + 1
27866      JSTRT = K + 1
27867      DO 160 J=JSTRT,N
27868         IPJ = I + J
27869         T(J) = 0.50E0*( X(IPJ) + X(IPJ+1) )
27870  160 CONTINUE
27871  200 CONTINUE
27872C
27873      RETURN
27874      END
27875      SUBROUTINE BNDRY(A,BOX,IMX,JMX,IB,JB,NB)
27876C
27877C     PURPOSE--XX
27878C
27879C     WRITTEN BY--DAVID W. BEHRINGER NOAA/AOML (MIAMI).
27880C                 AS PART OF NOAA'S CONCX V.3   MARCH 1988.
27881C     ORIGINAL VERSION (IN DATAPLOT)--AUGUST    1988.
27882C     UPDATED         --JANUARY   1989.  MORE CHANGES TO STANDARD FORTRAN 77--
27883C                                        BYTE TO CHARACTER*1,
27884C                                        DO WHILE/END DO (ALAN HECKERT).
27885C     UPDATED         --JULY      1990.  999.999 TO ANINE
27886C     UPDATED         --JULY      1990.  ( ) AROUND ALL EXPR. ANINE
27887C     UPDATED         --JULY      1990.  MAJOR CHANGES
27888C     UPDATED         --APRIL     1992.  JO TO J0 (ALAN)
27889C
27890C-----COMMON----------------------------------------------------------
27891C
27892      INCLUDE 'DPCOCP.INC'
27893C
27894C---------------------------------------------------------------------
27895C
27896CCCCC BYTE BOX(4,MAXIMX,MAXJMX),SBOX     AUGUST 1988
27897CCCCC DIMENSION A(IMX,JMX),IB(*),JB(*)   AUGUST 1988
27898C
27899CCCCC BYTE BOX                           JANUARY 1989
27900CCCCC BYTE SBOX                          JANUARY 1989
27901      CHARACTER*1 BOX
27902CCCCC CHARACTER*1 SBOX
27903C
27904      DIMENSION A(MAXIMX,MAXJMX)
27905      DIMENSION BOX(4,MAXIMX,MAXJMX)
27906      DIMENSION IB(*)
27907      DIMENSION JB(*)
27908C
27909C-----START POINT-----------------------------------------------------
27910C
27911CCCCC THE FOLLOWING LINE WAS ADDED JULY 1990
27912CCCCC AND ALL SUBSEQUENT OCCURRANCES OF 999.999   JULY 1990
27913CCCCC WERE CHANGED TO ANINE       JULY 1990
27914      ANINE=999.999
27915C
27916      DO100I=1,IMX
27917        DO110J=1,JMX
27918          DO120L=1,4
27919            BOX(L,I,J)='0'
27920 120      CONTINUE
27921 110    CONTINUE
27922 100  CONTINUE
27923      DO200I=1,IMX
27924        BOX(4,I,1)='2'
27925        BOX(2,I,JMX-1)='2'
27926        DO210L=1,4
27927          BOX(L,I,JMX)='2'
27928 210    CONTINUE
27929 200  CONTINUE
27930      DO300J=1,JMX
27931        BOX(1,1,J)='2'
27932        BOX(3,IMX-1,J)='2'
27933        DO310L=1,4
27934          BOX(L,IMX,J)='2'
27935 310    CONTINUE
27936 300  CONTINUE
27937      DO400I=1,IMX
27938        DO410J=1,JMX
27939          IF (A(I,J).EQ.ANINE) THEN
27940            DO420N=1,4
27941              II=MAX0(1,I-N/3)
27942              JJ=MAX0(1,J-MOD(N/2,2))
27943              DO430L=1,4
27944                BOX(L,II,JJ)='2'
27945 430          CONTINUE
27946              III=MIN0(IMX,MAX0(1,II+1-2*(N/3)))
27947              JJJ=MIN0(JMX,MAX0(1,JJ+MAX0(3-2*N,2*N-7)))
27948              L=1+2*(N/3)
27949              BOX(L,III,JJ)='2'
27950              L=MAX0(6-2*N,2*N-4)
27951              BOX(L,II,JJJ)='2'
27952 420        CONTINUE
27953          END IF
27954 410    CONTINUE
27955 400  CONTINUE
27956      I0=0
27957      J0=0
27958      I=0
27959CCCCC DO WHILE (I0.EQ.0.AND.I.LT.IMX)    JANUARY 1989
27960 500  CONTINUE
27961       IF(I0.NE.0.OR.I.GE.IMX)GOTO599
27962        I=I+1
27963        J=0
27964CCCCC   DO WHILE (J0.EQ.0.AND.J.LT.JMX)  JANUARY 1989
27965 600    CONTINUE
27966CCCCC THE FOLLOWING LINE WAS FIXED   APRIL 1992   (ALAN)
27967CCCCC    IF(JO.NE.0.OR.J.GE.JMX)GOTO699
27968         IF(J0.NE.0.OR.J.GE.JMX)GOTO699
27969          J=J+1
27970          IF (BOX(3,I,J).EQ.'0') THEN
27971            I0=I
27972            J0=J
27973          END IF
27974          GOTO600
27975 699    CONTINUE
27976        GOTO500
27977 599  CONTINUE
27978      I=I0
27979      J=J0
27980      NB=1
27981      IB(NB)=I
27982      JB(NB)=J
27983      IFLG=0
27984      IJD=1
27985CCCCC DO WHILE (IFLG.EQ.0)               JANUARY 1989
27986 700  CONTINUE
27987      IF(IFLG.NE.0)GOTO799
27988C
27989        IF (IJD.EQ.1) THEN
27990          AMM=ANINE
27991          AM0=ANINE
27992          AMP=ANINE
27993          A0M=ANINE
27994          A00=ANINE
27995          A0P=ANINE
27996          APM=ANINE
27997          AP0=ANINE
27998          APP=ANINE
27999          IF(I.GT.1.AND.J.GT.1)AMM=A(I-1,J-1)
28000          IF(I.GT.1.AND.J.GT.0)AM0=A(I-1,J)
28001          IF(I.GT.1.AND.J.LT.JMX)AMP=A(I-1,J+1)
28002          IF(I.GT.0.AND.J.GT.1)A0M=A(I,J-1)
28003          IF(I.GT.0.AND.J.GT.0)A00=A(I,J)
28004          IF(I.GT.0.AND.J.LT.JMX)A0P=A(I,J+1)
28005          IF(I.LT.IMX.AND.J.GT.1)APM=A(I+1,J-1)
28006          IF(I.LT.IMX.AND.J.GT.0)AP0=A(I+1,J)
28007          IF(I.LT.IMX.AND.J.LT.JMX)APP=A(I+1,J+1)
28008          IF ((AM0.NE.ANINE).AND.
28009     1        (((AMM.NE.ANINE)).OR.
28010     2          ((AMP.NE.ANINE)))) THEN
28011            I=I-1
28012            IJD=4
28013          ELSE IF ((A0P.NE.ANINE).AND.
28014     1        (((AMP.NE.ANINE)).OR.
28015     2          ((APP.NE.ANINE)))) THEN
28016            J=J+1
28017            IJD=1
28018          ELSE IF ((AP0.NE.ANINE).AND.
28019     1        (((APM.NE.ANINE)).OR.
28020     2          ((APM.NE.ANINE)))) THEN
28021            I=I+1
28022            IJD=2
28023          END IF
28024C
28025        ELSE IF (IJD.EQ.2) THEN
28026          AMM=ANINE
28027          AM0=ANINE
28028          AMP=ANINE
28029          A0M=ANINE
28030          A00=ANINE
28031          A0P=ANINE
28032          APM=ANINE
28033          AP0=ANINE
28034          APP=ANINE
28035          IF(I.GT.1.AND.J.GT.1)AMM=A(I-1,J-1)
28036          IF(I.GT.1.AND.J.GT.0)AM0=A(I-1,J)
28037          IF(I.GT.1.AND.J.LT.JMX)AMP=A(I-1,J+1)
28038          IF(I.GT.0.AND.J.GT.1)A0M=A(I,J-1)
28039          IF(I.GT.0.AND.J.GT.0)A00=A(I,J)
28040          IF(I.GT.0.AND.J.LT.JMX)A0P=A(I,J+1)
28041          IF(I.LT.IMX.AND.J.GT.1)APM=A(I+1,J-1)
28042          IF(I.LT.IMX.AND.J.GT.0)AP0=A(I+1,J)
28043          IF(I.LT.IMX.AND.J.LT.JMX)APP=A(I+1,J+1)
28044          IF ((A0P.NE.ANINE).AND.
28045     1        (((AMP.NE.ANINE)).OR.
28046     2          ((APP.NE.ANINE)))) THEN
28047            J=J+1
28048            IJD=1
28049          ELSE IF ((AP0.NE.ANINE).AND.
28050     1        (((APM.NE.ANINE)).OR.
28051     2          ((APM.NE.ANINE)))) THEN
28052            I=I+1
28053            IJD=2
28054          ELSE IF ((A0M.NE.ANINE).AND.
28055     1        (((AMM.NE.ANINE)).OR.
28056     2          ((APM.NE.ANINE)))) THEN
28057            J=J-1
28058            IJD=3
28059          END IF
28060C
28061        ELSE IF (IJD.EQ.3) THEN
28062          AMM=ANINE
28063          AM0=ANINE
28064          AMP=ANINE
28065          A0M=ANINE
28066          A00=ANINE
28067          A0P=ANINE
28068          APM=ANINE
28069          AP0=ANINE
28070          APP=ANINE
28071          IF(I.GT.1.AND.J.GT.1)AMM=A(I-1,J-1)
28072          IF(I.GT.1.AND.J.GT.0)AM0=A(I-1,J)
28073          IF(I.GT.1.AND.J.LT.JMX)AMP=A(I-1,J+1)
28074          IF(I.GT.0.AND.J.GT.1)A0M=A(I,J-1)
28075          IF(I.GT.0.AND.J.GT.0)A00=A(I,J)
28076          IF(I.GT.0.AND.J.LT.JMX)A0P=A(I,J+1)
28077          IF(I.LT.IMX.AND.J.GT.1)APM=A(I+1,J-1)
28078          IF(I.LT.IMX.AND.J.GT.0)AP0=A(I+1,J)
28079          IF(I.LT.IMX.AND.J.LT.JMX)APP=A(I+1,J+1)
28080          IF ((AP0.NE.ANINE).AND.
28081     1        (((APM.NE.ANINE)).OR.
28082     2          ((APM.NE.ANINE)))) THEN
28083            I=I+1
28084            IJD=2
28085          ELSE IF ((A0M.NE.ANINE).AND.
28086     1        (((AMM.NE.ANINE)).OR.
28087     2          ((APM.NE.ANINE)))) THEN
28088            J=J-1
28089            IJD=3
28090          ELSE IF ((AM0.NE.ANINE).AND.
28091     1        (((AMM.NE.ANINE)).OR.
28092     2          ((AMP.NE.ANINE)))) THEN
28093            I=I-1
28094            IJD=4
28095          END IF
28096C
28097        ELSE IF (IJD.EQ.4) THEN
28098          AMM=ANINE
28099          AM0=ANINE
28100          AMP=ANINE
28101          A0M=ANINE
28102          A00=ANINE
28103          A0P=ANINE
28104          APM=ANINE
28105          AP0=ANINE
28106          APP=ANINE
28107          IF(I.GT.1.AND.J.GT.1)AMM=A(I-1,J-1)
28108          IF(I.GT.1.AND.J.GT.0)AM0=A(I-1,J)
28109          IF(I.GT.1.AND.J.LT.JMX)AMP=A(I-1,J+1)
28110          IF(I.GT.0.AND.J.GT.1)A0M=A(I,J-1)
28111          IF(I.GT.0.AND.J.GT.0)A00=A(I,J)
28112          IF(I.GT.0.AND.J.LT.JMX)A0P=A(I,J+1)
28113          IF(I.LT.IMX.AND.J.GT.1)APM=A(I+1,J-1)
28114          IF(I.LT.IMX.AND.J.GT.0)AP0=A(I+1,J)
28115          IF(I.LT.IMX.AND.J.LT.JMX)APP=A(I+1,J+1)
28116          IF ((A0M.NE.ANINE).AND.
28117     1        (((AMM.NE.ANINE)).OR.
28118     2          ((APM.NE.ANINE)))) THEN
28119            J=J-1
28120            IJD=3
28121          ELSE IF ((AM0.NE.ANINE).AND.
28122     1        (((AMM.NE.ANINE)).OR.
28123     2          ((AMP.NE.ANINE)))) THEN
28124            I=I-1
28125            IJD=4
28126          ELSE IF ((A0P.NE.ANINE).AND.
28127     1        (((AMP.NE.ANINE)).OR.
28128     2          ((APP.NE.ANINE)))) THEN
28129            J=J+1
28130            IJD=1
28131          END IF
28132C
28133        END IF
28134        IBNB=I
28135        JBNB=J
28136        IF (NB.GT.1) THEN
28137          IF (IBNB.NE.IB(NB-1).AND.JBNB.NE.JB(NB-1)) NB=NB+1
28138        ELSE
28139          NB=NB+1
28140        END IF
28141        IB(NB)=I
28142        JB(NB)=J
28143        IF (IB(NB).EQ.IB(1).AND.JB(NB).EQ.JB(1)) IFLG=1
28144        GOTO700
28145 799  CONTINUE
28146      RETURN
28147      END
28148      SUBROUTINE BNFAC(W,NROWW,NROW,NBANDL,NBANDU,IFLAG)
28149C***BEGIN PROLOGUE  BNFAC
28150C***REFER TO  BINT4,BINTK
28151C
28152C  BNFAC is the BANFAC routine from
28153C        * A Practical Guide to Splines *  by C. de Boor
28154C
28155C  Returns in  W  the lu-factorization (without pivoting) of the banded
28156C  matrix  A  of order  NROW  with  (NBANDL + 1 + NBANDU) bands or diag-
28157C  onals in the work array  W .
28158C
28159C *****  I N P U T  ******
28160C  W.....Work array of size  (NROWW,NROW)  containing the interesting
28161C        part of a banded matrix  A , with the diagonals or bands of  A
28162C        stored in the rows of  W , while columns of  A  correspond to
28163C        columns of  W . This is the storage mode used in  LINPACK  and
28164C        results in efficient innermost loops.
28165C           Explicitly,  A  has  NBANDL  bands below the diagonal
28166C                            +     1     (main) diagonal
28167C                            +   NBANDU  bands above the diagonal
28168C        and thus, with    MIDDLE = NBANDU + 1,
28169C          A(I+J,J)  is in  W(I+MIDDLE,J)  for I=-NBANDU,...,NBANDL
28170C                                              J=1,...,NROW .
28171C        For example, the interesting entries of A (1,2)-banded matrix
28172C        of order  9  would appear in the first  1+1+2 = 4  rows of  W
28173C        as follows.
28174C                          13 24 35 46 57 68 79
28175C                       12 23 34 45 56 67 78 89
28176C                    11 22 33 44 55 66 77 88 99
28177C                    21 32 43 54 65 76 87 98
28178C
28179C        All other entries of  W  not identified in this way with an en-
28180C        try of  A  are never referenced .
28181C  NROWW.....Row dimension of the work array  W .
28182C        must be  .GE.  NBANDL + 1 + NBANDU  .
28183C  NBANDL.....Number of bands of  A  below the main diagonal
28184C  NBANDU.....Number of bands of  A  above the main diagonal .
28185C
28186C *****  O U T P U T  ******
28187C  IFLAG.....Integer indicating success( = 1) or failure ( = 2) .
28188C     If  IFLAG = 1, then
28189C  W.....contains the LU-factorization of  A  into a unit lower triangu-
28190C        lar matrix  L  and an upper triangular matrix  U (both banded)
28191C        and stored in customary fashion over the corresponding entries
28192C        of  A . This makes it possible to solve any particular linear
28193C        system  A*X = B  for  X  by A
28194C              CALL BNSLV ( W, NROWW, NROW, NBANDL, NBANDU, B )
28195C        with the solution X  contained in  B  on return .
28196C     If  IFLAG = 2, then
28197C        one of  NROW-1, NBANDL,NBANDU failed to be nonnegative, or else
28198C        one of the potential pivots was found to be zero indicating
28199C        that  A  does not have an LU-factorization. This implies that
28200C        A  is singular in case it is totally positive .
28201C
28202C *****  M E T H O D  ******
28203C     Gauss elimination  W I T H O U T  pivoting is used. The routine is
28204C  intended for use with matrices  A  which do not require row inter-
28205C  changes during factorization, especially for the  T O T A L L Y
28206C  P O S I T I V E  matrices which occur in spline calculations.
28207C     The routine should not be used for an arbitrary banded matrix.
28208C***ROUTINES CALLED  (NONE)
28209C***END PROLOGUE  BNFAC
28210C
28211      INTEGER IFLAG, NBANDL, NBANDU, NROW, NROWW, I, IPK, J, JMAX, K,
28212     1 KMAX, MIDDLE, MIDMK, NROWM1
28213      REAL W(NROWW,NROW), FACTOR, PIVOT
28214C
28215C***FIRST EXECUTABLE STATEMENT  BNFAC
28216      IFLAG = 1
28217      MIDDLE = NBANDU + 1
28218C                         W(MIDDLE,.) CONTAINS THE MAIN DIAGONAL OF  A .
28219      NROWM1 = NROW - 1
28220CCCCC IF (NROWM1) 120, 110, 10
28221      IF (NROWM1.LT.0) THEN
28222         GOTO120
28223      ELSEIF (NROWM1.EQ.0) THEN
28224         GOTO110
28225      ELSEIF (NROWM1.GT.0) THEN
28226         GOTO10
28227      ENDIF
28228   10 IF (NBANDL.GT.0) GO TO 30
28229C                A IS UPPER TRIANGULAR. CHECK THAT DIAGONAL IS NONZERO .
28230      DO 20 I=1,NROWM1
28231        IF (W(MIDDLE,I).EQ.0.0E0) GO TO 120
28232   20 CONTINUE
28233      GO TO 110
28234   30 IF (NBANDU.GT.0) GO TO 60
28235C              A IS LOWER TRIANGULAR. CHECK THAT DIAGONAL IS NONZERO AND
28236C                 DIVIDE EACH COLUMN BY ITS DIAGONAL .
28237      DO 50 I=1,NROWM1
28238        PIVOT = W(MIDDLE,I)
28239        IF (PIVOT.EQ.0.0E0) GO TO 120
28240        JMAX = MIN0(NBANDL,NROW-I)
28241        DO 40 J=1,JMAX
28242          W(MIDDLE+J,I) = W(MIDDLE+J,I)/PIVOT
28243   40   CONTINUE
28244   50 CONTINUE
28245      RETURN
28246C
28247C        A  IS NOT JUST A TRIANGULAR MATRIX. CONSTRUCT LU FACTORIZATION
28248   60 DO 100 I=1,NROWM1
28249C                                  W(MIDDLE,I)  IS PIVOT FOR I-TH STEP .
28250        PIVOT = W(MIDDLE,I)
28251        IF (PIVOT.EQ.0.0E0) GO TO 120
28252C                 JMAX  IS THE NUMBER OF (NONZERO) ENTRIES IN COLUMN  I
28253C                     BELOW THE DIAGONAL .
28254        JMAX = MIN0(NBANDL,NROW-I)
28255C              DIVIDE EACH ENTRY IN COLUMN  I  BELOW DIAGONAL BY PIVOT .
28256        DO 70 J=1,JMAX
28257          W(MIDDLE+J,I) = W(MIDDLE+J,I)/PIVOT
28258   70   CONTINUE
28259C                 KMAX  IS THE NUMBER OF (NONZERO) ENTRIES IN ROW  I  TO
28260C                     THE RIGHT OF THE DIAGONAL .
28261        KMAX = MIN0(NBANDU,NROW-I)
28262C                  SUBTRACT  A(I,I+K)*(I-TH COLUMN) FROM (I+K)-TH COLUMN
28263C                  (BELOW ROW  I ) .
28264        DO 90 K=1,KMAX
28265          IPK = I + K
28266          MIDMK = MIDDLE - K
28267          FACTOR = W(MIDMK,IPK)
28268          DO 80 J=1,JMAX
28269            W(MIDMK+J,IPK) = W(MIDMK+J,IPK) - W(MIDDLE+J,I)*FACTOR
28270   80     CONTINUE
28271   90   CONTINUE
28272  100 CONTINUE
28273C                                       CHECK THE LAST DIAGONAL ENTRY .
28274  110 IF (W(MIDDLE,NROW).NE.0.0E0) RETURN
28275  120 IFLAG = 2
28276      RETURN
28277      END
28278      SUBROUTINE BNOCDF(DX,DALPHA,DBETA,DCDF)
28279C
28280C     PURPOSE   --COMPUTE THE BETA-NORMAL CDF FUNCTION
28281C                 THIS CDF FUNCTION IS DEFINED AS:
28282C                    F(X;A,B) = (1/BETA(A,B)*INTERGRAL[0 TO G(X)]
28283C                               [W**(A-1)*(1-W)**(B-1)dw
28284C                               A, B > 0
28285C                 WITH G(X) DENOTING A FUNCTION.  IN THIS CASE,
28286C                 WE TAKE G(X) TO BE THE NORMAL CDF FUNCTION.
28287C                 THAT IS, THIS IS ESSENTIALLY A BETA CDF, BUT
28288C                 WITH THE UPPER LIMIT OF INTEGRATION REPLACED WITH
28289C                 THE NORMAL CDF VALUE OF X.
28290C     REFERENCE --"HANDBOOK OF BETA DISTRIBUTION AND ITS APPLICATIONS",
28291C                 EDITED BY ARJUN GUPTA AND SARALEES NADARAJAH,
28292C                 MARCEL DEKKER INC., 2004, PP. 146-152.
28293C               --"BETA-NORMAL DISTRIBUTION AND ITS APPLICATIONS",
28294C                 EUGENE, LEE, AND FAMOYE.  COMMUNICATIONS IN
28295C                 STATISTICS-THEORY AND METHODS, 2002, 31, PP. 497-512.
28296C     WRITTEN BY--JAMES J. FILLIBEN
28297C                 STATISTICAL ENGINEERING DIVISION
28298C                 INFORMATION TECHNOLOGY LABORATORY
28299C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
28300C                 GAITHERSBURG, MD 20899-8980
28301C                 PHONE--301-975-2855
28302C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28303C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
28304C     LANGUAGE--ANSI FORTRAN (1977)
28305C     VERSION NUMBER--2006/3
28306C     ORIGINAL VERSION--MARCH     2006.
28307C
28308C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28309C
28310      DOUBLE PRECISION DCDF
28311      DOUBLE PRECISION DNOCDF
28312      DOUBLE PRECISION DALPHA
28313      DOUBLE PRECISION DBETA
28314      DOUBLE PRECISION DX
28315      DOUBLE PRECISION DBETAI
28316C
28317C---------------------------------------------------------------------
28318C
28319      INCLUDE 'DPCOP2.INC'
28320C
28321C-----START POINT-----------------------------------------------------
28322C
28323      IF(DALPHA.LE.0.0D0)THEN
28324        WRITE(ICOUT,101)
28325        CALL DPWRST('XXX','BUG ')
28326        WRITE(ICOUT,103)DALPHA
28327        CALL DPWRST('XXX','BUG ')
28328        GOTO9999
28329      ELSEIF(DBETA.LE.0.0D0)THEN
28330        WRITE(ICOUT,102)
28331        CALL DPWRST('XXX','BUG ')
28332        WRITE(ICOUT,103)DBETA
28333        CALL DPWRST('XXX','BUG ')
28334        GOTO9999
28335      ENDIF
28336  101 FORMAT('***** ERROR--FOR BNOCDF, THE ALPHA SHAPE PARAMETER IS ',
28337     1       'NON-POSITIVE.')
28338  102 FORMAT('***** ERROR--FOR BNOCDF, THE BETA SHAPE PARAMETER IS ',
28339     1       'NON-POSITIVE.')
28340  103 FORMAT('***** THE VALUE IS ',G15.7)
28341C
28342      CALL NODCDF(DX,DNOCDF)
28343      DCDF=DBETAI(DNOCDF,DALPHA,DBETA)
28344C
28345 9999 CONTINUE
28346      RETURN
28347      END
28348      SUBROUTINE BNOFUN (N, X, FVEC, IFLAG, XDATA, NOBS)
28349C
28350C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
28351C              BETA-NORMAL MAXIMUM LIKELIHOOD EQUATIONS
28352C              TO ESTIMATE THE ALPHA AND BETA SHAPE PARAMETERS
28353C              AND THE LOCATION/SCALE PARAMETERS.  THE MAXIMUM
28354C              LIKELIHOOD EQUATIONS ARE:
28355C
28356C                 N*PSI(ALPHA+BETA) - N*PSI(ALPHA) +
28357C                 SUM[i=1 to N][LOG(NORCDF((X(i)-MU)/SIGMA))] = 0
28358C
28359C                 N*PSI(ALPHA+BETA) - N*PSI(BETA) +
28360C                 SUM[i=1 to N][LOG(1-NORCDF((X(i)-MU)/SIGMA))] = 0
28361C
28362C                 SUM[i=1 to n][{
28363C                 (1-ALPHA)*NORPDF((X(i)-MU)/SIGMA)/
28364C                 NORCDF((X(i)-MU)/SIGMA) +
28365C                 (BETA-1)*NORPDF((X(i)-MU)/SIGMA)/
28366C                 (1 - NORCDF((X(i)-MU)/SIGMA)) +
28367C                 (X(i)-MU)/SIGMA**2)} = 0
28368C
28369C                 SUM[i=1 to n][{
28370C                 (1-ALPHA)*NORPDF((X(i)-MU)/SIGMA)*(X(i)-MU)/SIGMA)/
28371C                 NORCDF((X(i)-MU)/SIGMA) +
28372C                 (BETA-1)*NORPDF((X(i)-MU)/SIGMA)*(X(i)-MU)/SIGMA)/
28373C                 (1 - NORCDF((X(i)-MU)/SIGMA)) +
28374C                 (X(i)-MU)**2/SIGMA**3)} - (N/SIGMA)= 0
28375C
28376C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
28377C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
28378C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
28379C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
28380C     EXAMPLE--BETA NORMAL MAXIMUM LIKELIHOOD Y
28381C     REFERENCE--EUGENE, LEE, AND FAMOYE (2002), "BETA-NORMAL
28382C                DISTRIBUTION AND ITS APPLICATIONS", COMMUNICATIONS
28383C                IN STATISTICS--THEORY AND METHODS, 31(4),
28384C                PP. 497-512.
28385C     WRITTEN BY--JAMES J. FILLIBEN
28386C                 STATISTICAL ENGINEERING DIVISION
28387C                 INFORMATION TECHNOLOGY LABORATORY
28388C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
28389C                 GAITHERSBURG, MD 20899-8980
28390C                 PHONE--301-975-2855
28391C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28392C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
28393C     LANGUAGE--ANSI FORTRAN (1977)
28394C     VERSION NUMBER--2007/6
28395C     ORIGINAL VERSION--JUNE      2007.
28396C
28397C---------------------------------------------------------------------
28398C
28399      DOUBLE PRECISION X(*)
28400      DOUBLE PRECISION FVEC(*)
28401      REAL XDATA(*)
28402C
28403      DOUBLE PRECISION DA
28404      DOUBLE PRECISION DB
28405      DOUBLE PRECISION DMU
28406      DOUBLE PRECISION DSIGMA
28407      DOUBLE PRECISION DX
28408      DOUBLE PRECISION DZ
28409      DOUBLE PRECISION DN
28410      DOUBLE PRECISION DTERM1
28411      DOUBLE PRECISION DTERM2
28412      DOUBLE PRECISION DTERM3
28413      DOUBLE PRECISION DTERM4
28414CCCCC DOUBLE PRECISION DTERM5
28415CCCCC DOUBLE PRECISION DTERM6
28416CCCCC DOUBLE PRECISION DTERM7
28417      DOUBLE PRECISION DSUM1
28418      DOUBLE PRECISION DSUM2
28419      DOUBLE PRECISION DSUM3
28420      DOUBLE PRECISION DEPS
28421C
28422      DOUBLE PRECISION DPSI
28423      EXTERNAL DPSI
28424C
28425C---------------------------------------------------------------------
28426C
28427      INCLUDE 'DPCOP2.INC'
28428C
28429C-----START POINT-----------------------------------------------------
28430C
28431      N=4
28432      IFLAG=0
28433C
28434      DA=X(1)
28435      DB=X(2)
28436      DMU=X(3)
28437      DSIGMA=X(4)
28438C
28439      DN=DBLE(NOBS)
28440      DTERM1=DN*DPSI(DA+DB)
28441      DTERM2=DN*DPSI(DA)
28442      DTERM3=DN*DPSI(DB)
28443      DEPS=1.0D-20
28444C
28445      DSUM1=0.0D0
28446      DSUM2=0.0D0
28447      DO100I=1,NOBS
28448        DX=DBLE(XDATA(I))
28449        DZ=(DX - DMU)/DSIGMA
28450        CALL NODCDF(DZ,DTERM4)
28451        IF(DTERM4.LE.0.0D0)DTERM4=DEPS
28452        DSUM1=DSUM1 + DLOG(DTERM4)
28453        CALL NODCDF(DZ,DTERM4)
28454        DTERM4=1.0D0 - DTERM4
28455        IF(DTERM4.LE.0.0D0)DTERM4=DEPS
28456        DSUM2=DSUM2 + DLOG(DTERM4)
28457  100 CONTINUE
28458C
28459      FVEC(1)=DTERM1 - DTERM2 + DSUM1
28460      FVEC(2)=DTERM1 - DTERM3 + DSUM2
28461C
28462      DSUM1=0.0D0
28463      DSUM2=0.0D0
28464      DSUM3=0.0D0
28465      DO200I=1,NOBS
28466        DX=DBLE(XDATA(I))
28467        DZ=(DX - DMU)/DSIGMA
28468        CALL NODPDF(DZ,DTERM1)
28469        CALL NODCDF(DZ,DTERM2)
28470        DTERM3=(1.0D0 - DA)*DTERM1
28471        IF(DTERM2.NE.0.0D0)THEN
28472          DSUM1=DSUM1 + DTERM3/DTERM2
28473        ELSE
28474          DSUM1=DSUM1 + DTERM3/DEPS
28475        ENDIF
28476        DTERM3=(DB - 1.0D0)*DTERM1
28477        DTERM4=1.0D0 - DTERM2
28478        IF(DTERM4.NE.0.0D0)THEN
28479          DSUM2=DSUM2 + DTERM3/DTERM4
28480        ELSE
28481          DSUM2=DSUM2 + DTERM3/DEPS
28482        ENDIF
28483        DSUM3=DSUM3 + DZ/DSIGMA
28484  200 CONTINUE
28485      FVEC(3)=DSUM1 + DSUM2 + DSUM3
28486C
28487      DSUM1=0.0D0
28488      DSUM2=0.0D0
28489      DSUM3=0.0D0
28490      DO300I=1,NOBS
28491        DX=DBLE(XDATA(I))
28492        DZ=(DX - DMU)/DSIGMA
28493        CALL NODPDF(DZ,DTERM1)
28494        CALL NODCDF(DZ,DTERM2)
28495        DTERM3=(1.0D0 - DA)*DTERM1
28496        IF(DTERM2.NE.0.0D0)THEN
28497          DSUM1=DSUM1 + (DTERM3/DTERM2)*DZ
28498        ELSE
28499          DSUM1=DSUM1 + (DTERM3/DEPS)*DZ
28500        ENDIF
28501        DTERM3=(DB - 1.0D0)*DTERM1
28502        DTERM4=1.0D0 - DTERM2
28503        IF(DTERM4.NE.0.0D0)THEN
28504          DSUM2=DSUM2 + (DTERM3/DTERM4)*DZ
28505        ELSE
28506          DSUM2=DSUM2 + (DTERM3/DEPS)*DZ
28507        ENDIF
28508        DSUM3=DSUM3 + (DX-DMU)**2/(DSIGMA**3)
28509  300 CONTINUE
28510      FVEC(4)=DSUM1 + DSUM2 + DSUM3 - DN/DSIGMA
28511C
28512      RETURN
28513      END
28514      DOUBLE PRECISION FUNCTION BNOFU2(DX)
28515C
28516C     PURPOSE--BNOPPF CALLS DFZERO TO FIND A ROOT FOR THE PERCENT
28517C              POINT FUNCTION.  BNOFU2 IS THE FUNCTION FOR WHICH
28518C              THE ZERO IS FOUND.  IT IS:
28519C                 P - BNOCDF(X,ALPHA,BETA)
28520C              WHERE P IS THE DESIRED PERCENT POINT.
28521C     INPUT  ARGUMENTS--X      = THE DOUBLE PRECISION VALUE AT
28522C                                WHICH THE CUMULATIVE DISTRIBUTION
28523C                                FUNCTION IS TO BE EVALUATED.
28524C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
28525C             FUNCTION VALUE BNOFU2.
28526C     PRINTING--NONE.
28527C     RESTRICTIONS--NONE.
28528C     OTHER DATAPAC   SUBROUTINES NEEDED--BNOCDF.
28529C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28530C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
28531C     LANGUAGE--ANSI FORTRAN (1977)
28532C     REFERENCE --"HANDBOOK OF BETA DISTRIBUTION AND ITS APPLICATIONS",
28533C                 EDITED BY ARJUN GUPTA AND SARALEES NADARAJAH,
28534C                 MARCEL DEKKER INC., 2004, PP. 146-152.
28535C               --"BETA-NORMAL DISTRIBUTION AND ITS APPLICATIONS",
28536C                 EUGENE, LEE, AND FAMOYE.  COMMUNICATIONS IN
28537C                 STATISTICS-THEORY AND METHODS, 2002, 31, PP. 497-512.
28538C     WRITTEN BY--JAMES J. FILLIBEN
28539C                 STATISTICAL ENGINEERING DIVISION
28540C                 INFORMATION TECHNOLOGY LABORATORY
28541C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
28542C                 GAITHERSBURG, MD 20899-8980
28543C                 PHONE--301-975-2855
28544C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28545C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
28546C     LANGUAGE--ANSI FORTRAN (1977)
28547C     VERSION NUMBER--2006.3
28548C     ORIGINAL VERSION--MARCH     2006.
28549C
28550C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28551C
28552C---------------------------------------------------------------------
28553C
28554      DOUBLE PRECISION DX
28555      DOUBLE PRECISION DCDF
28556C
28557      DOUBLE PRECISION DP
28558      DOUBLE PRECISION DALPHA
28559      DOUBLE PRECISION DBETA
28560      COMMON/BNOCOM/DP,DALPHA,DBETA
28561C
28562      INCLUDE 'DPCOP2.INC'
28563C
28564C-----START POINT-----------------------------------------------------
28565C
28566      CALL BNOCDF(DX,DALPHA,DBETA,DCDF)
28567      BNOFU2=DP - DCDF
28568C
28569      RETURN
28570      END
28571      SUBROUTINE BNOML1(Y,N,MAXNXT,DTEMP1,
28572     1                  XMEAN,XSD,XVAR,XMIN,XMAX,
28573     1                  AMUSV,SIGMSV,ALPHSV,BETASV,
28574     1                  AMUML,SIGMML,ALPHML,BETAML,
28575     1                  ISUBRO,IBUGA3,IERROR)
28576C
28577C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD
28578C              ESTIMATES FOR THE BETA NORMAL DISTRIBUTION.
28579C     NOTE--THE MAXIMUM LIKELIHOOD ESTIMATES ARE THE SOLUTION
28580C           TO THE FOLLOWING SYSTEM OF EQUATIONS:
28581C
28582C                 N*PSI(ALPHA+BETA) - N*PSI(ALPHA) +
28583C                 SUM[i=1 to N][LOG(NORCDF((X(i)-MU)/SIGMA))] = 0
28584C
28585C                 N*PSI(ALPHA+BETA) - N*PSI(BETA) +
28586C                 SUM[i=1 to N][LOG(1-NORCDF((X(i)-MU)/SIGMA))] = 0
28587C
28588C                 SUM[i=1 to n][{
28589C                 (1-ALPHA)*NORPDF((X(i)-MU)/SIGMA)/
28590C                 NORCDF((X(i)-MU)/SIGMA) +
28591C                 (BETA-1)*NORPDF((X(i)-MU)/SIGMA)/
28592C                 (1 - NORCDF((X(i)-MU)/SIGMA)) +
28593C                 (X(i)-MU)/SIGMA**2)} = 0
28594C
28595C                 SUM[i=1 to n][{
28596C                 (1-ALPHA)*NORPDF((X(i)-MU)/SIGMA)*(X(i)-MU)/SIGMA)/
28597C                 NORCDF((X(i)-MU)/SIGMA) +
28598C                 (BETA-1)*NORPDF((X(i)-MU)/SIGMA)*(X(i)-MU)/SIGMA)/
28599C                 (1 - NORCDF((X(i)-MU)/SIGMA)) +
28600C                 (X(i)-MU)**2/SIGMA**3)} - (N/SIGMA)= 0
28601C
28602C           NOTE THAT EUGENE AND HIS CO-AUTHORS SUGGEST TWO
28603C           DIFFERENT STARTING VALUES DEPENDING ON WHETHER
28604C           THE DISTRIBUTION IS UNIMODAL OR BIMODAL.  THIS CAN
28605C           BE DETERMINED BY EVALUATING THE LIKELIHOOD EQUATION
28606C           AT THESE TWO POINTS.
28607C     REFERENCE--EUGENE, LEE, AND FAMOYE (2002), "BETA-NORMAL
28608C                DISTRIBUTION AND ITS APPLICATIONS", COMMUNICATIONS
28609C                IN STATISTICS--THEORY AND METHODS, 31(4),
28610C                PP. 497-512.
28611C     WRITTEN BY--ALAN HECKERT
28612C                 STATISTICAL ENGINEERING DIVISION
28613C                 INFORMATION TECHNOLOGY LABORATORY
28614C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
28615C                 GAITHERSBURG, MD 20899-8980
28616C                 PHONE--301-975-2899
28617C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28618C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
28619C     LANGUAGE--ANSI FORTRAN (1977)
28620C     VERSION NUMBER--2010/07
28621C     ORIGINAL VERSION--JULY      2010. EXTRACTED AS A SEPARATE
28622C                                       SUBROUTINE (FROM DPMLAD)
28623C
28624C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28625C
28626      DIMENSION Y(*)
28627      DOUBLE PRECISION DTEMP1(*)
28628C
28629      CHARACTER*4 ISUBRO
28630      CHARACTER*4 IBUGA3
28631      CHARACTER*4 IERROR
28632C
28633      DOUBLE PRECISION TOL
28634      DOUBLE PRECISION XPAR(4)
28635      DOUBLE PRECISION FVEC(4)
28636CCCCC DOUBLE PRECISION DAE
28637CCCCC DOUBLE PRECISION DRE
28638CCCCC DOUBLE PRECISION DXSTRT
28639CCCCC DOUBLE PRECISION DXLOW
28640CCCCC DOUBLE PRECISION DXUP
28641C
28642      DOUBLE PRECISION DA
28643      DOUBLE PRECISION DB
28644      DOUBLE PRECISION DN
28645      DOUBLE PRECISION DX
28646      DOUBLE PRECISION DZ
28647      DOUBLE PRECISION DMU
28648      DOUBLE PRECISION DSIGMA
28649      DOUBLE PRECISION DTERM1
28650      DOUBLE PRECISION DTERM2
28651CCCCC DOUBLE PRECISION DTERM3
28652CCCCC DOUBLE PRECISION DTERM4
28653      DOUBLE PRECISION DSUM1
28654      DOUBLE PRECISION DSUM2
28655      DOUBLE PRECISION DSUM3
28656      DOUBLE PRECISION DPI
28657      DOUBLE PRECISION DLIKE1
28658      DOUBLE PRECISION DLIKE2
28659C
28660C---------------------------------------------------------------------
28661C
28662      DOUBLE PRECISION DLNGAM
28663      EXTERNAL DLNGAM
28664      EXTERNAL BNOFUN
28665C
28666C
28667      CHARACTER*4 IWRITE
28668      CHARACTER*40 IDIST
28669C
28670      CHARACTER*4 ISUBN1
28671      CHARACTER*4 ISUBN2
28672      CHARACTER*4 ISTEPN
28673C
28674C---------------------------------------------------------------------
28675C
28676      INCLUDE 'DPCOP2.INC'
28677C
28678      DATA DPI / 3.14159265358979D+00/
28679C
28680C-----START POINT-----------------------------------------------------
28681C
28682      ISUBN1='BNOM'
28683      ISUBN2='L1  '
28684C
28685      IERROR='NO'
28686      IWRITE='OFF'
28687C
28688      AMUML=CPUMIN
28689      SIGMML=CPUMIN
28690      ALPHML=CPUMIN
28691      BETAML=CPUMIN
28692C
28693      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'OML1')THEN
28694        WRITE(ICOUT,999)
28695  999   FORMAT(1X)
28696        CALL DPWRST('XXX','WRIT')
28697        WRITE(ICOUT,51)
28698   51   FORMAT('**** AT THE BEGINNING OF BNOML1--')
28699        CALL DPWRST('XXX','WRIT')
28700        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
28701   52   FORMAT('IBUGA3,ISUBRO,N = ',2(A4,2X),I8)
28702        CALL DPWRST('XXX','WRIT')
28703        WRITE(ICOUT,54)AMUSV,SIGMSV,ALPHSV,BETASV
28704   54   FORMAT('AMUSV,SIGMSV,ALPHSV,BETASV =  ',4G15.7)
28705        CALL DPWRST('XXX','WRIT')
28706        DO56I=1,MIN(N,100)
28707          WRITE(ICOUT,57)I,Y(I)
28708   57     FORMAT('I,Y(I) = ',I8,G15.7)
28709          CALL DPWRST('XXX','WRIT')
28710   56   CONTINUE
28711      ENDIF
28712C
28713C               ***************************************
28714C               **  STEP 2--                         **
28715C               **  CARRY OUT CALCULATIONS           **
28716C               **  FOR BETA-NORMAL MLE ESTIMATE     **
28717C               ***************************************
28718C
28719      ISTEPN='2'
28720      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'OML1')
28721     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
28722C
28723      IDIST='BETA-NORMAL'
28724      IFLAG=0
28725      CALL SUMRAW(Y,N,IDIST,IFLAG,
28726     1            XMEAN,XVAR,XSD,XMIN,XMAX,
28727     1            ISUBRO,IBUGA3,IERROR)
28728      IF(IERROR.EQ.'YES')GOTO9000
28729C
28730      CALL SORT(Y,N,Y)
28731C
28732C     DETERMINE WHETHER TO USE STARTING VALUES FOR
28733C     UNIMODAl OR BI-MODAL CASE BY EVALUATING LIKELIHOOD
28734C     FUNCTION.
28735C
28736C     UNIMODAL STARTING VALUE: (1,1,MU,SIGMA)
28737C
28738      DN=DBLE(N)
28739      DA=1.0D0
28740      DB=1.0D0
28741      DMU=DBLE(XMEAN)
28742      DSIGMA=DBLE(XSD)
28743      DTERM1=DN*DLNGAM(DA+DB) - DN*DLNGAM(DA) - DN*DLNGAM(DB) -
28744     1       (DN/2.0D0)*DLOG(2.0*DPI) - DN*DLOG(DSIGMA)
28745C
28746      DSUM1=0.0D0
28747      DSUM2=0.0D0
28748      DSUM3=0.0D0
28749      DEPS=1.0D-20
28750      DO1010I=1,N
28751        DX=DBLE(Y(I))
28752        DZ=(DX - DMU)/DSIGMA
28753        CALL NODCDF(DX,DTERM2)
28754        IF(DTERM2.LE.0.0D0)DTERM2=DEPS
28755        DSUM1=DSUM1 + (DA-1.0D0)*DLOG(DTERM2)
28756        CALL NODCDF(DX,DTERM2)
28757        DTERM2=1.0D0 - DTERM2
28758        IF(DTERM2.LE.0.0D0)DTERM2=DEPS
28759        DSUM2=DSUM2 + (DB-1.0D0)*DLOG(DTERM2)
28760        DSUM3=DSUM3 + (DX-DMU)**2/(2.0D0*DSIGMA)
28761 1010 CONTINUE
28762       DLIKE1=DTERM1 + (DSUM1 + DSUM2 - DSUM3)
28763C
28764C     BI-MODAL STARTING VALUE: (0.1,0.1,MU,SIGMA)
28765C
28766      DA=0.1D0
28767      DB=0.1D0
28768      DTERM1=DN*DLNGAM(DA+DB) - DN*DLNGAM(DA) - DN*DLNGAM(DB) -
28769     1       (DN/2.0D0)*DLOG(2.0*DPI) - DN*DLOG(DSIGMA)
28770C
28771      DSUM1=0.0D0
28772      DSUM2=0.0D0
28773      DSUM3=0.0D0
28774      DEPS=1.0D-20
28775      DO1020I=1,N
28776        DX=DBLE(Y(I))
28777        DZ=(DX - DMU)/DSIGMA
28778        CALL NODCDF(DX,DTERM2)
28779        IF(DTERM2.LE.0.0D0)DTERM2=DEPS
28780        DSUM1=DSUM1 + (DA-1.0D0)*DLOG(DTERM2)
28781        CALL NODCDF(DX,DTERM2)
28782        DTERM2=1.0D0 - DTERM2
28783        IF(DTERM2.LE.0.0D0)DTERM2=DEPS
28784        DSUM2=DSUM2 + (DB-1.0D0)*DLOG(DTERM2)
28785        DSUM3=DSUM3 + (DX-DMU)**2/(2.0D0*DSIGMA)
28786 1020 CONTINUE
28787       DLIKE2=DTERM1 + (DSUM1 + DSUM2 - DSUM3)
28788C
28789      IF(DLIKE1.GE.DLIKE2)THEN
28790        XPAR(1)=2.0D0
28791        XPAR(2)=2.0D0
28792      ELSE
28793        XPAR(1)=0.1D0
28794        XPAR(2)=0.1D0
28795      ENDIF
28796      XPAR(3)=DMU
28797      XPAR(4)=DSIGMA
28798C
28799      IF(ALPHSV.GT.0.0)XPAR(1)=DBLE(ALPHSV)
28800      IF(BETASV.GT.0.0)XPAR(2)=DBLE(BETASV)
28801      IF(AMUSV.GT.CPUMIN)XPAR(3)=DBLE(AMUSV)
28802      IF(SIGMSV.GT.0.0)XPAR(4)=DBLE(SIGMSV)
28803C
28804      IOPT=2
28805      TOL=1.0D-6
28806      NVAR=4
28807      NPRINT=-1
28808      INFO=0
28809      LWA=MAXNXT
28810      CALL DNSQE(BNOFUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
28811     1           DTEMP1,MAXNXT,Y,N)
28812C
28813      ALPHML=REAL(XPAR(1))
28814      BETAML=REAL(XPAR(2))
28815      AMUML=REAL(XPAR(3))
28816      SIGMML=REAL(XPAR(4))
28817C
28818 9000 CONTINUE
28819      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'OML1')THEN
28820        WRITE(ICOUT,999)
28821        CALL DPWRST('XXX','WRIT')
28822        WRITE(ICOUT,9011)
28823 9011   FORMAT('**** AT THE END OF BNOML1--')
28824        CALL DPWRST('XXX','WRIT')
28825        WRITE(ICOUT,9013)N,XMEAN,XSD,XMIN,XMAX
28826 9013   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
28827        CALL DPWRST('XXX','WRIT')
28828        WRITE(ICOUT,9019)AMUML,SIGMML,ALPHML,BETAML
28829 9019   FORMAT('AMUML,SIGMML,ALPHML,BETAML =  ',4G15.7)
28830        CALL DPWRST('XXX','WRIT')
28831        WRITE(ICOUT,9021)IERROR
28832 9021   FORMAT('IERROR = ',A4)
28833        CALL DPWRST('XXX','WRIT')
28834      ENDIF
28835C
28836      RETURN
28837      END
28838      SUBROUTINE BNOPDF(DX,DALPHA,DBETA,DPDF)
28839C
28840C     PURPOSE   --COMPUTE THE BETA-NORMAL PDF FUNCTION
28841C                 THIS PDF FUNCTION IS DEFINED AS:
28842C                    f(X;A,B) = (1/BETA(A,B)*NORCDF(X)**(A-1)*
28843C                               (1-NORCDF(X))**(B-1)*NORPDF(X)
28844C                               A, B > 0
28845C                 WITH A, B, AND BETA DENOTING THE SHAPE PARAMETERS
28846C                 ALPHA AND BETA AND THE BETA FUNCTION, RESPECTIVELY.
28847C     REFERENCE --"HANDBOOK OF BETA DISTRIBUTION AND ITS APPLICATIONS",
28848C                 EDITED BY ARJUN GUPTA AND SARALEES NADARAJAH,
28849C                 MARCEL DEKKER INC., 2004, PP. 146-152.
28850C               --"BETA-NORMAL DISTRIBUTION AND ITS APPLICATIONS",
28851C                 EUGENE, LEE, AND FAMOYE.  COMMUNICATIONS IN
28852C                 STATISTICS-THEORY AND METHODS, 2002, 31, PP. 497-512.
28853C     WRITTEN BY--JAMES J. FILLIBEN
28854C                 STATISTICAL ENGINEERING DIVISION
28855C                 INFORMATION TECHNOLOGY LABORATORY
28856C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
28857C                 GAITHERSBURG, MD 20899-8980
28858C                 PHONE--301-975-2855
28859C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28860C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
28861C     LANGUAGE--ANSI FORTRAN (1977)
28862C     VERSION NUMBER--2006/3
28863C     ORIGINAL VERSION--MARCH     2006.
28864C
28865C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28866C
28867      DOUBLE PRECISION DX
28868      DOUBLE PRECISION DPDF
28869      DOUBLE PRECISION DNOCDF
28870      DOUBLE PRECISION DNOCD2
28871      DOUBLE PRECISION DNOPDF
28872      DOUBLE PRECISION DALPHA
28873      DOUBLE PRECISION DBETA
28874      DOUBLE PRECISION DLBETA
28875      DOUBLE PRECISION DTERM1
28876      DOUBLE PRECISION DTERM2
28877      DOUBLE PRECISION DTERM3
28878      DOUBLE PRECISION DEPS
28879C
28880C---------------------------------------------------------------------
28881C
28882      INCLUDE 'DPCOP2.INC'
28883C
28884      DATA DEPS/0.1D-12/
28885C
28886C-----START POINT-----------------------------------------------------
28887C
28888      IF(DALPHA.LE.0.0D0)THEN
28889        WRITE(ICOUT,101)
28890        CALL DPWRST('XXX','BUG ')
28891        WRITE(ICOUT,103)DALPHA
28892        CALL DPWRST('XXX','BUG ')
28893        GOTO9999
28894      ELSEIF(DBETA.LE.0.0D0)THEN
28895        WRITE(ICOUT,102)
28896        CALL DPWRST('XXX','BUG ')
28897        WRITE(ICOUT,103)DBETA
28898        CALL DPWRST('XXX','BUG ')
28899        GOTO9999
28900      ENDIF
28901  101 FORMAT('***** ERROR--FOR BNOPDF, THE ALPHA SHAPE PARAMETER IS ',
28902     1       'NON-POSITIVE.')
28903  102 FORMAT('***** ERROR--FOR BNOPDF, THE BETA SHAPE PARAMETER IS ',
28904     1       'NON-POSITIVE.')
28905  103 FORMAT('***** THE VALUE IS ',G15.7)
28906C
28907      CALL NODPDF(DX,DNOPDF)
28908      CALL NODCDF(DX,DNOCDF)
28909      CALL NODCDF(-DX,DNOCD2)
28910C
28911C  NOTE: PDF EFFECTIVELY ZERO IMPLIES BNOPDF ALSO EFFECTIVELY ZERO.
28912C        ALSO NEED TO CHECK FOR CDF = 0 OR 1 (CDF=1 PRESENTS THE
28913C        MORE SERIOUS PROBLEM IN PRACTICE SINCE NODCDF SINCE THE
28914C        ROUNDING TO 1 OCCURS AT A MUCH SMALLER ABSOLUTE VALUE THAN
28915C        DOES ROUNDING TO 0).  SOLUTION IS TO COMPUTE THE LOG OF A
28916C        VERY SMALL VALUE (SET BY DPES) FOR THAT TERM.
28917C
28918      IF(DNOPDF.LE.0.0D0)THEN
28919        DPDF=0.0D0
28920      ELSEIF(DNOCDF.LE.0.0D0)THEN
28921        DTERM1=DLBETA(DALPHA,DBETA)
28922        DTERM2=(DALPHA-1.0D0)*DLOG(DEPS)
28923        DTERM3=0.0D0
28924        DPDF=DTERM2 + DTERM3 + DLOG(DNOPDF) - DTERM1
28925        IF(DPDF.LE.-500.0D0)THEN
28926          DPDF=0.0D0
28927        ELSE
28928          DPDF=DEXP(DPDF)
28929        ENDIF
28930      ELSEIF(DNOCDF.GE.1.0D0)THEN
28931        DTERM1=DLBETA(DALPHA,DBETA)
28932        DTERM2=(DALPHA-1.0D0)*DLOG(DNOCDF)
28933        DTERM3=(DBETA-1.0D0)*DLOG(DNOCD2)
28934        DPDF=DTERM2 + DTERM3 + DLOG(DNOPDF) - DTERM1
28935        IF(DPDF.LE.-500.0D0)THEN
28936          DPDF=0.0D0
28937        ELSE
28938          DPDF=DEXP(DPDF)
28939        ENDIF
28940      ELSE
28941        DTERM1=DLBETA(DALPHA,DBETA)
28942        DTERM2=(DALPHA-1.0D0)*DLOG(DNOCDF)
28943        DTERM3=(DBETA-1.0D0)*DLOG(DNOCD2)
28944        DPDF=DTERM2 + DTERM3 + DLOG(DNOPDF) - DTERM1
28945        IF(DPDF.LE.-500.0D0)THEN
28946          DPDF=0.0D0
28947        ELSE
28948          DPDF=DEXP(DPDF)
28949        ENDIF
28950      ENDIF
28951C
28952 9999 CONTINUE
28953      RETURN
28954      END
28955      SUBROUTINE BNOPPF(DP,DALPHA,DBETA,DPPF)
28956C
28957C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
28958C              FUNCTION VALUE FOR THE BETA-NORMAL DISTRIBUTION
28959C              WITH SHAPE PARAMETERS ALPHA AND BETA.
28960C              THIS DISTRIBUTION IS DEFINED FOR REAL X AND THE
28961C              PERCENT POINT FUNCTION IS COMPUTED BY
28962C              NUMERICALLY INVERTING THE CDF FUNCTION.
28963C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
28964C                                WHICH THE PERCENT POINT
28965C                                FUNCTION IS TO BE EVALUATED.
28966C                     --DALPHA = THE FIRST SHAPE PARAMETER
28967C                     --DBETA  = THE SECOND SHAPE PARAMETER
28968C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION CUMULATIVE
28969C                                DISTRIBUTION FUNCTION VALUE.
28970C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT FUNCTION VALUE DPPF.
28971C     PRINTING--NONE.
28972C     RESTRICTIONS--NONE.
28973C     OTHER DATAPAC   SUBROUTINES NEEDED--DFZERO.
28974C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
28975C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
28976C     LANGUAGE--ANSI FORTRAN (1977)
28977C     REFERENCE --"HANDBOOK OF BETA DISTRIBUTION AND ITS APPLICATIONS",
28978C                 EDITED BY ARJUN GUPTA AND SARALEES NADARAJAH,
28979C                 MARCEL DEKKER INC., 2004, PP. 146-152.
28980C               --"BETA-NORMAL DISTRIBUTION AND ITS APPLICATIONS",
28981C                 EUGENE, LEE, AND FAMOYE.  COMMUNICATIONS IN
28982C                 STATISTICS-THEORY AND METHODS, 2002, 31, PP. 497-512.
28983C     WRITTEN BY--JAMES J. FILLIBEN
28984C                 STATISTICAL ENGINEERING DIVISION
28985C                 INFORMATION TECHNOLOGY LABORATORY
28986C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
28987C                 GAITHERSBURG, MD 20899-8980
28988C                 PHONE--301-975-2855
28989C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
28990C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
28991C     LANGUAGE--ANSI FORTRAN (1977)
28992C     ORIGINAL VERSION--MARCH     2006.
28993C
28994C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
28995C
28996C---------------------------------------------------------------------
28997C
28998      DOUBLE PRECISION DP
28999      DOUBLE PRECISION DALPHA
29000      DOUBLE PRECISION DBETA
29001      DOUBLE PRECISION DPPF
29002C
29003      DOUBLE PRECISION BNOFU2
29004      EXTERNAL BNOFU2
29005C
29006      DOUBLE PRECISION DP2
29007      DOUBLE PRECISION DALPH2
29008      DOUBLE PRECISION DBETA2
29009      COMMON/BNOCOM/DP2,DALPH2,DBETA2
29010C
29011      DOUBLE PRECISION XLOW
29012      DOUBLE PRECISION XLOW2
29013      DOUBLE PRECISION XUP
29014      DOUBLE PRECISION XUP2
29015      DOUBLE PRECISION PTEMPL
29016      DOUBLE PRECISION PTEMPU
29017      DOUBLE PRECISION AE
29018      DOUBLE PRECISION RE
29019C
29020      INCLUDE 'DPCOP2.INC'
29021C
29022C-----START POINT-----------------------------------------------------
29023C
29024C               ********************************************
29025C               **  STEP 1--                              **
29026C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
29027C               ********************************************
29028C
29029      DPPF=0.0D0
29030      IF(DALPHA.LE.0.0D0)THEN
29031        WRITE(ICOUT,101)
29032        CALL DPWRST('XXX','BUG ')
29033        WRITE(ICOUT,102)
29034        CALL DPWRST('XXX','BUG ')
29035        WRITE(ICOUT,104)DALPHA
29036        CALL DPWRST('XXX','BUG ')
29037        GOTO9000
29038      ENDIF
29039      IF(DBETA.LE.0.0D0)THEN
29040        WRITE(ICOUT,103)
29041        CALL DPWRST('XXX','BUG ')
29042        WRITE(ICOUT,102)
29043        CALL DPWRST('XXX','BUG ')
29044        WRITE(ICOUT,104)DBETA
29045        CALL DPWRST('XXX','BUG ')
29046        GOTO9000
29047      ENDIF
29048  101 FORMAT('***** ERROR--THE FIRST SHAPE PARAMETER, ALPHA, TO THE')
29049  102 FORMAT('      BNOPPF ROUTINE IS NON-POSITIVE.')
29050  103 FORMAT('***** ERROR--THE SECOND SHAPE PARAMETER, BETA, TO THE')
29051  104 FORMAT('      THE VALUE OF THE ARGUMENT IS ',E15.7,' ******')
29052C
29053      IF(DP.LE.0.0D0.OR.DP.GE.1.0D0)THEN
29054         WRITE(ICOUT,61)
29055   61    FORMAT('***** ERROR--THE FIRST  INPUT ARGUMENT ',
29056     1          'TO THE BNOPPF SUBROUTINE ')
29057         CALL DPWRST('XXX','BUG ')
29058         WRITE(ICOUT,62)
29059   62    FORMAT('      IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
29060         CALL DPWRST('XXX','BUG ')
29061         WRITE(ICOUT,63)DP
29062   63    FORMAT('      VALUE OF ARGUMENT = ',G15.7)
29063         CALL DPWRST('XXX','BUG ')
29064         GOTO9000
29065      ENDIF
29066C
29067C  STEP 1: FIND BRACKETING INTERVAL.  START WITH (-5,5) AND
29068C          INCREMENT UNITL A BRACKETING INTERVAL IS FOUND.
29069C
29070      MAXIT=1000
29071      XLOW2=-5.0D0
29072      XUP2=5.0D0
29073  200 CONTINUE
29074        CALL BNOCDF(XLOW2,DALPHA,DBETA,PTEMPL)
29075        CALL BNOCDF(XUP2,DALPHA,DBETA,PTEMPU)
29076        IF(PTEMPL.LT.DP .AND. PTEMPU.GT.DP)THEN
29077          XUP=XUP2
29078          XLOW=XLOW2
29079          GOTO300
29080        ELSEIF(PTEMPL.LT.DP .AND. PTEMPU.LT.DP)THEN
29081          MAXIT=MAXIT+1
29082          XUP2=2.0D0*XUP2
29083          IF(MAXIT.LE.MAXIT)GOTO200
29084        ELSEIF(PTEMPL.GT.DP .AND. PTEMPU.GT.DP)THEN
29085          MAXIT=MAXIT+1
29086          XLOW2=2.0D0*XLOW2
29087          IF(MAXIT.LE.MAXIT)GOTO200
29088        ENDIF
29089C
29090        WRITE(ICOUT,201)
29091  201   FORMAT('***** ERROR FROM BNOPPF--UNABLE TO FIND A ',
29092     1         'BRACKETING INTERVAL')
29093        CALL DPWRST('XXX','BUG ')
29094        GOTO9000
29095C
29096  300 CONTINUE
29097      AE=1.0D-8
29098      RE=1.0D-8
29099      DP2=DP
29100      DALPH2=DALPHA
29101      DBETA2=DBETA
29102      CALL DFZERO(BNOFU2,XLOW,XUP,XUP,RE,AE,IFLAG)
29103C
29104      DPPF=XLOW
29105C
29106      IF(IFLAG.EQ.2)THEN
29107C
29108C  NOTE: SUPPRESS THIS MESSAGE FOR NOW.
29109CCCCC   WRITE(ICOUT,999)
29110  999   FORMAT(1X)
29111CCCCC   CALL DPWRST('XXX','BUG ')
29112CCCCC   WRITE(ICOUT,121)
29113CC111   FORMAT('***** WARNING FROM BNOPPF--')
29114CCCCC   CALL DPWRST('XXX','BUG ')
29115CCCCC   WRITE(ICOUT,113)
29116CC113   FORMAT('      PPF VALUE MAY NOT BE COMPUTED TO DESIRED ',
29117CCCCC1         'TOLERANCE.')
29118CCCCC   CALL DPWRST('XXX','BUG ')
29119      ELSEIF(IFLAG.EQ.3)THEN
29120        WRITE(ICOUT,999)
29121        CALL DPWRST('XXX','BUG ')
29122        WRITE(ICOUT,121)
29123  121   FORMAT('***** WARNING FROM BNOPPF--')
29124        CALL DPWRST('XXX','BUG ')
29125        WRITE(ICOUT,123)
29126  123   FORMAT('      PPF VALUE MAY BE NEAR A SINGULAR POINT.')
29127        CALL DPWRST('XXX','BUG ')
29128      ELSEIF(IFLAG.EQ.4)THEN
29129        WRITE(ICOUT,999)
29130        CALL DPWRST('XXX','BUG ')
29131        WRITE(ICOUT,131)
29132  131   FORMAT('***** ERROR FROM BNOPPF--')
29133        CALL DPWRST('XXX','BUG ')
29134        WRITE(ICOUT,133)
29135  133   FORMAT('      APPROPRIATE BRACKETING INTERVAL NOT FOUND.')
29136        CALL DPWRST('XXX','BUG ')
29137      ELSEIF(IFLAG.EQ.5)THEN
29138        WRITE(ICOUT,999)
29139        CALL DPWRST('XXX','BUG ')
29140        WRITE(ICOUT,121)
29141        CALL DPWRST('XXX','BUG ')
29142        WRITE(ICOUT,143)
29143  143   FORMAT('      MAXIMUM ITERATIONS EXCEEDED.')
29144        CALL DPWRST('XXX','BUG ')
29145      ENDIF
29146C
29147 9000 CONTINUE
29148      RETURN
29149      END
29150      SUBROUTINE BNORAN(N,ALPHA,BETA,ISEED,X)
29151C
29152C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
29153C              FROM THE BETA-NORMAL DISTRIBUTION WITH SHAPE
29154C              PARAMETERS ALPHA AND BETA.  THIS DISTRIBUTION IS
29155C              DEFINED FOR ALL X AND HAS THE PROBABILITY DENSITY
29156C              FUNCTION
29157C                    f(X;A,B) = (1/BETA(A,B)*NORCDF(X)**(A-1)*
29158C                               (1-NORCDF(X))**(B-1)*NORPDF(X)
29159C                               A, B > 0
29160C                 WITH A, B, AND BETA DENOTING THE SHAPE PARAMETERS
29161C                 ALPHA AND BETA AND THE BETA FUNCTION, RESPECTIVELY.
29162C
29163C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
29164C                                OF RANDOM NUMBERS TO BE
29165C                                GENERATED.
29166C                     --ALPHA  = THE FIRST SHAPE PARAMETER FOR THE
29167C                                BETA-NORMAL DISTRIBUTION
29168C                     --BETA   = THE SECOND SHAPE PARAMETER FOR THE
29169C                                BETA-NORMAL DISTRIBUTION
29170C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
29171C                                (OF DIMENSION AT LEAST N)
29172C                                INTO WHICH THE GENERATED
29173C                                RANDOM SAMPLE WILL BE PLACED.
29174C     OUTPUT--A RANDOM SAMPLE OF SIZE N FROM THE BETA-NORMAL
29175C             DISTRIBUTION WITH SHAPE PARAMETERS ALPHA AND BETA.
29176C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
29177C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
29178C                   OF N FOR THIS SUBROUTINE.
29179C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, NBOPPF.
29180C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
29181C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
29182C     LANGUAGE--ANSI FORTRAN (1977)
29183C     REFERENCE --"HANDBOOK OF BETA DISTRIBUTION AND ITS APPLICATIONS",
29184C                 EDITED BY ARJUN GUPTA AND SARALEES NADARAJAH,
29185C                 MARCEL DEKKER INC., 2004, PP. 146-152.
29186C               --"BETA-NORMAL DISTRIBUTION AND ITS APPLICATIONS",
29187C                 EUGENE, LEE, AND FAMOYE.  COMMUNICATIONS IN
29188C                 STATISTICS-THEORY AND METHODS, 2002, 31, PP. 497-512.
29189C     WRITTEN BY--JAMES J. FILLIBEN
29190C                 STATISTICAL ENGINEERING DIVISION
29191C                 INFORMATION TECHNOLOGY LABORATORY
29192C                 NATION INSTITUTE OF STANDARDS AND TECHNOLOGY
29193C                 GAITHERSBURG, MD 20899-8980
29194C                 PHONE--301-975-2855
29195C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29196C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
29197C     LANGUAGE--ANSI FORTRAN (1977)
29198C     VERSION NUMBER--2006.3
29199C     ORIGINAL VERSION--MARCH     2006.
29200C
29201C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29202C
29203C---------------------------------------------------------------------
29204C
29205      DOUBLE PRECISION DPPF
29206      DIMENSION X(*)
29207C
29208C---------------------------------------------------------------------
29209C
29210      INCLUDE 'DPCOP2.INC'
29211C
29212C-----DATA STATEMENTS-------------------------------------------------
29213C
29214C-----START POINT-----------------------------------------------------
29215C
29216C     CHECK THE INPUT ARGUMENTS FOR ERRORS
29217C
29218      IF(N.LT.1)THEN
29219        WRITE(ICOUT,5)
29220        CALL DPWRST('XXX','BUG ')
29221        WRITE(ICOUT,6)
29222        CALL DPWRST('XXX','BUG ')
29223        WRITE(ICOUT,47)N
29224        CALL DPWRST('XXX','BUG ')
29225        GOTO9000
29226      ENDIF
29227C
29228    5 FORMAT('***** ERROR--FOR THE BETA-NORMAL DISTRIBUTION, ',
29229     1       'THE REQUESTED')
29230    6 FORMAT('      NUMBER OF RANDOM NUMBERS WAS NON-POSITIVE.')
29231   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
29232      IF(ALPHA.LE.0.0)THEN
29233        WRITE(ICOUT,7)
29234        CALL DPWRST('XXX','WRIT')
29235        WRITE(ICOUT,17)
29236        CALL DPWRST('XXX','WRIT')
29237        WRITE(ICOUT,48)ALPHA
29238        CALL DPWRST('XXX','WRIT')
29239        GOTO9000
29240      ENDIF
29241    7 FORMAT('***** ERROR: VALUE OF FIRST SHAPE PARAMETER (ALPHA)',
29242     1       ' FOR BETA-NORMAL')
29243   17 FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
29244      IF(BETA.LE.0.0)THEN
29245        WRITE(ICOUT,8)
29246        CALL DPWRST('XXX','WRIT')
29247        WRITE(ICOUT,18)
29248        CALL DPWRST('XXX','WRIT')
29249        WRITE(ICOUT,48)BETA
29250        CALL DPWRST('XXX','WRIT')
29251        GOTO9000
29252      ENDIF
29253    8 FORMAT('***** ERROR: VALUE OF SECOND SHAPE PARAMETER (BETA)',
29254     1       ' FOR BETA-NORMAL')
29255   18 FORMAT('      RANDOM NUMBERS IS NON-POSITIVE.')
29256   48 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
29257C
29258C     COMPUTE THE BETA-NORMAL RANDOM NUMBERS USING THE
29259C     PERCENT POINT TRANSFORMATION OF UNIFORM RANDOM NUMBERS.
29260C
29261      CALL UNIRAN(N,ISEED,X)
29262      NTEMP=1
29263      DO100I=1,N
29264        ATEMP=X(I)
29265        CALL BNOPPF(DBLE(ATEMP),DBLE(ALPHA),DBLE(BETA),DPPF)
29266        X(I)=REAL(DPPF)
29267  100 CONTINUE
29268C
29269 9000 CONTINUE
29270      RETURN
29271      END
29272      SUBROUTINE BNSLV(W,NROWW,NROW,NBANDL,NBANDU,B)
29273C***BEGIN PROLOGUE  BNSLV
29274C***REFER TO  BINT4,BINTK
29275C
29276C  BNSLV is the BANSLV routine from
29277C        * A Practical Guide to Splines *  by C. de Boor
29278C
29279C  Companion routine to  BNFAC . It returns the solution  X  of the
29280C  linear system  A*X = B  in place of  B , given the LU-factorization
29281C  for  A  in the work array  W from BNFAC.
29282C
29283C *****  I N P U T  ******
29284C  W, NROWW,NROW,NBANDL,NBANDU.....describe the LU-factorization of a
29285C        banded matrix  A  of order  NROW  as constructed in  BNFAC .
29286C        For details, see  BNFAC .
29287C  B.....Right side of the system to be solved .
29288C
29289C *****  O U T P U T  ******
29290C  B.....Contains the solution  X , of order  NROW .
29291C
29292C *****  M E T H O D  ******
29293C     (With  A = L*U, as stored in  W,) the unit lower triangular system
29294C  L(U*X) = B  is solved for  Y = U*X, and  Y  stored in  B . Then the
29295C  upper triangular system  U*X = Y  is solved for  X  . The calcul-
29296C  ations are so arranged that the innermost loops stay within columns.
29297C***ROUTINES CALLED  (NONE)
29298C***END PROLOGUE  BNSLV
29299C
29300      INTEGER NBANDL, NBANDU, NROW, NROWW, I, J, JMAX, MIDDLE, NROWM1
29301      REAL W(NROWW,NROW), B(NROW)
29302C***FIRST EXECUTABLE STATEMENT  BNSLV
29303      MIDDLE = NBANDU + 1
29304      IF (NROW.EQ.1) GO TO 80
29305      NROWM1 = NROW - 1
29306      IF (NBANDL.EQ.0) GO TO 30
29307C                                 FORWARD PASS
29308C            FOR I=1,2,...,NROW-1, SUBTRACT  RIGHT SIDE(I)*(I-TH COLUMN
29309C            OF  L )  FROM RIGHT SIDE  (BELOW I-TH ROW) .
29310      DO 20 I=1,NROWM1
29311        JMAX = MIN0(NBANDL,NROW-I)
29312        DO 10 J=1,JMAX
29313          B(I+J) = B(I+J) - B(I)*W(MIDDLE+J,I)
29314   10   CONTINUE
29315   20 CONTINUE
29316C                                 BACKWARD PASS
29317C            FOR I=NROW,NROW-1,...,1, DIVIDE RIGHT SIDE(I) BY I-TH DIAG-
29318C            ONAL ENTRY OF  U, THEN SUBTRACT  RIGHT SIDE(I)*(I-TH COLUMN
29319C            OF  U)  FROM RIGHT SIDE  (ABOVE I-TH ROW).
29320   30 IF (NBANDU.GT.0) GO TO 50
29321C                                A  IS LOWER TRIANGULAR .
29322      DO 40 I=1,NROW
29323        B(I) = B(I)/W(1,I)
29324   40 CONTINUE
29325      RETURN
29326   50 I = NROW
29327   60 B(I) = B(I)/W(MIDDLE,I)
29328      JMAX = MIN0(NBANDU,I-1)
29329      DO 70 J=1,JMAX
29330        B(I-J) = B(I-J) - B(I)*W(MIDDLE-J,I)
29331   70 CONTINUE
29332      I = I - 1
29333      IF (I.GT.1) GO TO 60
29334   80 B(1) = B(1)/W(MIDDLE,1)
29335      RETURN
29336      END
29337      SUBROUTINE BOOTSS(Y1,Y2,N1,IWRITE,
29338     1                  Y3,N3,
29339     1                  TEMPY1,TEMPY2,
29340     1                  IBUGA3,ISUBRO,IERROR)
29341C
29342C     PURPOSE--CONSTRUCT A BOOTSTRAP SAMPLE
29343C              OF THE DATA IN Y1(.) BASED ON THE INDICES IN Y2(.).
29344C
29345C     INPUT  ARGUMENTS--Y1     = ORIGINAL SAMPLE
29346C                     --Y2     = BOOTSTRAP INDEX
29347C     OUTPUT ARGUMENTS--Y3     = BOOTSTRAP SAMPLE
29348C
29349C     NOTE--IT IS PERMISSIBLE TO HAVE THE OUTPUT VECTOR Y3(.)
29350C           BEING IDENTICAL TO EITHER OF THE INPUT VECTORS Y1(.) OR Y2(.)
29351C      NOTE--IF AN ELEMENT OF THE INPUT INDEX (Y2) IS SMALLER THAN 1
29352C            OR LARGER THAN N1, THEN THIS WILL BE INTERPRETED AS
29353C            A NON-OPERATION--THIS WILL ALLOW ONE TO FORM JACKNIFE
29354C            SAMPLES BY SIMPLY SETTING SOME INDEX ELEMENT TO, SAY, 0.
29355C     WRITTEN BY--JAMES J. FILLIBEN
29356C                 STATISTICAL ENGINEERING DIVISION
29357C                 INFORMATION TECHNOLOGY LABORATORY
29358C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
29359C                 GAITHERSBURG, MD 20899-8980
29360C                 PHONE--301-921-3651
29361C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
29362C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
29363C     LANGUAGE--ANSI FORTRAN (1977)
29364C     VERSION NUMBER--89/2
29365C     ORIGINAL VERSION--JANUARY  1987.
29366C     UPDATED         --JUNE      1990. TEMPORARY ARRAYS TO GARBAGE COMMON
29367C     UPDATED         --JUNE      2019. PASS SCRATCH ARRAYS FROM CALLING
29368C                                       ROUTINE
29369C
29370C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
29371C
29372      CHARACTER*4 IWRITE
29373      CHARACTER*4 IBUGA3
29374      CHARACTER*4 ISUBRO
29375      CHARACTER*4 IERROR
29376C
29377      CHARACTER*4 ISUBN1
29378      CHARACTER*4 ISUBN2
29379C
29380C---------------------------------------------------------------------
29381C
29382      DIMENSION Y1(*)
29383      DIMENSION Y2(*)
29384      DIMENSION Y3(*)
29385      DIMENSION TEMPY1(*)
29386      DIMENSION TEMPY2(*)
29387C
29388C---------------------------------------------------------------------
29389C
29390      INCLUDE 'DPCOP2.INC'
29391C
29392C-----START POINT-----------------------------------------------------
29393C
29394      ISUBN1='BOOT'
29395      ISUBN2='SS  '
29396C
29397      IERROR='NO'
29398C
29399      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'OTSS')THEN
29400        WRITE(ICOUT,999)
29401  999   FORMAT(1X)
29402        CALL DPWRST('XXX','BUG ')
29403        WRITE(ICOUT,51)
29404   51   FORMAT('***** AT THE BEGINNING OF BOOTSS--')
29405        CALL DPWRST('XXX','BUG ')
29406        WRITE(ICOUT,52)IBUGA3,ISUBRO,IWRITE,N1
29407   52   FORMAT('IBUGA3,ISUBRO,IWRITE,N1 = ',3(A4,2X),I8)
29408        CALL DPWRST('XXX','BUG ')
29409        DO55I=1,N1
29410          WRITE(ICOUT,56)I,Y1(I),Y2(I)
29411   56     FORMAT('I,Y1(I),Y2(I) = ',I8,2E13.5)
29412          CALL DPWRST('XXX','BUG ')
29413   55   CONTINUE
29414      ENDIF
29415C
29416C               *************************************
29417C               **  CONSTRUCT A  BOOTSTRAP SAMPLE  **
29418C               *************************************
29419C
29420C               ********************************************
29421C               **  STEP 11--                             **
29422C               **  CHECK NUMBER OF INPUT OBSERVATIONS.   **
29423C               ********************************************
29424C
29425      IF(N1.LT.1)THEN
29426        IERROR='YES'
29427        WRITE(ICOUT,999)
29428        CALL DPWRST('XXX','BUG ')
29429        WRITE(ICOUT,1151)
29430 1151   FORMAT('***** ERROR IN BOOTSTRAP SAMPLE (BOOTSS)--')
29431        CALL DPWRST('XXX','BUG ')
29432        WRITE(ICOUT,1152)
29433 1152   FORMAT('      THE NUMBER OF OBSERVATIONS FOR THE RESPONSE')
29434        CALL DPWRST('XXX','BUG ')
29435        WRITE(ICOUT,1153)
29436 1153   FORMAT('      VARIABLE IS LESS THAN ONE.')
29437        CALL DPWRST('XXX','BUG ')
29438        WRITE(ICOUT,1157)N1
29439 1157   FORMAT('      THE NUMBER OF OBSERVATIONS = ',I8,'.')
29440        CALL DPWRST('XXX','BUG ')
29441      ENDIF
29442C
29443      DO1200I=1,N1
29444        TEMPY1(I)=Y1(I)
29445        TEMPY2(I)=Y2(I)
29446 1200 CONTINUE
29447C
29448      J=0
29449      DO1300I=1,N1
29450        INDEX=INT(TEMPY2(I)+0.1)
29451        IF(INDEX.LT.1.OR.INDEX.GT.N1)GOTO1300
29452        J=J+1
29453        Y3(J)=TEMPY1(INDEX)
29454 1300 CONTINUE
29455      N3=J
29456C
29457C               *****************
29458C               **  STEP 90--  **
29459C               **  EXIT.      **
29460C               *****************
29461C
29462      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'OTSS')THEN
29463        WRITE(ICOUT,999)
29464        CALL DPWRST('XXX','BUG ')
29465        WRITE(ICOUT,9011)
29466 9011   FORMAT('***** AT THE END       OF BOOTSS--')
29467        CALL DPWRST('XXX','BUG ')
29468        WRITE(ICOUT,9013)IERROR,N3
29469 9013   FORMAT('IERROR,N3 = ',A4,2X,I8)
29470        CALL DPWRST('XXX','BUG ')
29471        IF(N1.GE.1)THEN
29472          DO9021I=1,N1
29473            WRITE(ICOUT,9022)I,Y1(I),Y2(I)
29474 9022       FORMAT('I,Y1(I),Y2(I) = ',I8,2E13.5)
29475            CALL DPWRST('XXX','BUG ')
29476 9021     CONTINUE
29477        ENDIF
29478        IF(N3.GT.0)THEN
29479          DO9031I=1,N3
29480            WRITE(ICOUT,9032)I,Y3(I)
29481 9032       FORMAT('I,Y3(I) = ',I8,E13.5)
29482            CALL DPWRST('XXX','BUG ')
29483 9031     CONTINUE
29484        ENDIF
29485      ENDIF
29486C
29487      RETURN
29488      END
29489      SUBROUTINE BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,
29490CCCCC RENAME TO HAVE 6-CHARACTER NAME
29491CCCCC SUBROUTINE BP_ADJUST(IND1,IND2,L,NRANK,NCIRQ,KOUNT,
29492     +           ALPHA,ANGLE,K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29493C
29494C  Updates NCIRQ and NRANK, detects the special k-dividers and stores
29495C  their angles and the constant terms of their equations.
29496C
29497      INTEGER NCIRQ(N),NRANK(N),IND1(M),IND2(M)
29498      INTEGER KAND1(MAXNUM),KAND2(MAXNUM)
29499      INTEGER KOUNT,K,L,N,IV,IV1,IV2,D1,D2
29500      double precision X(N),Y(N),ANGLE(M),D(M)
29501      double precision ALPHA(MAXNUM),DUM,PI,PI2
29502      PI=DACOS(DBLE(-1.0))
29503      PI2=PI/2.0
29504      D1=IND1(L)
29505      IV1=NRANK(D1)
29506      D2=IND2(L)
29507      IV2=NRANK(D2)
29508      IV=NCIRQ(IV1)
29509      NCIRQ(IV1)=NCIRQ(IV2)
29510      NCIRQ(IV2)=IV
29511      IV=IV1
29512      NRANK(D1)=IV2
29513      NRANK(D2)=IV
29514       IF (((IV1.EQ.K).AND.(IV2.EQ.(K+1)))
29515     +      .OR.((IV2.EQ.K).AND.(IV1.EQ.(K+1)))
29516     +      .OR.((IV1.EQ.(N-K)).AND.(IV2.EQ.(N-K+1)))
29517     +      .OR.((IV2.EQ.(N-K)).AND.(IV1.EQ.(N-K+1)))) THEN
29518          IF (ANGLE(L).LT.PI2) THEN
29519             DUM=ANGLE(L)+PI2
29520            ELSE
29521             DUM=ANGLE(L)-PI2
29522            ENDIF
29523            IF (((IV1.EQ.K).AND.(IV2.EQ.(K+1)))
29524     +         .OR.((IV2.EQ.K).AND.(IV1.EQ.(K+1)))) THEN
29525             IF (DUM.LE.PI2) THEN
29526              ALPHA(KOUNT)=ANGLE(L)+PI
29527               ELSE
29528              ALPHA(KOUNT)=ANGLE(L)
29529               ENDIF
29530            ENDIF
29531          IF (((IV1.EQ.(N-K)).AND.(IV2.EQ.(N-K+1)))
29532     +        .OR.((IV2.EQ.(N-K)).AND.(IV1.EQ.(N-K+1)))) THEN
29533             IF (DUM.LE.PI2) THEN
29534              ALPHA(KOUNT)=ANGLE(L)
29535               ELSE
29536              ALPHA(KOUNT)=ANGLE(L)+PI
29537               ENDIF
29538            ENDIF
29539          KAND1(KOUNT)=IND1(L)
29540          KAND2(KOUNT)=IND2(L)
29541          D(KOUNT)=DSIN(ALPHA(KOUNT))*X(IND1(L))
29542     +                -DCOS(ALPHA(KOUNT))*Y(IND1(L))
29543            KOUNT=KOUNT+1
29544         ENDIF
29545      RETURN
29546      END
29547      SUBROUTINE BPDEPT(U,V,N,X,Y,BETA,F,DPF,JLV,JRV,HDEP)
29548CCCCC RENAME TO 6-CHARACTER NAME
29549CCCCC SUBROUTINE BP_DEPTH(U,V,N,X,Y,BETA,F,DPF,JLV,JRV,HDEP)
29550C
29551C  Computes the halfspace depth of a point. This subroutine was described
29552C  in: Rousseeuw, P.J. and Ruts, I. (1996). Algorithm AS 307: Bivariate
29553C  location depth. Applied Statistics (JRSS-C) 45, 516-526.
29554C
29555      double precision U,V,BETA(N),X(N),Y(N),DPF(N)
29556      double precision P,P2,EPSI,D,XU,YU,ANG,ALPHK,BETAK
29557      INTEGER F(N),GI,HDEP
29558      integer JLV(N),JRV(N)
29559      NUMH=0
29560      HDEP=0
29561      IF (N.LT.1) RETURN
29562      P=DACOS(DBLE(-1.0))
29563      P2=P*2.0
29564      EPSI=0.000001
29565      NZ=0
29566C
29567C  Construct the array BETA.
29568C
29569
29570      DO 10 I=1,N
29571          D=DSQRT((X(I)-U)*(X(I)-U)+(Y(I)-V)*(Y(I)-V))
29572          IF (D.LE.EPSI) THEN
29573              NZ=NZ+1
29574          ELSE
29575              XU=(X(I)-U)/D
29576              YU=(Y(I)-V)/D
29577              IF (DABS(XU).GT.DABS(YU)) THEN
29578                  IF (X(I).GE.U) THEN
29579                      BETA(I-NZ)=DASIN(YU)
29580                      IF(BETA(I-NZ).LT.0.0) THEN
29581                          BETA(I-NZ)=P2+BETA(I-NZ)
29582                      ENDIF
29583                  ELSE
29584                      BETA(I-NZ)=P-DASIN(YU)
29585                  ENDIF
29586              ELSE
29587                  IF (Y(I).GE.V) THEN
29588                      BETA(I-NZ)=DACOS(XU)
29589                  ELSE
29590                      BETA(I-NZ)=P2-DACOS(XU)
29591                  ENDIF
29592              ENDIF
29593              IF (BETA(I-NZ).GE.(P2-EPSI)) BETA(I-NZ)=0.0
29594          ENDIF
29595  10  CONTINUE
29596      NN=N-NZ
29597      IF (NN.LE.1) GOTO 60
29598C
29599C  Sort the array BETA.
29600C
29601      DO 15 I=1,NN
29602      DPF(I)=DBLE(F(I))
2960315    CONTINUE
29604      CALL BPSORT(BETA,F,F,DPF,NN,JLV,JRV)
29605C
29606C  Check whether Z=(U,V) lies outside the data cloud.
29607C
29608      ANG=BETA(1)-BETA(NN)+P2
29609      DO 20 I=2,NN
29610          ANG=DMAX1(ANG,(BETA(I)-BETA(I-1)))
29611  20  CONTINUE
29612      IF (ANG.GT.(P+EPSI)) GOTO 60
29613C
29614C  Make smallest BETA equal to zero,
29615C  and compute NU = number of BETA < PI.
29616C
29617      ANG=BETA(1)
29618      NU=0
29619      DO 30 I=1,NN
29620          BETA(I)=BETA(I)-ANG
29621          IF (BETA(I).LT.(P-EPSI)) NU=NU+1
29622  30  CONTINUE
29623      IF (NU.GE.NN) GOTO 60
29624C
29625C  Mergesort the BETA with their antipodal angles,
29626C  and at the same time update I, F(I), and NBAD.
29627C
29628      JA=1
29629      JB=1
29630      ALPHK=BETA(1)
29631      BETAK=BETA(NU+1)-P
29632      NN2=NN*2
29633      NBAD=0
29634      I=NU
29635      NF=NN
29636      DO 40 J=1,NN2
29637          IF ((ALPHK+EPSI).LT.BETAK) THEN
29638              NF=NF+1
29639              IF (JA.LT.NN) THEN
29640                  JA=JA+1
29641                  ALPHK=BETA(JA)
29642              ELSE
29643                  ALPHK=P2+1.0
29644              ENDIF
29645          ELSE
29646              I=I+1
29647              IF (I.EQ.(NN+1)) THEN
29648                  I=1
29649                  NF=NF-NN
29650              ENDIF
29651              F(I)=NF
29652              NBAD=NBAD+NBPK((NF-I),2)
29653              IF (JB.LT.NN) THEN
29654                  JB=JB+1
29655                  IF ((JB+NU).LE.NN) THEN
29656                      BETAK=BETA(JB+NU)-P
29657                  ELSE
29658                      BETAK=BETA(JB+NU-NN)+P
29659                  ENDIF
29660              ELSE
29661                  BETAK=P2+1.0
29662              ENDIF
29663          ENDIF
29664  40  CONTINUE
29665C
29666C  Computation of NUMH for halfspace depth.
29667C
29668      GI=0
29669      JA=1
29670      ANG=BETA(1)
29671      NUMH=MIN0(F(1),(NN-F(1)))
29672      DO 50 I=2,NN
29673          IF(BETA(I).LE.(ANG+EPSI)) THEN
29674              JA=JA+1
29675          ELSE
29676              GI=GI+JA
29677              JA=1
29678              ANG=BETA(I)
29679          ENDIF
29680          KI=F(I)-GI
29681          NUMH=MIN0(NUMH,MIN0(KI,(NN-KI)))
29682   50 CONTINUE
29683C
29684C  Adjust for the number NZ of data points equal to Z=(U,V).
29685C
29686   60 NUMH=NUMH+NZ
29687      HDEP=NUMH
29688      RETURN
29689      END
29690      SUBROUTINE BPISOD(N,M,X,Y,MAXN,MAXM,MAXNUM,NRANK,D,F,BETA,
29691CCCCC RENAME TO 6-CHARACTER NAME
29692CCCCC SUBROUTINE BP_ISODEPTH(N,M,X,Y,MAXN,MAXM,MAXNUM,NRANK,D,F,BETA,
29693     +  KAND1,KAND2,ALPHA,IND1,IND2,NCIRQ,MCIRQ,ANGLE,KORNR,L,
29694     +  JRV,JLV,DPF,NUM,K,EMPTY)
29695C
29696C     Computes the depth contour of depth k. This subroutine was described
29697C     in: Ruts, I. and Rousseeuw, P.J. (1996). Computing depth contours of
29698C     bivariate point clouds. CSDA 23, 153-168.
29699C
29700      INTEGER NCIRQ(N),MCIRQ(N),NRANK(N),F(N)
29701      integer JLV(M),JRV(M)
29702      INTEGER IND1(M),IND2(M)
29703      INTEGER KAND1(MAXNUM),KAND2(MAXNUM),KORNR(MAXNUM,4)
29704      INTEGER KON,KONTROL,NDATA,NDK,HALT,halt2,jj,JFULL,EMPTY
29705      INTEGER IV,IW1,IW2,NEXT,JFLAG,KOUNT,NUM,tel
29706      INTEGER HDEP1,HDEP2,HDEP3,HDEP4,HDEP5,I,J,K,L,M,N
29707      double precision X(N),Y(N),BETA(N)
29708      double precision ANGLE(M),D(M),ALPHA(MAXNUM),DPF(N)
29709      double precision PI,PI2,EPS
29710      double precision XCORD,YCORD,ANG1,xcord1,ycord1,m1,m2
29711C
29712      INCLUDE 'DPCOBE.INC'
29713      INCLUDE 'DPCOP2.INC'
29714C
29715      IF(ISUBG4.EQ.'ON')THEN
29716        WRITE(ICOUT,11)MAXN,MAXM
29717   11   FORMAT('MAXN,MAXM = ',2I8)
29718        CALL DPWRST('XXX','BUG ')
29719      ENDIF
29720C
29721      PI=DACOS(DBLE(-1.0))
29722      PI2=PI/2.0
29723      EPS=0.0000001
29724      empty=0
29725      YCORD1=0.0D0
29726      XCORD1=0.0D0
29727      J=0
29728C
29729C   (Re)initialize NCIRQ and NRANK.
29730C
29731      DO 45 I=1,N
29732       NCIRQ(I)=MCIRQ(I)
2973345    CONTINUE
29734      DO 50 I=1,N
29735       IV=NCIRQ(I)
29736       NRANK(IV)=I
29737 50   CONTINUE
29738C
29739C  Let the line rotate from zero to ANGLE(1).
29740C
29741      KOUNT=1
29742      HALT=0
29743      if (angle(1).gt.pi2) then
29744         l=1
29745       CALL BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,ALPHA,ANGLE,
29746     +                        K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29747         halt=1
29748      endif
29749      L=2
29750 60   KONTROL=0
29751      IF ((PI.LE.(ANGLE(L)+PI2)).AND.((ANGLE(L)-PI2).LT.ANGLE(1))) THEN
29752       CALL BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,ALPHA,ANGLE,
29753     +                        K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29754       KONTROL=1
29755      ENDIF
29756      L=L+1
29757      IF (KONTROL.EQ.1) HALT=1
29758      IF ((L.EQ.M+1).AND.(KONTROL.EQ.1)) THEN
29759       JFLAG=1
29760       GOTO 79
29761      ENDIF
29762      IF (((HALT.EQ.1).AND.(KONTROL.EQ.0)).OR.(L.EQ.M+1)) THEN
29763       GOTO 70
29764      ELSE
29765       GOTO 60
29766      ENDIF
29767 70   if (l.gt.1) then
29768         JFLAG=L-1
29769      else
29770         jflag=m
29771      endif
29772      J=0
29773C
29774C  In case the first switch didn't occur between zero and ANGLE(1),
29775C  look for it between the following angles.
29776C
29777      IF ((L.EQ.M+1).AND.(KONTROL.EQ.0)) THEN
29778       HALT=0
29779         halt2=0
29780 73      J=J+1
29781         if (j.eq.m+1) j=1
29782       L=J+1
29783         if (l.eq.m+1) l=1
29784 75      KONTROL=0
29785       IF ((ANGLE(L)+PI2).LT.PI) THEN
29786          ANG1=ANGLE(L)+PI2
29787         ELSE
29788          ANG1=ANGLE(L)-PI2
29789         ENDIF
29790         if (j.eq.m) then
29791            jj=1
29792            if (halt2.eq.0) angle(1)=angle(1)+pi
29793         else
29794            jj=j+1
29795         endif
29796       IF ((ANGLE(J).LE.ANG1).AND.(ANG1.LT.ANGLE(jj))) THEN
29797            if (angle(1).gt.pi) angle(1)=angle(1)-pi
29798          CALL BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,ALPHA,ANGLE,
29799     +                       K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29800          KONTROL=1
29801         ENDIF
29802         if (angle(1).gt.pi) angle(1)=angle(1)-pi
29803       IF (L.NE.M) THEN
29804          L=L+1
29805         ELSE
29806          L=1
29807         ENDIF
29808       IF (KONTROL.EQ.1) HALT=1
29809       IF ((HALT.EQ.1).AND.(KONTROL.EQ.0)) THEN
29810            if (halt2.eq.1) goto 101
29811            if (l.gt.1) then
29812               jflag=l-1
29813            else
29814               jflag=m
29815            endif
29816          GOTO 79
29817         ELSE
29818            IF (L.EQ.jj) THEN
29819               if (jj.eq.1) halt2=1
29820               GOTO 73
29821            ELSE
29822             GOTO 75
29823            ENDIF
29824         ENDIF
29825      ENDIF
29826C
29827C  The first switch has occurred. Now start looking for the next ones,
29828C  between the following angles.
29829C
2983079    DO 80 I=J+1,M-1
29831       L=JFLAG
29832 90      KONTROL=0
29833       IF ((ANGLE(L)+PI2).LT.PI) THEN
29834          ANG1=ANGLE(L)+PI2
29835         ELSE
29836          ANG1=ANGLE(L)-PI2
29837         ENDIF
29838       IF ((ANGLE(I).LE.ANG1).AND.(ANG1.LT.ANGLE(I+1))) THEN
29839          CALL BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,ALPHA,
29840     +                  ANGLE,K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29841          KONTROL=1
29842         ENDIF
29843       IF (KONTROL.EQ.0) THEN
29844          JFLAG=L
29845         ELSE
29846          IF (L.NE.M) THEN
29847             L=L+1
29848            ELSE
29849             L=1
29850            ENDIF
29851          GOTO 90
29852         ENDIF
29853 80   CONTINUE
29854      L=JFLAG
29855C
29856C  Finally, look for necessary switches between the last angle and zero.
29857C
29858100   KONTROL=0
29859      IF ((ANGLE(L)+PI2).LT.PI) THEN
29860       ANG1=ANGLE(L)+PI2
29861      ELSE
29862       ANG1=ANGLE(L)-PI2
29863      ENDIF
29864      IF ((ANGLE(M).LE.ANG1).AND.(ANG1.LT.PI)) THEN
29865       CALL BPADJU(IND1,IND2,L,NRANK,NCIRQ,KOUNT,ALPHA,
29866     +               ANGLE,K,N,M,MAXNUM,KAND1,KAND2,D,X,Y)
29867       KONTROL=1
29868      ENDIF
29869      IF (KONTROL.EQ.1) THEN
29870         IF (L.NE.M) THEN
29871           L=L+1
29872         ELSE
29873           L=1
29874         ENDIF
29875         GOTO 100
29876      ENDIF
29877101      NUM=KOUNT-1
29878C
29879C  Sort the NUM special k-dividers.
29880C  Permute KAND1, KAND2 and D in the same way.
29881C
29882      CALL BPSORT(ALPHA,KAND1,KAND2,D,NUM,JLV,JRV)
29883      IW1=1
29884      IW2=2
29885      JFULL=0
29886      NDK=0
29887      tel=0
29888
29889120   NDATA=0
29890C
29891C  Compute the intersection point.
29892C
29893      IF (DABS(-DSIN(ALPHA(IW2))*DCOS(ALPHA(IW1))
29894     +         +DSIN(ALPHA(IW1))*DCOS(ALPHA(IW2))).LT.EPS) THEN
29895       IW2=IW2+1
29896       IF (IW2.EQ.NUM+1) IW2=1
29897       GOTO 120
29898      ENDIF
29899      XCORD=(DCOS(ALPHA(IW2))*D(IW1)-DCOS(ALPHA(IW1))*D(IW2))
29900     + /(-DSIN(ALPHA(IW2))*DCOS(ALPHA(IW1))
29901     +                   +DSIN(ALPHA(IW1))*DCOS(ALPHA(IW2)))
29902      YCORD=(-DSIN(ALPHA(IW2))*D(IW1)+DSIN(ALPHA(IW1))*D(IW2))
29903     + /(-DSIN(ALPHA(IW1))*DCOS(ALPHA(IW2))
29904     +                   +DSIN(ALPHA(IW2))*DCOS(ALPHA(IW1)))
29905C
29906C  Test whether the intersection point is a data point.
29907C  If so, adjust IW1 and IW2.
29908C
29909      IF ((KAND1(IW1).EQ.KAND1(IW2)).OR.(KAND1(IW1).EQ.KAND2(IW2)))
29910     +     NDATA=KAND1(IW1)
29911      IF ((KAND2(IW1).EQ.KAND1(IW2)).OR.(KAND2(IW1).EQ.KAND2(IW2)))
29912     +     NDATA=KAND2(IW1)
29913      IF (NDATA.NE.0) THEN
29914         iv=0
29915 125     NEXT=IW2+1
29916         iv=iv+1
29917         IF (NEXT.EQ.(NUM+1)) NEXT=1
29918         if (next.ne.iw1) then
29919            IF ((NDATA.EQ.KAND1(NEXT)).OR.(NDATA.EQ.KAND2(NEXT))) THEN
29920               IW2=IW2+1
29921               IF (IW2.EQ.(NUM+1)) IW2=1
29922               GOTO 125
29923            ENDIF
29924         endif
29925         if (iv.eq.(num-1)) then
29926            num=1
29927            KORNR(1,1)=KAND1(IW1)
29928            KORNR(1,2)=KAND2(IW1)
29929            KORNR(1,3)=KAND1(IW2)
29930            KORNR(1,4)=KAND2(IW2)
29931            return
29932         endif
29933      ENDIF
29934      IF (IW2.EQ.NUM) THEN
29935         KON=1
29936      ELSE
29937         KON=IW2+1
29938      ENDIF
29939      if (kon.eq.iw1) kon=kon+1
29940      if (kon.eq.num+1) kon=1
29941C
29942C  Test whether the intersection point lies to the left of the special
29943C  k-divider which corresponds to ALPHA(KON). If so, compute its depth.
29944C
29945      IF ((DSIN(ALPHA(KON))*XCORD-DCOS(ALPHA(KON))*YCORD
29946     +     -D(KON)).le.eps) THEN
29947
29948         CALL BPDEPT(XCORD,YCORD,N,X,Y,BETA,F,DPF,JLV,JRV,HDEP1)
29949
29950         IF (HDEP1.EQ.K) NDK=1
29951         IF (HDEP1.NE.K) THEN
29952         CALL BPDEPT(XCORD-EPS*10,YCORD-EPS*10,N,X,Y,BETA,F,DPF,
29953     +           JLV,JRV,HDEP2)
29954         CALL BPDEPT(XCORD+EPS*10,YCORD+EPS*10,N,X,Y,BETA,F,DPF,
29955     +        JLV,JRV,HDEP3)
29956         CALL BPDEPT(XCORD-EPS*10,YCORD+EPS*10,N,X,Y,BETA,F,DPF,
29957     +        JLV,JRV,HDEP4)
29958         CALL BPDEPT(XCORD+EPS*10,YCORD-EPS*10,N,X,Y,BETA,F,DPF,
29959     +        JLV,JRV,HDEP5)
29960         IF ((NDK.EQ.0).AND.
29961     +        ((HDEP1.ge.K).OR.(HDEP2.ge.K).OR.(HDEP3.ge.K)
29962     +        .OR.(HDEP4.ge.K).OR.(HDEP5.ge.K))) THEN
29963            NDK=1
29964         ENDIF
29965         IF ((HDEP1.LT.K).AND.(HDEP2.LT.K)
29966     +        .AND.(HDEP3.LT.K).AND.(HDEP4.LT.K)
29967     +        .AND.(HDEP5.LT.K).AND.(NDK.EQ.1)) THEN
29968C
29969C  The intersection point is not the correct one,
29970C  try the next special k-divider.
29971C
29972            IW2=IW2+1
29973            IF (IW2.EQ.(NUM+1)) IW2=1
29974            GOTO 120
29975         ENDIF
29976      ENDIF
29977C
29978C  Store IW1 and IW2 in KORNR. If KORNR has already been filled, check whether
29979C  we have encountered this intersection point before.
29980C
29981      IF ((IW2.GT.IW1).AND.(JFULL.EQ.0)) THEN
29982         DO 130 I=IW1,IW2-1
29983            KORNR(I,1)=KAND1(IW1)
29984            KORNR(I,2)=KAND2(IW1)
29985            KORNR(I,3)=KAND1(IW2)
29986            KORNR(I,4)=KAND2(IW2)
29987 130     CONTINUE
29988      ELSE
29989         IF (IW2.GT.IW1) THEN
29990            DO 140 I=IW1,IW2-1
29991               IF ((KORNR(I,1).EQ.KAND1(IW1)).AND.
29992     +              (KORNR(I,2).EQ.KAND2(IW1)).AND.
29993     +              (KORNR(I,3).EQ.KAND1(IW2)).AND.
29994     +              (KORNR(I,4).EQ.KAND2(IW2)))
29995     +              THEN
29996              GOTO 170
29997               ELSE
29998                  tel=tel+1
29999                  if (tel.gt.num*num) then
30000                     ndk=1
30001                     goto 170
30002                  endif
30003                  m1=(y(kornr(i,2))-y(kornr(i,1)))/
30004     +                 (x(kornr(i,2))-x(kornr(i,1)))
30005                  m2=(y(kornr(i,4))-y(kornr(i,3)))/
30006     +                 (x(kornr(i,4))-x(kornr(i,3)))
30007                  if (m1.ne.m2) then
30008                     xcord1=(m1*x(kornr(i,1))-y(kornr(i,1))-
30009     +                    m2*x(kornr(i,3))-y(kornr(i,3)))/(m1-m2)
30010                     ycord1=(m2*(m1*x(kornr(i,1))-y(kornr(i,1)))-
30011     +                    m1*(m2*x(kornr(i,3))-y(kornr(i,3))))/(m1-m2)
30012                  endif
30013                  if ((dabs(xcord1-xcord).le.eps).and.
30014     +                 (dabs(ycord1-ycord).le.eps)) then
30015                     goto 170
30016                  endif
30017
30018              KORNR(I,1)=KAND1(IW1)
30019              KORNR(I,2)=KAND2(IW1)
30020              KORNR(I,3)=KAND1(IW2)
30021              KORNR(I,4)=KAND2(IW2)
30022               ENDIF
30023 140        CONTINUE
30024         ELSE
30025            JFULL=1
30026            DO 150 I=IW1,NUM
30027               KORNR(I,1)=KAND1(IW1)
30028               KORNR(I,2)=KAND2(IW1)
30029               KORNR(I,3)=KAND1(IW2)
30030               KORNR(I,4)=KAND2(IW2)
30031 150        CONTINUE
30032            DO 160 I=1,IW2-1
30033               IF ((KORNR(I,1).EQ.KAND1(IW1)).AND.
30034     +              (KORNR(I,2).EQ.KAND2(IW1)).AND.
30035     +              (KORNR(I,3).EQ.KAND1(IW2)).AND.
30036     +              (KORNR(I,4).EQ.KAND2(IW2)))
30037     +              THEN
30038              GOTO 170
30039               ELSE
30040                  tel=tel+1
30041                  if (tel.gt.num*num) then
30042                     ndk=1
30043                     goto 170
30044                  endif
30045                  m1=(y(kornr(i,2))-y(kornr(i,1)))/
30046     +                 (x(kornr(i,2))-x(kornr(i,1)))
30047                  m2=(y(kornr(i,4))-y(kornr(i,3)))/
30048     +                 (x(kornr(i,4))-x(kornr(i,3)))
30049                  if (m1.ne.m2) then
30050                     xcord1=(m1*x(kornr(i,1))-y(kornr(i,1))-
30051     +                    m2*x(kornr(i,3))-y(kornr(i,3)))/(m1-m2)
30052                     ycord1=(m2*(m1*x(kornr(i,1))-y(kornr(i,1)))-
30053     +                    m1*(m2*x(kornr(i,3))-y(kornr(i,3))))/(m1-m2)
30054                  endif
30055                  if ((dabs(xcord1-xcord).le.eps).and.
30056     +                 (dabs(ycord1-ycord).le.eps)) then
30057                     goto 170
30058                  endif
30059
30060              KORNR(I,1)=KAND1(IW1)
30061              KORNR(I,2)=KAND2(IW1)
30062              KORNR(I,3)=KAND1(IW2)
30063              KORNR(I,4)=KAND2(IW2)
30064               ENDIF
30065 160        CONTINUE
30066         ENDIF
30067      ENDIF
30068      ELSE
30069C
30070C  The intersection point is not the correct one,
30071C  try the next special k-divider.
30072C
30073       IW2=IW2+1
30074       IF (IW2.EQ.(NUM+1)) IW2=1
30075       GOTO 120
30076      ENDIF
30077C
30078C  Look for the next vertex of the convex figure.
30079C
30080      IW1=IW2
30081      IW2=IW2+1
30082      IF (IW2.EQ.(NUM+1)) IW2=1
30083      GOTO 120
30084170   if (ndk.eq.0) empty=1
30085      RETURN
30086      END
30087      subroutine bprdra(a,ntot,seed,n)
30088CCCCC RENAME TO 6-CHARACTER NAME
30089CCCCC subroutine bp_rdraw(a,ntot,seed,n)
30090C
30091C     Draws n elements out of a dataset of size ntot, such that
30092C     the selected case numbers are uniformly distributed from 1 to ntot.
30093C
30094      integer a(n)
30095      integer seed,nrand
30096        real xjunk(1)
30097        double precision urand
30098      jndex=0
30099      do 20 m=1,n
30100CCCCC     call bp_uniran(1,seed,urand)
30101          call uniran(1,seed,xjunk)
30102          urand=dble(xjunk(1))
30103        nrand=int(urand*(ntot-jndex))+1
30104        jndex=jndex+1
30105        if(jndex.eq.1) then
30106          a(jndex)=nrand
30107        else
30108          a(jndex)=nrand+jndex-1
30109          do 5 i=1,jndex-1
30110            if(a(i).gt.nrand+i-1) then
30111              do 6 j=jndex,i+1,-1
30112                a(j)=a(j-1)
30113 6              continue
30114              a(i)=nrand+i-1
30115              goto 20
30116            endif
30117 5          continue
30118        endif
30119 20     continue
30120      return
30121      end
30122      DOUBLE PRECISION FUNCTION bpser(a,b,x,eps)
30123C-----------------------------------------------------------------------
30124C     POWER SERIES EXPANSION FOR EVALUATING IX(A,B) WHEN B .LE. 1
30125C     OR B*X .LE. 0.7.  EPS IS THE TOLERANCE USED.
30126C-----------------------------------------------------------------------
30127C     .. Scalar Arguments ..
30128      DOUBLE PRECISION a,b,eps,x
30129C     ..
30130C     .. Local Scalars ..
30131      DOUBLE PRECISION a0,apb,b0,c,n,sum,t,tol,u,w,z
30132      INTEGER i,m
30133C     ..
30134C     .. External Functions ..
30135      DOUBLE PRECISION algdiv,betaln,gam1,gamln1
30136      EXTERNAL algdiv,betaln,gam1,gamln1
30137C     ..
30138C     .. Intrinsic Functions ..
30139      INTRINSIC abs,dble,dlog,dmax1,dmin1,exp
30140C     ..
30141C     .. Executable Statements ..
30142C
30143      bpser = 0.0D0
30144      IF (x.EQ.0.0D0) RETURN
30145C-----------------------------------------------------------------------
30146C            COMPUTE THE FACTOR X**A/(A*BETA(A,B))
30147C-----------------------------------------------------------------------
30148      a0 = dmin1(a,b)
30149      IF (a0.LT.1.0D0) GO TO 10
30150      z = a*dlog(x) - betaln(a,b)
30151      bpser = exp(z)/a
30152      GO TO 100
30153
30154   10 b0 = dmax1(a,b)
30155      IF (b0.GE.8.0D0) GO TO 90
30156      IF (b0.GT.1.0D0) GO TO 40
30157C
30158C            PROCEDURE FOR A0 .LT. 1 AND B0 .LE. 1
30159C
30160      bpser = x**a
30161      IF (bpser.EQ.0.0D0) RETURN
30162C
30163      apb = a + b
30164      IF (apb.GT.1.0D0) GO TO 20
30165      z = 1.0D0 + gam1(apb)
30166      GO TO 30
30167
30168   20 u = dble(a) + dble(b) - 1.D0
30169      z = (1.0D0+gam1(u))/apb
30170C
30171   30 c = (1.0D0+gam1(a))* (1.0D0+gam1(b))/z
30172      bpser = bpser*c* (b/apb)
30173      GO TO 100
30174C
30175C         PROCEDURE FOR A0 .LT. 1 AND 1 .LT. B0 .LT. 8
30176C
30177   40 u = gamln1(a0)
30178      m = int(b0 - 1.0D0)
30179      IF (m.LT.1) GO TO 60
30180      c = 1.0D0
30181      DO 50 i = 1,m
30182          b0 = b0 - 1.0D0
30183          c = c* (b0/ (a0+b0))
30184   50 CONTINUE
30185      u = dlog(c) + u
30186C
30187   60 z = a*dlog(x) - u
30188      b0 = b0 - 1.0D0
30189      apb = a0 + b0
30190      IF (apb.GT.1.0D0) GO TO 70
30191      t = 1.0D0 + gam1(apb)
30192      GO TO 80
30193
30194   70 u = dble(a0) + dble(b0) - 1.D0
30195      t = (1.0D0+gam1(u))/apb
30196   80 bpser = exp(z)* (a0/a)* (1.0D0+gam1(b0))/t
30197      GO TO 100
30198C
30199C            PROCEDURE FOR A0 .LT. 1 AND B0 .GE. 8
30200C
30201   90 u = gamln1(a0) + algdiv(a0,b0)
30202      z = a*dlog(x) - u
30203      bpser = (a0/a)*exp(z)
30204  100 IF (bpser.EQ.0.0D0 .OR. a.LE.0.1D0*eps) RETURN
30205C-----------------------------------------------------------------------
30206C                     COMPUTE THE SERIES
30207C-----------------------------------------------------------------------
30208      sum = 0.0D0
30209      n = 0.0D0
30210      c = 1.0D0
30211      tol = eps/a
30212  110 n = n + 1.0D0
30213      c = c* (0.5D0+ (0.5D0-b/n))*x
30214      w = c/ (a+n)
30215      sum = sum + w
30216      IF (abs(w).GT.tol) GO TO 110
30217      bpser = bpser* (1.0D0+a*sum)
30218      RETURN
30219
30220      END
30221      SUBROUTINE BPSORT(B,I1,I2,R,N,JLV,JRV)
30222CCCCC RENAME TO USE 6 CHARACTER NAME
30223CCCCC SUBROUTINE BP_SORT(B,I1,I2,R,N,JLV,JRV)
30224C
30225C  Sorts a double precision  array B of length N and permutes two
30226C  integer arrays I1 and I2 and one double precision array R in the
30227C  same way.
30228C
30229      INTEGER N,I1(*),I2(*),H1,H2
30230      double precision B(*),XX,AMM
30231      double precision R(*),H3
30232      integer JLV(*),JRV(*)
30233      JSS=1
30234      JLV(1)=1
30235      JRV(1)=N
30236 10   JNDL=JLV(JSS)
30237      JR=JRV(JSS)
30238      JSS=JSS-1
30239 20   JNC=JNDL
30240      J=JR
30241      JTWE=(JNDL+JR)/2
30242      XX=B(JTWE)
30243 30   IF (B(JNC).GE.XX) GOTO 40
30244      JNC=JNC+1
30245      GOTO 30
30246 40   IF (XX.GE.B(J)) GOTO 50
30247      J=J-1
30248      GOTO 40
30249 50   IF (JNC.GT.J) GOTO 60
30250      AMM=B(JNC)
30251      H1=I1(JNC)
30252      H2=I2(JNC)
30253      H3=R(JNC)
30254      B(JNC)=B(J)
30255      I1(JNC)=I1(J)
30256      I2(JNC)=I2(J)
30257      R(JNC)=R(J)
30258      B(J)=AMM
30259      I1(J)=H1
30260      I2(J)=H2
30261      R(J)=H3
30262      JNC=JNC+1
30263      J=J-1
30264 60   IF (JNC.LE.J) GOTO 30
30265      IF ((J-JNDL).LT.(JR-JNC)) GOTO 80
30266      IF (JNDL.GE.J) GOTO 70
30267      JSS=JSS+1
30268      JLV(JSS)=JNDL
30269      JRV(JSS)=J
30270 70   JNDL=JNC
30271      GOTO 100
30272 80   IF (JNC.GE.JR) GOTO 90
30273      JSS=JSS+1
30274      JLV(JSS)=JNC
30275      JRV(JSS)=JR
30276 90   JR=J
30277100   IF (JNDL.LT.JR) GOTO 20
30278      IF (JSS.NE.0) GOTO 10
30279      RETURN
30280      END
30281      SUBROUTINE BRACDF(X,BETA,CDF)
30282C
30283C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
30284C              FUNCTION VALUE FOR THE BRADFORD
30285C              DISTRIBUTION WITH SINGLE PRECISION
30286C              TAIL LENGTH PARAMETER = BETA.
30287C              THE BRADFORD DISTRIBUTION USED
30288C              HEREIN IS DEFINED FOR 0 < x < 1.
30289C              AND HAS THE PROBABILITY DENSITY FUNCTION
30290C              F(X) = [BETA / LOG(1+BETA)]*(1/(1+BETA*X))
30291C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
30292C                                AT WHICH THE CUMULATIVE DISTRIBUTION
30293C                                FUNCTION IS TO BE EVALUATED.
30294C                                X SHOULD BE GREATER THAN
30295C                                OR EQUAL TO 1.
30296C                     --BETA  = THE SINGLE PRECISION VALUE
30297C                                OF THE TAIL LENGTH PARAMETER.
30298C                                BETA SHOULD BE POSITIVE.
30299C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PROBABILITY
30300C                                DENSITY FUNCTION VALUE.
30301C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
30302C             FUNCTION VALUE CDF FOR THE BRADFORD
30303C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = BETA.
30304C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
30305C     RESTRICTIONS--BETA SHOULD BE POSITIVE.
30306C                 --X SHOULD BE POSITIVE AND LESS THAN 1.
30307C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
30308C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
30309C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
30310C     LANGUAGE--ANSI FORTRAN.
30311C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
30312C                 DISTRIBUTIONS--2, 2ND. ED., 1994, PAGE 347.
30313C     WRITTEN BY--JAMES J. FILLIBEN
30314C                 STATISTICAL ENGINEERING LABORATORY (205.03)
30315C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30316C                 GAITHERSBURG, MD 20899-8980
30317C                 PHONE:  301-975-2855
30318C     ORIGINAL VERSION--FEBRUARY  1995.
30319C
30320C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30321C
30322C---------------------------------------------------------------------
30323C
30324      DOUBLE PRECISION DX
30325      DOUBLE PRECISION DB
30326      DOUBLE PRECISION DTERM1
30327      DOUBLE PRECISION DCDF
30328C
30329      INCLUDE 'DPCOP2.INC'
30330C
30331C---------------------------------------------------------------------
30332C
30333C     CHECK THE INPUT ARGUMENTS FOR ERRORS
30334C
30335      IF(X.LE.0.0.OR.X.GE.1.0)THEN
30336        WRITE(ICOUT,4)
30337        CALL DPWRST('XXX','BUG ')
30338        WRITE(ICOUT,46)X
30339        CALL DPWRST('XXX','BUG ')
30340        CDF=0.0
30341        GOTO9999
30342      ENDIF
30343    4 FORMAT('***** FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT ',
30344     1'TO BRACDF IS OUTSIDE THE (0,1) INTERVAL')
30345      IF(BETA.LE.-1.0)THEN
30346        WRITE(ICOUT,15)
30347        CALL DPWRST('XXX','BUG ')
30348        WRITE(ICOUT,46)BETA
30349        CALL DPWRST('XXX','BUG ')
30350        CDF=0.0
30351        GOTO9999
30352      ENDIF
30353   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
30354     1'TO BRACDF IS LESS THAN OR EQUAL TO -1')
30355   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
30356C
30357C-----START POINT-----------------------------------------------------
30358C
30359      DX=DBLE(X)
30360      DB=DBLE(BETA)
30361      IF(DB.LE.0.0D0)THEN
30362        DCDF=DLOG(1.0D0+DB*DX)/DLOG(1.0D0+DB)
30363        CDF=SNGL(DCDF)
30364      ELSE
30365        DTERM1=DLOG(DLOG(1.0D0+DB*DX))-DLOG(DLOG(1.0D0+DB))
30366        IF(DTERM1.GE.-65.0D0)THEN
30367          DCDF=DEXP(DTERM1)
30368          CDF=SNGL(DCDF)
30369        ELSE
30370          CDF=0.0
30371        ENDIF
30372      ENDIF
30373C
30374 9999 CONTINUE
30375      RETURN
30376      END
30377      SUBROUTINE BRAPDF(X,BETA,PDF)
30378C
30379C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
30380C              FUNCTION VALUE FOR THE BRADFORD
30381C              DISTRIBUTION WITH SINGLE PRECISION
30382C              TAIL LENGTH PARAMETER = BETA.
30383C              THE BRADFORD DISTRIBUTION USED
30384C              HEREIN IS DEFINED FOR 0 < x < 1.
30385C              AND HAS THE PROBABILITY DENSITY FUNCTION
30386C              F(X) = [BETA / LOG(1+BETA)]*(1/(1+BETA*X))
30387C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
30388C                                AT WHICH THE PROBABILITY DENSITY
30389C                                FUNCTION IS TO BE EVALUATED.
30390C                                X SHOULD BE GREATER THAN
30391C                                OR EQUAL TO 1.
30392C                     --BETA  = THE SINGLE PRECISION VALUE
30393C                                OF THE TAIL LENGTH PARAMETER.
30394C                                BETA SHOULD BE POSITIVE.
30395C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
30396C                                DENSITY FUNCTION VALUE.
30397C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
30398C             FUNCTION VALUE PDF FOR THE BRADFORD
30399C             DISTRIBUTION WITH TAIL LENGTH PARAMETER VALUE = BETA.
30400C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
30401C     RESTRICTIONS--BETA SHOULD BE POSITIVE.
30402C                 --X SHOULD BE POSITIVE AND LESS THAN 1.
30403C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
30404C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
30405C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
30406C     LANGUAGE--ANSI FORTRAN.
30407C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
30408C                 DISTRIBUTIONS--2, 2ND. ED., 1994, PAGE 347.
30409C     WRITTEN BY--JAMES J. FILLIBEN
30410C                 STATISTICAL ENGINEERING LABORATORY (205.03)
30411C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30412C                 GAITHERSBURG, MD 20899-8980
30413C                 PHONE:  301-975-2855
30414C     ORIGINAL VERSION--FEBRUARY  1995.
30415C
30416C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30417C
30418C---------------------------------------------------------------------
30419C
30420      DOUBLE PRECISION DX
30421      DOUBLE PRECISION DB
30422      DOUBLE PRECISION DTERM1
30423      DOUBLE PRECISION DPDF
30424C
30425      INCLUDE 'DPCOP2.INC'
30426C
30427C---------------------------------------------------------------------
30428C
30429C     CHECK THE INPUT ARGUMENTS FOR ERRORS
30430C
30431      IF(X.LE.0.0.OR.X.GE.1.0)THEN
30432        WRITE(ICOUT,4)
30433        CALL DPWRST('XXX','BUG ')
30434        WRITE(ICOUT,46)X
30435        CALL DPWRST('XXX','BUG ')
30436        PDF=0.0
30437        GOTO9999
30438      ENDIF
30439    4 FORMAT('***** FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT ',
30440     1'TO BRAPDF IS OUTSIDE THE (0,1) INTERVAL')
30441      IF(BETA.LE.-1.0)THEN
30442        WRITE(ICOUT,15)
30443        CALL DPWRST('XXX','BUG ')
30444        WRITE(ICOUT,46)BETA
30445        CALL DPWRST('XXX','BUG ')
30446        PDF=0.0
30447        GOTO9999
30448      ENDIF
30449   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
30450     1'TO BRAPDF IS LESS THAN OR EQUAL TO -1')
30451   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
30452C
30453C-----START POINT-----------------------------------------------------
30454C
30455      DX=DBLE(X)
30456      DB=DBLE(BETA)
30457      IF(DB.LE.0.0D0)THEN
30458        DPDF=DB/(DLOG(1.0D0+DB)*(1.0D0+DB*DX))
30459        PDF=SNGL(DPDF)
30460      ELSE
30461        DTERM1=DLOG(DB)-DLOG(DLOG(1.0D0+DB))-DLOG(1.0D0+DB*DX)
30462        IF(DTERM1.GE.-65.0D0)THEN
30463          DPDF=DEXP(DTERM1)
30464          PDF=SNGL(DPDF)
30465        ELSE
30466          PDF=0.0
30467        ENDIF
30468      ENDIF
30469C
30470 9999 CONTINUE
30471      RETURN
30472      END
30473      SUBROUTINE BRAPPF(P,BETA,PPF)
30474C
30475C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
30476C              FUNCTION VALUE FOR THE BRADFORD
30477C              DISTRIBUTION WITH SINGLE PRECISION
30478C              TAIL LENGTH PARAMETER = BETA.
30479C              THE BRADFORD DISTRIBUTION USED
30480C              HEREIN IS DEFINED FOR 0 < x < 1.
30481C              AND HAS THE PROBABILITY DENSITY FUNCTION
30482C              F(X) = [BETA / LOG(1+BETA)]*(1/(1+BETA*X))
30483C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
30484C                                (BETWEEN 0.0 (INCLUSIVELY)
30485C                                AND 1.0 (EXCLUSIVELY))
30486C                                AT WHICH THE PERCENT POINT
30487C                                FUNCTION IS TO BE EVALUATED.
30488C                     --BETA  = THE SINGLE PRECISION VALUE
30489C                                OF THE TAIL LENGTH PARAMETER.
30490C                                BETA SHOULD BE POSITIVE.
30491C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT
30492C                                POINT FUNCTION VALUE.
30493C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION .
30494C             VALUE PPF FOR THE BRADFORD DISTRIBUTION
30495C             WITH TAIL LENGTH PARAMETER VALUE = BETA.
30496C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
30497C     RESTRICTIONS--BETA SHOULD BE POSITIVE.
30498C                 --P SHOULD BE BETWEEN 0.0 (INCLUSIVELY)
30499C                   AND 1.0 (EXCLUSIVELY).
30500C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
30501C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
30502C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
30503C     LANGUAGE--ANSI FORTRAN (1977)
30504C     REFERENCES--JOHNSON AND KOTZ, CONTINUOUS UNIVARIATE
30505C                 DISTRIBUTIONS--2, 2ND. ED., 1994, PAGE 347.
30506C     WRITTEN BY--JAMES J. FILLIBEN
30507C                 STATISTICAL ENGINEERING DIVISION
30508C                 INFORMATION TECHNOLOGY LABORATORY
30509C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30510C                 GAITHERSBURG, MD 20899-8980
30511C                 PHONE--301-975-2855
30512C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
30513C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
30514C     LANGUAGE--ANSI FORTRAN (1966)
30515C               EXCEPTION--HOLLERITH STRINGS IN FORMAT STATEMENTS
30516C                          DENOTED BY QUOTES RATHER THAN NH.
30517C     VERSION NUMBER--96.2
30518C     ORIGINAL VERSION--FEBRUARY  1996.
30519C
30520C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30521C
30522C---------------------------------------------------------------------
30523C
30524      DOUBLE PRECISION DP
30525      DOUBLE PRECISION DB
30526      DOUBLE PRECISION DPPF
30527C
30528      INCLUDE 'DPCOP2.INC'
30529C
30530C-----START POINT-----------------------------------------------------
30531C
30532C     CHECK THE INPUT ARGUMENTS FOR ERRORS
30533C
30534      IF(P.LE.0.0.OR.P.GE.1.0)THEN
30535        WRITE(ICOUT,1)
30536        CALL DPWRST('XXX','BUG ')
30537        WRITE(ICOUT,46)P
30538        CALL DPWRST('XXX','BUG ')
30539        PPF=0.0
30540        GOTO9999
30541      ENDIF
30542    1 FORMAT('***** FATAL ERROR--THE 1ST INPUT ARGUMENT TO THE ',
30543     1'BRAPPF SUBROUTINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
30544      IF(BETA.LE.-1.0)THEN
30545        WRITE(ICOUT,15)
30546        CALL DPWRST('XXX','BUG ')
30547        WRITE(ICOUT,46)BETA
30548        CALL DPWRST('XXX','BUG ')
30549        PDF=0.0
30550        GOTO9999
30551      ENDIF
30552   15 FORMAT('***** FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT ',
30553     1'TO BRAPPF IS LESS THAN OR EQUAL TO -1')
30554   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
30555C
30556      DP=DBLE(P)
30557      DB=DBLE(BETA)
30558      DPPF=(DEXP(DLOG(1.0D0+DB)*DP)-1.0D0)/DB
30559      PPF=SNGL(DPPF)
30560C
30561 9999 CONTINUE
30562      RETURN
30563      END
30564      SUBROUTINE BRARAN(N,BETA,ISEED,X)
30565C
30566C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
30567C              FROM THE BRADFORD DISTRIBUTION
30568C              WITH SHAPE PARAMETER VALUE = BETA.
30569C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
30570C                                OF RANDOM NUMBERS TO BE
30571C                                GENERATED.
30572C                     --BETA  = THE SINGLE PRECISION VALUE OF THE
30573C                                SHAPE PARAMETER.
30574C                                BETA SHOULD BE POSITIVE.
30575C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
30576C                                (OF DIMENSION AT LEAST N)
30577C                                INTO WHICH THE GENERATED
30578C                                RANDOM SAMPLE WILL BE PLACED.
30579C     OUTPUT--A RANDOM SAMPLE OF SIZE N
30580C             FROM THE BRADFORD DISTRIBUTION
30581C             WITH SHAPE PARAMETER VALUE = BETA.
30582C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
30583C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
30584C                   OF N FOR THIS SUBROUTINE.
30585C                 --BETA SHOULD BE POSITIVE.
30586C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
30587C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
30588C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
30589C     LANGUAGE--ANSI FORTRAN (1977)
30590C     REFERENCES--XX
30591C     WRITTEN BY--JAMES J. FILLIBEN
30592C                 STATISTICAL ENGINEERING DIVISION
30593C                 INFORMATION TECHNOLOGY LABORATORY
30594C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
30595C                 GAITHERSBURG, MD 20899-8980
30596C                 PHONE--301-975-2855
30597C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
30598C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
30599C     LANGUAGE--ANSI FORTRAN (1977)
30600C     VERSION NUMBER--2001.10
30601C     ORIGINAL VERSION--OCTOBER   2001.
30602C
30603C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
30604C
30605C---------------------------------------------------------------------
30606C
30607      DIMENSION X(*)
30608C
30609C---------------------------------------------------------------------
30610C
30611      INCLUDE 'DPCOP2.INC'
30612C
30613C-----START POINT-----------------------------------------------------
30614C
30615C     CHECK THE INPUT ARGUMENTS FOR ERRORS
30616C
30617      IF(N.LT.1)THEN
30618        WRITE(ICOUT, 5)
30619        CALL DPWRST('XXX','BUG ')
30620        WRITE(ICOUT,47)N
30621        CALL DPWRST('XXX','BUG ')
30622        GOTO9000
30623      ENDIF
30624      IF(BETA.LE.0.0)THEN
30625        WRITE(ICOUT,15)
30626        CALL DPWRST('XXX','BUG ')
30627        WRITE(ICOUT,46)BETA
30628        CALL DPWRST('XXX','BUG ')
30629        GOTO9000
30630      ENDIF
30631    5 FORMAT('***** FATAL ERROR--THE 1ST INPUT ARGUMENT TO THE ',
30632     1'BRARAN SUBROUTINE IS NON-POSITIVE *****')
30633   15 FORMAT('***** FATAL ERROR--THE 2ND INPUT ARGUMENT TO THE ',
30634     1'BRARAN SUBROUTINE IS NON-POSITIVE *****')
30635   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****')
30636   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,' *****')
30637C
30638C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
30639C
30640      CALL UNIRAN(N,ISEED,X)
30641C
30642C     GENERATE N BRADFORD DISTRIBUTION RANDOM NUMBERS
30643C     USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
30644C
30645      DO100I=1,N
30646        CALL BRAPPF(X(I),BETA,XTEMP)
30647        X(I)=XTEMP
30648  100 CONTINUE
30649C
30650 9000 CONTINUE
30651      RETURN
30652      END
30653      SUBROUTINE bratio(a,b,x,y,w,w1,ierr)
30654C-----------------------------------------------------------------------
30655C
30656C            EVALUATION OF THE INCOMPLETE BETA FUNCTION IX(A,B)
30657C
30658C                     --------------------
30659C
30660C     IT IS ASSUMED THAT A AND B ARE NONNEGATIVE, AND THAT X .LE. 1
30661C     AND Y = 1 - X.  BRATIO ASSIGNS W AND W1 THE VALUES
30662C
30663C                      W  = IX(A,B)
30664C                      W1 = 1 - IX(A,B)
30665C
30666C     IERR IS A VARIABLE THAT REPORTS THE STATUS OF THE RESULTS.
30667C     IF NO INPUT ERRORS ARE DETECTED THEN IERR IS SET TO 0 AND
30668C     W AND W1 ARE COMPUTED. OTHERWISE, IF AN ERROR IS DETECTED,
30669C     THEN W AND W1 ARE ASSIGNED THE VALUE 0 AND IERR IS SET TO
30670C     ONE OF THE FOLLOWING VALUES ...
30671C
30672C        IERR = 1  IF A OR B IS NEGATIVE
30673C        IERR = 2  IF A = B = 0
30674C        IERR = 3  IF X .LT. 0 OR X .GT. 1
30675C        IERR = 4  IF Y .LT. 0 OR Y .GT. 1
30676C        IERR = 5  IF X + Y .NE. 1
30677C        IERR = 6  IF X = A = 0
30678C        IERR = 7  IF Y = B = 0
30679C
30680C--------------------
30681C     WRITTEN BY ALFRED H. MORRIS, JR.
30682C        NAVAL SURFACE WARFARE CENTER
30683C        DAHLGREN, VIRGINIA
30684C     REVISED ... NOV 1991
30685C-----------------------------------------------------------------------
30686C     .. Scalar Arguments ..
30687      DOUBLE PRECISION a,b,w,w1,x,y
30688      INTEGER ierr
30689C     ..
30690C     .. Local Scalars ..
30691      DOUBLE PRECISION a0,b0,eps,lambda,t,x0,y0,z
30692      INTEGER ierr1,ind,n
30693C     ..
30694C     .. External Functions ..
30695      DOUBLE PRECISION apser,basym,bfrac,bpser,bup,fpser,spmpar
30696      EXTERNAL apser,basym,bfrac,bpser,bup,fpser,spmpar
30697C     ..
30698C     .. External Subroutines ..
30699      EXTERNAL bgrat
30700C     ..
30701C     .. Intrinsic Functions ..
30702      INTRINSIC abs,dmax1,dmin1
30703C     ..
30704C     .. Executable Statements ..
30705C-----------------------------------------------------------------------
30706C
30707C     ****** EPS IS A MACHINE DEPENDENT CONSTANT. EPS IS THE SMALLEST
30708C            FLOATING POINT NUMBER FOR WHICH 1.0 + EPS .GT. 1.0
30709C
30710      eps = spmpar(1)
30711C
30712C-----------------------------------------------------------------------
30713      w = 0.0D0
30714      w1 = 0.0D0
30715      IF (a.LT.0.0D0 .OR. b.LT.0.0D0) GO TO 270
30716      IF (a.EQ.0.0D0 .AND. b.EQ.0.0D0) GO TO 280
30717      IF (x.LT.0.0D0 .OR. x.GT.1.0D0) GO TO 290
30718      IF (y.LT.0.0D0 .OR. y.GT.1.0D0) GO TO 300
30719      z = ((x+y)-0.5D0) - 0.5D0
30720      IF (abs(z).GT.3.0D0*eps) GO TO 310
30721C
30722      ierr = 0
30723      IF (x.EQ.0.0D0) GO TO 210
30724      IF (y.EQ.0.0D0) GO TO 230
30725      IF (a.EQ.0.0D0) GO TO 240
30726      IF (b.EQ.0.0D0) GO TO 220
30727C
30728      eps = dmax1(eps,1.D-15)
30729      IF (dmax1(a,b).LT.1.D-3*eps) GO TO 260
30730C
30731      ind = 0
30732      a0 = a
30733      b0 = b
30734      x0 = x
30735      y0 = y
30736      IF (dmin1(a0,b0).GT.1.0D0) GO TO 40
30737C
30738C             PROCEDURE FOR A0 .LE. 1 OR B0 .LE. 1
30739C
30740      IF (x.LE.0.5D0) GO TO 10
30741      ind = 1
30742      a0 = b
30743      b0 = a
30744      x0 = y
30745      y0 = x
30746C
30747   10 IF (b0.LT.dmin1(eps,eps*a0)) GO TO 90
30748      IF (a0.LT.dmin1(eps,eps*b0) .AND. b0*x0.LE.1.0D0) GO TO 100
30749      IF (dmax1(a0,b0).GT.1.0D0) GO TO 20
30750      IF (a0.GE.dmin1(0.2D0,b0)) GO TO 110
30751      IF (x0**a0.LE.0.9D0) GO TO 110
30752      IF (x0.GE.0.3D0) GO TO 120
30753      n = 20
30754      GO TO 140
30755C
30756   20 IF (b0.LE.1.0D0) GO TO 110
30757      IF (x0.GE.0.3D0) GO TO 120
30758      IF (x0.GE.0.1D0) GO TO 30
30759      IF ((x0*b0)**a0.LE.0.7D0) GO TO 110
30760   30 IF (b0.GT.15.0D0) GO TO 150
30761      n = 20
30762      GO TO 140
30763C
30764C             PROCEDURE FOR A0 .GT. 1 AND B0 .GT. 1
30765C
30766   40 IF (a.GT.b) GO TO 50
30767      lambda = a - (a+b)*x
30768      GO TO 60
30769
30770   50 lambda = (a+b)*y - b
30771   60 IF (lambda.GE.0.0D0) GO TO 70
30772      ind = 1
30773      a0 = b
30774      b0 = a
30775      x0 = y
30776      y0 = x
30777      lambda = abs(lambda)
30778C
30779   70 IF (b0.LT.40.0D0 .AND. b0*x0.LE.0.7D0) GO TO 110
30780      IF (b0.LT.40.0D0) GO TO 160
30781      IF (a0.GT.b0) GO TO 80
30782      IF (a0.LE.100.0D0) GO TO 130
30783      IF (lambda.GT.0.03D0*a0) GO TO 130
30784      GO TO 200
30785
30786   80 IF (b0.LE.100.0D0) GO TO 130
30787      IF (lambda.GT.0.03D0*b0) GO TO 130
30788      GO TO 200
30789C
30790C            EVALUATION OF THE APPROPRIATE ALGORITHM
30791C
30792   90 w = fpser(a0,b0,x0,eps)
30793      w1 = 0.5D0 + (0.5D0-w)
30794      GO TO 250
30795C
30796  100 w1 = apser(a0,b0,x0,eps)
30797      w = 0.5D0 + (0.5D0-w1)
30798      GO TO 250
30799C
30800  110 w = bpser(a0,b0,x0,eps)
30801      w1 = 0.5D0 + (0.5D0-w)
30802      GO TO 250
30803C
30804  120 w1 = bpser(b0,a0,y0,eps)
30805      w = 0.5D0 + (0.5D0-w1)
30806      GO TO 250
30807C
30808  130 w = bfrac(a0,b0,x0,y0,lambda,15.0D0*eps)
30809      w1 = 0.5D0 + (0.5D0-w)
30810      GO TO 250
30811C
30812  140 w1 = bup(b0,a0,y0,x0,n,eps)
30813      b0 = b0 + n
30814  150 CALL bgrat(b0,a0,y0,x0,w1,15.0D0*eps,ierr1)
30815      w = 0.5D0 + (0.5D0-w1)
30816      GO TO 250
30817C
30818  160 n = int(b0)
30819      b0 = b0 - real(n)
30820      IF (b0.NE.0.0D0) GO TO 170
30821      n = n - 1
30822      b0 = 1.0D0
30823  170 w = bup(b0,a0,y0,x0,n,eps)
30824      IF (x0.GT.0.7D0) GO TO 180
30825      w = w + bpser(a0,b0,x0,eps)
30826      w1 = 0.5D0 + (0.5D0-w)
30827      GO TO 250
30828C
30829  180 IF (a0.GT.15.0D0) GO TO 190
30830      n = 20
30831      w = w + bup(a0,b0,x0,y0,n,eps)
30832      a0 = a0 + n
30833  190 CALL bgrat(a0,b0,x0,y0,w,15.0D0*eps,ierr1)
30834      w1 = 0.5D0 + (0.5D0-w)
30835      GO TO 250
30836C
30837  200 w = basym(a0,b0,lambda,100.0D0*eps)
30838      w1 = 0.5D0 + (0.5D0-w)
30839      GO TO 250
30840C
30841C               TERMINATION OF THE PROCEDURE
30842C
30843  210 IF (a.EQ.0.0D0) GO TO 320
30844  220 w = 0.0D0
30845      w1 = 1.0D0
30846      RETURN
30847C
30848  230 IF (b.EQ.0.0D0) GO TO 330
30849  240 w = 1.0D0
30850      w1 = 0.0D0
30851      RETURN
30852C
30853  250 IF (ind.EQ.0) RETURN
30854      t = w
30855      w = w1
30856      w1 = t
30857      RETURN
30858C
30859C           PROCEDURE FOR A AND B .LT. 1.E-3*EPS
30860C
30861  260 w = b/ (a+b)
30862      w1 = a/ (a+b)
30863      RETURN
30864C
30865C                       ERROR RETURN
30866C
30867  270 ierr = 1
30868      RETURN
30869
30870  280 ierr = 2
30871      RETURN
30872
30873  290 ierr = 3
30874      RETURN
30875
30876  300 ierr = 4
30877      RETURN
30878
30879  310 ierr = 5
30880      RETURN
30881
30882  320 ierr = 6
30883      RETURN
30884
30885  330 ierr = 7
30886      RETURN
30887
30888      END
30889      DOUBLE PRECISION FUNCTION brcmp1(mu,a,b,x,y)
30890C-----------------------------------------------------------------------
30891C          EVALUATION OF  EXP(MU) * (X**A*Y**B/BETA(A,B))
30892C-----------------------------------------------------------------------
30893C     .. Scalar Arguments ..
30894      DOUBLE PRECISION a,b,x,y
30895      INTEGER mu
30896C     ..
30897C     .. Local Scalars ..
30898      DOUBLE PRECISION a0,apb,b0,c,const,e,h,lambda,lnx,lny,t,u,v,x0,y0,
30899     +                 z
30900      INTEGER i,n
30901C     ..
30902C     .. External Functions ..
30903      DOUBLE PRECISION algdiv,alnrel,bcorr,betaln,esum,gam1,gamln1,rlog1
30904      EXTERNAL algdiv,alnrel,bcorr,betaln,esum,gam1,gamln1,rlog1
30905C     ..
30906C     .. Intrinsic Functions ..
30907      INTRINSIC abs,dble,dlog,dmax1,dmin1,exp,sqrt
30908C     ..
30909C     .. Data statements ..
30910C-----------------
30911C     CONST = 1/SQRT(2*PI)
30912C-----------------
30913      DATA const/.398942280401433D0/
30914C     ..
30915C     .. Executable Statements ..
30916C
30917      a0 = dmin1(a,b)
30918      IF (a0.GE.8.0D0) GO TO 130
30919C
30920      IF (x.GT.0.375D0) GO TO 10
30921      lnx = dlog(x)
30922      lny = alnrel(-x)
30923      GO TO 30
30924
30925   10 IF (y.GT.0.375D0) GO TO 20
30926      lnx = alnrel(-y)
30927      lny = dlog(y)
30928      GO TO 30
30929
30930   20 lnx = dlog(x)
30931      lny = dlog(y)
30932C
30933   30 z = a*lnx + b*lny
30934      IF (a0.LT.1.0D0) GO TO 40
30935      z = z - betaln(a,b)
30936      brcmp1 = esum(mu,z)
30937      RETURN
30938C-----------------------------------------------------------------------
30939C              PROCEDURE FOR A .LT. 1 OR B .LT. 1
30940C-----------------------------------------------------------------------
30941   40 b0 = dmax1(a,b)
30942      IF (b0.GE.8.0D0) GO TO 120
30943      IF (b0.GT.1.0D0) GO TO 70
30944C
30945C                   ALGORITHM FOR B0 .LE. 1
30946C
30947      brcmp1 = esum(mu,z)
30948      IF (brcmp1.EQ.0.0D0) RETURN
30949C
30950      apb = a + b
30951      IF (apb.GT.1.0D0) GO TO 50
30952      z = 1.0D0 + gam1(apb)
30953      GO TO 60
30954
30955   50 u = dble(a) + dble(b) - 1.D0
30956      z = (1.0D0+gam1(u))/apb
30957C
30958   60 c = (1.0D0+gam1(a))* (1.0D0+gam1(b))/z
30959      brcmp1 = brcmp1* (a0*c)/ (1.0D0+a0/b0)
30960      RETURN
30961C
30962C                ALGORITHM FOR 1 .LT. B0 .LT. 8
30963C
30964   70 u = gamln1(a0)
30965      n = int(b0 - 1.0D0)
30966      IF (n.LT.1) GO TO 90
30967      c = 1.0D0
30968      DO 80 i = 1,n
30969          b0 = b0 - 1.0D0
30970          c = c* (b0/ (a0+b0))
30971   80 CONTINUE
30972      u = dlog(c) + u
30973C
30974   90 z = z - u
30975      b0 = b0 - 1.0D0
30976      apb = a0 + b0
30977      IF (apb.GT.1.0D0) GO TO 100
30978      t = 1.0D0 + gam1(apb)
30979      GO TO 110
30980
30981  100 u = dble(a0) + dble(b0) - 1.D0
30982      t = (1.0D0+gam1(u))/apb
30983  110 brcmp1 = a0*esum(mu,z)* (1.0D0+gam1(b0))/t
30984      RETURN
30985C
30986C                   ALGORITHM FOR B0 .GE. 8
30987C
30988  120 u = gamln1(a0) + algdiv(a0,b0)
30989      brcmp1 = a0*esum(mu,z-u)
30990      RETURN
30991C-----------------------------------------------------------------------
30992C              PROCEDURE FOR A .GE. 8 AND B .GE. 8
30993C-----------------------------------------------------------------------
30994  130 IF (a.GT.b) GO TO 140
30995      h = a/b
30996      x0 = h/ (1.0D0+h)
30997      y0 = 1.0D0/ (1.0D0+h)
30998      lambda = a - (a+b)*x
30999      GO TO 150
31000
31001  140 h = b/a
31002      x0 = 1.0D0/ (1.0D0+h)
31003      y0 = h/ (1.0D0+h)
31004      lambda = (a+b)*y - b
31005C
31006  150 e = -lambda/a
31007      IF (abs(e).GT.0.6D0) GO TO 160
31008      u = rlog1(e)
31009      GO TO 170
31010
31011  160 u = e - dlog(x/x0)
31012C
31013  170 e = lambda/b
31014      IF (abs(e).GT.0.6D0) GO TO 180
31015      v = rlog1(e)
31016      GO TO 190
31017
31018  180 v = e - dlog(y/y0)
31019C
31020  190 z = esum(mu,- (a*u+b*v))
31021      brcmp1 = const*sqrt(b*x0)*z*exp(-bcorr(a,b))
31022      RETURN
31023
31024      END
31025      DOUBLE PRECISION FUNCTION brcomp(a,b,x,y)
31026C-----------------------------------------------------------------------
31027C               EVALUATION OF X**A*Y**B/BETA(A,B)
31028C-----------------------------------------------------------------------
31029C     .. Scalar Arguments ..
31030      DOUBLE PRECISION a,b,x,y
31031C     ..
31032C     .. Local Scalars ..
31033      DOUBLE PRECISION a0,apb,b0,c,const,e,h,lambda,lnx,lny,t,u,v,x0,y0,
31034     +                 z
31035      INTEGER i,n
31036C     ..
31037C     .. External Functions ..
31038      DOUBLE PRECISION algdiv,alnrel,bcorr,betaln,gam1,gamln1,rlog1
31039      EXTERNAL algdiv,alnrel,bcorr,betaln,gam1,gamln1,rlog1
31040C     ..
31041C     .. Intrinsic Functions ..
31042      INTRINSIC abs,dble,dlog,dmax1,dmin1,exp,sqrt
31043C     ..
31044C     .. Data statements ..
31045C-----------------
31046C     CONST = 1/SQRT(2*PI)
31047C-----------------
31048      DATA const/.398942280401433D0/
31049C     ..
31050C     .. Executable Statements ..
31051C
31052      brcomp = 0.0D0
31053      IF (x.EQ.0.0D0 .OR. y.EQ.0.0D0) RETURN
31054      a0 = dmin1(a,b)
31055      IF (a0.GE.8.0D0) GO TO 130
31056C
31057      IF (x.GT.0.375D0) GO TO 10
31058      lnx = dlog(x)
31059      lny = alnrel(-x)
31060      GO TO 30
31061
31062   10 IF (y.GT.0.375D0) GO TO 20
31063      lnx = alnrel(-y)
31064      lny = dlog(y)
31065      GO TO 30
31066
31067   20 lnx = dlog(x)
31068      lny = dlog(y)
31069C
31070   30 z = a*lnx + b*lny
31071      IF (a0.LT.1.0D0) GO TO 40
31072      z = z - betaln(a,b)
31073      brcomp = exp(z)
31074      RETURN
31075C-----------------------------------------------------------------------
31076C              PROCEDURE FOR A .LT. 1 OR B .LT. 1
31077C-----------------------------------------------------------------------
31078   40 b0 = dmax1(a,b)
31079      IF (b0.GE.8.0D0) GO TO 120
31080      IF (b0.GT.1.0D0) GO TO 70
31081C
31082C                   ALGORITHM FOR B0 .LE. 1
31083C
31084      brcomp = exp(z)
31085      IF (brcomp.EQ.0.0D0) RETURN
31086C
31087      apb = a + b
31088      IF (apb.GT.1.0D0) GO TO 50
31089      z = 1.0D0 + gam1(apb)
31090      GO TO 60
31091
31092   50 u = dble(a) + dble(b) - 1.D0
31093      z = (1.0D0+gam1(u))/apb
31094C
31095   60 c = (1.0D0+gam1(a))* (1.0D0+gam1(b))/z
31096      brcomp = brcomp* (a0*c)/ (1.0D0+a0/b0)
31097      RETURN
31098C
31099C                ALGORITHM FOR 1 .LT. B0 .LT. 8
31100C
31101   70 u = gamln1(a0)
31102      n = int(b0 - 1.0D0)
31103      IF (n.LT.1) GO TO 90
31104      c = 1.0D0
31105      DO 80 i = 1,n
31106          b0 = b0 - 1.0D0
31107          c = c* (b0/ (a0+b0))
31108   80 CONTINUE
31109      u = dlog(c) + u
31110C
31111   90 z = z - u
31112      b0 = b0 - 1.0D0
31113      apb = a0 + b0
31114      IF (apb.GT.1.0D0) GO TO 100
31115      t = 1.0D0 + gam1(apb)
31116      GO TO 110
31117
31118  100 u = dble(a0) + dble(b0) - 1.D0
31119      t = (1.0D0+gam1(u))/apb
31120  110 brcomp = a0*exp(z)* (1.0D0+gam1(b0))/t
31121      RETURN
31122C
31123C                   ALGORITHM FOR B0 .GE. 8
31124C
31125  120 u = gamln1(a0) + algdiv(a0,b0)
31126      brcomp = a0*exp(z-u)
31127      RETURN
31128C-----------------------------------------------------------------------
31129C              PROCEDURE FOR A .GE. 8 AND B .GE. 8
31130C-----------------------------------------------------------------------
31131  130 IF (a.GT.b) GO TO 140
31132      h = a/b
31133      x0 = h/ (1.0D0+h)
31134      y0 = 1.0D0/ (1.0D0+h)
31135      lambda = a - (a+b)*x
31136      GO TO 150
31137
31138  140 h = b/a
31139      x0 = 1.0D0/ (1.0D0+h)
31140      y0 = h/ (1.0D0+h)
31141      lambda = (a+b)*y - b
31142C
31143  150 e = -lambda/a
31144      IF (abs(e).GT.0.6D0) GO TO 160
31145      u = rlog1(e)
31146      GO TO 170
31147
31148  160 u = e - dlog(x/x0)
31149C
31150  170 e = lambda/b
31151      IF (abs(e).GT.0.6D0) GO TO 180
31152      v = rlog1(e)
31153      GO TO 190
31154
31155  180 v = e - dlog(y/y0)
31156C
31157  190 z = exp(- (a*u+b*v))
31158      brcomp = const*sqrt(b*x0)*z*exp(-bcorr(a,b))
31159      RETURN
31160
31161      END
31162      SUBROUTINE BSINIT(NDIM, W, LENRUL, G)
31163*
31164*     For initializing basic rule weights and symmetric sum parameters.
31165*
31166      INTEGER NDIM, LENRUL, RULPTS(6), I, J, NUMNUL, SDIM
31167      PARAMETER ( NUMNUL = 4, SDIM = 12 )
31168      DOUBLE PRECISION W(LENRUL,4), G(NDIM,LENRUL)
31169      DOUBLE PRECISION LAM1, LAM2, LAM3, LAMP, RULCON
31170*
31171*     The following code determines rule parameters and weights for a
31172*      degree 7 rule (W(1,1),...,W(5,1)), two degree 5 comparison rules
31173*      (W(1,2),...,W(5,2) and W(1,3),...,W(5,3)) and a degree 3
31174*      comparison rule (W(1,4),...W(5,4)).
31175*
31176*       If NDIM = 1, then LENRUL = 5 and total points = 9.
31177*       If NDIM < SDIM, then LENRUL = 6 and
31178*                      total points = 1+2*NDIM*(NDIM+2)+2**NDIM.
31179*       If NDIM > = SDIM, then LENRUL = 6 and
31180*                      total points = 1+2*NDIM*(1+2*NDIM).
31181*
31182      DO 100 I = 1,LENRUL
31183         DO 200 J = 1,NDIM
31184            G(J,I) = 0
31185  200    CONTINUE
31186         DO 300 J = 1,NUMNUL
31187            W(I,J) = 0
31188  300    CONTINUE
31189  100 CONTINUE
31190      RULPTS(5) = 2*NDIM*(NDIM-1)
31191      RULPTS(4) = 2*NDIM
31192      RULPTS(3) = 2*NDIM
31193      RULPTS(2) = 2*NDIM
31194      RULPTS(1) = 1
31195      LAMP = 0.85
31196      LAM3 = 0.4707
31197      LAM2 = 4/(15 - 5/LAM3)
31198      W(5,1) = ( 3 - 5*LAM3 )/( 180*(LAM2-LAM3)*LAM2**2 )
31199      IF ( NDIM .LT. SDIM ) THEN
31200         LAM1 = 8*LAM3*(31*LAM3-15)/( (3*LAM3-1)*(5*LAM3-3)*35 )
31201         W(LENRUL,1) = 1/(3*LAM3)**3/2**NDIM
31202      ELSE
31203         LAM1 = ( LAM3*(15 - 21*LAM2) + 35*(NDIM-1)*(LAM2-LAM3)/9 )
31204     &       /  ( LAM3*(21 - 35*LAM2) + 35*(NDIM-1)*(LAM2/LAM3-1)/9 )
31205         W(6,1) = 1/(4*(3*LAM3)**3)
31206      ENDIF
31207      W(3,1) = ( 15 - 21*(LAM3+LAM1) + 35*LAM3*LAM1 )
31208     &     /( 210*LAM2*(LAM2-LAM3)*(LAM2-LAM1) ) - 2*(NDIM-1)*W(5,1)
31209      W(2,1) = ( 15 - 21*(LAM3+LAM2) + 35*LAM3*LAM2 )
31210     &     /( 210*LAM1*(LAM1-LAM3)*(LAM1-LAM2) )
31211      IF ( NDIM .LT. SDIM ) THEN
31212         RULPTS(LENRUL) = 2**NDIM
31213         LAM3 = SQRT(LAM3)
31214         DO 400 I = 1,NDIM
31215            G(I,LENRUL) = LAM3
31216  400    CONTINUE
31217      ELSE
31218         W(6,1) = 1/(4*(3*LAM3)**3)
31219         RULPTS(6) = 2*NDIM*(NDIM-1)
31220         LAM3 = SQRT(LAM3)
31221         DO 500 I = 1,2
31222            G(I,6) = LAM3
31223  500    CONTINUE
31224      ENDIF
31225      IF ( NDIM .GT. 1 ) THEN
31226         W(5,2) = 1/(6*LAM2)**2
31227         W(5,3) = 1/(6*LAM2)**2
31228      ENDIF
31229      W(3,2) = ( 3 - 5*LAM1 )/( 30*LAM2*(LAM2-LAM1) )
31230     &     - 2*(NDIM-1)*W(5,2)
31231      W(2,2) = ( 3 - 5*LAM2 )/( 30*LAM1*(LAM1-LAM2) )
31232      W(4,3) = ( 3 - 5*LAM2 )/( 30*LAMP*(LAMP-LAM2) )
31233      W(3,3) = ( 3 - 5*LAMP )/( 30*LAM2*(LAM2-LAMP) )
31234     &     - 2*(NDIM-1)*W(5,3)
31235      W(2,4) = 1/(6*LAM1)
31236      LAMP = SQRT(LAMP)
31237      LAM2 = SQRT(LAM2)
31238      LAM1 = SQRT(LAM1)
31239      G(1,2) = LAM1
31240      G(1,3) = LAM2
31241      G(1,4) = LAMP
31242      IF ( NDIM .GT. 1 ) THEN
31243         G(1,5) = LAM2
31244         G(2,5) = LAM2
31245      ENDIF
31246      DO 600 J = 1, NUMNUL
31247         W(1,J) = 1
31248         DO 700 I = 2,LENRUL
31249            W(1,J) = W(1,J) - RULPTS(I)*W(I,J)
31250  700    CONTINUE
31251  600 CONTINUE
31252      RULCON = 2
31253      CALL RULNRM( LENRUL, NUMNUL, RULPTS, W, RULCON )
31254C
31255      RETURN
31256      END
31257      SUBROUTINE BSPVN(T,JHIGH,K,INDEX,X,ILEFT,VNIKX,WORK,IWORK)
31258C***BEGIN PROLOGUE  BSPVN
31259C***DATE WRITTEN   800901   (YYMMDD)
31260C***REVISION DATE  820801   (YYMMDD)
31261C***CATEGORY NO.  E3,K6
31262C***KEYWORDS  B-SPLINE,DATA FITTING,INTERPOLATION,SPLINE
31263C***AUTHOR  AMOS, D. E., (SNLA)
31264C***PURPOSE  Calculates the value of all (possibly) nonzero basis
31265C            functions at X.
31266C***DESCRIPTION
31267C
31268C     Written by Carl de Boor and modified by D. E. Amos
31269C
31270C     Reference
31271C         SIAM J. Numerical Analysis, 14, No. 3, June, 1977, pp.441-472.
31272C
31273C     Abstract
31274C         BSPVN is the BSPLVN routine of the reference.
31275C
31276C         BSPVN calculates the value of all (possibly) nonzero basis
31277C         functions at X of order MAX(JHIGH,(J+1)*(INDEX-1)), where
31278C         T(K) .LE. X .LE. T(N+1) and J=IWORK is set inside the routine
31279C         on the first call when INDEX=1.  ILEFT is such that T(ILEFT)
31280C         .LE. X .LT. T(ILEFT+1).  A call to INTRV(T,N+1,X,ILO,ILEFT,
31281C         MFLAG) produces the proper ILEFT.  BSPVN calculates using the
31282C         basic algorithm needed in BSPVD.  If only basis functions are
31283C         desired, setting JHIGH=K and INDEX=1 can be faster than
31284C         calling BSPVD, but extra coding is required for derivatives
31285C         (INDEX=2) and BSPVD is set up for this purpose.
31286C
31287C         Left limiting values are set up as described in BSPVD.
31288C
31289C     Description of Arguments
31290C         Input
31291C          T       - knot vector of length N+K, where
31292C                    N = number of B-spline basis functions
31293C                    N = sum of knot multiplicities-K
31294C          JHIGH   - order of B-spline, 1 .LE. JHIGH .LE. K
31295C          K       - highest possible order
31296C          INDEX   - INDEX = 1 gives basis functions of order JHIGH
31297C                          = 2 denotes previous entry with WORK, IWORK
31298C                              values saved for subsequent calls to
31299C                              BSPVN.
31300C          X       - argument of basis functions,
31301C                    T(K) .LE. X .LE. T(N+1)
31302C          ILEFT   - largest integer such that
31303C                    T(ILEFT) .LE. X .LT. T(ILEFT+1)
31304C
31305C         Output
31306C          VNIKX   - vector of length K for spline values.
31307C          WORK    - a work vector of length 2*K
31308C          IWORK   - a work parameter.  Both WORK and IWORK contain
31309C                    information necessary to continue for INDEX = 2.
31310C                    When INDEX = 1 exclusively, these are scratch
31311C                    variables and can be used for other purposes.
31312C
31313C     Error Conditions
31314C         Improper input is a fatal error.
31315C***REFERENCES  C. DE BOOR, *PACKAGE FOR CALCULATING WITH B-SPLINES*,
31316C                 SIAM JOURNAL ON NUMERICAL ANALYSIS, VOLUME 14, NO. 3,
31317C                 JUNE 1977, PP. 441-472.
31318C***ROUTINES CALLED  XERROR
31319C***END PROLOGUE  BSPVN
31320C
31321C
31322      INTEGER ILEFT, IMJP1, INDEX, IPJ, IWORK, JHIGH, JP1, JP1ML, K, L
31323      REAL T, VM, VMPREV, VNIKX, WORK, X
31324C     DIMENSION T(ILEFT+JHIGH)
31325      DIMENSION T(*), VNIKX(K), WORK(*)
31326C     CONTENT OF J, DELTAM, DELTAP IS EXPECTED UNCHANGED BETWEEN CALLS.
31327C     WORK(I) = DELTAP(I), WORK(K+I) = DELTAM(I), I = 1,K
31328C
31329C---------------------------------------------------------------------
31330C
31331      INCLUDE 'DPCOP2.INC'
31332C
31333C***FIRST EXECUTABLE STATEMENT  BSPVN
31334      IF(K.LT.1) GO TO 90
31335      IF(JHIGH.GT.K .OR. JHIGH.LT.1) GO TO 100
31336      IF(INDEX.LT.1 .OR. INDEX.GT.2) GO TO 105
31337      IF(X.LT.T(ILEFT) .OR. X.GT.T(ILEFT+1)) GO TO 110
31338      GO TO (10, 20), INDEX
31339   10 IWORK = 1
31340      VNIKX(1) = 1.0E0
31341      IF (IWORK.GE.JHIGH) GO TO 40
31342C
31343   20 IPJ = ILEFT + IWORK
31344      WORK(IWORK) = T(IPJ) - X
31345      IMJP1 = ILEFT - IWORK + 1
31346      WORK(K+IWORK) = X - T(IMJP1)
31347      VMPREV = 0.0E0
31348      JP1 = IWORK + 1
31349      DO 30 L=1,IWORK
31350        JP1ML = JP1 - L
31351        VM = VNIKX(L)/(WORK(L)+WORK(K+JP1ML))
31352        VNIKX(L) = VM*WORK(L) + VMPREV
31353        VMPREV = VM*WORK(K+JP1ML)
31354   30 CONTINUE
31355      VNIKX(JP1) = VMPREV
31356      IWORK = JP1
31357      IF (IWORK.LT.JHIGH) GO TO 20
31358C
31359   40 RETURN
31360C
31361C
31362   90 CONTINUE
31363      WRITE(ICOUT,999)
31364  999 FORMAT(1X)
31365      CALL DPWRST('XXX','BUG ')
31366      WRITE(ICOUT,91)
31367      CALL DPWRST('XXX','BUG ')
31368   91 FORMAT('***** FROM BSPVN,  K DOES NOT SATISFY K.GE.1 *****')
31369      RETURN
31370  100 CONTINUE
31371      WRITE(ICOUT,999)
31372      CALL DPWRST('XXX','BUG ')
31373      WRITE(ICOUT,101)
31374      CALL DPWRST('XXX','BUG ')
31375      WRITE(ICOUT,102)
31376      CALL DPWRST('XXX','BUG ')
31377  101 FORMAT('***** FROM BSPVN,  JHIGH DOES NOT SATISFY ')
31378  102 FORMAT('      1.LE.JHIGH.LE.K                     ******')
31379      RETURN
31380  105 CONTINUE
31381      WRITE(ICOUT,999)
31382      CALL DPWRST('XXX','BUG ')
31383      WRITE(ICOUT,106)
31384      CALL DPWRST('XXX','BUG ')
31385  106 FORMAT('***** FROM BSPVN, INDEX IS NOT 1 OR 2 *****')
31386      RETURN
31387  110 CONTINUE
31388      WRITE(ICOUT,999)
31389      CALL DPWRST('XXX','BUG ')
31390      WRITE(ICOUT,111)
31391      CALL DPWRST('XXX','BUG ')
31392      WRITE(ICOUT,112)
31393      CALL DPWRST('XXX','BUG ')
31394  111 FORMAT('***** FROM BSPVN,  X DOES NOT SATISFY ')
31395  112 FORMAT('      T(ILEFT).LE.X.LE.T(ILEFT+1)     *****')
31396      RETURN
31397      END
31398      SUBROUTINE BTACDF(X,LAMBDA,K,CDF)
31399C
31400C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
31401C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
31402C              FOR THE BOREL-TANNER DISTRIBUTION
31403C              WITH SINGLE PRECISION SHAPE PARAMETERS LAMBDA AND K.
31404C              THIS DISTRIBUTION IS DEFINED FOR ALL
31405C              POSITIVE INTEGER X >= K.
31406C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
31407C              p(X;LAMBDA,K) = K*EXP(-LAMBDA*X)*(LAMBDA*X)**(X-K)/
31408C                              (X*(X-K)!),   X >= K, 0 < LAMBDA < 1.
31409C              THE CUMULATIVE DISTRIBUTION IS COMPUTED BY DIRECT
31410C              SUMMATION OF THE PDF FUNCTION.
31411C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
31412C                                AT WHICH THE CUMULATIVE DISTRIBUTION
31413C                                FUNCTION IS TO BE EVALUATED.
31414C                                X SHOULD BE A NON-NEGATIVE INTEGR
31415C                     --LAMBDA = THE SINGLE PRECISION VALUE
31416C                                OF THE FIRST SHAPE PARAMETER.
31417C                     --K      = THE SINGLE PRECISION VALUE
31418C                                OF THE SECOND SHAPE PARAMETER.
31419C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PROBABILITY
31420C
31421C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
31422C             FUNCTION VALUE CDF
31423C             FOR THE BOREL-TANNER DISTRIBUTION
31424C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
31425C     RESTRICTIONS--X SHOULD BE A POSITIVE INTEGER
31426C                 --0 < LAMBDA < 1,  AND K SHOULD BE  A POSITIVE
31427C                   INTEGER
31428C     OTHER DATAPAC   SUBROUTINES NEEDED--LNGAMM.
31429C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP, DLOG
31430C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
31431C     LANGUAGE--ANSI FORTRAN (1977)
31432C     REFERENCES--JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
31433C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
31434C                 WILEY, PP. 394-396.
31435C               --LUC DEVROYE, "THE BRANCHING PROCESS METHOD IN
31436C                 LAGRANGE RANDOM VARIATE GENERATION",
31437C                 FROM DEVROYES'S WEB SITE.
31438C     WRITTEN BY--JAMES J. FILLIBEN
31439C                 STATISTICAL ENGINEERING DIVISION
31440C                 INFORMATION TECHNOLOGY LABORATORY
31441C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
31442C                 GAITHERSBURG, MD 20899-8980
31443C                 PHONE--301-975-2855
31444C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
31445C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
31446C     LANGUAGE--ANSI FORTRAN (1977)
31447C     VERSION NUMBER--2006/5
31448C     ORIGINAL VERSION--MAY       2006.
31449C
31450C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
31451C
31452C---------------------------------------------------------------------
31453C
31454      REAL K
31455      REAL LAMBDA
31456C
31457      DOUBLE PRECISION DX
31458      DOUBLE PRECISION DLAMB
31459      DOUBLE PRECISION DK
31460      DOUBLE PRECISION DCDF
31461      DOUBLE PRECISION DPDF
31462      DOUBLE PRECISION DTERM1
31463      DOUBLE PRECISION DTERM2
31464      DOUBLE PRECISION DLNGAM
31465C
31466C---------------------------------------------------------------------
31467C
31468      INCLUDE 'DPCOP2.INC'
31469C
31470C-----START POINT-----------------------------------------------------
31471C
31472      CDF=0.0
31473      IK=INT(K+0.5)
31474      INTX=INT(X+0.5)
31475C
31476C     CHECK THE INPUT ARGUMENTS FOR ERRORS
31477C
31478      IF(LAMBDA.LE.0.0 .OR. LAMBDA.GE.1.0)THEN
31479        WRITE(ICOUT,11)
31480   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BTACDF ',
31481     1         'IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
31482        CALL DPWRST('XXX','BUG ')
31483        WRITE(ICOUT,46)LAMBDA
31484   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
31485        CALL DPWRST('XXX','BUG ')
31486        GOTO9999
31487      ELSEIF(IK.LT.1)THEN
31488        WRITE(ICOUT,12)
31489   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BTACDF ',
31490     1         'IS NON-POSITIVE.')
31491        CALL DPWRST('XXX','BUG ')
31492        WRITE(ICOUT,47)IK
31493   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
31494        CALL DPWRST('XXX','BUG ')
31495        GOTO9999
31496      ELSEIF(INTX.LT.IK)THEN
31497        WRITE(ICOUT,5)IK
31498    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BTACDF ',
31499     1         'IS LESS THAN THE THIRD ARGUMENT (= ',I8,').')
31500        CALL DPWRST('XXX','BUG ')
31501        WRITE(ICOUT,46)X
31502        CALL DPWRST('XXX','BUG ')
31503        GOTO9999
31504      ENDIF
31505C
31506      DLAMB=DBLE(LAMBDA)
31507      DK=DBLE(IK)
31508      DCDF=0.0D0
31509C
31510      DO100I=INTX,IK,-1
31511        DX=DBLE(I)
31512        DTERM1=DLOG(DK) + (-DLAMB*DX) + (DX-DK)*DLOG(DLAMB*DX)
31513        DTERM2=DLOG(DX) + DLNGAM(DX-DK+1.0D0)
31514        DPDF=DEXP(DTERM1 - DTERM2)
31515        DCDF=DCDF + DPDF
31516  100 CONTINUE
31517C
31518      CDF=REAL(DCDF)
31519C
31520 9999 CONTINUE
31521      RETURN
31522      END
31523      SUBROUTINE BTAPDF(X,LAMBDA,K,PDF)
31524C
31525C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
31526C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE X
31527C              FOR THE BOREL-TANNER DISTRIBUTION
31528C              WITH SINGLE PRECISION SHAPE PARAMETERS LAMBDA AND K.
31529C              THIS DISTRIBUTION IS DEFINED FOR ALL
31530C              POSITIVE INTEGER X >= K.
31531C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
31532C              p(X;LAMBDA,K) = K*EXP(-LAMBDA*X)*(LAMBDA*X)**(X-K)/
31533C                              (X*(X-K)!),   X >= K, 0 < LAMBDA < 1.
31534C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE
31535C                                AT WHICH THE PROBABILITY DENSITY
31536C                                FUNCTION IS TO BE EVALUATED.
31537C                                X SHOULD BE A NON-NEGATIVE INTEGR
31538C                     --LAMBDA = THE SINGLE PRECISION VALUE
31539C                                OF THE FIRST SHAPE PARAMETER.
31540C                     --K      = THE SINGLE PRECISION VALUE
31541C                                OF THE SECOND SHAPE PARAMETER.
31542C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION PROBABILITY
31543C
31544C     OUTPUT--THE SINGLE PRECISION PROBABILITY DENSITY
31545C             FUNCTION VALUE PDF
31546C             FOR THE BOREL-TANNER DISTRIBUTION
31547C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
31548C     RESTRICTIONS--X SHOULD BE A POSITIVE INTEGER
31549C                 --0 < LAMBDA < 1,  AND K SHOULD BE  A POSITIVE
31550C                   INTEGER
31551C     OTHER DATAPAC   SUBROUTINES NEEDED--LNGAMM.
31552C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP, DLOG
31553C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
31554C     LANGUAGE--ANSI FORTRAN (1977)
31555C     REFERENCES--JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
31556C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
31557C                 WILEY, PP. 394-396.
31558C               --LUC DEVROYE, "THE BRANCHING PROCESS METHOD IN
31559C                 LAGRANGE RANDOM VARIATE GENERATION",
31560C                 FROM DEVROYES'S WEB SITE.
31561C               --HAIGHT AND BREUER (1960), "THE BOREL-TANNER
31562C                 DISTRIBUTION", BIOMETRIKA, 47, PP. 143-150.
31563C     WRITTEN BY--JAMES J. FILLIBEN
31564C                 STATISTICAL ENGINEERING DIVISION
31565C                 INFORMATION TECHNOLOGY LABORATORY
31566C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
31567C                 GAITHERSBURG, MD 20899-8980
31568C                 PHONE--301-975-2855
31569C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
31570C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
31571C     LANGUAGE--ANSI FORTRAN (1977)
31572C     VERSION NUMBER--2006/5
31573C     ORIGINAL VERSION--MAY       2006.
31574C
31575C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
31576C
31577C---------------------------------------------------------------------
31578C
31579      REAL K
31580      REAL LAMBDA
31581C
31582      DOUBLE PRECISION DX
31583      DOUBLE PRECISION DLAMB
31584      DOUBLE PRECISION DK
31585      DOUBLE PRECISION DPDF
31586      DOUBLE PRECISION DTERM1
31587      DOUBLE PRECISION DTERM2
31588      DOUBLE PRECISION DLNGAM
31589C
31590C---------------------------------------------------------------------
31591C
31592      INCLUDE 'DPCOP2.INC'
31593C
31594C-----START POINT-----------------------------------------------------
31595C
31596      PDF=0.0
31597      IK=INT(K+0.5)
31598      INTX=INT(X+0.5)
31599C
31600C     CHECK THE INPUT ARGUMENTS FOR ERRORS
31601C
31602      IF(LAMBDA.LE.0.0 .OR. LAMBDA.GE.1.0)THEN
31603        WRITE(ICOUT,11)
31604   11   FORMAT('***** ERROR--THE SECOND ARGUMENT TO BTAPDF ',
31605     1         'IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL.')
31606        CALL DPWRST('XXX','BUG ')
31607        WRITE(ICOUT,46)LAMBDA
31608   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
31609        CALL DPWRST('XXX','BUG ')
31610        GOTO9999
31611      ELSEIF(IK.LT.1)THEN
31612        WRITE(ICOUT,12)
31613   12   FORMAT('***** ERROR--THE THIRD ARGUMENT TO BTAPDF ',
31614     1         'IS NON-POSITIVE.')
31615        CALL DPWRST('XXX','BUG ')
31616        WRITE(ICOUT,47)IK
31617        CALL DPWRST('XXX','BUG ')
31618        GOTO9999
31619      ELSEIF(INTX.LT.IK)THEN
31620        WRITE(ICOUT,5)IK
31621    5   FORMAT('***** ERROR--THE FIRST ARGUMENT TO BTAPDF ',
31622     1         'IS LESS THAN THE THIRD ARGUMENT (= ',I8,').')
31623        CALL DPWRST('XXX','BUG ')
31624        WRITE(ICOUT,47)INTX
31625   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8,'.')
31626        CALL DPWRST('XXX','BUG ')
31627        GOTO9999
31628      ENDIF
31629C
31630      DX=DBLE(INTX)
31631      DLAMB=DBLE(LAMBDA)
31632      DK=DBLE(IK)
31633C
31634      DTERM1=DLOG(DK) + (-DLAMB*DX) + (DX-DK)*DLOG(DLAMB*DX)
31635      DTERM2=DLOG(DX) + DLNGAM(DX-DK+1.0D0)
31636      DPDF=DEXP(DTERM1 - DTERM2)
31637      PDF=REAL(DPDF)
31638C
31639 9999 CONTINUE
31640      RETURN
31641      END
31642      SUBROUTINE BTAPPF(P,LAMBDA,K,PPF)
31643C
31644C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
31645C              FUNCTION VALUE AT THE SINGLE PRECISION VALUE P
31646C              FOR THE BOREL-TANNER DISTRIBUTION WITH SINGLE PRECISION
31647C              SHAPE PARAMETERS LAMBDA AND K.
31648C              THIS DISTRIBUTION IS DEFINED FOR ALL
31649C              POSITIVE INTEGER X >= K.
31650C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
31651C              p(X;LAMBDA,K) = K*EXP(-LAMBDA*X)*(LAMBDA*X)**(X-K)/
31652C                              (X*(X-K)!),   X >= K, 0 < LAMBDA < 1.
31653C              THIS DISTRIBUTION IS DEFINED FOR 0 <= P <= 1.
31654C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE
31655C                                AT WHICH THE PERCENT POINT
31656C                                FUNCTION IS TO BE EVALUATED.
31657C                                0 <= P < 1.
31658C                     --LAMBDA = THE SINGLE PRECISION VALUE
31659C                                OF THE FIRST SHAPE PARAMETER.
31660C                     --K      = THE SINGLE PRECISION VALUE
31661C                                OF THE SECOND SHAPE PARAMETER.
31662C     OUTPUT ARGUMENTS--PPF    = THE SINGLE PRECISION PERCENT POINT
31663C                                FUNCTION VALUE.
31664C     OUTPUT--THE SINGLE PRECISION PERCENT POINT FUNCTION VALUE PPF
31665C             FOR THE BOREL-TANNER DISTRIBUTION
31666C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
31667C     RESTRICTIONS--0 <= P < 1
31668C                 --0 < LAMBDA < 1, K A POSITIVE INTEGER
31669C     OTHER DATAPAC   SUBROUTINES NEEDED--DLNGAM.
31670C     FORTRAN LIBRARY SUBROUTINES NEEDED--DEXP, DLOG
31671C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
31672C     LANGUAGE--ANSI FORTRAN (1977)
31673C     REFERENCES--JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
31674C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
31675C                 WILEY, PP. 394-396.
31676C               --LUC DEVROYE, "THE BRANCHING PROCESS METHOD IN
31677C                 LAGRANGE RANDOM VARIATE GENERATION",
31678C                 FROM DEVROYES'S WEB SITE.
31679C     WRITTEN BY--JAMES J. FILLIBEN
31680C                 STATISTICAL ENGINEERING DIVISION
31681C                 INFORMATION TECHNOLOGY LABORATORY
31682C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
31683C                 GAITHERSBURG, MD 20899-8980
31684C                 PHONE--301-975-2855
31685C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
31686C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
31687C     LANGUAGE--ANSI FORTRAN (1977)
31688C     VERSION NUMBER--2006/5
31689C     ORIGINAL VERSION--MAY       2006.
31690C
31691C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
31692C
31693C---------------------------------------------------------------------
31694C
31695      REAL K
31696      REAL LAMBDA
31697C
31698      DOUBLE PRECISION DP
31699      DOUBLE PRECISION DEPS
31700C
31701      DOUBLE PRECISION DX
31702      DOUBLE PRECISION DLAMB
31703      DOUBLE PRECISION DK
31704      DOUBLE PRECISION DCDF
31705      DOUBLE PRECISION DPDF
31706      DOUBLE PRECISION DTERM1
31707      DOUBLE PRECISION DTERM2
31708      DOUBLE PRECISION DLNGAM
31709C
31710      INCLUDE 'DPCOMC.INC'
31711C
31712C---------------------------------------------------------------------
31713C
31714      INCLUDE 'DPCOP2.INC'
31715C
31716C-----START POINT---------------------------------------------------
31717C
31718      PPF=0.0
31719C
31720C     CHECK THE INPUT ARGUMENTS FOR ERRORS
31721C
31722      IF(P.LT.0.0.OR.P.GE.1.0)THEN
31723        WRITE(ICOUT,1)
31724        CALL DPWRST('XXX','BUG ')
31725        WRITE(ICOUT,46)P
31726        CALL DPWRST('XXX','BUG ')
31727        PPF=0.0
31728      ENDIF
31729C
31730      IF(LAMBDA.LE.0.0 .OR. LAMBDA.GE.1.0)THEN
31731        WRITE(ICOUT,11)
31732        CALL DPWRST('XXX','BUG ')
31733        WRITE(ICOUT,46)LAMBDA
31734        CALL DPWRST('XXX','BUG ')
31735        CDF=0.0
31736        GOTO9999
31737      ENDIF
31738C
31739      IK=INT(K+0.5)
31740      IF(IK.LT.1)THEN
31741        WRITE(ICOUT,12)
31742        CALL DPWRST('XXX','BUG ')
31743        WRITE(ICOUT,47)IK
31744        CALL DPWRST('XXX','BUG ')
31745        CDF=0.0
31746        GOTO9999
31747C
31748      ENDIF
31749    1 FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO THE ',
31750     1' BTAPPF SUBROUTINE IS OUTSIDE THE ALLOWABLE (0,1] INTERVAL')
31751   11 FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO THE ',
31752     1' BTAPPF SUBROUTINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
31753   12 FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO THE ',
31754     1' BTAPPF SUBROUTINE IS NON-POSITIVE')
31755   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7)
31756   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
31757C
31758      IF(P.LE.0.0)THEN
31759        PPF=REAL(IK)
31760        GOTO9999
31761      ENDIF
31762C
31763      DLAMB=DBLE(LAMBDA)
31764      DK=DBLE(IK)
31765      DP=DBLE(P)
31766      DEPS=1.0D-7
31767C
31768C     COMPUTE PDF FOR X = IK
31769C
31770      DX=DK
31771      DCDF=DEXP(-DLAMB*DX - DLNGAM(1.0D0))
31772C
31773      IF(DCDF.GE.DP-DEPS)THEN
31774        PPF=REAL(IK)
31775        GOTO9999
31776      ENDIF
31777      I=IK
31778C
31779  100 CONTINUE
31780        I=I+1
31781        IF(DBLE(I).GE.DBLE(I1MACH(9)))THEN
31782          WRITE(ICOUT,55)
31783   55     FORMAT('***** ERROR--THE COMPUTED PERCENT POINT VALUE ',
31784     1           'EXCEEDS THE LARGEST MACHINE INTEGER.')
31785          CALL DPWRST('XXX','BUG ')
31786          PPF=0.0
31787          GOTO9999
31788        ENDIF
31789        DX=DBLE(I)
31790        DTERM1=DLOG(DK) + (-DLAMB*DX) + (DX-DK)*DLOG(DLAMB*DX)
31791        DTERM2=DLOG(DX) + DLNGAM(DX-DK+1.0D0)
31792        DPDF=DEXP(DTERM1 - DTERM2)
31793        DCDF=DCDF + DPDF
31794        IF(DCDF.GE.DP-DEPS)THEN
31795          PPF=REAL(I)
31796          GOTO9999
31797        ENDIF
31798      GOTO100
31799C
31800 9999 CONTINUE
31801      RETURN
31802      END
31803      SUBROUTINE BTARAN(N,LAMBDA,K,ISEED,X)
31804C
31805C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
31806C              FROM THE BOREL-TANNER DISTRIBUTION
31807C              WITH SHAPE PARAMETERS LAMBDA AND K.
31808C              THIS DISTRIBUTION IS DEFINED FOR ALL
31809C              POSITIVE INTEGER X >= K.
31810C              THIS DISTRIBUTION HAS THE PROBABILITY FUNCTION
31811C              p(X;LAMBDA,K) = K*EXP(-LAMBDA*X)*(LAMBDA*X)**(X-K)/
31812C                              (X*(X-K)!),   X >= K, 0 < LAMBDA < 1.
31813C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
31814C                                OF RANDOM NUMBERS TO BE
31815C                                GENERATED.
31816C                     --LAMBDA = THE SINGLE PRECISION VALUE
31817C                                OF THE FIRST SHAPE PARAMETER.
31818C                     --K      = THE SINGLE PRECISION VALUE
31819C                                OF THE SECOND SHAPE PARAMETER.
31820C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
31821C                                (OF DIMENSION AT LEAST N)
31822C                                INTO WHICH THE GENERATED
31823C                                RANDOM SAMPLE WILL BE PLACED.
31824C     OUTPUT--A RANDOM SAMPLE OF SIZE N
31825C             FROM THE BOREL-TANNER DISTRIBUTION
31826C             WITH SHAPE PARAMETERS LAMBDA AND K.
31827C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
31828C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
31829C                   OF N FOR THIS SUBROUTINE.
31830C                 --0 < LAMBDA < 1, K A POSITIVE INTEGER
31831C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN
31832C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
31833C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
31834C     LANGUAGE--ANSI FORTRAN (1977)
31835C     REFERENCES--JOHNSON, KOTZ, AND KEMP (1992).  "UNIVARIATE
31836C                 DISCRETE DISTRIBUTIONS", SECOND EDITION,
31837C                 WILEY, PP. 394-396.
31838C               --LUC DEVROYE, "THE BRANCHING PROCESS METHOD IN
31839C                 LAGRANGE RANDOM VARIATE GENERATION",
31840C                 FROM DEVROYES'S WEB SITE.
31841C     WRITTEN BY--JAMES J. FILLIBEN
31842C                 STATISTICAL ENGINEERING DIVISION
31843C                 INFORMATION TECHNOLOGY LABORATORY
31844C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
31845C                 GAITHERSBURG, MD 20899-8980
31846C                 PHONE--301-975-2899
31847C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
31848C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
31849C     LANGUAGE--ANSI FORTRAN (1977)
31850C     VERSION NUMBER--2006/5
31851C     ORIGINAL VERSION--MAY       2006.
31852C
31853C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
31854C
31855C---------------------------------------------------------------------
31856C
31857      REAL LAMBDA
31858      REAL K
31859      DIMENSION X(*)
31860C
31861CCCCC DIMENSION U(2)
31862C
31863CCCCC DOUBLE PRECISION PI
31864CCCCC DOUBLE PRECISION C
31865CCCCC DOUBLE PRECISION V
31866CCCCC DOUBLE PRECISION Y
31867CCCCC DOUBLE PRECISION DK
31868CCCCC DOUBLE PRECISION DLAMB
31869CCCCC DOUBLE PRECISION U1
31870CCCCC DOUBLE PRECISION W
31871CCCCC DOUBLE PRECISION WT
31872C
31873C---------------------------------------------------------------------
31874C
31875      INCLUDE 'DPCOP2.INC'
31876C
31877C-----DATA STATEMENTS-------------------------------------------------
31878C
31879CCCCC DATA PI / 3.14159265358979D+00/
31880C
31881C-----START POINT-----------------------------------------------------
31882C
31883C     CHECK THE INPUT ARGUMENTS FOR ERRORS
31884C
31885      IF(N.LT.1)THEN
31886        WRITE(ICOUT, 5)
31887        CALL DPWRST('XXX','BUG ')
31888        WRITE(ICOUT,47)N
31889        CALL DPWRST('XXX','BUG ')
31890        GOTO9999
31891      ENDIF
31892      IF(LAMBDA.LE.0.0 .OR. LAMBDA.GE.1.0)THEN
31893        WRITE(ICOUT,11)
31894        CALL DPWRST('XXX','BUG ')
31895        WRITE(ICOUT,46)LAMBDA
31896        CALL DPWRST('XXX','BUG ')
31897        PDF=0.0
31898        GOTO9999
31899      ENDIF
31900C
31901      IK=INT(K+0.5)
31902      IF(IK.LT.1)THEN
31903        WRITE(ICOUT,12)
31904        CALL DPWRST('XXX','BUG ')
31905        WRITE(ICOUT,47)IK
31906        CALL DPWRST('XXX','BUG ')
31907        PDF=0.0
31908        GOTO9999
31909      ENDIF
31910    5 FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
31911     1'BOREL-TANNER RANDOM NUMBERS IS NON-POSITIVE')
31912   11 FORMAT('***** ERROR--THE LAMBDA PARAMETER FOR THE ',
31913     1'BOREL-TANNER RANDOM NUMBERS IS OUTSIDE THE (0,1) INTERVAL')
31914   12 FORMAT('***** ERROR--THE K PARAMETER FOR THE ',
31915     1'BOREL-TANNER RANDOM NUMBERS IS NON-POSITIVE')
31916   46 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',E15.8)
31917   47 FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
31918C
31919C     GENERATE N BOREL-TANNER DISTRIBUTION RANDOM NUMBERS
31920C     USING THE ALGORITHM GIVEN IN THE DEVROYE PAPER.
31921C
31922C     I DON'T THINK I HAVE THIS QUITE RIGHT, SO JUST USE
31923C     INVERSE PPF METHOD FOR NOW.
31924C
31925CCCCC NTEMP=2
31926CCCCC C=1.0D0/DSQRT(2.0D0*PI)
31927CCCCC DK=DBLE(IK)
31928CCCCC DLAMB=DBLE(LAMBDA)
31929C
31930CCCCC DO100I=1,N
31931C
31932C110    CONTINUE
31933CCCCC   CALL UNIRAN(NTEMP,ISEED,U)
31934CCCCC   U1=DBLE(U(1))
31935C
31936CCCCC   V=(1.0D0 + 4.0D0*C*DSQRT(DK))*U1
31937C
31938CCCCC   IF(V.LE.1.0D0)THEN
31939CCCCC     X(I)=REAL(IK)
31940CCCCC     GOTO100
31941CCCCC   ELSEIF(V.GT.1.0D0 .AND. V.LE.1.0D0+2.0D0*C*DSQRT(DK))THEN
31942CCCCC     Y=DK + 1.0D0 + (V - 1.0D0)**2/(4.0D0*C*C)
31943CCCCC     T=C/DSQRT(Y-1.0D0-DK)
31944CCCCC   ELSE
31945CCCCC     Y=DK + 1.0D0 + (2.0D0*DK*C/(1.0D0+4.0D0*C*DSQRT(DK)-V))**2
31946CCCCC     T=DK*C/(Y-1.0D0-DK)**1.5
31947CCCCC   ENDIF
31948C
31949CCCCC   W=DBLE(U(2))
31950CCCCC   WT=W*T
31951CCCCC   CALL BTACDF(REAL(Y),LAMBDA,K,CDF)
31952CCCCC   CALL BTAPDF(REAL(Y),LAMBDA,K,PDF)
31953CCCCC   CALL BTAPDF(REAL(Y),LAMBDA,K,PPF)
31954CCCCC   IF(WT.LT.DBLE(PPF))THEN
31955CCCCC     IY=INT(Y+0.5)
31956CCCCC     X(I)=REAL(IY)
31957CCCCC     GOTO100
31958CCCCC   ELSE
31959CCCCC     GOTO110
31960CCCCC   ENDIF
31961C
31962C 100 CONTINUE
31963C
31964      CALL UNIRAN(N,ISEED,X)
31965      DO100I=1,N
31966        XTEMP=X(I)
31967        CALL BTAPPF(XTEMP,LAMBDA,K,PPF)
31968        X(I)=PPF
31969  100 CONTINUE
31970C
31971 9999 CONTINUE
31972C
31973      RETURN
31974      END
31975      SUBROUTINE BTPCF(X,N,FCN,LDF,NF,T,K,BCOEF,WORK)
31976C***BEGIN PROLOGUE  BTPCF
31977C***REFER TO  B2INK,B3INK
31978C***ROUTINES CALLED  BINTK,BNSLV
31979C***END PROLOGUE  BTPCF
31980C
31981C  -----------------------------------------------------------------
31982C  BTPCF COMPUTES B-SPLINE INTERPOLATION COEFFICIENTS FOR NF SETS
31983C  OF DATA STORED IN THE COLUMNS OF THE ARRAY FCN. THE B-SPLINE
31984C  COEFFICIENTS ARE STORED IN THE ROWS OF BCOEF HOWEVER.
31985C  EACH INTERPOLATION IS BASED ON THE N ABCISSA STORED IN THE
31986C  ARRAY X, AND THE N+K KNOTS STORED IN THE ARRAY T. THE ORDER
31987C  OF EACH INTERPOLATION IS K. THE WORK ARRAY MUST BE OF LENGTH
31988C  AT LEAST 2*K*(N+1).
31989C  -----------------------------------------------------------------
31990C
31991C  ------------
31992C  DECLARATIONS
31993C  ------------
31994C
31995C  PARAMETERS
31996C
31997      INTEGER
31998     *        N, LDF, K
31999      REAL
32000     *     X(N), FCN(LDF,NF), T(*), BCOEF(NF,N), WORK(*)
32001C
32002C  LOCAL VARIABLES
32003C
32004      INTEGER
32005     *        I, J, K1, K2, IQ, IW
32006C
32007C  ---------------------------------------------
32008C  CHECK FOR NULL INPUT AND PARTITION WORK ARRAY
32009C  ---------------------------------------------
32010C
32011C***FIRST EXECUTABLE STATEMENT
32012      IF (NF .LE. 0)  GO TO 500
32013      K1 = K - 1
32014      K2 = K1 + K
32015      IQ = 1 + N
32016      IW = IQ + K2*N+1
32017C
32018C  -----------------------------
32019C  COMPUTE B-SPLINE COEFFICIENTS
32020C  -----------------------------
32021C
32022C
32023C   FIRST DATA SET
32024C
32025      CALL BINTK(X,FCN,T,N,K,WORK,WORK(IQ),WORK(IW))
32026      DO 20 I=1,N
32027         BCOEF(1,I) = WORK(I)
32028   20 CONTINUE
32029C
32030C  ALL REMAINING DATA SETS BY BACK-SUBSTITUTION
32031C
32032      IF (NF .EQ. 1)  GO TO 500
32033      DO 100 J=2,NF
32034         DO 50 I=1,N
32035            WORK(I) = FCN(I,J)
32036   50    CONTINUE
32037         CALL BNSLV(WORK(IQ),K2,N,K1,K1,WORK)
32038         DO 60 I=1,N
32039            BCOEF(J,I) = WORK(I)
32040   60    CONTINUE
32041  100 CONTINUE
32042C
32043C  ----
32044C  EXIT
32045C  ----
32046C
32047  500 CONTINUE
32048      RETURN
32049      END
32050      SUBROUTINE BU2CDF(DX,DR,DCDF)
32051C
32052C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
32053C              FUNCTION VALUE FOR THE BURR TYPE 2 DISTRIBTION.
32054C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
32055C
32056C              F(X;R) = 1/[(1+EXP(-X))**R]    -INF <  X <  INF; R > 0
32057C
32058C              WITH SHAPE PARAMETER R.
32059C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
32060C                                WHICH THE CUMULATIVE DISTRIBUTION
32061C                                FUNCTION IS TO BE EVALUATED.
32062C                     --DR     = THE SHAPE PARAMETER
32063C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
32064C                                DISTRIBUTION FUNCTION VALUE.
32065C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
32066C             FUNCTION VALUE CDF FOR THE BURR TYPE 2 DISTRIBUTION
32067C             WITH SHAPE PARAMETER R.
32068C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32069C     RESTRICTIONS--NONE.
32070C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32071C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
32072C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32073C     LANGUAGE--ANSI FORTRAN (1977)
32074C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32075C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32076C                 JOHN WILEY, 1994, PP. 53-54.
32077C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32078C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32079C     WRITTEN BY--JAMES J. FILLIBEN
32080C                 STATISTICAL ENGINEERING DIVISION
32081C                 INFORMATION TECHNOLOGY LABORATORY
32082C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32083C                 GAITHERSBURG, MD 20899-8980
32084C                 PHONE--301-975-2855
32085C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32086C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32087C     LANGUAGE--ANSI FORTRAN (1977)
32088C     VERSION NUMBER--2007.10
32089C     ORIGINAL VERSION--OCTOBER   2007.
32090C
32091C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32092C
32093C---------------------------------------------------------------------
32094C
32095      DOUBLE PRECISION DCDF
32096      DOUBLE PRECISION DX
32097      DOUBLE PRECISION DR
32098      DOUBLE PRECISION DTERM1
32099      DOUBLE PRECISION DTERM2
32100C
32101C---------------------------------------------------------------------
32102C
32103      INCLUDE 'DPCOP2.INC'
32104C
32105C-----DATA STATEMENTS-------------------------------------------------
32106C
32107C-----START POINT-----------------------------------------------------
32108C
32109C               ********************************************
32110C               **  STEP 1--                              **
32111C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32112C               ********************************************
32113C
32114      DCDF=0.0D0
32115C
32116      IF(DR.LE.0.0D0)THEN
32117        WRITE(ICOUT,115)
32118  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU2CDF ',
32119     1         'IS NON-POSITIVE.')
32120        CALL DPWRST('XXX','BUG ')
32121        WRITE(ICOUT,147)DR
32122  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32123        CALL DPWRST('XXX','BUG ')
32124        GOTO9000
32125      ENDIF
32126C
32127C               **************************************************
32128C               **  STEP 2B-                                    **
32129C               **  COMPUTE BURR TYPE 2  CDF                    **
32130C               **************************************************
32131C
32132      DTERM1=1.0D0 + DEXP(-DX)
32133      DTERM2=DTERM1**DR
32134      DCDF=1.0D0/DTERM2
32135C
32136 9000 CONTINUE
32137      RETURN
32138      END
32139      SUBROUTINE BU2PDF(DX,DR,DPDF)
32140C
32141C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
32142C              FUNCTION VALUE FOR THE BURR TYPE 2 DISTRIBTION.
32143C              THE PROBABILITY DENSITY FUNCTION IS:
32144C
32145C              f(X;R) = R*(1 + EXP(-X))**(-1-R)/EXP(X)
32146C                       -INF <  X <  INF; R > 0
32147C
32148C              WITH SHAPE PARAMETER R.
32149C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
32150C                                WHICH THE PROBABILITY DENSITY
32151C                                FUNCTION IS TO BE EVALUATED.
32152C                     --DR     = THE SHAPE PARAMETER
32153C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY DENSITY
32154C                                FUNCTION VALUE.
32155C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
32156C             FUNCTION VALUE PDF FOR THE BURR TYPE 2 DISTRIBUTION
32157C             WITH SHAPE PARAMETER R.
32158C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32159C     RESTRICTIONS--NONE.
32160C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32161C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
32162C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32163C     LANGUAGE--ANSI FORTRAN (1977)
32164C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32165C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32166C                 JOHN WILEY, 1994, PP. 53-54.
32167C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32168C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32169C     WRITTEN BY--JAMES J. FILLIBEN
32170C                 STATISTICAL ENGINEERING DIVISION
32171C                 INFORMATION TECHNOLOGY LABORATORY
32172C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32173C                 GAITHERSBURG, MD 20899-8980
32174C                 PHONE--301-975-2855
32175C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32176C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32177C     LANGUAGE--ANSI FORTRAN (1977)
32178C     VERSION NUMBER--2007.10
32179C     ORIGINAL VERSION--OCTOBER   2007.
32180C
32181C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32182C
32183C---------------------------------------------------------------------
32184C
32185      DOUBLE PRECISION DPDF
32186      DOUBLE PRECISION DX
32187      DOUBLE PRECISION DR
32188      DOUBLE PRECISION DTERM1
32189      DOUBLE PRECISION DTERM2
32190C
32191C---------------------------------------------------------------------
32192C
32193      INCLUDE 'DPCOP2.INC'
32194C
32195C-----DATA STATEMENTS-------------------------------------------------
32196C
32197C-----START POINT-----------------------------------------------------
32198C
32199C               ********************************************
32200C               **  STEP 1--                              **
32201C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32202C               ********************************************
32203C
32204      DPDF=0.0D0
32205C
32206      IF(DR.LE.0.0D0)THEN
32207        WRITE(ICOUT,115)
32208  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU2PDF ',
32209     1         'NON-POSITIVE.')
32210        CALL DPWRST('XXX','BUG ')
32211        WRITE(ICOUT,147)DR
32212  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32213        CALL DPWRST('XXX','BUG ')
32214        GOTO9000
32215      ENDIF
32216C
32217C               **************************************************
32218C               **  STEP 2B-                                    **
32219C               **  COMPUTE BURR TYPE II PDF                    **
32220C               **************************************************
32221C
32222      DTERM1=DLOG(DR) + (-1.0D0 - DR)*DLOG(1.0D0 + DEXP(-DX))
32223      DTERM2=DX
32224      DPDF=DEXP(DTERM1 - DTERM2)
32225C
32226 9000 CONTINUE
32227      RETURN
32228      END
32229      SUBROUTINE BU2PPF(DP,DR,DPPF)
32230C
32231C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
32232C              FUNCTION VALUE FOR THE BURR TYPE 2 DISTRIBUTION.
32233C              THE PERCENT POINT FUNCTION IS:
32234C
32235C              G(P;R) = -LOG((1/P)**(1/R) - 1)   0 < P < 1; R > 0
32236C
32237C              WITH SHAPE PARAMETER R.
32238C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
32239C                                WHICH THE PERCENT POINT
32240C                                FUNCTION IS TO BE EVALUATED.
32241C                     --DR     = THE SHAPE PARAMETER
32242C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
32243C                                FUNCTION VALUE.
32244C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
32245C             FUNCTION VALUE PPF FOR THE BURR TYPE 2 DISTRIBUTION
32246C             WITH SHAPE PARAMETER R.
32247C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32248C     RESTRICTIONS--NONE.
32249C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32250C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
32251C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32252C     LANGUAGE--ANSI FORTRAN (1977)
32253C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32254C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32255C                 JOHN WILEY, 1994, PP. 53-54.
32256C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32257C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32258C     WRITTEN BY--JAMES J. FILLIBEN
32259C                 STATISTICAL ENGINEERING DIVISION
32260C                 INFORMATION TECHNOLOGY LABORATORY
32261C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32262C                 GAITHERSBURG, MD 20899-8980
32263C                 PHONE--301-975-2855
32264C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32265C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32266C     LANGUAGE--ANSI FORTRAN (1977)
32267C     VERSION NUMBER--2007.10
32268C     ORIGINAL VERSION--OCTOBER   2007.
32269C
32270C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32271C
32272C---------------------------------------------------------------------
32273C
32274      DOUBLE PRECISION DPPF
32275      DOUBLE PRECISION DP
32276      DOUBLE PRECISION DR
32277      DOUBLE PRECISION DTERM1
32278C
32279C---------------------------------------------------------------------
32280C
32281      INCLUDE 'DPCOP2.INC'
32282C
32283C-----DATA STATEMENTS-------------------------------------------------
32284C
32285C-----START POINT-----------------------------------------------------
32286C
32287C               ********************************************
32288C               **  STEP 1--                              **
32289C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32290C               ********************************************
32291C
32292      DPPF=0.0D0
32293C
32294      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
32295        WRITE(ICOUT,105)
32296  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU2PPF ',
32297     1         'IS OUTSIDE THE (0,1) INTERVAL.')
32298        CALL DPWRST('XXX','BUG ')
32299        WRITE(ICOUT,147)DP
32300        CALL DPWRST('XXX','BUG ')
32301        GOTO9000
32302      ELSEIF(DR.LE.0.0D0)THEN
32303        WRITE(ICOUT,115)
32304  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU2PPF ',
32305     1         'IS NON-POSITIVE.')
32306        CALL DPWRST('XXX','BUG ')
32307        WRITE(ICOUT,147)DR
32308  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32309        CALL DPWRST('XXX','BUG ')
32310        GOTO9000
32311      ENDIF
32312C
32313C               **************************************************
32314C               **  STEP 2B-                                    **
32315C               **  COMPUTE BURR TYPE 2 PPF                     **
32316C               **************************************************
32317C
32318      DTERM1=(1.0D0/DP)**(1.0D0/DR)
32319      DPPF=-DLOG(DTERM1 - 1.0D0)
32320C
32321 9000 CONTINUE
32322      RETURN
32323      END
32324      SUBROUTINE BU2RAN(N,R,ISEED,X)
32325C
32326C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
32327C              FROM THE BURR TYPE 2 DISTRIBUTION WITH
32328C              SHAPE PARAMETER R.
32329C
32330C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
32331C                                OF RANDOM NUMBERS TO BE
32332C                                GENERATED.
32333C                     --R      = THE SINGLE PRECISION VALUE OF THE
32334C                                SHAPE PARAMETER R.
32335C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
32336C                                (OF DIMENSION AT LEAST N)
32337C                                INTO WHICH THE GENERATED
32338C                                RANDOM SAMPLE WILL BE PLACED.
32339C     OUTPUT--A RANDOM SAMPLE OF SIZE N
32340C             FROM THE BURR TYPE 2 DISTRIBUTION
32341C             WITH SHAPE PARAMETER R.
32342C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32343C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
32344C                   OF N FOR THIS SUBROUTINE.
32345C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU2PPF.
32346C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32347C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
32348C     LANGUAGE--ANSI FORTRAN (1977)
32349C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32350C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32351C                 JOHN WILEY, 1994, PP. 53-54.
32352C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32353C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32354C     WRITTEN BY--JAMES J. FILLIBEN
32355C                 STATISTICAL ENGINEERING DIVISION
32356C                 INFORMATION TECHMOLOGY LABORATORY
32357C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32358C                 GAITHERSBURG, MD 20899-8980
32359C                 PHONE--301-975-2855
32360C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32361C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
32362C     LANGUAGE--ANSI FORTRAN (1977)
32363C     VERSION NUMBER--2007.10
32364C     ORIGINAL VERSION--OCTOBER   2007.
32365C
32366C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32367C
32368C---------------------------------------------------------------------
32369C
32370      DIMENSION X(*)
32371C
32372      DOUBLE PRECISION DTEMP
32373C
32374C---------------------------------------------------------------------
32375C
32376      INCLUDE 'DPCOP2.INC'
32377C
32378C-----START POINT-----------------------------------------------------
32379C
32380C     CHECK THE INPUT ARGUMENTS FOR ERRORS
32381C
32382      IF(N.LT.1)THEN
32383        WRITE(ICOUT, 5)
32384        CALL DPWRST('XXX','BUG ')
32385        WRITE(ICOUT,47)N
32386        CALL DPWRST('XXX','BUG ')
32387        GOTO9000
32388    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
32389     1         'BURR TYPE 2 RANDOM NUMBERS IS NON-POSITIVE')
32390   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
32391      ELSEIF(R.LE.0.0)THEN
32392        WRITE(ICOUT,201)
32393        CALL DPWRST('XXX','BUG ')
32394        WRITE(ICOUT,203)R
32395        CALL DPWRST('XXX','BUG ')
32396        GOTO9000
32397  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
32398  203   FORMAT('      THE VALUE OF R IS ',G15.7)
32399      ENDIF
32400C
32401C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
32402C
32403      CALL UNIRAN(N,ISEED,X)
32404C
32405C     GENERATE N SLOPE DISTRIBUTION RANDOM
32406C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
32407C
32408      DO300I=1,N
32409        CALL BU2PPF(DBLE(X(I)),DBLE(R),DTEMP)
32410        X(I)=DBLE(DTEMP)
32411  300 CONTINUE
32412C
32413 9000 CONTINUE
32414      RETURN
32415      END
32416      SUBROUTINE BU3CDF(DX,DR,DK,DCDF)
32417C
32418C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
32419C              FUNCTION VALUE FOR THE BURR TYPE 3 DISTRIBTION.
32420C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
32421C
32422C              F(X;R,K) = (1+X**(-K))**(-R)    0 <  X <  INF; R, K > 0
32423C
32424C              WITH SHAPE PARAMETERS R AND K.
32425C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
32426C                                WHICH THE CUMULATIVE DISTRIBUTION
32427C                                FUNCTION IS TO BE EVALUATED.
32428C                     --DR     = THE FIRST SHAPE PARAMETER
32429C                     --DK     = THE SECOND SHAPE PARAMETER
32430C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
32431C                                DISTRIBUTION FUNCTION VALUE.
32432C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
32433C             FUNCTION VALUE CDF FOR THE BURR TYPE 3 DISTRIBUTION
32434C             WITH SHAPE PARAMETERS R AND K.
32435C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32436C     RESTRICTIONS--NONE.
32437C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32438C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32439C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32440C     LANGUAGE--ANSI FORTRAN (1977)
32441C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32442C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32443C                 JOHN WILEY, 1994, PP. 53-54.
32444C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32445C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32446C     WRITTEN BY--JAMES J. FILLIBEN
32447C                 STATISTICAL ENGINEERING DIVISION
32448C                 INFORMATION TECHNOLOGY LABORATORY
32449C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32450C                 GAITHERSBURG, MD 20899-8980
32451C                 PHONE--301-975-2855
32452C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32453C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32454C     LANGUAGE--ANSI FORTRAN (1977)
32455C     VERSION NUMBER--2007.10
32456C     ORIGINAL VERSION--OCTOBER   2007.
32457C
32458C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32459C
32460C---------------------------------------------------------------------
32461C
32462      DOUBLE PRECISION DCDF
32463      DOUBLE PRECISION DX
32464      DOUBLE PRECISION DR
32465      DOUBLE PRECISION DK
32466      DOUBLE PRECISION DTERM1
32467C
32468C---------------------------------------------------------------------
32469C
32470      INCLUDE 'DPCOP2.INC'
32471C
32472C-----DATA STATEMENTS-------------------------------------------------
32473C
32474C-----START POINT-----------------------------------------------------
32475C
32476C               ********************************************
32477C               **  STEP 1--                              **
32478C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32479C               ********************************************
32480C
32481      DCDF=0.0D0
32482C
32483      IF(DR.LE.0.0D0)THEN
32484        WRITE(ICOUT,115)
32485  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU3CDF ',
32486     1         'IS NON-POSITIVE.')
32487        CALL DPWRST('XXX','BUG ')
32488        WRITE(ICOUT,147)DR
32489  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32490        CALL DPWRST('XXX','BUG ')
32491        GOTO9000
32492      ELSEIF(DK.LE.0.0D0)THEN
32493        WRITE(ICOUT,125)
32494  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU3CDF ',
32495     1         'IS NON-POSITIVE.')
32496        CALL DPWRST('XXX','BUG ')
32497        WRITE(ICOUT,147)DK
32498        CALL DPWRST('XXX','BUG ')
32499        GOTO9000
32500      ENDIF
32501C
32502C               **************************************************
32503C               **  STEP 2B-                                    **
32504C               **  COMPUTE BURR TYPE 3 CDF                     **
32505C               **************************************************
32506C
32507      IF(DX.LE.0.0D0)THEN
32508        DCDF=0.0D0
32509      ELSE
32510        DTERM1=1.0D0 + DX**(-DK)
32511        DCDF=DTERM1**(-DR)
32512      ENDIF
32513C
32514 9000 CONTINUE
32515      RETURN
32516      END
32517      SUBROUTINE BU3PDF(DX,DR,DK,DPDF)
32518C
32519C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
32520C              FUNCTION VALUE FOR THE BURR TYPE 3 DISTRIBTION.
32521C              THE PROBABILITY DENSITY FUNCTION IS:
32522C
32523C              f(X;R,K) = R*K*X**(R*K-1)/(1+X**K)**(R+1)
32524C              X >  0; R, K > 0
32525C
32526C              WITH SHAPE PARAMETERS R AND K.
32527C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
32528C                                WHICH THE PROBABILITY DENSITY
32529C                                FUNCTION IS TO BE EVALUATED.
32530C                     --DR     = THE FIRST SHAPE PARAMETER
32531C                     --DK     = THE SECOND SHAPE PARAMETER
32532C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION CUMULATIVE
32533C                                DISTRIBUTION FUNCTION VALUE.
32534C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
32535C             FUNCTION VALUE PDF FOR THE BURR TYPE 3 DISTRIBUTION
32536C             WITH SHAPE PARAMETERS R AND K.
32537C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32538C     RESTRICTIONS--NONE.
32539C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32540C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32541C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32542C     LANGUAGE--ANSI FORTRAN (1977)
32543C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32544C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32545C                 JOHN WILEY, 1994, PP. 53-54.
32546C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32547C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32548C     WRITTEN BY--JAMES J. FILLIBEN
32549C                 STATISTICAL ENGINEERING DIVISION
32550C                 INFORMATION TECHNOLOGY LABORATORY
32551C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32552C                 GAITHERSBURG, MD 20899-8980
32553C                 PHONE--301-975-2855
32554C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32555C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32556C     LANGUAGE--ANSI FORTRAN (1977)
32557C     VERSION NUMBER--2007.10
32558C     ORIGINAL VERSION--OCTOBER   2007.
32559C
32560C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32561C
32562C---------------------------------------------------------------------
32563C
32564      DOUBLE PRECISION DPDF
32565      DOUBLE PRECISION DX
32566      DOUBLE PRECISION DR
32567      DOUBLE PRECISION DK
32568      DOUBLE PRECISION DTERM1
32569      DOUBLE PRECISION DTERM2
32570C
32571C---------------------------------------------------------------------
32572C
32573      INCLUDE 'DPCOP2.INC'
32574C
32575C-----DATA STATEMENTS-------------------------------------------------
32576C
32577C-----START POINT-----------------------------------------------------
32578C
32579C               ********************************************
32580C               **  STEP 1--                              **
32581C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32582C               ********************************************
32583C
32584      DPDF=0.0D0
32585C
32586      IF(DX.LE.0.0D0)THEN
32587        WRITE(ICOUT,105)
32588  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU3PDF ',
32589     1         'IS NON-POSITIVE.')
32590        CALL DPWRST('XXX','BUG ')
32591        WRITE(ICOUT,147)DX
32592        CALL DPWRST('XXX','BUG ')
32593        GOTO9000
32594      ELSEIF(DR.LE.0.0D0)THEN
32595        WRITE(ICOUT,115)
32596  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU3PDF ',
32597     1         'IS NON-POSITIVE.')
32598        CALL DPWRST('XXX','BUG ')
32599        WRITE(ICOUT,147)DR
32600  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32601        CALL DPWRST('XXX','BUG ')
32602        GOTO9000
32603      ELSEIF(DK.LE.0.0D0)THEN
32604        WRITE(ICOUT,125)
32605  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU3PDF ',
32606     1         'IS NON-POSITIVE.')
32607        CALL DPWRST('XXX','BUG ')
32608        WRITE(ICOUT,147)DK
32609        CALL DPWRST('XXX','BUG ')
32610        GOTO9000
32611      ENDIF
32612C
32613C               **************************************************
32614C               **  STEP 2B-                                    **
32615C               **  COMPUTE BURR TYPE 3 PDF                     **
32616C               **************************************************
32617C
32618      DTERM1=DLOG(DR) + DLOG(DK) + (DR*DK - 1.0D0)*DLOG(DX)
32619      DTERM2=(DR+1.0D0)*DLOG(1.0D0 + DX**DK)
32620      DPDF=DEXP(DTERM1 - DTERM2)
32621C
32622 9000 CONTINUE
32623      RETURN
32624      END
32625      SUBROUTINE BU3PPF(DP,DR,DK,DPPF)
32626C
32627C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
32628C              FUNCTION VALUE FOR THE BURR TYPE 3 DISTRIBUTION.
32629C              THE PERCENT POINT FUNCTION IS:
32630C
32631C              G(P;R,K) = (P**(-1/R) - 1)**(-1/K)  0 < P < 1; R, K > 0
32632C
32633C              WITH SHAPE PARAMETERS R AND K.
32634C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
32635C                                WHICH THE PERCENT POINT
32636C                                FUNCTION IS TO BE EVALUATED.
32637C                     --DR     = THE FIRST SHAPE PARAMETER
32638C                     --DK     = THE SECOND SHAPE PARAMETER
32639C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
32640C                                FUNCTION VALUE.
32641C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
32642C             FUNCTION VALUE PPF FOR THE BURR TYPE 3 DISTRIBUTION
32643C             WITH SHAPE PARAMETER R.
32644C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32645C     RESTRICTIONS--NONE.
32646C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32647C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32648C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32649C     LANGUAGE--ANSI FORTRAN (1977)
32650C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32651C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32652C                 JOHN WILEY, 1994, PP. 53-54.
32653C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32654C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32655C     WRITTEN BY--JAMES J. FILLIBEN
32656C                 STATISTICAL ENGINEERING DIVISION
32657C                 INFORMATION TECHNOLOGY LABORATORY
32658C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32659C                 GAITHERSBURG, MD 20899-8980
32660C                 PHONE--301-975-2855
32661C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32662C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32663C     LANGUAGE--ANSI FORTRAN (1977)
32664C     VERSION NUMBER--2007.10
32665C     ORIGINAL VERSION--OCTOBER   2007.
32666C
32667C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32668C
32669C---------------------------------------------------------------------
32670C
32671      DOUBLE PRECISION DPPF
32672      DOUBLE PRECISION DP
32673      DOUBLE PRECISION DR
32674      DOUBLE PRECISION DK
32675C
32676C---------------------------------------------------------------------
32677C
32678      INCLUDE 'DPCOP2.INC'
32679C
32680C-----DATA STATEMENTS-------------------------------------------------
32681C
32682C-----START POINT-----------------------------------------------------
32683C
32684C               ********************************************
32685C               **  STEP 1--                              **
32686C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32687C               ********************************************
32688C
32689      DPPF=0.0D0
32690C
32691      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
32692        WRITE(ICOUT,105)
32693  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU3PPF ',
32694     1         'IS OUTSIDE THE (0,1) INTERVAL.')
32695        CALL DPWRST('XXX','BUG ')
32696        WRITE(ICOUT,147)DP
32697        CALL DPWRST('XXX','BUG ')
32698        GOTO9000
32699      ELSEIF(DR.LE.0.0D0)THEN
32700        WRITE(ICOUT,115)
32701  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU3PPF ',
32702     1         'IS NON-POSITIVE.')
32703        CALL DPWRST('XXX','BUG ')
32704        WRITE(ICOUT,147)DR
32705  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32706        CALL DPWRST('XXX','BUG ')
32707        GOTO9000
32708      ELSEIF(DK.LE.0.0D0)THEN
32709        WRITE(ICOUT,125)
32710  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU3PPF ',
32711     1         'IS NON-POSITIVE.')
32712        CALL DPWRST('XXX','BUG ')
32713        WRITE(ICOUT,147)DK
32714        CALL DPWRST('XXX','BUG ')
32715        GOTO9000
32716      ENDIF
32717C
32718C               **************************************************
32719C               **  STEP 2B-                                    **
32720C               **  COMPUTE BURR TYPE 12 PPF                    **
32721C               **************************************************
32722C
32723      IF(DP.LE.0.0D0)THEN
32724        DPPF=0.0D0
32725      ELSE
32726        DPPF=(DP**(-1.0D0/DR) - 1.0D0)**(-1.0D0/DK)
32727      ENDIF
32728C
32729 9000 CONTINUE
32730      RETURN
32731      END
32732      SUBROUTINE BU3RAN(N,R,AK,ISEED,X)
32733C
32734C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
32735C              FROM THE BURR TYPE 3 DISTRIBUTION WITH
32736C              SHAPE PARAMETERS R AND K.
32737C
32738C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
32739C                                OF RANDOM NUMBERS TO BE
32740C                                GENERATED.
32741C                     --R      = THE SINGLE PRECISION VALUE OF THE
32742C                                SHAPE PARAMETER R.
32743C                     --AK     = THE SINGLE PRECISION VALUE OF THE
32744C                                SHAPE PARAMETER K.
32745C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
32746C                                (OF DIMENSION AT LEAST N)
32747C                                INTO WHICH THE GENERATED
32748C                                RANDOM SAMPLE WILL BE PLACED.
32749C     OUTPUT--A RANDOM SAMPLE OF SIZE N
32750C             FROM THE BURR TYPE 3 DISTRIBUTION
32751C             WITH SHAPE PARAMETERS R AND K.
32752C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32753C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
32754C                   OF N FOR THIS SUBROUTINE.
32755C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU3PPF.
32756C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32757C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
32758C     LANGUAGE--ANSI FORTRAN (1977)
32759C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32760C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32761C                 JOHN WILEY, 1994, PP. 53-54.
32762C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32763C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32764C     WRITTEN BY--JAMES J. FILLIBEN
32765C                 STATISTICAL ENGINEERING DIVISION
32766C                 INFORMATION TECHMOLOGY LABORATORY
32767C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32768C                 GAITHERSBURG, MD 20899-8980
32769C                 PHONE--301-975-2855
32770C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32771C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
32772C     LANGUAGE--ANSI FORTRAN (1977)
32773C     VERSION NUMBER--2007.10
32774C     ORIGINAL VERSION--OCTOBER   2007.
32775C
32776C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32777C
32778C---------------------------------------------------------------------
32779C
32780      DIMENSION X(*)
32781C
32782      DOUBLE PRECISION DTEMP
32783C
32784C---------------------------------------------------------------------
32785C
32786      INCLUDE 'DPCOP2.INC'
32787C
32788C-----START POINT-----------------------------------------------------
32789C
32790C     CHECK THE INPUT ARGUMENTS FOR ERRORS
32791C
32792      IF(N.LT.1)THEN
32793        WRITE(ICOUT, 5)
32794        CALL DPWRST('XXX','BUG ')
32795        WRITE(ICOUT,47)N
32796        CALL DPWRST('XXX','BUG ')
32797        GOTO9000
32798    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
32799     1         'BURR TYPE 3 RANDOM NUMBERS IS NON-POSITIVE')
32800   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
32801      ELSEIF(R.LE.0.0)THEN
32802        WRITE(ICOUT,201)
32803        CALL DPWRST('XXX','BUG ')
32804        WRITE(ICOUT,203)R
32805        CALL DPWRST('XXX','BUG ')
32806        GOTO9000
32807  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
32808  203   FORMAT('      THE VALUE OF R IS ',G15.7)
32809      ELSEIF(AK.LE.0.0)THEN
32810        WRITE(ICOUT,211)
32811        CALL DPWRST('XXX','BUG ')
32812        WRITE(ICOUT,213)AK
32813        CALL DPWRST('XXX','BUG ')
32814        GOTO9000
32815  211   FORMAT('***** ERROR--THE K SHAPE PARAMETER IS NON-POSITIVE.')
32816  213   FORMAT('      THE VALUE OF K IS ',G15.7)
32817      ENDIF
32818C
32819C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
32820C
32821      CALL UNIRAN(N,ISEED,X)
32822C
32823C     GENERATE N SLOPE DISTRIBUTION RANDOM
32824C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
32825C
32826      DO300I=1,N
32827        CALL BU3PPF(DBLE(X(I)),DBLE(R),DBLE(AK),DTEMP)
32828        X(I)=DBLE(DTEMP)
32829  300 CONTINUE
32830C
32831 9000 CONTINUE
32832      RETURN
32833      END
32834      SUBROUTINE BU4CDF(DX,DR,DC,DCDF)
32835C
32836C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
32837C              FUNCTION VALUE FOR THE BURR TYPE 4 DISTRIBTION.
32838C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
32839C
32840C              F(X;R,C) = [1 + (C-X)/X)**(1/C)]**(-R)
32841C                         0 <  X <  C; C, R > 0
32842C
32843C              WITH SHAPE PARAMETERS R AND C.
32844C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
32845C                                WHICH THE CUMULATIVE DISTRIBUTION
32846C                                FUNCTION IS TO BE EVALUATED.
32847C                     --DR     = THE FIRST SHAPE PARAMETER
32848C                     --DC     = THE SECOND SHAPE PARAMETER
32849C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
32850C                                DISTRIBUTION FUNCTION VALUE.
32851C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
32852C             FUNCTION VALUE CDF FOR THE BURR TYPE 4 DISTRIBUTION
32853C             WITH SHAPE PARAMETERS R AND C.
32854C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32855C     RESTRICTIONS--NONE.
32856C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32857C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32858C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32859C     LANGUAGE--ANSI FORTRAN (1977)
32860C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32861C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32862C                 JOHN WILEY, 1994, PP. 53-54.
32863C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32864C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32865C     WRITTEN BY--JAMES J. FILLIBEN
32866C                 STATISTICAL ENGINEERING DIVISION
32867C                 INFORMATION TECHNOLOGY LABORATORY
32868C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32869C                 GAITHERSBURG, MD 20899-8980
32870C                 PHONE--301-975-2855
32871C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32872C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32873C     LANGUAGE--ANSI FORTRAN (1977)
32874C     VERSION NUMBER--2007.10
32875C     ORIGINAL VERSION--OCTOBER   2007.
32876C
32877C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32878C
32879C---------------------------------------------------------------------
32880C
32881      DOUBLE PRECISION DCDF
32882      DOUBLE PRECISION DX
32883      DOUBLE PRECISION DR
32884      DOUBLE PRECISION DC
32885C
32886C---------------------------------------------------------------------
32887C
32888      INCLUDE 'DPCOP2.INC'
32889C
32890C-----DATA STATEMENTS-------------------------------------------------
32891C
32892C-----START POINT-----------------------------------------------------
32893C
32894C               ********************************************
32895C               **  STEP 1--                              **
32896C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
32897C               ********************************************
32898C
32899      DCDF=0.0D0
32900C
32901      IF(DX.GE.DC)THEN
32902        WRITE(ICOUT,105)
32903  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU4CDF IS')
32904        CALL DPWRST('XXX','BUG ')
32905        WRITE(ICOUT,108)
32906  108   FORMAT('      GREATER THAN OR EQUAL TO THE THIRD INPUT ',
32907     1         'ARGUMENT.')
32908        CALL DPWRST('XXX','BUG ')
32909        WRITE(ICOUT,141)DX
32910  141   FORMAT('      THE VALUE OF THE FIRST ARGUMENT IS ',G15.7)
32911        CALL DPWRST('XXX','BUG ')
32912        WRITE(ICOUT,143)DC
32913  143   FORMAT('      THE VALUE OF THE THIRD ARGUMENT IS ',G15.7)
32914        CALL DPWRST('XXX','BUG ')
32915        GOTO9000
32916      ELSEIF(DR.LE.0.0D0)THEN
32917        WRITE(ICOUT,115)
32918  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU4CDF ',
32919     1         'IS NON-POSITIVE.')
32920        CALL DPWRST('XXX','BUG ')
32921        WRITE(ICOUT,147)DR
32922  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
32923        CALL DPWRST('XXX','BUG ')
32924        GOTO9000
32925      ELSEIF(DC.LE.0.0D0)THEN
32926        WRITE(ICOUT,125)
32927  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU4CDF ',
32928     1         'IS NON-POSITIVE.')
32929        CALL DPWRST('XXX','BUG ')
32930        WRITE(ICOUT,147)DC
32931        CALL DPWRST('XXX','BUG ')
32932        GOTO9000
32933      ENDIF
32934C
32935C               **************************************************
32936C               **  STEP 2B-                                    **
32937C               **  COMPUTE BURR TYPE 4 CDF                     **
32938C               **************************************************
32939C
32940      IF(DX.LE.0.0D0)THEN
32941        DCDF=0.0D0
32942      ELSE
32943        DCDF=(1.0D0 + ((DC-DX)/DX)**(1.0D0/DC))**(-DR)
32944      ENDIF
32945C
32946 9000 CONTINUE
32947      RETURN
32948      END
32949      SUBROUTINE BU4PPF(DP,DR,DC,DPPF)
32950C
32951C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
32952C              FUNCTION VALUE FOR THE BURR TYPE 4 DISTRIBUTION.
32953C              THE PERCENT POINT FUNCTION IS:
32954C
32955C              G(P;R,C) = C/[1 + (P**(-1/R) - 1)**C]
32956C                         0 <= P < 1; R, C > 0
32957C
32958C              WITH SHAPE PARAMETERS R AND C.
32959C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
32960C                                WHICH THE PERCENT POINT
32961C                                FUNCTION IS TO BE EVALUATED.
32962C                     --DR     = THE FIRST SHAPE PARAMETER
32963C                     --DC     = THE SECOND SHAPE PARAMETER
32964C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
32965C                                FUNCTION VALUE.
32966C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
32967C             FUNCTION VALUE PPF FOR THE BURR TYPE 4 DISTRIBUTION
32968C             WITH SHAPE PARAMETER R.
32969C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
32970C     RESTRICTIONS--NONE.
32971C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
32972C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
32973C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
32974C     LANGUAGE--ANSI FORTRAN (1977)
32975C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
32976C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
32977C                 JOHN WILEY, 1994, PP. 53-54.
32978C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
32979C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
32980C     WRITTEN BY--JAMES J. FILLIBEN
32981C                 STATISTICAL ENGINEERING DIVISION
32982C                 INFORMATION TECHNOLOGY LABORATORY
32983C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
32984C                 GAITHERSBURG, MD 20899-8980
32985C                 PHONE--301-975-2855
32986C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
32987C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
32988C     LANGUAGE--ANSI FORTRAN (1977)
32989C     VERSION NUMBER--2007.10
32990C     ORIGINAL VERSION--OCTOBER   2007.
32991C
32992C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
32993C
32994C---------------------------------------------------------------------
32995C
32996      DOUBLE PRECISION DPPF
32997      DOUBLE PRECISION DP
32998      DOUBLE PRECISION DR
32999      DOUBLE PRECISION DC
33000C
33001C---------------------------------------------------------------------
33002C
33003      INCLUDE 'DPCOP2.INC'
33004C
33005C-----DATA STATEMENTS-------------------------------------------------
33006C
33007C-----START POINT-----------------------------------------------------
33008C
33009C               ********************************************
33010C               **  STEP 1--                              **
33011C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33012C               ********************************************
33013C
33014      DPPF=0.0D0
33015C
33016      IF(DP.LT.0.0D0 .OR. DP.GE.1.0D0)THEN
33017        WRITE(ICOUT,105)
33018  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU4PPF ',
33019     1         'IS OUTSIDE THE (0,1) INTERVAL.')
33020        CALL DPWRST('XXX','BUG ')
33021        WRITE(ICOUT,147)DP
33022        CALL DPWRST('XXX','BUG ')
33023        GOTO9000
33024      ELSEIF(DR.LE.0.0D0)THEN
33025        WRITE(ICOUT,115)
33026  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU4PPF ',
33027     1         'NON-POSITIVE.')
33028        CALL DPWRST('XXX','BUG ')
33029        WRITE(ICOUT,147)DR
33030  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33031        CALL DPWRST('XXX','BUG ')
33032        GOTO9000
33033      ELSEIF(DC.LE.0.0D0)THEN
33034        WRITE(ICOUT,125)
33035  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU4PPF ',
33036     1         'NON-POSITIVE.')
33037        CALL DPWRST('XXX','BUG ')
33038        WRITE(ICOUT,147)DC
33039        CALL DPWRST('XXX','BUG ')
33040        GOTO9000
33041      ENDIF
33042C
33043C               **************************************************
33044C               **  STEP 2B-                                    **
33045C               **  COMPUTE BURR TYPE 4 PPF                     **
33046C               **************************************************
33047C
33048      IF(DP.LE.0.0D0)THEN
33049        DPPF=0.0D0
33050      ELSE
33051        DPPF=DC/(1.0D0 + (DP**(-1.0D0/DR) - 1.0D0)**DC)
33052      ENDIF
33053C
33054 9000 CONTINUE
33055      RETURN
33056      END
33057      SUBROUTINE BU4RAN(N,R,C,ISEED,X)
33058C
33059C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
33060C              FROM THE BURR TYPE 4 DISTRIBUTION WITH
33061C              SHAPE PARAMETERS R AND C.
33062C
33063C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
33064C                                OF RANDOM NUMBERS TO BE
33065C                                GENERATED.
33066C                     --R      = THE SINGLE PRECISION VALUE OF THE
33067C                                SHAPE PARAMETER R.
33068C                     --C     = THE SINGLE PRECISION VALUE OF THE
33069C                                SHAPE PARAMETER K.
33070C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
33071C                                (OF DIMENSION AT LEAST N)
33072C                                INTO WHICH THE GENERATED
33073C                                RANDOM SAMPLE WILL BE PLACED.
33074C     OUTPUT--A RANDOM SAMPLE OF SIZE N
33075C             FROM THE BURR TYPE 4 DISTRIBUTION
33076C             WITH SHAPE PARAMETERS R AND C.
33077C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33078C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
33079C                   OF N FOR THIS SUBROUTINE.
33080C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU4PPF.
33081C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33082C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
33083C     LANGUAGE--ANSI FORTRAN (1977)
33084C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33085C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33086C                 JOHN WILEY, 1994, PP. 53-54.
33087C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33088C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33089C     WRITTEN BY--JAMES J. FILLIBEN
33090C                 STATISTICAL ENGINEERING DIVISION
33091C                 INFORMATION TECHMOLOGY LABORATORY
33092C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33093C                 GAITHERSBURG, MD 20899-8980
33094C                 PHONE--301-975-2855
33095C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33096C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
33097C     LANGUAGE--ANSI FORTRAN (1977)
33098C     VERSION NUMBER--2007.10
33099C     ORIGINAL VERSION--OCTOBER   2007.
33100C
33101C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33102C
33103C---------------------------------------------------------------------
33104C
33105      DIMENSION X(*)
33106C
33107      DOUBLE PRECISION DTEMP
33108C
33109C---------------------------------------------------------------------
33110C
33111      INCLUDE 'DPCOP2.INC'
33112C
33113C-----START POINT-----------------------------------------------------
33114C
33115C     CHECK THE INPUT ARGUMENTS FOR ERRORS
33116C
33117      IF(N.LT.1)THEN
33118        WRITE(ICOUT, 5)
33119        CALL DPWRST('XXX','BUG ')
33120        WRITE(ICOUT,47)N
33121        CALL DPWRST('XXX','BUG ')
33122        GOTO9000
33123    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
33124     1         'BURR TYPE 4 RANDOM NUMBERS IS NON-POSITIVE')
33125   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
33126      ELSEIF(R.LE.0.0)THEN
33127        WRITE(ICOUT,201)
33128        CALL DPWRST('XXX','BUG ')
33129        WRITE(ICOUT,203)R
33130        CALL DPWRST('XXX','BUG ')
33131        GOTO9000
33132  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
33133  203   FORMAT('      THE VALUE OF R IS ',G15.7)
33134      ELSEIF(C.LE.0.0)THEN
33135        WRITE(ICOUT,211)
33136        CALL DPWRST('XXX','BUG ')
33137        WRITE(ICOUT,213)C
33138        CALL DPWRST('XXX','BUG ')
33139        GOTO9000
33140  211   FORMAT('***** ERROR--THE C SHAPE PARAMETER IS NON-POSITIVE.')
33141  213   FORMAT('      THE VALUE OF C IS ',G15.7)
33142      ENDIF
33143C
33144C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
33145C
33146      CALL UNIRAN(N,ISEED,X)
33147C
33148C     GENERATE N SLOPE DISTRIBUTION RANDOM
33149C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
33150C
33151      DO300I=1,N
33152        CALL BU4PPF(DBLE(X(I)),DBLE(R),DBLE(C),DTEMP)
33153        X(I)=DBLE(DTEMP)
33154  300 CONTINUE
33155C
33156 9000 CONTINUE
33157      RETURN
33158      END
33159      SUBROUTINE BU5CDF(DX,DR,DK,DCDF)
33160C
33161C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
33162C              FUNCTION VALUE FOR THE BURR TYPE 5 DISTRIBTION.
33163C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
33164C
33165C              F(X;R,K) = (1 + K*EXP(-TAN(X)))**(-R)
33166C              -PI/2 <  X <  PI/2; R, K > 0
33167C
33168C              WITH SHAPE PARAMETERS R AND K.
33169C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
33170C                                WHICH THE CUMULATIVE DISTRIBUTION
33171C                                FUNCTION IS TO BE EVALUATED.
33172C                     --DR     = THE FIRST SHAPE PARAMETER
33173C                     --DK     = THE SECOND SHAPE PARAMETER
33174C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
33175C                                DISTRIBUTION FUNCTION VALUE.
33176C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
33177C             FUNCTION VALUE CDF FOR THE BURR TYPE 5 DISTRIBUTION
33178C             WITH SHAPE PARAMETERS R AND K.
33179C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33180C     RESTRICTIONS--NONE.
33181C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33182C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33183C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33184C     LANGUAGE--ANSI FORTRAN (1977)
33185C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33186C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33187C                 JOHN WILEY, 1994, PP. 53-54.
33188C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33189C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33190C     WRITTEN BY--JAMES J. FILLIBEN
33191C                 STATISTICAL ENGINEERING DIVISION
33192C                 INFORMATION TECHNOLOGY LABORATORY
33193C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33194C                 GAITHERSBURG, MD 20899-8980
33195C                 PHONE--301-975-2855
33196C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33197C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33198C     LANGUAGE--ANSI FORTRAN (1977)
33199C     VERSION NUMBER--2007.10
33200C     ORIGINAL VERSION--OCTOBER   2007.
33201C
33202C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33203C
33204C---------------------------------------------------------------------
33205C
33206      DOUBLE PRECISION DCDF
33207      DOUBLE PRECISION DX
33208      DOUBLE PRECISION DR
33209      DOUBLE PRECISION DK
33210      DOUBLE PRECISION DTERM1
33211      DOUBLE PRECISION DTERM2
33212      DOUBLE PRECISION DPI
33213C
33214C---------------------------------------------------------------------
33215C
33216      INCLUDE 'DPCOP2.INC'
33217C
33218C-----DATA STATEMENTS-------------------------------------------------
33219C
33220      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
33221C
33222C-----START POINT-----------------------------------------------------
33223C
33224C               ********************************************
33225C               **  STEP 1--                              **
33226C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33227C               ********************************************
33228C
33229      DCDF=0.0D0
33230C
33231      IF(DR.LE.0.0D0)THEN
33232        WRITE(ICOUT,115)
33233  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU5CDF ',
33234     1         'IS NON-POSITIVE.')
33235        CALL DPWRST('XXX','BUG ')
33236        WRITE(ICOUT,147)DR
33237  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33238        CALL DPWRST('XXX','BUG ')
33239        GOTO9000
33240      ELSEIF(DK.LE.0.0D0)THEN
33241        WRITE(ICOUT,125)
33242  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU5CDF ',
33243     1         'IS NON-POSITIVE.')
33244        CALL DPWRST('XXX','BUG ')
33245        WRITE(ICOUT,147)DK
33246        CALL DPWRST('XXX','BUG ')
33247        GOTO9000
33248      ENDIF
33249C
33250C               **************************************************
33251C               **  STEP 2B-                                    **
33252C               **  COMPUTE BURR TYPE 5 CDF                     **
33253C               **************************************************
33254C
33255      DTERM1=DPI/2.0D0
33256      IF(DX.LE.-DTERM1)THEN
33257        DCDF=0.0D0
33258      ELSEIF(DX.GE.DTERM1)THEN
33259        DCDF=1.0D0
33260      ELSE
33261        DTERM2=DEXP(-DTAN(DX))
33262        DCDF=(1.0D0 + DK*DTERM2)**(-DR)
33263      ENDIF
33264C
33265 9000 CONTINUE
33266      RETURN
33267      END
33268      SUBROUTINE BU5PDF(DX,DR,DK,DPDF)
33269C
33270C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
33271C              FUNCTION VALUE FOR THE BURR TYPE 5 DISTRIBTION.
33272C              THE PROBABILITY DENSITY FUNCTION IS:
33273C
33274C              f(X;R,K) = R*K*(1 + K/(EXP(TAN(X))**(-R-1)*SEC(X)**2/
33275C                         EXP(TAN(X))
33276C              X >  0; R, K > 0
33277C
33278C              WITH SHAPE PARAMETERS R AND K.
33279C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
33280C                                WHICH THE PROBABILITY DENSITY
33281C                                FUNCTION IS TO BE EVALUATED.
33282C                     --DR     = THE FIRST SHAPE PARAMETER
33283C                     --DK     = THE SECOND SHAPE PARAMETER
33284C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
33285C                                DENSITY FUNCTION VALUE.
33286C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
33287C             FUNCTION VALUE PDF FOR THE BURR TYPE 5 DISTRIBUTION
33288C             WITH SHAPE PARAMETERS R AND K.
33289C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33290C     RESTRICTIONS--NONE.
33291C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33292C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, TAN, SEC.
33293C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33294C     LANGUAGE--ANSI FORTRAN (1977)
33295C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33296C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33297C                 JOHN WILEY, 1994, PP. 53-54.
33298C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33299C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33300C     WRITTEN BY--JAMES J. FILLIBEN
33301C                 STATISTICAL ENGINEERING DIVISION
33302C                 INFORMATION TECHNOLOGY LABORATORY
33303C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33304C                 GAITHERSBURG, MD 20899-8980
33305C                 PHONE--301-975-2855
33306C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33307C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33308C     LANGUAGE--ANSI FORTRAN (1977)
33309C     VERSION NUMBER--2007.10
33310C     ORIGINAL VERSION--OCTOBER   2007.
33311C
33312C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33313C
33314C---------------------------------------------------------------------
33315C
33316      DOUBLE PRECISION DPDF
33317      DOUBLE PRECISION DX
33318      DOUBLE PRECISION DR
33319      DOUBLE PRECISION DK
33320      DOUBLE PRECISION DTERM1
33321      DOUBLE PRECISION DTERM2
33322      DOUBLE PRECISION DTERM3
33323      DOUBLE PRECISION DTERM4
33324      DOUBLE PRECISION DPI
33325      DOUBLE PRECISION DLIM
33326C
33327C---------------------------------------------------------------------
33328C
33329      INCLUDE 'DPCOP2.INC'
33330C
33331C-----DATA STATEMENTS-------------------------------------------------
33332C
33333      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
33334C
33335C-----START POINT-----------------------------------------------------
33336C
33337C               ********************************************
33338C               **  STEP 1--                              **
33339C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33340C               ********************************************
33341C
33342      DPDF=0.0D0
33343C
33344      DLIM=DPI/2.0D0
33345C
33346      IF(DX.LE.-DLIM .OR. DX.GE.DLIM)THEN
33347        WRITE(ICOUT,105)
33348  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU5PDF ',
33349     1         'IS OUTSIDE THE (-PI/2,PI/2) INTERVAL.')
33350        CALL DPWRST('XXX','BUG ')
33351        WRITE(ICOUT,147)DX
33352        CALL DPWRST('XXX','BUG ')
33353        GOTO9000
33354      ELSEIF(DR.LE.0.0D0)THEN
33355        WRITE(ICOUT,115)
33356  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU5PDF ',
33357     1         'IS NON-POSITIVE.')
33358        CALL DPWRST('XXX','BUG ')
33359        WRITE(ICOUT,147)DR
33360  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33361        CALL DPWRST('XXX','BUG ')
33362        GOTO9000
33363      ELSEIF(DK.LE.0.0D0)THEN
33364        WRITE(ICOUT,125)
33365  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU5PDF ',
33366     1         'IS NON-POSITIVE.')
33367        CALL DPWRST('XXX','BUG ')
33368        WRITE(ICOUT,147)DK
33369        CALL DPWRST('XXX','BUG ')
33370        GOTO9000
33371      ENDIF
33372C
33373C               **************************************************
33374C               **  STEP 2B-                                    **
33375C               **  COMPUTE BURR TYPE 5 PDF                     **
33376C               **************************************************
33377C
33378      DTERM1=DEXP(DTAN(DX))
33379      IF(DTERM1.NE.0.0D0)THEN
33380        DTERM2=1.0D0 + DK/DTERM1
33381      ELSE
33382        DPDF=0.0D0
33383        GOTO9000
33384      ENDIF
33385      DTERM3=1.0D0/DCOS(DX)
33386      DTERM4=DLOG(DR) + DLOG(DK) + (-DR-1.0D0)*DLOG(DTERM2) +
33387     1       2.0D0*DLOG(DTERM3)
33388      DPDF=DEXP(DTERM4 - DLOG(DTERM1))
33389C
33390 9000 CONTINUE
33391      RETURN
33392      END
33393      SUBROUTINE BU5PPF(DP,DR,DK,DPPF)
33394C
33395C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
33396C              FUNCTION VALUE FOR THE BURR TYPE 5 DISTRIBUTION.
33397C              THE PERCENT POINT FUNCTION IS:
33398C
33399C              G(P;R,K) = ARCTAN{-LOG((P**(-1/R) - 1)/K)}
33400C                         0 < P < 1; R, K > 0
33401C
33402C              WITH SHAPE PARAMETERS R AND K.
33403C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
33404C                                WHICH THE PERCENT POINT
33405C                                FUNCTION IS TO BE EVALUATED.
33406C                     --DR     = THE FIRST SHAPE PARAMETER
33407C                     --DK     = THE SECOND SHAPE PARAMETER
33408C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
33409C                                FUNCTION VALUE.
33410C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
33411C             FUNCTION VALUE PPF FOR THE BURR TYPE 5 DISTRIBUTION
33412C             WITH SHAPE PARAMETERS R AND K.
33413C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33414C     RESTRICTIONS--NONE.
33415C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33416C     FORTRAN LIBRARY SUBROUTINES NEEDED--ARCTAN, LOG.
33417C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33418C     LANGUAGE--ANSI FORTRAN (1977)
33419C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33420C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33421C                 JOHN WILEY, 1994, PP. 53-54.
33422C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33423C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33424C     WRITTEN BY--JAMES J. FILLIBEN
33425C                 STATISTICAL ENGINEERING DIVISION
33426C                 INFORMATION TECHNOLOGY LABORATORY
33427C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33428C                 GAITHERSBURG, MD 20899-8980
33429C                 PHONE--301-975-2855
33430C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33431C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33432C     LANGUAGE--ANSI FORTRAN (1977)
33433C     VERSION NUMBER--2007.10
33434C     ORIGINAL VERSION--OCTOBER   2007.
33435C
33436C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33437C
33438C---------------------------------------------------------------------
33439C
33440      DOUBLE PRECISION DPPF
33441      DOUBLE PRECISION DP
33442      DOUBLE PRECISION DR
33443      DOUBLE PRECISION DK
33444      DOUBLE PRECISION DTERM1
33445C
33446C---------------------------------------------------------------------
33447C
33448      INCLUDE 'DPCOP2.INC'
33449C
33450C-----DATA STATEMENTS-------------------------------------------------
33451C
33452C-----START POINT-----------------------------------------------------
33453C
33454C               ********************************************
33455C               **  STEP 1--                              **
33456C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33457C               ********************************************
33458C
33459      DPPF=0.0D0
33460C
33461      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
33462        WRITE(ICOUT,105)
33463  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU5PPF ',
33464     1         'IS OUTSIDE THE (0,1) INTERVAL.')
33465        CALL DPWRST('XXX','BUG ')
33466        WRITE(ICOUT,147)DP
33467        CALL DPWRST('XXX','BUG ')
33468        GOTO9000
33469      ELSEIF(DR.LE.0.0D0)THEN
33470        WRITE(ICOUT,115)
33471  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU5PPF ',
33472     1         'IS NON-POSITIVE.')
33473        CALL DPWRST('XXX','BUG ')
33474        WRITE(ICOUT,147)DR
33475  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33476        CALL DPWRST('XXX','BUG ')
33477        GOTO9000
33478      ELSEIF(DK.LE.0.0D0)THEN
33479        WRITE(ICOUT,125)
33480  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU5PPF ',
33481     1         'IS NON-POSITIVE.')
33482        CALL DPWRST('XXX','BUG ')
33483        WRITE(ICOUT,147)DK
33484        CALL DPWRST('XXX','BUG ')
33485        GOTO9000
33486      ENDIF
33487C
33488C               **************************************************
33489C               **  STEP 2B-                                    **
33490C               **  COMPUTE BURR TYPE 5 PPF                     **
33491C               **************************************************
33492C
33493      DTERM1=(DP**(-1.0D0/DR) - 1.0D0)/DK
33494      DPPF=DATAN(-DLOG(DTERM1))
33495C
33496 9000 CONTINUE
33497      RETURN
33498      END
33499      SUBROUTINE BU5RAN(N,R,AK,ISEED,X)
33500C
33501C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
33502C              FROM THE BURR TYPE 5 DISTRIBUTION WITH
33503C              SHAPE PARAMETERS R AND K.
33504C
33505C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
33506C                                OF RANDOM NUMBERS TO BE
33507C                                GENERATED.
33508C                     --R      = THE SINGLE PRECISION VALUE OF THE
33509C                                SHAPE PARAMETER R.
33510C                     --K      = THE SINGLE PRECISION VALUE OF THE
33511C                                SHAPE PARAMETER K.
33512C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
33513C                                (OF DIMENSION AT LEAST N)
33514C                                INTO WHICH THE GENERATED
33515C                                RANDOM SAMPLE WILL BE PLACED.
33516C     OUTPUT--A RANDOM SAMPLE OF SIZE N
33517C             FROM THE BURR TYPE 5 DISTRIBUTION
33518C             WITH SHAPE PARAMETERS R AND K.
33519C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33520C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
33521C                   OF N FOR THIS SUBROUTINE.
33522C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU5PPF.
33523C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33524C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
33525C     LANGUAGE--ANSI FORTRAN (1977)
33526C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33527C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33528C                 JOHN WILEY, 1994, PP. 53-54.
33529C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33530C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33531C     WRITTEN BY--JAMES J. FILLIBEN
33532C                 STATISTICAL ENGINEERING DIVISION
33533C                 INFORMATION TECHMOLOGY LABORATORY
33534C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33535C                 GAITHERSBURG, MD 20899-8980
33536C                 PHONE--301-975-2855
33537C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33538C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
33539C     LANGUAGE--ANSI FORTRAN (1977)
33540C     VERSION NUMBER--2007.10
33541C     ORIGINAL VERSION--OCTOBER   2007.
33542C
33543C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33544C
33545C---------------------------------------------------------------------
33546C
33547      DIMENSION X(*)
33548C
33549      DOUBLE PRECISION DTEMP
33550C
33551C---------------------------------------------------------------------
33552C
33553      INCLUDE 'DPCOP2.INC'
33554C
33555C-----START POINT-----------------------------------------------------
33556C
33557C     CHECK THE INPUT ARGUMENTS FOR ERRORS
33558C
33559      IF(N.LT.1)THEN
33560        WRITE(ICOUT, 5)
33561        CALL DPWRST('XXX','BUG ')
33562        WRITE(ICOUT,47)N
33563        CALL DPWRST('XXX','BUG ')
33564        GOTO9000
33565    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
33566     1         'BURR TYPE 5 RANDOM NUMBERS IS NON-POSITIVE')
33567   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
33568      ELSEIF(R.LE.0.0)THEN
33569        WRITE(ICOUT,201)
33570        CALL DPWRST('XXX','BUG ')
33571        WRITE(ICOUT,203)R
33572        CALL DPWRST('XXX','BUG ')
33573        GOTO9000
33574  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
33575  203   FORMAT('      THE VALUE OF R IS ',G15.7)
33576      ELSEIF(AK.LE.0.0)THEN
33577        WRITE(ICOUT,211)
33578        CALL DPWRST('XXX','BUG ')
33579        WRITE(ICOUT,213)AK
33580        CALL DPWRST('XXX','BUG ')
33581        GOTO9000
33582  211   FORMAT('***** ERROR--THE K SHAPE PARAMETER IS NON-POSITIVE.')
33583  213   FORMAT('      THE VALUE OF K IS ',G15.7)
33584      ENDIF
33585C
33586C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
33587C
33588      CALL UNIRAN(N,ISEED,X)
33589C
33590C     GENERATE N SLOPE DISTRIBUTION RANDOM
33591C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
33592C
33593      DO300I=1,N
33594        CALL BU5PPF(DBLE(X(I)),DBLE(R),DBLE(AK),DTEMP)
33595        X(I)=DBLE(DTEMP)
33596  300 CONTINUE
33597C
33598 9000 CONTINUE
33599      RETURN
33600      END
33601      SUBROUTINE BU6CDF(DX,DR,DK,DCDF)
33602C
33603C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
33604C              FUNCTION VALUE FOR THE BURR TYPE 6 DISTRIBTION.
33605C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
33606C
33607C              F(X;R,K) = (1 + K*EXP(-SINH(X)))**(-R)
33608C              -INF <  X <  INF; R, K > 0
33609C
33610C              WITH SHAPE PARAMETERS R AND K.
33611C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
33612C                                WHICH THE CUMULATIVE DISTRIBUTION
33613C                                FUNCTION IS TO BE EVALUATED.
33614C                     --DR     = THE FIRST SHAPE PARAMETER
33615C                     --DK     = THE SECOND SHAPE PARAMETER
33616C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
33617C                                DISTRIBUTION FUNCTION VALUE.
33618C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
33619C             FUNCTION VALUE CDF FOR THE BURR TYPE 6 DISTRIBUTION
33620C             WITH SHAPE PARAMETERS R AND K.
33621C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33622C     RESTRICTIONS--NONE.
33623C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33624C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33625C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33626C     LANGUAGE--ANSI FORTRAN (1977)
33627C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33628C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33629C                 JOHN WILEY, 1994, PP. 53-54.
33630C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33631C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33632C     WRITTEN BY--JAMES J. FILLIBEN
33633C                 STATISTICAL ENGINEERING DIVISION
33634C                 INFORMATION TECHNOLOGY LABORATORY
33635C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33636C                 GAITHERSBURG, MD 20899-8980
33637C                 PHONE--301-975-2855
33638C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33639C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33640C     LANGUAGE--ANSI FORTRAN (1977)
33641C     VERSION NUMBER--2007.10
33642C     ORIGINAL VERSION--OCTOBER   2007.
33643C
33644C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33645C
33646C---------------------------------------------------------------------
33647C
33648      DOUBLE PRECISION DCDF
33649      DOUBLE PRECISION DX
33650      DOUBLE PRECISION DR
33651      DOUBLE PRECISION DK
33652      DOUBLE PRECISION DTERM1
33653      DOUBLE PRECISION DTERM2
33654C
33655C---------------------------------------------------------------------
33656C
33657      INCLUDE 'DPCOP2.INC'
33658C
33659C-----DATA STATEMENTS-------------------------------------------------
33660C
33661CCCCC DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
33662C
33663C-----START POINT-----------------------------------------------------
33664C
33665C               ********************************************
33666C               **  STEP 1--                              **
33667C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33668C               ********************************************
33669C
33670      DCDF=0.0D0
33671C
33672      IF(DR.LE.0.0D0)THEN
33673        WRITE(ICOUT,115)
33674  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU6CDF ',
33675     1         'IS NON-POSITIVE.')
33676        CALL DPWRST('XXX','BUG ')
33677        WRITE(ICOUT,147)DR
33678  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33679        CALL DPWRST('XXX','BUG ')
33680        GOTO9000
33681      ELSEIF(DK.LE.0.0D0)THEN
33682        WRITE(ICOUT,125)
33683  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU6CDF ',
33684     1         'IS NON-POSITIVE.')
33685        CALL DPWRST('XXX','BUG ')
33686        WRITE(ICOUT,147)DK
33687        CALL DPWRST('XXX','BUG ')
33688        GOTO9000
33689      ENDIF
33690C
33691C               **************************************************
33692C               **  STEP 2B-                                    **
33693C               **  COMPUTE BURR TYPE 6 CDF                     **
33694C               **************************************************
33695C
33696      DTERM1=(DEXP(DX)-DEXP(-DX))/2.0D0
33697      DTERM2=DEXP(-DTERM1)
33698      DCDF=(1.0D0 + DK*DTERM2)**(-DR)
33699C
33700 9000 CONTINUE
33701      RETURN
33702      END
33703      SUBROUTINE BU6PDF(DX,DR,DK,DPDF)
33704C
33705C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
33706C              FUNCTION VALUE FOR THE BURR TYPE 6 DISTRIBTION.
33707C              THE PROBABILITY DENSITY FUNCTION IS:
33708C
33709C              f(X;R,K) = R*K*(1 + K/EXP(SINH(X)))**(-R-1)*COSH(X)/
33710C                         EXP(SINH(X))
33711C              -INF <  X <  INF; R, K > 0
33712C
33713C              WITH SHAPE PARAMETERS R AND K.
33714C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
33715C                                WHICH THE PROBABILITY DENSITY
33716C                                FUNCTION IS TO BE EVALUATED.
33717C                     --DR     = THE FIRST SHAPE PARAMETER
33718C                     --DK     = THE SECOND SHAPE PARAMETER
33719C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
33720C                                DENSITY FUNCTION VALUE.
33721C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
33722C             FUNCTION VALUE PDF FOR THE BURR TYPE 6 DISTRIBUTION
33723C             WITH SHAPE PARAMETERS R AND K.
33724C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33725C     RESTRICTIONS--NONE.
33726C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33727C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33728C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33729C     LANGUAGE--ANSI FORTRAN (1977)
33730C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33731C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33732C                 JOHN WILEY, 1994, PP. 53-54.
33733C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33734C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33735C     WRITTEN BY--JAMES J. FILLIBEN
33736C                 STATISTICAL ENGINEERING DIVISION
33737C                 INFORMATION TECHNOLOGY LABORATORY
33738C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33739C                 GAITHERSBURG, MD 20899-8980
33740C                 PHONE--301-975-2855
33741C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33742C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33743C     LANGUAGE--ANSI FORTRAN (1977)
33744C     VERSION NUMBER--2007.10
33745C     ORIGINAL VERSION--OCTOBER   2007.
33746C
33747C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33748C
33749C---------------------------------------------------------------------
33750C
33751      DOUBLE PRECISION DPDF
33752      DOUBLE PRECISION DX
33753      DOUBLE PRECISION DR
33754      DOUBLE PRECISION DK
33755      DOUBLE PRECISION DTERM1
33756      DOUBLE PRECISION DTERM2
33757      DOUBLE PRECISION DTERM3
33758      DOUBLE PRECISION DTERM4
33759      DOUBLE PRECISION DTERM5
33760      DOUBLE PRECISION DTERM6
33761C
33762C---------------------------------------------------------------------
33763C
33764      INCLUDE 'DPCOP2.INC'
33765C
33766C-----DATA STATEMENTS-------------------------------------------------
33767C
33768CCCCC DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
33769C
33770C-----START POINT-----------------------------------------------------
33771C
33772C               ********************************************
33773C               **  STEP 1--                              **
33774C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33775C               ********************************************
33776C
33777      DPDF=0.0D0
33778C
33779      IF(DR.LE.0.0D0)THEN
33780        WRITE(ICOUT,115)
33781  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU6PDF ',
33782     1         'IS NON-POSITIVE.')
33783        CALL DPWRST('XXX','BUG ')
33784        WRITE(ICOUT,147)DR
33785  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33786        CALL DPWRST('XXX','BUG ')
33787        GOTO9000
33788      ELSEIF(DK.LE.0.0D0)THEN
33789        WRITE(ICOUT,125)
33790  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU6PDF ',
33791     1         'IS NON-POSITIVE.')
33792        CALL DPWRST('XXX','BUG ')
33793        WRITE(ICOUT,147)DK
33794        CALL DPWRST('XXX','BUG ')
33795        GOTO9000
33796      ENDIF
33797C
33798C               **************************************************
33799C               **  STEP 2B-                                    **
33800C               **  COMPUTE BURR TYPE 6 PDF                     **
33801C               **************************************************
33802C
33803      DTERM1=(DEXP(DX)-DEXP(-DX))/2.0D0
33804      DTERM2=DEXP(DTERM1)
33805      DTERM3=(-DR-1.0D0)*DLOG(1.0D0 + DK/DTERM2)
33806      DTERM4=(DEXP(DX)+DEXP(-DX))/2.0D0
33807      DTERM5=DLOG(DTERM4)
33808      DTERM6=DLOG(DR) + DLOG(DK) + DTERM3 + DTERM5 - DTERM1
33809      DPDF=DEXP(DTERM6)
33810C
33811 9000 CONTINUE
33812      RETURN
33813      END
33814      SUBROUTINE BU6PPF(DP,DR,DK,DPPF)
33815C
33816C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
33817C              FUNCTION VALUE FOR THE BURR TYPE 6 DISTRIBUTION.
33818C              THE PERCENT POINT FUNCTION IS:
33819C
33820C              G(P;R,K) = ARCSINH{-LOG((P**(-1/R) - 1)/K)}
33821C                         0 < P < 1; R, K > 0
33822C
33823C              WITH SHAPE PARAMETERS R AND K.
33824C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
33825C                                WHICH THE PERCENT POINT
33826C                                FUNCTION IS TO BE EVALUATED.
33827C                     --DR     = THE FIRST SHAPE PARAMETER
33828C                     --DK     = THE SECOND SHAPE PARAMETER
33829C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
33830C                                FUNCTION VALUE.
33831C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
33832C             FUNCTION VALUE PPF FOR THE BURR TYPE 6 DISTRIBUTION
33833C             WITH SHAPE PARAMETERS R AND K.
33834C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33835C     RESTRICTIONS--NONE.
33836C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
33837C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, LOG.
33838C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
33839C     LANGUAGE--ANSI FORTRAN (1977)
33840C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33841C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33842C                 JOHN WILEY, 1994, PP. 53-54.
33843C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33844C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33845C     WRITTEN BY--JAMES J. FILLIBEN
33846C                 STATISTICAL ENGINEERING DIVISION
33847C                 INFORMATION TECHNOLOGY LABORATORY
33848C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33849C                 GAITHERSBURG, MD 20899-8980
33850C                 PHONE--301-975-2855
33851C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33852C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
33853C     LANGUAGE--ANSI FORTRAN (1977)
33854C     VERSION NUMBER--2007.10
33855C     ORIGINAL VERSION--OCTOBER   2007.
33856C
33857C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33858C
33859C---------------------------------------------------------------------
33860C
33861      DOUBLE PRECISION DPPF
33862      DOUBLE PRECISION DP
33863      DOUBLE PRECISION DR
33864      DOUBLE PRECISION DK
33865      DOUBLE PRECISION DTERM1
33866      DOUBLE PRECISION DTERM2
33867      DOUBLE PRECISION DTERM3
33868C
33869C---------------------------------------------------------------------
33870C
33871      INCLUDE 'DPCOP2.INC'
33872C
33873C-----DATA STATEMENTS-------------------------------------------------
33874C
33875C-----START POINT-----------------------------------------------------
33876C
33877C               ********************************************
33878C               **  STEP 1--                              **
33879C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
33880C               ********************************************
33881C
33882      DPPF=0.0D0
33883C
33884      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
33885        WRITE(ICOUT,105)
33886  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU6PPF ',
33887     1         'IS OUTSIDE THE (0,1) INTERVAL.')
33888        CALL DPWRST('XXX','BUG ')
33889        WRITE(ICOUT,147)DP
33890        CALL DPWRST('XXX','BUG ')
33891        GOTO9000
33892      ELSEIF(DR.LE.0.0D0)THEN
33893        WRITE(ICOUT,115)
33894  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU6PPF ',
33895     1         'IS NON-POSITIVE.')
33896        CALL DPWRST('XXX','BUG ')
33897        WRITE(ICOUT,147)DR
33898  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
33899        CALL DPWRST('XXX','BUG ')
33900        GOTO9000
33901      ELSEIF(DK.LE.0.0D0)THEN
33902        WRITE(ICOUT,125)
33903  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU6PPF ',
33904     1         'IS NON-POSITIVE.')
33905        CALL DPWRST('XXX','BUG ')
33906        WRITE(ICOUT,147)DK
33907        CALL DPWRST('XXX','BUG ')
33908        GOTO9000
33909      ENDIF
33910C
33911C               **************************************************
33912C               **  STEP 2B-                                    **
33913C               **  COMPUTE BURR TYPE 6 PPF                     **
33914C               **************************************************
33915C
33916      DTERM1=(DP**(-1.0D0/DR) - 1.0D0)/DK
33917      DTERM2=-DLOG(DTERM1)
33918      DTERM3=DTERM2+DSQRT(DTERM2*DTERM2+1.0D0)
33919      DPPF=DLOG(DTERM3)
33920C
33921 9000 CONTINUE
33922      RETURN
33923      END
33924      SUBROUTINE BU6RAN(N,R,AK,ISEED,X)
33925C
33926C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
33927C              FROM THE BURR TYPE 6 DISTRIBUTION WITH
33928C              SHAPE PARAMETERS R AND K.
33929C
33930C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
33931C                                OF RANDOM NUMBERS TO BE
33932C                                GENERATED.
33933C                     --R      = THE SINGLE PRECISION VALUE OF THE
33934C                                SHAPE PARAMETER R.
33935C                     --K      = THE SINGLE PRECISION VALUE OF THE
33936C                                SHAPE PARAMETER K.
33937C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
33938C                                (OF DIMENSION AT LEAST N)
33939C                                INTO WHICH THE GENERATED
33940C                                RANDOM SAMPLE WILL BE PLACED.
33941C     OUTPUT--A RANDOM SAMPLE OF SIZE N
33942C             FROM THE BURR TYPE 6 DISTRIBUTION
33943C             WITH SHAPE PARAMETERS R AND K.
33944C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
33945C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
33946C                   OF N FOR THIS SUBROUTINE.
33947C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU6PPF.
33948C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
33949C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
33950C     LANGUAGE--ANSI FORTRAN (1977)
33951C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
33952C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
33953C                 JOHN WILEY, 1994, PP. 53-54.
33954C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
33955C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
33956C     WRITTEN BY--JAMES J. FILLIBEN
33957C                 STATISTICAL ENGINEERING DIVISION
33958C                 INFORMATION TECHMOLOGY LABORATORY
33959C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
33960C                 GAITHERSBURG, MD 20899-8980
33961C                 PHONE--301-975-2855
33962C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
33963C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
33964C     LANGUAGE--ANSI FORTRAN (1977)
33965C     VERSION NUMBER--2007.10
33966C     ORIGINAL VERSION--OCTOBER   2007.
33967C
33968C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
33969C
33970C---------------------------------------------------------------------
33971C
33972      DIMENSION X(*)
33973C
33974      DOUBLE PRECISION DTEMP
33975C
33976C---------------------------------------------------------------------
33977C
33978      INCLUDE 'DPCOP2.INC'
33979C
33980C-----START POINT-----------------------------------------------------
33981C
33982C     CHECK THE INPUT ARGUMENTS FOR ERRORS
33983C
33984      IF(N.LT.1)THEN
33985        WRITE(ICOUT, 5)
33986        CALL DPWRST('XXX','BUG ')
33987        WRITE(ICOUT,47)N
33988        CALL DPWRST('XXX','BUG ')
33989        GOTO9000
33990    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
33991     1         'BURR TYPE 6 RANDOM NUMBERS IS NON-POSITIVE')
33992   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
33993      ELSEIF(R.LE.0.0)THEN
33994        WRITE(ICOUT,201)
33995        CALL DPWRST('XXX','BUG ')
33996        WRITE(ICOUT,203)R
33997        CALL DPWRST('XXX','BUG ')
33998        GOTO9000
33999  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
34000  203   FORMAT('      THE VALUE OF R IS ',G15.7)
34001      ELSEIF(AK.LE.0.0)THEN
34002        WRITE(ICOUT,211)
34003        CALL DPWRST('XXX','BUG ')
34004        WRITE(ICOUT,213)AK
34005        CALL DPWRST('XXX','BUG ')
34006        GOTO9000
34007  211   FORMAT('***** ERROR--THE K SHAPE PARAMETER IS NON-POSITIVE.')
34008  213   FORMAT('      THE VALUE OF K IS ',G15.7)
34009      ENDIF
34010C
34011C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
34012C
34013      CALL UNIRAN(N,ISEED,X)
34014C
34015C     GENERATE N SLOPE DISTRIBUTION RANDOM
34016C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
34017C
34018      DO300I=1,N
34019        CALL BU6PPF(DBLE(X(I)),DBLE(R),DBLE(AK),DTEMP)
34020        X(I)=DBLE(DTEMP)
34021  300 CONTINUE
34022C
34023 9000 CONTINUE
34024      RETURN
34025      END
34026      SUBROUTINE BU7RAN(N,R,ISEED,X)
34027C
34028C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
34029C              FROM THE BURR TYPE 7 DISTRIBUTION WITH
34030C              SHAPE PARAMETER R.
34031C
34032C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
34033C                                OF RANDOM NUMBERS TO BE
34034C                                GENERATED.
34035C                     --R      = THE SINGLE PRECISION VALUE OF THE
34036C                                SHAPE PARAMETER R.
34037C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
34038C                                (OF DIMENSION AT LEAST N)
34039C                                INTO WHICH THE GENERATED
34040C                                RANDOM SAMPLE WILL BE PLACED.
34041C     OUTPUT--A RANDOM SAMPLE OF SIZE N
34042C             FROM THE BURR TYPE 7 DISTRIBUTION
34043C             WITH SHAPE PARAMETER R.
34044C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34045C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
34046C                   OF N FOR THIS SUBROUTINE.
34047C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU7PPF.
34048C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
34049C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
34050C     LANGUAGE--ANSI FORTRAN (1977)
34051C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34052C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34053C                 JOHN WILEY, 1994, PP. 53-54.
34054C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34055C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34056C     WRITTEN BY--JAMES J. FILLIBEN
34057C                 STATISTICAL ENGINEERING DIVISION
34058C                 INFORMATION TECHMOLOGY LABORATORY
34059C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34060C                 GAITHERSBURG, MD 20899-8980
34061C                 PHONE--301-975-2855
34062C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34063C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
34064C     LANGUAGE--ANSI FORTRAN (1977)
34065C     VERSION NUMBER--2007.10
34066C     ORIGINAL VERSION--OCTOBER   2007.
34067C
34068C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34069C
34070C---------------------------------------------------------------------
34071C
34072      DIMENSION X(*)
34073C
34074      DOUBLE PRECISION DTEMP
34075C
34076C---------------------------------------------------------------------
34077C
34078      INCLUDE 'DPCOP2.INC'
34079C
34080C-----START POINT-----------------------------------------------------
34081C
34082C     CHECK THE INPUT ARGUMENTS FOR ERRORS
34083C
34084      IF(N.LT.1)THEN
34085        WRITE(ICOUT, 5)
34086        CALL DPWRST('XXX','BUG ')
34087        WRITE(ICOUT,47)N
34088        CALL DPWRST('XXX','BUG ')
34089        GOTO9000
34090    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
34091     1         'BURR TYPE 7 RANDOM NUMBERS IS NON-POSITIVE')
34092   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
34093      ELSEIF(R.LE.0.0)THEN
34094        WRITE(ICOUT,201)
34095        CALL DPWRST('XXX','BUG ')
34096        WRITE(ICOUT,203)R
34097        CALL DPWRST('XXX','BUG ')
34098        GOTO9000
34099  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
34100  203   FORMAT('      THE VALUE OF R IS ',G15.7)
34101      ENDIF
34102C
34103C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
34104C
34105      CALL UNIRAN(N,ISEED,X)
34106C
34107C     GENERATE N SLOPE DISTRIBUTION RANDOM
34108C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
34109C
34110      DO300I=1,N
34111        CALL BU7PPF(DBLE(X(I)),DBLE(R),DTEMP)
34112        X(I)=DBLE(DTEMP)
34113  300 CONTINUE
34114C
34115 9000 CONTINUE
34116      RETURN
34117      END
34118      SUBROUTINE BU7CDF(DX,DR,DCDF)
34119C
34120C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
34121C              FUNCTION VALUE FOR THE BURR TYPE 7 DISTRIBTION.
34122C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
34123C
34124C              F(X;R) = 2**(-R)*(1+TANH(X))**R
34125C              -INF <  X <  INF; R > 0
34126C
34127C              WITH SHAPE PARAMETER R.
34128C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34129C                                WHICH THE CUMULATIVE DISTRIBUTION
34130C                                FUNCTION IS TO BE EVALUATED.
34131C                     --DR     = THE SHAPE PARAMETER
34132C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
34133C                                DISTRIBUTION FUNCTION VALUE.
34134C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
34135C             FUNCTION VALUE CDF FOR THE BURR TYPE 7 DISTRIBUTION
34136C             WITH SHAPE PARAMETER R.
34137C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34138C     RESTRICTIONS--NONE.
34139C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34140C     FORTRAN LIBRARY SUBROUTINES NEEDED--TANH.
34141C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34142C     LANGUAGE--ANSI FORTRAN (1977)
34143C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34144C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34145C                 JOHN WILEY, 1994, PP. 53-54.
34146C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34147C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34148C     WRITTEN BY--JAMES J. FILLIBEN
34149C                 STATISTICAL ENGINEERING DIVISION
34150C                 INFORMATION TECHNOLOGY LABORATORY
34151C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34152C                 GAITHERSBURG, MD 20899-8980
34153C                 PHONE--301-975-2855
34154C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34155C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34156C     LANGUAGE--ANSI FORTRAN (1977)
34157C     VERSION NUMBER--2007.10
34158C     ORIGINAL VERSION--OCTOBER   2007.
34159C
34160C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34161C
34162C---------------------------------------------------------------------
34163C
34164      DOUBLE PRECISION DCDF
34165      DOUBLE PRECISION DX
34166      DOUBLE PRECISION DR
34167      DOUBLE PRECISION DTERM1
34168      DOUBLE PRECISION DTERM2
34169C
34170C---------------------------------------------------------------------
34171C
34172      INCLUDE 'DPCOP2.INC'
34173C
34174C-----DATA STATEMENTS-------------------------------------------------
34175C
34176C-----START POINT-----------------------------------------------------
34177C
34178C               ********************************************
34179C               **  STEP 1--                              **
34180C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34181C               ********************************************
34182C
34183      DCDF=0.0D0
34184C
34185      IF(DR.LE.0.0D0)THEN
34186        WRITE(ICOUT,115)
34187  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU7CDF ',
34188     1         'IS NON-POSITIVE.')
34189        CALL DPWRST('XXX','BUG ')
34190        WRITE(ICOUT,147)DR
34191  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34192        CALL DPWRST('XXX','BUG ')
34193        GOTO9000
34194      ENDIF
34195C
34196C               **************************************************
34197C               **  STEP 2B-                                    **
34198C               **  COMPUTE BURR TYPE 7  CDF                    **
34199C               **************************************************
34200C
34201      IF(DX.GT.80.0D0)THEN
34202        DTERM1=1.0D0
34203      ELSEIF(DX.LT.-80.0D0)THEN
34204        DTERM1=-1.0D0
34205      ELSE
34206        DTERM1=(DEXP(DX)-DEXP(-DX))/(DEXP(DX)+DEXP(-DX))
34207      ENDIF
34208      DTERM2=(1.0D0 + DTERM1)**DR
34209      DCDF=(2.0D0**(-DR))*DTERM2
34210C
34211 9000 CONTINUE
34212      RETURN
34213      END
34214      SUBROUTINE BU7PDF(DX,DR,DPDF)
34215C
34216C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
34217C              FUNCTION VALUE FOR THE BURR TYPE 7 DISTRIBTION.
34218C              THE PROBABILITY DENSITY FUNCTION IS:
34219C
34220C              f(X;R) = R*SECH(x)**2*(1+TANH(X))**(R-1)/(2**R)
34221C              -INF <  X <  INF; R > 0
34222C
34223C              WITH SHAPE PARAMETER R.
34224C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34225C                                WHICH THE PROBABILITY DENSITY
34226C                                FUNCTION IS TO BE EVALUATED.
34227C                     --DR     = THE SHAPE PARAMETER
34228C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
34229C                                DENSITY FUNCTION VALUE.
34230C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
34231C             FUNCTION VALUE PDF FOR THE BURR TYPE 7 DISTRIBUTION
34232C             WITH SHAPE PARAMETER R.
34233C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34234C     RESTRICTIONS--NONE.
34235C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34236C     FORTRAN LIBRARY SUBROUTINES NEEDED--TANH, SECH.
34237C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34238C     LANGUAGE--ANSI FORTRAN (1977)
34239C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34240C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34241C                 JOHN WILEY, 1994, PP. 53-54.
34242C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34243C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34244C     WRITTEN BY--JAMES J. FILLIBEN
34245C                 STATISTICAL ENGINEERING DIVISION
34246C                 INFORMATION TECHNOLOGY LABORATORY
34247C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34248C                 GAITHERSBURG, MD 20899-8980
34249C                 PHONE--301-975-2855
34250C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34251C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34252C     LANGUAGE--ANSI FORTRAN (1977)
34253C     VERSION NUMBER--2007.10
34254C     ORIGINAL VERSION--OCTOBER   2007.
34255C
34256C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34257C
34258C---------------------------------------------------------------------
34259C
34260      DOUBLE PRECISION DPDF
34261      DOUBLE PRECISION DX
34262      DOUBLE PRECISION DR
34263      DOUBLE PRECISION DTERM1
34264      DOUBLE PRECISION DTERM2
34265      DOUBLE PRECISION DTERM3
34266      DOUBLE PRECISION DTERM4
34267C
34268C---------------------------------------------------------------------
34269C
34270      INCLUDE 'DPCOP2.INC'
34271C
34272C-----DATA STATEMENTS-------------------------------------------------
34273C
34274C-----START POINT-----------------------------------------------------
34275C
34276C               ********************************************
34277C               **  STEP 1--                              **
34278C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34279C               ********************************************
34280C
34281      DPDF=0.0D0
34282C
34283      IF(DR.LE.0.0D0)THEN
34284        WRITE(ICOUT,115)
34285  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU7PDF ',
34286     1         'IS NON-POSITIVE.')
34287        CALL DPWRST('XXX','BUG ')
34288        WRITE(ICOUT,147)DR
34289  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34290        CALL DPWRST('XXX','BUG ')
34291        GOTO9000
34292      ENDIF
34293C
34294C               **************************************************
34295C               **  STEP 2B-                                    **
34296C               **  COMPUTE BURR TYPE 7  PDF                    **
34297C               **************************************************
34298C
34299      DTERM1=2.0D0/(DEXP(DX)+DEXP(-DX))
34300      DTERM2=(DEXP(DX)-DEXP(-DX))/(DEXP(DX)+DEXP(-DX))
34301      DTERM3=DLOG(DR) + 2.0D0*DLOG(DTERM1) +
34302     1       (DR-1.0D0)*DLOG(1.0D0 + DTERM2)
34303      DTERM4=DR*DLOG(2.0D0)
34304      DPDF=DEXP(DTERM3 - DTERM4)
34305C
34306 9000 CONTINUE
34307      RETURN
34308      END
34309      SUBROUTINE BU7PPF(DP,DR,DPPF)
34310C
34311C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
34312C              FUNCTION VALUE FOR THE BURR TYPE 7 DISTRIBUTION.
34313C              THE PERCENT POINT FUNCTION IS:
34314C
34315C              G(P;R) = ARCTANH((2**R*P)**(1/R) - 1)
34316C                       0 < P < 1; R > 0
34317C
34318C              WITH SHAPE PARAMETER R.
34319C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
34320C                                WHICH THE PERCENT POINT
34321C                                FUNCTION IS TO BE EVALUATED.
34322C                     --DR     = THE SHAPE PARAMETER
34323C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
34324C                                FUNCTION VALUE.
34325C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
34326C             FUNCTION VALUE PPF FOR THE BURR TYPE 7 DISTRIBUTION
34327C             WITH SHAPE PARAMETER R.
34328C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34329C     RESTRICTIONS--NONE.
34330C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34331C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
34332C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34333C     LANGUAGE--ANSI FORTRAN (1977)
34334C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34335C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34336C                 JOHN WILEY, 1994, PP. 53-54.
34337C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34338C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34339C     WRITTEN BY--JAMES J. FILLIBEN
34340C                 STATISTICAL ENGINEERING DIVISION
34341C                 INFORMATION TECHNOLOGY LABORATORY
34342C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34343C                 GAITHERSBURG, MD 20899-8980
34344C                 PHONE--301-975-2855
34345C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34346C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34347C     LANGUAGE--ANSI FORTRAN (1977)
34348C     VERSION NUMBER--2007.10
34349C     ORIGINAL VERSION--OCTOBER   2007.
34350C
34351C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34352C
34353C---------------------------------------------------------------------
34354C
34355      DOUBLE PRECISION DPPF
34356      DOUBLE PRECISION DP
34357      DOUBLE PRECISION DR
34358      DOUBLE PRECISION DTERM1
34359      DOUBLE PRECISION DTERM2
34360C
34361C---------------------------------------------------------------------
34362C
34363      INCLUDE 'DPCOP2.INC'
34364C
34365C-----DATA STATEMENTS-------------------------------------------------
34366C
34367C-----START POINT-----------------------------------------------------
34368C
34369C               ********************************************
34370C               **  STEP 1--                              **
34371C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34372C               ********************************************
34373C
34374      DPPF=0.0D0
34375C
34376      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
34377        WRITE(ICOUT,105)
34378  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU7PPF ',
34379     1         'IS OUTSIDE THE (0,1) INTERVAL.')
34380        CALL DPWRST('XXX','BUG ')
34381        WRITE(ICOUT,147)DP
34382        CALL DPWRST('XXX','BUG ')
34383        GOTO9000
34384      ELSEIF(DR.LE.0.0D0)THEN
34385        WRITE(ICOUT,115)
34386  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU7PPF ',
34387     1         'IS NON-POSITIVE.')
34388        CALL DPWRST('XXX','BUG ')
34389        WRITE(ICOUT,147)DR
34390  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34391        CALL DPWRST('XXX','BUG ')
34392        GOTO9000
34393      ENDIF
34394C
34395C               **************************************************
34396C               **  STEP 2B-                                    **
34397C               **  COMPUTE BURR TYPE 7 PPF                     **
34398C               **************************************************
34399C
34400      DTERM1=((2.0D0**DR)*DP)**(1.0D0/DR) - 1.0D0
34401      IF(DTERM1.GE.1.0D0 .OR. DTERM1.LE.-1.0D0)THEN
34402        WRITE(ICOUT,125)
34403  125   FORMAT('***** ERROR IN BU7PPF--')
34404        CALL DPWRST('XXX','BUG ')
34405        WRITE(ICOUT,126)
34406  126   FORMAT('      ATTEMPT TO TAKE ARCTANH OF A NUMBER ',
34407     1         '>= 1 OR <= -1')
34408        CALL DPWRST('XXX','BUG ')
34409        WRITE(ICOUT,127)
34410  127   FORMAT('      THIS CAN HAPPEN IF BOTH ARGUMENTS ARE ',
34411     1         'SUFFICIENT SMALL')
34412        CALL DPWRST('XXX','BUG ')
34413        WRITE(ICOUT,128)DP
34414  128   FORMAT('      THE VALUE OF THE FIRST ARGUMENT IS ',G15.7)
34415        CALL DPWRST('XXX','BUG ')
34416        WRITE(ICOUT,129)DR
34417  129   FORMAT('      THE VALUE OF THE SECOND ARGUMENT IS ',G15.7)
34418        CALL DPWRST('XXX','BUG ')
34419      ELSE
34420        DTERM2=(1.0D0 + DTERM1)/(1.0D0 - DTERM1)
34421        DPPF=0.5D0*DLOG(DTERM2)
34422      ENDIF
34423C
34424 9000 CONTINUE
34425      RETURN
34426      END
34427      SUBROUTINE BU8CDF(DX,DR,DCDF)
34428C
34429C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
34430C              FUNCTION VALUE FOR THE BURR TYPE 8 DISTRIBTION.
34431C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
34432C
34433C              F(X;R) = ((2/PI)*ARCTAN(EXP(X)))**R
34434C              -INF <  X <  INF; R > 0
34435C
34436C              WITH SHAPE PARAMETER R.
34437C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34438C                                WHICH THE CUMULATIVE DISTRIBUTION
34439C                                FUNCTION IS TO BE EVALUATED.
34440C                     --DR     = THE SHAPE PARAMETER
34441C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
34442C                                DISTRIBUTION FUNCTION VALUE.
34443C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
34444C             FUNCTION VALUE CDF FOR THE BURR TYPE 8 DISTRIBUTION
34445C             WITH SHAPE PARAMETER R.
34446C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34447C     RESTRICTIONS--NONE.
34448C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34449C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP, ARCTAN.
34450C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34451C     LANGUAGE--ANSI FORTRAN (1977)
34452C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34453C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34454C                 JOHN WILEY, 1994, PP. 53-54.
34455C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34456C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34457C     WRITTEN BY--JAMES J. FILLIBEN
34458C                 STATISTICAL ENGINEERING DIVISION
34459C                 INFORMATION TECHNOLOGY LABORATORY
34460C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34461C                 GAITHERSBURG, MD 20899-8980
34462C                 PHONE--301-975-2855
34463C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34464C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34465C     LANGUAGE--ANSI FORTRAN (1977)
34466C     VERSION NUMBER--2007.10
34467C     ORIGINAL VERSION--OCTOBER   2007.
34468C
34469C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34470C
34471C---------------------------------------------------------------------
34472C
34473      DOUBLE PRECISION DCDF
34474      DOUBLE PRECISION DX
34475      DOUBLE PRECISION DR
34476      DOUBLE PRECISION DTERM1
34477      DOUBLE PRECISION DTERM2
34478      DOUBLE PRECISION DPI
34479C
34480C---------------------------------------------------------------------
34481C
34482      INCLUDE 'DPCOP2.INC'
34483C
34484C-----DATA STATEMENTS-------------------------------------------------
34485C
34486      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
34487C
34488C-----START POINT-----------------------------------------------------
34489C
34490C               ********************************************
34491C               **  STEP 1--                              **
34492C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34493C               ********************************************
34494C
34495      DCDF=0.0D0
34496C
34497      IF(DR.LE.0.0D0)THEN
34498        WRITE(ICOUT,115)
34499  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU8CDF ',
34500     1         'IS NON-POSITIVE.')
34501        CALL DPWRST('XXX','BUG ')
34502        WRITE(ICOUT,147)DR
34503  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34504        CALL DPWRST('XXX','BUG ')
34505        GOTO9000
34506      ENDIF
34507C
34508C               **************************************************
34509C               **  STEP 2B-                                    **
34510C               **  COMPUTE BURR TYPE 8  CDF                    **
34511C               **************************************************
34512C
34513      DTERM1=DEXP(DX)
34514      DTERM2=DATAN(DTERM1)
34515      DCDF=((2.0D0/DPI)*DTERM2)**DR
34516C
34517 9000 CONTINUE
34518      RETURN
34519      END
34520      SUBROUTINE BU8PDF(DX,DR,DPDF)
34521C
34522C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
34523C              FUNCTION VALUE FOR THE BURR TYPE 8 DISTRIBTION.
34524C              THE PROBABILITY DENSITY FUNCTION IS:
34525C
34526C              f(X;R) = R*EXP(X)*(2/PI)**R*ARCTAN(EXP(X))**(R-1)/
34527C                       (1 + EXP(2*X))
34528C              -INF <  X <  INF; R > 0
34529C
34530C              WITH SHAPE PARAMETER R.
34531C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34532C                                WHICH THE PROBABILITY DENSITY
34533C                                FUNCTION IS TO BE EVALUATED.
34534C                     --DR     = THE SHAPE PARAMETER
34535C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
34536C                                DENSITY FUNCTION VALUE.
34537C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
34538C             FUNCTION VALUE PDF FOR THE BURR TYPE 8 DISTRIBUTION
34539C             WITH SHAPE PARAMETER R.
34540C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34541C     RESTRICTIONS--NONE.
34542C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34543C     FORTRAN LIBRARY SUBROUTINES NEEDED--ARCTAN, EXP.
34544C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34545C     LANGUAGE--ANSI FORTRAN (1977)
34546C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34547C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34548C                 JOHN WILEY, 1994, PP. 53-54.
34549C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34550C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34551C     WRITTEN BY--JAMES J. FILLIBEN
34552C                 STATISTICAL ENGINEERING DIVISION
34553C                 INFORMATION TECHNOLOGY LABORATORY
34554C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34555C                 GAITHERSBURG, MD 20899-8980
34556C                 PHONE--301-975-2855
34557C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34558C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34559C     LANGUAGE--ANSI FORTRAN (1977)
34560C     VERSION NUMBER--2007.10
34561C     ORIGINAL VERSION--OCTOBER   2007.
34562C
34563C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34564C
34565C---------------------------------------------------------------------
34566C
34567      DOUBLE PRECISION DPDF
34568      DOUBLE PRECISION DX
34569      DOUBLE PRECISION DR
34570      DOUBLE PRECISION DPI
34571      DOUBLE PRECISION DTERM1
34572      DOUBLE PRECISION DTERM2
34573      DOUBLE PRECISION DTERM3
34574C
34575C---------------------------------------------------------------------
34576C
34577      INCLUDE 'DPCOP2.INC'
34578C
34579C-----DATA STATEMENTS-------------------------------------------------
34580C
34581      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
34582C
34583C-----START POINT-----------------------------------------------------
34584C
34585C               ********************************************
34586C               **  STEP 1--                              **
34587C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34588C               ********************************************
34589C
34590      DPDF=0.0D0
34591C
34592      IF(DR.LE.0.0D0)THEN
34593        WRITE(ICOUT,115)
34594  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU8PDF ',
34595     1         'IS NON-POSITIVE.')
34596        CALL DPWRST('XXX','BUG ')
34597        WRITE(ICOUT,147)DR
34598  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34599        CALL DPWRST('XXX','BUG ')
34600        GOTO9000
34601      ENDIF
34602C
34603C               **************************************************
34604C               **  STEP 2B-                                    **
34605C               **  COMPUTE BURR TYPE 8  PDF                    **
34606C               **************************************************
34607C
34608      DTERM1=DATAN(DEXP(DX))
34609      DTERM2=DLOG(DR) + DX + DR*DLOG(2.0D0/DPI) +
34610     1       (DR-1.0D0)*DLOG(DTERM1)
34611      DTERM3=DLOG(1.0D0 + DEXP(2.0D0*DX))
34612      DPDF=DEXP(DTERM2 - DTERM3)
34613C
34614 9000 CONTINUE
34615      RETURN
34616      END
34617      SUBROUTINE BU8PPF(DP,DR,DPPF)
34618C
34619C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
34620C              FUNCTION VALUE FOR THE BURR TYPE 8 DISTRIBUTION.
34621C              THE PERCENT POINT FUNCTION IS:
34622C
34623C              G(P;R) = LOG(TAN(PI*P**(1/R)/2))
34624C                       0 < P < 1; R > 0
34625C
34626C              WITH SHAPE PARAMETER R.
34627C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
34628C                                WHICH THE PERCENT POINT
34629C                                FUNCTION IS TO BE EVALUATED.
34630C                     --DR     = THE SHAPE PARAMETER
34631C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
34632C                                FUNCTION VALUE.
34633C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
34634C             FUNCTION VALUE PPF FOR THE BURR TYPE 8 DISTRIBUTION
34635C             WITH SHAPE PARAMETER R.
34636C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34637C     RESTRICTIONS--NONE.
34638C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34639C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
34640C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34641C     LANGUAGE--ANSI FORTRAN (1977)
34642C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34643C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34644C                 JOHN WILEY, 1994, PP. 53-54.
34645C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34646C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34647C     WRITTEN BY--JAMES J. FILLIBEN
34648C                 STATISTICAL ENGINEERING DIVISION
34649C                 INFORMATION TECHNOLOGY LABORATORY
34650C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34651C                 GAITHERSBURG, MD 20899-8980
34652C                 PHONE--301-975-2855
34653C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34654C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34655C     LANGUAGE--ANSI FORTRAN (1977)
34656C     VERSION NUMBER--2007.10
34657C     ORIGINAL VERSION--OCTOBER   2007.
34658C
34659C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34660C
34661C---------------------------------------------------------------------
34662C
34663      DOUBLE PRECISION DPPF
34664      DOUBLE PRECISION DP
34665      DOUBLE PRECISION DR
34666      DOUBLE PRECISION DTERM1
34667      DOUBLE PRECISION DTERM2
34668      DOUBLE PRECISION DPI
34669C
34670C---------------------------------------------------------------------
34671C
34672      INCLUDE 'DPCOP2.INC'
34673C
34674C-----DATA STATEMENTS-------------------------------------------------
34675C
34676      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
34677C
34678C-----START POINT-----------------------------------------------------
34679C
34680C               ********************************************
34681C               **  STEP 1--                              **
34682C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34683C               ********************************************
34684C
34685      DPPF=0.0D0
34686C
34687      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
34688        WRITE(ICOUT,105)
34689  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU8PPF ',
34690     1         'IS OUTSIDE THE (0,1) INTERVAL.')
34691        CALL DPWRST('XXX','BUG ')
34692        WRITE(ICOUT,147)DP
34693        CALL DPWRST('XXX','BUG ')
34694        GOTO9000
34695      ELSEIF(DR.LE.0.0D0)THEN
34696        WRITE(ICOUT,115)
34697  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU8PPF ',
34698     1         'IS NON-POSITIVE.')
34699        CALL DPWRST('XXX','BUG ')
34700        WRITE(ICOUT,147)DR
34701  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34702        CALL DPWRST('XXX','BUG ')
34703        GOTO9000
34704      ENDIF
34705C
34706C               **************************************************
34707C               **  STEP 2B-                                    **
34708C               **  COMPUTE BURR TYPE 8 PPF                     **
34709C               **************************************************
34710C
34711      DTERM1=DPI*(DP**(1.0D0/DR))
34712      DTERM2=DTAN(DTERM1/2.0D0)
34713      DPPF=DLOG(DTERM2)
34714C
34715 9000 CONTINUE
34716      RETURN
34717      END
34718      SUBROUTINE BU8RAN(N,R,ISEED,X)
34719C
34720C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
34721C              FROM THE BURR TYYPE 8 DISTRIBUTION WITH
34722C              SHAPE PARAMETER R.
34723C
34724C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
34725C                                OF RANDOM NUMBERS TO BE
34726C                                GENERATED.
34727C                     --R      = THE SINGLE PRECISION VALUE OF THE
34728C                                SHAPE PARAMETER R.
34729C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
34730C                                (OF DIMENSION AT LEAST N)
34731C                                INTO WHICH THE GENERATED
34732C                                RANDOM SAMPLE WILL BE PLACED.
34733C     OUTPUT--A RANDOM SAMPLE OF SIZE N
34734C             FROM THE BURR TYYPE 8 DISTRIBUTION
34735C             WITH SHAPE PARAMETER R.
34736C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34737C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
34738C                   OF N FOR THIS SUBROUTINE.
34739C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU8PPF.
34740C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
34741C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
34742C     LANGUAGE--ANSI FORTRAN (1977)
34743C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34744C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34745C                 JOHN WILEY, 1994, PP. 53-54.
34746C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34747C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34748C     WRITTEN BY--JAMES J. FILLIBEN
34749C                 STATISTICAL ENGINEERING DIVISION
34750C                 INFORMATION TECHMOLOGY LABORATORY
34751C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34752C                 GAITHERSBURG, MD 20899-8980
34753C                 PHONE--301-975-2855
34754C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34755C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
34756C     LANGUAGE--ANSI FORTRAN (1977)
34757C     VERSION NUMBER--2007.10
34758C     ORIGINAL VERSION--OCTOBER   2007.
34759C
34760C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34761C
34762C---------------------------------------------------------------------
34763C
34764      DIMENSION X(*)
34765C
34766      DOUBLE PRECISION DTEMP
34767C
34768C---------------------------------------------------------------------
34769C
34770      INCLUDE 'DPCOP2.INC'
34771C
34772C-----START POINT-----------------------------------------------------
34773C
34774C     CHECK THE INPUT ARGUMENTS FOR ERRORS
34775C
34776      IF(N.LT.1)THEN
34777        WRITE(ICOUT, 5)
34778        CALL DPWRST('XXX','BUG ')
34779        WRITE(ICOUT,47)N
34780        CALL DPWRST('XXX','BUG ')
34781        GOTO9000
34782    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
34783     1         'BURR TYYPE 8 RANDOM NUMBERS IS NON-POSITIVE')
34784   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
34785      ELSEIF(R.LE.0.0)THEN
34786        WRITE(ICOUT,201)
34787        CALL DPWRST('XXX','BUG ')
34788        WRITE(ICOUT,203)R
34789        CALL DPWRST('XXX','BUG ')
34790        GOTO9000
34791  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
34792  203   FORMAT('      THE VALUE OF R IS ',G15.7)
34793      ENDIF
34794C
34795C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
34796C
34797      CALL UNIRAN(N,ISEED,X)
34798C
34799C     GENERATE N SLOPE DISTRIBUTION RANDOM
34800C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
34801C
34802      DO300I=1,N
34803        CALL BU8PPF(DBLE(X(I)),DBLE(R),DTEMP)
34804        X(I)=DBLE(DTEMP)
34805  300 CONTINUE
34806C
34807 9000 CONTINUE
34808      RETURN
34809      END
34810      SUBROUTINE BU9CDF(DX,DR,DK,DCDF)
34811C
34812C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
34813C              FUNCTION VALUE FOR THE BURR TYPE 9 DISTRIBTION.
34814C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
34815C
34816C              F(X;R,K) = 1 - 2/{2 + K*((1+EXP(X))**R - 1)}
34817C                         -INF <  X <  INF; R, K > 0
34818C
34819C              WITH SHAPE PARAMETERS R AND K.
34820C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34821C                                WHICH THE CUMULATIVE DISTRIBUTION
34822C                                FUNCTION IS TO BE EVALUATED.
34823C                     --DR     = THE FIRST SHAPE PARAMETER
34824C                     --DK     = THE SECOND SHAPE PARAMETER
34825C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
34826C                                DISTRIBUTION FUNCTION VALUE.
34827C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
34828C             FUNCTION VALUE CDF FOR THE BURR TYPE 9 DISTRIBUTION
34829C             WITH SHAPE PARAMETERS R AND K.
34830C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34831C     RESTRICTIONS--NONE.
34832C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34833C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
34834C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34835C     LANGUAGE--ANSI FORTRAN (1977)
34836C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34837C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34838C                 JOHN WILEY, 1994, PP. 53-54.
34839C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34840C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34841C     WRITTEN BY--JAMES J. FILLIBEN
34842C                 STATISTICAL ENGINEERING DIVISION
34843C                 INFORMATION TECHNOLOGY LABORATORY
34844C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34845C                 GAITHERSBURG, MD 20899-8980
34846C                 PHONE--301-975-2855
34847C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34848C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34849C     LANGUAGE--ANSI FORTRAN (1977)
34850C     VERSION NUMBER--2007.10
34851C     ORIGINAL VERSION--OCTOBER   2007.
34852C
34853C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34854C
34855C---------------------------------------------------------------------
34856C
34857      DOUBLE PRECISION DCDF
34858      DOUBLE PRECISION DX
34859      DOUBLE PRECISION DR
34860      DOUBLE PRECISION DK
34861      DOUBLE PRECISION DTERM1
34862      DOUBLE PRECISION DTERM2
34863C
34864C---------------------------------------------------------------------
34865C
34866      INCLUDE 'DPCOP2.INC'
34867C
34868C-----DATA STATEMENTS-------------------------------------------------
34869C
34870C-----START POINT-----------------------------------------------------
34871C
34872C               ********************************************
34873C               **  STEP 1--                              **
34874C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34875C               ********************************************
34876C
34877      DCDF=0.0D0
34878C
34879      IF(DR.LE.0.0D0)THEN
34880        WRITE(ICOUT,115)
34881  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU9CDF ',
34882     1         'IS NON-POSITIVE.')
34883        CALL DPWRST('XXX','BUG ')
34884        WRITE(ICOUT,147)DR
34885  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34886        CALL DPWRST('XXX','BUG ')
34887        GOTO9000
34888      ELSEIF(DK.LE.0.0D0)THEN
34889        WRITE(ICOUT,125)
34890  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU9CDF ',
34891     1         'IS NON-POSITIVE.')
34892        CALL DPWRST('XXX','BUG ')
34893        WRITE(ICOUT,147)DK
34894        CALL DPWRST('XXX','BUG ')
34895        GOTO9000
34896      ENDIF
34897C
34898C               **************************************************
34899C               **  STEP 2B-                                    **
34900C               **  COMPUTE BURR TYPE 9 CDF                     **
34901C               **************************************************
34902C
34903      DTERM1=(1.0D0 + DEXP(DX))**DR
34904      DTERM2=2.0D0 + DK*(DTERM1 - 1.0D0)
34905      DCDF=1.0D0 - 2.0D0/DTERM2
34906C
34907 9000 CONTINUE
34908      RETURN
34909      END
34910      SUBROUTINE BU9PDF(DX,DR,DK,DPDF)
34911C
34912C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
34913C              FUNCTION VALUE FOR THE BURR TYPE 9 DISTRIBTION.
34914C              THE PROBABILITY DENSITY FUNCTION IS:
34915C
34916C              f(X;R,K) = 2*EXP(X)*(1+EXP(X))**(R-1)*K*R/
34917C                         (2+(-1+(1+EXP(X))**R)K)**2
34918C                         -INF <  X <  INF; R, K > 0
34919C
34920C              WITH SHAPE PARAMETERS R AND K.
34921C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
34922C                                WHICH THE PROBABILITY DENSITY
34923C                                FUNCTION IS TO BE EVALUATED.
34924C                     --DR     = THE FIRST SHAPE PARAMETER
34925C                     --DK     = THE SECOND SHAPE PARAMETER
34926C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
34927C                                DENSITY FUNCTION VALUE.
34928C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
34929C             FUNCTION VALUE PDF FOR THE BURR TYPE 9 DISTRIBUTION
34930C             WITH SHAPE PARAMETERS R AND K.
34931C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
34932C     RESTRICTIONS--NONE.
34933C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
34934C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
34935C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
34936C     LANGUAGE--ANSI FORTRAN (1977)
34937C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
34938C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
34939C                 JOHN WILEY, 1994, PP. 53-54.
34940C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
34941C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
34942C     WRITTEN BY--JAMES J. FILLIBEN
34943C                 STATISTICAL ENGINEERING DIVISION
34944C                 INFORMATION TECHNOLOGY LABORATORY
34945C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
34946C                 GAITHERSBURG, MD 20899-8980
34947C                 PHONE--301-975-2855
34948C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
34949C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
34950C     LANGUAGE--ANSI FORTRAN (1977)
34951C     VERSION NUMBER--2007.10
34952C     ORIGINAL VERSION--OCTOBER   2007.
34953C
34954C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
34955C
34956C---------------------------------------------------------------------
34957C
34958      DOUBLE PRECISION DPDF
34959      DOUBLE PRECISION DX
34960      DOUBLE PRECISION DR
34961      DOUBLE PRECISION DK
34962      DOUBLE PRECISION DTERM1
34963      DOUBLE PRECISION DTERM2
34964      DOUBLE PRECISION DTERM3
34965      DOUBLE PRECISION DTERM4
34966      DOUBLE PRECISION DTERM5
34967C
34968C---------------------------------------------------------------------
34969C
34970      INCLUDE 'DPCOP2.INC'
34971C
34972C-----DATA STATEMENTS-------------------------------------------------
34973C
34974C-----START POINT-----------------------------------------------------
34975C
34976C               ********************************************
34977C               **  STEP 1--                              **
34978C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
34979C               ********************************************
34980C
34981      DPDF=0.0D0
34982C
34983      IF(DR.LE.0.0D0)THEN
34984        WRITE(ICOUT,115)
34985  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU9PDF ',
34986     1         'IS NON-POSITIVE.')
34987        CALL DPWRST('XXX','BUG ')
34988        WRITE(ICOUT,147)DR
34989  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
34990        CALL DPWRST('XXX','BUG ')
34991        GOTO9000
34992      ELSEIF(DK.LE.0.0D0)THEN
34993        WRITE(ICOUT,125)
34994  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU9PDF ',
34995     1         'IS NON-POSITIVE.')
34996        CALL DPWRST('XXX','BUG ')
34997        WRITE(ICOUT,147)DK
34998        CALL DPWRST('XXX','BUG ')
34999        GOTO9000
35000      ENDIF
35001C
35002C               **************************************************
35003C               **  STEP 2B-                                    **
35004C               **  COMPUTE BURR TYPE 9 PDF                     **
35005C               **************************************************
35006C
35007      DTERM1=DLOG(2.0D0) + DLOG(DK) + DLOG(DR) + DX
35008      DTERM2=(DR-1.0D0)*DLOG(1.0D0 + DEXP(DX))
35009      DTERM3=(1.0D0 + DEXP(DX))**DR
35010      DTERM4=2.0D0 + DK*(-1.0D0 + DTERM3)
35011      DTERM5=2.0D0*DLOG(DTERM4)
35012      DPDF=DEXP(DTERM1 + DTERM2 - DTERM5)
35013C
35014 9000 CONTINUE
35015      RETURN
35016      END
35017      SUBROUTINE BU9PPF(DP,DR,DK,DPPF)
35018C
35019C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
35020C              FUNCTION VALUE FOR THE BURR TYPE 9 DISTRIBUTION.
35021C              THE PERCENT POINT FUNCTION IS:
35022C
35023C              G(P;R,K) = LOG{[1 + (1/K)*(2/(1-P) - 2)]**(1/R) - 1}
35024C                         0 < P < 1; R, K > 0
35025C
35026C              WITH SHAPE PARAMETERS R AND K.
35027C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
35028C                                WHICH THE PERCENT POINT
35029C                                FUNCTION IS TO BE EVALUATED.
35030C                     --DR     = THE FIRST SHAPE PARAMETER
35031C                     --DK     = THE SECOND SHAPE PARAMETER
35032C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
35033C                                FUNCTION VALUE.
35034C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
35035C             FUNCTION VALUE PPF FOR THE BURR TYPE 9 DISTRIBUTION
35036C             WITH SHAPE PARAMETERS R AND K.
35037C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
35038C     RESTRICTIONS--NONE.
35039C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
35040C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG.
35041C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35042C     LANGUAGE--ANSI FORTRAN (1977)
35043C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35044C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35045C                 JOHN WILEY, 1994, PP. 53-54.
35046C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35047C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35048C     WRITTEN BY--JAMES J. FILLIBEN
35049C                 STATISTICAL ENGINEERING DIVISION
35050C                 INFORMATION TECHNOLOGY LABORATORY
35051C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35052C                 GAITHERSBURG, MD 20899-8980
35053C                 PHONE--301-975-2855
35054C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35055C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
35056C     LANGUAGE--ANSI FORTRAN (1977)
35057C     VERSION NUMBER--2007.10
35058C     ORIGINAL VERSION--OCTOBER   2007.
35059C
35060C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35061C
35062C---------------------------------------------------------------------
35063C
35064      DOUBLE PRECISION DPPF
35065      DOUBLE PRECISION DP
35066      DOUBLE PRECISION DR
35067      DOUBLE PRECISION DK
35068      DOUBLE PRECISION DTERM1
35069      DOUBLE PRECISION DTERM2
35070C
35071C---------------------------------------------------------------------
35072C
35073      INCLUDE 'DPCOP2.INC'
35074C
35075C-----DATA STATEMENTS-------------------------------------------------
35076C
35077C-----START POINT-----------------------------------------------------
35078C
35079C               ********************************************
35080C               **  STEP 1--                              **
35081C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35082C               ********************************************
35083C
35084      DPPF=0.0D0
35085C
35086      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
35087        WRITE(ICOUT,105)
35088  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO BU9PPF ',
35089     1         'IS OUTSIDE THE (0,1) INTERVAL.')
35090        CALL DPWRST('XXX','BUG ')
35091        WRITE(ICOUT,147)DP
35092        CALL DPWRST('XXX','BUG ')
35093        GOTO9000
35094      ELSEIF(DR.LE.0.0D0)THEN
35095        WRITE(ICOUT,115)
35096  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO BU9PPF ',
35097     1         'IS NON-POSITIVE.')
35098        CALL DPWRST('XXX','BUG ')
35099        WRITE(ICOUT,147)DR
35100  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
35101        CALL DPWRST('XXX','BUG ')
35102        GOTO9000
35103      ELSEIF(DK.LE.0.0D0)THEN
35104        WRITE(ICOUT,125)
35105  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO BU9PPF ',
35106     1         'IS NON-POSITIVE.')
35107        CALL DPWRST('XXX','BUG ')
35108        WRITE(ICOUT,147)DK
35109        CALL DPWRST('XXX','BUG ')
35110        GOTO9000
35111      ENDIF
35112C
35113C               **************************************************
35114C               **  STEP 2B-                                    **
35115C               **  COMPUTE BURR TYPE 9 PPF                     **
35116C               **************************************************
35117C
35118      DTERM1=1.0D0 + (1.0D0/DK)*(2.0D0/(1.0D0-DP) - 2.0D0)
35119      DTERM2=DTERM1**(1.0D0/DR)
35120      DPPF=DLOG(DTERM2 - 1.0D0)
35121C
35122 9000 CONTINUE
35123      RETURN
35124      END
35125      SUBROUTINE BU9RAN(N,R,AK,ISEED,X)
35126C
35127C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
35128C              FROM THE BURR TYPE 9 DISTRIBUTION WITH
35129C              SHAPE PARAMETERS R AND K.
35130C
35131C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
35132C                                OF RANDOM NUMBERS TO BE
35133C                                GENERATED.
35134C                     --R      = THE SINGLE PRECISION VALUE OF THE
35135C                                SHAPE PARAMETER R.
35136C                     --AK     = THE SINGLE PRECISION VALUE OF THE
35137C                                SHAPE PARAMETER K.
35138C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
35139C                                (OF DIMENSION AT LEAST N)
35140C                                INTO WHICH THE GENERATED
35141C                                RANDOM SAMPLE WILL BE PLACED.
35142C     OUTPUT--A RANDOM SAMPLE OF SIZE N
35143C             FROM THE BURR TYPE 9 DISTRIBUTION
35144C             WITH SHAPE PARAMETERS R AND K.
35145C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
35146C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
35147C                   OF N FOR THIS SUBROUTINE.
35148C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, BU9PPF.
35149C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
35150C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
35151C     LANGUAGE--ANSI FORTRAN (1977)
35152C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35153C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35154C                 JOHN WILEY, 1994, PP. 53-54.
35155C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35156C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35157C     WRITTEN BY--JAMES J. FILLIBEN
35158C                 STATISTICAL ENGINEERING DIVISION
35159C                 INFORMATION TECHMOLOGY LABORATORY
35160C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35161C                 GAITHERSBURG, MD 20899-8980
35162C                 PHONE--301-975-2855
35163C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35164C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
35165C     LANGUAGE--ANSI FORTRAN (1977)
35166C     VERSION NUMBER--2007.10
35167C     ORIGINAL VERSION--OCTOBER   2007.
35168C
35169C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35170C
35171C---------------------------------------------------------------------
35172C
35173      DIMENSION X(*)
35174C
35175      DOUBLE PRECISION DTEMP
35176C
35177C---------------------------------------------------------------------
35178C
35179      INCLUDE 'DPCOP2.INC'
35180C
35181C-----START POINT-----------------------------------------------------
35182C
35183C     CHECK THE INPUT ARGUMENTS FOR ERRORS
35184C
35185      IF(N.LT.1)THEN
35186        WRITE(ICOUT, 5)
35187        CALL DPWRST('XXX','BUG ')
35188        WRITE(ICOUT,47)N
35189        CALL DPWRST('XXX','BUG ')
35190        GOTO9000
35191    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
35192     1         'BURR TYPE 9 RANDOM NUMBERS IS NON-POSITIVE')
35193   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
35194      ELSEIF(R.LE.0.0)THEN
35195        WRITE(ICOUT,201)
35196        CALL DPWRST('XXX','BUG ')
35197        WRITE(ICOUT,203)R
35198        CALL DPWRST('XXX','BUG ')
35199        GOTO9000
35200  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
35201  203   FORMAT('      THE VALUE OF R IS ',G15.7)
35202      ELSEIF(AK.LE.0.0)THEN
35203        WRITE(ICOUT,211)
35204        CALL DPWRST('XXX','BUG ')
35205        WRITE(ICOUT,213)AK
35206        CALL DPWRST('XXX','BUG ')
35207        GOTO9000
35208  211   FORMAT('***** ERROR--THE K SHAPE PARAMETER IS NON-POSITIVE.')
35209  213   FORMAT('      THE VALUE OF K IS ',G15.7)
35210      ENDIF
35211C
35212C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
35213C
35214      CALL UNIRAN(N,ISEED,X)
35215C
35216C     GENERATE N SLOPE DISTRIBUTION RANDOM
35217C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
35218C
35219      DO300I=1,N
35220        CALL BU9PPF(DBLE(X(I)),DBLE(R),DBLE(AK),DTEMP)
35221        X(I)=DBLE(DTEMP)
35222  300 CONTINUE
35223C
35224 9000 CONTINUE
35225      RETURN
35226      END
35227      SUBROUTINE B10CDF(DX,DR,DCDF)
35228C
35229C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
35230C              FUNCTION VALUE FOR THE BURR TYPE 10 DISTRIBTION.
35231C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
35232C
35233C              F(X;R) = (1 - EXP(-X**2))**R   X >  0; R > 0
35234C
35235C              WITH SHAPE PARAMETER R.
35236C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
35237C                                WHICH THE CUMULATIVE DISTRIBUTION
35238C                                FUNCTION IS TO BE EVALUATED.
35239C                     --DR     = THE SHAPE PARAMETER
35240C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
35241C                                DISTRIBUTION FUNCTION VALUE.
35242C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
35243C             FUNCTION VALUE CDF FOR THE BURR TYPE 10 DISTRIBUTION
35244C             WITH SHAPE PARAMETER R.
35245C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
35246C     RESTRICTIONS--NONE.
35247C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
35248C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
35249C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35250C     LANGUAGE--ANSI FORTRAN (1977)
35251C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35252C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35253C                 JOHN WILEY, 1994, PP. 53-54.
35254C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35255C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35256C                 (NOTE: THERE IS A TYPO IN THE DEVROYE CDF EQUATION,
35257C                 CORRECT FORM TAKEN FROM JOHNSON AND KOTZ).
35258C     WRITTEN BY--JAMES J. FILLIBEN
35259C                 STATISTICAL ENGINEERING DIVISION
35260C                 INFORMATION TECHNOLOGY LABORATORY
35261C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35262C                 GAITHERSBURG, MD 20899-8980
35263C                 PHONE--301-975-2855
35264C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35265C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
35266C     LANGUAGE--ANSI FORTRAN (1977)
35267C     VERSION NUMBER--2007.10
35268C     ORIGINAL VERSION--OCTOBER   2007.
35269C
35270C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35271C
35272C---------------------------------------------------------------------
35273C
35274      DOUBLE PRECISION DCDF
35275      DOUBLE PRECISION DX
35276      DOUBLE PRECISION DR
35277C
35278C---------------------------------------------------------------------
35279C
35280      INCLUDE 'DPCOP2.INC'
35281C
35282C-----DATA STATEMENTS-------------------------------------------------
35283C
35284C-----START POINT-----------------------------------------------------
35285C
35286C               ********************************************
35287C               **  STEP 1--                              **
35288C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35289C               ********************************************
35290C
35291      DCDF=0.0D0
35292C
35293      IF(DR.LE.0.0D0)THEN
35294        WRITE(ICOUT,115)
35295  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B10CDF ',
35296     1         'IS NON-POSITIVE.')
35297        CALL DPWRST('XXX','BUG ')
35298        WRITE(ICOUT,147)DR
35299  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
35300        CALL DPWRST('XXX','BUG ')
35301        GOTO9000
35302      ENDIF
35303C
35304C               **************************************************
35305C               **  STEP 2B-                                    **
35306C               **  COMPUTE BURR TYPE 10 CDF                    **
35307C               **************************************************
35308C
35309      DCDF=(1.0D0 - DEXP(-DX**2))**DR
35310C
35311 9000 CONTINUE
35312      RETURN
35313      END
35314      SUBROUTINE B10FUN (N, X, FVEC, IFLAG, XDATA, NOBS)
35315C
35316C     PURPOSE--THIS ROUTINE COMPUTES THE FUNCTIONS FOR THE
35317C              BURR TYPE 10 MAXIMUM LIKELIHOOD EQUATIONS.
35318C
35319C              (N/R) + SUM[i=1 to N][LN(1 - EXP(-(S*X(i))**2) = 0
35320C
35321C              (2*N/S) - 2*S*SUM[i=1 to n][X(i)**2] +
35322C              2*S*(R-1)*SUM[i=1 tp n][X(i)^2*EXP(-(S*X(i))**2)/
35323C              1 - EXP(-(S*X(i))**2))] = 0
35324C
35325C              WITH R AND S DENOTING THE SHAPE PARAMETER R AND
35326C              SCALE PARAMETER S RESPECTIVELY.
35327C
35328C
35329C              CALLED BY DNSQE ROUTINE FOR SOLVING SIMULTANEOUS
35330C              NONLINEAR EQUATIONS.  NOTE THAT THE CALLING SEQUENCE
35331C              DID NOT ACCOMODATE A DATA ARRAY (AND ASSCIATED NUMBER OF
35332C              OBSERVATIONS), SO THESE WERE ADDED TO THE CALL LIST.
35333C     EXAMPLE--BURR TYPE 10 MAXIMUM LIKELIHOOD Y
35334C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35335C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35336C                 JOHN WILEY, 1994, PP. 53-54.
35337C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35338C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35339C                 (NOTE: THERE IS A TYPO IN THE DEVROYE CDF EQUATION,
35340C                 CORRECT FORM TAKEN FROM JOHNSON AND KOTZ).
35341C     WRITTEN BY--JAMES J. FILLIBEN
35342C                 STATISTICAL ENGINEERING DIVISION
35343C                 INFORMATION TECHNOLOGY LABORATORY
35344C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35345C                 GAITHERSBUG, MD 20899-8980
35346C                 PHONE--301-975-2855
35347C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35348C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
35349C     LANGUAGE--ANSI FORTRAN (1977)
35350C     VERSION NUMBER--2007/10
35351C     ORIGINAL VERSION--OCTOBER   2007.
35352C
35353C---------------------------------------------------------------------
35354C
35355      DOUBLE PRECISION X(*)
35356      DOUBLE PRECISION FVEC(*)
35357      REAL XDATA(*)
35358C
35359      DOUBLE PRECISION DN
35360      DOUBLE PRECISION DX
35361      DOUBLE PRECISION DX2
35362      DOUBLE PRECISION DX3
35363      DOUBLE PRECISION DR
35364      DOUBLE PRECISION DS
35365      DOUBLE PRECISION DSUM1
35366      DOUBLE PRECISION DSUM2
35367      DOUBLE PRECISION DSUM3
35368      DOUBLE PRECISION DTERM1
35369      DOUBLE PRECISION DTERM2
35370      DOUBLE PRECISION DTERM3
35371      DOUBLE PRECISION DTERM4
35372C
35373C---------------------------------------------------------------------
35374C
35375      INCLUDE 'DPCOP2.INC'
35376C
35377C-----START POINT-----------------------------------------------------
35378C
35379C  COMPUTE SOME SUMS
35380C
35381      N=2
35382      IFLAG=0
35383C
35384      DN=DBLE(NOBS)
35385      DR=X(1)
35386      DS=X(2)
35387      DTERM1=DN/DR
35388      DTERM2=2.0D0*DN/DS
35389      DTERM3=2.0D0*DS
35390      DTERM4=2.0D0*DS*(DR-1.0D0)
35391C
35392      DSUM1=0.0D0
35393      DSUM2=0.0D0
35394      DSUM3=0.0D0
35395C
35396      DO200I=1,NOBS
35397        DX=DBLE(XDATA(I))
35398        DX2=DX**2
35399        DX3=DEXP(-(DS*DX)**2)
35400        DSUM1=DSUM1 + DLOG(1.0D0 - DX3)
35401        DSUM2=DSUM2 + DX2
35402        DSUM3=DSUM3 + DX2*DX3/(1.0D0 - DX3)
35403  200 CONTINUE
35404C
35405      FVEC(1)=DTERM1 + DSUM1
35406      FVEC(2)=DTERM2 - DTERM3*DSUM2 + DTERM4*DSUM3
35407C
35408      RETURN
35409      END
35410      SUBROUTINE B10LI1(Y,N,ICASPL,ALOC,SCALE,SHAPE,
35411     1                  ALIK,AIC,AICC,BIC,
35412     1                  ISUBRO,IBUGA3,IERROR)
35413C
35414C     PURPOSE--THIS ROUTINE COMPUTES THE LOG-LIKELIHOOD FUNCTION FOR
35415C              THE BURR TYPE 10 DISTRIBUTION.  THIS IS FOR THE RAW DATA
35416C              CASE (I.E., NO GROUPING AND NO CENSORING).
35417C
35418C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
35419C              PERFORMED.
35420C
35421C     REFERENCE--KUNDU AND RAQAB, "GENERALIZED RAYLEIGH DISTRIBUTION:
35422C                METHODS OF ESTIMATION", COMPUTATIONAL STATISTICS
35423C                AND DATA ANALYSIS, 49, PP. 187-200.
35424C     WRITTEN BY--ALAN HECKERT
35425C                 STATISTICAL ENGINEERING DIVISION
35426C                 INFORMATION TECHNOLOGY LABORATORY
35427C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35428C                 GAITHERSBURG, MD 20899-8980
35429C                 PHONE--301-975-2899
35430C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35431C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
35432C     LANGUAGE--ANSI FORTRAN (1977)
35433C     VERSION NUMBER--2011/4
35434C     ORIGINAL VERSION--APRIL     2010.
35435C
35436C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35437C
35438      CHARACTER*4 ICASPL
35439      CHARACTER*4 ISUBRO
35440      CHARACTER*4 IBUGA3
35441      CHARACTER*4 IERROR
35442C
35443      CHARACTER*4 IWRITE
35444C
35445      CHARACTER*4 ISUBN1
35446      CHARACTER*4 ISUBN2
35447      CHARACTER*4 ISTEPN
35448C
35449      DOUBLE PRECISION DX
35450      DOUBLE PRECISION DS
35451      DOUBLE PRECISION DU
35452      DOUBLE PRECISION DR
35453      DOUBLE PRECISION DN
35454      DOUBLE PRECISION DNP
35455      DOUBLE PRECISION DLIK
35456      DOUBLE PRECISION DSUM1
35457      DOUBLE PRECISION DSUM2
35458      DOUBLE PRECISION DSUM3
35459      DOUBLE PRECISION DTERM1
35460      DOUBLE PRECISION DTERM2
35461C
35462C---------------------------------------------------------------------
35463C
35464      DIMENSION Y(*)
35465C
35466C---------------------------------------------------------------------
35467C
35468      INCLUDE 'DPCOP2.INC'
35469C
35470C-----START POINT-----------------------------------------------------
35471C
35472      ISUBN1='B10L'
35473      ISUBN2='I1  '
35474C
35475      IERROR='NO'
35476C
35477      ALIK=-99.0
35478      AIC=-99.0
35479      AICC=-99.0
35480      BIC=-99.0
35481C
35482      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0LI1')THEN
35483        WRITE(ICOUT,999)
35484  999   FORMAT(1X)
35485        CALL DPWRST('XXX','WRIT')
35486        WRITE(ICOUT,51)
35487   51   FORMAT('**** AT THE BEGINNING OF B10LI1--')
35488        CALL DPWRST('XXX','WRIT')
35489        WRITE(ICOUT,52)IBUGA3,ISUBRO
35490   52   FORMAT('IBUGA3,ISUBRO = ',A4,2X,A4)
35491        CALL DPWRST('XXX','WRIT')
35492        WRITE(ICOUT,55)N,ALOC,SCALE,SHAPE
35493   55   FORMAT('N,ALOC,SCALE,SHAPE = ',I8,3G15.7)
35494        CALL DPWRST('XXX','WRIT')
35495        DO56I=1,MIN(N,100)
35496          WRITE(ICOUT,57)I,Y(I)
35497   57     FORMAT('I,Y(I) = ',I8,G15.7)
35498          CALL DPWRST('XXX','WRIT')
35499   56   CONTINUE
35500      ENDIF
35501C
35502C               ******************************************
35503C               **  STEP 1--                            **
35504C               **  COMPUTE LIKELIHOOD FUNCTION         **
35505C               ******************************************
35506C
35507      ISTEPN='1'
35508      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0LI1')
35509     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
35510C
35511      IERFLG=0
35512      IERROR='NO'
35513      IWRITE='OFF'
35514      IF(ICASPL.EQ.'3B10')ALOC=0.0
35515C
35516C     LOG-LIKELIHOOD FUNCTION IS:
35517C
35518C     N*LOG(2) + N*LOG(R) - 2*N*LOG(S) + SUM[i=1 to N][LOG(X(i) - L)] +
35519C     (R-1)*SUM[i=1 to N][1 - EXP(-((X(i)-L)/S)**2)] -
35520C     SUM[i=1 to N][((X(i)-L)/S)**2]
35521C
35522C     WITH R, L, AND S DENOTING THE SHAPE, LOCATION, AND SCALE
35523C     PARAMETERS, RESPECTIVELY.
35524C
35525      DN=DBLE(N)
35526      DS=DBLE(1.0/SCALE)
35527      DU=DBLE(ALOC)
35528      DR=DBLE(SHAPE)
35529C
35530      DTERM1=DN*DLOG(2.0D0) + DN*DLOG(DR) + 2.0D0*DN*DLOG(DS)
35531      DSUM1=0.0D0
35532      DSUM2=0.0D0
35533      DSUM3=0.0D0
35534      DO1000I=1,N
35535        DX=DBLE(Y(I))
35536        DX=DX-DU
35537        IF(DX.GT.0.0D0)THEN
35538          DSUM1=DSUM1 + DLOG(DX)
35539        ENDIF
35540        DSUM2=DSUM2 + DX**2
35541        DTERM2=1.0D0 - DEXP(-(DS*DX)**2)
35542        IF(DTERM2.GE.0.0D0)THEN
35543          DSUM3=DSUM3 + DLOG(DTERM2)
35544        ENDIF
35545 1000 CONTINUE
35546C
35547      DLIK=DTERM1 + DSUM1 - DS**2*DSUM2 + (DR-1.0D0)*DSUM3
35548      ALIK=REAL(DLIK)
35549      DNP=2.0D0
35550      IF(ICASPL.EQ.'3B10')DNP=3.0
35551      AIC=REAL(-2.0D0*DLIK + 2.0D0*DNP)
35552      DTERM3=(2.0D0*DNP*(DNP+1.0D0))/(DN-DNP-1.0D0)
35553      AICC=REAL(-2.0D0*DLIK + 2.0D0*DNP + DTERM3)
35554      BIC=REAL(-2.0D0*DLIK + DNP*LOG(DN))
35555C
35556      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0LI1')THEN
35557        WRITE(ICOUT,999)
35558        CALL DPWRST('XXX','WRIT')
35559        WRITE(ICOUT,9011)
35560 9011   FORMAT('**** AT THE END OF B10LI1--')
35561        CALL DPWRST('XXX','WRIT')
35562        WRITE(ICOUT,9013)DSUM1,DSUM2,DSUM3,DTERM1,DTERM2
35563 9013   FORMAT('DSUM1,DSUM2,DSUM3,DTERM1,DTERM2 = ',5G15.7)
35564        CALL DPWRST('XXX','WRIT')
35565        WRITE(ICOUT,9014)ALIK,AIC,AICC,BIC
35566 9014   FORMAT('ALIK,AIC,AICC,BIC = ',4G15.7)
35567        CALL DPWRST('XXX','WRIT')
35568      ENDIF
35569C
35570      RETURN
35571      END
35572      SUBROUTINE B10ML1(Y,N,MAXNXT,
35573     1                  TEMP1,TEMP2,DISPAR,DTEMP1,
35574     1                  XMEAN,XSD,XVAR,XMIN,XMAX,
35575     1                  SCALSV,SHAPSV,SCALML,SHAPML,
35576     1                  ISUBRO,IBUGA3,IERROR)
35577C
35578C     PURPOSE--THIS ROUTINE COMPUTES THE MAXIMUM LIKELIHOOD ESTIMATES
35579C              FOR THE 2-PARAMETER BURR TYPE 10 DISTRIBUTION FOR THE RAW
35580C              DATA CASE (I.E., NO CENSORING AND NO GROUPING).  THIS
35581C              ROUTINE RETURNS ONLY THE POINT ESTIMATES (CONFIDENCE
35582C              INTERVALS WILL BE COMPUTED IN A SEPARATE ROUTINE).
35583C
35584C              IT IS ASSUMED THAT BASIC ERROR CHECKING HAS ALREADY BEEN
35585C              PERFORMED.
35586C
35587C              PUT THIS IN A SEPARATE ROUTINE AS IT MAY BE CALLED
35588C              FROM MULTIPLE PLACES (DPMB10 WILL GENERATE THE OUTPUT
35589C              FOR THE BURR TYPE 10 MLE COMMAND).
35590C
35591C     REFERENCES--RAQAB AND KUNDU (2006).  "BURR TYPE X DISTRIBUTIIONS:
35592C                 REVISITED", JOURNAL OF PROBABILITY AND STATISTICAL
35593C                 SCIENCE, VOL. 4, NO. 2, PP. 179-193.
35594C     WRITTEN BY--JAMES J. FILLIBEN
35595C                 STATISTICAL ENGINEERING DIVISION
35596C                 INFORMATION TECHNOLOGY LABORATORY
35597C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35598C                 GAITHERSBURG, MD 20899-8980
35599C                 PHONE--301-975-2855
35600C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35601C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
35602C     LANGUAGE--ANSI FORTRAN (1977)
35603C     VERSION NUMBER--2010/2
35604C     ORIGINAL VERSION--FEBRUARY  2010. EXTRACTED AS A SEPARATE
35605C                                       SUBROUTINE (FROM DPMB10)
35606C
35607C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35608C
35609      DIMENSION Y(*)
35610      DIMENSION TEMP1(*)
35611      DIMENSION TEMP2(*)
35612      DIMENSION DISPAR(*)
35613      DOUBLE PRECISION DTEMP1(*)
35614C
35615      DOUBLE PRECISION TOL
35616      DOUBLE PRECISION XPAR(2)
35617      DOUBLE PRECISION FVEC(2)
35618      DIMENSION DISPA2(1)
35619      INTEGER IPPCAP(2)
35620C
35621      EXTERNAL B10FUN
35622C
35623      DOUBLE PRECISION DXOUT
35624C
35625      CHARACTER*4 ISUBRO
35626      CHARACTER*4 IBUGA3
35627      CHARACTER*4 IERROR
35628C
35629      CHARACTER*4 IWRITE
35630      CHARACTER*40 IDIST
35631C
35632      CHARACTER*4 ISUBN1
35633      CHARACTER*4 ISUBN2
35634      CHARACTER*4 ISTEPN
35635C
35636      CHARACTER*4 IADEDF
35637      CHARACTER*4 IGEPDF
35638      CHARACTER*4 IMAKDF
35639      CHARACTER*4 IBEIDF
35640      CHARACTER*4 ILGADF
35641      CHARACTER*4 ISKNDF
35642      CHARACTER*4 IGLDDF
35643      CHARACTER*4 IBGEDF
35644      CHARACTER*4 IGETDF
35645      CHARACTER*4 ICONDF
35646      CHARACTER*4 IGOMDF
35647      CHARACTER*4 IKATDF
35648      CHARACTER*4 IGIGDF
35649      CHARACTER*4 IGEODF
35650      CHARACTER*4 ICASPL
35651      CHARACTER*4 ICASP2
35652C
35653C---------------------------------------------------------------------
35654C
35655      INCLUDE 'DPCOP2.INC'
35656C
35657C-----START POINT-----------------------------------------------------
35658C
35659      ISUBN1='B10M'
35660      ISUBN2='L1  '
35661C
35662      IERROR='NO'
35663C
35664      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0ML1')THEN
35665        WRITE(ICOUT,999)
35666  999   FORMAT(1X)
35667        CALL DPWRST('XXX','WRIT')
35668        WRITE(ICOUT,51)
35669   51   FORMAT('**** AT THE BEGINNING OF B10ML1--')
35670        CALL DPWRST('XXX','WRIT')
35671        WRITE(ICOUT,52)IBUGA3,ISUBRO,N
35672   52   FORMAT('IBUGA3,ISUBRO,N = ',A4,2X,A4,2X,I8)
35673        CALL DPWRST('XXX','WRIT')
35674        WRITE(ICOUT,53)SHAPSV,SCALSV
35675   53   FORMAT('SHAPSV,SCALSV = ',2G15.7)
35676        CALL DPWRST('XXX','WRIT')
35677        DO56I=1,MIN(N,100)
35678          WRITE(ICOUT,57)I,Y(I)
35679   57     FORMAT('I,Y(I) = ',I8,G15.7)
35680          CALL DPWRST('XXX','WRIT')
35681   56   CONTINUE
35682      ENDIF
35683C
35684C               ********************************************
35685C               **  STEP 1--                              **
35686C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35687C               ********************************************
35688C
35689      ISTEPN='1'
35690      IF(IBUGA3.EQ.'ON' .OR. ISUBRO.EQ.'0ML1')
35691     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
35692C
35693C               *****************************************************
35694C               **  STEP 2--                                       **
35695C               **  CARRY OUT CALCULATIONS                         **
35696C               **  FOR BURR TYPE 10 MLE ESTIMATE                  **
35697C               *****************************************************
35698C
35699      ISTEPN='2'
35700      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0ML1')
35701     1CALL TRACE2(ISTEPN,ISUBN1,ISUBN2)
35702C
35703      IDIST='BURR TYPE 10'
35704C
35705      IFLAG=2
35706      CALL SUMRAW(Y,N,IDIST,IFLAG,
35707     1            XMEAN,XVAR,XSD,XMIN,XMAX,
35708     1            ISUBRO,IBUGA3,IERROR)
35709C
35710      SHAPML=CPUMIN
35711      SCALML=CPUMIN
35712      IF(IERROR.EQ.'YES')GOTO9000
35713C
35714      IF(SHAPSV.GT.0.0 .AND. SCALSV.GT.0.0)THEN
35715        XPAR(1)=DBLE(SHAPSV)
35716        XPAR(2)=DBLE(1.0/SCALSV)
35717      ELSE
35718C
35719C       IF NO STARTING VALUES SPECIFIED, COMPUTE STARTING
35720C       VALUES BASED ON PPCC METHOD.
35721C
35722        CALL UNIMED(N,TEMP1)
35723        CALL SORT(Y,N,Y)
35724        ICASP2='BU10'
35725        ICASPL='PPCC'
35726        IPPCAP(1)=100
35727        IPPCAP(2)=1
35728C
35729C       OBTAIN LOWER/UPPER LIMITS FOR SHAPE PARAMETER
35730C
35731        CALL EXTPA2(ICASP2,IDIST,A,B,
35732     1              SHAP11,SHAP12,SHAP21,SHAP22,
35733     1              SHAPE1,SHAPE2,SHAPE3,SHAPE4,SHAPE5,
35734     1              IADEDF,IGEPDF,IMAKDF,IBEIDF,
35735     1              ILGADF,ISKNDF,IGLDDF,IBGEDF,
35736     1              IGETDF,ICONDF,IGOMDF,IKATDF,
35737     1              IGIGDF,IGEODF,
35738     1              ISUBRO,IBUGA3,IERROR)
35739C
35740C       CREATE ARRAY FOR THE CANDIDATE VALUES OF SHAPE PARAMETER
35741C
35742        NUMSHA=1
35743        CALL DPPPC7(ICASPL,ICASP2,IPPCAP,
35744     1              SHAP11,SHAP12,SHAP21,SHAP22,
35745     1              SHAPE1,SHAPE2,SHAPE3,SHAPE4,
35746     1              XMIN,XMAX,A,B,
35747     1              DISPAR,DISPA2,NUMDIS,NUMSHA,
35748     1              IADEDF,IGEPDF,IMAKDF,IBEIDF,
35749     1              ILGADF,ISKNDF,IGLDDF,IBGEDF,IGETDF,
35750     1              ICONDF,IGOMDF,IKATDF,IGIGDF,IGEODF,
35751     1              IBUGA3,ISUBRO,IERROR)
35752C
35753        CORRMX=-1.0
35754        IWRITE='OFF'
35755        DO1010IDIS=1,NUMDIS
35756          SHAPE=DISPAR(IDIS)
35757          DO1020I=1,N
35758            CALL B10PPF(DBLE(TEMP1(I)),DBLE(SHAPE),DXOUT)
35759            TEMP2(I)=REAL(DXOUT)
35760 1020     CONTINUE
35761          CALL CORR(Y,TEMP2,N,IWRITE,CC,IBUGA3,IERROR)
35762          IF(CC.GT.CORRMX)THEN
35763            SHAPE1=SHAPE
35764            CALL LINFI2(Y,TEMP2,N,PPA0,PPA1,ISUBRO,IBUGA3,IERROR)
35765            CORRMX=CC
35766          ENDIF
35767 1010   CONTINUE
35768        XPAR(1)=DBLE(SHAPE1)
35769        XPAR(2)=DBLE(1.0/PPA1)
35770      ENDIF
35771C
35772      IOPT=2
35773      TOL=1.0D-8
35774      NVAR=2
35775      NPRINT=-1
35776      INFO=0
35777      LWA=MAXNXT
35778      CALL DNSQE(B10FUN,JAC,IOPT,NVAR,XPAR,FVEC,TOL,NPRINT,INFO,
35779     1           DTEMP1,MAXNXT,Y,N)
35780C
35781      SHAPML=REAL(XPAR(1))
35782      SCALML=1.0/REAL(XPAR(2))
35783      IF(SHAPML.LE.0.0)IERROR='YES'
35784      IF(SCALML.LE.0.0)IERROR='YES'
35785C
35786 9000 CONTINUE
35787      IF(IBUGA3.EQ.'ON'.OR.ISUBRO.EQ.'0ML1')THEN
35788        WRITE(ICOUT,999)
35789        CALL DPWRST('XXX','WRIT')
35790        WRITE(ICOUT,9011)
35791 9011   FORMAT('**** AT THE END OF B10ML1--')
35792        CALL DPWRST('XXX','WRIT')
35793        WRITE(ICOUT,9013)N,XMEAN,XSD,XMIN,XMAX
35794 9013   FORMAT('N,XMEAN,XSD,XMIN,XMAX = ',I8,4G15.7)
35795        CALL DPWRST('XXX','WRIT')
35796        WRITE(ICOUT,9017)XPAR(1),XPAR(2),SHAPML,SCALML
35797 9017   FORMAT('XPAR(1),XPAR(2),SHAPML,SCALML =  ',4G15.7)
35798        CALL DPWRST('XXX','WRIT')
35799      ENDIF
35800C
35801      RETURN
35802      END
35803      SUBROUTINE B10PDF(DX,DR,DPDF)
35804C
35805C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
35806C              FUNCTION VALUE FOR THE BURR TYPE 10 DISTRIBTION.
35807C              THE PROBABILITY DENSITY FUNCTION IS:
35808C
35809C              f(X;R) = 2*R*X*(1 - EXP(-X**2)**(R-1)/EXP(X^2)
35810C                       X >  0; R > 0
35811C
35812C              WITH SHAPE PARAMETER R.
35813C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
35814C                                WHICH THE PROBABILITY DENSITY
35815C                                FUNCTION IS TO BE EVALUATED.
35816C                     --DR     = THE SHAPE PARAMETER
35817C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY DENSITY
35818C                                FUNCTION VALUE.
35819C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
35820C             FUNCTION VALUE PDF FOR THE BURR TYPE 10 DISTRIBUTION
35821C             WITH SHAPE PARAMETER R.
35822C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
35823C     RESTRICTIONS--NONE.
35824C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
35825C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
35826C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35827C     LANGUAGE--ANSI FORTRAN (1977)
35828C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35829C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35830C                 JOHN WILEY, 1994, PP. 53-54.
35831C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35832C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35833C                 (NOTE: THERE IS A TYPO IN THE DEVROYE CDF EQUATION,
35834C                 CORRECT FORM TAKEN FROM JOHNSON AND KOTZ).
35835C     WRITTEN BY--JAMES J. FILLIBEN
35836C                 STATISTICAL ENGINEERING DIVISION
35837C                 INFORMATION TECHNOLOGY LABORATORY
35838C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35839C                 GAITHERSBURG, MD 20899-8980
35840C                 PHONE--301-975-2855
35841C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35842C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
35843C     LANGUAGE--ANSI FORTRAN (1977)
35844C     VERSION NUMBER--2007.10
35845C     ORIGINAL VERSION--OCTOBER   2007.
35846C
35847C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35848C
35849C---------------------------------------------------------------------
35850C
35851      DOUBLE PRECISION DPDF
35852      DOUBLE PRECISION DX
35853      DOUBLE PRECISION DR
35854      DOUBLE PRECISION DTERM1
35855      DOUBLE PRECISION DTERM2
35856      DOUBLE PRECISION DTERM3
35857C
35858C---------------------------------------------------------------------
35859C
35860      INCLUDE 'DPCOP2.INC'
35861C
35862C-----DATA STATEMENTS-------------------------------------------------
35863C
35864C-----START POINT-----------------------------------------------------
35865C
35866C               ********************************************
35867C               **  STEP 1--                              **
35868C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35869C               ********************************************
35870C
35871      DPDF=0.0D0
35872C
35873      IF(DX.LE.0.0D0)THEN
35874        WRITE(ICOUT,105)
35875  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO B10PDF ',
35876     1         'IS NON-POSITIVE.')
35877        CALL DPWRST('XXX','BUG ')
35878        WRITE(ICOUT,147)DR
35879        CALL DPWRST('XXX','BUG ')
35880        GOTO9000
35881      ELSEIF(DR.LE.0.0D0)THEN
35882        WRITE(ICOUT,115)
35883  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B10PDF ',
35884     1         'NON-POSITIVE.')
35885        CALL DPWRST('XXX','BUG ')
35886        WRITE(ICOUT,147)DR
35887  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
35888        CALL DPWRST('XXX','BUG ')
35889        GOTO9000
35890      ENDIF
35891C
35892C               **************************************************
35893C               **  STEP 2B-                                    **
35894C               **  COMPUTE BURR TYPE 10 PDF                    **
35895C               **************************************************
35896C
35897      DTERM1=(DR-1.0D0)*DLOG(1.0D0 - DEXP(-DX**2))
35898      DTERM2=DLOG(2.0D0) + DLOG(DR) + DLOG(DX)
35899      DTERM3=DX**2
35900      DPDF=DEXP(DTERM1 + DTERM2 - DTERM3)
35901C
35902 9000 CONTINUE
35903      RETURN
35904      END
35905      SUBROUTINE B10PPF(DP,DR,DPPF)
35906C
35907C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
35908C              FUNCTION VALUE FOR THE BURR TYPE 10 DISTRIBUTION.
35909C              THE PERCENT POINT FUNCTION IS:
35910C
35911C              G(P;R) = SQRT(-LOG(1 - P**(1/R)))    0 < P < 1; R > 0
35912C
35913C              WITH SHAPE PARAMETER R.
35914C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
35915C                                WHICH THE PERCENT POINT
35916C                                FUNCTION IS TO BE EVALUATED.
35917C                     --DR     = THE SHAPE PARAMETER
35918C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
35919C                                FUNCTION VALUE.
35920C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
35921C             FUNCTION VALUE PPF FOR THE BURR TYPE 10 DISTRIBUTION
35922C             WITH SHAPE PARAMETER R.
35923C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
35924C     RESTRICTIONS--NONE.
35925C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
35926C     FORTRAN LIBRARY SUBROUTINES NEEDED--LOG, SQRT.
35927C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
35928C     LANGUAGE--ANSI FORTRAN (1977)
35929C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
35930C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
35931C                 JOHN WILEY, 1994, PP. 53-54.
35932C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
35933C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
35934C     WRITTEN BY--JAMES J. FILLIBEN
35935C                 STATISTICAL ENGINEERING DIVISION
35936C                 INFORMATION TECHNOLOGY LABORATORY
35937C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
35938C                 GAITHERSBURG, MD 20899-8980
35939C                 PHONE--301-975-2855
35940C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
35941C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
35942C     LANGUAGE--ANSI FORTRAN (1977)
35943C     VERSION NUMBER--2007.10
35944C     ORIGINAL VERSION--OCTOBER   2007.
35945C
35946C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
35947C
35948C---------------------------------------------------------------------
35949C
35950      DOUBLE PRECISION DPPF
35951      DOUBLE PRECISION DP
35952      DOUBLE PRECISION DR
35953C
35954C---------------------------------------------------------------------
35955C
35956      INCLUDE 'DPCOP2.INC'
35957C
35958C-----DATA STATEMENTS-------------------------------------------------
35959C
35960C-----START POINT-----------------------------------------------------
35961C
35962C               ********************************************
35963C               **  STEP 1--                              **
35964C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
35965C               ********************************************
35966C
35967      DPPF=0.0D0
35968C
35969      IF(DP.LE.0.0D0 .OR. DP.GE.1.0D0)THEN
35970        WRITE(ICOUT,105)
35971  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO B10PPF ',
35972     1         'IS OUTSIDE THE (0,1) INTERVAL.')
35973        CALL DPWRST('XXX','BUG ')
35974        WRITE(ICOUT,147)DP
35975        CALL DPWRST('XXX','BUG ')
35976        GOTO9000
35977      ELSEIF(DR.LE.0.0D0)THEN
35978        WRITE(ICOUT,115)
35979  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B10PPF ',
35980     1         'NON-POSITIVE.')
35981        CALL DPWRST('XXX','BUG ')
35982        WRITE(ICOUT,147)DR
35983  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
35984        CALL DPWRST('XXX','BUG ')
35985        GOTO9000
35986      ENDIF
35987C
35988C               **************************************************
35989C               **  STEP 2B-                                    **
35990C               **  COMPUTE BURR TYPE 10 PPF                    **
35991C               **************************************************
35992C
35993      DPPF=DSQRT(-DLOG(1.D0 - DP**(1.0D0/DR)))
35994C
35995 9000 CONTINUE
35996      RETURN
35997      END
35998      SUBROUTINE B10RAN(N,R,ISEED,X)
35999C
36000C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
36001C              FROM THE BURR TYPE 10 DISTRIBUTION WITH
36002C              SHAPE PARAMETER R.
36003C
36004C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
36005C                                OF RANDOM NUMBERS TO BE
36006C                                GENERATED.
36007C                     --R      = THE SINGLE PRECISION VALUE OF THE
36008C                                SHAPE PARAMETER R.
36009C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
36010C                                (OF DIMENSION AT LEAST N)
36011C                                INTO WHICH THE GENERATED
36012C                                RANDOM SAMPLE WILL BE PLACED.
36013C     OUTPUT--A RANDOM SAMPLE OF SIZE N
36014C             FROM THE BURR TYPE 10 DISTRIBUTION
36015C             WITH SHAPE PARAMETER R.
36016C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36017C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
36018C                   OF N FOR THIS SUBROUTINE.
36019C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, B10PPF.
36020C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36021C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
36022C     LANGUAGE--ANSI FORTRAN (1977)
36023C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36024C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36025C                 JOHN WILEY, 1994, PP. 53-54.
36026C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36027C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36028C     WRITTEN BY--JAMES J. FILLIBEN
36029C                 STATISTICAL ENGINEERING DIVISION
36030C                 INFORMATION TECHMOLOGY LABORATORY
36031C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36032C                 GAITHERSBURG, MD 20899-8980
36033C                 PHONE--301-975-2855
36034C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36035C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
36036C     LANGUAGE--ANSI FORTRAN (1977)
36037C     VERSION NUMBER--2007.10
36038C     ORIGINAL VERSION--OCTOBER   2007.
36039C
36040C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36041C
36042C---------------------------------------------------------------------
36043C
36044      DIMENSION X(*)
36045C
36046      DOUBLE PRECISION DTEMP
36047C
36048C---------------------------------------------------------------------
36049C
36050      INCLUDE 'DPCOP2.INC'
36051C
36052C-----START POINT-----------------------------------------------------
36053C
36054C     CHECK THE INPUT ARGUMENTS FOR ERRORS
36055C
36056      IF(N.LT.1)THEN
36057        WRITE(ICOUT, 5)
36058        CALL DPWRST('XXX','BUG ')
36059        WRITE(ICOUT,47)N
36060        CALL DPWRST('XXX','BUG ')
36061        GOTO9000
36062    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
36063     1         'BURR TYPE 10 RANDOM NUMBERS IS NON-POSITIVE')
36064   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
36065      ELSEIF(R.LE.0.0)THEN
36066        WRITE(ICOUT,201)
36067        CALL DPWRST('XXX','BUG ')
36068        WRITE(ICOUT,203)R
36069        CALL DPWRST('XXX','BUG ')
36070        GOTO9000
36071  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
36072  203   FORMAT('      THE VALUE OF R IS ',G15.7)
36073      ENDIF
36074C
36075C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
36076C
36077      CALL UNIRAN(N,ISEED,X)
36078C
36079C     GENERATE N SLOPE DISTRIBUTION RANDOM
36080C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
36081C
36082      DO300I=1,N
36083        CALL B10PPF(DBLE(X(I)),DBLE(R),DTEMP)
36084        X(I)=DBLE(DTEMP)
36085  300 CONTINUE
36086C
36087 9000 CONTINUE
36088      RETURN
36089      END
36090      SUBROUTINE B11CDF(DX,DR,DCDF)
36091C
36092C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
36093C              FUNCTION VALUE FOR THE BURR TYPE 11 DISTRIBTION.
36094C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
36095C
36096C              F(X;R) = [X - (1/(2*PI))*SIN(2*PI*X)]**R
36097C              0 <  X <  1; R > 0
36098C
36099C              WITH SHAPE PARAMETER R.
36100C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
36101C                                WHICH THE CUMULATIVE DISTRIBUTION
36102C                                FUNCTION IS TO BE EVALUATED.
36103C                     --DR     = THE SHAPE PARAMETER
36104C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
36105C                                DISTRIBUTION FUNCTION VALUE.
36106C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
36107C             FUNCTION VALUE CDF FOR THE BURR TYPE 11 DISTRIBUTION
36108C             WITH SHAPE PARAMETER R.
36109C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36110C     RESTRICTIONS--NONE.
36111C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36112C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
36113C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36114C     LANGUAGE--ANSI FORTRAN (1977)
36115C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36116C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36117C                 JOHN WILEY, 1994, PP. 53-54.
36118C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36119C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36120C     WRITTEN BY--JAMES J. FILLIBEN
36121C                 STATISTICAL ENGINEERING DIVISION
36122C                 INFORMATION TECHNOLOGY LABORATORY
36123C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36124C                 GAITHERSBURG, MD 20899-8980
36125C                 PHONE--301-975-2855
36126C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36127C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36128C     LANGUAGE--ANSI FORTRAN (1977)
36129C     VERSION NUMBER--2007.10
36130C     ORIGINAL VERSION--OCTOBER   2007.
36131C
36132C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36133C
36134C---------------------------------------------------------------------
36135C
36136      DOUBLE PRECISION DCDF
36137      DOUBLE PRECISION DX
36138      DOUBLE PRECISION DR
36139      DOUBLE PRECISION DTERM1
36140      DOUBLE PRECISION DTERM2
36141      DOUBLE PRECISION DPI
36142C
36143C---------------------------------------------------------------------
36144C
36145      INCLUDE 'DPCOP2.INC'
36146C
36147C-----DATA STATEMENTS-------------------------------------------------
36148C
36149      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
36150C
36151C-----START POINT-----------------------------------------------------
36152C
36153C               ********************************************
36154C               **  STEP 1--                              **
36155C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36156C               ********************************************
36157C
36158      DCDF=0.0D0
36159C
36160      IF(DR.LE.0.0D0)THEN
36161        WRITE(ICOUT,115)
36162  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B11CDF ',
36163     1         'IS NON-POSITIVE.')
36164        CALL DPWRST('XXX','BUG ')
36165        WRITE(ICOUT,147)DR
36166  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36167        CALL DPWRST('XXX','BUG ')
36168        GOTO9000
36169      ENDIF
36170C
36171C               **************************************************
36172C               **  STEP 2B-                                    **
36173C               **  COMPUTE BURR TYPE 11  CDF                   **
36174C               **************************************************
36175C
36176      IF(DX.LE.0.0D0)THEN
36177        DCDF=0.0D0
36178      ELSEIF(DX.GE.1.0D0)THEN
36179        DCDF=1.0D0
36180      ELSE
36181        DTERM1=SIN(2.0D0*DPI*DX)/(2.0D0*DPI)
36182        DTERM2=DX - DTERM1
36183        DCDF=DTERM2**DR
36184      ENDIF
36185C
36186 9000 CONTINUE
36187      RETURN
36188      END
36189      SUBROUTINE B11PDF(DX,DR,DPDF)
36190C
36191C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
36192C              FUNCTION VALUE FOR THE BURR TYPE 11 DISTRIBTION.
36193C              THE PROBABILITY DENSITY FUNCTION IS:
36194C
36195C              f(X;R) = R*{1 - COS(2*PI*DX)*
36196C                       (X - SIN(2*PI*X)/(2*PI)}**(R-1)
36197C              0 <  X <  1; R > 0
36198C
36199C              WITH SHAPE PARAMETER R.
36200C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
36201C                                WHICH THE PROBABILITY DENSITY
36202C                                FUNCTION IS TO BE EVALUATED.
36203C                     --DR     = THE SHAPE PARAMETER
36204C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
36205C                                DENSITY FUNCTION VALUE.
36206C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
36207C             FUNCTION VALUE PDF FOR THE BURR TYPE 11 DISTRIBUTION
36208C             WITH SHAPE PARAMETER R.
36209C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36210C     RESTRICTIONS--NONE.
36211C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36212C     FORTRAN LIBRARY SUBROUTINES NEEDED--SIN, COS.
36213C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36214C     LANGUAGE--ANSI FORTRAN (1977)
36215C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36216C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36217C                 JOHN WILEY, 1994, PP. 53-54.
36218C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36219C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36220C     WRITTEN BY--JAMES J. FILLIBEN
36221C                 STATISTICAL ENGINEERING DIVISION
36222C                 INFORMATION TECHNOLOGY LABORATORY
36223C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36224C                 GAITHERSBURG, MD 20899-8980
36225C                 PHONE--301-975-2855
36226C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36227C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36228C     LANGUAGE--ANSI FORTRAN (1977)
36229C     VERSION NUMBER--2007.10
36230C     ORIGINAL VERSION--OCTOBER   2007.
36231C
36232C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36233C
36234C---------------------------------------------------------------------
36235C
36236      DOUBLE PRECISION DPDF
36237      DOUBLE PRECISION DX
36238      DOUBLE PRECISION DR
36239      DOUBLE PRECISION DTERM1
36240      DOUBLE PRECISION DTERM2
36241      DOUBLE PRECISION DPI
36242C
36243C---------------------------------------------------------------------
36244C
36245      INCLUDE 'DPCOP2.INC'
36246C
36247C-----DATA STATEMENTS-------------------------------------------------
36248C
36249      DATA DPI / 3.1415926535 8979323846 2643383279 503 D0 /
36250C
36251C-----START POINT-----------------------------------------------------
36252C
36253C               ********************************************
36254C               **  STEP 1--                              **
36255C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36256C               ********************************************
36257C
36258      DPDF=0.0D0
36259C
36260      IF(DX.LE.0.0D0 .OR. DX.GE.1.0D0)THEN
36261        WRITE(ICOUT,105)
36262  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO B11PDF ',
36263     1         'IS NON-POSITIVE.')
36264        CALL DPWRST('XXX','BUG ')
36265        WRITE(ICOUT,147)DX
36266        CALL DPWRST('XXX','BUG ')
36267        GOTO9000
36268      ELSEIF(DR.LE.0.0D0)THEN
36269        WRITE(ICOUT,115)
36270  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B11PDF ',
36271     1         'IS NON-POSITIVE.')
36272        CALL DPWRST('XXX','BUG ')
36273        WRITE(ICOUT,147)DR
36274  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36275        CALL DPWRST('XXX','BUG ')
36276        GOTO9000
36277      ENDIF
36278C
36279C               **************************************************
36280C               **  STEP 2B-                                    **
36281C               **  COMPUTE BURR TYPE 11  PDF                   **
36282C               **************************************************
36283C
36284      DTERM1=1.0D0 - DCOS(2.0D0*DPI*DX)
36285      DTERM2=DX - DSIN(2.0D0*DPI*DX)/(2.0D0*DPI)
36286      DPDF=DR*DTERM1*(DTERM2**(DR-1.0D0))
36287C
36288 9000 CONTINUE
36289      RETURN
36290      END
36291      SUBROUTINE B11PPF(DP,DR,DPPF)
36292C
36293C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
36294C              FUNCTION VALUE FOR THE BURR TYPE 11 DISTRIBTION.
36295C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
36296C
36297C              F(X;R) = [X - (1/(2*PI))*SIN(2*PI*X)]**R
36298C              0 <  X <  1; R > 0
36299C
36300C              WITH SHAPE PARAMETER R.
36301C
36302C              THE PERCENT POINT FUNCTION IS COMPUTED BY
36303C              NUMERICALLY INVERTING THE CDF FUNCTION.
36304C
36305C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
36306C                                WHICH THE PERCENT POINT
36307C                                FUNCTION IS TO BE EVALUATED.
36308C                     --DR     = THE SHAPE PARAMETER
36309C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION PERCENT POINT
36310C                                FUNCTION VALUE.
36311C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
36312C             FUNCTION VALUE PPF FOR THE BURR TYPE 11 DISTRIBUTION
36313C             WITH SHAPE PARAMETER R.
36314C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36315C     RESTRICTIONS--NONE.
36316C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36317C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
36318C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36319C     LANGUAGE--ANSI FORTRAN (1977)
36320C     WRITTEN BY--JAMES J. FILLIBEN
36321C                 STATISTICAL ENGINEERING DIVISION
36322C                 INFORMATION TECHNOLOGY LABORATORY
36323C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36324C                 GAITHERSBURG, MD 20899-8980
36325C                 PHONE--301-975-2899
36326C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36327C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
36328C     LANGUAGE--ANSI FORTRAN (1977)
36329C     VERSION NUMBER--2007/10
36330C     ORIGINAL VERSION--OCTOBER   2007.
36331C
36332C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36333C
36334      DOUBLE PRECISION DP
36335      DOUBLE PRECISION DCDF
36336      DOUBLE PRECISION DR
36337      DOUBLE PRECISION DX
36338      DOUBLE PRECISION DPPF
36339      DOUBLE PRECISION XL
36340      DOUBLE PRECISION XR
36341      DOUBLE PRECISION FXL
36342      DOUBLE PRECISION FXR
36343      DOUBLE PRECISION FCS
36344      DOUBLE PRECISION P1
36345      DOUBLE PRECISION EPS
36346      DOUBLE PRECISION SIG
36347      DOUBLE PRECISION ZERO
36348C
36349C---------------------------------------------------------------------
36350C
36351      INCLUDE 'DPCOP2.INC'
36352C
36353      DATA EPS /1.0D-10/
36354      DATA SIG /1.0D-9/
36355      DATA ZERO /0.D0/
36356      DATA MAXIT /500/
36357C
36358C-----START POINT-----------------------------------------------------
36359C
36360C     CHECK THE INPUT ARGUMENTS FOR ERRORS
36361C
36362      DPPF=0.0D0
36363C
36364      IF(DP.LT.0.0D0 .OR. DP.GT.1.0D0)THEN
36365        WRITE(ICOUT,11)
36366   11   FORMAT('***** ERROR--THE FIRST ARGUMENT TO B11PPF IS ',
36367     1         'OUTSIDE THE ALLOWABLE (0,1) INTERVAL')
36368        CALL DPWRST('XXX','BUG ')
36369        WRITE(ICOUT,47)DP
36370        CALL DPWRST('XXX','BUG ')
36371        GOTO9000
36372      ELSEIF(DR.LE.0.0D0)THEN
36373        WRITE(ICOUT,15)
36374   15   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B11PPF ',
36375     1         'IS NON-POSITIVE.')
36376        CALL DPWRST('XXX','BUG ')
36377        WRITE(ICOUT,47)DR
36378   47   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36379        CALL DPWRST('XXX','BUG ')
36380        GOTO9000
36381      ELSEIF(DP.LE.0.0D0)THEN
36382        DPPF=0.0D0
36383        GOTO9000
36384      ELSEIF(DP.GE.1.0D0)THEN
36385        DPPF=1.0D0
36386        GOTO9000
36387      ENDIF
36388C
36389      IERR=0
36390      IC = 0
36391      XL = 0.0D0
36392      XR = 1.0D0
36393      FXL = -DP
36394      FXR = 1.0D0 - DP
36395C
36396      IF(FXL*FXR .GT. ZERO)THEN
36397        WRITE(ICOUT,11)
36398        CALL DPWRST('XXX','BUG ')
36399        WRITE(ICOUT,47)DP
36400        CALL DPWRST('XXX','BUG ')
36401        GOTO9000
36402      ENDIF
36403C
36404C  BISECTION METHOD
36405C
36406  105 CONTINUE
36407      DX = (XL+XR)*0.5D0
36408      CALL B11CDF(DX,DR,DCDF)
36409      P1=DCDF
36410      DPPF=DX
36411      FCS = P1 - DP
36412      IF(FCS*FXL.GT.ZERO)GOTO110
36413      XR = DX
36414      FXR = FCS
36415      GOTO115
36416  110 CONTINUE
36417      XL = DX
36418      FXL = FCS
36419  115 CONTINUE
36420      XRML = XR - XL
36421      IF(XRML.LE.SIG .AND. ABS(FCS).LE.EPS)GOTO9000
36422      IC = IC + 1
36423      IF(IC.LE.MAXIT)GOTO105
36424      WRITE(ICOUT,130)
36425  130 FORMAT('***** ERROR--B11PPF ROUTINE DID NOT CONVERGE.')
36426      CALL DPWRST('XXX','BUG ')
36427      GOTO9000
36428C
36429 9000 CONTINUE
36430      RETURN
36431      END
36432      SUBROUTINE B11RAN(N,R,ISEED,X)
36433C
36434C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
36435C              FROM THE BURR TYPE 11 DISTRIBUTION WITH
36436C              SHAPE PARAMETER R.
36437C
36438C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
36439C                                OF RANDOM NUMBERS TO BE
36440C                                GENERATED.
36441C                     --R      = THE SINGLE PRECISION VALUE OF THE
36442C                                SHAPE PARAMETER R.
36443C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
36444C                                (OF DIMENSION AT LEAST N)
36445C                                INTO WHICH THE GENERATED
36446C                                RANDOM SAMPLE WILL BE PLACED.
36447C     OUTPUT--A RANDOM SAMPLE OF SIZE N
36448C             FROM THE BURR TYPE 11 DISTRIBUTION
36449C             WITH SHAPE PARAMETER R.
36450C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36451C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
36452C                   OF N FOR THIS SUBROUTINE.
36453C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, B11PPF.
36454C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36455C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
36456C     LANGUAGE--ANSI FORTRAN (1977)
36457C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36458C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36459C                 JOHN WILEY, 1994, PP. 53-54.
36460C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36461C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36462C     WRITTEN BY--JAMES J. FILLIBEN
36463C                 STATISTICAL ENGINEERING DIVISION
36464C                 INFORMATION TECHMOLOGY LABORATORY
36465C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36466C                 GAITHERSBURG, MD 20899-8980
36467C                 PHONE--301-975-2855
36468C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36469C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
36470C     LANGUAGE--ANSI FORTRAN (1977)
36471C     VERSION NUMBER--2007.10
36472C     ORIGINAL VERSION--OCTOBER   2007.
36473C
36474C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36475C
36476C---------------------------------------------------------------------
36477C
36478      DIMENSION X(*)
36479C
36480      DOUBLE PRECISION DTEMP
36481C
36482C---------------------------------------------------------------------
36483C
36484      INCLUDE 'DPCOP2.INC'
36485C
36486C-----START POINT-----------------------------------------------------
36487C
36488C     CHECK THE INPUT ARGUMENTS FOR ERRORS
36489C
36490      IF(N.LT.1)THEN
36491        WRITE(ICOUT, 5)
36492        CALL DPWRST('XXX','BUG ')
36493        WRITE(ICOUT,47)N
36494        CALL DPWRST('XXX','BUG ')
36495        GOTO9000
36496    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
36497     1         'BURR TYPE 11 RANDOM NUMBERS IS NON-POSITIVE')
36498   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
36499      ELSEIF(R.LE.0.0)THEN
36500        WRITE(ICOUT,201)
36501        CALL DPWRST('XXX','BUG ')
36502        WRITE(ICOUT,203)R
36503        CALL DPWRST('XXX','BUG ')
36504        GOTO9000
36505  201   FORMAT('***** ERROR--THE R SHAPE PARAMETER IS NON-POSITIVE.')
36506  203   FORMAT('      THE VALUE OF R IS ',G15.7)
36507      ENDIF
36508C
36509C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
36510C
36511      CALL UNIRAN(N,ISEED,X)
36512C
36513C     GENERATE N BURR TYPE 11 DISTRIBUTION RANDOM
36514C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
36515C
36516      DO300I=1,N
36517        CALL B11PPF(DBLE(X(I)),DBLE(R),DTEMP)
36518        X(I)=DBLE(DTEMP)
36519  300 CONTINUE
36520C
36521 9000 CONTINUE
36522      RETURN
36523      END
36524      SUBROUTINE B12CDF(DX,DC,DK,DCDF)
36525C
36526C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
36527C              FUNCTION VALUE FOR THE BURR TYPE 12 DISTRIBTION.
36528C              THE CUMULATIVE DISTRIBUTION FUNCTION IS:
36529C
36530C              F(X;C,K) = 1 - (1+X**C)**(-K)   X >= 0
36531C
36532C              WITH SHAPE PARAMETERS C AND K.
36533C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
36534C                                WHICH THE CUMULATIVE DISTRIBUTION
36535C                                FUNCTION IS TO BE EVALUATED.
36536C                     --DC     = THE FIRST SHAPE PARAMETER
36537C                     --DK     = THE SECOND SHAPE PARAMETER
36538C     OUTPUT ARGUMENTS--DCDF   = THE DOUBLE PRECISION CUMULATIVE
36539C                                DISTRIBUTION FUNCTION VALUE.
36540C     OUTPUT--THE DOUBLE PRECISION CUMULATIVE DISTRIBUTION
36541C             FUNCTION VALUE CDF FOR THE BURR TYPE 12 DISTRIBUTION
36542C             WITH SHAPE PARAMETERS C AND K.
36543C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36544C     RESTRICTIONS--NONE.
36545C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36546C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36547C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36548C     LANGUAGE--ANSI FORTRAN (1977)
36549C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36550C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36551C                 JOHN WILEY, 1994, PP. 53-54.
36552C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36553C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36554C     WRITTEN BY--JAMES J. FILLIBEN
36555C                 STATISTICAL ENGINEERING DIVISION
36556C                 INFORMATION TECHNOLOGY LABORATORY
36557C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36558C                 GAITHERSBURG, MD 20899-8980
36559C                 PHONE--301-975-2855
36560C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36561C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36562C     LANGUAGE--ANSI FORTRAN (1977)
36563C     VERSION NUMBER--2007.10
36564C     ORIGINAL VERSION--OCTOBER   2007.
36565C
36566C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36567C
36568C---------------------------------------------------------------------
36569C
36570      DOUBLE PRECISION DCDF
36571      DOUBLE PRECISION DX
36572      DOUBLE PRECISION DC
36573      DOUBLE PRECISION DK
36574      DOUBLE PRECISION DTERM1
36575C
36576C---------------------------------------------------------------------
36577C
36578      INCLUDE 'DPCOP2.INC'
36579C
36580C-----DATA STATEMENTS-------------------------------------------------
36581C
36582C-----START POINT-----------------------------------------------------
36583C
36584C               ********************************************
36585C               **  STEP 1--                              **
36586C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36587C               ********************************************
36588C
36589      DCDF=0.0D0
36590C
36591      IF(DC.LE.0.0D0)THEN
36592        WRITE(ICOUT,115)
36593  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B12CDF ',
36594     1         'IS NON-POSITIVE.')
36595        CALL DPWRST('XXX','BUG ')
36596        WRITE(ICOUT,147)DC
36597  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36598        CALL DPWRST('XXX','BUG ')
36599        GOTO9000
36600      ELSEIF(DK.LE.0.0D0)THEN
36601        WRITE(ICOUT,125)
36602  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO B12CDF ',
36603     1         'IS NON-POSITIVE.')
36604        CALL DPWRST('XXX','BUG ')
36605        WRITE(ICOUT,147)DK
36606        CALL DPWRST('XXX','BUG ')
36607        GOTO9000
36608      ENDIF
36609C
36610C               **************************************************
36611C               **  STEP 2B-                                    **
36612C               **  COMPUTE BURR TYPE 12 CDF                    **
36613C               **************************************************
36614C
36615      IF(DX.LE.0.0D0)THEN
36616        DCDF=0.0D0
36617      ELSE
36618        DTERM1=1.0D0 + DX**DC
36619        DCDF=1.0D0 - DTERM1**(-DK)
36620      ENDIF
36621C
36622 9000 CONTINUE
36623      RETURN
36624      END
36625      SUBROUTINE B12PDF(DX,DC,DK,DPDF)
36626C
36627C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
36628C              FUNCTION VALUE FOR THE BURR TYPE 12 DISTRIBTION.
36629C              THE PROBABILITY DENSITY FUNCTION IS:
36630C
36631C              f(X;C,K) = C*K*X**(C-1)*(1 + X**C)**(-K-1)
36632C                         X > 0; C, K >0
36633C
36634C              WITH SHAPE PARAMETERS C AND K.
36635C     INPUT  ARGUMENTS--DX     = THE DOUBLE PRECISION VALUE AT
36636C                                WHICH THE PROBABILITY DENSITY
36637C                                FUNCTION IS TO BE EVALUATED.
36638C                     --DC     = THE FIRST SHAPE PARAMETER
36639C                     --DK     = THE SECOND SHAPE PARAMETER
36640C     OUTPUT ARGUMENTS--DPDF   = THE DOUBLE PRECISION PROBABILITY
36641C                                DENSITY FUNCTION VALUE.
36642C     OUTPUT--THE DOUBLE PRECISION PROBABILITY DENSITY
36643C             FUNCTION VALUE PDF FOR THE BURR TYPE 12 DISTRIBUTION
36644C             WITH SHAPE PARAMETERS C AND K.
36645C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36646C     RESTRICTIONS--NONE.
36647C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36648C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36649C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36650C     LANGUAGE--ANSI FORTRAN (1977)
36651C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36652C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36653C                 JOHN WILEY, 1994, PP. 53-54.
36654C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36655C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36656C     WRITTEN BY--JAMES J. FILLIBEN
36657C                 STATISTICAL ENGINEERING DIVISION
36658C                 INFORMATION TECHNOLOGY LABORATORY
36659C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36660C                 GAITHERSBURG, MD 20899-8980
36661C                 PHONE--301-975-2855
36662C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36663C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36664C     LANGUAGE--ANSI FORTRAN (1977)
36665C     VERSION NUMBER--2007.10
36666C     ORIGINAL VERSION--OCTOBER   2007.
36667C
36668C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36669C
36670C---------------------------------------------------------------------
36671C
36672      DOUBLE PRECISION DPDF
36673      DOUBLE PRECISION DX
36674      DOUBLE PRECISION DC
36675      DOUBLE PRECISION DK
36676      DOUBLE PRECISION DTERM1
36677      DOUBLE PRECISION DTERM2
36678C
36679C---------------------------------------------------------------------
36680C
36681      INCLUDE 'DPCOP2.INC'
36682C
36683C-----DATA STATEMENTS-------------------------------------------------
36684C
36685C-----START POINT-----------------------------------------------------
36686C
36687C               ********************************************
36688C               **  STEP 1--                              **
36689C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36690C               ********************************************
36691C
36692      DPDF=0.0D0
36693C
36694      IF(DX.LE.0.0D0)THEN
36695        WRITE(ICOUT,105)
36696  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO B12PDF ',
36697     1         'IS NON-POSITIVE.')
36698        CALL DPWRST('XXX','BUG ')
36699        WRITE(ICOUT,147)DX
36700        CALL DPWRST('XXX','BUG ')
36701        GOTO9000
36702      ELSEIF(DC.LE.0.0D0)THEN
36703        WRITE(ICOUT,115)
36704  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B12PDF ',
36705     1         'IS NON-POSITIVE.')
36706        CALL DPWRST('XXX','BUG ')
36707        WRITE(ICOUT,147)DC
36708  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36709        CALL DPWRST('XXX','BUG ')
36710        GOTO9000
36711      ELSEIF(DK.LE.0.0D0)THEN
36712        WRITE(ICOUT,125)
36713  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO B12PDF ',
36714     1         'IS NON-POSITIVE.')
36715        CALL DPWRST('XXX','BUG ')
36716        WRITE(ICOUT,147)DK
36717        CALL DPWRST('XXX','BUG ')
36718        GOTO9000
36719      ENDIF
36720C
36721C               **************************************************
36722C               **  STEP 2B-                                    **
36723C               **  COMPUTE BURR TYPE 12 PDF                    **
36724C               **************************************************
36725C
36726      DTERM1=DLOG(DC) + DLOG(DK) + (DC-1.0D0)*DLOG(DX)
36727      DTERM2=(-DK-1.0D0)*DLOG(1.0D0 + DX**DC)
36728      DPDF=DEXP(DTERM1+DTERM2)
36729C
36730 9000 CONTINUE
36731      RETURN
36732      END
36733      SUBROUTINE B12PPF(DP,DC,DK,DPPF)
36734C
36735C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
36736C              FUNCTION VALUE FOR THE BURR TYPE 12 DISTRIBTION.
36737C              THE PERCENT POINT FUNCTION IS:
36738C
36739C              G(P;C,K) = [(1-P)**(-1/K)-1]**(1/C)  0 <= P < 1; C, K > 0
36740C
36741C              WITH SHAPE PARAMETERS C AND K.
36742C     INPUT  ARGUMENTS--DP     = THE DOUBLE PRECISION VALUE AT
36743C                                WHICH THE PERCENT POINT
36744C                                FUNCTION IS TO BE EVALUATED.
36745C                     --DC     = THE FIRST SHAPE PARAMETER
36746C                     --DK     = THE SECOND SHAPE PARAMETER
36747C     OUTPUT ARGUMENTS--DPPF   = THE DOUBLE PRECISION PERCENT POINT
36748C                                FUNCTION VALUE.
36749C     OUTPUT--THE DOUBLE PRECISION PERCENT POINT
36750C             FUNCTION VALUE PPF FOR THE BURR TYPE 12 DISTRIBUTION
36751C             WITH SHAPE PARAMETERS C AND K.
36752C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36753C     RESTRICTIONS--NONE.
36754C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
36755C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36756C     MODE OF INTERNAL OPERATIONS--DOUBLE PRECISION.
36757C     LANGUAGE--ANSI FORTRAN (1977)
36758C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36759C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36760C                 JOHN WILEY, 1994, PP. 53-54.
36761C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36762C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36763C     WRITTEN BY--JAMES J. FILLIBEN
36764C                 STATISTICAL ENGINEERING DIVISION
36765C                 INFORMATION TECHNOLOGY LABORATORY
36766C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36767C                 GAITHERSBURG, MD 20899-8980
36768C                 PHONE--301-975-2855
36769C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36770C           OF THE NATION INSTITUTE OF STANDARDS AND TECHNOLOGY.
36771C     LANGUAGE--ANSI FORTRAN (1977)
36772C     VERSION NUMBER--2007.10
36773C     ORIGINAL VERSION--OCTOBER   2007.
36774C
36775C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36776C
36777C---------------------------------------------------------------------
36778C
36779      DOUBLE PRECISION DPPF
36780      DOUBLE PRECISION DP
36781      DOUBLE PRECISION DC
36782      DOUBLE PRECISION DK
36783C
36784C---------------------------------------------------------------------
36785C
36786      INCLUDE 'DPCOP2.INC'
36787C
36788C-----DATA STATEMENTS-------------------------------------------------
36789C
36790C-----START POINT-----------------------------------------------------
36791C
36792C               ********************************************
36793C               **  STEP 1--                              **
36794C               **  CHECK THE INPUT ARGUMENTS FOR ERRORS  **
36795C               ********************************************
36796C
36797      DPPF=0.0D0
36798C
36799      IF(DP.LT.0.0D0 .OR. DP.GE.1.0D0)THEN
36800        WRITE(ICOUT,105)
36801  105   FORMAT('***** ERROR--THE FIRST INPUT ARGUMENT TO B12PPF ',
36802     1         'IS OUTSIDE THE (0,1) INTERVAL.')
36803        CALL DPWRST('XXX','BUG ')
36804        WRITE(ICOUT,147)DP
36805        CALL DPWRST('XXX','BUG ')
36806        GOTO9000
36807      ELSEIF(DC.LE.0.0D0)THEN
36808        WRITE(ICOUT,115)
36809  115   FORMAT('***** ERROR--THE SECOND INPUT ARGUMENT TO B12PPF ',
36810     1         'NON-POSITIVE.')
36811        CALL DPWRST('XXX','BUG ')
36812        WRITE(ICOUT,147)DC
36813  147   FORMAT('      THE VALUE OF THE ARGUMENT IS ',G15.7)
36814        CALL DPWRST('XXX','BUG ')
36815        GOTO9000
36816      ELSEIF(DK.LE.0.0D0)THEN
36817        WRITE(ICOUT,125)
36818  125   FORMAT('***** ERROR--THE THIRD INPUT ARGUMENT TO B12PPF ',
36819     1         'NON-POSITIVE.')
36820        CALL DPWRST('XXX','BUG ')
36821        WRITE(ICOUT,147)DK
36822        CALL DPWRST('XXX','BUG ')
36823        GOTO9000
36824      ENDIF
36825C
36826C               **************************************************
36827C               **  STEP 2B-                                    **
36828C               **  COMPUTE BURR 12 PPF                         **
36829C               **************************************************
36830C
36831      IF(DP.LE.0.0D0)THEN
36832        DPPF=0.0D0
36833      ELSE
36834        DPPF=((1.0D0 - DP)**(-1.0D0/DK) - 1.0D0)**(1.0D0/DC)
36835      ENDIF
36836C
36837 9000 CONTINUE
36838      RETURN
36839      END
36840      SUBROUTINE B12RAN(N,C,AK,ISEED,X)
36841C
36842C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
36843C              FROM THE BURR TYPE 12 DISTRIBUTION WITH
36844C              SHAPE PARAMETERS C AND K.
36845C
36846C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
36847C                                OF RANDOM NUMBERS TO BE
36848C                                GENERATED.
36849C                     --C      = THE SINGLE PRECISION VALUE OF THE
36850C                                SHAPE PARAMETER C.
36851C                     --AK     = THE SINGLE PRECISION VALUE OF THE
36852C                                SHAPE PARAMETER K.
36853C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
36854C                                (OF DIMENSION AT LEAST N)
36855C                                INTO WHICH THE GENERATED
36856C                                RANDOM SAMPLE WILL BE PLACED.
36857C     OUTPUT--A RANDOM SAMPLE OF SIZE N
36858C             FROM THE BURR TYPE 12 DISTRIBUTION
36859C             WITH SHAPE PARAMETERS C AND K.
36860C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
36861C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
36862C                   OF N FOR THIS SUBROUTINE.
36863C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN, B12PPF.
36864C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
36865C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
36866C     LANGUAGE--ANSI FORTRAN (1977)
36867C     REFERENCES--JOHNSON, KOTZ, AND BALAKRISHNAN, "CONTINUOUS
36868C                 UNIVARIATE DISTRIBUTIONS--VOLUME I", SECOND EDITION,
36869C                 JOHN WILEY, 1994, PP. 53-54.
36870C               --LUC DEVROYE, "NON-UNIFORM RANDOM VARIATE
36871C                 GENERATION", 1986, SPRINGER-VERLANG, PP. 476-477.
36872C     WRITTEN BY--JAMES J. FILLIBEN
36873C                 STATISTICAL ENGINEERING DIVISION
36874C                 INFORMATION TECHMOLOGY LABORATORY
36875C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
36876C                 GAITHERSBURG, MD 20899-8980
36877C                 PHONE--301-975-2855
36878C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
36879C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
36880C     LANGUAGE--ANSI FORTRAN (1977)
36881C     VERSION NUMBER--2007.10
36882C     ORIGINAL VERSION--OCTOBER   2007.
36883C
36884C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
36885C
36886C---------------------------------------------------------------------
36887C
36888      DIMENSION X(*)
36889C
36890      DOUBLE PRECISION DTEMP
36891C
36892C---------------------------------------------------------------------
36893C
36894      INCLUDE 'DPCOP2.INC'
36895C
36896C-----START POINT-----------------------------------------------------
36897C
36898C     CHECK THE INPUT ARGUMENTS FOR ERRORS
36899C
36900      IF(N.LT.1)THEN
36901        WRITE(ICOUT, 5)
36902        CALL DPWRST('XXX','BUG ')
36903        WRITE(ICOUT,47)N
36904        CALL DPWRST('XXX','BUG ')
36905        GOTO9000
36906    5   FORMAT('***** ERROR--THE REQUESTED NUMBER OF ',
36907     1         'BURR TYPE 12 RANDOM NUMBERS IS NON-POSITIVE')
36908   47   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',I8)
36909      ELSEIF(C.LE.0.0)THEN
36910        WRITE(ICOUT,201)
36911        CALL DPWRST('XXX','BUG ')
36912        WRITE(ICOUT,203)C
36913        CALL DPWRST('XXX','BUG ')
36914        GOTO9000
36915  201   FORMAT('***** ERROR--THE C SHAPE PARAMETER IS NON-POSITIVE.')
36916  203   FORMAT('      THE VALUE OF R IS ',G15.7)
36917      ELSEIF(AK.LE.0.0)THEN
36918        WRITE(ICOUT,211)
36919        CALL DPWRST('XXX','BUG ')
36920        WRITE(ICOUT,213)AK
36921        CALL DPWRST('XXX','BUG ')
36922        GOTO9000
36923  211   FORMAT('***** ERROR--THE K SHAPE PARAMETER IS NON-POSITIVE.')
36924  213   FORMAT('      THE VALUE OF K IS ',G15.7)
36925      ENDIF
36926C
36927C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
36928C
36929      CALL UNIRAN(N,ISEED,X)
36930C
36931C     GENERATE N SLOPE DISTRIBUTION RANDOM
36932C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
36933C
36934      DO300I=1,N
36935        CALL B12PPF(DBLE(X(I)),DBLE(C),DBLE(AK),DTEMP)
36936        X(I)=DBLE(DTEMP)
36937  300 CONTINUE
36938C
36939 9000 CONTINUE
36940      RETURN
36941      END
36942      DOUBLE PRECISION FUNCTION bup(a,b,x,y,n,eps)
36943C-----------------------------------------------------------------------
36944C     EVALUATION OF IX(A,B) - IX(A+N,B) WHERE N IS A POSITIVE INTEGER.
36945C     EPS IS THE TOLERANCE USED.
36946C-----------------------------------------------------------------------
36947C     .. Scalar Arguments ..
36948      DOUBLE PRECISION a,b,eps,x,y
36949      INTEGER n
36950C     ..
36951C     .. Local Scalars ..
36952      DOUBLE PRECISION ap1,apb,d,l,r,t,w
36953      INTEGER i,k,kp1,mu,nm1
36954C     ..
36955C     .. External Functions ..
36956      DOUBLE PRECISION brcmp1,exparg
36957      EXTERNAL brcmp1,exparg
36958C     ..
36959C     .. Intrinsic Functions ..
36960      INTRINSIC abs,exp
36961C     ..
36962C     .. Executable Statements ..
36963C
36964C          OBTAIN THE SCALING FACTOR EXP(-MU) AND
36965C             EXP(MU)*(X**A*Y**B/BETA(A,B))/A
36966C
36967      apb = a + b
36968      ap1 = a + 1.0D0
36969      mu = 0
36970      d = 1.0D0
36971      IF (n.EQ.1 .OR. a.LT.1.0D0) GO TO 10
36972      IF (apb.LT.1.1D0*ap1) GO TO 10
36973      mu = int(abs(exparg(1)))
36974      k = int(exparg(0))
36975      IF (k.LT.mu) mu = k
36976      t = mu
36977      d = exp(-t)
36978C
36979   10 bup = brcmp1(mu,a,b,x,y)/a
36980      IF (n.EQ.1 .OR. bup.EQ.0.0D0) RETURN
36981      nm1 = n - 1
36982      w = d
36983C
36984C          LET K BE THE INDEX OF THE MAXIMUM TERM
36985C
36986      k = 0
36987      IF (b.LE.1.0D0) GO TO 50
36988      IF (y.GT.1.D-4) GO TO 20
36989      k = nm1
36990      GO TO 30
36991
36992   20 r = (b-1.0D0)*x/y - a
36993      IF (r.LT.1.0D0) GO TO 50
36994      k = nm1
36995      t = nm1
36996      IF (r.LT.t) k = int(r)
36997C
36998C          ADD THE INCREASING TERMS OF THE SERIES
36999C
37000   30 DO 40 i = 1,k
37001          l = i - 1
37002          d = ((apb+l)/ (ap1+l))*x*d
37003          w = w + d
37004   40 CONTINUE
37005      IF (k.EQ.nm1) GO TO 70
37006C
37007C          ADD THE REMAINING TERMS OF THE SERIES
37008C
37009   50 kp1 = k + 1
37010      DO 60 i = kp1,nm1
37011          l = i - 1
37012          d = ((apb+l)/ (ap1+l))*x*d
37013          w = w + d
37014          IF (d.LE.eps*w) GO TO 70
37015   60 CONTINUE
37016C
37017C               TERMINATE THE PROCEDURE
37018C
37019   70 bup = bup*w
37020      RETURN
37021
37022      END
37023      FUNCTION BVALU(T,A,N,K,IDERIV,X,INBV,WORK)
37024C***BEGIN PROLOGUE  BVALU
37025C***DATE WRITTEN   800901   (YYMMDD)
37026C***REVISION DATE  820801   (YYMMDD)
37027C***CATEGORY NO.  E3,K6
37028C***KEYWORDS  B-SPLINE,DATA FITTING,INTERPOLATION,SPLINE
37029C***AUTHOR  AMOS, D. E., (SNLA)
37030C***PURPOSE  Evaluates the B-representation of a B-spline at X for the
37031C            function value or any of its derivatives.
37032C***DESCRIPTION
37033C
37034C     Written by Carl de Boor and modified by D. E. Amos
37035C
37036C     Reference
37037C         SIAM J. Numerical Analysis, 14, No. 3, June, 1977, pp.441-472.
37038C
37039C     Abstract
37040C         BVALU is the BVALUE function of the reference.
37041C
37042C         BVALU evaluates the B-representation (T,A,N,K) of a B-spline
37043C         at X for the function value on IDERIV = 0 or any of its
37044C         derivatives on IDERIV = 1,2,...,K-1.  Right limiting values
37045C         (right derivatives) are returned except at the right end
37046C         point X=T(N+1) where left limiting values are computed.  The
37047C         spline is defined on T(K) .LE. X .LE. T(N+1).  BVALU returns
37048C         a fatal error message when X is outside of this interval.
37049C
37050C         To compute left derivatives or left limiting values at a
37051C         knot T(I), replace N by I-1 and set X=T(I), I=K+1,N+1.
37052C
37053C         BVALU calls INTRV
37054C
37055C     Description of Arguments
37056C         Input
37057C          T       - knot vector of length N+K
37058C          A       - B-spline coefficient vector of length N
37059C          N       - number of B-spline coefficients
37060C                    N = sum of knot multiplicities-K
37061C          K       - order of the B-spline, K .GE. 1
37062C          IDERIV  - order of the derivative, 0 .LE. IDERIV .LE. K-1
37063C                    IDERIV=0 returns the B-spline value
37064C          X       - argument, T(K) .LE. X .LE. T(N+1)
37065C          INBV    - an initialization parameter which must be set
37066C                    to 1 the first time BVALU is called.
37067C
37068C         Output
37069C          INBV    - INBV contains information for efficient process-
37070C                    ing after the initial call and INBV must not
37071C                    be changed by the user.  Distinct splines require
37072C                    distinct INBV parameters.
37073C          WORK    - work vector of length 3*K.
37074C          BVALU   - value of the IDERIV-th derivative at X
37075C
37076C     Error Conditions
37077C         An improper input is a fatal error
37078C***REFERENCES  C. DE BOOR, *PACKAGE FOR CALCULATING WITH B-SPLINES*,
37079C                 SIAM JOURNAL ON NUMERICAL ANALYSIS, VOLUME 14, NO. 3,
37080C                 JUNE 1977, PP. 441-472.
37081C***ROUTINES CALLED  INTRV,XERROR
37082C***END PROLOGUE  BVALU
37083C
37084C
37085      INTEGER I,IDERIV,IDERP1,IHI,IHMKMJ,ILO,IMK,IMKPJ, INBV, IPJ,
37086     1 IP1, IP1MJ, J, JJ, J1, J2, K, KMIDER, KMJ, KM1, KPK, MFLAG, N
37087      REAL A, FKMJ, T, WORK, X
37088C     DIMENSION T(N+K), WORK(3*K)
37089      DIMENSION T(*), A(N), WORK(*)
37090C
37091C---------------------------------------------------------------------
37092C
37093      INCLUDE 'DPCOP2.INC'
37094C
37095C***FIRST EXECUTABLE STATEMENT  BVALU
37096      BVALU = 0.0E0
37097      IF(K.LT.1) GO TO 102
37098      IF(N.LT.K) GO TO 101
37099      IF(IDERIV.LT.0 .OR. IDERIV.GE.K) GO TO 110
37100      KMIDER = K - IDERIV
37101C
37102C *** FIND *I* IN (K,N) SUCH THAT T(I) .LE. X .LT. T(I+1)
37103C     (OR, .LE. T(I+1) IF T(I) .LT. T(I+1) = T(N+1)).
37104      KM1 = K - 1
37105      CALL INTRV(T, N+1, X, INBV, I, MFLAG)
37106      IF (X.LT.T(K)) GO TO 120
37107      IF (MFLAG.EQ.0) GO TO 20
37108      IF (X.GT.T(I)) GO TO 130
37109   10 IF (I.EQ.K) GO TO 140
37110      I = I - 1
37111      IF (X.EQ.T(I)) GO TO 10
37112C
37113C *** DIFFERENCE THE COEFFICIENTS *IDERIV* TIMES
37114C     WORK(I) = AJ(I), WORK(K+I) = DP(I), WORK(K+K+I) = DM(I), I=1.K
37115C
37116   20 IMK = I - K
37117      DO 30 J=1,K
37118        IMKPJ = IMK + J
37119        WORK(J) = A(IMKPJ)
37120   30 CONTINUE
37121      IF (IDERIV.EQ.0) GO TO 60
37122      DO 50 J=1,IDERIV
37123        KMJ = K - J
37124        FKMJ = FLOAT(KMJ)
37125        DO 40 JJ=1,KMJ
37126          IHI = I + JJ
37127          IHMKMJ = IHI - KMJ
37128          WORK(JJ) = (WORK(JJ+1)-WORK(JJ))/(T(IHI)-T(IHMKMJ))*FKMJ
37129   40   CONTINUE
37130   50 CONTINUE
37131C
37132C *** COMPUTE VALUE AT *X* IN (T(I),(T(I+1)) OF IDERIV-TH DERIVATIVE,
37133C     GIVEN ITS RELEVANT B-SPLINE COEFF. IN AJ(1),...,AJ(K-IDERIV).
37134   60 IF (IDERIV.EQ.KM1) GO TO 100
37135      IP1 = I + 1
37136      KPK = K + K
37137      J1 = K + 1
37138      J2 = KPK + 1
37139      DO 70 J=1,KMIDER
37140        IPJ = I + J
37141        WORK(J1) = T(IPJ) - X
37142        IP1MJ = IP1 - J
37143        WORK(J2) = X - T(IP1MJ)
37144        J1 = J1 + 1
37145        J2 = J2 + 1
37146   70 CONTINUE
37147      IDERP1 = IDERIV + 1
37148      DO 90 J=IDERP1,KM1
37149        KMJ = K - J
37150        ILO = KMJ
37151        DO 80 JJ=1,KMJ
37152          WORK(JJ) = (WORK(JJ+1)*WORK(KPK+ILO)+WORK(JJ)
37153     1              *WORK(K+JJ))/(WORK(KPK+ILO)+WORK(K+JJ))
37154          ILO = ILO - 1
37155   80   CONTINUE
37156   90 CONTINUE
37157  100 BVALU = WORK(1)
37158      RETURN
37159C
37160C
37161  101 CONTINUE
37162      WRITE(ICOUT,999)
37163  999 FORMAT(1X)
37164      CALL DPWRST('XXX','BUG ')
37165      WRITE(ICOUT,901)
37166      CALL DPWRST('XXX','BUG ')
37167  901 FORMAT('*****FROM BVALU, N DOES NOT SATISFY N.GE.K *****')
37168      RETURN
37169  102 CONTINUE
37170      WRITE(ICOUT,999)
37171      CALL DPWRST('XXX','BUG ')
37172      WRITE(ICOUT,902)
37173      CALL DPWRST('XXX','BUG ')
37174  902 FORMAT('*****FROM BVALU, K DOES NOT SATISFY K.GE.1 *****')
37175      RETURN
37176  110 CONTINUE
37177      WRITE(ICOUT,999)
37178      CALL DPWRST('XXX','BUG ')
37179      WRITE(ICOUT,903)
37180      CALL DPWRST('XXX','BUG ')
37181      WRITE(ICOUT,904)
37182      CALL DPWRST('XXX','BUG ')
37183  903 FORMAT('*****FROM BVALU, IDERIV DOES NOT SATISFY')
37184  904 FORMAT('     0.LE.IDERIV.LT.K                    *****')
37185      RETURN
37186  120 CONTINUE
37187      WRITE(ICOUT,999)
37188      CALL DPWRST('XXX','BUG ')
37189      WRITE(ICOUT,921)
37190      CALL DPWRST('XXX','BUG ')
37191  921 FORMAT('*****FROM BVALU, X IS N0T GREATER THAN OR EQUAL TO T(K)')
37192      RETURN
37193  130 CONTINUE
37194      WRITE(ICOUT,999)
37195      CALL DPWRST('XXX','BUG ')
37196      WRITE(ICOUT,931)
37197      CALL DPWRST('XXX','BUG ')
37198  931 FORMAT('*****FROM BVALU, X IS NOT LESS THAN OR EQUAL TO T(N+1)')
37199      RETURN
37200  140 CONTINUE
37201      WRITE(ICOUT,999)
37202      CALL DPWRST('XXX','BUG ')
37203      WRITE(ICOUT,941)
37204      CALL DPWRST('XXX','BUG ')
37205      WRITE(ICOUT,942)
37206      CALL DPWRST('XXX','BUG ')
37207  941 FORMAT('*****FROM BVALU, A LEFT LIMITING VALUE CANN0T BE')
37208  942 FORMAT('     OBTAINED AT T(K)                            *****')
37209      RETURN
37210      END
37211      SUBROUTINE BVNCDF(X1,X2,CORR,CDF)
37212C
37213C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
37214C              FUNCTION VALUE FOR THE BIVARIATE NORMAL (GAUSSIAN)
37215C              DISTRIBUTION WITH MEANS = 0 AND STANDARD DEVIATIONS = 1
37216C              AND WITH A CORRELATION OF CORR.
37217C              F(X) = (1/SQRT(2*PI))*EXP(-X*X/2).
37218C     INPUT  ARGUMENTS--X1     = THE SINGLE PRECISION VALUE AT WHICH
37219C                                THE FIRST CUMULATIVE DISTRIBUTION
37220C                                FUNCTION IS TO BE EVALUATED.
37221C                     --X1     = THE SINGLE PRECISION VALUE AT WHICH
37222C                                THE SECOND CUMULATIVE DISTRIBUTION
37223C                                FUNCTION IS TO BE EVALUATED.
37224C                     --CORR   = THE CORRELATION BETWEEN THE 2
37225C                                DISTRIBUTIONS
37226C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
37227C                                DISTRIBUTION FUNCTION VALUE.
37228C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
37229C             FUNCTION VALUE CDF.
37230C     PRINTING--NONE.
37231C     RESTRICTIONS--NONE.
37232C     OTHER DATAPAC   SUBROUTINES NEEDED--NORCDF, THA.
37233C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
37234C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37235C     LANGUAGE--ANSI FORTRAN (1977)
37236C     REFERENCES--"A REMARK ON ALGORITHM AS76: AN INTEGRAL USEFUL IN
37237C                 CALCULATING NONCENTRAL T AND BIVARIATE NORMAL
37238C                 PROBABILITIES", BOYS, APPLIED STATISTICS,
37239C               --"TABLES FOR COMPUTING BIVARIATE NORMAL PROBABILITIES"
37240C                 ANNALS OF MATHEMATICAL STATISTICS, OWEN, 1956 (1075-
37241C                 1090).
37242C     WRITTEN BY--JAMES J. FILLIBEN
37243C                 STATISTICAL ENGINEERING DIVISION
37244C                 INFORMATION TECHNOLOGY LABORATORY
37245C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37246C                 GAITHERSBURG, MD 20899-8980
37247C                 PHONE--301-975-2855
37248C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37249C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37250C     LANGUAGE--ANSI FORTRAN (1966)
37251C     VERSION NUMBER--94.10
37252C     ORIGINAL VERSION--OCTOBER   1994.
37253C
37254C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37255C
37256C---------------------------------------------------------------------
37257C
37258      INCLUDE 'DPCOP2.INC'
37259C
37260      DATA ONE/1.0/
37261      DATA EPS/0.0000001/
37262C
37263C-----START POINT-----------------------------------------------------
37264C
37265      ACORR=ABS(CORR)
37266      IF(ACORR.GT.1.0)THEN
37267        WRITE(ICOUT,10)
37268 10     FORMAT('***** ERROR--THIRD TERM TO BVNCDF IS OUTSIDE THE ',
37269     1   'INTERVAL (-1,1).  *****')
37270        CALL DPWRST('XXX','BUG ')
37271        CDF=0.0
37272        GOTO9999
37273      ENDIF
37274C
37275C  CORRELATION OF 1 IS A SPECIAL CASE
37276C
37277      IF(ACORR.EQ.1.0)THEN
37278        TERM1=MIN(X1,X2)
37279        CALL NORCDF(TERM1,CDF)
37280        GOTO9999
37281      ENDIF
37282C
37283      XH=X1
37284      XK=X2
37285      IF(ABS(XH).LE.EPS .AND. ABS(XK).LE.EPS)THEN
37286        XH=EPS
37287        XK=-EPS
37288      ENDIF
37289      CALL NORCDF(XH,TERM1)
37290      CALL NORCDF(XK,TERM2)
37291      TERM3=1.0
37292      IF(XH*XK.GT.0.0 .OR. (XH*XK.EQ.0.0.AND.XH+XK.GE.0.0))TERM3=0.0
37293      A1=(XK-CORR*XH)/SQRT(1.0-CORR*CORR)
37294      A2=XH
37295      IF(A1.EQ.0.0.AND.A2.EQ.0.0)A1=0.000001
37296      TERM4=THA(XH,ONE,A1,A2)
37297      A1=(XH-CORR*XK)/SQRT(1.0-CORR*CORR)
37298      A2=XK
37299      IF(A1.EQ.0.0.AND.A2.EQ.0.0)A1=0.000001
37300      TERM5=THA(XK,ONE,A1,A2)
37301      CDF=0.5*(TERM1+TERM2-TERM3)-TERM4-TERM5
37302      GOTO9999
37303C
37304 9999 CONTINUE
37305      RETURN
37306      END
37307      SUBROUTINE BVNPDF(X1,X2,CORR,PDF)
37308C
37309C     PURPOSE--THIS SUBROUTINE COMPUTES THE PROBABILITY DENSITY
37310C              FUNCTION VALUE FOR THE BIVARIATE NORMAL (GAUSSIAN)
37311C              DISTRIBUTION WITH MEANS = 0 AND STANDARD DEVIATIONS = 1
37312C              AND WITH A CORRELATION OF CORR.  USE THE FOLLOWING
37313C              FORMULA FROM ABRAMOWITZ AND STEGUM
37314C              F(X) = (1-P**2)**(-1/2)*NORPDF(X1)
37315C                     *NORPDF((X2-P*X1)/(SQRT(1-P**2)))
37316C              WHERE NORPDF IS THE UNIVARIATE NORMAL PDF FUNCTION.
37317C     INPUT  ARGUMENTS--X1     = THE SINGLE PRECISION VALUE AT WHICH
37318C                                THE FIRST PROBABILTY DENSITY
37319C                                FUNCTION IS TO BE EVALUATED.
37320C                     --X1     = THE SINGLE PRECISION VALUE AT WHICH
37321C                                THE SECOND PROBABILITY DENSITY
37322C                                FUNCTION IS TO BE EVALUATED.
37323C                     --CORR   = THE CORRELATION BETWEEN THE 2
37324C                                DISTRIBUTIONS
37325C     OUTPUT ARGUMENTS--PDF    = THE SINGLE PRECISION CUMULATIVE
37326C                                DISTRIBUTION FUNCTION VALUE.
37327C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
37328C             FUNCTION VALUE PDF.
37329C     PRINTING--NONE.
37330C     RESTRICTIONS--NONE.
37331C     OTHER DATAPAC   SUBROUTINES NEEDED--NORPDF
37332C     FORTRAN LIBRARY SUBROUTINES NEEDED--SQRT.
37333C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37334C     LANGUAGE--ANSI FORTRAN (1977)
37335C     REFERENCES--"AMS 55", ABRAMOWITZ AND STEGUM.
37336C     WRITTEN BY--JAMES J. FILLIBEN
37337C                 STATISTICAL ENGINEERING DIVISION
37338C                 INFORMATION TECHNOLOGY LABORATORY
37339C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37340C                 GAITHERSBURG, MD 20899-8980
37341C                 PHONE--301-975-2855
37342C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37343C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37344C     LANGUAGE--ANSI FORTRAN (1966)
37345C     VERSION NUMBER--95.9
37346C     ORIGINAL VERSION--SEPTEMBER 1995.
37347C
37348C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37349C
37350C---------------------------------------------------------------------
37351C
37352      INCLUDE 'DPCOP2.INC'
37353C
37354C-----START POINT-----------------------------------------------------
37355C
37356      ACORR=ABS(CORR)
37357      IF(ACORR.GT.1.0)THEN
37358        WRITE(ICOUT,10)
37359 10     FORMAT('***** ERROR--THIRD TERM TO BVNPDF IS OUTSIDE THE ',
37360     1   'INTERVAL (-1,1).  *****')
37361        CALL DPWRST('XXX','BUG ')
37362        PDF=0.0
37363        GOTO9999
37364      ENDIF
37365C
37366C  CORRELATION OF 1 IS A SPECIAL CASE (UNDEFINED SINCE GET DIVISION
37367C  BY ZERO IN THE FORMULA).
37368C
37369      IF(ACORR.EQ.1.0)THEN
37370        PDF=0.0
37371        GOTO9999
37372      ENDIF
37373C
37374      TERM1=(1.0-ACORR*ACORR)
37375      TERM2=1.0/SQRT(TERM1)
37376      CALL NORPDF(X1,TERM3)
37377      ARG1=(X2-CORR*X1)/SQRT(1.0-CORR*CORR)
37378      CALL NORPDF(ARG1,TERM4)
37379C
37380      PDF=TERM2*TERM3*TERM4
37381C
37382 9999 CONTINUE
37383      RETURN
37384      END
37385      SUBROUTINE BWECDF(X,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,CDF,DCDF)
37386C
37387C     PURPOSE--THIS SUBROUTINE COMPUTES THE CUMULATIVE DISTRIBUTION
37388C              FUNCTION VALUE FOR THE BI-WEIBULL DISTRIBUTION AS
37389C              AS DEFINED IN THE THIRD EDITION OF "STATISTICAL
37390C              DISTRIBUTIONS", THIRD EDITION, EVANS, HASTINGS, AND
37391C              PEACOCK.  THIS DISTRIBUTION IS RELATED TO, BUT SOMEWHAT
37392C              DIFFERENT THAN, A STRAIGHT MIXTURE OF TWO WEIBULL
37393C              DISTRIBUTIONS.  THE CDF IS DEFINED AS:
37394C              F(X,S1,G1,L2,S2,G2) =
37395C               1 - EXP[-(X/S1)**G1]                  0 < X < L2
37396C               1 - EXP[-{(X/S1)**G1 +
37397C                   [(X-L2)/S2]**G2}]                 X > L2
37398C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
37399C                                WHICH THE CUMULATIVE DISTRIBUTION
37400C                                FUNCTION IS TO BE EVALUATED.
37401C                                X SHOULD BE NON-NEGATIVE.
37402C                     --ASCAL1 = SCALE PARAMETER (FIRST PART)
37403C                     --GAMMA1 = SHAPE PARAMETER (FIRST PART)
37404C                     --ALOC2  = LOCATION PARAMETER (SECOND PART)
37405C                     --ASCAL2 = SCALE PARAMETER (SECOND PART)
37406C                     --GAMMA2 = SHAPE PARAMETER (SECOND PART)
37407C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION CUMULATIVE
37408C                                DISTRIBUTION FUNCTION VALUE.
37409C     OUTPUT--THE SINGLE PRECISION CUMULATIVE DISTRIBUTION
37410C             FUNCTION VALUE CDF FOR THE WEIBULL DISTRIBUTION
37411C             WITH 5 SHAPE PARAMETERS
37412C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
37413C     RESTRICTIONS--X SHOULD BE NON-NEGATIVE.
37414C                 --GAMMA1,GAMMA2,ASCAL1,ASCAL2,ALOC2 SHOULD BE
37415C                   POSITIVE.
37416C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
37417C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
37418C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37419C     LANGUAGE--ANSI FORTRAN (1977)
37420C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
37421C                 DISTRIBUTIONS--THIRD EDITION,
37422C                 2000, PP. 200-202.
37423C     WRITTEN BY--JAMES J. FILLIBEN
37424C                 STATISTICAL ENGINEERING DIVISION
37425C                 INFORMATION TECHNOLOGY LABORATORY
37426C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37427C                 GAITHERSBURG, MD 20899-8980
37428C                 PHONE--301-975-2855
37429C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37430C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37431C     LANGUAGE--ANSI FORTRAN (1966)
37432C     VERSION NUMBER--2002.5
37433C     ORIGINAL VERSION--MAY       2002.
37434C
37435C---------------------------------------------------------------------
37436C
37437      DOUBLE PRECISION DS1
37438      DOUBLE PRECISION DG1
37439      DOUBLE PRECISION DL2
37440      DOUBLE PRECISION DS2
37441      DOUBLE PRECISION DG2
37442      DOUBLE PRECISION DX
37443      DOUBLE PRECISION DCDF
37444      DOUBLE PRECISION DTERM1
37445      DOUBLE PRECISION DTERM2
37446C
37447      INCLUDE 'DPCOP2.INC'
37448C
37449C-----START POINT-----------------------------------------------------
37450C
37451C     CHECK THE INPUT ARGUMENTS FOR ERRORS
37452C
37453      DCDF=0.0D0
37454      CDF=0.0
37455      IF(ASCAL1.LE.0.0)THEN
37456        WRITE(ICOUT,5)
37457    5   FORMAT('***** ERROR--THE SCALE(1) PARAMETER FOR BWECDF ',
37458     1         'IS NON-POSITIVE.')
37459        CALL DPWRST('XXX','BUG ')
37460        WRITE(ICOUT,46)ASCAL1
37461   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
37462        CALL DPWRST('XXX','BUG ')
37463        GOTO9999
37464      ELSEIF(GAMMA1.LE.0.0)THEN
37465        WRITE(ICOUT,15)
37466   15   FORMAT('***** ERROR--THE GAMMA(1) SHAPE PARAMETER FOR ',
37467     1        'BWECDF IS NON-POSITIVE.')
37468        CALL DPWRST('XXX','BUG ')
37469        WRITE(ICOUT,46)GAMMA1
37470        CALL DPWRST('XXX','BUG ')
37471        GOTO9999
37472      ELSEIF(ASCAL2.LE.0.0)THEN
37473        WRITE(ICOUT,25)
37474   25   FORMAT('***** ERROR--THE SCALE(2) PARAMETER FOR ',
37475     1         'BWECDF IS NON-POSITIVE.')
37476        CALL DPWRST('XXX','BUG ')
37477        WRITE(ICOUT,46)ASCAL2
37478        CALL DPWRST('XXX','BUG ')
37479        GOTO9999
37480      ELSEIF(GAMMA2.LE.0.0)THEN
37481        WRITE(ICOUT,35)
37482   35   FORMAT('***** ERROR--THE GAMMA(2) SHAPE PARAMETER FOR ',
37483     1         'BWECDF IS NON-POSITIVE.')
37484        CALL DPWRST('XXX','BUG ')
37485        WRITE(ICOUT,46)GAMMA2
37486        CALL DPWRST('XXX','BUG ')
37487        GOTO9999
37488      ELSEIF(ALOC2.LE.0.0)THEN
37489        WRITE(ICOUT,45)
37490   45   FORMAT('***** ERROR--THE LOCATION(2) PARAMETER FOR ',
37491     1         'BWECDF IS NON-POSITIVE.')
37492        CALL DPWRST('XXX','BUG ')
37493        WRITE(ICOUT,46)ALOC2
37494        CALL DPWRST('XXX','BUG ')
37495        GOTO9999
37496      ENDIF
37497C
37498      IF(X.LE.0.0)GOTO9999
37499C
37500      DX=DBLE(X)
37501      DG1=DBLE(GAMMA1)
37502      DS1=DBLE(ASCAL1)
37503      DG2=DBLE(GAMMA2)
37504      DS2=DBLE(ASCAL2)
37505      DL2=DBLE(ALOC2)
37506C
37507      IF(DX.LE.DL2)THEN
37508         DCDF=DEXP(-(DX/DS1)**DG1)
37509      ELSE
37510         DTERM1=(DX/DS1)**DG1
37511         DTERM2=((DX-DL2)/DS2)**DG2
37512         DCDF=DEXP(-(DTERM1 + DTERM2))
37513      ENDIF
37514      DCDF=1.0D0 - DCDF
37515      CDF=REAL(DCDF)
37516C
37517 9999 CONTINUE
37518      RETURN
37519      END
37520      SUBROUTINE BWEHAZ(X,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,HAZ,DHAZ)
37521C
37522C     PURPOSE--THIS SUBROUTINE COMPUTES THE HAZARD
37523C              FUNCTION VALUE FOR THE BI-WEIBULL DISTRIBUTION AS
37524C              AS DEFINED IN THE THIRD EDITION OF "STATISTICAL
37525C              DISTRIBUTIONS", THIRD EDITION, EVANS, HASTINGS, AND
37526C              PEACOCK.  THIS DISTRIBUTION IS RELATED TO, BUT SOMEWHAT
37527C              DIFFERENT THAN, A STRAIGHT MIXTURE OF TWO WEIBULL
37528C              DISTRIBUTIONS.  THE HAZARD FUNCTION IS DEFINED AS:
37529C              h(X,S1,G1,L2,S2,G2) =
37530C               (1/S1)*G1*(X/S1)**(G1-1)          0 < X < L2
37531C               (1/S1)*G1*(X/S1)**(G1-1) +
37532C               (G2/S2)*((X-L2)/S2)**(G2-1)       X >= L2
37533C     INPUT  ARGUMENTS--X      = THE SINGLE PRECISION VALUE AT
37534C                                WHICH THE HAZARD
37535C                                FUNCTION IS TO BE EVALUATED.
37536C                                X SHOULD BE NON-NEGATIVE.
37537C                     --ASCAL1 = SCALE PARAMETER (FIRST PART)
37538C                     --GAMMA1 = SHAPE PARAMETER (FIRST PART)
37539C                     --ALOC2  = LOCATION PARAMETER (SECOND PART)
37540C                     --ASCAL2 = SCALE PARAMETER (SECOND PART)
37541C                     --GAMMA2 = SHAPE PARAMETER (SECOND PART)
37542C     OUTPUT ARGUMENTS--HAZ    = THE SINGLE PRECISION HAZARD
37543C                                FUNCTION VALUE.
37544C     OUTPUT--THE SINGLE PRECISION HAZARD
37545C             FUNCTION VALUE HAZ FOR THE WEIBULL DISTRIBUTION
37546C             WITH 5 SHAPE PARAMETERS
37547C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
37548C     RESTRICTIONS--X SHOULD BE NON-NEGATIVE.
37549C                 --GAMMA1,GAMMA2,ASCAL1,ASCAL2,ALOC2 SHOULD BE
37550C                   POSITIVE.
37551C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
37552C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
37553C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37554C     LANGUAGE--ANSI FORTRAN (1977)
37555C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
37556C                 DISTRIBUTIONS--THIRD EDITION,
37557C                 2000, PP. 200-202.
37558C     WRITTEN BY--JAMES J. FILLIBEN
37559C                 STATISTICAL ENGINEERING DIVISION
37560C                 INFORMATION TECHNOLOGY LABORATORY
37561C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37562C                 GAITHERSBURG, MD 20899-8980
37563C                 PHONE--301-975-2855
37564C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37565C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37566C     LANGUAGE--ANSI FORTRAN (1966)
37567C     VERSION NUMBER--2002.5
37568C     ORIGINAL VERSION--MAY       2002.
37569C
37570C---------------------------------------------------------------------
37571C
37572      DOUBLE PRECISION DS1
37573      DOUBLE PRECISION DG1
37574      DOUBLE PRECISION DL2
37575      DOUBLE PRECISION DS2
37576      DOUBLE PRECISION DG2
37577      DOUBLE PRECISION DX
37578      DOUBLE PRECISION DHAZ
37579      DOUBLE PRECISION DTERM1
37580      DOUBLE PRECISION DTERM2
37581C
37582      INCLUDE 'DPCOP2.INC'
37583C
37584C-----START POINT-----------------------------------------------------
37585C
37586C     CHECK THE INPUT ARGUMENTS FOR ERRORS
37587C
37588      HAZ=0.0
37589      DHAZ=0.0D0
37590      IF(ASCAL1.LE.0.0)THEN
37591        WRITE(ICOUT,5)
37592    5   FORMAT('***** ERROR--THE SCALE(1) PARAMETER FOR ',
37593     1         'BWEHAZ IS NON-POSITIVE.')
37594        CALL DPWRST('XXX','BUG ')
37595        WRITE(ICOUT,46)ASCAL1
37596   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
37597        CALL DPWRST('XXX','BUG ')
37598        GOTO9999
37599      ELSEIF(GAMMA1.LE.0.0)THEN
37600        WRITE(ICOUT,15)
37601   15   FORMAT('***** ERROR--THE GAMMA(1) SHAPE PARAMETER FOR ',
37602     1         'BWEHAZ IS NON-POSITIVE.')
37603        CALL DPWRST('XXX','BUG ')
37604        WRITE(ICOUT,46)GAMMA1
37605        CALL DPWRST('XXX','BUG ')
37606        GOTO9999
37607      ELSEIF(ASCAL2.LE.0.0)THEN
37608        WRITE(ICOUT,25)
37609   25   FORMAT('***** ERROR--THE SCALE(2) PARAMETER FOR ',
37610     1         'BWEHAZ IS NON-POSITIVE.')
37611        CALL DPWRST('XXX','BUG ')
37612        WRITE(ICOUT,46)ASCAL2
37613        CALL DPWRST('XXX','BUG ')
37614        GOTO9999
37615      ELSEIF(GAMMA2.LE.0.0)THEN
37616        WRITE(ICOUT,35)
37617   35   FORMAT('***** ERROR--THE GAMMA(2) SHAPE PARAMETER FOR ',
37618     1         'BWEHAZ IS NON-POSITIVE.')
37619        CALL DPWRST('XXX','BUG ')
37620        WRITE(ICOUT,46)GAMMA2
37621        CALL DPWRST('XXX','BUG ')
37622        GOTO9999
37623      ELSEIF(ALOC2.LE.0.0)THEN
37624        WRITE(ICOUT,45)
37625   45   FORMAT('***** ERROR--THE LOCATION(2) PARAMETER FOR ',
37626     1         'BWEHAZ IS NON-POSITIVE.')
37627        CALL DPWRST('XXX','BUG ')
37628        WRITE(ICOUT,46)ALOC2
37629        CALL DPWRST('XXX','BUG ')
37630        GOTO9999
37631      ENDIF
37632C
37633      IF(X.LE.0.0)GOTO9999
37634C
37635      DX=DBLE(X)
37636      DG1=DBLE(GAMMA1)
37637      DS1=DBLE(ASCAL1)
37638      DG2=DBLE(GAMMA2)
37639      DS2=DBLE(ASCAL2)
37640      DL2=DBLE(ALOC2)
37641C
37642      IF(DX.LE.DL2)THEN
37643         DHAZ=(DG1/DS1)*(DX/DS1)**(DG1-1.0D0)
37644      ELSE
37645         DTERM1=(DG1/DS1)*(DX/DS1)**(DG1-1.0D0)
37646         DTERM2=(DG2/DS2)*((DX-DL2)/DS2)**(DG2-1.0D0)
37647         DHAZ=DTERM1 + DTERM2
37648      ENDIF
37649      HAZ=REAL(DHAZ)
37650C
37651 9999 CONTINUE
37652      RETURN
37653      END
37654      SUBROUTINE BWEPPF(P,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,PPF,DPPF)
37655C
37656C     PURPOSE--THIS SUBROUTINE COMPUTES THE PERCENT POINT
37657C              FUNCTION VALUE FOR THE BI-WEIBULL DISTRIBUTION AS
37658C              AS DEFINED IN THE THIRD EDITION OF "STATISTICAL
37659C              DISTRIBUTIONS", THIRD EDITION, EVANS, HASTINGS, AND
37660C              PEACOCK.  THIS DISTRIBUTION IS RELATED TO, BUT SOMEWHAT
37661C              DIFFERENT THAN, A STRAIGHT MIXTURE OF TWO WEIBULL
37662C              DISTRIBUTIONS.  THE CDF IS DEFINED AS:
37663C              F(X,S1,G1,L2,S2,G2) =
37664C               1 - EXP[-(X/S1)**G1]                  0 < X < L2
37665C               1 - EXP[-{(X/S1)**G1 +
37666C                   [(X-L2)/S2]**G2}]                 X > L2
37667C              THE PERCENT POINT FUNCTION IS CALCULATED ANALYTICALLY
37668C              FOR CASE WHEN X < L2.  IT IS CALCULATED NUMERICALLY
37669C              FOR X > L2.
37670C     INPUT  ARGUMENTS--P      = THE SINGLE PRECISION VALUE AT
37671C                                WHICH THE PERCENT POINT FUNCTION
37672C                                FUNCTION IS TO BE EVALUATED.
37673C                                P SHOULD BE IN THE INTERVAL [0,1).
37674C                     --ASCAL1 = SCALE PARAMETER (FIRST PART)
37675C                     --GAMMA1 = SHAPE PARAMETER (FIRST PART)
37676C                     --ALOC2  = LOCATION PARAMETER (SECOND PART)
37677C                     --ASCAL2 = SCALE PARAMETER (SECOND PART)
37678C                     --GAMMA2 = SHAPE PARAMETER (SECOND PART)
37679C     OUTPUT ARGUMENTS--CDF    = THE SINGLE PRECISION PERCENT POINT
37680C                                FUNCTION VALUE.
37681C     OUTPUT--THE SINGLE PRECISION PERCENT POINT
37682C             FUNCTION VALUE PPF FOR THE BI-WEIBULL DISTRIBUTION
37683C             WITH 5 SHAPE PARAMETERS
37684C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
37685C     RESTRICTIONS--0<= P < 1
37686C                 --GAMMA1,GAMMA2,ASCAL1,ASCAL2,ALOC2 SHOULD BE
37687C                   POSITIVE.
37688C     OTHER DATAPAC   SUBROUTINES NEEDED--NONE.
37689C     FORTRAN LIBRARY SUBROUTINES NEEDED--EXP.
37690C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37691C     LANGUAGE--ANSI FORTRAN (1977)
37692C     REFERENCES--HASTINGS AND PEACOCK, STATISTICAL
37693C                 DISTRIBUTIONS--THIRD EDITION,
37694C                 2000, PP. 200-202.
37695C     WRITTEN BY--JAMES J. FILLIBEN
37696C                 STATISTICAL ENGINEERING DIVISION
37697C                 INFORMATION TECHNOLOGY LABORATORY
37698C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37699C                 GAITHERSBURG, MD 20899-8980
37700C                 PHONE--301-975-2855
37701C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37702C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37703C     LANGUAGE--ANSI FORTRAN (1966)
37704C     VERSION NUMBER--2002.5
37705C     ORIGINAL VERSION--MAY       2002.
37706C
37707C---------------------------------------------------------------------
37708C
37709      DOUBLE PRECISION DS1
37710      DOUBLE PRECISION DG1
37711      DOUBLE PRECISION DL2
37712      DOUBLE PRECISION DS2
37713      DOUBLE PRECISION DG2
37714      DOUBLE PRECISION DX
37715      DOUBLE PRECISION DP
37716      DOUBLE PRECISION DPPF
37717      DOUBLE PRECISION DCDF
37718      DOUBLE PRECISION DCDFL
37719      DOUBLE PRECISION DCDFR
37720      DOUBLE PRECISION DXINC
37721      DOUBLE PRECISION DXL
37722      DOUBLE PRECISION DXR
37723      DOUBLE PRECISION DFXL
37724      DOUBLE PRECISION DFXR
37725      DOUBLE PRECISION DP1
37726      DOUBLE PRECISION DFCS
37727      DOUBLE PRECISION DXRML
37728      DOUBLE PRECISION DSIG
37729      DOUBLE PRECISION DEPS
37730C
37731      INCLUDE 'DPCOP2.INC'
37732C
37733      DATA DEPS /0.0000001/
37734      DATA DSIG /1.0D-7/
37735      DATA MAXIT /2000/
37736C
37737C-----START POINT-----------------------------------------------------
37738C
37739C     CHECK THE INPUT ARGUMENTS FOR ERRORS
37740C
37741      PPF=0.0
37742      DPPF=0.0D0
37743      IF(P.LT.0.0 .OR. P.GE.1.0)THEN
37744        WRITE(ICOUT,1)
37745    1   FORMAT('***** ERROR--THE INPUT ARGUMENT FOR BWEPPF ',
37746     1         'BWEPPF IS OUTSIDE THE INTERVAL [0,1).')
37747        CALL DPWRST('XXX','BUG ')
37748        WRITE(ICOUT,46)P
37749   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
37750        CALL DPWRST('XXX','BUG ')
37751        GOTO9999
37752      ELSEIF(ASCAL1.LE.0.0)THEN
37753        WRITE(ICOUT,5)
37754    5   FORMAT('***** ERROR--THE SCALE(1) PARAMETER FOR ',
37755     1         'BWEPPF IS NON-POSITIVE.')
37756        CALL DPWRST('XXX','BUG ')
37757        WRITE(ICOUT,46)ASCAL1
37758        CALL DPWRST('XXX','BUG ')
37759        GOTO9999
37760      ELSEIF(GAMMA1.LE.0.0)THEN
37761        WRITE(ICOUT,15)
37762   15   FORMAT('***** ERROR--THE GAMMA(1) SHAPE PARAMETER FOR ',
37763     1         'BWEPPF IS NON-POSITIVE.')
37764        CALL DPWRST('XXX','BUG ')
37765        WRITE(ICOUT,46)GAMMA1
37766        CALL DPWRST('XXX','BUG ')
37767        GOTO9999
37768      ELSEIF(ASCAL2.LE.0.0)THEN
37769        WRITE(ICOUT,25)
37770   25   FORMAT('***** ERROR--THE SCALE(2) PARAMETER FOR ',
37771     1         'BWEPPF IS NON-POSITIVE.')
37772        CALL DPWRST('XXX','BUG ')
37773        WRITE(ICOUT,46)ASCAL2
37774        CALL DPWRST('XXX','BUG ')
37775        GOTO9999
37776      ELSEIF(GAMMA2.LE.0.0)THEN
37777        WRITE(ICOUT,35)
37778   35   FORMAT('***** ERROR--THE GAMMA(2) SHAPE PARAMETER FOR ',
37779     1         'BWEPPF IS NON-POSITIVE.')
37780        CALL DPWRST('XXX','BUG ')
37781        WRITE(ICOUT,46)GAMMA2
37782        CALL DPWRST('XXX','BUG ')
37783        GOTO9999
37784      ELSEIF(ALOC2.LE.0.0)THEN
37785        WRITE(ICOUT,45)
37786   45   FORMAT('***** ERROR--THE LOCATION(2) PARAMETER FOR ',
37787     1         'BWEPPF IS NON-POSITIVE.')
37788        CALL DPWRST('XXX','BUG ')
37789        WRITE(ICOUT,46)ALOC2
37790        CALL DPWRST('XXX','BUG ')
37791        GOTO9999
37792      ENDIF
37793C
37794      IF(P.EQ.0.0)GOTO9999
37795C
37796      DP=DBLE(P)
37797      DG1=DBLE(GAMMA1)
37798      DS1=DBLE(ASCAL1)
37799      DG2=DBLE(GAMMA2)
37800      DS2=DBLE(ASCAL2)
37801      DL2=DBLE(ALOC2)
37802C
37803C  CHECK IF P <= BWECDF(LOC2)
37804C
37805      CALL BWECDF(ALOC2,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,CDF,DCDF)
37806      IF(DP.LE.DCDF)THEN
37807        DPPF=(DLOG(1.0D0/(1.0D0-DP)))**(1.0D0/DG1)
37808        DPPF=DS1*DPPF
37809        PPF=REAL(DPPF)
37810        GOTO9999
37811      ENDIF
37812C
37813C  CASE WHERE PPF CALCULATED NUMERICALLY
37814C
37815C
37816C  FIND BRACKETING INTERVAL.
37817C
37818      DXL=DL2
37819      DXINC=DS2
37820      IF(DXINC.LT.1.0D0)DXINC=1.0D0
37821      ICOUNT=0
37822      MAXCNT=10000
37823C
37824   91 CONTINUE
37825      DXR=DXL+DXINC
37826      IF(DXL.LE.DL2)DXL=DL2
37827      IF(DXR.LE.DL2)DXR=DXL+DXINC
37828      XL=REAL(DXL)
37829      XR=REAL(DXR)
37830      CALL BWECDF(XL,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,CDFL,DCDFL)
37831      CALL BWECDF(XR,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,CDFR,DCDFR)
37832      IF(DCDFL.LT.DP .AND. DCDFR.LT.DP)THEN
37833        DXL=DXR
37834      ELSEIF(DCDFL.GT.DP .AND. DCDFR.GT.DP)THEN
37835        DXL=DXL-DXINC
37836      ELSE
37837        GOTO99
37838      ENDIF
37839      ICOUNT=ICOUNT+1
37840      IF(ICOUNT.GT.MAXCNT)THEN
37841        WRITE(ICOUT,96)
37842        CALL DPWRST('XXX','BUG ')
37843        PPF=0.0
37844        GOTO9999
37845      ENDIF
37846   96 FORMAT('***** FATAL ERROR--BWEPPF UNABLE TO FIND BRACKETING ',
37847     *       'INTERVAL. *****')
37848      GOTO91
37849C
37850C
37851C  BISECTION METHOD
37852C
37853   99 CONTINUE
37854      IC = 0
37855      DFXL = -DP
37856      DFXR = 1.0D0 - DP
37857  105 CONTINUE
37858      DX = (DXL+DXR)*0.5D0
37859      X=REAL(DX)
37860      CALL BWECDF(X,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,CDF,DCDF)
37861      DP1=DCDF
37862      DPPF=DX
37863      PPF=REAL(DPPF)
37864      DFCS = DP1 - DP
37865      IF(DFCS*DFXL.GT.0.0D0)GOTO110
37866      DXR = DX
37867      DFXR = DFCS
37868      GOTO115
37869  110 CONTINUE
37870      DXL = DX
37871      DFXL = DFCS
37872  115 CONTINUE
37873      DXRML = DXR - DXL
37874      IF(DXRML.LE.DSIG .AND. DABS(DFCS).LE.DEPS)GOTO9999
37875      IC = IC + 1
37876      IF(IC.LE.MAXIT)GOTO105
37877      WRITE(ICOUT,130)
37878      CALL DPWRST('XXX','BUG ')
37879  130 FORMAT('***** ERROR--BWEPPF ROUTINE DID NOT CONVERGE.')
37880      GOTO9999
37881C
37882 9999 CONTINUE
37883      RETURN
37884      END
37885      SUBROUTINE BWERAN(N,ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,ISEED,X)
37886C
37887C     PURPOSE--THIS SUBROUTINE GENERATES A RANDOM SAMPLE OF SIZE N
37888C              FROM THE BIWEIBULL DISTRIBUTION
37889C              WITH 5 SHAPE PARAMETERS.
37890C     INPUT  ARGUMENTS--N      = THE DESIRED INTEGER NUMBER
37891C                                OF RANDOM NUMBERS TO BE
37892C                                GENERATED.
37893C                     --ASCAL1 = THE SINGLE PRECISION VALUE OF THE
37894C                                SCALE (1) PARAMETER.
37895C                     --GAMMA1 = THE SINGLE PRECISION VALUE OF THE
37896C                                SHAPE (1) PARAMETER.
37897C                     --ALOC2  = THE SINGLE PRECISION VALUE OF THE
37898C                                LOCATION (2) PARAMETER.
37899C                     --ASCAL2 = THE SINGLE PRECISION VALUE OF THE
37900C                                SCALE (2) PARAMETER.
37901C                     --GAMMA2 = THE SINGLE PRECISION VALUE OF THE
37902C                                SHAPE (2) PARAMETER.
37903C     OUTPUT ARGUMENTS--X      = A SINGLE PRECISION VECTOR
37904C                                (OF DIMENSION AT LEAST N)
37905C                                INTO WHICH THE GENERATED
37906C                                RANDOM SAMPLE WILL BE PLACED.
37907C     OUTPUT--A RANDOM SAMPLE OF SIZE N
37908C             FROM THE BIWEIBULL DISTRIBUTION
37909C             WITH 5 SHAPE PARAMETERS.
37910C     PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS.
37911C     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
37912C                   OF N FOR THIS SUBROUTINE.
37913C                 --5 SHAPE PARAMETERS SHOULD BE POSITIVE.
37914C     OTHER DATAPAC   SUBROUTINES NEEDED--UNIRAN.
37915C     FORTRAN LIBRARY SUBROUTINES NEEDED--NONE.
37916C     MODE OF INTERNAL OPERATIONS--SINGLE PRECISION.
37917C     LANGUAGE--ANSI FORTRAN (1977)
37918C     WRITTEN BY--JAMES J. FILLIBEN
37919C                 STATISTICAL ENGINEERING DIVISION
37920C                 INFORMATION TECHNOLOGY LABORATORY
37921C                 NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY
37922C                 GAITHERSBURG, MD 20899-8980
37923C                 PHONE--301-975-2855
37924C     NOTE--DATAPLOT IS A REGISTERED TRADEMARK
37925C           OF THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY.
37926C     LANGUAGE--ANSI FORTRAN (1966)
37927C     VERSION NUMBER--2002.5
37928C     ORIGINAL VERSION--MAY       2002.
37929C
37930C-----CHARACTER STATEMENTS FOR NON-COMMON VARIABLES-------------------
37931C
37932C---------------------------------------------------------------------
37933C
37934      DIMENSION X(*)
37935      DOUBLE PRECISION DTEMP
37936C
37937C---------------------------------------------------------------------
37938C
37939      INCLUDE 'DPCOP2.INC'
37940C
37941C-----START POINT-----------------------------------------------------
37942C
37943C     CHECK THE INPUT ARGUMENTS FOR ERRORS
37944C
37945      IF(ASCAL1.LE.0.0)THEN
37946        WRITE(ICOUT,5)
37947    5   FORMAT('***** ERROR--THE SCALE(1) PARAMETER FOR ',
37948     1         'THE BWERAN SUBROUTINE IS NON-POSITIVE.')
37949        CALL DPWRST('XXX','BUG ')
37950        WRITE(ICOUT,46)ASCAL1
37951   46   FORMAT('***** THE VALUE OF THE ARGUMENT IS ',G15.7,'.')
37952        CALL DPWRST('XXX','BUG ')
37953        GOTO9999
37954      ELSEIF(GAMMA1.LE.0.0)THEN
37955        WRITE(ICOUT,15)
37956   15   FORMAT('***** ERROR--THE GAMMA(1) SHAPE PARAMETER FOR ',
37957     1         'BWERAN IS NON-POSITIVE.')
37958        CALL DPWRST('XXX','BUG ')
37959        WRITE(ICOUT,46)GAMMA1
37960        CALL DPWRST('XXX','BUG ')
37961        GOTO9999
37962      ELSEIF(ASCAL2.LE.0.0)THEN
37963        WRITE(ICOUT,25)
37964   25   FORMAT('***** ERROR--THE SCALE(2) PARAMETER FOR ',
37965     1         'BWERAN IS NON-POSITIVE.')
37966        CALL DPWRST('XXX','BUG ')
37967        WRITE(ICOUT,46)ASCAL2
37968        CALL DPWRST('XXX','BUG ')
37969        GOTO9999
37970      ELSEIF(GAMMA2.LE.0.0)THEN
37971        WRITE(ICOUT,35)
37972   35   FORMAT('***** ERROR--THE GAMMA(2) SHAPE PARAMETER FOR ',
37973     1         'BWERAN IS NON-POSITIVE.')
37974        CALL DPWRST('XXX','BUG ')
37975        WRITE(ICOUT,46)GAMMA2
37976        CALL DPWRST('XXX','BUG ')
37977        GOTO9999
37978      ELSEIF(ALOC2.LE.0.0)THEN
37979        WRITE(ICOUT,45)
37980   45   FORMAT('***** ERROR--THE LOCATION(2) PARAMETER FOR ',
37981     1         'BWERAN IS NON-POSITIVE.')
37982        CALL DPWRST('XXX','BUG ')
37983        WRITE(ICOUT,46)ALOC2
37984        CALL DPWRST('XXX','BUG ')
37985        GOTO9999
37986      ENDIF
37987C
37988C     GENERATE N UNIFORM (0,1) RANDOM NUMBERS;
37989C
37990      CALL UNIRAN(N,ISEED,X)
37991C
37992C     GENERATE N BIWEIBULL DISTRIBUTION RANDOM
37993C     NUMBERS USING THE PERCENT POINT FUNCTION TRANSFORMATION METHOD.
37994C
37995      DO100I=1,N
37996        CALL BWEPPF(X(I),ASCAL1,GAMMA1,ALOC2,ASCAL2,GAMMA2,
37997     1              XTEMP,DTEMP)
37998        X(I)=XTEMP
37999  100 CONTINUE
38000C
38001 9999 CONTINUE
38002      RETURN
38003      END
38004      DOUBLE PRECISION FUNCTION BVN ( LOWER, UPPER, INFIN, CORREL )
38005*
38006*     A function for computing bivariate normal probabilities.
38007*
38008*  Parameters
38009*
38010*     LOWER  REAL, array of lower integration limits.
38011*     UPPER  REAL, array of upper integration limits.
38012*     INFIN  INTEGER, array of integration limits flags:
38013*            if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
38014*            if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
38015*            if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
38016*     CORREL REAL, correlation coefficient.
38017*
38018      DOUBLE PRECISION LOWER(*), UPPER(*), CORREL, BVNU
38019      INTEGER INFIN(*)
38020C
38021      BVN = 0.0D0
38022C
38023      IF ( INFIN(1) .EQ. 2  .AND. INFIN(2) .EQ. 2 ) THEN
38024         BVN =  BVNU ( LOWER(1), LOWER(2), CORREL )
38025     +        - BVNU ( UPPER(1), LOWER(2), CORREL )
38026     +        - BVNU ( LOWER(1), UPPER(2), CORREL )
38027     +        + BVNU ( UPPER(1), UPPER(2), CORREL )
38028      ELSE IF ( INFIN(1) .EQ. 2  .AND. INFIN(2) .EQ. 1 ) THEN
38029         BVN =  BVNU ( LOWER(1), LOWER(2), CORREL )
38030     +        - BVNU ( UPPER(1), LOWER(2), CORREL )
38031      ELSE IF ( INFIN(1) .EQ. 1  .AND. INFIN(2) .EQ. 2 ) THEN
38032         BVN =  BVNU ( LOWER(1), LOWER(2), CORREL )
38033     +        - BVNU ( LOWER(1), UPPER(2), CORREL )
38034      ELSE IF ( INFIN(1) .EQ. 2  .AND. INFIN(2) .EQ. 0 ) THEN
38035         BVN =  BVNU ( -UPPER(1), -UPPER(2), CORREL )
38036     +        - BVNU ( -LOWER(1), -UPPER(2), CORREL )
38037      ELSE IF ( INFIN(1) .EQ. 0  .AND. INFIN(2) .EQ. 2 ) THEN
38038         BVN =  BVNU ( -UPPER(1), -UPPER(2), CORREL )
38039     +        - BVNU ( -UPPER(1), -LOWER(2), CORREL )
38040      ELSE IF ( INFIN(1) .EQ. 1  .AND. INFIN(2) .EQ. 0 ) THEN
38041         BVN =  BVNU ( LOWER(1), -UPPER(2), -CORREL )
38042      ELSE IF ( INFIN(1) .EQ. 0  .AND. INFIN(2) .EQ. 1 ) THEN
38043         BVN =  BVNU ( -UPPER(1), LOWER(2), -CORREL )
38044      ELSE IF ( INFIN(1) .EQ. 1  .AND. INFIN(2) .EQ. 1 ) THEN
38045         BVN =  BVNU ( LOWER(1), LOWER(2), CORREL )
38046      ELSE IF ( INFIN(1) .EQ. 0  .AND. INFIN(2) .EQ. 0 ) THEN
38047         BVN =  BVNU ( -UPPER(1), -UPPER(2), CORREL )
38048      END IF
38049C
38050      RETURN
38051      END
38052      DOUBLE PRECISION FUNCTION BVNU( SH, SK, R )
38053*
38054*     A function for computing bivariate normal probabilities.
38055*
38056*       Yihong Ge
38057*       Department of Computer Science and Electrical Engineering
38058*       Washington State University
38059*       Pullman, WA 99164-2752
38060*       Email : yge@eecs.wsu.edu
38061*     and
38062*       Alan Genz
38063*       Department of Mathematics
38064*       Washington State University
38065*       Pullman, WA 99164-3113
38066*       Email : alangenz@wsu.edu
38067*
38068* BVN - calculate the probability that X is larger than SH and Y is
38069*       larger than SK.
38070*
38071* Parameters
38072*
38073*   SH  REAL, integration limit
38074*   SK  REAL, integration limit
38075*   R   REAL, correlation coefficient
38076*   LG  INTEGER, number of Gauss Rule Points and Weights
38077*
38078      DOUBLE PRECISION BVN, SH, SK, R, ZERO, TWOPI
38079      INTEGER I, LG, NG
38080      PARAMETER ( ZERO = 0.0D0, TWOPI = 6.2831 85307 179586D0 )
38081      DOUBLE PRECISION X(10,3), W(10,3), AS, A, B, C, D, RS, XS
38082      DOUBLE PRECISION PHI, SN, ASR, H, K, BS, HS, HK
38083*     Gauss Legendre Points and Weights, N =  6
38084      DATA ( W(I,1), X(I,1), I = 1,3) /
38085     &  0.1713244923791705D+00,-0.9324695142031522D+00,
38086     &  0.3607615730481384D+00,-0.6612093864662647D+00,
38087     &  0.4679139345726904D+00,-0.2386191860831970D+00/
38088*     Gauss Legendre Points and Weights, N = 12
38089      DATA ( W(I,2), X(I,2), I = 1,6) /
38090     &  0.4717533638651177D-01,-0.9815606342467191D+00,
38091     &  0.1069393259953183D+00,-0.9041172563704750D+00,
38092     &  0.1600783285433464D+00,-0.7699026741943050D+00,
38093     &  0.2031674267230659D+00,-0.5873179542866171D+00,
38094     &  0.2334925365383547D+00,-0.3678314989981802D+00,
38095     &  0.2491470458134029D+00,-0.1252334085114692D+00/
38096*     Gauss Legendre Points and Weights, N = 20
38097      DATA ( W(I,3), X(I,3), I = 1,10) /
38098     &  0.1761400713915212D-01,-0.9931285991850949D+00,
38099     &  0.4060142980038694D-01,-0.9639719272779138D+00,
38100     &  0.6267204833410906D-01,-0.9122344282513259D+00,
38101     &  0.8327674157670475D-01,-0.8391169718222188D+00,
38102     &  0.1019301198172404D+00,-0.7463319064601508D+00,
38103     &  0.1181945319615184D+00,-0.6360536807265150D+00,
38104     &  0.1316886384491766D+00,-0.5108670019508271D+00,
38105     &  0.1420961093183821D+00,-0.3737060887154196D+00,
38106     &  0.1491729864726037D+00,-0.2277858511416451D+00,
38107     &  0.1527533871307259D+00,-0.7652652113349733D-01/
38108      SAVE X, W
38109      IF ( ABS(R) .LT. 0.3 ) THEN
38110         NG = 1
38111         LG = 3
38112      ELSE IF ( ABS(R) .LT. 0.75 ) THEN
38113         NG = 2
38114         LG = 6
38115      ELSE
38116         NG = 3
38117         LG = 10
38118      ENDIF
38119      H = SH
38120      K = SK
38121      HK = H*K
38122      BVN = 0.0D0
38123      IF ( ABS(R) .LT. 0.925D0 ) THEN
38124         HS = ( H*H + K*K )/2.0D0
38125         ASR = ASIN(R)
38126         DO 10  I = 1, LG
38127            SN = SIN(ASR*( X(I,NG)+1.0D0 )/2.0D0)
38128            BVN = BVN + W(I,NG)*EXP( ( SN*HK - HS )/(1.0D0 - SN*SN))
38129            SN = SIN(ASR*(-X(I,NG)+1.0D0 )/2.0D0)
38130            BVN = BVN + W(I,NG)*EXP( ( SN*HK - HS )/(1.0D0 - SN*SN))
38131 10      CONTINUE
38132         BVN = BVN*ASR/(2.0D0*TWOPI) + PHI(-H)*PHI(-K)
38133      ELSE
38134         IF ( R .LT. 0.0D0 ) THEN
38135            K = -K
38136            HK = -HK
38137         ENDIF
38138         IF ( ABS(R) .LT. 1.0D0 ) THEN
38139            AS = ( 1.0D0 - R )*( 1.0D0 + R )
38140            A = SQRT(AS)
38141            BS = ( H - K )**2
38142            C = ( 4.0D0 - HK )/8.0D0
38143            D = ( 12.0D0 - HK )/16.0D0
38144            BVN = A*EXP( -(BS/AS + HK)/2.0D0 )
38145     +             *( 1.0D0 - C*(BS - AS)*(1.0D0 - D*BS/5)/3.0D0
38146     +             + C*D*AS*AS/5.0D0 )
38147            IF ( HK .GT. -160.0D0 ) THEN
38148               B = SQRT(BS)
38149               BVN = BVN - EXP(-HK/2.0D0)*SQRT(TWOPI)*PHI(-B/A)*B
38150     +               *( 1.0D0 - C*BS*( 1.0D0 - D*BS/5.0D0 )/3.0D0 )
38151            ENDIF
38152            A = A/2.0D0
38153            DO 20 I = 1, LG
38154               XS = ( A*(X(I,NG)+1) )**2
38155               RS = SQRT( 1.0D0 - XS )
38156               BVN = BVN + A*W(I,NG)*
38157     +              ( EXP( -BS/(2.0D0*XS) - HK/(1.0D0+RS) )/RS
38158     +              - EXP( -(BS/XS+HK)/2.0D0 )*
38159     +              ( 1.0D0 + C*XS*( 1.0D0 + D*XS ) ) )
38160               XS = AS*(-X(I,NG)+1.0D0)**2/4.0D0
38161               RS = SQRT( 1.0D0 - XS )
38162               BVN = BVN + A*W(I,NG)*EXP( -(BS/XS + HK)/2.0D0 )
38163     +               *( EXP( -HK*(1.0D0-RS)/(2.0D0*(1.0D0+RS)))/RS
38164     +               - ( 1.0D0 + C*XS*( 1.0D0 + D*XS ) ) )
38165 20         CONTINUE
38166            BVN = -BVN/TWOPI
38167         ENDIF
38168         IF (R .GT. 0.0D0) BVN =  BVN + PHI( -MAX( H, K ) )
38169         IF (R .LT. 0.0D0) BVN = -BVN + MAX( ZERO, PHI(-H) - PHI(-K))
38170      ENDIF
38171      BVNU = BVN
38172C
38173      RETURN
38174      END
38175