Finite Difference Boundary Condition

2 次查看(过去 30 天)
Hello Everyone,
I have implemented a Finite Difference approach to approximate the wave equation with a pulse as a source function. I need some help from someone who is also familiar with finite difference. As you can see in my code I have reflective and absorbing boundary conditions that I switch between( commented and uncommented). When I run my absorbing boundary conditions I can still see significant reflectance happening at the boundary. Please advise on how to perform full absorption at the boundary, or at least major absorption where reflecting effect is negligible.
Thanks everyone!
tic
c = 1;
Cx = 1;
Cy = 1;
Cx2 = Cx^2;
Cy2 = Cy^2;
T = 3;
Lx = 3;
Ly = 3;
dt = 0.01;
Nt = round(T/dt);
t_input = linspace(0, Nt*dt, Nt);
dx = dt*c/Cx;
dy = dt*c/Cy;
Nx = round(Lx/dx);
Ny = round(Ly/dy);
x_input = linspace(0, Lx, Nx);
y_input= linspace(0, Ly, Ny);
CFL = 0.5
% stability_limit = (1/double(c))*(1/sqrt(1/dx^2 + 1/dy^2));
% if dt <= 0 % max time step?
% safety_factor = -dt; % use negative dt as safety factor
% dt = safety_factor*stability_limit;
% elseif dt > stability_limit
% fprintf('error: dt=%.4f exceeds the stability limit %.6f.\n', dt, stability_limit)
% end
dt2 = dt^2;
u = zeros(Nx,Ny); % solution array
u_1 = zeros(Nx,Ny); % solution at t-dt
u_2 = zeros(Nx,Ny); % solution at t-2*dt
u_output = zeros(Nx, Ny, Nt); % full solution to export
Ix = 1:Nx;
Iy = 1:Ny;
It = 1:Nt;
%IC
u_1 = fspecial('gaussian',Nx,5);
% Special formula for first time step
n = 1;
% First step requires a special formula
dt = sqrt(dt2); % save
Cx2 = CFL*Cx2; Cy2 = CFL*Cy2; dt2 = CFL*dt2; % redefine
D1 = 1; D2 = 0;
for i = 2:Nx-1
for j = 2:Ny-1
u_xx = u_1(i-1,j) - 2*u_1(i,j) + u_1(i+1,j);
u_yy = u_1(i,j-1) - 2*u_1(i,j) + u_1(i,j+1);
u(i,j) = D1*u_1(i,j) - D2*u_2(i,j) + Cx2*u_xx + Cy2*u_yy + ...
dt2*f1(x_input(i), y_input(j), t_input(n)) + dt2*f2(x_input(i), y_input(j), t_input(n))+...
dt2*f3(x_input(i), y_input(j), t_input(n)) + dt2*f4(x_input(i), y_input(j), t_input(n));
u(i,j) = u(i,j)+ dt*V(x_input(i), y_input(j));
end
end
u_2 = u_1;
u_1 = u;
u_output(:,:,1) = u;
% Advance in steps
D1 = 2; D2 = 1;
for n = 2:Nt-1
% Absorbing boundary condition
u(1,:) = u_1(2,:) + ((CFL - 1)/(CFL + 1)*(u(2,:) - u_1(1,:)));
u(end,:) = u_1(end - 1,:) + ((CFL - 1)/(CFL + 1)*(u(end-1,:) - u_1(end,:)));
u(:,1) = u_1(:,2) + ((CFL - 1)/(CFL + 1)*(u(:,2) - u_1(:,1)));
u(:,end) = u_1(:,end - 1) + ((CFL - 1)/(CFL + 1)*(u(:,end-1) - u_1(:,end)));
%reflection boundary condition
%Boundary condition u=0
% u_1(1,:) = 0;
% u_1(end,:) = 0;
% u_1(:,1) = 0;
% u_1(:,end) = 0;
for i =2:Nx-1
for j =2:Ny-1
u_xx = u_1(i-1,j) - 2*u_1(i,j) + u_1(i+1,j);
u_yy = u_1(i,j-1) - 2*u_1(i,j) + u_1(i,j+1);
u(i,j) = D1*u_1(i,j) - D2*u_2(i,j) + Cx2*u_xx + Cy2*u_yy;
end
end
u_2 = u_1;
u_1 = u;
u_output(:,:,n) = u;
end
toc
%Visualize
Zlimits = [-0.1, 0.1];
for frame = 1:10:Nt
s = surf(x_input,y_input,u_output(:,:,frame),'linewidth',2);
s.EdgeColor='none';
grid on;
axis([min(x_input) max(x_input) min(y_input) max(y_input) Zlimits(1) Zlimits(2)]);
xlabel('X axis','fontSize',14);
ylabel('Y axis','fontSize',14);
zlabel('Wave Amplitude','fontSize',14);
%zlim=[-0.3 0.3];
titlestring = [' TIME = ',num2str(t_input(frame)), 'second'];
title(titlestring ,'fontsize',14);
h=gca;
get(h,'FontSize');
set(h,'FontSize',14);
fh = figure(6);
set(fh, 'color', 'white');
F=getframe(fh);
end
movie(fh,F,1);
s = surf(x_input,y_input,u_output(:,:,299),'linewidth',2);
axis([min(x_input) max(x_input) min(y_input) max(y_input) Zlimits(1) Zlimits(2)]);
s.EdgeColor='none';

回答(1 个)

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2021-10-30
One of the possible solutions is to increase the simulation time T from 3 (T = 3) seconds to 5 (T=5) or more seconds.

类别

Help CenterFile Exchange 中查找有关 Get Started with MATLAB 的更多信息

产品


版本

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by