SUBROUTINE ADJINC 8,7
C
C ADJOINT SIMULATION WITH CENTRED DIFFERENCES AND CRANK-NICHOLSON DAMPING.
C
      IMPLICIT NONE
      INCLUDE 'champ.cdk'
      INCLUDE 'chinc.cdk'
C
      COMPLEX TERMZ,TERMS,TZ,TS,AVZ,AVS
C
      REAL DMZ,DMS,DPZ,DPS,WKK,KX,DIV2       
C
      EXTERNAL CONADJ,GRADDT


      NT = NSTOP
      DO 1 IKX=1,IKTX
      DO 1 IKY=1,IKTY
      ZO(IKX,IKY)=CMPLX(0.,0.)
      ZN(IKX,IKY)=CMPLX(0.,0.)
      SO(IKX,IKY)=CMPLX(0.,0.)
      SN(IKX,IKY)=CMPLX(0.,0.)
      ZT(IKX,IKY) = ZTRAJ(IKX,IKY,NT+2)
      ST(IKX,IKY) = STRAJ(IKX,IKY,NT+2)
1     CONTINUE


C
C                        SUBSEQUENT TIMESTEPS
C


      DO 10 NT=NSTOP,2,-1

       CALL GRADIN

         DO 20 IKX=1,IKTX
         DO 20 IKY=1,IKTY

            ZT(IKX,IKY) = ZTRAJ(IKX,IKY,NT+1)
            ST(IKX,IKY) = STRAJ(IKX,IKY,NT+1)

            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 20

            ZN(IKX,IKY) = ZN(IKX,IKY) + NZK(IKX,IKY)
            SN(IKX,IKY) = SN(IKX,IKY) + NSK(IKX,IKY)

            AVZ = ZO(IKX,IKY)
            TZ  = ZN(IKX,IKY)
            AVS = SO(IKX,IKY)
            TS  = SN(IKX,IKY)
            
            ZO(IKX,IKY) = ROBERT*AVZ
            SO(IKX,IKY) = ROBERT*AVS
            ZN(IKX,IKY) = (1-2*ROBERT)*AVZ
            SN(IKX,IKY) = (1-2*ROBERT)*AVS
            TZ = ROBERT*AVZ + TZ
            TS = ROBERT*AVS + TS

            DPZ = 1.+NU(IKX,IKY)*DELT
            DPS = 1.+GAMMA(IKX,IKY)*DELT

            RHZ(IKX,IKY) = TZ/DPZ
            RHS(IKX,IKY) = TS/DPS

 20     CONTINUE

C---------------------------------------------------------
      CALL CONADJ(RHZ,RHS,NZK,NSK,IKTX,IKTY,KTX,KTY,
     .                  N,N2,L,PXLIM,LWRK,WORK,TRIGS,IFAX,
     .      FF1,FF2,FF3,UK,WK,UR,WR,ZR,SR,NZR,NSR,ZI,
     .      ZT,ST,NTR,NTK,U0)
C---------------------------------------------------------


         DO 40 IKX=1,IKTX
            KX = FLOAT(IKX-1) 
            DO 40 IKY=1,IKTY
               IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 40
               WKK = WN(IKX+KTX,IKY)

               TERMZ = NZK(IKX,IKY) 
     .                       - BE*ZI*KX*RHZ(IKX,IKY)/WKK
               TERMS = NSK(IKX,IKY) 
C
               DMZ = 1.-NU(IKX,IKY)   *DELT
               DMS = 1.-GAMMA(IKX,IKY)*DELT
C
               ZO(IKX,IKY) = ZO(IKX,IKY) + DMZ*RHZ(IKX,IKY)
               SO(IKX,IKY) = SO(IKX,IKY) + DMS*RHS(IKX,IKY)
               ZN(IKX,IKY) = ZN(IKX,IKY) + D2*TERMZ
               SN(IKX,IKY) = SN(IKX,IKY) + D2*TERMS

40       CONTINUE

10    CONTINUE



C
C                        FIRST TIMESTEP 
C

      NT = 1
      CALL GRADIN

         DO 60 IKX=1,IKTX
         DO 60 IKY=1,IKTY

            ZT(IKX,IKY) = ZTRAJ(IKX,IKY,2)
            ST(IKX,IKY) = STRAJ(IKX,IKY,2)

            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 60

            ZN(IKX,IKY) = ZN(IKX,IKY) + NZK(IKX,IKY)
            SN(IKX,IKY) = SN(IKX,IKY) + NSK(IKX,IKY)

60    CONTINUE


C---------------------------------------------------------
      CALL CONADJ(ZN,SN,NZK,NSK,IKTX,IKTY,KTX,KTY,
     .                  N,N2,L,PXLIM,LWRK,WORK,TRIGS,IFAX,
     .      FF1,FF2,FF3,UK,WK,UR,WR,ZR,SR,NZR,NSR,ZI,
     .      ZT,ST,NTR,NTK,U0)
C---------------------------------------------------------


      DIV2=DELT/2.
      DO 65 IKX=1,IKTX
      DO 65 IKY=1,IKTY
         RHZ(IKX,IKY)=DIV2*NZK(IKX,IKY)
         RHS(IKX,IKY)=DIV2*NSK(IKX,IKY)
         ZT(IKX,IKY) = ZTRAJ(IKX,IKY,1)
         ST(IKX,IKY) = STRAJ(IKX,IKY,1)
 65   CONTINUE


C---------------------------------------------------------
      CALL CONADJ(ZN,SN,NZK,NSK,IKTX,IKTY,KTX,KTY,
     .                  N,N2,L,PXLIM,LWRK,WORK,TRIGS,IFAX,
     .      FF1,FF2,FF3,UK,WK,UR,WR,ZR,SR,NZR,NSR,ZI,
     .      ZT,ST,NTR,NTK,U0)
C---------------------------------------------------------


      DO 70 IKX=1,IKTX
         KX = FLOAT(IKX-1)
         DO 70 IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 70
            WKK = WN(IKX+KTX,IKY)

            TERMZ = -BE*ZI*KX*ZN(IKX,IKY)/WKK

            ZO(IKX,IKY) = ZO(IKX,IKY) + ZN(IKX,IKY)
     .                  + DIV2*(TERMZ + NZK(IKX,IKY))
            SO(IKX,IKY) = SO(IKX,IKY) + SN(IKX,IKY)
     .                  + DIV2*(NSK(IKX,IKY))

            RHZ(IKX,IKY) = RHZ(IKX,IKY) + DIV2*TERMZ 

70    CONTINUE

C

C---------------------------------------------------------
      CALL CONADJ(RHZ,RHS,NZK,NSK,IKTX,IKTY,KTX,KTY,
     .                  N,N2,L,PXLIM,LWRK,WORK,TRIGS,IFAX,
     .      FF1,FF2,FF3,UK,WK,UR,WR,ZR,SR,NZR,NSR,ZI,
     .      ZT,ST,NTR,NTK,U0)
C---------------------------------------------------------
C
C

      DO 75 IKX=1,IKTX
         KX = FLOAT(IKX-1)
         DO 75 IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 75
            WKK = WN(IKX+KTX,IKY)

            TERMZ = -BE*ZI*KX*RHZ(IKX,IKY)/WKK

            ZN(IKX,IKY) = RHZ(IKX,IKY) 
     .                  + DELT*(TERMZ+NZK(IKX,IKY))
            SN(IKX,IKY) = RHS(IKX,IKY)
     .                  + DELT*(NSK(IKX,IKY))

            ZO(IKX,IKY) = ZO(IKX,IKY) + ZN(IKX,IKY)
            SO(IKX,IKY) = SO(IKX,IKY) + SN(IKX,IKY)

75    CONTINUE

      NT = -1
      CALL GRADIN

         DO 80 IKX=1,IKTX
         DO 80 IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 80

            ZO(IKX,IKY) = ZO(IKX,IKY) + NZK(IKX,IKY)
            SO(IKX,IKY) = SO(IKX,IKY) + NSK(IKX,IKY)

80    CONTINUE


      RETURN
      END