/[escript]/trunk/escript/py_src/modelframe.py
ViewVC logotype

Diff of /trunk/escript/py_src/modelframe.py

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

trunk/esys2/escript/py_src/modelframe.py revision 150 by jgs, Thu Sep 15 03:44:45 2005 UTC trunk/escript/py_src/modelframe.py revision 885 by gross, Wed Nov 1 09:05:51 2006 UTC
# Line 1  Line 1 
1  # $Id$  # $Id$
2    
3    """
4    Environment for implementing models in escript
5    
6    @var __author__: name of author
7    @var __copyright__: copyrights
8    @var __license__: licence agreement
9    @var __url__: url entry point on documentation
10    @var __version__: version
11    @var __date__: date of the version
12    """
13    
14    __author__="Lutz Gross, l.gross@uq.edu.au"
15    __copyright__="""  Copyright (c) 2006 by ACcESS MNRF
16                        http://www.access.edu.au
17                    Primary Business: Queensland, Australia"""
18    __license__="""Licensed under the Open Software License version 3.0
19                 http://www.opensource.org/licenses/osl-3.0.php"""
20    __url__="http://www.iservo.edu.au/esys"
21    __version__="$Revision$"
22    __date__="$Date$"
23    
24    
25  from types import StringType,IntType,FloatType,BooleanType,ListType,DictType  from types import StringType,IntType,FloatType,BooleanType,ListType,DictType
26  from sys import stdout  from sys import stdout
27    import numarray
28    import operator
29  import itertools  import itertools
30  # import modellib  temporarily removed!!!  # import modellib  temporarily removed!!!
31    
# Line 342  class ParameterSet(LinkableObject): Line 366  class ParameterSet(LinkableObject):
366       - a ParameterSet object       - a ParameterSet object
367       - a Simulation object       - a Simulation object
368       - a Model object       - a Model object
369       - any other object (not considered by writeESySXML and writeXML)       - a numarray object
370             - a list of booleans
371            - any other object (not considered by writeESySXML and writeXML)
372            
373      Example how to create an ESySParameters object::      Example how to create an ESySParameters object::
374            
# Line 444  class ParameterSet(LinkableObject): Line 470  class ParameterSet(LinkableObject):
470          self._parametersToDom(document, pset)          self._parametersToDom(document, pset)
471    
472      def _parametersToDom(self, document, node):      def _parametersToDom(self, document, node):
473          node.setAttribute ('id', str(self.id))          node.setAttribute('id', str(self.id))
474            node.setIdAttribute("id")
475          for name,value in self:          for name,value in self:
476              param = document.createElement('Parameter')              param = document.createElement('Parameter')
477              param.setAttribute('type', value.__class__.__name__)              param.setAttribute('type', value.__class__.__name__)
# Line 453  class ParameterSet(LinkableObject): Line 480  class ParameterSet(LinkableObject):
480    
481              val = document.createElement('Value')              val = document.createElement('Value')
482    
483              if isinstance(value,ParameterSet):              if isinstance(value,(ParameterSet,Link,DataSource)):
484                  value.toDom(document, val)                  value.toDom(document, val)
485                  param.appendChild(val)                  param.appendChild(val)
486              elif isinstance(value, Link):              elif isinstance(value, numarray.NumArray):
487                  value.toDom(document, val)                  shape = value.getshape()
488                    if isinstance(shape, tuple):
489                        size = reduce(operator.mul, shape)
490                        shape = ' '.join(map(str, shape))
491                    else:
492                        size = shape
493                        shape = str(shape)
494    
495                    arraytype = value.type()
496                    numarrayElement = document.createElement('NumArray')
497                    numarrayElement.appendChild(dataNode(document, 'ArrayType', str(arraytype)))
498                    numarrayElement.appendChild(dataNode(document, 'Shape', shape))
499                    numarrayElement.appendChild(dataNode(document, 'Data', ' '.join(
500                        [str(x) for x in numarray.reshape(value, size)])))
501                    val.appendChild(numarrayElement)
502                  param.appendChild(val)                  param.appendChild(val)
503              elif isinstance(value,StringType):              elif isinstance (value, list):
504                  param.appendChild(dataNode(document, 'Value', value))                  param.appendChild(dataNode(document, 'Value', ' '.join(
505                        [str(x) for x in value])
506                    ))
507              else:              else:
508                  param.appendChild(dataNode(document, 'Value', str(value)))                  param.appendChild(dataNode(document, 'Value', str(value)))
509    
# Line 473  class ParameterSet(LinkableObject): Line 516  class ParameterSet(LinkableObject):
516              """              """
517              Remove the empty nodes from the children of this node.              Remove the empty nodes from the children of this node.
518              """              """
519              return [x for x in node.childNodes              ret = []
520                      if not isinstance(x, minidom.Text) or x.nodeValue.strip()]              for x in node.childNodes:
521                    if isinstance(x, minidom.Text):
522                        if x.nodeValue.strip():
523                            ret.append(x)
524                    else:
525                        ret.append(x)
526                return ret
527    
528          def _floatfromValue(doc):          def _floatfromValue(doc):
529              return float(doc.nodeValue.strip())              return float(doc.nodeValue.strip())
# Line 486  class ParameterSet(LinkableObject): Line 535  class ParameterSet(LinkableObject):
535              return int(doc.nodeValue.strip())              return int(doc.nodeValue.strip())
536    
537          def _boolfromValue(doc):          def _boolfromValue(doc):
538              return bool(doc.nodeValue.strip())              return _boolfromstring(doc.nodeValue.strip())
539          
540            def _nonefromValue(doc):
541                return None
542    
543            def _numarrayfromValue(doc):
544                for node in _children(doc):
545                    if node.tagName == 'ArrayType':
546                        arraytype = node.firstChild.nodeValue.strip()
547                    if node.tagName == 'Shape':
548                        shape = node.firstChild.nodeValue.strip()
549                        shape = [int(x) for x in shape.split()]
550                    if node.tagName == 'Data':
551                        data = node.firstChild.nodeValue.strip()
552                        data = [float(x) for x in data.split()]
553                return numarray.reshape(numarray.array(data, type=getattr(numarray, arraytype)),
554                                        shape)
555          
556            def _listfromValue(doc):
557                return [_boolfromstring(x) for x in doc.nodeValue.split()]
558    
559    
560            def _boolfromstring(s):
561                if s == 'True':
562                    return True
563                else:
564                    return False
565          # Mapping from text types in the xml to methods used to process trees of that type          # Mapping from text types in the xml to methods used to process trees of that type
566          ptypemap = {"Simulation": Simulation.fromDom,          ptypemap = {"Simulation": Simulation.fromDom,
567                      "Model":Model.fromDom,                      "Model":Model.fromDom,
568                      "ParameterSet":ParameterSet.fromDom,                      "ParameterSet":ParameterSet.fromDom,
569                      "Link":Link.fromDom,                      "Link":Link.fromDom,
570                        "DataSource":DataSource.fromDom,
571                      "float":_floatfromValue,                      "float":_floatfromValue,
572                      "int":_intfromValue,                      "int":_intfromValue,
573                      "str":_stringfromValue,                      "str":_stringfromValue,
574                      "bool":_boolfromValue                      "bool":_boolfromValue,
575                        "list":_listfromValue,
576                        "NumArray":_numarrayfromValue,
577                        "NoneType":_nonefromValue,
578                      }                      }
579    
580  #        print doc.toxml()  #        print doc.toxml()
# Line 513  class ParameterSet(LinkableObject): Line 591  class ParameterSet(LinkableObject):
591    
592                  if childnode.tagName == "Value":                  if childnode.tagName == "Value":
593                      nodes = _children(childnode)                      nodes = _children(childnode)
594                    #    if ptype == 'NumArray':
595                     #       pvalue = _numarrayfromValue(nodes)
596                     #   else:
597                      pvalue = ptypemap[ptype](nodes[0])                      pvalue = ptypemap[ptype](nodes[0])
598    
599              parameters[pname] = pvalue              parameters[pname] = pvalue
# Line 666  class Simulation(Model): Line 747  class Simulation(Model):
747            
748      FAILED_TIME_STEPS_MAX=20      FAILED_TIME_STEPS_MAX=20
749      MAX_ITER_STEPS=50      MAX_ITER_STEPS=50
750        MAX_CHANGE_OF_DT=2.
751            
752      def __init__(self, models=[], **kwargs):      def __init__(self, models=[], **kwargs):
753          """          """
# Line 707  class Simulation(Model): Line 789  class Simulation(Model):
789      Sets the i-th model.      Sets the i-th model.
790      """      """
791          if not isinstance(value,Model):          if not isinstance(value,Model):
792              raise ValueError("assigned value is not a Model")              raise ValueError,"assigned value is not a Model but instance of %s"%(value.__class__.__name__,)
793          for j in range(max(i-len(self.__models)+1,0)):          for j in range(max(i-len(self.__models)+1,0)):
794              self.__models.append(None)              self.__models.append(None)
795          self.__models[i]=value          self.__models[i]=value
# Line 742  class Simulation(Model): Line 824  class Simulation(Model):
824          document, rootnode = esysDoc()          document, rootnode = esysDoc()
825          self.toDom(document, rootnode)          self.toDom(document, rootnode)
826          targetsList = document.getElementsByTagName('Target')          targetsList = document.getElementsByTagName('Target')
827          for i in targetsList:          
828              targetId = int(i.firstChild.nodeValue.strip())          for element in targetsList:
829                targetId = int(element.firstChild.nodeValue.strip())
830                if document.getElementById(str(targetId)):
831                    continue
832              targetObj = LinkableObjectRegistry[targetId]              targetObj = LinkableObjectRegistry[targetId]
833              targetObj.toDom(document, rootnode)              targetObj.toDom(document, rootnode)
834          ostream.write(document.toprettyxml())          ostream.write(document.toprettyxml())
# Line 849  class Simulation(Model): Line 934  class Simulation(Model):
934          while not self.finalize():          while not self.finalize():
935              step_fail_counter=0              step_fail_counter=0
936              iteration_fail_counter=0              iteration_fail_counter=0
937              dt_new=self.getSafeTimeStepSize(dt)              if self.n==0:
938                    dt_new=self.getSafeTimeStepSize(dt)
939                else:
940                    dt_new=min(max(self.getSafeTimeStepSize(dt),dt/self.MAX_CHANGE_OF_DT),dt*self.MAX_CHANGE_OF_DT)
941              self.trace("%d. time step %e (step size %e.)" % (self.n+1,self.tn+dt_new,dt_new))              self.trace("%d. time step %e (step size %e.)" % (self.n+1,self.tn+dt_new,dt_new))
942              end_of_step=False              end_of_step=False
943              while not end_of_step:              while not end_of_step:
944                 end_of_step=True                 end_of_step=True
945                 if not dt_new>0:                 if not dt_new>0:
946                    raise NonPositiveStepSizeError("non-positive step size in step %d",self.n+1)                    raise NonPositiveStepSizeError("non-positive step size in step %d"%(self.n+1))
947                 try:                 try:
948                    self.doStepPreprocessing(dt_new)                    self.doStepPreprocessing(dt_new)
949                    self.doStep(dt_new)                    self.doStep(dt_new)
# Line 865  class Simulation(Model): Line 953  class Simulation(Model):
953                    end_of_step=False                    end_of_step=False
954                    iteration_fail_counter+=1                    iteration_fail_counter+=1
955                    if iteration_fail_counter>self.FAILED_TIME_STEPS_MAX:                    if iteration_fail_counter>self.FAILED_TIME_STEPS_MAX:
956                             raise SimulationBreakDownError("reduction of time step to achieve convergence failed.")                             raise SimulationBreakDownError("reduction of time step to achieve convergence failed after %s steps."%self.FAILED_TIME_STEPS_MAX)
957                    self.trace("iteration fails. time step is repeated with new step size.")                    self.trace("Iteration failed. Time step is repeated with new step size %s."%dt_new)
958                 except FailedTimeStepError:                 except FailedTimeStepError:
959                    dt_new=self.getSafeTimeStepSize(dt)                    dt_new=self.getSafeTimeStepSize(dt)
960                    end_of_step=False                    end_of_step=False
961                    step_fail_counter+=1                    step_fail_counter+=1
962                    self.trace("time step is repeated.")                    self.trace("Time step is repeated with new time step size %s."%dt_new)
963                    if step_fail_counter>self.FAILED_TIME_STEPS_MAX:                    if step_fail_counter>self.FAILED_TIME_STEPS_MAX:
964                          raise SimulationBreakDownError("time integration is given up after %d attempts."%step_fail_counter)                          raise SimulationBreakDownError("Time integration is given up after %d attempts."%step_fail_counter)
965              dt=dt_new              dt=dt_new
966              if not check_point==None:              if not check_point==None:
967                  if n%check_point==0:                  if n%check_point==0:
# Line 923  class NonPositiveStepSizeError(Exception Line 1011  class NonPositiveStepSizeError(Exception
1011      """      """
1012      pass      pass
1013    
1014    class DataSource(object):
1015        """
1016        Class for handling data sources, including local and remote files. This class is under development.
1017        """
1018    
1019        def __init__(self, uri="file.ext", fileformat="unknown"):
1020            self.uri = uri
1021            self.fileformat = fileformat
1022    
1023        def toDom(self, document, node):
1024            """
1025            C{toDom} method of DataSource. Creates a DataSource node and appends it to the
1026        current XML document.
1027            """
1028            ds = document.createElement('DataSource')
1029            ds.appendChild(dataNode(document, 'URI', self.uri))
1030            ds.appendChild(dataNode(document, 'FileFormat', self.fileformat))
1031            node.appendChild(ds)
1032    
1033        def fromDom(cls, doc):
1034            uri= doc.getElementsByTagName("URI")[0].firstChild.nodeValue.strip()
1035            fileformat= doc.getElementsByTagName("FileFormat")[0].firstChild.nodeValue.strip()
1036            ds = cls(uri, fileformat)
1037            return ds
1038    
1039        def getLocalFileName(self):
1040            return self.uri
1041    
1042        fromDom = classmethod(fromDom)
1043        
1044  # vim: expandtab shiftwidth=4:  # vim: expandtab shiftwidth=4:

Legend:
Removed from v.150  
changed lines
  Added in v.885

  ViewVC Help
Powered by ViewVC 1.1.26