[cig-commits] r3923 - in mc/3D/CitcomS/trunk: examples pyre pyre/Components

leif at geodynamics.org leif at geodynamics.org
Wed Jul 5 19:53:55 PDT 2006


Author: leif
Date: 2006-07-05 19:53:54 -0700 (Wed, 05 Jul 2006)
New Revision: 3923

Added:
   mc/3D/CitcomS/trunk/examples/example1.cfg
   mc/3D/CitcomS/trunk/pyre/Components/CodecConfig.py
   mc/3D/CitcomS/trunk/pyre/Components/HackedConfigParser.py
Modified:
   mc/3D/CitcomS/trunk/pyre/Makefile.am
   mc/3D/CitcomS/trunk/pyre/SimpleApp.py
Log:
Added the ability to use ".cfg" files instead of
clumsy shell scripts for specifying parameters.

Example usage:

   citcoms example1.cfg

(The file 'example1.cfg' is checked-in under 'examples'.)

The code which made this possible was copied & pasted from
Specfem project; it will be factored-out into a shared
package at some point...


Added: mc/3D/CitcomS/trunk/examples/example1.cfg
===================================================================
--- mc/3D/CitcomS/trunk/examples/example1.cfg	2006-07-06 02:16:42 UTC (rev 3922)
+++ mc/3D/CitcomS/trunk/examples/example1.cfg	2006-07-06 02:53:54 UTC (rev 3923)
@@ -0,0 +1,20 @@
+
+[CitcomS]
+steps = 1
+
+[CitcomS.controller]
+monitoringFrequency = 10
+
+[CitcomS.launcher]
+nodes = 4
+
+[CitcomS.solver]
+datafile = example1
+
+[CitcomS.solver.mesher]
+nprocx =  2
+nprocy =  2
+nodex  = 17
+nodey  = 17
+nodez  =  9
+

Added: mc/3D/CitcomS/trunk/pyre/Components/CodecConfig.py
===================================================================
--- mc/3D/CitcomS/trunk/pyre/Components/CodecConfig.py	2006-07-06 02:16:42 UTC (rev 3922)
+++ mc/3D/CitcomS/trunk/pyre/Components/CodecConfig.py	2006-07-06 02:53:54 UTC (rev 3923)
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+
+from pyre.inventory.odb.Registry import Registry
+from pyre.odb.fs.CodecODB import CodecODB
+from HackedConfigParser import HackedConfigParser
+
+
+class CodecConfig(CodecODB):
+
+    def __init__(self):
+        CodecODB.__init__(self, encoding='cfg')
+        return
+
+    def _decode(self, shelf):
+        root = Registry("root")
+        parser = HackedConfigParser(root)
+        parser.read(shelf.name)
+        shelf['inventory'] = root
+        shelf._frozen = True
+        return
+
+
+# end of file

Added: mc/3D/CitcomS/trunk/pyre/Components/HackedConfigParser.py
===================================================================
--- mc/3D/CitcomS/trunk/pyre/Components/HackedConfigParser.py	2006-07-06 02:16:42 UTC (rev 3922)
+++ mc/3D/CitcomS/trunk/pyre/Components/HackedConfigParser.py	2006-07-06 02:53:54 UTC (rev 3923)
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+
+from ConfigParser import SafeConfigParser
+import pyre.parsing.locators as locators
+
+
+class HackedConfigParser(SafeConfigParser):
+
+    """Python's SafeConfigParser, hacked to provide file & line info,
+    and extended to populate a Pyre Registry."""
+
+    # This class goes to extreme lengths to extract file and line info
+    # from Python's ConfigParser module.  It injects proxy 'file' and
+    # 'dict' objects into ConfigParser's code.  As the file is parsed,
+    # the proxy objects gain control, spying upon the parsing process.
+    
+    # We should probably write our own parser... *sigh*
+
+    class FileProxy(object):
+
+        def __init__(self):
+            self.fp = None
+            self.name = "unknown"
+            self.lineno = 0
+
+        def readline(self, size=-1):
+            line = self.fp.readline()
+            if line:
+                self.lineno = self.lineno + 1
+            return line
+
+        def __getattr__(self, name):
+            return getattr(self.fp, name)
+
+    class Section(dict):
+
+        def __init__(self, sectname, node, fp):
+            dict.__init__(self)
+            self.node = node
+            self.fp = fp
+        
+        def __setitem__(self, key, value):
+            locator = locators.file(self.fp.name, self.fp.lineno)
+            self.node.setProperty(key, value, locator)
+            dict.__setitem__(self, key, value)
+
+    class SectionDict(dict):
+
+        def __init__(self, root):
+            dict.__init__(self)
+            self.root = root
+            self.fp = HackedConfigParser.FileProxy()
+        
+        def __contains__(self, sectname):
+            # Prevent 'ConfigParser' from creating section
+            # dictionaries; instead, create our own.
+            if not dict.__contains__(self, sectname):
+                node = self._getNode(self.root, sectname.split('.'))
+                cursect = HackedConfigParser.Section(sectname, node, self.fp)
+                self[sectname] = cursect
+            return True
+        
+        def __setitem__(self, key, value):
+            dict.__setitem__(self, key, value)
+
+        def _getNode(self, node, path):
+            if len(path) == 0:
+                return node
+            key = path[0].strip()
+            return self._getNode(node.getNode(key), path[1:])
+    
+    def __init__(self, root, defaults=None):
+        SafeConfigParser.__init__(self, defaults)
+        self._sections = HackedConfigParser.SectionDict(root)
+
+    def _read(self, fp, fpname):
+        self._sections.fp.fp = fp
+        self._sections.fp.name = fpname
+        self._sections.fp.lineno = 0
+        SafeConfigParser._read(self, self._sections.fp, fpname)
+        self._sections.fp.__init__()
+
+    def optionxform(self, optionstr):
+        # Don't lower() option names.
+        return optionstr
+
+
+# end of file

Modified: mc/3D/CitcomS/trunk/pyre/Makefile.am
===================================================================
--- mc/3D/CitcomS/trunk/pyre/Makefile.am	2006-07-06 02:16:42 UTC (rev 3922)
+++ mc/3D/CitcomS/trunk/pyre/Makefile.am	2006-07-06 02:53:54 UTC (rev 3923)
@@ -28,6 +28,7 @@
 	Components/Advection_diffusion/__init__.py \
 	Components/BC.py \
 	Components/CitcomComponent.py \
+	Components/CodecConfig.py \
 	Components/Const.py \
 	Components/Exchanger/CoarseGridExchanger.py \
 	Components/Exchanger/Exchanger.py \
@@ -35,6 +36,7 @@
 	Components/Exchanger/__init__.py \
 	Components/Exchanger/Inlet.py \
 	Components/Exchanger/Outlet.py \
+	Components/HackedConfigParser.py \
 	Components/IC.py \
 	Components/__init__.py \
 	Components/Launchers.py \

Modified: mc/3D/CitcomS/trunk/pyre/SimpleApp.py
===================================================================
--- mc/3D/CitcomS/trunk/pyre/SimpleApp.py	2006-07-06 02:16:42 UTC (rev 3922)
+++ mc/3D/CitcomS/trunk/pyre/SimpleApp.py	2006-07-06 02:53:54 UTC (rev 3923)
@@ -140,6 +140,38 @@
         return list
 
 
+    def initializeCurator(self, curator, registry):
+        from Components.CodecConfig import CodecConfig
+        cfg = CodecConfig()
+        curator.registerCodecs(cfg)
+        return super(SimpleApp, self).initializeCurator(curator, registry)
+        
+
+    def collectUserInput(self, registry):
+        # read INI-style .cfg files
+        from Components.CodecConfig import CodecConfig
+        curator = self.getCurator()
+        configRegistry = curator.getTraits(self.name, extraDepositories=[], encoding='cfg')
+        self.updateConfiguration(configRegistry)
+        # read parameter files given on the command line
+        from os.path import isfile, splitext
+        for arg in self.argv:
+            if isfile(arg):
+                base, ext = splitext(arg)
+                encoding = ext[1:] # NYI: not quite
+                codec = self.getCurator().codecs.get(encoding)
+                if codec:
+                    shelf = codec.open(base)
+                    paramRegistry = shelf['inventory'].getFacility(self.name)
+                    if paramRegistry:
+                        self.updateConfiguration(paramRegistry)
+                else:
+                    self.error.log("unknown encoding: %s" % ext)
+            else:
+                self.error.log("cannot open '%s'" % arg)
+        return
+
+
 # main
 if __name__ == "__main__":
 



More information about the cig-commits mailing list