# Fortran Maccormack

1. Jan 19, 2017

### Cassius1n

Hi i have a problem in solving the maccormack algorithm for the following :
∂p/∂t+8*∂p/∂x=0,x∈(-10,10)
p(x,t=0)=e**-3x
the exact solution is u exact(x,t)=e**-3(x-8t)
I have to verify the solution with the exact solution at t=50* dt
This is what I've done so far:

Code (Fortran):

implicit none
integer,parameter::Nx=100
real*8,parameter::a1=-10.d0,b1=10.d0,CFL=0.01d0,a=8.d0
real*8,dimension(0:Nx)::uM,uaux,unew,x
real*8::u_ex,f1,g1,g2,f,eror,t,t1,dx,dt,tfinal
integer::i,contor

open(1,file='MacCormack_rez.txt')

dx=(b1-a1)/Nx
dt=CFL*dx/a
t=0.d0
contor=0
tfinal=50.d0*dt

t=0 (
do i=0,Nx
x(i)=a1+i*dx

uM(i)=f1(x(i))

end do
write (1,100) (f1(x(i)),i=0,Nx)

do while(t<tfinal)
t=t+dt
t1=t-dt/2.d0

2.Mac Cormack

do i=1,Nx-1
uaux(i)=uM(i)-CFL*(uM(i+1)-uM(i))
end do

do i=1,Nx-1
unew(i)=1/2.d0*((uM(i)+uaux(i))-CFL*(uaux(i)-uaux(i-1)))
end do
unew(0)=g1(t)
unew(Nx)=g2(t)
uM=unew
write(2,100)(uM(i),i=0,Nx)

t=50.d0*dt

write (1,100) (u_ex(x(i),t,a),i=0,Nx)

write(*,*) 'End program'
100 format(120(f16.9,1x))

end program

function u_ex(x,t,a)
implicit none
real*8::u_ex,x,t,a
real*8,parameter:: pi=4.d0*datan(1.d0)
u_ex=dexp(-3.d0*(x-a*t))
end function

function f1(x)
implicit none
real*8::f1,x
real*8,parameter:: pi=4.d0*datan(1.d0)
f1=dexp(-3.d0*x)
end function

function g1(t)
implicit none
real*8::g1,t
real*8,parameter:: pi=4.d0*datan(1.d0)
g1=0.d0
end function

function g2(t)
implicit none
real*8::g2,t
real*8,parameter:: pi=4.d0*datan(1.d0)
g2=0.d0
end function

function f(x,t)
implicit none
real*8::f,x,t
real*8,parameter:: pi=4.d0*datan(1.d0)
f=0.d0
end function

2. Jan 19, 2017

### Staff: Mentor

Welcome to PF!

So what's wrong? A compiler error? A runtime error?

3. Jan 19, 2017

### Cassius1n

4. Jan 20, 2017

### Staff: Mentor

Your error, which was just barely legible in you screen shot, is "An unterminated block exists".

You're missing a program statement at the beginning of your main program. You have an end program statement, but not the program statement.

It should look something like this
Code (Fortran):

program maccormack

implicit none
integer,parameter::Nx=100
real*8,parameter::a1=-10.d0,b1=10.d0,CFL=0.01d0,a=8.d0
real*8,dimension(0:Nx)::uM,uaux,unew,x
real*8::u_ex,f1,g1,g2,f,eror,t,t1,dx,dt,tfinal
integer::i,contor
! etc.
end program

function u_ex(x,t,a)
implicit none
real*8::u_ex,x,t,a
real*8,parameter:: pi=4.d0*datan(1.d0)
u_ex=dexp(-3.d0*(x-a*t))
end function

! Other function definitions

Also, this line:
Code (Text):
2.Mac Cormack
should either be removed or made into a comment. It is invalid Fortran code.

5. Jun 24, 2017