11#include "HDFDMRArray_EOS2LL.h"
17#include <libdap/debug.h>
18#include <libdap/InternalErr.h>
26HDFDMRArray_EOS2LL::read ()
29 BESDEBUG(
"h4",
"Coming to HDFDMRArray_EOS2LL read "<<endl);
35 offset.resize(ll_rank);
37 count.resize(ll_rank);
44 int nelms = format_constraint(offset.data(),step.data(),count.data());
46 int32 gridfd = GDopen(
const_cast < char *
>(filename.c_str()), DFACC_READ);
49 err_msg =
"HDF-EOS: GDopen failed";
50 throw InternalErr (__FILE__, __LINE__, err_msg);
53 int32 gridid = GDattach(gridfd,
const_cast<char *
>(gridname.c_str()));
56 err_msg =
"HDF-EOS: GDattach failed to attach " + gridname;
58 throw InternalErr (__FILE__, __LINE__, err_msg);
73 if (GDprojinfo (gridid, &projcode, &zone, &sphere, params) <0) {
76 err_msg =
"GDprojinfo failed for grid name: " + gridname;
77 throw InternalErr (__FILE__, __LINE__, err_msg);
81 if (GDgridinfo(gridid, &xdim, &ydim, upleft,
85 err_msg =
"GDgridinfo failed for grid name: " + gridname;
86 throw InternalErr (__FILE__, __LINE__, err_msg);
91 intn r = GDpixreginfo (gridid, &pixreg);
95 err_msg =
"GDpixreginfo failed for grid name: " + gridname;
96 throw InternalErr (__FILE__, __LINE__, err_msg);
101 r = GDorigininfo (gridid, &origin);
105 err_msg =
"GDoriginfo failed for grid name: " + gridname;
106 throw InternalErr (__FILE__, __LINE__, err_msg);
113 rows.resize(xdim*ydim);
114 cols.resize(xdim*ydim);
115 lon.resize(xdim*ydim);
116 lat.resize(xdim*ydim);
131 for (k = j = 0; j < ydim; ++j) {
132 for (i = 0; i < xdim; ++i) {
140 r = GDij2ll (projcode, zone, params, sphere, xdim, ydim, upleft, lowright,
141 xdim * ydim, rows.data(), cols.data(), lon.data(), lat.data(), pixreg, origin);
146 err_msg =
"cannot calculate grid latitude and longitude for grid name: " + gridname;
147 throw InternalErr (__FILE__, __LINE__, err_msg);
152 if (projcode == GCTP_CEA || projcode == GCTP_GEO) {
153 vector<float64>out_lat;
154 out_lat.resize(ydim);
156 for (i =0; i<xdim*ydim;i = i+xdim){
162 vector<float64>out_lat_subset;
163 out_lat_subset.resize(nelms);
164 for (i=0;i<count[0];i++)
165 out_lat_subset[i] = out_lat[offset[0]+i*step[0]];
166 set_value(out_lat_subset.data(),nelms);
170 vector<float64>out_lat_subset;
171 out_lat_subset.resize(nelms);
172 LatLon2DSubset(out_lat_subset.data(),xdim,lat.data(),offset.data(),count.data(),step.data());
173 set_value(out_lat_subset.data(),nelms);
177 if (projcode == GCTP_CEA || projcode == GCTP_GEO) {
178 vector<float64>out_lon;
179 out_lon.resize(xdim);
180 for (i =0; i<xdim;i++)
184 vector<float64>out_lon_subset;
185 out_lon_subset.resize(nelms);
186 for (i=0;i<count[0];i++)
187 out_lon_subset[i] = out_lon[offset[0]+i*step[0]];
188 set_value(out_lon_subset.data(),nelms);
192 vector<float64>out_lon_subset;
193 out_lon_subset.resize(nelms);
194 LatLon2DSubset(out_lon_subset.data(),xdim,lon.data(),offset.data(),count.data(),step.data());
195 set_value(out_lon_subset.data(),nelms);
207HDFDMRArray_EOS2LL::format_constraint (
int *offset,
int *step,
int *count)
212 Dim_iter p = dim_begin ();
213 while (p != dim_end ()) {
215 int start = dimension_start (p,
true);
216 int stride = dimension_stride (p,
true);
217 int stop = dimension_stop (p,
true);
222 oss <<
"Array/Grid hyperslab start point "<< start <<
223 " is greater than stop point " << stop <<
".";
224 throw Error(malformed_expr, oss.str());
229 count[id] = ((stop - start) / stride) + 1;
233 "=format_constraint():"
234 <<
"id=" <<
id <<
" offset=" << offset[
id]
235 <<
" step=" << step[
id]
236 <<
" count=" << count[
id]
247template<
class T>
void
248HDFDMRArray_EOS2LL::LatLon2DSubset (T * outlatlon,
249 int minordim, T * latlon,
250 const int * offset,
const int * count,
251 const int * step)
const
258 int dim0count = count[0];
259 int dim1count = count[1];
260 int dim0index[dim0count];
261 int dim1index[dim1count];
263 for (i = 0; i < count[0]; i++)
264 dim0index[i] = offset[0] + i * step[0];
267 for (j = 0; j < count[1]; j++)
268 dim1index[j] = offset[1] + j * step[1];
273 for (i = 0; i < count[0]; i++) {
274 for (j = 0; j < count[1]; j++) {
276 outlatlon[k] = *(latlon + (dim0index[i] * minordim) + dim1index[j]);