www.pudn.com > Fortran.zip > MBSL1.FOR, change:1995-04-01,size:2519b


 
	FUNCTION MBSL1(N,X) 
	DOUBLE PRECISION MBSL1,X 
	DOUBLE PRECISION T,Y,Z,P,Q,S,B0,B1 
	DOUBLE PRECISION A(6),B(6),C(6),D(6),E(5),F(5),G(5),H(5) 
	DATA A/57568490574.0,-13362590354.0,651619640.7, 
     *         -11214424.18,77392.33017,-184.9052456/ 
	DATA B/57568490411.0,1029532985.0,9494680.718, 
     *         59272.64853,267.8532712,1.0/ 
	DATA C/72362614232.0,-7895059235.0,242396853.1, 
     *         -2972611.439,15704.4826,-30.16036606/ 
	DATA D/144725228443.0,2300535178.0,18583304.74, 
     *         99447.43394,376.9991397,1.0/ 
	DATA E/1.0,-0.1098628627D-02,0.2734510407D-04, 
     *         -0.2073370639D-05,0.2093887211D-06/ 
	DATA F/-0.1562499995D-01,0.1430488765D-03,-0.6911147651D-05, 
     *         0.7621095161D-06,-0.934935152D-07/ 
	DATA G/1.0,0.183105D-02,-0.3516396496D-04, 
     *         0.2457520174D-05,-0.240337019D-06/ 
	DATA H/0.4687499995D-01,-0.2002690873D-03,0.8449199096D-05, 
     *         -0.88228987D-06,0.105787412D-06/ 
	T=ABS(X) 
	IF (N.LT.0) N=-N 
	IF (N.NE.1) THEN 
	  IF (T.LT.8.0) THEN 
	    Y=T*T 
	    P=A(6) 
	    Q=B(6) 
	    DO 10 I=5,1,-1 
	      P=P*Y+A(I) 
	      Q=Q*Y+B(I) 
10	    CONTINUE 
	    P=P/Q 
	  ELSE 
	    Z=8.0/T 
	    Y=Z*Z 
	    P=E(5) 
	    Q=F(5) 
	    DO 20 I=4,1,-1 
	      P=P*Y+E(I) 
	      Q=Q*Y+F(I) 
20	    CONTINUE 
	    S=T-0.785398164 
	    P=P*COS(S)-Z*Q*SIN(S) 
	    P=P*SQRT(0.636619772/T) 
	  END IF 
	END IF 
	IF (N.EQ.0) THEN 
	  MBSL1=P 
	  RETURN 
	END IF 
	B0=P 
	IF (T.LT.8.0) THEN 
	  Y=T*T 
	  P=C(6) 
	  Q=D(6) 
	  DO 30 I=5,1,-1 
	    P=P*Y+C(I) 
	    Q=Q*Y+D(I) 
30	  CONTINUE 
	  P=X*P/Q 
	ELSE 
	  Z=8.0/T 
	  Y=Z*Z 
	  P=G(5) 
	  Q=H(5) 
	  DO 40 I=4,1,-1 
	    P=P*Y+G(I) 
	    Q=Q*Y+H(I) 
40	  CONTINUE 
	  S=T-2.356194491 
	  P=P*COS(S)-Z*Q*SIN(S) 
	  P=P*X*SQRT(0.636619772/T)/T 
	END IF 
	IF (N.EQ.1) THEN 
	  MBSL1=P 
	  RETURN 
	END IF 
	B1=P 
	IF (X.EQ.0.0) THEN 
	  MBSL1=0.0 
	  RETURN 
	END IF 
	S=2.0/T 
	IF (T.GT.1.0*N) THEN 
	  IF (X.LT.0.0) B1=-B1 
	  DO 50 I=1,N-1 
	    P=S*I*B1-B0 
	    B0=B1 
	    B1=P 
50	  CONTINUE 
	ELSE 
	  M=SQRT(40.0*N) 
	  M=(N+M)/2 
	  M=M+M 
	  P=0.0 
	  Q=0.0 
	  B0=1.0 
	  B1=0.0 
	  DO 60 I=M-1,0,-1 
	    T=S*(I+1)*B0-B1 
	    B1=B0 
	    B0=T 
	    IF (ABS(B0).GT.1.0D+10) THEN 
	      B0=B0*1.0D-10 
	      B1=B1*1.0D-10 
	      P=P*1.0D-10 
	      Q=Q*1.0D-10 
	    END IF 
	    IF (MOD(I+2,2).EQ.0) Q=Q+B0 
	    IF (i+1.EQ.N) P=B1 
60	  CONTINUE 
	  Q=2.0*Q-B0 
	  P=P/Q 
	END IF 
	IF ((X.LT.0.0).AND.(MOD(N,2).EQ.1)) P=-P 
	MBSL1=P 
	RETURN 
	END