C
C Program TCGREEN to compute propagator matrices U of equation (39) of
C the paper by Klimes (1999).  The propagator matrices are written
C to the output formatted files in the form of file
C GREEN.
C
C References:
C     Klimes L.(1999): 'Analytical one-way plane-wave solution in the
C     1-D anisotropic "twisted crystal" model'.  Report 8, pp.103-118,
C     Charles University, Prague.
C
C     Bulant, P., & Klimes L.(1999): 'Comparison of ray methods
C     with the exact solution in the 1-D anisotropic
C     "twisted crystal" model'.  Report 8, pp.119-126,
C     Charles University, Prague.
C
C Version: 5.80
C Date: 2004, June 11
C
C Coded by: Petr Bulant
C     Department of Geophysics, Charles University Prague,
C     Ke Karlovu 3, 121 16 Praha 2, Czech Republic,
C     E-mail: bulant@seis.karlov.mff.cuni.cz
C
C.......................................................................
C                                                    
C Description of data files:
C
C Input data read from the standard input device (*):
C     The data are read by the list directed input (free format) and
C     consist of a single string 'SEP':
C     'SEP'...String in apostrophes containing the name of the input
C             SEP parameter or history file with the input data.
C     No default, 'SEP' must be specified and cannot be blank.
C
C                                                     
C Input data file 'SEP':
C     File 'SEP' has the form of a SEP
C     parameter file.  The parameters, which do not differ from their
C     defaults, need not be specified in file 'SEP'.
C Data describing the twisted-crystal model:
C     SIN2TH=real ... Second power of sinus theta
C              (equation 15 of the paper by Klimes).
C              Used to specify the default values of EPSILON and V0.
C              Has no meaning if both EPSILON and V0 are specified.
C              Default: SIN2TH=0.
C     GAMMA=real ... Gamma of equation 15 of the paper by Klimes.
C              Used to specify the default values of EPSILON and V0.
C              Has no meaning if both EPSILON and V0 are specified.
C              Default: GAMMA=0.
C     TCK=real ... Uppercase K of equation 9 of the paper by Klimes.
C              Default: TCK=0.
C     EPSILON=real ... Epsilon of equation 9 of the paper by Klimes.
C              Default: EPSILON=-(GAMMA*SIN2TH)/(1.+GAMMA*SIN2TH)
C     A44=real ...  a44 of equation 3 of the paper by Bulant & Klimes.
C              Used to specify the default value of V0, and to specify
C              the reference stress for output file TCSTRESS.
C              Default: A44=0.
C     V0=real ... v0 of equation 8 of the paper by Klimes.
C              Default: V0=SQRT(A44*(1.+GAMMA*SIN2TH))
C     VREF2=real ... second power of reference velocity
C              (see equation 111 of the paper by Klimes).
C              Default: VREF2=V0*V0
C Data describing source and receiver:
C     REC='string'... If non-blank, the name of the file with the names
C              and coordinates of the receiver points.  Only the first
C              point in the file is taken into account. Its name is
C              used in output files. If X3 is not defined, x3 coordinate
C              of the point is used instead.
C           Description of file REC
C              Default: REC=' '
C     SRC='string'... If non-blank, the name of the file with the name
C              and coordinates of the source point.  The name is used in
C              the output files, the coordinates are not considered.
C           Description of file SRC
C              Default: SRC=' '
C     X3=real ... Parameter specifying the source-receiver
C              distance X3=X3receiver-X3source in the direction of the
C              X3 axis. If not specified, coordinates of the source and
C              receiver are taken from files SRC and REC (default).
C              Default: X3=X3receiver-X3source
C Data describing the frequency domain:
C     DF=real ... Frequency step.
C              Default: DF=0.
C     OF=real ... The propagator matrix is calculated for NF
C              frequencies OF,OF+DF,OF+2*DF,...,OF+(NF-1)*DF.
C              Default: OF=0.
C     NF=integer ... Number of frequencies.
C              Default: NF=1
C Names of the output files:
C              The output files are not generated if the corresponding
C              name equals ' '.
C     TCGREENE='string'... Name of the output formatted file with the
C              exact propagator matrix U (equation 39) written in the
C              form of the file GREEN.
C              Default: TCGREENE='tcgreene.out'
C     TCGREENW='string'... Name of the output formatted file with the
C              coupling ray theory propagator matrix (equation 39 with
C              coefficients F0 to F3 from equation 106) written in the
C              form of the file GREEN.
C              Default: TCGREENW='tcgreenw.out'
C     TCGREENQ='string'... Name of the output formatted file with the
C              quasi-isotropic propagator matrix (equation 39 with
C              coefficients F0 to F3 from equation 111) written in the
C              form of the file GREEN.
C              Default: TCGREENQ='tcgreenq.out'
C     TCGREENA='string'... Name of the output formatted file with the
C              anisotropic propagator matrix (equation 39 with
C              coefficients F0 to F3 from equation 116) written in the
C              form of the file GREEN.
C              Default: TCGREENA='tcgreena.out'
C     TCGREENI='string'... Name of the output formatted file with the
C              isotropic propagator matrix (equation 39 with
C              coefficients F0 to F3 from equation 121) written in the
C              form of the file GREEN.
C              Default: TCGREENI='tcgreeni.out'
C     TCSTRESS='string'... Name of the output formatted file with the
C              stress components corresponding to the exact propagator
C              matrix at the initial point.  The stress is divided by
C              "reference stress"=2*pi*F*SQRT(A44),
C              where F is frequency.
C              Default: TCSTRESS='tcstress.out'
C Rotation of the model:
C     TCE1=real, TCE2=real, TCE3=real ... Three components of
C              the rotation vector describing the rotation of the model.
C              The model described in the papers referenced above may be
C              further rotated by specifying the rotation vector.
C              The model is rotated along the axis given by the rotation
C              vector, the angle of the rotation in radians is given by
C              the Cartesian length of the vector.
C              Only the exact solution may be calculated in the rotated
C              model, all the parameters TCGREENW(Q,A,I) must equal ' '
C              if the rotation vector is specified.
C              Default: TCE1=TCE2=TCE3=0. (no rotation).
C
C Description of the output files TCGREENE(W,Q,A,I):
C     Formatted files containing the computed propagator matrix.
C     The files have the same format as the file GREEN generated by
C     program GREEN. Strings 'Src' and 'Rec' are written in place
C     of names of the source and the receiver, coordinates of the source
C     are [0.,0.,0.], coordinates of the receiver are [0.,0.,X3],
C     travel time is X3/V0, zeros are written in place of derivatives
C     of the travel time with respect to the coordinates of the receiver
C     and coordinates of the source. Components of the 2x2 propagator
C     matrix are written as corresponding amplitudes, zeros are written
C     instead of the remaining amplitudes.
C     Description of file GREEN
C
C-----------------------------------------------------------------------
C
C Subroutines and external functions required:
      EXTERNAL ERROR,RSEP1,RSEP3I,RSEP3T,RSEP3R,FORM2,LENGTH,
     * EQ39,TCGMAT,TCGTRA
      INTEGER LENGTH
C     ERROR ... File error.for.
C     RSEP1,RSEP3I,RSEP3T,RSEP3R ...
C             File sep.for.
C     FORM2 ... File forms.for.
C     LENGTH ... File length.for.
C     EQ39,TCGMAT,TCGTRA ... This file.
C
C-----------------------------------------------------------------------
C
C
C Common block /RAMC/:
      INCLUDE 'ram.inc'
C     ram.inc
      REAL GREEN(MRAM)
      EQUIVALENCE (GREEN,RAM)
C
C     Input and output data files:
      CHARACTER*80 FSEP,FOUTE,FOUTW,FOUTQ,FOUTA,FOUTI,FOUTS,
     *             FILREC,FILSRC,RECNAM,SRCNAM
      CHARACTER*260 FORMAT
      INTEGER LU
      PARAMETER (LU=1)
      REAL PI
      PARAMETER (PI=3.1415926)
C
C     Auxiliary storage locations:
      INTEGER I1,I2,I,NF,NGREEN
      REAL EPS,S2TH,GAMMA,OF,DF,F,VK,K0,A44,V0,X3,K02,VK2,
     * E1,E2,E3,AE,AE2,COSAE,SINAE,AUX1,AUX2,
     * K02VK2,EPS2,JEPS2,SJEPS2,SQJMEP,SQJPEP,
     * REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,RECIT,
     * REJM,IMJM,AUX,REAUX,IMAUX,REPZ,IMPZ,REDZ,IMDZ,
     * REF12,IMF12,REF02,IMF02,AF02,FIF02,AF0,FIF0,
     * REU11,IMU11,REU21,IMU21,REU31,IMU31,
     * REU12,IMU12,REU22,IMU22,REU32,IMU32,
     * REU13,IMU13,REU23,IMU23,REU33,IMU33,REU(3,3),IMU(3,3),
     * REE11,IME11,REE21,IME21,REE31,IME31,
     * REE12,IME12,REE22,IME22,REE32,IME32,
     * REE13,IME13,REE23,IME23,REE33,IME33,REE(3,3),IME(3,3),
     * CFIF02,SFIF02,TT,VR,VR2,R1,R2,R3,
     * REA(3,3),IMA(3,3),REET(3,3),IMET(3,3)
      LOGICAL LROT
      EQUIVALENCE (REU11,REU(1,1)),(IMU11,IMU(1,1)),(REU21,REU(2,1)),
     *            (IMU21,IMU(2,1)),(REU31,REU(3,1)),(IMU31,IMU(3,1)),
     *            (REU12,REU(1,2)),(IMU12,IMU(1,2)),(REU22,REU(2,2)),
     *            (IMU22,IMU(2,2)),(REU32,REU(3,2)),(IMU32,IMU(3,2)),
     *            (REU13,REU(1,3)),(IMU13,IMU(1,3)),(REU23,REU(2,3)),
     *            (IMU23,IMU(2,3)),(REU33,REU(3,3)),(IMU33,IMU(3,3)),
     *            (REE11,REE(1,1)),(IME11,IME(1,1)),(REE21,REE(2,1)),
     *            (IME21,IME(2,1)),(REE31,REE(3,1)),(IME31,IME(3,1)),
     *            (REE12,REE(1,2)),(IME12,IME(1,2)),(REE22,REE(2,2)),
     *            (IME22,IME(2,2)),(REE32,REE(3,2)),(IME32,IME(3,2)),
     *            (REE13,REE(1,3)),(IME13,IME(1,3)),(REE23,REE(2,3)),
     *            (IME23,IME(2,3)),(REE33,REE(3,3)),(IME33,IME(3,3))
      DATA REE,IME/18*0./
C
C-----------------------------------------------------------------------
C
C     Main input data:
      FSEP=' '
      WRITE(*,'(A)') '+TCGREEN: Enter input filename: '
      READ(*,*) FSEP
      IF (FSEP.EQ.' ') THEN
C       TCGREEN-01
        CALL ERROR('TCGREEN-01: SEP file not given')
C       Input file in the form of the SEP (Stanford Exploration Project)
C       parameter or history file must be specified.
C       There is no default filename.
      ENDIF
C
      WRITE(*,'(A)') '+TCGREEN: Working...            '
C
C     Reading all the data from file FSEP to the memory
C     (SEP parameter file form):
      CALL RSEP1(LU,FSEP)
C
C     Reading the names of the output files:
      CALL RSEP3T('TCGREENE',FOUTE,'tcgreene.out')
      CALL RSEP3T('TCGREENW',FOUTW,'tcgreenw.out')
      CALL RSEP3T('TCGREENQ',FOUTQ,'tcgreenq.out')
      CALL RSEP3T('TCGREENA',FOUTA,'tcgreena.out')
      CALL RSEP3T('TCGREENI',FOUTI,'tcgreeni.out')
      CALL RSEP3T('TCSTRESS',FOUTS,'tcstress.out')
C
C     Recalling the data:
C     (arguments: Name of value in input data, Variable, Default):
      CALL RSEP3R('EPSILON',EPS,999999.)
      CALL RSEP3R('SIN2TH',S2TH,0.)
      CALL RSEP3R('GAMMA',GAMMA,0.)
      CALL RSEP3R('OF',OF,0.)
      CALL RSEP3R('DF',DF,1.)
      CALL RSEP3I('NF',NF,1)
      CALL RSEP3R('TCK',VK,0.)
      CALL RSEP3R('V0',V0,999999.)
      CALL RSEP3R('A44',A44,0.)
      CALL RSEP3R('TCE1',E1,0.)
      CALL RSEP3R('TCE2',E2,0.)
      CALL RSEP3R('TCE3',E3,0.)
      AE2=E1*E1+E2*E2+E3*E3
      IF (AE2.EQ.0.) THEN
        LROT=.FALSE.
      ELSE
        LROT=.TRUE.
        AE=SQRT(AE2)
        COSAE=COS(AE)
        AUX1=(1-COSAE)/AE2
        SINAE=SIN(AE)
        AUX2=SINAE/AE
        REE11=COSAE+E1*E1*AUX1
        REE21=      E2*E1*AUX1                -E3*AUX2
        REE31=      E3*E1*AUX1        +E2*AUX2
        REE12=      E1*E2*AUX1                +E3*AUX2
        REE22=COSAE+E2*E2*AUX1
        REE32=      E3*E2*AUX1-E1*AUX2
        REE13=      E1*E3*AUX1        -E2*AUX2
        REE23=      E2*E3*AUX1+E1*AUX2
        REE33=COSAE+E3*E3*AUX1
        CALL TCGTRA(REE,IME,REET,IMET)
        IF ((FOUTW.NE.' ').OR.(FOUTQ.NE.' ').OR.(FOUTA.NE.' ').OR.
     *      (FOUTI.NE.' ')) THEN
C         TCGREEN-06
          CALL WARN('TCGREEN-06: Only file TCGREENE may be calculated')
C         If the model is to be rotated, only the exact solution may be
C         calculated.  All other output files will not be generated.
          FOUTW=' '
          FOUTQ=' '
          FOUTA=' '
          FOUTI=' '
        ENDIF
      ENDIF
C     Name of the source:
      CALL RSEP3T('SRC',FILSRC,' ')
      IF (FILSRC.NE.' ') THEN
        OPEN(LU,FILE=FILSRC,STATUS='OLD')
        READ(LU,*) (SRCNAM,I=1,20)
        R3=0.
        READ(LU,*) SRCNAM,R1,R2,R3
        CLOSE(LU)
      ENDIF
C     Name of the receiver:
      CALL RSEP3T('REC',FILREC,' ')
      IF (FILREC.NE.' ') THEN
        OPEN(LU,FILE=FILREC,STATUS='OLD')
        READ(LU,*) (RECNAM,I=1,20)
        X3=0.
        READ(LU,*) RECNAM,R1,R2,X3
        CLOSE(LU)
      ENDIF
      R3=X3-R3
      CALL RSEP3R('X3',X3,R3)
      IF (EPS.EQ.999999.) THEN
        AUX=GAMMA*S2TH
        EPS=-AUX/(1.+AUX)
      ENDIF
      EPS2=EPS*EPS
      JEPS2=1.-EPS2
      SJEPS2=SQRT(JEPS2)
      SQJMEP=SQRT(1.-EPS)
      SQJPEP=SQRT(1.+EPS)
      IF (V0.EQ.999999.) THEN
        AUX=GAMMA*S2TH
        V0=SQRT(A44*(1+AUX))
      ENDIF
      IF (V0.EQ.0.) THEN
C       TCGREEN-03
        CALL ERROR('TCGREEN-03: Wrong value of V0')
C       V0 must not equal zero.
      ENDIF
      IF (VK.EQ.0.) THEN
C       TCGREEN-04
        CALL ERROR('TCGREEN-04: Wrong value of TCK')
C       TCK must not equal zero.
      ENDIF
      IF (FOUTS.NE.' ') THEN
        IF (A44.LE.0.) THEN
C         TCGREEN-05
          CALL ERROR('TCGREEN-05: Wrong value of A44')
C         A44 must be positive if TCSTRESS is not blank.
        ENDIF
      ENDIF
      DO 10, I2=1,14
        GREEN(I2)=0.
  10  CONTINUE
      TT=X3/V0
      GREEN(1)=TT
      GREEN(5)=X3
      NGREEN=14+18*NF
      IF (NGREEN.GT.MRAM) THEN
C       TCGREEN-02
        CALL ERROR('TCGREEN-02: Small array RAM.')
C       Parameter MRAM of the file ram.inc should be greater than
C       18 times number of frequencies plus 14.
C       File ram.inc.
      ENDIF
C
C
C     Exact solution:
      IF (FOUTE.NE.' '.OR.FOUTS.NE.' ') THEN
        IF (FOUTS.NE.' ') THEN
          OPEN(LU,FILE=FOUTS)
        END IF
        I2=15
        DO 100, I1=0,NF-1
          F=OF+I1*DF
          K0=2.*PI*F/V0
C         Eq 63:
          VK2=VK*VK
          K02=K0*K0
          K02VK2=K02-VK2
          AUX=1.-EPS2*((VK2/K02VK2)**2)
          REJM=K02VK2*SQRT(JEPS2)
          IF (AUX.GE.0.) THEN
            IMJM=0.
            REJM=REJM*(SJEPS2+SQRT(AUX))
          ELSE
            IMJM=REJM*SQRT(-AUX)
            REJM=REJM*SJEPS2
          ENDIF
          RECIT=EPS*VK*K02
          IF (IMJM.EQ.0.) THEN
            REF1=RECIT/REJM
            IMF1=0.
          ELSE
            AUX=REJM*REJM-IMJM*IMJM
            REF1=RECIT*REJM/AUX
            IMF1=-RECIT*IMJM/AUX
          ENDIF
C         Eq 52:
          REF12=REF1*REF1-IMF1*IMF1
          IMF12=2.*REF1*IMF1
          REPZ=K02/JEPS2+REF12
          IMPZ=IMF12
          REAUX=1.+REF12*JEPS2/VK2
          IMAUX=   IMF12*JEPS2/VK2
          AUX=REAUX*REAUX+IMAUX*IMAUX
          REDZ= REAUX/AUX
          IMDZ=-IMAUX/AUX
          REF02=REPZ*REDZ-IMPZ*IMDZ
          IMF02=REPZ*IMDZ+IMPZ*REDZ
          AF02=SQRT(REF02*REF02+IMF02*IMF02)
          IF (AF02.EQ.0.) THEN
            REF0=0.
            IMF0=0.
          ELSE
            CFIF02=REF02/AF02
            SFIF02=IMF02/AF02
            IF (CFIF02.GE.0.) THEN
              FIF02=ASIN(SFIF02)
            ELSEIF(SFIF02.GE.0.) THEN
              FIF02=ACOS(CFIF02)
            ELSE
              FIF02=-ACOS(CFIF02)
            ENDIF
            AF0=SQRT(AF02)
            FIF0=FIF02/2.
            REF0=AF0*COS(FIF0)
            IMF0=AF0*SIN(FIF0)
            IF (REF0.LT.0.) THEN
              REF0=-REF0
              IMF0=-IMF0
            ENDIF
            IF (IMF0.LT.0.) THEN
              IMF0=-IMF0
              IMF1=-IMF1
            ENDIF
          ENDIF
C         Eq 49:
          REAUX=-EPS+REF1*JEPS2/VK
          IMAUX=     IMF1*JEPS2/VK
          REF3=REF0*REAUX-IMF0*IMAUX
          IMF3=IMF0*REAUX+REF0*IMAUX
C         Eq 47:
          REF2=VK+EPS*REF1
          IMF2=   EPS*IMF1
C
C         Eq 32,33,39:
          CALL EQ39(VK,X3,TT,F,
     *              REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *              REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C         Remaining components of the 3x3 matrix:
          REU13=0.
          IMU13=0.
          REU23=0.
          IMU23=0.
          REU31=0.
          IMU31=0.
          REU32=0.
          IMU32=0.
          REU33=0.
          IMU33=0.
C
C         Rotation (multiplication E x U x ET):
          IF (LROT) THEN
            CALL TCGMAT(REE,IME,REU,IMU,REA,IMA)
            CALL TCGMAT(REA,IMA,REET,IMET,REU,IMU)
          ENDIF
C
          GREEN(I2   )=REU11*1000000.
          GREEN(I2+ 1)=IMU11*1000000.
          GREEN(I2+ 2)=REU21*1000000.
          GREEN(I2+ 3)=IMU21*1000000.
          GREEN(I2+ 4)=REU31*1000000.
          GREEN(I2+ 5)=IMU31*1000000.
          GREEN(I2+ 6)=REU12*1000000.
          GREEN(I2+ 7)=IMU12*1000000.
          GREEN(I2+ 8)=REU22*1000000.
          GREEN(I2+ 9)=IMU22*1000000.
          GREEN(I2+10)=REU32*1000000.
          GREEN(I2+11)=IMU32*1000000.
          GREEN(I2+12)=REU13*1000000.
          GREEN(I2+13)=IMU13*1000000.
          GREEN(I2+14)=REU23*1000000.
          GREEN(I2+15)=IMU23*1000000.
          GREEN(I2+16)=REU33*1000000.
          GREEN(I2+17)=IMU33*1000000.
          I2=I2+18
C
          IF (FOUTS.NE.' ') THEN
C           Writing the density normalized initial stress, divided by
C           "reference stress" = 2.*PI*F*SQRT(A44) = K0*V0*SQRT(A44):
            IF(F.EQ.0.) THEN
              S11R= 0.
              S11I= SQRT(1.-EPS**2)*V0/SQRT(A44)
              S12R= 0.
              S12I= 0.
              S22R= 0.
              S22I= SQRT(1.-EPS**2)*V0/SQRT(A44)
            ELSE
              S11R=-(1.+EPS)*(IMF0+IMF3)*V0/K0/SQRT(A44)
              S11I= (1.+EPS)*(REF0+REF3)*V0/K0/SQRT(A44)
              S12R=-(1.-EPS**2)*REF1    *V0/K0/SQRT(A44)
              S12I=-(1.-EPS**2)*IMF1    *V0/K0/SQRT(A44)
              S22R=-(1.-EPS)*(IMF0-IMF3)*V0/K0/SQRT(A44)
              S22I= (1.-EPS)*(REF0-REF3)*V0/K0/SQRT(A44)
            END IF
            WRITE(LU,'(7(F9.6,1X))') F,S11R,S11I,S12R,S12I,S22R,S22I
          ENDIF
 100    CONTINUE
C
        IF (FOUTS.NE.' ') THEN
          CLOSE(LU)
        ENDIF
C
        IF (FOUTE.NE.' ') THEN
C         Writing:
          OPEN(LU,FILE=FOUTE)
          WRITE(LU,'(A)') ' /'
          FORMAT(1:4)='(6A,'
          CALL FORM2(14,GREEN,GREEN,FORMAT(5:260))
          WRITE(LU,FORMAT) '''',RECNAM(1:LENGTH(RECNAM)),
     *     ''' ''',SRCNAM(1:LENGTH(SRCNAM)),'''',
     *                    (' ',GREEN(I),I=1,14)
          DO 110 I2=15,NGREEN-18,18
            FORMAT(1:4)='(1A,'
            CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
            WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,I2+17)
  110     CONTINUE
          I2=NGREEN-17
          FORMAT(1:4)='(1A,'
          CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
          WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,NGREEN),' /'
          WRITE(LU,'(A)') ' /'
          CLOSE(LU)
        ENDIF
      ENDIF
C
C
C     Coupling ray theory:
      IF (FOUTW.NE.' ') THEN
        OPEN(LU,FILE=FOUTW)
        WRITE(LU,'(A)') ' /'
        I2=15
        DO 200, I1=0,NF-1
          F=OF+I1*DF
          K0=2.*PI*F/V0
C         Eq 106:
          REF0=K0*(SQJPEP+SQJMEP)/2./SJEPS2
          IMF0=0.
          REF1=0.
          IMF1=0.
          REF2=VK
          IMF2=0.
          REF3=-K0*(SQJPEP-SQJMEP)/2./SJEPS2
          IMF3=0.
C         Eq 32,33,39:
          CALL EQ39(VK,X3,TT,F,
     *              REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *              REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C
          GREEN(I2   )=REU11*1000000.
          GREEN(I2+ 1)=IMU11*1000000.
          GREEN(I2+ 2)=REU21*1000000.
          GREEN(I2+ 3)=IMU21*1000000.
          GREEN(I2+ 4)=0.
          GREEN(I2+ 5)=0.
          GREEN(I2+ 6)=REU12*1000000.
          GREEN(I2+ 7)=IMU12*1000000.
          GREEN(I2+ 8)=REU22*1000000.
          GREEN(I2+ 9)=IMU22*1000000.
          GREEN(I2+10)=0.
          GREEN(I2+11)=0.
          GREEN(I2+12)=0.
          GREEN(I2+13)=0.
          GREEN(I2+14)=0.
          GREEN(I2+15)=0.
          GREEN(I2+16)=0.
          GREEN(I2+17)=0.
          I2=I2+18
 200    CONTINUE
C       Writing:
        FORMAT(1:4)='(6A,'
        CALL FORM2(14,GREEN,GREEN,FORMAT(5:260))
        WRITE(LU,FORMAT) '''',RECNAM(1:LENGTH(RECNAM)),
     *   ''' ''',SRCNAM(1:LENGTH(SRCNAM)),'''',
     *                  (' ',GREEN(I),I=1,14)
        DO 210 I2=15,NGREEN-18,18
          FORMAT(1:4)='(1A,'
          CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
          WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,I2+17)
  210   CONTINUE
        I2=NGREEN-17
        FORMAT(1:4)='(1A,'
        CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
        WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,NGREEN),' /'
        WRITE(LU,'(A)') ' /'
        CLOSE(LU)
      ENDIF
C
C
C     Quasi-isotropic approach:
      IF (FOUTQ.NE.' ') THEN
        OPEN(LU,FILE=FOUTQ)
        WRITE(LU,'(A)') ' /'
        I2=15
        CALL RSEP3R('VREF2',VR2,V0*V0)
        VR=SQRT(VR2)
        DO 300, I1=0,NF-1
          F=OF+I1*DF
          K0=2.*PI*F/V0
C         Eq 111:
          REF0=K0*V0/VR*(3./2.-1./2.*V0*V0/VR/VR)
          IMF0=0.
          REF1=0.
          IMF1=0.
          REF2=VK
          IMF2=0.
          REF3=-K0/2.*EPS*V0*V0*V0/VR/VR/VR
          IMF3=0.
C         Eq 32,33,39:
          CALL EQ39(VK,X3,TT,F,
     *              REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *              REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C
          GREEN(I2   )=REU11*1000000.
          GREEN(I2+ 1)=IMU11*1000000.
          GREEN(I2+ 2)=REU21*1000000.
          GREEN(I2+ 3)=IMU21*1000000.
          GREEN(I2+ 4)=0.
          GREEN(I2+ 5)=0.
          GREEN(I2+ 6)=REU12*1000000.
          GREEN(I2+ 7)=IMU12*1000000.
          GREEN(I2+ 8)=REU22*1000000.
          GREEN(I2+ 9)=IMU22*1000000.
          GREEN(I2+10)=0.
          GREEN(I2+11)=0.
          GREEN(I2+12)=0.
          GREEN(I2+13)=0.
          GREEN(I2+14)=0.
          GREEN(I2+15)=0.
          GREEN(I2+16)=0.
          GREEN(I2+17)=0.
          I2=I2+18
 300    CONTINUE
C       Writing:
        FORMAT(1:4)='(6A,'
        CALL FORM2(14,GREEN,GREEN,FORMAT(5:260))
        WRITE(LU,FORMAT) '''',RECNAM(1:LENGTH(RECNAM)),
     *   ''' ''',SRCNAM(1:LENGTH(SRCNAM)),'''',
     *                  (' ',GREEN(I),I=1,14)
        DO 310 I2=15,NGREEN-18,18
          FORMAT(1:4)='(1A,'
          CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
          WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,I2+17)
  310   CONTINUE
        I2=NGREEN-17
        FORMAT(1:4)='(1A,'
        CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
        WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,NGREEN),' /'
        WRITE(LU,'(A)') ' /'
        CLOSE(LU)
      ENDIF
C
C
C     Anisotropic ray theory:
      IF (FOUTA.NE.' ') THEN
        OPEN(LU,FILE=FOUTA)
        WRITE(LU,'(A)') ' /'
        I2=15
        DO 400, I1=0,NF-1
          F=OF+I1*DF
          K0=2.*PI*F/V0
C         Eq 116:
          REF0=K0*(SQJPEP+SQJMEP)/2./SJEPS2
          IMF0=0.
          REF1=0.
          IMF1=0.
          REF2=0.
          IMF2=0.
          REF3=-K0*(SQJPEP-SQJMEP)/2./SJEPS2
          IMF3=0.
C         Eq 32,33,39:
          CALL EQ39(VK,X3,TT,F,
     *              REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *              REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C
          GREEN(I2   )=REU11*1000000.
          GREEN(I2+ 1)=IMU11*1000000.
          GREEN(I2+ 2)=REU21*1000000.
          GREEN(I2+ 3)=IMU21*1000000.
          GREEN(I2+ 4)=0.
          GREEN(I2+ 5)=0.
          GREEN(I2+ 6)=REU12*1000000.
          GREEN(I2+ 7)=IMU12*1000000.
          GREEN(I2+ 8)=REU22*1000000.
          GREEN(I2+ 9)=IMU22*1000000.
          GREEN(I2+10)=0.
          GREEN(I2+11)=0.
          GREEN(I2+12)=0.
          GREEN(I2+13)=0.
          GREEN(I2+14)=0.
          GREEN(I2+15)=0.
          GREEN(I2+16)=0.
          GREEN(I2+17)=0.
          I2=I2+18
 400    CONTINUE
C       Writing:
        FORMAT(1:4)='(6A,'
        CALL FORM2(14,GREEN,GREEN,FORMAT(5:260))
        WRITE(LU,FORMAT) '''',RECNAM(1:LENGTH(RECNAM)),
     *   ''' ''',SRCNAM(1:LENGTH(SRCNAM)),'''',
     *                  (' ',GREEN(I),I=1,14)
        DO 410 I2=15,NGREEN-18,18
          FORMAT(1:4)='(1A,'
          CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
          WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,I2+17)
  410   CONTINUE
        I2=NGREEN-17
        FORMAT(1:4)='(1A,'
        CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
        WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,NGREEN),' /'
        WRITE(LU,'(A)') ' /'
        CLOSE(LU)
      ENDIF
C
C
C     Isotropic ray theory:
      IF (FOUTI.NE.' ') THEN
        OPEN(LU,FILE=FOUTI)
        WRITE(LU,'(A)') ' /'
        I2=15
        DO 500, I1=0,NF-1
          F=OF+I1*DF
          K0=2.*PI*F/V0
C         Eq 121:
          REF0=K0*(SQJPEP+SQJMEP)/2./SJEPS2
          IMF0=0.
          REF1=0.
          IMF1=0.
          REF2=VK
          IMF2=0.
          REF3=0.
          IMF3=0.
C         Eq 32,33,39:
          CALL EQ39(VK,X3,TT,F,
     *              REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *              REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C
          GREEN(I2   )=REU11*1000000.
          GREEN(I2+ 1)=IMU11*1000000.
          GREEN(I2+ 2)=REU21*1000000.
          GREEN(I2+ 3)=IMU21*1000000.
          GREEN(I2+ 4)=0.
          GREEN(I2+ 5)=0.
          GREEN(I2+ 6)=REU12*1000000.
          GREEN(I2+ 7)=IMU12*1000000.
          GREEN(I2+ 8)=REU22*1000000.
          GREEN(I2+ 9)=IMU22*1000000.
          GREEN(I2+10)=0.
          GREEN(I2+11)=0.
          GREEN(I2+12)=0.
          GREEN(I2+13)=0.
          GREEN(I2+14)=0.
          GREEN(I2+15)=0.
          GREEN(I2+16)=0.
          GREEN(I2+17)=0.
          I2=I2+18
 500    CONTINUE
C       Writing:
        FORMAT(1:4)='(6A,'
        CALL FORM2(14,GREEN,GREEN,FORMAT(5:260))
        WRITE(LU,FORMAT) '''',RECNAM(1:LENGTH(RECNAM)),
     *   ''' ''',SRCNAM(1:LENGTH(SRCNAM)),'''',
     *                  (' ',GREEN(I),I=1,14)
        DO 510 I2=15,NGREEN-18,18
          FORMAT(1:4)='(1A,'
          CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
          WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,I2+17)
  510   CONTINUE
        I2=NGREEN-17
        FORMAT(1:4)='(1A,'
        CALL FORM2(18,GREEN(I2),GREEN(I2),FORMAT(5:260))
        WRITE(LU,FORMAT) (' ',GREEN(I),I=I2,NGREEN),' /'
        WRITE(LU,'(A)') ' /'
        CLOSE(LU)
      ENDIF
C
      WRITE(*,'(A)') '+TCGREEN: Done.                  '
      STOP
      END
C
C=======================================================================
C
      SUBROUTINE EQ39(VK,X3,TT,F,
     *  REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     *  REU11,IMU11,REU21,IMU21,REU12,IMU12,REU22,IMU22)
C
      REAL VK,X3,TT,F,
     * REF0,IMF0,REF1,IMF1,REF2,IMF2,REF3,IMF3,
     * REU11,IMU11,REU12,IMU12,REU21,IMU21,REU22,IMU22
C
      REAL PI
      PARAMETER (PI=3.1415926)
      REAL AUX,REAUX,IMAUX,REF12,IMF12,REF22,IMF22,REF32,IMF32,
     * REFI,IMFI,AFI,FIFI,
     * REFI2,IMFI2,AFI2,FIFI2,
     * RVF11,IVF11,RVF12,IVF12,RVF21,IVF21,RVF22,IVF22,
     * REVF11,IMVF11,REVF12,IMVF12,REVF21,IMVF21,REVF22,IMVF22,
     * RA11,IA11,RA12,IA12,RA21,IA21,RA22,IA22,
     * RB11,IB11,RB12,IB12,RB21,IB21,RB22,IB22,
     * RC11,IC11,RC12,IC12,RC21,IC21,RC22,IC22,
     * RD11,ID11,RD12,ID12,RD21,ID21,RD22,ID22,
     * CFIFI2,SFIFI2
C
C      Eq 32:
       REF12=REF1*REF1-IMF1*IMF1
       IMF12=2.*REF1*IMF1
       REF22=REF2*REF2-IMF2*IMF2
       IMF22=2.*REF2*IMF2
       REF32=REF3*REF3-IMF3*IMF3
       IMF32=2.*REF3*IMF3
       REFI2=REF32+REF22-REF12
       IMFI2=IMF32+IMF22-IMF12
       AFI2=SQRT(REFI2*REFI2+IMFI2*IMFI2)
       IF (AFI2.EQ.0.) THEN
         REFI=0.
         IMFI=0.
       ELSE
         CFIFI2=REFI2/AFI2
         SFIFI2=IMFI2/AFI2
         IF (CFIFI2.GE.0.) THEN
           FIFI2=ASIN(SFIFI2)
         ELSEIF(SFIFI2.GE.0.) THEN
           FIFI2=ACOS(CFIFI2)
         ELSE
           FIFI2=-ACOS(CFIFI2)
         ENDIF
         AFI=SQRT(AFI2)
         FIFI=FIFI2/2.
         REFI=AFI*COS(FIFI)
         IMFI=AFI*SIN(FIFI)
       ENDIF
C      Eq 33:
       AUX=REFI*REFI+IMFI*IMFI
       IF (AUX.NE.0.) THEN
         REAUX= REFI/AUX
         IMAUX=-IMFI/AUX
         RVF11=REF3
         IVF11=IMF3
         RVF12=-IMF1+IMF2
         IVF12= REF1-REF2
         RVF21=-IMF1-IMF2
         IVF21= REF1+REF2
         RVF22=-REF3
         IVF22=-IMF3
         REVF11=RVF11*REAUX-IVF11*IMAUX
         IMVF11=RVF11*IMAUX+IVF11*REAUX
         REVF12=RVF12*REAUX-IVF12*IMAUX
         IMVF12=RVF12*IMAUX+IVF12*REAUX
         REVF21=RVF21*REAUX-IVF21*IMAUX
         IMVF21=RVF21*IMAUX+IVF21*REAUX
         REVF22=RVF22*REAUX-IVF22*IMAUX
         IMVF22=RVF22*IMAUX+IVF22*REAUX
       ELSE
         REVF11=0.
         IMVF11=0.
         REVF12=0.
         IMVF12=0.
         REVF21=0.
         IMVF21=0.
         REVF22=0.
         IMVF22=0.
       ENDIF
C      Eq 39:
       RA11=COS(VK*X3)
       RA12=-SIN(VK*X3)
       RA21=-RA12
       RA22=RA11
       AUX=SIN(REFI*X3)
       RB11=COS(REFI*X3)-IMVF11*AUX
       IB11=             REVF11*AUX
       RB12=            -IMVF12*AUX
       IB12=             REVF12*AUX
       RB21=            -IMVF21*AUX
       IB21=             REVF21*AUX
       RB22=COS(REFI*X3)-IMVF22*AUX
       IB22=             REVF22*AUX
       RC11=RA11*RB11+RA12*RB21
       IC11=RA11*IB11+RA12*IB21
       RC12=RA11*RB12+RA12*RB22
       IC12=RA11*IB12+RA12*IB22
       RC21=RA21*RB11+RA22*RB21
       IC21=RA21*IB11+RA22*IB21
       RC22=RA21*RB12+RA22*RB22
       IC22=RA21*IB12+RA22*IB22
       AUX=REF0*X3 - 2.*PI*F*TT
       REAUX=COS(AUX)
       IMAUX=SIN(AUX)
       RD11=REAUX*RC11-IMAUX*IC11
       ID11=REAUX*IC11+IMAUX*RC11
       RD12=REAUX*RC12-IMAUX*IC12
       ID12=REAUX*IC12+IMAUX*RC12
       RD21=REAUX*RC21-IMAUX*IC21
       ID21=REAUX*IC21+IMAUX*RC21
       RD22=REAUX*RC22-IMAUX*IC22
       ID22=REAUX*IC22+IMAUX*RC22
       AUX=SINH(IMFI*X3)
       RA11=COSH(IMFI*X3)-REVF11*AUX
       IA11=             -IMVF11*AUX
       RA12=             -REVF12*AUX
       IA12=             -IMVF12*AUX
       RA21=             -REVF21*AUX
       IA21=             -IMVF21*AUX
       RA22=COSH(IMFI*X3)-REVF22*AUX
       IA22=             -IMVF22*AUX
       IF (IMF0.NE.0.) THEN
         AUX=-IMF0*X3
         AUX=EXP(-IMF0*X3)
         RB11=AUX*RA11
         IB11=AUX*IA11
         RB12=AUX*RA12
         IB12=AUX*IA12
         RB21=AUX*RA21
         IB21=AUX*IA21
         RB22=AUX*RA22
         IB22=AUX*IA22
       ELSE
         RB11=RA11
         IB11=IA11
         RB12=RA12
         IB12=IA12
         RB21=RA21
         IB21=IA21
         RB22=RA22
         IB22=IA22
       ENDIF
       REU11=RD11*RB11-ID11*IB11 + RD12*RB21-ID12*IB21
       REU12=RD11*RB12-ID11*IB12 + RD12*RB22-ID12*IB22
       REU21=RD21*RB11-ID21*IB11 + RD22*RB21-ID22*IB21
       REU22=RD21*RB12-ID21*IB12 + RD22*RB22-ID22*IB22
       IMU11=RD11*IB11+ID11*RB11 + RD12*IB21+ID12*RB21
       IMU12=RD11*IB12+ID11*RB12 + RD12*IB22+ID12*RB22
       IMU21=RD21*IB11+ID21*RB11 + RD22*IB21+ID22*RB21
       IMU22=RD21*IB12+ID21*RB12 + RD22*IB22+ID22*RB22
       RETURN
       END
C
C=======================================================================
C
      SUBROUTINE TCGMAT(A,B,C,D,E,F)
C
C----------------------------------------------------------------------
C Subroutine to compute the product of two 3x3 complex matrices
C (E+iF)=(A+iB)*(C+iD)
      REAL A(3,3),B(3,3),C(3,3),D(3,3),E(3,3),F(3,3)
C Input:
C     A,B,C,D ... Real and imaginary parts of the two matrices.
C Output:
C     E,F ... Real and imaginary parts of the resulting matrix.
C
C.......................................................................
      E(1,1)=A(1,1)*C(1,1)-B(1,1)*D(1,1)+A(1,2)*C(2,1)-B(1,2)*D(2,1)+
     *       A(1,3)*C(3,1)-B(1,3)*D(3,1)
      E(2,1)=A(2,1)*C(1,1)-B(2,1)*D(1,1)+A(2,2)*C(2,1)-B(2,2)*D(2,1)+
     *       A(2,3)*C(3,1)-B(2,3)*D(3,1)
      E(3,1)=A(3,1)*C(1,1)-B(3,1)*D(1,1)+A(3,2)*C(2,1)-B(3,2)*D(2,1)+
     *       A(3,3)*C(3,1)-B(3,3)*D(3,1)
      E(1,2)=A(1,1)*C(1,2)-B(1,1)*D(1,2)+A(1,2)*C(2,2)-B(1,2)*D(2,2)+
     *       A(1,3)*C(3,2)-B(1,3)*D(3,2)
      E(2,2)=A(2,1)*C(1,2)-B(2,1)*D(1,2)+A(2,2)*C(2,2)-B(2,2)*D(2,2)+
     *       A(2,3)*C(3,2)-B(2,3)*D(3,2)
      E(3,2)=A(3,1)*C(1,2)-B(3,1)*D(1,2)+A(3,2)*C(2,2)-B(3,2)*D(2,2)+
     *       A(3,3)*C(3,2)-B(3,3)*D(3,2)
      E(1,3)=A(1,1)*C(1,3)-B(1,1)*D(1,3)+A(1,2)*C(2,3)-B(1,2)*D(2,3)+
     *       A(1,3)*C(3,3)-B(1,3)*D(3,3)
      E(2,3)=A(2,1)*C(1,3)-B(2,1)*D(1,3)+A(2,2)*C(2,3)-B(2,2)*D(2,3)+
     *       A(2,3)*C(3,3)-B(2,3)*D(3,3)
      E(3,3)=A(3,1)*C(1,3)-B(3,1)*D(1,3)+A(3,2)*C(2,3)-B(3,2)*D(2,3)+
     *       A(3,3)*C(3,3)-B(3,3)*D(3,3)
C
      F(1,1)=A(1,1)*D(1,1)+B(1,1)*C(1,1)+A(1,2)*D(2,1)+B(1,2)*C(2,1)+
     *       A(1,3)*D(3,1)+B(1,3)*C(3,1)
      F(2,1)=A(2,1)*D(1,1)+B(2,1)*C(1,1)+A(2,2)*D(2,1)+B(2,2)*C(2,1)+
     *       A(2,3)*D(3,1)+B(2,3)*C(3,1)
      F(3,1)=A(3,1)*D(1,1)+B(3,1)*C(1,1)+A(3,2)*D(2,1)+B(3,2)*C(2,1)+
     *       A(3,3)*D(3,1)+B(3,3)*C(3,1)
      F(1,2)=A(1,1)*D(1,2)+B(1,1)*C(1,2)+A(1,2)*D(2,2)+B(1,2)*C(2,2)+
     *       A(1,3)*D(3,2)+B(1,3)*C(3,2)
      F(2,2)=A(2,1)*D(1,2)+B(2,1)*C(1,2)+A(2,2)*D(2,2)+B(2,2)*C(2,2)+
     *       A(2,3)*D(3,2)+B(2,3)*C(3,2)
      F(3,2)=A(3,1)*D(1,2)+B(3,1)*C(1,2)+A(3,2)*D(2,2)+B(3,2)*C(2,2)+
     *       A(3,3)*D(3,2)+B(3,3)*C(3,2)
      F(1,3)=A(1,1)*D(1,3)+B(1,1)*C(1,3)+A(1,2)*D(2,3)+B(1,2)*C(2,3)+
     *       A(1,3)*D(3,3)+B(1,3)*C(3,3)
      F(2,3)=A(2,1)*D(1,3)+B(2,1)*C(1,3)+A(2,2)*D(2,3)+B(2,2)*C(2,3)+
     *       A(2,3)*D(3,3)+B(2,3)*C(3,3)
      F(3,3)=A(3,1)*D(1,3)+B(3,1)*C(1,3)+A(3,2)*D(2,3)+B(3,2)*C(2,3)+
     *       A(3,3)*D(3,3)+B(3,3)*C(3,3)
C
      RETURN
      END
C
C=======================================================================
C
      SUBROUTINE TCGTRA(A,B,C,D)
C
C----------------------------------------------------------------------
C Subroutine to compute the transpose matrix to the 3x3 complex matrix
C (C+iD)=(A+iB)^T
      REAL A(3,3),B(3,3),C(3,3),D(3,3)
C Input:
C     A,B ... Real and imaginary parts of the input matrix.
C Output:
C     C,D ... Real and imaginary parts of the transposed matrix.
C
C.......................................................................
      C(1,1)=A(1,1)
      C(2,1)=A(1,2)
      C(3,1)=A(1,3)
      C(1,2)=A(2,1)
      C(2,2)=A(2,2)
      C(3,2)=A(2,3)
      C(1,3)=A(3,1)
      C(2,3)=A(3,2)
      C(3,3)=A(3,3)
C
      D(1,1)=B(1,1)
      D(2,1)=B(1,2)
      D(3,1)=B(1,3)
      D(1,2)=B(2,1)
      D(2,2)=B(2,2)
      D(3,2)=B(2,3)
      D(1,3)=B(3,1)
      D(2,3)=B(3,2)
      D(3,3)=B(3,3)
C
      RETURN
      END
C
C=======================================================================
C
      INCLUDE 'error.for'
C     error.for
      INCLUDE 'sep.for'
C     sep.for
      INCLUDE 'forms.for'
C     forms.for
      INCLUDE 'length.for'
C     length.for
C=======================================================================
C