static int unpack_double (grib_accessor* a, double* val, size_t *len) { int ret=0; long date,hour,minute,second; long year,month,day; grib_accessor_julian_day* self = (grib_accessor_julian_day*)a; ret=grib_get_long_internal(a->parent->h,self->date,&date); if (ret!=GRIB_SUCCESS) return ret; ret=grib_get_long_internal(a->parent->h,self->hour,&hour); if (ret!=GRIB_SUCCESS) return ret; ret=grib_get_long_internal(a->parent->h,self->minute,&minute); if (ret!=GRIB_SUCCESS) return ret; ret=grib_get_long_internal(a->parent->h,self->second,&second); if (ret!=GRIB_SUCCESS) return ret; year = date / 10000; date %= 10000; month = date / 100; date %= 100; day = date; ret=grib_datetime_to_julian(year,month,day,hour,minute,second,val); return ret; }
static int pack_long(grib_accessor* a, const long* val, size_t *len) { grib_accessor_g2end_step* self = (grib_accessor_g2end_step*)a; grib_handle* h=a->parent->h; int err = 0; long year; long month; long day; long hour; long minute; long second; long start_step; long unit,coded_unit; long year_of_end_of_interval; long month_of_end_of_interval; long day_of_end_of_interval; long hour_of_end_of_interval; long minute_of_end_of_interval = 0; long second_of_end_of_interval = 0; long coded_time_range,time_range, typeOfTimeIncrement; double dend, dstep; /*point in time */ if (self->year == NULL) { err = grib_set_long_internal(h,self->start_step,*val); return err; } if((err = grib_get_long_internal(h,self->coded_unit,&coded_unit))) return err; if((err = grib_get_long_internal(h,self->unit,&unit))) return err; if((err = grib_get_long_internal(h,self->year,&year))) return err; if((err = grib_get_long_internal(h,self->month,&month))) return err; if((err = grib_get_long_internal(h,self->day,&day))) return err; if((err = grib_get_long_internal(h,self->hour,&hour))) return err; if((err = grib_get_long_internal(h,self->minute,&minute))) return err; if((err = grib_get_long_internal(h,self->second,&second))) return err; if((err = grib_get_long_internal(h,self->start_step,&start_step))) return err; if((err = grib_get_long_internal(h,self->typeOfTimeIncrement, &typeOfTimeIncrement))) return err; time_range = *val-start_step; if (time_range<0){ grib_context_log(h->context,GRIB_LOG_ERROR, "endStep < startStep (%ld < %ld)",*val,start_step); return GRIB_WRONG_STEP; } err=grib_datetime_to_julian(year,month,day,hour,minute,second,&dend); if (err!=GRIB_SUCCESS) return err; dstep=(((double)(*val))*u2s[unit])/u2s[2]; dend+=dstep; err=grib_julian_to_datetime(dend,&year_of_end_of_interval,&month_of_end_of_interval, &day_of_end_of_interval,&hour_of_end_of_interval, &minute_of_end_of_interval,&second_of_end_of_interval); if (err!=GRIB_SUCCESS) return err; if((err = grib_set_long_internal(a->parent->h,self->year_of_end_of_interval, year_of_end_of_interval))) return err; if((err = grib_set_long_internal(a->parent->h,self->month_of_end_of_interval, month_of_end_of_interval))) return err; if((err = grib_set_long_internal(a->parent->h,self->day_of_end_of_interval, day_of_end_of_interval))) return err; if((err = grib_set_long_internal(a->parent->h,self->hour_of_end_of_interval, hour_of_end_of_interval))) return err; if((err = grib_set_long_internal(a->parent->h,self->minute_of_end_of_interval, minute_of_end_of_interval))) return err; if((err = grib_set_long_internal(a->parent->h,self->second_of_end_of_interval, second_of_end_of_interval))) return err; if (time_range*u2s[unit]%u2s2[coded_unit]) { coded_unit=unit; if((err = grib_set_long_internal(a->parent->h,self->coded_unit, coded_unit))) return err; coded_time_range=time_range; } else coded_time_range=(time_range*u2s[unit])/u2s2[coded_unit]; if (typeOfTimeIncrement != 1) { /* 1 means "Successive times processed have same forecast time, start time of forecast is incremented" */ /* Note: For this case, length of timeRange is not related to step and so should NOT be used to calculate step */ if((err = grib_set_long_internal(a->parent->h,self->coded_time_range, coded_time_range))) return err; } return GRIB_SUCCESS; }
int codes_datetime_to_julian(long year, long month, long day, long hour, long minute, long second, double *jd) { return grib_datetime_to_julian(year,month,day,hour,minute,second,jd); }