Matematické modelování problémů proudění

kód předmětu: 2011083

 

Přednášející:

Doc. Ing. Jiří Fürst, PhD.
Ústav technické matematiky, FS ČVUT v Praze
Karlovo nám. 13
121 35 Praha 2
místnost D301

Plán předmětu

  • Jednorozměrný zákon zachování
    • Rovnice kontinuity v 1D
    • Lineární advekce
      • Charakteristiky, analytické řešení počáteční úlohy
      • Formulace smíšené úlohy, okrajové podmínky
    • Nelineární skalární hyperbolická rovnice (Burgersova rovnice)
      • Vznik nespojitosti a neexistence globálního klasického řešení
      • Definice slabého řešení a jeho nejednoznačnost
      • Koncept entropického řešení
      • Rankine-Hugoniotova podmínka (rychlost pohybu nespojitosti)
    • Další příklady nelineárních rovnic
    • Lineární hyperbolický systém rovnic prvního řádu
      • Diagonalizace matice A, charakteristické proměnné
      • Analytické řěšení počáteční úlohy
      • Formulace smíšené úlohy, okrajové podmínky
  • Numerické řešení jednorozměrných skalárních zákonů zachování
    • Metoda konečných objemů pro 1D problém
    • Chyba aproximace, konzistence, stabilita, globální chyba
    • Laxova věta o ekvivalenci
    • Spektrální kriterium stability
    • Monotónní schéma a princip maxima pro skalární problém
    • Princip umělé vazkosti
    • TVD schéma pro skalární problém
    • Příklady schémat:
      • Centrální schéma
      • Laxovo-Wendroffovo schéma
      • Schéma upwind
      • Laxovo-Friedrichsovo (Rusanovovo) schéma
      • Laxovo-Wendroffovo schéma s umělou vazkostí
      • TVD schéma
  • Numerické řešení hyperbolických systémů v 1D
    • Schéma upwind
    • Laxovo-Freidrichsovo schéma
    • Laxovo-Wendroffovo (MacCormackovo) schéma
    • AUSM schéma pro Eulerovy rovnice
    • Příklady:
      • Řešení Riemannova problému pro systém Eulerových rovnic (rázová trubice)
      • Řešení rovnic proudění mělké vody (protržení hráze)
  • Princip metody konečných objemů pro vícerozměrné problémy

Plán bude doplněn v průběhu semestru

Seznam doporučené literatury

  1. J. Fürst, K. Kozel: Numerické metody řešení problémů proudění I, skripta ČVUT, 2001
  2. J. Fořt, K. Kozel: Numerické metody řešení problémů proudění II, skripta ČVUT, 2002
  3. J. Fořt, K. Kozel, P. Louda, J. Fürst: Numerické metody řešení problémů proudění III, skripta ČVUT, 2004
  4. J.H. Ferziger, M. Peric: Computational Methods for Fluid Dynamics, Springer 2002
  5. J. Blazek: Computational Fluid Dynamics: Principles and Applications, Elsevier, 2001
  6. E.F.Toro: Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction, Springer 2009

Materiály k předmětu

Program pro numerické řešení smíšené úlohy pro rovnici linární advekce v 1D,

clear all;

% Reseni smisene ulohy pro rovnici u_t + a*u_x = 0 pomoci MKO
a = 1;

% Delka intervalu a pocet bunek
L = 1;
n = 100;
dx = L / n;
x = linspace(dx/2, L-dx/2, n);
% x = dx/2:dx:(L-dx/2);

u(1:n)  = 0;    % aktualni hodnota reseni
un(1:n) = 0;    % nova hodnota reseni

% Pocatecni podminka
for i = 1:n
  if (x(i)>0.25 && x(i)<0.5)
    u(i) = 1-cos(2*pi*(x(i)/0.25-1));
  end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.8*dx;
t = 0;

for iter = 1:(n/2)
  % Okrajova podminka na leve casti intervalu
  f(1) = 0;

  % Numericky tok f
  for i = 2:n+1
    f(i) = a*u(i-1);
  end

  un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));
  u = un;
  t = t + dt;

  if (mod(iter,10)==0)
    plot(x, u); axis([0 1 -0.5 2.5]);
    pause(1);
  end
end


%clear all;

% Reseni smisene ulohy pro rovnici u_t + a*u_x = 0 pomoci MKO
a = 1;

% Delka intervalu a pocet bunek
L = 1;
n = 100;

dx = L / n;
x = linspace(dx/2, L-dx/2, n);

u(1:n)  = 0;
un(1:n) = 0;

% Pocatecni podminka
for i = 1:n
  if (x(i)>0.25 && x(i)<0.5)
     u(i) = 1-cos(2*pi*(x(i)/0.25-1));
  end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.8*dx;

for iter = 1:(n/2)

    % Okrajova podminka na leve casti intervalu
    f(1) = 0;
    f(n+1) = a*u(n);

    % Numericky tok f
    for i = 2:n
        f(i) = a/2*(u(i-1)+u(i)) - a^2/2*dt/dx*(u(i)-u(i-1));
    end

    un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));

    u = un;

    if (mod(iter,10)==0)
      plot(x, u); axis([0 1 -0.5 2.5]);
      pause(1);
    end
end

Program pro numerické řešení smíšené úlohy pro Burgersovu rovnici v 1D,

clear all;

% Reseni smisene ulohy pro rovnici u_t + (u^2/2)_x = 0 pomoci MKO

% Delka intervalu a pocet bunek
L = 1;
n = 100;

dx = L / n;
x = linspace(dx/2, L-dx/2, n);

u(1:n)  = 0;
un(1:n) = 0;

% Pocatecni podminka
for i = 1:n
  if (x(i)>0.25 && x(i)<0.5)
     u(i) = 1-cos(2*pi*(x(i)/0.25-1));
  end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.4*dx;

t = 0;

for iter = 1:n

    % Okrajova podminka na leve casti intervalu
    f(1) = 0;

    % Numericky tok f
    for i = 2:n+1
        f(i) = u(i-1)^2/2;
    end

    un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));
    t = t + dt;

    u = un;

    if (mod(iter,10)==0)
      plot(x, u); axis([0 1 -0.5 2.5]);
      pause(1);
    end
end

clear all;

% Reseni smisene ulohy pro rovnici u_t + (u^2/2)_x = 0 pomoci MKO

% Delka intervalu a pocet bunek
L = 1;
n = 400;

dx = L / n;
x = linspace(dx/2, L-dx/2, n);

u(1:n)  = 0;
un(1:n) = 0;

% Pocatecni podminka
for i = 1:n
  if (x(i)>0.25 && x(i)<0.5)
     u(i) = 1-cos(2*pi*(x(i)/0.25-1));
  end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.1*dx;

t = 0;

for iter = 1:n

    % Okrajova podminka na leve casti intervalu
    f(1) = 0;
    f(n+1) = u(n)^2/2;

    % Numericky tok f
    for i = 2:n
        a = (u(i-1)+u(i))/2;
        f(i) = a/2*(u(i-1)+u(i)) - a^2/2*dt/dx*(u(i)-u(i-1));
    end

    un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));
    t = t + dt;

    u = un;

    if (mod(iter,10)==0)
      plot(x, u); axis([0 1 -0.5 2.5]);
      pause(1);
    end
end

%clear all;

% Reseni smisene ulohy pro rovnici u_t + a*u_x = 0 pomoci MKO
a = 1;

% Delka intervalu a pocet bunek
L = 1;
n = 100;

dx = L / n;
x = linspace(dx/2, L-dx/2, n);

u(1:n)  = 0;
un(1:n) = 0;

% Pocatecni podminka
for i = 1:n
  if (x(i)>0.25 && x(i)<0.5)
     u(i) = 1-cos(2*pi*(x(i)/0.25-1));
  end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.8*dx;

for iter = 1:(n/2)

    % Okrajova podminka na leve casti intervalu
    f(1) = 0;
    f(2) = 0;
    f(n+1) = a*u(n-1);
    f(n+1) = a*u(n);

    % Numericky tok f
    for i = 3:n-1
	fl = a*u(i-1);
	fr = a*u(i);
	flw = (fr+fl)/2 - a/2*dt/dx*(fr-fl);
	fup = (fr+fl)/2 - abs(a)/2*(u(i)-u(i-1));

	if ( (u(i)-u(i-1))*(u(i+1)-u(i)) <= 0)
	   phi = 0;
	else
	  r = (u(i-1)-u(i-2)) / (u(i)-u(i-1));
	  phi = min(1, 2*r);
	end
	f(i) = fup + phi*(flw-fup);
    end

    un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));

    u = un;

    if (mod(iter,10)==0)
      plot(x, u); axis([0 1 -0.5 2.5]);
      pause(1);
    end
end


clear all;

% Reseni smisene ulohy pro rovnici u_t + (u^2/2)_x = 0 pomoci MKO

% Delka intervalu a pocet bunek
L = 1;
n = 100;

dx = L / n;
x = linspace(dx/2, L-dx/2, n);

u(1:n)  = 0;
un(1:n) = 0;

% Pocatecni podminka
for i = 1:n
if (x(i)>0.25 && x(i)<0.5)
u(i) = 1-cos(2*pi*(x(i)/0.25-1));
end
end

plot(x, u); axis([0 1 -0.5 2.5]);
disp("Stiskni enter pro pokracovani"); pause;

dt = 0.1*dx;

t = 0;

for iter = 1:n

% Okrajova podminka na leve casti intervalu
f(1) = 0;
f(2) = 0;
f(n) = 0;
f(n+1) = 0;

% Numericky tok f
for i = 2:n-1
a = (u(i-1)+u(i))/2;
fl = u(i-1)^2/2;
fr = u(i)^2/2;

flw = (fr+fl)/2 - a/2*dt/dx*(fr-fl);
fup = (fr+fl)/2 - abs(a)/2*(u(i)-u(i-1));

if ( (u(i)-u(i-1))*(u(i+1)-u(i)) <= 0)
phi = 0;
else
rl = (u(i-1)-u(i-2)) / (u(i)-u(i-1));
rr = (u(i+1)-u(i)) / (u(i)-u(i-1));
if (rr<0)
phi = 0;
else
phi = min(1, 2*min(rl, rr));
end
end
f(i) = fup + phi*(flw-fup);
end

un(1:n) = u(1:n) - dt/dx * (f(2:n+1) - f(1:n));
t = t + dt;

u = un;

if (mod(iter,10)==0)
plot(x, u); axis([0 1 -0.5 2.5]);
pause(1);
end
end

Programy pro řešení rovnice mělké vody

%
%   rovnice resime ve tvaru W_t + F(W)_x = 0, kde
%   W = [h, q], F(W) = [q, q^2/h + gh^2/2] kde q = hu
%

g = 10;

% Delka intervalu a pocet bunek
L = 1;
n = 400;

dx = L / n;
x = dx/2:dx:(L-dx/2);

W(1:2,1:n)  = 0;

% Pocatecni podminka
for i = 1:n
  if (x(i)<0.5)
    W(1,i) = 1.0;
  else
    W(1,i) = 0.01;
  end
end

plot(x, W(1,:)); axis([0 1 0 1.5]);
disp("Stiskni enter pro pokracovani"); pause;
t = 0;

for iter = 1:n

    h = W(1,:);
    q = W(2,:);
    u = q ./ h;

    % Vypocet fyzikalniho toku
    FF(1,:) = q;
    FF(2,:) = q.^2./h + g*h.^2/2;

    % Vypocet spektralniho polomeru jakobianu
    sigma = abs(u) + sqrt(g*h);
    %

    dt = 0.4 * dx / max(sigma);

    % Numericky tok na leve a prave casti intervalu
    F(:,1) = FF(:,1);
    F(:,n+1) = FF(:,n);

    % Numericky tok f
    for i = 2:n
	s = max(sigma(i-1),sigma(i));
	F(:,i) = (FF(:,i-1)+FF(:,i))/2 - s/2*(W(:,i)-W(:,i-1));
    end

    W(:,1:n) = W(:,1:n) - dt/dx * (F(:,2:n+1) - F(:,1:n));
    t = t + dt;

    if (mod(iter,10)==0)
      plot(x, W(1,:)); axis([0 1 0 1.5]);
      pause(1);
    end
end


clear all;
% Reseni pocatecni ulohy pro rovnice melke vody
%   h_t + (uh)_x = 0
%   (hu)_t + (hu^2 + gh^2/2)_x = 0
%
%   rovnice resime ve tvaru W_t + F(W)_x = 0, kde
%   W = [h, q], F(W) = [q, q^2/h + gh^2/2] kde q = hu
%

g = 10;

% Delka intervalu a pocet bunek
L = 1;
n = 400;

dx = L / n;
x = dx/2:dx:(L-dx/2);

W(1:2,1:n)  = 0;

% Pocatecni podminka
for i = 1:n
if (x(i)<0.5)
W(1,i) = 1.0;
else
W(1,i) = 0.01;
end
end

plot(x, W(1,:)); axis([0 1 0 1.5]);
disp("Stiskni enter pro pokracovani"); pause;
t = 0;

for iter = 1:n

% Vypocet "derivace" W
DW(1:2,1) = 0;
DW(1:2,n) = 0;
for i = 2:n-1
for k = 1:2
if ( (W(k,i)-W(k,i-1))*(W(k,i+1)-W(k,i)) <= 0 )
DW(k,i) = 0;
else
if ( abs(W(k,i)-W(k,i-1)) < abs(W(k,i+1)-W(k,i)) )
DW(k,i) = W(k,i)-W(k,i-1);
else
DW(k,i) = W(k,i+1)-W(k,i);
end
end
end
end

h = W(1,:);
q = W(2,:);
u = q ./ h;

% Vypocet spektralniho polomeru jakobianu
sigma = abs(u) + sqrt(g*h);
%

dt = 0.4 * dx / max(sigma);

% Numericky tok na leve a prave casti intervalu
F(:,1) = [q(1); q(1)^2/h(1) + g*h(1)^2/2] ;
F(:,n+1) = [q(n); q(n)^2/h(n) + g*h(n)^2/2] ;

% Numericky tok f
for i = 2:n
sl = min( u(i-1)-sqrt(g*h(i-1)), u(i)-sqrt(g*h(i)) );
sr = min( u(i-1)+sqrt(g*h(i-1)), u(i)+sqrt(g*h(i)) );

Wl = W(:,i-1) + DW(:,i-1)/2;
Wr = W(:,i) - DW(:,i)/2;

Fl = [Wl(2); Wl(2)^2/Wl(1) + g*Wl(1)^2/2];
Fr = [Wr(2); Wr(2)^2/Wr(1) + g*Wr(1)^2/2];

if (0<=sl)
F(:,i) = Fl;
elseif (0<sr)
F(:,i) = (sr*Fl - sl*Fr + sl*sr*(Wr-Wl)) / (sr-sl);
else
F(:,i) = Fr;
end

end

W(:,1:n) = W(:,1:n) - dt/dx * (F(:,2:n+1) - F(:,1:n));
t = t + dt;

if (mod(iter,10)==0)
plot(x, W(1,:)); axis([0 1 0 1.5]);
pause(1);
end
end

</pre>
clear all;

% Reseni proudeni melke vody pres prekazku
%
%   h_t + (uh)_x = 0
%   (hu)_t + (hu^2 + gh^2/2)_x = -g h b'
%
%   rovnice resime ve tvaru W_t + F(W)_x = Q, kde
%   W = [h, q], F(W) = [q, q^2/h + gh^2/2] kde q = hu a
%   Q = [0, -g h b']
%
%
%  Jakobian dF/dW = [ 0, 1; gh^2-u, 2u]
%  vlastni cisla  u +- sqrt(g*h)
%  vlastni vektory [1; u+-sqrt(g*h)]
%
%  charakteristicke promenne V = [u+2*c,u-2*c]     c =sqrt(g*h)

g = 10;

% Rychlost vtoku m3/s
q_in = 1;
h_out = 0.8;

% Delka intervalu a pocet bunek
L = 1;
n = 200;

dx = L / n;
x = dx/2:dx:(L-dx/2);

% tvar dna
for i = 1:n
if (0.3 < x(i) && x(i)<0.7)
b(i) = (cos(pi*(x(i)-0.5)/0.2) + 1)/2 + (1-x(i))*0.2;
bx(i) = ( (cos(pi*(x(i)+dx/2-0.5)/0.2) + 1)/2 -
(cos(pi*(x(i)-dx/2-0.5)/0.2) + 1)/2 ) / dx - 0.2;
else
b(i) = (1-x(i))*0.2;
bx(i)= -0.2;
end
end

W(1,1:n)  = max(h_out,max(b)+0.1) - b;
W(2,1:n)  = 0;

plot(x, b, x, W(1,:)+b); axis([0 1 0 3]);
disp("Stiskni enter pro pokracovani"); pause;
t = 0;

tend = 1;

Q(1:2,1:n) = 0;

for iter = 1:(40*n)

h = W(1,:);
q = W(2,:);
u = q ./ h;

% Vypocet spektralniho polomeru jakobianu
sigma = abs(u) + sqrt(g*h);
%

dt = 0.4 * dx / max(sigma);

% Numericky tok na vstupu (zadany prutok)
F(:,1) = [q_in; q_in^2/h(1) + g*h(1)^2/2] ;

% Numericky tok na vystupu (zadana vyska hladiny)
F(:,n+1) = [q(n); q(n)^2/h_out + g*h_out^2/2] ;

% Numericky tok f
for i = 2:n
sl = min( u(i-1)-sqrt(g*h(i-1)), u(i)-sqrt(g*h(i)) );
sr = min( u(i-1)+sqrt(g*h(i-1)), u(i)+sqrt(g*h(i)) );

Wl = W(:,i-1);
Wr = W(:,i);

Fl = [Wl(2); Wl(2)^2/Wl(1) + g*Wl(1)^2/2];
Fr = [Wr(2); Wr(2)^2/Wr(1) + g*Wr(1)^2/2];

if (0<=sl)
F(:,i) = Fl;
elseif (0<sr)
F(:,i) = (sr*Fl - sl*Fr + sl*sr*(Wr-Wl)) / (sr-sl);
else
F(:,i) = Fr;
end

end

% Zdrojovy clen
Q(2,1:n) = - g * h .* bx;

W(:,1:n) = W(:,1:n) - dt/dx * (F(:,2:n+1) - F(:,1:n)) + dt*Q;
t = t + dt;

if (mod(iter,10)==0)
plot(x, b, x, W(1,:)+b); axis([0 1 0 3]);
pause(0.1);
end
end

Řešení Eulerových rovnic v 1D


clear all;

% Reseni pocatecni ulohy pro Eulerovy rovnice
%   rho_t + (rho u)_x = 0
%   (rho u)_t + (rho u^2 + p)_x = 0
%   (rho E)_t + [u (rho E + p)]_x = 0
%
%   p = (kappa-1) * rho * (E - u^2/2)
%
%   rovnice resime ve tvaru W_t + F(W)_x = 0, kde
%   W = [rho, m, e], F(W) = [rho u, rho u^2 + p, u (rho E + p)]
%   kde m = rho u, e = rho E
%

kappa = 1.4;

% Delka intervalu a pocet bunek
L = 1;
n = 400;

dx = L / n;
x = dx/2:dx:(L-dx/2);

W(1:3,1:n)  = 0;

% Pocatecni podminka
for i = 1:n
if (x(i)<0.5)
W(1:3,i) = [ 10; 0; 1e6/(kappa-1) ];
else
W(1:3,i) = [ 1; 0; 1e5/(kappa-1) ];
end
end

plot(x, W(1,:)); axis([0 1 0 20]);
disp("Stiskni enter pro pokracovani"); pause;
t = 0;

for iter = 1:n

rho = W(1,:);
u   = W(2,:) ./ rho;
E   = W(3,:) ./ rho;

p = (kappa-1) * rho .* (E - 0.5*u.*u);
a = sqrt(kappa * p ./ rho);

FF(1,:) = rho .* u;
FF(2,:) = rho .* u.^2 + p;
FF(3,:) = u .* (rho .* E + p);

% Vypocet spektralniho polomeru jakobianu
sigma = abs(u) + a;
%

dt = 0.4 * dx / max(sigma);

% Numericky tok na leve a prave casti intervalu
F(:,1) = FF(:,1);
F(:,n+1) = FF(:,n);

% Numericky tok f
for i = 2:n
sl = min( u(i-1)-a(i-1), u(i)-a(i) );
sr = max( u(i-1)+a(i-1), u(i)+a(i) );

Wl = W(:,i-1);
Wr = W(:,i);

Fl = FF(:,i-1);
Fr = FF(:,i);

if (0<=sl)
F(:,i) = Fl;
elseif (0<sr)
F(:,i) = (sr*Fl - sl*Fr + sl*sr*(Wr-Wl)) / (sr-sl);
else
F(:,i) = Fr;
end

end

W(:,1:n) = W(:,1:n) - dt/dx * (F(:,2:n+1) - F(:,1:n));
t = t + dt;

if (mod(iter,10)==0)
plot(x, W(1,:)); axis([0 1 0 20]);
pause(1);
end
end

clear all;

% Reseni proudeni 1D dyzou
 %   (A rho)_t + (A rho u)_x = 0
 %   (A rho u)_t + ( A rho u^2 + A p)_x = p A_x
 %   (A rho E)_t + [A u (rho E + p)]_x = 0
 %
 %   p = (kappa-1) * rho * (E - u^2/2)
 %
 %   rovnice resime ve tvaru A W_t + (A F(W))_x = Q, kde
 %   W = [rho, m, e], F(W) = [rho u, rho u^2 + p, u (rho E + p)]
 %   kde m = rho u, e = rho E
 %
 %   na vstupu zadvame celkovy tlak a celkovou teplotu
 %   na vystupu zadavame staticky tlak
 %
 kappa = 1.4;

% Delka intervalu a pocet bunek
 L = 1;
 n = 200;

dx = L / n;
 x = dx/2:dx:(L-dx/2);

% Prurezy dyzy na hranicich bunek  A(x) = 1 + (x-0.5)^2
 A(1:n+1) = ((0:dx:L)-L/2) .^2 + 1;
 Ai(1:n) = (A(1:n) + A(2:n+1)) / 2;

W(1:3,1:n) = 0;
 Q(1:3,1:n) = 0;

% Pocatecni podminka
 for i = 1:n
 W(1:3,i) = [ 1.1; 0; 1e5/(kappa-1) ];
 end

plot(x, W(1,:)); axis([0 1 0 1.2]);
 disp("Stiskni enter pro pokracovani"); pause;
 t = 0;

Rezidua = [];

for iter = 1:20000

rho = W(1,:);
 u   = W(2,:) ./ rho;
 E   = W(3,:) ./ rho;

p = (kappa-1) * rho .* (E - 0.5*u.*u);
 a = sqrt(kappa * p ./ rho);

FF(1,:) = rho .* u;
 FF(2,:) = rho .* u.^2 + p;
 FF(3,:) = u .* (rho .* E + p);

% Vypocet spektralniho polomeru jakobianu
 sigma = abs(u) + a;
 %

dt = 0.4 * dx / max(sigma);

% Numericky tok na leve a prave casti intervalu
 pTot = 1.e5;
 rhoTot = 1.2;

pb =  min(p(1),pTot);
 M2 = ( (pb/pTot) ^ ((1-kappa)/kappa) - 1 ) * 2/(kappa-1);
 rhob = rhoTot * (1+(kappa-1)/2*M2) ^ (1/(1-kappa));
 cb = sqrt(kappa*pb/rhob);
 ub = cb*sqrt(M2);
 rEb = pb/(kappa-1) + 0.5*rhob*ub^2;
 F(:,1) = [rhob*ub; rhob*ub^2+pb; ub*(rEb + pb)];

p2 = 0.75 * pTot;

pb = p2;
 rhob = rho(n);
 ub = u(n);
 rEb = pb/(kappa-1) + 0.5*rhob*ub^2;
 F(:,n+1) = [rhob*ub; rhob*ub^2+pb; ub*(rEb + pb)];

% Numericky tok f
 for i = 2:n
 sl = min( u(i-1)-a(i-1), u(i)-a(i) );
 sr = max( u(i-1)+a(i-1), u(i)+a(i) );

Wl = W(:,i-1);
 Wr = W(:,i);

Fl = FF(:,i-1);
 Fr = FF(:,i);

if (0<=sl)
 F(:,i) = Fl;
 elseif (0<sr)
 F(:,i) = (sr*Fl - sl*Fr + sl*sr*(Wr-Wl)) / (sr-sl);
 else
 F(:,i) = Fr;
 end

end
 Q(2,:) = p .* (A(2:n+1)-A(1:n))/dx;

for k=1:3
 F(k,:) = A .* F(k,:);
 Wn(k,1:n) = W(k,1:n) - dt/dx./Ai .* (F(k,2:n+1) - F(k,1:n)) + dt./Ai.*Q(k,:);
 end

if (mod(iter,100)==0)
 Rezidua = [ Rezidua,  sqrt(sum((Wn-W).**2,dim=2)) / dt];
 plot(x, p/1e5); axis([0 1 0 1.2]);
 pause(0.01);
 end

W = Wn;
 t = t + dt;

end