

%                            Program wave1
%
%      This program uses a finite difference scheme to integrate the 
%   wave equation  u_tt + 2du_t -u_xx +ku = 0 on [0,10] with
%   u = 0 at both ends.
%      At run time, user enters the values of d and k. delx and delt
%   are both set at .025. At run time user enters the number n1 of
%   time steps to the first snapshot, snap1; n2 the number of time
%   steps from the first snapshot to the second snapshot, etc.
%   For example if n1 = 20, n2 = 20, n3 = 10 and n4 = 40, then
%   snapshots will be made at times t1 = .5, t2 = 1.0, t3 = 1.5, and
%   t4 = 2.5.
%      Two choices of initial data are built into the program; they
%   are the plucked string, and the hammer blow.  For general data
%   user must provide function files f.m and g.m which are array
%   smart and such that f(0) = f(10) = 0 , g(0) = g(10) = 0.

d = input(' enter the value of d  ')
k = input(' enter the value of k  ')

    disp ('  enter choice of data  ')
disp('1 and 2 are piecewise data, while 3 must be array smart ')
m = input(' 1 for hammer blow,  2 for plucked string, 3 for other    ')

disp(' Note: time step here is delt = .025  ')

disp('Enter the number of time steps between snapshots ')
n = input('in the form [n1 n2 n3 n4]   ')
delt = .025;
delx = .025;

n1 = n(1); n2 = n(2); n3 = n(3); n4 = n(4);

t1 = n1*delt
t2 = t1 +n2*delt
t3 = t2 + n3*delt
t4 = t3 + n4*delt

rho = (delt/delx)^2;
denom = 1.0 + d*delt +.5*k*(delt)^2;
alpha = 2*(1.0 - rho)/denom;
beta = rho/denom;
gamma = (1.0 -d*delt +.5*k*(delt)^2)/denom;

a = 1.0 -.5*k*(delt)^2 -rho;
b = (1.0 -d*delt)*delt;
 
x = 0:delx:10;
J = 10/delx;
j = [2:J];



if m == 1 

% initial conditions for hammer blow
% initial position
  snap0 = zeros(size(x));
  w = snap0;

% determination of initial velocity
  gg = zeros(size(x));
  for i = J/4+1:3*J/4 + 1
       gg(i) = -1;
   end
   gg(J/4+ 1) = -.5;
   gg(3*J/4 + 1) = -.5;

% first time step for hammer blow.
   v = b*gg;

elseif m == 2

% initial data for plucked string.
   for i = 1:J/2
       snap0(i) = x(i)/5;
   end
   for i = J/2 + 1: J+1
       snap0(i) = (10-x(i))/5;
   end
   w = snap0;

%first time step for plucked string
   v = zeros(size(x));
   v(j) = a*w(j) +.5*rho*(w(j+1) + w(j-1));

else m == 3

% This third option uses array smart data 
% initial data
    snap0 = f(x);
    w = snap0;
    v = zeros(size(x));
%first time step
    v(j) = a*f(x(j)) +.5*rho*( f(x(j-1)) +f(x(j+1)) ) +b*g(x(j));
end

u = zeros(size(x));

% here begins the loop for later time steps
for n =  2: n1
   u(j) = alpha*v(j) + beta*(v(j+1) + v(j-1) ) - gamma*w(j);
   w = v;
   v = u;
end
disp(' Computed up to time t1 ')
snap1 = u;


for n =  1: n2 
   u(j) = alpha*v(j) + beta*(v(j+1) + v(j-1) ) - gamma*w(j);
   w = v;
   v = u;
end
disp(' Computed up to time t2' )
snap2 = u;

for n = 1: n3 
    u(j) = alpha*v(j) + beta*(v(j+1) + v(j-1) ) - gamma*w(j);
    w = v;
    v = u;
end
disp(' Computed up to time t3 ')
snap3 = u;

for n = 1: n4
    u(j) = alpha*v(j) + beta*(v(j+1) + v(j-1) ) - gamma*w(j);
    w =v;
    v = u;
end
disp(' Computed up to time t4  ')
snap4 = u ;
plot(x,snap0,x,snap1,x,snap2,x,snap3,x,snap4)
say0=['t=' num2str(0)];
say1=['t=' num2str(t1)];
say2=['t=' num2str(t2)];
say3=['t=' num2str(t3)];
say4=['t=' num2str(t4)];

legend(say0,say1,say2,say3,say4,'Location', 'Southwest' )
