diff --git a/src/pio_server.c b/src/pio_server.c index 9dd29db3c0a98c4b6e703c90cc2ee2c91019570e..c4131969bc8bc380a22738e03e98ccc04d81e01f 100644 --- a/src/pio_server.c +++ b/src/pio_server.c @@ -2153,19 +2153,27 @@ cdiPioServerStreamClose(stream_t *streamptr, int recordBufIsToBeDeleted) = (void (*)(int))conf->callbacks[CDIPIO_CALLBACK_POSTSTREAMCLOSE]; streamCloseCallBack(streamptr->self); } +#if defined HAVE_NC4HDF5 && defined HAVE_PARALLEL_NC4 +bool parH5ZeroCountProblem = false; +#endif #ifdef HAVE_LIBNETCDF static void -cdiPioCdfDefTimestep(stream_t *streamptr, int tsID) +cdiPioCdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int streamID = streamptr->self, rankOpen = cdiPioStream2Owner(streamID); +#ifdef HAVE_PARALLEL_NC4 + valCount = rankOpen != CDI_PIO_COLLECTIVE_OPEN + || parH5ZeroCountProblem + || commInqRankColl() == 0; +#endif if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || commInqRankColl() == rankOpen) - cdfDefTimestep(streamptr, tsID); + cdfDefTimestep(streamptr, tsID, valCount); } #endif @@ -2380,6 +2388,15 @@ void cdiPioCollectorMessageLoop() cdiPioEnableNetCDFParAccess(); numPioPrimes = PPM_prime_factorization_32((uint32_t)commInqSizeColl(), &pioPrimes); +# ifdef HAVE_NC4HDF5 + { + unsigned majnum, minnum, relnum; + extern int H5get_libversion(unsigned *, unsigned *, unsigned *); + H5get_libversion(&majnum, &minnum, &relnum); + parH5ZeroCountProblem = (majnum == 1 && ((minnum == 8 && relnum <= 8) + || (minnum < 8))); + } +# endif #endif #ifdef HAVE_LIBNETCDF cdiSerialOpenFileCount = Calloc(sizeof (cdiSerialOpenFileCount[0]), diff --git a/src/stream.c b/src/stream.c index 1f45c1acace0f9028d0542d82937511ce5cf1007..47558b368e8663f17f45c624b02d0bdcdfc7b505 100644 --- a/src/stream.c +++ b/src/stream.c @@ -1200,10 +1200,10 @@ int cdiStreamDefTimestep_(stream_t *streamptr, int tsID) /* usually points to cdfDefTimestep in serial mode but * to cdiPioCdfDefTimestep on servers and to a null-op on * clients in client/server mode */ - void (*myCdfDefTimestep)(stream_t *streamptr, int tsID) - = (void (*)(stream_t *, int)) + void (*myCdfDefTimestep)(stream_t *streamptr, int tsID, size_t) + = (void (*)(stream_t *, int, size_t)) namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func; - myCdfDefTimestep(streamptr, tsID); + myCdfDefTimestep(streamptr, tsID, 1); } #endif diff --git a/src/stream_cdf.h b/src/stream_cdf.h index 55bb99d09db15e1452381f80a75c9869eb15a8c0..38084d2cecbf13ca49cdbf4b6f61237b9badee55 100644 --- a/src/stream_cdf.h +++ b/src/stream_cdf.h @@ -19,7 +19,7 @@ enum { int cdfDefVar(stream_t *streamptr, int varID); void cdfDefVars(stream_t *streamptr); -void cdfDefTimestep(stream_t *streamptr, int tsID); +void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount); int cdfInqTimestep(stream_t *streamptr, int tsID); int cdfInqContents(stream_t *streamptr); void cdfDefHistory(stream_t *streamptr, int size, const char *history); diff --git a/src/stream_cdf_time.c b/src/stream_cdf_time.c index c249ec7fa29c2e82e52a106be6d6202763997e24..56f1aaf4dd6733aa4db8a68f144a5d4ebcf183fa 100644 --- a/src/stream_cdf_time.c +++ b/src/stream_cdf_time.c @@ -256,7 +256,7 @@ void cdfDefTime(stream_t* streamptr) static void -cdfDefTimeValue(stream_t *streamptr, int tsID) +cdfDefTimeValue(stream_t *streamptr, int tsID, size_t valCount) { int fileID = streamptr->fileID; @@ -272,7 +272,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID) } const size_t start[2] = { [0] = (size_t)tsID, [1] = 0 }, - count[2] = { [0] = 1, [1] = 2 }; + count[2] = { [0] = valCount, [1] = 2 * valCount }; double timevalue[2] = { cdiEncodeTimeval(taxis->vdate, taxis->vtime, &streamptr->tsteps[0].taxis) @@ -298,7 +298,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID) } -void cdfDefTimestep(stream_t *streamptr, int tsID) +void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int vlistID = streamptr->vlistID; @@ -319,7 +319,7 @@ void cdfDefTimestep(stream_t *streamptr, int tsID) */ } } - cdfDefTimeValue(streamptr, tsID); + cdfDefTimeValue(streamptr, tsID, valCount); } #endif