c     wave equation
c     du/dt+c*du/dx (c>0)
c     1: FTCS
c     2: Lax
c     3: Lax-Wendroff
c     4: 1st-order up-wind (kazakami)
c
      parameter (nx=50)
      integer imode
      integer i,j
      real x,u(0:nx),du(0:nx)
      real c
      real dt,dx,nu

      Open(9,FILE='wave.dat',STATUS='UNKNOWN')

      write(6,*) 'wave equation'
      write(6,*) 'du/dt+c*du/dx (c>0)'
      write(6,*) '1: FTCS'
      write(6,*) '2: Lax'
      write(6,*) '3: Lax-Wendroff'
      write(6,*) '4: 1st-order up-wind (kazakami)'
      write(6,*) ' imode ?'
      read(5,*) imode
      write(6,*) ' nu ?'
      read(5,*) nu
      write(6,*) 'step number'
      read(5,*) nstep
      c=1.0
      dx=1.0/nx
      dt=nu*dx/c

      write(6,*) c,nu,dt

      t=0.0

c     initial condition
      do 10 j=0,nx
        x=dx*j
        if(x.le.0.5) then
          u(j)=1.0
        else
          u(j)=0.0
        endif
 10   continue

      Do 40 j=1,nx
        Write(9,11) u(j)
 40     Continue
        Write(9,11)

      do 100 i=1,nstep
        t=t+dt
        do 20 j=1,nx-1
          du(j)=-nu/2.0*(u(j+1)-u(j-1))
          if(imode.eq.1) then
            du(j)=du(j)
          elseif(imode.eq.2) then
            du(j)=du(j)+1.0/2.0*(u(j+1)-2*u(j)+u(j-1))
          elseif(imode.eq.3) then
            du(j)=du(j)+nu**2/2.0*(u(j+1)-2*u(j)+u(j-1))
          elseif(imode.eq.4) then
            du(j)=du(j)+nu/2.0*(u(j+1)-2*u(j)+u(j-1))
          endif
 20     continue
        do 30 j=1,nx-1
          u(j)=u(j)+du(j)
 30     continue

            Do 50 j=1,nx
              Write(9,11) u(j)
 50         Continue
            Write(9,11)

 100      continue

 11    Format (e12.6)
        Close(9)
        Stop 'data saved in wave.dat'

      end