SUBROUTINE MODDIR(JX) 11,17
C
C                   DIRECT SIMULATION WITH CENTRED DIFFERENCES 
C                        AND CRANK-NICHOLSON DAMPING.
C
      IMPLICIT NONE
      include 'champ.cdk'
C
      COMPLEX TERMZ,TERMS,TZ,TS,AVZ,AVS
      REAL WKK,KX,KY,KW,DMZ,DMS,DPZ,DPS,JX
      REAL FOREFF,RA(10000),AMRA
      INTEGER IO,NOUT,IR

      EXTERNAL CONVOL,SPEC,KR,FIELD,COUTDT

C
       open(1,file='rannor.io',status='old')
       read(1,103) (ra(ikx),ikx=1,10000)
       close(1)
 103   format(8f10.7)

      AMRA = 0.0
      IR   = 0
      NOUT = 3000
      JX   = 0.
C     ---------------------- RECORD OUTPUT ----------------------
      if (grflag.eq.1) then

        NOUT   =   NSTOP/(NSORTIE-1)

        open(10,file='spec.dat',status='unknown')
        open(11,file='tour.dat',status='unknown')
        open(111,file='tourr.dat',status='unknown')
        open(13,file='u.dat',status='unknown')
        open(14,file='w.dat',status='unknown')
        open(15,file='trac.dat',status='unknown')
        write(11,*) N,NP,NSORTIE
        write(13,*) N,NP,NSORTIE
        write(14,*) N,NP,NSORTIE
        write(15,*) N,NP,NSORTIE

      endif
C     -----------------------------------------------------------
      IF (TEFLAG.EQ.1) THEN
       open (18,file='traj.io',form='unformatted')
      ENDIF
C     -----------------------------------------------------------

      NT = 0
      IO = 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     ---------------------- RECORD OUTPUT ----------------------
      IF (GRFLAG.EQ.1) THEN
        CALL SPEC(ZO,SO,IKTX,IKTY,KTX,KTY,NS,SPZ,0,AJ,BJ,
     .                                       GRFLAG,NT*DELT)

        CALL KR(ZO,ZR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)
        write(11,99) ((ZR(IW,JW),IW=1,N),JW=1,NP)
        DO IW =1,N
         DO JW = 1,NP
          write(111,88) ZR(IW,JW)
         ENDDO
        ENDDO

        call FIELD(ZO,UK,TR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI,PXLIM,L,3)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = TR(IW,JW)
        ENDDO
        ENDDO
        write(13,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)

        call FIELD(ZO,WK,TR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI,PXLIM,L,4)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = TR(IW,JW)
        ENDDO
        ENDDO
        write(14,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)

        CALL KR(SO,SR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = SR(IW,JW)
        ENDDO
        ENDDO
        write(15,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)

      ENDIF
C     -----------------------------------------------------------


C
C                        FIRST TIMESTEP 
C


      IF(TEFLAG.EQ.1) write(18) ((ZO(IKX,IKY),IKX=1,IKTX),IKY=1,IKTY)
      IF(TRFLAG.EQ.1) THEN
     
c+       IF(NSTOP+2.GT.NTRAJ) THEN
c+        PRINT*,'NSTOP+2.GT.NTRAJ'
c+        PRINT*,'NSTOP,NTRAJ',NSTOP,NTRAJ
c+        STOP
c+       ENDIF
       DO IKX=1,IKTX
       DO IKY=1,IKTY
        ZTRAJ(IKX,IKY,1)=ZO(IKX,IKY)
        STRAJ(IKX,IKY,1)=SO(IKX,IKY)
       ENDDO
       ENDDO
      ENDIF
      IF(JXFLAG.EQ.1) THEN
       NT = -1
       CALL COUTDT(ZO,SO,JX)
      ENDIF


      NT = 1
C---------------------------------------------------------
      CALL CONVOL(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,U0)
C---------------------------------------------------------
      DO 20 IKX=1,IKTX
         KX = FLOAT(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
      IF(TEFLAG.EQ.1) write(18) ((ZN(IKX,IKY),IKX=1,IKTX),IKY=1,IKTY)
      IF(TRFLAG.EQ.1) THEN
       DO IKX=1,IKTX
       DO IKY=1,IKTY
        ZTRAJ(IKX,IKY,2)=ZN(IKX,IKY)
        STRAJ(IKX,IKY,2)=SN(IKX,IKY)
       ENDDO
       ENDDO
      ENDIF
C---------------------------------------------------------
      CALL CONVOL(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,U0)
C---------------------------------------------------------
c
C
      DO 30 IKX=1,IKTX
         KX = FLOAT(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

      IF(TEFLAG.EQ.1) write(18) ((ZN(IKX,IKY),IKX=1,IKTX),IKY=1,IKTY)
      IF(TRFLAG.EQ.1) THEN
       DO IKX=1,IKTX
       DO IKY=1,IKTY
        ZTRAJ(IKX,IKY,3)=ZN(IKX,IKY)
        STRAJ(IKX,IKY,3)=SN(IKX,IKY)
       ENDDO
       ENDDO
      ENDIF

      IF(JXFLAG.EQ.1) THEN
       CALL COUTDT(ZN,SN,JX)
      ENDIF

C
C                        SUBSEQUENT TIMESTEPS
C

      DO 50 NT=2,NSTOP
C
C---------------------------------------------------------
         CALL CONVOL(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,U0)
C---------------------------------------------------------
c

C        ------------------ FORCING AT K = 3 -----------------
         IF(FORCING.NE.0.) THEN
          IR=IR+1
          FOREFF=FORCING+AMRA*RA(IR)
          NZK(KF+1,KTY+1)=NZK(KF+1,KTY+1) + FOREFF*CMPLX(1.,0.)
          NZK(1,KF+KTY+1)=NZK(1,KF+KTY+1) + FOREFF*CMPLX(1.,0.)
         ENDIF

C
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*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
      IF(TEFLAG.EQ.1) write(18) ((ZN(IKX,IKY),IKX=1,IKTX),IKY=1,IKTY)
         IF(TRFLAG.EQ.1) THEN
          DO IKX=1,IKTX
          DO IKY=1,IKTY
           ZTRAJ(IKX,IKY,NT+2)=ZN(IKX,IKY)
           STRAJ(IKX,IKY,NT+2)=SN(IKX,IKY)
          ENDDO
          ENDDO
         ENDIF

         IF(JXFLAG.EQ.1) THEN
          CALL COUTDT(ZN,SN,JX)
         ENDIF


C     ---------------------- RECORD OUTPUT ----------------------
       IF (GRFLAG.EQ.1.and.mod(nt,nout).eq.0) THEN
c
C        print*,'     '
C        print*,'N, NSTOP: ',NT, NSTOP
 
        CALL SPEC(ZN,SN,IKTX,IKTY,KTX,KTY,NS,SPZ,0,AJ,BJ,
     .                                          GRFLAG,NT*DELT)
C
        PRINT*,'        '
C

        CALL KR(ZN,ZR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)
        write(11,99) ((ZR(IW,JW),IW=1,N),JW=1,NP)
        DO IW=1,N
        DO JW=1,NP
         write(111,88) ZR(IW,JW)
        ENDDO
        ENDDO

        call FIELD(ZN,UK,TR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI,PXLIM,L,3)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = TR(IW,JW)
        ENDDO
        ENDDO
        write(13,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)
        call FIELD(ZN,WK,TR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI,PXLIM,L,4)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = TR(IW,JW)
        ENDDO
        ENDDO
        write(14,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)
        DO IW=1,N
        DO JW=1,NP
         CHAMP(IW,JW) = SR(IW,JW)
        ENDDO
        ENDDO
        write(15,99) ((CHAMP(IW,JW),IW=1,N),JW=1,NP)


      ENDIF
C     -----------------------------------------------------------
c      IF(MOD(NT,100).EQ.0) PRINT*,'NT EQ ',NT

50    CONTINUE

      IF (OBFLAG.EQ.1.AND.NSTOP+2.EQ.NTRAJ) THEN

       open (16,file='obs.io',form='unformatted')
       PRINT*,'*************************************'
       PRINT*,' OBSERVATIONS ARE WRITTEN IN obs.dat'
       PRINT*,'*************************************'
       DO NT=1,NTRAJ
        print*,'write obs. time ',NT
        DO IKX=1,IKTX
         KX = FLOAT(IKX-1) 
         DO IKY=1,IKTY
           KY = FLOAT(IKY - KTY - 1)
           KW = MAX(KX*KX+KY*KY ,0.001 ) 
           UK(IKX,IKY)= L(IKX+KTX,IKY)*ZI*KY*ZTRAJ(IKX,IKY,NT)/KW
           WK(IKX,IKY)=-L(IKX+KTX,IKY)*ZI*KX*ZTRAJ(IKX,IKY,NT)/KW
c          NSK(IKX,IKY)= STRAJ(IKX,IKY,NT)
         ENDDO
        ENDDO
        CALL KR(UK,UR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)
        CALL KR(WK,WR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)
c        CALL KR(NSK,SR,KTX,KTY,IKTX,IKTY,N,N2,LWRK,
c     .                  FF1,FF2,FF3,WORK,TRIGS,IFAX,ZI)

        write(16) ((UR(IW,JW),IW=1,N),JW=1,N)
        write(16) ((WR(IW,JW),IW=1,N),JW=1,N)
c        write(16) ((SR(IW,JW),IW=1,N),JW=1,N)
       ENDDO
       close(16)

c++++
c       ENDIF
c++++
c       open (16,file='bkg.io',form='unformatted')
       open (16,file='cont.io',form='unformatted')
       PRINT*,'*************************************'
       PRINT*,' Z CONTROL IS WRITTEN IN CONT.dat'
       PRINT*,'*************************************'
       DO NT=1,NTRAJ
CC       print*,'write traj. time ',NT
        write(16) ((ZTRAJ(IW,JW,NT),IW=1,IKTX),JW=1,IKTY)
       ENDDO
       close(16)

      ENDIF


      if (grflag.eq.1) then
       close(10)
       close(11)
       close(111)
       close(13)
       close(14)
       close(15)
      endif
      IF (TEFLAG.EQ.1) close(18)


 99   FORMAT(8E12.4)
 88   FORMAT(E12.4)
      RETURN
      END