18 #include "InternalErr.h"
23 #define SIGNED_BYTE_TO_INT32 1
26 #define NUM_PIXEL_NAME "Pixels per Scan Line"
27 #define NUM_POINTS_LINE_NAME "Number of Pixel Control Points"
28 #define NUM_SCAN_LINE_NAME "Number of Scan Lines"
29 #define NUM_LAT_NAME "Number of Lines"
30 #define NUM_LON_NAME "Number of Columns"
31 #define LAT_STEP_NAME "Latitude Step"
32 #define LON_STEP_NAME "Longitude Step"
33 #define SWP_LAT_NAME "SW Point Latitude"
34 #define SWP_LON_NAME "SW Point Longitude"
40 BESDEBUG(
"h4",
"Coming to HDFSPArrayGeoField read "<<endl);
52 nelms = format_constraint (&offset[0], &step[0], &count[0]);
55 vector<int32>offset32;
56 offset32.resize(rank);
64 for (
int i = 0; i < rank; i++) {
65 offset32[i] = (int32) offset[i];
66 count32[i] = (int32) count[i];
67 step32[i] = (int32) step[i];
77 readtrmml2_v6 (&offset32[0], &count32[0], &step32[0], nelms);
84 readtrmml3a_v6 (&offset32[0], &count32[0], &step32[0], nelms);
90 readtrmml3b_v6 (&offset32[0], &count32[0], &step32[0], nelms);
96 readtrmml3c_v6 (&offset32[0], &count32[0], &step32[0], nelms);
105 readtrmml3_v7 (&offset32[0], &count32[0], &step32[0], nelms);
111 readceravgsyn (&offset32[0], &count32[0], &step32[0], nelms);
118 readceres4ig (&offset32[0], &count32[0], &step32[0], nelms);
125 readcersavgid2 (&offset[0], &count[0], &step[0], nelms);
132 readceres4ig (&offset32[0], &count32[0], &step32[0], nelms);
141 readcersavgid1 (&offset[0], &count[0], &step[0], nelms);
144 else if (rank == 2) {
145 readcersavgid2 (&offset[0], &count[0], &step[0], nelms);
153 readceravgsyn (&offset32[0], &count32[0], &step32[0], nelms);
160 readcerzavg (&offset32[0], &count32[0], &step32[0], nelms);
167 readobpgl2 (&offset32[0], &count32[0], &step32[0], nelms);
174 readobpgl3 (&offset[0], &count[0], &step[0], nelms);
182 InternalErr (__FILE__, __LINE__,
"Unsupported HDF files");
190 InternalErr (__FILE__, __LINE__,
"Unsupported HDF files");
206 HDFSPArrayGeoField::readtrmml2_v6 (int32 * offset32, int32 * count32,
207 int32 * step32,
int nelms)
210 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
211 bool check_pass_fileid_key =
false;
215 if(
false == check_pass_fileid_key) {
216 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
219 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
220 throw InternalErr (__FILE__, __LINE__, eherr.str ());
228 vector<int32>geooffset32;
229 geooffset32.resize(rank+1);
231 vector<int32>geocount32;
232 geocount32.resize(rank+1);
234 vector<int32>geostep32;
235 geostep32.resize(rank+1);
237 for (
int i = 0; i < rank; i++) {
238 geooffset32[i] = offset32[i];
239 geocount32[i] = count32[i];
240 geostep32[i] = step32[i];
243 if (fieldtype == 1) {
244 geooffset32[rank] = 0;
245 geocount32[rank] = 1;
249 if (fieldtype == 2) {
250 geooffset32[rank] = 1;
251 geocount32[rank] = 1;
255 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
257 if (sdsindex == -1) {
260 eherr <<
"SDS index " << sdsindex <<
" is not right.";
261 throw InternalErr (__FILE__, __LINE__, eherr.str ());
264 sdsid = SDselect (sdid, sdsindex);
268 eherr <<
"SDselect failed.";
269 throw InternalErr (__FILE__, __LINE__, eherr.str ());
280 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
285 eherr <<
"SDreaddata failed.";
286 throw InternalErr (__FILE__, __LINE__, eherr.str ());
289 #ifndef SIGNED_BYTE_TO_INT32
290 set_value ((dods_byte *) &val[0], nelms);
293 newval.resize(nelms);
295 for (
int counter = 0; counter < nelms; counter++)
296 newval[counter] = (int32) (val[counter]);
297 set_value ((dods_int32 *) &newval[0], nelms);
307 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
312 eherr <<
"SDreaddata failed";
313 throw InternalErr (__FILE__, __LINE__, eherr.str ());
316 set_value ((dods_byte *) &val[0], nelms);
324 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
329 eherr <<
"SDreaddata failed";
330 throw InternalErr (__FILE__, __LINE__, eherr.str ());
333 set_value ((dods_int16 *) &val[0], nelms);
341 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
346 eherr <<
"SDreaddata failed";
347 throw InternalErr (__FILE__, __LINE__, eherr.str ());
350 set_value ((dods_uint16 *) &val[0], nelms);
357 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
362 eherr <<
"SDreaddata failed";
363 throw InternalErr (__FILE__, __LINE__, eherr.str ());
366 set_value ((dods_int32 *) &val[0], nelms);
373 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
378 eherr <<
"SDreaddata failed";
379 throw InternalErr (__FILE__, __LINE__, eherr.str ());
381 set_value ((dods_uint32 *) &val[0], nelms);
388 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
393 eherr <<
"SDreaddata failed";
394 throw InternalErr (__FILE__, __LINE__, eherr.str ());
397 set_value ((dods_float32 *) &val[0], nelms);
404 r = SDreaddata (sdsid, &geooffset32[0], &geostep32[0], &geocount32[0], (
void*)(&val[0]));
409 eherr <<
"SDreaddata failed";
410 throw InternalErr (__FILE__, __LINE__, eherr.str ());
413 set_value ((dods_float64 *) &val[0], nelms);
419 InternalErr (__FILE__, __LINE__,
"unsupported data type.");
422 r = SDendaccess (sdsid);
426 eherr <<
"SDendaccess failed.";
427 throw InternalErr (__FILE__, __LINE__, eherr.str ());
437 HDFSPArrayGeoField::readtrmml3a_v6 (int32 * offset32, int32 * count32,
438 int32 * step32,
int nelms)
441 const float slat = 89.5;
442 const float slon = 0.5;
446 if (fieldtype == 1) {
449 float sval = slat - offset32[0];
451 while (icount < (
int) (count32[0])) {
452 val[icount] = sval - step32[0] * icount;
457 if (fieldtype == 2) {
459 float sval = slon + offset32[0];
461 while (icount < (
int) (count32[0])) {
462 val[icount] = sval + step32[0] * icount;
466 set_value ((dods_float32 *) &val[0], nelms);
473 HDFSPArrayGeoField::readtrmml3b_v6 (int32 * offset32, int32 * count32,
474 int32 * step32,
int nelms)
477 const float slat = -49.875;
478 const float slon = -179.875;
482 if (fieldtype == 1) {
485 float sval = slat + 0.25 * (int) (offset32[0]);
487 while (icount < (
int) (count32[0])) {
488 val[icount] = sval + 0.25 * (int) (step32[0]) * icount;
493 if (fieldtype == 2) {
495 float sval = slon + 0.25 * (int) (offset32[0]);
497 while (icount < (
int) (count32[0])) {
498 val[icount] = sval + 0.25 * (int) (step32[0]) * icount;
502 set_value ((dods_float32 *) &val[0], nelms);
508 HDFSPArrayGeoField::readtrmml3c_v6 (int32 * offset32, int32 * count32,
509 int32 * step32,
int nelms)
512 const float slat = -36.75;
513 const float slon = -179.75;
517 if (fieldtype == 1) {
520 float sval = slat + 0.5 * (int) (offset32[0]);
522 while (icount < (
int) (count32[0])) {
523 val[icount] = sval + 0.5 * (int) (step32[0]) * icount;
528 if (fieldtype == 2) {
530 float sval = slon + 0.5 * (int) (offset32[0]);
532 while (icount < (
int) (count32[0])) {
533 val[icount] = sval + 0.5 * (int) (step32[0]) * icount;
537 set_value ((dods_float32 *) &val[0], nelms);
542 HDFSPArrayGeoField::readtrmml3_v7 (int32 * offset32, int32 * count32,
543 int32 * step32,
int nelms)
546 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
547 bool check_pass_fileid_key =
false;
551 if(
false == check_pass_fileid_key) {
552 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
555 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
556 throw InternalErr (__FILE__, __LINE__, eherr.str ());
563 string gridinfo_name =
"GridHeader";
569 throw InternalErr (__FILE__,__LINE__,
570 "The maximum number of grids to be supported in the current implementation is 9.");
574 ostringstream fieldref_str;
575 fieldref_str << fieldref;
576 gridinfo_name = gridinfo_name + fieldref_str.str();
580 int32 attr_index = 0;
581 attr_index = SDfindattr (sdid, gridinfo_name.c_str());
582 if (attr_index == FAIL) {
584 string err_mesg =
"SDfindattr failed,should find attribute "+gridinfo_name+
" .";
585 throw InternalErr (__FILE__, __LINE__, err_mesg);
588 int32 attr_dtype = 0;
591 char attr_name[H4_MAX_NC_NAME];
593 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
594 if (status == FAIL) {
596 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
599 vector<char> attr_value;
600 attr_value.resize(n_values * DFKNTsize(attr_dtype));
602 status = SDreadattr (sdid, attr_index, &attr_value[0]);
603 if (status == FAIL) {
605 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
608 float lat_start = 0;;
609 float lon_start = 0.;
617 lat_start,lon_start,lat_res,lon_res,
false);
623 if(0 == latsize || 0 == lonsize) {
625 throw InternalErr (__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
633 for (
int i = 0; i < nelms; ++i)
634 val[i] = lat_start+offset32[0]*lat_res+lat_res/2 + i*lat_res*step32[0];
636 else if(fieldtype == 2) {
637 for (
int i = 0; i < nelms; ++i)
638 val[i] = lon_start+offset32[0]*lon_res+lon_res/2 + i*lon_res*step32[0];
641 set_value ((dods_float32 *) &val[0], nelms);
657 HDFSPArrayGeoField::readobpgl2 (int32 * offset32, int32 * count32,
658 int32 * step32,
int nelms)
660 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
661 bool check_pass_fileid_key =
false;
665 if(
false == check_pass_fileid_key) {
666 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
669 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
670 throw InternalErr (__FILE__, __LINE__, eherr.str ());
680 int32 attr_index = 0;
681 int32 attr_dtype = 0;
683 int32 num_pixel_data = 0;
684 int32 num_point_data = 0;
685 int32 num_scan_data = 0;
688 if (attr_index == FAIL) {
691 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
692 throw InternalErr (__FILE__, __LINE__, err_mesg);
695 char attr_name[H4_MAX_NC_NAME];
697 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
698 if (status == FAIL) {
700 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
705 throw InternalErr (__FILE__, __LINE__,
706 "Only one value of number of scan line ");
709 status = SDreadattr (sdid, attr_index, &num_pixel_data);
710 if (status == FAIL) {
712 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
716 if (attr_index == FAIL) {
719 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
720 throw InternalErr (__FILE__, __LINE__, err_mesg);
725 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
726 if (status == FAIL) {
728 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
733 throw InternalErr (__FILE__, __LINE__,
734 "Only one value of number of point ");
737 status = SDreadattr (sdid, attr_index, &num_point_data);
738 if (status == FAIL) {
740 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
744 if (attr_index == FAIL) {
747 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
748 throw InternalErr (__FILE__, __LINE__, err_mesg);
753 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
754 if (status == FAIL) {
756 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
761 throw InternalErr (__FILE__, __LINE__,
"Only one value of number of point ");
764 status = SDreadattr (sdid, attr_index, &num_scan_data);
765 if (status == FAIL) {
767 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
771 if ( 0 == num_scan_data || 0 == num_point_data || 0 == num_pixel_data) {
773 throw InternalErr (__FILE__, __LINE__,
"num_scan or num_point or num_pixel should not be zero. ");
776 if ( 1 == num_point_data && num_pixel_data != 1) {
778 throw InternalErr (__FILE__, __LINE__,
779 "num_point is 1 and num_pixel is not 1, interpolation cannot be done ");
782 bool compmapflag =
false;
783 if (num_pixel_data == num_point_data)
786 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
787 if (sdsindex == -1) {
790 eherr <<
"SDS index " << sdsindex <<
" is not right.";
791 throw InternalErr (__FILE__, __LINE__, eherr.str ());
794 sdsid = SDselect (sdid, sdsindex);
798 eherr <<
"SDselect failed.";
799 throw InternalErr (__FILE__, __LINE__, eherr.str ());
816 throw InternalErr (__FILE__, __LINE__,
"datatype is not float, unsupported.");
823 r = SDreaddata (sdsid, offset32, step32, count32, &val[0]);
828 eherr <<
"SDreaddata failed";
829 throw InternalErr (__FILE__, __LINE__, eherr.str ());
834 int total_elm = num_scan_data * num_point_data;
835 vector<float32>orival;
836 orival.resize(total_elm);
837 int32 all_start[2],all_edges[2];
841 all_edges[0] = num_scan_data;
842 all_edges[1] = num_point_data;
844 r = SDreaddata (sdsid, all_start,
NULL, all_edges,
850 eherr <<
"SDreaddata failed";
851 throw InternalErr (__FILE__, __LINE__, eherr.str ());
853 int interpolate_elm = num_scan_data *num_pixel_data;
855 vector<float32> interp_val;
856 interp_val.resize(interpolate_elm);
862 if (num_pixel_data % num_point_data == 0)
863 tempseg = num_pixel_data / num_point_data;
865 tempseg = num_pixel_data / num_point_data + 1;
868 (num_pixel_data%num_point_data)?(num_pixel_data-1-(tempseg*(num_point_data-2))):tempseg;
870 if ( 0 == last_tempseg || 0 == tempseg) {
873 throw InternalErr(__FILE__,__LINE__,
"Segments cannot be zero");
876 int interp_val_index = 0;
878 for (
int i = 0; i <num_scan_data; i++) {
881 for(
int j =0; j <num_point_data -2; j ++) {
882 tempdiff = orival[i*num_point_data+j+1] - orival[i*num_point_data+j];
883 for (
int k = 0; k <tempseg; k++) {
884 interp_val[interp_val_index] = orival[i*num_point_data+j] +
891 tempdiff = orival[i*num_point_data+num_point_data-1]
892 -orival[i*num_point_data+num_point_data-2];
893 for (
int k = 0; k <last_tempseg; k++) {
894 interp_val[interp_val_index] = orival[i*num_point_data+num_point_data-2] +
895 tempdiff/last_tempseg *k;
899 interp_val[interp_val_index] = orival[i*num_point_data+num_point_data-1];
904 LatLon2DSubset(&val[0],num_scan_data,num_pixel_data,&interp_val[0],
905 offset32,count32,step32);
916 int32 realcount2 = oricount32[1] - 1;
918 for (i = 0; i < (int) count32[0]; i++) {
919 for (j = 0; j < (int) realcount2 - 1; j++) {
921 orival[i * (int) oricount32[1] + j + 1] -
922 orival[i * (
int) oricount32[1] + j];
923 for (k = 0; k < tempnewseg; k++) {
924 val[i * (int) count32[1] + j * tempnewseg + k] =
925 orival[i * (
int) oricount32[1] + j] +
926 tempdiff / tempnewseg * k;
930 orival[i * (
int) oricount32[1] + j + 1] -
931 orival[i * (
int) oricount32[1] + j];
937 tempnewseg * (
int) (realcount2 - 1));
938 for (k2 = 0; k2 <= lastseg; k2++)
939 val[i * (
int) count32[1] + j * tempnewseg + k2] =
940 orival[i * (
int) oricount32[1] + j] +
941 tempdiff / lastseg * k2;
944 delete[](float32 *) orival;
948 set_value ((dods_float32 *) &val[0], nelms);
954 InternalErr (__FILE__, __LINE__,
"unsupported data type.");
957 r = SDendaccess (sdsid);
961 eherr <<
"SDendaccess failed.";
962 throw InternalErr (__FILE__, __LINE__, eherr.str ());
972 HDFSPArrayGeoField::readobpgl3 (
int *offset,
int *count,
int *step,
int nelms)
975 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
976 bool check_pass_fileid_key =
false;
980 if(
false == check_pass_fileid_key) {
981 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
984 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
985 throw InternalErr (__FILE__, __LINE__, eherr.str ());
994 int32 attr_index = 0;
995 int32 attr_dtype = 0;
997 int32 num_lat_data = 0;
998 int32 num_lon_data = 0;
999 float32 lat_step = 0.;
1000 float32 lon_step = 0.;
1001 float32 swp_lat = 0.;
1002 float32 swp_lon = 0.;
1006 if (attr_index == FAIL) {
1009 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1010 throw InternalErr (__FILE__, __LINE__, err_mesg);
1014 char attr_name[H4_MAX_NC_NAME];
1016 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1017 if (status == FAIL) {
1019 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1022 if (n_values != 1) {
1024 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1027 status = SDreadattr (sdid, attr_index, &num_lat_data);
1028 if (status == FAIL) {
1030 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1035 if (attr_index == FAIL) {
1038 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1039 throw InternalErr (__FILE__, __LINE__, err_mesg);
1044 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1045 if (status == FAIL) {
1047 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1050 if (n_values != 1) {
1052 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1055 status = SDreadattr (sdid, attr_index, &num_lon_data);
1056 if (status == FAIL) {
1058 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1063 if (attr_index == FAIL) {
1066 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1067 throw InternalErr (__FILE__, __LINE__, err_mesg);
1072 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1073 if (status == FAIL) {
1075 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1078 if (n_values != 1) {
1080 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1083 status = SDreadattr (sdid, attr_index, &lat_step);
1084 if (status == FAIL) {
1086 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1091 if (attr_index == FAIL) {
1094 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1095 throw InternalErr (__FILE__, __LINE__, err_mesg);
1100 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1101 if (status == FAIL) {
1103 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1106 if (n_values != 1) {
1108 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1111 status = SDreadattr (sdid, attr_index, &lon_step);
1112 if (status == FAIL) {
1114 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1119 if (attr_index == FAIL) {
1122 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1123 throw InternalErr (__FILE__, __LINE__, err_mesg);
1128 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1129 if (status == FAIL) {
1131 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1134 if (n_values != 1) {
1136 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1139 status = SDreadattr (sdid, attr_index, &swp_lat);
1140 if (status == FAIL) {
1142 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1147 if (attr_index == FAIL) {
1150 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1151 throw InternalErr (__FILE__, __LINE__, err_mesg);
1156 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1157 if (status == FAIL) {
1159 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1162 if (n_values != 1) {
1164 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1167 status = SDreadattr (sdid, attr_index, &swp_lon);
1168 if (status == FAIL) {
1170 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1174 if (fieldtype == 1) {
1176 vector<float32> allval;
1177 allval.resize(num_lat_data);
1181 for (
int j = 0; j < num_lat_data; j++)
1182 allval[j] = (num_lat_data - j - 1) * lat_step + swp_lat;
1187 for (
int k = 0; k < nelms; k++)
1188 val[k] = allval[(
int) (offset[0] + step[0] * k)];
1190 set_value ((dods_float32 *) &val[0], nelms);
1193 if (fieldtype == 2) {
1195 vector<float32>allval;
1196 allval.resize(num_lon_data);
1197 for (
int j = 0; j < num_lon_data; j++)
1198 allval[j] = swp_lon + j * lon_step;
1202 for (
int k = 0; k < nelms; k++)
1203 val[k] = allval[(
int) (offset[0] + step[0] * k)];
1205 set_value ((dods_float32 *) &val[0], nelms);
1219 HDFSPArrayGeoField::readcersavgid2 (
int *offset,
int *count,
int *step,
1223 const int dimsize0 = 180;
1224 const int dimsize1 = 360;
1225 float32 val[count[0]][count[1]];
1226 float32 orival[dimsize0][dimsize1];
1231 if (fieldtype == 1) {
1232 for (
int i = 0; i < dimsize0; i++)
1233 for (
int j = 0; j < dimsize1; j++)
1234 orival[i][j] = 89.5 - i;
1236 for (
int i = 0; i < count[0]; i++) {
1237 for (
int j = 0; j < count[1]; j++) {
1239 orival[offset[0] + step[0] * i][offset[1] + step[1] * j];
1244 if (fieldtype == 2) {
1264 for (j = 0; j < dimsize1; j++) {
1265 orival[0][j] = -179.5;
1266 orival[dimsize0 - 1][j] = -179.5;
1275 for (i = 0; i < latrange; i++)
1276 for (j = 0; j < (dimsize1 / lonextent); j++)
1277 for (k = 0; k < lonextent; k++)
1278 orival[i + latindex_north][j * lonextent + k] =
1279 -179.5 + lonextent * j;
1282 latindex_south = dimsize0 - 1 - latrange;
1283 for (i = 0; i < latrange; i++)
1284 for (j = 0; j < (dimsize1 / lonextent); j++)
1285 for (k = 0; k < lonextent; k++)
1286 orival[i + latindex_south][j * lonextent + k] =
1287 -179.5 + lonextent * j;
1290 latindex_north = latindex_north + latrange;
1294 for (i = 0; i < latrange; i++)
1295 for (j = 0; j < (dimsize1 / lonextent); j++)
1296 for (k = 0; k < lonextent; k++)
1297 orival[i + latindex_north][j * lonextent + k] =
1298 -179.5 + lonextent * j;
1301 latindex_south = latindex_south - latrange;
1302 for (i = 0; i < latrange; i++)
1303 for (j = 0; j < (dimsize1 / lonextent); j++)
1304 for (k = 0; k < lonextent; k++)
1305 orival[i + latindex_south][j * lonextent + k] =
1306 -179.5 + lonextent * j;
1309 latindex_north = latindex_north + latrange;
1313 for (i = 0; i < latrange; i++)
1314 for (j = 0; j < (dimsize1 / lonextent); j++)
1315 for (k = 0; k < lonextent; k++)
1316 orival[i + latindex_north][j * lonextent + k] =
1317 -179.5 + lonextent * j;
1320 latindex_south = latindex_south - latrange;
1322 for (i = 0; i < latrange; i++)
1323 for (j = 0; j < (dimsize1 / lonextent); j++)
1324 for (k = 0; k < lonextent; k++)
1325 orival[i + latindex_south][j * lonextent + k] =
1326 -179.5 + lonextent * j;
1329 latindex_north = latindex_north + latrange;
1333 for (i = 0; i < latrange; i++)
1334 for (j = 0; j < (dimsize1 / lonextent); j++)
1335 for (k = 0; k < lonextent; k++)
1336 orival[i + latindex_north][j * lonextent + k] =
1337 -179.5 + lonextent * j;
1340 latindex_south = latindex_south - latrange;
1341 for (i = 0; i < latrange; i++)
1342 for (j = 0; j < (dimsize1 / lonextent); j++)
1343 for (k = 0; k < lonextent; k++)
1344 orival[i + latindex_south][j * lonextent + k] =
1345 -179.5 + lonextent * j;
1347 for (
int i = 0; i < count[0]; i++) {
1348 for (
int j = 0; j < count[1]; j++) {
1350 orival[offset[0] + step[0] * i][offset[1] + step[1] * j];
1354 set_value ((dods_float32 *) (&val[0][0]), nelms);
1360 HDFSPArrayGeoField::readcersavgid1 (
int *offset,
int *count,
int *step,
1367 if (fieldtype == 1) {
1368 const int dimsize0 = 180;
1369 float32 val[count[0]];
1370 float32 orival[dimsize0];
1372 for (
int i = 0; i < dimsize0; i++)
1373 orival[i] = 89.5 - i;
1375 for (
int i = 0; i < count[0]; i++) {
1376 val[i] = orival[offset[0] + step[0] * i];
1378 set_value ((dods_float32 *) (&val[0]), nelms);
1382 if (fieldtype == 2) {
1387 InternalErr (__FILE__, __LINE__,
1388 "the number of element must be 1");
1389 set_value ((dods_float32 *) (&val), nelms);
1398 HDFSPArrayGeoField::readceravgsyn (int32 * offset32, int32 * count32,
1399 int32 * step32,
int nelms)
1402 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
1403 bool check_pass_fileid_key =
false;
1407 if(
false == check_pass_fileid_key) {
1408 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
1410 ostringstream eherr;
1411 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
1412 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1421 int32 sdsindex = SDreftoindex (sdid, fieldref);
1423 if (sdsindex == -1) {
1425 ostringstream eherr;
1426 eherr <<
"SDS index " << sdsindex <<
" is not right.";
1427 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1430 sdsid = SDselect (sdid, sdsindex);
1433 ostringstream eherr;
1434 eherr <<
"SDselect failed.";
1435 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1449 SDendaccess (sdsid);
1451 throw InternalErr (__FILE__, __LINE__,
1452 "datatype is not float, unsupported.");
1457 r = SDreaddata (sdsid, offset32, step32, count32, &val[0]);
1459 SDendaccess (sdsid);
1461 ostringstream eherr;
1462 eherr <<
"SDreaddata failed";
1463 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1466 if (fieldtype == 1) {
1467 for (i = 0; i < nelms; i++)
1468 val[i] = 90 - val[i];
1470 if (fieldtype == 2) {
1471 for (i = 0; i < nelms; i++)
1473 val[i] = val[i] - 360.0;
1476 set_value ((dods_float32 *) &val[0], nelms);
1484 r = SDreaddata (sdsid, offset32, step32, count32, &val[0]);
1486 SDendaccess (sdsid);
1488 ostringstream eherr;
1489 eherr <<
"SDreaddata failed";
1490 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1493 if (fieldtype == 1) {
1494 for (i = 0; i < nelms; i++)
1495 val[i] = 90 - val[i];
1497 if (fieldtype == 2) {
1498 for (i = 0; i < nelms; i++)
1500 val[i] = val[i] - 360.0;
1502 set_value ((dods_float64 *) &val[0], nelms);
1506 SDendaccess (sdsid);
1508 InternalErr (__FILE__, __LINE__,
"unsupported data type.");
1511 r = SDendaccess (sdsid);
1513 ostringstream eherr;
1514 eherr <<
"SDendaccess failed.";
1515 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1524 HDFSPArrayGeoField::readceres4ig (int32 * offset32, int32 * count32,
1525 int32 * step32,
int nelms)
1527 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
1528 bool check_pass_fileid_key =
false;
1532 if(
false == check_pass_fileid_key) {
1533 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
1535 ostringstream eherr;
1536 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
1537 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1547 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
1548 if (sdsindex == -1) {
1550 ostringstream eherr;
1551 eherr <<
"SDS index " << sdsindex <<
" is not right.";
1552 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1555 sdsid = SDselect (sdid, sdsindex);
1558 ostringstream eherr;
1559 eherr <<
"SDselect failed.";
1560 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1564 int32 sds_dtype = 0;
1566 char sdsname[H4_MAX_NC_NAME];
1567 int32 dim_sizes[H4_MAX_VAR_DIMS];
1570 SDgetinfo (sdsid, sdsname, &sdsrank, dim_sizes, &sds_dtype, &n_attrs);
1572 SDendaccess (sdsid);
1574 ostringstream eherr;
1575 eherr <<
"SDgetinfo failed.";
1576 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1579 vector<int32> orioffset32;
1580 vector<int32> oricount32;
1581 vector<int32> oristep32;
1582 orioffset32.resize(sdsrank);
1583 oricount32.resize(sdsrank);
1584 oristep32.resize(sdsrank);
1588 switch (sds_dtype) {
1598 SDendaccess (sdsid);
1600 throw InternalErr (__FILE__, __LINE__,
1601 "datatype is not float, unsupported.");
1604 vector<float32> val;
1606 if (fieldtype == 1) {
1609 SDendaccess (sdsid);
1611 throw InternalErr (__FILE__, __LINE__,
1612 "For CER_ISCCP-D2like-GEO case, lat/lon must be 3-D");
1617 orioffset32[1] = offset32[0];
1620 oricount32[1] = count32[0];
1623 oristep32[1] = step32[0];
1628 SDendaccess (sdsid);
1630 throw InternalErr (__FILE__, __LINE__,
1631 "For CER_ES4 case, lat/lon must be 2-D");
1634 orioffset32[0] = offset32[0];
1636 oricount32[0] = count32[0];
1638 oristep32[0] = step32[0];
1643 if (fieldtype == 2) {
1646 SDendaccess (sdsid);
1648 throw InternalErr (__FILE__, __LINE__,
1649 "For CER_ISCCP-D2like-GEO case, lat/lon must be 3-D");
1652 orioffset32[2] = offset32[0];
1655 oricount32[2] = count32[0];
1658 oristep32[2] = step32[0];
1663 SDendaccess (sdsid);
1665 throw InternalErr (__FILE__, __LINE__,
1666 "For CER_ES4 case, lat/lon must be 2-D");
1668 orioffset32[1] = offset32[0];
1670 oricount32[1] = count32[0];
1672 oristep32[1] = step32[0];
1677 r = SDreaddata (sdsid, &orioffset32[0], &oristep32[0], &oricount32[0], &val[0]);
1679 SDendaccess (sdsid);
1681 ostringstream eherr;
1682 eherr <<
"SDreaddata failed";
1683 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1687 for (
int i = 0; i < nelms; i++)
1688 val[i] = 90 - val[i];
1689 if (fieldtype == 2) {
1694 for (
int i = 0; i < nelms; i++)
1696 val[i] = val[i] - 360.0;
1699 set_value ((dods_float32 *) &val[0], nelms);
1703 SDendaccess (sdsid);
1705 InternalErr (__FILE__, __LINE__,
"unsupported data type.");
1708 r = SDendaccess (sdsid);
1710 ostringstream eherr;
1711 eherr <<
"SDendaccess failed.";
1712 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1720 HDFSPArrayGeoField::readcerzavg (int32 * offset32, int32 * count32,
1721 int32 * step32,
int nelms)
1723 if (fieldtype == 1) {
1728 float32 latstep = 1.0;
1730 for (
int i = 0; i < nelms; i++)
1732 89.5 - ((
int) (offset32[0]) +
1733 ((
int) (step32[0])) * i) * latstep;
1734 set_value ((dods_float32 *) &val[0], nelms);
1737 if (fieldtype == 2) {
1738 if (count32[0] != 1 || nelms != 1)
1739 throw InternalErr (__FILE__, __LINE__,
1740 "Longitude should only have one value for zonal mean");
1744 set_value ((dods_float32 *) & val, nelms);
1757 Dim_iter p = dim_begin ();
1759 while (p != dim_end ()) {
1761 int start = dimension_start (p,
true);
1762 int stride = dimension_stride (p,
true);
1763 int stop = dimension_stop (p,
true);
1766 if (stride < 0 || start < 0 || stop < 0 || start > stop) {
1768 oss <<
"Array/Grid hyperslab indices are bad: [" << start <<
1769 ":" << stride <<
":" << stop <<
"]";
1770 throw Error (malformed_expr, oss.str ());
1774 if (start == 0 && stop == 0 && stride == 0) {
1775 start = dimension_start (p,
false);
1776 stride = dimension_stride (p,
false);
1777 stop = dimension_stop (p,
false);
1782 count[id] = ((stop - start) / stride) + 1;
1786 "=format_constraint():" <<
"id=" <<
id <<
" offset=" <<
1788 <<
" step=" << step[
id]
1789 <<
" count=" << count[
id]
1800 template <
typename T >
1801 void HDFSPArrayGeoField::LatLon2DSubset (T * outlatlon,
1811 T (*templatlonptr)[majordim][minordim] = (typeof templatlonptr) latlon;
1818 const int dim0count = count[0];
1819 const int dim1count = count[1];
1820 int dim0index[dim0count], dim1index[dim1count];
1822 for (i = 0; i < count[0]; i++)
1823 dim0index[i] = offset[0] + i * step[0];
1825 for (j = 0; j < count[1]; j++)
1826 dim1index[j] = offset[1] + j * step[1];
1831 for (i = 0; i < count[0]; i++) {
1832 for (j = 0; j < count[1]; j++) {
1833 outlatlon[k] = (*templatlonptr)[dim0index[i]][dim1index[j]];
static void parser_trmm_v7_gridheader(const std::vector< char > &value, int &latsize, int &lonsize, float &lat_start, float &lon_start, float &lat_res, float &lon_res, bool check_reg_orig)
#define NUM_POINTS_LINE_NAME
int format_constraint(int *cor, int *step, int *edg)
#define NUM_SCAN_LINE_NAME
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)
Close HDF4 and HDF-EOS2 file IDs. For performance reasons, we want to keep HDF-EOS2/HDF4 IDs open for...
static bool check_beskeys(const std::string &key)
Check the BES key. This function will check a BES key specified at the file h4.conf.in. If the key's value is either true or yes. The handler claims to find a key and will do some operations. Otherwise, will do different operations. For example, One may find a line H4.EnableCF=true at h4.conf.in. That means, the HDF4 handler will handle the HDF4 files by following CF conventions.
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream