5 * Revision 1.1.1.1 1996/04/01 15:02:57 mclareni
10 SUBROUTINE FUNPRE (FUNC,XFCUM,X2LOW,X2HIGH)
12 C MODIFIED OCT, 1980 TO ADD PRINTOUT OF INTEGRAL
13 C MODIFIED DEC., 1980 TO DELETE LEADING AND TRAILING
14 C RANGES OF X WHERE FUNCTION IS ZERO.
15 C MODIFIED JUNE,1982 TO FIX POSSIBLE INFINITE LOOP.
17 C PREPARES THE USER FUNCTION "FUNC" FOR FUNRAN
18 C BY FINDING THE PERCENTILES
19 C (IN EFFECT, INVERTING THE CUMULATIVE DISTRIBUTION)
29 C FIND MACHINE ACCURACY
34 IF(COMP2 .EQ. 1.0) GOTO 210
38 C FIND RANGE WHERE FUNCTION IS NON-ZERO.
39 CALL FUNZER(FUNC,X2LOW,X2HIGH,XLOW,XHIGH)
41 IF(XRANGE .LE. 0.) GOTO 900
42 RTEPS = MAX(0.0001,PRECIS*10.)
43 TFTOT = GAUSS(FUNC,XLOW,XHIGH,RTEPS)
44 C PRINT OUT VALUE OF NORMALIZATION INTEGRAL
45 WRITE(6,1003) IFUNC,XLOW,XHIGH,TFTOT
47 IF(TFTOT .LE. 0.) GOTO 900
52 XFCUM(NBINS+1) = XHIGH
55 IF(F .LT. 0.) GOTO 900
57 C LOOP OVER BINS (HUNDREDTH PERCENTILES)
58 DO 600 IBIN = 1, NBINM1
62 DXMAX = (XHIGH -X) / NZ
65 C LOOP OVER TRAPEZOIDS WITHIN A SUPPOSED PERCENTILE
67 XINCR = TZ/MAX(F1,FMIN,FMINZ)
70 IF(F .LT. 0.) GOTO 900
71 TINCR = (X-X1) * 0.5 * (F+F1)
72 IF(TINCR .LT. TZMAX) GOTO 370
77 IF(TCUM .GE. TPCTIL*0.99) GOTO 520
78 FMINZ = TZ*F/ (TPCTIL-TCUM)
83 2000 FORMAT('0 FAILURE TO FIND TRAPEZOID HELP')
84 C END OF TRAPEZOID LOOP
85 C ADJUST TRAPEZOID INTEGRAL BY GAUSS WITH NEWTON CORRECTION
91 C ALLOW FOR MAXIMUM NITMAX MORE ITERATIONS ON GAUSS
92 DO 550 IHOME= 1, NITMAX
93 XINCR = (TPCTIL-TPART) / MAX(F,FMIN)
96 TPART2 = GAUSS(FUNC,X1,X2,RTEPS)
97 DTPAR2 = TPART2-TPCTIL
99 IF(ABS(XINCR) .LT. PRECIS) GOTO 545
100 IF(DTABS .LT. DTBEST) GOTO 545
105 IF(DTABS .LT. RTEPS*TPCTIL) GOTO 580
114 IF(F .LT. 0.) GOTO 900
116 C END OF LOOP OVER BINS
119 TPART = GAUSS(FUNC,X1,X2,RTEPS)
120 ABERR = ABS(TPART-TPCTIL)/TFTOT
121 WRITE(6,1001) IFUNC,ABERR
122 IF(ABERR .GT. RTEPS) WRITE(6,1002)
124 900 WRITE(6,1000) X,F,XLOW,XHIGH
126 1000 FORMAT('0FUNPRE FINDS NEGATIVE FUNCTION VALUE OR RANGE OF X'/
127 + ,' X=',E15.6,', F=',E15.6,20X,'XLOW=',E15.6,' XHIGH=',E15.6/)
128 1001 FORMAT(' SUBROUTINE FUNPRE HAS PREPARED USER FUNCTION NUMBER',I4,
129 + ' FOR FUNRAN'/' MAXIMUM RELATIVE ERROR IN CUMULATIVE',
130 + 'DISTRIBUTION WILL BE',E15.5)
131 1002 FORMAT('+',80X,'WARNING,THIS MAY BE TOO BIG'//)
132 1003 FORMAT('0SUBROUTINE FUNPRE FINDS THE INTEGRAL OF USER FUNCTION',
133 + I2,' FROM ',E12.5,' TO ',E12.5,' IS ',E14.6)