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