Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

% tok v dutin?. metoda ví?ivosti a pokutové funkice. Upwind.

Metoda

% st?ídavých sm?r?.

clc

clear all

tic

h=1;

um=1;

visc=1e-3;

% parametry site, a casovy krok

relax=0.5;

n=51;

d=h/(n-1);

d2=d^2;

niter=5000;

psi=zeros(n,n);

omega=zeros(n,n);

u=zeros(n,n);

v=zeros(n,n);

a=zeros(n,1);

b=ones(n,1);

c=zeros(n,1);

r=zeros(n,1);

for iter=1:niter

for i=1:n

u(i,n)=um;
end

for i=2:n-1

for j=2:n-1

u(i,j)=(psi(i,j+1)-psi(i,j-1))/(2*d);

v(i,j)=(psi(i-1,j)-psi(i+1,j))/(2*d);

end

end

%stream function x-implicit

for j=2:n-1

for i=2:n-1

a(i)=-1/d2;

b(i)=4/d2;

c(i)=-1/d2;

r(i)=(psi(i,j-1)+psi(i,j+1))/d2+ omega(i,j);

end

r(1)=0;r(n)=0;

ps=TDMAsolver(a,b,c,r,n);

for i=2:n-1

psi(i,j)=(1-relax)*psi(i,j)+relax*ps(i);

end

end

%stream function y-implicit

for i=2:n-1

for j=2:n-1

a(j)=-1/d2;b(j)=4/d2;c(j)=-1/d2;r(j)=(psi(i-1,j)+psi(i+1,j))/d2+ omega(i,j);
end

r(1)=0;r(n)=0;

ps=TDMAsolver(a,b,c,r,n);

for j=2:n-1

psi(i,j)=(1-relax)*psi(i,j)+relax*ps(j);

end

end

% vorticity boundary conditions

for i=1:n

omega(i,n)=relax*omega(i,n)+(1-relax)*2/d2* (psi(i,n)-psi(i,n-1)-um*d);

omega(i,1)=relax*omega(i,1)+(1-relax)*2* (psi(i,1)-psi(i,2))/d2;

omega(1,i)=relax*omega(1,i)+(1-relax)*2*(psi(1,i)-psi(2,i))/d2;

omega(n,i)=relax*omega(n,i)+(1-relax)*2*(psi(n,i)-psi(n-1,i))/d2;

end

%vorticity x-implicit

for j=2:n-1

for i=2:n-1

up=u(i,j);vp=v(i,j);

a(i)=-visc/d2-max(up,0)/d;

b(i)=4*visc/d2+(abs(up)+abs(vp))/d;

c(i)=-visc/d2-max(-up,0)/d;

r(i)=omega(i,j-1)*(visc/d2+max(vp,0)/d)+omega(i,j+1)*(visc/d2+max(-vp,0)/d);

end

r(1)=omega(1,j);r(n)=omega(n,j);

ps=TDMAsolver(a,b,c,r,n);
for i=2:n-1

omega(i,j)=(1-relax)*omega(i,j)+relax*ps(i);

end

end

%vorticity y-implicit

for i=2:n-1

for j=2:n-1

up=u(i,j);vp=v(i,j);

a(j)=-visc/d2-max(vp,0)/d;

b(i)=4*visc/d2+(abs(up)+abs(vp))/d;

c(j)=-visc/d2-max(-vp,0)/d;

r(j)=omega(i-1,j)*(visc/d2+max(up,0)/d)+omega(i+1,j)* (visc/d2+max(-up,0)/d);

end

r(1)=omega(i,1);r(n)=omega(i,n);

ps=TDMAsolver(a,b,c,r,n);

for j=2:n-1

omega(i,j)=(1-relax)*omega(i,j)+relax*ps(j);

end

end

end

toc;

function x = TDMAsolver(a,b,c,d,r,n)

%a, b, c, and d are the column vectors for the compressed tridiagonal matrix
n = length(b); % n is the number of rows

% Modify the first-row coefficients

c(1) = c(1) / b(1); % Division by zero risk.

d(1) = d(1) / b(1); % Division by zero would imply a singular matrix.

for i = 2:n

id = 1 / (b(i) - c(i-1) * a(i)); % Division by zero risk.

c(i) = c(i)* id; % Last value calculated is redundant.

d(i) = (d(i) - d(i-1) * a(i)) * id;

end

% Now back substitute.

x(n) = d(n);

for i = n-1:-1:1

x(i) = d(i) - c(i) * x(i + 1);

end

end

You might also like