Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17908)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17909)
@@ -10,4 +10,6 @@
 		control_parameters          = NaN
 		nsteps                      = 0
+		dxmin                       = 0;
+		epsrel                      = 0;
 		cost_functions              = NaN
 		cost_functions_coefficients = NaN
@@ -19,4 +21,5 @@
 		vel_obs                     = NaN
 		thickness_obs               = NaN
+
 	end
 	methods
@@ -31,18 +34,22 @@
 			end
 		end % }}}
-		function obj = setdefaultparameters(obj) % {{{
+		function self = setdefaultparameters(self) % {{{
 
 			%default is incomplete adjoint for now
-			obj.incomplete_adjoint=1;
+			self.incomplete_adjoint=1;
 
 			%parameter to be inferred by control methods (only
 			%drag and B are supported yet)
-			obj.control_parameters={'FrictionCoefficient'};
+			self.control_parameters={'FrictionCoefficient'};
 
 			%number of steps in the control methods
-			obj.nsteps=20;
+			self.nsteps=20;
 
 			%several responses can be used:
-			obj.cost_functions=101*ones(obj.nsteps,1);
+			self.cost_functions=101*ones(self.nsteps,1);
+
+			%m1qn3 parameters
+			self.dxmin  = 0.1;
+			self.epsrel = 1e-4;
 
 		end % }}}
@@ -52,6 +59,6 @@
 			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']);
+			if ~IssmConfig('_HAVE_M1QN3_'),
+				md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']);
 			end
 
@@ -64,4 +71,6 @@
 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'MaterialsRheologyZbar' 'Vx' 'Vy' 'Thickness'});
 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+			md = checkfield(md,'fieldname','inversion.epsrel','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);
@@ -84,4 +93,6 @@
 			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
 			fielddisplay(obj,'nsteps','number of optimization searches');
+			fielddisplay(obj,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+			fielddisplay(obj,'epsrel','convergence criterion: ratio between current gradient and initial gradient');
 			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');
@@ -112,4 +123,6 @@
 			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','dxmin','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','epsrel','format','Double');
 			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);
Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 17908)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 17909)
@@ -23,4 +23,6 @@
 			self.control_parameters          = float('NaN')
 			self.nsteps                      = 0
+			self.dxmin                       = 0.
+			self.epsrel                      = 0.
 			self.cost_functions              = float('NaN')
 			self.cost_functions_coefficients = float('NaN')
@@ -60,4 +62,6 @@
 		string="%s\n%s"%(string,fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'))
 		string="%s\n%s"%(string,fielddisplay(self,'nsteps','number of optimization searches'))
+		string="%s\n%s"%(string,fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical'))
+		string="%s\n%s"%(string,fielddisplay(self,'epsrel','convergence criterion: ratio between current gradient and initial gradient'))
 		string="%s\n%s"%(string,fielddisplay(self,'cost_functions','indicate the type of response for each optimization step'))
 		string="%s\n%s"%(string,fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'))
@@ -95,4 +99,8 @@
 		self.cost_functions=101
 
+		#m1qn3 parameters
+		self.dxmin  = 0.1
+		self.epsrel = 1e-4
+
 		return self
 	#}}}
@@ -110,4 +118,6 @@
 		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy','Thickness'])
 		md = checkfield(md,'fieldname','inversion.nsteps','numel',[1],'>=',0)
+		md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0.)
+		md = checkfield(md,'fieldname','inversion.epsrel','numel',1,'>',0.)
 		md = checkfield(md,'fieldname','inversion.cost_functions','size',[num_costfunc],'values',[101,102,103,104,105,201,501,502,503,504,505])
 		md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices,num_costfunc],'>=',0)
@@ -133,4 +143,6 @@
 		WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean')
 		WriteData(fid,'object',self,'class','inversion','fieldname','nsteps','format','Integer')
+		WriteData(fid,'object',obj,'class','inversion','fieldname','dxmin','format','Double')
+		WriteData(fid,'object',obj,'class','inversion','fieldname','epsrel','format','Double')
 		WriteData(fid,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1)
 		WriteData(fid,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3)
