11#include "HDFDMRArray_VD.h"
12#include "HDFStructure.h"
16#include <libdap/debug.h>
17#include <libdap/InternalErr.h>
25HDFDMRArray_VD::read ()
28 BESDEBUG(
"h4",
"Coming to HDFDMRArray_VD read "<<endl);
42 int nelms = format_constraint(offset.data(),step.data(),count.data());
45 int32 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
48 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
49 throw InternalErr (__FILE__, __LINE__, eherr.str ());
54 if (Vstart (file_id) < 0) {
57 eherr <<
"This file cannot be open.";
58 throw InternalErr (__FILE__, __LINE__, eherr.str ());
62 vdata_id = VSattach (file_id, vdref,
"r");
67 eherr <<
"Vdata cannot be attached.";
68 throw InternalErr (__FILE__, __LINE__, eherr.str ());
71 int32 vs_nflds = VFnfields(vdata_id);
72 if (vs_nflds == FAIL) {
76 throw InternalErr(__FILE__, __LINE__,
"Cannot get the number of fields of a vdata.");
81 read_one_field_vdata(vdata_id, offset,count,step,nelms);
83 read_multi_fields_vdata(vdata_id,offset, count,step,nelms);
100HDFDMRArray_VD::read_one_field_vdata(int32 vdata_id,
const vector<int>&offset,
const vector<int>&count,
const vector<int>&step,
int nelms) {
102 int32 fdorder = VFfieldorder(vdata_id,0);
103 if (fdorder == FAIL) {
104 throw InternalErr(__FILE__, __LINE__,
"VFfieldorder failed");
107 const char *fieldname = VFfieldname(vdata_id,0);
108 if (fieldname ==
nullptr) {
109 throw InternalErr(__FILE__, __LINE__,
"Cannot get vdata field name.");
112 int32 fdtype = VFfieldtype(vdata_id,0);
113 if (fdtype == FAIL) {
114 throw InternalErr(__FILE__, __LINE__,
"VFfieldtype failed");
118 if (VSseek (vdata_id, offset[0]) == -1) {
120 eherr <<
"VSseek failed at " << offset[0];
121 throw InternalErr (__FILE__, __LINE__, eherr.str ());
125 if (VSsetfields (vdata_id, fieldname) == -1) {
127 eherr <<
"VSsetfields failed with the name " << fieldname;
128 throw InternalErr (__FILE__, __LINE__, eherr.str ());
131 int32 vdfelms = fdorder * count[0] * step[0];
132 int32 fieldtype = VFfieldtype(vdata_id,0);
134 throw InternalErr (__FILE__, __LINE__,
"VFfieldtype failed");
149 orival.resize(vdfelms);
152 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],FULL_INTERLACE);
155 eherr <<
"VSread failed.";
156 throw InternalErr (__FILE__, __LINE__, eherr.str ());
161 for (
int i = 0; i < count[0]; i++)
162 for (
int j = 0; j < count[1]; j++)
163 val[i * count[1] + j] =
164 orival[i * fdorder * step[0] + offset[1] + j * step[1]];
167 for (
int i = 0; i < count[0]; i++)
168 val[i] = orival[i * step[0]];
171 set_value ((dods_int8 *) val.data(), nelms);
184 orival.resize(vdfelms);
186 r = VSread (vdata_id, orival.data(), 1+(count[0] -1)* step[0], FULL_INTERLACE);
189 eherr <<
"VSread failed.";
190 throw InternalErr (__FILE__, __LINE__, eherr.str ());
194 for (
int i = 0; i < count[0]; i++)
195 for (
int j = 0; j < count[1]; j++)
196 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
199 for (
int i = 0; i < count[0]; i++)
200 val[i] = orival[i * step[0]];
203 set_value ((dods_byte *) val.data(), nelms);
213 orival.resize(vdfelms);
215 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
219 eherr <<
"VSread failed.";
220 throw InternalErr (__FILE__, __LINE__, eherr.str ());
224 for (
int i = 0; i < count[0]; i++)
225 for (
int j = 0; j < count[1]; j++)
226 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
229 for (
int i = 0; i < count[0]; i++)
230 val[i] = orival[i * step[0]];
233 set_value ((dods_int16 *) val.data(), nelms);
243 vector<uint16>orival;
244 orival.resize(vdfelms);
246 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
250 eherr <<
"VSread failed.";
251 throw InternalErr (__FILE__, __LINE__, eherr.str ());
255 for (
int i = 0; i < count[0]; i++)
256 for (
int j = 0; j < count[1]; j++)
257 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
260 for (
int i = 0; i < count[0]; i++)
261 val[i] = orival[i * step[0]];
264 set_value ((dods_uint16 *) val.data(), nelms);
272 orival.resize(vdfelms);
274 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
278 eherr <<
"VSread failed.";
279 throw InternalErr (__FILE__, __LINE__, eherr.str ());
283 for (
int i = 0; i < count[0]; i++)
284 for (
int j = 0; j < count[1]; j++)
285 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
288 for (
int i = 0; i < count[0]; i++)
289 val[i] = orival[i * step[0]];
292 set_value ((dods_int32 *) val.data(), nelms);
302 vector<uint32>orival;
303 orival.resize(vdfelms);
305 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
309 eherr <<
"VSread failed.";
310 throw InternalErr (__FILE__, __LINE__, eherr.str ());
314 for (
int i = 0; i < count[0]; i++)
315 for (
int j = 0; j < count[1]; j++)
316 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
319 for (
int i = 0; i < count[0]; i++)
320 val[i] = orival[i * step[0]];
323 set_value ((dods_uint32 *) val.data(), nelms);
330 vector<float32>orival;
331 orival.resize(vdfelms);
333 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
337 eherr <<
"VSread failed.";
338 throw InternalErr (__FILE__, __LINE__, eherr.str ());
342 for (
int i = 0; i < count[0]; i++)
343 for (
int j = 0; j < count[1]; j++)
344 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
347 for (
int i = 0; i < count[0]; i++)
348 val[i] = orival[i * step[0]];
351 set_value ((dods_float32 *) val.data(), nelms);
360 vector<float64>orival;
361 orival.resize(vdfelms);
363 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
367 eherr <<
"VSread failed.";
368 throw InternalErr (__FILE__, __LINE__, eherr.str ());
372 for (
int i = 0; i < count[0]; i++)
373 for (
int j = 0; j < count[1]; j++)
374 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
377 for (
int i = 0; i < count[0]; i++)
378 val[i] = orival[i * step[0]];
381 set_value ((dods_float64 *) val.data(), nelms);
385 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
390HDFDMRArray_VD::read_multi_fields_vdata(int32 vdata_id,
const vector<int>&offset,
const vector<int>&count,
const vector<int>&step,
int nelms) {
394 int32 vdata_size = 0;
395 if (VSQueryvsize(vdata_id,&vdata_size)==FAIL)
396 throw InternalErr(__FILE__,__LINE__,
"unable to query vdata size");
398 if (VSQuerycount(vdata_id,&n_records) == FAIL)
399 throw InternalErr(__FILE__,__LINE__,
"unable to query number of records of vdata");
401 char field_name_list[VSFIELDMAX*FIELDNAMELENMAX];
402 if(VSinquire(vdata_id,
nullptr,
nullptr,
403 field_name_list,
nullptr,
nullptr) == FAIL) {
404 throw InternalErr(__FILE__,__LINE__,
"unable to query number of records of vdata");
406 if(VSsetfields(vdata_id,field_name_list) == FAIL)
407 throw InternalErr(__FILE__,__LINE__,
"unable to set vdata fields");
409 vector<uint8_t> data_buf;
410 data_buf.resize(n_records * vdata_size);
411 if (VSread (vdata_id, (uint8 *)data_buf.data(),n_records,FULL_INTERLACE)<0)
412 throw InternalErr(__FILE__,__LINE__,
"unable to read vdata");
414 vector<uint8_t> subset_buf;
415 subset_buf.resize(nelms*vdata_size);
417 throw InternalErr(__FILE__,__LINE__,
"vdata must be 1-D array of structure");
419 const uint8_t *tmp_buf = data_buf.data() + offset[0]*vdata_size;
420 uint8_t *tmp_subset_buf = subset_buf.data();
422 memcpy((
void*)tmp_subset_buf,(
const void*)tmp_buf,count[0]*vdata_size);
424 for (
int i = 0; i<count[0]; i++) {
425 memcpy((
void*)tmp_subset_buf,(
const void*)tmp_buf,vdata_size);
426 tmp_subset_buf +=vdata_size;
427 tmp_buf +=step[0]*vdata_size;
431 vector<string> field_names;
434 for (
auto &fn:field_names)
437for (
const auto &fn:field_names)
441 unsigned num_fields = field_names.size();
442 size_t values_offset = 0;
444 HDFStructure *vdata_s =
nullptr;
447 for (int64_t element = 0; element < nelms; ++element) {
450 vdata_s =
dynamic_cast<HDFStructure*
>(var()->ptr_duplicate());
451 size_t struct_elem_offset = values_offset + vdata_size*element;
454 throw InternalErr(__FILE__, __LINE__,
"Cannot obtain the structure pointer.");
457 int field_offset = 0;
458 for (
unsigned u =0;u<num_fields;u++) {
460 BaseType * field = vdata_s->var(field_names[u]);
461 int field_size = VFfieldisize(vdata_id,u);
462 field->val2buf(subset_buf.data() + struct_elem_offset + field_offset);
463 field_offset +=field_size;
464 field->set_read_p(
true);
468 vdata_s->read_from_value(subset_buf,values_offset);
475 string err_msg =
"Cannot read the data of a vdata " + var()->name();
476 throw InternalErr(__FILE__, __LINE__, err_msg);
478 vdata_s->set_read_p(
true);
479 set_vec_ll((uint64_t)element,vdata_s);
490HDFDMRArray_VD::format_constraint (
int *offset,
int *step,
int *count)
495 Dim_iter p = dim_begin ();
496 while (p != dim_end ()) {
498 int start = dimension_start (p,
true);
499 int stride = dimension_stride (p,
true);
500 int stop = dimension_stop (p,
true);
505 oss <<
"Array/Grid hyperslab start point "<< start <<
506 " is greater than stop point " << stop <<
".";
507 throw Error(malformed_expr, oss.str());
512 count[id] = ((stop - start) / stride) + 1;
516 "=format_constraint():"
517 <<
"id=" <<
id <<
" offset=" << offset[
id]
518 <<
" step=" << step[
id]
519 <<
" count=" << count[
id]
static std::string get_CF_string(std::string s)
Change special characters to "_".
static void Split(const char *s, int len, char sep, std::vector< std::string > &names)