diff options
Diffstat (limited to 'src/DumpUtils.c')
-rw-r--r-- | src/DumpUtils.c | 306 |
1 files changed, 122 insertions, 184 deletions
diff --git a/src/DumpUtils.c b/src/DumpUtils.c index 0234fea..4ab5688 100644 --- a/src/DumpUtils.c +++ b/src/DumpUtils.c @@ -28,12 +28,11 @@ CCTK_FILEVERSION(BetaThorns_IOHDF5Util_DumpUtils_c) @date Tue Oct 10 2000 @author Thomas Radke @desc - Dump all variables of the given GH along with - the global attributes and parameters - to the (already opened) HDF5 checkpoint file. + Dump all variables of the given GH along with the global + attributes and parameters to the given HDF5 checkpoint file. @enddesc @var GH - @vdesc Pointer to CCTK grid hierarchy + @vdesc pointer to CCTK grid hierarchy @vtype const cGH * @vio in @endvar @@ -54,50 +53,34 @@ CCTK_FILEVERSION(BetaThorns_IOHDF5Util_DumpUtils_c) (should be 0 for success, or negative if some error occured) @endreturndesc @@*/ -int IOHDF5Util_DumpGH (const cGH *GH, - const int *timers, - hid_t file) +int IOHDF5Util_DumpGH (const cGH *GH, const int *timers, hid_t file) { - int retval, maxdim; - int first_vindex, vindex, gindex; - int timelevel, last_timelevel; + int first_vindex, gindex, timelevels, retval; cGroup gdata; - int old_out_single; - ioGH *ioUtilGH; - ioHDF5Geo_t request; - /*** FIXME: can CCTK_SyncGroup() have a 'const cGH *' parameter ?? ***/ - union - { - const cGH *const_ptr; - cGH *non_const_ptr; - } GH_fake_const; + ioSlab slab; DECLARE_CCTK_PARAMETERS retval = 0; - GH_fake_const.const_ptr = GH; - - /* Get the GH extension for IOUtil */ - ioUtilGH = (ioGH *) CCTK_GHExtension (GH, "IO"); - - maxdim = CCTK_MaxDim (); - request.origin = (int *) calloc (4 + maxdim, maxdim * sizeof (int)); - request.length = request.origin + 1 * maxdim; - request.downsample = request.origin + 2 * maxdim; - request.actlen = request.origin + 3 * maxdim; - request.direction = request.origin + 4 * maxdim; - - for (vindex = 0; vindex < maxdim; vindex++) + /* set up a hyperslab description for full hyperslabs */ + slab.vdim = CCTK_MaxDim (); + slab.vectors = (CCTK_INT *) calloc (slab.vdim + 6, + slab.vdim * sizeof(CCTK_INT)); + slab.hoffset = slab.vectors + 0*slab.vdim; + slab.hsize = slab.vectors + 1*slab.vdim; + slab.hsize_chunk = slab.vectors + 2*slab.vdim; + slab.origin = slab.vectors + 3*slab.vdim; + slab.extent = slab.vectors + 4*slab.vdim; + slab.downsample = slab.vectors + 5*slab.vdim; + slab.direction = slab.vectors + 6*slab.vdim; + + for (slab.hdim = 0; slab.hdim < slab.vdim; slab.hdim++) { - request.length[vindex] = -1; - request.downsample[vindex] = 1; + slab.extent[slab.hdim] = -1; + slab.downsample[slab.hdim] = 1; } - /* disable output in single precision */ - old_out_single = ioUtilGH->out_single; - ioUtilGH->out_single = 0; - /* start CP_PARAMETERS_TIMER timer */ if (timers) { @@ -105,7 +88,7 @@ int IOHDF5Util_DumpGH (const cGH *GH, CCTK_TimerStartI (timers[CP_PARAMETERS_TIMER]); } - /* Great; Now start dumping away! */ + /* now start dumping away */ if (file >= 0) { /* all GH extension variables and parameter stuff which is not @@ -130,47 +113,45 @@ int IOHDF5Util_DumpGH (const cGH *GH, /* ... now the variables, sorted by groups */ for (gindex = CCTK_NumGroups () - 1; gindex >= 0; gindex--) { - /* only dump groups which belong to an active implementation - and have storage assigned */ - if (! CCTK_IsImplementationActive (CCTK_ImpFromVarI (CCTK_FirstVarIndexI - (gindex))) || - CCTK_QueryGroupStorageI (GH, gindex) <= 0) + /* only dump groups which have storage assigned */ + if (CCTK_QueryGroupStorageI (GH, gindex) <= 0) { continue; } - /* sync the group */ - CCTK_SyncGroupI (GH_fake_const.non_const_ptr, gindex); - /* dump all timelevels except the oldest (for multi-level groups) */ CCTK_GroupData (gindex, &gdata); - last_timelevel = gdata.numtimelevels; - if (last_timelevel > 1) + timelevels = gdata.numtimelevels; + if (timelevels > 1) { - last_timelevel--; + timelevels--; } - request.sdim = request.vdim = gdata.dim; + slab.hdim = slab.vdim = gdata.dim; + slab.check_exist = 0; + slab.hdatatype = gdata.vartype; /* set the hyperslab directions (orthogonal to all axes) */ - memset (request.direction, 0, request.sdim * request.vdim * sizeof (int)); - for (vindex = 0; vindex < request.sdim; vindex++) + memset (slab.direction, 0, slab.hdim * slab.vdim * sizeof (int)); + for (slab.hdim = 0; slab.hdim < slab.vdim; slab.hdim++) { - request.direction[vindex * request.vdim + vindex] = 1; + slab.direction[slab.hdim * (slab.vdim + 1)] = 1; } /* loop over all variables in this group */ first_vindex = CCTK_FirstVarIndexI (gindex); - for (vindex = first_vindex; vindex < first_vindex + gdata.numvars; vindex++) + for (slab.vindex = first_vindex; + slab.vindex < first_vindex + gdata.numvars; + slab.vindex++) { if (verbose && file >= 0) { - CCTK_VInfo (CCTK_THORNSTRING, " %s", CCTK_VarName (vindex)); + CCTK_VInfo (CCTK_THORNSTRING, " %s", CCTK_VarName (slab.vindex)); } /* loop over all timelevels of this variable */ - for (timelevel = 0; timelevel < last_timelevel; timelevel++) + for (slab.timelevel = 0; slab.timelevel < timelevels; slab.timelevel++) { - retval += IOHDF5Util_DumpVar (GH, vindex, timelevel, &request, file, 0); + retval += IOHDF5Util_DumpVar (GH, &slab, file); } } /* end of loop over all variables */ @@ -182,11 +163,8 @@ int IOHDF5Util_DumpGH (const cGH *GH, CCTK_TimerStopI (timers[CP_VARIABLES_TIMER]); } - /* restore output precision flag */ - ioUtilGH->out_single = old_out_single; - /* free temporary resources */ - free (request.origin); + free (slab.vectors); return (retval); } @@ -210,45 +188,26 @@ int IOHDF5Util_DumpGH (const cGH *GH, </ul> @enddesc @var GH - @vdesc Pointer to CCTK grid hierarchy + @vdesc pointer to CCTK grid hierarchy @vtype const cGH * @vio in @endvar - @var vindex - @vdesc CCTK index of the variable to dump - @vtype int - @vio in - @endvar - @var timelevel - @vdesc timelevel of the variable to dump - @vtype int - @vio in - @endvar - @var global_shape - @vdesc global shape of the grid - @vtype CCTK_INT [] - @vio in - @endvar - @var request - @vdesc pointer to IO request structure describing the hyperslab - @vtype ioHDF5Geo_t * + @var slab + @vdesc reference to the I/O hyperslab description + @vtype const ioSlab * @vio in @endvar @var dataset - @vdesc the dataset handle where the attributes should be attached to + @vdesc the object handle where the attributes should be attached to @vtype hid_t @vio in @endvar @@*/ -void IOHDF5Util_DumpCommonAttributes (const cGH *GH, - int vindex, - int timelevel, - const CCTK_INT *global_shape, - const ioHDF5Geo_t *request, - hid_t dataset) +void IOHDF5Util_DumpCommonAttributes (const cGH *GH, const ioSlab *slab, + hid_t object) { - char *groupname; int dim, vdim; + char *groupname; CCTK_INT attr_int; CCTK_REAL *attr_real; ioHDF5UtilGH *myGH; @@ -256,27 +215,19 @@ void IOHDF5Util_DumpCommonAttributes (const cGH *GH, DECLARE_CCTK_PARAMETERS - /* prevent compiler warning about unused parameter */ - timelevel = timelevel; - - /* Get the handle for IOHDF5Util extensions */ myGH = (ioHDF5UtilGH *) CCTK_GHExtension (GH, "IOHDF5Util"); /* attributes describing the variable */ - groupname = CCTK_GroupNameFromVarI (vindex); - WRITE_ATTRIBUTE ("groupname", groupname, dataset, - myGH->scalar_dataspace, 0, myGH->IOHDF5_STRING); + groupname = CCTK_GroupNameFromVarI (slab->vindex); + WRITE_ATTRIBUTE ("groupname", groupname, object, myGH, 0, myGH->HDF5_STRING); free (groupname); - attr_int = CCTK_GroupTypeFromVarI (vindex); - WRITE_ATTRIBUTE ("grouptype", &attr_int, dataset, - myGH->scalar_dataspace, 0, IOHDF5_INT); - attr_int = CCTK_NumTimeLevelsFromVarI (vindex); - WRITE_ATTRIBUTE ("ntimelevels", &attr_int, dataset, - myGH->scalar_dataspace, 0, IOHDF5_INT); - WRITE_ATTRIBUTE ("global_size", global_shape, dataset, - myGH->array_dataspace, request->sdim, IOHDF5_INT); - WRITE_ATTRIBUTE ("time", &GH->cctk_time, dataset, - myGH->scalar_dataspace, 0, IOHDF5_REAL); + attr_int = CCTK_GroupTypeFromVarI (slab->vindex); + WRITE_ATTRIBUTE ("grouptype", &attr_int, object, myGH, 0, HDF5_INT); + attr_int = CCTK_NumTimeLevelsFromVarI (slab->vindex); + WRITE_ATTRIBUTE ("ntimelevels", &attr_int, object, myGH, 0, HDF5_INT); + WRITE_ATTRIBUTE ("global_size", slab->hsize, object, myGH, slab->hdim, + HDF5_INT); + WRITE_ATTRIBUTE ("time", &GH->cctk_time, object, myGH, 0, HDF5_REAL); /* attributes describing the underlying grid These are only stored for CCTK_GF variables if they are associated @@ -284,9 +235,9 @@ void IOHDF5Util_DumpCommonAttributes (const cGH *GH, /* FIXME: This is hardcoded for cartesian coordinate systems. A better solution would be to be able to query the coordinate system which is associated with the variable. */ - vdim = CCTK_GroupDimFromVarI (vindex); + vdim = CCTK_GroupDimFromVarI (slab->vindex); sprintf (coord_system_name, "cart%dd", vdim); - if (CCTK_GroupTypeFromVarI (vindex) == CCTK_GF && + if (CCTK_GroupTypeFromVarI (slab->vindex) == CCTK_GF && CCTK_CoordSystemHandle (coord_system_name) >= 0) { attr_real = (CCTK_REAL *) malloc (2 * vdim * sizeof (CCTK_REAL)); @@ -296,45 +247,42 @@ void IOHDF5Util_DumpCommonAttributes (const cGH *GH, NULL, coord_system_name); } - WRITE_ATTRIBUTE ("origin", attr_real, dataset, - myGH->array_dataspace, vdim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("min_ext", attr_real, dataset, - myGH->array_dataspace, vdim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("max_ext", attr_real + vdim, dataset, - myGH->array_dataspace, vdim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("delta", GH->cctk_delta_space, dataset, - myGH->array_dataspace, vdim, IOHDF5_REAL); + WRITE_ATTRIBUTE ("origin", attr_real, object, myGH, vdim, HDF5_REAL); + WRITE_ATTRIBUTE ("min_ext", attr_real, object, myGH, vdim, HDF5_REAL); + WRITE_ATTRIBUTE ("max_ext", attr_real + vdim, object, myGH, vdim,HDF5_REAL); + WRITE_ATTRIBUTE ("delta", GH->cctk_delta_space, object, myGH, vdim, + HDF5_REAL); free (attr_real); } #if 0 /* attributes describing the hyperslab */ /* FIXME: what attributes are really needed here ?? ***/ - if (request) + if (slab) { - attr_real = (CCTK_REAL *) malloc (4 * request->sdim * sizeof (CCTK_REAL)); - for (dim = 0; dim < request->sdim; dim++) + attr_real = (CCTK_REAL *) malloc (4 * slab->hdim * sizeof (CCTK_REAL)); + for (dim = 0; dim < slab->hdim; dim++) { - attr_real[dim + 0*request->sdim] = - request->origin[request->direction[dim]] * - GH->cctk_delta_space[request->direction[dim]]; - attr_real[dim + 1*request->sdim] = - request->origin[dim] * GH->cctk_delta_space[dim]; - attr_real[dim + 2*request->sdim] = - (request->origin[dim] + request->actlen[dim]-1) * - GH->cctk_delta_space[dim] * request->downsample[dim]; - attr_real[dim + 3*request->sdim] = - GH->cctk_delta_space[request->direction[dim]] * - request->downsample[request->direction[dim]]; + attr_real[dim + 0*slab->hdim] = + slab->origin[slab->direction[dim]] * + GH->cctk_delta_space[slab->direction[dim]]; + attr_real[dim + 1*slab->hdim] = + slab->origin[dim] * GH->cctk_delta_space[dim]; + attr_real[dim + 2*slab->hdim] = + (slab->origin[dim] + slab->actlen[dim]-1) * + GH->cctk_delta_space[dim] * slab->downsample[dim]; + attr_real[dim + 3*slab->hdim] = + GH->cctk_delta_space[slab->direction[dim]] * + slab->downsample[slab->direction[dim]]; } - WRITE_ATTRIBUTE ("origin_slab", attr_real + 0*dim, dataset, - myGH->array_dataspace, dim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("min_ext_slab", attr_real + 1*dim, dataset, - myGH->array_dataspace, dim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("max_ext_slab", attr_real + 2*dim, dataset, - myGH->array_dataspace, dim, IOHDF5_REAL); - WRITE_ATTRIBUTE ("delta_slab", attr_real + 3*dim, dataset, - myGH->array_dataspace, dim, IOHDF5_REAL); + WRITE_ATTRIBUTE ("origin_slab", attr_real + 0*dim, object, myGH, dim, + HDF5_REAL); + WRITE_ATTRIBUTE ("min_ext_slab", attr_real + 1*dim, object, myGH, dim, + HDF5_REAL); + WRITE_ATTRIBUTE ("max_ext_slab", attr_real + 2*dim, object, myGH, dim, + HDF5_REAL); + WRITE_ATTRIBUTE ("delta_slab", attr_real + 3*dim, object, myGH, dim, + HDF5_REAL); free (attr_real); } #endif @@ -351,7 +299,7 @@ void IOHDF5Util_DumpCommonAttributes (const cGH *GH, attached to the CACTUS_PARAMETERS_GROUP group in the HDF5 file. @enddesc @var GH - @vdesc Pointer to CCTK grid hierarchy + @vdesc pointer to CCTK grid hierarchy @vtype const cGH * @vio in @endvar @@ -380,18 +328,16 @@ void IOHDF5Util_DumpParameters (const cGH *GH, int all, hid_t file) CCTK_INFO ("Dumping Parameters ..."); } - /* Get the parameter string buffer */ + /* get the parameter string buffer */ parameters = IOUtil_GetAllParameters (GH, all); if (parameters) { - /* Get the handle for IOHDF5Util extensions */ myGH = (ioHDF5UtilGH *) CCTK_GHExtension (GH, "IOHDF5Util"); - - IOHDF5_ERROR (group = H5Gcreate (file, CACTUS_PARAMETERS_GROUP, 0)); - WRITE_ATTRIBUTE (ALL_PARAMETERS, parameters, group, - myGH->scalar_dataspace, 0, myGH->IOHDF5_STRING); - IOHDF5_ERROR (H5Gclose (group)); + HDF5_ERROR (group = H5Gcreate (file, CACTUS_PARAMETERS_GROUP, 0)); + WRITE_ATTRIBUTE (ALL_PARAMETERS, parameters, group, myGH, 0, + myGH->HDF5_STRING); + HDF5_ERROR (H5Gclose (group)); free (parameters); } @@ -408,7 +354,7 @@ void IOHDF5Util_DumpParameters (const cGH *GH, int all, hid_t file) in the HDF5 file. @enddesc @var GH - @vdesc Pointer to CCTK grid hierarchy + @vdesc pointer to CCTK grid hierarchy @vtype const cGH * @vio in @endvar @@ -418,8 +364,7 @@ void IOHDF5Util_DumpParameters (const cGH *GH, int all, hid_t file) @vio in @endvar @@*/ -void IOHDF5Util_DumpGHExtensions (const cGH *GH, - hid_t file) +void IOHDF5Util_DumpGHExtensions (const cGH *GH, hid_t file) { int value; hid_t group; @@ -435,29 +380,24 @@ void IOHDF5Util_DumpGHExtensions (const cGH *GH, CCTK_INFO ("Dumping GH extensions ..."); } - /* Get the handles for IOUtil and IOHDF5 extensions */ ioUtilGH = (ioGH *) CCTK_GHExtension (GH, "IO"); myGH = (ioHDF5UtilGH *) CCTK_GHExtension (GH, "IOHDF5Util"); - IOHDF5_ERROR (group = H5Gcreate (file, GLOBAL_ATTRIBUTES_GROUP, 0)); + HDF5_ERROR (group = H5Gcreate (file, GLOBAL_ATTRIBUTES_GROUP, 0)); value = CCTK_MainLoopIndex (); - WRITE_ATTRIBUTE ("main_loop_index", &value, group, - myGH->scalar_dataspace, 0, H5T_NATIVE_INT); + WRITE_ATTRIBUTE ("main_loop_index", &value, group, myGH, 0, H5T_NATIVE_INT); value = CCTK_nProcs (GH); - WRITE_ATTRIBUTE ("nprocs", &value, group, - myGH->scalar_dataspace, 0, H5T_NATIVE_INT); - WRITE_ATTRIBUTE ("ioproc_every", &ioUtilGH->ioproc_every, group, - myGH->scalar_dataspace, 0, H5T_NATIVE_INT); - WRITE_ATTRIBUTE ("unchunked", &ioUtilGH->unchunked, group, - myGH->scalar_dataspace, 0, H5T_NATIVE_INT); - WRITE_ATTRIBUTE ("cctk_time", &GH->cctk_time, group, - myGH->scalar_dataspace, 0, IOHDF5_REAL); - WRITE_ATTRIBUTE ("cctk_iteration", &GH->cctk_iteration, group, - myGH->scalar_dataspace, 0, H5T_NATIVE_INT); + WRITE_ATTRIBUTE ("nprocs", &value, group, myGH, 0, H5T_NATIVE_INT); + WRITE_ATTRIBUTE ("ioproc_every", &ioUtilGH->ioproc_every, group, myGH, 0, + H5T_NATIVE_INT); + WRITE_ATTRIBUTE ("unchunked", &ioUtilGH->unchunked, group, myGH, 0, + H5T_NATIVE_INT); + WRITE_ATTRIBUTE ("cctk_time", &GH->cctk_time, group, myGH, 0, HDF5_REAL); + WRITE_ATTRIBUTE ("cctk_iteration", &GH->cctk_iteration, group, myGH, 0, + H5T_NATIVE_INT); version = CCTK_FullVersion (); - WRITE_ATTRIBUTE ("Cactus version", version, group, - myGH->scalar_dataspace, 0, myGH->IOHDF5_STRING); + WRITE_ATTRIBUTE ("Cactus version", version, group, myGH, 0,myGH->HDF5_STRING); /* add the parameter filename and the creation date as file identification attributes */ @@ -466,8 +406,7 @@ void IOHDF5Util_DumpGHExtensions (const cGH *GH, { buffer[0] = 0; CCTK_ParameterFilename (sizeof (buffer), buffer); - WRITE_ATTRIBUTE ("parameter file", buffer, group, - myGH->scalar_dataspace, 0, myGH->IOHDF5_STRING); + WRITE_ATTRIBUTE ("parameter file", buffer, group, myGH,0,myGH->HDF5_STRING); } if (CCTK_Equals (out_fileinfo, "creation date") || CCTK_Equals (out_fileinfo, "all")) @@ -477,11 +416,10 @@ void IOHDF5Util_DumpGHExtensions (const cGH *GH, value = strlen (buffer) + 1; buffer[value-1] = ' '; Util_CurrentTime (sizeof (buffer) - value, buffer + value); - WRITE_ATTRIBUTE ("creation date", buffer, group, - myGH->scalar_dataspace, 0, myGH->IOHDF5_STRING); + WRITE_ATTRIBUTE ("creation date", buffer, group, myGH, 0,myGH->HDF5_STRING); } - IOHDF5_ERROR (H5Gclose (group)); + HDF5_ERROR (H5Gclose (group)); } @@ -494,7 +432,7 @@ void IOHDF5Util_DumpGHExtensions (const cGH *GH, @enddesc @var myGH - @vdesc Pointer to IOHDF5Util's GH extensions + @vdesc pointer to IOHDF5Util's GH extensions @vtype ioHDF5UtilGH * @vio in @endvar @@ -516,30 +454,30 @@ hid_t IOHDF5Util_DataType (const ioHDF5UtilGH *myGH, int cctk_type) switch (cctk_type) { - case CCTK_VARIABLE_CHAR: retval = IOHDF5_CHAR; break; - case CCTK_VARIABLE_INT: retval = IOHDF5_INT; break; - case CCTK_VARIABLE_REAL: retval = IOHDF5_REAL; break; - case CCTK_VARIABLE_COMPLEX: retval = myGH->IOHDF5_COMPLEX; break; + case CCTK_VARIABLE_CHAR: retval = HDF5_CHAR; break; + case CCTK_VARIABLE_INT: retval = HDF5_INT; break; + case CCTK_VARIABLE_REAL: retval = HDF5_REAL; break; + case CCTK_VARIABLE_COMPLEX: retval = myGH->HDF5_COMPLEX; break; #ifdef CCTK_INT2 - case CCTK_VARIABLE_INT2: retval = IOHDF5_INT2; break; + case CCTK_VARIABLE_INT2: retval = HDF5_INT2; break; #endif #ifdef CCTK_INT4 - case CCTK_VARIABLE_INT4: retval = IOHDF5_INT4; break; + case CCTK_VARIABLE_INT4: retval = HDF5_INT4; break; #endif #ifdef CCTK_INT8 - case CCTK_VARIABLE_INT8: retval = IOHDF5_INT8; break; + case CCTK_VARIABLE_INT8: retval = HDF5_INT8; break; #endif #ifdef CCTK_REAL4 - case CCTK_VARIABLE_REAL4: retval = IOHDF5_REAL4; break; - case CCTK_VARIABLE_COMPLEX8: retval = myGH->IOHDF5_COMPLEX8; break; + case CCTK_VARIABLE_REAL4: retval = HDF5_REAL4; break; + case CCTK_VARIABLE_COMPLEX8: retval = myGH->HDF5_COMPLEX8; break; #endif #ifdef CCTK_REAL8 - case CCTK_VARIABLE_REAL8: retval = IOHDF5_REAL8; break; - case CCTK_VARIABLE_COMPLEX16: retval = myGH->IOHDF5_COMPLEX16; break; + case CCTK_VARIABLE_REAL8: retval = HDF5_REAL8; break; + case CCTK_VARIABLE_COMPLEX16: retval = myGH->HDF5_COMPLEX16; break; #endif #ifdef CCTK_REAL16 - case CCTK_VARIABLE_REAL16: retval = IOHDF5_REAL16; break; - case CCTK_VARIABLE_COMPLEX32: retval = myGH->IOHDF5_COMPLEX32; break; + case CCTK_VARIABLE_REAL16: retval = HDF5_REAL16; break; + case CCTK_VARIABLE_COMPLEX32: retval = myGH->HDF5_COMPLEX32; break; #endif default: CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, |