/[escript]/trunk/modellib/py_src/probe.py
ViewVC logotype

Diff of /trunk/modellib/py_src/probe.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/esys2/modellib/py_src/probe.py revision 144 by jgs, Mon Jul 25 05:42:21 2005 UTC trunk/modellib/py_src/probe.py revision 155 by jgs, Wed Nov 9 02:02:19 2005 UTC
# Line 1  Line 1 
1  # $Id$  # $Id$
2    
3    from esys.escript.modelframe import Model,ParameterSet
4    from esys.escript.escript import Data
5    from esys.escript.util import *
6    
7    
8    class EvaluateExpression(ParameterSet):
9           """
10           Return the evaluation of an expression at current time t and
11           locations in the domain
12    
13           @warning: this class use python's eval function!!!!!
14                     Please use input.InterpolateOverBox is possible!!!!
15           @ivar expression (in): expression or list of expressions defining
16                     expression value
17           @ivar out (callable): current value of the expression
18           """
19    
20  from esys.modelframe import Model         def __init__(self,debug=False):
21  from esys.escript import inf,sup,Lsup             """
22               Set up parameters
23               """
24               ParameterSet.__init__(self,debug=debug)
25               self.declareParameter(domain=None, \
26                                     t=0., \
27                                     expression="x[0]")
28    
29           def out(self):
30             x=self.domain.getX()
31             t=self.t
32             if isinstance(self.expression,str):
33               out=eval(self.expression)
34             else:
35               out=Data(0,(len(self.expression),),x.getFunctionSpace())
36               for i in range(len(self.expression)): out[i]=eval(self.expression[i])
37             return out
38    
39  class Probe(Model):  class Probe(Model):
40         """@brief tests values against a reference which may depend on time and spatial coordinates         """
41                   it prints out the relative error in each time step and the maximum relative error over         Tests values against a expression which may depend on time and spatial
42                   all time steps at the end         coordinates.
43          
44             WARNING: this class use python's eval function!!!!!         It prints out the relative error in each time step and the maximum
45           relative error over all time steps at the end.
46            @param value (in) - values to be tested  
47            @param reference (in) - expressions defining reference values to test against. If None only value is reported.         @warning: this class use python's eval function!!!!!
48            @param line_tag (in) - tag to be used when printing error         @ivar value (in): values to be tested
49            @param max_error (out) - maximum error         @ivar expression (in): expressions defining expression values to test against. If None only value is reported.
50            @param t_max (out) - time of maximum error         @ivar line_tag (in): tag to be used when printing error
51           @ivar t (in): current time
52           @ivar max_error (out): maximum error
53           @ivar t_max (out): time of maximum error
54    
55          """         """
56    
57         def __init__(self,debug=False):         def __init__(self,debug=False):
58             """set up parameters"""             """
59               Set up parameters
60               """
61             Model.__init__(self,debug=debug)             Model.__init__(self,debug=debug)
62             self.declareParameter(reference=None, \             self.declareParameter(expression=None, \
63                                   value=0., \                                   value=0., \
64                                     t=0., \
65                                   line_tag="PROBE")                                   line_tag="PROBE")
66    
67         def doInitialization(self,t):         def doInitialization(self):
68             """initializes values"""             """
69             self.__tn=t             Initializes values
70               """
71             self.t_max=None             self.t_max=None
72             self.max_err=0.             self.max_error=0.
73    
74         def doStep(self,dt):         def doStepPostprocessing(self,dt):
75              t=self.__tn+dt              t=self.t
76              print "%s : time %d"%t              print "%s : time %e"%(self.line_tag,t)
77              v=self.value              v=self.value
78              x=v.getFunctionSpace().getX()              x=v.getFunctionSpace().getX()
79              if v.getRank()==0:              if v.getRank()==0:
80                if self.reference==None:                if self.expression==None:
81                   print "%s :   (min,max)= (%e,%e)"%(self.line_tag,inf(v),max(v))                   print "%s : true (min,max)= (%e,%e)"%(self.line_tag,inf(v),sub(v))
82                else:                else:
83                  ref=eval(self.reference)                  ref=eval(self.expression)
84                  err=Lsup(v-ref)/Lsup(ref)                  err=Lsup(v-ref)/Lsup(ref)
85                  print "%s :   (min,max,rel error)= (%e,%e,%e)"%(self.line_tag,inf(v),max(v),err)                  print "%s : true (min,max)= (%e,%e)"%(self.line_tag,inf(ref),sup(ref))
86                    print "%s : (min,max,rel error)= (%e,%e,%e)"%(self.line_tag,inf(v),sup(v),err)
87              else:              else:
88                err=0                err=0
89                for i in range(v.getRank()):                for i in range(v.getRank()):
90                   vi=v[i]                   vi=v[i]
91                   if self.reference==None:                   if self.expression==None:
92                      print "%s :   component %d (min,max)= (%e,%e)"%(self.line_tag,i,inf(vi),max(vi))                      print "%s :   component %d: true (min,max)= (%e,%e)"%(self.line_tag,i,inf(vi))
93                   else:                   else:
94                      refi=eval(self.reference[i])                      refi=eval(self.expression[i])
95                      erri=Lsup(vi-refi)/Lsup(refi)                      erri=Lsup(vi-refi)/Lsup(refi)
96                      print "%s :   component %d (min,max,rel error)= (%e,%e,%e)"%(self.line_tag,i,inf(vi),max(vi),erri)                      print "%s :   component %d true (min,max)= (%e,%e)"%(self.line_tag,i,inf(refi),sup(refi))
97                        print "%s :   component %d (min,max,rel error)= (%e,%e,%e,%e,%e)"%(self.line_tag,i,inf(vi),sup(vi),erri)
98                      err=max(err,erri)                      err=max(err,erri)
99                if not self.reference==None: print "%s :   maximum error %e",err                if not self.expression==None: print "%s :   maximum error %e",err
             self.__tn=t  
100                            
101              if not self.reference==None:              if not self.expression==None:
102                 if err>self.max_err:                 if err>self.max_error:
103                     self.t_max=self.__tn                     self.t_max=t
104                     self.max_error=err/max_ref                     self.max_error=err
105    
106         def finalize(self):         def doFinalization(self):
107            """print out the maximum error"""            """
108            if not self.t_max==None: print "%s :   component %d (min,max)= (%e,%e)"%(self.line_tag,self.t_max,self.max_err)        Print out the maximum error.
109          """
110              if not self.t_max==None: print "%s : == maximum error %e at time %e == "%(self.line_tag,self.max_error,self.t_max)
111    
112    # vim: expandtab shiftwidth=4:

Legend:
Removed from v.144  
changed lines
  Added in v.155

  ViewVC Help
Powered by ViewVC 1.1.26