c
Program burger.for: resolution de l'equation de Burgers
1D IMPLICIT NONE
c*********************************************************** c
declaration des variables
* c*********************************************************** !variables
de boucle INTEGER i, j, t !declaration
des constantes REAL PI
!pas
de temps et d'espace, visc., param. num. INTEGER
n, k !n_iter, n_espace REAL deltax, deltat, s ,r REAL q,
delta !param num schema REAL nu !visc. cin.
!choix
du schema et de l'initialisation INTEGER klim
!indce de changement de sgn INTEGER scheme !var de
schema INTEGER init !var d'initialisation CHARACTER*10
name_scheme CHARACTER*10 name_init
!variables
de sortie des resultats INTEGER pas_sortie,
compteur_time, cur_time CHARACTER*2000 frmt
!definition
des matrices et vecteurs REAL
mat,d,u0 ALLOCATABLE mat(:),d(:),u0(:)
c
definition des constantes ******************************** PI
=
3.14159265359
c*********************************************************** c
initialisation
* c*********************************************************** c****
lecture des donnees
********************************** !donnees OPEN
(1,FILE='input.txt') READ (1,*) nu READ (1,*) deltat READ
(1,*) n READ (1,*) pas_sortie READ (1,*) k READ (1,*)
scheme READ (1,*) init CLOSE(1) !format
d'ecriture OPEN (2,FILE='burger.ini') READ
(2,*) frmt CLOSE (2)
c----
calculs: pas d'espace et
param------------------------ deltax=1/FLOAT(k-1) s=nu*deltat/(deltax*deltax) r
= deltat/deltax
c---- allocation
de la memoire------------------------------ ALLOCATE
(mat(5*k),u0(k),d(k))
c****
initialisation des coefficients ********************** !crank
nicholson fin. diff. IF (scheme.EQ.1)
THEN delta=0 q=0 name_scheme=' fd.' !crank
nicholson fin. elmt. ELSE IF(scheme.EQ.2)
THEN delta=1.0/6.0 q=0 name_scheme=' fem.' !crank
nicholson mass operator ELSE IF(scheme.EQ.3)
THEN delta=0.12 q=0 name_scheme=' massop' !crank
nicholson 4pt. upwind ELSE IF(scheme.EQ.4)
THEN delta=0 q=0.5 name_scheme=' 4pt-up' END
IF
c**** solution initiale
************************************ c----
calcul du point
zero---------------------------------- klim=(k-1)/2+1
c----
initialisation sinusoidale --------------------------- IF
(init.EQ.1) THEN name_init=' sinus' !conditions
initiales (pts: 1 à k) DO
j=1,k u0(j)=SIN(2*PI*(j-1)*deltax) END DO !conditions
aux limites (rigides) u0(1)=0 u0(k)=0 !point
zero u0(klim)=0
c----
initialisation droite -------------------------------- ELSEIF
(init.EQ.2) THEN name_init=' droite' !conditions
initiales (pts: 1 à k) DO
j=1,k u0(j)=-2*(j-1)*deltax + 1 END DO !conditions
aux limites (libres) u0(1)=1 u0(k)=-1 !point
zero u0(klim)=0 END IF
c****
preparation et ecriture dans fichier resultats
******* compteur_time = 1 OPEN
(10,FILE='output.txt') WRITE (10,20) 'visc. :',nu WRITE
(10,20) 't_step:',deltat WRITE (10,30) 'n_iter:',n WRITE
(10,30) 'p_sort:',pas_sortie WRITE (10,30) 'n_pts :',k WRITE
(10,40) 'schema:',name_scheme WRITE (10,40) 'init
:',name_init WRITE (10,*) ' ' WRITE (10,frmt)
0.0,((i-1)*deltax,i=1,k) WRITE (10,frmt)
0.0,(u0(j),j=1,k)
c*********************************************************** c
noyau du programme
* c*********************************************************** c****
boucle en temps ************************************** DO
t=1,n
c**** systeme AX=B
*****************************************
c-----initialisation
de la matrice A------------------------ !CL
amont----------------------------------------- !sinusoidale IF
(init.EQ.1)
THEN j=1 mat(5*j-4)=0 mat(5*j-3)=0 mat(5*j-2)=1-2*delta+s+(0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25-q/6.0)*r*u0(j+1) mat(5*j)
=0 j=2 mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s-(0.25+0.5*q)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25-q/6.0)*r*u0(j+1) mat(5*j)
=0
!droite ELSEIF
(init.EQ.2)
THEN j=1 mat(5*j-4)=0 mat(5*j-3)=0 mat(5*j-2)=1-delta+0.5*s+(q/6-0.25)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25-q/6.0)*r*u0(j+1) mat(5*j)
=0 j=2 mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s-(0.25+q/3)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25-q/6.0)*r*u0(j+1) mat(5*j)
=0 END IF
!initialisation sol.
positive--------------------- DO j=3,
klim-1 mat(5*j-4)=(q/6.0)*r*u0(j-2) mat(5*j-3)=delta-0.5*s-(0.25+0.5*q)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25-q/6.0)*r*u0(j+1) mat(5*j)
=0 END DO
!initialisation
point
zero------------------------ j=klim mat(5*j-4)=(q/6.0)*r*u0(j-2) mat(5*j-3)=0.5*(delta-0.5*s-(0.25+0.5*q)*r*u0(j-1)+ &
delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1)) mat(5*j-2)=0.5*(1-2*delta+s+(0.5*q)*r*u0(j)+ &
1-2*delta+s+(-0.5*q)*r*u0(j)) mat(5*j-1)=0.5*(delta-0.5*s+(0.25-q/6.0)*r*u0(j+1)+ &
delta-0.5*s+(0.25+0.5*q)*r*u0(j+1)) mat(5*j-0)=-(q/6.0)*r*u0(j+2)
!initialisation
sol. negative--------------------- DO
j=klim+1,
k-2 mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(-0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25+0.5*q)*r*u0(j+1) mat(5*j-0)=-(q/6.0)*r*u0(j+2) END
DO
!CL
aval------------------------------------------ !sinusoidale IF
(init.EQ.1)
THEN j=k-1 mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(-0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25+0.5*q)*r*u0(j+1) mat(5*j-0)=0 j=k mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(-0.5*q)*r*u0(j) mat(5*j-1)=0 mat(5*j-0)=0
!droite ELSEIF
(init.EQ.2)
THEN j=k-1 mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1) mat(5*j-2)=1-2*delta+s+(-0.5*q)*r*u0(j) mat(5*j-1)=delta-0.5*s+(0.25+q/3)*r*u0(j+1) mat(5*j-0)=0 j=k mat(5*j-4)=0 mat(5*j-3)=delta-0.5*s+(-0.25+q/6.0)*r*u0(j-1) mat(5*j-2)=1-delta+0.5*s+(0.25-q/6)*r*u0(j) mat(5*j-1)=0 mat(5*j-0)=0
END
IF
c-----initialisation du
vecteur B--------------------------- !sinus IF
(init.EQ.1) THEN d(1)=(delta+0.5*s)*u0(2)+(1-2*delta-s)*u0(1) DO
j=2,k-1 d(j)=(delta+0.5*s)*(u0(j-1)+u0(j+1)) &
+(1-2*delta-s)*u0(j) END
DO d(k)=(delta+0.5*s)*u0(k-1)+(1-2*delta-s)*u0(k)
!droite ELSEIF
(init.EQ.2)
THEN d(1)=(delta+0.5*s)*u0(2)+(1-delta-0.5*s)*u0(1) DO
j=2,k-1 d(j)=(delta+0.5*s)*(u0(j-1)+u0(j+1)) &
+(1-2*delta-s)*u0(j) END
DO d(k)=(delta+0.5*s)*u0(k-1)+(1-delta-0.5*s)*u0(k)
END
IF
c---- resolution du
systeme--------------------------------- CALL
GAUSS(mat,d,k,2) !voir subroutine gauss
c****
postprocessing *************************************** c----
sauvegarde de la
solution----------------------------- !affectation DO
j=1,k u0(j)=d(j) END DO
c----
integration des conditions limites !
sinusoidale IF (init.EQ.1) THEN u0(1)=0 u0(k)=0 !
droite ELSEIF (init.EQ.2) THEN u0(1)=1 u0(k)=-1 END
IF
c---- ecriture de la
solution------------------------------- cur_time= t
/ (compteur_time * pas_sortie) IF (cur_time.EQ.1)
THEN WRITE(10,frmt) t*deltat,(u0(j),j=1,k) compteur_time =
compteur_time + 1 END IF
c****
fin de la boucle en temps **************************** END
DO
c*********************************************************** c
terminaison
* c*********************************************************** c----
fermeture du fichier --------------------------------- CLOSE
(10)
c---- liberation de la
memoire DEALLOCATE (mat,u0,d)
STOP
c----
definition des formats d'ecritue---------------------- 10
FORMAT(F10.8) 20 FORMAT(A7,F7.4) 30 FORMAT(A7,I7) 40
FORMAT(A7,A7) END
|