Index: /issm/trunk-jpl/src/py/classes/autodiff.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/autodiff.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/autodiff.py	(revision 11794)
@@ -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/py/classes/flaim.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/flaim.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/flaim.py	(revision 11794)
@@ -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/py/classes/groundingline.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/groundingline.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/groundingline.py	(revision 11794)
@@ -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/py/classes/hydrology.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/hydrology.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/hydrology.py	(revision 11794)
@@ -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/py/classes/inversion.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/inversion.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/inversion.py	(revision 11794)
@@ -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/py/classes/model.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/model.py	(revision 11793)
+++ /issm/trunk-jpl/src/py/classes/model.py	(revision 11794)
@@ -19,4 +19,13 @@
 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
 #}}}
 class model:
@@ -45,14 +54,14 @@
 		self.balancethickness = balancethickness()
 		self.diagnostic       = diagnostic()
-		self.groundingline    = [];
-		self.hydrology        = [];
-		self.prognostic       = [];
-		self.thermal          = [];
-		self.steadystate      = [];
-		self.transient        = [];
+		self.groundingline    = groundingline()
+		self.hydrology        = hydrology()
+		self.prognostic       = prognostic()
+		self.thermal          = thermal()
+		self.steadystate      = steadystate()
+		self.transient        = transient()
 
-		self.autodiff         = [];
-		self.flaim            = [];
-		self.inversion        = [];
+		self.autodiff         = autodiff()
+		self.flaim            = flaim()
+		self.inversion        = inversion()
 		self.qmu              = [];
 
Index: /issm/trunk-jpl/src/py/classes/prognostic.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/prognostic.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/prognostic.py	(revision 11794)
@@ -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/py/classes/steadystate.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/steadystate.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/steadystate.py	(revision 11794)
@@ -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/py/classes/thermal.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/thermal.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/thermal.py	(revision 11794)
@@ -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/py/classes/transient.py
===================================================================
--- /issm/trunk-jpl/src/py/classes/transient.py	(revision 11794)
+++ /issm/trunk-jpl/src/py/classes/transient.py	(revision 11794)
@@ -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/py/model/display/fielddisplay.py
===================================================================
--- /issm/trunk-jpl/src/py/model/display/fielddisplay.py	(revision 11793)
+++ /issm/trunk-jpl/src/py/model/display/fielddisplay.py	(revision 11794)
@@ -43,12 +43,11 @@
 			string=displayunit(offset,name,"false",comment)
 		
-	#elif isstruct(field),
-	#	if ~isempty(fields(field))
-	#		displayunit(offset,name,'(structure)',comment),
-	#		struct_display(field,[offset '   ']),
-	#	else
-	#		displayunit(offset,name,'N/A',comment),
-	#	end
-
+	elif isinstance(field,list):
+		if not field:
+			string=displayunit(offset,name,'N/A',comment),
+		else:
+			string=displayunit(offset,name,'(structure)',comment)
+			for i in range(len(field)):
+				string="%s\n%s"%(string,displayunit(offset + '   ',name,field[i],comment))
 	#cell
 	#elif  iscell(field):
@@ -86,8 +85,9 @@
 			string="%s%-23s: %-15s -- %s" % (offset,name,characterization,comment)
 		elif isinstance(comment,list):
+			print(comment)
 			string="%s%-23s: %-15s -- %s" % (offset,name,characterization,comment[0])
-			for i in range(2,len(comment)):
+			for i in range(1,len(comment)):
 				string2="%s%-23s  %-15s    %s" %(offset,"","",comment[i])
-				string="%s%s"%(string,string2)
+				string="%s\n%s"%(string,string2)
 		else:
 			raise RuntimeError("fielddisplay error message: format for comment not supportet yet")
