Index: ../trunk-jpl/src/m/classes/m1qn3inversion.py =================================================================== --- ../trunk-jpl/src/m/classes/m1qn3inversion.py (revision 17908) +++ ../trunk-jpl/src/m/classes/m1qn3inversion.py (revision 17909) @@ -22,6 +22,8 @@ self.incomplete_adjoint = 0 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') self.min_parameters = float('NaN') @@ -59,6 +61,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,'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')) string="%s\n%s"%(string,fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex')) @@ -94,6 +98,10 @@ #several responses can be used: self.cost_functions=101 + #m1qn3 parameters + self.dxmin = 0.1 + self.epsrel = 1e-4 + return self #}}} def checkconsistency(self,md,solution,analyses): # {{{ @@ -109,6 +117,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.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) md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices,num_controls]) @@ -132,6 +142,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',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) WriteData(fid,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3) Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m =================================================================== --- ../trunk-jpl/src/m/classes/m1qn3inversion.m (revision 17908) +++ ../trunk-jpl/src/m/classes/m1qn3inversion.m (revision 17909) @@ -9,6 +9,8 @@ incomplete_adjoint = 0 control_parameters = NaN nsteps = 0 + dxmin = 0; + epsrel = 0; cost_functions = NaN cost_functions_coefficients = NaN min_parameters = NaN @@ -18,6 +20,7 @@ vz_obs = NaN vel_obs = NaN thickness_obs = NaN + end methods function obj = m1qn3inversion(varargin) % {{{ @@ -30,29 +33,33 @@ error('constructor not supported'); 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 % }}} 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']); + if ~IssmConfig('_HAVE_M1QN3_'), + md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']); end num_controls=numel(md.inversion.control_parameters); @@ -63,6 +70,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.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); md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]); @@ -83,6 +92,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,'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'); fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex'); @@ -111,6 +122,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','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); WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);