Skip to content
Snippets Groups Projects
Commit 151c4e6a authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

genlonlatboxReg2d: bug fix if nlon=0 or nlat=0.

parent a476f3db
No related branches found
No related tags found
No related merge requests found
......@@ -297,29 +297,10 @@ gengridcell(int gridID1, size_t gridsize2, long *cellidx)
}
void
genlonlatbox_reg(int gridID, double xlon1, double xlon2, double xlat1, double xlat2, long *lat1, long *lat2, long *lon11,
long *lon12, long *lon21, long *lon22)
genlonlatboxReg2d(int gridID, double xlon1, double xlon2, double xlat1, double xlat2, long *lat1, long *lat2, long *lon11,
long *lon12, long *lon21, long *lon22)
{
long nlon = gridInqXsize(gridID);
long nlat = gridInqYsize(gridID);
std::vector<double> xvals(nlon);
std::vector<double> yvals(nlat);
gridInqXvals(gridID, xvals.data());
gridInqYvals(gridID, yvals.data());
char xunits[CDI_MAX_NAME];
char yunits[CDI_MAX_NAME];
gridInqXunits(gridID, xunits);
gridInqYunits(gridID, yunits);
double xfact = 1, yfact = 1;
if (strncmp(xunits, "radian", 6) == 0) xfact = RAD2DEG;
if (strncmp(yunits, "radian", 6) == 0) yfact = RAD2DEG;
for (long ilat = 0; ilat < nlat; ilat++) yvals[ilat] *= yfact;
for (long ilon = 0; ilon < nlon; ilon++) xvals[ilon] *= xfact;
*lat1 = 0; *lat2 = 0; *lon11 = 1; *lon12 = 0; *lon21 = 0; *lon22 = 0;
if (IS_NOT_EQUAL(xlon1, xlon2))
{
......@@ -331,73 +312,104 @@ genlonlatbox_reg(int gridID, double xlon1, double xlon2, double xlat1, double xl
xlon2 += 0.00001;
}
xlon2 -= 360 * floor((xlon1 - xvals[0]) / 360);
xlon1 -= 360 * floor((xlon1 - xvals[0]) / 360);
long nlon = gridInqXsize(gridID);
long nlat = gridInqYsize(gridID);
std::vector<double> xvals, yvals;
char xunits[CDI_MAX_NAME], yunits[CDI_MAX_NAME];
double xfact = 1, yfact = 1;
if (nlon > 0)
{
xvals.resize(nlon);
gridInqXvals(gridID, xvals.data());
gridInqXunits(gridID, xunits);
if (strncmp(xunits, "radian", 6) == 0) xfact = RAD2DEG;
for (long ilat = 0; ilat < nlat; ilat++) yvals[ilat] *= yfact;
xlon2 -= 360 * floor((xlon1 - xvals[0]) / 360);
xlon1 -= 360 * floor((xlon1 - xvals[0]) / 360);
}
// while ( nlon == 1 || (xvals[nlon-1] - xvals[0]) >= 360 ) nlon--;
if (nlat > 0)
{
yvals.resize(nlat);
gridInqYvals(gridID, yvals.data());
gridInqYunits(gridID, yunits);
if (strncmp(yunits, "radian", 6) == 0) yfact = RAD2DEG;
for (long ilon = 0; ilon < nlon; ilon++) xvals[ilon] *= xfact;
}
for (*lon21 = 0; *lon21 < nlon && xvals[*lon21] < xlon1; (*lon21)++)
;
for (*lon22 = *lon21; *lon22 < nlon && xvals[*lon22] < xlon2; (*lon22)++)
;
if (nlon > 0)
{
// while ( nlon == 1 || (xvals[nlon-1] - xvals[0]) >= 360 ) nlon--;
if (*lon22 >= nlon || xvals[*lon22] > xlon2) (*lon22)--;
for (*lon21 = 0; *lon21 < nlon && xvals[*lon21] < xlon1; (*lon21)++)
;
for (*lon22 = *lon21; *lon22 < nlon && xvals[*lon22] < xlon2; (*lon22)++)
;
xlon1 -= 360;
xlon2 -= 360;
if (*lon22 >= nlon || xvals[*lon22] > xlon2) (*lon22)--;
for (*lon11 = 0; xvals[*lon11] < xlon1; (*lon11)++)
;
for (*lon12 = *lon11; *lon12 < nlon && xvals[*lon12] < xlon2; (*lon12)++)
;
xlon1 -= 360;
xlon2 -= 360;
// (*lon12)--;
if (*lon12 >= nlon || xvals[*lon12] > xlon2) (*lon12)--;
if (*lon12 >= 0 && IS_EQUAL(xvals[*lon12], xvals[*lon21])) (*lon12)--;
for (*lon11 = 0; xvals[*lon11] < xlon1; (*lon11)++)
;
for (*lon12 = *lon11; *lon12 < nlon && xvals[*lon12] < xlon2; (*lon12)++)
;
if (*lon12 - *lon11 + 1 + *lon22 - *lon21 + 1 <= 0) cdoAbort("Longitudinal dimension is too small!");
// (*lon12)--;
if (*lon12 >= nlon || xvals[*lon12] > xlon2) (*lon12)--;
if (*lon12 >= 0 && IS_EQUAL(xvals[*lon12], xvals[*lon21])) (*lon12)--;
if (yvals[0] > yvals[nlat - 1])
{
if (xlat1 > xlat2)
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] > xlat1; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] < xlat2; (*lat2)--)
;
}
else
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] > xlat2; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] < xlat1; (*lat2)--)
;
}
if (*lon12 - *lon11 + 1 + *lon22 - *lon21 + 1 <= 0) cdoAbort("Longitudinal dimension is too small!");
}
else
if (nlat > 0)
{
if (xlat1 < xlat2)
if (yvals[0] > yvals[nlat - 1])
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] < xlat1; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] > xlat2; (*lat2)--)
;
if (xlat1 > xlat2)
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] > xlat1; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] < xlat2; (*lat2)--)
;
}
else
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] > xlat2; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] < xlat1; (*lat2)--)
;
}
}
else
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] < xlat2; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] > xlat1; (*lat2)--)
;
if (xlat1 < xlat2)
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] < xlat1; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] > xlat2; (*lat2)--)
;
}
else
{
for (*lat1 = 0; *lat1 < nlat && yvals[*lat1] < xlat2; (*lat1)++)
;
for (*lat2 = nlat - 1; *lat2 && yvals[*lat2] > xlat1; (*lat2)--)
;
}
}
}
if (*lat2 - *lat1 + 1 <= 0) cdoAbort("Latitudinal dimension is too small!");
if (*lat2 - *lat1 + 1 <= 0) cdoAbort("Latitudinal dimension is too small!");
}
}
static void
genlonlatbox_curv(int gridID, double xlon1, double xlon2, double xlat1, double xlat2, long *lat1, long *lat2, long *lon11,
long *lon12, long *lon21, long *lon22)
genlonlatboxCurv(int gridID, double xlon1, double xlon2, double xlat1, double xlat2, long *lat1, long *lat2, long *lon11,
long *lon12, long *lon21, long *lon22)
{
long nlon = gridInqXsize(gridID);
long nlat = gridInqYsize(gridID);
......@@ -573,9 +585,9 @@ genlonlatbox(int argc_offset, int gridID, long *lat1, long *lat2, long *lon11, l
int gridtype = gridInqType(gridID);
if (gridtype == GRID_CURVILINEAR)
genlonlatbox_curv(gridID, xlon1, xlon2, xlat1, xlat2, lat1, lat2, lon11, lon12, lon21, lon22);
genlonlatboxCurv(gridID, xlon1, xlon2, xlat1, xlat2, lat1, lat2, lon11, lon12, lon21, lon22);
else
genlonlatbox_reg(gridID, xlon1, xlon2, xlat1, xlat2, lat1, lat2, lon11, lon12, lon21, lon22);
genlonlatboxReg2d(gridID, xlon1, xlon2, xlat1, xlat2, lat1, lat2, lon11, lon12, lon21, lon22);
}
static int
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment