Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/parseresultsfromdisk.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 13116)
@@ -1,5 +1,6 @@
 import struct
 import numpy
+from collections import OrderedDict
 from MatlabFuncs import *
 from MatlabProcessPatch import *
 
@@ -35,14 +36,14 @@
 	except IOError as e:
 		raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
 
-	results={}
+	results=OrderedDict()
 
 	#Read fields until the end of the file.
 	result=ReadData(fid)
 	while result:
 		#Get time and step
 		if result['step'] not in results:
-			results[result['step']]={}
+			results[result['step']]=OrderedDict()
 			results[result['step']]['step']=result['step']
 			results[result['step']]['time']=result['time'] 
 	
@@ -76,7 +77,7 @@
 	except IOError as e:
 		raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
 
-	results={}
+	results=OrderedDict()
 
 	#if we have done split I/O, ie, we have results that are fragmented across patches, 
 	#do a first pass, and figure out the structure of results
@@ -85,7 +86,7 @@
 
 		#Get time and step
 		if result['step'] not in results:
-			results[result['step']]={}
+			results[result['step']]=OrderedDict()
 			results[result['step']]['step']=result['step']
 			results[result['step']]['time']=result['time'] 
 
@@ -124,7 +125,7 @@
 
 		#Get time and step
 		if result['step'] not in results:
-			results[result['step']]={}
+			results[result['step']]=OrderedDict()
 			results[result['step']]['step']=result['step']
 			results[result['step']]['time']=result['time'] 
 
@@ -179,14 +180,14 @@
 		else:
 			raise TypeError("cannot read data of type %d" % type)
 
-		result={}
+		result=OrderedDict()
 		result['fieldname']=fieldname
 		result['time']=time
 		result['step']=step
 		result['field']=field
 
 	except struct.error as e:
-		result={}
+		result=OrderedDict()
 
 	return result
 	# }}}
@@ -220,7 +221,7 @@
 		else:
 			raise TypeError("cannot read data of type %d" % type)
 
-		result={}
+		result=OrderedDict()
 		result['fieldname']=fieldname
 		result['time']=time
 		result['step']=step
@@ -228,7 +229,7 @@
 		result['N']=N
 
 	except struct.error as e:
-		result={}
+		result=OrderedDict()
 
 	return result
 	# }}}
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/loadresultsfromdisk.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/loadresultsfromdisk.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/loadresultsfromdisk.py	(revision 13116)
@@ -1,4 +1,5 @@
 import os
+from collections import OrderedDict
 from parseresultsfromdisk import *
 from EnumToString import EnumToString
 
@@ -22,7 +23,7 @@
 
 		#initialize md.results if not a structure yet
 		if not isinstance(md.results,dict):
-			md.results={}
+			md.results=OrderedDict()
 
 		#load results onto model
 		structure=parseresultsfromdisk(filename,~md.settings.io_gather)
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/process_solve_options.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/process_solve_options.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/process_solve_options.py	(revision 13116)
@@ -1,4 +1,5 @@
 import os
+from collections import OrderedDict
 from EnumDefinitions import *
 from EnumToString import EnumToString
 
@@ -12,7 +13,7 @@
 	   See also: SOLVE
 	"""
 
-	outoptions={}
+	outoptions=OrderedDict()
 
 	#solution_type: check on this option, error out otherwise
 	solution_type=options.getfieldvalue('solution_type')
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/marshall.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/marshall.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/solve/marshall.py	(revision 13116)
@@ -27,7 +27,7 @@
 	fields=vars(md)
 
 #	for field in fields.iterkeys():
-	for field in ['mesh','mask','geometry','constants','surfaceforcings','basalforcings','materials','friction','flowequation','timestepping','initialization','rifts','debug','verbose','settings','solver','cluster','balancethickness','diagnostic','groundingline','hydrology','prognostic','thermal','steadystate','transient','autodiff','flaim','inversion','qmu','results','radaroverlay','miscellaneous','private']:
+	for field in md.properties():
 
 		#Some properties do not need to be marshalled
 		if field in ['results','radaroverlay','solver','cluster','flaim','private']:
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/pairoptions.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/pairoptions.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/pairoptions.py	(revision 13116)
@@ -1,3 +1,4 @@
+from collections import OrderedDict
 from WriteData import *
 
 class pairoptions(object):
@@ -11,7 +12,7 @@
 
 	def __init__(self,*arg):
 		self.functionname = ''
-		self.list         = {}
+		self.list         = OrderedDict()
 
 		#get calling function name
 		import inspect
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/model/model.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/model/model.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/model/model.py	(revision 13116)
@@ -85,6 +85,43 @@
 		self.private          = private()
 		#}}}
 
+	def properties(self):    # {{{
+		# ordered list of properties since vars(self) is random
+		return ['mesh',\
+		        'mask',\
+		        'geometry',\
+		        'constants',\
+		        'surfaceforcings',\
+		        'basalforcings',\
+		        'materials',\
+		        'friction',\
+		        'flowequation',\
+		        'timestepping',\
+		        'initialization',\
+		        'rifts',\
+		        'debug',\
+		        'verbose',\
+		        'settings',\
+		        'solver',\
+		        'cluster',\
+		        'balancethickness',\
+		        'diagnostic',\
+		        'groundingline',\
+		        'hydrology',\
+		        'prognostic',\
+		        'thermal',\
+		        'steadystate',\
+		        'transient',\
+		        'autodiff',\
+		        'flaim',\
+		        'inversion',\
+		        'qmu',\
+		        'results',\
+		        'radaroverlay',\
+		        'miscellaneous',\
+		        'private']
+	# }}}
+
 	def __repr__(obj):
 		# {{{ Display
 
@@ -100,11 +137,11 @@
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("flowequation","[%s,%s]" % ("1x1",obj.flowequation.__class__.__name__),"flow equations"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("timestepping","[%s,%s]" % ("1x1",obj.timestepping.__class__.__name__),"time stepping for transient models"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("initialization","[%s,%s]" % ("1x1",obj.initialization.__class__.__name__),"initial guess/state"))
-		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("rifts","[%s,%s]" % ("1x1",obj.rifts.__class__.__name__),"rifts properties'"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("rifts","[%s,%s]" % ("1x1",obj.rifts.__class__.__name__),"rifts properties"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("debug","[%s,%s]" % ("1x1",obj.debug.__class__.__name__),"debugging tools (valgrind, gprof"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("verbose","[%s,%s]" % ("1x1",obj.verbose.__class__.__name__),"verbosity level in solve"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("settings","[%s,%s]" % ("1x1",obj.settings.__class__.__name__),"settings properties"))
-		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("solver","[%s,%s]" % ("1x1",obj.solver.__class__.__name__),"PETSc options for each solution'"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("solver","[%s,%s]" % ("1x1",obj.solver.__class__.__name__),"PETSc options for each solution"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("cluster","[%s,%s]" % ("1x1",obj.cluster.__class__.__name__),"cluster parameters (number of cpus...)"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("balancethickness","[%s,%s]" % ("1x1",obj.balancethickness.__class__.__name__),"parameters for balancethickness solution"))
 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("diagnostic","[%s,%s]" % ("1x1",obj.diagnostic.__class__.__name__),"parameters for diagnostic solution"))
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/flaim.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/flaim.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/flaim.py	(revision 13116)
@@ -1,5 +1,6 @@
 #module imports
 import numpy
+from collections import OrderedDict
 from fielddisplay import fielddisplay
 from EnumDefinitions import *
 from checkfield import *
@@ -18,7 +19,7 @@
 		# {{{ Properties
 		self.targets            = ''
 		self.tracks             = ''
-		self.flightreqs         = {}
+		self.flightreqs         = OrderedDict()
 		self.criterion          = float('NaN')
 		self.gridsatequator     = 200000
 		self.usevalueordering   = True
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/qmu.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/qmu.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/qmu.py	(revision 13116)
@@ -1,5 +1,6 @@
 #module imports
 import numpy
+from collections import OrderedDict
 from fielddisplay import fielddisplay
 from EnumDefinitions import *
 from checkfield import *
@@ -18,11 +19,11 @@
 	def __init__(self):
 		# {{{ Properties
 		self.isdakota                    = 0
-		self.variables                   = {}
-		self.responses                   = {}
-		self.method                      = {}
-		self.params                      = {}
-		self.results                     = {}
+		self.variables                   = OrderedDict()
+		self.responses                   = OrderedDict()
+		self.method                      = OrderedDict()
+		self.params                      = OrderedDict()
+		self.results                     = OrderedDict()
 		self.partition                   = float('NaN')
 		self.numberofpartitions          = 0
 		self.numberofresponses           = 0
@@ -71,7 +72,7 @@
 		s ='   qmu parameters:\n'
 
 		s+="%s\n" % fielddisplay(self,'isdakota','is qmu analysis activated?')
-		for i,variable in enumerate(self.variables):
+		for i,variable in enumerate(self.variables.iteritems()):
 			s+="         variables%s:  (arrays of each variable class)\n" % \
 				string_dim(self.variables,i)
 			fnames=vars(variable)
@@ -83,7 +84,7 @@
 				s+="'            %-*s:    [%ix%i]    '%s'\n" % \
 					(maxlen+1,fname,size(getattr(variable,fname)),type(getattr(variable,fname)))
 
-		for i,response in enumerate(self.responses):
+		for i,response in enumerate(self.responses.iteritems()):
 			s+="         responses%s:  (arrays of each response class)\n" % \
 				string_dim(self.responses,i)
 			fnames=vars(response)
@@ -97,12 +98,12 @@
 
 		s+="%s\n" % fielddisplay(self,'numberofresponses','number of responses') 
 
-		for i,method in enumerate(self.method):
+		for i,method in enumerate(self.method.iteritems()):
 			if isinstance(method,'dakota_method'):
 				s+="            method%s :    '%s'\n" % \
 					(string_dim(method,i),method.method)
 
-		for i,param in enumerate(self.params):
+		for i,param in enumerate(self.params.iteritems()):
 			s+="         params%s:  (array of method-independent parameters)\n" % \
 				string_dim(self.params,i)
 			fnames=vars(param)
@@ -114,7 +115,7 @@
 				s+="            %-*s: %s\n" % \
 					(maxlen+1,fname,any2str(getattr(param,fname)))
 
-		for i,result in enumerate(self.results):
+		for i,result in enumerate(self.results.iteritems()):
 			s+="         results%s:  (information from dakota files)\n" % \
 				string_dim(self.results,i)
 			fnames=vars(result)
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/miscellaneous.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/miscellaneous.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/miscellaneous.py	(revision 13116)
@@ -1,4 +1,5 @@
 #module imports
+from collections import OrderedDict
 from fielddisplay import fielddisplay
 from EnumDefinitions import *
 from checkfield import *
@@ -17,7 +18,7 @@
 		# {{{ Properties
 		self.notes = ''
 		self.name  = ''
-		self.dummy = {}
+		self.dummy = OrderedDict()
 
 		#set defaults
 		self.setdefaultparameters()
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/private.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/private.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/classes/private.py	(revision 13116)
@@ -1,4 +1,5 @@
 #module imports
+from collections import OrderedDict
 from fielddisplay import fielddisplay
 from EnumDefinitions import *
 from checkfield import *
@@ -16,7 +17,7 @@
 		# {{{ Properties
 		self.isconsistent = True
 		self.runtimename  = ''
-		self.bamg         = {}
+		self.bamg         = OrderedDict()
 		self.solution     = ''
 
 		#set defaults
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/consistency/ismodelselfconsistent.py
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/consistency/ismodelselfconsistent.py	(revision 13115)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/m/consistency/ismodelselfconsistent.py	(revision 13116)
@@ -76,7 +76,8 @@
 
 	#Go through a model fields, check that it is a class, and call checkconsistency
 	fields=vars(md)
-	for field in fields.iterkeys():
+#	for field in fields.iterkeys():
+	for field in md.properties():
 
 		#Some properties do not need to be checked
 		if field in ['results','debug','radaroverlay']:
