C    EIGVEC.FOR                                                         
      SUBROUTINE EIGVEC( MEIG, MH0I, MSEDI, DH0I, DSEDI,                
     &  FRQ, ALFA,                                                      
     &  MINMOD, MODAVR,                                                 
     &  ADA, SPEED, EIGF,                                               
     &  A3, B3, C3, EE, ZZ, SSOLD, EXCH,                                
     &  EKM, EIGVAL, WNEXTP)
C__________________________________________________________             
C                                                         |             
C     This routine calculates the eigenvectors by         |             
C     means of inverse iteration. The eigenfunctions      |             
C     are normalized, and the attenuation coefficients    |             
C     are determined.                                     |             
C_________________________________________________________|             
C                                                                       
      INTEGER EXTPOL                                                    
      REAL ETIME, CPSEC(2)
      REAL CPUBEG, CPEIGV, CPEIGF, CPNEWP, CPFILE

      LOGICAL EXCH( * )                                                 
                                                                        
      REAL MODAVR( * )                                                  
      REAL K0, K1, K2, KH0                                              
                                                                        
      DOUBLE PRECISION CC0, CC1, H0, H1                                 
      DOUBLE PRECISION EKM, SQKM, EIGVAL, WNEXTP
      DOUBLE PRECISION ZZMAX, ZZINV, ABS1, ABS2                                
      DOUBLE PRECISION NORMT                                            
      DOUBLE PRECISION ATTW, ATTS, ATTB                                 
      DOUBLE PRECISION ADA( * )                                         
C                                                                       
C     LOCAL ARRAYS USED FOR INVERSE ITERATION                           
C                                                                       
      DOUBLE PRECISION Q, DD, DIFF                                      
      DOUBLE PRECISION A3( * ), B3( * ), C3( * ),                       
     &                 EE( * ), ZZ( * )                                 
      DOUBLE PRECISION SSOLD( * ), EIGF( * )                            
C                                                                       
      DOUBLE PRECISION SPEED( * )                                       
      DOUBLE PRECISION ROB, ROS                                         
      DOUBLE PRECISION KM, CIN, COST, DH0I, DSEDI                       
      DOUBLE PRECISION FRQ, TWOPI, PI, OMEGA                            
      DOUBLE PRECISION EIGREF, EIGMIN, EIGMAX, STIFF                    
      DOUBLE PRECISION CON1, CON2, CON3, CON4, CON5, SEDK               
                                                                        
      COMMON /ATTEN/ ALF0, ALF1, ALF2, ALF2S, ALFOS, ALFOB              
      COMMON /AB/ BETA(-1:3), SCATT(2), C2S, CC0, CC1, C2               
      COMMON /CONST/ CON1, CON2, CON3, CON4, CON5, SEDK                 
      COMMON /DENS/ R0, R1, R2                                          
      COMMON /DENS8/ ROB, ROS                                           
      COMMON /FLAGG/ PLANE, NOVOL, NOLOSS, NOCYL, LARGE, SUMPL
      COMMON /FLAGPL/ FIRST, FLAGP, FLAGPU, EXTPOL, CORREC
      COMMON /FRQDEP/ FRQREF, FPOW, FRQDEP
      COMMON /G/ H0, H1                                                 
      COMMON /GEN/ EIGREF, EIGMIN, EIGMAX, STIFF                        
      COMMON /LUIN/ LUIN, LUWRN, LUCHK
      COMMON /LUNIT/ LUPLP, LUPLT, LUPRT
      COMMON /NORM/ N12221, N14241                                      
      COMMON /TIMING/ CPEIGV, CPEIGF, CPNEWP, CPFILE                    
      COMMON /TRIGON/ TWOPI, PI, OMEGA                                  
      COMMON /XREFL/ CINTFC, RINTFC                                     
                                                                        
  200 FORMAT(1X,'MODE=',I4, 1X,D17.10,1X,E10.4,6(1X,E9.3),              
     & 2X,2(F5.2,1X),F5.2)                                              
  300 FORMAT(1X,' *** WARNING FOR MODE NO.',I4,' :',/,                  
     & '      INVERSE ITERATION RESTARTED WITH OFFSET EIGENVALUE.')     

                                                                        
      CPUBEG= ETIME(CPSEC)                                       
                                                                        
      EKM= SQRT(EIGVAL)/(DH0I*H0)                                       
      KM= SQRT(EIGVAL)/DH0I                                             
      SQKM= KM*KM                                                       
      NTOT= MH0I+MSEDI                                                  
      MN= MEIG+MINMOD-1                                                 
                                                                        
C     SET UP OF COEFFICIENT MATRIX                                      
                                                                        
C     WATER LAYERS                                                      
                                                                        
 1000 CONTINUE                                                          
                                                                        
      A3(1)= ADA(1)-EIGVAL                                              
      B3(1)= 1.0D0
      DO 1200   N= 2, MH0I-1                                            
      A3(N)= ADA(N)-EIGVAL                                              
      B3(N)= 1.0D0                                                      
      C3(N-1)= 1.0D0
 1200 CONTINUE                                                          
                                                                        
C     SEDIMENT LAYERS                                                   
                                                                        
      IF (MSEDI .GT. 0) THEN                                            
       A3(MH0I)= ADA(MH0I)-EIGVAL + (DH0I/(DSEDI*ROS))*                 
     &  ( (((EIGREF*DSEDI)/SPEED(MH0I+2))**2-2.0D0) - EIGVAL*CON3 )    
       B3(MH0I)= 2.0D0*(DH0I/DSEDI)                                     
       C3(MH0I-1)= 2.0D0
       A3(MH0I+1)= ADA(MH0I+1)-EIGVAL*CON3                              
       B3(MH0I+1)= 1.0D0
       C3(MH0I)= 1.0D0/ROS                                              
       DO 1400   N= MH0I+2, NTOT-1                                      
       A3(N)= ADA(N)-EIGVAL*CON3                                        
       B3(N)= 1.0D0
       C3(N-1)= 1.0D0
 1400  CONTINUE                                                         
      END IF                                                            
      IF (EIGMIN .GT. EIGVAL) THEN                                      
       A3(NTOT)= ADA(NTOT)-EIGVAL*CON3                                  
      ELSE                                                              
       A3(NTOT)= ADA(NTOT)-EIGVAL*CON3-2.0D0*SQRT(EIGVAL-EIGMIN)*CON5   
      END IF                                                            
                                                                        
      C3(NTOT-1)= 2.0D0
      B3(NTOT)= 0.0D0                                                   
      C3(NTOT)= 0.0D0                                                   
                                                                        
C     ELIMINATION IN COEFFICIENT MATRIX                                 
                                                                        
      DO 1600   I=1,NTOT-1
        I1=I+1
        IF (ABS(C3(I)).GT.ABS(A3(I))) THEN
          EXCH(I)=.TRUE.
          Q= C3(I)
          C3(I)= A3(I)
          A3(I)= Q
          Q= A3(I1)
          A3(I1)= B3(I)
          B3(I)= Q
          DD= B3(I1)
          A3(I)= 1.0D0/A3(I)
          Q= -C3(I) * A3(I)
          EE(I)= Q
          A3(I1)= A3(I1) + Q*B3(I)
          B3(I1)= Q*DD
          C3(I)= DD
        ELSE
          EXCH(I)= .FALSE.
          A3(I)= 1.0D0/A3(I)
          Q= -C3(I)*A3(I)
          EE(I)= Q
          A3(I1)= A3(I1)+Q*B3(I)
          C3(I)= 0.0D0
         END IF
 1600 CONTINUE
      IF(A3(NTOT) .EQ. 0.0D0)   THEN                                    
CWRN       WRITE(LUWRN,300) MEIG                                                
       EIGVAL= EIGVAL*(1.0D0+1.0D-12)                                   
       GO TO 1000                                                       
      END IF                                                            
      A3(NTOT)= 1.0D0/A3(NTOT)                                          
                                                                        
C     ELIMINATION OF RIGHT HAND SIDE                                    
                                                                        
      DO 2000   I= 1, NTOT                                              
      ZZ(I)= 1.0D0
      SSOLD(I)= 1.0D0
 2000 CONTINUE                                                          
      NIT= 0                                                            
 2200 IF (NIT .GT. 0) THEN                                              
       DO 2400   I= 1, NTOT-1                                           
       IF (EXCH(I)) THEN                                                
        Q= ZZ(I+1)                                                      
        ZZ(I+1)= ZZ(I)                                                  
        ZZ(I)= Q                                                        
       END IF                                                           
       ZZ(I+1)= ZZ(I+1)+EE(I)*ZZ(I)                                     
 2400  CONTINUE                                                         
      END IF                                                            
                                                                        
C     BACK SUBSTITUTION                                                 
                                                                        
      ZZMAX= 0.0D0                                                      
      EIGF(NTOT)= ZZ(NTOT)*A3(NTOT)                                     
      EIGF(NTOT-1)= (ZZ(NTOT-1)-B3(NTOT-1)*EIGF(NTOT))*A3(NTOT-1)       
      ABS1= ABS(EIGF(NTOT))                                             
      ABS2= ABS(EIGF(NTOT-1))                                           
      ZZMAX= MAX(ABS1,ABS2)                                             
C     ZZMAX= AMAX1(ABS(EIGF(NTOT)),ABS(EIGF(NTOT-1)))                   
      DO 3000   I= NTOT-2, 1, -1                                        
      EIGF(I)= (ZZ(I)-B3(I)*EIGF(I+1)-C3(I)*EIGF(I+2))*A3(I)            
      ABS2= ABS(EIGF(I))                                                
      ZZMAX= MAX(ZZMAX,ABS2)                                            
C     ZZMAX= AMAX1(ZZMAX,ABS(EIGF(I)))                                  
 3000 CONTINUE                                                          
                                                                        
C     SCALE AND CHECK ACCURACY                                          
                                                                        
C     ZZMAX= SIGN(ZZMAX,EIGF(NTOT))                                     
      NIT= NIT+1                                                        
      Q= 0.0D0                                                          
      ZZINV= 1.0D0/ZZMAX
      DO 4000   I= 1, NTOT                                              
      EIGF(I)= EIGF(I)*ZZINV
      DIFF= ABS(ABS(EIGF(I))-ABS(SSOLD(I)))                             
      Q= MAX(Q,DIFF)                                                    
 4000 CONTINUE                                                          
      IF (Q .LT. 1.0D-10) GO TO 4400                                    
      IF (NIT .GT. 10) THEN                                             
CWRN       WRITE(LUWRN,*)
CWRN     &   '*** MAX NUMBER OF ITERATIONS REACHED IN EIGVEC ***' 
       WRITE(LUPRT,*) '*** MAX DIFFERENCE IN MODE AMPL: ',Q                              
       GO TO 4400                                                       
      END IF                                                            
      DO 4200   I= 1, NTOT                                              
      ZZ(I)= EIGF(I)                                                    
      SSOLD(I)= EIGF(I)                                                 
 4200 CONTINUE                                                          
      GO TO 2200                                                        
 4400 CONTINUE                                                          
                                                                        
                                                                        
C     NORMALIZATION                                                     
                                                                        
      IF( N12221 .EQ. 1)   THEN                                         
        CALL NRM122(MEIG,NTOT,MH0I,MSEDI,SPEED,DH0I,DSEDI,            
     &  MINMOD,EIGF,MODAVR,EKM,EIGVAL,                              
     &  ATTW, ATTS, ATTB, NORMT)                                        
      ELSE                                                              
        CALL NRM142(MEIG,NTOT,MH0I,MSEDI,SPEED,DH0I,DSEDI,            
     &  MINMOD,EIGF,MODAVR,EKM,EIGVAL,                              
     &  ATTW, ATTS, ATTB, NORMT)                                        
      END IF                                                            
                                                                        
                                                                        
C     MODE ATTENUATION                                                  
                                                                        
      ATTW= ATTW/NORMT*EIGREF/KM                                        
      ATTS= ATTS/NORMT*EIGREF/KM                                        
      ATTB= ATTB/NORMT*EIGREF/KM                                        
                                                                        
      IF(NOVOL .EQ. 0)   THEN                                           
       ALF0= BETA(0) * FRQ * ATTW / (CC0 * 8.68589)                     
      ELSE                                                              
       ALF0= 0.0                                                        
      END IF                                                            
      IF(MSEDI .GT. 0)   THEN                                           
       ALF1= FRQDEP *  BETA(1) * FRQ * ATTS / (CC1 * 8.68589)
      ELSE                                                              
       ALF1= 0.0                                                        
      END IF                                                            
      ALF2= FRQDEP * BETA(2) * FRQ * ATTB / (C2 * 8.68589)

C     BOTTOM LOSSES                                                     
                                                                        
      IF(C2S .GT. 0.) THEN                                              
                                                                        
C     REFLECTION COEFFICIENT                                            
                                                                        
       IF (MSEDI .GT. 0) THEN                                           
        CIN= SPEED(NTOT+2)                                              
       ELSE                                                             
        CIN= SPEED(MH0I+1)                                              
       END IF                                                           
       COST= KM/EIGREF*CIN                                              
       CALL REFL2(CINTFC,RINTFC,R2,COST,Q)                              
                                                                        
C     THE FOLLOWING IS TAKEN FROM SNAP, BUT I DOUBT                     
C     IT'S CORRECTNESS FOR (K/CINTFC)<KM, I.E. THE                      
C     CASE WHERE THE MODE IS EVANESCENT AT THE                          
C     SUBBOTTOM INTERFACE                                               
C     H. SCHMIDT, 841002                                                
                                                                        
       K1= ABS((EIGREF/CIN)**2-SQKM)                                    
       SQRK1= SQRT(K1)                                                  
       K2= SQKM-((OMEGA*H0)/DBLE(C2))**2                                
       ALF2S= RINTFC*EIGF(NTOT)**2*SQRK1/(8.0*KM)                       
       ALF2S= ALF2S*(1.0+(RINTFC/R2)**2*K2/K1)*Q                        
       ALFA= ALF0+ALF1+ALF2S                                            
      ELSE                                                              
       ALF2S= 0.0                                                       
       ALFA= ALF0+ALF1+ALF2                                             
      END IF                                                            
                                                                        
C     SCATTER LOSSES                                                    
                                                                        
      DER0= EIGF(1)/(H0*DH0I)                                           
      IF (MSEDI .GT. 0) THEN                                            
       DER1= (CON1*EIGF(MH0I)-(CON1+CON4)*EIGF(MH0I-1)+                 
     & CON4*ROS*EIGF(MH0I+1))/(2.0D0*DH0I*H0)                             
      ELSE                                                              
       K1= SQKM-((OMEGA*H0)/DBLE(C2))**2                                
       SQK1= SQRT(K1)                                                   
       DER1= -EIGF(MH0I)*SQK1/(ROB*H0)                                  
      END IF                                                            
                                                                        
      DER1= SIGN(  MAX(ABS(DER1), 1.0E-19), DER1 )
                                                                        
      RATS= (EIGREF/SPEED(1))**2                                        
      RATB= (EIGREF/SPEED(MH0I+1))**2                                   
      IF (SQKM .LT. RATS) THEN                                          
       K0= SQRT(RATS-SQKM)                                              
      ELSE                                                              
       K0= 0.0                                                          
      END IF                                                            
      IF (SQKM .LT. RATB) THEN                                          
       KH0= SQRT(RATB-SQKM)                                             
      ELSE                                                              
       KH0= 0.0                                                         
      END IF                                                            
      ALFOS= SCATT(1)**2*K0*DER0**2/(2.0*KM)                             
      ALFOB= SCATT(2)**2*KH0/(2.0*KM)*(DER1**2+(EIGF(MH0I)*KH0/H0)**2)   
      ALFA= ALFA+ALFOB+ALFOS                                            
C                                                                       
      CHECKS= 2.0*((RATS-SQKM)/(H0*H0))*SCATT(1)**2                     
      CHECKB= 2.0*((RATB-SQKM)/(H0*H0))*SCATT(2)**2                     
C                                                                       
      IF(FLAGPU .LT. 1.0)   WRITE(LUPRT,200) MN,WNEXTP,ALFA,
     & ALF0,ALF1,ALF2,ALF2S,ALFOS,ALFOB,Q,CHECKS,CHECKB                      
                                                                        
                                                                        
      DO 5000   IZ=  MH0I + 1, NTOT                                     
      EIGF(IZ)=  EIGF(IZ )  * R1                                        
 5000 CONTINUE                                                          
                              
      CPEIGF= CPEIGF + (ETIME(CPSEC) - CPUBEG)                                
                                                                        
      RETURN                                                            
      END