Changeset 13023 for issm/trunk-jpl/src/m/classes/inversion.py
- Timestamp:
- 08/13/12 15:52:22 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/inversion.py
r12958 r13023 1 1 #module imports 2 import numpy 2 3 from fielddisplay import fielddisplay 4 from EnumDefinitions import * 5 from checkfield import * 6 from WriteData import * 3 7 4 8 class inversion(object): 9 """ 10 INVERSION class definition 11 12 Usage: 13 inversion=inversion(); 14 """ 15 5 16 #properties 6 17 def __init__(self): … … 26 37 self.thickness_obs = float('NaN') 27 38 #}}} 28 def __repr__( obj):39 def __repr__(self): 29 40 # {{{ Display 30 41 string='\n Inversion parameters:' 31 string="%s\n%s"%(string,fielddisplay( obj,'iscontrol','is inversion activated?'))32 string="%s\n%s"%(string,fielddisplay( obj,'incomplete_adjoint','do we assume linear viscosity?'))33 string="%s\n%s"%(string,fielddisplay( obj,'control_parameters','parameter where inverse control is carried out; ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'))34 string="%s\n%s"%(string,fielddisplay( obj,'nsteps','number of optimization searches'))35 string="%s\n%s"%(string,fielddisplay( obj,'cost_functions','indicate the type of response for each optimization step'))36 string="%s\n%s"%(string,fielddisplay( obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'))37 string="%s\n%s"%(string,fielddisplay( obj,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied'))38 string="%s\n%s"%(string,fielddisplay( obj,'maxiter_per_step','maximum iterations during each optimization step'))39 string="%s\n%s"%(string,fielddisplay( obj,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step'))40 string="%s\n%s"%(string,fielddisplay( obj,'step_threshold','decrease threshold for misfit, default is 30%'))41 string="%s\n%s"%(string,fielddisplay( obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex'))42 string="%s\n%s"%(string,fielddisplay( obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex'))43 string="%s\n%s"%(string,fielddisplay( obj,'gradient_only','stop control method solution at gradient'))44 string="%s\n%s"%(string,fielddisplay( obj,'vx_obs','observed velocity x component [m/a]'))45 string="%s\n%s"%(string,fielddisplay( obj,'vy_obs','observed velocity y component [m/a]'))46 string="%s\n%s"%(string,fielddisplay( obj,'vel_obs','observed velocity magnitude [m/a]'))47 string="%s\n%s"%(string,fielddisplay( obj,'thickness_obs','observed thickness [m]'))42 string="%s\n%s"%(string,fielddisplay(self,'iscontrol','is inversion activated?')) 43 string="%s\n%s"%(string,fielddisplay(self,'incomplete_adjoint','do we assume linear viscosity?')) 44 string="%s\n%s"%(string,fielddisplay(self,'control_parameters','parameter where inverse control is carried out; ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}')) 45 string="%s\n%s"%(string,fielddisplay(self,'nsteps','number of optimization searches')) 46 string="%s\n%s"%(string,fielddisplay(self,'cost_functions','indicate the type of response for each optimization step')) 47 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')) 48 string="%s\n%s"%(string,fielddisplay(self,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied')) 49 string="%s\n%s"%(string,fielddisplay(self,'maxiter_per_step','maximum iterations during each optimization step')) 50 string="%s\n%s"%(string,fielddisplay(self,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step')) 51 string="%s\n%s"%(string,fielddisplay(self,'step_threshold','decrease threshold for misfit, default is 30%')) 52 string="%s\n%s"%(string,fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex')) 53 string="%s\n%s"%(string,fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex')) 54 string="%s\n%s"%(string,fielddisplay(self,'gradient_only','stop control method solution at gradient')) 55 string="%s\n%s"%(string,fielddisplay(self,'vx_obs','observed velocity x component [m/a]')) 56 string="%s\n%s"%(string,fielddisplay(self,'vy_obs','observed velocity y component [m/a]')) 57 string="%s\n%s"%(string,fielddisplay(self,'vel_obs','observed velocity magnitude [m/a]')) 58 string="%s\n%s"%(string,fielddisplay(self,'thickness_obs','observed thickness [m]')) 48 59 string="%s\n%s"%(string,'Available cost functions:') 49 60 string="%s\n%s"%(string,' 101: SurfaceAbsVelMisfit') … … 59 70 #}}} 60 71 61 def setdefaultparameters( obj):72 def setdefaultparameters(self): 62 73 # {{{setdefaultparameters 63 74 64 75 #default is incomplete adjoint for now 65 obj.incomplete_adjoint=176 self.incomplete_adjoint=1 66 77 67 78 #parameter to be inferred by control methods (only 68 79 #drag and B are supported yet) 69 obj.control_parameters=['FrictionCoefficient']80 self.control_parameters=['FrictionCoefficient'] 70 81 71 82 #number of steps in the control methods 72 obj.nsteps=2083 self.nsteps=20 73 84 74 85 #maximum number of iteration in the optimization algorithm for 75 86 #each step 76 obj.maxiter_per_step=20*ones(obj.nsteps)87 self.maxiter_per_step=20*ones(self.nsteps) 77 88 78 89 #the inversed parameter is updated as follows: … … 81 92 #inversed parameter (10^8 for B, 50 for drag) and can be decreased 82 93 #after the first iterations 83 obj.gradient_scaling=50*ones(obj.nsteps)94 self.gradient_scaling=50*ones(self.nsteps) 84 95 85 96 #several responses can be used: 86 obj.cost_functions=101*ones(obj.nsteps)97 self.cost_functions=101*ones(self.nsteps) 87 98 88 99 #step_threshold is used to speed up control method. When 89 #misfit(1)/misfit(0) < obj.step_threshold, we go directly to100 #misfit(1)/misfit(0) < self.step_threshold, we go directly to 90 101 #the next step 91 obj.step_threshold=.7*ones(obj.nsteps) #30 per cent decrement102 self.step_threshold=.7*ones(self.nsteps) #30 per cent decrement 92 103 93 104 #stop control solution at the gradient computation and return it? 94 obj.gradient_only=0105 self.gradient_only=0 95 106 96 107 #cost_function_threshold is a criteria to stop the control methods. 97 108 #if J[n]-J[n-1]/J[n] < criteria, the control run stops 98 109 #NaN if not applied 99 obj.cost_function_threshold=NaN #not activated110 self.cost_function_threshold=NaN #not activated 100 111 101 return obj102 112 return self 113 #}}} 103 114 115 def checkconsistency(self,md,solution,analyses): # {{{ 104 116 117 #Early return 118 if not self.iscontrol: 119 return md 120 121 num_controls=numpy.size(md.inversion.control_parameters) 122 num_costfunc=numpy.size(md.inversion.cost_functions,1) 123 124 md = checkfield(md,'inversion.iscontrol','values',[0,1]) 125 md = checkfield(md,'inversion.tao','values',[0,1]) 126 md = checkfield(md,'inversion.incomplete_adjoint','values',[0,1]) 127 md = checkfield(md,'inversion.control_parameters','cell',1,'values',['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','Vx','Vy']) 128 md = checkfield(md,'inversion.nsteps','numel',1,'>=',1) 129 md = checkfield(md,'inversion.maxiter_per_step','size',[md.inversion.nsteps],'>=',0) 130 md = checkfield(md,'inversion.step_threshold','size',[md.inversion.nsteps]) 131 md = checkfield(md,'inversion.cost_functions','size',[md.inversion.nsteps,num_costfunc],'values',[101,102,103,104,105,201,501,502,503]) 132 md = checkfield(md,'inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices,num_costfunc],'>=',0) 133 md = checkfield(md,'inversion.gradient_only','values',[0,1]) 134 md = checkfield(md,'inversion.gradient_scaling','size',[md.inversion.nsteps,num_controls]) 135 md = checkfield(md,'inversion.min_parameters','size',[md.mesh.numberofvertices,num_controls]) 136 md = checkfield(md,'inversion.max_parameters','size',[md.mesh.numberofvertices,num_controls]) 137 138 if solution==BalancethicknessSolutionEnum(): 139 md = checkfield(md,'inversion.thickness_obs','size',[md.mesh.numberofvertices],'NaN',1) 140 else: 141 md = checkfield(md,'inversion.vx_obs','size',[md.mesh.numberofvertices],'NaN',1) 142 md = checkfield(md,'inversion.vy_obs','size',[md.mesh.numberofvertices],'NaN',1) 143 144 return md 145 # }}} 146 147 def marshall(self,fid): # {{{ 148 149 WriteData(fid,'object',self,'fieldname','iscontrol','format','Boolean') 150 WriteData(fid,'object',self,'fieldname','tao','format','Boolean') 151 WriteData(fid,'object',self,'fieldname','incomplete_adjoint','format','Boolean') 152 if not self.iscontrol: 153 return 154 WriteData(fid,'object',self,'fieldname','nsteps','format','Integer') 155 WriteData(fid,'object',self,'fieldname','maxiter_per_step','format','DoubleMat','mattype',3) 156 WriteData(fid,'object',self,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1) 157 WriteData(fid,'object',self,'fieldname','gradient_scaling','format','DoubleMat','mattype',3) 158 WriteData(fid,'object',self,'fieldname','cost_function_threshold','format','Double') 159 WriteData(fid,'object',self,'fieldname','min_parameters','format','DoubleMat','mattype',3) 160 WriteData(fid,'object',self,'fieldname','max_parameters','format','DoubleMat','mattype',3) 161 WriteData(fid,'object',self,'fieldname','step_threshold','format','DoubleMat','mattype',3) 162 WriteData(fid,'object',self,'fieldname','gradient_only','format','Boolean') 163 WriteData(fid,'object',self,'fieldname','vx_obs','format','DoubleMat','mattype',1) 164 WriteData(fid,'object',self,'fieldname','vy_obs','format','DoubleMat','mattype',1) 165 WriteData(fid,'object',self,'fieldname','vz_obs','format','DoubleMat','mattype',1) 166 WriteData(fid,'object',self,'fieldname','thickness_obs','format','DoubleMat','mattype',1) 167 168 #process control parameters 169 num_control_parameters=numpy.size(self.control_parameters) 170 data=[StringToEnum(self.control_parameters[i]) for i in xrange(0,num_control_parameters)] 171 WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3) 172 WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer') 173 174 #process cost functions 175 num_cost_functions=size(self.cost_functions,1) 176 data=self.cost_functions 177 data[[i for i,item in enumerate(data) if item==101]]=SurfaceAbsVelMisfitEnum() 178 data[[i for i,item in enumerate(data) if item==102]]=SurfaceRelVelMisfitEnum() 179 data[[i for i,item in enumerate(data) if item==103]]=SurfaceLogVelMisfitEnum() 180 data[[i for i,item in enumerate(data) if item==104]]=SurfaceLogVxVyMisfitEnum() 181 data[[i for i,item in enumerate(data) if item==105]]=SurfaceAverageVelMisfitEnum() 182 data[[i for i,item in enumerate(data) if item==201]]=ThicknessAbsMisfitEnum() 183 data[[i for i,item in enumerate(data) if item==501]]=DragCoefficientAbsGradientEnum() 184 data[[i for i,item in enumerate(data) if item==502]]=RheologyBbarAbsGradientEnum() 185 data[[i for i,item in enumerate(data) if item==503]]=ThicknessAbsGradientEnum() 186 WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3) 187 WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer') 188 # }}} 189
Note:
See TracChangeset
for help on using the changeset viewer.