C  PORTER.FOR
      SUBROUTINE PORTER( FRQ, EK, ADA,
     & SPEED, ISO, MY, C0, Z0, C1, Z1, ZZ, *)
C__________________________________________________________
C                                                          |
C     This routine is acting as main for                   |
C     the routines: ISOINT, STURM, BRENT, NEWTON, CHARAC,  |
C     RICH, SPEED and EIGVEC                               |
C     The subject is to find an approximate solution for   |
C     the eigenvalues of a continuous diff. equation by    |
C     finite difference and extrapolation                  |
C     and to calculate the eigenfunctions and losses.      |
C__________________________________________________________|
C

      INCLUDE 'param.inc'


      INTEGER  EXTPOL, MREF(15)
      INTEGER FIXDZ, OPTMZ



      DOUBLE PRECISION CREF, CC0, CC1, CMIN, H0, H1, ROB, ROS
      DOUBLE PRECISION H1N
      DOUBLE PRECISION ZZ( * )
      DOUBLE PRECISION MY(MAXMSH, MODEN ), ISO( * ), ADA( * )
      DOUBLE PRECISION DH0(8), DSED(8), DH0SQ(8)
      DOUBLE PRECISION SPEED( * )
      DOUBLE PRECISION FRQ, TWOPI, PI, OMEGA, DRAT
      DOUBLE PRECISION EIGREF, EIGMIN, EIGMAX, STIFF
      DOUBLE PRECISION EK(MODEN)
      DOUBLE PRECISION CON1, CON2, CON3, CON4, CON5, SEDK
      DOUBLE PRECISION C0( * ), Z0( * ), C1( * ), Z1( * )


      COMMON /AB/ BETA(-1:3), SCATT(2), C2S, CC0, CC1, C2
      COMMON /APM/ NSMPL, NSMDEF
      COMMON /ATTEN/ ALF0, ALF1, ALF2, ALF2S, ALFOS, ALFOB
      COMMON /CONST/ CON1, CON2, CON3, CON4, CON5, SEDK
      COMMON /DENS/ R0, R1, R2
      COMMON /DENS8/ ROB, ROS
      COMMON /EXPMAX/ TRESH, EPS, RRMAX, EPSDEF
      COMMON /FACTS/ FACT0, FACT1, FLAGF0, FLAGF1
      COMMON /FLAGPL/ FIRST, FLAGP, FLAGPU, EXTPOL, CORREC
      COMMON /FRQDEP/ FRQREF, FPOW, FRQDEP
      COMMON /G/ H0, H1
      COMMON /GEN/ EIGREF, EIGMIN, EIGMAX, STIFF
      COMMON /ITMAX/ MAXIT
      COMMON /LUIN/ LUIN, LUWRN, LUCHK
      COMMON /LUNIT/ LUPLP, LUPLT, LUPRT
      COMMON /MESH/ DZH0, DZH1, INPDZ, FIXDZ
      COMMON /MSHIST/ MH0(8), MSED(8), ICOUNT, USEOLD
      COMMON /N/ MINMOD, MAXMOD, MODCUT, HBEAM, BPHVEL
      COMMON /NA/ ND0, ND1, CMIN
      COMMON /PARAM3/ IMESH, NMESH, MSHRAT, OPTMZ
      COMMON /PARAM4/ MESHI, MESHN
      COMMON /REFSPD/ CREF
      COMMON /TRIGON/ TWOPI, PI, OMEGA
      COMMON /XREFL/ CINTFC, RINTFC


      INCLUDE 'acommon.inc'


      DATA MREF/16,20,25,32,40,50,64,80,100,128,160,200,256,320,400/
C      DATA MREF/32,40,50,64,80,100,128,160,200,256,320,400/
C      DATA MREF/50,64,80,100,128,160,200,256,320,400,512,640/

  300 FORMAT(1X,/)
  360 FORMAT(1X,//,' ***  WARNING : DUE TO ARRAY SIZE LIMITATIONS,',/,
     & 4X,'  THE NUMBER OF DIFFERENT MESHES IS REDUCED TO    ',I5,/,
     & 4X,'  THE MODE AMPLITUDES ARE MADE AVAILABLE ON MESH #',I5,/,
     & 4X,'  WITH ',I5,' MESH POINTS IN WATER AND ',I5,
     &    ' IN SEDIMENT',/)
  370 FORMAT(1X,//,' ***  WARNING : DUE TO ARRAY SIZE LIMITATIONS,',/,
     & ' THE NUMBER OF MESHES IS REDUCED TO 1 AND THE NUMBER',/,
     & ' OF MESH POINTS TO',I6,' (WATER) AND',I6,' (SEDIMENT)')
  420 FORMAT(1X,' FINDING APPROXIMATION (BRENT ) FOR MESH ',I2,1X,
     & '( ',I5,', ',I5,' )',1X, I4,' mode(s)' )
  440 FORMAT(1X,/,1H0,'CALCULATION MESHES',
     &      /1H ,'STEP   WATER   SEDIMENT',
     &     (/1H ,I3,I9,I9))
  460 FORMAT(1X,//,' EXTRAPOLATED WAVENUMBER(S) : ',/,
     & '    MODE         WAVENUMBER    ')
  480 FORMAT(1X,I6,6X,D17.10)



      FLAGNP= 0
      CREF= CC0
      EIGREF= OMEGA*H0/CREF
      MAXIT= 10

C
      MESHN= NMESH
      MESHI= IMESH
      H1N=H1/H0
      IF(H1N.LT.1.0D-6)    THEN
        ROS= 1.0D0
        STIFF= 1.0D0
      ELSE
        ROS= DBLE(R1)/DBLE(R0)
        STIFF= (C0(ND0)/C1(1))**2/ROS                                    
      END IF                                                            
      ROB= DBLE(R2)/DBLE(R0)
      DRAT= H0/(H0+H1)
C
C     INITIALIZE REFLECTION COEFFICIENT CALCULATION
C
      IF (H1N.GT.0.0) THEN
        CINTFC=C1(ND1)
        RINTFC=R1
      ELSE
        CINTFC=C0(ND0)
        RINTFC=R0
      END IF
      IF (C2S.GT.0.0) THEN
        CALL REFL1(C2,C2S,FRQDEP*BETA(2),BETA(3))
      END IF


C     DEFINITION OF MESHES


      IREF= 1
      CALL MESHES( MREF, IREF, FRQ,
     &             NPH0, MRH0,
     &             NPSED, MRSED )

      IF(H1 .LE. 0.0)   MRSED= 0
                                                                        
      ISHIFT=0                                                          
      IF( (USEOLD .GT. 0.0) .AND. (ICOUNT .GT. 2) )   THEN             
        ICOUNT= ICOUNT-2                                                
        ISHIFT= ICOUNT                                                  
      ELSE                                                              
        ISHIFT=0                                                        
        ICOUNT=0                                                        
      END IF                                                            
                                                                        
C     IF((MSHRAT .EQ. 2) .OR. (MESHI .EQ. 1))   THEN                    
      IF( MSHRAT .EQ. 2 )   THEN                                        
        MH0(1)= NPH0                                                    
        DO 1200 I=2, MESHN                                                
C        MH0(I)= 2 * MH0(I-1)                                           
        MH0(I)= I * NPH0                                                
 1200   CONTINUE                                                        
        MSED(1)= NPSED                                                  
        DO 1220 I=2, MESHN                                                
C        MSED(I)= 2 * MSED(I-1)                                         
        MSED(I)= I * NPSED                                              
 1220   CONTINUE                                                        
                                                                        
      ELSE                                                              
                                                                        
        DO 1300 I=1, MESHN                                                
        MH0(I)= MREF(I+ISHIFT)*MRH0                                     
 1300   CONTINUE                                                        
        DO 1320 I=1, MESHN                                                
        MSED(I)= MREF(I+ ISHIFT)*MRSED                                  
 1320   CONTINUE                                                        
      END IF                                                            
                                                                        
                                                                        
      IF(FLAGF0 .GT. 0)    THEN                                         
        EPS=1.0                                                         
        WRITE(LUPRT,*) ' GIVE NUMBER OF MESHES : '                      
        READ(5,*) MESHN                                                  
        DO 1340    I= 1, MESHN                                           
        WRITE(LUPRT,*) ' GIVE POINTS (WATER,SEDIMENT) IN MESH  ',I      
        READ(5,*) MH0(I), MSED(I)                                       
 1340   CONTINUE                                                        
        MAXIT= MESHN                                                      
      END IF                                                            
      IF(USEOLD .EQ. 0.0)   ICOUNT=0                                   
                                                                        
      GO TO 1600                                                        
                                                                        
 1500 CONTINUE                                                          
      WRITE(LUPRT,*) ' RESTARTING COMPUTATION FROM MESH ',I                 
      ICOUNT=ICOUNT+I-1                                                 
      DO 1520   I=1, MESHN-1                                              
      MH0(I)=MH0(I+1)                                                   
      MSED(I)=MSED(I+1)                                                 
 1520 CONTINUE                                                          
C     IF((MSHRAT .EQ. 2) .OR. (MESHI .EQ. 1))   THEN                    
      IF( MSHRAT .EQ. 2 )   THEN                                        
C        MH0(MESHN)=MH0(MESHN-1)*2                                        
C        MSED(MESHN)=MSED(MESHN-1)*2                                      
        MH0(MESHN)= MESHN * NPH0                                          
        MSED(MESHN)= MESHN * NPSED                                        
      ELSE                                                              
        MH0(MESHN)=MH0(MESHN-3)*2                                         
        MSED(MESHN)=MSED(MESHN-3)*2                                       
      END IF                                                            
 1600 CONTINUE                                                          
      NPMAX=MH0(MESHN)+MSED(MESHN)                                        
      IF(NPMAX .GT. NPOINT-2)   THEN
        FLAGNP=1  
        MESHN=MESHN-1                                                     
        MESHI=MIN(MESHI,MESHN)
        MESHI= MAX(1,MESHI)
        IF(MESHN .GE. 1)  GO TO 1600
        MESHN=1                                                          
C        PRINT *,' NPOINT, MH0(1), MSED(1) ',
C     &  NPOINT-2, MH0(1), MSED(1)
C        PRINT *,' H0, H1 : ',H0, H1
        TEMP= 0.5 * ( NPOINT - 2) / ( MH0(1) + MSED(1) )
        MH0(1)= MH0(1) * TEMP
        MSED(1)= MSED(1) * TEMP
        MH0(1)=MH0(1)*2                                                 
        MSED(1)=MSED(1)*2                                               
        EXTPOL=0                                                        
        WRITE(LUPRT,370) MH0(1), MSED(1)                                    
      END IF                                                            
      IF(FLAGNP .GT. 0)   THEN
        WRITE(LUPRT,360) MESHN,  MESHI, MH0(MESHI), MSED(MESHI)
        PRINT 360, MESHN, MESHI, MH0(MESHI), MSED(MESHI)
      END IF
      IF(MESHN .GE. 2)   THEN                                            
        USEOLD=1.0                                                     
      ELSE                                                              
        USEOLD=0.                                                      
      END IF                                                            
C                                                                       
                                                                        
      IF(FLAGPU .LT. 1.)   THEN                                         
        WRITE(LUPRT,440) (JJ+ICOUNT,MH0(JJ),MSED(JJ),JJ=1,MESHN)         
        WRITE(LUPRT,300)                                                
      END IF                                                            
C                                                                       
                                                                        
      DO 1640 I= 1, MESHN
      DH0(I)= 1.0D0/MH0(I)
      DH0SQ(I)= 1.0D0/(DBLE(MH0(I))**2)
      IF(H1N.NE.0.0)   THEN
        DSED(I)= H1N/MSED(I)
      END IF
 1640 CONTINUE
                                                                        
      I=1                                                               
 1800 CONTINUE                                                          
                                                                        
C      IF(H1.GT.0.)   SEDK=((OMEGA*H1)/(C1(1)*MSED(I)))**2              
CCHK      IF(FIRST.NE.0.)  WRITE(LUCHK,420) I+ICOUNT,MH0(I),MSED(I),MODQTY     
      IF(FLAGPU.LT.1.0 .AND. FIRST.NE.0.0)                                
     & WRITE(LUPRT,420) I+ICOUNT,MH0(I),MSED(I),MODQTY                  
                                                                        
C*********************************************************              
                                                                        
      CALL COMPUT( *1500, *1800, *7000, *9999,                                
     & I, H1N, DRAT, DH0, DSED, DH0SQ,
     & FRQ, MODQTY,
     & ADA, SPEED, ISO, MY, C0, Z0, C1, Z1,                   
     & ZZ, EK )
                                                                        
C*************************************************                      
                                                                        
      MQTOLD= AMQTY(ARIGHT)                                             
      IF( MQTOLD .NE. MODQTY)   THEN                                    
        WRITE(LUPRT,*) ' *** WARNING : '                                
        WRITE(LUPRT,*) ' *** MODE QUANTITY ON OUTPUT MESH : ',MQTOLD    
        WRITE(LUPRT,*) ' *** MODE QUANTITY ON LAST   MESH : ',MODQTY    
C        WRITE( MODFIL, REC= 5) MODQTY, LRECL                           
      END IF                                                            
                                                                        
C *********************************************************             
      AMQTY(ARIGHT)= MODQTY

      AC0(ARIGHT)= C0(ND0)
      IF( ND1 .GT. 0 )   THEN
        AC1(ARIGHT)= C1(1)
      ELSE
        AC1(ARIGHT)= C2
      END IF
                                                                        
 7000 CONTINUE                                                          
                                                                        
      RETURN                                                            
 9999 RETURN 1

      END