[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