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

Discussion Overview

The discussion revolves around verifying the MacCormack algorithm implementation for solving a hyperbolic partial differential equation. Participants are focused on the numerical solution's accuracy compared to the exact solution at a specific time, t=50*dt. The context includes coding issues and debugging in Fortran.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Homework-related

Main Points Raised

  • The original poster describes their implementation of the MacCormack algorithm and the initial conditions for the problem.
  • Some participants inquire about the nature of the problem, asking whether it is a compiler or runtime error.
  • A participant suggests that the original poster is missing a program statement at the beginning of their main program, which could lead to an "unterminated block" error.
  • Another participant points out that a specific line in the code ("2.Mac Cormack") is invalid and should be removed or commented out.

Areas of Agreement / Disagreement

There is no consensus on the specific issues with the code, as participants are offering different suggestions and clarifications. The discussion remains unresolved regarding the exact nature of the errors in the implementation.

Contextual Notes

Participants have noted potential coding errors and missing statements, but the discussion does not resolve these issues definitively. The original poster's code includes several functions and parameters that may require further scrutiny.

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