Index: /issm/trunk-jpl/src/m/classes/model/model.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/model/model.py	(revision 13965)
+++ /issm/trunk-jpl/src/m/classes/model/model.py	(revision 13966)
@@ -31,8 +31,8 @@
 from inversion import inversion
 from qmu import qmu
+from results import results
 from radaroverlay import radaroverlay
 from miscellaneous import miscellaneous
 from private import private
-from collections import OrderedDict
 from EnumDefinitions import *
 from ismumps import *
@@ -87,5 +87,5 @@
 		self.qmu              = qmu()
 
-		self.results          = OrderedDict()
+		self.results          = results()
 		self.radaroverlay     = radaroverlay()
 		self.miscellaneous    = miscellaneous()
@@ -410,16 +410,35 @@
 		#Results fields
 		if md1.results:
-			md2.results=OrderedDict()
-			for solutionfield in md1.results.iterkeys():
-				#get time step
-				for i in m1.results[solutionfield].iterkeys():
-					#get subfields
-					for solutionsubfield,field in m1.results[solutionfield][i].iteritems():
-						if   numpy.size(field)==numberofvertices1:
-							md2.results[solutionfield][i][solutionsubfield]=field[pos_node]
-						elif numpy.size(field)==numberofelements1:
-							md2.results[solutionfield][i][solutionsubfield]=field[pos_elem]
+			md2.results=results()
+			for solutionfield,field in md1.results.__dict__.iteritems():
+				if   isinstance(field,list):
+					setattr(md2.results,solutionfield,[])
+					#get time step
+					for i,fieldi in enumerate(field):
+						if isinstance(fieldi,results) and fieldi:
+							getattr(md2.results,solutionfield).append(results())
+							fieldr=getattr(md2.results,solutionfield)[i]
+							#get subfields
+							for solutionsubfield,subfield in fieldi.__dict__.iteritems():
+								if   numpy.size(subfield)==numberofvertices1:
+									setattr(fieldr,solutionsubfield,subfield[pos_node])
+								elif numpy.size(subfield)==numberofelements1:
+									setattr(fieldr,solutionsubfield,subfield[pos_elem])
+								else:
+									setattr(fieldr,solutionsubfield,subfield)
 						else:
-							md2.results[solutionfield][i][solutionsubfield]=field
+							getattr(md2.results,solutionfield).append(None)
+				elif isinstance(field,results):
+					setattr(md2.results,solutionfield,results())
+					if isinstance(field,results) and field:
+						fieldr=getattr(md2.results,solutionfield)
+						#get subfields
+						for solutionsubfield,subfield in field.__dict__.iteritems():
+							if   numpy.size(subfield)==numberofvertices1:
+								setattr(fieldr,solutionsubfield,subfield[pos_node])
+							elif numpy.size(subfield)==numberofelements1:
+								setattr(fieldr,solutionsubfield,subfield[pos_elem])
+							else:
+								setattr(fieldr,solutionsubfield,subfield)
 
 		#Keep track of pos_node and pos_elem
Index: /issm/trunk-jpl/src/m/classes/results.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/results.py	(revision 13966)
+++ /issm/trunk-jpl/src/m/classes/results.py	(revision 13966)
@@ -0,0 +1,59 @@
+import numpy
+from pairoptions import *
+from fielddisplay import *
+from MatlabFuncs import *
+from EnumDefinitions import *
+from WriteData import *
+
+class results(object):
+	"""
+	RESULTS class definition
+
+	   Usage:
+	      results=results();
+	"""
+
+	def __init__(self,*args):    # {{{
+		pass
+	# }}}
+
+	def __repr__(self):    # {{{
+		s ="   Model results:\n"
+
+		if 'step' in self.__dict__:
+			s+="%s\n" % fielddisplay(self,'step',"step number")
+		if 'time' in self.__dict__:
+			s+="%s\n" % fielddisplay(self,'time',"time value")
+		if 'SolutionType' in self.__dict__:
+			s+="%s\n" % fielddisplay(self,'SolutionType',"solution type")
+
+		for name in self.__dict__.iterkeys():
+			if name not in ['step','time','SolutionType','errlog','outlog']:
+				if   isinstance(getattr(self,name),list):
+					s+="%s\n" % fielddisplay(self,name,"model results list")
+				elif isinstance(getattr(self,name),results):
+					s+="%s\n" % fielddisplay(self,name,"model results case")
+				else:
+					s+="%s\n" % fielddisplay(self,name,"")
+
+		if 'errlog' in self.__dict__:
+			s+="%s\n" % fielddisplay(self,'errlog',"error log file")
+		if 'outlog' in self.__dict__:
+			s+="%s\n" % fielddisplay(self,'outlog',"output log file")
+
+		return s
+	# }}}
+
+	def setdefaultparameters(self):    # {{{
+		#do nothing
+		return self
+	# }}}
+
+	def checkconsistency(self,md,solution,analyses):    # {{{
+		return md
+	# }}}
+
+	def marshall(self,fid):    # {{{
+		pass
+	# }}}
+
Index: /issm/trunk-jpl/src/m/solve/MatlabProcessPatch.py
===================================================================
--- /issm/trunk-jpl/src/m/solve/MatlabProcessPatch.py	(revision 13965)
+++ /issm/trunk-jpl/src/m/solve/MatlabProcessPatch.py	(revision 13966)
@@ -8,8 +8,8 @@
 
 	#loop over steps
-	for structurei in structure.itervalues():
+	for structurei in structure:
 
 		#return if there is no field Patch
-		if 'Patch' not in structurei:
+		if not hasattr(structurei,'Patch'):
 			continue
 
Index: /issm/trunk-jpl/src/m/solve/loadresultsfromdisk.py
===================================================================
--- /issm/trunk-jpl/src/m/solve/loadresultsfromdisk.py	(revision 13965)
+++ /issm/trunk-jpl/src/m/solve/loadresultsfromdisk.py	(revision 13966)
@@ -1,6 +1,7 @@
 import os
-from collections import OrderedDict
+from results import *
 from parseresultsfromdisk import *
 from EnumToString import EnumToString
+from MatlabFuncs import *
 
 def loadresultsfromdisk(md,filename):
@@ -23,31 +24,35 @@
 
 		#initialize md.results if not a structure yet
-		if not isinstance(md.results,dict):
-			md.results=OrderedDict()
+		if not isinstance(md.results,results):
+			md.results=results()
 
 		#load results onto model
-		structure=parseresultsfromdisk(filename,~md.settings.io_gather)
+		structure=parseresultsfromdisk(filename,not md.settings.io_gather)
 		if not len(structure):
 			raise RuntimeError("No result found in binary file '%s'. Check for solution crash." % filename)
-		md.results[structure[1]['SolutionType']]=structure;
+		setattr(md.results,structure[0].SolutionType,structure)
 
 		#recover solution_type from results
-		md.private.solution=structure[1]['SolutionType']
+		md.private.solution=structure[0].SolutionType
 
 		#read log files onto fields
 		if os.path.exists(md.miscellaneous.name+'.errlog'):
 			with open(md.miscellaneous.name+'.errlog','r') as f:
-				md.results[structure[1]['SolutionType']]['errlog']=[line[:-1] for line in f]
+				setattr(getattr(md.results,structure[0].SolutionType)[0],'errlog',[line[:-1] for line in f])
 		else:
-			md.results[structure[1]['SolutionType']]['errlog']=[]
+			setattr(getattr(md.results,structure[0].SolutionType)[0],'errlog',[])
 
 		if os.path.exists(md.miscellaneous.name+'.outlog'):
 			with open(md.miscellaneous.name+'.outlog','r') as f:
-				md.results[structure[1]['SolutionType']]['outlog']=[line[:-1] for line in f]
+				setattr(getattr(md.results,structure[0].SolutionType)[0],'outlog',[line[:-1] for line in f])
 		else:
-			md.results[structure[1]['SolutionType']]['outlog']=[]
+			setattr(getattr(md.results,structure[0].SolutionType)[0],'outlog',[])
 
-		if len(md.results[structure[1]['SolutionType']]['errlog']):
+		if len(getattr(md.results,structure[0].SolutionType)[0].errlog):
 			print ("loadresultsfromcluster info message: error during solution. Check your errlog and outlog model fields.")
+
+		#if only one solution, extract it from list for user friendliness
+		if len(structure) == 1 and not strcmp(structure[0].SolutionType,'TransientSolution'):
+			setattr(md.results,structure[0].SolutionType,structure[0])
 
 	#post processes qmu results if necessary
Index: /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py
===================================================================
--- /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 13965)
+++ /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 13966)
@@ -2,4 +2,5 @@
 import numpy
 from collections import OrderedDict
+import results as resultsclass
 from MatlabFuncs import *
 from MatlabProcessPatch import *
@@ -37,22 +38,22 @@
 		raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
 
-	results=OrderedDict()
+	results=[]
 
 	#Read fields until the end of the file.
 	result=ReadData(fid)
 	while result:
+		if result['step'] > len(results):
+			for i in xrange(len(results),result['step']-1):
+				results.append(None)
+			results.append(resultsclass.results())
 		#Get time and step
-		if result['step'] not in results:
-			results[result['step']]=OrderedDict()
-			results[result['step']]['step']=result['step']
-			results[result['step']]['time']=result['time'] 
+		setattr(results[result['step']-1],'step',result['step'])
+		setattr(results[result['step']-1],'time',result['time']) 
 	
 		#Add result
-		if result['step'] in results and \
-		   result['fieldname'] in results[result['step']] and \
-		   not strcmp(result['fieldname'],'SolutionType'):
-			results[result['step']][result['fieldname']]=numpy.vstack((results[result['step']][result['fieldname']],result['field']))
-		else:
-			results[result['step']][result['fieldname']]=result['field']
+		if hasattr(results[result['step']-1],result['fieldname']) and not strcmp(result['fieldname'],'SolutionType'):
+			setattr(results[result['step']-1],result['fieldname'],numpy.vstack((getattr(results[result['step']-1],result['fieldname']),result['field'])))
+		else:
+			setattr(results[result['step']-1],result['fieldname'],result['field'])
 
 		#read next result
@@ -78,5 +79,5 @@
 		raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
 
-	results=OrderedDict()
+	results=[]
 
 	#if we have done split I/O, ie, we have results that are fragmented across patches, 
@@ -86,14 +87,16 @@
 
 		#Get time and step
-		if result['step'] not in results:
-			results[result['step']]=OrderedDict()
-			results[result['step']]['step']=result['step']
-			results[result['step']]['time']=result['time'] 
+		if result['step'] > len(results):
+			for i in xrange(len(results),result['step']-1):
+				results.append(None)
+			results.append(resultsclass.results())
+		setattr(results[result['step']-1],'step',result['step'])
+		setattr(results[result['step']-1],'time',result['time']) 
 
 		#Add result
 		if strcmpi(result['fieldname'],'Patch'):
-			results[result['step']][result['fieldname']]=[0,result['N']]
-		else:
-			results[result['step']][result['fieldname']]=float('NaN')
+			setattr(results[result['step']-1],result['fieldname'],[0,result['N']])
+		else:
+			setattr(results[result['step']-1],result['fieldname'],float('NaN'))
 
 		#read next result
@@ -107,6 +110,6 @@
 		#Add result
 		if strcmpi(result['fieldname'],'Patch'):
-			patchdimensions=results[result['step']][result['fieldname']]
-			results[result['step']][result['fieldname']]=[patchdimensions[0]+result['M'],result['N']]
+			patchdimensions=getattr(results[result['step']-1],result['fieldname'])
+			setattr(results[result['step']-1],result['fieldname'],[patchdimensions[0]+result['M'],result['N']])
 
 		#read next result
@@ -116,6 +119,6 @@
 	for result in results.itervalues():
 		if 'Patch' in result:
-			result['Patch']=numpy.zeros(shape=(result['Patch'][0],result['Patch'][1]),dtype=float)
-			result['counter']=0    #use to index into the patch
+			setattr(result,'Patch',numpy.zeros((result['Patch'][0],result['Patch'][1])))
+			setattr(result,'counter',0)    #use to index into the patch
 
 	#third pass, this time to read the real information
@@ -125,19 +128,20 @@
 
 		#Get time and step
-		if result['step'] not in results:
-			results[result['step']]=OrderedDict()
-			results[result['step']]['step']=result['step']
-			results[result['step']]['time']=result['time'] 
+		if result['step']> len(results):
+			for i in xrange(len(results),result['step']-1):
+				results.append(None)
+			results.append(resultsclass.results())
+		setattr(results[result['step']-1],'step',result['step'])
+		setattr(results[result['step']-1],'time',result['time']) 
 
 		#Add result
 		if strcmpi(result['fieldname'],'Patch'):
-			counter=results[result['step']]['counter']
+			counter=results[result['step']-1].counter
 			counter2=counter+result['field'].shape[0]-1
-			results[result['step']][result['fieldname']][counter:counter2,:]=result['field']
-
+			getattr(results[result['step']-1],result['fieldname'])[counter:counter2,:]=result['field']
 			#increment counter: 
-			results[result['step']]['counter']=counter2+1
-		else:
-			results[result['step']][result['fieldname']]=result['field']
+			results[result['step']-1].counter=counter2+1
+		else:
+			setattr(results[result['step']-1],result['fieldname'],result['field'])
 
 		#read next result
@@ -188,5 +192,5 @@
 
 	except struct.error as e:
-		result=OrderedDict()
+		result=None
 
 	return result
@@ -230,5 +234,5 @@
 
 	except struct.error as e:
-		result=OrderedDict()
+		result=None
 
 	return result
