%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright G. Allaire, Decembre 2000
%
% schema de Roe pour les equations d'Euler en 1-D
% correction entropique ou non
% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% lg = longueur du domaine
lg = 1. ;
% nx = nombre de mailles
nx = 1000 ;
dx = lg/nx ;
% t = temps, tmax = temps maximal, nt = nombre max de pas de temps
t = 0. ;
nt = 400 ;
tmax = 0.15 ;
% loi d'etat du gaz parfait
gamma = 1.4 ;
% sol = variables conservatives = (rho, rho*u, E)
sol = zeros(3,nx) ; 
% flux = flux par maille
flux = zeros(3,nx) ;
fluxp = zeros(3,nx) ;
% glux = flux numerique a l'interface
glux = zeros(3,nx) ;
gluxm = zeros(3,nx) ;
absroe = zeros(3,nx) ;
% vp = vecteurs propres de la jacobienne
vp1 = ones(3,nx) ;
vp2 = ones(3,nx) ;
vp3 = ones(3,nx) ;
% u = vitess, p = pression
u = zeros(1,nx) ;
p = zeros(1,nx) ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% le tube a choc de Sod
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% etats initiaux a gauche (l) et a droite (r)
% rho = densite, u = vitesse, p = pression
rhol = 1. ;
ul = 0. ;
pl = 1. ;
rhor = 0.125 ;
ur = 0. ;
pr = 0.1 ;
%
% initialisation
%
x=zeros(1,nx) ;

for i=1:nx
  x(i) = (i-1)*dx  ;
  if x(i) < lg/2
     sol(1,i) = rhol ;     
     sol(2,i) = rhol*ul;
     sol(3,i) = pl/(gamma-1.) + 0.5*rhol*ul*ul ;
  else
     sol(1,i) = rhor ;     
     sol(2,i) = rhor*ur ;
     sol(3,i) = pr/(gamma-1.) + 0.5*rhor*ur*ur ;
  end
end
u = sol(2,:)./sol(1,:) ;
p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
    
% trace des conditions initiales
liminf = -0.1 ;
limmax = 1.1 ;
subplot(3,1,1), plot(x,sol(1,:)) ;
axis([0 lg 0. limmax]) ;
title('Roe: densite')
subplot(3,1,2), plot(x,u) ;
axis([0 lg liminf limmax]) ;
title('Roe: vitesse')
subplot(3,1,3), plot(x,p) ;
axis([0 lg 0. limmax]) ;
title('Roe: pression')
pause ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% marche en temps : schema de Roe
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% si u est le vecteur des valeurs u(i) alors 
% wshift3('1D',u,+1) est le vecteur des u(i+1) 
% wshift3('1D',u,-1) est le vecteur des u(i-1)
%
for n=1:nt

% on recupere u et p a partir des variables conservatives
if all(sign(sol(1,:))+1)
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
else 
  'densite negative ou nulle'
  return
end
 
% moyennes de Roe
        
w = sqrt(sol(1,:));
wp = wshift3('1D',w,+1) ;
up = wshift3('1D',u,+1) ; 
pp = wshift3('1D',p,+1) ;
solp = wshift3('2D',sol,[0 +1]) ;
utild = (w.*u + wp.*up)./(w + wp);
htild = (w.*(sol(3,:) + p) + wp.*(solp(3,:) + pp))./...
        (w.* sol(1,:)      + wp.* solp(1,:)) ;
rhotild = w.*wp ;

% c2son = vitesse du son au carre
c2son = (gamma - 1.)*(htild - 0.5 * utild.*utild) ;

% cson = vitesse du son
if all(sign(c2son)+1.) 
   cson = sqrt(c2son) ;
else 
   'perte d hyperbolicite numerique'
   'carre de la vitesse du son negative'
   'dans les mailles'
   for i=1:nx
      if c2son(i) <= 0. 
         i
      end
   end
   return
end

% vecteurs propres de la jacobienne

vp1(2,:) = utild - cson ;
vp1(3,:) = htild - utild.*cson ;
vp2(2,:) = utild ;
vp2(3,:) = htild - c2son/(gamma-1.) ;
vp3(2,:) = utild + cson ;
vp3(3,:) = htild + utild.*cson ;

% coefficients de l'increment dans la base 
% des vecteurs propres

alpha1 = ( (pp-p) - cson.*rhotild.*(up-u) )./(2*c2son) ;
alpha2 = (solp(1,:)-sol(1,:)) - (pp-p)./c2son ;
alpha3 = ( (pp-p) + cson.*rhotild.*(up-u) )./(2*c2son) ;

% calcul du flux

flux(1,:) =     sol(2,:)      ;
flux(2,:) = u.* sol(2,:) + p  ;
flux(3,:) = u.*(sol(3,:) + p) ;
fluxp = wshift3('2D',flux,[0 +1]) ;

% terme de viscosite numerique dans le flux numerique

absroe(1,:) = abs(utild-cson).*alpha1.*vp1(1,:) ;
absroe(2,:) = abs(utild-cson).*alpha1.*vp1(2,:) ;
absroe(3,:) = abs(utild-cson).*alpha1.*vp1(3,:) ;

absroe(1,:) = absroe(1,:) + abs(utild).*alpha2.*vp2(1,:) ;
absroe(2,:) = absroe(2,:) + abs(utild).*alpha2.*vp2(2,:) ;
absroe(3,:) = absroe(3,:) + abs(utild).*alpha2.*vp2(3,:) ;

absroe(1,:) = absroe(1,:) + abs(utild+cson).*alpha3.*vp3(1,:) ;
absroe(2,:) = absroe(2,:) + abs(utild+cson).*alpha3.*vp3(2,:) ;
absroe(3,:) = absroe(3,:) + abs(utild+cson).*alpha3.*vp3(3,:) ;

% flux numerique a l'interface i+1/2

glux = 0.5*( flux + fluxp - absroe ) ;
gluxm = wshift3('2D',glux,[0 -1]) ;

% calcul de la condition CFL
cfl = max(max(abs(utild+cson)),max(abs(utild-cson))) ;

% mise a jour

if cfl <= 0. 
   'cfl nulle'
   return
else
   dt = 0.9*dx/cfl ;
end

t = t + dt ;

aux1 = sol(:,1) ;
aux2 = sol(:,nx) ;

sol = sol - (dt/dx)*(glux-gluxm) ;

% correction des effets de bord
sol(:,1) = aux1 ;
sol(:,nx) = aux2 ;

% trace de la solution
if mod(n,5) == 0
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
                
   subplot(3,1,1), plot(x,sol(1,:)) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: densite au temps =',num2str(t)])
   subplot(3,1,2), plot(x,u) ;
   axis([0 lg liminf limmax]) ;
   title(['Roe: vitesse au temps =',num2str(t)])
   subplot(3,1,3), plot(x,p) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: pression au temps =',num2str(t)])
   pause(0) ;
end
%
if t>=tmax
 break
end
%
end

pause ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% un autre tube a choc avec point sonique
% schema de Roe sans correction entropique
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t = 0. ;
% etats initiaux a gauche (l) et a droite (r)
% rho = densite, u = vitesse, p = pression
rhol = 1. ;
ul = 0.75 ;
pl = 1.0 ;
rhor = 0.125 ;
ur = 0. ;
pr = 0.1 ;
%
% initialisation
%
x=zeros(1,nx) ;

for i=1:nx
  x(i) = (i-1)*dx  ;
  if x(i) < lg/2
     sol(1,i) = rhol ;     
     sol(2,i) = rhol*ul;
     sol(3,i) = pl/(gamma-1.) + 0.5*rhol*ul*ul ;
  else
     sol(1,i) = rhor ;     
     sol(2,i) = rhor*ur ;
     sol(3,i) = pr/(gamma-1.) + 0.5*rhor*ur*ur ;
  end
end
u = sol(2,:)./sol(1,:) ;
p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
    
% trace des conditions initiales
liminf = -0.1 ;
limmax = 1.1 ;
subplot(3,1,1), plot(x,sol(1,:)) ;
axis([0 lg 0. 1.1]) ;
title('Roe: densite')
subplot(3,1,2), plot(x,u) ;
axis([0 lg liminf 1.6]) ;
title('Roe: vitesse')
subplot(3,1,3), plot(x,p) ;
axis([0 lg 0. 1.1]) ;
title('Roe: pression')
pause ;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% marche en temps : schema de Roe
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% si u est le vecteur des valeurs u(i) alors 
% wshift3('1D',u,+1) est le vecteur des u(i+1) 
% wshift3('1D',u,-1) est le vecteur des u(i-1)
%
for n=1:nt

% on recupere u et p a partir des variables conservatives
if all(sign(sol(1,:))+1)
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
else 
  'densite negative ou nulle'
  return
end
 
% moyennes de Roe
        
w = sqrt(sol(1,:));
wp = wshift3('1D',w,+1) ;
up = wshift3('1D',u,+1) ; 
pp = wshift3('1D',p,+1) ;
solp = wshift3('2D',sol,[0 +1]) ;
utild = (w.*u + wp.*up)./(w + wp);
htild = (w.*(sol(3,:) + p) + wp.*(solp(3,:) + pp))./...
        (w.* sol(1,:)      + wp.* solp(1,:)) ;
rhotild = w.*wp ;

% c2son = vitesse du son au carre
c2son = (gamma - 1.)*(htild - 0.5 * utild.*utild) ;

% cson = vitesse du son
if all(sign(c2son)+1.) 
   cson = sqrt(c2son) ;
else 
   'perte d hyperbolicite numerique'
   'carre de la vitesse du son negative'
   'dans les mailles'
   for i=1:nx
      if c2son(i) <= 0. 
         i
      end
   end
   return
end

% vecteurs propres de la jacobienne

vp1(2,:) = utild - cson ;
vp1(3,:) = htild - utild.*cson ;
vp2(2,:) = utild ;
vp2(3,:) = htild - c2son/(gamma-1.) ;
vp3(2,:) = utild + cson ;
vp3(3,:) = htild + utild.*cson ;

% coefficients de l'increment dans la base 
% des vecteurs propres

alpha1 = ( (pp-p) - cson.*rhotild.*(up-u) )./(2*c2son) ;
alpha2 = (solp(1,:)-sol(1,:)) - (pp-p)./c2son ;
alpha3 = ( (pp-p) + cson.*rhotild.*(up-u) )./(2*c2son) ;

% calcul du flux

flux(1,:) =     sol(2,:)      ;
flux(2,:) = u.* sol(2,:) + p  ;
flux(3,:) = u.*(sol(3,:) + p) ;
fluxp = wshift3('2D',flux,[0 +1]) ;

% terme de viscosite numerique dans le flux numerique

absroe(1,:) = abs(utild-cson).*alpha1.*vp1(1,:) ;
absroe(2,:) = abs(utild-cson).*alpha1.*vp1(2,:) ;
absroe(3,:) = abs(utild-cson).*alpha1.*vp1(3,:) ;

absroe(1,:) = absroe(1,:) + abs(utild).*alpha2.*vp2(1,:) ;
absroe(2,:) = absroe(2,:) + abs(utild).*alpha2.*vp2(2,:) ;
absroe(3,:) = absroe(3,:) + abs(utild).*alpha2.*vp2(3,:) ;

absroe(1,:) = absroe(1,:) + abs(utild+cson).*alpha3.*vp3(1,:) ;
absroe(2,:) = absroe(2,:) + abs(utild+cson).*alpha3.*vp3(2,:) ;
absroe(3,:) = absroe(3,:) + abs(utild+cson).*alpha3.*vp3(3,:) ;

% flux numerique a l'interface i+1/2

glux = 0.5*( flux + fluxp - absroe ) ;
gluxm = wshift3('2D',glux,[0 -1]) ;

% calcul de la condition CFL
cfl = max(max(abs(utild+cson)),max(abs(utild-cson))) ;

% mise a jour

if cfl <= 0. 
   'cfl nulle'
   return
else
   dt = 0.9*dx/cfl ;
end

t = t + dt ;

aux1 = sol(:,1) ;
aux2 = sol(:,nx) ;

sol = sol - (dt/dx)*(glux-gluxm) ;

% correction des effets de bord
sol(:,1) = aux1 ;
sol(:,nx) = aux2 ;

% trace de la solution
if mod(n,5) == 0
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
                
   subplot(3,1,1), plot(x,sol(1,:)) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: densite au temps =',num2str(t)])
   subplot(3,1,2), plot(x,u) ;
   axis([0 lg liminf 1.6]) ;
   title(['Roe: vitesse au temps =',num2str(t)])
   subplot(3,1,3), plot(x,p) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: pression au temps =',num2str(t)])
   pause(0) ;
end
%
if t>=tmax
 break
end
%
end




pause ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% un autre tube a choc avec point sonique
% schema de Roe avec correction entropique
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t = 0. ;
eps = 5.e-2 ;
% etats initiaux a gauche (l) et a droite (r)
% rho = densite, u = vitesse, p = pression
rhol = 1. ;
ul = 0.75 ;
pl = 1.0 ;
rhor = 0.125 ;
ur = 0. ;
pr = 0.1 ;
%
% initialisation
%
x=zeros(1,nx) ;

for i=1:nx
  x(i) = (i-1)*dx  ;
  if x(i) < lg/2
     sol(1,i) = rhol ;     
     sol(2,i) = rhol*ul;
     sol(3,i) = pl/(gamma-1.) + 0.5*rhol*ul*ul ;
  else
     sol(1,i) = rhor ;     
     sol(2,i) = rhor*ur ;
     sol(3,i) = pr/(gamma-1.) + 0.5*rhor*ur*ur ;
  end
end
u = sol(2,:)./sol(1,:) ;
p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
    
% trace des conditions initiales
liminf = -0.1 ;
limmax = 1.1 ;
subplot(3,1,1), plot(x,sol(1,:)) ;
axis([0 lg 0. 1.1]) ;
title('Roe: densite')
subplot(3,1,2), plot(x,u) ;
axis([0 lg liminf 1.6]) ;
title('Roe: vitesse')
subplot(3,1,3), plot(x,p) ;
axis([0 lg 0. 1.1]) ;
title('Roe: pression')
pause ;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% marche en temps : schema de Roe
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% si u est le vecteur des valeurs u(i) alors 
% wshift3('1D',u,+1) est le vecteur des u(i+1) 
% wshift3('1D',u,-1) est le vecteur des u(i-1)
%
for n=1:nt

% on recupere u et p a partir des variables conservatives
if all(sign(sol(1,:))+1)
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
else 
  'densite negative ou nulle'
  return
end
 
% moyennes de Roe
        
w = sqrt(sol(1,:));
wp = wshift3('1D',w,+1) ;
up = wshift3('1D',u,+1) ; 
pp = wshift3('1D',p,+1) ;
solp = wshift3('2D',sol,[0 +1]) ;
utild = (w.*u + wp.*up)./(w + wp);
htild = (w.*(sol(3,:) + p) + wp.*(solp(3,:) + pp))./...
        (w.* sol(1,:)      + wp.* solp(1,:)) ;
rhotild = w.*wp ;

% c2son = vitesse du son au carre
c2son = (gamma - 1.)*(htild - 0.5 * utild.*utild) ;

% cson = vitesse du son
if all(sign(c2son)+1.) 
   cson = sqrt(c2son) ;
else 
   'perte d hyperbolicite numerique'
   'carre de la vitesse du son negative'
   'dans les mailles'
   for i=1:nx
      if c2son(i) <= 0. 
         i
      end
   end
   return
end

% vecteurs propres de la jacobienne

vp1(2,:) = utild - cson ;
vp1(3,:) = htild - utild.*cson ;
vp2(2,:) = utild ;
vp2(3,:) = htild - c2son/(gamma-1.) ;
vp3(2,:) = utild + cson ;
vp3(3,:) = htild + utild.*cson ;

% coefficients de l'increment dans la base 
% des vecteurs propres

alpha1 = ( (pp-p) - cson.*rhotild.*(up-u) )./(2*c2son) ;
alpha2 = (solp(1,:)-sol(1,:)) - (pp-p)./c2son ;
alpha3 = ( (pp-p) + cson.*rhotild.*(up-u) )./(2*c2son) ;

% calcul du flux

flux(1,:) =     sol(2,:)      ;
flux(2,:) = u.* sol(2,:) + p  ;
flux(3,:) = u.*(sol(3,:) + p) ;
fluxp = wshift3('2D',flux,[0 +1]) ;

% terme de viscosite numerique dans le flux numerique

absroe(1,:) = sqrt((utild-cson).^2+eps^2).*alpha1.*vp1(1,:) ;
absroe(2,:) = sqrt((utild-cson).^2+eps^2).*alpha1.*vp1(2,:) ;
absroe(3,:) = sqrt((utild-cson).^2+eps^2).*alpha1.*vp1(3,:) ;

absroe(1,:) = absroe(1,:) + sqrt(utild.^2+eps^2).*alpha2.*vp2(1,:) ;
absroe(2,:) = absroe(2,:) + sqrt(utild.^2+eps^2).*alpha2.*vp2(2,:) ;
absroe(3,:) = absroe(3,:) + sqrt(utild.^2+eps^2).*alpha2.*vp2(3,:) ;

absroe(1,:) = absroe(1,:) + sqrt((utild+cson).^2+eps^2).*alpha3.*vp3(1,:) ;
absroe(2,:) = absroe(2,:) + sqrt((utild+cson).^2+eps^2).*alpha3.*vp3(2,:) ;
absroe(3,:) = absroe(3,:) + sqrt((utild+cson).^2+eps^2).*alpha3.*vp3(3,:) ;

% flux numerique a l'interface i+1/2

glux = 0.5*( flux + fluxp - absroe ) ;
gluxm = wshift3('2D',glux,[0 -1]) ;

% calcul de la condition CFL
cfl = max(max(abs(utild+cson)),max(abs(utild-cson))) ;

% mise a jour

if cfl <= 0. 
   'cfl nulle'
   return
else
   dt = 0.9*dx/cfl ;
end

t = t + dt ;

aux1 = sol(:,1) ;
aux2 = sol(:,nx) ;

sol = sol - (dt/dx)*(glux-gluxm) ;

% correction des effets de bord
sol(:,1) = aux1 ;
sol(:,nx) = aux2 ;

% trace de la solution
if mod(n,5) == 0
   u = sol(2,:)./sol(1,:) ;
   p = (gamma-1.)*(sol(3,:) - 0.5*sol(1,:).*u.*u) ;
                
   subplot(3,1,1), plot(x,sol(1,:)) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: densite au temps =',num2str(t)])
   subplot(3,1,2), plot(x,u) ;
   axis([0 lg liminf 1.6]) ;
   title(['Roe: vitesse au temps =',num2str(t)])
   subplot(3,1,3), plot(x,p) ;
   axis([0 lg 0. limmax]) ;
   title(['Roe: pression au temps =',num2str(t)])
   pause(0) ;
end
%
if t>=tmax
 break
end
%
end






