Ignore:
Timestamp:
08/13/12 15:52:22 (13 years ago)
Author:
jschierm
Message:

NEW: Yet another bunch more python checkconsistency and marshall methods for sub-classes (plus other minor changes).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/inversion.py

    r12958 r13023  
    11#module imports
     2import numpy
    23from fielddisplay import fielddisplay
     4from EnumDefinitions import *
     5from checkfield import *
     6from WriteData import *
    37
    48class inversion(object):
     9        """
     10        INVERSION class definition
     11
     12           Usage:
     13              inversion=inversion();
     14        """
     15
    516        #properties
    617        def __init__(self):
     
    2637                self.thickness_obs               = float('NaN')
    2738                #}}}
    28         def __repr__(obj):
     39        def __repr__(self):
    2940                # {{{ Display
    3041                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]'))
    4859                string="%s\n%s"%(string,'Available cost functions:')
    4960                string="%s\n%s"%(string,'   101: SurfaceAbsVelMisfit')
     
    5970                #}}}
    6071
    61         def setdefaultparameters(obj):
     72        def setdefaultparameters(self):
    6273                # {{{setdefaultparameters
    6374               
    6475                #default is incomplete adjoint for now
    65                 obj.incomplete_adjoint=1
     76                self.incomplete_adjoint=1
    6677
    6778                #parameter to be inferred by control methods (only
    6879                #drag and B are supported yet)
    69                 obj.control_parameters=['FrictionCoefficient']
     80                self.control_parameters=['FrictionCoefficient']
    7081
    7182                #number of steps in the control methods
    72                 obj.nsteps=20
     83                self.nsteps=20
    7384
    7485                #maximum number of iteration in the optimization algorithm for
    7586                #each step
    76                 obj.maxiter_per_step=20*ones(obj.nsteps)
     87                self.maxiter_per_step=20*ones(self.nsteps)
    7788
    7889                #the inversed parameter is updated as follows:
     
    8192                #inversed parameter (10^8 for B, 50 for drag) and can be decreased
    8293                #after the first iterations
    83                 obj.gradient_scaling=50*ones(obj.nsteps)
     94                self.gradient_scaling=50*ones(self.nsteps)
    8495
    8596                #several responses can be used:
    86                 obj.cost_functions=101*ones(obj.nsteps)
     97                self.cost_functions=101*ones(self.nsteps)
    8798
    8899                #step_threshold is used to speed up control method. When
    89                 #misfit(1)/misfit(0) < obj.step_threshold, we go directly to
     100                #misfit(1)/misfit(0) < self.step_threshold, we go directly to
    90101                #the next step
    91                 obj.step_threshold=.7*ones(obj.nsteps) #30 per cent decrement
     102                self.step_threshold=.7*ones(self.nsteps) #30 per cent decrement
    92103
    93104                #stop control solution at the gradient computation and return it?
    94                 obj.gradient_only=0
     105                self.gradient_only=0
    95106
    96107                #cost_function_threshold is a criteria to stop the control methods.
    97108                #if J[n]-J[n-1]/J[n] < criteria, the control run stops
    98109                #NaN if not applied
    99                 obj.cost_function_threshold=NaN #not activated
     110                self.cost_function_threshold=NaN #not activated
    100111
    101                 return obj
    102                 #}}}
     112                return self
     113        #}}}
    103114
     115        def checkconsistency(self,md,solution,analyses):    # {{{
    104116
     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.