Index: /issm/trunk-jpl/src/m/classes/adm1qn3inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/adm1qn3inversion.m	(revision 27765)
+++ /issm/trunk-jpl/src/m/classes/adm1qn3inversion.m	(revision 27766)
@@ -10,4 +10,5 @@
 		maxiter                     = 0
 		dxmin                       = 0
+		dfmin_frac                  = 0
 		gttol                       = 0
 
@@ -38,6 +39,7 @@
 
 			%m1qn3 parameters
-			self.dxmin  = 0.1;
-			self.gttol = 1e-4;
+			self.dxmin      = 0.1;
+			self.dfmin_frac = 1.;
+			self.gttol      = 1e-4;
 
 		end % }}}
@@ -55,4 +57,5 @@
 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+         md = checkfield(md,'fieldname','inversion.dfmin_frac','numel',1,'>=',0., '<=', 1.);
 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
 
@@ -64,4 +67,5 @@
 			fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
 			fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+         fielddisplay(self,'dfmin_frac','expected reduction of J during the first step (e.g., 0.3=30% reduction in cost function)');
 			fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
 		end % }}}
@@ -76,4 +80,5 @@
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dxmin','format','Double');
+         WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dfmin_frac','format','Double');
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','gttol','format','Double');
 
@@ -85,4 +90,5 @@
 			writejsdouble(fid,[modelname '.inversion.maxiter'],self.maxiter);
 			writejsdouble(fid,[modelname '.inversion.dxmin'],self.dxmin);
+         writejsdouble(fid,[modelname '.inversion.dfmin_frac'],self.dfmin_frac);
 			writejsdouble(fid,[modelname '.inversion.gttol'],self.gttol);
 
Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 27765)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 27766)
@@ -13,4 +13,5 @@
 		maxiter                     = 0
 		dxmin                       = 0
+		dfmin_frac                  = 0
 		gttol                       = 0
 		cost_functions              = NaN
@@ -66,6 +67,7 @@
 
 			%m1qn3 parameters
-			self.dxmin  = 0.1;
-			self.gttol = 1e-4;
+			self.dxmin      = 0.1;
+			self.dfmin_frac = 1;
+			self.gttol      = 1e-4;
 
 		end % }}}
@@ -88,4 +90,5 @@
 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+         md = checkfield(md,'fieldname','inversion.dfmin_frac','numel',1,'>=',0,'<=',1);
 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
 			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
@@ -115,4 +118,5 @@
 			fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
 			fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+         fielddisplay(self,'dfmin_frac','expected reduction of J during the first step (e.g., 0.3=30% reduction in cost function)');
 			fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
 			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
@@ -148,4 +152,5 @@
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dxmin','format','Double');
+         WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dfmin_frac','format','Double');
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','gttol','format','Double');
 			WriteData(fid,prefix,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
@@ -184,4 +189,5 @@
 			writejsdouble(fid,[modelname '.inversion.maxiter'],self.maxiter);
 			writejsdouble(fid,[modelname '.inversion.dxmin'],self.dxmin);
+         writejsdouble(fid,[modelname '.inversion.dfmin_frac'],self.dfmin_frac);
 			writejsdouble(fid,[modelname '.inversion.gttol'],self.gttol);
 			writejs2Darray(fid,[modelname '.inversion.cost_functions'],self.cost_functions);
Index: /issm/trunk-jpl/src/m/classes/m1qn3inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 27765)
+++ /issm/trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 27766)
@@ -19,21 +19,22 @@
         if not len(args):
             print('empty init')
-            self.iscontrol = 0
-            self.incomplete_adjoint = 0
-            self.control_parameters = np.nan
-            self.control_scaling_factors = np.nan
-            self.maxsteps = 0
-            self.maxiter = 0
-            self.dxmin = 0.
-            self.gttol = 0.
-            self.cost_functions = np.nan
+            self.iscontrol                   = 0
+            self.incomplete_adjoint          = 0
+            self.control_parameters          = np.nan
+            self.control_scaling_factors     = np.nan
+            self.maxsteps                    = 0
+            self.maxiter                     = 0
+            self.dxmin                       = 0.
+            self.dfmin_frac                  = 0.
+            self.gttol                       = 0.
+            self.cost_functions              = np.nan
             self.cost_functions_coefficients = np.nan
-            self.min_parameters = np.nan
-            self.max_parameters = np.nan
-            self.vx_obs = np.nan
-            self.vy_obs = np.nan
-            self.vz_obs = np.nan
-            self.vel_obs = np.nan
-            self.thickness_obs = np.nan
+            self.min_parameters              = np.nan
+            self.max_parameters              = np.nan
+            self.vx_obs                      = np.nan
+            self.vy_obs                      = np.nan
+            self.vz_obs                      = np.nan
+            self.vel_obs                     = np.nan
+            self.thickness_obs               = np.nan
 
             self.setdefaultparameters()
@@ -71,4 +72,5 @@
         s += '{}\n'.format(fielddisplay(self, 'maxiter', 'maximum number of Function evaluation (forward run)'))
         s += '{}\n'.format(fielddisplay(self, 'dxmin', 'convergence criterion: two points less than dxmin from eachother (sup - norm) are considered identical'))
+        s += '{}\n'.format(fielddisplay(self, 'dfmin_frac', 'expected reduction of J during the first step (e.g., 0.3=30% reduction in cost function)'))
         s += '{}\n'.format(fielddisplay(self, 'gttol', '||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)'))
         s += '{}\n'.format(fielddisplay(self, 'cost_functions', 'indicate the type of response for each optimization step'))
@@ -108,4 +110,5 @@
         #m1qn3 parameters
         self.dxmin = 0.1
+        self.dfmin_frac = 1.
         self.gttol = 1e-4
 
@@ -142,4 +145,5 @@
         md = checkfield(md, 'fieldname', 'inversion.maxiter', 'numel', [1], '>=', 0)
         md = checkfield(md, 'fieldname', 'inversion.dxmin', 'numel', [1], '>', 0.)
+        md = checkfield(md, 'fieldname', 'inversion.dfmin_frac', 'numel', [1], '>=', 0., '<=', 1.)
         md = checkfield(md, 'fieldname', 'inversion.gttol', 'numel', [1], '>', 0.)
         md = checkfield(md, 'fieldname', 'inversion.cost_functions', 'size', [num_costfunc], 'values', supportedcostfunctions())
@@ -169,4 +173,5 @@
         WriteData(fid, prefix, 'object', self, 'class', 'inversion', 'fieldname', 'maxiter', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'inversion', 'fieldname', 'dxmin', 'format', 'Double')
+        WriteData(fid, prefix, 'object', self, 'class', 'inversion', 'fieldname', 'dfmin_frac', 'format', 'Double')
         WriteData(fid, prefix, 'object', self, 'class', 'inversion', 'fieldname', 'gttol', 'format', 'Double')
         WriteData(fid, prefix, 'object', self, 'class', 'inversion', 'fieldname', 'cost_functions_coefficients', 'format', 'DoubleMat', 'mattype', 1)
