function U = wvtraffn(x,t,v_max,u_max,u_0,L)
%WVTRAFFN  u = wvtraffn(x,t,v_max,u_max,u_0,L) returns the value u(x,t) of the
%          solution of the traffic flow model 
%          
%          u_t + v_max(1 - 2u/u_max) u_x = 0
%          u(x,0) = u_0    x < -L
%                   u_max  -L < x < 0
%                   0      x > 0
%
%           

%Created: 5/95 by R. Knobel


t_0 = u_max*L / (v_max*(u_max-u_0));

if t==0,

  U = u_0*(-x-L >= 0) + u_max*(x+L-eps >= 0).*(-x >= 0);

elseif (t > 0 & t <= t_0),

  x0 = -v_max*u_0*t/u_max - L;
  x1 = -v_max*t;
  x2 =  v_max*t;
  U  = u_0*(x0-x >= 0) + u_max*(x-x0-eps >= 0).*(x1-x >= 0) +...
      (u_max/2)*(1- (1/(v_max*t))*x).*(x-x1-eps >= 0).*(x2-x >= 0);

elseif (t > t_0),

  x0 = v_max*(1 - 2*u_0/u_max)*t - 2*sqrt( L*v_max*t*(1-u_0/u_max) );
  x2 = v_max*t;
  U  = u_0*(x0-x >= 0) + ...
       (u_max/2)*(1- (1/(v_max*t))*x).*(x-x0-eps >= 0).*(x2-x >= 0);

end;
