OpenLibm/slatec/dxqmu.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

83 lines
2.4 KiB
Fortran

*DECK DXQMU
SUBROUTINE DXQMU (NU1, NU2, MU1, MU2, THETA, X, SX, ID, PQA, IPQA,
1 IERROR)
C***BEGIN PROLOGUE DXQMU
C***SUBSIDIARY
C***PURPOSE To compute the values of Legendre functions for DXLEGF.
C Method: forward mu-wise recurrence for Q(MU,NU,X) for fixed
C nu to obtain Q(MU1,NU,X), Q(MU1+1,NU,X), ..., Q(MU2,NU,X).
C***LIBRARY SLATEC
C***CATEGORY C3A2, C9
C***TYPE DOUBLE PRECISION (XQMU-S, DXQMU-D)
C***KEYWORDS LEGENDRE FUNCTIONS
C***AUTHOR Smith, John M., (NBS and George Mason University)
C***ROUTINES CALLED DXADD, DXADJ, DXPQNU
C***REVISION HISTORY (YYMMDD)
C 820728 DATE WRITTEN
C 890126 Revised to meet SLATEC CML recommendations. (DWL and JMS)
C 901019 Revisions to prologue. (DWL and WRB)
C 901106 Corrected order of sections in prologue and added TYPE
C section. (WRB)
C 920127 Revised PURPOSE section of prologue. (DWL)
C***END PROLOGUE DXQMU
DIMENSION PQA(*),IPQA(*)
DOUBLE PRECISION DMU,NU,NU1,NU2,PQ,PQA,PQ1,PQ2,SX,X,X1,X2
DOUBLE PRECISION THETA
C***FIRST EXECUTABLE STATEMENT DXQMU
IERROR=0
MU=0
C
C CALL DXPQNU TO OBTAIN Q(0.,NU1,X)
C
CALL DXPQNU(NU1,NU2,MU,THETA,ID,PQA,IPQA,IERROR)
IF (IERROR.NE.0) RETURN
PQ2=PQA(1)
IPQ2=IPQA(1)
MU=1
C
C CALL DXPQNU TO OBTAIN Q(1.,NU1,X)
C
CALL DXPQNU(NU1,NU2,MU,THETA,ID,PQA,IPQA,IERROR)
IF (IERROR.NE.0) RETURN
NU=NU1
K=0
MU=1
DMU=1.D0
PQ1=PQA(1)
IPQ1=IPQA(1)
IF(MU1.GT.0) GO TO 310
K=K+1
PQA(K)=PQ2
IPQA(K)=IPQ2
IF(MU2.LT.1) GO TO 330
310 IF(MU1.GT.1) GO TO 320
K=K+1
PQA(K)=PQ1
IPQA(K)=IPQ1
IF(MU2.LE.1) GO TO 330
320 CONTINUE
C
C FORWARD RECURRENCE IN MU TO OBTAIN
C Q(MU1,NU,X),Q(MU1+1,NU,X),....,Q(MU2,NU,X) USING
C Q(MU+1,NU,X)=-2.*MU*X*SQRT(1./(1.-X**2))*Q(MU,NU,X)
C -(NU+MU)*(NU-MU+1.)*Q(MU-1,NU,X)
C
X1=-2.D0*DMU*X*SX*PQ1
X2=(NU+DMU)*(NU-DMU+1.D0)*PQ2
CALL DXADD(X1,IPQ1,-X2,IPQ2,PQ,IPQ,IERROR)
IF (IERROR.NE.0) RETURN
CALL DXADJ(PQ,IPQ,IERROR)
IF (IERROR.NE.0) RETURN
PQ2=PQ1
IPQ2=IPQ1
PQ1=PQ
IPQ1=IPQ
MU=MU+1
DMU=DMU+1.D0
IF(MU.LT.MU1) GO TO 320
K=K+1
PQA(K)=PQ
IPQA(K)=IPQ
IF(MU2.GT.MU) GO TO 320
330 RETURN
END