This commit is contained in:
Shahram Najm 2022-12-27 15:10:14 +00:00
parent 6b5041ce8d
commit 30834ad7b9
2 changed files with 51 additions and 96 deletions

View File

@ -182,6 +182,7 @@ static void fill_in(double a[], long length)
for (i = 1; i < length; ++i)
a[i] = a[0];
}
static int select_area(grib_accessor* a)
{
int ret = 0;
@ -190,39 +191,33 @@ static int select_area(grib_accessor* a)
grib_handle* h = grib_handle_of_accessor(a);
grib_context* c = h->context;
double* lat = 0;
double* lon = 0;
double* lat = NULL;
double* lon = NULL;
size_t n;
double lonWest, lonEast, latNorth, latSouth;
long numberOfSubsets, i, latRank, lonRank;
grib_iarray* subsets;
long* subsets_ar = 0;
grib_iarray* subsets = NULL;
size_t nsubsets = 0;
char latstr[32] = {0,};
char lonstr[32] = {0,};
ret = grib_get_long(h, "compressedData", &compressed);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, self->numberOfSubsets, &numberOfSubsets);
if (ret)
return ret;
if (ret) return ret;
subsets = grib_iarray_new(c, numberOfSubsets, 10);
ret = grib_set_long(h, "unpack", 1);
if (ret)
return ret;
if (ret) return ret;
if (compressed) {
ret = grib_get_long(h, self->extractAreaLongitudeRank, &lonRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(lonstr, sizeof(lonstr), "#%ld#longitude", lonRank);
ret = grib_get_long(h, self->extractAreaLatitudeRank, &latRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(latstr, sizeof(latstr), "#%ld#latitude", latRank);
}
@ -231,8 +226,7 @@ static int select_area(grib_accessor* a)
lat = (double*)grib_context_malloc_clear(c, sizeof(double) * numberOfSubsets);
if (compressed) {
ret = grib_get_double_array(h, latstr, lat, &n);
if (ret)
return ret;
if (ret) return ret;
if (!(n == 1 || n == numberOfSubsets)) {
/* n can be 1 if all latitudes are the same */
return GRIB_INTERNAL_ERROR;
@ -246,13 +240,10 @@ static int select_area(grib_accessor* a)
for (i = 0; i < numberOfSubsets; ++i) {
snprintf(latstr, sizeof(latstr), "#%ld#latitude", i + 1);
ret = grib_get_size(h, latstr, &values_len);
if (ret)
return ret;
if (values_len > 1)
return GRIB_NOT_IMPLEMENTED;
if (ret) return ret;
if (values_len > 1) return GRIB_NOT_IMPLEMENTED;
ret = grib_get_double(h, latstr, &(lat[i]));
if (ret)
return ret;
if (ret) return ret;
}
}
@ -261,8 +252,7 @@ static int select_area(grib_accessor* a)
lon = (double*)grib_context_malloc_clear(c, sizeof(double) * numberOfSubsets);
if (compressed) {
ret = grib_get_double_array(h, lonstr, lon, &n);
if (ret)
return ret;
if (ret) return ret;
if (!(n == 1 || n == numberOfSubsets)) {
/* n can be 1 if all longitudes are the same */
return GRIB_INTERNAL_ERROR;
@ -276,28 +266,21 @@ static int select_area(grib_accessor* a)
for (i = 0; i < numberOfSubsets; ++i) {
snprintf(lonstr, sizeof(lonstr), "#%ld#longitude", i + 1);
ret = grib_get_size(h, lonstr, &values_len);
if (ret)
return ret;
if (values_len > 1)
return GRIB_NOT_IMPLEMENTED;
if (ret) return ret;
if (values_len > 1) return GRIB_NOT_IMPLEMENTED;
ret = grib_get_double(h, lonstr, &(lon[i]));
if (ret)
return ret;
if (ret) return ret;
}
}
ret = grib_get_double(h, self->extractAreaWestLongitude, &lonWest);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_double(h, self->extractAreaEastLongitude, &lonEast);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_double(h, self->extractAreaNorthLatitude, &latNorth);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_double(h, self->extractAreaSouthLatitude, &latSouth);
if (ret)
return ret;
if (ret) return ret;
for (i = 0; i < numberOfSubsets; i++) {
/* printf("++++++ lat: %g <= %g <= %g lon: %g <= %g <= %g \n",latSouth,lat[i],latNorth,lonWest,lon[i],lonEast); */
@ -309,25 +292,22 @@ static int select_area(grib_accessor* a)
nsubsets = grib_iarray_used_size(subsets);
ret = grib_set_long(h, self->extractedAreaNumberOfSubsets, nsubsets);
if (ret)
return ret;
if (ret) return ret;
if (nsubsets != 0) {
subsets_ar = grib_iarray_get_array(subsets);
long* subsets_ar = grib_iarray_get_array(subsets);
ret = grib_set_long_array(h, self->extractSubsetList, subsets_ar, nsubsets);
grib_context_free(c, subsets_ar);
if (ret)
return ret;
if (ret) return ret;
ret = grib_set_long(h, self->doExtractSubsets, 1);
if (ret)
return ret;
if (ret) return ret;
}
grib_context_free(c, lat);
grib_context_free(c, lon);
grib_iarray_delete(subsets);
subsets = 0;
subsets = NULL;
return ret;
}

View File

@ -253,75 +253,61 @@ static int select_datetime(grib_accessor* a)
char secondstr[32] = "second";
ret = grib_get_long(h, "compressedData", &compressed);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, self->numberOfSubsets, &numberOfSubsets);
if (ret)
return ret;
if (ret) return ret;
subsets = grib_iarray_new(c, numberOfSubsets, 10);
ret = grib_set_long(h, "unpack", 1);
if (ret)
return ret;
if (ret) return ret;
if (compressed) {
ret = grib_get_long(h, "extractDateTimeYearRank", &yearRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(yearstr, sizeof(yearstr), "#%ld#year", yearRank);
ret = grib_get_long(h, "extractDateTimeMonthRank", &monthRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(monthstr, sizeof(monthstr), "#%ld#month", monthRank);
ret = grib_get_long(h, "extractDateTimeDayRank", &dayRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(daystr, sizeof(daystr), "#%ld#day", dayRank);
ret = grib_get_long(h, "extractDateTimeHourRank", &hourRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(hourstr, sizeof(hourstr), "#%ld#hour", hourRank);
ret = grib_get_long(h, "extractDateTimeMinuteRank", &minuteRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(minutestr, sizeof(minutestr), "#%ld#minute", minuteRank);
ret = grib_get_long(h, "extractDateTimeSecondRank", &secondRank);
if (ret)
return ret;
if (ret) return ret;
snprintf(secondstr, sizeof(secondstr), "#%ld#second", secondRank);
}
/* YEAR */
ret = build_long_array(c, h, compressed, &year, yearstr, numberOfSubsets, 0);
if (ret)
return ret;
if (ret) return ret;
/* MONTH */
ret = build_long_array(c, h, compressed, &month, monthstr, numberOfSubsets, 0);
if (ret)
return ret;
if (ret) return ret;
/* DAY */
ret = build_long_array(c, h, compressed, &day, daystr, numberOfSubsets, 0);
if (ret)
return ret;
if (ret) return ret;
/* HOUR */
ret = build_long_array(c, h, compressed, &hour, hourstr, numberOfSubsets, 0);
if (ret)
return ret;
if (ret) return ret;
/* MINUTE: Special treatment if error => set all entries to zero */
ret = build_long_array(c, h, compressed, &minute, minutestr, numberOfSubsets, 1);
if (ret)
return ret;
if (ret) return ret;
/* SECOND: Double array */
n = numberOfSubsets;
@ -365,17 +351,13 @@ static int select_datetime(grib_accessor* a)
}
ret = grib_get_long(h, "extractDateTimeYearStart", &yearStart);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeMonthStart", &monthStart);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeDayStart", &dayStart);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeHourStart", &hourStart);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeMinuteStart", &minuteStart);
if (ret)
minuteStart = 0;
@ -393,17 +375,13 @@ static int select_datetime(grib_accessor* a)
}
ret = grib_get_long(h, "extractDateTimeYearEnd", &yearEnd);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeMonthEnd", &monthEnd);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeDayEnd", &dayEnd);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeHourEnd", &hourEnd);
if (ret)
return ret;
if (ret) return ret;
ret = grib_get_long(h, "extractDateTimeMinuteEnd", &minuteEnd);
if (ret)
minuteEnd = 0;
@ -453,19 +431,16 @@ static int select_datetime(grib_accessor* a)
nsubsets = grib_iarray_used_size(subsets);
ret = grib_set_long(h, "extractedDateTimeNumberOfSubsets", nsubsets);
if (ret)
return ret;
if (ret) return ret;
if (nsubsets != 0) {
long* subsets_ar = grib_iarray_get_array(subsets);
ret = grib_set_long_array(h, self->extractSubsetList, subsets_ar, nsubsets);
grib_context_free(c, subsets_ar);
if (ret)
return ret;
if (ret) return ret;
ret = grib_set_long(h, self->doExtractSubsets, 1);
if (ret)
return ret;
if (ret) return ret;
}
cleanup: