% This Matlab script solves the one-dimensional convection
% equation using a finite difference algorithm.  The 
% discretization uses central differences in space and forward
% Euler in time.  An inflow bc is set and at the outflow a
% one-sided (backwards) difference is used.  The initial condition
% is a Gaussian distribution.
%

clear all;

% Set-up grid
xL = -4;
xR =  4;
Nx = 401; % number of control volumes
x = linspace(xL,xR,Nx);

% Calculate cell size in control volumes (assumed equal)
dx = x(2) - x(1);

% Set velocity 
u = 1;

% Set final time
tfinal = 100;

% Set timestep
CFL = 0.1;
dt = CFL*dx/abs(u);

% Set initial condition
U = exp(-x.^2);
t = 0;

% Set bc state at left (assumes u>0)
UL = exp(-xL^2);

% Loop until t > tfinal
while (t < tfinal),

  % Copy old state vector
  U0 = U;
  
  % Inflow boundary
  U(1) = UL;
  
  % Interior nodes
  for i = 2:Nx-1,
    U(i) = U0(i) - dt*(U0(i+1)-U0(i-1))/(2*dx);
  end

  % Outflow boundary uses backward difference
  i = Nx;
  U(i) = U0(i) - dt*(U0(i)-U0(i-1))/(dx);
  
  % Increment time
  t = t + dt;

  % Plot current solution
  plot(x,U,'*');
  xlabel('x'); ylabel('U');
  title(sprintf('time = %f\n',t));
  axis([xL, xR, -0.5, 1.5]);
  grid on;
  drawnow;          
  
end

