diff --git a/ChangeLog b/ChangeLog index e5877216c76e1c5b5ea8b17ea2d3466d4850ddad..dc90f14dc0928de9b6fa524179d596fa8ad3b523 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ * Version 2.4.0 released +2024-02-19 Uwe Schulzweida + + * netCDF: use timevar buffer + 2024-02-05 Uwe Schulzweida * fdb5 interface: update to release 5.11.29 diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c index 24e155a8657cef02c5ddbcd1431d4959b1358c50..e75a983c631c1b89c54a19069eeb77b67c18f0fd 100644 --- a/src/stream_cdf_i.c +++ b/src/stream_cdf_i.c @@ -4249,10 +4249,18 @@ wrf_read_timestep(int fileID, int nctimevarid, int tsID) } static double -get_timevalue(int fileID, int nctimevarid, size_t ncStepIndex) +get_timevalue(int fileID, int nctimevarid, size_t ncStepIndex, double *timevarBuffer) { double timevalue = 0.0; - cdf_get_var1_double(fileID, nctimevarid, &ncStepIndex, &timevalue); + + if (timevarBuffer) + { + timevalue = timevarBuffer[ncStepIndex]; + } + else + { + cdf_get_var1_double(fileID, nctimevarid, &ncStepIndex, &timevalue); + } if (timevalue >= NC_FILL_DOUBLE || timevalue < -NC_FILL_DOUBLE) timevalue = 0.0; @@ -4295,8 +4303,11 @@ cdf_read_timesteps(int numTimesteps, stream_t *streamptr, taxis_t *taxis0) } else { + double *timevarBuffer = (double *) malloc(numTimesteps * sizeof(double)); + cdf_get_var_double(fileID, nctimevarid, timevarBuffer); for (int tsID = 0; tsID < numTimesteps; ++tsID) - vDateTimeList[tsID] = cdi_decode_timeval(get_timevalue(fileID, nctimevarid, tsID), taxis0); + vDateTimeList[tsID] = cdi_decode_timeval(get_timevalue(fileID, nctimevarid, tsID, timevarBuffer), taxis0); + if (timevarBuffer) free(timevarBuffer); } } @@ -4367,7 +4378,7 @@ cdf_read_timesteps(int numTimesteps, stream_t *streamptr, taxis_t *taxis0) { size_t ncStepIndex = streamptr->tsteps[tsID].ncStepIndex; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; - cdi_set_forecast_period(get_timevalue(fileID, leadtimeid, ncStepIndex), taxis); + cdi_set_forecast_period(get_timevalue(fileID, leadtimeid, ncStepIndex, NULL), taxis); } } }