Verifying Fortran MacCormack Algorithm at t=50*dt

  • Context: Fortran 
  • Thread starter Thread starter Cassius1n
  • Start date Start date
  • Tags Tags
    Fortran
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
4 replies · 2K views
Cassius1n
Messages
13
Reaction score
0
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:

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'
    read(*,*)
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

Can someone give me an advice ,please?
 
Physics news on Phys.org
jedishrfu said:
Welcome to PF!

So what's wrong? A compiler error? A runtime error?
upload_2017-1-20_7-29-9.png
 
Cassius1n said:
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:

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'
    read(*,*)
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

Can someone give me an advice ,please?
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
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:
      2.Mac Cormack
should either be removed or made into a comment. It is invalid Fortran code.
 
Thank you for your response!