function varargout = sliderdiff(varargin)
% SLIDERDIFF Application M-file for sliderdiff.fig
%    FIG = SLIDERDIFF launch sliderdiff GUI.
%    SLIDERDIFF('callback_name', ...) invoke the named callback.

% Last Modified by GUIDE v2.0 07-Oct-2001 19:37:49

if nargin == 0  % LAUNCH GUI

	fig = openfig(mfilename,'reuse');

	% Generate a structure of handles to pass to callbacks, and store it. 
	handles = guihandles(fig);
	guidata(fig, handles);

    set(handles.slider1,'Value',0);
    set(handles.slider2,'Value',0);
    set(handles.slider3,'Value',0);
    set(handles.slider4,'Value',0);
    set(handles.slider5,'Value',0);
    set(handles.slider6,'Value',0);
    set(handles.slider7,'Value',0);
    set(handles.slider8,'Value',0);
    set(handles.slider9,'Value',0);
    set(handles.slider10,'Value',0);
    set(handles.slider11,'Value',0);
    set(handles.slider12,'Value',0);
    set(handles.slider13,'Value',0);
    
    alpha = get(handles.DiffCoeffSlider,'Value');
    set(handles.DiffCoeffSliderValue,'String',sprintf('%5.3f',alpha));
    
	if nargout > 0
		varargout{1} = fig;
	end

elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK

	try
		if (nargout)
			[varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
		else
			feval(varargin{:}); % FEVAL switchyard
		end
	catch
		disp(lasterr);
	end

end


%| ABOUT CALLBACKS:
%| GUIDE automatically appends subfunction prototypes to this file, and 
%| sets objects' callback properties to call them through the FEVAL 
%| switchyard above. This comment describes that mechanism.
%|
%| Each callback subfunction declaration has the following form:
%| <SUBFUNCTION_NAME>(H, EVENTDATA, HANDLES, VARARGIN)
%|
%| The subfunction name is composed using the object's Tag and the 
%| callback type separated by '_', e.g. 'slider2_Callback',
%| 'figure1_CloseRequestFcn', 'axis1_ButtondownFcn'.
%|
%| H is the callback object's handle (obtained using GCBO).
%|
%| EVENTDATA is empty, but reserved for future use.
%|
%| HANDLES is a structure containing handles of components in GUI using
%| tags as fieldnames, e.g. handles.figure1, handles.slider2. This
%| structure is created at GUI startup using GUIHANDLES and stored in
%| the figure's application data using GUIDATA. A copy of the structure
%| is passed to each callback.  You can store additional information in
%| this structure at GUI startup, and you can change the structure
%| during callbacks.  Call guidata(h, handles) after changing your
%| copy to replace the stored original so that subsequent callbacks see
%| the updates. Type "help guihandles" and "help guidata" for more
%| information.
%|
%| VARARGIN contains any extra arguments you have passed to the
%| callback. Specify the extra arguments by editing the callback
%| property in the inspector. By default, GUIDE sets the property to:
%| <MFILENAME>('<SUBFUNCTION_NAME>', gcbo, [], guidata(gcbo))
%| Add any extra arguments after the last argument, before the final
%| closing parenthesis.



% --------------------------------------------------------------------
function varargout = slider1_Callback(h, eventdata, handles, varargin)



% --------------------------------------------------------------------
function varargout = slider2_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider3_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider4_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider5_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider6_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider7_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider8_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider9_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider10_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider11_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider12_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = slider13_Callback(h, eventdata, handles, varargin)




% --------------------------------------------------------------------
function varargout = GoButton_Callback(h, eventdata, handles, varargin)
   N = str2double(get(handles.NumItersSliderValue,'String'));

   u(1) = get(handles.slider1,'Value');
   u(2) = get(handles.slider2,'Value');
   u(3) = get(handles.slider3,'Value');
   u(4) = get(handles.slider4,'Value');
   u(5) = get(handles.slider5,'Value');
   u(6) = get(handles.slider6,'Value');
   u(7) = get(handles.slider7,'Value');
   u(8) = get(handles.slider8,'Value');
   u(9) = get(handles.slider9,'Value');
   u(10) = get(handles.slider10,'Value');
   u(11) = get(handles.slider11,'Value');
   u(12) = get(handles.slider12,'Value');
   u(13) = get(handles.slider13,'Value');

   alpha = get(handles.DiffCoeffSlider,'Value');
   for k = 1:N,
       um = [u(1) u(1:12)];
       up = [u(2:13) u(13)];
       u = u - alpha*(u-um) + alpha*(up-u);
       
       set(handles.slider1,'Value',u(1));
       set(handles.slider2,'Value',u(2));
       set(handles.slider3,'Value',u(3));
       set(handles.slider4,'Value',u(4));
       set(handles.slider5,'Value',u(5));
       set(handles.slider6,'Value',u(6));
       set(handles.slider7,'Value',u(7));
       set(handles.slider8,'Value',u(8));
       set(handles.slider9,'Value',u(9));
       set(handles.slider10,'Value',u(10));
       set(handles.slider11,'Value',u(11));
       set(handles.slider12,'Value',u(12));
       set(handles.slider13,'Value',u(13));
       
       set(handles.CurrentIter,'String',num2str(k));
       
       if (k < N)
           pause(0.05)
       end
   end
   set(handles.CurrentIter,'String','Done')


% --------------------------------------------------------------------
function varargout = ZeroAllButton_Callback(h, eventdata, handles, varargin)

    set(handles.slider1,'Value',0);
    set(handles.slider2,'Value',0);
    set(handles.slider3,'Value',0);
    set(handles.slider4,'Value',0);
    set(handles.slider5,'Value',0);
    set(handles.slider6,'Value',0);
    set(handles.slider7,'Value',0);
    set(handles.slider8,'Value',0);
    set(handles.slider9,'Value',0);
    set(handles.slider10,'Value',0);
    set(handles.slider11,'Value',0);
    set(handles.slider12,'Value',0);
    set(handles.slider13,'Value',0);



% --------------------------------------------------------------------
function varargout = NumItersSlider_Callback(h, eventdata, handles, varargin)

   N = round(get(h,'Value'));
   set(handles.NumItersSliderValue,'String',num2str(N));
   


% --------------------------------------------------------------------
function varargout = RandomButton_Callback(h, eventdata, handles, varargin)

    set(handles.slider1,'Value',rand);
    set(handles.slider2,'Value',rand);
    set(handles.slider3,'Value',rand);
    set(handles.slider4,'Value',rand);
    set(handles.slider5,'Value',rand);
    set(handles.slider6,'Value',rand);
    set(handles.slider7,'Value',rand);
    set(handles.slider8,'Value',rand);
    set(handles.slider9,'Value',rand);
    set(handles.slider10,'Value',rand);
    set(handles.slider11,'Value',rand);
    set(handles.slider12,'Value',rand);
    set(handles.slider13,'Value',rand);




% --------------------------------------------------------------------
function varargout = DiffCoeffSlider_Callback(h, eventdata, handles, varargin)

    alpha = get(h,'Value');
    set(handles.DiffCoeffSliderValue,'String',sprintf('%5.3f',alpha));
