[cig-commits] r4123 - mc/3D/CitcomS/trunk/lib
luis at geodynamics.org
luis at geodynamics.org
Fri Jul 28 17:08:24 PDT 2006
Author: luis
Date: 2006-07-28 17:08:24 -0700 (Fri, 28 Jul 2006)
New Revision: 4123
Modified:
mc/3D/CitcomS/trunk/lib/Output_h5.c
Log:
Added two methods for writing to HDF5 arrays (refactored from CitcomCU).
Modified: mc/3D/CitcomS/trunk/lib/Output_h5.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Output_h5.c 2006-07-28 22:12:39 UTC (rev 4122)
+++ mc/3D/CitcomS/trunk/lib/Output_h5.c 2006-07-29 00:08:24 UTC (rev 4123)
@@ -373,10 +373,59 @@
status = H5Dclose(dataset);
}
-static void h5create_field(hid_t loc_id, const char *name, hid_t type_id,
- int tdim, int xdim, int ydim, int zdim,
- int components)
+static void h5write_array_hyperslab(hid_t dset_id,
+ hid_t mem_type_id,
+ const void *data,
+ int rank,
+ hsize_t *size,
+ hsize_t *memdims,
+ hsize_t *offset,
+ hsize_t *stride,
+ hsize_t *count,
+ hsize_t *block)
{
+ hid_t dataset;
+ hid_t filespace;
+ hid_t memspace;
+ hid_t dxpl_id;
+
+ herr_t status;
+
+ /* extend the dataset if necessary */
+ if(size != NULL)
+ {
+ status = H5Dextend(dataset, size);
+ }
+
+ /* get file dataspace */
+ filespace = H5Dget_space(dataset);
+
+ /* dataset transfer property list */
+ dxpl_id = H5Pcreate(H5P_DATASET_XFER);
+ status = H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_COLLECTIVE);
+ // status = H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_INDEPENDENT);
+
+ /* create memory dataspace */
+ memspace = H5Screate_simple(rank, memdims, NULL);
+
+ /* hyperslab selection */
+ status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET,
+ offset, stride, count, block);
+
+ /* write the data to the hyperslab */
+ status = H5Dwrite(dataset, mem_type_id, memspace, filespace, dxpl_id, data);
+
+ /* release resources */
+ status = H5Pclose(dxpl_id);
+ status = H5Sclose(memspace);
+ status = H5Sclose(filespace);
+}
+
+static void h5create_field(hid_t loc_id,
+ const char *name,
+ hid_t type_id,
+ int tdim, int xdim, int ydim, int zdim, int cdim)
+{
int rank = 0;
hsize_t dims[5] = {0,0,0,0,0};
hsize_t maxdims[5] = {0,0,0,0,0};
@@ -436,12 +485,12 @@
}
/* if field has components, update last dimension */
- if (components > 0)
+ if (cdim > 0)
{
rank += 1;
- dims[rank-1] = components;
- maxdims[rank-1] = components;
- chunkdims[rank-1] = components;
+ dims[rank-1] = cdim;
+ maxdims[rank-1] = cdim;
+ chunkdims[rank-1] = cdim;
}
/* finally, create the array */
h5create_array(loc_id, name, type_id, rank, dims, maxdims, chunk_dims);
@@ -470,10 +519,10 @@
}
/* if field has components, update last dimension */
- if (components > 0)
+ if (cdim > 0)
{
rank += 1;
- dims[rank-1] = components;
+ dims[rank-1] = cdim;
}
/* finally, create the array */
@@ -481,9 +530,145 @@
}
}
-static void h5append_field(hid_t loc_id, hid_t type_id)
+static void h5write_field(hid_t dset_id,
+ hid_t mem_type_id,
+ const void *data,
+ int tdim, int xdim, int ydim, int zdim, int cdim,
+ int nx, int ny, int nz,
+ int px, int py, int pz)
{
+ hid_t dataset;
+ herr_t status;
+ int rank;
+ hsize_t size[5] = {0,0,0,0,0};
+ //hsize_t memdims[5] = {0,0,0,0,0};
+ hsize_t offset[5] = {0,0,0,0,0};
+ hsize_t stride[5] = {1,1,1,1,1};
+ hsize_t count[5] = {1,1,1,1,1};
+ hsize_t block[5] = {0,0,0,0,0}; // XXX: always equal to memdims[]?
+
+ dataset = H5Dopen(loc_id, name);
+
+ if (tdim > 0)
+ {
+ if ((xdim > 0) && (ydim > 0) && (zdim > 0))
+ {
+ rank = 1 + 3;
+
+ size[0] = tdim;
+ size[1] = xdim;
+ size[2] = ydim;
+ size[3] = zdim;
+
+ offset[0] = tdim;
+ offset[1] = px*nx;
+ offset[2] = py*ny;
+ offset[3] = pz*nz;
+
+ block[0] = 1;
+ block[1] = nx;
+ block[2] = ny;
+ block[3] = nz;
+ }
+ else if ((xdim > 0) && (ydim > 0))
+ {
+ rank = 1 + 2;
+
+ size[0] = tdim;
+ size[1] = xdim;
+ size[2] = ydim;
+
+ offset[0] = tdim;
+ offset[1] = px*nx;
+ offset[2] = py*ny;
+
+ block[0] = 1;
+ block[1] = nx;
+ block[2] = ny;
+
+ }
+ else if (zdim > 0)
+ {
+ rank = 1 + 1;
+
+ size[0] = tdim;
+ size[1] = zdim;
+
+ offset[0] = tdim;
+ offset[1] = pz*nz;
+
+ block[0] = 1;
+ block[1] = nz;
+ }
+
+ if (cdim > 0)
+ {
+ rank += 1;
+ size[rank-1] = cdim;
+ offset[rank-1] = 0;
+ block[rank-1] = cdim;
+ }
+
+ h5write_array_hyperslab(dataset, mem_type_id, data,
+ rank, size, block,
+ offset, stride, count, block);
+ }
+ else
+ {
+
+ if ((xdim > 0) && (ydim > 0) && (zdim > 0))
+ {
+ rank = 3;
+
+ size[0] = xdim;
+ size[1] = ydim;
+ size[2] = zdim;
+
+ offset[0] = px*nx;
+ offset[1] = py*ny;
+ offset[2] = pz*nz;
+
+ block[0] = nx;
+ block[1] = ny;
+ block[2] = nz;
+ }
+ else if ((xdim > 0) && (ydim > 0))
+ {
+ rank = 2;
+
+ size[0] = xdim;
+ size[1] = ydim;
+
+ offset[0] = px*nx;
+ offset[1] = py*ny;
+
+ block[0] = nx;
+ block[1] = ny;
+ }
+ else if (zdim > 0)
+ {
+ rank = 1;
+
+ size[0] = zdim;
+ offset[0] = pz*nz;
+ block[0] = nz;
+ }
+
+ if (cdim > 0)
+ {
+ rank += 1;
+ size[rank-1] = cdim;
+ offset[rank-1] = 0;
+ block[rank-1] = cdim;
+ }
+
+ h5write_array_hyperslab(dataset, mem_type_id, data,
+ rank, NULL, block,
+ offset, stride, count, block);
+ }
+
+ status = H5Dclose(dataset);
}
static void h5create_coord(hid_t loc_id, hid_t type_id, int nodex, int nodey, int nodez)
More information about the cig-commits
mailing list