Index: /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 17917)
+++ /issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 17918)
@@ -30,6 +30,6 @@
 	/*Intermediaries*/
 	long         omode;
-	double       f,dxmin,epsrel; 
-	int          nsteps,maxiter;
+	double       f,dxmin,gttol; 
+	int          maxsteps,maxiter;
 	int          intn,num_controls,solution_type;
 	IssmDouble  *X  = NULL;
@@ -39,9 +39,9 @@
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
 	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
-	femmodel->parameters->FindParam(&nsteps,InversionNstepsEnum);
+	femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
+	femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
 	femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
-	femmodel->parameters->FindParam(&epsrel,InversionEpsrelEnum);
+	femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
 	femmodel->parameters->SetParam(false,SaveResultsEnum);
-	maxiter=nsteps*10;
 
 	/*Initialize M1QN3 parameters*/
@@ -60,5 +60,5 @@
 
 	/*Optimization criterions*/
-	long      niter        = long(nsteps); /*Maximum number of iterations*/
+	long      niter        = long(maxsteps); /*Maximum number of iterations*/
 	long      nsim         = long(maxiter);/*Maximum number of function calls*/
 
@@ -90,5 +90,5 @@
 	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
 				&n,X,&f,G,&dxmin,&f1,
-				&epsrel,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
+				&gttol,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
 				&reverse,&indic,izs,rzs,(void*)femmodel);
 
Index: /issm/trunk-jpl/src/c/cores/controltao_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controltao_core.cpp	(revision 17917)
+++ /issm/trunk-jpl/src/c/cores/controltao_core.cpp	(revision 17918)
@@ -26,8 +26,10 @@
 	int                 ierr;
 	int                 num_controls,solution_type;
-	int                 nsteps,maxiter;
+	int                 maxsteps,maxiter;
+	IssmDouble          fatol,frtol,gatol,grtol,gttol;
 	AppCtx              user;
 	TaoSolver           tao = 0;
 	int                *control_list = NULL;
+	char               *algorithm    = NULL;
 	Vector<IssmDouble> *X            = NULL;
 	Vector<IssmDouble> *G            = NULL;
@@ -45,7 +47,13 @@
 	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
 	femmodel->parameters->FindParam(&control_list,NULL,InversionControlParametersEnum);
-	femmodel->parameters->FindParam(&nsteps,InversionNstepsEnum);
+	femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
+	femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
+	femmodel->parameters->FindParam(&fatol,InversionFatolEnum);
+	femmodel->parameters->FindParam(&frtol,InversionFrtolEnum);
+	femmodel->parameters->FindParam(&gatol,InversionGatolEnum);
+	femmodel->parameters->FindParam(&grtol,InversionGrtolEnum);
+	femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
+	femmodel->parameters->FindParam(&algorithm,InversionAlgorithmEnum);
 	femmodel->parameters->SetParam(false,SaveResultsEnum);
-	maxiter=nsteps*10;
 
 	/*Prepare Toolkit*/
@@ -56,13 +64,11 @@
 	if(VerboseControl()) _printf0_("   Initializing the Toolkit for Advanced Optimization (TAO)\n");
 	TaoSetFromOptions(tao);
-	TaoSetType(tao,"tao_blmvm");
-	//TaoSetType(tao,"tao_cg");
-	//TaoSetType(tao,"tao_lmvm");
+	TaoSetType(tao,algorithm);
 
 	/*Prepare all TAO parameters*/
 	TaoSetMonitor(tao,IssmMonitor,&user,NULL);
 	TaoSetMaximumFunctionEvaluations(tao,maxiter);
-	TaoSetMaximumIterations(tao,nsteps);
-	TaoSetTolerances(tao,0.,0.,0.,0.,0.);
+	TaoSetMaximumIterations(tao,maxsteps);
+	TaoSetTolerances(tao,fatol,frtol,gatol,grtol,gttol);
 
 	GetVectorFromControlInputsx(&X, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
@@ -101,4 +107,5 @@
 	/*Clean up and return*/
 	xDelete<int>(control_list);
+	xDelete<char>(algorithm);
 	xDelete<double>(user.J);
 	delete X;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 17917)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 17918)
@@ -30,5 +30,4 @@
 		parameters->AddObject(iomodel->CopyConstantObject(InversionNumControlParametersEnum));
 		parameters->AddObject(iomodel->CopyConstantObject(InversionNumCostFunctionsEnum));
-		parameters->AddObject(iomodel->CopyConstantObject(InversionNstepsEnum));
 		parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
 
@@ -50,4 +49,5 @@
 		switch(inversiontype){
 			case 0:/*Brent Search*/
+				parameters->AddObject(iomodel->CopyConstantObject(InversionNstepsEnum));
 				parameters->AddObject(iomodel->CopyConstantObject(InversionCostFunctionThresholdEnum));
 				iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum);
@@ -59,8 +59,18 @@
 				break;
 			case 1:/*TAO*/
+				parameters->AddObject(iomodel->CopyConstantObject(InversionFatolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionFrtolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionGatolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionGrtolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionAlgorithmEnum));
 				break;
 			case 2:/*M1QN3*/
 				parameters->AddObject(iomodel->CopyConstantObject(InversionDxminEnum));
-				parameters->AddObject(iomodel->CopyConstantObject(InversionEpsrelEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
 				break;
 			default:
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17917)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17918)
@@ -142,7 +142,7 @@
 	InversionMaxstepsEnum,
 	InversionFatolEnum,
-	InversionFgtolEnum,
+	InversionFrtolEnum,
 	InversionGatolEnum,
-	InversionGgtolEnum,
+	InversionGrtolEnum,
 	InversionGttolEnum,
 	InversionAlgorithmEnum,
@@ -150,5 +150,4 @@
 	InversionNstepsEnum,
 	InversionDxminEnum,
-	InversionEpsrelEnum,
 	InversionNumControlParametersEnum,
 	InversionNumCostFunctionsEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17917)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17918)
@@ -150,7 +150,7 @@
 		case InversionMaxstepsEnum : return "InversionMaxsteps";
 		case InversionFatolEnum : return "InversionFatol";
-		case InversionFgtolEnum : return "InversionFgtol";
+		case InversionFrtolEnum : return "InversionFrtol";
 		case InversionGatolEnum : return "InversionGatol";
-		case InversionGgtolEnum : return "InversionGgtol";
+		case InversionGrtolEnum : return "InversionGrtol";
 		case InversionGttolEnum : return "InversionGttol";
 		case InversionAlgorithmEnum : return "InversionAlgorithm";
@@ -158,5 +158,4 @@
 		case InversionNstepsEnum : return "InversionNsteps";
 		case InversionDxminEnum : return "InversionDxmin";
-		case InversionEpsrelEnum : return "InversionEpsrel";
 		case InversionNumControlParametersEnum : return "InversionNumControlParameters";
 		case InversionNumCostFunctionsEnum : return "InversionNumCostFunctions";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17917)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17918)
@@ -153,7 +153,7 @@
 	      else if (strcmp(name,"InversionMaxsteps")==0) return InversionMaxstepsEnum;
 	      else if (strcmp(name,"InversionFatol")==0) return InversionFatolEnum;
-	      else if (strcmp(name,"InversionFgtol")==0) return InversionFgtolEnum;
+	      else if (strcmp(name,"InversionFrtol")==0) return InversionFrtolEnum;
 	      else if (strcmp(name,"InversionGatol")==0) return InversionGatolEnum;
-	      else if (strcmp(name,"InversionGgtol")==0) return InversionGgtolEnum;
+	      else if (strcmp(name,"InversionGrtol")==0) return InversionGrtolEnum;
 	      else if (strcmp(name,"InversionGttol")==0) return InversionGttolEnum;
 	      else if (strcmp(name,"InversionAlgorithm")==0) return InversionAlgorithmEnum;
@@ -161,5 +161,4 @@
 	      else if (strcmp(name,"InversionNsteps")==0) return InversionNstepsEnum;
 	      else if (strcmp(name,"InversionDxmin")==0) return InversionDxminEnum;
-	      else if (strcmp(name,"InversionEpsrel")==0) return InversionEpsrelEnum;
 	      else if (strcmp(name,"InversionNumControlParameters")==0) return InversionNumControlParametersEnum;
 	      else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
@@ -260,9 +259,9 @@
 	      else if (strcmp(name,"RiftsRiftstruct")==0) return RiftsRiftstructEnum;
 	      else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
+	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
-	      else if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum;
+	      if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum;
 	      else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
@@ -383,9 +382,9 @@
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
 	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
+	      else if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
-	      else if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
+	      if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
 	      else if (strcmp(name,"MeshdeformationAnalysis")==0) return MeshdeformationAnalysisEnum;
 	      else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
@@ -506,9 +505,9 @@
 	      else if (strcmp(name,"QmuVyMesh")==0) return QmuVyMeshEnum;
 	      else if (strcmp(name,"QmuVzMesh")==0) return QmuVzMeshEnum;
+	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
-	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
+	      if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
 	      else if (strcmp(name,"SegmentOnIceShelf")==0) return SegmentOnIceShelfEnum;
 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
@@ -629,9 +628,9 @@
 	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
 	      else if (strcmp(name,"MaxVy")==0) return MaxVyEnum;
+	      else if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum;
-	      else if (strcmp(name,"MinVz")==0) return MinVzEnum;
+	      if (strcmp(name,"MinVz")==0) return MinVzEnum;
 	      else if (strcmp(name,"MaxVz")==0) return MaxVzEnum;
 	      else if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum;
Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17917)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 17918)
@@ -9,7 +9,8 @@
 		incomplete_adjoint          = 0
 		control_parameters          = NaN
-		nsteps                      = 0
+		maxsteps                    = 0
+		maxiter                     = 0
 		dxmin                       = 0;
-		epsrel                      = 0;
+		gttol                       = 0;
 		cost_functions              = NaN
 		cost_functions_coefficients = NaN
@@ -43,13 +44,14 @@
 			self.control_parameters={'FrictionCoefficient'};
 
-			%number of steps in the control methods
-			self.nsteps=20;
+			%number of iterations
+			self.maxsteps=20;
+			self.maxiter=40;
 
 			%several responses can be used:
-			self.cost_functions=101*ones(self.nsteps,1);
+			self.cost_functions=101;
 
 			%m1qn3 parameters
 			self.dxmin  = 0.1;
-			self.epsrel = 1e-4;
+			self.gttol = 1e-4;
 
 		end % }}}
@@ -70,7 +72,8 @@
 			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.maxsteps','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.maxiter','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.gttol','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);
@@ -92,7 +95,8 @@
 			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,'maxsteps','maximum number of iterations (gradient computation)');
+			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
 			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,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
 			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');
@@ -122,7 +126,8 @@
 			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','maxsteps','format','Integer');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','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','gttol','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 17917)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 17918)
@@ -22,7 +22,8 @@
 			self.incomplete_adjoint          = 0
 			self.control_parameters          = float('NaN')
-			self.nsteps                      = 0
+			self.maxsteps                    = 0
+			self.maxiter                     = 0
 			self.dxmin                       = 0.
-			self.epsrel                      = 0.
+			self.gttol                       = 0.
 			self.cost_functions              = float('NaN')
 			self.cost_functions_coefficients = float('NaN')
@@ -43,5 +44,5 @@
 			self.incomplete_adjoint          = inv.incomplete_adjoint
 			self.control_parameters          = inv.control_parameters
-			self.nsteps                      = inv.nsteps
+			self.maxsteps                    = inv.nsteps
 			self.cost_functions              = inv.cost_functions
 			self.cost_functions_coefficients = inv.cost_functions_coefficients
@@ -61,7 +62,8 @@
 		string="%s\n%s"%(string,fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity'))
 		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,'maxsteps','maximum number of iterations (gradient computation)'))
+		string="%s\n%s"%(string,fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)'))
 		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,'gttol','||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)'))
 		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'))
@@ -93,6 +95,7 @@
 		self.control_parameters='FrictionCoefficient'
 
-		#number of steps in the control methods
-		self.nsteps=20
+		#number of iterations
+		self.maxsteps=20
+		self.maxiter=40
 
 		#several responses can be used:
@@ -101,5 +104,5 @@
 		#m1qn3 parameters
 		self.dxmin  = 0.1
-		self.epsrel = 1e-4
+		self.gttol = 1e-4
 
 		return self
@@ -117,7 +120,8 @@
 		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','Thickness'])
-		md = checkfield(md,'fieldname','inversion.nsteps','numel',[1],'>=',0)
+		md = checkfield(md,'fieldname','inversion.maxsteps','numel',[1],'>=',0)
+		md = checkfield(md,'fieldname','inversion.maxiter','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.gttol','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)
@@ -142,7 +146,8 @@
 			return
 		WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean')
-		WriteData(fid,'object',self,'class','inversion','fieldname','nsteps','format','Integer')
+		WriteData(fid,'object',self,'class','inversion','fieldname','maxsteps','format','Integer')
+		WriteData(fid,'object',self,'class','inversion','fieldname','maxiter','format','Integer')
 		WriteData(fid,'object',self,'class','inversion','fieldname','dxmin','format','Double')
-		WriteData(fid,'object',self,'class','inversion','fieldname','epsrel','format','Double')
+		WriteData(fid,'object',self,'class','inversion','fieldname','gttol','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)
Index: /issm/trunk-jpl/src/m/classes/taoinversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/taoinversion.m	(revision 17917)
+++ /issm/trunk-jpl/src/m/classes/taoinversion.m	(revision 17918)
@@ -9,5 +9,12 @@
 		incomplete_adjoint          = 0
 		control_parameters          = NaN
-		nsteps                      = 0
+		maxsteps                    = 0
+		maxiter                     = 0
+		fatol                       = 0
+		frtol                       = 0
+		gatol                       = 0
+		grtol                       = 0
+		gttol                       = 0
+		algorithm                   = ''
 		cost_functions              = NaN
 		cost_functions_coefficients = NaN
@@ -26,21 +33,5 @@
 					obj=setdefaultparameters(obj);
 				case 1
-					if isa(varargin{1},'inversion'),
-						disp('converting inversion to taoinversion');
-						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
+					obj=structtoobj(obj,varargin{1});
 				otherwise
 					error('constructor not supported');
@@ -56,9 +47,20 @@
 			obj.control_parameters={'FrictionCoefficient'};
 
-			%number of steps in the control methods
-			obj.nsteps=20;
+			%number of iterations and steps
+			obj.maxsteps=20;
+			obj.maxiter =30;
+
+			%default tolerances
+			obj.fatol = 0;
+			obj.frtol = 0;
+			obj.gatol = 0;
+			obj.grtol = 0;
+			obj.gttol = 1e-4;
+
+			%minimization algorithm
+			obj.algorithm = 'tao_blmvm';
 
 			%several responses can be used:
-			obj.cost_functions=101*ones(obj.nsteps,1);
+			obj.cost_functions=101;
 
 		end % }}}
@@ -79,5 +81,12 @@
 			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.maxsteps','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.fatol','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.frtol','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.gatol','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.grtol','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>=',0);
+			md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm'});
 			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);
@@ -99,5 +108,12 @@
 			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,'maxsteps','maximum number of iterations (gradient computation)');
+			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
+			fielddisplay(obj,'fatol','convergence criterion: f(X)-f(X*) (X: current iteration, X*: "true" solution, f: cost function)');
+			fielddisplay(obj,'frtol','convergence criterion: |f(X)-f(X*)|/|f(X*)|');
+			fielddisplay(obj,'gatol','convergence criterion: ||g(X)|| (g: gradient of the cost function)');
+			fielddisplay(obj,'grtol','convergence criterion: ||g(X)||/|f(X)|');
+			fielddisplay(obj,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
+			fielddisplay(obj,'algorithm','minimization algorithm: ''tao_blmvm'', ''tao_cg'', ''tao_lmvm''');
 			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');
@@ -127,5 +143,12 @@
 			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','maxsteps','format','Integer');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','fatol','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','frtol','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','gatol','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','grtol','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','gttol','format','Double');
+			WriteData(fid,'object',obj,'class','inversion','fieldname','algorithm','format','String');
 			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/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17917)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17918)
@@ -142,7 +142,7 @@
 def InversionMaxstepsEnum(): return StringToEnum("InversionMaxsteps")[0]
 def InversionFatolEnum(): return StringToEnum("InversionFatol")[0]
-def InversionFgtolEnum(): return StringToEnum("InversionFgtol")[0]
+def InversionFrtolEnum(): return StringToEnum("InversionFrtol")[0]
 def InversionGatolEnum(): return StringToEnum("InversionGatol")[0]
-def InversionGgtolEnum(): return StringToEnum("InversionGgtol")[0]
+def InversionGrtolEnum(): return StringToEnum("InversionGrtol")[0]
 def InversionGttolEnum(): return StringToEnum("InversionGttol")[0]
 def InversionAlgorithmEnum(): return StringToEnum("InversionAlgorithm")[0]
@@ -150,5 +150,4 @@
 def InversionNstepsEnum(): return StringToEnum("InversionNsteps")[0]
 def InversionDxminEnum(): return StringToEnum("InversionDxmin")[0]
-def InversionEpsrelEnum(): return StringToEnum("InversionEpsrel")[0]
 def InversionNumControlParametersEnum(): return StringToEnum("InversionNumControlParameters")[0]
 def InversionNumCostFunctionsEnum(): return StringToEnum("InversionNumCostFunctions")[0]
Index: sm/trunk-jpl/src/m/enum/InversionEpsrelEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionEpsrelEnum.m	(revision 17917)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=InversionEpsrelEnum()
-%INVERSIONEPSRELENUM - Enum of InversionEpsrel
-%
-%   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=InversionEpsrelEnum()
-
-macro=StringToEnum('InversionEpsrel');
Index: sm/trunk-jpl/src/m/enum/InversionFgtolEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionFgtolEnum.m	(revision 17917)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=InversionFgtolEnum()
-%INVERSIONFGTOLENUM - Enum of InversionFgtol
-%
-%   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=InversionFgtolEnum()
-
-macro=StringToEnum('InversionFgtol');
Index: /issm/trunk-jpl/src/m/enum/InversionFrtolEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionFrtolEnum.m	(revision 17918)
+++ /issm/trunk-jpl/src/m/enum/InversionFrtolEnum.m	(revision 17918)
@@ -0,0 +1,11 @@
+function macro=InversionFrtolEnum()
+%INVERSIONFRTOLENUM - Enum of InversionFrtol
+%
+%   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=InversionFrtolEnum()
+
+macro=StringToEnum('InversionFrtol');
Index: sm/trunk-jpl/src/m/enum/InversionGgtolEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionGgtolEnum.m	(revision 17917)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=InversionGgtolEnum()
-%INVERSIONGGTOLENUM - Enum of InversionGgtol
-%
-%   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=InversionGgtolEnum()
-
-macro=StringToEnum('InversionGgtol');
Index: /issm/trunk-jpl/src/m/enum/InversionGrtolEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/InversionGrtolEnum.m	(revision 17918)
+++ /issm/trunk-jpl/src/m/enum/InversionGrtolEnum.m	(revision 17918)
@@ -0,0 +1,11 @@
+function macro=InversionGrtolEnum()
+%INVERSIONGRTOLENUM - Enum of InversionGrtol
+%
+%   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=InversionGrtolEnum()
+
+macro=StringToEnum('InversionGrtol');
