Commit ffeaa461 authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

grib2: added stepType support for absolute time axis

parent 79b0dfb1
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
* Version 1.5.8 released * Version 1.5.8 released
* using CGRIBEX library version 1.5.5 * using CGRIBEX library version 1.5.5
2012-10-16 Uwe Schulzweida <Uwe.Schulzweida@zmaw.de>
* grib2: added stepType support for absolute time axis
2012-10-15 Uwe Schulzweida <Uwe.Schulzweida@zmaw.de> 2012-10-15 Uwe Schulzweida <Uwe.Schulzweida@zmaw.de>
* pio.h remove line 'typedef int MPI_Comm;' [Bug #2882] * pio.h remove line 'typedef int MPI_Comm;' [Bug #2882]
......
...@@ -236,7 +236,7 @@ int gribapiGetValidityDateTime(grib_handle *gh, int *vdate, int *vtime) ...@@ -236,7 +236,7 @@ int gribapiGetValidityDateTime(grib_handle *gh, int *vdate, int *vtime)
GRIB_CHECK(grib_get_long(gh, "dataDate", &lpar), 0); GRIB_CHECK(grib_get_long(gh, "dataDate", &lpar), 0);
rdate = (int) lpar; rdate = (int) lpar;
GRIB_CHECK(grib_get_long(gh, "dataTime", &lpar), 0); GRIB_CHECK(grib_get_long(gh, "dataTime", &lpar), 0);
rtime = (int) lpar*100; rtime = (int) lpar*100;
GRIB_CHECK(grib_get_long(gh, "forecastTime", &lpar), 0); GRIB_CHECK(grib_get_long(gh, "forecastTime", &lpar), 0);
startStep = (int) lpar; startStep = (int) lpar;
GRIB_CHECK(grib_get_long(gh, "endStep", &lpar), 0); GRIB_CHECK(grib_get_long(gh, "endStep", &lpar), 0);
...@@ -2012,27 +2012,59 @@ int gribapiDefStepUnits(grib_handle *gh, int timeunit, int gcinit) ...@@ -2012,27 +2012,59 @@ int gribapiDefStepUnits(grib_handle *gh, int timeunit, int gcinit)
} }
static static
void gribapiDefDateTime(int editionNumber, grib_handle *gh, int date, int time) int gribapiDefSteptype(int editionNumber, grib_handle *gh, int tsteptype, int gcinit)
{
long proDefTempNum = 0;
size_t len = 64;
char stepType[64];
switch ( tsteptype )
{
case TSTEP_INSTANT: strcpy(stepType, "instant"); proDefTempNum = 0; break;
case TSTEP_AVG: strcpy(stepType, "avg"); proDefTempNum = 8; break;
case TSTEP_ACCUM: strcpy(stepType, "accum"); proDefTempNum = 8; break;
case TSTEP_MAX: strcpy(stepType, "max"); proDefTempNum = 8; break;
case TSTEP_MIN: strcpy(stepType, "min"); proDefTempNum = 8; break;
case TSTEP_DIFF: strcpy(stepType, "diff"); proDefTempNum = 8; break;
case TSTEP_RMS: strcpy(stepType, "rms"); proDefTempNum = 8; break;
case TSTEP_SD: strcpy(stepType, "sd"); proDefTempNum = 8; break;
case TSTEP_COV: strcpy(stepType, "cov"); proDefTempNum = 8; break;
case TSTEP_RATIO: strcpy(stepType, "ratio"); proDefTempNum = 8; break;
default: strcpy(stepType, "instant"); proDefTempNum = 0; break;
}
if ( !gcinit )
{
if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "productDefinitionTemplateNumber", proDefTempNum), 0);
len = strlen(stepType);
GRIB_CHECK(grib_set_string(gh, "stepType", stepType, &len), 0);
}
return ((int)proDefTempNum);
}
static
void gribapiDefDateTimeAbs(int editionNumber, grib_handle *gh, int date, int time, int tsteptype, int gcinit)
{ {
if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "significanceOfReferenceTime", 0), 0); if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "significanceOfReferenceTime", 0), 0);
GRIB_CHECK(grib_set_long(gh, "stepRange", 0), 0); if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "stepRange", 0), 0);
if ( date == 0 ) date = 10101; if ( date == 0 ) date = 10101;
GRIB_CHECK(grib_set_long(gh, "dataDate", date), 0); GRIB_CHECK(grib_set_long(gh, "dataDate", date), 0);
GRIB_CHECK(grib_set_long(gh, "dataTime", time/100), 0); GRIB_CHECK(grib_set_long(gh, "dataTime", time/100), 0);
(void ) gribapiDefSteptype(editionNumber, gh, tsteptype, gcinit);
} }
static static
int gribapiDefTsteptype(int editionNumber, grib_handle *gh, int tsteptype, int factor, int calendar, int gribapiDefDateTimeRel(int editionNumber, grib_handle *gh, int rdate, int rtime, int vdate, int vtime,
int rdate, int rtime, int vdate, int vtime, int gcinit) int tsteptype, int factor, int calendar, int gcinit)
{ {
int status = -1; int status = -1;
int year, month, day, hour, minute, second; int year, month, day, hour, minute, second;
int julday1, secofday1, julday2, secofday2, days, secs; int julday1, secofday1, julday2, secofday2, days, secs;
long startStep = 0, endStep; long startStep = 0, endStep;
long proDefTempNum = 0; long proDefTempNum = 0;
size_t len = 64;
char stepType[64];
cdiDecodeDate(rdate, &year, &month, &day); cdiDecodeDate(rdate, &year, &month, &day);
cdiDecodeTime(rtime, &hour, &minute, &second); cdiDecodeTime(rtime, &hour, &minute, &second);
...@@ -2049,30 +2081,15 @@ int gribapiDefTsteptype(int editionNumber, grib_handle *gh, int tsteptype, int f ...@@ -2049,30 +2081,15 @@ int gribapiDefTsteptype(int editionNumber, grib_handle *gh, int tsteptype, int f
endStep = (int) ((days*86400.0 + secs)/factor); endStep = (int) ((days*86400.0 + secs)/factor);
if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "significanceOfReferenceTime", 1), 0); if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "significanceOfReferenceTime", 1), 0);
if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "stepRange", 0), 0);
// printf(">>>>> tsteptype %d startStep %d endStep %d\n", tsteptype, startStep, endStep); if ( rdate == 0 ) rdate = 10101;
GRIB_CHECK(grib_set_long(gh, "dataDate", rdate), 0);
GRIB_CHECK(grib_set_long(gh, "dataTime", rtime/100), 0);
switch ( tsteptype ) // printf(">>>>> tsteptype %d startStep %d endStep %d\n", tsteptype, startStep, endStep);
{
case TSTEP_INSTANT: strcpy(stepType, "instant"); proDefTempNum = 0; break;
case TSTEP_AVG: strcpy(stepType, "avg"); proDefTempNum = 8; break;
case TSTEP_ACCUM: strcpy(stepType, "accum"); proDefTempNum = 8; break;
case TSTEP_MAX: strcpy(stepType, "max"); proDefTempNum = 8; break;
case TSTEP_MIN: strcpy(stepType, "min"); proDefTempNum = 8; break;
case TSTEP_DIFF: strcpy(stepType, "diff"); proDefTempNum = 8; break;
case TSTEP_RMS: strcpy(stepType, "rms"); proDefTempNum = 8; break;
case TSTEP_SD: strcpy(stepType, "sd"); proDefTempNum = 8; break;
case TSTEP_COV: strcpy(stepType, "cov"); proDefTempNum = 8; break;
case TSTEP_RATIO: strcpy(stepType, "ratio"); proDefTempNum = 8; break;
default: strcpy(stepType, "instant"); proDefTempNum = 0; break;
}
if ( !gcinit ) proDefTempNum = gribapiDefSteptype(editionNumber, gh, tsteptype, gcinit);
{
if ( editionNumber > 1 ) GRIB_CHECK(grib_set_long(gh, "productDefinitionTemplateNumber", proDefTempNum), 0);
len = strlen(stepType);
GRIB_CHECK(grib_set_string(gh, "stepType", stepType, &len), 0);
}
if ( proDefTempNum == 0 ) startStep = endStep; if ( proDefTempNum == 0 ) startStep = endStep;
...@@ -2100,25 +2117,20 @@ void gribapiDefTime(int editionNumber, grib_handle *gh , int vdate, int vtime, i ...@@ -2100,25 +2117,20 @@ void gribapiDefTime(int editionNumber, grib_handle *gh , int vdate, int vtime, i
if ( taxistype == TAXIS_RELATIVE ) if ( taxistype == TAXIS_RELATIVE )
{ {
int rdate, rtime;
int calendar;
int status; int status;
int calendar = taxisInqCalendar(taxisID);
int rdate = taxisInqRdate(taxisID);
int rtime = taxisInqRtime(taxisID);
calendar = taxisInqCalendar(taxisID); status = gribapiDefDateTimeRel(editionNumber, gh, rdate, rtime, vdate, vtime,
rdate = taxisInqRdate(taxisID); tsteptype, factor, calendar, gcinit);
rtime = taxisInqRtime(taxisID);
gribapiDefDateTime(editionNumber, gh, rdate, rtime);
status = gribapiDefTsteptype(editionNumber, gh, tsteptype, factor, calendar,
rdate, rtime, vdate, vtime, gcinit);
if ( status != 0 ) taxistype = TAXIS_ABSOLUTE; if ( status != 0 ) taxistype = TAXIS_ABSOLUTE;
} }
if ( taxistype == TAXIS_ABSOLUTE ) if ( taxistype == TAXIS_ABSOLUTE )
{ {
gribapiDefDateTime(editionNumber, gh, vdate, vtime); gribapiDefDateTimeAbs(editionNumber, gh, vdate, vtime, tsteptype, gcinit);
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment