dxpmu.f 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. *DECK DXPMU
  2. SUBROUTINE DXPMU (NU1, NU2, MU1, MU2, THETA, X, SX, ID, PQA, IPQA,
  3. 1 IERROR)
  4. C***BEGIN PROLOGUE DXPMU
  5. C***SUBSIDIARY
  6. C***PURPOSE To compute the values of Legendre functions for DXLEGF.
  7. C Method: backward mu-wise recurrence for P(-MU,NU,X) for
  8. C fixed nu to obtain P(-MU2,NU1,X), P(-(MU2-1),NU1,X), ...,
  9. C P(-MU1,NU1,X) and store in ascending mu order.
  10. C***LIBRARY SLATEC
  11. C***CATEGORY C3A2, C9
  12. C***TYPE DOUBLE PRECISION (XPMU-S, DXPMU-D)
  13. C***KEYWORDS LEGENDRE FUNCTIONS
  14. C***AUTHOR Smith, John M., (NBS and George Mason University)
  15. C***ROUTINES CALLED DXADD, DXADJ, DXPQNU
  16. C***REVISION HISTORY (YYMMDD)
  17. C 820728 DATE WRITTEN
  18. C 890126 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  19. C 901019 Revisions to prologue. (DWL and WRB)
  20. C 901106 Changed all specific intrinsics to generic. (WRB)
  21. C Corrected order of sections in prologue and added TYPE
  22. C section. (WRB)
  23. C 920127 Revised PURPOSE section of prologue. (DWL)
  24. C***END PROLOGUE DXPMU
  25. DOUBLE PRECISION PQA,NU1,NU2,P0,X,SX,THETA,X1,X2
  26. DIMENSION PQA(*),IPQA(*)
  27. C
  28. C CALL DXPQNU TO OBTAIN P(-MU2,NU,X)
  29. C
  30. C***FIRST EXECUTABLE STATEMENT DXPMU
  31. IERROR=0
  32. CALL DXPQNU(NU1,NU2,MU2,THETA,ID,PQA,IPQA,IERROR)
  33. IF (IERROR.NE.0) RETURN
  34. P0=PQA(1)
  35. IP0=IPQA(1)
  36. MU=MU2-1
  37. C
  38. C CALL DXPQNU TO OBTAIN P(-MU2-1,NU,X)
  39. C
  40. CALL DXPQNU(NU1,NU2,MU,THETA,ID,PQA,IPQA,IERROR)
  41. IF (IERROR.NE.0) RETURN
  42. N=MU2-MU1+1
  43. PQA(N)=P0
  44. IPQA(N)=IP0
  45. IF(N.EQ.1) GO TO 300
  46. PQA(N-1)=PQA(1)
  47. IPQA(N-1)=IPQA(1)
  48. IF(N.EQ.2) GO TO 300
  49. J=N-2
  50. 290 CONTINUE
  51. C
  52. C BACKWARD RECURRENCE IN MU TO OBTAIN
  53. C P(-MU2,NU1,X),P(-(MU2-1),NU1,X),....P(-MU1,NU1,X)
  54. C USING
  55. C (NU-MU)*(NU+MU+1.)*P(-(MU+1),NU,X)=
  56. C 2.*MU*X*SQRT((1./(1.-X**2))*P(-MU,NU,X)-P(-(MU-1),NU,X)
  57. C
  58. X1=2.D0*MU*X*SX*PQA(J+1)
  59. X2=-(NU1-MU)*(NU1+MU+1.D0)*PQA(J+2)
  60. CALL DXADD(X1,IPQA(J+1),X2,IPQA(J+2),PQA(J),IPQA(J),IERROR)
  61. IF (IERROR.NE.0) RETURN
  62. CALL DXADJ(PQA(J),IPQA(J),IERROR)
  63. IF (IERROR.NE.0) RETURN
  64. IF(J.EQ.1) GO TO 300
  65. J=J-1
  66. MU=MU-1
  67. GO TO 290
  68. 300 RETURN
  69. END