[cig-commits] r9105 - in short/3D/PyLith/trunk: libsrc/meshio libsrc/topology modulesrc/meshio pylith/faults pylith/meshio pylith/problems

brad at geodynamics.org brad at geodynamics.org
Mon Jan 21 10:56:42 PST 2008


Author: brad
Date: 2008-01-21 10:56:42 -0800 (Mon, 21 Jan 2008)
New Revision: 9105

Removed:
   short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW
Modified:
   short/3D/PyLith/trunk/libsrc/meshio/DataWriter.cc
   short/3D/PyLith/trunk/libsrc/meshio/DataWriter.hh
   short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.cc
   short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.hh
   short/3D/PyLith/trunk/libsrc/meshio/OutputManager.cc
   short/3D/PyLith/trunk/libsrc/meshio/OutputManager.hh
   short/3D/PyLith/trunk/libsrc/topology/Distributor.cc
   short/3D/PyLith/trunk/modulesrc/meshio/meshio.pyxe.src
   short/3D/PyLith/trunk/pylith/faults/Fault.py
   short/3D/PyLith/trunk/pylith/meshio/OutputManager.py
   short/3D/PyLith/trunk/pylith/problems/Explicit.py
   short/3D/PyLith/trunk/pylith/problems/Formulation.py
   short/3D/PyLith/trunk/pylith/problems/Implicit.py
   short/3D/PyLith/trunk/pylith/problems/TimeDependent.py
Log:
More work on output. Newest implementation works for volume solution.

Modified: short/3D/PyLith/trunk/libsrc/meshio/DataWriter.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/DataWriter.cc	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/DataWriter.cc	2008-01-21 18:56:42 UTC (rev 9105)
@@ -16,7 +16,8 @@
 
 // ----------------------------------------------------------------------
 // Constructor
-pylith::meshio::DataWriter::DataWriter(void)
+pylith::meshio::DataWriter::DataWriter(void) :
+  _numTimeSteps(0)
 { // constructor
 } // constructor
 
@@ -31,8 +32,10 @@
 void
 pylith::meshio::DataWriter::open(
 			       const ALE::Obj<ALE::Mesh>& mesh,
-			       const spatialdata::geocoords::CoordSys* csMesh)
+			       const spatialdata::geocoords::CoordSys* csMesh,
+			       const int numTimeSteps)
 { // open
+  _numTimeSteps = numTimeSteps;
 } // open
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/meshio/DataWriter.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/DataWriter.hh	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/DataWriter.hh	2008-01-21 18:56:42 UTC (rev 9105)
@@ -41,10 +41,10 @@
 
   /// Enumeration of types of fields
   enum FieldEnum {
-    SCALAR, ///< Scalar field
-    VECTOR, ///< Vector field
-    TENSOR, ///< Tensor field
-    OTHER ///< Other type of field
+    SCALAR_FIELD, ///< Scalar field
+    VECTOR_FIELD, ///< Vector field
+    TENSOR_FIELD, ///< Tensor field
+    OTHER_FIELD ///< Other type of field
   }; // FieldEnum
 
 // PUBLIC METHODS ///////////////////////////////////////////////////////
@@ -68,10 +68,12 @@
    *
    * @param mesh PETSc mesh object 
    * @param csMesh Coordinate system of mesh geometry
+   * @param numTimeSteps Expected number of time steps for fields.
    */
   virtual
   void open(const ALE::Obj<ALE::Mesh>& mesh,
-	    const spatialdata::geocoords::CoordSys* csMesh);
+	    const spatialdata::geocoords::CoordSys* csMesh,
+	    const int numTimeSteps);
 
   /// Close output files.
   virtual
@@ -97,32 +99,30 @@
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field PETSc field over vertices.
+   * @param fieldType Type of field.
    * @param mesh Finite-element mesh
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   virtual
   void writeVertexField(const double t,
 			const char* name,
 			const ALE::Obj<real_section_type>& field,
-			const ALE::Obj<ALE::Mesh>& mesh,
-			const int dim) = 0;
+			const FieldEnum fieldType,
+			const ALE::Obj<ALE::Mesh>& mesh) = 0;
 
   /** Write field over cells to file.
    *
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field PETSc field over cells.
+   * @param fieldType Type of field.
    * @param mesh PETSc mesh object.
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   virtual
   void writeCellField(const double t,
 		      const char* name,
 		      const ALE::Obj<real_section_type>& field,
-		      const ALE::Obj<ALE::Mesh>& mesh,
-		      const int dim) = 0;
+		      const FieldEnum fieldType,
+		      const ALE::Obj<ALE::Mesh>& mesh) = 0;
 
 // PROTECTED METHODS ////////////////////////////////////////////////////
 protected :
@@ -138,6 +138,11 @@
 
   const DataWriter& operator=(const DataWriter&); ///< Not implemented
 
+// PROTECTED MEMBERS ////////////////////////////////////////////////////
+protected :
+
+  int _numTimeSteps; ///< Expected number of time steps for fields.
+
 }; // DataWriter
 
 #endif // pylith_meshio_datawriter_hh

Modified: short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.cc	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.cc	2008-01-21 18:56:42 UTC (rev 9105)
@@ -61,15 +61,19 @@
 
     std::ostringstream buffer;
     const int indexExt = _filename.find(".vtk");
-    char sbuffer[256];
-    sprintf(sbuffer, _timeFormat.c_str(), t);
-    std::string timestamp(sbuffer);
-    
-    const int pos = timestamp.find(".");
-    if (pos != timestamp.length())
-      timestamp.erase(pos, 1);
-    buffer
-      << std::string(_filename, 0, indexExt) << "_t" << timestamp << ".vtk";
+    if (_numTimeSteps > 0) {
+      // If data with multiple time steps, then add time stamp to filename
+      char sbuffer[256];
+      sprintf(sbuffer, _timeFormat.c_str(), t);
+      std::string timestamp(sbuffer);
+      const int pos = timestamp.find(".");
+      if (pos != timestamp.length())
+	timestamp.erase(pos, 1);
+      buffer
+	<< std::string(_filename, 0, indexExt) << "_t" << timestamp << ".vtk";
+    } else
+      buffer
+	<< std::string(_filename, 0, indexExt) << "_info.vtk";
 
     err = PetscViewerCreate(mesh->comm(), &_viewer);
     err = PetscViewerSetType(_viewer, PETSC_VIEWER_ASCII);
@@ -111,8 +115,8 @@
 				       const double t,
 				       const char* name,
 				       const ALE::Obj<real_section_type>& field,
-				       const ALE::Obj<ALE::Mesh>& mesh,
-				       const int dim)
+				       const FieldEnum fieldType,
+				       const ALE::Obj<ALE::Mesh>& mesh)
 { // writeVertexField
   assert(0 != name);
 
@@ -124,8 +128,8 @@
     buffer << name << "_t" << timestamp;
 
     const ALE::Obj<Mesh::label_sequence>& vertices = mesh->depthStratum(0);
-   const int fiberDim = 
-     (dim == 0) ? field->getFiberDimension(*vertices->begin()) : dim;
+    const int fiberDim = (fieldType != VECTOR_FIELD) ? 
+      field->getFiberDimension(*vertices->begin()) : 3;
 
     PetscErrorCode err = SectionView_Sieve_Ascii(mesh, field, 
 						 buffer.str().c_str(), 
@@ -152,8 +156,8 @@
 				       const double t,
 				       const char* name,
 				       const ALE::Obj<real_section_type>& field,
-				       const ALE::Obj<ALE::Mesh>& mesh,
-				       const int dim)
+				       const FieldEnum fieldType,
+				       const ALE::Obj<ALE::Mesh>& mesh)
 { // writeCellField
   assert(0 != name);
 
@@ -167,13 +171,13 @@
     buffer << name << "_t" << timestamp;
 
     err = PetscViewerPushFormat(_viewer, PETSC_VIEWER_ASCII_VTK_CELL);
-
-   // Get fiber dimension of first cell
-   const ALE::Obj<Mesh::label_sequence>& cells = mesh->heightStratum(0);
-   const int fiberDim = 
-     (dim == 0) ? field->getFiberDimension(*cells->begin()) : dim;
-   err = SectionView_Sieve_Ascii(mesh, field, buffer.str().c_str(), 
-				 _viewer, fiberDim);
+    
+    // Get fiber dimension of first cell
+    const ALE::Obj<Mesh::label_sequence>& cells = mesh->heightStratum(0);
+    const int fiberDim = (fieldType != VECTOR_FIELD) ? 
+      field->getFiberDimension(*cells->begin()) : 3;
+    err = SectionView_Sieve_Ascii(mesh, field, buffer.str().c_str(), 
+				  _viewer, fiberDim);
     if (err)
       throw std::runtime_error("Could not write cell data.");   
   } catch (const std::exception& err) {

Modified: short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.hh	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/DataWriterVTK.hh	2008-01-21 18:56:42 UTC (rev 9105)
@@ -75,30 +75,28 @@
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field PETSc field over vertices.
+   * @param fieldType Type of field.
    * @param mesh Finite-element mesh
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   void writeVertexField(const double t,
 			const char* name,
 			const ALE::Obj<real_section_type>& field,
-			const ALE::Obj<ALE::Mesh>& mesh,
-			const int dim =0);
+			const FieldEnum fieldType,
+			const ALE::Obj<ALE::Mesh>& mesh);
 
   /** Write field over cells to file.
    *
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field PETSc field over cells.
+   * @param fieldType Type of field.
    * @param mesh PETSc mesh object.
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   void writeCellField(const double t,
 		      const char* name,
 		      const ALE::Obj<real_section_type>& field,
-		      const ALE::Obj<ALE::Mesh>& mesh,
-		      const int dim =0);
+		      const FieldEnum fieldType,
+		      const ALE::Obj<ALE::Mesh>& mesh);
 
 // PRIVATE METHODS //////////////////////////////////////////////////////
 private :

Modified: short/3D/PyLith/trunk/libsrc/meshio/OutputManager.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/OutputManager.cc	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/OutputManager.cc	2008-01-21 18:56:42 UTC (rev 9105)
@@ -17,7 +17,6 @@
 #include "DataWriter.hh" // USES DataWriter
 #include "VertexFilter.hh" // USES VertexFilter
 #include "CellFilter.hh" // USES CellFilter
-#include "pylith/topology/FieldsManager.hh" // USES FieldsManager
 
 #include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
 
@@ -27,7 +26,8 @@
   _coordsys(0),
   _writer(0),
   _vertexFilter(0),
-  _cellFilter(0)
+  _cellFilter(0),
+  _isInfo(false)
 { // constructor
 } // constructor
 
@@ -57,52 +57,6 @@
 } // writer
 
 // ----------------------------------------------------------------------
-// Set which vertex fields to output.
-void
-pylith::meshio::OutputManager::vertexFields(const char** names,
-					    const char** labels,
-					    const int numFields)
-{ // vertexFields
-  assert( (0 == numFields && 0 == names && 0 == labels) ||
-	  (0 < numFields && 0 != names && 0 != labels) );
-
-  _vertexFields.clear();
-  for (int iField=0; iField < numFields; ++iField)
-    _vertexFields[names[iField]] = _vertexFields[labels[iField]];
-} // vertexFields
-
-// ----------------------------------------------------------------------
-// Set which cell fields to output.
-void
-pylith::meshio::OutputManager::cellFields(const char** names,
-					  const char** labels,
-					  const int numFields)
-{ // cellFields
-  assert( (0 == numFields && 0 == names && 0 == labels) ||
-	  (0 < numFields && 0 != names && 0 != labels) );
-
-  _cellFields.clear();
-  for (int iField=0; iField < numFields; ++iField)
-    _cellFields[names[iField]] = _cellFields[labels[iField]];
-} // cellFields
-
-// ----------------------------------------------------------------------
-// Get vertex fields to output.
-const pylith::meshio::OutputManager::map_names_type&
-pylith::meshio::OutputManager::vertexFields(void) const
-{ // vertexFields
-  return _vertexFields;
-} // vertexFields
-
-// ----------------------------------------------------------------------
-// Get cell fields to output.
-const pylith::meshio::OutputManager::map_names_type&
-pylith::meshio::OutputManager::cellFields(void) const
-{ // cellFields
-  return _cellFields;
-} // cellFields
-
-// ----------------------------------------------------------------------
 // Set filter for vertex data.
 void
 pylith::meshio::OutputManager::vertexFilter(const VertexFilter* filter)
@@ -123,11 +77,12 @@
 void
 pylith::meshio::OutputManager::open(
 				 const ALE::Obj<ALE::Mesh>& mesh,
-				 const spatialdata::geocoords::CoordSys* csMesh)
+				 const spatialdata::geocoords::CoordSys* csMesh,
+				 const int numTimeSteps)
 { // open
   assert(0 != _writer);
 
-  _writer->open(mesh, csMesh);
+  _writer->open(mesh, csMesh, numTimeSteps);
 } // open
 
 // ----------------------------------------------------------------------
@@ -166,15 +121,15 @@
 			       const double t,
 			       const char* name,
 			       const ALE::Obj<real_section_type>& field,
-			       const ALE::Obj<ALE::Mesh>& mesh,
-			       const int dim)
+			       const DataWriter::FieldEnum fieldType,
+			       const ALE::Obj<ALE::Mesh>& mesh)
 { // appendVertexField
   assert(0 != name);
 
   const ALE::Obj<real_section_type>& fieldFiltered = 
     (0 == _vertexFilter) ? field : _vertexFilter->filter(field, mesh);
 
-  _writer->writeVertexField(t, name, fieldFiltered, mesh, dim);
+  _writer->writeVertexField(t, name, fieldFiltered, fieldType, mesh);
 } // appendVertexField
 
 // ----------------------------------------------------------------------
@@ -184,15 +139,15 @@
 				const double t,
 				const char* name,
 				const ALE::Obj<real_section_type>& field,
-				const ALE::Obj<ALE::Mesh>& mesh,
-				const int dim)
+				const DataWriter::FieldEnum fieldType,
+				const ALE::Obj<ALE::Mesh>& mesh)
 { // appendCellField
   assert(0 != name);
 
   const ALE::Obj<real_section_type>& fieldFiltered = 
     (0 == _cellFilter) ? field : _cellFilter->filter(field, mesh);
 
-  _writer->writeCellField(t, name, fieldFiltered, mesh, dim);
+  _writer->writeCellField(t, name, fieldFiltered, fieldType, mesh);
 } // appendCellField
 
 

Modified: short/3D/PyLith/trunk/libsrc/meshio/OutputManager.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/meshio/OutputManager.hh	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/meshio/OutputManager.hh	2008-01-21 18:56:42 UTC (rev 9105)
@@ -19,14 +19,14 @@
 #if !defined(pylith_meshio_outputmanager_hh)
 #define pylith_meshio_outputmanager_hh
 
+#include "DataWriter.hh" // USES DataWriter::FieldEnum
+
 #include "pylith/utils/sievetypes.hh" // USES ALE::Mesh, real_section_type
-#include <map> // USES std::map
 
 namespace pylith {
   namespace meshio {
     class OutputManager;
 
-    class DataWriter; // HOLDS DataWriter
     class CellFilter; // HOLDSA CellFilter
     class VertexFilter; // HOLDSA VertexFilter
   } // meshio
@@ -44,12 +44,6 @@
 // PUBLIC METHODS ///////////////////////////////////////////////////////
 public :
 
-  /// Map to hold field names and mesh labels (name -> label).
-  typedef std::map<std::string, std::string> map_names_type;
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public :
-
   /// Constructor
   OutputManager(void);
 
@@ -69,38 +63,6 @@
    */
   void writer(const DataWriter* datawriter);
 
-  /** Set which vertex fields to output.
-   *
-   * @param names Names of fields.
-   * @param labels Mesh labels of fields.
-   * @param numFields Number of fields.
-   */
-  void vertexFields(const char** names,
-		    const char** labels,
-		    const int numFields);
-
-  /** Set which cell fields to output.
-   *
-   * @param names Names of fields.
-   * @param labels Mesh labels of fields.
-   * @param numFields Number of fields.
-   */
-  void cellFields(const char** names,
-		  const char** labels,
-		  const int numFields);
-
-  /** Get vertex fields to output.
-   *
-   * @returns Map of field name to mesh label for fields.
-   */
-  const map_names_type& vertexFields(void) const;
-
-  /** Get cell fields to output.
-   *
-   * @returns Map of field name to mesh label for fields.
-   */
-  const map_names_type& cellFields(void) const;
-
   /** Set filter for vertex data.
    *
    * @param filter Filter to apply to vertex data before writing.
@@ -115,11 +77,13 @@
 
   /** Prepare for output.
    *
-   * @param mesh PETSc mesh object
-   * @param csMesh Coordinate system of mesh geometry
+   * @param mesh PETSc mesh object.
+   * @param csMesh Coordinate system of mesh geometry.
+   * @param numTimeSteps Expected number of time steps.
    */
   void open(const ALE::Obj<ALE::Mesh>& mesh,
-	    const spatialdata::geocoords::CoordSys* csMesh);
+	    const spatialdata::geocoords::CoordSys* csMesh,
+	    const int numTimeSteps);
 
   /// Close output files.
   void close(void);
@@ -142,47 +106,39 @@
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field Vertex field.
+   * @param fieldType Type of field.
    * @param mesh PETSc mesh object.
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   void appendVertexField(const double t,
 			 const char* name,
 			 const ALE::Obj<real_section_type>& field,
-			 const ALE::Obj<ALE::Mesh>& mesh,
-			 const int dim =0);
+			 const DataWriter::FieldEnum fieldType,
+			 const ALE::Obj<ALE::Mesh>& mesh);
 
   /** Append finite-element cell field to file.
    *
    * @param t Time associated with field.
    * @param name Name of field.
    * @param field Cell field.
+   * @param fieldType Type of field.
    * @param mesh PETSc mesh object.
-   * @param csMesh Coordinate system of mesh geometry
-   * @param dim Fiber dimension to use when writing data
-   *   (=0 means use fiber dimension of field).
    */
   void appendCellField(const double t,
 		       const char* name,
 		       const ALE::Obj<real_section_type>& field,
-		       const ALE::Obj<ALE::Mesh>& mesh,
-		       const int dim =0);
+		       const DataWriter::FieldEnum fieldType,
+		       const ALE::Obj<ALE::Mesh>& mesh);
 
 // PRIVATE MEMBERS //////////////////////////////////////////////////////
-
 private :
 
-  /// Name and section label of vertex fields to output
-  map_names_type _vertexFields;
-
-  /// Name and section label of cell fields to output
-  map_names_type _cellFields;
-
   spatialdata::geocoords::CoordSys* _coordsys; ///< Coordinate system for output.
   DataWriter* _writer; ///< Writer for data.
   VertexFilter* _vertexFilter; ///< Filter applied to vertex data.
   CellFilter* _cellFilter; ///< Filter applied to cell data.
 
+  bool _isInfo; ///< Is output info (diagnostic stuff) or data (solution, etc).
+
 }; // OutputManager
 
 #endif // pylith_meshio_outputmanager_hh

Modified: short/3D/PyLith/trunk/libsrc/topology/Distributor.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/Distributor.cc	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/libsrc/topology/Distributor.cc	2008-01-21 18:56:42 UTC (rev 9105)
@@ -16,6 +16,7 @@
 
 #include "pylith/utils/sievetypes.hh" // USES PETSc Mesh
 #include "pylith/meshio/OutputManager.hh" // USES OutputManager
+#include "pylith/meshio/DataWriter.hh" // USES DataWriter::SCALAR_FIELD
 
 #include <string.h> // USES strlen()
 #include <stdexcept> // USES std::runtime_error
@@ -77,9 +78,11 @@
 
   partition->view("PARTITION");
   const double t = 0.0;
-  output->open(mesh, cs);
+  const int numTimeSteps = 0;
+  output->open(mesh, cs, numTimeSteps);
   output->openTimeStep(t, mesh, cs);
-  output->appendCellField(t, "partition", partition, mesh);
+  output->appendCellField(t, "partition", partition, 
+			  meshio::DataWriter::SCALAR_FIELD, mesh);
   output->closeTimeStep();
   output->close();
 } // write

Modified: short/3D/PyLith/trunk/modulesrc/meshio/meshio.pyxe.src
===================================================================
--- short/3D/PyLith/trunk/modulesrc/meshio/meshio.pyxe.src	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/modulesrc/meshio/meshio.pyxe.src	2008-01-21 18:56:42 UTC (rev 9105)
@@ -24,6 +24,7 @@
 #include "pylith/meshio/MeshIOCubit.hh"
 #endif
 
+#include <strings.h> // USES strcasecmp()
 #include <stdexcept>
 #include <assert.h>
 #include <Python.h>
@@ -597,19 +598,19 @@
     return
 
 
-  def open(self, mesh, cs):
+  def open(self, mesh, cs, numTimeSteps):
     """
     Open output file.
     """
     # create shim for method 'open'
-    #embed{ void OutputManager_open(void* objVptr, void* meshVptr, void* csVptr)
+    #embed{ void OutputManager_open(void* objVptr, void* meshVptr, void* csVptr, int numTimeSteps)
     try {
       assert(0 != objVptr);
       assert(0 != csVptr);
       ALE::Obj<ALE::Mesh>* mesh = (ALE::Obj<ALE::Mesh>*) meshVptr;
       spatialdata::geocoords::CoordSys* cs =
         (spatialdata::geocoords::CoordSys*) csVptr;
-      ((pylith::meshio::OutputManager*) objVptr)->open(*mesh, cs);
+      ((pylith::meshio::OutputManager*) objVptr)->open(*mesh, cs, numTimeSteps);
     } catch (const std::exception& err) {
       PyErr_SetString(PyExc_RuntimeError,
                       const_cast<char*>(err.what()));
@@ -628,7 +629,7 @@
       raise TypeError, \
             "Argument 'cs' must be extension module type 'CoordSys'."
     OutputManager_open(self.thisptr, ptrFromHandle(mesh),
-                       ptrFromHandle(cs))
+                       ptrFromHandle(cs), numTimeSteps)
     return
 
 
@@ -716,12 +717,12 @@
     return
 
 
-  def appendVertexField(self, t, name, field, mesh, dim):
+  def appendVertexField(self, t, name, field, fieldType, mesh):
     """
     Append field over vertices to file.
     """
-    # create shim for method 'appendVertxField'
-    #embed{ void OutputManager_appendVertexField(void* objVptr, double t, char* name, void* fieldVptr, void* meshVptr, int dim)
+    # create shim for method 'appendVertexField'
+    #embed{ void OutputManager_appendVertexField(void* objVptr, double t, char* name, void* fieldVptr, char* fieldTypeName, void* meshVptr)
     try {
       assert(0 != objVptr);
       assert(0 != fieldVptr);
@@ -730,9 +731,16 @@
       ALE::Obj<pylith::real_section_type>* field =
         (ALE::Obj<pylith::real_section_type>*) fieldVptr;
       ALE::Obj<ALE::Mesh>* mesh = (ALE::Obj<ALE::Mesh>*) meshVptr;
+      pylith::meshio::DataWriter::FieldEnum fieldType = 
+        pylith::meshio::DataWriter::OTHER_FIELD;
+      if (0 == strcasecmp("scalar field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::SCALAR_FIELD;
+      else if (0 == strcasecmp("vector field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::VECTOR_FIELD;
+      else if (0 == strcasecmp("tensor field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::TENSOR_FIELD;
       ((pylith::meshio::OutputManager*) objVptr)->appendVertexField(t, name,
-                                                                *field, *mesh,
-                                                                    dim);
+                                                     *field, fieldType, *mesh);
     } catch (const std::exception& err) {
       PyErr_SetString(PyExc_RuntimeError,
                       const_cast<char*>(err.what()));
@@ -746,20 +754,20 @@
     #}embed
     if not mesh.name == "pylith_topology_Mesh":
       raise TypeError, \
-            "Argument must be extension module type 'Mesh'."
+            "Argument 'mesh' must be extension module type 'Mesh'."
     cdef void* fieldVptr
     fieldVptr = PyCObject_AsVoidPtr(field)
-    OutputManager_appendVertexField(self.thisptr, t, name, fieldVptr, 
-                                    ptrFromHandle(mesh), dim)
+    OutputManager_appendVertexField(self.thisptr, t, name, fieldVptr, fieldType, 
+                                    ptrFromHandle(mesh))   
     return
 
 
-  def appendCellField(self, t, name, field, mesh, dim):
+  def appendCellField(self, t, name, field, fieldType, mesh):
     """
     Append field over cells to file.
     """
     # create shim for method 'appendCellField'
-    #embed{ void OutputManager_appendCellField(void* objVptr, double t, char* name, void* fieldVptr, void* meshVptr, int dim)
+    #embed{ void OutputManager_appendCellField(void* objVptr, double t, char* name, void* fieldVptr, char* fieldTypeName, void* meshVptr)
     try {
       assert(0 != objVptr);
       assert(0 != fieldVptr);
@@ -768,10 +776,18 @@
       ALE::Obj<pylith::real_section_type>* field =
         (ALE::Obj<pylith::real_section_type>*) fieldVptr;
       ALE::Obj<ALE::Mesh>* mesh = (ALE::Obj<ALE::Mesh>*) meshVptr;
+      pylith::meshio::DataWriter::FieldEnum fieldType = 
+        pylith::meshio::DataWriter::OTHER_FIELD;
+      if (0 == strcasecmp("scalar field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::SCALAR_FIELD;
+      else if (0 == strcasecmp("vector field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::VECTOR_FIELD;
+      else if (0 == strcasecmp("tensor field", fieldTypeName))
+        fieldType = pylith::meshio::DataWriter::TENSOR_FIELD;
       ((pylith::meshio::OutputManager*) objVptr)->appendCellField(t, name,
                                                                   *field,
-                                                                  *mesh,
-                                                                  dim);
+                                                                  fieldType,
+                                                                  *mesh);
     } catch (const std::exception& err) {
       PyErr_SetString(PyExc_RuntimeError,
                       const_cast<char*>(err.what()));
@@ -788,8 +804,8 @@
             "Argument must be extension module type 'Mesh'."
     cdef void* fieldVptr
     fieldVptr = PyCObject_AsVoidPtr(field)
-    OutputManager_appendCellField(self.thisptr, t, name, fieldVptr,
-                              ptrFromHandle(mesh), dim)
+    OutputManager_appendCellField(self.thisptr, t, name, fieldVptr, fieldType,
+                                  ptrFromHandle(mesh))
     return
 
 
@@ -850,114 +866,6 @@
       OutputManager_writer_set(self.thisptr, ptrFromHandle(writer))
 
 
-  property vertexFields:
-    def __set__(self, fields):
-      """
-      Set names and mesh labels of vertex fields
-      """
-      # create shim for method 'vertexFields'
-      #embed{ void OutputManager_vertexFields_set(void* objVptr, char** names, char** labels, int numFields)
-      try {
-        assert(0 != objVptr);
-        ((pylith::meshio::OutputManager*) objVptr)->vertexFields((const char**) names, 
-                                                                 (const char**) labels,
-                                                                 numFields);
-      } catch (const std::exception& err) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        const_cast<char*>(err.what()));
-      } catch (const ALE::Exception& err) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        const_cast<char*>(err.msg().c_str()));
-      } catch (...) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        "Caught unknown C++ exception.");
-      } // try/catch
-      #}embed
-
-      cdef char** names
-      names = NULL
-      cdef char** labels
-      labels = NULL
-      numFields = len(fields)
-      if numFields > 0:
-        names = <char**> malloc(numFields*sizeof(char*))
-        labels = <char**> malloc(numFields*sizeof(char*))
-      keys = fields.keys()
-      values = fields.values()
-      for i from 0 <= i < numFields:
-        strsize = len(keys[i])
-        names[i] = <char*> malloc(1+strsize*sizeof(char))
-        tmp = keys[i]
-        strcpy(names[i], tmp)
-        strsize = len(values[i])
-        labels[i] = <char*> malloc(1+strsize*sizeof(char))
-        tmp = values[i]
-        strcpy(labels[i], tmp)
-      
-      OutputManager_vertexFields_set(self.thisptr, names, labels, numFields)
-
-      # memory cleanup
-      for i from 0 <= i < numFields:
-        free(<void*> names[i])
-        free(<void*> labels[i])
-      free(<void*> names)
-      free(<void*> labels)
-
-
-  property cellFields:
-    def __set__(self, fields):
-      """
-      Set names and mesh labels of cell fields
-      """
-      # create shim for method 'cellFields'
-      #embed{ void OutputManager_cellFields_set(void* objVptr, char** names, char** labels, int numFields)
-      try {
-        assert(0 != objVptr);
-        ((pylith::meshio::OutputManager*) objVptr)->cellFields((const char**) names, 
-                                                               (const char**) labels,
-                                                                 numFields);
-      } catch (const std::exception& err) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        const_cast<char*>(err.what()));
-      } catch (const ALE::Exception& err) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        const_cast<char*>(err.msg().c_str()));
-      } catch (...) {
-        PyErr_SetString(PyExc_RuntimeError,
-                        "Caught unknown C++ exception.");
-      } // try/catch
-      #}embed
-
-      cdef char** names
-      names = NULL
-      cdef char** labels
-      labels = NULL
-      numFields = len(fields)
-      if numFields > 0:
-        names = <char**> malloc(numFields*sizeof(char*))
-        labels = <char**> malloc(numFields*sizeof(char*))
-      keys = fields.keys()
-      values = fields.values()
-      for i from 0 <= i < numFields:
-        strsize = len(keys[i])
-        names[i] = <char*> malloc(1+strsize*sizeof(char))
-        tmp = keys[i]
-        strcpy(names[i], tmp)
-        strsize = len(values[i])
-        labels[i] = <char*> malloc(1+strsize*sizeof(char))
-        tmp = values[i]
-        strcpy(labels[i], tmp)
-      
-      OutputManager_cellFields_set(self.thisptr, names, labels, numFields)
-
-      # memory cleanup
-      for i from 0 <= i < numFields:
-        free(<void*> names[i])
-        free(<void*> labels[i])
-      free(<void*> names)
-      free(<void*> labels)
-
-
   property vertexFilter:
     def __set__(self, filter):
       """

Modified: short/3D/PyLith/trunk/pylith/faults/Fault.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/Fault.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/faults/Fault.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -168,7 +168,7 @@
 
     # :TODO: Make sure mesh has group of vertices with label.
 
-    self.output.verifyConfiguration()
+    #self.output.verifyConfiguration()
     return
   
 
@@ -178,7 +178,7 @@
     """
     self.quadrature.initialize()
     self.matDB.initialize()
-    self.output.initialize(self.quadrature.cppHandle)
+    #self.output.initialize(self.quadrature.cppHandle)
 
     assert(None != self.cppHandle)
     self.cppHandle.initialize(self.mesh.cppHandle,

Modified: short/3D/PyLith/trunk/pylith/meshio/OutputManager.py
===================================================================
--- short/3D/PyLith/trunk/pylith/meshio/OutputManager.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/meshio/OutputManager.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -38,8 +38,10 @@
     ## Python object for managing OutputManager facilities and properties.
     ##
     ## \b Properties
-    ## @li \b vertex_fields Names of vertex fields to output.
-    ## @li \b cell_fields Names of cell fields to output.
+    ## @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.
@@ -66,12 +68,19 @@
                               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."
+    vertexInfoFields = pyre.inventory.list("vertex_info_fields", default=[])
+    vertexInfoFields.meta['tip'] = "Names of vertex info fields to output."
 
-    cellFields = pyre.inventory.list("cell_fields", default=[])
-    cellFields.meta['tip'] = "Fields of cell data to output."
+    vertexDataFields = pyre.inventory.list("vertex_data_fields", 
+                                           default=["displacements"])
+    vertexDataFields.meta['tip'] = "Names of vertex data fields to output."
 
+    cellInfoFields = pyre.inventory.list("cell_info_fields", default=[])
+    cellInfoFields.meta['tip'] = "Names of cell info fields to output."
+
+    cellDataFields = pyre.inventory.list("cell_data_fields", default=[])
+    cellDataFields.meta['tip'] = "Names of cell data fields to output."
+
     from DataWriterVTK import DataWriterVTK
     writer = pyre.inventory.facility("writer", factory=DataWriterVTK,
                                      family="data_writer")
@@ -104,14 +113,10 @@
     Component.__init__(self, name, facility="outputmanager")
     self._loggingPrefix = "OutM "
     self.cppHandle = None
-    self.coordsys = None
-    self.mesh = None
     self._stepCur = 0
     self._stepWrite = None
     self._tWrite = None
-    self.vertexFields = None
-    self.cellFields = None
-    self._fieldTranslator = copyTranslator
+    self.dataProvider = None
     return
 
 
@@ -119,26 +124,23 @@
     """
     Verify compatibility of configuration.
     """
-    # Verify fields requested for output are available by creating map
-    # of names of requested fields to mesh labels.
-    self._createFieldDicts()
+    self._setupLogging()
+    if None == self.dataProvider:
+      raise ValueError("Need to set 'dataProvider' in OutputManager.")
+    self.dataProvider.verifyFields(self.vertexInfoFields, "vertex", "info")
+    self.dataProvider.verifyFields(self.vertexDataFields, "vertex", "data")
+    self.dataProvider.verifyFields(self.cellInfoFields, "cell", "info")
+    self.dataProvider.verifyFields(self.cellDataFields, "cell", "data")
     return
 
 
-  def fieldTranslator(self, translator):
-    """
-    Set function to call to translate names of fields to mesh labels.
-    """
-    self._fieldTranslator = translator
-    return
-
-
   def initialize(self, quadrature=None):
     """
     Initialize output manager.
     """
-    self._createFieldDicts()
-    
+    logEvent = "%sinit" % self._loggingPrefix
+    self._logger.eventBegin(logEvent)    
+
     # Initialize coordinate system
     if self.coordsys is None:
       raise ValueError, "Coordinate system for output is unknown."
@@ -147,23 +149,31 @@
     self.cellFilter.initialize(quadrature)
     self.writer.initialize()
     self._sync()
+
+    self._logger.eventEnd(logEvent)
     return
 
 
-  def open(self, mesh):
+  def open(self, totalTime, numTimeSteps):
     """
     Prepare for writing data.
     """
-    self._setupLogging()
     logEvent = "%sopen" % self._loggingPrefix
     self._logger.eventBegin(logEvent)    
 
-    self.mesh = mesh # Keep handle to mesh
+    nsteps = numTimeSteps
+    if self.outputFreq == "skip" and self.skip > 0:
+      nsteps = numTimeSteps / (1+self.skip)
+    elif self.outputFreq == "time_step":
+      nsteps = 1 + int(totalTime / self.dt)
+
+    mesh = self.dataProvider.getDataMesh()
     
     assert(None != self.cppHandle)
     assert(None != mesh.cppHandle)
     assert(None != mesh.coordsys.cppHandle)
-    self.cppHandle.open(mesh.cppHandle, mesh.coordsys.cppHandle)
+    self.cppHandle.open(mesh.cppHandle, mesh.coordsys.cppHandle,
+                        nsteps)
 
     self._logger.eventEnd(logEvent)    
     return
@@ -183,92 +193,67 @@
     return
 
 
-  def openTimeStep(self, t):
+  def writeInfo(self):
     """
-    Prepare for writing solution to file.
+    Write information fields.
     """
-    logEvent = "%sopenStep" % self._loggingPrefix
+    logEvent = "%swriteInfo" % self._loggingPrefix
     self._logger.eventBegin(logEvent)    
-    self._info.log("Preparing for writing solution to file.")
 
-    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
-    if write:
-      self._stepWrite = self._stepCur
-      self._tWrite = t
-    self.writeFlag = write
+    if len(self.vertexInfoFields) > 0 or len(self.cellInfoFields) > 0:
+      from pyre.units.time import s
+      t = 0.0*s
+      self.open(totalTime=0.0*s, numTimeSteps=0)
+      mesh = self.dataProvider.getDataMesh()
+      self.cppHandle.openTimeStep(t.value,
+                                  mesh.cppHandle, mesh.coordsys.cppHandle)
 
-    assert(self.cppHandle != None)
-    assert(self.mesh.cppHandle != None)
-    assert(self.mesh.coordsys.cppHandle != None)
-    self.cppHandle.openTimeStep(t.value,
-                                self.mesh.cppHandle,
-                                self.mesh.coordsys.cppHandle)
+      for name in self.vertexInfoFields:
+        (field, fieldType) = self.dataProvider.getVertexField(name)
+        self.cppHandle.appendVertexField(t.value, name, field, fieldType, 
+                                         mesh.cppHandle)
 
-    self._logger.eventEnd(logEvent)    
-    return
+      for name in self.cellInfoFields:
+        (field, fieldType) = self.dataProvider.getCellField(name)
+        self.cppHandle.appendCellField(t.value, name, field, fieldType, 
+                                       mesh.cppHandle)
 
+        self.cppHandle.closeTimeStep()
+        self.close()
 
-  def closeTimeStep(self):
-    """
-    Cleanup after writing solution to file.
-    """
-    logEvent = "%scloseStep" % self._loggingPrefix
-    self._logger.eventBegin(logEvent)    
-    self._info.log("Cleaning up afterwriting solution to file.")
-
-    self.writeFlag = False
-    self._stepCur += 1
-
-    assert(self.cppHandle != None)
-    self.cppHandle.closeTimeStep()
-
-    self._logger.eventEnd(logEvent)    
+    self._logger.eventEnd(logEvent)
     return
 
 
-  def appendVertexField(self, t, name, field, dim=0):
+  def writeData(self, t):
     """
-    Write field over vertices at time t to file.
+    Write fields at current time step.
     """
-    logEvent = "%swriteVertex" % self._loggingPrefix
+    logEvent = "%swriteData" % self._loggingPrefix
     self._logger.eventBegin(logEvent)    
 
-    if self.writeFlag:
-      self._info.log("Writing solution field '%s'." % name)
-      assert(self.cppHandle != None)
-      assert(self.mesh.cppHandle != None)
-      self.cppHandle.appendVertexField(t.value, name, field,
-                                       self.mesh.cppHandle, dim)
+    if self._checkWrite(t):
 
-    self._logger.eventEnd(logEvent)
-    return
+      mesh = self.dataProvider.getDataMesh()
+      self.cppHandle.openTimeStep(t.value,
+                                  mesh.cppHandle, mesh.coordsys.cppHandle)
 
+      for name in self.vertexDataFields:
+        (field, fieldType) = self.dataProvider.getVertexField(name)
+        self.cppHandle.appendVertexField(t.value, name, field, fieldType, 
+                                         mesh.cppHandle)
 
-  def appendCellField(self, t, name, field, dim=0):
-    """
-    Write field over cells at time t to file.
-    """
-    logEvent = "%swriteCell" % self._loggingPrefix
-    self._logger.eventBegin(logEvent)    
+      for name in self.cellDataFields:
+        (field, fieldType) = self.dataProvider.getCellField(name)
+        self.cppHandle.appendCellField(t.value, name, field, fieldType, 
+                                       mesh.cppHandle)
 
-    if self.writeFlag:
-      self._info.log("Writing solution field '%s'." % name)
-      assert(self.cppHandle != None)
-      assert(self.mesh.cppHandle != None)
-      self.cppHandle.appendCellField(t.value, name, field, 
-                                     self.mesh.cppHandle, dim)
+      self.cppHandle.closeTimeStep()
 
     self._logger.eventEnd(logEvent)
     return
-
-
+      
+    
   # PRIVATE METHODS ////////////////////////////////////////////////////
 
   def _configure(self):
@@ -281,8 +266,10 @@
     self.skip = self.inventory.skip
     self.coordsys = self.inventory.coordsys
     self.writer = self.inventory.writer
-    self.vertexFieldNames = self.inventory.vertexFields
-    self.cellFieldNames = self.inventory.cellFields
+    self.vertexInfoFields = self.inventory.vertexInfoFields
+    self.vertexDataFields = self.inventory.vertexDataFields
+    self.cellInfoFields = self.inventory.cellInfoFields
+    self.cellDataFields = self.inventory.cellDataFields
     self.vertexFilter = self.inventory.vertexFilter
     self.cellFilter = self.inventory.cellFilter
     return
@@ -301,27 +288,24 @@
       
     self.cppHandle.coordsys = self.coordsys.cppHandle
     self.cppHandle.writer = self.writer.cppHandle
-    self.cppHandle.vertexFields = self.vertexFields
-    self.cppHandle.cellFields = self.cellFields
     self.cppHandle.vertexFilter = self.vertexFilter.cppHandle
     self.cppHandle.cellFilter = self.cellFilter.cppHandle
     return
 
 
-  def _createFieldDicts(self):
+  def _checkWrite(self, t):
     """
-    Create dictionaries with field names and mesh labels of fields.
+    Check if we want to write data at time t.
     """
-    if None != self.vertexFields and None != self.cellFields:
-      return
-    
-    self.vertexFields = {}
-    self.cellFields = {}
-    for name in self.vertexFieldNames:
-      self.vertexFields[name] = self._fieldTranslator(name)
-    for name in self.cellFieldNames:
-      self.cellFields[name] = self._fieldTranslator(name)
-    return
+    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):
@@ -336,13 +320,13 @@
     logger.setClassName("FE Output")
     logger.initialize()
 
-    events = ["open",
+    events = ["init",
+              "open",
               "close",
-              "writeFields",
               "openStep",
               "closeStep",
-              "writeVertex",
-              "writeCell"]
+              "writeInfo",
+              "writeData"]
     for event in events:
       logger.registerEvent("%s%s" % (self._loggingPrefix, event))
 
@@ -359,13 +343,4 @@
   return OutputManager()
 
 
-# MISCELLANEOUS ////////////////////////////////////////////////////////
-
-def copyTranslator(name):
-  """
-  Field translator that simply copies the field name.
-  """
-  return name
-
-
 # End of file 

Deleted: short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW
===================================================================
--- short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/meshio/OutputManager.py.NEW	2008-01-21 18:56:42 UTC (rev 9105)
@@ -1,329 +0,0 @@
-#!/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."
-
-    vertexInfoFields = pyre.inventory.list("vertex_info_fields", default=[])
-    vertexInfoFields.meta['tip'] = "Names of vertex info fields to output."
-
-    vertexDataFields = pyre.inventory.list("vertex_data_fields", default=[])
-    vertexDataFields.meta['tip'] = "Names of vertex data fields to output."
-
-    cellInfoFields = pyre.inventory.list("cell_info_fields", default=[])
-    cellInfoFields.meta['tip'] = "Names of cell info fields to output."
-
-    cellDataFields = pyre.inventory.list("cell_data_fields", default=[])
-    cellDataFields.meta['tip'] = "Names of cell data fields 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._stepCur = 0
-    self._stepWrite = None
-    self._tWrite = 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.verifyVertexInfoFields(self.vertexInfoFields)
-    self.dataProvider.verifyVertexDataFields(self.vertexDataFields)
-    self.dataProvider.verifyCellInfoFields(self.cellInfoFields)
-    self.dataProvider.verifyCellDataFields(self.cellDataFields)
-    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.getDataMesh()
-    
-    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.
-    """
-    from pyre.units.time import s
-    t = 0.0*s
-    # Do we want to set an info flag in open()?
-    self.open()
-    mesh = self.dataProvider.getDataMesh()
-    self.cppHandle.openTimeStep(t.value,
-                                mesh.cppHandle, mesh.coordsys.cppHandle)
-
-    for name in self.vertexInfoFields:
-      (field, fieldType) = self.dataProvider.getVertexField(name)
-      self.cppHandle.appendVertexField(t.value, name, field, fieldType, mesh)
-
-    for name in self.cellInfoFields:
-      (field, fieldType) = self.dataProvider.getCellField(name)
-      self.cppHandle.appendCellField(t.value, name, field, fieldType, mesh)
-
-    self.cppHandle.closeTimeStep()
-    self.close()
-
-    return
-
-
-  def writeData(self, t):
-    """
-    Write fields at current time step.
-    """
-    if self._checkWrite(t):
-
-      mesh = self.dataProvider.getDataMesh()
-      self.cppHandle.openTimeStep(t.value,
-                                  mesh.cppHandle, mesh.coordsys.cppHandle)
-
-      for name in self.vertexDataFields:
-        (field, fieldType) = self.dataProvider.getVertexField(name)
-        self.cppHandle.appendVertexField(t.value, name, field, fieldType, mesh)
-
-      for name in self.cellDataFields:
-        (field, fieldType) = self.dataProvider.getCellField(name)
-        self.cppHandle.appendCellField(t.value, name, field, fieldType, mesh)
-
-      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.vertexInfoFields = self.inventory.vertexInfoFields
-    self.vertexDataFields = self.inventory.vertexDataFields
-    self.cellInfoFields = self.inventory.cellInfoFields
-    self.cellDataFields = self.inventory.cellDataFields
-    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 

Modified: short/3D/PyLith/trunk/pylith/problems/Explicit.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/Explicit.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/problems/Explicit.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -59,13 +59,13 @@
     return ElasticityExplicit()
 
 
-  def initialize(self, dimension, dt):
+  def initialize(self, dimension, totalTime, dt):
     """
     Initialize problem for explicit time integration.
     """
     from pyre.units.time import second
     t = 0.0*second
-    Formulation.initialize(self, dimension, dt)
+    Formulation.initialize(self, dimension, totalTime, dt)
 
     logEvent = "%sinit" % self._loggingPrefix
     self._logger.eventBegin(logEvent)

Modified: short/3D/PyLith/trunk/pylith/problems/Formulation.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/Formulation.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/problems/Formulation.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -164,13 +164,14 @@
     for constraint in self.constraints:
       constraint.verifyConfiguration()
     for output in self.output.bin:
+      output.dataProvider = self
       output.verifyConfiguration()
 
     self._logger.eventEnd(logEvent)
     return
   
 
-  def initialize(self, dimension, dt):
+  def initialize(self, dimension, totalTime, dt):
     """
     Create integrators for each element family.
     """
@@ -193,8 +194,10 @@
 
     self._info.log("Setting up solution output.")
     for output in self.output.bin:
+      numTimeSteps = 1.0 + int(totalTime / dt)
       output.initialize()
-      output.open(self.mesh)
+      output.writeInfo()
+      output.open(totalTime, numTimeSteps)
     self._debug.log(resourceUsageString())
 
     self._info.log("Creating solution field.")
@@ -252,10 +255,7 @@
     self._info.log("Writing solution fields.")
     field = self.fields.getSolution()
     for output in self.output.bin:
-      output.openTimeStep(t+dt)
-      output.appendVertexField(t+dt, self.solnField['label'],
-                               field, dim=3)
-      output.closeTimeStep()
+      output.writeData(t+dt)
     #for integrator in integrators:
     #  integrator.poststep(t, dt, totalTime)
     #for constraint in constraints:
@@ -286,6 +286,71 @@
     return
   
 
+  def verifyFields(self, names, fieldCategory, dataCategory):
+    """
+    Verify vertex info fields for output are available.
+    """
+    if fieldCategory == "vertex":
+      if dataCategory == "info":
+        available=[]
+        notavailable=names
+      elif dataCategory == "data":
+        available = ["displacements"]
+        notavailable = []
+        for name in names:
+          if not name in available:
+            notavailable.append(name)
+    elif fieldCategory == "cell":
+      available=[]
+      notavailable=names
+    else:
+      raise ValueError, \
+          "Argument 'fieldCategory' must be 'vertex' or 'field'." \
+          "Current value: '%s'" % fieldCategory
+    if len(notavailable) > 0:
+      msg = \
+          "Requested fields not available for output.\n" \
+          "Field type: '%s'\n" \
+          "Data type: '%s'\n" % (fieldCategory, dataCategory)
+      msg += "Available fields: "
+      for name in available:
+        msg += " '%s'" % name
+      msg += "\n"
+      msg += "Fields not available: "
+      for name in notavailable:
+        msg += " '%s'" % name
+      raise ValueError(msg)
+    return
+
+
+  def getDataMesh(self):
+    """
+    Get mesh associated with data fields.
+    """
+    return self.mesh
+
+
+  def getVertexField(self, name):
+    """
+    Get vertex field.
+    """
+    field = None
+    fieldType = None
+    if name == "displacements":
+      field = self.fields.getSolution()
+      fieldType = "vector field"
+    else:
+      raise ValueError, "Vertex field '%s' not available for output." % name
+    return (field, fieldType)
+
+
+  def getCellField(self):
+    field = None
+    fieldType = None
+    raise ValueError, "Cell field '%s' not available for output." % name
+    return (field, fieldType)
+
+
   # PRIVATE METHODS ////////////////////////////////////////////////////
 
   def _configure(self):

Modified: short/3D/PyLith/trunk/pylith/problems/Implicit.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/Implicit.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/problems/Implicit.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -84,11 +84,11 @@
     return ElasticityImplicit()
 
 
-  def initialize(self, dimension, dt):
+  def initialize(self, dimension, totalTime, dt):
     """
     Initialize problem for implicit time integration.
     """
-    Formulation.initialize(self, dimension, dt)
+    Formulation.initialize(self, dimension, totalTime, dt)
 
     logEvent = "%sinit" % self._loggingPrefix
     self._logger.eventBegin(logEvent)

Modified: short/3D/PyLith/trunk/pylith/problems/TimeDependent.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/TimeDependent.py	2008-01-21 08:25:09 UTC (rev 9104)
+++ short/3D/PyLith/trunk/pylith/problems/TimeDependent.py	2008-01-21 18:56:42 UTC (rev 9105)
@@ -138,7 +138,7 @@
     self._logger.eventBegin(logEvent)
 
     self._info.log("Initializing problem.")
-    self.formulation.initialize(self.dimension, self.dt)
+    self.formulation.initialize(self.dimension, self.totalTime, self.dt)
 
     self._logger.eventEnd(logEvent)
     return



More information about the cig-commits mailing list