[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