/[escript]/branches/3.4.1/modellib/py_src/input.py
ViewVC logotype

Diff of /branches/3.4.1/modellib/py_src/input.py

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

revision 819 by gross, Sun Aug 27 23:07:51 2006 UTC revision 944 by gross, Tue Jan 30 08:57:37 2007 UTC
# Line 8  __license__="""Licensed under the Open S Line 8  __license__="""Licensed under the Open S
8    
9  from esys.escript import *  from esys.escript import *
10  from esys.escript.modelframe import Model,ParameterSet  from esys.escript.modelframe import Model,ParameterSet
11    from esys.escript.linearPDEs import LinearPDE
12  from math import log  from math import log
13    
14  class Sequencer(Model):  class Sequencer(Model):
# Line 22  class Sequencer(Model): Line 23  class Sequencer(Model):
23      @type t: C{float}      @type t: C{float}
24    
25      """      """
26      def __init__(self,debug=False):      def __init__(self,**kwargs):
27          """          """
28          """          """
29          super(Sequencer,self).__init__(debug=debug)          super(Sequencer,self).__init__(**kwargs)
30          self.declareParameter(t=0.,          self.declareParameter(t=0.,
31                                t_end=1.,                                t_end=1.,
32                                dt_max=Model.UNDEF_DT)                                dt_max=Model.UNDEF_DT)
# Line 68  class GaussianProfile(ParameterSet): Line 69  class GaussianProfile(ParameterSet):
69      In the case that the spatial dimension is two, The third component of      In the case that the spatial dimension is two, The third component of
70      x_c is dropped.      x_c is dropped.
71      """      """
72      def __init__(self,debug=False):      def __init__(self,**kwargs):
73          ParameterSet.__init__(self,debug=debug)          super(GaussianProfile, self).__init__(**kwargs)
74          self.declareParameter(domain=None,          self.declareParameter(domain=None,
75                                x_c=numarray.zeros([3]),                                x_c=numarray.zeros([3]),
76                                A=1.,                                A=1.,
# Line 105  class InterpolateOverBox(ParameterSet): Line 106  class InterpolateOverBox(ParameterSet):
106      @ivar value_right_top_back: (in) value at right,top,back corner      @ivar value_right_top_back: (in) value at right,top,back corner
107      """      """
108    
109      def __init__(self, debug=False):      def __init__(self, **kwargs):
110          ParameterSet.__init__(self, debug=debug)          super(InterpolateOverBox, self).__init__(self)
111          self.declareParameter(domain=None,          self.declareParameter(domain=None,
112                                value_left_bottom_front=0.,                                value_left_bottom_front=0.,
113                                value_right_bottom_front=0.,                                value_right_bottom_front=0.,
# Line 128  class InterpolateOverBox(ParameterSet): Line 129  class InterpolateOverBox(ParameterSet):
129          if self.domain.getDim() == 2:          if self.domain.getDim() == 2:
130              x0,x1=x[0],x[1]              x0,x1=x[0],x[1]
131              left_bottom_front0,right_top_back0=inf(x0),sup(x0)              left_bottom_front0,right_top_back0=inf(x0),sup(x0)
132              left_bottom_front1,right_top_back1=inf(x[1]),sup(x[1])              left_bottom_front1,right_top_back1=inf(x1),sup(x1)
133              f_right = (x[0] - self.left_bottom_front0)/\              f_right = (x0 - left_bottom_front0)/(right_top_back0 -left_bottom_front0)
          (self.right_top_back0 - self.left_bottom_front0)  
134              f_left = 1. - f_right              f_left = 1. - f_right
135              f_top = (x[1] - self.left_bottom_front1)/\              f_top = (x1 - left_bottom_front1)/(right_top_back1 - left_bottom_front1)
          (self.right_top_back1 - self.left_bottom_front1)  
136              f_bottom = 1. - f_top              f_bottom = 1. - f_top
137              out = f_left * f_bottom * self.value_left_bottom_front \              out = f_left * f_bottom * self.value_left_bottom_front \
138                  + f_right * f_bottom * self.value_right_bottom_front \                  + f_right * f_bottom * self.value_right_bottom_front \
# Line 142  class InterpolateOverBox(ParameterSet): Line 141  class InterpolateOverBox(ParameterSet):
141          else:          else:
142              x0,x1,x2=x[0],x[1],x[2]              x0,x1,x2=x[0],x[1],x[2]
143              left_bottom_front0,right_top_back0=inf(x0),sup(x0)              left_bottom_front0,right_top_back0=inf(x0),sup(x0)
144              left_bottom_front1,right_top_back1=inf(x[1]),sup(x[1])              left_bottom_front1,right_top_back1=inf(x1),sup(x1)
145              left_bottom_front2,right_top_back2=inf(x[2]),sup(x[2])              left_bottom_front2,right_top_back2=inf(x2),sup(x2)
146              f_right = (x[0] - self.left_bottom_front0)/\              f_right = (x0 - left_bottom_front0)/(right_top_back0 - left_bottom_front0)
                     (self.right_top_back0 - self.left_bottom_front0)  
147              f_left = 1. - f_right              f_left = 1. - f_right
148              f_top = (x[1] - self.left_bottom_front1)/\              f_top = (x1 - left_bottom_front1)/(right_top_back1 - left_bottom_front1)
                     (self.right_top_back1 - self.left_bottom_front1)  
149              f_bottom = 1. - f_top              f_bottom = 1. - f_top
150              f_back = (x[2] - self.left_bottom_front1)/\              f_back = (x2 - left_bottom_front1)/(right_top_back2 - left_bottom_front2)
                     (self.right_top_back2 - self.left_bottom_front2)  
151              f_front = 1. - f_back              f_front = 1. - f_back
152              out = f_left * f_bottom * f_front * self.value_left_bottom_front\              out = f_left * f_bottom * f_front * self.value_left_bottom_front\
153                  + f_right * f_bottom * f_front * self.value_right_bottom_front\                  + f_right * f_bottom * f_front * self.value_right_bottom_front\
# Line 181  class InterpolatedTimeProfile(ParameterS Line 177  class InterpolatedTimeProfile(ParameterS
177         @ivar values: (in) list of values at time nodes         @ivar values: (in) list of values at time nodes
178         """         """
179    
180         def __init__(self,debug=False):         def __init__(self,**kwargs):
181             ParameterSet.__init__(self,debug=debug)             super( InterpolatedTimeProfile, self).__init__(**kwargs)
182             self.declareParameter(t=0., \             self.declareParameter(t=0., \
183                                   nodes=[0.,1.],\                                   nodes=[0.,1.],\
184                                   values=[1.,1.])                                   values=[1.,1.])
# Line 204  class InterpolatedTimeProfile(ParameterS Line 200  class InterpolatedTimeProfile(ParameterS
200                        return m*(t-self.nodes[i-1]) + self.values[i-1]                        return m*(t-self.nodes[i-1]) + self.values[i-1]
201                 return self.values[l]                 return self.values[l]
202    
203  class LinearCombination(Model):  class ScalarDistributionFromTags(ParameterSet):
204        """
205        creates a scalar distribution on a domain from tags
206                
207        @ivar domain: domain
208        @type domain: L{esys.escript.Domain}
209        @ivar default: default value
210        @ivar tag0: tag 0
211        @type tag0: C{int}
212        @ivar value0: value for tag 0
213        @type value0: C{float}
214        @ivar tag1: tag 1
215        @type tag1: C{int}
216        @ivar value1: value for tag 1
217        @type value1: C{float}
218        @ivar tag2: tag 2
219        @type tag2: C{int}
220        @ivar value2: value for tag 2
221        @type value2: C{float}
222        @ivar tag3: tag 3
223        @type tag3: C{int}
224        @ivar value3: value for tag 3
225        @type value3: C{float}
226        @ivar tag4: tag 4
227        @type tag4: C{int}
228        @ivar value4: value for tag 4
229        @type value4: C{float}
230        @ivar tag5: tag 5
231        @type tag5: C{int}
232        @ivar value5: value for tag 5
233        @type value5: C{float}
234        @ivar tag6: tag 6
235        @type tag6: C{int}
236        @ivar value6: value for tag 6
237        @type value6: C{float}
238        @ivar tag7: tag 7
239        @type tag7: C{int}
240        @ivar value7: value for tag 7
241        @type value7: C{float}
242        @ivar tag8: tag 8
243        @type tag8: C{int}
244        @ivar value8: value for tag 8
245        @type value8: C{float}
246        @ivar tag9: tag 9
247        @type tag9: C{int}
248        @ivar value9: value for tag 9
249        @type value9: C{float}
250        """
251        def __init__(self,**kwargs):
252            super(ScalarDistributionFromTags, self).__init__(**kwargs)
253            self.declareParameter(domain=None,
254                                  default=0.,
255                                  tag0=None,
256                                  value0=0.,
257                                  tag1=None,
258                                  value1=0.,
259                                  tag2=None,
260                                  value2=0.,
261                                  tag3=None,
262                                  value3=0.,
263                                  tag4=None,
264                                  value4=0.,
265                                  tag5=None,
266                                  value5=0.,
267                                  tag6=None,
268                                  value6=0.,
269                                  tag7=None,
270                                  value7=0.,
271                                  tag8=None,
272                                  value8=0.,
273                                  tag9=None,
274                                  value9=0.)
275    
276    
277        def out(self):
278            """
279            returns a L{esys.escript.Data} object
280            Link against this method to get the output of this model.
281            """
282            d=Scalar(self.default,Function(self.domain))
283            if not self.tag0 == None: d.setTaggedValue(self.tag0,self.value0)
284            if not self.tag1 == None: d.setTaggedValue(self.tag1,self.value1)
285            if not self.tag2 == None: d.setTaggedValue(self.tag2,self.value2)
286            if not self.tag3 == None: d.setTaggedValue(self.tag3,self.value3)
287            if not self.tag4 == None: d.setTaggedValue(self.tag4,self.value4)
288            if not self.tag5 == None: d.setTaggedValue(self.tag5,self.value5)
289            if not self.tag6 == None: d.setTaggedValue(self.tag6,self.value6)
290            if not self.tag7 == None: d.setTaggedValue(self.tag7,self.value7)
291            if not self.tag8 == None: d.setTaggedValue(self.tag8,self.value8)
292            if not self.tag9 == None: d.setTaggedValue(self.tag9,self.value9)
293            print d
294            return d
295    
296    class SmoothScalarDistributionFromTags(ParameterSet):
297        """
298        creates a smooth scalar distribution on a domain from region tags
299                
300        @ivar domain: domain
301        @type domain: L{esys.escript.Domain}
302        @ivar default: default value
303        @ivar tag0: tag 0
304        @type tag0: C{int}
305        @ivar value0: value for tag 0
306        @type value0: C{float}
307        @ivar tag1: tag 1
308        @type tag1: C{int}
309        @ivar value1: value for tag 1
310        @type value1: C{float}
311        @ivar tag2: tag 2
312        @type tag2: C{int}
313        @ivar value2: value for tag 2
314        @type value2: C{float}
315        @ivar tag3: tag 3
316        @type tag3: C{int}
317        @ivar value3: value for tag 3
318        @type value3: C{float}
319        @ivar tag4: tag 4
320        @type tag4: C{int}
321        @ivar value4: value for tag 4
322        @type value4: C{float}
323        @ivar tag5: tag 5
324        @type tag5: C{int}
325        @ivar value5: value for tag 5
326        @type value5: C{float}
327        @ivar tag6: tag 6
328        @type tag6: C{int}
329        @ivar value6: value for tag 6
330        @type value6: C{float}
331        @ivar tag7: tag 7
332        @type tag7: C{int}
333        @ivar value7: value for tag 7
334        @type value7: C{float}
335        @ivar tag8: tag 8
336        @type tag8: C{int}
337        @ivar value8: value for tag 8
338        @type value8: C{float}
339        @ivar tag9: tag 9
340        @type tag9: C{int}
341        @ivar value9: value for tag 9
342        @type value9: C{float}
343        """
344        def __init__(self,**kwargs):
345            super(SmoothScalarDistributionFromTags, self).__init__(**kwargs)
346            self.declareParameter(domain=None,
347                                  default=0.,
348                                  tag0=None,
349                                  value0=0.,
350                                  tag1=None,
351                                  value1=0.,
352                                  tag2=None,
353                                  value2=0.,
354                                  tag3=None,
355                                  value3=0.,
356                                  tag4=None,
357                                  value4=0.,
358                                  tag5=None,
359                                  value5=0.,
360                                  tag6=None,
361                                  value6=0.,
362                                  tag7=None,
363                                  value7=0.,
364                                  tag8=None,
365                                  value8=0.,
366                                  tag9=None,
367                                  value9=0.)
368    
369    
370        def __update(self,tag,tag_value,value):
371            if self.__pde==None:
372               self.__pde=LinearPDE(self.domain,numSolutions=1)
373            mask=Scalar(0.,Function(self.domain))
374            mask.setTaggedValue(tag,1.)
375            self.__pde.setValue(Y=mask)
376            mask=wherePositive(abs(self.__pde.getRightHandSide()))
377            value*=(1.-mask)
378            value+=tag_value*mask
379            return value
380    
381        def out(self):
382            """
383            returns a L{esys.escript.Data} object
384            Link against this method to get the output of this model.
385            """
386            d=Scalar(self.default,Solution(self.domain))
387            self.__pde=None
388            if not self.tag0 == None: d=self.__update(self.tag0,self.value0,d)
389            if not self.tag1 == None: d=self.__update(self.tag1,self.value1,d)
390            if not self.tag2 == None: d=self.__update(self.tag2,self.value2,d)
391            if not self.tag3 == None: d=self.__update(self.tag3,self.value3,d)
392            if not self.tag4 == None: d=self.__update(self.tag4,self.value4,d)
393            if not self.tag5 == None: d=self.__update(self.tag5,self.value5,d)
394            if not self.tag6 == None: d=self.__update(self.tag6,self.value6,d)
395            if not self.tag7 == None: d=self.__update(self.tag7,self.value7,d)
396            if not self.tag8 == None: d=self.__update(self.tag8,self.value8,d)
397            if not self.tag9 == None: d=self.__update(self.tag9,self.value9,d)
398            return d
399    
400    class LinearCombination(ParameterSet):
401      """      """
402      Returns a linear combination of the f0*v0+f1*v1+f2*v2+f3*v3+f4*v4      Returns a linear combination of the f0*v0+f1*v1+f2*v2+f3*v3+f4*v4
403                            
# Line 219  class LinearCombination(Model): Line 412  class LinearCombination(Model):
412      @ivar f4: numerical object or None, default=None (in)      @ivar f4: numerical object or None, default=None (in)
413      @ivar v4: numerical object or None, default=None (in)      @ivar v4: numerical object or None, default=None (in)
414      """      """
415      def __init__(self,debug=False):      def __init__(self,**kwargs):
416          Model.__init__(self,debug=debug)          super(LinearCombination, self).__init__(**kwargs)
417          self.declareParameter(f0=None, \          self.declareParameter(f0=None, \
418                                v0=None, \                                v0=None, \
419                                f1=None, \                                f1=None, \
# Line 274  class LinearCombination(Model): Line 467  class LinearCombination(Model):
467              out += fv3              out += fv3
468          return out          return out
469    
470    class MergeConstraints(ParameterSet):
471        """
472        Returns a linear combination of the f0*v0+f1*v1+f2*v2+f3*v3+f4*v4
473        """
474        def __init__(self,**kwargs):
475            super(MergeConstraints, self).__init__(**kwargs)
476            self.declareParameter(location_of_constraint0=None, \
477                                  value_of_constraint0=None, \
478                                  location_of_constraint1=None, \
479                                  value_of_constraint1=None, \
480                                  location_of_constraint2=None, \
481                                  value_of_constraint2=None, \
482                                  location_of_constraint3=None, \
483                                  value_of_constraint3=None, \
484                                  location_of_constraint4=None, \
485                                  value_of_constraint4=None)
486        def location_of_constraint(self):
487              """
488              return the values used to constrain a solution
489    
490              @return: the mask marking the locations of the constraints
491              @rtype: L{escript.Scalar}
492              """
493              out_loc=0
494              if not self.location_of_constraint0 == None:
495                   out_loc=wherePositive(out_loc+wherePositive(self.location_of_constraint0))
496              if not self.location_of_constraint1 == None:
497                   out_loc=wherePositive(out_loc+wherePositive(self.location_of_constraint1))
498              if not self.location_of_constraint2 == None:
499                   out_loc=wherePositive(out_loc+wherePositive(self.location_of_constraint2))
500              if not self.location_of_constraint3 == None:
501                   out_loc=wherePositive(out_loc+wherePositive(self.location_of_constraint3))
502              return out_loc
503    
504        def value_of_constraint(self):
505              """
506              return the values used to constrain a solution
507    
508              @return: values to be used at the locations of the constraints. If
509                      L{value} is not given C{None} is rerturned.
510              @rtype: L{escript.Scalar}
511              """
512              out_loc=0
513              out=0
514              if not self.location_of_constraint0 == None:
515                   tmp=wherePositive(self.location_of_constraint0)
516                   out=out*(1.-tmp)+self.value_of_constraint0*tmp
517                   out_loc=wherePositive(out_loc+tmp)
518              if not self.location_of_constraint1 == None:
519                   tmp=wherePositive(self.location_of_constraint1)
520                   out=out*(1.-tmp)+self.value_of_constraint1*tmp
521                   out_loc=wherePositive(out_loc+tmp)
522              if not self.location_of_constraint2 == None:
523                   tmp=wherePositive(self.location_of_constraint2)
524                   out=out*(1.-tmp)+self.value_of_constraint2*tmp
525                   out_loc=wherePositive(out_loc+tmp)
526              if not self.location_of_constraint3 == None:
527                   tmp=wherePositive(self.location_of_constraint3)
528                   out=out*(1.-tmp)+self.value_of_constraint3*tmp
529                   out_loc=wherePositive(out_loc+tmp)
530              return out
531  # vim: expandtab shiftwidth=4:  # vim: expandtab shiftwidth=4:

Legend:
Removed from v.819  
changed lines
  Added in v.944

  ViewVC Help
Powered by ViewVC 1.1.26