[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