source: issm/oecreview/Archive/21724-22754/ISSM-22103-22104.diff@ 22755

Last change on this file since 22755 was 22755, checked in by Mathieu Morlighem, 7 years ago

CHG: added 21724-22754

File size: 10.4 KB
  • ../trunk-jpl/src/m/classes/misfit.py

     
     1import numpy as np
     2from project3d import project3d
     3from pairoptions import *
     4from collections import OrderedDict
     5from fielddisplay import fielddisplay
     6from checkfield import checkfield
     7from WriteData import WriteData
     8
     9
     10class misfit(object):
     11        """
     12        MISFIT class definition
     13
     14        Usage:
     15                misfit=misfit()
     16                misfit=misfit(name='SurfaceAltimetry',
     17                        definitionstring='Outputdefinition1',
     18                        model_string='Surface',
     19                        observation_string='SurfaceObservations',
     20                        observation=md.geometry.surface,
     21                        timeinterpolation='nearestneighbor',
     22                        local=1,
     23                        weights=np.ones((md.mesh.numberofvertices,1)),
     24                        weights_string='WeightsSurfaceObservations')
     25        """
     26
     27        def __init__(self, name = None, definitionstring = None, model_string = None, observation = None, observation_string = None, timeinterpolation = None, local = None, weights = None, weights_string = None, cumulated = None):
     28                # {{{
     29                self.name = name if name is not None else ''
     30
     31                #string that identifies this output definition uniquely, from 'Outputdefinition[1-100]'
     32                self.definitionstring = definitionstring if definitionstring is not None else ''
     33
     34                #string for field that is modeled
     35                self.model_string = model_string if model_string is not None else ''
     36
     37                #observed field that we compare the model against
     38                self.observation = observation if observation is not None else float('NaN')
     39
     40                #string for observed field.
     41                self.observation_string = observation_string if observation_string is not None else ''
     42
     43                self.timeinterpolation = timeinterpolation if timeinterpolation is not None else 'nearestneighbor'
     44
     45                self.local = local if local is not None else 1
     46
     47                #weight coefficients for every vertex
     48                self.weights = weights if weights is not None else float('NaN')
     49
     50                #string to identify this particular set of weights
     51                self.weights_string = weights_string if weights_string is not None else ''
     52
     53                #do we cumulate misfit through time?
     54                self.cumulated = cumulated if cumulated is not None else float('NaN')           
     55                #}}}
     56
     57        def __repr__(self): # {{{
     58                string='   Misfit:'
     59
     60                string="%s\n%s"%(string,fielddisplay(self,'name','identifier for this misfit response'))
     61                string="%s\n%s"%(string,fielddisplay(self,'definitionstring','string that identifies this output definition uniquely, from "Outputdefinition[1-10]"'))
     62                string="%s\n%s"%(string,fielddisplay(self,'model_string','string for field that is modeled'))
     63                string="%s\n%s"%(string,fielddisplay(self,'observation','observed field that we compare the model against'))
     64                string="%s\n%s"%(string,fielddisplay(self,'observation_string','observation string'))
     65                string="%s\n%s"%(string,fielddisplay(self,'local','is the response local to the elements, or global? (default is 1)'))
     66                string="%s\n%s"%(string,fielddisplay(self,'timeinterpolation','interpolation routine used to interpolate misfit between two time steps (default is "nearestneighbor"'))
     67                string="%s\n%s"%(string,fielddisplay(self,'weights','weights (at vertices) to apply to the misfit'))
     68                string="%s\n%s"%(string,fielddisplay(self,'weights_string','string for weights for identification purposes'))
     69                return string
     70                #}}}
     71
     72        def extrude(self,md): # {{{
     73                if not np.any(np.isnan(self.weights)):
     74                        self.weights = project3d(md,'vector',self.weights,'type','node')
     75                if not np.any(np.isnan(self.observation)):
     76                        self.observation = project3d(md,'vector',self.observation,'type','node')
     77                return self
     78        #}}}
     79
     80        def checkconsistency(self,md,solution,analyses):    # {{{
     81                if type(self.name) != str:
     82                        raise TypeError('misfit error message: "name" field should be a string!')
     83
     84                OutputdefinitionStringArray = []
     85                for i in range(100):
     86                        OutputdefinitionStringArray.append('Outputdefinition' + str(i))
     87
     88                md = checkfield(md,'fieldname','self.definitionstring','field',self.definitionstring,'values',OutputdefinitionStringArray)
     89                if type(self.timeinterpolation) != str:
     90                        raise TypeError('misfit error message: "timeinterpolation" field should be a string!')
     91
     92                md = checkfield(md,'fieldname','self.observation','field',self.observation,'timeseries',1,'NaN',1,'Inf',1)
     93                md = checkfield(md,'fieldname','self.timeinterpolation','field',self.timeinterpolation,'values',['nearestneighbor'])
     94                md = checkfield(md,'fieldname','self.weights','field',self.weights,'timeseries',1,'NaN',1,'Inf',1)
     95
     96                return md
     97        # }}}
     98
     99        def marshall(self,prefix,md,fid):    #  {{{
     100                WriteData(fid,prefix,'data',self.name,'name','md.misfit.name','format','String')
     101                WriteData(fid,prefix,'data',self.definitionstring,'name','md.misfit.definitionstring','format','String')
     102                WriteData(fid,prefix,'data',self.model_string,'name','md.misfit.model_string','format','String')
     103                WriteData(fid,prefix,'data',self.observation,'name','md.misfit.observation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
     104                WriteData(fid,prefix,'data',self.observation_string,'name','md.misfit.observation_string','format','String')
     105                WriteData(fid,prefix,'data',self.local,'name','md.misfit.local','format','Integer')
     106                WriteData(fid,prefix,'data',self.timeinterpolation,'name','md.misfit.timeinterpolation','format','String')
     107                WriteData(fid,prefix,'data',self.weights,'name','md.misfit.weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
     108                WriteData(fid,prefix,'data',self.weights_string,'name','md.misfit.weights_string','format','String')
     109        # }}}
  • ../trunk-jpl/test/NightlyRun/test123.py

     
     1#Test Name: SquareShelfConstrainedTranMisfitSurface
     2from model import *
     3from socket import gethostname
     4from triangle import *
     5from setmask import *
     6from parameterize import *
     7from setflowequation import *
     8from solve import *
     9from misfit import *
     10
     11
     12md=triangle(model(),'../Exp/Square.exp',180000)
     13md=setmask(md,'all','')
     14md=parameterize(md,'../Par/SquareShelfConstrained.py')
     15md=setflowequation(md,'SSA','all')
     16md.cluster=generic('name',gethostname(),'np',3)
     17
     18fake_surface = np.vstack((np.append(np.array(md.geometry.surface)+100,1.1),
     19                np.append(np.array(md.geometry.surface)+200,2.1),
     20                np.append(np.array(md.geometry.surface)+300,2.5))).T
     21
     22md.transient.requested_outputs = ['default','SurfaceMisfit']
     23md.outputdefinition.definitions = [misfit(
     24                name='SurfaceMisfit',
     25                definitionstring='Outputdefinition1',
     26                model_string='Surface',
     27                observation=fake_surface,
     28                observation_string='SurfaceObservation',
     29                timeinterpolation='nearestneighbor',
     30                weights=np.ones((md.mesh.numberofvertices,1)),
     31                weights_string='WeightsSurfaceObservation'
     32                )]
     33
     34md=solve(md,'Transient')
     35
     36#Fields and tolerances to track changes
     37field_names = ['SurfaceMisfitFirstStep','SurfaceMisfitSecondStep','SurfaceMisfitThirdStep']
     38field_tolerances = [1e-13,1e-13,1e-13]
     39field_values = [
     40        md.results.TransientSolution[0].SurfaceMisfit,
     41        md.results.TransientSolution[1].SurfaceMisfit,
     42        md.results.TransientSolution[2].SurfaceMisfit
     43        ]
  • ../trunk-jpl/test/NightlyRun/test124.py

     
     1#Test Name: SquareShelfConstrainedTranFSFreeSurface
     2from model import *
     3from socket import gethostname
     4from triangle import *
     5from setmask import *
     6from parameterize import *
     7from setflowequation import *
     8from solve import *
     9
     10md=triangle(model(),'../Exp/Square.exp',150000)
     11md=setmask(md,'all','')
     12md=parameterize(md,'../Par/SquareShelfConstrained.py')
     13md.extrude(3,1)
     14md=setflowequation(md,'FS','all')
     15
     16#Free surface
     17md.masstransport.isfreesurface = 1
     18md.timestepping.time_step = 0.00001
     19md.timestepping.final_time = 0.00005
     20
     21#Go solve
     22md.cluster=generic('name',gethostname(),'np',3)
     23md=solve(md,'Transient')
     24
     25#Fields and tolerances to track changes
     26field_names      = [
     27        'Vx1','Vy1','Vel1','Pressure1','Bed1','Surface1','Thickness1',
     28        'Vx2','Vy2','Vel2','Pressure2','Bed2','Surface2','Thickness2',
     29        'Vx3','Vy3','Vel3','Pressure3','Bed3','Surface3','Thickness3']
     30field_tolerances = [
     31        2e-09,3e-9,3e-9,3e-9,1e-13,1e-12,1e-12,
     32        2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10,
     33        2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10]
     34field_values = [
     35        md.results.TransientSolution[0].Vx,
     36        md.results.TransientSolution[0].Vy,
     37        md.results.TransientSolution[0].Vel,
     38        md.results.TransientSolution[0].Pressure,
     39        md.results.TransientSolution[0].Base,
     40        md.results.TransientSolution[0].Surface,
     41        md.results.TransientSolution[0].Thickness,
     42        md.results.TransientSolution[1].Vx,
     43        md.results.TransientSolution[1].Vy,
     44        md.results.TransientSolution[1].Vel,
     45        md.results.TransientSolution[1].Pressure,
     46        md.results.TransientSolution[1].Base,
     47        md.results.TransientSolution[1].Surface,
     48        md.results.TransientSolution[1].Thickness,
     49        md.results.TransientSolution[2].Vx,
     50        md.results.TransientSolution[2].Vy,
     51        md.results.TransientSolution[2].Vel,
     52        md.results.TransientSolution[2].Pressure,
     53        md.results.TransientSolution[2].Base,
     54        md.results.TransientSolution[2].Surface,
     55        md.results.TransientSolution[2].Thickness,
     56        ]
  • ../trunk-jpl/test/NightlyRun/runme.py

     
    179179                                                #compare to archive
    180180                                                # Matlab uses base 1, so use base 1 in labels
    181181                                                archive=np.array(archread(archive_file,archive_name+'_field'+str(k+1)))
    182                                                 if archive == None:
     182                                                #Because np.array is weird (str(np.array(None)) becomes 'None' but np.array(None) is never equal to None, it basically becomes a type of string in an array):
     183                                                if str(archive) == 'None':
    183184                                                        raise NameError("Field name '"+archive_name+'_field'+str(k+1)+"' does not exist in archive file.")
    184185                                                error_diff=np.amax(np.abs(archive-field),axis=0)/(np.amax(np.abs(archive),axis=0)+float_info.epsilon)
    185186                                                if not np.isscalar(error_diff): error_diff=error_diff[0]
Note: See TracBrowser for help on using the repository browser.