www.pudn.com > Fortran.zip > JMAXN.FOR, change:1994-06-10,size:1663b


 
	SUBROUTINE JMAXN(X,N,FS,EPS,Z,K,L) 
	DIMENSION X(N),Y(10),B(10) 
	DOUBLE PRECISION X,Y,B,Z,T,H1,H2,F,DX 
	L=10 
10	T=0.0 
	DO 15 I=1,N 
	  CALL FS(X,N,I,F) 
	  T=T+ABS(F) 
15	CONTINUE 
	IF (T.GE.EPS) THEN 
	  DO 60 I=1,N 
	    IL=5 
20	    J=0 
	    T=X(I) 
30	    IF (J.LE.2) THEN 
	      Z=T+J*0.01 
	    ELSE 
	      Z=H2 
	    END IF 
	    X(I)=Z 
	    CALL FS(X,N,I,F) 
	    IF (ABS(F)+1.0.NE.1.0) THEN 
	      H1=F 
	      H2=Z 
	      IF (J.EQ.0) THEN 
                Y(1)=H1 
	        B(1)=H2 
	      ELSE 
	        Y(J+1)=H1 
	        DO 40 K=1,J 
	          H2=H2-B(K) 
	          IF (ABS(H2)+1.0D0.EQ.1.0D0) THEN 
	            H2=SIGN(1.0D+35,H2) 
	            H2=H2*SIGN(1.0D0,H1-Y(K)) 
	          ELSE 
	            H2=(H1-Y(K))/H2 
	          END IF 
40	        CONTINUE 
	        B(J+1)=H2 
 
	        H2=0.0 
	        DO 50 K=J,1,-1 
	          H2=H2+B(K+1) 
	          IF (ABS(H2)+1.0D0.EQ.1.0D0) THEN 
	            H2=SIGN(1.0D+35,H2) 
	            H2=H2*SIGN(1.0D0,-Y(K)) 
	          ELSE 
	            H2=-Y(K)/H2 
	          END IF 
50	        CONTINUE 
	        H2=H2+B(1) 
	      END IF 
	      J=J+1 
	      IF (J.LE.7) GOTO 30 
	      X(I)=H2 
	      IL=IL-1 
	      IF (IL.NE.0) GOTO 20 
	    END IF 
	    X(I)=Z 
60	  CONTINUE 
	  L=L-1 
	  IF (L.NE.0) GOTO 10 
	END IF 
	K=1 
	DX=0.00001 
	T=X(1) 
	CALL FS(X,N,0,Z) 
	X(1)=T+DX 
	CALL FS(X,N,0,H1) 
	X(1)=T-DX 
	CALL FS(X,N,0,H2) 
	X(1)=T 
	T=H1+H2-2*Z 
	IF (T.GT.0.0) K=-1 
	J=1 
70	J=J+1 
	DX=0.00001 
	T=X(J) 
	X(J)=T+DX 
	CALL FS(X,N,0,H2) 
	X(J)=T-DX 
	CALL FS(X,N,0,H1) 
	X(J)=T 
	T=H1+H2-2*Z 
	IF ((T*K.LT.0.0).AND.(J.LT.N)) GOTO 70 
	IF (T*K.GT.0.0) K=0 
	RETURN 
	END