C
C    Routine COEF52
C    **************
C
C         Routine COEF52 is designed for the computation of the
C    displacement reflection/transmission coefficients (R/T
C    coefficients) of inhomogeneous P, SV and SH plane waves at a
C    stack of homogeneous isotropic dissipative layers between two
C    homogeneous isotropic dissipative halfspaces. The stack of
C    layers may be reduced to a single interface.
C         As special cases, it is also possible to compute the R/T
C    coefficients of pressure waves at a stack of liquid layers
C    between two liquid halfspaces, the R/T coefficients at a
C    surficial stack of layers, and the conversion coefficients
C    (receiver functions) at a free surface of the surficial
C    stack of layers. In all these cases, analogous R/T coefficients
C    for non-dissipative media may be also computed.
C         The routine is written in Fortran 77 programming language.
C
C    Calling:
C    ********
C    CALL COEF52(NC,NH,NQ,NUM,LIN,LOU,ANGLE,GAMMA,FREQ,RMOD,RPHASE,
C    RMOD0,RPH0)
C    Input parameters:
C    NC ..... Type of the R/T coefficient
C    NH ..... NH=0 ... the second halfspace is solid or liquid
C             NH=1 ... the second halfspace is a vacuum
C    NQ ..... NQ=0 ... model is non-dissipative
C             NQ=1 ... model is dissipative
C    NUM .... NUM=0 ... reading the model, no computations
C             NUM=1 ... computations of R/T coefficients
C    LIN .... Number of input file logical unit
C    LOU .... Number of output file logical unit
C    ANGLE .. Angle of incidence (in degrees)
C    GAMMA .. Attenuation angle of the incident inhomogeneous
C             plane wave (in degrees)
C    FREQ ... Frequency (in Hz)
C    Output parameters:
C    RMOD ... Modul of computed R/T coefficient
C    RPHASE.. Phase of computed R/T coefficient
C    RMOD0 .. Modul of analogous R/T coefficient for a single interface
C             between two non-dissipative halfspaces
C    RPH0 ... Phase of analogous R/T coefficient.
C    For NUM=0, all other parameters, with the exception of LIN and
C    LOU, may be arbitrary.
C
C    Specification of the model:
C    ***************************
C         The number of layers in the model (including both
C     halfspaces) is specified by NZ. For NZ=2, the two halfspaces
C     are in contact and the transition layer reduces to a single
C     interface. The layer number 1 corresponds to the incidence
C     (first) halfspace, the layer number NZ to the second halfspace.
C     For each layer (including halfspaces), the following
C     real-valued parameters should be specified:
C          VP ... P velocity (in km/s),
C          VS ... S velocity (in km/s),
C          RHO .. density (in g/cm**3),
C          QP ... quality factor of P waves,
C          QS ... quality factor of S waves,
C          D  ... thickness of the layer (in km).
C         The quality factors QP and QS of P and S waves are assumed
C    to be independent of frequency FREQ (constant-Q model).
C         The real-valued velocities VP and VS of P and S waves are
C    material properties of the model for the reference frequency
C    FREF. They correspond to the real parts of the Lame's elastic
C    moduli for the reference frequency FREF. For known VP(FREF),
C    VS(FREF), QP and QS, the frequency-dependent complex valued
C    velocities CVP(FREQ) and CVS(FREQ) of P and S waves for the
C    constant Q model are given by relations
C    CVP(FREQ) = VP(FREF)*(1.+ln(FREQ/FREF)/(pi*QP) - i/(2.*QP)),
C    CVS(FREQ) = VS(FREF)*(1.+ln(FREQ/FREF)/(pi*QS) - i/(2.*QS)).
C    The frequency-dependent real-valued velocities VP(FREQ) and
C    VS(FREQ) equal the real parts of CVP(FREQ) and CVS(FREQ).
C    They specify the velocity dispersion.
C         In both halfspaces, the thicknesses (D(1) and D(NZ)) may
C    be taken arbitrarily; they are automatically adjusted to zero.
C         For pressure waves in liquid media, VS and QS are not used
C    in the computations. The values of VS and QS may be specified
C    arbitrarily in this case.
C         For SH waves, VP and QP are not used in the computations.
C    The values of VP and QP may be specified arbitrarily in this case.
C         For non-dissipative media (NQ=0), QP and QS are not used
C    in computations. The values of QP and QS may be specified
C    arbitrarily in this case.
C         If the second halfspace represents a vacuum (NH=1),
C    the density  in the second halfspace is automatically adjusted
C    to zero. Similarly, the velocities VP and VS are adjusted to 0.001.
C         For NUM=0, routine COEF52 reads the input data for the
C    model (including the reference frequency FREF), and does not
C    perform any computations. For NUM=1, the computation of the R/T
C    coefficients is performed, for the known model.
C
C    Type of R/T coefficients.
C    *************************
C         The type of the R/T coefficient we wish to compute is
C    specified by NC (input parameter of COEF52). The following
C    table shows the values of NC for individual  R/T coefficients:
C    a) P/SV waves, solids:
C    P1P1...1     P1S1...2     P1P2...3     P1S2...4
C    S1P1...5     S1S1...6     S1P2...7     S1S2...8
C    b) SH waves, solids:
C    S1S1...9     S1S2...10
C    c) Pressure waves, liquids:
C    P1P1...13    P1P2...14
C    For example, P1S1 (NC=2) corresponds to the reflection
C    coefficient, for incident P wave and reflected S wave.
C    Similarly, S1P2 (NC=7) corresponds to the transmission
C    coefficient, for incident S wave and transmitted P wave.
C         The second halfspace may be solid or liquid (NH=0) or
C    a vacuum (NH=1). For NH=1, the interface between the (NZ-1)-th
C    layer and the NZ-th layer (second halfspace) represents a free
C    surface, e.g. the surface of the Earth. For NH=1, the reflection
C    coefficients P1P1, P1S1, S1P1 and S1S1 have a standard meaning.
C    The  physical meaning of the transmission coefficients P1P2,
C    P1S2, S1P2 and S1S2 for NH=1 is, however, different. They
C    give the so-called conversion coefficients, also called receiver
C    functions:
C         For NH=1:   P1P2=PZ, P1S2=PX, S1P2=SZ, S1S2=SX.
C    The conversion coefficients (receiver functions) represent
C    horizontal or vertical displacement components of the free surface
C    (top of the stack of layers) due to a plane wave incident on the
C    bottom of the stack of layers from below. In the notation PZ, PX,
C    SZ and SX for the conversion coefficients, the first letter
C    specifies the incident wave (P or S), and the second letter the
C    Cartesian component of the displacement vector (X or Z). The
C    Cartesian axis X is horizontal, tangential to the free surface,
C    situated in the plane of incidence, oriented "against" the
C    direction of propagation. (For the X-axis oriented "along" the
C    direction of propagation, we must take opposite signs of PX and
C    SX.) The Cartesian axis Z is vertical, perpendicular to the
C    interface, and oriented away from the transition layer. For SH
C    waves and NH=1, the R/T coefficient S1S2 represents the conversion
C    coefficient SY. The Cartesian axis Y is horizontal, perpendicular
C    to the plane of incidence.
C
C    Incident wave:
C    **************
C         In dissipative media, the slowness vector of the incident
C    wave is complex-valued. The real part of the slowness vector
C    is called the propagation vector, and its imaginary part the
C    attenuation vector. The plane of incidence is specified by the
C    normal vector to the interface(s) and by the propagation vector.
C    The attenuation vector of the incident wave is assumed to be
C    situated in the plane of incidence. The direction of the
C    propagation vector is specified by the real-valued angle of
C    incidence ANGLE, and the direction of the attenuation vector is
C    specified by the real-valued attenuation angle GAMMA. The angles
C    ANGLE and GAMMA are input parameters of COEF52. ANGLE represents
C    the acute angle between the propagation vector of the incident
C    wave and normal to the interface. It is specified in degrees, and
C    should be in the range <0.,90.>. The attenuation angle is the
C    angle between the propagation and attenuation vectors of the
C    incident wave, is specified in degrees, and should be in the
C    range (-90.,90.). It is positive if the attenuation vector is
C    pointing to the left from the propagation vector.
C        The complex-valued polarisation vector of the incident P
C    wave is proportional to the slowness vector. The complex-valued
C    polarisation vector of the incident SV wave is perpendicular to
C    the slowness vector (in the complex sense), and its real part is
C    oriented to the left from the propagation vector. The polarisation
C    vector of the incident SH wave is perpendicular to the plane of
C    incidence. Analogous orientation  of polarisation vectors is used
C    even for R/T waves. Consequently, the R/T coefficients are
C    independent of the used coordinate system.
C         For given NC, NH, NQ, ANGLE, GAMMA, and FREQ, and for a
C    given model, the routine COEF52 returns the complex-valued
C    R/T coefficient RCOEF. RCOEF is expressed in terms of its modulus
C    RMOD and phase RPHASE. Both RMOD and RPHASE are real-valued.
C    RPHASE is specified in the range <-180.,180.>.
C         The time factor of the incident wave is exp(-i*omega*t),
C    where t is running time and omega=2.*pi*FREQ. For the time factor
C    exp(i*omega*t), it would be necessary to change the sign of
C    RPHASE.
C         For RMOD=0., RPHASE cannot be computed. Consequently,
C    COEF52 returns 'the warning' RPHASE=999 for RMOD<0.00001. In
C    plotting RPHASE, the points with RPHASE=999 should be ignored.
C         In each computation, also quantities RMOD0 and RPH0 are
C    computed, in addition to RMOD and RPHASE. They correspond to the
C    same R/T coefficient as RMOD and RPHASE, but to the plane
C    interface between the two non-dissipative halfspaces (NZ=2, NQ=0).
C
C    Routines used
C    *************
C         For matrix computations of R/T coefficients for P and SV
C    waves, routine RTMATQ is used in dissipative media, and routine
C    RTMAT in non-dissipative media. They further use routines RTQ,
C    RT, etc.
C         For matrix computation of R/T coefficients of SH waves and
C    for pressure waves in liquids, routine RTMQ2 is used in
C    dissipative media, and routine RTM2 in non-dissipative media.
C         For comparisons, R/T coefficients at a single interface
C    between two non-dissipative media (NZ=2, NQ=0), are computed
C    in routine COEF8, using explicit (non-matrix) expressions for
C    R/T coefficients.
C         Routine CRITAN tests a possible existence of nonelastic
C    discrete critical angles, and computes them if they exist.
C    Nonelastic discrete critical angles correspond to angles of
C    incidence for which both the real and imaginary parts of the
C    vertical component of the slowness vector of any R/T wave in the
C    dissipative model under consideration vanish. The R/T coefficients
C    may display anomalous jumps at the discrete critical angles. The
C    application of CRITAN removes such jumps, see Brokesova and
C    Cerveny (1998). In COEF52, routine CRITAN is applied only if NZ=2,
C    not for NZ.GT.2. Note that the anomalous behaviour of R/T
C    coefficients was also observed in the so-called Rayleigh window.
C    These cases will be subjects of further investigation.
C         Routines RTMAT and RTMATQ are modifications of analogous
C    routines, written by G. Muller, used in his reflectivity packages,
C    and described in the paper Muller (1985). The recursive algorithm
C    is used to compute the R/T coefficients. The potential R/T
C    coefficients, computed by Muller, are adjusted to displacement
C    R/T coefficients, considered here. Although G.Muller
C    considers the time convention exp(i*omega*t), the resulting phase
C    is adjusted to our time convention exp(-i*omega*t). Moreover,
C    inhomogeneous plane incident waves with arbitrary attenuation
C    angles are introduced. The routines are used in COEF52 with the
C    author's permission.
C         Routine COEF8 is a modification of an analogous routine,
C    used in the program package SEIS88 by V. Cerveny and I. Psencik.
C    See explicit analytical expressions for the coefficients in
C    Cerveny (2001). The book also displays pictures of many R/T
C    coefficients at a single interface between two non-dissipative
C    halfspaces.
C         Routine COEF52 itself is a modification of the routine FDEP,
C    used in the program package BEAM87 by V.Cerveny to study the
C    propagation of Gaussian beams in complex, 2-D, laterally varying
C    layered structures, containing thin stacks of layers. See
C    Cerveny (1989).
C         The theoretical treatment of reflection and transmission of
C    inhomogeneous plane waves at a single interface between two
C    dissipative elastic halfspaces can be found in Brokesova and
C    Cerveny (1998). The reference also offers a more detailed
C    description of routine COEF52 and presents numerous examples
C    of R/T coefficients. See also Brokesova (2001).
C
C    Demonstration program for testing
C    *********************************
C         For testing purposes, a brief main program
C    RTCOEF is included.
C
C    References
C    **********
C    Brokesova,J. (2000). Reflection/transmission coefficients at a
C         plane interface in dissipative and non-dissipative media:
C         A comparison. J.Comput.Acoustics, 9,623 -641.
C    Brokesova,J., and Cerveny,V. (1998). Inhomogeneous plane waves
C         in dissipative, isotropic and anisotropic media. Reflection/
C         transmission coefficients. In Seismic waves in complex 3-D
C         structures, Report No. 7, pp. 57 - 146. Department of
C         Geophysics, Charles University, Prague.
C    Cerveny,V. (1989). Synthetic body wave seismograms for laterally
C         varying media containing thin transition layers. Geophys. J.
C         Int., 99, 331-349,
C    Cerveny,V. (2001). Seismic ray theory. Cambridge Univ. Press,
C         Cambridge.
C    Muller,G. (1985). The reflectivity method. A tutorial. J.Geophys.,
C         58, 153-174.
C
C
C    Consortium Project "Seismic Waves
C    in Complex 3-D Structures"
C    Praha, April 2003
C    J.Brokesova, V.Cerveny
C
*********************************************************************
c
      subroutine coef52(nc,nh,nq,num,lin,lou,angle,gamma,freq,rmod,
     1rphase,rmod0,rph0)
      complex rpp,rps,rss,rsp,tpp,tps,tss,tsp,rcoef,rp,tp,rs,ts,cunit,
     1u
      common/model/nz,vp(50),vs(50),rho(50),d(50),qp(50),qs(50),fref,
     1rho2,vp2,vs2,qp2,qs2
c
      cunit=(0.,1.)
      pi=3.141593
      ang=angle*pi/180.
      gam=gamma*pi/180.
      inc=0
      if(nc.gt.4.and.nc.lt.11)inc=1
      ntype=2
      if(nc.ge.13)ntype=0
      if(nc.gt.8.and.nc.lt.13)ntype=1
      if(num.eq.1)go to 20
c
c     reading the model
      read(lin,100)nz
      write(lou,100)nz
      do 1 i=1,nz
      read(lin,101)vp(i),vs(i),rho(i),qp(i),qs(i),d(i)
      write(lou,101)vp(i),vs(i),rho(i),qp(i),qs(i),d(i)
    1 continue
      read(lin,101)fref
      write(lou,101)fref
      rho2=rho(nz)
      vp2=vp(nz)
      vs2=vs(nz)
      d(1)=0.
      d(2)=0.
      return
c
   20 cvr=0.
      if(nq.eq.1)cvr=alog(freq/fref)/pi
      if(nh.eq.1)go to 21
      vp(nz)=vp2
      vs(nz)=vs2
      rho(nz)=rho2
      go to 24
   21 vp(nz)=0.001
      vs(nz)=0.001
      rho(nz)=0.
   24 continue
c
c     computation of the tangential component of the slowness vector
c     of the incident wave
      if(inc.eq.1)go to 22
      v1=vp(1)
      q1=qp(1)
      urr=1./v1
      if(nq.eq.0)go to 23
      v1=vp(1)*(1.+cvr/qp(1))
      go to 23
   22 v1=vs(1)
      q1=qs(1)
      urr=1./v1
      if(nq.eq.0)go to 23
      v1=vs(1)*(1.+cvr/qs(1))
   23 vv1=v1*v1
      par=1/v1
      ur=par*sin(ang)
      urr=urr*sin(ang)
      if(nq.eq.0)go to 26
      gaux=1./(q1*q1*cos(gam)*cos(gam))
      gg=sqrt(gaux+1.)
      g1=sqrt(gg+1.)
      g2=sqrt(gg-1.)
      u=(g1*sin(ang)-cunit*g2*sin(ang-gam))/sqrt(2.*vv1*(1.+
     *1./(q1*q1)))
c
c     computation of R/T coefficients
   26 continue
      call coef8(urr,vp(1),vs(1),rho(1),vp(nz),vs(nz),rho(nz),nc,
     1rmod0,rph0)
      rph0=rph0*180./pi
   31 if(ntype.eq.2)go to 33
      if(nq.eq.1)go to 32
      call rtmat2(nz,vp,vs,rho,d,ur,freq,rp,tp,rs,ts,ntype,nc,rcoef)
      go to 40
   32 call rtmq2(fref,nz,vp,vs,rho,qp,qs,d,u,freq,rp,tp,rs,ts,ntype,
     1nc,rcoef,v1,q1,ang,gam)
      go to 40
   33 if(nq.eq.1)go to 34
      call rtmat(nz,vp,vs,rho,d,ur,freq,rpp,rps,rss,rsp,tpp,tps,tss,
     1tsp,nc,rcoef)
      go to 40
   34 call rtmatq(fref,nz,vp,vs,rho,qp,qs,d,u,freq,rpp,rps,rss,rsp,tpp,
     1tps,tss,tsp,nc,rcoef,v1,q1,ang,gam)
c
   40 b=real(rcoef)
      c=-aimag(rcoef)
      rmod=sqrt(b*b+c*c)
      if(rmod.lt.0.00001)go to 41
      rphase=atan2(c,b)*180./pi
      go to 42
   41 rphase=999.
c
  100 format(8i5)
  101 format(8f10.3)
   42 return
      end
C
C*********************************************************************
c
      SUBROUTINE RTMAT2(N,A,B,RHO,D,U,FREQ,RP,TP,RS,TS,NTYPE,NC,
     1                  RCOEF)
C
C     R/T COEFFICIENTS AT A STACK OF LAYERS FOR  PRESSURE WAVES IN
C     LIQUIDS AND FOR SH WAVES IN NON-DISSIPATIVE MEDIA
C
C     NTYPE=0....PRESSURE WAVES, LIQUID
C     NTYPE=1....SH WAVES
C
C
      DIMENSION A(N),B(N),RHO(N),D(N)
      COMPLEX RPD,RPU,TPD,TPU,RP,TP,RSD,RSU,TSD,TSU,RS,TS,
     1        A1,A2,B1,B2,AA,EP,ES,DD,FF,RCOEF
C
C
      UQ=U*U
      W=6.283185*FREQ
      M=N-1
      X=-W*D(M)
      IF(NTYPE.EQ.1)GO TO 5
C
C     PRESSURE WAVES, LIQUID
C
      AQ1=1./(A(M)*A(M))
      RHO1=RHO(M)
      AQ2=1./(A(N)*A(N))
      RHO2=RHO(N)
      V=SQRT(ABS(AQ1-UQ))
      ARG=X*V
      A1=CMPLX(V,0.)
      if(uq.gt.aq1)a1=cmplx(0.,-v)
      IF(UQ.LE.AQ1)EP=CMPLX(COS(ARG),SIN(ARG))
      IF(UQ.GT.AQ1)EP=CMPLX(EXP(ARG),0.)
      V=SQRT(ABS(AQ2-UQ))
      A2=CMPLX(V,0.)
      IF(UQ.GT.AQ2)A2=CMPLX(0.,-V)
      AA=RHO2*A1+RHO1*A2
      RPD=(RHO2*A1-RHO1*A2)/AA
      RPU=-RPD
      TPD=2.*RHO2*A1/AA
      TPU=2.*RHO1*A2/AA
      RP=RPD*EP*EP
      TP=TPD*EP
      GO TO 10
C
C     SH WAVES
C
   5  BQ1=1./(B(M)*B(M))
      Z1=RHO(M)*B(M)*B(M)
      BQ2=1./(B(N)*B(N))
      Z2=RHO(N)*B(N)*B(N)
      V=SQRT(ABS(BQ1-UQ))
      ARG=X*V
      B1=CMPLX(V,0.)
      IF(UQ.LE.BQ1)ES=CMPLX(COS(ARG),SIN(ARG))
      IF(UQ.GT.BQ1)B1=CMPLX(0.,-V)
      IF(UQ.GT.BQ1)ES=CMPLX(EXP(ARG),0.)
      V=SQRT(ABS(BQ2-UQ))
      B2=CMPLX(V,0.)
      IF(UQ.GT.BQ2)B2=CMPLX(0.,-V)
      AA=Z1*B1+Z2*B2
      RSD=(Z1*B1-Z2*B2)/AA
      RSU=-RSD
      TSD=2.*Z1*B1/AA
      TSU=2.*Z2*B2/AA
      RS=RSD*ES*ES
      TS=TSD*ES
C
C     MATRIX MULTIPLICATION FOR LAYERED MEDIUM
C
  10  IF(N.EQ.2)GO TO 1001
      II=N-2
      DO 1000 I=II,1,-1
      M=I+1
      X=-W*D(I)
      IF(NTYPE.EQ.1)GO TO 15
      AQ1=1./(A(I)*A(I))
      RHO1=RHO(I)
      AQ2=1./(A(M)*A(M))
      RHO2=RHO(M)
      V=SQRT(ABS(AQ1-UQ))
      ARG=X*V
      IF(UQ.LE.AQ1)EP=CMPLX(COS(ARG),SIN(ARG))
      IF(UQ.GT.AQ1)EP=CMPLX(EXP(ARG),0.)
      A1=CMPLX(V,0.)
      IF(UQ.GT.AQ1)A1=CMPLX(0.,-V)
      V=SQRT(ABS(AQ2-UQ))
      A2=CMPLX(V,0.)
      IF(UQ.GT.AQ2)A2=CMPLX(0.,-V)
      AA=RHO2*A1+RHO1*A2
      RPD=(RHO2*A1-RHO1*A2)/AA
      RPU=-RPD
      TPD=2.*RHO2*A1/AA
      TPU=2.*RHO1*A2/AA
      DD=1.-RPU*RP
      RP=(RPD+TPU*TPD*RP/DD)*EP*EP
      IF(I.EQ.1)FF=TPD/DD
      IF(I.GT.1)FF=TPD*EP/DD
      TP=FF*TP
      GO TO 1000
  15  BQ1=1./(B(I)*B(I))
      Z1=RHO(I)*B(I)*B(I)
      BQ2=1./(B(M)*B(M))
      Z2=RHO(M)*B(M)*B(M)
      V=SQRT(ABS(BQ1-UQ))
      ARG=X*V
      IF(UQ.LE.BQ1)ES=CMPLX(COS(ARG),SIN(ARG))
      IF(UQ.GT.BQ1)ES=CMPLX(EXP(ARG),0.)
      B1=CMPLX(V,0.)
      IF(UQ.GT.BQ1)B1=CMPLX(0.,-V)
      V=SQRT(ABS(BQ2-UQ))
      B2=CMPLX(V,0.)
      IF(UQ.GT.BQ2)B2=CMPLX(0.,-V)
      AA=Z1*B1+Z2*B2
      RSD=(Z1*B1-Z2*B2)/AA
      RSU=-RSD
      TSD=2.*Z1*B1/AA
      TSU=2.*Z2*B2/AA
      DD=1.-RSU*RS
      RS=(RSD+TSU*TSD*RS/DD)*ES*ES
      IF(I.EQ.1)FF=TSD/DD
      IF(I.GT.1)FF=TSD*ES/DD
      TS=FF*TS
C
 1000 CONTINUE
 1001 CONTINUE
      if(nc.eq.9)rcoef=rs
      if(nc.eq.10)rcoef=ts
      if(nc.eq.13)rcoef=rp
      if(nc.eq.14)rcoef=tp
C
      RETURN
      END
c
c********************************************************************
c
      SUBROUTINE rtmq2(FR,N,A,B,RHO,QA,QB,D,U,FREQ,RP,TP,RS,TS,NTYPE,
     1                   nc,rcoef,v1,q1,aincr,gamma)
C
C     R/T COEFFICIENTS AT A TRANSITION LAYER FOR PRESSURE WAVES
C     IN LIQUIDS AND FOR SH WAVES IN DISSIPATIVE MEDIA
C
C     NTYPE=0....PRESSURE WAVES, LIQUID
C     NTYPE=1....SH WAVES
C
      DIMENSION A(N),B(N),RHO(N),D(N),QA(N),QB(N)
      COMPLEX RPD,RPU,TPD,TPU,RP,TP,RSD,RSU,TSD,TSU,RS,TS,EIN,
     1        A1,A2,B1,B2,AA,EP,ES,Z1,Z2,CW,CV,aq1,aq2,bq1,bq2,rcoef,
     2        DD,FF,U,UQ
C
      UQ=U*U
      WR=6.283185*FR
      EIN=CMPLX(0.,1.)
      W=6.283185*FREQ
      CW=W
      CV=ALOG(W/WR)/3.141593+0.5*EIN
      M=N-1
      IF(NTYPE.EQ.1)GO TO 5
C
C     PRESSURE WAVES, DISSIPATIVE LIQUIDS
C
      RHO1=RHO(M)
      AQ1=A(M)*(1.+CV/QA(M))
      AQ1=1./(AQ1*AQ1)
      A1=CSQRT(AQ1-UQ)
      RHO2=RHO(N)
      AQ2=A(N)*(1.+CV/QA(N))
      AQ2=1./(AQ2*AQ2)
      A2=CSQRT(AQ2-UQ)
c
      if(n.gt.2)go to 1
      cvr=alog(w/wr)/3.14159
      va1=a(m)*(1.+cvr/qa(m))
      qa1=qa(m)
      va2=a(n)*(1.+cvr/qa(n))
      qa2=qa(n)
        call critan(v1,va1,q1,qa1,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)a1=-a1
        endif
        call critan(v1,va2,q1,qa2,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)a2=-a2
        endif
    1 continue
c
      AA=RHO2*A1+RHO1*A2
      RPD=(RHO2*A1-RHO1*A2)/AA
      RPU=-RPD
      TPD=2.*RHO2*A1/AA
      TPU=2.*RHO1*A2/AA
      EP=CEXP(-D(M)*CW*EIN*A1)
      RP=RPD*EP*EP
      TP=TPD*EP
      GO TO 10
C
C     SH WAVES, DISSIPATIVE MEDIA
C
   5  continue
      BQ1=B(M)*(1.+CV/QB(M))
      BQ1=1./(BQ1*BQ1)
      B1=CSQRT(BQ1-UQ)
      Z1=RHO(M)/BQ1
      BQ2=B(N)*(1.+CV/QB(N))
      BQ2=1./(BQ2*BQ2)
      B2=CSQRT(BQ2-UQ)
      Z2=RHO(N)/BQ2
c
      if (n.gt.2)go to 2
      cvr=alog(w/wr)/3.141593
      vb1=b(m)*(1.+cvr/qb(m))
      qb1=qb(m)
      vb2=b(n)*(1.+cvr/qb(n))
      qb2=qb(n)
        call critan(v1,vb1,q1,qb1,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)b1=-b1
        endif
        call critan(v1,vb2,q1,qb2,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)b2=-b2
        endif
    2 continue
c
      AA=Z1*B1+Z2*B2
      RSD=(Z1*B1-Z2*B2)/AA
      RSU=-RSD
      TSD=2.*Z1*B1/AA
      TSU=2.*Z2*B2/AA
      ES=CEXP(-D(M)*CW*EIN*B1)
      RS=RSD*ES*ES
      TS=TSD*ES
C
C     MATRIX MULTIPLICATION FOR LAYERED MEDIUM
C
  10  IF(N.EQ.2)GO TO 1001
      II=N-2
      DO 1000 I=II,1,-1
      M=I+1
      IF(NTYPE.EQ.1)GO TO 15
      AQ1=A(I)*(1.+CV/QA(I))
      AQ1=1./(AQ1*AQ1)
      RHO1=RHO(I)
      AQ2=A(M)*(1.+CV/QA(M))
      AQ2=1./(AQ2*AQ2)
      RHO2=RHO(M)
      A1=CSQRT(AQ1-UQ)
      A2=CSQRT(AQ2-UQ)
      AA=RHO2*A1+RHO1*A2
      RPD=(RHO2*A1-RHO1*A2)/AA
      RPU=-RPD
      TPD=2.*RHO2*A1/AA
      TPU=2.*RHO1*A2/AA
      EP=CEXP(-D(I)*CW*EIN*A1)
      DD=1.-RPU*RP
      RP=(RPD+TPU*TPD*RP/DD)*EP*EP
      IF(I.EQ.1)FF=TPD/DD
      IF(I.GT.1)FF=TPD*EP/DD
      TP=FF*TP
      GO TO 1000
  15  BQ1=B(I)*(1.+CV/QB(I))
      BQ1=1./(BQ1*BQ1)
      Z1=RHO(I)/BQ1
      BQ2=B(M)*(1.+CV/QB(M))
      BQ2=1./(BQ2*BQ2)
      Z2=RHO(M)/BQ2
      B1=CSQRT(BQ1-UQ)
      B2=CSQRT(BQ2-UQ)
      AA=Z1*B1+Z2*B2
      RSD=(Z1*B1-Z2*B2)/AA
      RSU=-RSD
      TSD=2.*Z1*B1/AA
      TSU=2.*Z2*B2/AA
      ES=CEXP(-D(I)*CW*EIN*B1)
      DD=1.-RSU*RS
      RS=(RSD+TSU*TSD*RS/DD)
      IF(I.EQ.1)FF=TSD/DD
      IF(I.GT.1)FF=TSD*ES/DD
      TS=FF*TS
C
 1000 CONTINUE
 1001 CONTINUE
      if(nc.eq.9)rcoef=rs
      if(nc.eq.10)rcoef=ts
      if(nc.eq.13)rcoef=rp
      if(nc.eq.14)rcoef=tp
C
      RETURN
      END
c
c*********************************************************************
c
        SUBROUTINE RTMAT(N,A,B,RHO,D,U,FRQ,RPP,RPS,RSS,RSP,
     *  TPP,TPS,TSS,TSP,NC,RCOEF)
C
C       P/SV REFLECTION AND TRANSMISSION COEFFICIENTS FOR A
C       NON-DISSIPATIVE TRANSITION LAYER, USING RECURSIVE FORMALISM
C
C       N = NUMBER OF LAYERS (HALFSPACES INCLUDED)
C       A,B,RHO,D = MODEL
C       U = TANGENTIAL SLOWNESS
C       FRQ = FREQUENCY
C       RCOEF = COMPLEX-VALUED R/T COEFFICIENT OF THE TYPE NC
C
        DIMENSION A(1),B(1),RHO(1),D(1)
        COMPLEX RPP,RPS,RSS,RSP,TPP,TPS,TSS,TSP,MU11,MU12,MU21,MU22,
     *  RPPD,RSPD,RPSD,RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,
     *  TPPU,TSPU,TPSU,TSSU,F11,F12,F21,F22,G11,G12,G21,G22,H11,H12,
     *  H21,H22,I11,I12,I21,I22,EP,ES,EX,rcoef
        M=N-1
        AQ1=1./(A(M)*A(M))
        BQ1=1./(B(M)*B(M))
        RHO1=RHO(M)
        AQ2=1./(A(N)*A(N))
        BQ2=1./(B(N)*B(N))
        RHO2=RHO(N)
        C=2.*(RHO1/BQ1-RHO2/BQ2)
        CALL RT(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,MU11,MU12,MU21,MU22,
     *  TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,TPSU,TSSU)
        W=6.283185*FRQ
        UQ=U*U
        CALL PHASE(UQ,W,AQ1,BQ1,D(M),EP,ES)
        EX=EP*ES
        RPP=MU11*EP*EP
        RSP=MU12*EX
        RPS=MU21*EX
        RSS=MU22*ES*ES
        TPP=TPPD*EP
        TSP=TSPD*ES
        TPS=TPSD*EP
        TSS=TSSD*ES
        IF(N.EQ.2)  go to 1001
        II=N-2
        DO  1000  I=II,1,-1
        M=I+1
        AQ1=1./(A(I)*A(I))
        BQ1=1./(B(I)*B(I))
        RHO1=RHO(I)
        AQ2=1./(A(M)*A(M))
        BQ2=1./(B(M)*B(M))
        RHO2=RHO(M)
        C=2.*(RHO1/BQ1-RHO2/BQ2)
        CALL RT(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,RPPD,RSPD,RPSD,RSSD,
     *  TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,TPSU,TSSU)
        CALL MULMAT(RPP,RSP,RPS,RSS,TPPD,TSPD,TPSD,TSSD,G11,G12,G21,
     *  G22)
        CALL MULMAT(RPP,RSP,RPS,RSS,RPPU,RSPU,RPSU,RSSU,H11,H12,H21,
     *  H22)
        H11=1.-H11
        H12=-H12
        H21=-H21
        H22=1.-H22
        CALL MATINV(H11,H12,H21,H22,I11,I12,I21,I22)
        CALL MULMAT(I11,I12,I21,I22,G11,G12,G21,G22,H11,H12,H21,H22)
        CALL MULMAT(TPPU,TSPU,TPSU,TSSU,H11,H12,H21,H22,G11,G12,G21,
     *  G22)
        MU11=RPPD+G11
        MU12=RSPD+G12
        MU21=RPSD+G21
        MU22=RSSD+G22
        CALL MULMAT(RPPU,RSPU,RPSU,RSSU,RPP,RSP,RPS,RSS,G11,G12,G21,
     *  G22)
        G11=1.-G11
        G12=-G12
        G21=-G21
        G22=1.-G22
        CALL MATINV(G11,G12,G21,G22,H11,H12,H21,H22)
        CALL MULMAT(H11,H12,H21,H22,TPPD,TSPD,TPSD,TSSD,G11,G12,G21,
     *  G22)
        CALL PHASE(UQ,W,AQ1,BQ1,D(I),EP,ES)
        F11=G11*EP
        F12=G12*ES
        F21=G21*EP
        F22=G22*ES
        CALL MULMAT(TPP,TSP,TPS,TSS,F11,F12,F21,F22,G11,G12,G21,G22)
        TPP=G11
        TSP=G12
        TPS=G21
        TSS=G22
        EX=EP*ES
        RPP=MU11*EP*EP
        RSP=MU12*EX
        RPS=MU21*EX
1000    RSS=MU22*ES*ES
1001    CONTINUE
        if(nc.eq.1)rcoef=rpp
        if(nc.eq.2)rcoef=-a(1)*rps/b(1)
        if(nc.eq.3)rcoef=a(1)*tpp/a(n)
        if(nc.eq.4)rcoef=-a(1)*tps/b(n)
        if(nc.eq.5)rcoef=-b(1)*rsp/a(1)
        if(nc.eq.6)rcoef=rss
        if(nc.eq.7)rcoef=-b(1)*tsp/a(n)
        if(nc.eq.8)rcoef=b(1)*tss/b(n)
        return
        END
C
C******************************************************************
C
        SUBROUTINE RT(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,RPPD,RSPD,RPSD,
     *  RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,
     *  TPSU,TSSU)
C
C       A ROUTINE TO RTMAT.
C       MATRICES OF R/T COEFFICIENTS AT A SINGLE INTERFACE BETWEEN
C       TWO HALFSPACES
C
        COMPLEX RPPD,RSPD,RPSD,RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,
     *  RPSU,RSSU,TPPU,TSPU,TPSU,TSSU,A1,B1,A2,B2,D1D,D2D,D1U,D2U,
     *  D,A1B1,A2B2,A1B2,A2B1,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10
        UQ=U*U
        V=SQRT(ABS(AQ1-UQ))
        A1=CMPLX(V,0.)
        IF(UQ.GT.AQ1)  A1=CMPLX(0.,-V)
        V=SQRT(ABS(BQ1-UQ))
        B1=CMPLX(V,0.)
        IF(UQ.GT.BQ1)  B1=CMPLX(0.,-V)
        V=SQRT(ABS(AQ2-UQ))
        A2=CMPLX(V,0.)
        IF(UQ.GT.AQ2)  A2=CMPLX(0.,-V)
        V=SQRT(ABS(BQ2-UQ))
        B2=CMPLX(V,0.)
        IF(UQ.GT.BQ2)  B2=CMPLX(0.,-V)
        C0=C*UQ
        C1=C0-RHO1
        C2=C0+RHO2
        C3=C1+RHO2
        A1B1=A1*B1
        A2B2=A2*B2
        A1B2=A1*B2
        A2B1=A2*B1
        RHO12=RHO1*RHO2
        T1=C1*C1*A2B2+RHO12*A2B1
        T2=C2*C2*A1B1+RHO12*A1B2
        T3=C3*C3*UQ
        T4=C*C0*A1B1*A2B2
        D1D=T3+T1
        D2D=T4+T2
        D=D1D+D2D
        D1U=T3+T2
        D2U=T4+T1
        T5=2./D
        T6=A1*T5
        T7=B1*T5
        T8=A2*T5
        T9=B2*T5
        RPPD=(D2D-D1D)/D
        RPPU=(D2U-D1U)/D
        T10=U*(C3*C2+C*C1*A2B2)
        RPSD=-T6*T10
        RSPD=T7*T10
        T10=RHO12*(A1B2-A2B1)*T5
        RSSD=RPPD-T10
        RSSU=RPPU+T10
        T10=U*(C3*C1+C*C2*A1B1)
        RPSU=T8*T10
        RSPU=-T9*T10
        T10=C2*B1-C1*B2
        TPPD=RHO1*T6*T10
        TPPU=RHO2*T8*T10
        T10=U*(C3+C*A2B1)
        TPSD=-RHO1*T6*T10
        TSPU=RHO2*T9*T10
        T10=C2*A1-C1*A2
        TSSD=RHO1*T7*T10
        TSSU=RHO2*T9*T10
        T10=U*(C3+C*A1B2)
        TSPD=RHO1*T7*T10
        TPSU=-RHO2*T8*T10
        RETURN
        END
C
C******************************************************************
C
        SUBROUTINE MULMAT(A11,A12,A21,A22,B11,B12,B21,B22,C11,C12,
     *  C21,C22)
C
C       A ROUTINE TO RTMAT AND RTMATQ.
C       MATRIX MULTIPLICATION
C
        COMPLEX A11,A12,A21,A22,B11,B12,B21,B22,C11,C12,C21,C22
        C11=A11*B11+A12*B21
        C12=A11*B12+A12*B22
        C21=A21*B11+A22*B21
        C22=A21*B12+A22*B22
        RETURN
        END
C
C******************************************************************
C
        SUBROUTINE MATINV(A11,A12,A21,A22,B11,B12,B21,B22)
C
C       A ROUTINE TO RTMAT AND RTMATQ.
C       MATRIX INVERSION
C
        COMPLEX A11,A12,A21,A22,B11,B12,B21,B22,D
        D=1./(A11*A22-A12*A21)
        B11=A22*D
        B12=-A12*D
        B21=-A21*D
        B22=A11*D
        RETURN
        END
C
C******************************************************************
C
       SUBROUTINE PHASE(UQ,W,AQ,BQ,D,EP,ES)
C
C      A ROUTINE TO RTMAT AND RTMATQ
C
        COMPLEX EP,ES
        X=-W*D
        V=SQRT(ABS(AQ-UQ))
        A=X*V
        IF(UQ.GT.AQ)  GO TO 100
        EP=CMPLX(COS(A),SIN(A))
        GO TO 200
100     EP=CMPLX(EXP(A),0.)
200     V=SQRT(ABS(BQ-UQ))
        A=X*V
        IF(UQ.GT.BQ)  GO TO 300
        ES=CMPLX(COS(A),SIN(A))
        GO TO 400
300     ES=CMPLX(EXP(A),0.)
400     RETURN
        END
C
C     ***********************************************************
C
      SUBROUTINE COEF8(P,VP1,VS1,RO1,VP2,VS2,RO2,NCODE,RMOD,RPH)
C
C     ROUTINE COEF8 IS DESIGNED FOR THE COMPUTATION OF REFLECTION
C     AND TRANSMISSION COEFFICIENTS OF P, SV AND SH PLANE WAVES
C     AT A SINGLE PLANE INTERFACE BETWEEN TWO HOMOGENEOUS
C     NON-DISSIPATIVE SOLID HALFSPACES OR AT A FREE SURFACE OF A
C     NON-DISSIPATIVE HOMOGENEOUS SOLID HALFSPACE. EXPLICIT EQUATIONS
C     ARE USED. ALSO PRESSURE WAVES IN LIQUIDS ARE CONSIDERED.
C
      COMPLEX B(4),RR,C1,C2,C3,C4,H1,H2,H3,H4,H5,H6,H,HB,HC
      DIMENSION PRMT(4),D(4),DD(4)
C
      AUX=999.*3.14159/180.
      IF(NCODE.GE.9)GO TO 300
      IF(RO2.LT.0.0001)GO TO 150
      PRMT(1)=VP1
      PRMT(2)=VS1
      PRMT(3)=VP2
      PRMT(4)=VS2
      A1=VP1*VS1
      A2=VP2*VS2
      A3=VP1*RO1
      A4=VP2*RO2
      A5=VS1*RO1
      A6=VS2*RO2
      Q=2.*(A6*VS2-A5*VS1)
      PP=P*P
      QP=Q*PP
      X=RO2-QP
      Y=RO1+QP
      Z=RO2-RO1-QP
      G1=A1*A2*PP*Z*Z
      G2=A2*X*X
      G3=A1*Y*Y
      G4=A4*A5
      G5=A3*A6
      G6=Q*Q*PP
      DO 21 I=1,4
      DD(I)=P*PRMT(I)
   21 D(I)=SQRT(ABS(1.-DD(I)*DD(I)))
      IF(DD(1).LE.1..AND.DD(2).LE.1..AND.DD(3).LE.1..AND.DD(4).LE.
     11.)GO TO 100
C
C     COMPLEX COEFFICIENTS
      DO 22 I=1,4
      IF(DD(I).GT.1.)GO TO 23
      B(I)=CMPLX(D(I),0.)
      GO TO 22
   23 B(I)= CMPLX(0.,D(I))
   22 CONTINUE
      C1=B(1)*B(2)
      C2=B(3)*B(4)
      C3=B(1)*B(4)
      C4=B(2)*B(3)
      H1=G1
      H2=G2*C1
      H3=G3*C2
      H4=G4*C3
      H5=G5*C4
      H6=G6*C1*C2
      H=1./(H1+H2+H3+H4+H5+H6)
      HB=2.*H
      HC=HB*P
      GO TO (1,2,3,4,5,6,7,8),NCODE
    1 RR=H*(H2+H4+H6-H1-H3-H5)
      GO TO 26
    2 RR=VP1*B(1)*HC*(Q*Y*C2+A2*X*Z)
      GO TO 26
    3 RR=A3*B(1)*HB*(VS2*B(2)*X+VS1*B(4)*Y)
      GO TO 26
    4 RR=-A3*B(1)*HC*(Q*C4-VS1*VP2*Z)
      GO TO 26
    5 RR=-VS1*B(2)*HC*(Q*Y*C2+A2*X*Z)
      GO TO 26
    6 RR=H*(H2+H5+H6-H1-H3-H4)
      GO TO 26
    7 RR=A5*B(2)*HC*(Q*C3-VP1*VS2*Z)
      GO TO 26
    8 RR=A5*B(2)*HB*(VP1*B(3)*Y+VP2*B(1)*X)
      GO TO 26
C     REAL COEFFICIENTS
  100 E1=D(1)*D(2)
      E2=D(3)*D(4)
      E3=D(1)*D(4)
      E4=D(2)*D(3)
      S1=G1
      S2=G2*E1
      S3=G3*E2
      S4=G4*E3
      S5=G5*E4
      S6=G6*E1*E2
      S=1./(S1+S2+S3+S4+S5+S6)
      SB=2.*S
      SC=SB*P
      GO TO (101,102,103,104,105,106,107,108),NCODE
  101 R=S*(S2+S4+S6-S1-S3-S5)
      GO TO 250
  102 R=VP1*D(1)*SC*(Q*Y*E2+A2*X*Z)
      GO TO 250
  103 R=A3*D(1)*SB*(VS2*D(2)*X+VS1*D(4)*Y)
      GO TO 250
  104 R=-A3*D(1)*SC*(Q*E4-VS1*VP2*Z)
      GO TO 250
  105 R=-VS1*D(2)*SC*(Q*Y*E2+A2*X*Z)
      GO TO 250
  106 R=S*(S2+S5+S6-S1-S3-S4)
      GO TO 250
  107 R=A5*D(2)*SC*(Q*E3-VP1*VS2*Z)
      GO TO 250
  108 R=A5*D(2)*SB*(VP1*D(3)*Y+VP2*D(1)*X)
      GO TO 250
C
C    EARTHS SURFACE,COMPLEX COEFFICIENTS AND CONVERSION COEFFICIENTS
  150 A1=VS1*P
      A2=A1*A1
      A3=2.*A2
      A4=2.*A1
      A5=A4+A4
      A6=1.-A3
      A7=2.*A6
      A8=2.*A3*VS1/VP1
      A9=A6*A6
      DD(1)=P*VP1
      DD(2)=P*VS1
      DO 151 I=1,2
  151 D(I)=SQRT(ABS(1.-DD(I)*DD(I)))
      IF(DD(1).LE.1..AND.DD(2).LE.1.)GO TO 200
      DO 154 I=1,2
      IF(DD(I).GT.1.)GO TO 155
      B(I)=CMPLX(D(I),0.)
      GO TO 154
  155 B(I)= CMPLX(0.,D(I))
  154 CONTINUE
      H1=B(1)*B(2)
      H2=H1*A8
      H=1./(A9+H2)
      GO TO (161,162,166,165,163,164,168,167),NCODE
  161 RR=(-A9+H2)*H
      GO TO 26
  162 RR=-A5*B(1)*H*A6
      GO TO 26
  163 RR=A5*B(2)*H*A6*VS1/VP1
      GO TO 26
  164 RR=-(A9-H2)*H
      GO TO 26
  165 RR=A5*H1*H
      GO TO 26
  166 RR=-A7*B(1)*H
      GO TO 26
  167 RR=A7*B(2)*H
      GO TO 26
  168 RR=A5*VS1*H1*H/VP1
C
  26  Z2=REAL(RR)
      Z3=AIMAG(RR)
      IF(Z2.EQ.0..AND.Z3.EQ.0.)GO TO 157
      RMOD=SQRT(Z2*Z2+Z3*Z3)
      RPH=ATAN2(Z3,Z2)
      IF(RMOD.LT.0.00001)RPH=AUX
      RETURN
  157 RMOD=0.
      RPH=AUX
      RETURN
C
C     EARTHS SURFACE,REAL COEFFICIENTS AND CONVERSION COEFFICIENTS
  200 S1=D(1)*D(2)
      S2=A8*S1
      S=1./(A9+S2)
      GO TO (201,202,206,205,203,204,208,207),NCODE
  201 R=(-A9+S2)*S
      GO TO 250
  202 R=-A5*D(1)*S*A6
      GO TO 250
  203 R=A5*D(2)*S*A6*VS1/VP1
      GO TO 250
  204 R=(S2-A9)*S
      GO TO 250
  205 R=A5*S1*S
      GO TO 250
  206 R=A7*D(1)*S
      GO TO 250
  207 R=A7*D(2)*S
      GO TO 250
  208 R=-A5*VS1*S1*S/VP1
  250 IF(R.LT.0.)GO TO 251
      RMOD=R
      RPH=0.
      IF(RMOD.LT.0.00001)RPH=AUX
      RR=CMPLX(R,0.)
      RETURN
  251 RMOD=-R
      RPH=-3.14159
      IF(RMOD.LT.0.00001)RPH=AUX
      RR=CMPLX(R,0.)
      RETURN
C
C     SH COEFFICIENTS OF REFLECTION, TRANSMISSION AND CONVERSION
C
  300 IF(NCODE.GE.13)GO TO 400
      IF(RO2.LT.0.0001) GO TO 302
      A1=P*VS1
      A2=P*VS2
      A3=RO1*VS1
      A4=RO2*VS2
      A5=SQRT(ABS(1.-A1*A1))
      A6=SQRT(ABS(1.-A2*A2))
      C1=A5
      IF(A2.LE.1.)C2=A6
      IF(A2.GT.1.)C2=CMPLX(0.,A6)
      C1=C1*A3
      C2=C2*A4
      H=1./(C1+C2)
      IF(NCODE.EQ.10)GO TO 301
      RR=H*(C1-C2)
      GO TO 26
  301 RR=2.*C1*H
      GO TO 26
  302 RMOD=1.
      RPH=0.
      IF(NCODE.EQ.10)GO TO 303
      RETURN
  303 RMOD=2.
      RPH=0.
      RETURN
C
C     PRESSURE R/T COEFFICIENTS, LIQUIDS
C
  400 IF(RO2.LT.0.0001) GO TO 402
      A1=P*VP1
      A2=P*VP2
      A3=RO1*VP1
      A4=RO2*VP2
      A5=SQRT(ABS(1.-A1*A1))
      A6=SQRT(ABS(1.-A2*A2))
      C1=A5
      IF(A2.LT.1.)C2=A6
      IF(A2.GE.1.)C2=CMPLX(0.,A6)
      C1=A4*C1
      C2=A3*C2
      H=1./(C1+C2)
      IF(NCODE.EQ.14)GO TO 401
      RR=H*(C1-C2)
      GO TO 26
  401 RR=2.*C1*H
      GO TO 26
  402 RMOD=1.
      RPH=3.141593
      IF(NCODE.EQ.14)GO TO 403
      RETURN
  403 RMOD=0.
      RPH=AUX
      RETURN
      END
C
C     *************************************************************
C
        SUBROUTINE RTMATQ(FR,N,A,B,RHO,QA,QB,D,U,FRQ,
     *  RPP,RPS,RSS,RSP,TPP,TPS,TSS,TSP,NC,RCOEF,v1,q1,aincr,gamma)
C
C       P/SV REFLECTION AND TRANSMISSION COEFFICIENTS FOR A DISSIPATIVE
C       TRANSITION LAYER, USING RECURSIVE ALGORITHM.
C
C       FR = REFERENCE FREQUENCY
C       N = NUMBER OF LAYERS (HALFSPACES INCLUDED)
C       A,B,RHO,QA,QB,D = MODEL (QA AND QB INDEPENDENT OF FREQUENCY)
C       U = TANGENTIAL SLOWNESS (COMPLEX-VALUED)
C       FRQ = FREQUENCY
C       RCOEF = COMPLEX-VALUED R/T COEFFICIENT OF THE TYPE NC
C
C       LAYERS 1 AND N ARE HALFSPACES
C
C
        DIMENSION A(1),B(1),RHO(1),D(1),QA(1),QB(1),nc(1)
        COMPLEX RPP,RPS,RSS,RSP,TPP,TPS,TSS,TSP,MU11,MU12,MU21,MU22,
     *  RPPD,RSPD,RPSD,RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,
     *  TPPU,TSPU,TPSU,TSSU,F11,F12,F21,F22,G11,G12,G21,G22,H11,H12,
     *  H21,H22,I11,I12,I21,I22,EP,ES,EX,AQ1,BQ1,AQ2,BQ2,C,CW,CV,
     *  EIN,rcoef,apom,bpom,apom2,bpom2,u,uq
C
        WR=6.28319*FR
        EIN=CMPLX(0.,1.)
        W=6.28319*FRQ
        CW=W
        CV=ALOG(W/WR)/3.141593+0.5*EIN
C
        M=N-1
        RHO1=RHO(M)
        AQ1=A(M)*(1.+CV/QA(M))
        APOM=AQ1
        AQ1=1./(AQ1*AQ1)
        BQ1=B(M)*(1.+CV/QB(M))
        BPOM=BQ1
        BQ1=1./(BQ1*BQ1)
        RHO2=RHO(N)
        AQ2=A(N)*(1.+CV/QA(N))
        APOM2=AQ2
        AQ2=1./(AQ2*AQ2)
        BQ2=B(N)*(1.+CV/QB(N))
        BPOM2=BQ2
        BQ2=1./(BQ2*BQ2)
c
c       determination of possible critical angles in critan (for n=2)
        if(n.gt.2) go to 1
        cvr=alog(w/wr)/3.141593
        va1=a(m)*(1.+cvr/qa(m))
        vb1=b(m)*(1.+cvr/qb(m))
        qa1=qa(m)
        qb1=qb(m)
        va2=a(n)*(1.+cvr/qa(n))
        vb2=b(n)*(1.+cvr/qb(n))
        qa2=qa(n)
        qb2=qb(n)
    1   continue
c
        C=2.*(RHO1/BQ1-RHO2/BQ2)
        CALL RTQ(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,MU11,MU12,MU21,MU22,
     *  TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,TPSU,TSSU,
     *  aincr,gamma,v1,q1,va1,vb1,va2,vb2,qa1,qb1,qa2,qb2,n)
        UQ=U*U
        EP=CEXP(-D(M)*CW*EIN*CSQRT(AQ1-UQ))
        ES=CEXP(-D(M)*CW*EIN*CSQRT(BQ1-UQ))
        EX=EP*ES
        RPP=MU11*EP*EP
        RSP=MU12*EX
        RPS=MU21*EX
        RSS=MU22*ES*ES
        TPP=TPPD*EP
        TSP=TSPD*ES
        TPS=TPSD*EP
        TSS=TSSD*ES
        IF(N.EQ.2)  go to 1001
C
C       LOOP FOR LAYERS
C
        II=N-2
        DO  1000  I=II,1,-1
        M=I+1
       AQ1=A(I)*(1.+CV/QA(I))
       apom=aq1
       AQ1=1./(AQ1*AQ1)
       BQ1=B(I)*(1.+CV/QB(I))
       bpom=bq1
       BQ1=1./(BQ1*BQ1)
       RHO1=RHO(I)
       AQ2=A(M)*(1.+CV/QA(M))
       AQ2=1./(AQ2*AQ2)
       BQ2=B(M)*(1.+CV/QB(M))
       BQ2=1./(BQ2*BQ2)
        RHO2=RHO(M)
        C=2.*(RHO1/BQ1-RHO2/BQ2)
        CALL RTQ(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,RPPD,RSPD,RPSD,RSSD,
     *  TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,TPSU,TSSU,
     *  aincr,gamma,v1,q1,va1,vb1,va2,vb2,qa1,qb1,qa2,qb2,n)
        CALL MULMAT(RPP,RSP,RPS,RSS,TPPD,TSPD,TPSD,TSSD,G11,G12,G21,
     *  G22)
        CALL MULMAT(RPP,RSP,RPS,RSS,RPPU,RSPU,RPSU,RSSU,H11,H12,H21,
     *  H22)
        H11=1.-H11
        H12=-H12
        H21=-H21
        H22=1.-H22
        CALL MATINV(H11,H12,H21,H22,I11,I12,I21,I22)
        CALL MULMAT(I11,I12,I21,I22,G11,G12,G21,G22,H11,H12,H21,H22)
        CALL MULMAT(TPPU,TSPU,TPSU,TSSU,H11,H12,H21,H22,G11,G12,G21,
     *  G22)
        MU11=RPPD+G11
        MU12=RSPD+G12
        MU21=RPSD+G21
        MU22=RSSD+G22
        CALL MULMAT(RPPU,RSPU,RPSU,RSSU,RPP,RSP,RPS,RSS,G11,G12,G21,
     *  G22)
        G11=1.-G11
        G12=-G12
        G21=-G21
        G22=1.-G22
        CALL MATINV(G11,G12,G21,G22,H11,H12,H21,H22)
        CALL MULMAT(H11,H12,H21,H22,TPPD,TSPD,TPSD,TSSD,G11,G12,G21,
     *  G22)
        EP=CEXP(-D(I)*CW*EIN*CSQRT(AQ1-UQ))
        ES=CEXP(-D(I)*CW*EIN*CSQRT(BQ1-UQ))
        F11=G11*EP
        F12=G12*ES
        F21=G21*EP
        F22=G22*ES
        CALL MULMAT(TPP,TSP,TPS,TSS,F11,F12,F21,F22,G11,G12,G21,G22)
        TPP=G11
        TSP=G12
        TPS=G21
        TSS=G22
        EX=EP*ES
        RPP=MU11*EP*EP
        RSP=MU12*EX
        RPS=MU21*EX
1000    RSS=MU22*ES*ES
1001    continue
        if (nc(1).eq.1)rcoef=rpp
        if(nc(1).eq.2)rcoef=-apom*rps/bpom
        if(nc(1).eq.3)rcoef=apom*tpp/apom2
        if(nc(1).eq.4)rcoef=-apom*tps/bpom2
        if(nc(1).eq.5)rcoef=-bpom*rsp/apom
        if(nc(1).eq.6)rcoef=rss
        if(nc(1).eq.7)rcoef=-bpom*tsp/apom2
        if(nc(1).eq.8)rcoef=bpom*tss/bpom2
        RETURN
        END
C
C      ************************************************************
C
        SUBROUTINE RTQ(AQ1,BQ1,RHO1,AQ2,BQ2,RHO2,C,U,RPPD,RSPD,RPSD,
     *  RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,RPSU,RSSU,TPPU,TSPU,
     *  TPSU,TSSU,aincr,gamma,
     *  v1,q1,va1,vb1,va2,vb2,qa1,qb1,qa2,qb2,n)
C
C       A ROUTINE TO RTMATQ
C       R/T COEFFICIENTS AT A SINGLE INTERFACE BETWEEN
C       TWO HOMOGENEOUS DISSIPATIVE HALFSPACES
C
        COMPLEX RPPD,RSPD,RPSD,RSSD,TPPD,TSPD,TPSD,TSSD,RPPU,RSPU,
     *  RPSU,RSSU,TPPU,TSPU,TPSU,TSSU,A1,B1,A2,B2,D1D,D2D,D1U,D2U,
     *  D,A1B1,A2B2,A1B2,A2B1,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,
     *  AQ1,BQ1,AQ2,BQ2,C,C1,C2,C3,C0,U,UQ
C
        uq=u*u
        A1=CSQRT(AQ1-UQ)
        B1=CSQRT(BQ1-UQ)
        A2=CSQRT(AQ2-UQ)
        B2=CSQRT(BQ2-UQ)
c
c       determination of possible critical angles in critan, for n=2
        if(n.gt.2)go to 1
        call critan(v1,va1,q1,qa1,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)a1=-a1
        endif
        call critan(v1,vb1,q1,qb1,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)b1=-b1
        endif
        call critan(v1,va2,q1,qa2,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)a2=-a2
        endif
        call critan(v1,vb2,q1,qb2,gamma,ncrit,acrit1,acrit2)
        if(ncrit.ne.0)then
          if(aincr.gt.acrit1.and.aincr.lt.acrit2)b2=-b2
        endif
c
    1   C0=C*UQ
        C1=C0-RHO1
        C2=C0+RHO2
        C3=C1+RHO2
        A1B1=A1*B1
        A2B2=A2*B2
        A1B2=A1*B2
        A2B1=A2*B1
        RHO12=RHO1*RHO2
        T1=C1*C1*A2B2+RHO12*A2B1
        T2=C2*C2*A1B1+RHO12*A1B2
        T3=C3*C3*UQ
        T4=C*C0*A1B1*A2B2
        D1D=T3+T1
        D2D=T4+T2
        D=D1D+D2D
        D1U=T3+T2
        D2U=T4+T1
        T5=2./D
        T6=A1*T5
        T7=B1*T5
        T8=A2*T5
        T9=B2*T5
        RPPD=(D2D-D1D)/D
        RPPU=(D2U-D1U)/D
        T10=U*(C3*C2+C*C1*A2B2)
        RPSD=-T6*T10
        RSPD=T7*T10
        T10=RHO12*(A1B2-A2B1)*T5
        RSSD=RPPD-T10
        RSSU=RPPU+T10
        T10=U*(C3*C1+C*C2*A1B1)
        RPSU=T8*T10
        RSPU=-T9*T10
        T10=C2*B1-C1*B2
        TPPD=RHO1*T6*T10
        TPPU=RHO2*T8*T10
        T10=U*(C3+C*A2B1)
        TPSD=-RHO1*T6*T10
        TSPU=RHO2*T9*T10
        T10=C2*A1-C1*A2
        TSSD=RHO1*T7*T10
        TSSU=RHO2*T9*T10
        T10=U*(C3+C*A1B2)
        TSPD=RHO1*T7*T10
        TPSU=-RHO2*T8*T10
        RETURN
        END
C
C     *************************************************************
C
        COMPLEX FUNCTION CSQ(X)
C
C       A ROUTINE TO RTMATQ.
C
        COMPLEX X
        A=CABS(X)
        B=REAL(X)
        RE=0.7071*SQRT(A+B)
        AI=-0.7071*SQRT(A-B)
        CSQ=CMPLX(RE,AI)
        RETURN
        END
c
c**********************************************************************
c
      subroutine critan(v1,v2,q1,q2,gamma,n,acrit1,acrit2)
c
c     A routine to compute the discrete critical angles
c
c     auxw1=sqrt(1.+1./(q1*q1))
c     w1=2./(v1*v1*(1.+auxw1))
c     auxw2=sqrt(1.+1./(q2*q2))
c     w2=2./(v2*v2*(1.+auxw2))
      auxw1=1.+1./(q1*q1)
      auxw2=1.+1./(q2*q2)
      w1=1./(v1*v1*auxw1)
      w2=1./(v2*v2*auxw2)
      c=(2.*w2*q1)/(w1*q2)-1.
      a=(w2*q1*cos(gamma))/(w1*q2)
c
      n = 0
      acrit1=1000.
      acrit2=1000.
c
      caux=1./(c*c)
      cos2g=cos(gamma)*cos(gamma)
      if(cos2g.le.caux)then
        aux=sqrt(1.-c*c*cos2g)
        omega1=(1.+c*cos2g+sin(gamma)*aux)/2.
        omega2=(1.+c*cos2g-sin(gamma)*aux)/2.
        if(0.lt.omega1.and.omega1.lt.1)then
          acrit1=asin(sqrt(omega1))
          if(acrit1.lt.gamma)then
            acrit1=1000.
            go to 2
          endif
          if(abs(acrit1-gamma).lt.0.000001)then
            acrit1=1000.
            go to 2
          endif
          aim1 = a - sin(acrit1)*sin(acrit1-gamma)
          if(abs(aim1).gt.0.0001)then
            acrit1 = 1000.
            go to 2
          endif
c         n=1
          g=sqrt(1.+1./(q1*q1*cos2g))
          rea1=w2-(w1*((1.+g)*sin(acrit1)*sin(acrit1)-
     *    (g-1.)*sin(acrit1-gamma)*sin(acrit1-gamma)))/2.
          if(rea1.gt.0)then
            acrit1=1000.
c           n=0
          else
            n=1
          endif
        endif
c
   2    if(0.lt.omega2.and.omega2.lt.1)then
          acrit2=asin(sqrt(omega2))
          if(acrit2.lt.gamma)then
            acrit2=1000.
            go to 3
          endif
          if(abs(acrit2-gamma).lt.0.000001)then
            acrit2=1000.
            go to 3
          endif
          aim2=a - sin(acrit2)*sin(acrit2-gamma)
          if(abs(aim2).gt.0.0001)then
            acrit2=1000.
            go to 3
          endif
c         n=n+1
          g=sqrt(1.+1./(q1*q1*cos2g))
          rea2=w2-(w1*((1.+g)*sin(acrit2)*sin(acrit2)-
     *    (g-1.)*sin(acrit2-gamma)*sin(acrit2-gamma)))/2.
          if(rea2.gt.0)then
            acrit2=1000.
c           n=n-1
          else
            n=n+1
          endif
        endif
      endif
c
   3  if(acrit2.lt.acrit1)then
        acr11=acrit2
        acrit2=acrit1
        acrit1=acr11
      endif
c
      if(abs(acrit1-acrit2).lt.0.00005)then
      n=1
      acrit2=1000.
      endif
      return
      end
c
c***********************************************************************
c