dxpqnu.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. *DECK DXPQNU
  2. SUBROUTINE DXPQNU (NU1, NU2, MU, THETA, ID, PQA, IPQA, IERROR)
  3. C***BEGIN PROLOGUE DXPQNU
  4. C***SUBSIDIARY
  5. C***PURPOSE To compute the values of Legendre functions for DXLEGF.
  6. C This subroutine calculates initial values of P or Q using
  7. C power series, then performs forward nu-wise recurrence to
  8. C obtain P(-MU,NU,X), Q(0,NU,X), or Q(1,NU,X). The nu-wise
  9. C recurrence is stable for P for all mu and for Q for mu=0,1.
  10. C***LIBRARY SLATEC
  11. C***CATEGORY C3A2, C9
  12. C***TYPE DOUBLE PRECISION (XPQNU-S, DXPQNU-D)
  13. C***KEYWORDS LEGENDRE FUNCTIONS
  14. C***AUTHOR Smith, John M., (NBS and George Mason University)
  15. C***ROUTINES CALLED DXADD, DXADJ, DXPSI
  16. C***COMMON BLOCKS DXBLK1
  17. C***REVISION HISTORY (YYMMDD)
  18. C 820728 DATE WRITTEN
  19. C 890126 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  20. C 901019 Revisions to prologue. (DWL and WRB)
  21. C 901106 Changed all specific intrinsics to generic. (WRB)
  22. C Corrected order of sections in prologue and added TYPE
  23. C section. (WRB)
  24. C 920127 Revised PURPOSE section of prologue. (DWL)
  25. C***END PROLOGUE DXPQNU
  26. DOUBLE PRECISION A,NU,NU1,NU2,PQ,PQA,DXPSI,R,THETA,W,X,X1,X2,XS,
  27. 1 Y,Z
  28. DOUBLE PRECISION DI,DMU,PQ1,PQ2,FACTMU,FLOK
  29. DIMENSION PQA(*),IPQA(*)
  30. COMMON /DXBLK1/ NBITSF
  31. SAVE /DXBLK1/
  32. C
  33. C J0, IPSIK, AND IPSIX ARE INITIALIZED IN THIS SUBROUTINE.
  34. C J0 IS THE NUMBER OF TERMS USED IN SERIES EXPANSION
  35. C IN SUBROUTINE DXPQNU.
  36. C IPSIK, IPSIX ARE VALUES OF K AND X RESPECTIVELY
  37. C USED IN THE CALCULATION OF THE DXPSI FUNCTION.
  38. C
  39. C***FIRST EXECUTABLE STATEMENT DXPQNU
  40. IERROR=0
  41. J0=NBITSF
  42. IPSIK=1+(NBITSF/10)
  43. IPSIX=5*IPSIK
  44. IPQ=0
  45. C FIND NU IN INTERVAL [-.5,.5) IF ID=2 ( CALCULATION OF Q )
  46. NU=MOD(NU1,1.D0)
  47. IF(NU.GE..5D0) NU=NU-1.D0
  48. C FIND NU IN INTERVAL (-1.5,-.5] IF ID=1,3, OR 4 ( CALC. OF P )
  49. IF(ID.NE.2.AND.NU.GT.-.5D0) NU=NU-1.D0
  50. C CALCULATE MU FACTORIAL
  51. K=MU
  52. DMU=MU
  53. IF(MU.LE.0) GO TO 60
  54. FACTMU=1.D0
  55. IF=0
  56. DO 50 I=1,K
  57. FACTMU=FACTMU*I
  58. 50 CALL DXADJ(FACTMU,IF,IERROR)
  59. IF (IERROR.NE.0) RETURN
  60. 60 IF(K.EQ.0) FACTMU=1.D0
  61. IF(K.EQ.0) IF=0
  62. C
  63. C X=COS(THETA)
  64. C Y=SIN(THETA/2)**2=(1-X)/2=.5-.5*X
  65. C R=TAN(THETA/2)=SQRT((1-X)/(1+X)
  66. C
  67. X=COS(THETA)
  68. Y=SIN(THETA/2.D0)**2
  69. R=TAN(THETA/2.D0)
  70. C
  71. C USE ASCENDING SERIES TO CALCULATE TWO VALUES OF P OR Q
  72. C FOR USE AS STARTING VALUES IN RECURRENCE RELATION.
  73. C
  74. PQ2=0.0D0
  75. DO 100 J=1,2
  76. IPQ1=0
  77. IF(ID.EQ.2) GO TO 80
  78. C
  79. C SERIES FOR P ( ID = 1, 3, OR 4 )
  80. C P(-MU,NU,X)=1./FACTORIAL(MU)*SQRT(((1.-X)/(1.+X))**MU)
  81. C *SUM(FROM 0 TO J0-1)A(J)*(.5-.5*X)**J
  82. C
  83. IPQ=0
  84. PQ=1.D0
  85. A=1.D0
  86. IA=0
  87. DO 65 I=2,J0
  88. DI=I
  89. A=A*Y*(DI-2.D0-NU)*(DI-1.D0+NU)/((DI-1.D0+DMU)*(DI-1.D0))
  90. CALL DXADJ(A,IA,IERROR)
  91. IF (IERROR.NE.0) RETURN
  92. IF(A.EQ.0.D0) GO TO 66
  93. CALL DXADD(PQ,IPQ,A,IA,PQ,IPQ,IERROR)
  94. IF (IERROR.NE.0) RETURN
  95. 65 CONTINUE
  96. 66 CONTINUE
  97. IF(MU.LE.0) GO TO 90
  98. X2=R
  99. X1=PQ
  100. K=MU
  101. DO 77 I=1,K
  102. X1=X1*X2
  103. 77 CALL DXADJ(X1,IPQ,IERROR)
  104. IF (IERROR.NE.0) RETURN
  105. PQ=X1/FACTMU
  106. IPQ=IPQ-IF
  107. CALL DXADJ(PQ,IPQ,IERROR)
  108. IF (IERROR.NE.0) RETURN
  109. GO TO 90
  110. C
  111. C Z=-LN(R)=.5*LN((1+X)/(1-X))
  112. C
  113. 80 Z=-LOG(R)
  114. W=DXPSI(NU+1.D0,IPSIK,IPSIX)
  115. XS=1.D0/SIN(THETA)
  116. C
  117. C SERIES SUMMATION FOR Q ( ID = 2 )
  118. C Q(0,NU,X)=SUM(FROM 0 TO J0-1)((.5*LN((1+X)/(1-X))
  119. C +DXPSI(J+1,IPSIK,IPSIX)-DXPSI(NU+1,IPSIK,IPSIX)))*A(J)*(.5-.5*X)**J
  120. C
  121. C Q(1,NU,X)=-SQRT(1./(1.-X**2))+SQRT((1-X)/(1+X))
  122. C *SUM(FROM 0 T0 J0-1)(-NU*(NU+1)/2*LN((1+X)/(1-X))
  123. C +(J-NU)*(J+NU+1)/(2*(J+1))+NU*(NU+1)*
  124. C (DXPSI(NU+1,IPSIK,IPSIX)-DXPSI(J+1,IPSIK,IPSIX))*A(J)*(.5-.5*X)**J
  125. C
  126. C NOTE, IN THIS LOOP K=J+1
  127. C
  128. PQ=0.D0
  129. IPQ=0
  130. IA=0
  131. A=1.D0
  132. DO 85 K=1,J0
  133. FLOK=K
  134. IF(K.EQ.1) GO TO 81
  135. A=A*Y*(FLOK-2.D0-NU)*(FLOK-1.D0+NU)/((FLOK-1.D0+DMU)*(FLOK-1.D0))
  136. CALL DXADJ(A,IA,IERROR)
  137. IF (IERROR.NE.0) RETURN
  138. 81 CONTINUE
  139. IF(MU.GE.1) GO TO 83
  140. X1=(DXPSI(FLOK,IPSIK,IPSIX)-W+Z)*A
  141. IX1=IA
  142. CALL DXADD(PQ,IPQ,X1,IX1,PQ,IPQ,IERROR)
  143. IF (IERROR.NE.0) RETURN
  144. GO TO 85
  145. 83 X1=(NU*(NU+1.D0)*(Z-W+DXPSI(FLOK,IPSIK,IPSIX))+(NU-FLOK+1.D0)
  146. 1 *(NU+FLOK)/(2.D0*FLOK))*A
  147. IX1=IA
  148. CALL DXADD(PQ,IPQ,X1,IX1,PQ,IPQ,IERROR)
  149. IF (IERROR.NE.0) RETURN
  150. 85 CONTINUE
  151. IF(MU.GE.1) PQ=-R*PQ
  152. IXS=0
  153. IF(MU.GE.1) CALL DXADD(PQ,IPQ,-XS,IXS,PQ,IPQ,IERROR)
  154. IF (IERROR.NE.0) RETURN
  155. IF(J.EQ.2) MU=-MU
  156. IF(J.EQ.2) DMU=-DMU
  157. 90 IF(J.EQ.1) PQ2=PQ
  158. IF(J.EQ.1) IPQ2=IPQ
  159. NU=NU+1.D0
  160. 100 CONTINUE
  161. K=0
  162. IF(NU-1.5D0.LT.NU1) GO TO 120
  163. K=K+1
  164. PQA(K)=PQ2
  165. IPQA(K)=IPQ2
  166. IF(NU.GT.NU2+.5D0) RETURN
  167. 120 PQ1=PQ
  168. IPQ1=IPQ
  169. IF(NU.LT.NU1+.5D0) GO TO 130
  170. K=K+1
  171. PQA(K)=PQ
  172. IPQA(K)=IPQ
  173. IF(NU.GT.NU2+.5D0) RETURN
  174. C
  175. C FORWARD NU-WISE RECURRENCE FOR F(MU,NU,X) FOR FIXED MU
  176. C USING
  177. C (NU+MU+1)*F(MU,NU,X)=(2.*NU+1)*F(MU,NU,X)-(NU-MU)*F(MU,NU-1,X)
  178. C WHERE F(MU,NU,X) MAY BE P(-MU,NU,X) OR IF MU IS REPLACED
  179. C BY -MU THEN F(MU,NU,X) MAY BE Q(MU,NU,X).
  180. C NOTE, IN THIS LOOP, NU=NU+1
  181. C
  182. 130 X1=(2.D0*NU-1.D0)/(NU+DMU)*X*PQ1
  183. X2=(NU-1.D0-DMU)/(NU+DMU)*PQ2
  184. CALL DXADD(X1,IPQ1,-X2,IPQ2,PQ,IPQ,IERROR)
  185. IF (IERROR.NE.0) RETURN
  186. CALL DXADJ(PQ,IPQ,IERROR)
  187. IF (IERROR.NE.0) RETURN
  188. NU=NU+1.D0
  189. PQ2=PQ1
  190. IPQ2=IPQ1
  191. GO TO 120
  192. C
  193. END