% animate_2D_vib.m
%
% This MATLAB m-file "animates" a
vibrational mode
% for the 2-D lattice.
%
% K. Beers. MIT ChE. 10/4/2002
% load in results of calculation
function iflag_main = animate_2D_vib();
iflag_main = 0;
% read in results of normal mode analysis
load lattice_2D_vib.mat;
% display normal modes and their frequencies
disp(' ');
disp('Normal mode frequencies (rad/sec) : ');
disp('-----------------------------------');
for j=1:length(freq)
disp([int2str(j), '
', num2str(freq(j))]);
end
disp(' ');
% select normal mode to animate
k_show = input('Enter number of mode to
visualize : ');
% Create vector of theta values for a single
% oscillation.
num_frames = 50;
theta_vect = linspace(0,2*pi,num_frames);
[sin_max,iframe_max] = max(sin(theta_vect));
if(length(iframe_max) > 1)
iframe_max = iframe_max(1);
end
% Set amplitude of oscillation so that the
% maximum displacement is equal to 1/3 times
% the equilibirum bond length.
displace_max = max(abs(V_eig(:,k_show)));
a = l_b/3/displace_max;
% Create movie by plotting 2-D lattice
positions
title_phrase = ['2-D lattice, N = ', int2str(N),
...
',
mode # = ', int2str(k_show), ...
',
\omega = ', num2str(freq(k_show))];
movie_fig = figure;
for iframe = 1:num_frames
hold off;
% compute departure
vector
delta = a*sin(theta_vect(iframe))*V_eig(:,k_show);
q = q_min + delta;
% plot positions of atoms
for i=1:N
for
j=1:N
[k,kx,ky] = get_master_index(i,j,N);
plot(q(kx),q(ky),'o');
hold on;
end
end
axis([ (-l_b) (N+l_b) (-l_b)
(N+l_b) ]);
title(title_phrase);
% get frame for movie
Movie_of_mode(iframe) =
getframe;
% if maximum amplitude,
make separate plot
if(iframe == iframe_max)
figure;
for
i=1:N
for
j=1:N
[k,kx,ky] = get_master_index(i,j,N);
plot(q(kx),q(ky),'o');
hold on;
plot(q_min(kx),q_min(ky),'x');
x_line = [q_min(kx), q(kx)];
y_line = [q_min(ky), q(ky)];
plot(x_line,y_line);
end
end
axis([
(-l_b) (N+l_b) (-l_b) (N+l_b) ]);
title([title_phrase,
', max. amplitude']);
figure(movie_fig);
end
end
% Show several periods of oscillation,
repeat
% again and again until stop.
iquit = 1;
times_repeat = 10;
FPS = num_frames/2; % frames per
second
while(iquit)
movie(Movie_of_mode,times_repeat,FPS);
iquit = input('Quit (0)
or Show again (1) : ');
end
iflag_main = 1;
return;
%
===================================================
% get_master_index.m
%
% This function calculates the master index
label of
% a site in the 2D lattice of NxN sites.
function [k,kx,ky] = get_master_index(i,j,N);
k = (i-1)*N+j;
kx = 2*k-1;
ky = 2*k;
return;