C   MAIN.FOR

C   DRIVER  *(SUPERSNAP)***********************************************
C


      INCLUDE 'param.inc'
      INCLUDE 'acommon.inc'

      external blkdat

      INTEGER COHRNT, INCRNT
      INTEGER EXTPOL, FIXDZ, OPTMZ
     
      LOGICAL CLTIME, MODPLT

      CHARACTER*2 TNORM, TVERT, THORI, SEGNO
      CHARACTER*3 COHINC
      CHARACTER*3 ALPHA2(6)
      CHARACTER*4 OPT
      CHARACTER*8 MODEL
      CHARACTER*80 TITLE
      integer iparm(3)

      DOUBLE PRECISION H0, H1, CMIN, CC0, CC1, CREF
      DOUBLE PRECISION ROB, ROS
      DOUBLE PRECISION FRQ, TWOPI, PI, OMEGA
      DOUBLE PRECISION F2
      DOUBLE PRECISION H0L, H0R, H1L, H1R
      DOUBLE PRECISION Z0L(402), C0L(402), Z1L(402), C1L(402)
      DOUBLE PRECISION Z0R(402), C0R(402), Z1R(402), C1R(402)
      DOUBLE PRECISION Z0LR(402), CE0L(402), CE0R(402)
      DOUBLE PRECISION Z1LR(201), CE1L(201), CE1R(201)

      REAL ETIME, CPSEC(2)
      REAL CPEIGV, CPEIGF, CPNEWP, CPFILE
      REAL CPU000, CPUBEG, CPUEND, CPUINI, CPUFRQ, CPOUTP
      REAL MAXRNG

      COMMON /AB/ BETA(-1:3), SCATT(2), C2S, CC0, CC1, C2
      COMMON /ACOEFF/ COLEFT, NSTART
      COMMON /APM/ NSMPL, NSMDEF
      COMMON /CF/ ENRCHK, ERRMAX, MAXRNG
      COMMON /CONTUR/ CNTR1(4,4)
      COMMON /DENS/ R0, R1, R2
      COMMON /DENS8/ ROB, ROS
      COMMON /ENRGY/ MATCH
      COMMON /EXPMAX/ TRESH, EPS, RNGMAX, EPSDEF
      COMMON /FACTS/ FACT0, FACT1, FLAGF0, FLAGF1
      COMMON /FLAGG/ PLANE, NOVOL, NOLOSS, NOCYL, LARGE, SUMPL
      COMMON /FLAGPL/ FIRST, FLAGP, FLAGPU, EXTPOL, CORREC
      COMMON /FLAGS/ EK0, SQEK0
      COMMON /FRQDEP/ FRQREF, FPOW, FRQDEP
      COMMON /G/ H0, H1
      COMMON /CGAUSS/ GAUSS, TH1, TILT
      COMMON /LEFT/ RKML, BETAL(3), SCATTL(2), R1L, R2L,
     &              C2L, C2SL, H0L, H1L, ND0L, ND1L
      COMMON /LOGIC/ CLTIME
      COMMON /LUCONT/ LUCDR, LUBDR, LUCFR, LUBFR
      COMMON /LUIN/ LUIN, LUWRN, LUCHK
      COMMON /LUNIT/ LUPLP, LUPLT, LUPRT
      COMMON /LUPUL/ LUTRF
      COMMON /MESH/ DZH0, DZH1, INPDZ, FIXDZ
      COMMON /MODEAD/ COHRNT, INCRNT
      COMMON /MODEL/ MODEL
      COMMON /MSHIST/ MH0(8), MSED(8), ICOUNT, USEOLD
      COMMON /N/ MINMOD, MAXMOD, MODCUT, HBEAM, BPHVEL
      COMMON /NA/ ND0, ND1, CMIN
      COMMON /NN/ H0BEG, H1BEG, NFREQ
      COMMON /NORM/ N12221, N14241
      COMMON /PARA1/ NFFZ,MSP,NDEPZ,NOPTZ,ICFZ,KSRDZ
      COMMON /PARA3/ NR1Z,ISDZ,ISD2Z,NRPZ,MODNPZ
C      COMMON /PARA4/ NMAM2, NPAM2
      COMMON /PARAM1/ IRANGE, IFREQ, JUMP, MODQTY
      COMMON /PARAM2/ FRQ, EPSINP
      COMMON /PARAM3/ IMESH, NMESH, MSHRAT, OPTMZ
      COMMON /PULSED/ NFFT,FMIN,FMAX,TSTEP
      COMMON /MODSMP/ MSPH0, MODSED, MSPH1
      COMMON /REC1/ TITLE
      COMMON /REFSPD/ CREF
      COMMON /RIGHT/ RKMR, BETAR(3), SCATTR(2), R1R, R2R,
     &               C2R, C2SR, H0R, H1R, ND0R, ND1R
      COMMON /RNGPRF/ NSECT, RKM
      COMMON /TIMING/ CPEIGV, CPEIGF, CPNEWP, CPFILE
      COMMON /TLUNIT/ LUTLC, LUTLI
      COMMON /TRIGON/ TWOPI, PI, OMEGA
C
      INCLUDE 'common.inc'
C
      DATA MODPLT /.FALSE./
      DATA ((SECD(I,J),I= 1, NOPT),J=1,3)/NOPT3*0.0/
      DATA STORE/NOPT*0.0/
      DATA (((SRD(I,J,K),I= 1,NOPT),J =1,KSRD),K= 1,2)/NK2*0./
      DATA (FLAG(I,1),I= 1, NOPT)/NOPT*0.0/
      DATA ALPHA1/'TLRAN','GROUP','TLAVR','TLDEP','TLAVF',
     &            'ANGLE','PHASE','CONDR','CONFR','PROFL',
     &            'MODES','CONDA','HORWN','PARAM','FIELD',
     &            'PULSE','CONSV','FREE2'/
      DATA ALPHA2/'   ','PRT','PLT','COL','COH','INC'/
      DATA REORD1/6,12,8,9,17,15,2,13,11,14,7,16,10,5,3,4,1,18/
      DATA REORD2/11,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18/
      DATA (AX(I,5),I= 1, NOPT)/NOPT*0.0/
      DATA (AX(I,6),I= 1, NOPT)/NOPT*1.0/
      DATA (AY(I,5),I= 1, NOPT)/NOPT*0.0/
      DATA (AY(I,6),I= 1, NOPT)/NOPT*0.0/
      DATA (AY(I,7),I= 1, NOPT)/NOPT*0.0/
C TLRAN; ISUB=1
      DATA (FLAG(1,I),I= 2, 6)/5*0.0/
      DATA AX(1,1),AX(1,2),AX(1,3),AX(1,4)/2*-1.,16.,0./
      DATA AY(1,1),AY(1,2),AY(1,3),AY(1,4)/40.,140.,12.,20./
C TLDEP; ISUB=4
      DATA (FLAG(4,I),I= 2, 6)/5*0.0/
      DATA AX(4,1),AX(4,2),AX(4,3),AX(4,4)/0.,160.,16.,20./
      DATA AY(4,1),AY(4,2),AY(4,3),AY(4,4)/0.,-1.,12.,0./
C CONDR; ISUB=8
      DATA (FLAG(8,I),I= 2, 6)/0.,1.,3*0./
      DATA AX(8,1),AX(8,2),AX(8,3),AX(8,4)/2*-1.,16.,0./
      DATA AY(8,1),AY(8,2),AY(8,3),AY(8,4)/0.,-1.,12.,0./
C CONFR; ISUB=9
      DATA (FLAG(9,I),I= 2, 6)/0.,1.,3*0./
      DATA AX(9,1),AX(9,2),AX(9,3),AX(9,4)/2*-1.,16.,0./
      DATA AY(9,1),AY(9,2),AY(9,3),AY(9,4)/0.,-1.,12.,1./
      DATA MINF9 / 0 /
C PROFL; ISUB=10
      DATA (FLAG(10,I),I= 2, 6)/0.,0.,0.,1.,0./
      DATA AS(1),AS(2),AS(3),AS(4)/1450., 1650., 3.0, 25./
      DATA AX(10,1),AX(10,2),AX(10,3),AX(10,4)/-1.,-1.,16.,0./
      DATA AY(10,1),AY(10,2),AY(10,3),AY(10,4)/ 0.,-1.,12.,0./
C MODES; ISUB=11
      DATA (FLAG(11,I),I= 2, 6)/5*0./
      DATA AX(11,1),AX(11,2),AX(11,3),AX(11,4)/-0.2,0.2,20.,.2/
      DATA AY(11,1),AY(11,2),AY(11,3),AY(11,4)/0.,0.,12.,0./
C CONDA; ISUB=12
      DATA (FLAG(12,I),I= 2, 6)/0.,1.,3*0./
      DATA AX(12,1),AX(12,2),AX(12,3),AX(12,4)/2*-1.,16.,0./
      DATA AY(12,1),AY(12,2),AY(12,3),AY(12,4)/0.,-1.,10.,0./
      DATA MINF12 / 0 /
C PULSE; ISUB=16
      DATA FLAG(16,2), FLAG(16,5) / 1.0, 1.0 /
C CONSV; ISUB=17
      DATA (FLAG(17,I),I= 2, 6)/0.,1.,3*0./
      DATA AX(17,1),AX(17,2),AX(17,3),AX(17,4)/2*-1.,16.,0./
      DATA AY(17,1),AY(17,2),AY(17,3),AY(17,4)/0.,-1.,12.,0./

      DATA MAXPOW / 13 /
      DATA TNORM, TVERT, THORI/' 1',' 0',' 0'/
      DATA SEGNO /' -'/

  121 FORMAT(1H1,//,'***************************************************
     &*********',//,1X,A80,//,'*****************************************
     &*******************',//)
  220 FORMAT(1H ,///,' OUTPUT OPTIONS: ',//,12X,'PRT',5X,'PLT',5X,'COH',
     & 5X,'INC',5X,'COL')
  240 FORMAT(1H ,A5,1X,4F8.0)
  241 FORMAT(1H ,A5,1X,2F8.0)
  242 FORMAT(1H ,A5)
  243 FORMAT(1H ,A5,1X,16X,2F8.0)
  244 FORMAT(1H ,A5,1X,5F8.0)
  250 FORMAT(1X,/,'  COMPUTING OPTION PULSE' )
  260 FORMAT(1X,/,'  Frequency (Hz)  (min, max)      :',F10.3,2X,F10.3,
     & /,'  Source depth (m)                :', F10.3,
     & /,'  Range (km)      (min, max, inc) :',F10.3,2(2x,f10.3),
     & /,'  Rec depth (m)   (min, max, inc) :',F10.3,2(2X,F10.3),/)

  320 FORMAT(1H ,' FREQ. NO. (',I4,',',I4,') :  ',F9.3,' Hz ',F9.3 )

  321 FORMAT(1H ,' FREQ. NO. (',I4,',',I4,') :  ',F9.3,' Hz ',
     & 3X,F9.3,' s' )
  322 FORMAT(1H ,' FREQ. NO. (',I4,',',I4,') :  ',F9.3,' Hz ',
     & 3X,'  MODE CUTOFF FOR THIS FREQUENCY ' )
  324 FORMAT(1H ,//,' * SUMMARY OF CPU TIME at frequency ',
     & F10.3,' Hz  :')
  326 FORMAT(1X ,    '   eigenvalues       : ',
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  328 FORMAT(1X ,    '   eigenvectors      : ',
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  330 FORMAT(1X ,    '   field computation : ', 
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  332 FORMAT(1X ,    '   print/plot output : ',
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  333 FORMAT(1X ,    '   total CPU time    : ',
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  334 FORMAT(1X ,/,' * CPU TIME FOR INITIALIZATION :',F7.3,'s  ')
  336 FORMAT(1X ,    '   CPU time at ',F10.3,' Hz : ',
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  338 FORMAT(1H ,/,' * CPU TIME for computing the EIGENFUNCTIONS :',
     & F9.3,'s',/,
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  342 FORMAT(1H ,  '* TOTAL CPU TIME :',F9.3,'s',/,
     & 3X,'( ',I3,'h  ',I2,'m  ',F7.3,'s  )')
  420 FORMAT(1X,' THE SIMPSON TRAPEZOIDAL RULE (122...221) IS ',
     & 'USED FOR MODE NORMALIZATION',/)
  440 FORMAT(1X,/,'  THE SIMPSON COMPOSITE FORMULA (142...4241) IS ',
     & 'USED FOR MODE NORMALIZATION ',/)
  460 FORMAT(1X,/,'  SELECTED ACCURACY ON EXTRAPOLATED ',
     & 'WN IS :',1PE9.1,/)
  470 FORMAT(1X,' RATIO AMONG ADJACENT',
     & ' MESHES (DEFAULT) = 1/3 ',/)
  480 FORMAT(1X,' RATIO AMONG ADJACENT MESHES : 2 ')
  482 FORMAT(1H ,/,'  THE VERTICAL GRID SIZE FOR MODE CALCULATION',
     & ' MAY VARY OVER RANGE. ',/,
     & '  THE GRID IS BASED ON (',I2,' SAMPLE POINTS ) / MODE',//)
  484 FORMAT(1H ,/,' THE VERTICAL GRID SIZE FOR MODE CALCULATION',
     & ' IS KEPT CONSTANT OVER RANGE ',/,
     & ' THE INITIAL GRID IS BASED ON (',I2,' SAMPLE POINTS/MODE',//)
  486 FORMAT(1X,' WARNING :  USING SUBOPTION "INPDZ" DZ IMPLIES ',
     & 'DOUBLING OF MESH DENSITY.')
  488 FORMAT(1X,//,' *************** ',/,' WARNING :  COMPUTING THE',
     & ' OUTGOING FIELD WITH REDUCED PRESSURE CORRECTION ',/,
     & ' *************** ',/)
  490 FORMAT(1X,//,' *************** ',/,' WARNING :  COMPUTING THE',
     & ' OUTGOING FIELD WITH IMPEDANCE MATCHING CORRECTION ',/,
     & ' *************** ',/)
  492 FORMAT(1X,//,' *************** ',/,' WARNING :  COMPUTING THE',
     & ' OUTGOING FIELD WITH PRESSURE MATCHING CONDITION',/,
     & ' *************** ',/)
  500 FORMAT(1H1 ,/,'  FREQUENCY ',F11.2,' HZ',/,
     & '  ****************',///)   
  510 FORMAT(1X, ' REGION ',I3,2X,' FINAL POWER OF 2 USED FOR RANGE',
     & ' SUBDIVISIONS :' ,I2)
  540 FORMAT(1X,//,' WARNING:  THE REQUIRED HALF_BEAMWIDTH IS TOO',
     & ' LARGE.',/,
     & ' REQUIRED HALF_BEAMWIDTH           :',F10.2,' deg',/,
     & ' CRITICAL ANGLE AT THE SOURCE DEPTH:',F10.2,' deg')
  560 FORMAT(1X,/,' COMPUTATION WILL CONTINUE WITH THE MAX POSSIBLE',
     & ' HALF_BEAMWIDTH:', F8.2,' deg',//)
  680 FORMAT(1X,'  MINIMUM DEPTH             :', F8.2,'  m',/,
     &         '   MAXIMUM DEPTH             :', F8.2,'  m',/,
     &         '   STEP INCREMENT IN DEPTH   :', F8.2,'  m',//)
  690 FORMAT(1X,'  NUMBER OF RANGE STEPS     :', I8 )
  700 FORMAT(1X,'  MINIMUM RANGE             :', F9.3,' km',/,
     &         '   MAXIMUM RANGE             :', F9.3,' km',/,
     &         '   STEP INCREMENT IN RANGE   :', F9.3,' km',/)

  710 FORMAT(1X,//,'   NUMBER OF INPUT REGIONS              :',I5)
  730 FORMAT(1X,//,'   OPTION TLRAN,',A3,/,
     &             '   SOURCE DEPTH              :',F8.2,'  m')
  739 FORMAT(1X,//,'   OPTION CONFR,',A3,/,
     &             '   SOURCE DEPTH              :',F8.2,'  m')
  740 FORMAT(1X,//,'   OPTION TLDEP,',A3,/,
     &             '   SOURCE DEPTH              :',F8.2,'  m')
  750 FORMAT(1X,//,'   OPTION CONDR,',A3,/,
     &             '   SOURCE DEPTH              :',F8.2,'  m')
  760 FORMAT(1X,    '  RECEIVER DEPTH            :',F8.2,'  m')
  770 FORMAT(1X,'  MINIMUM RECEIVER DEPTH   : ', F8.2,'  m',/,
     &         '   MAXIMUM RECEIVER DEPTH   : ', F8.2,'  m',/,
     &         '   NUMBER OF RECEIVERS      : ',I8,/)
  774 FORMAT(1X,'  NUMBER OF RECEIVERS      : ',I8,/)
  780 FORMAT(1X,'  MINIMUM RANGE            : ', F8.2,' km',/,
     &         '   MAXIMUM RANGE            : ', F8.2,' km',/,
     &         '   NUMBER OF RANGE STEPS    : ',I8,/)
  790 FORMAT(1X,////,' ***** ',/,'  DEPTH/RANGE MATRIX FOR SOURCE DEPTH'
     & ,' AT',F9.2,' m    :')
  800 FORMAT(1X,//,'    ****  OUTPUT FOR  "COHERENT" LOSS ****',/)
  810 FORMAT(1X,'  NUMBER OF RANGE SEGMENTS :    ',I5,//)                    
  820 FORMAT(1X,//,'    ****  OUTPUT FOR  "INCOHERENT" LOSS ****',/)
  830 FORMAT(1X,//,'    ****  OUTPUT FOR THE "PULSE" OPTION ****',/)
  840 FORMAT(1X,//,'  FATAL CONDITION DUE TO ARRAY SIZE LIMITATIONS:',/,
     & '  (number of receivers) * (number of range steps) is too large.'
     & ,/,
     & '  The maximum allowed number for this program version is ',I6,
     & '.',/,'   You are requesting ',I5,' range steps ',/,
     &       '   and a total of     ',I5,' depth points.',/,
     & '   EXECUTION IS TERMINATED ' )
  860 FORMAT(1X ,/,'  ERROR : THE TOTAL NUMBER OF SAMPLING POINTS',
     & ' OVER DEPTH',
     & /,'  ALLOWED FOR THIS SNAP VERSION IS ',I6,/,
     & '  THE PRESENT INPUT RUN STREAM REQUIRES : ',I6,
     & ' SAMPLING POINTS.',/,
     & '  THE EXECUTION IS TERMINATED ')

  880 FORMAT(1X,/,'  WARNING :  MAX ALLOWED POWER OF 2 FOR',
     & '  REGION SUBDIVISION',/,'  EXCEEDED IN REGION NO. ',I3,' .',/,
     & '  REQUESTED POWER OF 2    : ',I3,/,
     & '  MAX ALLOWED POWER OF 2  : ',I3,/,
     & '  CALCULATION WILL PROCEED WITH THE MAX ALLOWED POWER.',/)

  902 FORMAT(1X,' SUBOPTION "SNAP" IGNORED ')
  904 FORMAT(1X,' ***********    NEW ALGORYTHM   *******   ')
  906 FORMAT(1X,' increase either, MODEN or MSPMAX in PARAM.INC ')
  908 FORMAT(1X,' ERROR, NO RECEIVER DEPTH FOUND ')
  909 FORMAT(1X,' ERROR, NO SOURCE DEPTH FOUND ')
  910 FORMAT(1X,'  NUMBER OF RECEIVERS FOR CONDR     = ', I4,/,
     & 1X,' EXECUTION IS TERMINATED ')
  912 FORMAT(1X,' WARNING : MAX RANGE IS ADJUSTED TO:',F11.4,'km')
  914 FORMAT(1X,' NO CONDR PLOT FOR THIS SOURCE DEPTH (',F6.1,'m).')
  916 FORMAT(1X,' END OF "PULSE" OPTION ')
  918 FORMAT(1X,/,
     & ' WARNING: For this particular input run stream the half ',/
     & '          beamwidth will be computed with respect to the',/,
     & '          minimum sound speed in the water column given',/,
     & '          for the initial sound velocity profile. ',/)


cfmc      call blkdat

      CPU000= ETIME(CPSEC)

      OPT= 'R   '
      NFFZ=NFF
      MSP=MSPMAX
      NDEPZ=NDEP
      NOPTZ=NOPT
      ICFZ=ICF
      KSRDZ=KSRD

      NR1Z=NR1
      ISDZ=ISD
      ISD2Z=ISD2
      NRPZ=NRP
      MODNPZ=MODNP
      NSMPL= SMPLS
      NSMDEF= SMPLS
      NMAM2= MODEN - 2
      NPAM2= NPOINT - 2

      PI=DACOS(-1.0D0)
      TWOPI=2.0*PI

      TRESH= 1.0E17



C   SUBROUTINE FILE DEALS WITH THE INITIAL FILE ASSIGNMENTS.

      CALL FILE

C     DEFAULT CHOICE FOR ENERGY CONSERVATION AT COUPLING INTERFACES
C     IS " IMPEDANCE MATCHING " ( MATCH = 3 )
      MATCH= 3
C     FOR "REDUCED PRESSURE MATCHING" SPECIFY "MATCH   2
C     FOR "PRESSURE MATCHING" SPECIFY         "MATCH   1
    
      CALL INPUT( *6000, TITLE, FF, NSECT, MODEN, MAXMSH, 
     & ALPHA1, ALPHA2,
     & NINC, NXVAL,
     & C0, Z0, C1, Z1,
     & FLAG, AX, AY, AS, SECD, STORE, SRD,
     & RPROF, BATHY, NDIVP2, MAXPRF, HMAX)


C      ZSTEP= ( H0BEG + H1BEG ) / (MSP-1)
      ZSTEP= H0BEG / (MSP-1)

      IF(MODEL(1:6) .EQ. 'SNAP  ')   THEN
        PRINT 902
        MODEL(1:8)='C-SNAP  '
      END IF

      IF(NMESH .GT. 1)   EXTPOL= 2

      EPSDEF= 1.0E-6
      IF( NMESH .GT. 1)   WRITE(LUPRT,460) EPSDEF

      IF( NOCYL .GT. 0  )   OPT(1:2)='X '
      IF( PLANE .GT. 0.0)   OPT(1:1)='X'


C NMESH  number of meshes to be used to compute the WN.
C        the default value is 4 for the range independent version
C        and 1 for the range dependent one.
C        It can be defined through sub INPUT by adding in the input
C        file the code word  NMESH  followed by an integer number
C        specifying the desired mesh index.
C IMESH  Index of mesh when mode amps are to be output.
C        The default value is 1.
C

C N12221 and
C N14241 specify mode normalization technique (Simpson 12221, 14241)

C EXTRN  flag for eventual external mesh density specification (1 : ext

C LARGE  flag for the print out of the wave numbers, the attenuation
C        coeffs, and the echo of the environmental properties. 
C        LARGE= 0 is the default value. It allows the print out of the
C                 input profiles only.
C        LARGE= 1 extends the print out to the interpolated profiles
C                 as well.




C  01 = OPTION TLRAN
C  04 = OPTION TLDEP
C  08 = OPTION CONDR
C  09 = OPTION CONFR
C  09 = OPTION CONDA
      IF( (FLAG(01,1) .GE. 1.0) .OR.
     &    (FLAG(04,1) .GE. 1.0) .OR.
     &    (FLAG(08,1) .GE. 1.0) .OR.
     &    (FLAG(09,1) .GE. 1.0) )   THEN
        IF( MATCH .EQ. 2)   THEN
C         REDUCED PRESSURE MATCHING
          WRITE(LUPRT, 488)
          PRINT 488
        ELSE IF( MATCH .EQ. 3)   THEN
C         IMPEDANCE MATCHING       
          WRITE(LUPRT, 490)
          PRINT 490
        ELSE IF( MATCH .EQ. 4)   THEN
          PRINT 904
          WRITE(LUPRT,904)
          WRITE(LUPRT, 488)
          PRINT 488
        ELSE
C         PRESSURE MATCHING        
          WRITE(LUPRT, 492)
          PRINT 492
        END IF
      END IF



      IF( N12221 .EQ. 1 )   THEN
        WRITE(LUPRT,420)
      ELSE
        WRITE(LUPRT,440)
      END IF

      IF( INPDZ .EQ. 0 )   THEN
        IF(FIXDZ .EQ. 0)   THEN
          WRITE(LUPRT,482) NSMPL
        ELSE
          WRITE(LUPRT,484) NSMPL
          MSHRAT= 2
        END IF
      ELSE
        WRITE(LUPRT,486)
        MSHRAT= 2
      END IF

      IF(NMESH .GT. 1 )   THEN
        IF(MSHRAT .EQ. 0)   THEN
           WRITE(LUPRT,470)
        ELSE
           WRITE(LUPRT,480)
        END IF
      END IF

      CLOSE(LUIN)

      WRITE(LUPRT,121)TITLE
      WRITE(LUPRT,220)
C
C  WRITE OUT OF REQUESTED OPTIONS.
C
      DO   66   ISUB=1,NOPT
      K=REORD1(ISUB)
      IF(FLAG(K,1).LT.1.0)   GO TO   66
      GO TO(11,22,11,11,11,22,22,33,33,22,
     &      22,11,33,44,55,55,55,55      ),K
   11 WRITE(LUPRT,240)ALPHA1(K),FLAG(K,2),FLAG(K,3),FLAG(K,5),FLAG(K,6)
      GO TO 66
   22 WRITE(LUPRT,241)ALPHA1(K),FLAG(K,2),FLAG(K,3)
      GO TO 66
   33 WRITE(LUPRT,244)ALPHA1(K),FLAG(K,2),FLAG(K,3),FLAG(K,5),FLAG(K,6),
     &                FLAG(K,4)
      GO TO 66
   44 CONTINUE
      WRITE(LUPRT,242)ALPHA1(K)
      GO TO 66
   55 WRITE(LUPRT,243)ALPHA1(K),FLAG(K,5),FLAG(K,6)
   66 CONTINUE



      WRITE(LUPRT,710) NSECT
C
C  CHECK FOR PROFL OPTION.
C
      DO 1000   IOP= 1, NOPT
      IF(ALPHA1(IOP) .NE. 'PROFL')   GO TO 1000
        IF(FLAG(IOP,1) .GT. 0.0)   CALL PROFL(IOP, NSECT, RPROF,
     &                           C0, Z0, C1, Z1,
     &                           AX, AY, AS, NOPT, TITLE, ZY, CX )
        FLAG(IOP,1)= 0.0
      GO TO 1100
 1000 CONTINUE
 1100 CONTINUE

      IF(FLAG(11,3).GT.0.0)   MODPLT= .TRUE.
      JUMP=0

      ICONSV= 17
      ICON= 4
      IF(FLAG(ICONSV,1) .GT. 0.0)   CALL CONSV(ICONSV, ICON,
     &                              NSECT, RPROF, BATHY, HMAX,
     &                              C0, Z0, C1, Z1,
     &                              AX, AY, NOPT, TITLE,
     &                              FLAG, ICF)

C  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

C  Define range subdivisions in the environment

       CALL RDIV( MAXPRF, MAXPOW, NSECT, NEND, SECD, NOPT,
     &            NDIVP2, RPROF, RFILE, RCOUPL )

C  01 = OPTION TLRAN
C  04 = OPTION TLDEP
C  08 = OPTION CONDR
C  09 = OPTION CONFR
C  11 = OPTION MODES
C  09 = OPTION CONDA

      IF( (FLAG(01,1) .NE. 1.0) .AND.
     &    (FLAG(04,1) .NE. 1.0) .AND.
     &    (FLAG(08,1) .NE. 1.0) .AND.
     &    (FLAG(09,1) .NE. 1.0) .AND.
     &    (FLAG(11,1) .NE. 1.0) )   GO TO 4620



C  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
C
C  CHECK OF CALCULATION TYPE FOR RANGE DEPENDENT CASE
C  ONLY TLRAN, TLDEP, CONDR, AND CONFR (IOP=1,4,8,9)
C
      IF( FLAG(01,5)+FLAG(04,5)+FLAG(08,5)+FLAG(09,5)+
     &    FLAG(12,5) .GT. 0)   COHRNT= 1
      IF( FLAG(01,6)+FLAG(04,6)+FLAG(08,6)+FLAG(09,6)+
     &    FLAG(12,6) .GT. 0)   INCRNT= 1

C  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

C   TIME FOR INTERFACING WITH INPUT FILE AND PREPARATORY

      CPUINI= ETIME(CPSEC) - CPU000

      DO 4600   IFREQ= 1, NFREQ

       CPUFRQ= ETIME(CPSEC)
       CPEIGV= 0.0
       CPEIGF= 0.0
       FIRST= 0.0
       IF( FLAG(11,1) .GT. 0.0 )   MODFLG= 1.0
       IF( FRQREF .LE. 0.0 )    THEN
         FRQDEP= 1
       ELSE
         FRQDEP= ( FF(IFREQ)/FRQREF)**FPOW
       END IF
       FRQ=DBLE(FF(IFREQ))
       F2= FRQ*FRQ*1.0D-6

C       WRITE(LUPRT,500) FF(IFREQ)
       PRINT 500, FF(IFREQ)

       BETA(-1)= F2 *
     &           (0.11 / (1.0 + F2) + 44.0 / (4100.0 + F2) + 3.0D-4)

      IF(IFREQ .GT. 1)   THEN
        DO 1550   IOP= 1, NOPT
        DO 1550   JSD= 1, KSRD
        SRD(IOP,JSD,1)= ABS( SRD(IOP,JSD,1) )
 1550   CONTINUE
      END IF


 1600 CONTINUE

C     SELECT A SOURCE DEPTH
      CALL DEFSD( ALPHA1,
     & REORD2, FLAG, SRD, SECD, AY, NOPT, ICF, KSRD,
     & QRNG, NRANGE, QRD, MSPMAX, ZSTEP,
     & RNGTMP, RDTMP,
C     OUTPUT PARAMETERS:
     & SD, OPTSD,
     & RNG, NRNGC,
     & RDAR, NRDC )


      FIRST= 0.0

      IF( SD .GT. 0.0 )   THEN
        ISHIFT= 0
        IF(RDAR(1) .EQ. 0.0)   ISHIFT= 1
        NRCVRS= NRDC
        NR= NRNGC

        PRINT 790, SD
        WRITE(LUPRT,790) SD
        REWIND LUTLC
        REWIND LUTLI

C   Check array size limits
        MAXSIZ= 2 * IDUMMY
        IF( NR*(NRCVRS-ISHIFT) .GT. MAXSIZ)   THEN
          WRITE(LUPRT,840) MAXSIZ, NR, (NRCVRS-ISHIFT)
          PRINT 840, MAXSIZ, NR, (NRCVRS-ISHIFT)
          WRITE(LUPRT,770) RDAR(1), RDAR(NRCVRS), NRCVRS
          PRINT 770, RDAR(1), RDAR(NRCVRS), NRCVRS
          print 906
          STOP
        END IF

        PRINT 770, RDAR(1), RDAR(NRCVRS), NRCVRS
        PRINT 780, RNG(1)*1.0E-3, RNG(NR)*1.0E-3, NR
        PRINT 810, NEND - 1
        WRITE(LUPRT,770)  RDAR(1), RDAR(NRCVRS), NRCVRS
        WRITE(LUPRT,780)  RNG(1)*1.0E-3, RNG(NR)*1.0E-3, NR
        WRITE(LUPRT,810) NEND - 1
        IF( MAXRNG .EQ. 0.0 )   THEN
          RNGMAX= RNG(NR)
        ELSE
          RNGMAX= MAXRNG
        END IF

      ELSE
        IF( MODFLG .LT. 1 )   GO TO 4600
      END IF

      REWIND(10)
      READ(10) MINMOD, MAXMOD
      IF(MAXMOD.EQ.0)   THEN
       WRITE(LUPRT,*) ' ***   MAXMOD IS EQUAL TO ZERO   **** '
       WRITE(LUPRT,*) ' EXECUTION IS TERMINATED '
       STOP
      END IF

      MAXREF=MAXMOD


C ******************
      EPSINP= 1.0E-3
C ******************


      CPUBEG= ETIME(CPSEC)
      ICOUNT=0
      USEOLD=0
      IRANGE= 1

C ****************************************************************

C     Reading environmental properties to define the LEFT extreme of 
C     the first region. They will be used to create the starting field.
C     For NSECT .GT. 1, also the environmental properties to define the
C     right extreme of the first region are read.
      RKM= -1.0
      CALL NEWENV( Z0, C0, Z1, C1, Z0L, C0L, C1L,
     & Z1L, Z0R, C0R, Z1R, C1R)


      IF(HBEAM .GT. 0.0)   THEN
C       Computing the critical angle at the source depth
        if( sd .eq. 0.0 )   then
          PRINT 918
          WRITE(LUPRT,918)
          CSD= 1.0E38
          DO   7263   IJK= 1, ND0
          CSD= MIN(CSD, REAL(C0(IJK)) )
 7263     CONTINUE
        else
          CSD= CZS( SD, Z0, C0, ND0 )
        end if
c        crtang= ACOS( CZS( SD, Z0, C0, ND0 )/C2 )
        crtang= ACOS( CSD/C2 )
C       Computing the max phase velocity BPHVEL associated with
C       the half beamwidth HBEAM (beam width with the horizontal axis).
C       The quantity "omega/bphvel" will be used as the lower limit
C       in the eigenvalue search.
        IF( (HBEAM*PI/180.0) .GT. crtang )   THEN
          PRINT 540, HBEAM, crtang*180/PI
          WRITE(LUPRT,540) HBEAM, crtang*180/PI
          PRINT 560,  crtang*180/PI
          WRITE(LUPRT,560) crtang*180/PI
          HBEAM= 0.0
        ELSE
c          BPHVEL=  CZS(SD, Z0, C0, ND0 )/COS( HBEAM*PI/180.0 )
          BPHVEL=  CSD/COS( HBEAM*PI/180.0 )
        END IF
      END IF

      IF ( PLANE .GT. 0.0 )   THEN
        EK0= (TWOPI*FRQ)/CZS( SD, Z0, C0, ND0 )
        SQEK0= SQRT(EK0)
      ELSE
        EK0= 1.0
        SQEK0= 1.0
      END IF

C ****************************************************************
      ALEFT=  2
      ARIGHT= 1
C **********************************************************************

      CALL MODE(*4600,
     & EK, C0, Z0, C1, Z1, ISO,
     & MY, MAXMSH, MODEN,
     & ADA, SPEED,
     & ZZ, Z0NRM, Z1NRM)

      IF( MODFLG .GT. 0) THEN
C     IOP= 11 IDENTIFIES OPTION "MODES" 
      IOP= 11

      CALL MODES( FF(IFREQ), TITLE, AX, AY,
     & MODPLT, XTS, MSP, IOP, FLAG, NOPT, ICF,
     & ZSTEP, MODQTY,
     &             ALFA, MODAVR,
     &             ADA,  SPEED, EIGF,
     &             A3, B3, C3,
     &             EE, ZZ, SSOLD, EXCH, EK)
 
       MODFLG= 0
       IF( LARGE .LE. 0 )    FLAGPU= 1.0
      END IF

      IF( SD .EQ. 0 )   GO TO 4600 

      IF( LARGE .LE. 0 )   JUMP= 1

      COLEFT= 0.0

      MAXMOD=MIN(MODCUT,MODEN)

C ******************
      EPSINP= 1.0E-3
C ******************


      ICOUNT=0
      USEOLD=0

C ******************************************************************

      IF( NSECT .GT. 1 )   THEN

C       WATER COLUMN
        CALL PROFEQ(ND0L,Z0L,C0L,ND0R,Z0R,C0R,ND0LR,Z0LR,CE0L,CE0R)


C       SEDIMENT LAYER
        CALL PROFEQ(ND1L,Z1L,C1L,ND1R,Z1R,C1R,ND1LR,Z1LR,CE1L,CE1R)
      END IF

C **********************************************************************



CFMC       CPUBEG= ETIME(CPSEC)
       COLEFT= 0.0
       IPROF= 0


       CALL EVALCM( RFILE, RCOUPL, NEND, IPROF, PHIR,
     &  SD, RDAR( 1 + ISHIFT ), NRCVRS - ISHIFT,
     &  NR, CK, MAXREF-MINMOD+1, OPT, RNG, SUM2A, FF(IFREQ),
     &  Z0L,C0L,Z1L,C1L,Z0R,C0R,Z1R,C1R,
     &  ND0LR, Z0LR, CE0L, CE0R,
     &  ND1LR, Z1LR, CE1L, CE1R,
     &  Z0,C0,Z1,C1,Z0NRM,Z1NRM,
     &  ALFA,EK,CKTAIL,MODAVR,ISO,MY,ADA,SPEED,EIGF,
     &  A3,B3,C3,EE,ZZ,SSOLD,EXCH)

CFMC        CPUEND= ETIME(CPSEC)
CFMC        WRITE(LUPRT,*) '* TOTAL TIME FROM EVALCM : ',
CFMC     &  (CPUEND-CPUBEG)


      CPOUTP= ETIME(CPSEC)

      DO 4102   IADD= 0, 1
      IF(IADD .EQ. 0)   THEN
        IF(COHRNT .LT. 1)   GO TO 4102
        PRINT 800
        WRITE(LUPRT,800)
        COHINC= 'COH'
        LUSORT= LUTLC
      ELSE
        IF(INCRNT .LT. 1)   GO TO 4102
        PRINT 820
        WRITE(LUPRT,820)
        COHINC= 'INC'
        LUSORT= LUTLI
      END IF
C     RETRIEVING TL DATA
      CALL RETRV(LUSORT, PRSS, NRCVRS-ISHIFT, NR)


      DO 4100   K = 1, NOPT

      IOP= REORD2(K)

      IF(FLAG(IOP,1) .LT. 1.0)   GO TO 4100

      GO TO(4001,4002,4003,4004,4005,4006,4007,4008,4009,4100,
     &      4011,4012,4100,4100,4015,4100,4100,4100          ),IOP


C***********************************************************************
C***********************************************************************


C     OPTION "TLRAN"
 4001 CONTINUE

      IF(FLAG(IOP,5+IADD) .LT. 1.0)   GO TO 4100

      ISTART= 0
      DO 3401   JSD= 1, KSRD
      SDABS= ABS(SRD(IOP,JSD,1))
      IF( ABS(SDABS/SD - 1.0) .LT. 1.0E-5 )   THEN
        WRITE(LUPRT,730) COHINC, SD
        PRINT 730, COHINC, SD
        IF(ISTART .EQ. 0)   THEN
          ISTART= 1
          JCOUNT= 0
          IF( RNG(1) .EQ. 0.0 )   ISTART= 2
          RMARCH= SECD(IOP,1)
          IF( RMARCH .EQ. 0.0  )   THEN
            JCOUNT= 1
            INDX(1)= JCOUNT
            RMARCH= RMARCH + SECD(IOP,3)
          END IF

          DO 3101   IR = ISTART, NR
          IF( ABS( RMARCH/RNG(IR) - 1.0 ) .LE. 1.0E-5)   THEN
            JCOUNT= JCOUNT + 1
            INDX(JCOUNT)= IR
             RMARCH = SECD(IOP,1) +  JCOUNT * SECD(IOP,3)
             IF( (RMARCH/SECD(IOP,2) - 1.0) .GT. 1.0E-5 )   GO TO 3201
          END IF
 3101     CONTINUE
 3201     CONTINUE
          PRINT 690, JCOUNT
          PRINT 700, SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &               SECD(IOP,3)*1.0E-3
          WRITE(LUPRT, 690)  JCOUNT
          WRITE(LUPRT,700)  SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &                      SECD(IOP,3)*1.0E-3
        END IF


        DO 3301  IRCVR= 1 + ISHIFT, NRCVRS
        IF(ABS(SRD(IOP,JSD,2)/RDAR(IRCVR) - 1.0) .LT. 1.0E-5) THEN
          PRINT 760, SRD(IOP,JSD,2)
          CALL TLCPLE(PRSS, NR, NRCVRS-ISHIFT, IRCVR-ISHIFT,
     &    INDX, JCOUNT, TLOSS)
          IF(IPROF .GT. 1 .AND. SUMPL .GT. 0.0)   THEN
            NC=2
            CALL OUTPL(IOP, SECD, TLOSS, FLAG, AX, AY, SD,
     &      RDAR(IRCVR), NOPT, ICF, FF(IFREQ), JCOUNT, TITLE,
     &      NC, COHINC)
            CALL OUTSUM(BIASUM, IPROF, RCOUPL, SUM2A,
     &                AY(IOP,1), AY(IOP,2))
          ELSE
            NC= 1
            CALL OUTPL(IOP, SECD, TLOSS, FLAG, AX, AY, SD,
     &      RDAR(IRCVR), NOPT, ICF, FF(IFREQ), JCOUNT, TITLE,
     &      NC, COHINC)
          END IF

          GO TO 3401
        END IF
 3301   CONTINUE
        PRINT 908
        STOP ' SUB MAIN '
      END IF
 3401 CONTINUE
      GO TO 4100
C***********************************************************************
C***********************************************************************

 4002 CONTINUE
      GO TO 4100
 4003 CONTINUE
      GO TO 4100

C***********************************************************************
C***********************************************************************


C     OPTION "TLDEP"
 4004 CONTINUE

      IF(FLAG(IOP,5+IADD) .LT. 1.0)   GO TO 4100

      DO 3604   JSD= 1, KSRD
      SDABS= ABS(SRD(IOP,JSD,1))
      IF( ABS(SDABS/SD - 1.0) .LT. 1.0E-5 )   THEN
        WRITE(LUPRT,740) COHINC, SD
        PRINT 740, COHINC, SD

        ISTART= 1
        IF( RNG(1) .EQ. 0.0 )   ISTART= 2
        JCOUNT= 0
        RMARCH= SECD(IOP,1)
        IF( RMARCH .EQ. 0.0  )   THEN
          JCOUNT= 1
          INDX(1)= JCOUNT
          RMARCH= RMARCH + SECD(IOP,3)
        END IF

        DO 3104   IR = ISTART, NR
        IF( ABS( RMARCH/RNG(IR) - 1.0 ) .LE. 1.0E-5)   THEN
          JCOUNT= JCOUNT + 1
          INDX(JCOUNT)= IR
          RMARCH = SECD(IOP,1) + JCOUNT * SECD(IOP,3)
          IF( (RMARCH/SECD(IOP,2) - 1.0) .GT. 1.0E-5 )   GO TO 3204
        END IF
 3104   CONTINUE
 3204   CONTINUE

        ISTART= 1
        IF( RDAR(1) .EQ. 0.0 )   ISTART= 2
        LCOUNT= 0
C       (AY(IOP,6), AY(IOP,7)) = (min, max) values in depth interval.
        ZMARCH= AY(IOP,6)
        IF( ZMARCH .EQ. 0.0  )   THEN
          LCOUNT= 1
          INDY(1)= LCOUNT
          ZMARCH= ZMARCH + ZSTEP
        END IF

        DO 3304   JRD= ISTART, NRCVRS
        IF( ABS( ZMARCH/RDAR(JRD) - 1.0 ) .LE. 1.0E-5 )   THEN
          LCOUNT= LCOUNT + 1
          INDY(LCOUNT)= JRD
          ZMARCH= AY(IOP,6) + LCOUNT * ZSTEP
          IF( (ZMARCH/AY(IOP,7) - 1.0 ) .GT. 1.0E-5 )   GO TO 3404
C          IF( ZMARCH .GT. AY(IOP,7) )   GO TO 3404
        END IF
 3304   CONTINUE
 3404   CONTINUE

        COLEFT= 0.0

        PRINT 774, LCOUNT
        PRINT 680, RDAR(INDY(1)), RDAR(INDY(LCOUNT)), ZSTEP
        PRINT 690, JCOUNT
        PRINT 700, SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &             SECD(IOP,3)*1.0E-3
        WRITE(LUPRT, 774) LCOUNT
        WRITE(LUPRT,680)  RDAR(INDY(1)), RDAR(INDY(LCOUNT)), ZSTEP
        WRITE(LUPRT, 690) JCOUNT
        WRITE(LUPRT,700)  SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &                    SECD(IOP,3)*1.0E-3

        CALL TLDEPC( SD, RNG, PRSS, NRCVRS, NR,
     &  RDAR, ISHIFT,
     &  FF(IFREQ), TITLE, IOP, TLOSS, INDX, INDY, JCOUNT, LCOUNT,
     &  ZSTEP, FLAG, AX, AY, NOPT, ICF, COHINC )

      END IF
 3604 CONTINUE
      GO TO 4100
C***********************************************************************
C***********************************************************************

 4005 CONTINUE
      GO TO 4100
 4006 CONTINUE
      GO TO 4100
 4007 CONTINUE
      GO TO 4100

C***********************************************************************
C***********************************************************************


C     OPTION "CONDR"
 4008 CONTINUE

      IF(FLAG(IOP,5+IADD) .LT. 1.0)   GO TO 4100

      DO 3408   JSD= 1, KSRD
      SDABS= ABS(SRD(IOP,JSD,1))
      IF( ABS(SDABS/SD - 1.0) .LT. 1.0E-5 )   THEN
        WRITE(LUPRT,750) COHINC, SD
        PRINT 750, COHINC, SD

        ISTART= 1
        IF( RNG(1) .EQ. 0.0 )   ISTART= 2
        JCOUNT= 0
        RMARCH= SECD(IOP,1)
        IF( RMARCH .EQ. 0.0  )   THEN
          JCOUNT= 1
          INDX(1)= JCOUNT
          RMARCH= RMARCH + SECD(IOP,3)
        END IF


        DO 3008   IR = ISTART, NR
        IF( ABS( RMARCH/RNG(IR) - 1.0 ) .LE. 1.0E-5)   THEN
          JCOUNT= JCOUNT + 1
          INDX(JCOUNT)= IR
          RMARCH = SECD(IOP,1) + JCOUNT * SECD(IOP,3)
          IF( (RMARCH/SECD(IOP,2) - 1.0) .GT. 1.0E-5 )   GO TO 3108
        END IF
 3008   CONTINUE
 3108   CONTINUE

        ISTART= 1
        IF( RDAR(1) .EQ. 0.0 )   ISTART= 2
        LCOUNT= 0
C       (AY(IOP,6), AY(IOP,7)) = (min, max) values in depth interval.
        ZMARCH= AY(IOP,6)
        IF( ZMARCH .EQ. 0.0  )   THEN
          LCOUNT= 1
          INDY(1)= LCOUNT
          ZMARCH= ZMARCH + ZSTEP
        END IF

        DO 3208   JRD= ISTART, NRCVRS
        IF( ABS( ZMARCH/RDAR(JRD) - 1.0 ) .LE. 1.0E-5 )   THEN
          LCOUNT= LCOUNT + 1
          INDY(LCOUNT)= JRD
          ZMARCH= AY(IOP,6) + LCOUNT * ZSTEP
          IF( (ZMARCH/AY(IOP,7) - 1.0 ) .GT. 1.0E-5 )   GO TO 3308
C          IF( ZMARCH .GT. AY(IOP,7) )   GO TO 3308
        END IF
 3208   CONTINUE
 3308   CONTINUE

        IF( LCOUNT .LT. 1 )   THEN
          PRINT 910, LCOUNT
          STOP
        END IF

        PRINT 774, LCOUNT
        PRINT 680, RDAR(INDY(1)), RDAR(INDY(LCOUNT)), ZSTEP
        IF( RNG(NR) .LT. SECD(IOP,2) )  THEN
          SECD(IOP,2)= SECD(IOP,1) + (JCOUNT-1) * SECD(IOP,3)
C          WRITE(LUPRT,912)   SECD(IOP,2)*1.0E-3 
C          PRINT 912, SECD(IOP,2)*1.0E-3
        END IF
        PRINT 690, JCOUNT
        PRINT 700, SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &             SECD(IOP,3)*1.0E-3
        WRITE(LUPRT, 774) LCOUNT
        WRITE(LUPRT,680)  RDAR(INDY(1)), RDAR(INDY(LCOUNT)), ZSTEP
        WRITE(LUPRT, 690) JCOUNT
        WRITE(LUPRT,700)  SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &                    SECD(IOP,3)*1.0E-3


        COLEFT= 0.0

        CPUBEG= ETIME(CPSEC)
        CALL CONDRC( NR, FF(IFREQ), TITLE, IOP, SD, RDAR,
     &  NRCVRS, ISHIFT,
     &  INDX, INDY, JCOUNT, LCOUNT, TLOSS,
     &  SECD, FLAG, AX, AY,
     &  NOPT, ICF, PRSS,
     &  RPROF, BATHY, NSECT, HMAX, COHINC )
        CPUEND= ETIME(CPSEC)
        CPUCDR= (CPUEND - CPUBEG)
        WRITE(LUPRT,*) '* TOTAL TIME FOR CONDRC : ', CPUCDR
CCHK        WRITE(LUCHK,*) '* TOTAL TIME FOR CONDRC : ', CPUCDR
      END IF
 3408 CONTINUE
      GO TO 4100

C***********************************************************************
C***********************************************************************


C     OPTION "CONFR"
 4009 CONTINUE

      IF(FLAG(IOP,5+IADD) .LT. 1.0)   GO TO 4100

      ISTART= 0
      DO 3409   JSD= 1, KSRD
      SDABS= ABS(SRD(IOP,JSD,1))
      IF( ABS(SDABS/SD - 1.0) .LT. 1.0E-5 )   THEN
        FOUND= 1.0
        WRITE(LUPRT,739) COHINC, SD
        PRINT 739, COHINC, SD
        IF(ISTART .EQ. 0)   THEN
          ISTART= 1
          JCOUNT= 0
          IF( RNG(1) .EQ. 0.0 )   ISTART= 2
          RMARCH= SECD(IOP,1)
          IF( RMARCH .EQ. 0.0  )   THEN
            JCOUNT= 1
            INDX(1)= JCOUNT
            RMARCH= RMARCH + SECD(IOP,3)
          END IF

          DO 3109   IR = ISTART, NR
          IF( ABS( RMARCH/RNG(IR) - 1.0 ) .LE. 1.0E-5)   THEN
            JCOUNT= JCOUNT + 1
            INDX(JCOUNT)= IR
             RMARCH = SECD(IOP,1) +  JCOUNT * SECD(IOP,3)
          END IF
 3109     CONTINUE
          PRINT 690, JCOUNT
          PRINT 700, SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &               SECD(IOP,3)*1.0E-3
          WRITE(LUPRT, 690) JCOUNT
          WRITE(LUPRT,700)  SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3,
     &                      SECD(IOP,3)*1.0E-3
        END IF


        IF(MINF9 .EQ. 0)   MINF9= IFREQ
        NC= 1
        FOUND= 0.0
        DO 3309  IRCVR= 1 + ISHIFT, NRCVRS
        IF(ABS(SRD(IOP,JSD,2)/RDAR(IRCVR) - 1.0) .LT. 1.0E-5) THEN
          FOUND= 1.0
          PRINT 760, SRD(IOP,JSD,2)
          CALL TLCPLE(PRSS, NR, NRCVRS-ISHIFT, IRCVR-ISHIFT,
     &    INDX, JCOUNT, TLOSS)

          CALL CONFR(TLOSS, JCOUNT, FF(IFREQ),
     &    COHINC, NMARCH,
     &    TITLE, IOP,
     &    MINF9, NFREQ, FF,
     &    FLAG, AX, AY, SRD, SECD,
     &    NOPT, ICF, KSRD)
        END IF
 3309   CONTINUE

C ***********
C  THIS PROGRAM VERSION ALLOWS ONLY FOR ONE SOURCE/RECEIVER DEPTH COMBINATION.
C  THE LIMITATION IS DUE TO THE PROBLEM OF DEFINING APPROPRIATE FILE NAMES
C  FOR THE OUTPUT FILES (ONE FILE FOR EVERY SD/RD COMBINATION).
C ***********

        IF( FOUND .EQ. 0.0 )   THEN
          PRINT 908
          STOP ' SUB MAIN '
        ELSE
          GO TO 4100
        END IF
      END IF
 3409 CONTINUE
      PRINT 909
      STOP ' SUB MAIN '

 4010 CONTINUE
      GO TO 4100
 4011 CONTINUE
 
      GO TO 4100
 4012 CONTINUE
      GO TO 4100
 4013 CONTINUE
      GO TO 4100
 4014 CONTINUE
      GO TO 4100
 4015 CONTINUE
      GO TO 4100


 4100 CONTINUE
 4102 CONTINUE

      CPOUTP= ETIME(CPSEC) - CPOUTP
      CPUFRQ= ETIME(CPSEC) - CPUFRQ

C      IF( NFREQ .GT. 1 )   THEN

      WRITE(LUPRT,324)   FF(IFREQ)

      TEMP= CPEIGV
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,326)   NHOUR, NMIN, TSEC

      TEMP= CPEIGF
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,328)   NHOUR, NMIN, TSEC

      TEMP= CPUFRQ - (CPEIGV+CPEIGF+CPOUTP)
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,330)   NHOUR, NMIN, TSEC

      TEMP= CPOUTP
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,332)   NHOUR, NMIN, TSEC

      TEMP= CPUFRQ
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,333)   NHOUR, NMIN, TSEC
      PRINT 336, FF(IFREQ), NHOUR, NMIN, TSEC 
C      END IF
      GO TO 1600
 4600 CONTINUE
      REWIND 10


 4620 CONTINUE



C  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
C     "PULSE" OPTION
      IOP= 16
      IF(FLAG(IOP,1) .GT. 0.0)   THEN
C  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


       PRINT 250
       WRITE(LUPRT,250)

       COHRNT= 1
       FLAGPU=1

       IF( FMIN .EQ. FMAX )   THEN
         DELTAF= FMIN
         NFFT=1024
         TSTEP=1.0/(NFFT*DELTAF)
         NFREQ= 1
         JFMIN=2
         LXP1= 2
         JFMAX= 2
       ELSE
         DELTAF= 1.0/(NFFT*TSTEP)
         JFMIN= FMIN/DELTAF+1
         JFMIN= MAX(JFMIN,1)
         IF(JFMIN .EQ. 1) THEN
           LXP1= 2
         ELSE
           LXP1= JFMIN
         END IF
         JFMAX= nint(FMAX/DELTAF)+1
         JFMAX= MIN(JFMAX,NFFT/2)
         NFREQ= JFMAX-LXP1+1
       END IF

       SD= SRD(IOP,1,1)
C       PRINT 790, SD
C       WRITE(LUPRT,790) SD

       IF(SECD(IOP,1) .EQ. SECD(IOP,2))   THEN
         NR= 1
         SECD(IOP,3)= 0.0
       ELSE
         NR= (SECD(IOP,2)-SECD(IOP,1)+1.0E-3*SECD(IOP,3))/SECD(IOP,3)+1
       END IF
       IF(PULRD(1) .EQ. PULRD(2))   THEN
         NRCVRS= 1
         PULRD(3)= 0.0
       ELSE
         NRCVRS=(PULRD(2)-PULRD(1)+1.0E-3*PULRD(3))/PULRD(3)+1
       END IF

C   Check array size limits
       MAXSIZ= 2 * IDUMMY
       IF( NR*(NRCVRS-ISHIFT) .GT. MAXSIZ)   THEN
         WRITE(LUPRT,840) MAXSIZ, NR, (NRCVRS-ISHIFT)
         PRINT 840, MAXSIZ, NR, (NRCVRS-ISHIFT)
         WRITE(LUPRT,770) RDAR(1), RDAR(NRCVRS), NRCVRS
         PRINT 770, RDAR(1), RDAR(NRCVRS), NRCVRS
         print 906
         STOP
       END IF

       DO 1111  IRNG= 1, NR
       RNG(IRNG)= SECD(IOP,1) + (IRNG-1)*SECD(IOP,3)
 1111  CONTINUE
       DO 1112  IRD= 1, NRCVRS
       RDAR(IRD)= PULRD(1) + (IRD-1)*PULRD(3)
 1112  CONTINUE
       ISHIFT= 0
       IF(RDAR(1) .EQ. 0.0)   ISHIFT= 1


        PRINT 260, FMIN, FMAX, SD,
     &             SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3, 
     &             SECD(IOP,3)*1.0E-3,
     &             PULRD(1),  PULRD(2),  PULRD(3) 
        WRITE(LUPRT,260) FMIN, FMAX, SD,
     &             SECD(IOP,1)*1.0E-3, SECD(IOP,2)*1.0E-3, 
     &             SECD(IOP,3)*1.0E-3,
     &             PULRD(1),  PULRD(2),  PULRD(3) 



C      PRINT 770, RDAR(1), RDAR(NRCVRS), NRCVRS
C      PRINT 780, RNG(1)*1.0E-3, RNG(NR)*1.0E-3, NR
C      PRINT 810, NEND - 1

C      WRITE(LUPRT,770)  RDAR(1), RDAR(NRCVRS), NRCVRS
C      WRITE(LUPRT,780)  RNG(1)*1.0E-3, RNG(NR)*1.0E-3, NR
C      WRITE(LUPRT,810) NEND - 1


       JUMP=-1
       EPSINP=1.0E-3

       JFMIN=LXP1
       NFREQ= JFMAX-JFMIN+1


C   LUTLC IS USED AS INTERMEDIATE FILE.
      REWIND LUTLC
  

       DO 5800   IFREQ= LXP1, JFMAX

       CPUBEG= ETIME(CPSEC)

       JUMP= JUMP + 1
       REWIND(10)
       READ(10) MINMOD, MAXMOD
       MAXREF=MAXMOD

       FIRST= 0.0
       FRQCY= (IFREQ-1) * DELTAF
       IF( FRQREF .LE. 0.0 )    THEN
         FRQDEP= 1
       ELSE
         FRQDEP= ( FRQCY/FRQREF )**FPOW
       END IF
       FRQ= DBLE(FRQCY)
       F2= FRQ*FRQ*1.0D-6

C       PRINT 320, IFREQ, JFMAX, FRQCY

       BETA(-1)= F2 *
     &           (0.11 / (1.0 + F2) + 44.0 / (4100.0 + F2) + 3.0D-4)

       ICOUNT=0
       USEOLD=0
       IRANGE= 1

C ****************************************************************
C      Reading environmental properties to define the LEFT extreme of 
C      the first region. They will be used to create the starting field.
C      For NSECT .GT. 1, also the environmental properties to define the
C      right extreme of the first region are read.
       RKM= -1.0
       CALL NEWENV( Z0, C0, Z1, C1, Z0L, C0L, C1L,
     & Z1L, Z0R, C0R, Z1R, C1R)

       IF ( PLANE .GT. 0.0 )   THEN
         EK0= (TWOPI*FRQ)/CZS( SD, Z0, C0, ND0 )
         SQEK0= SQRT(EK0)
       ELSE
         EK0= 1.0
         SQEK0= 1.0
       END IF

C ****************************************************************
       ALEFT=  2
       ARIGHT= 1
C **********************************************************************

       CALL MODE(*5600,
     & EK, C0, Z0, C1, Z1, ISO,
     & MY, MAXMSH, MODEN,
     & ADA, SPEED,
     & ZZ, Z0NRM, Z1NRM)


       IF( LARGE .LE. 0 )   JUMP= 1

       COLEFT= 0.0

       MAXMOD=MIN(MODCUT,MODEN)

       ICOUNT=0
       USEOLD=0

C ******************************************************************

       IF( NSECT .GT. 1 )   THEN

C        WATER COLUMN
         CALL PROFEQ(ND0L,Z0L,C0L,ND0R,Z0R,C0R,ND0LR,Z0LR,CE0L,CE0R)


C        SEDIMENT LAYER
         CALL PROFEQ(ND1L,Z1L,C1L,ND1R,Z1R,C1R,ND1LR,Z1LR,CE1L,CE1R)
       END IF

C **********************************************************************

       COLEFT= 0.0
       IPROF= 0

       CALL EVALPR( RFILE, RCOUPL, NEND, IPROF, PHIR,
     &  SD, RDAR( 1 + ISHIFT ), NRCVRS - ISHIFT, ISHIFT,
     &  NR, CK, MAXREF-MINMOD+1, OPT, RNG, SUM2A, FRQCY,
     &  Z0L,C0L,Z1L,C1L,Z0R,C0R,Z1R,C1R,
     &  ND0LR, Z0LR, CE0L, CE0R,
     &  ND1LR, Z1LR, CE1L, CE1R,
     &  Z0,C0,Z1,C1,Z0NRM,Z1NRM,
     &  ALFA,EK,CKTAIL,MODAVR,ISO,MY,ADA,SPEED,EIGF,
     &  A3,B3,C3,EE,ZZ,SSOLD,EXCH, PRDEP)

       CPUEND= ETIME(CPSEC)
       WRITE(LUPRT,*) '* TOTAL TIME FROM EVALPR: ',
     & (CPUEND-CPUBEG)
       PRINT 321, IFREQ, JFMAX, FRQCY, (CPUEND-CPUBEG)
       WRITE(LUPRT, 321) IFREQ, JFMAX, FRQCY, (CPUEND-CPUBEG)
       GO TO 5800
 5600  CONTINUE

       PRINT 322, IFREQ, JFMAX, FRQCY
       WRITE(LUPRT, 322) IFREQ, JFMAX, FRQCY
       JFMIN= JFMIN+1

 5800  CONTINUE

      NOUT=0
      IF( TNORM .NE. ' 0' ) then
       NOUT=NOUT+1
       iparm(nout)=6
      end if
      IF( TVERT .NE. ' 0' ) then
       NOUT=NOUT+1
       iparm(nout)=2
      end if
      IF( THORI .NE. ' 0' ) then
       NOUT=NOUT+1
       iparm(nout)=3
      end if
       
C
      LBUFF=NPLOTS*NOUT
      NFREQ= MX-LXP1+1

C  HEADER OF OUTPUT FILE (C-SNAP.TRF = LUTRF = 83)
C
      write(lutrf) 'PULSETRF'
      WRITE(LUTRF) 'C-SNAP'
      WRITE(LUTRF) nout
      write(lutrf) (iparm(jj),jj=1,nout)
      WRITE(LUTRF) TITLE
      WRITE(LUTRF) SEGNO
      WRITE(LUTRF) FF(1)
      WRITE(LUTRF) SD
      WRITE(LUTRF) PULRD(1),PULRD(2),NRCVRS
      write(lutrf) secd(iop,1)*1e-3,secd(iop,3)*1e-3,nr
      WRITE(LUTRF) NFFT,JFMIN,JFMAX,TSTEP
      WRITE(LUTRF) IFIX(PLANE)
      omegim=0e0
      write(lutrf) omegim
      idum=1
      write(lutrf) idum
      write(lutrf) idum
      write(lutrf) idum
      idum=0
      write(lutrf) idum
      write(lutrf) idum
      dummy=0e0
      do 444 ii=1,5
       write(lutrf) dummy
 444   continue
C >>> read the trf values from temporary file
c       WRITE(LUTRF) 'C-SNAP'
c       WRITE(LUTRF) TNORM, TVERT, THORI
c       WRITE(LUTRF) TITLE
c       WRITE(LUTRF) SEGNO
c       WRITE(LUTRF) FF(1)
c       WRITE(LUTRF) SD
c       WRITE(LUTRF) PULRD(1), PULRD(2), NRCVRS
c       WRITE(LUTRF) NFFT, JFMIN, JFMAX, TSTEP, SECD(IOP,1)*1.0E-3,
c     &              SECD(IOP,3)*1.0E-3, NR
C  IGEOM IS FLAG FOR PLANE (1) OR CYLINDRICAL GEOMETRY (0)
c       WRITE(LUTRF) IFIX(PLANE)


       PRINT 830
       WRITE(LUPRT,830)
       NFREQ= JFMAX-JFMIN+1
       CALL SORTP(NRCVRS, NR, NFREQ, LUTRF, LUTLC,
     & WORK, IDUMMY)

       PRINT 916
      END IF


 6000 CONTINUE

      WRITE(LUPRT,334)   CPUINI
      TEMP= ETIME(CPSEC) - CPU000
      NHOUR= TEMP/3600.
      TLEFT= MOD(TEMP,3600.)
      NMIN= TLEFT/60.
      TSEC= MOD(TLEFT,60.)
      WRITE(LUPRT,342) TEMP, NHOUR, NMIN, TSEC

      STOP ' END OF  * MAIN *  '
      END