Matlab Codes
Matlab Codes
clc; clear;
% Grid setup
nx = 100; ny = 50;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Flow properties
gamma = 1.4;
% Solver parameters
maxIter = 1000;
tolerance = 1e-5;
alpha_p = 0.3;
alpha_u = 0.7;
for i = 2:nx+1
for j = 2:ny+1
if airfoil(j,i)
u(i,j) = 0; v(i,j) = 0;
end
end
end
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
% --- Pressure correction (SIMPLER style) ---
for i = 2:nx+1
for j = 2:ny+1
end
end
break;
end
end
u_plot(airfoil) = NaN;
v_plot(airfoil) = NaN;
figure;
hold on;
xlabel('X'); ylabel('Y');
axis equal;
Parabolic
clc; clear;
nx = 100; ny = 50;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Physical parameters
Re = 1000;
% Initialize variables
% Relaxation factors
alpha_p = 0.3;
alpha_u = 0.7;
% Time-stepping loop (parabolic)
u(:,[1 end]) = 0;
v(:,[1 end]) = 0;
v(1,:) = 0; v(end,:) = 0;
for i = 2:nx+1
for j = 2:ny+1
if airfoil(j,i)
u(i,j) = 0;
v(i,j) = 0;
end
end
end
for i = 2:nx+1
for j = 2:ny+1
end
end
for i = 2:nx
for j = 2:ny+1
+ mu * (d2udx2 + d2udy2) );
end
end
for i = 2:nx+1
for j = 2:ny
+ mu * (d2vdx2 + d2vdy2) );
end
end
if mod(time, 100) == 0
fprintf("Time step %d: max error = %.6f\n", time, max([err_u err_v err_p]));
end
end
figure;
hold on;
xlabel('X'); ylabel('Y');
clc; clear;
% Domain
nx = 100; ny = 50;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Physical properties
rho = 1.0;
mu = 1.5e-3; % viscosity
Re = 1000;
u = zeros(nx+1, ny+2);
v = zeros(nx+2, ny+1);
p = zeros(nx+2, ny+2);
% Relaxation factors
alpha_p = 0.3;
alpha_u = 0.7;
maxIter = 1000;
tolerance = 1e-5;
u_old = u;
v_old = v;
p_old = p;
u(:,[1 end]) = 0;
v(:,[1 end]) = 0;
v(1,:) = 0; v(end,:) = 0;
for i = 2:nx+1
for j = 2:ny+1
if airfoil(j,i)
u(i,j) = 0; v(i,j) = 0;
end
end
end
for i = 2:nx+1
for j = 2:ny+1
end
end
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
% --- Convergence check ---
if mod(iter, 50) == 0
end
break;
end
end
u_c(airfoil) = NaN;
v_c(airfoil) = NaN;
figure;
hold on;
xlabel('X'); ylabel('Y');
clear; clc;
% Grid
nx = 50; ny = 50;
Lx = 1; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Physical parameters
rho = 1.0;
mu = 0.01;
U_lid = 1.0;
maxIter = 500;
tolerance = 1e-4;
% Initialize fields
% Under-relaxation
alpha_u = 0.7;
alpha_p = 0.3;
for iter = 1:maxIter
v(1,:) = 0; v(end,:) = 0;
for i = 2:nx
for j = 2:ny+1
Ap_u = Ae + Aw + An + As;
end
end
for i = 2:nx+1
for j = 2:ny
Ap_v = Ae + Aw + An + As;
end
end
% --- Pressure Correction (SIMPLEC) ---
for i = 2:nx+1
for j = 2:ny+1
end
end
p = p + p_corr;
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
if err_u < tolerance && err_v < tolerance && err_p < tolerance
disp(['Converged in ', num2str(iter), ' iterations']);
break;
end
end
title('Velocity Field');
xlabel('X'); ylabel('Y');
Parbola
clc; clear;
% Grid setup
nx = 50; ny = 25;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Physical properties
rho = 1; mu = 1.5e-5;
% Initialize fields
alpha_p = 0.3;
max_iter = 500;
tolerance = 1e-5;
v(1,:) = 0; v(end,:) = 0;
v(:,1) = 0; v(:,end) = 0;
for i = 2:nx
for j = 2:ny+1
ue = u(i+1,j); uw = u(i-1,j);
un = u(i,j+1); us = u(i,j-1);
end
end
for j = 2:ny
ve = v(i+1,j); vw = v(i-1,j);
vn = v(i,j+1); vs = v(i,j-1);
end
end
for i = 2:nx+1
for j = 2:ny+1
end
end
p = p + p_corr;
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
break;
end
end
clc; clear;
nx = 100; ny = 50;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Grid
% Flow properties
rho = 1.0;
mu = 1.5e-5;
U_in = 1.0;
% Initialize fields
% SIMPLEC parameters
alpha_u = 0.7;
alpha_p = 0.3;
max_iter = 1000;
tolerance = 1e-5;
cx = Lx/2; cy = Ly/2;
rx = 0.1; ry = 0.05;
% Main loop
v(1,:) = 0; v(end,:) = 0;
v(:,[1 end]) = 0;
for i = 2:nx
for j = 2:ny+1
ue = u(i+1,j); uw = u(i-1,j);
un = u(i,j+1); us = u(i,j-1);
end
end
for i = 2:nx+1
for j = 2:ny
ve = v(i+1,j); vw = v(i-1,j);
vn = v(i,j+1); vs = v(i,j-1);
end
end
for i = 2:nx+1
for j = 2:ny+1
end
end
p = p + p_corr;
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
break;
end
end
u_center(airfoil_mask) = NaN;
v_center(airfoil_mask) = NaN;
figure;
quiver(X', Y', u_center, v_center);
hold on;
PISO hyperbola
clc; clear;
% Domain
nx = 100; ny = 50;
Lx = 4; Ly = 2;
dx = Lx / nx; dy = Ly / ny;
% Flow parameters
gamma = 1.4;
v = zeros(ny, nx);
p = ones(ny, nx);
dt = 0.001;
time_steps = 500;
for t = 1:time_steps
rhou = rho .* u;
rhov = rho .* v;
for i = 2:nx-1
for j = 2:ny-1
(u(j,i)^2 + p(j,i)/rho(j,i)));
(v(j,i)^2 + p(j,i)/rho(j,i)));
end
end
for i = 2:nx-1
for j = 2:ny-1
end
end
% Boundary conditions
if mod(t,50) == 0
drawnow;
end
end
Parabola
clc; clear;
% Domain setup
nx = 100; ny = 100;
Lx = 2.0; Ly = 2.0;
dx = Lx/nx; dy = Ly/ny;
rho = 1; % Density
for t = 1:nt
u_star = u;
v_star = v;
u(:,1) = 1; % Inlet
v(:,1) = 0; v(:,end) = 0;
for i = 2:nx
for j = 2:ny-1
% v-momentum
end
end
for i = 2:nx-1
for j = 2:ny-1
(v_star(j+1,i) - v_star(j,i))/dy);
end
end
for it = 1:100
p_old = p;
for i = 2:nx-1
for j = 2:ny-1
- rho*(dx^2)*(div(j,i))/dt);
end
end
break;
end
end
for i = 2:nx
for j = 2:ny-1
end
end
if mod(t,100)==0
vel(blunt) = NaN;
colorbar;
drawnow;
end
end
Elliptic
clc; clear;
% Grid parameters
nx = 100; ny = 100;
Lx = 2.0; Ly = 2.0;
dx = Lx/nx; dy = Ly/ny;
x = linspace(0, Lx, nx);
% Physical properties
rho = 1; % Density
% Fields
% Iteration parameters
max_iter = 1000;
tol = 1e-5;
u_star = u;
v_star = v;
for i = 2:nx-1
for j = 2:ny-1
du = -u(j,i)*(u(j,i+1)-u(j,i-1))/(2*dx) ...
- v(j,i)*(u(j+1,i)-u(j-1,i))/(2*dy) ...
dv = -u(j,i)*(v(j,i+1)-v(j,i-1))/(2*dx) ...
- v(j,i)*(v(j+1,i)-v(j-1,i))/(2*dy) ...
end
end
for i = 2:nx-1
for j = 2:ny-1
(v_star(j,i) - v_star(j-1,i))/dy);
end
end
p_old = p;
for i = 2:nx-1
for j = 2:ny-1
end
end
break;
end
end
% Correct velocities
for i = 2:nx-1
for j = 2:ny-1
end
end
% Boundary conditions
u(:,1) = 1; % Inlet
v(:,[1 end]) = 0;
v([1 end],:) = 0;
u(blunt) = 0; v(blunt) = 0;
% Convergence check
res = max(max(abs(div)));
break;
end
if mod(iter,100) == 0
u_center = u;
v_center = v;
vel(blunt) = NaN;
colorbar;
drawnow;
end
end
SIMPLE hyperbola
clc; clear;
% Grid setup
nx = 100; ny = 50;
Lx = 2; Ly = 1;
dx = Lx / nx; dy = Ly / ny;
% Physical parameters
rho = 1.0;
% Initialize fields
u = zeros(nx+1, ny+2);
v = zeros(nx+2, ny+1);
p = zeros(nx+2, ny+2);
for t = 1:nt
u(:,[1 end]) = 0;
v(:,[1 end]) = 0;
v(1,:) = 0; v(end,:) = 0;
% No-slip on airfoil
for i = 2:nx+1
for j = 2:ny+1
if airfoil(j,i)
u(i,j) = 0;
v(i,j) = 0;
end
end
end
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
% --- Pressure correction (Poisson-type from continuity) ---
for i = 2:nx+1
for j = 2:ny+1
end
end
for i = 2:nx
for j = 2:ny+1
end
end
for i = 2:nx+1
for j = 2:ny
end
end
if mod(t, 50) == 0
end
end
v_c(airfoil) = NaN;
figure;
hold on;
xlabel('X'); ylabel('Y');
clc; clear;
% Domain
nx = 200; ny = 100;
Lx = 1.0; Ly = 0.5;
dx = Lx / nx; dy = Ly / ny;
% Parameters
rho = 1.0;
nu = 1.5e-5;
U_inlet = 1.0;
% Initialize
% SIMPLE parameters
alpha_u = 0.7;
alpha_p = 0.3;
max_iter = 500;
tol = 1e-5;
for i = 2:nx+1
v(1,i) = 0;
v(end,i) = 0;
u_star = u(:,i);
p_corr = zeros(ny+1,1);
for j = 2:ny
end
for j = 2:ny
end
% Correct u
for j = 2:ny
end
end
% Check convergence
break;
end
end
end
% Plot results
figure;
colorbar;
xlabel('x'); ylabel('y');
figure;
quiver(X, Y, u, v, 2);
xlabel('x'); ylabel('y');
clc; clear;
% Domain
nx = 100; ny = 50;
Lx = 2.0; Ly = 1.0;
dx = Lx / nx; dy = Ly / ny;
% Parameters
rho = 1.0;
nu = 1e-3;
U_inlet = 1.0;
max_iter = 500;
tol = 1e-4;
alpha_p = 0.3;
% Field variables
% Boundary conditions
v(:,1) = 0; v(:,end) = 0;
% No-slip at airfoil
for i = 2:nx+1
for j = 2:ny+1
if airfoil(j,i)
u(j,i) = 0; v(j,i) = 0;
end
end
end
for i = 2:nx+1
for j = 2:ny+1
ue = u(j,i+1); uw = u(j,i-1);
un = u(j+1,i); us = u(j-1,i);
ve = v(j,i+1); vw = v(j,i);
end
end
for i = 2:nx+1
for j = 2:ny+1
vn = v(j+1,i); vs = v(j-1,i);
ve = v(j,i+1); vw = v(j,i-1);
ue = u(j,i+1); uw = u(j,i);
end
end
div = zeros(size(p));
for i = 2:nx+1
for j = 2:ny+1
end
end
p = p - alpha_p * rho * div;
for i = 2:nx+1
for j = 2:ny+1
end
end
% Convergence check
break;
end
end
vel_mag(airfoil) = NaN;
figure;
colorbar;
xlabel('x'); ylabel('y');
axis equal tight;
figure;
hold on;
xlabel('x'); ylabel('y');