[cig-commits] r9055 - short/3D/PyLith/trunk/pylith/meshio

brad at geodynamics.org brad at geodynamics.org
Mon Jan 14 22:28:10 PST 2008


Author: brad
Date: 2008-01-14 22:28:09 -0800 (Mon, 14 Jan 2008)
New Revision: 9055

Added:
   short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW
Log:
Added temporary file while discussing implementation.

Added: short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW
===================================================================
--- short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW	2008-01-15 05:28:31 UTC (rev 9054)
+++ short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW	2008-01-15 06:28:09 UTC (rev 9055)
@@ -0,0 +1,318 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pyre/meshio/OutputManager.py
+##
+## @brief Python object for managing output of finite-element
+## information.
+##
+## Factory: output_manager
+
+from pyre.components.Component import Component
+
+# OutputManager class
+class OutputManager(Component):
+  """
+  Python object for managing output of finite-element information.
+
+  Factory: output_manager
+  """
+
+  # INVENTORY //////////////////////////////////////////////////////////
+
+  class Inventory(Component.Inventory):
+    """
+    Python object for managing OutputManager facilities and properties.
+    """
+
+    ## @class Inventory
+    ## Python object for managing OutputManager facilities and properties.
+    ##
+    ## \b Properties
+    ## @li \b vertex_info_fields Names of vertex info fields to output.
+    ## @li \b vertex_data_fields Names of vertex data fields to output.
+    ## @li \b cell_info_fields Names of cell info fields to output.
+    ## @li \b cell_data_fields Names of cell data fields to output.
+    ## @li \b output_freq Flag indicating whether to use 'time_step' or 'skip'
+    ##   to set frequency of solution output.
+    ## @li \b time_step Time step between solution output.
+    ## @li \b skip Number of time steps to skip between solution output.
+    ##
+    ## \b Facilities
+    ## @li \b writer Writer for data.
+    ## @li \b coordsys Coordinate system for output.
+    ## @li \b vertex_filter Filter for vertex data.
+    ## @li \b cell_filter Filter for cell data.
+
+    import pyre.inventory
+
+    outputFreq = pyre.inventory.str("output_freq", default="skip",
+             validator=pyre.inventory.choice(["skip", "time_step"]))
+    outputFreq.meta['tip'] = "Flag indicating whether to use 'time_step' " \
+                             "or 'skip' to set frequency of output."
+
+    from pyre.units.time import s
+    dt = pyre.inventory.dimensional("time_step", default=1.0*s)
+    dt.meta['tip'] = "Time step between output."
+
+    skip = pyre.inventory.int("skip", default=0,
+                              validator=pyre.inventory.greaterEqual(0))
+    skip.meta['tip'] = "Number of time steps to skip between output."
+
+    vertexFields = pyre.inventory.list("vertex_fields", default=[])
+    vertexFields.meta['tip'] = "Fields of vertex data to output."
+
+    cellFields = pyre.inventory.list("cell_fields", default=[])
+    cellFields.meta['tip'] = "Fields of cell data to output."
+
+    from DataWriterVTK import DataWriterVTK
+    writer = pyre.inventory.facility("writer", factory=DataWriterVTK,
+                                     family="data_writer")
+    writer.meta['tip'] = "Writer for data."
+
+    from spatialdata.geocoords.CSCart import CSCart
+    coordsys = pyre.inventory.facility("coordsys", family="coordsys",
+                                       factory=CSCart)
+    coordsys.meta['tip'] = "Coordinate system for output."
+  
+    from VertexFilter import VertexFilter
+    vertexFilter = pyre.inventory.facility("vertex_filter",
+                                           factory=VertexFilter,
+                                           family="output_vertex_filter")
+    vertexFilter.meta['tip'] = "Filter for vertex data."
+                                     
+    from CellFilter import CellFilter
+    cellFilter = pyre.inventory.facility("cell_filter",
+                                           factory=CellFilter,
+                                           family="output_cell_filter")
+    cellFilter.meta['tip'] = "Filter for cell data."
+                                     
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="outputmanager"):
+    """
+    Constructor.
+    """
+    Component.__init__(self, name, facility="outputmanager")
+    self._loggingPrefix = "OutM "
+    self.cppHandle = None
+    self.coordsys = None
+    self._stepCur = 0
+    self._stepWrite = None
+    self._tWrite = None
+    self.vertexFields = None
+    self.cellFields = None
+    self.dataProvider = None
+    return
+
+  def verifyConfiguration(self):
+    """
+    Verify compatibility of configuration.
+    """
+    if None == self.dataProvide:
+      raise ValueError("Need to set 'dataProvider' in OutputManager.")
+    self.dataProvider.verifyVertexFields(self.vertexFields)
+    self.dataProvider.verifyCellFields(self.cellFields)
+    return
+
+
+  def initialize(self, quadrature=None):
+    """
+    Initialize output manager.
+    """
+    # Initialize coordinate system
+    if self.coordsys is None:
+      raise ValueError, "Coordinate system for output is unknown."
+    self.coordsys.initialize()
+
+    self.cellFilter.initialize(quadrature)
+    self.writer.initialize()
+    self._sync()
+    return
+
+
+  def open(self):
+    """
+    Prepare for writing data.
+    """
+    self._setupLogging()
+    logEvent = "%sopen" % self._loggingPrefix
+    self._logger.eventBegin(logEvent)    
+
+    mesh = self.dataProvider.mesh
+    
+    assert(None != self.cppHandle)
+    assert(None != mesh.cppHandle)
+    assert(None != mesh.coordsys.cppHandle)
+    self.cppHandle.open(mesh.cppHandle, mesh.coordsys.cppHandle)
+
+    self._logger.eventEnd(logEvent)    
+    return
+
+
+  def close(self):
+    """
+    Perform post-write cleanup.
+    """
+    logEvent = "%sclose" % self._loggingPrefix
+    self._logger.eventBegin(logEvent)    
+
+    assert(None != self.cppHandle)
+    self.cppHandle.close()
+
+    self._logger.eventEnd(logEvent)    
+    return
+
+
+  def writeInfo(self):
+    """
+    Write information fields.
+    """
+    self.open()
+    mesh = self.dataProvider.mesh
+    self.cppHandle.openTimeStep(mesh)
+
+    for name in self.vertexFieldsInfo:
+      field = self.dataProvider.getVertexField(name)
+      self.cppHandle.appendVertexField(field)
+
+    for name in self.cellFieldsInfo:
+      field = self.dataProvider.getCellField(name)
+      self.cppHandle.appendCellField(field)
+
+    self.cppHandle.closeTimeStep()
+    self.close()
+
+    return
+
+
+  def writeData(self, t):
+    """
+    Write fields at current time step.
+    """
+    if self._checkWrite(t):
+
+      mesh = self.dataProvider.mesh
+      self.cppHandle.openTimeStep(mesh)
+
+      for name in self.vertexFieldsData:
+        field = self.dataProvider.getVertexField(name)
+        self.cppHandle.appendVertexField(field)
+
+      for name in self.cellFieldsData:
+        field = self.dataProvider.getCellField(name)
+        self.cppHandle.appendCellField(field)
+
+      self.cppHandle.closeTimeStep()
+
+    return
+      
+    
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _configure(self):
+    """
+    Set members based using inventory.
+    """
+    Component._configure(self)
+    self.outputFreq = self.inventory.outputFreq
+    self.dt = self.inventory.dt
+    self.skip = self.inventory.skip
+    self.coordsys = self.inventory.coordsys
+    self.writer = self.inventory.writer
+    self.vertexFieldsInfo = self.inventory.vertexFieldsInfo
+    self.vertexFieldsData = self.inventory.vertexFieldsData
+    self.cellFieldsInfo = self.inventory.cellFields
+    self.vertexFilter = self.inventory.vertexFilter
+    self.cellFilter = self.inventory.cellFilter
+    return
+
+
+  def _sync(self):
+    """
+    Force synchronization between Python and C++.
+    """
+    if None == self.cppHandle:
+      import pylith.meshio.meshio as bindings
+      self.cppHandle = bindings.OutputManager()
+
+    assert(self.coordsys.cppHandle != None)
+    assert(self.writer.cppHandle != None)
+      
+    self.cppHandle.coordsys = self.coordsys.cppHandle
+    self.cppHandle.writer = self.writer.cppHandle
+    self.cppHandle.vertexFilter = self.vertexFilter.cppHandle
+    self.cppHandle.cellFilter = self.cellFilter.cppHandle
+    return
+
+
+  def _checkWrite(self, t):
+    """
+    Check if we want to write data at time t.
+    """
+    write = False
+    if self._stepWrite == None or not "value" in dir(self._tWrite):
+      write = True
+    elif self.outputFreq == "skip":
+      if self._stepCur > self._stepWrite + self.skip:
+        write = True
+    elif t >= self._tWrite + self.dt:
+      write = True
+    return write
+
+
+  def _setupLogging(self):
+    """
+    Setup event logging.
+    """
+    if not "_loggingPrefix" in dir(self):
+      self._loggingPrefix = ""
+
+    from pylith.utils.EventLogger import EventLogger
+    logger = EventLogger()
+    logger.setClassName("FE Output")
+    logger.initialize()
+
+    events = ["open",
+              "close",
+              "writeFields",
+              "openStep",
+              "closeStep",
+              "writeVertex",
+              "writeCell"]
+    for event in events:
+      logger.registerEvent("%s%s" % (self._loggingPrefix, event))
+
+    self._logger = logger
+    return
+  
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def output_manager():
+  """
+  Factory associated with OutputManager.
+  """
+  return OutputManager()
+
+
+# MISCELLANEOUS ////////////////////////////////////////////////////////
+
+def copyTranslator(name):
+  """
+  Field translator that simply copies the field name.
+  """
+  return name
+
+
+# End of file 



More information about the cig-commits mailing list