/[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

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

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

  ViewVC Help
Powered by ViewVC 1.1.26