1 changed files with 170 additions and 0 deletions
@ -0,0 +1,170 @@ |
|||
%mesh |
|||
%domain |
|||
x_min = 0; |
|||
y_min = 0; |
|||
x_max = 100; |
|||
y_max = 100; |
|||
h = 2; |
|||
%mesh by distmesh |
|||
fd = @(p) drectangle(p,x_min,x_max,y_min,y_max); |
|||
[nodes,elements] = distmesh2d(fd,@huniform,h,[x_min,y_min;x_max,y_max],[x_min,... |
|||
y_min;x_min,y_max;x_max,y_min;x_max,y_max]); |
|||
%************************************************************************** |
|||
% input parameter |
|||
dt = 0.0006; %the time interval(s) |
|||
nt = 101; |
|||
v = 1000; %the velocity of acoustic wave(m/s). |
|||
ppw = 20; |
|||
num = length(nodes); |
|||
num_elem = length(elements); |
|||
|
|||
%allocate memory |
|||
%%sparse |
|||
K = sparse(num,num); |
|||
M = sparse(num,num); |
|||
F = sparse(num,1); |
|||
RES = zeros(num,nt); |
|||
P = sparse(num,1); |
|||
Pold = sparse(num,1); |
|||
Pnew = sparse(num,1); |
|||
II = speye(num); |
|||
distance = zeros(num,1); |
|||
grid_distance = zeros(num_elem,3); |
|||
|
|||
% search the load location,return node number |
|||
loca_x = x_max/2; |
|||
loca_y = y_max/2; |
|||
for ii =1:1:num |
|||
distance(ii,1) = (nodes(ii,1)-loca_x)^2+(nodes(ii,2)-loca_y)^2; |
|||
end |
|||
srcnode = find(distance == min(distance)); |
|||
%************************************************************************** |
|||
|
|||
%assemble M,K |
|||
for ii = 1:1:num_elem |
|||
% the nodes number |
|||
i = elements(ii,1); |
|||
j = elements(ii,2); |
|||
k = elements(ii,3); |
|||
|
|||
%the coordinate of the nodes |
|||
xi = nodes(i,1); |
|||
yi = nodes(i,2); |
|||
|
|||
xj = nodes(j,1); |
|||
yj = nodes(j,2); |
|||
|
|||
xk = nodes(k,1); |
|||
yk = nodes(k,2); |
|||
|
|||
%to calculate the grid distance |
|||
grid_distance(ii,:) = pdist([xi,yi;xj,yj;xk,yk]); |
|||
|
|||
|
|||
%the area of the triangle |
|||
smatrix = [1,xi,yi;1,xj,yj;1,xk,yk]; |
|||
s = 0.5*abs(det(smatrix)); |
|||
|
|||
%M matrix |
|||
M(i,i) = s*(1/6) + M(i,i); |
|||
M(i,j) = s*(1/12) + M(i,j); |
|||
M(i,k) = s*(1/12) + M(i,k); |
|||
|
|||
M(j,i) = s*(1/12) + M(j,i); |
|||
M(j,j) = s*(1/6) + M(j,j); |
|||
M(j,k) = s*(1/12) + M(j,k); |
|||
|
|||
M(k,i) = s*(1/12) + M(k,i); |
|||
M(k,j) = s*(1/12) + M(k,j); |
|||
M(k,k) = s*(1/6) + M(k,k); |
|||
|
|||
a = xi - xk; |
|||
b = xj - xk; |
|||
c = yi - yk; |
|||
d = yj - yk; |
|||
cons = v^2/(4*s); |
|||
|
|||
%K matrix |
|||
K(i,i) = K(i,i) + cons*(d*d+b*b); |
|||
K(i,j) = K(i,j) + cons*(-d*c-b*a); |
|||
K(i,k) = K(i,k) + cons*(d*(c-d)+b*(a-b)); |
|||
|
|||
K(j,i) = K(j,i) + cons*(-c*d-a*b); |
|||
K(j,j) = K(j,j) + cons*(c*c+a*a); |
|||
K(j,k) = K(j,k) + cons*(c*(d-c)+a*(b-a)); |
|||
|
|||
K(k,i) = K(k,i) + cons*(d*(c-d)+b*(a-b)); |
|||
K(k,j) = K(k,j) + cons*(c*(d-c)+a*(b-a)); |
|||
K(k,k) = K(k,k) + cons*((c-d)^2+(b-a)^2); |
|||
|
|||
end |
|||
%output the maximum and minimum grid distance |
|||
maxgrid = max(max(grid_distance)); |
|||
mingrid = min(min(grid_distance)); |
|||
meangrid = 0.5*(maxgrid + mingrid); |
|||
|
|||
%the time series of source wavelet. |
|||
% f0 = v/(ppw*h);%main frequency(Hz). |
|||
f0 = 25; |
|||
t = 0:dt:(nt-1)*dt; |
|||
t0 = 1/f0; |
|||
amp = 1.0e7; |
|||
src = amp*(1 - 2.*(pi*f0.*(t - t0)).^2).*exp( - (pi*f0.*(t - t0)).^2); |
|||
%************************************************************************** |
|||
%calculate |
|||
%sparse |
|||
temp1 = full((dt)^2*(II/M)); |
|||
|
|||
% %for gpu acceleration |
|||
% temp1g = gpuArray(temp1);wxw20230914modify |
|||
temp1g = temp1; |
|||
|
|||
formatSpec = 'The calculating time node is: it = %d.\n'; |
|||
for it =1:1:nt |
|||
fprintf(formatSpec,it); |
|||
|
|||
F(srcnode,1) = src(1,it); %load |
|||
|
|||
%sparse |
|||
temp2 = full(F-K'*P); |
|||
|
|||
% gpu acceleration |
|||
% temp2g = gpuArray(temp2); wxw20230914modify |
|||
temp2g = temp2; |
|||
temp = temp1g*temp2g; |
|||
temp = gather(temp); |
|||
Pnew = temp + 2*P - Pold; |
|||
|
|||
Pold = P; |
|||
P = Pnew; |
|||
RES(:,it) = Pnew; |
|||
end |
|||
% post-processing |
|||
filename = 'FEM2D.gif'; |
|||
x = nodes(:,1); |
|||
y = nodes(:,2); |
|||
[xx, yy] = meshgrid(x_min:x_max,y_min:y_max); |
|||
zz = zeros(x_max+1, y_max+1, nt); |
|||
figure('color','w'); |
|||
figure(1); |
|||
for ii = 1:1:nt |
|||
time = ii*dt;%the present time(s) |
|||
zz(:,:,ii) = griddata(x, y, RES(:,ii), xx, yy); |
|||
imagesc(xx(1,:),yy(:,1),zz(:,:,ii)); |
|||
caxis([-0.3 0.3]); |
|||
shading interp; |
|||
colorbar; |
|||
title(sprintf( 'Time Step = %d ; Time = %0.3f s ',ii,time)); |
|||
xlabel('X(m)'); |
|||
ylabel('Y(m)'); |
|||
set(gca,'FontName','Times New Roman','FontSize',15); |
|||
drawnow; |
|||
FF = getframe(gcf); |
|||
I = frame2im(FF); |
|||
[I, map] = rgb2ind(I, 256); |
|||
if ii == 1 |
|||
imwrite(I,map, filename,'gif', 'Loopcount',inf,'DelayTime',0.1); |
|||
else |
|||
imwrite(I,map, filename,'gif','WriteMode','append','DelayTime',0.1); |
|||
end |
|||
end |
Loading…
Reference in new issue