cccccc 11.5a function ff(x) ff=0.5*x*x return end subroutine split(x,x_p,x_n) x_p=0.0 x_n=0.0 if(x.gt.0.0) x_p=x ! x+ if(x.lt.0.0) x_n=x ! x- return end function fminmod(a,b) if(abs(a).lt.abs(b)) then fminmod=a else fminmod=b endif return end program main parameter(ngrid=100,cfl=0.2,toll=1.d-8) dimension x(ngrid+1),n(ngrid+1),u(ngrid+1) dimension s(ngrid+1),s_p(ngrid+1),s_n(ngrid+1) ! s(i) for s i+1/2 dimension du(ngrid+1),fflux(ngrid+1) ttotal=1.0 xl=-10.0 xr=10.0 dx=(xr-xl)/(ngrid+1) do i=1,ngrid+1 x(i)=xl+dx*(i-1) if(x(i).lt.0.0.or.x(i).gt.1.0) then u(i)=0.0 else u(i)=2.0 endif enddo dt=cfl*dx time=dt r=dt/dx 10 continue do i=1,ngrid du(i)=u(i+1)-u(i) if(abs(du(i)).lt.toll) then s(i)=u(i+1) else s(i)=(ff(u(i+1))-ff(u(i)))/du(i) endif call split(s(i),s_p(i),s_n(i)) enddo do 5 i=2,ngrid-1 du1=du(i) if(s(i).gt.0.0) then du2=du(i-1) else du2=du(i+1) endif dw=fminmod(du1,du2) aa=abs(s(i)) fflux(i)=0.5*aa*(1-r*aa)*dw 5 continue if(s(1).gt.0.0) then dw=du(1) else dw=fminmod(du(1),du(2)) endif aa=abs(s(1)) fflux(1)=0.5*aa*(1-r*aa)*dw if(s(ngrid).lt.0.0) then dw=du(ngrid) else dw=fminmod(du(ngrid),du(ngrid-1)) endif aa=abs(s(ngrid)) fflux(ngrid)=0.5*aa*(1-r*aa)*dw do 15 i=2,ngrid u(i)=u(i)-r*(s_p(i-1)*du(i-1)+s_n(i)*du(i)) $ -r*(fflux(i)-fflux(i-1)) 15 continue u(1)=0.0 u(ngrid+1)=0.0 time=time+dt if(time.lt.ttotal) goto 10 write(*,*)'time=',time write(*,*)'results are recorded in the file fort.1' write(*,*)'in the following form' write(*,*)'coordinate - conservative method - nonconservative $ method' do i=1,ngrid+1 write(1,*)x(i),u(i) enddo return end