Index: /issm/trunk-jpl/src/m/classes/autodiff.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/autodiff.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class autodiff:
+class autodiff(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/balancethickness.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/balancethickness.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/balancethickness.py	(revision 12958)
@@ -1,5 +1,5 @@
 #module imports
 from fielddisplay import fielddisplay
-class balancethickness:
+class balancethickness(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/basalforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/basalforcings.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/basalforcings.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class basalforcings:
+class basalforcings(object):
+	"""
+	BASAL FORCINGS class definition
+
+	   Usage:
+	      basalforcings=basalforcings();
+	"""
+
 	#properties
 	def __init__(self):
@@ -17,16 +24,16 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   basal forcings parameters:"
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,"melting_rate","basal melting rate (positive if melting)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"melting_rate_correction","additional melting applied when the grounding line retreats"))
-		string="%s\n%s"%(string,fielddisplay(obj,"geothermalflux","geothermal heat flux [W/m^2]"))
+		string="%s\n\n%s"%(string,fielddisplay(self,"melting_rate","basal melting rate (positive if melting)"))
+		string="%s\n%s"%(string,fielddisplay(self,"melting_rate_correction","additional melting applied when the grounding line retreats"))
+		string="%s\n%s"%(string,fielddisplay(self,"geothermalflux","geothermal heat flux [W/m^2]"))
 		return string
 		#}}}
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/constants.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/constants.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/constants.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class constants:
+class constants(object):
+	"""
+	CONSTANTS class definition
+
+	   Usage:
+	      constants=constants();
+	"""
+
 	#properties
 	def __init__(self):
@@ -17,10 +24,10 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   constants parameters:"
-		string="%s\n\n%s"%(string,fielddisplay(obj,"g","gravitational acceleration"))
-		string="%s\n%s"%(string,fielddisplay(obj,"yts","number of seconds in a year"))
-		string="%s\n%s"%(string,fielddisplay(obj,"referencetemperature","reference temperature used in the enthalpy model"))
+		string="%s\n\n%s"%(string,fielddisplay(self,"g","gravitational acceleration"))
+		string="%s\n%s"%(string,fielddisplay(self,"yts","number of seconds in a year"))
+		string="%s\n%s"%(string,fielddisplay(self,"referencetemperature","reference temperature used in the enthalpy model"))
 
 
@@ -28,17 +35,17 @@
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		
 		#acceleration due to gravity (m/s^2)
-		obj.g=9.81
+		self.g=9.81
 
 		#converstion from year to seconds
-		obj.yts=365*24*3600
+		self.yts=365*24*3600
 
 		#the reference temperature for enthalpy model (cf Aschwanden)
-		obj.referencetemperature=223.15
+		self.referencetemperature=223.15
 
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/debug.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/debug.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/debug.py	(revision 12958)
@@ -1,11 +1,20 @@
 #module imports
 from fielddisplay import fielddisplay
+from WriteData import *
 
-class debug:
+class debug(object):
+	"""
+	DEBUG class definition
+
+	   Usage:
+	      debug=debug();
+	"""
+
 	#properties
 	def __init__(self):
 		# {{{ Properties
-		self.valgrind=False
-		self.gprof   = False
+		self.valgrind  = False
+		self.gprof     = False
+		self.profiling = False
 		
 		#set defaults
@@ -13,16 +22,21 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   debug parameters:"
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,"valgrind","use Valgrind to debug (0 or 1)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"gprof","use gnu-profiler to find out where the time is spent"))
+		string="%s\n\n%s"%(string,fielddisplay(self,"valgrind","use Valgrind to debug (0 or 1)"))
+		string="%s\n%s"%(string,fielddisplay(self,"gprof","use gnu-profiler to find out where the time is spent"))
+		string="%s\n%s"%(string,fielddisplay(self,'profiling','enables profiling (memory, flops, time)'))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
+	def marshall(self,fid):    # {{{
+		WriteData(fid,'object',self,'fieldname','profiling','format','Boolean')
+	# }}}
+
Index: /issm/trunk-jpl/src/m/classes/diagnostic.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/diagnostic.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/diagnostic.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class diagnostic:
+class diagnostic(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/flaim.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flaim.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/flaim.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class flaim:
+class flaim(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/flowequation.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 12958)
@@ -6,5 +6,12 @@
 from WriteData import *
 
-class flowequation:
+class flowequation(object):
+	"""
+	FLOWEQUATION class definition
+
+	   Usage:
+	      flowequation=flowequation();
+	"""
+
 	#properties
 	def __init__(self):
@@ -24,22 +31,22 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string='   flow equation parameters:'
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,'ismacayealpattyn','is the macayeal or pattyn approximation used ?'))
-		string="%s\n%s"%(string,fielddisplay(obj,'ishutter','is the shallow ice approximation used ?'))
-		string="%s\n%s"%(string,fielddisplay(obj,'isstokes','are the Full-Stokes equations used ?'))
-		string="%s\n%s"%(string,fielddisplay(obj,'vertex_equation','flow equation for each vertex'))
-		string="%s\n%s"%(string,fielddisplay(obj,'element_equation','flow equation for each element'))
-		string="%s\n%s"%(string,fielddisplay(obj,'bordermacayeal','vertices on MacAyeal''s border (for tiling)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'borderpattyn','vertices on Pattyn''s border (for tiling)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'borderstokes','vertices on Stokes'' border (for tiling)'))
+		string="%s\n\n%s"%(string,fielddisplay(self,'ismacayealpattyn','is the macayeal or pattyn approximation used ?'))
+		string="%s\n%s"%(string,fielddisplay(self,'ishutter','is the shallow ice approximation used ?'))
+		string="%s\n%s"%(string,fielddisplay(self,'isstokes','are the Full-Stokes equations used ?'))
+		string="%s\n%s"%(string,fielddisplay(self,'vertex_equation','flow equation for each vertex'))
+		string="%s\n%s"%(string,fielddisplay(self,'element_equation','flow equation for each element'))
+		string="%s\n%s"%(string,fielddisplay(self,'bordermacayeal','vertices on MacAyeal''s border (for tiling)'))
+		string="%s\n%s"%(string,fielddisplay(self,'borderpattyn','vertices on Pattyn''s border (for tiling)'))
+		string="%s\n%s"%(string,fielddisplay(self,'borderstokes','vertices on Stokes'' border (for tiling)'))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/friction.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/friction.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class friction:
+class friction(object):
+	"""
+	FRICTION class definition
+
+	   Usage:
+	      friction=friction();
+	"""
+
 	#properties
 	def __init__(self):
@@ -17,16 +24,16 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p"
-		string="%s\n\n%s"%(string,fielddisplay(obj,"coefficient","friction coefficient [SI]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"p","p exponent"))
-		string="%s\n%s"%(string,fielddisplay(obj,"q","q exponent"))
+		string="%s\n\n%s"%(string,fielddisplay(self,"coefficient","friction coefficient [SI]"))
+		string="%s\n%s"%(string,fielddisplay(self,"p","p exponent"))
+		string="%s\n%s"%(string,fielddisplay(self,"q","q exponent"))
 		return string
 		#}}}
 
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/geometry.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/geometry.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/geometry.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class geometry:
+class geometry(object):
+	"""
+	GEOMETRY class definition
+
+	   Usage:
+	      geometry=geometry();
+	"""
+
 	#properties
 	def __init__(self):
@@ -19,20 +26,20 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 
 		string="   geometry parameters:"
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,'surface','surface elevation'))
-		string="%s\n%s"%(string,fielddisplay(obj,'thickness','ice thickness'))
-		string="%s\n%s"%(string,fielddisplay(obj,'bed','bed elevation'))
-		string="%s\n%s"%(string,fielddisplay(obj,'bathymetry','bathymetry elevation'))
-		string="%s\n%s"%(string,fielddisplay(obj,'hydrostatic_ratio','coefficient for ice shelves'' thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro'))
+		string="%s\n\n%s"%(string,fielddisplay(self,'surface','surface elevation'))
+		string="%s\n%s"%(string,fielddisplay(self,'thickness','ice thickness'))
+		string="%s\n%s"%(string,fielddisplay(self,'bed','bed elevation'))
+		string="%s\n%s"%(string,fielddisplay(self,'bathymetry','bathymetry elevation'))
+		string="%s\n%s"%(string,fielddisplay(self,'hydrostatic_ratio','coefficient for ice shelves'' thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro'))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/groundingline.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class groundingline:
+class groundingline(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/hydrology.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/hydrology.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/hydrology.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class hydrology:
+class hydrology(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/initialization.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/initialization.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/initialization.py	(revision 12958)
@@ -6,5 +6,12 @@
 from WriteData import *
 
-class initialization:
+class initialization(object):
+	"""
+	INITIALIZATION class definition
+
+	   Usage:
+	      initialization=initialization();
+	"""
+
 	#properties
 	def __init__(self):
@@ -24,26 +31,26 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string='   initial field values:'
 
-		string="%s\n%s"%(string,fielddisplay(obj,'vx','x component of velocity'))
-		string="%s\n%s"%(string,fielddisplay(obj,'vy','y component of velocity'))
-		string="%s\n%s"%(string,fielddisplay(obj,'vz','z component of velocity'))
-		string="%s\n%s"%(string,fielddisplay(obj,'vel','velocity norm'))
-		string="%s\n%s"%(string,fielddisplay(obj,'pressure','pressure field'))
-		string="%s\n%s"%(string,fielddisplay(obj,'temperature','temperature in Kelvins'))
-		string="%s\n%s"%(string,fielddisplay(obj,'watercolumn','thickness of subglacial water'))
-		string="%s\n%s"%(string,fielddisplay(obj,'waterfraction','fraction of water in the ice'))
+		string="%s\n%s"%(string,fielddisplay(self,'vx','x component of velocity'))
+		string="%s\n%s"%(string,fielddisplay(self,'vy','y component of velocity'))
+		string="%s\n%s"%(string,fielddisplay(self,'vz','z component of velocity'))
+		string="%s\n%s"%(string,fielddisplay(self,'vel','velocity norm'))
+		string="%s\n%s"%(string,fielddisplay(self,'pressure','pressure field'))
+		string="%s\n%s"%(string,fielddisplay(self,'temperature','temperature in Kelvins'))
+		string="%s\n%s"%(string,fielddisplay(self,'watercolumn','thickness of subglacial water'))
+		string="%s\n%s"%(string,fielddisplay(self,'waterfraction','fraction of water in the ice'))
 
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
-	def checkconsistency(obj,md,solution,analyses):    # {{{
+	def checkconsistency(self,md,solution,analyses):    # {{{
 		if DiagnosticHorizAnalysisEnum in analyses:
 			if not any(numpy.isnan(md.initialization.vx) or numpy.isnan(md.initialization.vy)):
@@ -73,12 +80,12 @@
 	# }}}
 
-	def marshall(obj,fid):    # {{{
-		WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum)
-		WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum)
-		WriteData(fid,'data',obj.vz,'format','DoubleMat','mattype',1,'enum',VzEnum)
-		WriteData(fid,'data',obj.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum)
-		WriteData(fid,'data',obj.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum)
-		WriteData(fid,'data',obj.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum)
-		WriteData(fid,'data',obj.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum)
+	def marshall(self,fid):    # {{{
+		WriteData(fid,'data',self.vx,'format','DoubleMat','mattype',1,'enum',VxEnum)
+		WriteData(fid,'data',self.vy,'format','DoubleMat','mattype',1,'enum',VyEnum)
+		WriteData(fid,'data',self.vz,'format','DoubleMat','mattype',1,'enum',VzEnum)
+		WriteData(fid,'data',self.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum)
+		WriteData(fid,'data',self.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum)
+		WriteData(fid,'data',self.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum)
+		WriteData(fid,'data',self.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum)
 	# }}}
 
Index: /issm/trunk-jpl/src/m/classes/inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/inversion.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class inversion:
+class inversion(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/mask.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/mask.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/mask.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class mask:
+class mask(object):
+	"""
+	MASK class definition
+
+	   Usage:
+	      mask=mask();
+	"""
+
 	#properties
 	def __init__(self):
@@ -20,20 +27,20 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 
 		string="";
-		string="%s\n%s"%(string,fielddisplay(obj,"elementonfloatingice","element on floating ice flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexonfloatingice","vertex on floating ice flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elementongroundedice","element on grounded ice  list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexongroundedice","vertex on grounded ice flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elementonwater","element on water flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexonwater","vertex on water flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementonfloatingice","element on floating ice flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexonfloatingice","vertex on floating ice flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementongroundedice","element on grounded ice  list"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexongroundedice","vertex on grounded ice flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementonwater","element on water flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexonwater","vertex on water flags list"))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/materials.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/materials.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/materials.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class materials:
+class materials(object):
+	"""
+	MATERIALS class definition
+
+	   Usage:
+	      materials=materials();
+	"""
+
 	#properties
 	def __init__(self):
@@ -25,60 +32,60 @@
 		self.setdefaultparameters()
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   Materials:"
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,"rho_ice","ice density [kg/m^3]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"rho_water","water density [kg/m^3]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"mu_water","water viscosity [N s/m^2]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"heatcapacity","heat capacity [J/kg/K]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"thermalconductivity","ice thermal conductivity [W/m/K]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"meltingpoint","melting point of ice at 1atm in K"))
-		string="%s\n%s"%(string,fielddisplay(obj,"latentheat","latent heat of fusion [J/m^3]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"beta","rate of change of melting point with pressure [K/Pa]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"mixed_layer_capacity","mixed layer capacity [W/kg/K]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"thermal_exchange_velocity","thermal exchange velocity [m/s]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"rheology_B","flow law parameter [Pa/s^(1/n)]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"rheology_n","Glen""s flow law exponent"))
-		string="%s\n%s"%(string,fielddisplay(obj,"rheology_law","law for the temperature dependance of the rheology: ""None"", ""Paterson"" or ""Arrhenius"""))
+		string="%s\n\n%s"%(string,fielddisplay(self,"rho_ice","ice density [kg/m^3]"))
+		string="%s\n%s"%(string,fielddisplay(self,"rho_water","water density [kg/m^3]"))
+		string="%s\n%s"%(string,fielddisplay(self,"mu_water","water viscosity [N s/m^2]"))
+		string="%s\n%s"%(string,fielddisplay(self,"heatcapacity","heat capacity [J/kg/K]"))
+		string="%s\n%s"%(string,fielddisplay(self,"thermalconductivity","ice thermal conductivity [W/m/K]"))
+		string="%s\n%s"%(string,fielddisplay(self,"meltingpoint","melting point of ice at 1atm in K"))
+		string="%s\n%s"%(string,fielddisplay(self,"latentheat","latent heat of fusion [J/m^3]"))
+		string="%s\n%s"%(string,fielddisplay(self,"beta","rate of change of melting point with pressure [K/Pa]"))
+		string="%s\n%s"%(string,fielddisplay(self,"mixed_layer_capacity","mixed layer capacity [W/kg/K]"))
+		string="%s\n%s"%(string,fielddisplay(self,"thermal_exchange_velocity","thermal exchange velocity [m/s]"))
+		string="%s\n%s"%(string,fielddisplay(self,"rheology_B","flow law parameter [Pa/s^(1/n)]"))
+		string="%s\n%s"%(string,fielddisplay(self,"rheology_n","Glen""s flow law exponent"))
+		string="%s\n%s"%(string,fielddisplay(self,"rheology_law","law for the temperature dependance of the rheology: ""None"", ""Paterson"" or ""Arrhenius"""))
 
 		return string
 		#}}}
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		#ice density (kg/m^3)
-		obj.rho_ice=917
+		self.rho_ice=917
 
 		#water density (kg/m^3)
-		obj.rho_water=1023
+		self.rho_water=1023
 
 		#water viscosity (N.s/m^2)
-		obj.mu_water=0.001787  
+		self.mu_water=0.001787  
 
 		#ice heat capacity cp (J/kg/K)
-		obj.heatcapacity=2093
+		self.heatcapacity=2093
 
 		#ice latent heat of fusion L (J/kg)
-		obj.latentheat=3.34*10**5
+		self.latentheat=3.34*10**5
 
 		#ice thermal conductivity (W/m/K)
-		obj.thermalconductivity=2.4
+		self.thermalconductivity=2.4
 
 		#the melting point of ice at 1 atmosphere of pressure in K
-		obj.meltingpoint=273.15
+		self.meltingpoint=273.15
 
 		#rate of change of melting point with pressure (K/Pa)
-		obj.beta=9.8*10**-8
+		self.beta=9.8*10**-8
 
 		#mixed layer (ice-water interface) heat capacity (J/kg/K)
-		obj.mixed_layer_capacity=3974
+		self.mixed_layer_capacity=3974
 
 		#thermal exchange velocity (ice-water interface) (m/s)
-		obj.thermal_exchange_velocity=1.00*10**-4
+		self.thermal_exchange_velocity=1.00*10**-4
 
 		#Rheology law: what is the temperature dependence of B with T
 		#available: none, paterson and arrhenius
-		obj.rheology_law='Paterson'
-		return obj
+		self.rheology_law='Paterson'
+		return self
 		#}}}
 
Index: /issm/trunk-jpl/src/m/classes/mesh.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/mesh.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/mesh.py	(revision 12958)
@@ -6,5 +6,12 @@
 from MatlabFuncs import *
 
-class mesh:
+class mesh(object):
+	"""
+	MESH class definition
+
+	   Usage:
+	      mesh=mesh();
+	"""
+
 	#properties
 	def __init__(self):
@@ -54,58 +61,58 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 
-		if obj.dimension==3:
+		if self.dimension==3:
 			string="\n%s"%("      Elements and vertices of the original 2d mesh:")
 			
-			string="%s\n%s"%(string,fielddisplay(obj,"numberofelements2d","number of elements"))
-			string="%s\n%s"%(string,fielddisplay(obj,"numberofvertices2d","number of vertices"))
-			string="%s\n%s"%(string,fielddisplay(obj,"elements2d","index into (x,y,z), coordinates of the vertices"))
-			string="%s\n%s"%(string,fielddisplay(obj,"x2d","vertices x coordinate"))
-			string="%s\n%s"%(string,fielddisplay(obj,"y2d","vertices y coordinate"))
+			string="%s\n%s"%(string,fielddisplay(self,"numberofelements2d","number of elements"))
+			string="%s\n%s"%(string,fielddisplay(self,"numberofvertices2d","number of vertices"))
+			string="%s\n%s"%(string,fielddisplay(self,"elements2d","index into (x,y,z), coordinates of the vertices"))
+			string="%s\n%s"%(string,fielddisplay(self,"x2d","vertices x coordinate"))
+			string="%s\n%s"%(string,fielddisplay(self,"y2d","vertices y coordinate"))
 
 			string="%s\n%s" %(string,"Elements and vertices of the extruded 3d mesh:")
 		else:
 			string="\n%s"%("      Elements and vertices:")
-		string="%s\n%s"%(string,fielddisplay(obj,"numberofelements","number of elements"))
-		string="%s\n%s"%(string,fielddisplay(obj,"numberofvertices","number of vertices"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elements","index into (x,y,z), coordinates of the vertices"))
-		string="%s\n%s"%(string,fielddisplay(obj,"x","vertices x coordinate"))
-		string="%s\n%s"%(string,fielddisplay(obj,"y","vertices y coordinate"))
-		string="%s\n%s"%(string,fielddisplay(obj,"z","vertices z coordinate"))
-		string="%s\n%s"%(string,fielddisplay(obj,"edges","edges of the 2d mesh (vertex1 vertex2 element1 element2)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"numberofedges","number of edges of the 2d mesh"))
+		string="%s\n%s"%(string,fielddisplay(self,"numberofelements","number of elements"))
+		string="%s\n%s"%(string,fielddisplay(self,"numberofvertices","number of vertices"))
+		string="%s\n%s"%(string,fielddisplay(self,"elements","index into (x,y,z), coordinates of the vertices"))
+		string="%s\n%s"%(string,fielddisplay(self,"x","vertices x coordinate"))
+		string="%s\n%s"%(string,fielddisplay(self,"y","vertices y coordinate"))
+		string="%s\n%s"%(string,fielddisplay(self,"z","vertices z coordinate"))
+		string="%s\n%s"%(string,fielddisplay(self,"edges","edges of the 2d mesh (vertex1 vertex2 element1 element2)"))
+		string="%s\n%s"%(string,fielddisplay(self,"numberofedges","number of edges of the 2d mesh"))
 
 		string="%s%s"%(string,"\n      Properties:")
-		string="%s\n%s"%(string,fielddisplay(obj,"dimension","mesh dimension (2d or 3d)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"numberoflayers","number of extrusion layers"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexonbed","lower vertices flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elementonbed","lower elements flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexonsurface","upper vertices flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elementonsurface","upper elements flags list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"uppervertex","upper vertex list (NaN for vertex on the upper surface)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"upperelements","upper element list (NaN for element on the upper layer)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"lowervertex","lower vertex list (NaN for vertex on the lower surface)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"lowerelements","lower element list (NaN for element on the lower layer"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexonboundary","vertices on the boundary of the domain flag list"))
-		string="%s\n%s"%(string,fielddisplay(obj,"segments","edges on domain boundary (vertex1 vertex2 element)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"segmentmarkers","number associated to each segment"))
-		string="%s\n%s"%(string,fielddisplay(obj,"vertexconnectivity","list of vertices connected to vertex_i"))
-		string="%s\n%s"%(string,fielddisplay(obj,"elementconnectivity","list of vertices connected to element_i"))
-		string="%s\n%s"%(string,fielddisplay(obj,"average_vertex_connectivity","average number of vertices connected to one vertex"))
+		string="%s\n%s"%(string,fielddisplay(self,"dimension","mesh dimension (2d or 3d)"))
+		string="%s\n%s"%(string,fielddisplay(self,"numberoflayers","number of extrusion layers"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexonbed","lower vertices flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementonbed","lower elements flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexonsurface","upper vertices flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementonsurface","upper elements flags list"))
+		string="%s\n%s"%(string,fielddisplay(self,"uppervertex","upper vertex list (NaN for vertex on the upper surface)"))
+		string="%s\n%s"%(string,fielddisplay(self,"upperelements","upper element list (NaN for element on the upper layer)"))
+		string="%s\n%s"%(string,fielddisplay(self,"lowervertex","lower vertex list (NaN for vertex on the lower surface)"))
+		string="%s\n%s"%(string,fielddisplay(self,"lowerelements","lower element list (NaN for element on the lower layer"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexonboundary","vertices on the boundary of the domain flag list"))
+		string="%s\n%s"%(string,fielddisplay(self,"segments","edges on domain boundary (vertex1 vertex2 element)"))
+		string="%s\n%s"%(string,fielddisplay(self,"segmentmarkers","number associated to each segment"))
+		string="%s\n%s"%(string,fielddisplay(self,"vertexconnectivity","list of vertices connected to vertex_i"))
+		string="%s\n%s"%(string,fielddisplay(self,"elementconnectivity","list of vertices connected to element_i"))
+		string="%s\n%s"%(string,fielddisplay(self,"average_vertex_connectivity","average number of vertices connected to one vertex"))
 
 		string="%s%s"%(string,"\n      Extracted model:")
-		string="%s\n%s"%(string,fielddisplay(obj,"extractedvertices","vertices extracted from the model"))
-		string="%s\n%s"%(string,fielddisplay(obj,"extractedelements","elements extracted from the model"))
+		string="%s\n%s"%(string,fielddisplay(self,"extractedvertices","vertices extracted from the model"))
+		string="%s\n%s"%(string,fielddisplay(self,"extractedelements","elements extracted from the model"))
 
 		string="%s%s"%(string,"\n      Projection:")
-		string="%s\n%s"%(string,fielddisplay(obj,"lat","vertices latitude"))
-		string="%s\n%s"%(string,fielddisplay(obj,"long","vertices longitude"))
-		string="%s\n%s"%(string,fielddisplay(obj,"hemisphere","Indicate hemisphere ""n"" or ""s"" "))
+		string="%s\n%s"%(string,fielddisplay(self,"lat","vertices latitude"))
+		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude"))
+		string="%s\n%s"%(string,fielddisplay(self,"hemisphere","Indicate hemisphere ""n"" or ""s"" "))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		
@@ -115,7 +122,7 @@
 		#give a good memory/time ration. This value can be checked in
 		#trunk/test/Miscellaneous/runme.m
-		obj.average_vertex_connectivity=25
-
-		return obj
+		self.average_vertex_connectivity=25
+
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/miscellaneous.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/miscellaneous.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/miscellaneous.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class miscellaneous:
+class miscellaneous(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/private.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/private.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/private.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class private:
+class private(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/prognostic.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/prognostic.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/prognostic.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class prognostic:
+class prognostic(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/qmu.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/qmu.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class qmu:
+class qmu(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/radaroverlay.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/radaroverlay.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/radaroverlay.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class radaroverlay:
+class radaroverlay(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/rifts.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/rifts.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/rifts.py	(revision 12958)
@@ -1,6 +1,18 @@
 #module imports
+import numpy
 from fielddisplay import fielddisplay
+from EnumDefinitions import *
+from checkfield import *
+from WriteData import *
+from isnans import *
 
-class rifts:
+class rifts(object):
+	"""
+	RIFTS class definition
+
+	   Usage:
+	      rifts=rifts();
+	"""
+
 	#properties
 	def __init__(self):
@@ -13,16 +25,67 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string='   rifts parameters:'
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,'riftstruct','structure containing all rift information (vertices coordinates, segments, type of melange, ...)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'riftproperties',''))
+		string="%s\n\n%s"%(string,fielddisplay(self,'riftstruct','structure containing all rift information (vertices coordinates, segments, type of melange, ...)'))
+		string="%s\n%s"%(string,fielddisplay(self,'riftproperties',''))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
-		return obj
+		return self
 	#}}}
 
+	def checkconsistency(self,md,solution,analyses):    # {{{
+		if (not self.riftstruct) or any(isnans(self.riftstruct)):
+			numrifts=0
+		else:
+			numrifts=len(self.riftstruct)
+
+		if numrifts:
+			if not md.mesh.dimension==2:
+				md.checkmessage("models with rifts are only supported in 2d for now!")
+			if not isinstance(self.riftstruct,list):
+				md.checkmessage("rifts.riftstruct should be a structure!")
+			if any(md.mesh.segmentmarkers>=2):
+				#We have segments with rift markers, but no rift structure!
+				md.checkmessage("model should be processed for rifts (run meshprocessrifts)!")
+			md = checkfield(md,'rifts.riftstruct.fill','values',[WaterEnum(),AirEnum(),IceEnum(),MelangeEnum()])
+		else:
+			if any(numpy.logical_not(isnans(self.riftstruct))):
+				md.checkmessage("riftstruct shoud be NaN since numrifts is 0!")
+
+		return md
+	# }}}
+
+	def marshall(self,fid):    # {{{
+
+		#Process rift info
+		if (not self.riftstruct) or any(isnans(self.riftstruct)):
+			numrifts=0
+		else:
+			numrifts=len(self.riftstruct)
+
+		numpairs=0
+		for i in xrange(0,numrifts):
+			numpairs+=numpy.size(self.riftstruct[i].penaltypairs,0)
+
+		# 2 for nodes + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
+		data=numpy.zeros(numpairs,12)
+		count=0
+		for i in xrange(0,numrifts):
+			numpairsforthisrift=numpy.size(self.riftstruct[i]['penaltypairs'],0)
+			data[count:count+numpairsforthisrift-1,0:6]=self.riftstruct[i]['penaltypairs']
+			data[count:count+numpairsforthisrift-1,7]=self.riftstruct[i]['fill']
+			data[count:count+numpairsforthisrift-1,8]=self.riftstruct[i]['friction']
+			data[count:count+numpairsforthisrift-1,9]=self.riftstruct[i]['fraction']
+			data[count:count+numpairsforthisrift-1,10]=self.riftstruct[i]['fractionincrement']
+			data[count:count+numpairsforthisrift-1,11]=self.riftstruct[i]['state']
+			count+=numpairsforthisrift
+
+		WriteData(fid,'data',numrifts,'enum',RiftsNumriftsEnum,'format','Integer')
+		WriteData(fid,'data',data,'enum',RiftsRiftstructEnum,'format','DoubleMat','mattype',3)
+	# }}}
+
Index: /issm/trunk-jpl/src/m/classes/settings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/settings.py	(revision 12958)
@@ -1,6 +1,16 @@
 #module imports
 from fielddisplay import fielddisplay
+from EnumDefinitions import *
+from checkfield import *
+from WriteData import *
 
-class settings:
+class settings(object):
+	"""
+	SETTINGS class definition
+
+	   Usage:
+	      settings=settings();
+	"""
+
 	#properties
 	def __init__(self):
@@ -16,30 +26,30 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   general settings parameters:"
 
-		string="%s\n%s"%(string,fielddisplay(obj,"io_gather","I/O gathering strategy for result outputs (default 1)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"lowmem","is the memory limited ? (0 or 1)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"results_as_patches","provide results as patches for each element (0 or 1)"))
-		string="%s\n%s"%(string,fielddisplay(obj,"output_frequency","frequency at which results are saved in all solutions with multiple time_steps"))
-		string="%s\n%s"%(string,fielddisplay(obj,"waitonlock","maximum number of minutes to wait for batch results, or return 0"))
+		string="%s\n%s"%(string,fielddisplay(self,"io_gather","I/O gathering strategy for result outputs (default 1)"))
+		string="%s\n%s"%(string,fielddisplay(self,"lowmem","is the memory limited ? (0 or 1)"))
+		string="%s\n%s"%(string,fielddisplay(self,"results_as_patches","provide results as patches for each element (0 or 1)"))
+		string="%s\n%s"%(string,fielddisplay(self,"output_frequency","frequency at which results are saved in all solutions with multiple time_steps"))
+		string="%s\n%s"%(string,fielddisplay(self,"waitonlock","maximum number of minutes to wait for batch results, or return 0"))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		
 		#are we short in memory ? (0 faster but requires more memory)
-		obj.lowmem=0
+		self.lowmem=0
 
 		#i/o:
-		obj.io_gather=1
+		self.io_gather=1
 
 		#results frequency by default every step
-		obj.output_frequency=1
+		self.output_frequency=1
 
 		#do not use patches by default (difficult to plot)
-		obj.results_as_patches=0
+		self.results_as_patches=0
 
 		#this option can be activated to load automatically the results
@@ -47,7 +57,25 @@
 		#N minutes that is generated once the solution has converged
 		#0 to desactivate
-		obj.waitonlock=float('Inf')
+		self.waitonlock=float('Inf')
 
-		return obj
+		return self
 	#}}}
 
+	def checkconsistency(self,md,solution,analyses):    # {{{
+		md = checkfield(md,'settings.io_gather','numel',1,'values',[0,1])
+		md = checkfield(md,'settings.lowmem','numel',1,'values',[0,1])
+		md = checkfield(md,'settings.results_as_patches','numel',1,'values',[0,1])
+		md = checkfield(md,'settings.output_frequency','numel',1,'>=',1)
+		md = checkfield(md,'settings.waitonlock','numel',1)
+
+		return md
+	# }}}
+
+	def marshall(self,fid):    # {{{
+		WriteData(fid,'object',self,'fieldname','io_gather','format','Boolean')
+		WriteData(fid,'object',self,'fieldname','lowmem','format','Boolean')
+		WriteData(fid,'object',self,'fieldname','results_as_patches','format','Boolean')
+		WriteData(fid,'object',self,'fieldname','output_frequency','format','Integer')
+		WriteData(fid,'object',self,'fieldname','waitonlock','format','Boolean')
+	# }}}
+
Index: /issm/trunk-jpl/src/m/classes/solver.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/solver.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/solver.py	(revision 12958)
@@ -1,49 +1,106 @@
-#module imports {{{
-import fielddisplay 
-import ismumps
-from  mumpsoptions import *
-from  iluasmoptions import *
-#}}}
-class solver:
-	#properties
-	def __init__(self):
-		# {{{ Properties
+from ismumps import *
+from mumpsoptions import *
+from iluasmoptions import *
+from MatlabFuncs import *
+from EnumDefinitions import *
+from checkfield import *
+
+class solver(object):
+	"""
+	SOLVER class definition
+
+	   Usage:
+	      obj=solver();
+	"""
+
+	def __init__(self):    # {{{
+		#MUMPS is the default solver
 		if ismumps:
-			self.options=[["NoneAnalysis",mumpsoptions()]]
+			self.NoneAnalysis=mumpsoptions()
 		else:
-			self.options=[["NoneAnalysis",iluasmoptions()]]
-		#}}}
-	def __repr__(obj):
-		# {{{ Display
-		
-		string2="   solver parameters:"
-		for i in range(len(obj.options)):
-			option=obj.options[i]
-			analysis=option[0]
-			ioptions=option[1]
+			self.NoneAnalysis=iluasmoptions()
 
-			string=""
-			for i in range(len(ioptions)):
-				option=ioptions[i]
-				if not option:
-					#do nothing
-					pass
-				elif len(option)==1:
+		#The other properties are dynamic
+	# }}}
+
+	def addoptions(self,analysis,*args):    # {{{
+		# Usage example:
+		#    md.solver=addoptions(md.solver,DiagnosticHorizAnalysisEnum,stokesoptions());
+		#    md.solver=addoptions(md.solver,DiagnosticHorizAnalysisEnum);
+
+		#Convert analysis from enum to string
+#		need EnumToString
+#		analysis=EnumToString(analysis)
+
+		#Create dynamic property if property does not exist yet
+		if not hasattr(self,analysis):
+#			exec("self.%s = None" % analysis)
+			setattr(self,analysis,None)
+
+		#Add solver options to analysis
+		if len(args)==1:
+			setattr(self,analysis,args[0])
+
+		return self
+	# }}}
+
+	def __repr__(self):    # {{{
+		s ="List of solver options per analysis:\n\n"
+		for analysis in vars(self).iterkeys():
+			s+="%s :\n" % analysis
+			s+="%s\n" % getattr(self,analysis)
+
+		return s
+	# }}}
+
+	def checkconsistency(self,md,solution,analyses):    # {{{
+		for analysis in vars(self).iterkeys():
+			if not getattr(self,analysis):
+				md.checkmessage("md.solver.%s is empty" % analysis)
+
+		return md
+	# }}}
+
+	def PetscFile(self,filename):    # {{{
+		"""
+		PETSCFILE - build petsc file
+
+		   Build a Petsc compatible options file, from the solver model field  + return options string
+
+		   Usage:     PetscFile(solver,filename);
+		"""
+
+		#open file for writing
+		try:
+			fid=open(filename,'w')
+		except IOError as e:
+			raise IOError("PetscFile error: could not open '%s' for writing." % filename)
+
+		#write header
+		fid.write("%s%s%s\n" % ('%Petsc options file: ',filename,' written from Matlab solver array'))
+
+		#start writing options
+		for analysis in vars(self).iterkeys():
+			options=getattr(self,analysis)
+
+			#first write analysis:
+			fid.write("\n+%s\n" % analysis)    #append a + to recognize it's an analysis enum
+
+			#now, write options
+			for optionname,optionvalue in options.iteritems():
+
+				if not optionvalue:
 					#this option has only one argument
-					string="%s%s%s"%(string," -",option[0])
-				elif len(option)==2:
+					fid.write("-%s\n" % optionname)
+				else:
 					#option with value. value can be string or scalar
-					if isinstance(option[1],float):
-						string="%s%s%s%s%s"%(string," -",option[0]," ","%g"%(option[1]))
-					elif isinstance(option[1],str):
-						string="%s%s%s%s%s"%(string," -",option[0]," ",option[1])
-					elif isinstance(option[1],int):
-						string="%s%s%s%s%s"%(string," -",option[0]," ","%i"%(option[1]))
+					if   isinstance(optionvalue,(bool,int,float)):
+						fid.write("-%s %g\n" % (optionname,optionvalue))
+					elif isinstance(optionvalue,str):
+						fid.write("-%s %s\n" % (optionname,optionvalue))
 					else:
-						raise RuntimeError("%s%s%s"%("PetscString error: option #","%i"%(i)," is not well formatted"))
-				else:
-					raise RuntimeError("%s%s%s"%("PetscString error: option #","%i"%(i)," is not well formatted"))
+						raise TypeError("PetscFile error: option '%s' is not well formatted." % optionname)
 
-			string2="%s\n%s"%(string2,"   %s -> '%s'"%(analysis,string))
-		return string2
-	#}}}
+		fid.close()
+	# }}}
+
Index: /issm/trunk-jpl/src/m/classes/steadystate.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/steadystate.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/steadystate.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class steadystate:
+class steadystate(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/surfaceforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class surfaceforcings:
+class surfaceforcings(object):
+	"""
+	SURFACEFORCING Class definition
+
+	   Usage:
+	      surfaceforcings=surfaceforcings();
+	"""
+
 	#properties
 	def __init__(self):
@@ -32,40 +39,40 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   surface forcings parameters:"
 
-		string="%s\n\n%s"%(string,fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]'))
-		string="%s\n%s"%(string,fielddisplay(obj,'mass_balance','surface mass balance [m/yr ice eq]'))
-		string="%s\n%s"%(string,fielddisplay(obj,'ispdd','is pdd activated (0 or 1, default is 0)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [Kelvin], required if pdd is activated and delta18o not activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]'))
-		string="%s\n%s"%(string,fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [Kelvin], required if pdd is activated and delta18o activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [Kelvin], required if pdd is activated and delta18o activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'issmbgradients','is smb gradients method activated (0 or 1, default is 0)'))
-		string="%s\n%s"%(string,fielddisplay(obj,'hc',' elevation of intersection between accumulation and ablation regime required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'smb_pos_max',' maximum value of positive smb required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'smb_pos_min',' minimum value of positive smb required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'a_pos',' intercept of hs - smb regression line for accumulation regime required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'a_neg',' intercept of hs - smb regression line for ablation regime required if smb gradients is activated'))
-		string="%s\n%s"%(string,fielddisplay(obj,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated'))
+		string="%s\n\n%s"%(string,fielddisplay(self,'precipitation','surface precipitation [m/yr water eq]'))
+		string="%s\n%s"%(string,fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]'))
+		string="%s\n%s"%(string,fielddisplay(self,'ispdd','is pdd activated (0 or 1, default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures','monthly surface temperatures [Kelvin], required if pdd is activated and delta18o not activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'precipitation','surface precipitation [m/yr water eq]'))
+		string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [Kelvin], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [Kelvin], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'issmbgradients','is smb gradients method activated (0 or 1, default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(self,'hc',' elevation of intersection between accumulation and ablation regime required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'smb_pos_max',' maximum value of positive smb required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'smb_pos_min',' minimum value of positive smb required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'a_pos',' intercept of hs - smb regression line for accumulation regime required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'a_neg',' intercept of hs - smb regression line for ablation regime required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated'))
 
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		  
 		#pdd method not used in default mode
-		obj.ispdd=0
-		obj.issmbgradients=0
-		obj.isdelta18o=0
+		self.ispdd=0
+		self.issmbgradients=0
+		self.isdelta18o=0
 
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/thermal.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/thermal.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/thermal.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class thermal:
+class thermal(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/timestepping.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/timestepping.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/timestepping.py	(revision 12958)
@@ -5,5 +5,12 @@
 from WriteData import *
 
-class timestepping:
+class timestepping(object):
+	"""
+	TIMESTEPPING Class definition
+
+	   Usage:
+	      timestepping=timestepping();
+	"""
+
 	#properties
 	def __init__(self):
@@ -19,29 +26,29 @@
 
 		#}}}
-	def __repr__(obj):
+	def __repr__(self):
 		# {{{ Display
 		string="   timestepping parameters:"
-		string="%s\n\n%s"%(string,fielddisplay(obj,"start_time","simulation starting time [yrs]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"final_time","final time to stop the simulation [yrs]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"time_step","length of time steps [yrs]"))
-		string="%s\n%s"%(string,fielddisplay(obj,"time_adapt","use cfl condition to define time step ? (0 or 1) "))
-		string="%s\n%s"%(string,fielddisplay(obj,"cfl_coefficient","coefficient applied to cfl condition"))
+		string="%s\n\n%s"%(string,fielddisplay(self,"start_time","simulation starting time [yrs]"))
+		string="%s\n%s"%(string,fielddisplay(self,"final_time","final time to stop the simulation [yrs]"))
+		string="%s\n%s"%(string,fielddisplay(self,"time_step","length of time steps [yrs]"))
+		string="%s\n%s"%(string,fielddisplay(self,"time_adapt","use cfl condition to define time step ? (0 or 1) "))
+		string="%s\n%s"%(string,fielddisplay(self,"cfl_coefficient","coefficient applied to cfl condition"))
 		return string
 		#}}}
 		
-	def setdefaultparameters(obj):
+	def setdefaultparameters(self):
 		# {{{setdefaultparameters
 		
 		#time between 2 time steps
-		obj.time_step=1/2
+		self.time_step=1/2
 
 		#final time
-		obj.final_time=10*obj.time_step
+		self.final_time=10*self.time_step
 
 		#time adaptation? 
-		obj.time_adapt=0
-		obj.cfl_coefficient=.5
+		self.time_adapt=0
+		self.cfl_coefficient=.5
 
-		return obj
+		return self
 	#}}}
 
Index: /issm/trunk-jpl/src/m/classes/transient.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/transient.py	(revision 12958)
@@ -2,5 +2,5 @@
 from fielddisplay import fielddisplay
 
-class transient:
+class transient(object):
 	#properties
 	def __init__(self):
Index: /issm/trunk-jpl/src/m/classes/verbose.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/verbose.py	(revision 12957)
+++ /issm/trunk-jpl/src/m/classes/verbose.py	(revision 12958)
@@ -1,6 +1,6 @@
 from pairoptions import *
 from MatlabFuncs import *
+from EnumDefinitions import *
 from WriteData import *
-from EnumDefinitions import *
 
 class verbose(object):
Index: /issm/trunk-jpl/src/m/utils/Math/isnans.py
===================================================================
--- /issm/trunk-jpl/src/m/utils/Math/isnans.py	(revision 12958)
+++ /issm/trunk-jpl/src/m/utils/Math/isnans.py	(revision 12958)
@@ -0,0 +1,18 @@
+import numpy
+
+def isnans(array):
+	"""
+	ISNANS: figure out if an array is nan. wrapper to isnan from matlab which stupidly does not allow this test  for structures!
+
+	   Usage:    isnans(array)
+
+	      See also : ISNAN 
+	"""
+
+	if   isinstance(array,(tuple,list,dict)): 
+		returnvalue=0
+	else:
+		returnvalue=numpy.isnan(array)
+
+	return returnvalue
+
