home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
500
/
473
/
multi.arc
/
PC-MULTI.FOR
< prev
next >
Wrap
Text File
|
1985-10-16
|
18KB
|
604 lines
C
C PC-MULTI
C Multiple Comparisons
C Version 1.0
C October 15, 1985
C
C
C Gerard E. Dallal
C
C USDA Human Nutrition Research Center on Aging
C at Tufts University
C 711 Washington Street
C Boston, MA 02111
C
C and
C
C Tufts University School of Nutrition
C 132 Curtis Street
C Medford, MA 02155
C
C
C
C NOTICE
C
C Documentation and original code copyright 1985 by Gerard E.
C Dallal. Reproduction of material for non-commercial purposes
C is permitted, without charge, provided that suitable
C reference is made to PC-MULTI and its author.
C
C Neither PC-Multi nor its documentation should be modified in
C any way without permission from the author, except for those
C changes that are essential to move PC-PITMAN to another
C computer.
C
DIMENSION DATA(20), XNOBS(20), CIM(20,20), CIL(20,20),
* CIU(20,20), CILH(20), CIUH(20)
C
C LINE IS A CHARACTER*>=NCELL VARIABLE
C
CHARACTER*40 LINE*40, FNAME*50, GNAME(20)*6, QUERY*1
LOGICAL QFILE
DATA MAXGRP /20/, IIN /0/, IOUT /0/, IWOUT /11/, QFILE /.FALSE./
C
WRITE(IOUT,1)
1 FORMAT (//36X,'PC-MULTI'/
* 30X,'Multiple Comparisons'/
* 34X,'Version 1.0'/32X,'October 15, 1985'//
* 32X,'Gerard E. Dallal'/
* 17X,'USDA Human Nutrition Research Center on Aging'/
* 30X,'at Tufts University'/29X,'711 Washington Street'/
* 31X,'Boston, MA 02111'///)
c
WRITE(IOUT,10)
10 FORMAT(/' Do you wish to save the results of this session? ',
* '(Y or N): '$)
READ (IIN,20) QUERY
20 FORMAT (A1)
IF (QUERY.EQ.'Y' .OR. QUERY.EQ.'y') QFILE = .TRUE.
IF (.NOT. QFILE) GOTO 90
WRITE (IOUT,30)
30 FORMAT (' Enter output filename: '$)
READ (IIN,'(A)') FNAME
OPEN (IWOUT, FILE = FNAME, STATUS = 'NEW')
C
90 CALL READ(IIN, IOUT, IWOUT, QFILE, DATA, ERROR,
* XNOBS, MAXGRP, NGRP, GNAME, V)
C
R = NGRP
IF (V.GT.0.0) GOTO 120
C
DO 100 I = 1, NGRP
100 V = V + XNOBS(I) - 1.0
C
120 IF (QFILE) WRITE(IWOUT,130)
WRITE(IOUT,130)
130 FORMAT (' Enter the level of confidence (.GE. 0.90 .AND. ',
* '.LE. 0.99): '$)
READ (IIN,*) PVAL
IF (PVAL.LT.0.90 .OR. PVAL.GT.0.99) GOTO 120
IF(QFILE) WRITE(IWOUT,*) PVAL
WRITE(IOUT,140)
140 FORMAT(//' Confidence intervals based on Studentized range ',
* 'statistic...'///
* T10,'VS',T23,'D-HSD',T35,'DIFF',T47,'D+HSD'/)
IF (QFILE) WRITE(IWOUT,140)
C
C HM -- HARMONIC MEAN, USED LATER
C
QCRIT = QTRNG(PVAL, V, R, IFAULT)
HM = 1.0 / XNOBS(NGRP)
C
DO 200 I = 1, NGRP - 1
XNOBSI = 1.0 / XNOBS(I)
HM = HM + XNOBSI
C
DO 200 K = 2, NGRP
PM = QCRIT * SQRT(ERROR / 2.0 * (XNOBSI + 1.0 / XNOBS(K)))
CIM(I,K) = DATA(I) - DATA(K)
CIL(I,K) = CIM(I,K) - PM
CIU(I,K) = CIM(I,K) + PM
200 CONTINUE
C
HM = FLOAT(NGRP) / HM
C
C GET MIN AND MAX
C
CMIN = 0.0
CMAX = 0.0
DO 210 I = 1, NGRP-1
DO 210 K = I+1, NGRP
IF (CIL(I,K).LT.CMIN) CMIN = CIL(I,K)
IF (CIU(I,K).GT.CMAX) CMAX = CIU(I,K)
210 CONTINUE
C
C SET UP GRAPH
C
NCELL = 20
XNCELL = NCELL
XRNG = CMAX - CMIN
NZERO = 1.0 + (-CMIN) / XRNG * XNCELL
NZERO = MIN0(NZERO, NCELL)
DO 220 I = 1, NCELL
220 LINE(I:I) = ' '
C
DO 500 I = 1, NGRP-1
DO 500 K = I+1, NGRP
NL = 1.0 + (CIL(I,K) - CMIN) / XRNG * XNCELL
NL = MIN0(NL, NCELL)
C
NM = 1.0 + (CIM(I,K) - CMIN) / XRNG * XNCELL
NM = MIN0(NM, NCELL)
C
NU = 1.0 + (CIU(I,K) - CMIN) / XRNG * XNCELL
NU = MIN0(NU, NCELL)
C
C insert -'s
C
DO 240 J = NL+1, NU-1
240 LINE(J:J) = '-'
C
C insert 0 bar
C
LINE(NZERO:NZERO) = '|'
C
C insert ()[]
C
IF (CIL(I,K).GT.0.0) LINE(NL:NL) = '('
IF (CIL(I,K).LE.0.0) LINE(NL:NL) = '['
IF (CIU(I,K).LT.0.0) LINE(NU:NU) = ')'
IF (CIU(I,K).GE.0.0) LINE(NU:NU) = ']'
LINE(NM:NM) = 'X'
C
WRITE (IOUT,250) GNAME(I),GNAME(K),CIL(I,K),
* CIM(I,K),CIU(I,K),LINE
IF (QFILE) WRITE (IWOUT,250) GNAME(I),GNAME(K),CIL(I,K),
* CIM(I,K),CIU(I,K),LINE
250 FORMAT (1X,2A8,2X,3G12.5,4X,A40)
C
C clear
C
DO 280 J = NL, NU
280 LINE(J:J) = ' '
C
500 CONTINUE
C
WRITE (IOUT,560) ('.',J=1,NCELL)
IF (QFILE) WRITE(IWOUT,560) ('.',J=1,NCELL)
560 FORMAT (59X,40A1)
WRITE (IOUT,560) '|',(' ',J=1,NCELL-2),'|'
IF (QFILE) WRITE(IWOUT,560) '|',(' ',J=1,NCELL-2),'|'
WRITE (IOUT,562) CMIN, CMAX
IF (QFILE) WRITE(IWOUT,562) CMIN, CMAX
562 FORMAT (53X,G12.5,8X,G12.5)
C
C USE HARMONIC MEAN
C
C HHSD -- HALF AN HONEST SIGNIFICANT DIFFERENCE
C
HHSD = 0.5 * QCRIT * SQRT(ERROR / HM)
WRITE (IOUT,610) HM
610 FORMAT (///' Using harmonic mean (',G12.5,')...'///
* T13,'M-.5*HSD',T27,'MEAN',T37,'M+.5*HSD'/)
IF (QFILE) WRITE (IWOUT,610) HM
C
DO 620 I = 1, NGRP
CILH(I) = DATA(I) - HHSD
CIUH(I) = DATA(I) + HHSD
620 CONTINUE
C
C GET MIN AND MAX
C
CMIN = CILH(1)
CMAX = CIUH(1)
DO 630 I = 2, NGRP
IF (CILH(I).LT.CMIN) CMIN = CILH(I)
IF (CIUH(I).GT.CMAX) CMAX = CIUH(I)
630 CONTINUE
C
C SET UP GRAPH
C
NCELL = 28
XNCELL = NCELL
XRNG = CMAX - CMIN
NZERO = 1.0 + (-CMIN) / XRNG * XNCELL
NZERO = MIN0(NZERO, NCELL)
DO 640 I = 1, NCELL
640 LINE(I:I) = ' '
C
DO 700 I = 1, NGRP
NL = 1.0 + (CILH(I) - CMIN) / XRNG * XNCELL
NL = MIN0(NL, NCELL)
C
NM = 1.0 + (DATA(I) - CMIN) / XRNG * XNCELL
NM = MIN0(NM, NCELL)
C
NU = 1.0 + (CIUH(I) - CMIN) / XRNG * XNCELL
NU = MIN0(NU, NCELL)
C
C insert -'s
C
DO 650 J = NL+1, NU-1
650 LINE(J:J) = '-'
C
C insert 0 bar
C
LINE(NZERO:NZERO) = '|'
C
C insert ()[]
C
LINE(NL:NL) = '('
LINE(NU:NU) = ')'
LINE(NM:NM) = 'X'
C
WRITE (IOUT,655) GNAME(I),CILH(I),DATA(I),CIUH(I),LINE
655 FORMAT (1X,A8,2X,3G12.5,4X,A40)
IF (QFILE) WRITE (IWOUT,655)
* GNAME(I),CILH(I),DATA(I),CIUH(I),LINE
C
C
C clear
C
DO 660 J = NL, NU
660 LINE(J:J) = ' '
C
700 CONTINUE
C
WRITE (IOUT,760) ('.',J=1,NCELL)
760 FORMAT (51X,40A1)
IF (QFILE) WRITE(IWOUT,760) ('.',J=1,NCELL)
WRITE (IOUT,760) '|',(' ',J=1,NCELL-2),'|'
IF (QFILE) WRITE(IWOUT,760) '|',(' ',J=1,NCELL-2),'|'
WRITE (IOUT,762) CMIN, CMAX
762 FORMAT (45X,G12.5,16X,G12.5)
IF (QFILE) WRITE(IWOUT,762) CMIN, CMAX
C
WRITE (IOUT,3020)
3020 FORMAT (///' Do you wish to continue? (Y or N): '$)
READ (IIN,20) QUERY
IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') STOP ' '
IF (QFILE) WRITE (IWOUT, 3030)
3030 FORMAT(1H1)
GOTO 90
END
C
SUBROUTINE READ(IIN, IOUT, IWOUT, QFILE, DATA, ERROR, XNOBS,
* MAXGRP, NGRP, GNAME, DFE)
C
LOGICAL QEXT, QFILE
CHARACTER FNAME*50, QUERY*1, GNAME(MAXGRP)*6, D3*6
DIMENSION DATA(MAXGRP), XNOBS(MAXGRP)
DATA IFIN /10/, QEXT/.FALSE./
C
200 WRITE (IOUT,210)
210 FORMAT(/' Will data be entered through the keyboard (K)'/
* ' or read from an external file (F)? '$)
READ (IIN,220) QUERY
220 FORMAT(A1)
IF (QUERY.EQ.'K' .OR. QUERY.EQ.'k') GOTO 400
IF (QUERY.NE.'F' .AND. QUERY.NE.'f') GOTO 200
C
IF (QFILE) WRITE(IWOUT,240)
230 WRITE (IOUT,240)
240 FORMAT (/' Enter filename: '$)
READ (IIN,'(A)') FNAME
IF (QFILE) WRITE(IWOUT,250) FNAME
250 FORMAT(1X,A50)
OPEN (IFIN, FILE = FNAME, STATUS = 'OLD', ERR = 230)
C
READ (IFIN,260) QUERY, ERROR
260 FORMAT(BN,A1,F18.0)
IF((QUERY.EQ.'E' .OR. QUERY.EQ.'e')
* .AND. ERROR.GT.0.0) GOTO 280
C
WRITE (IOUT,270)
270 FORMAT (/' ** ** ** Error term misspecified...')
STOP ' '
C
280 READ (IFIN,260) QUERY, DFE
IF((QUERY.EQ.'D' .OR. QUERY.EQ.'d')
* .AND. DFE.GE.0.0) GOTO 300
C
WRITE (IOUT,290)
290 FORMAT (/' ** ** ** Degrees of freedom misspecified...')
STOP ' '
C
300 NGRP = 0
DO 340 KOUNT = 1, MAXGRP+1
READ (IFIN,*,END=350) D1, D2, D3
IF (D2.LE.0.0) GOTO 340
NGRP = NGRP + 1
DATA(NGRP) = D1
XNOBS(NGRP) = D2
GNAME(NGRP) = D3
340 CONTINUE
WRITE( IOUT,341)
341 FORMAT (/' *** Too many means in the data file')
STOP ' '
C
350 CLOSE (IFIN, STATUS = 'KEEP')
IF (NGRP.GT.1) RETURN
WRITE(IOUT,360)
360 FORMAT (/' *** Too few means in the data file')
STOP ' '
C
400 WRITE (IIN,410)
IF (QFILE) WRITE(IWOUT,410)
410 FORMAT (/' Enter error variance : '$)
READ (IIN,*) ERROR
IF (ERROR.LE.0.0) GOTO 400
IF (QFILE) WRITE(IWOUT,*) ERROR
C
IF (QFILE) WRITE(IWOUT,430)
420 WRITE (IIN,430)
430 FORMAT (' Enter degrees of freedom for error variance : '$)
READ (IIN,*) DFE
IF (DFE.LT.0.0) GOTO 420
IF (QFILE) WRITE(IWOUT,*) ERROR
C
WRITE (IOUT,440)
IF (QFILE) WRITE(IWOUT,440)
440 FORMAT (' Enter the number of groups: '$)
READ (IIN,*) NGRP
IF (QFILE) WRITE(IWOUT,*) NGRP
IF (NGRP.LE.MAXGRP) GOTO 450
C
WRITE(IOUT,445)
445 FORMAT(/' *** Too many means in the data file')
STOP ' '
C
450 WRITE (IOUT,460)
IF (QFILE) WRITE(IWOUT,460)
460 FORMAT(' Enter triples of mean, sample size, and group name:')
READ (IIN,*) (DATA(I),XNOBS(I),GNAME(I),I=1,NGRP)
IF (.NOT. QFILE) RETURN
C
DO 500 I = 1, NGRP
500 WRITE(IWOUT,*) DATA(I), XNOBS(I)
C
RETURN
END
C
FUNCTION ALNORM(X,UPPER)
C
C ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3
C
C EVALUATES THE TAIL AREA OF THE STANDARD NORMAL CURVE
C FROM X TO INFINITY IF UPPER IS .TRUE. OR
C FROM MINUS INFINITY TO X IF UPPER IS .FALSE.
C
REAL LTONE, UTZERO, ZERO, HALF, ONE, CON, Z, Y, X
LOGICAL UPPER, UP
C
C LTONE AND UTZERO MUST BE SET TO SUIT THE PARTICULAR
C COMPUTER (SEE INTRODUCTORY TEXT)
C
DATA LTONE, UTZERO/7.0, 18.66/
DATA ZERO, HALF, ONE, CON/0.0, 0.5, 1.0, 1.28/
UP = UPPER
Z = X
IF (Z .GE. ZERO) GOTO 10
UP = .NOT. UP
Z = -Z
10 IF (Z .LE. LTONE .OR. UP .AND. Z .LE. UTZERO) GOTO 20
ALNORM = ZERO
GOTO 40
20 Y = HALF * Z * Z
IF (Z .GT. CON) GOTO 30
C
ALNORM = HALF - Z * (0.398942280444 - 0.399903438504 * Y /
1 (Y + 5.75885480458 - 29.8213557808 /
2 (Y + 2.62433121679 + 48.6959930692 /
3 (Y + 5.92885724438))))
GOTO 40
C
30 ALNORM = .398942280385 * EXP(-Y) /
1 (Z - 3.8052E-8 + 1.00000615302 /
2 (Z + 3.98064794E-4 + 1.98615381364 /
3 (Z - 0.151679116635 + 5.29330324926 /
4 (Z + 4.8385912808 - 15.1508972451 /
5 (Z + 0.742380924027 + 30.789933034 / (Z + 3.99019417011))))))
C
40 IF (.NOT. UP) ALNORM = ONE - ALNORM
RETURN
END
FUNCTION GAUINV(P,IFAULT)
C
C ALGORITHM AS 70 APPL. STATIST. (1974) VOL. 23, NO.1
C GAUINV FINDS PERCENTAGE POINTS OF THE NORMAL DISTRIBUTION
C
DATA ZERO,ONE,HALF,ALIMIT/0.0, 1.0, 0.5, 1.0E-20/
C
DATA P0, P1, P2, P3
1 / -.322232431088, -1., -.342242088547, -.204231210245E-1/
C
DATA P4, Q0, Q1
1 / -.453642210148E-4, .993484626060E-1, .588581570495/
C
DATA Q2, Q3, Q4
1 / .531103462366, .103537752850, .38560700634E-2/
C
IFAULT=1
GAUINV=ZERO
PS=P
IF (PS.GT.HALF) PS=ONE-PS
IF (PS.LT.ALIMIT) RETURN
IFAULT=0
IF (PS.EQ.HALF) RETURN
YI=SQRT(ALOG(ONE/(PS*PS)))
GAUINV=YI+((((YI*P4+P3)*YI+P2)*YI+P1)*YI+P0)
1 /((((YI*Q4+Q3)*YI+Q2)*YI+Q1)*YI+Q0)
IF (P.LT.HALF) GAUINV=-GAUINV
RETURN
END
C
FUNCTION PRTRNG(Q, V, R, IFAULT)
C
C ALGORITHM AS 190 APPL. STATIST. (1983) VOL.32, NO.2
C INCLUDES MODIFICATION FROM VOL.34, NO.1
C
C EVALUATES THE PROBABILITY FORM 0 TO Q FOR A STUDENTIZED
C RANGE HAVING V DEGREES OF FREEDOM AND R SAMPLES.
C
REAL Q, V, R, VW(30), QW(30), PCUTJ, PCUTK, STEP, VMAX, ZERO,
* FIFTH, HALF, ONE, TWO, CV1, CV2, CVMAX, CV(4)
DATA PCUTJ, PCUTK, STEP, VMAX /0.00003E0, 0.0001E0, 0.45E0,
* 120.0E0/, ZERO, FIFTH, HALF, ONE, TWO /0.0E0, 0.2E0, 0.5E0,
* 1.0E0, 2.0E0/, CV1, CV2, CVMAX /0.193064705E0, 0.293525326E0,
* 0.39894228E0/, CV(1), CV(2), CV(3), CV(4) /0.318309886E0,
* -0.268132716E-2, 0.347222222E-2, 0.833333333E-1/
DATA JMIN, JMAX, KMIN, KMAX /3, 15, 7, 15/
C
C CHECK INITIAL VALUES
C
PRTRNG = ZERO
IFAULT = 0
IF (V .LT. ONE .OR. R .LT. TWO) IFAULT = 1
IF (Q .LE. ZERO .OR. IFAULT .EQ. 1) GOTO 99
C
G = STEP * R ** (-FIFTH)
GMID = HALF * ALOG(R)
R1 = R - ONE
C = ALOG(R * G * CVMAX)
IF ( V .GT. VMAX) GOTO 20
C
H = STEP * V ** (-HALF)
V2 = V * HALF
IF (V .EQ. ONE) C = CV1
IF (V .EQ. TWO) C = CV2
IF (.NOT.(V .EQ. ONE .OR. V .EQ. TWO)) C = SQRT(V2) * CV(1)
* / (ONE + ((CV(2) / V2 + CV(3)) / V2 + CV(4)) / V2)
C = ALOG(C * R * G * H)
C
20 GSTEP = G
QW(1) = -ONE
QW(JMAX + 1) = -ONE
PK1 = ONE
PK2 = ONE
DO 28 K = 1, KMAX
GSTEP = GSTEP - G
21 GSTEP = -GSTEP
GK = GMID + GSTEP
PK = ZERO
IF (PK2 .LE. PCUTK .AND. K .GT. KMIN) GOTO 26
W0 = C - GK * GK * HALF
PZ = ALNORM(GK, .TRUE.)
X = ALNORM(GK - Q, .TRUE.) - PZ
IF (X .GT. ZERO) PK = EXP(W0 + R1 * ALOG(X))
IF (V .GT. VMAX) GOTO 26
C
JUMP = -JMAX
22 JUMP = JUMP + JMAX
DO 24 J = 1, JMAX
JJ = J + JUMP
IF (QW(JJ) .GT. ZERO) GOTO 23
HJ = H * FLOAT(J)
IF (J .LT. JMAX) QW(JJ + 1) = -ONE
EHJ = EXP(HJ)
QW(JJ) = Q * EHJ
VW(JJ) = V * (HJ + HALF - EHJ * EHJ * HALF)
C
23 PJ = ZERO
X = ALNORM(GK - QW(JJ), .TRUE.) - PZ
IF (X .GT. ZERO) PJ = EXP(W0 + VW(JJ) + R1 * ALOG(X))
PK = PK + PJ
IF (PJ .GT. PCUTJ) GOTO 24
IF (JJ .GT. JMIN .OR. K .GT. KMIN) GOTO 25
24 CONTINUE
25 H = -H
IF (H .LT. ZERO) GOTO 22
C
26 PRTRNG = PRTRNG + PK
IF (K .GT. KMIN .AND. PK .LE. PCUTK .AND. PK1 .LE. PCUTK) GOTO 99
PK2 = PK1
PK1 = PK
IF (GSTEP .GT. ZERO) GOTO 21
28 CONTINUE
C
99 RETURN
END
C
FUNCTION QTRNG(P, V, R, IFAULT)
C
C WRITTEN TO REPLACE...
C ALGORITHM AS 190.1 APPL. STATIST. (1983) VOL.32, NO.2
C INCLUDES MODIFICATION FROM VOL.34, NO.1
C
C APPROXIMATES THE QUANTILE P FOR A STUDENTIZED RANGE
C DISTRIBUTION HAVING V DEGREES OF FREEDOM AND R SAMPLES
C FOR PROBABILITY P, P.GE.0.90 .AND. P.LE.0.99
C
REAL P, V, R, PCUT, P75, P80, P90, P99, P995, P175, ONE, TWO, FIVE
DATA JMAX, PCUT, P75, P80, P90, P99, P995, P175, ONE, TWO, FIVE /
* 8, 0.0001E0, 0.75E0, 0.80E0, 0.90E0, 0.99E0, 0.995E0, 1.75E0,
* 1.0E0, 2.0E0, 5.0E0/
C
C CHECK INPUT PARAMETERS
C
IFAULT = 0
NFAULT = 0
IF (V .LT. ONE .OR. R .LT. TWO) IFAULT = 1
IF (P .LT. P90 .OR. P .GT. P99) IFAULT = 2
IF (IFAULT .NE. 0) GOTO 99
C
C OBTAIN INITIAL VALUES
C
Q1 = QTRNG0(P, V, R, NFAULT)
IF (NFAULT .NE. 0) GOTO 99
P1 = PRTRNG(Q1, V, R, NFAULT)
IF (NFAULT .NE. 0) GOTO 99
IF(ABS(P1-P).GT.PCUT) GOTO 10
QTRNG = Q1
RETURN
C
10 SIGN = 1.0
IF (P1.GT.P) SIGN = -1.0
C
90 Q2 = Q1 + SIGN
P2 = PRTRNG(Q2, V, R, NFAULT)
IF (NFAULT .NE. 0) GOTO 99
IF(ABS(P2-P).GT.PCUT) GOTO 110
QTRNG = Q2
RETURN
C
110 IF ((P1-P) * (P2-P) .LT. 0.0 ) GOTO 120
Q1 = Q2
P1 = P2
GOTO 90
C
C BINARY SEARCH
C
120 QMIN = AMIN1(Q1, Q2)
QMAX = AMAX1(Q1, Q2)
C
140 QTRNG = (QMIN + QMAX) / 2.0
PNEW = PRTRNG(QTRNG, V, R, NFAULT)
IF (NFAULT .NE. 0) GOTO 99
IF (ABS(PNEW-P) .LE. PCUT) RETURN
IF (PNEW.GT.P) QMAX = QTRNG
IF (PNEW.LT.P) QMIN = QTRNG
GOTO 140
C
99 IF (NFAULT .NE .0) IFAULT = 9
RETURN
END
C
FUNCTION QTRNG0(P, V, R, IFAULT)
C
C ALGORITHM 190.2 APPL. STATIST. (1983) VOL.32, NO.2
C
REAL P, V, R, Q, T, VMAX, HALF, ONE, FOUR, C1, C2, C3, C4, C5
DATA VMAX, HALF, ONE, FOUR, C1, C2, C3, C4, C5 /120.0E0, 0.5E0,
* 1.0E0, 4.0E0, 0.8843E0, 0.2368E0, 1.214E0, 1.208E0, 1.4142E0/
C
T = GAUINV(HALF + HALF * P, IFAULT)
IF (V .LT. VMAX) T = T + (T * T * T + T) / V / FOUR
Q = C1 - C2 * T
IF (V .LT. VMAX) Q = Q - C3 / V + C4 * T / V
QTRNG0 = T * (Q * ALOG(R - ONE) + C5)
RETURN
END