function wav2D
bc = 'o';
v0 = 1;
Nplot = 40;
tmin = 0; tmax = 20; Nt = 4001;
xmin = -10; xmax = 10; Nx = 800;
ymin = -10; ymax = 10; Ny = 800;
crange = [-0.4,0.4];
close all;
t = linspace(tmin, tmax, Nt); dt = (tmax-tmin)/(Nt-1);
x = linspace(xmin, xmax, Nx); dx = (xmax-xmin)/(Nx-1);
y = linspace(ymin, ymax, Ny); dy = (ymax-ymin)/(Ny-1);
Z = zeros(Nx, Ny, 3);
figure; set(gcf, 'Unit', 'Normalized', 'Position', [0.1,0.1,0.4,0.4]);
for it = 1:Nt
Z(400,400,2) = 2*sin(5*t(it));
d2Z = laplacian(Z(:,:,2), dx, dy);
if bc == 'd'
Z(:,:,3) = v0^2*dt^2*d2Z + 2*Z(:,:,2) - Z(:,:,1);
elseif bc == 'o'
Z(2:end-1,2:end-1,3) = (v0*dt)^2*d2Z(2:end-1, 2:end-1) +...
2*Z(2:end-1,2:end-1,2) - Z(2:end-1,2:end-1,1);
grad_x = gradient(Z(:,end,2))/dx;
grad_y = (Z(:,end,2)-Z(:,end-1,2))/dy;
Z(:,end,3) = Z(:,end,2) ...
- (v0*dt)*sign(grad_y).*sqrt(grad_x.^2 + grad_y.^2);
grad_x = gradient(Z(:,1,2))/dx;
grad_y = (Z(:,2,2)-Z(:,1,2))/dy;
Z(:,1,3) = Z(:,1,2) ...
+ (v0*dt)*sign(grad_y).*sqrt(grad_x.^2 + grad_y.^2);
grad_x = (Z(end,:,2)-Z(end-1,:,2))/dx;
grad_y = gradient(Z(end,:,2))/dy;
Z(end,:,3) = Z(end,:,2) ...
- (v0*dt)*sign(grad_x).*sqrt(grad_x.^2 + grad_y.^2);
grad_x = (Z(2,:,2)-Z(1,:,2))/dx;
grad_y = gradient(Z(1,:,2))/dy;
Z(1,:,3) = Z(1,:,2) ...
+ (v0*dt)*sign(grad_x).*sqrt(grad_x.^2 + grad_y.^2);
end
Z(:,:,1) = Z(:,:,2); Z(:,:,2) = Z(:,:,3);
if mod(it, Nplot) == 0
clf; surfCart(x, y, Z(:,:,3)); caxis(crange);
colormap jet; shading interp; axis equal;
xlabel x; ylabel y; view(78, 32);
axis([xmin,xmax,ymin,ymax,-2,2]);
title(['t = ' num2str(t(it), '%.2f')]);
saveas(gcf, [num2str(it/Nplot) '.png']);
end
end
end
function d2Z = laplacian(Z, dx, dy)
N1 = size(Z, 1); N2 = size(Z, 2);
z1 = zeros(N1, 1); z2 = zeros(1, N2);
d2Z_1 = ([Z(2:end, :); z2] + [z2; Z(1:end-1, :)] - 2*Z)/dx^2;
d2Z_2 = ([Z(:, 2:end) z1] + [z1 Z(:, 1:end-1)] - 2*Z)/dy^2;
d2Z = d2Z_1 + d2Z_2;
end