Vous êtes sur la page 1sur 7

APPENDIX 2: CODES FOR FLUX LIMITERS

!-----------------------------------------------------------------!HIGH RESOLUTION SCHEMES- TVD FLUX LIMITERS


!TVD LIMITERS APPLIED TO LAXWENDROFF METHOD
!AUTHOR : P.ANISH ARAVINTH
!----------------------------------------------------------------PROGRAM LAXWENDROFF
IMPLICIT NONE
INTEGER, PARAMETER

:: dp = SELECTED_REAL_KIND(13)

REAL(dp)
:: dx, dt
REAL(dp)
:: w, t
REAL(dp)
:: xmin, xmax
REAL(dp)
:: CFL
REAL(dp)
:: C, D
REAL(dp)
:: alpha0, beta0
REAL(dp)
:: alpha1, beta1
REAL(dp)
:: xe1, xe2, x01, x02
REAL(dp)
:: p1, p2
INTEGER
:: NT, NX
INTEGER
:: i, j , METHOD
REAL(dp),ALLOCATABLE :: x(:)
REAL(dp),ALLOCATABLE :: u0(:),ue(:)
REAL(dp),ALLOCATABLE :: u(:)
REAL(dp),ALLOCATABLE :: un(:)
!-----------------------------------------------------------------!LOCAL VARIABLES
!-----------------------------------------------------------------xmin = 0
xmax = 20
NX = 100
w = 10
CFL = 0.8
t = 0.1
x01 = 0.3
x02 = 0.7
u0(:)
alpha0
alpha1
beta0
beta1

=
=
=
=
=

u(:)
1
0
0.5*(1 + CFL)
0.5*(1 - CFL)

dx =(xmax - xmin)/NX
dt = CFL*dx/w
NT = t/dt

ALLOCATE(x(NX),u0(NX),u(NX),ue(NX))
WRITE(*,*) 'CHOOSE A FLUX LIMITER METHOD'
WRITE(*,*) '1. MINMOD '
WRITE(*,*) '2. VANLEER '
WRITE(*,*) '3. VANALBADA'
WRITE(*,*) '4. SUPERBEE'
READ(*,*) METHOD
!------------------------------------------------------------------!INITIAL CONDITION
!------------------------------------------------------------------DO i = 1, NX
x(i) = xmin + (i-1)*dx
IF ( x(i) .LE. x01 ) THEN
u(i) = 0
ELSE IF ( ( x(i) .GT. x01 ) .AND. ( x(i) .LT. x02 )) THEN
u(i) = 1
ELSE
u(i) = 0
END IF
END DO
u0(:) = u(:)
!------------------------------------------------------------------!EXACT SOLUTION FOR LINEAR ADVECTION EQUATION
!------------------------------------------------------------------xe1 = x01 + w*t
xe2 = x02 + w*t
DO i = 1, NX
IF ( x(i) .LE. xe1 ) THEN
ue(i) = 0
ELSE IF ( ( x(i) .GT. xe1 ) .AND. ( x(i) .LT. xe2 )) THEN
ue(i) = 1
ELSE
ue(i) = 0
END IF
END DO
!-----------------------------------------------------------------OPEN(UNIT=10,FILE='D:\CFD\OUTPUT\LAXWENDROFF.DAT')
DO I=1,NX
WRITE(10,*) x(I), ue(I)
END DO
CLOSE(10)
!-------------------------------------------------------------------

SELECT CASE (METHOD)


CASE (1)
!------------------------------------------------------------------!MINMOD LIMITER
!------------------------------------------------------------------ALLOCATE(un(NX))
DO j = 1, NT
DO i = 2, NX-1
p1 = MINMOD( u0(i), u0(i+1), u0(i-1) )
IF (i .NE. 2) THEN
p2 = MINMOD( u0(i-1), u0(i), u0(i-2) )
ELSE
p2 = MINMOD( u0(i-1), u0(i), u0(NX) )
END IF
C = CFL*(alpha0+(beta0-alpha0)*p2)
D = -CFL*(alpha1+(beta1-alpha1)*p1)
un(i) = u0(i) - C*(u0(i)-u0(i-1)) + D*(u0(i+1)-u0(i))
END DO
un(1) = un(2)
un(NX) = un(NX-1)
u0(:) = un(:)
END DO
!------------------------------------------------------------------OPEN(UNIT=100,FILE='D:\CFD\OUTPUT\MINMOD.DAT')
DO I=1,NX
WRITE(100,*) x(I), un(I)
END DO
CLOSE(100)
!------------------------------------------------------------------CASE(2)
!------------------------------------------------------------------!VANLEER FLUX LIMITER
!------------------------------------------------------------------ALLOCATE(un(NX))
DO j = 1, NT
DO i = 2, NX-1
p1 = VANLEER( u0(i), u0(i+1), u0(i-1) )
WRITE(*,*) u0(i) ,p1
IF (i .NE. 2) THEN
p2 = VANLEER( u0(i-1), u0(i), u0(i-2) )
ELSE
p2 = VANLEER( u0(i-1), u0(i), u0(NX) )
END IF
C = CFL*(alpha0+(beta0-alpha0)*p2)
D = -CFL*(alpha1+(beta1-alpha1)*p1)

un(i) = u0(i) - C*(u0(i)-u0(i-1)) + D*(u0(i+1)-u0(i))


END DO
un(1) = un(2)
un(NX) = un(NX-1)
u0(:) = un(:)
END DO
!------------------------------------------------------------------OPEN(UNIT=100,FILE='D:\CFD\OUTPUT\VANLEER.DAT')
DO I=1,NX
WRITE(100,*) x(I), un(I)
END DO
CLOSE(100)
!------------------------------------------------------------------CASE(3)
!------------------------------------------------------------------!VANALBADA FLUX LIMITER
!------------------------------------------------------------------ALLOCATE(un(NX))
DO j = 1, NT
DO i = 2, NX-1
p1 = VANALBADA( u0(i), u0(i+1), u0(i-1) )
IF (i .NE. 2) THEN
p2 = VANALBADA( u0(i-1), u0(i), u0(i-2) )
ELSE
p2 = VANALBADA( u0(i-1), u0(i), u0(NX) )
END IF
C = CFL*(alpha0+(beta0-alpha0)*p2)
D = -CFL*(alpha1+(beta1-alpha1)*p1)
un(i) = u0(i) - C*(u0(i)-u0(i-1)) + D*(u0(i+1)-u0(i))
END DO
un(1) = un(2)
un(NX) = un(NX-1)
u0(:) = un(:)
END DO
CASE(4)
!------------------------------------------------------------------!SUPERBEE FLUX LIMITER
!------------------------------------------------------------------ALLOCATE(un(NX))
DO j = 1, NT
DO i = 2, NX-1
p1 = SUPERBEE( u0(i), u0(i+1), u0(i-1) )
WRITE(*,*) u0(i) ,p1
IF (i .NE. 2) THEN
p2 = SUPERBEE( u0(i-1), u0(i), u0(i-2) )
ELSE
p2 = SUPERBEE( u0(i-1), u0(i), u0(NX) )
END IF

C = CFL*(alpha0+(beta0-alpha0)*p2)
D = -CFL*(alpha1+(beta1-alpha1)*p1)
un(i) = u0(i) - C*(u0(i)-u0(i-1)) + D*(u0(i+1)-u0(i))
END DO
un(1) = un(2)
un(NX) = un(NX-1)
u0(:) = un(:)
END DO
!------------------------------------------------------------------OPEN(UNIT=100,FILE='D:\CFD\OUTPUT\SUPERBEE.DAT')
DO I=1,NX
WRITE(100,*) x(I), un(I)
END DO
CLOSE(100)
!------------------------------------------------------------------END SELECT
CONTAINS
!------------------------------------------------------------------!FUNCTION FOR MINMOD LIMITER
!------------------------------------------------------------------FUNCTION MINMOD ( a, b, c ) RESULT (phi)
REAL(dp)
:: a, b, c ! u(i), u(i+1), u(i-1) for p1
! u(i-1), u(i), u(i-2) for p2
REAL(dp)
:: phi
REAL(dp)
:: r
IF ( b .NE. a ) THEN
r = (a-c)/(b-a)
ELSE
r = 1
END IF
!------------------------------------------------------------------IF (r .LT. 0) THEN
phi = 0
ELSE IF ( ( r .GE. 0 ).AND.(r .LT. 1) ) THEN
phi = r
ELSE
phi = 1
END IF
END FUNCTION MINMOD
!------------------------------------------------------------------!FUNCTION FOR VANLEER LIMITER
!------------------------------------------------------------------FUNCTION VANLEER ( a, b, c ) RESULT (phi)
REAL(dp)
:: a, b, c ! u(i), u(i+1), u(i-1) for p1
! u(i-1), u(i), u(i-2) for p2
REAL(dp)
:: phi
REAL(dp)
:: r

IF ( b .NE. a ) THEN
r = (a-c)/(b-a)
ELSE
r = 2
END IF
!------------------------------------------------------------------IF (r .LT. 0) THEN
phi = 0
ELSE IF ( r .GE. 0 ) THEN
phi = 2*r/(r+1)
END IF
END FUNCTION VANLEER
!-----------------------------------------------------------------!FUNCTION FOR VANALBADA LIMITER
!-----------------------------------------------------------------FUNCTION VANALBADA ( a, b, c ) RESULT (phi)
REAL(dp)
:: a, b, c ! u(i), u(i+1), u(i-1) for p1
! u(i-1), u(i), u(i-2) for p2
REAL(dp)
:: phi
REAL(dp)
:: r
IF ( b .NE. a ) THEN
r = (a-c)/(b-a)
ELSE
r = 2
END IF
!----------------------------------------------------------------IF (r .LT. 0) THEN
phi = 0
ELSE IF ( r .GE. 0 ) THEN
phi = r*(1+r)/(1+r**2)
END IF
END FUNCTION VANALBADA
!------------------------------------------------------------------!FUNCTION FOR SUPERBEE LIMITER
!------------------------------------------------------------------FUNCTION SUPERBEE ( a, b, c ) RESULT (phi)
REAL(dp)
:: a, b, c ! u(i), u(i+1), u(i-1)
REAL(dp)
:: phi
REAL(dp)
:: r
IF ( b .NE. a ) THEN
r = (a-c)/(b-a)
ELSE
r = 2
END IF
IF ( r .LE. 0 ) THEN

phi = 0
ELSE IF (( r .GT. 0 ) .AND. (r .LE. 0.5)) THEN
phi = 2*r
ELSE IF (( r .GT. 0.5) .AND. (r .LE. 1)) THEN
phi = 1
ELSE IF (( r .LT. 1 ) .AND. (r .LE. 2)) THEN
phi = r
ELSE IF ( r .GT. 2 ) THEN
phi = 2
ELSE
phi = 2
END IF
END FUNCTION SUPERBEE
END PROGRAM

Vous aimerez peut-être aussi