C NEWTON.FOR SUBROUTINE NEWTON( *, *, MY, MAXMSH, MODEN, MODQTY, & DH0, MH0I, I, DSED, MSEDI, ADA) C____________________________________________________________ C | C This routine finds the zeroes in the characteristiC | C equation for the second and subsequent meshes. | C____________________________________________________________| DOUBLE PRECISION CMIN, H0, H1 DOUBLE PRECISION TWOPI, PI, OMEGA DOUBLE PRECISION MY(MAXMSH,MODEN) DOUBLE PRECISION EPS, EPS10, X0, X1, X2 DOUBLE PRECISION F0, F1, DH0(8), DSED(8), STIFF DOUBLE PRECISION EIGVAL, EIGREF, EIGMIN, EIGMAX, MINEIG DOUBLE PRECISION F00, F11 DOUBLE PRECISION CON1, CON2, CON3, CON4, CON5, SEDK DOUBLE PRECISION ADA( * ) COMMON /CONST/ CON1, CON2, CON3, CON4, CON5, SEDK COMMON /DENS/ R0, R1, R2 COMMON /G/ H0, H1 COMMON /GEN/ EIGREF, EIGMIN, EIGMAX, STIFF COMMON /LUIN/ LUIN, LUWRN, LUCHK COMMON /LUNIT/ LUPLP, LUPLT, LUPRT COMMON /N/ MINMOD, MDUMMY, MODCUT, HBEAM, BPHVEL COMMON /NA/ ND0, ND1, CMIN COMMON /TRIGON/ TWOPI, PI, OMEGA DATA MAXIT/ 20 / DATA EPS / 1.0E-11 / DATA EPS10 / 1.0E-10 / 300 FORMAT(1X,/,' *** MAX ITERATIONS EXCEEDED FOR MODE ', & I4,' ***',/, & ' *** SEARCH WILL BE REPEATED WITH BRENT *** ',/) 320 FORMAT(1X,' *** WARNING: MAXIMUM ORDER MODE=',I4,' AT MESH',I4) 400 FORMAT(1X,' *** WARNING: MODE ',I4,' NOT FOUND.', & ' SEARCH WILL BE REPEATED WITH SUB BRENT. ') C NCROSS : MAXIMUM ORDER MODE FOR THE ACTUAL MESH MINEIG=EIGMIN*1.00001D0 CALL STURM(MINEIG,MH0I,MSEDI,DH0(I),DSED(I),NCROSS,ADA) C NMMAX= NCROSS C CHECKING TRIAL EIGENVALUES BEFORE SEARCH MAXMOD=MINMOD+MODQTY-1 IF(NCROSS .LT. MAXMOD) THEN WRITE(LUPRT,320) NCROSS, I CWRN WRITE(LUWRN,320) NCROSS, I MAXMOD=NCROSS MODQTY=MAXMOD-MINMOD+1 IF(MODQTY .LE. 0) RETURN END IF IF(MODQTY .GE. 2) THEN DO 2000 M=2,MODQTY IF( MY(I,M-1) .LE. MY(I,M) ) THEN CWRN WRITE(LUWRN,*) CWRN & ' TRIAL EIGENVALUES NOT PROPERLY ORDERED ', CWRN & ' SEARCH WILL BE DONE WITH SUB BRENT ' RETURN 2 END IF 2000 CONTINUE END IF C DO 2200 M=MODQTY,1,-1 IF(MY(I,M) .GE. MINEIG) THEN MODQTY=M MAXMOD=MINMOD+MODQTY-1 GO TO 2400 END IF CWRN WRITE(LUWRN,*) CWRN & ' TRIAL EIGENVALUE BEYOND CUTOFF FOR MODE ', CWRN & MINMOD+M-1 2200 CONTINUE MODQTY=0 MAXMOD=0 RETURN 2400 CONTINUE C FIND THE EIGENVALUES DO 4000 M=1,MODQTY X0=MY(I,M) CALL INIT(X0,MH0I,MSEDI,DH0(I),DSED(I),F0,NOVFL0,MM,ADA) IF(MM .EQ. MINMOD+M-1) THEN X1=X0+2.0D0*EPS10*X0 ELSE IF (MM .EQ. MINMOD+M-2) THEN X1=X0-2.0D0*EPS10*X0 ELSE CWRN WRITE(LUWRN,*) CWRN & ' WARNING FOR MODE ',MINMOD+M-1,MM,' AT MESH ',I CWRN WRITE(LUWRN,*) CWRN & ' POORLY ESTIMATED TRIAL EIGENVALUE. BRENT IS USED' RETURN 2 END IF NITER=0 3000 CONTINUE CALL CHARAC(X1,MH0I,MSEDI,DH0(I),DSED(I),F1,NOVFL1,ADA) NODIF=NOVFL1-NOVFL0 F00=F0 F11=F1 IF (NODIF.NE.0) THEN IF (NODIF.GT.0) THEN F00=F0*(1E-20)**NODIF ELSE F11=F1*(1E-20)**(-NODIF) END IF END IF IF(F11-F00.EQ.0.D0) THEN X2=(X0+X1)/2.D0 ELSE X2=(X0*F11-X1*F00)/(F11-F00) ENDIF NITER=NITER+1 IF (NITER.GT.MAXIT) THEN CWRN WRITE(LUWRN,300) MINMOD+M-1 RETURN 2 END IF IF(ABS(X1-X2).GT.ABS(EPS*X2)) THEN X0=X1 F0=F1 NOVFL0=NOVFL1 X1=X2 GO TO 3000 ENDIF IF( X2 .LT. MINEIG ) THEN CWRN WRITE(LUWRN,400) MINMOD+M-1 RETURN 2 END IF MY(I,M)=X2 4000 CONTINUE C CHECKING OF EXTREME EIGENVALUES AND MONOTONICITY MAXMOD=MINMOD+MODQTY-1 IF( MY(I,1) .GT. EIGMAX ) THEN CWRN WRITE(LUWRN,*) CWRN & ' *** WARNING : POOR ACCURACY ON FIRST MODE.', CWRN & ' SEARCH IS REPEATED WITH SUB BRENT ' RETURN 2 END IF EIGVAL=MY(I,1) + EPS10*MY(I,1) CALL STURM(EIGVAL,MH0I,MSEDI,DH0(I),DSED(I),NCROSS,ADA) IF( NCROSS+1 .NE. MINMOD ) THEN CWRN WRITE(LUWRN,*) ' FIRST MODE NOT FOUND.', CWRN & ' SEARCH IS NOW REPEATED WITH SUB BRENT ' RETURN 2 END IF EIGVAL=MY(I,MODQTY) - EPS10*MY(I,MODQTY) CALL STURM(EIGVAL,MH0I,MSEDI,DH0(I),DSED(I),NCROSS,ADA) IF( NCROSS .NE. MAXMOD ) THEN CWRN WRITE(LUWRN,400) MINMOD+MODQTY-1 RETURN 2 END IF IF(MODQTY.GT.2) THEN DO 6000 M=2,MODQTY-1 IF( MY(I,M)-MY(I,M+1) .LT. 2.0D0*EPS ) THEN CWRN WRITE(LUWRN,*) ' WN NOT PROPERLY ORDERED ', CWRN & ' SEARCH IS NOW REPEATED WITH SUB BRENT ' RETURN 2 END IF 6000 CONTINUE END IF RETURN END