| 3402 | |
| 3403 | |
| 3404 | int VTKHDF_Recorder::extendDataset(hid_t dataGroup, |
| 3405 | const char* datasetName, |
| 3406 | const void* newData, |
| 3407 | hid_t datatype, |
| 3408 | size_t numNewElements, |
| 3409 | size_t numColumns) { |
| 3410 | // Open dataset |
| 3411 | hid_t dset_id = H5Dopen(dataGroup, datasetName, H5P_DEFAULT); |
| 3412 | if (dset_id < 0) { |
| 3413 | opserr << "Error opening dataset '" << datasetName << "'\n"; |
| 3414 | return -1; |
| 3415 | } |
| 3416 | |
| 3417 | // Get the current dataspace |
| 3418 | hid_t space_id = H5Dget_space(dset_id); |
| 3419 | if (space_id < 0) { |
| 3420 | opserr << "Error getting dataspace for '" << datasetName << "'\n"; |
| 3421 | H5Dclose(dset_id); |
| 3422 | return -1; |
| 3423 | } |
| 3424 | |
| 3425 | // Get rank and dimensions |
| 3426 | int rank = H5Sget_simple_extent_ndims(space_id); |
| 3427 | std::vector<hsize_t> current_dims(rank); |
| 3428 | if (H5Sget_simple_extent_dims(space_id, current_dims.data(), NULL) < 0) { |
| 3429 | opserr << "Error getting current dimensions\n"; |
| 3430 | H5Sclose(space_id); |
| 3431 | H5Dclose(dset_id); |
| 3432 | return -1; |
| 3433 | } |
| 3434 | |
| 3435 | // Prepare new dimensions |
| 3436 | std::vector<hsize_t> new_dims = current_dims; |
| 3437 | new_dims[0] += static_cast<hsize_t>(numNewElements); // Extend first dimension |
| 3438 | |
| 3439 | // Extend the dataset |
| 3440 | if (H5Dset_extent(dset_id, new_dims.data()) < 0) { |
| 3441 | opserr << "Error setting new extent for '" << datasetName << "'\n"; |
| 3442 | H5Sclose(space_id); |
| 3443 | H5Dclose(dset_id); |
| 3444 | return -1; |
| 3445 | } |
| 3446 | |
| 3447 | // Get the new dataspace |
| 3448 | hid_t new_space_id = H5Dget_space(dset_id); |
| 3449 | if (new_space_id < 0) { |
| 3450 | opserr << "Error getting new dataspace for '" << datasetName << "'\n"; |
| 3451 | H5Sclose(space_id); |
| 3452 | H5Dclose(dset_id); |
| 3453 | return -1; |
| 3454 | } |
| 3455 | |
| 3456 | // Prepare hyperslab selection |
| 3457 | std::vector<hsize_t> offset(rank, 0); |
| 3458 | std::vector<hsize_t> count(rank); |
| 3459 | |
| 3460 | offset[0] = current_dims[0]; // Start from end of existing data |
| 3461 | count[0] = numNewElements; // Number of new elements |
no test coverage detected