SUBROUTINE ZSMPL(EIGVAL,MH0I,MSEDI,DH0I,DSEDI,S2,M,ADA, & MODH0,ZMINH0,ZCROSS,ZMINH1) C C__________________________________________________________ C | C This routine counts the number of sign changes in | C the Sturm sequence and calculates the value of the | C characteristiC equation. | C_________________________________________________________| C DOUBLE PRECISION H0, H1, ROB, ROS DOUBLE PRECISION TWOPI, PI, OMEGA DOUBLE PRECISION DH0I, DSEDI, U1H0, U1SED, SEDK DOUBLE PRECISION ADA(*) DOUBLE PRECISION EIGVAL, S0, S1, S2, STIFF DOUBLE PRECISION EIGREF, EIGMIN, EIGMAX, EIGX DOUBLE PRECISION CON1, CON2, CON3, CON4, CON5 COMMON /CONST/ CON1, CON2, CON3, CON4, CON5, SEDK COMMON /DENS/ R0, R1, R2 COMMON /DENS8/ ROB, ROS COMMON /EXPMAX/ TRESH, EPS, RRMAX, EPSDEF COMMON /G/ H0, H1 COMMON /GEN/ EIGREF, EIGMIN, EIGMAX, STIFF COMMON /TRIGON/ TWOPI, PI, OMEGA DATA SCFAC/1.0E-20/ C 100 FORMAT(1X,I4,2X,E12.5,2X,E12.5) C 200 FORMAT(1X,' N,ZSTART,ZEND,ZINT,ZMINH0 ',I4,1X,4(E10.4,1X)) C 201 FORMAT(1X,' N,ZSTART,ZEND,ZINT,ZCROSS ',I4,1X,4(E10.4,1X)) C 202 FORMAT(1X,' N,ZSTART,ZEND,ZINT,ZMINH1 ',I4,1X,4(E10.4,1X)) C C 'M' COUNTS SIGN CHANGES C C WATER LAYERS C ZMINH0= H0 ZMINH1= H1 ZCROSS= -1.0E38 ZSTART=0.0 EIGX=EIGVAL S0=1.D0 S1=(EIGX-ADA(1))*S0 M=0 DO 1000 N=2,MH0I-1 S2=(EIGX-ADA(N))*S1-S0 IF( ((S2 .GT.0.0) .AND. (S1 .LT. 0.0)) .OR. & ((S1 .GT.0.0) .AND. (S2 .LT. 0.0)) ) THEN M=M+1 ZEND= (N*DH0I + (S1*DH0I)/(S1-S2))*H0 ZINT=ZEND-ZSTART ZMINH0=MIN(ZMINH0,ZINT) ZSTART=ZEND END IF IF( ABS(S2) .GE. TRESH ) THEN S0=S1*SCFAC S1=S2*SCFAC ELSE S0=S1 S1=S2 END IF 1000 CONTINUE MODH0=M C C SEDIMENT LAYERS C IF(MSEDI.GT.0) THEN C C FICTITIOUS POINT FROM WATER TO SEDIMENT S2=(EIGX-ADA(MH0I))*S1 - S0 C DERIVATIVE AT S1 U1H0=(S2-S0)/(2.0*DH0I) U1SED=U1H0 C C INTERFACE POINT AS SEEN FROM THE SEDIMENT S1=S1/ROS EIGX=EIGVAL*CON3 C C C FIRST POINT IN SEDIMENT LAYER (AT DEPTH H0 + DSEDI*H0) S2=U1SED*DSEDI - 0.5*(SEDK-EIGX-2.0D0)*S1 C IF( ((S2 .GT.0.0) .AND. (S1 .LT. 0.0)) .OR. & ((S1 .GT.0.0) .AND. (S2 .LT. 0.0)) ) THEN M=M+1 ZEND= H0 + H0*(S1*DSEDI)/(S1-S2) ZINT=ZEND-ZSTART ZCROSS=ZINT ZSTART=ZEND END IF IF( ABS(S2) .GE. TRESH ) THEN S0=S1*SCFAC S1=S2*SCFAC ELSE S0=S1 S1=S2 END IF C DO 2000 N=MH0I+1,MH0I+MSEDI-1 S2=(EIGX-ADA(N))*S1-S0 IF( ((S2 .GT.0.0) .AND. (S1 .LT. 0.0)) .OR. & ((S1 .GT.0.0) .AND. (S2 .LT. 0.0)) ) THEN M=M+1 ZEND= H0 + ((N - MH0I)*DSEDI + (S1*DSEDI)/(S1-S2))*H0 ZINT=ZEND-ZSTART IF(ZCROSS .GT. 0.0) THEN ZMINH1=MIN(ZMINH1,ZINT) ELSE ZCROSS=ZINT END IF ZSTART=ZEND END IF IF( ABS(S2) .GE. TRESH ) THEN S0=S1*SCFAC S1=S2*SCFAC ELSE S0=S1 S1=S2 END IF 2000 CONTINUE C END IF C C BOTTOM C IF(EIGMIN.GT.EIGVAL) THEN S2=(EIGX-ADA(MH0I+MSEDI))*S1-2.D0*S0 ELSE S2=(EIGX-ADA(MH0I+MSEDI) + & 2.D0*SQRT(EIGVAL-EIGMIN)*CON5)*S1-2.D0*S0 ENDIF C FIRST VALUE IN BOTTOM LAYER (AT DEPTH H0 + H1 + DSEDI) IF( ((S2 .GT.0.0) .AND. (S1 .LT. 0.0)) .OR. & ((S1 .GT.0.0) .AND. (S2 .LT. 0.0)) ) THEN M=M+1 ZEND= H0 + ((MSEDI - 1)*DSEDI + (S1*DSEDI)/(S1-S2))*H0 ZINT=ZEND-ZSTART C ZMINH1=MIN(ZMINH1,ZINT) END IF ZCROSS=ABS(ZCROSS) RETURN END