[cig-commits] r8361 - cs/portal/trunk

leif at geodynamics.org leif at geodynamics.org
Fri Nov 30 17:24:38 PST 2007


Author: leif
Date: 2007-11-30 17:24:37 -0800 (Fri, 30 Nov 2007)
New Revision: 8361

Modified:
   cs/portal/trunk/daemon.py
   cs/portal/trunk/mineos.cfg
   cs/portal/trunk/mineos.py
Log:
Final changes necessary to run Mineos from the portal: download
"mineos/parameters.pml"; redirect 'mineos.py' output to a log file;
run Mineos for each available earth model; archive output.


Modified: cs/portal/trunk/daemon.py
===================================================================
--- cs/portal/trunk/daemon.py	2007-11-30 23:45:04 UTC (rev 8360)
+++ cs/portal/trunk/daemon.py	2007-12-01 01:24:37 UTC (rev 8361)
@@ -395,6 +395,8 @@
             self.jobChannel.send(specfem)
             self.jobChannel.send(None) # no more jobs
 
+            self.setStatus(self.STATUS_PREPARING)
+
             while specfem.isAlive():
                 specfem.statusChanged.wait()
             # while
@@ -456,10 +458,10 @@
         job = Job(
             "run",
             executable = self.mineosPathname,
-            arguments = [],
+            arguments = ["parameters.pml"],
             )
         job.urlForInputFile = self.urlForInputFile
-        job.inputFiles = ["mineos/event.txt", "mineos/site.txt", "mineos/sitechan.txt"]
+        job.inputFiles = ["mineos/parameters.pml", "mineos/event.txt", "mineos/stations.site", "mineos/stations.sitechan"]
         job.outputFiles = ["output_mineos.txt", "mineos.tar.gz"]
         return job
 

Modified: cs/portal/trunk/mineos.cfg
===================================================================
--- cs/portal/trunk/mineos.cfg	2007-11-30 23:45:04 UTC (rev 8360)
+++ cs/portal/trunk/mineos.cfg	2007-12-01 01:24:37 UTC (rev 8361)
@@ -1,9 +1,7 @@
 
 [mineos]
-bin-directory = /home/leif/tmp/mineos/bin
-
 event = china_cmt_event
-model = prem_noocean.txt
+#model = prem_noocean.txt
 
 radial = True
 toroidal = True

Modified: cs/portal/trunk/mineos.py
===================================================================
--- cs/portal/trunk/mineos.py	2007-11-30 23:45:04 UTC (rev 8360)
+++ cs/portal/trunk/mineos.py	2007-12-01 01:24:37 UTC (rev 8361)
@@ -4,11 +4,23 @@
 from pyre.applications import Script
 from pyre.units.SI import milli, hertz
 from pyre.units.length import km
-import os, sys
+import os, sys, stat
+from os.path import basename, dirname, splitext
 
 mHz = milli*hertz
 
+# Assume this script is installed alongside the mineos binaries.  Note
+# that "DEMO.tar.gz" -- which contains these models -- must be
+# unpacked after installing Mineos.
+prefix = dirname(dirname(__file__))
+modelsDir = prefix + "/share/mineos/models/"
+models = [modelsDir + filename for filename in ["prem_noocean.txt", "prem_ocean.txt"]]
+del filename
 
+
+mode = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
+
+
 class Mode(object):
     def __init__(self, jcom, id, desc):
         self.jcom = jcom
@@ -27,8 +39,8 @@
 
 class Mineos(object):
 
-    def __init__(self, bin, model, event, stations):
-        self.bin = bin
+    def __init__(self, model, event, stations):
+        self.bin = prefix + "/bin"
         self.model = model
         self.event = event
         self.stations = stations
@@ -111,6 +123,8 @@
 
 
     def run(self, program, stdin=None, stdout=None, stderr=None):
+        sys.stdout.flush()
+        sys.stderr.flush()
         argv = [program]
         pid = os.fork()
         if pid:
@@ -133,10 +147,10 @@
                 fd = os.open(stdin, os.O_RDONLY)
                 os.dup2(fd, 0)
             if stdout is not None:
-                fd = os.open(stdout, os.O_WRONLY)
+                fd = os.open(stdout, os.O_WRONLY, mode)
                 os.dup2(fd, 1)
             if stderr is not None:
-                fd = os.open(stderr, os.O_WRONLY)
+                fd = os.open(stderr, os.O_WRONLY, mode)
                 os.dup2(fd, 2)
             executable = os.path.join(self.bin, argv[0])
             try:
@@ -153,13 +167,10 @@
 
     import pyre.inventory as pyre
 
-    bin = pyre.str("bin-directory")
-
-
     #------------------------------------------------------------------------
     # common
     
-    model = pyre.str("model")
+    #model = pyre.str("model")
 
     # jcom
     radial = pyre.bool("radial")
@@ -210,6 +221,7 @@
 
 
     def main(self, *args, **kwds):
+        
         self._info.activate()
 
         enabledModes = []
@@ -222,8 +234,41 @@
             self._info.log("nothing to do")
             return
 
-        mineos = Mineos(self.bin, self.model, self.event, self.stations)
+        jobdir = os.getcwd()
+        
+        archiveDirName = "mineos"
+        os.mkdir(archiveDirName)
+        inputFiles = [self.event] + [self.stations + suffix for suffix in [".site", ".sitechan"]]
+        for inputFile in inputFiles:
+            os.rename(inputFile, os.path.join(archiveDirName, inputFile))
+        os.chdir(archiveDirName)
+        archiveDirPath = os.getcwd()
+        
+        for model in models:
+            self._info.log("running Mineos program suite for model '%s'" % model)
 
+            # create a subdirectory for each model
+            subdir = splitext(basename(model))[0]
+            os.mkdir(subdir)
+            os.chdir(subdir)
+            
+            self.runMineos(model, enabledModes)
+            
+            os.chdir(archiveDirPath)
+
+        # archive the output
+        os.chdir(jobdir)
+        self.spawn("/bin/tar", "cvzf", archiveDirName + ".tar.gz", archiveDirName)
+
+        # clean up
+        self.spawn("/bin/rm", "-rf", archiveDirName)
+
+        return
+
+
+    def runMineos(self, model, enabledModes):
+        mineos = Mineos(model, "../" + self.event, "../" + self.stations)
+
         # minos_bran
         for mode in enabledModes:
             self._info.log("running program 'minos_bran' for '%s' mode" % mode.desc)
@@ -256,7 +301,25 @@
         return
 
 
+    def spawn(self, *argv):
+        command = ' '.join(argv)
+        self._info.log("spawning: %s" % command)
+        status = os.spawnvp(os.P_WAIT, argv[0], argv)
+        statusMsg = "%s: exit %d" % (argv[0], status)
+        self._info.log(statusMsg)
+        if status != 0:
+            sys.exit("%s: %s" % (argv[0], statusMsg))
+        return
+
+
 def main(*args, **kwds):
+    # Redirect all output -- our journal output, and the output of
+    # our children -- to a file.
+    fd = os.open("output_mineos.txt", os.O_CREAT | os.O_WRONLY, mode)
+    os.dup2(fd, 1)
+    os.dup2(fd, 2)
+    os.close(fd)
+    
     mineos = MineosScript()
     mineos.run(*args, **kwds)
 



More information about the cig-commits mailing list