static int pack_double(grib_accessor* a, const double* val, size_t *len) { grib_accessor_julian_day* self = (grib_accessor_julian_day*)a; int ret=0; long hour=0; long minute=0; long second=0; long date=0; long year,month,day; ret=grib_julian_to_datetime(*val,&year,&month,&day,&hour,&minute,&second); date=year * 10000 + month * 100 + day; ret=grib_set_long_internal(a->parent->h,self->date,date); if (ret!=0) return ret; ret=grib_set_long_internal(a->parent->h,self->hour,hour); if (ret!=0) return ret; ret=grib_set_long_internal(a->parent->h,self->minute,minute); if (ret!=0) return ret; ret=grib_set_long_internal(a->parent->h,self->second,second); 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_julian_to_datetime(double jd, long *year, long *month, long *day, long *hour, long *minute, long *second) { return grib_julian_to_datetime(jd,year,month,day,hour,minute,second); }