40#include "config_hdf.h"
45#ifdef HAVE_SYS_PARAM_H
52#include <libdap/Error.h>
53#include <libdap/InternalErr.h>
54#include <libdap/debug.h>
55#include <libdap/escaping.h>
66HDFGrid::HDFGrid(
const string &n,
const string &d) :
70HDFGrid::~HDFGrid() =
default;
72BaseType *HDFGrid::ptr_duplicate() {
73 return new HDFGrid(*
this);
80vector<array_ce> HDFGrid::get_map_constraints() {
81 vector<array_ce> a_ce_vec;
84 for (Grid::Map_iter p = map_begin(); p != map_end(); ++p) {
85 Array & a =
static_cast<Array &
> (**p);
86 Array::Dim_iter q = a.dim_begin();
87 int start = a.dimension_start(q,
true);
88 int stop = a.dimension_stop(q,
true);
89 int stride = a.dimension_stride(q,
true);
90 int edge = (int) ((stop - start) / stride) + 1;
91 array_ce a_ce(a.name(), start, edge, stride);
92 a_ce_vec.push_back(a_ce);
101 int status = read_tagref(-1, -1, err);
103 throw Error(unknown_error,
"Could not read from dataset.");
107bool HDFGrid::read_tagref(int32, int32 ref,
int &err) {
113 string hdf_file = dataset();
114 string hdf_name = this->name();
119 hdfistream_sds sdsin(hdf_file.c_str());
124 auto primary_array =
static_cast<HDFArray *
> (array_var());
126 throw InternalErr(__FILE__, __LINE__,
"Expected an HDFArray.");
128 bool isslab = primary_array->GetSlabConstraint(start, edge, stride);
132 sdsin.setslab(start, edge, stride,
false);
135 sdsin.set_map_ce(get_map_constraints());
140 sdsin.seek(hdf_name.c_str());
143 if (array_var()->send_p() || array_var()->is_in_selection()) {
147 string(
"Could not read ") + array_var()->name()
148 +
string(
" from dataset ") + dataset()
152 LoadGridFromSDS(
this, sds);
162 if (!(array_var()->send_p() || array_var()->is_in_selection())) {
165 sds.dims = vector<hdf_dim> ();
166 sds.data = hdf_genvec();
170 for (Grid::Map_iter p = map_begin(); p != map_end(); ++p) {
171 if ((*p)->send_p() || (*p)->is_in_selection()) {
172 for (
unsigned int i = 0; i < sds.dims.size(); i++) {
173 if ((*p)->name() == sds.dims[i].name) {
175 char *data =
static_cast<char *
> (ExportDataForDODS(
179 (*p)->set_read_p(
true);
195void HDFGrid::transfer_attributes(AttrTable *at) {
197 array_var()->transfer_attributes(at);
199 Map_iter map = map_begin();
200 while (map != map_end()) {
201 (*map)->transfer_attributes(at);
205 AttrTable *mine = at->get_attr_table(name());
208 mine->set_is_global_attribute(
false);
209 AttrTable::Attr_iter at_p = mine->attr_begin();
210 while (at_p != mine->attr_end()) {
211 if (mine->get_attr_type(at_p) == Attr_container)
212 get_attr_table().append_container(
213 new AttrTable(*mine->get_attr_table(at_p)),
214 mine->get_name(at_p));
216 get_attr_table().append_attr(mine->get_name(at_p),
217 mine->get_type(at_p), mine->get_attr_vector(at_p));
224 string dim_name_base = name() +
"_dim_";
226 AttrTable::Attr_iter a_p = at->attr_begin();
227 while (a_p != at->attr_end()) {
228 string::size_type i = at->get_name(a_p).find(dim_name_base);
232 if (i == 0 && at->get_attr_type(a_p) == Attr_container) {
233 AttrTable *dim = at->get_attr_table(a_p);
236 BESDEBUG(
"h4",
"dim->name(): " << dim->get_name() << endl);
237 BESDEBUG(
"h4",
"dim->get_name().substr(i + dim_name_base.size()): "
238 << dim->get_name().substr(i + dim_name_base.size()) << endl);
239 int n = atoi(dim->get_name().substr(i + dim_name_base.size()).c_str());
242 BESDEBUG(
"h4",
"Inside HDFGrid::transfer_attreibutes: n = " << n << endl);
243 static_cast<HDFArray&
> (*(*(map_begin() + n))).transfer_dimension_attribute(dim);