SUBROUTINE LININC(JX) 5,6

C
C     TANGENT LINEAR MODEL OF THE 2D BOUSSINESQ EQUATIONS
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,JX       
C
C
      EXTERNAL CONLIN,SPEC,FIELD,COUTLI

      NT = 0
      JX = 0.

      DO IKX=1,IKTX
      DO IKY=1,IKTY
        IF (L(IKX+KTX,IKY).NE.1) THEN
          ZO(IKX,IKY) = 0.0
          SO(IKX,IKY) = 0.0
        ENDIF
      ENDDO
      ENDDO      

C
C                        FIRST TIMESTEP 
C

      IF(NSTOP+2.GT.NTRAJ) THEN
        PRINT*,'NSTOP+2.GT.NTRAJ'
        PRINT*,'NSTOP,NTRAJ',NSTOP,NTRAJ
        STOP
      ENDIF

      DO IKX=1,IKTX
      DO IKY=1,IKTY
        ZT(IKX,IKY)=ZTRAJ(IKX,IKY,1)
        ST(IKX,IKY)=STRAJ(IKX,IKY,1)
        ZTRA2(IKX,IKY,1)=ZO(IKX,IKY)
        STRA2(IKX,IKY,1)=SO(IKX,IKY)
      ENDDO
      ENDDO
      IF(JXFLAG.EQ.1) THEN
       NT = -1
       CALL COUTLI(ZO,SO,JX)
      ENDIF

      NT = 1
C---------------------------------------------------------
      CALL CONLIN(ZO,SO,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 20 IKX=1,IKTX
         KX = IKX-1
         DO 20 IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 20
            WKK = WN(IKX+KTX,IKY)
            TERMZ = NZK(IKX,IKY) 
     .                 + BE*ZI*KX*ZO(IKX,IKY)/WKK
            TERMS = NSK(IKX,IKY)  
C
            RHZ(IKX,IKY) = TERMZ
            RHS(IKX,IKY) = TERMS
            ZN(IKX,IKY) = ZO(IKX,IKY) + DELT*TERMZ
            SN(IKX,IKY) = SO(IKX,IKY) + DELT*TERMS
20    CONTINUE
C

      DO IKX=1,IKTX
      DO IKY=1,IKTY
        ZT(IKX,IKY)=ZTRAJ(IKX,IKY,2)
        ST(IKX,IKY)=STRAJ(IKX,IKY,2)
        ZTRA2(IKX,IKY,2)=ZN(IKX,IKY)
        STRA2(IKX,IKY,2)=SN(IKX,IKY)
      ENDDO
      ENDDO

C---------------------------------------------------------
      CALL CONLIN(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---------------------------------------------------------
c
C
      DO 30 IKX=1,IKTX
         KX = IKX-1
         DO 30 IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 30
            WKK = WN(IKX+KTX,IKY)

            TERMZ = NZK(IKX,IKY) 
     .                  + BE*ZI*KX*ZN(IKX,IKY)/WKK
            TERMS = NSK(IKX,IKY) 

            ZN(IKX,IKY)=ZO(IKX,IKY)+DELT*(TERMZ+RHZ(IKX,IKY))/2.
            SN(IKX,IKY)=SO(IKX,IKY)+DELT*(TERMS+RHS(IKX,IKY))/2.
30    CONTINUE

      DO IKX=1,IKTX
      DO IKY=1,IKTY
        ZT(IKX,IKY)=ZTRAJ(IKX,IKY,3)
        ST(IKX,IKY)=STRAJ(IKX,IKY,3)
        ZTRA2(IKX,IKY,3)=ZN(IKX,IKY)
        STRA2(IKX,IKY,3)=SN(IKX,IKY)
      ENDDO
      ENDDO
      IF(JXFLAG.EQ.1) THEN
        CALL COUTLI(ZN,SN,JX)
      ENDIF

C
C                        SUBSEQUENT TIMESTEPS
C

      DO 50 NT=2,NSTOP
C
C---------------------------------------------------------
      CALL CONLIN(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---------------------------------------------------------
c
         DO 40 IKX=1,IKTX
            KX = IKX-1 
            DO 40 IKY=1,IKTY
               WKK = WN(IKX+KTX,IKY)
               IF ( L(IKX+KTX,IKY).NE.1 ) GO TO 40

               TERMZ = NZK(IKX,IKY) 
     .                       + BE*ZI*KX*ZN(IKX,IKY)/WKK
               TERMS = NSK(IKX,IKY) 
C
               DPZ = 1.+NU(IKX,IKY)   *DELT
               DMZ = 1.-NU(IKX,IKY)   *DELT
               DPS = 1.+GAMMA(IKX,IKY)*DELT
               DMS = 1.-GAMMA(IKX,IKY)*DELT
               TZ = ( ZO(IKX,IKY)*DMZ + D2*TERMZ )/DPZ
               TS = ( SO(IKX,IKY)*DMS + D2*TERMS )/DPS
C
               AVZ = ZN(IKX,IKY) + ROBERT* (TZ -
     .                          2.*ZN(IKX,IKY) + ZO(IKX,IKY))
               AVS = SN(IKX,IKY) + ROBERT* (TS -
     .                          2.*SN(IKX,IKY) + SO(IKX,IKY))
C
               ZO(IKX,IKY) = AVZ
               SO(IKX,IKY) = AVS
               ZN(IKX,IKY) = TZ
               SN(IKX,IKY) = TS
40       CONTINUE
C
C
C
      DO IKX=1,IKTX
      DO IKY=1,IKTY
        ZT(IKX,IKY)=ZTRAJ(IKX,IKY,NT+2)
        ST(IKX,IKY)=STRAJ(IKX,IKY,NT+2)
        ZTRA2(IKX,IKY,NT+2)=ZN(IKX,IKY)
        STRA2(IKX,IKY,NT+2)=SN(IKX,IKY)
      ENDDO
      ENDDO
      IF(JXFLAG.EQ.1) THEN
       CALL COUTLI(ZN,SN,JX)
      ENDIF

50    CONTINUE

      RETURN
      END