47 #include "InternalErr.h"
51 #include "ObjMemCache.h"
56 BaseType *HDF5BaseArray::ptr_duplicate()
63 bool HDF5BaseArray::read()
65 BESDEBUG(
"h5",
"Coming to HDF5BaseArray read "<<endl);
74 HDF5BaseArray::format_constraint (
int *offset,
int *step,
int *count)
79 Dim_iter p = dim_begin ();
81 while (p != dim_end ()) {
83 int start = dimension_start (p,
true);
84 int stride = dimension_stride (p,
true);
85 int stop = dimension_stop (p,
true);
90 oss <<
"Array/Grid hyperslab start point "<< start <<
91 " is greater than stop point " << stop <<
".";
92 throw Error(malformed_expr, oss.str());
97 count[id] = ((stop - start) / stride) + 1;
101 "=format_constraint():"
102 <<
"id=" <<
id <<
" offset=" << offset[
id]
103 <<
" step=" << step[
id]
104 <<
" count=" << count[
id]
114 void HDF5BaseArray::write_nature_number_buffer(
int rank,
int tnumelm) {
117 throw InternalErr(__FILE__, __LINE__,
"Currently the rank of the missing field should be 1");
127 int nelms = format_constraint(&offset[0], &step[0], &count[0]);
135 if (nelms == tnumelm) {
136 for (
int i = 0; i < nelms; i++)
138 set_value((dods_int32 *) &val[0], nelms);
141 for (
int i = 0; i < count[0]; i++)
142 val[i] = offset[0] + step[0] * i;
143 set_value((dods_int32 *) &val[0], nelms);
148 void HDF5BaseArray::read_data_from_mem_cache(H5DataType h5type,
const vector<size_t> &h5_dimsizes,
void* buf) {
150 BESDEBUG(
"h5",
"Coming to read_data_from_mem_cache"<<endl);
155 int ndims = h5_dimsizes.size();
157 throw InternalErr(__FILE__, __LINE__,
"Currently we only support array numeric data in the cache, the number of dimension for this file is 0");
160 offset.resize(ndims);
163 int nelms = format_constraint (&offset[0], &step[0], &count[0]);
166 vector<size_t>pos(ndims,0);
167 for (
int i = 0; i< ndims; i++)
176 vector<unsigned char> val;
177 subset<unsigned char>(
189 set_value ((dods_byte *) &val[0], nelms);
210 newval.resize(nelms);
212 for (
int counter = 0; counter < nelms; counter++)
213 newval[counter] = (
short) (val[counter]);
214 set_value ((dods_int16 *) &val[0], nelms);
235 set_value ((dods_int16 *) &val[0], nelms);
242 vector<unsigned short> val;
243 subset<unsigned short>(
256 set_value ((dods_uint16 *) &val[0], nelms);
275 set_value ((dods_int32 *) &val[0], nelms);
281 vector<unsigned int>val;
282 subset<unsigned int>(
294 set_value ((dods_uint32 *) &val[0], nelms);
303 vector<long long>val;
316 set_value ((dods_int64 *) &val[0], nelms);
322 vector<unsigned long long>val;
323 subset<unsigned long long>(
335 set_value ((dods_uint64 *) &val[0], nelms);
354 set_value ((dods_float32 *) &val[0], nelms);
374 set_value ((dods_float64 *) &val[0], nelms);
379 throw InternalErr(__FILE__,__LINE__,
"Non-supported datatype");
399 const vector<size_t> & dim,
407 for(
int k=0; k<edge[index]; k++)
409 pos[index] = start[index] + k*stride[index];
411 subset(input, rank, dim, start, stride, edge, poutput,pos,index+1);
414 size_t cur_pos = INDEX_nD_TO_1D( dim, pos);
415 void* tempbuf = (
void*)((
char*)input+cur_pos*
sizeof(T));
416 poutput->push_back(*(
static_cast<T*
>(tempbuf)));
423 size_t HDF5BaseArray::INDEX_nD_TO_1D (
const std::vector < size_t > &dims,
424 const std::vector < size_t > &pos){
429 if(dims.size () != pos.size ())
430 throw InternalErr(__FILE__,__LINE__,
"dimension error in INDEX_nD_TO_1D routine.");
434 for (
size_t p = 0; p < pos.size (); p++) {
437 for (
size_t j = start; j < dims.size (); j++)
447 string HDF5BaseArray::
448 check_str_sect_in_list(
const vector<string>&str_list,
const string &cur_str,
const char sep) {
451 string::size_type start = 0;
452 string::size_type end = 0;
455 while ((end = cur_str.find(sep, start)) != string::npos) {
456 if(std::find(str_list.begin(),str_list.end(),cur_str.substr(start,end-start))!=
458 ret_str = cur_str.substr(start,end-start);
482 check_var_cache_files(
const vector<string>&slist,
const string &fname,
const string &varname) {
484 bool ret_value =
false;
485 if(fname==
"" || varname==
"")
490 if(fname[fname.size()-1] ==
'/') {
492 fullpath = fname+varname;
494 fullpath = fname.substr(0,fname.size()-1)+varname;
498 fullpath = fname+
'/'+varname;
500 fullpath = fname+varname;
504 for(
unsigned int i = 0; i<slist.size();i++) {
511 if(fullpath.rfind(slist[i])==(fullpath.size()-slist[i].size())){
521 handle_data_with_mem_cache(H5DataType h5_dtype,
size_t total_elems,
const short cache_flag,
const string & cache_key) {
526 mem_data_cache = HDF5RequestHandler::get_srdata_mem_cache();
527 else if(cache_flag > 1) {
528 mem_data_cache = HDF5RequestHandler::get_lrdata_mem_cache();
541 if(mem_data_cache == NULL)
542 throw InternalErr(__FILE__,__LINE__,
"The memory data cache should NOT be NULL.");
547 BESDEBUG(
"h5",
"Cache flag: 1 small data cache, 2 large data cache genenral"
548 <<
" 3 large data cache common dir, 4 large data cache real var" <<endl);
550 BESDEBUG(
"h5",
"Data Memory Cache hit, the variable name is "<<name() <<
". The cache flag is "<< cache_flag<<endl);
555 const size_t var_size = mem_cache_ptr->get_var_buf_size();
557 throw InternalErr(__FILE__,__LINE__,
"The cached data buffer size is 0.");
560 void *buf = mem_cache_ptr->get_var_buf();
563 vector<size_t> dim_sizes;
564 Dim_iter i_dim = dim_begin();
565 Dim_iter i_enddim = dim_end();
566 while (i_dim != i_enddim) {
567 dim_sizes.push_back(dimension_size(i_dim));
571 read_data_from_mem_cache(h5_dtype,dim_sizes,buf);
576 BESDEBUG(
"h5",
"Cache flag: 1 small data cache, 2 large data cache genenral"
577 <<
" 3 large data cache common dir, 4 large data cache real var" <<endl);
579 BESDEBUG(
"h5",
"Data Memory added to the cache, the variable name is "<<name() <<
". The cache flag is "<< cache_flag<<endl);
583 throw InternalErr(__FILE__,__LINE__,
"The total number of elements is 0.");
585 buf.resize(total_elems*HDF5CFUtil::H5_numeric_atomic_type_size(h5_dtype));
588 read_data_NOT_from_mem_cache(
true,&buf[0]);
595 new_mem_cache_ele->set_databuf(buf);
598 mem_data_cache->
add(new_mem_cache_ele, cache_key);