dxqmu.f 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. *DECK DXQMU
  2. SUBROUTINE DXQMU (NU1, NU2, MU1, MU2, THETA, X, SX, ID, PQA, IPQA,
  3. 1 IERROR)
  4. C***BEGIN PROLOGUE DXQMU
  5. C***SUBSIDIARY
  6. C***PURPOSE To compute the values of Legendre functions for DXLEGF.
  7. C Method: forward mu-wise recurrence for Q(MU,NU,X) for fixed
  8. C nu to obtain Q(MU1,NU,X), Q(MU1+1,NU,X), ..., Q(MU2,NU,X).
  9. C***LIBRARY SLATEC
  10. C***CATEGORY C3A2, C9
  11. C***TYPE DOUBLE PRECISION (XQMU-S, DXQMU-D)
  12. C***KEYWORDS LEGENDRE FUNCTIONS
  13. C***AUTHOR Smith, John M., (NBS and George Mason University)
  14. C***ROUTINES CALLED DXADD, DXADJ, DXPQNU
  15. C***REVISION HISTORY (YYMMDD)
  16. C 820728 DATE WRITTEN
  17. C 890126 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  18. C 901019 Revisions to prologue. (DWL and WRB)
  19. C 901106 Corrected order of sections in prologue and added TYPE
  20. C section. (WRB)
  21. C 920127 Revised PURPOSE section of prologue. (DWL)
  22. C***END PROLOGUE DXQMU
  23. DIMENSION PQA(*),IPQA(*)
  24. DOUBLE PRECISION DMU,NU,NU1,NU2,PQ,PQA,PQ1,PQ2,SX,X,X1,X2
  25. DOUBLE PRECISION THETA
  26. C***FIRST EXECUTABLE STATEMENT DXQMU
  27. IERROR=0
  28. MU=0
  29. C
  30. C CALL DXPQNU TO OBTAIN Q(0.,NU1,X)
  31. C
  32. CALL DXPQNU(NU1,NU2,MU,THETA,ID,PQA,IPQA,IERROR)
  33. IF (IERROR.NE.0) RETURN
  34. PQ2=PQA(1)
  35. IPQ2=IPQA(1)
  36. MU=1
  37. C
  38. C CALL DXPQNU TO OBTAIN Q(1.,NU1,X)
  39. C
  40. CALL DXPQNU(NU1,NU2,MU,THETA,ID,PQA,IPQA,IERROR)
  41. IF (IERROR.NE.0) RETURN
  42. NU=NU1
  43. K=0
  44. MU=1
  45. DMU=1.D0
  46. PQ1=PQA(1)
  47. IPQ1=IPQA(1)
  48. IF(MU1.GT.0) GO TO 310
  49. K=K+1
  50. PQA(K)=PQ2
  51. IPQA(K)=IPQ2
  52. IF(MU2.LT.1) GO TO 330
  53. 310 IF(MU1.GT.1) GO TO 320
  54. K=K+1
  55. PQA(K)=PQ1
  56. IPQA(K)=IPQ1
  57. IF(MU2.LE.1) GO TO 330
  58. 320 CONTINUE
  59. C
  60. C FORWARD RECURRENCE IN MU TO OBTAIN
  61. C Q(MU1,NU,X),Q(MU1+1,NU,X),....,Q(MU2,NU,X) USING
  62. C Q(MU+1,NU,X)=-2.*MU*X*SQRT(1./(1.-X**2))*Q(MU,NU,X)
  63. C -(NU+MU)*(NU-MU+1.)*Q(MU-1,NU,X)
  64. C
  65. X1=-2.D0*DMU*X*SX*PQ1
  66. X2=(NU+DMU)*(NU-DMU+1.D0)*PQ2
  67. CALL DXADD(X1,IPQ1,-X2,IPQ2,PQ,IPQ,IERROR)
  68. IF (IERROR.NE.0) RETURN
  69. CALL DXADJ(PQ,IPQ,IERROR)
  70. IF (IERROR.NE.0) RETURN
  71. PQ2=PQ1
  72. IPQ2=IPQ1
  73. PQ1=PQ
  74. IPQ1=IPQ
  75. MU=MU+1
  76. DMU=DMU+1.D0
  77. IF(MU.LT.MU1) GO TO 320
  78. K=K+1
  79. PQA(K)=PQ
  80. IPQA(K)=IPQ
  81. IF(MU2.GT.MU) GO TO 320
  82. 330 RETURN
  83. END