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;
}
Example #3
0
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);
}