Verifying Fortran MacCormack Algorithm at t=50*dt

  • Context: Fortran 
  • Thread starter Thread starter Cassius1n
  • Start date Start date
  • Tags Tags
    Fortran
Click For Summary
SUMMARY

The forum discussion centers on verifying the MacCormack algorithm for solving the hyperbolic partial differential equation ∂p/∂t + 8*∂p/∂x = 0 with initial condition p(x, t=0) = e-3x. The exact solution is given as u_exact(x, t) = e-3(x-8t). A user encountered a compilation error due to a missing program statement at the beginning of their Fortran code. The correct structure requires a 'program maccormack' statement before the main code block.

PREREQUISITES
  • Understanding of Fortran programming language
  • Familiarity with numerical methods for solving partial differential equations
  • Knowledge of the MacCormack algorithm
  • Basic concepts of initial value problems in the context of PDEs
NEXT STEPS
  • Review Fortran program structure and syntax
  • Study the MacCormack algorithm in detail
  • Learn about numerical stability and convergence in PDE solvers
  • Explore debugging techniques for Fortran code
USEFUL FOR

Researchers, students, and professionals in computational physics, numerical analysis, and anyone implementing numerical methods for solving partial differential equations using Fortran.

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?
 
Technology news on Phys.org
Welcome to PF!

So what's wrong? A compiler error? A runtime error?
 
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!
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
Replies
1
Views
2K
  • · Replies 20 ·
Replies
20
Views
2K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 54 ·
2
Replies
54
Views
5K
  • · Replies 6 ·
Replies
6
Views
2K