[cig-commits] r18490 - in short/3D/PyLith/trunk: libsrc/pylith/meshio unittests/libtests/meshio unittests/libtests/meshio/data

brad at geodynamics.org brad at geodynamics.org
Mon May 30 12:09:26 PDT 2011


Author: brad
Date: 2011-05-30 12:09:25 -0700 (Mon, 30 May 2011)
New Revision: 18490

Modified:
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterHDF5.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.h5
Log:
Fixed bugs in Xdmf.

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc	2011-05-30 19:09:25 UTC (rev 18490)
@@ -234,8 +234,10 @@
   _tstampIndex = 0;
 
   Xdmf metafile;
-  const int indexExt = _filename.find(".h5");
-  std::string xdmfFilename = std::string(_filename, 0, indexExt) + ".xmf";
+  const std::string& hdf5filename = _hdf5Filename();
+  const int indexExt = hdf5filename.find(".h5");
+  std::string xdmfFilename = 
+    std::string(hdf5filename, 0, indexExt) + ".xmf";
   metafile.write(xdmfFilename.c_str(), _hdf5Filename().c_str());
 } // close
 
@@ -287,10 +289,10 @@
     else
       _timesteps[field.label()] += 1;
     const int istep = _timesteps[field.label()];
-    // Add time stamp to "/vertex_fields/time" if necessary.
+    // Add time stamp to "/time" if necessary.
     const int rank = sieveMesh->commRank();
     if (_tstampIndex == istep)
-      _writeTimeStamp(t, "/vertex_fields", rank);
+      _writeTimeStamp(t, rank);
 
 #if 0 // debugging
     field.view("writeVertexField");
@@ -381,9 +383,10 @@
     else
       _timesteps[field.label()] += 1;
     const int istep = _timesteps[field.label()];
-    // Add time stamp to "/cell_fields/time" if necessary.
+    // Add time stamp to "/time" if necessary.
+    const int rank = sieveMesh->commRank();
     if (_tstampIndex == istep)
-      _writeTimeStamp(t, "/cell_fields", sieveMesh->commRank());
+      _writeTimeStamp(t, rank);
 
     // Set temporary block size that matches fiber dimension for output.
     int blockSize = 0;
@@ -396,6 +399,14 @@
     err = PetscViewerHDF5PopGroup(_viewer); CHECK_PETSC_ERROR(err);
     err = VecSetBlockSize(vector, blockSize); CHECK_PETSC_ERROR(err);
 
+    if (!rank && 0 == istep) {
+      hid_t h5 = -1;
+      err = PetscViewerHDF5GetFileId(_viewer, &h5); CHECK_PETSC_ERROR(err);
+      assert(h5 >= 0);
+      std::string fullName = std::string("/cell_fields/") + field.label();
+      HDF5::writeAttribute(h5, fullName.c_str(), "vector_field_type",
+			   topology::FieldBase::vectorFieldString(field.vectorFieldType()));
+    } // if
   } catch (const std::exception& err) {
     std::ostringstream msg;
     msg << "Error while writing field '" << field.label() << "' at time " 
@@ -432,9 +443,9 @@
 // Write time stamp to file.
 template<typename mesh_type, typename field_type>
 void
-pylith::meshio::DataWriterHDF5<mesh_type,field_type>::_writeTimeStamp(const double t,
-								      const char* group,
-								      const int rank)
+pylith::meshio::DataWriterHDF5<mesh_type,field_type>::_writeTimeStamp(
+						    const double t,
+						    const int rank)
 { // _writeTimeStamp
   PetscErrorCode err = 0;
 
@@ -444,7 +455,7 @@
   err = VecAssemblyBegin(_tstamp); CHECK_PETSC_ERROR(err);
   err = VecAssemblyEnd(_tstamp); CHECK_PETSC_ERROR(err);
   
-  err = PetscViewerHDF5PushGroup(_viewer, group); CHECK_PETSC_ERROR(err);
+  err = PetscViewerHDF5PushGroup(_viewer, "/"); CHECK_PETSC_ERROR(err);
   err = PetscViewerHDF5SetTimestep(_viewer, _tstampIndex); CHECK_PETSC_ERROR(err);
   err = VecView(_tstamp, _viewer); CHECK_PETSC_ERROR(err);
   err = PetscViewerHDF5PopGroup(_viewer); CHECK_PETSC_ERROR(err);

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.hh	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.hh	2011-05-30 19:09:25 UTC (rev 18490)
@@ -135,11 +135,9 @@
   /** Write time stamp to file.
    *
    * @param t Time in seconds.
-   * @param group Name of group ['/vertex_fields' or '/cell_fields']
    * @param rank Processor rank in MPI communicator.
    */
   void _writeTimeStamp(const double t,
-		       const char* group,
 		       const int rank);
 
 // NOT IMPLEMENTED //////////////////////////////////////////////////////

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc	2011-05-30 19:09:25 UTC (rev 18490)
@@ -19,6 +19,7 @@
 #include <portinfo>
 
 #include "HDF5.hh" // USES HDF5
+#include "Xdmf.hh" // USES Xdmf
 
 #include <cassert> // USES assert()
 #include <sstream> // USES std::ostringstream
@@ -266,6 +267,12 @@
   } // if
   _tstampIndex = 0;
   deallocate();
+
+  Xdmf metafile;
+  const std::string& hdf5filename = _hdf5Filename();
+  const int indexExt = hdf5filename.find(".h5");
+  std::string xdmfFilename = std::string(hdf5filename, 0, indexExt) + ".xmf";
+  metafile.write(xdmfFilename.c_str(), _hdf5Filename().c_str());
 } // close
 
 // ----------------------------------------------------------------------
@@ -383,8 +390,9 @@
 	_h5->extendDatasetRawExternal("/vertex_fields", field.label(),
 				      dims, ndims);
       } // if/else
+      // Update time stamp in "/time, if necessary.
       if (_tstampIndex+1 == _datasets[field.label()].numTimeSteps)
-	_writeTimeStamp(t, "/vertex_fields");
+	_writeTimeStamp(t);
     } // if
 
   } catch (const std::exception& err) {
@@ -501,6 +509,9 @@
 	_h5->createDatasetRawExternal("/cell_fields", field.label(),
 				      _datasetFilename(field.label()).c_str(),
 				      dims, ndims, H5T_IEEE_F64BE);
+	std::string fullName = std::string("/cell_fields/") + field.label();
+	_h5->writeAttribute(fullName.c_str(), "vector_field_type",
+			    topology::FieldBase::vectorFieldString(field.vectorFieldType()));
       } else {
 	// Update number of time steps in external dataset info in HDF5 file.
 	const int totalNumTimeSteps = 
@@ -516,9 +527,9 @@
 	_h5->extendDatasetRawExternal("/cell_fields", field.label(),
 				      dims, ndims);
       } // if/else
-      // Update time stamp in "/cell_fields/time, if necessary.
+      // Update time stamp in "/time, if necessary.
       if (_tstampIndex+1 == _datasets[field.label()].numTimeSteps)
-	_writeTimeStamp(t, "/cell_fields");
+	_writeTimeStamp(t);
     } // if
 
   } catch (const std::exception& err) {
@@ -571,14 +582,10 @@
 template<typename mesh_type, typename field_type>
 void
 pylith::meshio::DataWriterHDF5Ext<mesh_type,field_type>::_writeTimeStamp(
-						  const double t,
-						  const char* group)
+						  const double t)
 { // _writeTimeStamp
   assert(_h5);
 
-  assert(_h5->hasGroup(group));
-  std::string datasetFullName = std::string(group) + "/time";
-
   const int ndims = 3;
 
   // Each time stamp has a size of 1.
@@ -587,14 +594,14 @@
   dimsChunk[1] = 1;
   dimsChunk[2] = 1;
 
-  if (!_h5->hasDataset(datasetFullName.c_str())) {
+  if (!_h5->hasDataset("/time")) {
     // Create dataset
     // Dataset has unknown size.
     hsize_t dims[3];
     dims[0] = H5S_UNLIMITED;
     dims[1] = 1;
     dims[2] = 1;
-    _h5->createDataset(group, "time", dims, dimsChunk, ndims, 
+    _h5->createDataset("/", "time", dims, dimsChunk, ndims, 
 		       H5T_NATIVE_DOUBLE);
   } // if
   
@@ -604,7 +611,7 @@
   dims[0] = _tstampIndex+1;
   dims[1] = 1;
   dims[2] = 1;
-  _h5->writeDatasetChunk(group, "time", &t, dims, dimsChunk, ndims, 
+  _h5->writeDatasetChunk("/", "time", &t, dims, dimsChunk, ndims, 
 			 _tstampIndex, H5T_NATIVE_DOUBLE);
   
   _tstampIndex++;

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.hh	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.hh	2011-05-30 19:09:25 UTC (rev 18490)
@@ -139,10 +139,8 @@
   /** Write time stamp to file.
    *
    * @param t Time in seconds.
-   * @param group Name of group ['/vertex_fields' or '/cell_fields']
    */
-  void _writeTimeStamp(const double t,
-		       const char* group);  
+  void _writeTimeStamp(const double t);  
 
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.cc	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.cc	2011-05-30 19:09:25 UTC (rev 18490)
@@ -253,14 +253,12 @@
       throw std::runtime_error("Could not get group info.");
     const int gsize = ginfo.nlinks;
     
-    names->resize(gsize-1);
+    names->resize(gsize);
     for (int i=0, index=0; i < gsize; ++i) {
       char buffer[256];
       ssize_t namelen = 
 	H5Lget_name_by_idx(group, ".", H5_INDEX_NAME, H5_ITER_NATIVE,
 			   i, buffer, 256, H5P_DEFAULT);
-      if (0 == strcmp("time", buffer))
-	continue;
       (*names)[index++] = buffer;
     } // for
     
@@ -878,7 +876,7 @@
 pylith::meshio::HDF5::readDatasetChunk(const char* parent,
 				       const char* name,
 				       char** const data,
-				       hsize_t** const dims,
+				       hsize_t** const dimsChunk,
 				       int* const ndims,
 				       const int chunk,
 				       hid_t datatype)
@@ -886,7 +884,7 @@
   assert(parent);
   assert(name);
   assert(data);
-  assert(dims);
+  assert(dimsChunk);
   assert(_file > 0);
 
   try {
@@ -914,30 +912,30 @@
 
     *ndims = H5Sget_simple_extent_ndims(dataspace);
     assert(*ndims > 0);
-    delete[] *dims; *dims = (*ndims > 0) ? new hsize_t[*ndims] : 0;
-    H5Sget_simple_extent_dims(dataspace, *dims, 0);
+    hsize_t* dims = (*ndims > 0) ? new hsize_t[*ndims] : 0;
+    H5Sget_simple_extent_dims(dataspace, dims, 0);
 
     // Select hyperslab in file
-    hsize_t* dimsChunk = (*ndims > 0) ? new hsize_t[*ndims] : 0;
+    delete[] *dimsChunk; *dimsChunk = (*ndims > 0) ? new hsize_t[*ndims] : 0;
     hsize_t* count = (*ndims > 0) ? new hsize_t[*ndims] : 0;
     hsize_t* stride = (*ndims > 0) ? new hsize_t[*ndims] : 0;
     hsize_t* offset = (*ndims > 0) ? new hsize_t[*ndims] : 0;
     
     for (int i=0; i < *ndims; ++i) {
-      dimsChunk[i] = (*dims)[i];
+      (*dimsChunk)[i] = dims[i];
       count[i] = 1;
       stride[i] = 1;
       offset[i] = 0;
     } // for
-    dimsChunk[0] = 1;
+    (*dimsChunk)[0] = 1;
     offset[0] = chunk;
 
-    hid_t chunkspace = H5Screate_simple(*ndims, dimsChunk, 0);
+    hid_t chunkspace = H5Screate_simple(*ndims, *dimsChunk, 0);
     if (chunkspace < 0)
       throw std::runtime_error("Could not create chunk dataspace.");
 
     herr_t err = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET,
-				     offset, stride, count, dimsChunk);
+				     offset, stride, count, *dimsChunk);
     delete[] count; count = 0;
     delete[] stride; stride = 0;
     delete[] offset; offset = 0;
@@ -946,9 +944,9 @@
 
     int sizeBytes = H5Tget_size(datatype);
     for (int i=0; i < *ndims; ++i)
-      sizeBytes *= (dimsChunk)[i];
+      sizeBytes *= (*dimsChunk)[i];
     delete[] *data; *data = (sizeBytes > 0) ? new char[sizeBytes] : 0;
-    delete[] dimsChunk; dimsChunk = 0;
+    delete[] dims; dims = 0;
 
     err = H5Dread(dataset, datatype, chunkspace, dataspace, 
 		  H5P_DEFAULT, (void*)*data);

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.hh	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/HDF5.hh	2011-05-30 19:09:25 UTC (rev 18490)
@@ -224,15 +224,15 @@
    * @param parent Full path of parent group for dataset.
    * @param name Name of dataset.
    * @param data Data.
-   * @param dims Dimensions of data.
-   * @param ndims Number of dimensions of data.
+   * @param dims Dimensions of chunk.
+   * @param ndims Number of dimensions of chunk.
    * @param islice Index of data slice.
    * @param datatype Type of data.
    */
   void readDatasetChunk(const char* parent,
 			const char* name,
 			char** const data,
-			hsize_t** const dims,
+			hsize_t** const dimsChunk,
 			int* const ndims,
 			const int chunk,
 			hid_t datatype);

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc	2011-05-30 19:09:25 UTC (rev 18490)
@@ -20,7 +20,8 @@
 
 #include "HDF5.hh" // USES HDF5
 
-#include "pylith/utils/array.hh" // USES double_array
+#include "pylith/topology/FieldBase.hh" // USES FieldBase enums
+#include "pylith/utils/array.hh" // USES double_arra
 
 #include <string> // USES std::string
 #include <stdexcept> // USES std::runtime_error
@@ -105,22 +106,27 @@
   _getTimeStamps(&timeStamps, h5);
 
   // Fields metadata
-  _getFieldMetadata(&fieldsMetadata, h5, spaceDim);
+  _getFieldMetadata(&fieldsMetadata, h5);
 
   // Write Xdmf file.
   _file.open(filenameXdmf);
   if (!_file.is_open() || !_file.good()) {
     std::ostringstream msg;
     msg << "Could not open Xdmf file '" << filenameXdmf
-	<< "' for writing metadata forHDF5 file '"
+	<< "' for writing metadata for HDF5 file '"
 	<< filenameHDF5 << "'.\n";
     throw std::runtime_error(msg.str());
   } // if
 
+  const std::string& h5string = std::string(filenameHDF5);
+  const hsize_t indexSlash = h5string.find_last_of("/");
+  const hsize_t indexPre = (indexSlash != h5string.npos) ? indexSlash+1 : 0;
+  const std::string filenameHDF5Rel = h5string.substr(indexPre);
+
   _file
     << "<?xml version=\"1.0\" ?>\n"
     << "<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" [\n"
-    << "<!ENTITY HeavyData \"" << filenameHDF5 << "\">\n"
+    << "<!ENTITY HeavyData \"" << filenameHDF5Rel << "\">\n"
     << "]>\n"
     << "\n"
     << "<Xdmf>\n"
@@ -132,14 +138,14 @@
   _file
     << "    <!-- ============================================================ -->\n";
 
-  if (timeStamps.size() > 0) {
+  const int numTimeStamps = timeStamps.size();
+  const int numFields = fieldsMetadata.size();
+  if (numTimeStamps > 1) {
     _file << "    <Grid Name=\"TimeSeries\" GridType=\"Collection\" "
 	  << "CollectionType=\"Temporal\">\n";
 
     _writeTimeStamps(timeStamps);
 
-    const int numTimeStamps = timeStamps.size();
-    const int numFields = fieldsMetadata.size();
     for (int iTimeStep=0; iTimeStep < numTimeStamps; ++iTimeStep) {
       _file
 	<< "      <Grid Name=\"domain\" GridType=\"Uniform\">\n";
@@ -161,10 +167,22 @@
     } // for
     _file << "    </Grid>\n";
   } else {
-    // No time steps or fields (just the mesh).
+    // One time step or no time steps (just the mesh).
     _file << "    <Grid Name=\"domain\" GridType=\"Uniform\">\n";
     _writeGridTopology(cellType.c_str(), numCells);
     _writeGridGeometry(spaceDim);
+    const int iTimeStep = 0;
+    for (int iField=0; iField < numFields; ++iField) {
+      if (2 == spaceDim && 
+	  std::string("Vector") == fieldsMetadata[iField].vectorFieldType) {
+	for (int component=0; component < spaceDim; ++component)
+	  _writeGridAttributeComponent(fieldsMetadata[iField],
+				       iTimeStep, component);
+      } else {
+	_writeGridAttribute(fieldsMetadata[iField],
+			    iTimeStep);
+      } // if/else
+    } // for
     _file << "    </Grid>\n";
   } // if
   
@@ -186,8 +204,8 @@
   int ndims = 0;
   double* t = 0;
 
-  if (h5.hasGroup("/vertex_fields")) {
-    h5.getDatasetDims(&dims, &ndims, "/vertex_fields", "time");
+  if (h5.hasDataset("/time")) {
+    h5.getDatasetDims(&dims, &ndims, "/", "time");
     assert(3 == ndims);
     const int numTimeStamps = dims[0];
     assert(1 == dims[1]);
@@ -196,7 +214,7 @@
     // Dataset is in chunks of 1.
     timeStamps->resize(numTimeStamps);
     for (int i=0; i < numTimeStamps; ++i) {
-      h5.readDatasetChunk("/vertex_fields", "time", (char**)&t,
+      h5.readDatasetChunk("/", "time", (char**)&t,
 			  &dims, &ndims, i, H5T_NATIVE_DOUBLE);
       assert(3 == ndims);
       assert(1 == dims[0]);
@@ -204,59 +222,14 @@
       assert(1 == dims[2]);
       (*timeStamps)[i] = t[0];
     } // for
-
-    if (h5.hasGroup("/cell_fields")) {
-      // vertify time stamps in vertex and cell fields match
-      h5.getDatasetDims(&dims, &ndims, "/cell_fields", "time");
-      assert(3 == ndims);
-      if (numTimeStamps != dims[0])
-	throw std::runtime_error("Time stamps in '/vertex_fields/time' and "
-				 "'/cell_fields/time' must be identical.");
-      assert(1 == dims[1]);
-      assert(1 == dims[2]);
-
-      // Dataset is in chunks of 1.
-      for (int i=0; i < numTimeStamps; ++i) {
-	h5.readDatasetChunk("/cell_fields", "time", (char**)&t,
-			    &dims, &ndims, i, H5T_NATIVE_DOUBLE);
-	assert(3 == ndims);
-	assert(1 == dims[0]);
-	assert(1 == dims[1]);
-	assert(1 == dims[2]);
-	if (t[0] != (*timeStamps)[i])
-	  throw std::runtime_error("Time stamps in '/vertex_fields/time' and "
-				   "'/cell_fields/time' must be identical.");
-      } // for
-    } // if
-    
   } // if
-  if (h5.hasGroup("/cell_fields")) {
-    h5.getDatasetDims(&dims, &ndims, "/cell_fields", "time");
-    assert(3 == ndims);
-    const int numTimeStamps = dims[0];
-    assert(1 == dims[1]);
-    assert(1 == dims[2]);
-
-    // Dataset is in chunks of 1.
-    timeStamps->resize(numTimeStamps);
-    for (int i=0; i < numTimeStamps; ++i) {
-      h5.readDatasetChunk("/cell_fields", "time", (char**)&t,
-			  &dims, &ndims, i, H5T_NATIVE_DOUBLE);
-      assert(3 == ndims);
-      assert(1 == dims[0]);
-      assert(1 == dims[1]);
-      assert(1 == dims[2]);
-      (*timeStamps)[i] = t[0];
-    } // for
-  } // if
 } // _getTimeStamps
 
 // ----------------------------------------------------------------------
 // Get field metadata from HDF5 file.
 void
 pylith::meshio::Xdmf::_getFieldMetadata(std::vector<FieldMetadata>* metadata,
-					HDF5& h5,
-					const int spaceDim)
+					HDF5& h5)
 { // _getFieldMetadata
   assert(metadata);
 
@@ -264,68 +237,104 @@
   hsize_t* dims = 0;
   int ndims = 0;
 
-  int fieldOffset = 0;
+  int iOffset = 0;
   if (h5.hasGroup("/vertex_fields")) {
     const char* parent = "/vertex_fields";
     h5.getGroupDatasets(&fieldNames, parent);
     const int numFields = fieldNames.size();
 
-    metadata->resize(fieldOffset+numFields);
+    metadata->resize(iOffset+numFields);
     for (int i=0; i < numFields; ++i) {
       h5.getDatasetDims(&dims, &ndims, parent, fieldNames[i].c_str());
-      (*metadata)[i].name = fieldNames[i];
-      (*metadata)[i].domain = "Node";
+      std::string fullName = 
+	std::string(parent) + std::string("/") + fieldNames[i];
+      const std::string& vectorFieldString = 
+	h5.readAttribute(fullName.c_str(), "vector_field_type");
+      switch(topology::FieldBase::parseVectorFieldString(vectorFieldString.c_str())) {
+      case topology::FieldBase::SCALAR :
+	(*metadata)[iOffset+i].vectorFieldType = "Scalar";
+	break;
+      case topology::FieldBase::VECTOR :
+	(*metadata)[iOffset+i].vectorFieldType = "Vector";
+	break;
+      case topology::FieldBase::TENSOR :
+	(*metadata)[iOffset+i].vectorFieldType = "Tensor";
+	break;
+      default :
+	(*metadata)[iOffset+i].vectorFieldType = "Matrix";
+      } // switch
+
+      (*metadata)[iOffset+i].name = fieldNames[i];
+      (*metadata)[iOffset+i].domain = "Node";
       if (2 == ndims) {
-	(*metadata)[i].numTimeSteps = 1;
-	(*metadata)[i].numPoints = dims[0];
-	(*metadata)[i].fiberDim = dims[1];
+	(*metadata)[iOffset+i].numTimeSteps = 1;
+	(*metadata)[iOffset+i].numPoints = dims[0];
+	(*metadata)[iOffset+i].fiberDim = dims[1];
       } else {
 	assert(3 == ndims);
-	(*metadata)[i].numTimeSteps = dims[0];
-	(*metadata)[i].numPoints = dims[1];
-	(*metadata)[i].fiberDim = dims[2];
+	(*metadata)[iOffset+i].numTimeSteps = dims[0];
+	(*metadata)[iOffset+i].numPoints = dims[1];
+	(*metadata)[iOffset+i].fiberDim = dims[2];
       } // if/else
     } // for
 
-    fieldOffset += fieldNames.size();
+    iOffset += fieldNames.size();
   } // if
   if (h5.hasGroup("/cell_fields")) {
     const char* parent = "/cell_fields";
     h5.getGroupDatasets(&fieldNames, parent);
     const int numFields = fieldNames.size();
 
-    metadata->resize(fieldOffset+numFields);
+    metadata->resize(iOffset+numFields);
     for (int i=0; i < numFields; ++i) {
       h5.getDatasetDims(&dims, &ndims, parent, fieldNames[i].c_str());
-      (*metadata)[i].name = fieldNames[i];
-      (*metadata)[i].domain = "Cell";
+      std::string fullName =
+	std::string(parent) + std::string("/") + fieldNames[i];
+      const std::string& vectorFieldString = 
+	h5.readAttribute(fullName.c_str(), "vector_field_type");
+      switch(topology::FieldBase::parseVectorFieldString(vectorFieldString.c_str())) {
+      case topology::FieldBase::SCALAR :
+	(*metadata)[iOffset+i].vectorFieldType = "Scalar";
+	break;
+      case topology::FieldBase::VECTOR :
+	(*metadata)[iOffset+i].vectorFieldType = "Vector";
+	break;
+      case topology::FieldBase::TENSOR :
+	(*metadata)[iOffset+i].vectorFieldType = "Tensor";
+	break;
+      default :
+	(*metadata)[iOffset+i].vectorFieldType = "Matrix";
+      } // switch
+
+      (*metadata)[iOffset+i].name = fieldNames[i];
+      (*metadata)[iOffset+i].domain = "Cell";
       if (2 == ndims) {
-	(*metadata)[i].numTimeSteps = 1;
-	(*metadata)[i].numPoints = dims[0];
-	(*metadata)[i].fiberDim = dims[1];
+	(*metadata)[iOffset+i].numTimeSteps = 1;
+	(*metadata)[iOffset+i].numPoints = dims[0];
+	(*metadata)[iOffset+i].fiberDim = dims[1];
       } else {
 	assert(3 == ndims);
-	(*metadata)[i].numTimeSteps = dims[0];
-	(*metadata)[i].numPoints = dims[1];
-	(*metadata)[i].fiberDim = dims[2];
+	(*metadata)[iOffset+i].numTimeSteps = dims[0];
+	(*metadata)[iOffset+i].numPoints = dims[1];
+	(*metadata)[iOffset+i].fiberDim = dims[2];
       } // if/else
     } // for
 
-    fieldOffset += fieldNames.size();
+    iOffset += fieldNames.size();
   } // if
 
-  const int numFields = metadata->size();
-  for (int i=0; i < numFields; ++i) {
-    const int fiberDim = (*metadata)[i].fiberDim;
-    if (1 == fiberDim)
-      (*metadata)[i].vectorFieldType = "Scalar";
-    else if (fiberDim == spaceDim)
-      (*metadata)[i].vectorFieldType = "Vector";
-    else if (6 == fiberDim)
-      (*metadata)[i].vectorFieldType = "Tensor";
-    else
-      (*metadata)[i].vectorFieldType = "Matrix";
+#if 0 // debugging
+  std::cout << "FIELD METADATA" << std::endl;
+  for (int i=0; i < fieldNames.size(); ++i) {
+    std::cout << "  Name: '" << (*metadata)[i].name << "'"
+	      << ", type: " << (*metadata)[i].vectorFieldType
+	      << ", domain: " << (*metadata)[i].domain
+	      << ", #timesteps: " << (*metadata)[i].numTimeSteps
+	      << ", numPoints: " << (*metadata)[i].numPoints
+	      << ", fiberDim: " << (*metadata)[i].fiberDim
+	      << std::endl;
   } // for
+#endif
 } // _getFieldMetadata
 
 // ----------------------------------------------------------------------
@@ -450,7 +459,7 @@
     << "            <DataItem\n"
     << "	       Dimensions=\"3 3\"\n"
     << "	       Format=\"XML\">\n"
-    << "              0 0 0\n"
+    << "              " << iTime << " 0 0\n"
     << "              1 1 1\n"
     << "              1 " << metadata.numPoints << " 1\n"
     << "	    </DataItem>\n"
@@ -512,7 +521,7 @@
   _file
     << "	<Attribute\n"
     << "	   Name=\"" << componentName << "\"\n"
-    << "	   Type=\""<< metadata.vectorFieldType << "\"\n"
+    << "	   Type=\"Scalar\"\n"
     << "	   Center=\"" << metadata.domain << "\">\n"
     << "          <DataItem ItemType=\"HyperSlab\"\n"
     << "		    Dimensions=\"1 " << metadata.numPoints << " 1\"\n"
@@ -520,7 +529,7 @@
     << "            <DataItem\n"
     << "	       Dimensions=\"3 3\"\n"
     << "	       Format=\"XML\">\n"
-    << "              0 0 "<< component << "\n"
+    << "              " << iTime << " 0 "<< component << "\n"
     << "              1 1 1\n"
     << "              1 " << metadata.numPoints << " 1\n"
     << "	    </DataItem>\n"

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh	2011-05-30 19:09:25 UTC (rev 18490)
@@ -95,11 +95,9 @@
    *
    * @param metadata Array of field metadata.
    * @param h5 HDF5 file.
-   * @param spaceDim Spatial dimension.
    */
   void _getFieldMetadata(std::vector<FieldMetadata>* metadata,
-			 HDF5& h5,
-			 const int spaceDim);
+			 HDF5& h5);
 
   /** Write domain cell information.
    *

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterHDF5.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterHDF5.cc	2011-05-29 23:59:03 UTC (rev 18489)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterHDF5.cc	2011-05-30 19:09:25 UTC (rev 18490)
@@ -137,7 +137,6 @@
 
   hid_t file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
   CPPUNIT_ASSERT(file >= 0);
-
 #if defined(PYLITH_HDF5_USE_API_18)
 
   // Traverse recursively file with expected values.
@@ -147,7 +146,6 @@
 
 #else
 #endif
-
   err = H5Fclose(fileE);
   CPPUNIT_ASSERT(err >= 0);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.h5
===================================================================
(Binary files differ)



More information about the CIG-COMMITS mailing list