36#include <libdap/InternalErr.h>
39#include "h5apicompatible.h"
44static int visit_obj_cb(hid_t group_id,
const char *name,
const H5O_info_t *oinfo,
void *_op_data);
45static herr_t attr_info(hid_t loc_id,
const char *name,
const H5A_info_t *ainfo,
void *_op_data);
47BaseType *HDF5GMCFMissLLArray::ptr_duplicate()
49 auto HDF5GMCFMissLLArray_unique = make_unique<HDF5GMCFMissLLArray>(*
this);
50 return HDF5GMCFMissLLArray_unique.release();
53bool HDF5GMCFMissLLArray::read()
56 BESDEBUG(
"h5",
"Coming to HDF5GMCFMissLLArray read "<<endl);
58 if (
nullptr == HDF5RequestHandler::get_lrdata_mem_cache())
59 read_data_NOT_from_mem_cache(
false,
nullptr);
63 vector<string> cur_lrd_non_cache_dir_list;
64 HDF5RequestHandler::get_lrd_non_cache_dir_list(cur_lrd_non_cache_dir_list);
69 if ((cur_lrd_non_cache_dir_list.empty())
70 || (
"" == check_str_sect_in_list(cur_lrd_non_cache_dir_list, filename,
'/'))) {
72 vector<string> cur_cache_dlist;
73 HDF5RequestHandler::get_lrd_cache_dir_list(cur_cache_dlist);
74 string cache_dir = check_str_sect_in_list(cur_cache_dlist, filename,
'/');
75 if (cache_dir !=
"") {
77 cache_key = cache_dir + varname;
80 cache_key = filename + varname;
84 vector<size_t> dim_sizes;
85 Dim_iter i_dim = dim_begin();
86 Dim_iter i_enddim = dim_end();
87 while (i_dim != i_enddim) {
88 dim_sizes.push_back(dimension_size_ll(i_dim));
92 size_t total_elems = 1;
93 for (
const auto &dim_size:dim_sizes)
94 total_elems = total_elems * dim_size;
96 handle_data_with_mem_cache(dtype, total_elems, cache_flag, cache_key,
false);
99 read_data_NOT_from_mem_cache(
false,
nullptr);
105void HDF5GMCFMissLLArray::obtain_aqu_obpg_l3_ll(
const int64_t* offset,
const int64_t* step, int64_t nelms,
bool add_cache,
void* buf)
108 BESDEBUG(
"h5",
"Coming to obtain_aqu_obpg_l3_ll read "<<endl);
114 throw InternalErr(__FILE__, __LINE__,
"The number of dimension for Aquarius Level 3 map data must be 1");
116 bool check_pass_fileid_key = HDF5RequestHandler::get_pass_fileid();
117 if (
false == check_pass_fileid_key) {
118 if ((fileid = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
120 eherr <<
"HDF5 File " << filename <<
" cannot be opened. " << endl;
121 throw InternalErr(__FILE__, __LINE__, eherr.str());
126 if ((rootid = H5Gopen(fileid,
"/", H5P_DEFAULT)) < 0) {
127 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
129 eherr <<
"HDF5 dataset " << varname <<
" cannot be opened. " << endl;
130 throw InternalErr(__FILE__, __LINE__, eherr.str());
133 float LL_first_point = 0.0;
135 int LL_total_num = 0;
137 if (CV_LAT_MISS == cvartype) {
139 string Lat_SWP_name = (Aqu_L3 == product_type) ?
"SW Point Latitude" :
"sw_point_latitude";
140 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Lat_SWP_name.c_str())==0))
141 Lat_SWP_name =
"sw_point_latitude";
143 string Lat_step_name = (Aqu_L3 == product_type) ?
"Latitude Step" :
"latitude_step";
144 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Lat_step_name.c_str())==0))
145 Lat_step_name =
"latitude_step";
147 string Num_lines_name = (Aqu_L3 == product_type) ?
"Number of Lines" :
"number_of_lines";
148 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Num_lines_name.c_str())==0))
149 Num_lines_name =
"number_of_lines";
152 float Lat_step = 0.0;
154 vector<char> dummy_str;
156 obtain_ll_attr_value(fileid, rootid, Lat_SWP_name, Lat_SWP, dummy_str);
157 obtain_ll_attr_value(fileid, rootid, Lat_step_name, Lat_step, dummy_str);
158 obtain_ll_attr_value(fileid, rootid, Num_lines_name, Num_lines, dummy_str);
159 if (Num_lines <= 0) {
161 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
162 throw InternalErr(__FILE__, __LINE__,
"The number of line must be >0");
166 LL_first_point = Lat_SWP + (Num_lines - 1) * Lat_step;
167 LL_step = (float)(Lat_step * (-1.0));
168 LL_total_num = Num_lines;
171 if (CV_LON_MISS == cvartype) {
173 string Lon_SWP_name = (Aqu_L3 == product_type) ?
"SW Point Longitude" :
"sw_point_longitude";
174 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Lon_SWP_name.c_str())==0))
175 Lon_SWP_name =
"sw_point_longitude";
177 string Lon_step_name = (Aqu_L3 == product_type) ?
"Longitude Step" :
"longitude_step";
178 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Lon_step_name.c_str())==0))
179 Lon_step_name =
"longitude_step";
181 string Num_columns_name = (Aqu_L3 == product_type) ?
"Number of Columns" :
"number_of_columns";
182 if ((Aqu_L3 == product_type) && (H5Aexists(rootid,Num_columns_name.c_str())==0))
183 Num_columns_name =
"number_of_columns";
186 float Lon_step = 0.0;
189 vector<char> dummy_str_value;
191 obtain_ll_attr_value(fileid, rootid, Lon_SWP_name, Lon_SWP, dummy_str_value);
192 obtain_ll_attr_value(fileid, rootid, Lon_step_name, Lon_step, dummy_str_value);
193 obtain_ll_attr_value(fileid, rootid, Num_columns_name, Num_cols, dummy_str_value);
196 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
197 throw InternalErr(__FILE__, __LINE__,
"The number of line must be >0");
201 LL_first_point = Lon_SWP;
203 LL_total_num = Num_cols;
209 if (nelms > LL_total_num) {
211 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
212 throw InternalErr(__FILE__, __LINE__,
213 "The number of elements exceeds the total number of Latitude or Longitude");
216 for (int64_t i = 0; i < nelms; ++i)
217 val[i] = LL_first_point + (offset[0] + i * step[0]) * LL_step;
219 if (
true == add_cache) {
220 vector<float> total_val;
221 total_val.resize(LL_total_num);
222 for (int64_t total_i = 0; total_i < LL_total_num; total_i++)
223 total_val[total_i] = LL_first_point + total_i * LL_step;
224 memcpy(buf, total_val.data(), 4 * LL_total_num);
227 set_value_ll(val.data(), nelms);
229 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
233void HDF5GMCFMissLLArray::obtain_gpm_l3_ll(
const int64_t* offset,
const int64_t* step, int64_t nelms,
bool add_cache,
void*buf)
237 throw InternalErr(__FILE__, __LINE__,
"The number of dimension for GPM Level 3 map data must be 1");
239 bool check_pass_fileid_key = HDF5RequestHandler::get_pass_fileid();
241 if (
false == check_pass_fileid_key) {
242 if ((fileid = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
244 eherr <<
"HDF5 File " << filename <<
" cannot be opened. " << endl;
245 throw InternalErr(__FILE__, __LINE__, eherr.str());
249 vector<char> grid_info_value;
251 float lon_start = 0.;
259 if(GPMM_L3 == product_type || GPMS_L3 == product_type) {
260 hid_t grid_grp_id = -1;
261 string grid_grp_name;
263 if ((name() ==
"nlat") || (name() ==
"nlon")) {
265 string temp_grid_grp_name(GPM_GRID_GROUP_NAME1, strlen(GPM_GRID_GROUP_NAME1));
266 temp_grid_grp_name =
"/" + temp_grid_grp_name;
267 if (H5Lexists(fileid, temp_grid_grp_name.c_str(), H5P_DEFAULT) > 0)
268 grid_grp_name = temp_grid_grp_name;
270 string temp_grid_grp_name2(GPM_GRID_GROUP_NAME2, strlen(GPM_GRID_GROUP_NAME2));
271 temp_grid_grp_name2 =
"/" + temp_grid_grp_name2;
272 if (H5Lexists(fileid, temp_grid_grp_name2.c_str(), H5P_DEFAULT) > 0)
273 grid_grp_name = temp_grid_grp_name2;
275 throw InternalErr(__FILE__, __LINE__,
"Unknown GPM grid group name ");
281 string temp_grids_group_name(GPM_GRID_MULTI_GROUP_NAME, strlen(GPM_GRID_MULTI_GROUP_NAME));
282 if (name() ==
"lnH" || name() ==
"ltH")
283 grid_grp_name = temp_grids_group_name +
"/G2";
284 else if (name() ==
"lnL" || name() ==
"ltL") grid_grp_name = temp_grids_group_name +
"/G1";
291 if(name() ==
"lnH" || name() ==
"ltH" ||
292 name() ==
"lnL" || name() ==
"ltL") {
293 string temp_grids_group_name(GPM_GRID_MULTI_GROUP_NAME,strlen(GPM_GRID_MULTI_GROUP_NAME));
296 size_t grids_group_pos = varname.find(temp_grids_group_name);
297 if(string::npos == grids_group_pos) {
298 throw InternalErr (__FILE__, __LINE__,
299 "Cannot find group Grids.");
302 string grids_cgroup_path = varname.substr(grids_group_pos+1);
303 size_t grids_cgroup_pos = varname.find_first_of(
"/");
304 if(string::npos == grids_cgroup_pos) {
305 throw InternalErr (__FILE__, __LINE__,
306 "Cannot find child group of group Grids.");
309 string temp_sub_grp_name = grids_cgroup_path.substr(0,grids_cgroup_pos);
310 if(name() ==
"lnH" || name() ==
"ltH")
311 sub_grp1_name = temp_sub_grp_name;
312 else if(name() ==
"lnL" || name() ==
"ltL")
313 sub_grp2_name = temp_sub_grp_name;
315 grid_grp_name = temp_grids_group_name +
"/" + temp_sub_grp_name;
320 if ((grid_grp_id = H5Gopen(fileid, grid_grp_name.c_str(), H5P_DEFAULT)) < 0) {
321 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
323 eherr <<
"HDF5 dataset " << varname <<
" cannot be opened. " << endl;
324 throw InternalErr(__FILE__, __LINE__, eherr.str());
328 string grid_info_name(GPM_ATTR2_NAME, strlen(GPM_ATTR2_NAME));
329 if (name() ==
"lnL" || name() ==
"ltL")
330 grid_info_name =
"G1_" + grid_info_name;
331 else if (name() ==
"lnH" || name() ==
"ltH") grid_info_name =
"G2_" + grid_info_name;
333 float dummy_value = 0.0;
335 obtain_ll_attr_value(fileid, grid_grp_id, grid_info_name, dummy_value, grid_info_value);
336 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value, latsize, lonsize, lat_start, lon_start, lat_res, lon_res,
339 H5Gclose(grid_grp_id);
342 H5Gclose(grid_grp_id);
351 vector<char> grid_info_value1;
352 vector<char> grid_info_value2;
353 obtain_gpm_l3_new_grid_info(fileid,grid_info_value1,grid_info_value2);
354 obtain_lat_lon_info(grid_info_value1,grid_info_value2,latsize,lonsize,lat_start,lon_start,lat_res,lon_res);
357 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
360 send_gpm_l3_ll_to_dap(latsize,lonsize,lat_start,lon_start,lat_res,lon_res,offset,step,nelms,add_cache, buf);
367 float lon_start = 0.;
374 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value, latsize, lonsize, lat_start, lon_start, lat_res, lon_res,
377 if (0 == latsize || 0 == lonsize) {
378 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
379 throw InternalErr(__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
385 if (CV_LAT_MISS == cvartype) {
387 if (nelms > latsize) {
388 H5Gclose(grid_grp_id);
389 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
390 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Latitude ");
393 for (int64_t i = 0; i < nelms; ++i)
394 val[i] = lat_start + offset[0] * lat_res + lat_res / 2 + i * lat_res * step[0];
396 if (add_cache ==
true) {
397 vector<float> total_val;
398 total_val.resize(latsize);
399 for (
int total_i = 0; total_i < latsize; total_i++)
400 total_val[total_i] = lat_start + lat_res / 2 + total_i * lat_res;
401 memcpy(buf, total_val.data(), 4 * latsize);
404 else if (CV_LON_MISS == cvartype) {
406 if (nelms > lonsize) {
407 H5Gclose(grid_grp_id);
408 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
409 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Longitude");
413 for (
int i = 0; i < nelms; ++i)
414 val[i] = lon_start + offset[0] * lon_res + lon_res / 2 + i * lon_res * step[0];
416 if (add_cache ==
true) {
417 vector<float> total_val;
418 total_val.resize(lonsize);
419 for (
int total_i = 0; total_i < lonsize; total_i++)
420 total_val[total_i] = lon_start + lon_res / 2 + total_i * lon_res;
421 memcpy(buf, total_val.data(), 4 * lonsize);
426 set_value((dods_float32 *) val.data(), nelms);
428 H5Gclose(grid_grp_id);
429 HDF5CFUtil::close_fileid(fileid, check_pass_fileid_key);
437 if (nelms > LL_total_num) {
440 throw InternalErr (__FILE__, __LINE__,
441 "The number of elements exceeds the total number of Latitude or Longitude");
444 for (
int i = 0; i < nelms; ++i)
445 val[i] = LL_first_point + (offset[0] + i*step[0])*LL_step;
447 set_value ((dods_float32 *) val.data(), nelms);
458void HDF5GMCFMissLLArray::obtain_ll_attr_value(hid_t , hid_t s_root_id,
const string & s_attr_name,
459 T& attr_value, vector<char> & str_attr_value)
const
462 BESDEBUG(
"h5",
"Coming to obtain_ll_attr_value"<<endl);
463 hid_t s_attr_id = -1;
464 if ((s_attr_id = H5Aopen_by_name(s_root_id,
".", s_attr_name.c_str(),
465 H5P_DEFAULT, H5P_DEFAULT)) < 0) {
466 string msg =
"Cannot open the HDF5 attribute ";
469 throw InternalErr(__FILE__, __LINE__, msg);
472 hid_t attr_type = -1;
473 if ((attr_type = H5Aget_type(s_attr_id)) < 0) {
474 string msg =
"cannot get the attribute datatype for the attribute ";
478 throw InternalErr(__FILE__, __LINE__, msg);
481 hid_t attr_space = -1;
482 if ((attr_space = H5Aget_space(s_attr_id)) < 0) {
483 string msg =
"cannot get the hdf5 dataspace id for the attribute ";
488 throw InternalErr(__FILE__, __LINE__, msg);
491 hssize_t num_elm = H5Sget_simple_extent_npoints(attr_space);
494 string msg =
"cannot get the number for the attribute ";
498 H5Sclose(attr_space);
500 throw InternalErr(__FILE__, __LINE__, msg);
504 string msg =
"The number of attribute must be 1 for Aquarius level 3 data ";
508 H5Sclose(attr_space);
510 throw InternalErr(__FILE__, __LINE__, msg);
513 size_t atype_size = H5Tget_size(attr_type);
514 if (atype_size <= 0) {
515 string msg =
"cannot obtain the datatype size of the attribute ";
519 H5Sclose(attr_space);
521 throw InternalErr(__FILE__, __LINE__, msg);
524 if (H5T_STRING == H5Tget_class(attr_type)) {
525 if (H5Tis_variable_str(attr_type)) {
528 H5Sclose(attr_space);
530 throw InternalErr(__FILE__, __LINE__,
531 "Currently we assume the attributes we use to retrieve lat and lon are NOT variable length string.");
534 str_attr_value.resize(atype_size);
535 if (H5Aread(s_attr_id, attr_type, str_attr_value.data()) < 0) {
536 string msg =
"cannot retrieve the value of the attribute ";
540 H5Sclose(attr_space);
542 throw InternalErr(__FILE__, __LINE__, msg);
548 else if (H5Aread(s_attr_id, attr_type, &attr_value) < 0) {
549 string msg =
"cannot retrieve the value of the attribute ";
553 H5Sclose(attr_space);
555 throw InternalErr(__FILE__, __LINE__, msg);
560 H5Sclose(attr_space);
564void HDF5GMCFMissLLArray::obtain_gpm_l3_new_grid_info(hid_t file,
565 vector<char>& grid_info_value1,
566 vector<char>& grid_info_value2)
const{
574 attr_na.name =
nullptr;
575 attr_na.value =
nullptr;
577 herr_t ret_o= H5OVISIT(file, H5_INDEX_NAME, H5_ITER_INC, visit_obj_cb, (
void*)&attr_na);
580 throw InternalErr(__FILE__, __LINE__,
"H5OVISIT failed. ");
590 vector<char> grid_info_value_1(attr_na.value,attr_na.value+strlen(attr_na.value));
591 vector<char> grid_info_value_2;
594 BESDEBUG(
"h5",
"Found the GPM level 3 Grid_info attribute."<<endl);
595 grid_info_value1.resize(strlen(attr_na.value));
596 memcpy(grid_info_value1.data(),attr_na.value,strlen(attr_na.value));
598 string tv(grid_info_value1.begin(),grid_info_value1.end());
599 cerr<<
"grid_info_value1 is "<<tv <<endl;
600 printf(
"attr_name 1st is %s\n",attr_na.name);
601 printf(
"attr_value 1st is %s\n",attr_na.value);
607 herr_t ret_o2= H5OVISIT(file, H5_INDEX_NAME, H5_ITER_INC, visit_obj_cb, (
void*)&attr_na);
610 throw InternalErr(__FILE__, __LINE__,
"H5OVISIT failed again. ");
624 grid_info_value2.resize(strlen(attr_na.value));
625 memcpy(grid_info_value2.data(),attr_na.value,strlen(attr_na.value));
627 string tv(grid_info_value2.begin(),grid_info_value2.end());
636void HDF5GMCFMissLLArray::obtain_lat_lon_info(
const vector<char>& grid_info_value1,
637 const vector<char>& grid_info_value2,
638 int& latsize,
int& lonsize,
639 float& lat_start,
float& lon_start,
640 float& lat_res,
float& lon_res)
const{
642 float lat1_start = 0;
643 float lon1_start = 0.;
649 float lat2_start = 0;
650 float lon2_start = 0.;
656 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value1, lat1size, lon1size, lat1_start, lon1_start,
657 lat1_res, lon1_res,
false);
659 HDF5CFUtil::parser_gpm_l3_gridheader(grid_info_value2, lat2size, lon2size, lat2_start, lon2_start,
660 lat2_res, lon2_res,
false);
662 bool pick_gv1 =
true;
665 if (name() ==
"lnL" || name() ==
"ltL") {
666 if(lat1_res <lat2_res)
669 else if (name() ==
"lnH" || name() ==
"ltH") {
670 if(lat1_res >lat2_res)
674 if(
true == pick_gv1) {
677 lat_start = lat1_start;
678 lon_start = lon1_start;
685 lat_start = lat2_start;
686 lon_start = lon2_start;
695attr_info(hid_t loc_id,
const char *name,
const H5A_info_t *ainfo,
void *_op_data)
704 attr_info_t *op_data = (attr_info_t *)_op_data;
707 if(strstr(name,GPM_ATTR2_NAME)!=
nullptr) {
710 attr = H5Aopen(loc_id, name, H5P_DEFAULT);
713 atype = H5Aget_type(attr);
718 if(H5T_STRING == H5Tget_class(atype)){
724 if(strncmp(name,op_data->name,strlen(name))!=0) {
725 hid_t aspace = H5Aget_space(attr);
731 hsize_t num_elms = H5Tget_size(atype)*H5Sget_simple_extent_npoints(aspace);
733 char *attr_value = op_data->value;
734 attr_value = malloc(num_elms+1);
735 H5Aread(attr,atype,attr_value);
736 printf(
"attr_value is %s\n",attr_value);
738 char *cur_attr_value = (
char*)malloc(num_elms+1);
739 if(H5Aread(attr,atype,(
void*)cur_attr_value)<0) {
743 free(cur_attr_value);
748 if(strncmp(cur_attr_value,op_data->value,strlen(op_data->value))!=0) {
750 op_data->name =
nullptr;
751 op_data->name = (
char*)malloc(strlen(name)+1);
752 strncpy(op_data->name,name,strlen(name));
754 free(op_data->value);
755 op_data->value =
nullptr;
756 op_data->value=(
char*)malloc(num_elms+1);
757 strncpy(op_data->value,cur_attr_value,strlen(cur_attr_value));
760 free(cur_attr_value);
765 hid_t aspace = H5Aget_space(attr);
772 hsize_t num_elms = H5Tget_size(atype)*H5Sget_simple_extent_npoints(aspace);
773 op_data->name = (
char*)malloc(strlen(name)+1);
774 strncpy(op_data->name,name,strlen(name));
777 char *attr_value = op_data->value;
778 attr_value = malloc(num_elms+1);
779 H5Aread(attr,atype,attr_value);
780 printf(
"attr_value is %s\n",attr_value);
782 op_data->value = (
char*)malloc(num_elms+1);
783 if(H5Aread(attr,atype,(
void*)op_data->value)<0) {
787 free(op_data->value);
806visit_obj_cb(hid_t group_id,
const char *name,
const H5O_info_t *oinfo,
819 attr_info_t *op_data = (attr_info_t *)_op_data;
822 if(oinfo->type == H5O_TYPE_GROUP) {
825 grp = H5Gopen2(group_id,name,H5P_DEFAULT);
828 ret = H5Aiterate2(grp, H5_INDEX_NAME, H5_ITER_INC,
nullptr, attr_info, op_data);
831 printf(
"object: attr name is %s\n",op_data->name);
832 printf(
"object: attr value is %s\n",op_data->value);
848void HDF5GMCFMissLLArray::send_gpm_l3_ll_to_dap(
const vector<char>& grid_info_value,
int* offset,
int* step,
849 int nelms,
bool add_cache,
void*buf) {
852 float lon_start = 0.;
860void HDF5GMCFMissLLArray::send_gpm_l3_ll_to_dap(
const int latsize,
const int lonsize,
const float lat_start,
const float lon_start,
861 const float lat_res,
const float lon_res,
const int64_t* offset,
const int64_t* step,
862 const int64_t nelms,
const bool add_cache,
void*buf) {
865 if (0 == latsize || 0 == lonsize) {
866 throw InternalErr(__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
872 if (CV_LAT_MISS == cvartype) {
874 if (nelms > latsize) {
875 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Latitude ");
878 for (int64_t i = 0; i < nelms; ++i)
879 val[i] = lat_start + offset[0] * lat_res + lat_res / 2 + i * lat_res * step[0];
881 if (add_cache ==
true) {
882 vector<float> total_val;
883 total_val.resize(latsize);
884 for (int64_t total_i = 0; total_i < latsize; total_i++)
885 total_val[total_i] = lat_start + lat_res / 2 + total_i * lat_res;
886 memcpy(buf, total_val.data(), 4 * latsize);
889 else if (CV_LON_MISS == cvartype) {
895 if (nelms > lonsize) {
896 throw InternalErr(__FILE__, __LINE__,
"The number of elements exceeds the total number of Longitude");
899 for (int64_t i = 0; i < nelms; ++i)
900 val[i] = lon_start + offset[0] * lon_res + lon_res / 2 + i * lon_res * step[0];
902 if (add_cache ==
true) {
903 vector<float> total_val;
904 total_val.resize(lonsize);
905 for (
int total_i = 0; total_i < lonsize; total_i++)
906 total_val[total_i] = lon_start + lon_res / 2 + total_i * lon_res;
907 memcpy(buf, total_val.data(), 4 * lonsize);
912 set_value_ll((dods_float32 *) val.data(), nelms);
916void HDF5GMCFMissLLArray::read_data_NOT_from_mem_cache(
bool add_cache,
void*buf)
919 BESDEBUG(
"h5",
"Coming to HDF5GMCFMissLLArray: read_data_NOT_from_mem_cache "<<endl);
923 vector<int64_t> offset;
924 vector<int64_t> count;
925 vector<int64_t> step;
931 int64_t nelms = format_constraint(offset.data(), step.data(), count.data());
933 if (GPMM_L3 == product_type || GPMS_L3 == product_type || GPM_L3_New == product_type)
934 obtain_gpm_l3_ll(offset.data(), step.data(), nelms, add_cache, buf);
935 else if (Aqu_L3 == product_type || OBPG_L3 == product_type)
936 obtain_aqu_obpg_l3_ll(offset.data(), step.data(), 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