32 #include "config_hdf5.h"
37 #include "InternalErr.h"
45 BaseType *HDF5GMCFMissLLArray::ptr_duplicate()
50 bool HDF5GMCFMissLLArray::read()
53 BESDEBUG(
"h5",
"Coming to HDF5GMCFMissLLArray read "<<endl);
55 if (NULL == HDF5RequestHandler::get_lrdata_mem_cache())
56 read_data_NOT_from_mem_cache(
false, NULL);
60 vector<string> cur_lrd_non_cache_dir_list;
61 HDF5RequestHandler::get_lrd_non_cache_dir_list(cur_lrd_non_cache_dir_list);
66 if ((cur_lrd_non_cache_dir_list.size() == 0)
67 || (
"" == check_str_sect_in_list(cur_lrd_non_cache_dir_list, filename,
'/'))) {
69 vector<string> cur_cache_dlist;
70 HDF5RequestHandler::get_lrd_cache_dir_list(cur_cache_dlist);
71 string cache_dir = check_str_sect_in_list(cur_cache_dlist, filename,
'/');
72 if (cache_dir !=
"") {
74 cache_key = cache_dir + varname;
77 cache_key = filename + varname;
81 vector<size_t> dim_sizes;
82 Dim_iter i_dim = dim_begin();
83 Dim_iter i_enddim = dim_end();
84 while (i_dim != i_enddim) {
85 dim_sizes.push_back(dimension_size(i_dim));
89 size_t total_elems = 1;
90 for (
unsigned int i = 0; i < dim_sizes.size(); i++)
91 total_elems = total_elems * dim_sizes[i];
93 handle_data_with_mem_cache(dtype, total_elems, cache_flag, cache_key);
96 read_data_NOT_from_mem_cache(
false, NULL);
102 void HDF5GMCFMissLLArray::obtain_aqu_obpg_l3_ll(
int* offset,
int* step,
int nelms,
bool add_cache,
void* buf)
105 BESDEBUG(
"h5",
"Coming to obtain_aqu_obpg_l3_ll read "<<endl);
111 throw InternalErr(__FILE__, __LINE__,
"The number of dimension for Aquarius Level 3 map data must be 1");
113 bool check_pass_fileid_key = HDF5RequestHandler::get_pass_fileid();
114 if (
false == check_pass_fileid_key) {
115 if ((fileid = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
117 eherr <<
"HDF5 File " << filename <<
" cannot be opened. " << endl;
118 throw InternalErr(__FILE__, __LINE__, eherr.str());
123 if ((rootid = H5Gopen(fileid,
"/", H5P_DEFAULT)) < 0) {
124 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
126 eherr <<
"HDF5 dataset " << varname <<
" cannot be opened. " << endl;
127 throw InternalErr(__FILE__, __LINE__, eherr.str());
130 float LL_first_point = 0.0;
132 int LL_total_num = 0;
134 if (CV_LAT_MISS == cvartype) {
135 string Lat_SWP_name = (Aqu_L3 == product_type) ?
"SW Point Latitude" :
"sw_point_latitude";
136 string Lat_step_name = (Aqu_L3 == product_type) ?
"Latitude Step" :
"latitude_step";
137 string Num_lines_name = (Aqu_L3 == product_type) ?
"Number of Lines" :
"number_of_lines";
139 float Lat_step = 0.0;
141 vector<char> dummy_str;
143 obtain_ll_attr_value(fileid, rootid, Lat_SWP_name, Lat_SWP, dummy_str);
144 obtain_ll_attr_value(fileid, rootid, Lat_step_name, Lat_step, dummy_str);
145 obtain_ll_attr_value(fileid, rootid, Num_lines_name, Num_lines, dummy_str);
146 if (Num_lines <= 0) {
148 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
149 throw InternalErr(__FILE__, __LINE__,
"The number of line must be >0");
153 LL_first_point = (float)(Lat_SWP + (Num_lines - 1) * Lat_step);
154 LL_step = (float)(Lat_step * (-1.0));
155 LL_total_num = Num_lines;
158 if (CV_LON_MISS == cvartype) {
160 string Lon_SWP_name = (Aqu_L3 == product_type) ?
"SW Point Longitude" :
"sw_point_longitude";
161 string Lon_step_name = (Aqu_L3 == product_type) ?
"Longitude Step" :
"longitude_step";
162 string Num_columns_name = (Aqu_L3 == product_type) ?
"Number of Columns" :
"number_of_columns";
164 float Lon_step = 0.0;
167 vector<char> dummy_str_value;
169 obtain_ll_attr_value(fileid, rootid, Lon_SWP_name, Lon_SWP, dummy_str_value);
170 obtain_ll_attr_value(fileid, rootid, Lon_step_name, Lon_step, dummy_str_value);
171 obtain_ll_attr_value(fileid, rootid, Num_columns_name, Num_cols, dummy_str_value);
174 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
175 throw InternalErr(__FILE__, __LINE__,
"The number of line must be >0");
179 LL_first_point = Lon_SWP;
181 LL_total_num = Num_cols;
187 if (nelms > LL_total_num) {
189 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
190 throw InternalErr(__FILE__, __LINE__,
191 "The number of elements exceeds the total number of Latitude or Longitude");
194 for (
int i = 0; i < nelms; ++i)
195 val[i] = LL_first_point + (offset[0] + i * step[0]) * LL_step;
197 if (
true == add_cache) {
198 vector<float> total_val;
199 total_val.resize(LL_total_num);
200 for (
int total_i = 0; total_i < LL_total_num; total_i++)
201 total_val[total_i] = LL_first_point + total_i * LL_step;
202 memcpy(buf, &total_val[0], 4 * LL_total_num);
205 set_value((dods_float32 *) &val[0], nelms);
207 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
211 void HDF5GMCFMissLLArray::obtain_gpm_l3_ll(
int* offset,
int* step,
int nelms,
bool add_cache,
void*buf)
215 throw InternalErr(__FILE__, __LINE__,
"The number of dimension for Aquarius Level 3 map data must be 1");
217 bool check_pass_fileid_key = HDF5RequestHandler::get_pass_fileid();
219 if (
false == check_pass_fileid_key) {
220 if ((fileid = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
222 eherr <<
"HDF5 File " << filename <<
" cannot be opened. " << endl;
223 throw InternalErr(__FILE__, __LINE__, eherr.str());
227 vector<char> grid_info_value;
229 float lon_start = 0.;
237 if(GPMM_L3 == product_type || GPMS_L3 == product_type) {
238 hid_t grid_grp_id = -1;
240 string grid_grp_name;
242 if ((name() ==
"nlat") || (name() ==
"nlon")) {
244 string temp_grid_grp_name(GPM_GRID_GROUP_NAME1, strlen(GPM_GRID_GROUP_NAME1));
245 temp_grid_grp_name =
"/" + temp_grid_grp_name;
246 if (H5Lexists(fileid, temp_grid_grp_name.c_str(), H5P_DEFAULT) > 0)
247 grid_grp_name = temp_grid_grp_name;
249 string temp_grid_grp_name2(GPM_GRID_GROUP_NAME2, strlen(GPM_GRID_GROUP_NAME2));
250 temp_grid_grp_name2 =
"/" + temp_grid_grp_name2;
251 if (H5Lexists(fileid, temp_grid_grp_name2.c_str(), H5P_DEFAULT) > 0)
252 grid_grp_name = temp_grid_grp_name2;
254 throw InternalErr(__FILE__, __LINE__,
"Unknown GPM grid group name ");
260 string temp_grids_group_name(GPM_GRID_MULTI_GROUP_NAME, strlen(GPM_GRID_MULTI_GROUP_NAME));
261 if (name() ==
"lnH" || name() ==
"ltH")
262 grid_grp_name = temp_grids_group_name +
"/G2";
263 else if (name() ==
"lnL" || name() ==
"ltL") grid_grp_name = temp_grids_group_name +
"/G1";
270 if(name() ==
"lnH" || name() ==
"ltH" ||
271 name() ==
"lnL" || name() ==
"ltL") {
272 string temp_grids_group_name(GPM_GRID_MULTI_GROUP_NAME,strlen(GPM_GRID_MULTI_GROUP_NAME));
275 size_t grids_group_pos = varname.find(temp_grids_group_name);
276 if(string::npos == grids_group_pos) {
277 throw InternalErr (__FILE__, __LINE__,
278 "Cannot find group Grids.");
281 string grids_cgroup_path = varname.substr(grids_group_pos+1);
282 size_t grids_cgroup_pos = varname.find_first_of(
"/");
283 if(string::npos == grids_cgroup_pos) {
284 throw InternalErr (__FILE__, __LINE__,
285 "Cannot find child group of group Grids.");
288 string temp_sub_grp_name = grids_cgroup_path.substr(0,grids_cgroup_pos);
289 if(name() ==
"lnH" || name() ==
"ltH")
290 sub_grp1_name = temp_sub_grp_name;
291 else if(name() ==
"lnL" || name() ==
"ltL")
292 sub_grp2_name = temp_sub_grp_name;
294 grid_grp_name = temp_grids_group_name +
"/" + temp_sub_grp_name;
300 if ((grid_grp_id = H5Gopen(fileid, grid_grp_name.c_str(), H5P_DEFAULT)) < 0) {
301 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
303 eherr <<
"HDF5 dataset " << varname <<
" cannot be opened. " << endl;
304 throw InternalErr(__FILE__, __LINE__, eherr.str());
308 string grid_info_name(GPM_ATTR2_NAME, strlen(GPM_ATTR2_NAME));
309 if (name() ==
"lnL" || name() ==
"ltL")
310 grid_info_name =
"G1_" + grid_info_name;
311 else if (name() ==
"lnH" || name() ==
"ltH") grid_info_name =
"G2_" + grid_info_name;
313 float dummy_value = 0.0;
315 obtain_ll_attr_value(fileid, grid_grp_id, grid_info_name, dummy_value, grid_info_value);
316 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value, latsize, lonsize, lat_start, lon_start, lat_res, lon_res,
319 H5Gclose(grid_grp_id);
322 H5Gclose(grid_grp_id);
331 vector<char> grid_info_value1;
332 vector<char> grid_info_value2;
333 obtain_gpm_l3_new_grid_info(fileid,grid_info_value1,grid_info_value2);
334 obtain_lat_lon_info(grid_info_value1,grid_info_value2,latsize,lonsize,lat_start,lon_start,lat_res,lon_res);
337 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
340 send_gpm_l3_ll_to_dap(latsize,lonsize,lat_start,lon_start,lat_res,lon_res,offset,step,nelms,add_cache, buf);
347 float lon_start = 0.;
354 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value, latsize, lonsize, lat_start, lon_start, lat_res, lon_res,
357 if (0 == latsize || 0 == lonsize) {
358 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
359 throw InternalErr(__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
365 if (CV_LAT_MISS == cvartype) {
367 if (nelms > latsize) {
368 H5Gclose(grid_grp_id);
369 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
370 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Latitude ");
373 for (
int i = 0; i < nelms; ++i)
374 val[i] = lat_start + offset[0] * lat_res + lat_res / 2 + i * lat_res * step[0];
376 if (add_cache ==
true) {
377 vector<float> total_val;
378 total_val.resize(latsize);
379 for (
int total_i = 0; total_i < latsize; total_i++)
380 total_val[total_i] = lat_start + lat_res / 2 + total_i * lat_res;
381 memcpy(buf, &total_val[0], 4 * latsize);
384 else if (CV_LON_MISS == cvartype) {
386 if (nelms > lonsize) {
387 H5Gclose(grid_grp_id);
388 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
389 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Longitude");
393 for (
int i = 0; i < nelms; ++i)
394 val[i] = lon_start + offset[0] * lon_res + lon_res / 2 + i * lon_res * step[0];
396 if (add_cache ==
true) {
397 vector<float> total_val;
398 total_val.resize(lonsize);
399 for (
int total_i = 0; total_i < lonsize; total_i++)
400 total_val[total_i] = lon_start + lon_res / 2 + total_i * lon_res;
401 memcpy(buf, &total_val[0], 4 * lonsize);
406 set_value((dods_float32 *) &val[0], nelms);
408 H5Gclose(grid_grp_id);
409 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
417 if (nelms > LL_total_num) {
420 throw InternalErr (__FILE__, __LINE__,
421 "The number of elements exceeds the total number of Latitude or Longitude");
424 for (
int i = 0; i < nelms; ++i)
425 val[i] = LL_first_point + (offset[0] + i*step[0])*LL_step;
427 set_value ((dods_float32 *) &val[0], nelms);
438 void HDF5GMCFMissLLArray::obtain_ll_attr_value(hid_t , hid_t s_root_id,
const string & s_attr_name,
439 T& attr_value, vector<char> & str_attr_value)
442 BESDEBUG(
"h5",
"Coming to obtain_ll_attr_value"<<endl);
443 hid_t s_attr_id = -1;
444 if ((s_attr_id = H5Aopen_by_name(s_root_id,
".", s_attr_name.c_str(),
445 H5P_DEFAULT, H5P_DEFAULT)) < 0) {
446 string msg =
"Cannot open the HDF5 attribute ";
449 throw InternalErr(__FILE__, __LINE__, msg);
452 hid_t attr_type = -1;
453 if ((attr_type = H5Aget_type(s_attr_id)) < 0) {
454 string msg =
"cannot get the attribute datatype for the attribute ";
458 throw InternalErr(__FILE__, __LINE__, msg);
461 hid_t attr_space = -1;
462 if ((attr_space = H5Aget_space(s_attr_id)) < 0) {
463 string msg =
"cannot get the hdf5 dataspace id for the attribute ";
468 throw InternalErr(__FILE__, __LINE__, msg);
471 hssize_t num_elm = H5Sget_simple_extent_npoints(attr_space);
474 string msg =
"cannot get the number for the attribute ";
478 H5Sclose(attr_space);
480 throw InternalErr(__FILE__, __LINE__, msg);
484 string msg =
"The number of attribute must be 1 for Aquarius level 3 data ";
488 H5Sclose(attr_space);
490 throw InternalErr(__FILE__, __LINE__, msg);
493 size_t atype_size = H5Tget_size(attr_type);
494 if (atype_size <= 0) {
495 string msg =
"cannot obtain the datatype size of the attribute ";
499 H5Sclose(attr_space);
501 throw InternalErr(__FILE__, __LINE__, msg);
504 if (H5T_STRING == H5Tget_class(attr_type)) {
505 if (H5Tis_variable_str(attr_type)) {
508 H5Sclose(attr_space);
510 throw InternalErr(__FILE__, __LINE__,
511 "Currently we assume the attributes we use to retrieve lat and lon are NOT variable length string.");
514 str_attr_value.resize(atype_size);
515 if (H5Aread(s_attr_id, attr_type, &str_attr_value[0]) < 0) {
516 string msg =
"cannot retrieve the value of the attribute ";
520 H5Sclose(attr_space);
522 throw InternalErr(__FILE__, __LINE__, msg);
528 else if (H5Aread(s_attr_id, attr_type, &attr_value) < 0) {
529 string msg =
"cannot retrieve the value of the attribute ";
533 H5Sclose(attr_space);
535 throw InternalErr(__FILE__, __LINE__, msg);
540 H5Sclose(attr_space);
544 void HDF5GMCFMissLLArray::obtain_gpm_l3_new_grid_info(hid_t file,vector<char>& grid_info_value1, vector<char>& grid_info_value2){
553 attr_na.value = NULL;
555 herr_t ret_o= H5Ovisit(file, H5_INDEX_NAME, H5_ITER_INC, visit_obj_cb, (
void*)&attr_na);
560 throw InternalErr(__FILE__, __LINE__,
"H5Ovisit failed. ");
564 BESDEBUG(
"h5",
"Found the GPM level 3 Grid_info attribute."<<endl);
571 vector<char> grid_info_value_1(attr_na.value,attr_na.value+strlen(attr_na.value));
572 vector<char> grid_info_value_2;
575 grid_info_value1.resize(strlen(attr_na.value));
576 memcpy(&grid_info_value1[0],attr_na.value,strlen(attr_na.value));
577 string tv(grid_info_value1.begin(),grid_info_value1.end());
580 printf(
"attr_name 1st is %s\n",attr_na.name);
581 printf(
"attr_value 1st is %s\n",attr_na.value);
583 herr_t ret_o2= H5Ovisit(file, H5_INDEX_NAME, H5_ITER_INC, visit_obj_cb, (
void*)&attr_na);
587 throw InternalErr(__FILE__, __LINE__,
"H5Ovisit failed again. ");
598 grid_info_value2.resize(strlen(attr_na.value));
599 memcpy(&grid_info_value2[0],attr_na.value,strlen(attr_na.value));
600 string tv(grid_info_value2.begin(),grid_info_value2.end());
609 void HDF5GMCFMissLLArray::obtain_lat_lon_info(
const vector<char>& grid_info_value1,
610 const vector<char>& grid_info_value2,
611 int& latsize,
int& lonsize,
612 float& lat_start,
float& lon_start,
613 float& lat_res,
float& lon_res){
615 float lat1_start = 0;
616 float lon1_start = 0.;
622 float lat2_start = 0;
623 float lon2_start = 0.;
629 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value1, lat1size, lon1size, lat1_start, lon1_start,
630 lat1_res, lon1_res,
false);
632 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value2, lat2size, lon2size, lat2_start, lon2_start,
633 lat2_res, lon2_res,
false);
635 bool pick_gv1 =
true;
636 if (name() ==
"lnL" || name() ==
"ltL") {
637 if(lat1_res <lat2_res)
640 else if (name() ==
"lnH" || name() ==
"ltH") {
641 if(lat1_res >lat2_res)
645 if(
true == pick_gv1) {
649 lat_start = lat1_start;
650 lon_start = lon1_start;
658 lat_start = lat2_start;
659 lon_start = lon2_start;
670 attr_info(hid_t loc_id,
const char *name,
const H5A_info_t *ainfo,
void *_op_data)
680 attr_info_t *op_data = (attr_info_t *)_op_data;
682 if(strstr(name,GPM_ATTR2_NAME)!=NULL) {
685 hid_t attr, atype, aspace;
686 attr = H5Aopen(loc_id, name, H5P_DEFAULT);
690 atype = H5Aget_type(attr);
694 if(H5T_STRING == H5Tget_class(atype)){
697 if(strncmp(name,op_data->name,strlen(name))!=0) {
698 hid_t aspace = H5Aget_space(attr);
699 hsize_t num_elms = H5Tget_size(atype)*H5Sget_simple_extent_npoints(aspace);
701 char *attr_value = op_data->value;
702 attr_value = malloc(num_elms+1);
703 H5Aread(attr,atype,attr_value);
704 printf(
"attr_value is %s\n",attr_value);
707 char *cur_attr_value = (
char*)malloc(num_elms+1);
708 H5Aread(attr,atype,(
void*)cur_attr_value);
709 if(strncmp(cur_attr_value,op_data->value,strlen(op_data->value))!=0) {
712 op_data->name = NULL;
713 op_data->name = (
char*)malloc(strlen(name)+1);
715 strncpy(op_data->name,name,strlen(name));
718 free(op_data->value);
719 op_data->value = NULL;
720 op_data->value=(
char*)malloc(num_elms+1);
722 strncpy(op_data->value,cur_attr_value,strlen(cur_attr_value));
727 free(cur_attr_value);
732 op_data->name = (
char*)malloc(strlen(name)+1);
734 strncpy(op_data->name,name,strlen(name));
736 hid_t aspace = H5Aget_space(attr);
737 hsize_t num_elms = H5Tget_size(atype)*H5Sget_simple_extent_npoints(aspace);
739 char *attr_value = op_data->value;
740 attr_value = malloc(num_elms+1);
741 H5Aread(attr,atype,attr_value);
742 printf(
"attr_value is %s\n",attr_value);
745 op_data->value = (
char*)malloc(num_elms+1);
746 H5Aread(attr,atype,(
void*)op_data->value);
759 attr = H5Aopen(loc_id, name, H5P_DEFAULT);
764 printf(
"\nName : %s\n", name);
769 atype = H5Aget_type(attr);
770 aspace = H5Aget_space(attr);
771 rank = H5Sget_simple_extent_ndims(aspace);
772 ret = H5Sget_simple_extent_dims(aspace, sdim, NULL);
779 printf(
"Rank : %d \n", rank);
780 printf(
"Dimension sizes : ");
781 for (i=0; i< rank; i++)
782 printf(
"%d ", (
int)sdim[i]);
790 if (H5T_FLOAT == H5Tget_class(atype)) {
791 printf(
"Type : FLOAT \n");
792 npoints = H5Sget_simple_extent_npoints(aspace);
793 float_array = (
float *)malloc(
sizeof(
float)*(
int)npoints);
794 ret = H5Aread(attr, atype, float_array);
796 for( i = 0; i < (
int)npoints; i++)
797 printf(
"%f ", float_array[i]);
814 visit_obj_cb(hid_t group_id,
const char *name,
const H5O_info_t *oinfo,
824 attr_info_t *op_data = (attr_info_t *)_op_data;
827 if(oinfo->type == H5O_TYPE_GROUP) {
830 grp = H5Gopen2(group_id,name,H5P_DEFAULT);
833 ret = H5Aiterate2(grp, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_info, op_data);
836 printf(
"object: attr name is %s\n",op_data->name);
837 printf(
"object: attr value is %s\n",op_data->value);
852 void HDF5GMCFMissLLArray::send_gpm_l3_ll_to_dap(
const vector<char>& grid_info_value,
int* offset,
int* step,
853 int nelms,
bool add_cache,
void*buf) {
856 float lon_start = 0.;
864 void HDF5GMCFMissLLArray::send_gpm_l3_ll_to_dap(
const int latsize,
const int lonsize,
const float lat_start,
const float lon_start,
865 const float lat_res,
const float lon_res,
const int* offset,
const int* step,
866 const int nelms,
const bool add_cache,
void*buf) {
869 if (0 == latsize || 0 == lonsize) {
870 throw InternalErr(__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
876 if (CV_LAT_MISS == cvartype) {
878 if (nelms > latsize) {
879 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Latitude ");
882 for (
int i = 0; i < nelms; ++i)
883 val[i] = lat_start + offset[0] * lat_res + lat_res / 2 + i * lat_res * step[0];
885 if (add_cache ==
true) {
886 vector<float> total_val;
887 total_val.resize(latsize);
888 for (
int total_i = 0; total_i < latsize; total_i++)
889 total_val[total_i] = lat_start + lat_res / 2 + total_i * lat_res;
890 memcpy(buf, &total_val[0], 4 * latsize);
893 else if (CV_LON_MISS == cvartype) {
896 if (nelms > lonsize) {
897 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Longitude");
900 for (
int i = 0; i < nelms; ++i)
901 val[i] = lon_start + offset[0] * lon_res + lon_res / 2 + i * lon_res * step[0];
903 if (add_cache ==
true) {
904 vector<float> total_val;
905 total_val.resize(lonsize);
906 for (
int total_i = 0; total_i < lonsize; total_i++)
907 total_val[total_i] = lon_start + lon_res / 2 + total_i * lon_res;
908 memcpy(buf, &total_val[0], 4 * lonsize);
913 set_value((dods_float32 *) &val[0], nelms);
917 void HDF5GMCFMissLLArray::read_data_NOT_from_mem_cache(
bool add_cache,
void*buf)
920 BESDEBUG(
"h5",
"Coming to HDF5GMCFMissLLArray: read_data_NOT_from_mem_cache "<<endl);
932 int nelms = format_constraint(&offset[0], &step[0], &count[0]);
934 if (GPMM_L3 == product_type || GPMS_L3 == product_type || GPM_L3_New == product_type)
935 obtain_gpm_l3_ll(&offset[0], &step[0], nelms, add_cache, buf);
936 else if (Aqu_L3 == product_type || OBPG_L3 == product_type)
937 obtain_aqu_obpg_l3_ll(&offset[0], &step[0], nelms, add_cache, buf);
This class specifies the retrieval of the missing lat/lon values for general HDF5 products.
include the entry functions to execute the handlers