Index: /issm/trunk-jpl/src/m/classes/autodiff.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/autodiff.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class autodiff:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.isautodiff = False
+		self.forward    = True
+		self.reverse    = False
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   automatic differentiation parameters:'
+		string="%s\n%s"%(string,fielddisplay(obj,'isautodiff','indicates if the automatic differentiation is activated'))
+		string="%s\n%s"%(string,fielddisplay(obj,'forward','forward differentiation'))
+		string="%s\n%s"%(string,fielddisplay(obj,'reverse','backward differentiation'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/balancethickness.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/balancethickness.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/balancethickness.py	(revision 12038)
@@ -0,0 +1,20 @@
+#module imports
+from fielddisplay import fielddisplay
+class balancethickness:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.spcthickness = float('NaN')
+		self.thickening_rate           = float('NaN')
+		self.stabilization           = 0
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		
+		string='   balance thickness solution parameters:' 
+		
+		string="%s\n\n%s"%(string,fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'thickening_rate','ice thickening rate used in the mass conservation (dh/dt)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'stabilization','0: None, 1: SU, 2: MacAyeal''s artificial diffusivity, 3:DG'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/basalforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/basalforcings.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/basalforcings.py	(revision 12038)
@@ -0,0 +1,20 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class basalforcings:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.melting_rate             = float('NaN')
+		self.melting_rate_correction  = float('NaN')
+		self.geothermalflux           = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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]"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/clusters/generic.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/generic.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/clusters/generic.py	(revision 12038)
@@ -0,0 +1,217 @@
+#GENERIC cluster class definition
+#
+#   Usage:
+#      cluster=generic('name','astrid',);
+#      cluster=generic('name','astrid','np',3);
+#      cluster=generic('name',oshostname(),'np',3,'login','username');
+
+
+class generic:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.name=''
+		self.login=''
+		self.np=1
+		self.port=0
+		self.interactive=1
+		self.codepath=issmtier() + '/bin'
+		self.executionpath=issmtier() + '/execution'
+		self.valgrind=issmtier() + '/externalpackages/valgrind/install/bin/valgrind'
+		self.valgrindlib=issmtier() + '/externalpackages/valgrind/install/lib/libmpidebug.so'
+		self.valgrindsup=issmtier() + '/externalpackages/valgrind/issm.supp'
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		
+		string="class 'generic' object:"
+		string="%s\n\n%s"%(string,"%s%s"%('    name: ',obj.name))
+		string="%s\n%s"%(string,"%s%i"%('    np: ',obj.np))
+		string="%s\n%s"%(string,"%s%i"%('    port: ',obj.port))
+		string="%s\n%s"%(string,"%s%s"%('    codepath: ',obj.codepath))
+		string="%s\n%s"%(string,"%s%s"%('    executionpath: ',obj.executionpath))
+		string="%s\n%s"%(string,"%s%s"%('    valgrind: ',obj.valgrind))
+		string="%s\n%s"%(string,"%s%s"%('    valgrindlib: ',obj.valgrindlib))
+		string="%s\n%s"%(string,"%s%s"%('    valgrindsup: ',obj.valgrindsup))
+		return string
+		#}}}
+		
+
+#old matlab
+#		function cluster=generic(varargin) % {{{1
+#
+#			 %use provided options to change fields
+#			 options=pairoptions(varargin{:});
+#
+#			 %get name
+#			 if ~exist(options,'name'), error('option ''name'' has not been provided'); end
+#			 cluster.name=getfieldvalue(options,'name');
+#
+#			 %initialize cluster using user settings if provided
+#			 if (exist([cluster.name '_settings'])==2), eval([cluster.name '_settings']); end
+#
+#			 %OK get other fields
+#			 for i=1:size(options.list,1),
+#				 fieldname=options.list{i,1};
+#				 fieldvalue=options.list{i,2};
+#				 if ismember(fieldname,properties('generic')),
+#					 cluster.(fieldname)=fieldvalue;
+#				 else
+#					 disp(['''' fieldname ''' is not a property of cluster generic']);
+#				 end
+#			 end
+#		 end
+#		 %}}}
+#		 function checkconsistency(cluster,md,solution,analyses) % {{{1
+#			 if cluster.np<1
+#				 checkmessage(['number of processors should be at least 1']);
+#			 end
+#			 if isnan(cluster.np),
+#				 checkessage('number of processors should not be NaN!');
+#			 end
+#		 end
+#		 %}}}
+#		 function BuildQueueScript(cluster,md) % {{{1
+#		 
+#			 %retrieve parameters
+#			 modelname=md.miscellaneous.name;
+#			 solution=md.private.solution;
+#			 isvalgrind=md.debug.valgrind;
+#			 isgprof=md.debug.gprof;
+#
+#			 %open file for writing: 
+#			 if ~ispc,
+#				 fid=fopen([modelname '.queue'],'w');
+#			 else
+#				 fid=fopen([modelname '.bat'],'w');
+#			 end
+#
+#			 %write instructions for launching a job on the cluster
+#			 if ~ispc,
+#				 fprintf(fid,'#!/bin/sh\n');
+#			 else
+#				 fprintf(fid,'@echo off\n');
+#			 end
+#			 
+#			 if ~isvalgrind,
+#				 if cluster.interactive
+#					 if ~ispc,
+#						 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s ',cluster.np,cluster.codepath,EnumToString(solution),cluster.executionpath,modelname);
+#					 else
+#						 fprintf(fid,'"%s/issm.exe" %s "%s" %s ',cluster.codepath,EnumToString(solution),cluster.executionpath,modelname);
+#					 end
+#				 else
+#					 if ~ispc,
+#						 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s 2> %s.errlog >%s.outlog ',cluster.np,cluster.codepath,EnumToString(solution),cluster.executionpath,modelname,modelname,modelname);
+#					 else
+#						 fprintf(fid,'"%s/issm.exe" %s "%s" %s 2> %s.errlog >%s.outlog ',cluster.codepath,EnumToString(solution),cluster.executionpath,modelname,modelname,modelname);
+#					 end
+#				 end
+#			 else
+#				 if ~ispc,
+#					 %Add --gen-suppressions=all to get suppression lines
+#					 fprintf(fid,'LD_PRELOAD=%s \\\n',cluster.valgrindlib);
+#					 fprintf(fid,'mpiexec -np %i %s --leak-check=full --suppressions=%s %s/issm.exe %s %s %s 2> %s.errlog >%s.outlog ',...
+#					 cluster.np,cluster.valgrind,cluster.valgrindsup, cluster.codepath,EnumToString(solution),cluster.executionpath,modelname,modelname,modelname);
+#				 else
+#					 error('valgrind not supported on windows platforms');
+#				 end
+#			 end
+#
+#			 if isgprof,
+#				 if ~ispc,
+#					 fprintf(fid,'\n gprof %s/issm.exe gmon.out > %s.performance',cluster.codepath,modelname);
+#				 else
+#					 error('gprof not supported on windows platforms');
+#				 end
+#
+#			 end
+#
+#			 if ~md.settings.io_gather,
+#				 if ~ispc,
+#					 %concatenate the output files:
+#					 fprintf(fid,'\ncat %s.outbin.* > %s.outbin',modelname,modelname);
+#				 else
+#					 error('iogather not supported on windows platforms');
+#				 end
+#
+#			 end
+#			 
+#			 %close file: 
+#			 fclose(fid);
+#
+#			 %in interactive mode, create a run file, and errlog and outlog file
+#			 if cluster.interactive,
+#				 fid=fopen([modelname '.errlog'],'w'); fclose(fid);
+#				 fid=fopen([modelname '.outlog'],'w'); fclose(fid);
+#			 end
+#
+#
+#		 end
+#		 %}}}
+#		 function LaunchQueueJob(cluster,md,options)% {{{1
+#			 
+#			 if ~ispc,
+#					 %lauch command, to be executed via ssh
+#					 launchcommand=['cd ' cluster.executionpath ' && rm -rf ./' md.private.runtimename ' && mkdir ' md.private.runtimename ...
+#					 ' && cd ' md.private.runtimename ' && mv ../' md.private.runtimename '.tar.gz ./ && tar -zxf ' md.private.runtimename '.tar.gz  && source  ' md.miscellaneous.name '.queue '];
+#
+#					 if ~strcmpi(options.batch,'yes'),
+#
+#						 %compress the files into one zip.
+#						 compressstring=['tar -zcf ' md.private.runtimename '.tar.gz ' md.miscellaneous.name '.bin ' md.miscellaneous.name '.queue '  md.miscellaneous.name '.petsc '];
+#						 if md.qmu.isdakota,
+#							 compressstring=[compressstring md.miscellaneous.name '.qmu.in'];
+#					end
+#					if cluster.interactive,
+#						compressstring=[compressstring ' ' md.miscellaneous.name '.errlog ' md.miscellaneous.name '.outlog '];
+#					end
+#					system(compressstring);
+#
+#					disp('uploading input file and queueing script');
+#					issmscpout(cluster.name,cluster.executionpath,cluster.login,cluster.port,{[md.private.runtimename '.tar.gz']});
+#
+#					disp('launching solution sequence on remote cluster');
+#					issmssh(cluster.name,cluster.login,cluster.port,launchcommand);
+#				else
+#					disp('batch mode requested: not launching job interactively');
+#					disp('launch solution sequence on remote cluster by hand');
+#				end
+#			else
+#				%launch right here, do not compress or archive.
+#				system([md.miscellaneous.name '.bat']);
+#			end
+#
+#		end %}}}
+#		 function Download(cluster,md)% {{{1
+#
+#			if ~ispc,
+#				%some check
+#				if isempty(md.private.runtimename),
+#					error('supply runtime name for results to be loaded!');
+#				end
+#
+#				%Figure out the  directory where all the files are in: 
+#				directory=[cluster.executionpath '/' md.private.runtimename '/'];
+#
+#				%What packages are we picking up from remote cluster
+#				packages={[md.miscellaneous.name '.outlog'],[md.miscellaneous.name '.errlog']};
+#				if md.qmu.isdakota,
+#					packages{end+1}=[md.miscellaneous.name '.qmu.err'];
+#					packages{end+1}=[md.miscellaneous.name '.qmu.out'];
+#					if isfield(md.qmu.params,'tabular_graphics_data'),
+#						if md.qmu.params.tabular_graphics_data==true,
+#							packages{end+1}='dakota_tabular.dat'; 
+#						end
+#					end
+#				else
+#					packages{end+1}=[md.miscellaneous.name '.outbin'];
+#				end
+#
+#				%copy files from cluster to present directory
+#				issmscpin(cluster.name, cluster.login, cluster.port, directory, packages);
+#			else
+#				%do nothing!
+#			end
+#		end %}}}
+#
Index: /issm/trunk-jpl/src/m/classes/clusters/none.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/none.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/clusters/none.py	(revision 12038)
@@ -0,0 +1,24 @@
+#NONE cluster class definition
+#
+#   Usage:
+#      cluster=none();
+#      cluster=none('np',3);
+#      cluster=none('np',3,'login','username');
+
+class none:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.name='none'
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		
+		string="class 'none' object:"
+		string="%s\n\n%s"%(string,"%s%s"%('    name: ',obj.name))
+		return string
+		#}}}
+	def checkconsistency(cluster,md,solution,analyses):
+		pass
+	def BuildQueueScript(cluster,md):
+			 raise RuntimeError('none.BuildQueueScript error message: serial cluster cannot build queue script')
Index: /issm/trunk-jpl/src/m/classes/constants.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/constants.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/constants.py	(revision 12038)
@@ -0,0 +1,21 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class constants:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.g                    = 0
+		self.yts                  = 0
+		self.referencetemperature = 0
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"))
+
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/debug.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/debug.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/debug.py	(revision 12038)
@@ -0,0 +1,18 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class debug:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.valgrind=False
+		self.gprof   = False
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/diagnostic.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/diagnostic.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/diagnostic.py	(revision 12038)
@@ -0,0 +1,63 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class diagnostic:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.spcvx                    = float('NaN')
+		self.spcvy                    = float('NaN')
+		self.spcvz                    = float('NaN')
+		self.restol                   = 0
+		self.reltol                   = 0
+		self.abstol                   = 0
+		self.isnewton                 = 0
+		self.stokesreconditioning     = 0
+		self.viscosity_overshoot      = 0
+		self.icefront                 = float('NaN')
+		self.maxiter                  = 0
+		self.shelf_dampening          = 0
+		self.vertex_pairing           = float('NaN')
+		self.penalty_factor           = float('NaN')
+		self.rift_penalty_lock        = float('NaN')
+		self.rift_penalty_threshold   = 0
+		self.referential              = float('NaN')
+		self.requested_outputs        = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		
+		
+		string='\n   Diagnostic solution parameters:'
+		string="%s\n\n%s"%(string,'      Convergence criteria:')
+			
+		string="%s\n%s"%(string,fielddisplay(obj,'restol','mechanical equilibrium residual convergence criterion'))
+		string="%s\n%s"%(string,fielddisplay(obj,'reltol','velocity relative convergence criterion, NaN -> not applied'))
+		string="%s\n%s"%(string,fielddisplay(obj,'abstol','velocity absolute convergence criterion, NaN -> not applied'))
+		string="%s\n%s"%(string,fielddisplay(obj,'isnewton','Apply Newton''s method instead of a Picard fixed point method'))
+		string="%s\n%s"%(string,fielddisplay(obj,'maxiter','maximum number of nonlinear iterations'))
+		string="%s\n%s"%(string,fielddisplay(obj,'viscosity_overshoot','over-shooting constant new=new+C*(new-old)'))
+
+		string="%s\n%s"%(string,'      boundary conditions:')
+
+		string="%s\n%s"%(string,fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'spcvz','z-axis velocity constraint (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'icefront','segments on ice front list (last column 0-> Air, 1-> Water, 2->Ice'))
+
+		string="%s\n%s"%(string,'      Rift options:')
+		string="%s\n%s"%(string,fielddisplay(obj,'rift_penalty_threshold','threshold for instability of mechanical constraints'))
+		string="%s\n%s"%(string,fielddisplay(obj,'rift_penalty_lock','number of iterations before rift penalties are locked'))
+
+		string="%s\n%s"%(string,'      Penalty options:')
+		string="%s\n%s"%(string,fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset'))
+		string="%s\n%s"%(string,fielddisplay(obj,'vertex_pairing','pairs of vertices that are penalized'))
+
+		string="%s\n%s"%(string,'      Other:')
+		string="%s\n%s"%(string,fielddisplay(obj,'shelf_dampening','use dampening for floating ice ? Only for Stokes model'))
+		string="%s\n%s"%(string,fielddisplay(obj,'stokesreconditioning','multiplier for incompressibility equation. Only for Stokes model'))
+		string="%s\n%s"%(string,fielddisplay(obj,'referential','local referential'))
+		string="%s\n%s"%(string,fielddisplay(obj,'requested_outputs','additional outputs requested'))
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/flaim.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flaim.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/flaim.py	(revision 12038)
@@ -0,0 +1,50 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class flaim:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.targets            = ''
+		self.tracks             = ''
+		self.flightreqs         = {}
+		self.criterion          = float('NaN')
+		self.gridsatequator     = 200000
+		self.usevalueordering   = True
+		self.split_antimeridian = True
+		self.solution           = ''
+		self.quality            = 0
+		self.path_optimize      = False
+		self.opt_ndir           = 1
+		self.opt_dist           = 25
+		self.opt_niter          = 30000
+		#}}}
+	def __repr__(obj):
+		# {{{ Displa
+		string='   FLAIM - Flight Line Adaptation using Ice sheet Modeling:'
+
+		string="%s\n\n%s"%(string,'      Input:')
+		string="%s\n%s"%(string,fielddisplay(obj,'targets'            ,'name of kml output targets file '))
+		string="%s\n%s"%(string,fielddisplay(obj,'tracks'             ,'name of kml input tracks file '))
+		string="%s\n%s"%(string,fielddisplay(obj,'flightreqs'         ,'structure of kml flight requirements (not used yet)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'criterion'          ,'element or nodal criterion for flight path evaluation (metric)'))
+
+		string="%s\n\n%s"%(string,'      Arguments:')
+		string="%s\n%s"%(string,fielddisplay(obj,'gridsatequator'     ,'number of grids at equator (determines resolution)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'usevalueordering'   ,'flag to consider target values for flight path evaluation'))
+		string="%s\n%s"%(string,fielddisplay(obj,'split_antimeridian' ,'flag to split polygons on the antimeridian'))
+		
+		string="%s\n\n%s"%(string,'      Optimization:')
+		string="%s\n%s"%(string,fielddisplay(obj,'path_optimize'     ,'optimize? (default false)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'opt_ndir'     ,['number of directions to test when moving a point.  If this value = 1, a random direction is tested.',\
+										  'A value > 1 results in directions equally spaced from [0, 2*PI] being tested.',\
+										  'For example, 4 would result in directions [0, PI/2, PI, 3PI/2].']))
+		string="%s\n%s"%(string,fielddisplay(obj,'opt_dist'     ,'specifies the distance in km (default 25) to move a randomly selected path point on each iteration'))
+		string="%s\n%s"%(string,fielddisplay(obj,'opt_niter'     ,['number of iterations (default 30,000) to run for flightplan optimization',\
+										   'i.e. the number of times to randomly select a point and move it.']))
+
+		string="%s\n\n%s"%(string,'      Output:')
+		string="%s\n%s"%(string,fielddisplay(obj,'solution'           ,'name of kml solution file'))
+		string="%s\n%s"%(string,fielddisplay(obj,'quality'            ,'quality of kml solution'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/flowequation.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 12038)
@@ -0,0 +1,31 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class flowequation:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		
+		self.ismacayealpattyn     = 0;
+		self.ishutter             = 0;
+		self.isstokes             = 0;
+		self.vertex_equation      = float('NaN')
+		self.element_equation     = float('NaN')
+		self.bordermacayeal       = float('NaN')
+		self.borderpattyn         = float('NaN')
+		self.borderstokes         = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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)'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/friction.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/friction.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class friction:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.coefficient = float('NaN')
+		self.p           = float('NaN')
+		self.q           = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/geometry.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/geometry.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/geometry.py	(revision 12038)
@@ -0,0 +1,25 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class geometry:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.surface           = float('NaN')
+		self.thickness         = float('NaN')
+		self.bed               = float('NaN')
+		self.bathymetry        = float('NaN')
+		self.hydrostatic_ratio = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/groundingline.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 12038)
@@ -0,0 +1,18 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class groundingline:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.migration=''
+		self.melting_rate=float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   grounding line solution parameters:'
+
+		string="%s\n\n%s"%(string,fielddisplay(obj,'migration','type of grounding line migration: ''SoftMigration'',''AgressiveMigration'' or ''None'''))
+		string="%s\n%s"%(string,fielddisplay(obj,'melting_rate','melting rate applied when previously grounded parts start floating'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/hydrology.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/hydrology.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/hydrology.py	(revision 12038)
@@ -0,0 +1,29 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class hydrology:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.spcwatercolumn = float('NaN')
+		self.n              = 0
+		self.CR             = 0
+		self.p              = 0
+		self.q              = 0
+		self.kn             = 0
+		self.stabilization  = 0
+	
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		
+		string='   hydrology solution parameters:'
+		string="%s\n\n%s"%(string,fielddisplay(obj,'spcwatercolumn','water thickness constraints (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'n','Manning roughness coefficient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'CR','tortuosity parameter'))
+		string="%s\n%s"%(string,fielddisplay(obj,'p','dimensionless exponent in Manning velocity formula'))
+		string="%s\n%s"%(string,fielddisplay(obj,'q','dimensionless exponent in Manning velocity formula'))
+		string="%s\n%s"%(string,fielddisplay(obj,'kn','parameter in effective pressure formula'))
+		string="%s\n%s"%(string,fielddisplay(obj,'stabilization','artificial diffusivity (default is 1). can be more than 1 to increase diffusivity.'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/initialization.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/initialization.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/initialization.py	(revision 12038)
@@ -0,0 +1,32 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class initialization:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		
+		self.vx            = float('NaN')
+		self.vy            = float('NaN')
+		self.vz            = float('NaN')
+		self.vel           = float('NaN')
+		self.pressure      = float('NaN')
+		self.temperature   = float('NaN')
+		self.watercolumn   = float('NaN')
+		self.waterfraction = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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'))
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/inversion.py	(revision 12038)
@@ -0,0 +1,59 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class inversion:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.iscontrol                   = 0
+		self.tao                         = 0
+		self.incomplete_adjoint          = 0
+		self.control_parameters          = float('NaN')
+		self.nsteps                      = 0
+		self.maxiter_per_step            = float('NaN')
+		self.cost_functions              = float('NaN')
+		self.cost_functions_coefficients = float('NaN')
+		self.gradient_scaling            = float('NaN')
+		self.cost_function_threshold     = 0
+		self.min_parameters              = float('NaN')
+		self.max_parameters              = float('NaN')
+		self.step_threshold              = float('NaN')
+		self.gradient_only               = 0
+		self.vx_obs                      = float('NaN')
+		self.vy_obs                      = float('NaN')
+		self.vz_obs                      = float('NaN')
+		self.vel_obs                     = float('NaN')
+		self.thickness_obs               = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='\n   Inversion parameters:'
+		string="%s\n%s"%(string,fielddisplay(obj,'iscontrol','is inversion activated?'))
+		string="%s\n%s"%(string,fielddisplay(obj,'incomplete_adjoint','do we assume linear viscosity?'))
+		string="%s\n%s"%(string,fielddisplay(obj,'control_parameters','parameter where inverse control is carried out; ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'))
+		string="%s\n%s"%(string,fielddisplay(obj,'nsteps','number of optimization searches'))
+		string="%s\n%s"%(string,fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step'))
+		string="%s\n%s"%(string,fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'))
+		string="%s\n%s"%(string,fielddisplay(obj,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied'))
+		string="%s\n%s"%(string,fielddisplay(obj,'maxiter_per_step','maximum iterations during each optimization step'))
+		string="%s\n%s"%(string,fielddisplay(obj,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step'))
+		string="%s\n%s"%(string,fielddisplay(obj,'step_threshold','decrease threshold for misfit, default is 30%'))
+		string="%s\n%s"%(string,fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex'))
+		string="%s\n%s"%(string,fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex'))
+		string="%s\n%s"%(string,fielddisplay(obj,'gradient_only','stop control method solution at gradient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'vx_obs','observed velocity x component [m/a]'))
+		string="%s\n%s"%(string,fielddisplay(obj,'vy_obs','observed velocity y component [m/a]'))
+		string="%s\n%s"%(string,fielddisplay(obj,'vel_obs','observed velocity magnitude [m/a]'))
+		string="%s\n%s"%(string,fielddisplay(obj,'thickness_obs','observed thickness [m]'))
+		string="%s\n%s"%(string,'Available cost functions:')
+		string="%s\n%s"%(string,'   101: SurfaceAbsVelMisfit')
+		string="%s\n%s"%(string,'   102: SurfaceRelVelMisfit')
+		string="%s\n%s"%(string,'   103: SurfaceLogVelMisfit')
+		string="%s\n%s"%(string,'   104: SurfaceLogVxVyMisfit')
+		string="%s\n%s"%(string,'   105: SurfaceAverageVelMisfit')
+		string="%s\n%s"%(string,'   201: ThicknessAbsMisfit')
+		string="%s\n%s"%(string,'   501: DragCoefficientAbsGradient')
+		string="%s\n%s"%(string,'   502: RheologyBbarAbsGradient')
+		string="%s\n%s"%(string,'   503: ThicknessAbsGradient')
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/mask.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/mask.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/mask.py	(revision 12038)
@@ -0,0 +1,26 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class mask:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.elementonfloatingice = float('NaN')
+		self.elementongroundedice = float('NaN')
+		self.elementonwater       = float('NaN')
+		self.vertexonfloatingice  = float('NaN')
+		self.vertexongroundedice  = float('NaN')
+		self.vertexonwater        = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/materials.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/materials.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/materials.py	(revision 12038)
@@ -0,0 +1,41 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class materials:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.rho_ice                    = 0;
+		self.rho_water                  = 0;
+		self.mu_water                   = 0;
+		self.heatcapacity               = 0;
+		self.latentheat                 = 0;
+		self.thermalconductivity        = 0;
+		self.meltingpoint               = 0;
+		self.beta                       = 0;
+		self.mixed_layer_capacity       = 0;
+		self.thermal_exchange_velocity  = 0;
+		self.rheology_B   = float('NaN')
+		self.rheology_n   = float('NaN')
+		self.rheology_law = "";
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"""))
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/mesh.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/mesh.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/mesh.py	(revision 12038)
@@ -0,0 +1,108 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class mesh:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.x                           = float('NaN');
+		self.y                           = float('NaN');
+		self.z                           = float('NaN');
+		self.elements                    = float('NaN');
+		self.dimension                   = 0;
+		self.numberoflayers              = 0;
+		self.numberofelements            = 0;
+		self.numberofvertices            = 0;
+		self.numberofedges               = 0;
+		
+		self.lat                         = float('NaN');
+		self.long                        = float('NaN');
+		self.hemisphere                  = float('NaN');
+
+		self.elementonbed                = float('NaN');
+		self.elementonsurface            = float('NaN');
+		self.vertexonbed                 = float('NaN');
+		self.vertexonsurface             = float('NaN');
+		self.lowerelements               = float('NaN');
+		self.lowervertex                 = float('NaN');
+		self.upperelements               = float('NaN');
+		self.uppervertex                 = float('NaN');
+		self.vertexonboundary            = float('NaN');
+
+		self.edges                       = float('NaN');
+		self.segments                    = float('NaN');
+		self.segmentmarkers              = float('NaN');
+		self.vertexconnectivity          = float('NaN');
+		self.elementconnectivity         = float('NaN');
+		self.average_vertex_connectivity = 0;
+
+		self.x2d                         = float('NaN');
+		self.y2d                         = float('NaN');
+		self.elements2d                  = float('NaN');
+		self.numberofvertices2d          = 0;
+		self.numberofelements2d          = 0;
+
+		self.extractedvertices           = float('NaN');
+		self.extractedelements           = float('NaN');
+
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+
+		if obj.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,"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%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%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%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"" "))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/miscellaneous.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/miscellaneous.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/miscellaneous.py	(revision 12038)
@@ -0,0 +1,20 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class miscellaneous:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.notes = ''
+		self.name  = ''
+		self.dummy = {}
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   miscellaneous parameters:'
+
+		string="%s\n\n%s"%(string,fielddisplay(obj,'notes','notes in a cell of strings'))
+		string="%s\n%s"%(string,fielddisplay(obj,'name','model name'))
+		string="%s\n%s"%(string,fielddisplay(obj,'dummy','empty field to store some data'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/model.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/model.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/model.py	(revision 12038)
@@ -0,0 +1,115 @@
+#module imports {{{
+from mesh import mesh
+from mask import mask
+from geometry import geometry
+from constants import constants
+from surfaceforcings import surfaceforcings
+from basalforcings import basalforcings
+from materials import materials
+from friction import friction
+from flowequation import flowequation
+from timestepping import timestepping
+from initialization import initialization
+from rifts import rifts
+from debug import debug
+from verbose import verbose
+from settings import settings
+from solver import solver
+from none import none
+from balancethickness import balancethickness
+from diagnostic import diagnostic
+from groundingline import groundingline
+from hydrology import hydrology
+from prognostic import prognostic
+from thermal import thermal
+from steadystate import steadystate
+from transient import transient
+from autodiff import autodiff
+from flaim import flaim
+from inversion import inversion
+from qmu import qmu
+from radaroverlay import radaroverlay
+from miscellaneous import miscellaneous
+from private import private
+#}}}
+class model:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.mesh             = mesh()
+		self.mask             = mask()
+		self.geometry         = geometry()
+		self.constants        = constants()
+		self.surfaceforcings  = surfaceforcings()
+		self.basalforcings    = basalforcings()
+		self.materials        = materials()
+		self.friction         = friction()
+		self.flowequation     = flowequation()
+		self.timestepping     = timestepping()
+		self.initialization   = initialization()
+		self.rifts            = rifts()
+
+		self.debug            = debug()
+		self.verbose          = verbose()
+		self.settings         = settings()
+		self.solver           = solver()
+		self.cluster          = none()
+
+		self.balancethickness = balancethickness()
+		self.diagnostic       = diagnostic()
+		self.groundingline    = groundingline()
+		self.hydrology        = hydrology()
+		self.prognostic       = prognostic()
+		self.thermal          = thermal()
+		self.steadystate      = steadystate()
+		self.transient        = transient()
+
+		self.autodiff         = autodiff()
+		self.flaim            = flaim()
+		self.inversion        = inversion()
+		self.qmu              = qmu()
+
+		self.results          = [];
+		self.radaroverlay     = radaroverlay()
+		self.miscellaneous    = miscellaneous()
+		self.private          = private()
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+
+		#print "Here %s the number: %d" % ("is", 37)
+		string="%19s: %-22s -- %s" % ("mesh","[%s,%s]" % ("1x1",obj.mesh.__class__.__name__),"mesh properties")
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("mask","[%s,%s]" % ("1x1",obj.mask.__class__.__name__),"defines grounded and floating elements"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("geometry","[%s,%s]" % ("1x1",obj.geometry.__class__.__name__),"surface elevation, bedrock topography, ice thickness,..."))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("constants","[%s,%s]" % ("1x1",obj.constants.__class__.__name__),"physical constants"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("surfaceforcings","[%s,%s]" % ("1x1",obj.surfaceforcings.__class__.__name__),"surface forcings"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("basalforcings","[%s,%s]" % ("1x1",obj.basalforcings.__class__.__name__),"bed forcings"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("materials","[%s,%s]" % ("1x1",obj.materials.__class__.__name__),"material properties"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("friction","[%s,%s]" % ("1x1",obj.friction.__class__.__name__),"basal friction/drag properties"))
+		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" % ("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" % ("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"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("groundingline","[%s,%s]" % ("1x1",obj.groundingline.__class__.__name__),"parameters for groundingline solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("hydrology","[%s,%s]" % ("1x1",obj.hydrology.__class__.__name__),"parameters for hydrology solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("prognostic","[%s,%s]" % ("1x1",obj.prognostic.__class__.__name__),"parameters for prognostic solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("thermal","[%s,%s]" % ("1x1",obj.thermal.__class__.__name__),"parameters for thermal solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("steadystate","[%s,%s]" % ("1x1",obj.steadystate.__class__.__name__),"parameters for steadystate solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("transient","[%s,%s]" % ("1x1",obj.transient.__class__.__name__),"parameters for transient solution"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("autodiff","[%s,%s]" % ("1x1",obj.autodiff.__class__.__name__),"automatic differentiation parameters"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("flaim","[%s,%s]" % ("1x1",obj.flaim.__class__.__name__),"flaim parameters"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("inversion","[%s,%s]" % ("1x1",obj.inversion.__class__.__name__),"parameters for inverse methods"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("qmu","[%s,%s]" % ("1x1",obj.qmu.__class__.__name__),"dakota properties"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("results","[%s,%s]" % ("1x1",obj.results.__class__.__name__),"model results'"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("radaroverlay","[%s,%s]" % ("1x1",obj.radaroverlay.__class__.__name__),"radar image for plot overlay"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("miscellaneous","[%s,%s]" % ("1x1",obj.miscellaneous.__class__.__name__),"miscellaneous fields"))
+		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("miscellaneous","[%s,%s]" % ("1x1",obj.miscellaneous.__class__.__name__),"miscellaneous fields"))
+		return string;
+		 #}}}
Index: /issm/trunk-jpl/src/m/classes/pairoptions.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/pairoptions.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/pairoptions.py	(revision 12038)
@@ -0,0 +1,38 @@
+class pairoptions:
+	#properties
+	def __init__(self,*args):
+		# {{{ Properties
+		if len(args)%2==1:
+			raise RuntimeError('pairoption error message: an even number of options is required')
+
+		#create a pairoption object
+		if len(args)==0:
+			self.list=[]
+		else:
+			self.list=[]
+			for i in range(int(round(len(args)/2))):
+				if isinstance(args[2*i],str):
+					self.list.append([args[2*i],args[2*i+1]])
+				else:
+					#option is not a string, ignore it
+					print("%s%i%s"%('buildlist info: option number ',i,' is not a string, it will be ignored'))
+					continue
+
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		if not obj.list:
+			string='   list: empty'
+		else:
+			string="   list: (%i)"%(len(obj.list))
+			for i in range(len(obj.list)):
+				if isinstance(obj.list[i][1],str):
+					string2="     field: %-10s value: '%s'"%(obj.list[i][0],obj.list[i][1])
+				elif isinstance(obj.list[i][1],float):
+					string2="     field: %-10s value: %g"%(obj.list[i][0],obj.list[i][1])
+				elif isinstance(obj.list[i][1],int):
+					string2="     field: %-10s value: %i"%(obj.list[i][0],obj.list[i][1])
+				else:
+					string2="     field: %-10s value: (%i)"%(len(obj.list[i][1]))
+				string="%s\n%s"%(string,string2)
+		return string
Index: /issm/trunk-jpl/src/m/classes/private.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/private.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/private.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class private:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.runtimename = ''
+		self.bamg        = {}
+		self.solution    = '';
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   private parameters: do not change'
+		string="%s\n%s"%(string,fielddisplay(obj,'runtimename','name of the run launched'))
+		string="%s\n%s"%(string,fielddisplay(obj,'bamg','structure with mesh properties construced if bamg is used to mesh the domain'))
+		string="%s\n%s"%(string,fielddisplay(obj,'solution','type of solution launched'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/prognostic.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/prognostic.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/prognostic.py	(revision 12038)
@@ -0,0 +1,24 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class prognostic:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.spcthickness           = float('NaN')
+		self.min_thickness          = 0
+		self.hydrostatic_adjustment = 0
+		self.stabilization          = 0
+		self.vertex_pairing         = float('NaN')
+		self.penalty_factor         = 0
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   Prognostic solution parameters:'
+		string="%s\n\n%s"%(string,fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'min_thickness','minimum ice thickness allowed'))
+		string="%s\n%s"%(string,fielddisplay(obj,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' '))
+		string="%s\n%s"%(string,fielddisplay(obj,'stabilization','0->no, 1->artificial_diffusivity, 2->streamline upwinding, 3->discontinuous Galerkin'))
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/qmu.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/qmu.py	(revision 12038)
@@ -0,0 +1,29 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class qmu:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.isdakota                    = 0
+		self.variables                   = {}
+		self.responses                   = {}
+		self.method                      = {}
+		self.params                      = {}
+		self.results                     = {}
+		self.partition                   = float('NaN')
+		self.numberofpartitions          = 0
+		self.numberofresponses           = 0
+		self.variabledescriptors         = []
+		self.responsedescriptors         = []
+		self.mass_flux_profile_directory = float('NaN')
+		self.mass_flux_profiles          = float('NaN')
+		self.mass_flux_segments          = []
+		self.adjacency                   = float('NaN')
+		self.vertex_weight               = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string="   qmu parameters: not implemented yet!"
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/radaroverlay.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/radaroverlay.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/radaroverlay.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class radaroverlay:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.pwr = float('NaN')
+		self.x   = float('NaN')
+		self.y   = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   radaroverlay parameters:'
+		string="%s\n\n%s"%(string,fielddisplay(obj,'pwr','radar power image (matrix)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'x','corresponding x coordinates'))
+		string="%s\n%s"%(string,fielddisplay(obj,'y','corresponding y coordinates'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/rifts.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/rifts.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/rifts.py	(revision 12038)
@@ -0,0 +1,18 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class rifts:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.riftstruct     = float('NaN')
+		self.riftproperties = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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',''))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/settings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/settings.py	(revision 12038)
@@ -0,0 +1,24 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class settings:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.io_gather           = 0;
+		self.lowmem              = 0;
+		self.results_as_patches  = 0;
+		self.output_frequency    = 0;
+		self.waitonlock          = 0;
+		#}}}
+	def __repr__(obj):
+		# {{{ 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"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/solver.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/solver.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/solver.py	(revision 12038)
@@ -0,0 +1,49 @@
+#module imports {{{
+import fielddisplay 
+import ismumps
+from  mumpsoptions import *
+from  iluasmoptions import *
+#}}}
+class solver:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		if ismumps:
+			self.options=[["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]
+
+			string=""
+			for i in range(len(ioptions)):
+				option=ioptions[i]
+				if not option:
+					#do nothing
+					pass
+				elif len(option)==1:
+					#this option has only one argument
+					string="%s%s%s"%(string," -",option[0])
+				elif len(option)==2:
+					#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]))
+					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"))
+
+			string2="%s\n%s"%(string2,"   %s -> '%s'"%(analysis,string))
+		return string2
+	#}}}
Index: /issm/trunk-jpl/src/m/classes/steadystate.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/steadystate.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/steadystate.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class steadystate:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.reltol            = 0
+		self.maxiter           = 0
+		self.requested_outputs = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   steadystate solution parameters:'
+		string="%s\n%s"%(string,fielddisplay(obj,'reltol','relative tolerance criterion'))
+		string="%s\n%s"%(string,fielddisplay(obj,'maxiter','maximum number of iterations'))
+		string="%s\n%s"%(string,fielddisplay(obj,'requested_outputs','additional requested outputs'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/surfaceforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 12038)
@@ -0,0 +1,19 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class surfaceforcings:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.precipitation = float('NaN')
+		self.mass_balance  = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ 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]'))
+
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/thermal.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/thermal.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/thermal.py	(revision 12038)
@@ -0,0 +1,26 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class thermal:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.spctemperature    = float('NaN')
+		self.penalty_threshold = 0
+		self.stabilization     = 0
+		self.maxiter           = 0
+		self.penalty_lock      = 0
+		self.penalty_factor    = 0
+		self.isenthalpy        = 0
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   Thermal solution parameters:'
+		string="%s\n\n%s"%(string,fielddisplay(obj,'spctemperature','temperature constraints (NaN means no constraint)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'stabilization','0->no, 1->artificial_diffusivity, 2->SUPG'))
+		string="%s\n%s"%(string,fielddisplay(obj,'maxiter','maximum number of non linear iterations'))
+		string="%s\n%s"%(string,fielddisplay(obj,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(obj,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/timestepping.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/timestepping.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/timestepping.py	(revision 12038)
@@ -0,0 +1,21 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class timestepping:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.time_step       = 0;
+		self.final_time      = 0;
+		self.time_adapt      = 0;
+		self.cfl_coefficient = 0;
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string="   timestepping parameters:"
+		string="%s\n\n%s"%(string,fielddisplay(obj,"time_step","length of time steps [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_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"))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/transient.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/transient.py	(revision 12038)
@@ -0,0 +1,23 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class transient:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.isprognostic      = 0
+		self.isdiagnostic      = 0
+		self.isthermal         = 0
+		self.isgroundingline   = 0
+		self.requested_outputs = float('NaN')
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string='   transient solution parameters:'
+		string="%s\n%s"%(string,fielddisplay(obj,'isprognostic','indicates if a prognostic solution is used in the transient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'isthermal','indicates if a thermal solution is used in the transient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'isdiagnostic','indicates if a diagnostic solution is used in the transient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'isgroundingline','indicates if a groundingline migration is used in the transient'))
+		string="%s\n%s"%(string,fielddisplay(obj,'requested_outputs','list of additional outputs requested'))
+		return string
+		#}}}
Index: /issm/trunk-jpl/src/m/classes/verbose.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/verbose.py	(revision 12038)
+++ /issm/trunk-jpl/src/m/classes/verbose.py	(revision 12038)
@@ -0,0 +1,27 @@
+#module imports
+from fielddisplay import fielddisplay
+
+class verbose:
+	#properties
+	def __init__(self):
+		# {{{ Properties
+		self.mprocessor  = False
+		self.module      = False
+		self.solution    = False
+		self.solver      = False
+		self.convergence = False
+		self.control     = False
+		self.qmu         = False
+		#}}}
+	def __repr__(obj):
+		# {{{ Display
+		string="%s%s%s\n\n"%("class '",obj.__class__.__name__,"'=")
+		string="%s%s\n"%(string,"   %15s : %s"%("mprocessor",obj.mprocessor))
+		string="%s%s\n"%(string,"   %15s : %s"%("module",obj.module))
+		string="%s%s\n"%(string,"   %15s : %s"%("solution",obj.solution))
+		string="%s%s\n"%(string,"   %15s : %s"%("solver",obj.solver))
+		string="%s%s\n"%(string,"   %15s : %s"%("convergence",obj.convergence))
+		string="%s%s\n"%(string,"   %15s : %s"%("control",obj.control))
+		string="%s%s\n"%(string,"   %15s : %s"%("qmu",obj.qmu))
+		return string
+		#}}}
