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(kind=single)  :: WKK,KX,KY,KW,DMZ,DMS,DPZ,DPS,JX
      REAL (kind=single) :: FOREFF,RA(10000),AMRA
      INTEGER            :: IO,NOUT,IR

      EXTERNAL CONVOL,SPEC,KR,FIELD,COUTDT

C     
      open(1,file='random.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 IKX=1,IKTX
         KX = FLOAT(IKX-1)
         DO IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).eq.1 ) then
               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
            end if
         end do
      end do
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 IKX=1,IKTX
         KX = FLOAT(IKX-1)
         DO IKY=1,IKTY
            IF ( L(IKX+KTX,IKY).eq.1 ) then
               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.
            end if
         end do
      end do

      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  IKX=1,IKTX
            KX = FLOAT(IKX-1) 
            DO  IKY=1,IKTY
               IF ( L(IKX+KTX,IKY).eq.1 ) then
                  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
               end if
            end do
         end do
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*,'     '
            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='./files/obs.io',form='unformatted'
     S        ,status='unknown')
         PRINT*,'*************************************'
         PRINT*,' OBSERVATIONS ARE WRITTEN IN obs.io, NTRAJ = ',ntraj
         PRINT*,'*************************************'
         DO NT=1,NTRAJ
            if(mod(nt,10).eq.0) write(6,*)'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='./files/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
            if(mod(nt,10).eq.0) write(6,*) '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