Index: /issm/trunk-jpl/src/m/contrib/larour/glacier_inventory.m
===================================================================
--- /issm/trunk-jpl/src/m/contrib/larour/glacier_inventory.m	(revision 24879)
+++ /issm/trunk-jpl/src/m/contrib/larour/glacier_inventory.m	(revision 24880)
@@ -119,4 +119,17 @@
 		end
 		%}}}
+		function varargout=loadcontour(self,id) % {{{
+			
+			%go find the projected contours for an 'id' region: 
+			disp(['reading projected shapefile for region: '  self.regions(id).name]);
+			contours=shaperead([self.root '/' self.regions(id).name '.laeaproj.shp']);
+			self.regions(id).contours=contours;
+
+			if nargout==1,
+				varargout{1}=contours;
+			end
+
+		end
+		%}}}
 		function disp(self) % {{{
 			disp(sprintf('   Glacier inventory:')); 
Index: /issm/trunk-jpl/src/m/contrib/larour/mdanalysis.m
===================================================================
--- /issm/trunk-jpl/src/m/contrib/larour/mdanalysis.m	(revision 24880)
+++ /issm/trunk-jpl/src/m/contrib/larour/mdanalysis.m	(revision 24880)
@@ -0,0 +1,1683 @@
+function varargout = mdanalysis(varargin)
+% MDANALYSIS MATLAB code for mdanalysis.fig {{{
+%      MDANALYSIS, by itself, creates a new MDANALYSIS or raises the existing
+%      singleton*.
+%
+%      H = MDANALYSIS returns the handle to a new MDANALYSIS or the handle to
+%      the existing singleton*.
+%
+%      MDANALYSIS('CALLBACK',hObject,eventData,handles,...) calls the local
+%      function named CALLBACK in MDANALYSIS.M with the given input arguments.
+%
+%      MDANALYSIS('Property','Value',...) creates a new MDANALYSIS or raises the
+%      existing singleton*.  Starting from the left, property value pairs are
+%      applied to the GUI before mdanalysis_OpeningFcn gets called.  An
+%      unrecognized property name or invalid value makes property application
+%      stop.  All inputs are passed to mdanalysis_OpeningFcn via varargin.
+%
+%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
+%      instance to run (singleton)".
+%
+% See also: GUIDE, GUIDATA, GUIHANDLES
+%variables: }}}
+%global variables:  %{{{
+global md  modelname
+if strcmpi(class(varargin{1}),'model') | strcmpi(class(varargin{1}),'sealevelmodel'), 
+	md=varargin{1};
+	modelname=inputname(1);
+end
+
+global logvalue
+global solutiontype
+global comparison 
+global reload
+global earth
+global whores
+%}}}
+%Initialization code{{{
+% Begin initialization code - DO NOT EDIT
+gui_Singleton = 1;
+gui_State = struct('gui_Name',       mfilename, ...
+                   'gui_Singleton',  gui_Singleton, ...
+                   'gui_OpeningFcn', @mdanalysis_OpeningFcn, ...
+                   'gui_OutputFcn',  @mdanalysis_OutputFcn, ...
+                   'gui_LayoutFcn',  [] , ...
+                   'gui_Callback',   []);
+if nargin && ischar(varargin{1})
+    gui_State.gui_Callback = str2func(varargin{1});
+end
+
+if nargout
+    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
+else
+    gui_mainfcn(gui_State, varargin{:});
+end
+% End initialization code - DO NOT EDIT
+
+
+% --- Executes just before mdanalysis is made visible.
+function mdanalysis_OpeningFcn(hObject, eventdata, handles, varargin)
+global md comparison logvalue solutiontype
+% This function has no output args, see OutputFcn.
+% hObject    handle to figure
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% varargin   command line arguments to mdanalysis (see VARARGIN)
+
+% Choose default command line output for mdanalysis
+handles.output = hObject;
+
+% Update handles structure
+guidata(hObject, handles);
+
+% This sets up the initial plot - only do when we are invisible
+% so window can get raised using mdanalysis.
+if strcmp(get(hObject,'Visible'),'off')
+	comparison=0;
+	logvalue=0;
+	reload=0;
+	plotm();
+end
+
+% UIWAIT makes mdanalysis wait for user response (see UIRESUME)
+% uiwait(handles.figure1);
+
+
+% --- Outputs from this function are returned to the command line.
+function varargout = mdanalysis_OutputFcn(hObject, eventdata, handles) 
+% varargout  cell array for returning output args (see VARARGOUT);
+% hObject    handle to figure
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Get default command line output from handles structure
+varargout{1} = handles.output;
+%}}}
+%Interp faceting {{{
+% --- Executes on button press in Interp.
+function Interp_Callback(hObject, eventdata, handles)
+% hObject    handle to Interp (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Interp
+
+% --- If Enable == 'on', executes on mouse press in 5 pixel border.
+% --- Otherwise, executes on mouse press in 5 pixel border or over Interp.
+function Interp_ButtonDownFcn(hObject, eventdata, handles)
+% hObject    handle to Interp (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% }}}
+%Faceted facting {{{
+% --- Executes on button press in Faceted.
+function Faceted_Callback(hObject, eventdata, handles)
+% hObject    handle to Faceted (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Faceted
+
+% --- If Enable == 'on', executes on mouse press in 5 pixel border.
+% --- Otherwise, executes on mouse press in 5 pixel border or over Faceted.
+function Faceted_ButtonDownFcn(hObject, eventdata, handles)
+% hObject    handle to Faceted (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%}}}
+%Flat faceting {{{
+% --- Executes on button press in Flat.
+function Flat_Callback(hObject, eventdata, handles)
+% hObject    handle to Flat (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Flat
+
+% --- If Enable == 'on', executes on mouse press in 5 pixel border.
+% --- Otherwise, executes on mouse press in 5 pixel border or over Flat.
+function Flat_ButtonDownFcn(hObject, eventdata, handles)
+% hObject    handle to Flat (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%}}}
+%Step {{{
+% --- Executes on selection change in Step.
+function Step_Callback(hObject, eventdata, handles)
+global grounded ice  logvalue
+% hObject    handle to Step (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+
+% Hints: contents = cellstr(get(hObject,'String')) returns Step contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from Step
+
+% --- Executes during object creation, after setting all properties.
+function Step_CreateFcn(hObject, eventdata, handles)
+global md grounded ice  logvalue 
+% hObject    handle to Step (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel(), if isearth, results=md.earth.results; else results=md.icecaps{1}.results; end; else results=md.results; end;
+if isfield(results,'TransientSolution'),
+	strings=cell(length(results.TransientSolution),1);
+	for i=1:length(results.TransientSolution),
+		strings{i}=sprintf('%4.2f     (%i)',results.TransientSolution(i).time,i);
+	end
+	if length(strings)>40,
+		%too many strings, reduce!
+		lt=length(strings);
+		modlt=floor(lt/40);
+		strings=strings(1:modlt:end);
+	end
+	set(hObject,'String',strings);
+	set(hObject,'Value',1);
+else
+	set(hObject,'String',{});
+	set(hObject,'Value',1);
+end
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Log {{{
+% --- Executes on button press in Log.
+function Log_Callback(hObject, eventdata, handles)
+global grounded ice  logvalue
+% hObject    handle to Log (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Log
+
+% --- Executes on button press in Lock.
+function Lock_Callback(hObject, eventdata, handles)
+% hObject    handle to Lock (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Lock
+% }}}
+%Collock: not sure whether that one is working anymore: {{{
+% --- Executes on button press in Collock.
+function Collock_Callback(hObject, eventdata, handles)
+% hObject    handle to Collock (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Collock
+% }}}
+%Field {{{
+% --- Executes on selection change in Field.
+function Field_Callback(hObject, eventdata, handles)
+global md  
+% hObject    handle to Field (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+strings=get(hObject,'String'); value=get(hObject,'Value');
+string=strings(value); 
+
+if strcmpi(string,'IceVolume') | strcmpi(string,'IceVolumeAboveFloatation'),
+	plotv();
+elseif strcmpi(string,'SealevelRSLEustatic'),
+	%display directly: 
+	displayscalar();
+else
+	plotm();
+end
+
+
+
+% Hints: contents = cellstr(get(hObject,'String')) returns Field contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from Field
+
+% --- Executes during object creation, after setting all properties.
+function Field_CreateFcn(hObject, eventdata, handles)
+global md  
+% hObject    handle to Field (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel(), if isearth, results=md.earth.results; else results=md.icecaps{1}.results; end; else results=md.results; end;
+if isfield(results,'TransientSolution'),
+	fields=listfields(results,'TransientSolution');
+	set(hObject,'String',fields);
+	for i=1:length(fields), 
+		if ~issealevel & strcmpi(fields{i},'Vel'),
+			set(hObject,'Value',i);
+			break;
+		end
+		if issealevel & isearth & strcmpi(fields{i},'Sealevel'),
+			set(hObject,'Value',i);
+			break;
+		end
+	end
+else
+	set(hObject,'String',{});
+	set(hObject,'Value',0);
+end
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Model Loading {{{
+% --- Executes on selection change in ModelChoice.
+function ModelChoice_Callback(hObject, eventdata, handles)
+	% hObject    handle to ModelChoice (see GCBO)
+	% eventdata  reserved - to be defined in a future version of MATLAB
+	% handles    structure with handles and user data (see GUIDATA)
+
+	% Hints: contents = cellstr(get(hObject,'String')) returns ModelChoice contents as cell array
+	%        contents{get(hObject,'Value')} returns selected item from ModelChoice
+	global modelname  md whores
+
+	%figure out which model is being loaded: 
+	strings=cellstr(get(hObject,'String'));
+	counter=get(hObject,'Value');
+	string=strings{counter};
+	counter=findstr(string,'(');
+	newmodelname=string(1:counter-2); 
+
+	%load model from base workspace:
+	md= evalin('base', newmodelname);
+
+	%replot: 
+	h = findobj('Tag','Field');
+	Field_Callback(h,eventdata,handles);
+
+
+	%eval([newmodelname '=md;']);
+	%close gcbf;
+	%eval(['mdanalysis(' newmodelname ');']); 
+
+% --- Executes during object creation, after setting all properties.
+function ModelChoice_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to ModelChoice (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+global modelname
+
+
+%figure out how many models are in the workspace!
+whores=evalin('base','whos');
+flags=zeros(length(whores),1);
+for i=1:length(whores),
+	if strcmpi(whores(i).class,'model') | strcmpi(whores(i).class,'sealevelmodel'),
+		flags(i)=1;
+	end
+end
+pos=find(flags);
+whores=whores(pos);
+
+strings={};
+for i=1:length(whores),
+	strings{end+1}=[whores(i).name ' (' whores(i).class ')'];
+end
+
+%match with varargin{1}'s name: 
+counter=-1;
+for i=1:length(strings),
+	if strcmpi(modelname,whores(i).name),
+		counter=i;
+		break;
+	end
+end
+if counter==-1, 
+	error('cound not find input model name matching base workspace names!');
+end
+
+set(hObject,'String',strings);
+set(hObject,'Value',counter);
+
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end 
+
+%}}}
+%Cmin {{{
+function Cmin_Callback(hObject, eventdata, handles)
+% hObject    handle to Cmin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hints: get(hObject,'String') returns contents of Cmin as text
+%        str2double(get(hObject,'String')) returns contents of Cmin as a double
+
+
+% --- Executes during object creation, after setting all properties.
+function Cmin_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to Cmin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+set(hObject,'String',num2str(NaN));
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Cmax {{{
+function Cmax_Callback(hObject, eventdata, handles)
+% hObject    handle to Cmax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: get(hObject,'String') returns contents of Cmax as text
+%        str2double(get(hObject,'String')) returns contents of Cmax as a double
+plotm();
+
+% --- Executes during object creation, after setting all properties.
+function Cmax_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to Cmax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+set(hObject,'String',num2str(NaN));
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Xmin {{{
+function xmin_Callback(hObject, eventdata, handles)
+% hObject    handle to xmin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: get(hObject,'String') returns contents of xmin as text
+%        str2double(get(hObject,'String')) returns contents of xmin as a double
+
+% --- Executes during object creation, after setting all properties.
+function xmin_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to xmin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Xmax {{{
+function xmax_Callback(hObject, eventdata, handles)
+% hObject    handle to xmax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% Hints: get(hObject,'String') returns contents of xmax as text
+%        str2double(get(hObject,'String')) returns contents of xmax as a double
+
+% --- Executes during object creation, after setting all properties.
+function xmax_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to xmax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+% }}}
+%Ymin {{{
+function ymin_Callback(hObject, eventdata, handles)
+% hObject    handle to ymin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% Hints: get(hObject,'String') returns contents of ymin as text
+%        str2double(get(hObject,'String')) returns contents of ymin as a double
+
+
+% --- Executes during object creation, after setting all properties.
+function ymin_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to ymin (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Ymax {{{
+function ymax_Callback(hObject, eventdata, handles)
+% hObject    handle to ymax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% Hints: get(hObject,'String') returns contents of ymax as text
+%        str2double(get(hObject,'String')) returns contents of ymax as a double
+
+
+% --- Executes during object creation, after setting all properties.
+function ymax_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to ymax (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+%}}}
+%Time lable {{{
+function Time_Callback(hObject, eventdata, handles)
+% hObject    handle to Time (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: get(hObject,'String') returns contents of Time as text
+%        str2double(get(hObject,'String')) returns contents of Time as a double
+
+
+% --- Executes during object creation, after setting all properties.
+function Time_CreateFcn(hObject, eventdata, handles)
+global md 
+% hObject    handle to Time (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel, if isearth, results=md.earth.results; else results=md.icecaps{1}.results; end; else results=md.results; end;
+if isfield(results,'TransientSolution'),
+	set(hObject,'String',sprintf('%4.2f',results.TransientSolution(1).time));
+else
+	set(hObject,'String',sprintf('%4.2f',0));
+end
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+% --- If Enable == 'on', executes on mouse press in 5 pixel border.
+% --- Otherwise, executes on mouse press in 5 pixel border or over Time.
+function Time_ButtonDownFcn(hObject, eventdata, handles)
+% hObject    handle to Time (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% }}}
+%Mask: {{{
+% --- Executes on selection change in Masque.
+function Masque_Callback(hObject, eventdata, handles)
+% hObject    handle to Masque (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hints: contents = cellstr(get(hObject,'String')) returns Masque contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from Masque
+
+% --- Executes during object creation, after setting all properties.
+function Masque_CreateFcn(hObject, eventdata, handles)
+global md 
+% hObject    handle to Masque (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel, 
+	if isearth, 
+		mv=md.earth.mask; 
+	else 
+		mv=md.icecaps{1}.mask; 
+	end 
+else 
+	mv=md.mask; 
+end
+strings=fields(mv);
+strings={'all',strings{:}};
+set(hObject,'String',strings);
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end 
+%}}}
+%DiffStep {{{
+% --- Executes on selection change in DiffStep.
+function DiffStep_Callback(hObject, eventdata, handles)
+% hObject    handle to DiffStep (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+
+% Hints: contents = cellstr(get(hObject,'String')) returns DiffStep contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from DiffStep
+
+% --- Executes during object creation, after setting all properties.
+function DiffStep_CreateFcn(hObject, eventdata, handles)
+global md ;
+% hObject    handle to DiffStep (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel, if isearth, results=md.earth.results; else results=md.icecaps{1}.results; end; else results=md.results; end;
+if isfield(results,'TransientSolution'),
+	strings=cell(length(results.TransientSolution),1);
+	for i=1:length(results.TransientSolution),
+		strings{i}=sprintf('%4.2f     (%i)',results.TransientSolution(i).time,i);
+	end
+	if length(strings)>20,
+		%too many strings, reduce!
+		lt=length(strings);
+		modlt=floor(lt/20);
+		strings=strings(1:modlt:end);
+	end
+	set(hObject,'String',strings);
+else
+	set(hObject,'String',{});
+end
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+% --- If Enable == 'on', executes on mouse press in 5 pixel border.
+% --- Otherwise, executes on mouse press in 5 pixel border or over DiffStep.
+function DiffStep_ButtonDownFcn(hObject, eventdata, handles)
+% hObject    handle to DiffStep (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% }}}
+%Diff button {{{
+% --- Executes on button press in Diff.
+function Diff_Callback(hObject, eventdata, handles)
+% hObject    handle to Diff (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Diff
+
+% --- Executes during object creation, after setting all properties.
+function Diff_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to Diff (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+%}}}
+%Model Fields:  {{{
+% --- Executes on selection change in ModelFields.
+function ModelFields_Callback(hObject, eventdata, handles)
+% hObject    handle to ModelFields (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hints: contents = cellstr(get(hObject,'String')) returns ModelFields contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from ModelFields
+
+% --- Executes during object creation, after setting all properties.
+function ModelFields_CreateFcn(hObject, eventdata, handles)
+global md 
+% hObject    handle to ModelFields (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+
+% fields {{{ 
+fields={'geometry.thickness',...
+		 'geometry.surface',...
+		 'geometry.base',...
+		 'geometry.bed',...
+		 'inversion.vx_obs',...
+		 'inversion.vy_obs',...
+		 'inversion.vel_obs',...
+		 'friction.coefficient',...
+		 'materials.rheology_B',...
+		 'mask.ice_levelset',...
+		 'mask.groundedice_levelset',...
+		 'slr.deltathickness'...
+		 };
+
+ if issealevel(),
+	 if isearth,
+		 mask=md.earth.mask;
+	 else
+		 mask=md.icecaps{1}.mask;
+	 end
+ else
+	 mask=md.mask;
+ end
+
+ if  strcmpi(class(mask),'maskpsl'),
+	 fields{end+1}='mask.ocean_levelset';
+	 fields{end+1}='mask.land_levelset';
+ end
+
+
+% }}}
+set(hObject,'String',fields);
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+% }}}
+%Mf button: {{{
+% --- Executes on button press in Mf.
+function Mf_CreateFcn(varargin)
+function Mf_Callback(hObject, eventdata, handles)
+% hObject    handle to Mf (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of Mf
+%}}}
+%Solution menu {{{
+% --- Executes on selection change in popupmenu10.
+function popupmenu10_Callback(hObject, eventdata, handles)
+global solutiontype
+% hObject    handle to popupmenu10 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+%figure out what results we are plotting here: 
+value=get(hObject,'Value');
+strings=get(hObject,'String');
+solutiontype=strings(value);
+
+plotm();
+% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu10 contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from popupmenu10
+
+% --- Executes during object creation, after setting all properties.
+function popupmenu10_CreateFcn(hObject, eventdata, handles)
+global md solutiontype 
+% hObject    handle to popupmenu10 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+if issealevel,
+	if isearth,
+		resultfields=fields(md.earth.results);
+	else
+		resultfields=fields(md.icecaps{1}.results);
+	end
+else
+	resultfields=fields(md.results);
+end
+if isempty(resultfields),
+	resultfields={'None'};
+end
+
+%default solution: 
+for i=1:length(resultfields),
+	solutiontype=resultfields{i};
+	if strcmpi(solutiontype,'StressbalanceSolution'),
+		i0=i;
+		break;
+	elseif strcmpi(solutiontype,'StressbalanceSolution'),
+		i0=i;
+		break;
+	else
+		i0=1;
+	end
+end
+set(hObject,'String',resultfields);
+set(hObject,'Value',i0);
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end 
+% }}}
+%Icecaps menu: {{{
+% --- Executes on selection change in popupmenu11.
+function popupmenu11_Callback(hObject, eventdata, handles)
+global md
+% hObject    handle to popupmenu11 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+strings=get(hObject,'String');
+value=get(hObject,'Value');
+continent=strings{value};
+
+%update basin list: 
+basins=md.basinsfromcontinent(continent);
+strings={'All',basins{:}};
+obj=findobj('Tag', 'popupmenu12');
+set(obj,'String',strings');
+set(obj,'Value',1);
+
+plotm();
+% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu11 contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from popupmenu11
+
+
+% --- Executes during object creation, after setting all properties.
+function popupmenu11_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to popupmenu11 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+global md range;
+
+if issealevel(),
+	strings=md.continents();
+	set(hObject,'String',strings);
+	set(hObject,'Value',1);
+else
+	set(hObject,'String',{});
+	set(hObject,'Value',1);
+end
+
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end 
+% }}}
+%Basins menu{{{
+% --- Executes on selection change in popupmenu12.
+function popupmenu12_Callback(hObject, eventdata, handles)
+global md 
+% hObject    handle to popupmenu12 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+plotm();
+% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu12 contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from popupmenu12
+
+% --- Executes during object creation, after setting all properties.
+function popupmenu12_CreateFcn(hObject, eventdata, handles)
+global md 
+% hObject    handle to popupmenu12 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+if issealevel(),
+
+	%need the continent name:  default first one.
+	continents=md.continents();
+	basins=md.basinsfromcontinent(continents{1});
+	strings={'All',basins{:}};
+	set(hObject,'String',strings);
+	set(hObject,'Value',1);
+else
+	set(hObject,'String',{});
+	set(hObject,'Value',1);
+end
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+% }}}
+%Comparison: {{{
+
+% --- Executes on button press in radiobutton17.
+function radiobutton17_Callback(hObject, eventdata, handles)
+global comparison
+% hObject    handle to radiobutton17 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+comparison=get(hObject,'Value');
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of radiobutton17
+% }}}
+%Earth button: {{{
+
+% --- Executes on button press in radiobutton18.
+function radiobutton18_Callback(hObject, eventdata, handles)
+% hObject    handle to radiobutton18 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+global md earth 
+earth=get(hObject,'value');
+
+%Change Field: 
+if issealevel, if isearth, results=md.earth.results; else results=md.icecaps{1}.results; end; else results=md.results; end;
+fieldHandle=findobj('Tag', 'Field');
+if isfield(results,'TransientSolution'),
+	fieldss=listfields(results,'TransientSolution');
+	set(fieldHandle,'String',fieldss);
+	set(fieldHandle,'Value',1);
+else 
+	set(fieldHandle,'String',{});
+	set(fieldHandle,'Value',1);
+end
+
+%Change Masque: 
+if issealevel, 
+	if isearth, 
+		mv=md.earth.mask; 
+	else 
+		mv=md.icecaps{1}.mask; 
+	end 
+else 
+	mv=md.mask; 
+end
+fieldHandle=findobj('Tag', 'Masque');
+strings=fields(mv);
+strings={'all',strings{:}};
+set(fieldHandle,'String',strings);
+
+plotm();
+% Hint: get(hObject,'Value') returns toggle state of radiobutton18
+% --- Executes during object creation, after setting all properties.
+function radiobutton18_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to radiobutton18 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+global earth 
+earth=1;
+set(hObject,'Value',earth);
+%}}}
+%Reload model:  {{{
+% --- Executes on button press in pushbutton1.
+function pushbutton1_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton1 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+global reload
+reload=1;
+plotm();
+%}}}
+%Scalar {{{
+function Scalar_Callback(hObject, eventdata, handles)
+% hObject    handle to Scalar (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: get(hObject,'String') returns contents of Scalar as text
+%        str2double(get(hObject,'String')) returns contents of Scalar as a double
+
+% --- Executes during object creation, after setting all properties.
+function Scalar_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to Scalar (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+
+	scalarHandle=findobj('Tag', 'Scalar'); 
+	set(scalarHandle,'String',sprintf('%4.2f',NaN));
+
+	if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+		set(hObject,'BackgroundColor','white');
+	end 
+% }}}
+function plotv() % {{{
+	global md   range
+
+	%field:  % {{{ 
+	fieldHandle=findobj('Tag', 'Field'); 
+	fieldstrings=get(fieldHandle,'String');
+	fieldvalue=get(fieldHandle,'Value');
+	field=fieldstrings{fieldvalue};
+	%}}}
+		%lock limits:  % {{{
+		lockHandle=findobj('Tag', 'Lock'); lockvalue=get(lockHandle,'Value');
+		if lockvalue,
+			xl=xlim; yl=ylim;
+		end
+		 %}}}
+	
+	cla, reset(gca);
+	hold on ;
+	if issealevel,
+		if isearth,
+			%do nothing. no ice volume.
+		else
+			dt=md.earth.timestepping.time_step*md.earth.settings.output_frequency;
+			for j=1:length(range),
+				i=range(j);
+				vols=resultstomatrix(md.icecaps{i},'TransientSolution',field);
+				if j==1,
+					volst=vols;
+				else
+					volst(1,:)=volst(1,:)+vols(1,:);
+				end
+			end
+			s1=subplot(2,1,1);
+			set(s1,'Position',[0.3300    0.6100    0.4750    0.3]);
+			plot(volst(2,:),(volst(1,:)-volst(1,1))*md.icecaps{1}.materials.rho_ice/1e12);
+			xlabel('time (yr)'); ylabel('Mass (Gt)'); colorbar off;
+			if lockvalue, xlim(xl), ylim(yl); end
+			
+			s2=subplot(2,1,2);
+			set(s2,'Position',[0.3300    0.1100    0.4750    0.3]);
+			dv=diff(volst(1,:))/dt;
+			plot(volst(2,1:end-1),dv*md.icecaps{1}.materials.rho_ice/1e12);
+			xlabel('time (yr)'); ylabel('Mass (Gt)'); colorbar off;
+			if lockvalue, xlim(xl), ylim(yl); end
+		end
+	else 
+		dt=md.timestepping.time_step*md.settings.output_frequency;
+		vols=resultstomatrix(md,'TransientSolution',field);
+		dv=diff(vols(1,:))/dt;
+		
+		s1=subplot(2,1,1);
+		set(s1,'Position',[0.3300    0.6100    0.4750    0.3]);
+		xlabel('time (yr)'); ylabel('Mass (Gt)'); colorbar off;
+		plot(vols(2,:),(vols(1,:)-vols(1,1))*md.materials.rho_ice/1e12);
+		if lockvalue, xlim(xl), ylim(yl); end
+
+		s2=subplot(2,1,2);
+		set(s2,'Position',[0.3300    0.1100    0.4750    0.3]);
+		xlabel('time (yr)'); ylabel('Mass (Gt)'); colorbar off;
+		plot(vols(2,1:end-1),dv*md.materials.rho_ice/1e12);
+		if lockvalue, xlim(xl), ylim(yl); end
+	end
+%}}}
+function displayscalar() % {{{
+	global md   range
+
+	%field:  % {{{ 
+	fieldHandle=findobj('Tag', 'Field'); 
+	fieldstrings=get(fieldHandle,'String');
+	fieldvalue=get(fieldHandle,'Value');
+	field=fieldstrings{fieldvalue};
+	%}}}
+	%counter:  % {{{ 
+	stepHandle=findobj('Tag', 'Step'); 
+	stepstrings=get(stepHandle,'String');
+	stepvalue=get(stepHandle,'Value');
+	if ~isempty(stepstrings),
+		stepstring=stepstrings{stepvalue};
+		%grab second integer: 
+		A=sscanf(stepstring,'%g (%i)'); counter=A(2);
+	else
+		counter=1;
+	end
+	%}}}
+			
+
+	if issealevel,
+		if isearth,
+		if strcmpi(field,'SealevelRSLEustatic'),
+			dt=md.earth.timestepping.time_step*md.earth.slr.geodetic_run_frequency;
+			eus=md.earth.results.TransientSolution(counter-1).(field)/dt*1000; %in mm/yr
+			scalarHandle=findobj('Tag', 'Scalar'); 
+			set(scalarHandle,'String',sprintf('%4.5f mm/yr',eus));
+		end
+		else
+			error('not supported yet!');
+		end
+	end
+%}}}
+function plotm() % {{{
+
+	%retrieve field: 
+	hObject=findobj('Tag', 'Field'); 
+	strings=get(hObject,'String'); value=get(hObject,'Value');
+
+	string='';
+	if value, 
+		if ~isempty(strings),
+			string=strings(value); 
+		end
+	end
+
+	if strcmpi(string,'IceVolume') | strcmpi(string,'IceVolumeAboveFloatation'),
+		plotv();
+	elseif strcmpi(string,'SealevelRSLEustatic'),
+		displayscalar();
+	else
+		if issealevel(),
+			plotsl();
+		else 
+			plotmd();
+		end
+	end
+%}}}
+	function plotmd() % {{{
+		global logvalue md solutiontype comparison 
+
+		%counter:  % {{{ 
+		stepHandle=findobj('Tag', 'Step'); 
+		stepstrings=get(stepHandle,'String');
+		stepvalue=get(stepHandle,'Value');
+		if ~isempty(stepstrings),
+			stepstring=stepstrings{stepvalue};
+			%grab second integer: 
+			A=sscanf(stepstring,'%g (%i)'); counter=A(2);
+		else
+			counter=1;
+		end
+		%}}}
+		%log:  % {{{ 
+		logHandle=findobj('Tag', 'Log'); logvalue=get(logHandle,'Value');
+		%}}}
+		%shading:  %{{{
+		interpHandle=findobj('Tag', 'Interp'); interpvalue=get(interpHandle,'Value');
+		flatHandle=findobj('Tag', 'Flat'); flatvalue=get(flatHandle,'Value');
+		facetedHandle=findobj('Tag', 'Faceted'); facetedvalue=get(facetedHandle,'Value');
+		if interpvalue,
+			shadingv='interp';
+		elseif flatvalue,
+			shadingv='flat';
+		elseif facetedvalue,
+			shadingv='faceted';
+		else 
+			shadingv='interp';
+		end
+		%}}}
+		%mask:  %{{{
+		maskfieldHandle=findobj('Tag', 'Masque'); 
+		maskfieldstrings=get(maskfieldHandle,'String');
+		maskfieldvalue=get(maskfieldHandle,'Value');
+		maskfield=maskfieldstrings(maskfieldvalue); 
+		maskfield=maskfield{:};
+		if strcmpi(maskfield,'all'),
+			maskv=ones(md.mesh.numberofvertices,1);
+		else
+			maskv=md.mask.(maskfield);
+		end
+		if strcmpi(maskfield,'all'),
+			%do nothing; 
+		elseif strcmpi(maskfield,'groundedice_levelset'),
+			maskv=maskv>=0;
+		elseif strcmpi(maskfield,'ice_levelset'),
+			maskv=maskv<=0;
+		elseif strcmpi(maskfield,'ocean_levelset'),
+			maskv=maskv==1;
+		elseif strcmpi(maskfield,'land_levelset'),
+			maskv=maskv==1;
+		elseif strcmpi(maskfield,'glacier_levelset'),
+			if isnan(maskv),
+				maskv=ones(md.mesh.numberofvertices,1);
+			else
+				maskv=maskv==1;
+			end
+		end
+		maskvalue=0;
+		%}}}
+		%lock limits:  % {{{
+		lockHandle=findobj('Tag', 'Lock'); lockvalue=get(lockHandle,'Value');
+		if lockvalue,
+			xl=xlim; yl=ylim;
+		else
+			xl=[min(md.mesh.x) max(md.mesh.x)];
+			yl=[min(md.mesh.y) max(md.mesh.y)];
+		end %}}}
+		%time: {{{	
+		timeHandle=findobj('Tag','Time');
+		if strcmpi(solutiontype,'TransientSolution'),
+			set(timeHandle,'String',sprintf('%4.2f',md.results.TransientSolution(counter).time));
+		else
+			set(timeHandle,'String',sprintf('%4.2f',0));
+		end
+		%}}}
+		%diffcounter:  % {{{ 
+		stepHandle=findobj('Tag', 'DiffStep'); 
+		stepstrings=get(stepHandle,'String');
+		stepvalue=get(stepHandle,'Value');
+		if ~isempty(stepstrings),
+			stepstring=stepstrings{stepvalue};
+			%grab second integer: 
+			A=sscanf(stepstring,'%g (%i)'); diffcounter=A(2);
+		else
+			diffcounter=1;
+		end
+		diffHandle=findobj('Tag', 'Diff'); 
+		diff=get(diffHandle,'Value');
+		%}}}
+		%field:  % {{{ 
+		fieldHandle=findobj('Tag', 'Field'); 
+		fieldstrings=get(fieldHandle,'String');
+		fieldvalue=get(fieldHandle,'Value');
+		if ~isempty(fieldstrings),
+			fieldv=fieldstrings{fieldvalue};
+		else
+			fieldv=NaN;
+		end
+		mfHandle=findobj('Tag', 'Mf'); 
+		mf=get(mfHandle,'Value');
+		if mf | strcmpi(solutiontype,'None'),
+			fieldHandle=findobj('Tag', 'ModelFields'); 
+			fieldstrings=get(fieldHandle,'String');
+			fieldvalue=get(fieldHandle,'Value');
+			fieldv=fieldstrings{fieldvalue};
+			eval(['field=md.' fieldv ';']);
+			if isnan(field),
+				field='mesh';
+			end
+		else
+			if strcmpi(solutiontype,'TransientSolution'),
+				field=md.results.TransientSolution(counter).(fieldv);
+				dfield=md.results.TransientSolution(diffcounter).(fieldv);
+			elseif strcmpi(solutiontype,'StressbalanceSolution'),
+				field=md.results.StressbalanceSolution.(fieldv);
+				dfield=NaN;
+			else 
+				error('unknown solution type!');
+			end
+		end
+		if comparison, 
+			if strcmpi(solutiontype,'None'),
+				error('cannot compare a solution field to model as no solution was run or selected!');
+			end
+			%figure out second field:
+			if strcmpi(fieldv,'Vel'),
+				field2=md.inversion.vel_obs;
+			end
+		end
+
+		%}}}
+		%color limits:  % {{{
+		cminHandle=findobj('Tag','Cmin'); cmin=str2num(get(cminHandle,'String'));
+		cmaxHandle=findobj('Tag','Cmax'); cmax=str2num(get(cmaxHandle,'String'));
+
+		if isnan(cmin)
+			if logvalue,
+				cmin=.1;
+			else
+				pos=find(maskv);
+				cmin=min(field(pos));
+			end
+		end
+		if isnan(cmax)
+			pos=find(maskv);
+			cmax=max(field(pos));
+		end
+		colaxis=[cmin,cmax];
+		%}}}
+
+		cla;
+		if logvalue,
+			plotmodel(md,'data',field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'log',10,'xlim',xl,'ylim',yl,'shading',shadingv);
+		else
+			if ~diff,
+				if comparison,
+					plotmodel(md,'data',field,'data',field2,'figurestatement','off','clf','off','mask#all',maskv,'caxis#all',colaxis,'xlim#all',xl,'ylim#all',yl,'shading#all',shadingv,'nlines',2,'ncols',1);
+				else
+					if ischar(field) & strcmpi(field,'mesh'),
+						plotmodel(md,'data','mesh','figurestatement','off','clf','off','xlim',xl,'ylim',yl);
+					else
+						plotmodel(md,'data',field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'xlim',xl,'ylim',yl,'shading',shadingv); 
+					end
+				end
+			else
+				plotmodel(md,'data',dfield-field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'xlim',xl,'ylim',yl,'shading',shadingv);
+			end
+
+		end
+		set(gca,'Position',[0.2300    0.1100    0.7750    0.8150]);
+	%}}}
+function plotsl() % {{{
+	global logvalue md solutiontype comparison 
+
+	%counter:  % {{{ 
+	stepHandle=findobj('Tag', 'Step'); 
+	stepstrings=get(stepHandle,'String');
+	stepvalue=get(stepHandle,'Value');
+	if ~isempty(stepstrings),
+		stepstring=stepstrings{stepvalue};
+		%grab second integer: 
+		A=sscanf(stepstring,'%g (%i)'); counter=A(2);
+	else
+		counter=1;
+	end
+	%}}}
+	%log:  % {{{ 
+	logHandle=findobj('Tag', 'Log'); logvalue=get(logHandle,'Value');
+	%}}}
+	%shading:  %{{{
+	interpHandle=findobj('Tag', 'Interp'); interpvalue=get(interpHandle,'Value');
+	flatHandle=findobj('Tag', 'Flat'); flatvalue=get(flatHandle,'Value');
+	facetedHandle=findobj('Tag', 'Faceted'); facetedvalue=get(facetedHandle,'Value');
+	if interpvalue,
+		shadingv='interp';
+	elseif flatvalue,
+		shadingv='flat';
+	elseif facetedvalue,
+		shadingv='faceted';
+	else 
+		shadingv='interp';
+	end
+	%}}}
+	%time: {{{	
+	timeHandle=findobj('Tag','Time');
+	if strcmpi(solutiontype,'TransientSolution'),
+		if isearth,
+			set(timeHandle,'String',sprintf('%4.2f',md.earth.results.TransientSolution(counter).time));
+		else
+			set(timeHandle,'String',sprintf('%4.2f',md.icecaps{1}.results.TransientSolution(counter).time));
+		end
+	else
+		set(timeHandle,'String',sprintf('%4.2f',0));
+	end
+	%}}}
+	%diffcounter:  % {{{ 
+	stepHandle=findobj('Tag', 'DiffStep'); 
+	stepstrings=get(stepHandle,'String');
+	stepvalue=get(stepHandle,'Value');
+	if ~isempty(stepstrings),
+		stepstring=stepstrings{stepvalue};
+		%grab second integer: 
+		A=sscanf(stepstring,'%g (%i)'); diffcounter=A(2);
+	else
+		diffcounter=1;
+	end
+	diffHandle=findobj('Tag', 'Diff'); 
+	diff=get(diffHandle,'Value');
+	%}}}
+
+	if isearth, 
+		%Earth plotting: {{{
+		%field:  % {{{ 
+		fieldHandle=findobj('Tag', 'Field'); 
+		fieldstrings=get(fieldHandle,'String');
+		fieldvalue=get(fieldHandle,'Value');
+		if ~isempty(fieldstrings),
+			fieldv=fieldstrings{fieldvalue};
+		else
+			fieldv=NaN;
+		end
+		colorbartitle={fieldv,''};
+		if strcmpi(fieldv,'SealevelRSLRate'),
+			colorbartitle={'SealevelRSLRate (mm/yr)',''};
+		end
+
+		mfHandle=findobj('Tag', 'Mf'); 
+		mf=get(mfHandle,'Value');
+		if mf | strcmpi(solutiontype,'None'),
+			fieldHandle=findobj('Tag', 'ModelFields'); 
+			fieldstrings=get(fieldHandle,'String');
+			fieldvalue=get(fieldHandle,'Value');
+			fieldv=fieldstrings{fieldvalue};
+			eval(['field=md.earth.' fieldv ';']);
+			if isnan(field),
+				field='mesh';
+			end
+		else
+			if strcmpi(solutiontype,'TransientSolution'),
+				field=md.earth.results.TransientSolution(counter).(fieldv);
+				dfield=md.earth.results.TransientSolution(diffcounter).(fieldv);
+			elseif strcmpi(solutiontype,'StressbalanceSolution'),
+				field=md.earth.results.StressbalanceSolution.(fieldv);
+				dfield=NaN;
+			else 
+				error('unknown solution type!');
+			end
+		end
+		if comparison, 
+			if strcmpi(solutiontype,'None'),
+				error('cannot compare a solution field to model as no solution was run or selected!');
+			end
+			%figure out second field:
+			if strcmpi(fieldv,'Vel'), field2=md.earth.inversion.vel_obs; end
+			if strcmpi(fieldv,'Base'), field2=md.earth.geometry.base; end
+		end
+		%}}}
+		%mask:  %{{{
+		maskfieldHandle=findobj('Tag', 'Masque'); 
+		maskfieldstrings=get(maskfieldHandle,'String');
+		maskfieldvalue=get(maskfieldHandle,'Value');
+		maskfield=maskfieldstrings(maskfieldvalue); 
+		maskfield=maskfield{:};
+		if strcmpi(maskfield,'all'),
+			maskv=ones(md.earth.mesh.numberofvertices,1);
+		else
+			maskv=md.earth.mask.(maskfield);
+		end
+		if strcmpi(maskfield,'all'),
+			%do nothing; 
+		elseif strcmpi(maskfield,'groundedice_levelset'),
+			maskv=maskv>=0;
+		elseif strcmpi(maskfield,'ice_levelset'),
+			maskv=maskv<=0;
+		elseif strcmpi(maskfield,'ocean_levelset'),
+			maskv=maskv==1;
+		elseif strcmpi(maskfield,'land_levelset'),
+			maskv=maskv==1;
+		elseif strcmpi(maskfield,'glacier_levelset'),
+			if isnan(maskv),
+				maskv=ones(md.earth.mesh.numberofvertices,1);
+			else
+				maskv=maskv==1;
+			end
+		end
+		maskvalue=0;
+		%}}}
+		%color limits:  % {{{
+		if ~ischar(field),
+			cminHandle=findobj('Tag','Cmin'); cmin=str2num(get(cminHandle,'String'));
+			cmaxHandle=findobj('Tag','Cmax'); cmax=str2num(get(cmaxHandle,'String'));
+
+			if isnan(cmin)
+				if logvalue,
+					cmin=.1;
+				else
+					pos=find(maskv);
+					cmin=min(field(pos));
+				end
+			end
+			if isnan(cmax)
+				pos=find(maskv);
+				cmax=max(field(pos));
+			end
+
+			if cmin==cmax,
+				colaxis=[cmin-eps,cmax+eps];
+			else
+				colaxis=[cmin,cmax];
+			end
+		end
+
+		%}}}
+		%lock limits:  % {{{
+		lockHandle=findobj('Tag', 'Lock'); lockvalue=get(lockHandle,'Value');
+		if lockvalue,
+			xl=xlim; yl=ylim; zl=zlim;
+			[az,el]=view; v=[az,el];
+		else
+			xl=[min(md.earth.mesh.x) max(md.earth.mesh.x)];
+			yl=[min(md.earth.mesh.y) max(md.earth.mesh.y)];
+			zl=[min(md.earth.mesh.z) max(md.earth.mesh.z)];
+			v=[57,50];
+		end %}}}
+
+		%some quirks: 
+		cla;
+		if logvalue,
+			plotmodel(md.earth,'data',field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'log',10,'xlim',xl,'ylim',yl,'zlim',zl,'shading',shadingv,'colorbar','on','view',v,'colorbartitle',colorbartitle);
+		else
+			if ~diff, 
+				if comparison,
+					plotmodel(md.earth,'data',field,'data',field2,'figurestatement','off','clf','off','mask#all',maskv,'caxis#all',colaxis,'xlim#all',xl,'ylim#all',yl,'zlim#all',zl,'shading#all',shadingv,'nlines',2,'ncols',1,'view#all',v,'colorbartitle',colorbartitle);
+				else
+					if ischar(field) & strcmpi(field,'mesh'),
+						plotmodel(md.earth,'data','mesh','figurestatement','off','clf','off','xlim',xl,'ylim',yl,'zlim',zl,'view#all',v,'colorbartitle',colorbartitle);
+					else
+						plotmodel(md.earth,'data',field,'figurestatement','off','clf','off','mask',maskv,'maskvalue',maskvalue,'caxis',colaxis,'xlim',xl,'ylim',yl,'zlim',zl,'shading',shadingv,'axes','equal','colorbarpos',[.95 .5 .01 .15],'view#all',v,'colorbartitle',colorbartitle);
+					end
+				end
+			else
+				plotmodel(md.earth,'data',dfield-field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'xlim',xl,'ylim',yl,'zlim',zl,'shading',shadingv,'view#all',v,'colorbartitle',colorbartitle);
+			end
+		end
+
+		%coastlines and graticule: {{{
+		load coastlines
+		[x,y,z]=AboveGround(coastlat,coastlon,md.earth.mesh.r(1),1000);
+		hold on; p=plot3(x,y,z,'k-'); set(p,'Color','k');
+
+		%graticule:
+		grat=graticule(30,40,1);
+		[x,y,z]=AboveGround(grat.lat,grat.long,md.earth.mesh.r(1),1000);
+		hold on, p=plot3(x,y,z,'k.-','MarkerSize',.01); set(p,'Color','k');
+		%}}}
+		%}}}
+	else 
+		%IceCaps plotting:  {{{
+
+		%counter:  % {{{ 
+		stepHandle=findobj('Tag', 'Step'); 
+		stepstrings=get(stepHandle,'String');
+		stepvalue=get(stepHandle,'Value');
+		if ~isempty(stepstrings),
+			stepstring=stepstrings{stepvalue};
+			%grab second integer: 
+			A=sscanf(stepstring,'%g (%i)'); counter=A(2);
+		else
+			counter=1;
+		end
+		%}}}
+		%log:  % {{{ 
+		logHandle=findobj('Tag', 'Log'); logvalue=get(logHandle,'Value');
+		%}}}
+		%shading:  %{{{
+		interpHandle=findobj('Tag', 'Interp'); interpvalue=get(interpHandle,'Value');
+		flatHandle=findobj('Tag', 'Flat'); flatvalue=get(flatHandle,'Value');
+		facetedHandle=findobj('Tag', 'Faceted'); facetedvalue=get(facetedHandle,'Value');
+		if interpvalue,
+			shadingv='interp';
+		elseif flatvalue,
+			shadingv='flat';
+		elseif facetedvalue,
+			shadingv='faceted';
+		else 
+			shadingv='interp';
+		end
+		%}}}
+		%time: {{{	
+		timeHandle=findobj('Tag','Time');
+		if strcmpi(solutiontype,'TransientSolution'),
+			set(timeHandle,'String',sprintf('%4.2f',md.icecaps{1}.results.TransientSolution(counter).time));
+		else
+			set(timeHandle,'String',sprintf('%4.2f',0));
+		end
+		%}}}
+		%diffcounter:  % {{{ 
+		stepHandle=findobj('Tag', 'DiffStep'); 
+		stepstrings=get(stepHandle,'String');
+		stepvalue=get(stepHandle,'Value');
+		if ~isempty(stepstrings),
+			stepstring=stepstrings{stepvalue};
+			%grab second integer: 
+			A=sscanf(stepstring,'%g (%i)'); diffcounter=A(2);
+		else
+			diffcounter=1;
+		end
+		diffHandle=findobj('Tag', 'Diff'); 
+		diff=get(diffHandle,'Value');
+		%}}}
+		%range:  % {{{
+		basins=getbasins();
+		if strcmpi(basins,'All'),
+			range=md.basinindx('continent',{getcontinent()});
+		else
+			range=md.basinindx('basin',basins);
+		end
+
+		%}}}
+		cla;
+		for j=1:length(range), 
+			i=range(j);
+			%mask:  %{{{
+			maskfieldHandle=findobj('Tag', 'Masque'); 
+			maskfieldstrings=get(maskfieldHandle,'String');
+			maskfieldvalue=get(maskfieldHandle,'Value');
+			maskfield=maskfieldstrings(maskfieldvalue); 
+			maskfield=maskfield{:};
+			if strcmpi(maskfield,'all'),
+				maskv=ones(md.icecaps{i}.mesh.numberofvertices,1);
+			else
+				maskv=md.icecaps{i}.mask.(maskfield);
+			end
+			if strcmpi(maskfield,'all'),
+				%do nothing; 
+			elseif strcmpi(maskfield,'groundedice_levelset'),
+				maskv=maskv>=0;
+			elseif strcmpi(maskfield,'ice_levelset'),
+				maskv=maskv<=0;
+			elseif strcmpi(maskfield,'ocean_levelset'),
+				maskv=maskv==1;
+			elseif strcmpi(maskfield,'land_levelset'),
+				maskv=maskv==1;
+			elseif strcmpi(maskfield,'glacier_levelset'),
+				if isnan(maskv),
+					maskv=ones(md.icecaps{i}.mesh.numberofvertices,1);
+				else
+					maskv=maskv==1;
+				end
+			end
+			maskvalue=0;
+			%}}}
+			%lock limits:  % {{{
+			lockHandle=findobj('Tag', 'Lock'); lockvalue=get(lockHandle,'Value');
+			if lockvalue,
+				xl=xlim; yl=ylim;
+			else
+				if j==1,
+					xl=[min(md.icecaps{i}.mesh.x) max(md.icecaps{i}.mesh.x)];
+				else
+					xl=[min([md.icecaps{i}.mesh.x;xl(1)]) max([md.icecaps{i}.mesh.x;xl(2)])];
+				end
+				if j==1,
+					yl=[min(md.icecaps{i}.mesh.y) max(md.icecaps{i}.mesh.y)];
+				else
+					yl=[min([md.icecaps{i}.mesh.y; yl(1)]) max([md.icecaps{i}.mesh.y; yl(2)])];
+				end
+			end %}}}
+			%field:  % {{{ 
+			fieldHandle=findobj('Tag', 'Field'); 
+			fieldstrings=get(fieldHandle,'String');
+			fieldvalue=get(fieldHandle,'Value');
+			if ~isempty(fieldstrings),
+				fieldv=fieldstrings{fieldvalue};
+			else
+				fieldv=NaN;
+			end
+			mfHandle=findobj('Tag', 'Mf'); 
+			mf=get(mfHandle,'Value');
+			if mf | strcmpi(solutiontype,'None'),
+				fieldHandle=findobj('Tag', 'ModelFields'); 
+				fieldstrings=get(fieldHandle,'String');
+				fieldvalue=get(fieldHandle,'Value');
+				fieldv=fieldstrings{fieldvalue};
+				eval(['field=md.icecaps{' num2str(i) '}.' fieldv ';']);
+				if isnan(field),
+					field='mesh';
+				end
+			else
+				if strcmpi(solutiontype,'TransientSolution'),
+					field=md.icecaps{i}.results.TransientSolution(counter).(fieldv);
+					dfield=md.icecaps{i}.results.TransientSolution(diffcounter).(fieldv);
+				elseif strcmpi(solutiontype,'StressbalanceSolution'),
+					field=md.icecaps{i}.results.StressbalanceSolution.(fieldv);
+					dfield=NaN;
+				else 
+					error('unknown solution type!');
+				end
+			end
+			if comparison, 
+				if strcmpi(solutiontype,'None'),
+					error('cannot compare a solution field to model as no solution was run or selected!');
+				end
+				%figure out second field:
+				if strcmpi(fieldv,'Vel'), field2=md.icecaps{i}.inversion.vel_obs; end
+				if strcmpi(fieldv,'Base'), field2=md.icecaps{i}.geometry.base; end
+				if strcmpi(fieldv,'Bed'), field2=md.icecaps{i}.geometry.bed; end
+				if strcmpi(fieldv,'Thickness'), field2=md.icecaps{i}.geometry.thickness; end
+				if strcmpi(fieldv,'Surface'), field2=md.icecaps{i}.geometry.surface; end
+			end
+
+			%}}}
+			%color limits:  % {{{
+			cminHandle=findobj('Tag','Cmin'); cminfield=str2num(get(cminHandle,'String'));
+			cmaxHandle=findobj('Tag','Cmax'); cmaxfield=str2num(get(cmaxHandle,'String'));
+
+			if isnan(cminfield)
+				if logvalue,
+					cmin=.1;
+				else
+					pos=find(maskv);
+					if j==1,
+						cmin=min(field(pos));
+					else
+						cmin=min(min(field(pos)),cmin);
+					end
+				end
+			else
+				cmin=cminfield;
+			end
+			if isnan(cmaxfield)
+				pos=find(maskv);
+				if j==1
+					cmax=max(field(pos));
+				else
+					cmax=max(max(field(pos)),cmax);
+				end
+			else
+				cmax=cmaxfield;
+			end
+			if cmin==cmax,
+				cmin=cmin-1e-10; cmax=cmax+1e-10;
+			end
+			colaxis=[cmin,cmax];
+			%}}}
+			%contour levels? {{{
+			contourlevels=0;
+			if strncmpi(fieldv,'Mask',4),
+				contourexp=[tempname '.exp'];
+				expcontourlevelzero(md.icecaps{i},field,0, contourexp);
+				contourlevels=1;
+
+				if diff,
+					contourdiffexp=[tempname '.exp'];
+					expcontourlevelzero(md.icecaps{i},dfield,0, contourdiffexp);
+				end
+			end
+			%}}}
+			%display : {{{ 
+			if logvalue,
+				plotmodel(md.icecaps{i},'data',field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'log',10,'xlim',xl,'ylim',yl,'shading',shadingv);
+			else
+				if ~diff,
+					if comparison,
+						plotmodel(md.icecaps{i},'data',field,'data',field2,'figurestatement','off','clf','off','mask#all',maskv,'caxis#all',colaxis,'xlim#all',xl,'ylim#all',yl,'shading#all',shadingv,'nlines',2,'ncols',1);
+					else
+						if ischar(field) & strcmpi(field,'mesh'),
+							plotmodel(md.icecaps{i},'data','mesh','figurestatement','off','clf','off','xlim',xl,'ylim',yl);
+						else
+							plotmodel(md.icecaps{i},'data',field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'xlim',xl,'ylim',yl,'shading',shadingv); 
+							if contourlevels,
+								contour=expread(contourexp);
+								hold on; 
+								for k=1:length(contour),
+									plot(contour(k).x,contour(k).y,'r-');
+								end
+							end
+						end
+					end
+				else
+					plotmodel(md.icecaps{i},'data',dfield-field,'figurestatement','off','clf','off','mask',maskv,'caxis',colaxis,'xlim',xl,'ylim',yl,'shading',shadingv);
+					if contourlevels,
+						contour=expread(contourexp);
+						hold on; 
+						for k=1:length(contour),
+							plot(contour(k).x,contour(k).y,'k-');
+						end
+						dcontour=expread(contourdiffexp);
+						hold on; 
+						for k=1:length(dcontour),
+							plot(dcontour(k).x,dcontour(k).y,'r-');
+						end
+					end
+				end
+			end 
+			% }}} 
+
+		end %end for
+
+		if ~comparison,
+			set(gca,'Position',[0.2300    0.1100    0.7750    0.8150]); 
+		end % }}}
+	end 
+% }}}
+function result=isearth() % {{{
+	global earth;
+	result=earth;
+%}}}
+function result=issealevel() % {{{
+	global md;
+	if strcmpi(class(md),'sealevelmodel'),
+		result=1;
+	else 
+		result=0;
+	end
+%}}}
+function  continent=getcontinent() % {{{
+
+	continentHandle=findobj('Tag', 'popupmenu11');
+	strings=get(continentHandle,'String');
+	value=get(continentHandle,'Value');
+	continent=strings{value};
+
+%}}}
+function  basins=getbasins() % {{{
+
+	basinHandle=findobj('Tag', 'popupmenu12'); 
+	strings=get(basinHandle,'String');
+	value=get(basinHandle,'Value');
+	basins=strings{value};
+% }}}
