C***********************************************************************
C   THIS SUBROUTINE COMPUTES THE PROBABILITY INTEGRAL TRANSFORMATION
C   FOR A PRODUCT MOMENT CORRELATION COEFFICIENT. IT IS ASSUMED THAT
C   THE CORRELATION WAS COMPUTED FROM A SAMPLE OF A BIVARIATE
C   NORMAL POPULATION WITH TRUE CORRELATION EQUAL ZERO.
C
C   CALLING ARGUMENTS:
C   N    THE SAMPLE SIZE FROM WHICH R IS COMPUTED.
C   R    THE CORRELATION COEFFICIENT.
C   P    THE PROBABILITY OF A CORRELATION VALUE LESS THAN OR EQUAL
C        TO THE COMPUTED ONE. IF THERE IS ANY PROBLEM WITH COMPUTING P
C        THEN P IS RETURNED EQUAL TO -1.
C   PSQ  THE PROBABILITY OF A CORRELATION COFFICIENT LESS THAN OR EQUAL
C        TO THE SQUARED R VALUE. ALSO RETURNED AS -1 IN CASE OF TROUBLE.
C
C   FOR SAMPLE SIZES GREATER THAN 100 R IS TRANSFORMED TO FISHERS Z:
C        Z   (102)*LN((1+R)/(1-R))
C   THE DISTRIBUTION OF Y Z*Z*(N-3) IS NEARLY CENTRAL CHI-SQUARE ON
C   ONE DEGREE OF FREEDOM.
C   RSQ HAS A BETA(1/2,(N-2)/2) DISTRIBUTION, THE DENSITY FUNCTION IS
C   B(N)*(1-RSQ)**((N-4)/2)/SQRT(RSQ).  THE ARRAY OF NORMALIZING
C   CONSTANTS B(N) HAS BEEN PRE SET FOR VALUES OF N 3,100.
C   THE DENSITY FORM HAS BEEN EXPANDED IN A SERIES THEN INTEGRATED
C   TERM WISE TO YEILD THE P. I. T. AS A SERIES. WHEN N IS EVEN THE
C   SERIES IS FINITE. FOR N ODD THE SERIES IS INFINITE AND ONLY FINITE
C   MANY TERMS ARE USED AS AN APPROXIMATION.
C   ALSO FOR RSQ VALUES VERY NEAR 1, SO THAT PSQ WOULD BE .999 OR MORE,
C   THE PROGRAM JUST SETS PSQ EQUAL TO 1.0  AND RETURNS.
C
C     SUBROUTINES CALLED: ONE
C**************************************
      SUBROUTINE COR (N,R,P,PSQ)
      DIMENSION B(100)
      DATA B /0.,0.,.318309886184,.5,0.63661977,0.75000000,0.84882636,0.
     1 93750000,1.01859164,1.09375000,1.16410473,1.23046875,1.29344970,1
     2 .35351562,1.41103603,1.46630859,1.51957727,1.57104492,1.62088242,
     3 1.66923523,1.71622844,1.76197052,1.80655625,1.85006905,1.89258274
     4 ,1.93416309,1.97486895,2.01475322,2.05386371,2.09224373,2.1299327
     5 3,2.16696672,2.20337869,2.23919895,2.27445542,2.30917391,2.343378
     6 31,2.37709079,2.41033198,2.44312109,2.47547609,2.50741375,2.53894
     7 983,2.57009910,2.60087544,2.63129193,2.66136091,2.69109402,2.7205
     8 0227,2.74959607,2.77838529,2.80687932,2.83508703,2.86301690,2.890
     9 67698,2.91807492,2.94521805,2.97211334,2.99876747,3.02518680,3.05
     $ 137742,3.07734519,3.10309569,3.12863428,3.15396611,3.17909612,3.2
     $ 0402906,3.22876950,3.25332182,3.27769025,3.30187886,3.32589157,3.
     $ 34973218,3.37340431,3.39691150,3.42025715,3.44344454,3.46647684,3
     $ .48935713,3.51208838,3.53467346,3.55711515,3.57941616,3.60157909,
     $ 3.62360648,3.64550079,3.66726439,3.68889961,3.71040868,3.73179379
     $ ,3.75305705,3.77420053,3.79522623,3.81613610,3.83693202,3.8576158
     $ 4,3.87818935,3.89865430,3.91901240,3.93926528/
C
C   CHECK INPUT
C
      P=-1.
      PSQ=-1.
      RSQ=R*R
      IF ((N.LT.3).OR.(RSQ.GT.1.)) RETURN
C
C   CHECK IF N IS LESS THAN 100
C
      IF (N.LE.100) GO TO 10
      SIGN=+1.
      IF (R.LT.0.) SIGN=-1.
      Z=.5*ALOG((1.+R)/(1.-R))
      Y=Z*Z*FLOAT(N-3)
      CALL ONE (Y,PSQ)
      P=(1.+SIGN*PSQ)*.5
      RETURN
C
C   N IS LESS THAN 100, CHECK THAT RSQ IS NOT CLOSE TO 1.
C
   10 DIV=N-3
      IF (N.EQ.3) DIV=1.
      TEST=EXP(SQRT(60./DIV))
      TEST=(TEST-1.)/(TEST+1.)
      PSQ=1.
      P=1.
      IF (R.LT.0.) P=0.
      IF (RSQ.GE.TEST) RETURN
C
C   COMPUTATION OF PSQ BEGINS HERE.
C
      A=2.*ABS(R)
      S=A
      IF (N.EQ.4) GO TO 50
      X=FLOAT(N)*.5
      M=X+.001
      X=X-2.
      TEST=(1.-RSQ)*.00000001
      IF ((2*M).NE.N) GO TO 30
C
C   N IS EVEN
C
      M=M-2
      DO 20 J=1,M
      XI=FLOAT(J-1)
      W=(RSQ*(X-XI)*(XI+.5))/((XI+1.5)*(XI+1))
      A=-A*W
      S=S+A
      IF (ABS(A).LT.TEST) GO TO 50
   20 CONTINUE
      GO TO 50
C
C   N IS ODD
C
   30 I=0
   40 XI=FLOAT(I)
      W=(RSQ*(X-XI)*(XI+.5))/((XI+1.5)*(XI+1))
      A=-A*W
      S=S+A
      IF (ABS(A).LT.TEST) GO TO 50
      I=I+1
      GO TO 40
C
C   FINISH COMPUTING PSQ AND P.
C
   50 PSQ=B(N)*S
      IF(PSQ.GT.1.)PSQ=1.
      SIGN=1.
      IF (R.LT.0.) SIGN=-1.
      P=(1.+SIGN*PSQ)*.5
      RETURN
      END
