Index: /issm/trunk-jpl/m4/issm_options.m4
===================================================================
--- /issm/trunk-jpl/m4/issm_options.m4	(revision 17894)
+++ /issm/trunk-jpl/m4/issm_options.m4	(revision 17895)
@@ -940,4 +940,28 @@
 	fi
 	dnl }}}
+	dnl m1qn3{{{
+	AC_ARG_WITH([m1qn3-dir],
+		AS_HELP_STRING([--with-m1qn3-dir=DIR], [m1qn3 root directory.]),
+		[M1QN3_ROOT=$withval],[M1QN3_ROOT="no"]) 
+
+	dnl Check whether m1qn3 is enabled
+	AC_MSG_CHECKING([for m1qn3])
+	if test "x$M1QN3_ROOT" = "xno" ; then
+		HAVE_M1QN3=no
+	else
+		HAVE_M1QN3=yes
+		if ! test -d "$M1QN3_ROOT"; then
+			AC_MSG_ERROR([m1qn3 directory provided ($M1QN3_ROOT) does not exist]);
+		fi
+	fi
+	AC_MSG_RESULT($HAVE_M1QN3)
+	
+	dnl m1qn3 headers and libraries
+	if test "x$HAVE_M1QN3" == "xyes"; then
+	  M1QN3LIB="$M1QN3_ROOT/libm1qn3.a $M1QN3_ROOT//libddot.a"
+	  AC_DEFINE([_HAVE_M1QN3_],[1],[with M1QN3I in ISSM src])
+	  AC_SUBST([M1QN3LIB])
+	fi
+	dnl }}}
 	dnl slepc{{{
 	AC_ARG_WITH([slepc-dir],
Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 17894)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 17895)
@@ -423,4 +423,5 @@
 					./cores/control_core.cpp\
 					./cores/controltao_core.cpp\
+					./cores/controlm1qn3_core.cpp\
 					./cores/objectivefunction.cpp\
 					./cores/gradient_core.cpp\
@@ -874,5 +875,5 @@
 
 libISSMCore_la_SOURCES  = $(issm_sources)
-libISSMCore_la_LIBADD = $(PETSCLIB) $(TAOLIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB)   $(ADOLCLIB) $(AMPILIB) $(METEOIOLIB) $(SNOWPACKLIB) 
+libISSMCore_la_LIBADD = $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB)   $(ADOLCLIB) $(AMPILIB) $(METEOIOLIB) $(SNOWPACKLIB) 
 libISSMCore_la_FFLAGS = $(AM_FFLAGS)
 endif
@@ -921,5 +922,5 @@
 
 #External packages
-LDADD += $(PETSCLIB) $(TAOLIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
+LDADD += $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
 
 if FORTRAN
Index: /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 17894)
+++ /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 17895)
@@ -21,7 +21,7 @@
 
 	/*parameters: */
-	bool control_analysis=false;
-	bool tao_analysis=false;
-	bool dakota_analysis=false;
+	bool control_analysis;
+	bool dakota_analysis;
+	int  inversiontype;
 
 	/* retrieve some parameters that tell us whether wrappers are allowed, or whether we return 
@@ -30,5 +30,5 @@
 	parameters->FindParam(&dakota_analysis,QmuIsdakotaEnum);
 	parameters->FindParam(&control_analysis,InversionIscontrolEnum);
-	parameters->FindParam(&tao_analysis,InversionTaoEnum);
+	parameters->FindParam(&inversiontype,InversionTypeEnum);
 
 	if(nodakotacore)dakota_analysis=false;
@@ -42,6 +42,10 @@
 	}
 	else if(control_analysis){
-		if(tao_analysis) solutioncore=controltao_core;
-		else solutioncore=control_core;
+		switch(inversiontype){
+			case 0: solutioncore=control_core; break;
+			case 1: solutioncore=controltao_core; break;
+			case 2: solutioncore=controlm1qn3_core; break;
+			default: _error_("control type not supported");
+		}
 	}
 	else CorePointerFromSolutionEnum(&solutioncore,parameters,solutiontype);  /*This means we retrieve a core solution that is not a wrapper*/
Index: /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 17895)
+++ /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 17895)
@@ -0,0 +1,105 @@
+/*!\file: controlm1qn3_core.cpp
+ * \brief: core of the control solution 
+ */ 
+
+#include "./cores.h"
+#include "../toolkits/toolkits.h"
+#include "../classes/classes.h"
+#include "../shared/shared.h"
+#include "../modules/modules.h"
+#include "../solutionsequences/solutionsequences.h"
+
+#if defined (_HAVE_M1QN3_)
+/*m1qn3 prototypes*/
+extern "C" void *ctonbe_; // DIS mode : Conversion
+extern "C" void *ctcabe_; // DIS mode : Conversion
+extern "C" void *euclid_; // Scalar product
+typedef void (*SimulFunc) (long*, long *, double [], double *, double [], long [], float [], double []);
+extern "C" void m1qn3_ (void f(long*, long *, double [], double *, double [], long [], float [], double []),
+			void **, void **, void **,
+			long *, double [], double *, double [], double*, double *,
+			double *, char [], long *, long *, long *, long *, long *, long *, long [], double [], long *,
+			long *, long *, long [], float [], double []
+			);
+
+void simul(long* indic,long* n,double x[2],double* f,double g[2],long izs[1],float rzs[1],double dzs[1]){
+	/*minimization of x^2+cy^4 where c>0 is a parameter*/
+	double c=dzs[0];
+	*f=x[0]*x[0]+c*x[1]*x[1]*x[1]*x[1];
+	g[0]=2.*x[0];
+	g[1]=4.*c*x[1]*x[1]*x[1];
+}
+
+void controlm1qn3_core(FemModel* femmodel){
+	if(VerboseControl())_printf0_("   Initialize M1QN3 parameters\n");
+
+	const int pbdim = 2;
+
+	/*Solution parameters*/
+	double c = 10.;
+
+	/*output*/
+	long omode;
+
+	/*Function evaluation and gradient*/
+	double f;
+	double g[2]; /**/
+
+	/*m1qn3 parameters*/
+	SimulFunc costfuncion  = &simul;    /*Cost function address*/
+	void**    prosca       = &euclid_;  /*Dot product function (euclid is the default)*/
+	char      normtype[3];              /*Norm type: dfn = scalar product defined by prosca*/
+	strcpy(normtype, "dfn");
+	long      impres       = 0;         /*verbosity level*/
+	long      imode[3]     = {0};
+	long      indic        = 4;         /*compute f and g*/
+	long      reverse      = 0;
+	long      ndz          = 20000; /*Dimension of the working area*/
+	double    dz[20000];            /*Working array*/
+	long      iz[5];
+	double    dxmin        = 1.e-10; /*Resolution for the solution x*/
+	double    epsrel       = 1.e-5;  /*Gradient stopping criterion in ]0 1[ -> |gk|/|g1| < epsrel*/
+	long      niter        = 200;    /*Maximum number of iterations*/
+	long      nsim         = 200;    /*Maximum number of function calls*/
+	long      io           = 6;      /*Channel number for the output*/
+	/*Arrayes used by m1qn3 subroutines*/
+	double    dzs[1];
+	long      izs[5];
+	float     rzs[1];
+
+
+	/*Prepare initial guess*/
+	long      n = pbdim;
+	double    x[pbdim];
+	for(int i=0;i<n;i++) x[i]=5.;
+	dzs[0] = c;
+
+	if(VerboseControl())_printf0_("   Computing initial solution\n");
+	simul(&indic,&n,x,&f,g,izs,rzs,&dzs[0]);
+	double f1=f;
+
+	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
+				&n,x,&f,g,&dxmin,&f1,
+				&epsrel,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
+				&reverse,&indic,izs,rzs,dzs);
+
+	switch(int(omode)){
+		case 0:  _printf0_("Stop requiered \n"); break;
+		case 1:  _printf0_("Stop on epsg (gradient too small)\n"); break;
+		case 2:  _printf0_("Bad initialization\n"); break;
+		case 3:  _printf0_("Line search failure\n"); break;
+		case 4:  _printf0_("Maximum number of iterations exceeded\n");break;
+		case 5:  _printf0_("Maximum number of function calls exceeded\n"); break;
+		case 6:  _printf0_("stoped on dxmin during line search\n"); break;
+		case 7:  _printf0_("<g,d> > 0  or  <y,s> <0\n"); break;
+		default: _printf0_("Unknown end condition\n");
+	}
+
+	_printf0_(" == Final cost function = "<< f <<"\n");
+	_printf0_(" == Final x = ["<<x[0]<<" "<<x[1]<<"]\n");
+}
+#else
+void controlm1qn3_core(FemModel* femmodel){
+	_error_("M1QN3 not installed");
+}
+#endif //_HAVE_TAO_ 
Index: /issm/trunk-jpl/src/c/cores/cores.h
===================================================================
--- /issm/trunk-jpl/src/c/cores/cores.h	(revision 17894)
+++ /issm/trunk-jpl/src/c/cores/cores.h	(revision 17895)
@@ -29,4 +29,5 @@
 void control_core(FemModel* femmodel);
 void controltao_core(FemModel* femmodel);
+void controlm1qn3_core(FemModel* femmodel);
 void masstransport_core(FemModel* femmodel);
 void depthaverage_core(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 17894)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 17895)
@@ -10,5 +10,6 @@
 void CreateParametersControl(Parameters* parameters,IoModel* iomodel,int solution_type){
 
-	bool        control_analysis,tao_analysis;
+	bool        control_analysis;
+	int         inversiontype;
 	int         nsteps;
 	int         num_control_type;
@@ -22,5 +23,5 @@
 	/*retrieve some parameters: */
 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
-	iomodel->Constant(&tao_analysis,InversionTaoEnum);
+	iomodel->Constant(&inversiontype,InversionTypeEnum);
 
 	if(control_analysis){
@@ -31,5 +32,5 @@
 		parameters->AddObject(iomodel->CopyConstantObject(InversionNstepsEnum));
 		parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
-		if(!tao_analysis){
+		if(inversiontype==0){
 			parameters->AddObject(iomodel->CopyConstantObject(InversionCostFunctionThresholdEnum));
 		}
@@ -46,5 +47,5 @@
 		iomodel->FetchData(&control_type,NULL,&num_control_type,InversionControlParametersEnum);
 		iomodel->FetchData(&cm_responses,NULL,&num_cm_responses,InversionCostFunctionsEnum);
-		if(!tao_analysis){
+		if(inversiontype==0){
 			iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum);
 			iomodel->FetchData(&optscal,NULL,NULL,InversionGradientScalingEnum);
@@ -52,5 +53,5 @@
 		}
 
-		if(tao_analysis){
+		if(inversiontype!=0){
 			parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_control_type));
 			parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_cm_responses));
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17894)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17895)
@@ -76,5 +76,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(QmuIsdakotaEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
-	parameters->AddObject(iomodel->CopyConstantObject(InversionTaoEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(InversionTypeEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
 
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17894)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17895)
@@ -135,5 +135,5 @@
 	InversionGradientScalingEnum,
 	InversionIscontrolEnum,
-	InversionTaoEnum,
+	InversionTypeEnum,
 	InversionIncompleteAdjointEnum,
 	InversionMaxParametersEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17894)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17895)
@@ -143,5 +143,5 @@
 		case InversionGradientScalingEnum : return "InversionGradientScaling";
 		case InversionIscontrolEnum : return "InversionIscontrol";
-		case InversionTaoEnum : return "InversionTao";
+		case InversionTypeEnum : return "InversionType";
 		case InversionIncompleteAdjointEnum : return "InversionIncompleteAdjoint";
 		case InversionMaxParametersEnum : return "InversionMaxParameters";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17894)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17895)
@@ -146,5 +146,5 @@
 	      else if (strcmp(name,"InversionGradientScaling")==0) return InversionGradientScalingEnum;
 	      else if (strcmp(name,"InversionIscontrol")==0) return InversionIscontrolEnum;
-	      else if (strcmp(name,"InversionTao")==0) return InversionTaoEnum;
+	      else if (strcmp(name,"InversionType")==0) return InversionTypeEnum;
 	      else if (strcmp(name,"InversionIncompleteAdjoint")==0) return InversionIncompleteAdjointEnum;
 	      else if (strcmp(name,"InversionMaxParameters")==0) return InversionMaxParametersEnum;
Index: /issm/trunk-jpl/src/m/classes/inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.m	(revision 17894)
+++ /issm/trunk-jpl/src/m/classes/inversion.m	(revision 17895)
@@ -7,5 +7,4 @@
 	properties (SetAccess=public) 
 		iscontrol                   = 0
-		tao                         = 0
 		incomplete_adjoint          = 0
 		control_parameters          = NaN
@@ -80,5 +79,4 @@
 						obj=inversion();
 						obj.iscontrol                   = in.iscontrol;
-						obj.tao                         = 1;rsion to inve
 						obj.incomplete_adjoint          = in.incomplete_adjoint;
 						obj.control_parameters          = in.control_parameters;
@@ -152,5 +150,4 @@
 
 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
-			md = checkfield(md,'fieldname','inversion.tao','values',[0 1]);
 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
@@ -214,6 +211,6 @@
 			yts=365.0*24.0*3600.0;
 
+			WriteData(fid,'enum',InversionTypeEnum(),'data',0,'format','Integer');
 			WriteData(fid,'object',obj,'fieldname','iscontrol','format','Boolean');
-			WriteData(fid,'object',obj,'fieldname','tao','format','Boolean');
 			WriteData(fid,'object',obj,'fieldname','incomplete_adjoint','format','Boolean');
 			if ~obj.iscontrol, return; end
Index: /issm/trunk-jpl/src/m/classes/inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.py	(revision 17894)
+++ /issm/trunk-jpl/src/m/classes/inversion.py	(revision 17895)
@@ -17,5 +17,4 @@
 	def __init__(self): # {{{
 		self.iscontrol                   = 0
-		self.tao                         = 0
 		self.incomplete_adjoint          = 0
 		self.control_parameters          = float('NaN')
@@ -117,5 +116,4 @@
 
 		md = checkfield(md,'fieldname','inversion.iscontrol','values',[0,1])
-		md = checkfield(md,'fieldname','inversion.tao','values',[0,1])
 		md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0,1])
 		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy'])
@@ -146,6 +144,6 @@
 		yts=365.0*24.0*3600.0
 
+		WriteData(fid,'enum',InversionTypeEnum(),'data',0,'format','Integer')
 		WriteData(fid,'object',self,'fieldname','iscontrol','format','Boolean')
-		WriteData(fid,'object',self,'fieldname','tao','format','Boolean')
 		WriteData(fid,'object',self,'fieldname','incomplete_adjoint','format','Boolean')
 		if not self.iscontrol:
Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17895)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17895)
@@ -0,0 +1,166 @@
+%M1QN3INVERSION class definition
+%
+%   Usage:
+%      m1qn3inversion=m1qn3inversion();
+
+classdef m1qn3inversion
+	properties (SetAccess=public) 
+		iscontrol                   = 0
+		incomplete_adjoint          = 0
+		control_parameters          = NaN
+		nsteps                      = 0
+		cost_functions              = NaN
+		cost_functions_coefficients = NaN
+		min_parameters              = NaN
+		max_parameters              = NaN
+		vx_obs                      = NaN
+		vy_obs                      = NaN
+		vz_obs                      = NaN
+		vel_obs                     = NaN
+		thickness_obs               = NaN
+	end
+	methods
+		function obj = m1qn3inversion(varargin) % {{{
+			switch nargin
+				case 0
+					obj=setdefaultparameters(obj);
+				case 1
+					if isa(varargin{1},'inversion'),
+						disp('converting inversion to m1qn3inversion');
+						in=varargin{1};
+						obj.iscontrol                   = in.iscontrol;
+						obj.incomplete_adjoint          = in.incomplete_adjoint;
+						obj.control_parameters          = in.control_parameters;
+						obj.nsteps                      = in.nsteps;
+						obj.cost_functions              = in.cost_functions(1,:); %Keep first line only
+						obj.cost_functions_coefficients = in.cost_functions_coefficients;
+						obj.min_parameters              = in.min_parameters;
+						obj.max_parameters              = in.max_parameters;
+						obj.vx_obs                      = in.vx_obs;
+						obj.vy_obs                      = in.vy_obs;
+						obj.vz_obs                      = in.vz_obs;
+						obj.vel_obs                     = in.vel_obs;
+						obj.thickness_obs               = in.thickness_obs;
+					end
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function obj = setdefaultparameters(obj) % {{{
+
+			%default is incomplete adjoint for now
+			obj.incomplete_adjoint=1;
+
+			%parameter to be inferred by control methods (only
+			%drag and B are supported yet)
+			obj.control_parameters={'FrictionCoefficient'};
+
+			%number of steps in the control methods
+			obj.nsteps=20;
+
+			%several responses can be used:
+			obj.cost_functions=101*ones(obj.nsteps,1);
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			%Early return
+			if ~obj.iscontrol, return; end
+
+			if ~IssmConfig('_HAVE_TAO_'),
+				md = checkmessage(md,['TAO has not been installed, ISSM needs to be reconfigured and recompiled with TAO']);
+			end
+
+			num_controls=numel(md.inversion.control_parameters);
+			num_costfunc=size(md.inversion.cost_functions,2);
+
+			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'MaterialsRheologyZbar' 'Vx' 'Vy' 'Thickness'});
+			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506]);
+			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+
+			if solution==BalancethicknessSolutionEnum()
+				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+			elseif solution==BalancethicknessSoftSolutionEnum()
+				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+			else
+				md = checkfield(md,'fieldname','inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+				md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+			end
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   m1qn3inversion parameters:'));
+			fielddisplay(obj,'iscontrol','is inversion activated?');
+			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+			fielddisplay(obj,'nsteps','number of optimization searches');
+			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+			disp('Available cost functions:');
+			disp('   101: SurfaceAbsVelMisfit');
+			disp('   102: SurfaceRelVelMisfit');
+			disp('   103: SurfaceLogVelMisfit');
+			disp('   104: SurfaceLogVxVyMisfit');
+			disp('   105: SurfaceAverageVelMisfit');
+			disp('   201: ThicknessAbsMisfit');
+			disp('   501: DragCoefficientAbsGradient');
+			disp('   502: RheologyBbarAbsGradient');
+			disp('   503: ThicknessAbsGradient');
+		end % }}}
+		function marshall(obj,md,fid) % {{{
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
+			WriteData(fid,'enum',InversionTypeEnum(),'data',2,'format','Integer');
+			if ~obj.iscontrol, return; end
+			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','nsteps','format','Integer');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',1);
+
+			%process control parameters
+			num_control_parameters=numel(obj.control_parameters);
+			data=zeros(1,num_control_parameters);
+			for i=1:num_control_parameters,
+				data(i)=StringToEnum(obj.control_parameters{i});
+			end
+			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+
+			%process cost functions
+			num_cost_functions=size(obj.cost_functions,2);
+			data=obj.cost_functions;
+			pos=find(data==101); data(pos)=SurfaceAbsVelMisfitEnum();
+			pos=find(data==102); data(pos)=SurfaceRelVelMisfitEnum();
+			pos=find(data==103); data(pos)=SurfaceLogVelMisfitEnum();
+			pos=find(data==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+			pos=find(data==105); data(pos)=SurfaceAverageVelMisfitEnum();
+			pos=find(data==201); data(pos)=ThicknessAbsMisfitEnum();
+			pos=find(data==501); data(pos)=DragCoefficientAbsGradientEnum();
+			pos=find(data==502); data(pos)=RheologyBbarAbsGradientEnum();
+			pos=find(data==503); data(pos)=ThicknessAbsGradientEnum();
+			pos=find(data==504); data(pos)=ThicknessAlongGradientEnum();
+			pos=find(data==505); data(pos)=ThicknessAcrossGradientEnum();
+			pos=find(data==506); data(pos)=BalancethicknessMisfitEnum();
+			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/taoinversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/taoinversion.m	(revision 17894)
+++ /issm/trunk-jpl/src/m/classes/taoinversion.m	(revision 17895)
@@ -124,5 +124,5 @@
 
 			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
-			WriteData(fid,'enum',InversionTaoEnum(),'data',true,'format','Boolean');
+			WriteData(fid,'enum',InversionTypeEnum(),'data',1,'format','Integer');
 			if ~obj.iscontrol, return; end
 			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
Index: /issm/trunk-jpl/src/m/contrib/dassflow/importgmsh.m
===================================================================
--- /issm/trunk-jpl/src/m/contrib/dassflow/importgmsh.m	(revision 17894)
+++ /issm/trunk-jpl/src/m/contrib/dassflow/importgmsh.m	(revision 17895)
@@ -98,4 +98,5 @@
 			end
 		case 15, %point
+			A=fscanf(fid,'%i',1);
 			continue;
 		otherwise,
@@ -126,5 +127,5 @@
 
 %Create model
-if 0, %2d triangles
+if dim==2, %2d triangles
 	md=meshconvert(model,index,x,y);
 	md.mesh=mesh2dvertical(md.mesh);
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17894)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17895)
@@ -135,5 +135,5 @@
 def InversionGradientScalingEnum(): return StringToEnum("InversionGradientScaling")[0]
 def InversionIscontrolEnum(): return StringToEnum("InversionIscontrol")[0]
-def InversionTaoEnum(): return StringToEnum("InversionTao")[0]
+def InversionTypeEnum(): return StringToEnum("InversionType")[0]
 def InversionIncompleteAdjointEnum(): return StringToEnum("InversionIncompleteAdjoint")[0]
 def InversionMaxParametersEnum(): return StringToEnum("InversionMaxParameters")[0]
Index: sm/trunk-jpl/src/m/enum/InversionTaoEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionTaoEnum.m	(revision 17894)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=InversionTaoEnum()
-%INVERSIONTAOENUM - Enum of InversionTao
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
-%            Please read src/c/shared/Enum/README for more information
-%
-%   Usage:
-%      macro=InversionTaoEnum()
-
-macro=StringToEnum('InversionTao');
Index: /issm/trunk-jpl/src/m/enum/InversionTypeEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionTypeEnum.m	(revision 17895)
+++ /issm/trunk-jpl/src/m/enum/InversionTypeEnum.m	(revision 17895)
@@ -0,0 +1,11 @@
+function macro=InversionTypeEnum()
+%INVERSIONTYPEENUM - Enum of InversionType
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=InversionTypeEnum()
+
+macro=StringToEnum('InversionType');
