24 #ifndef _dmrpp_array_h
25 #define _dmrpp_array_h 1
34 #include "DmrppCommon.h"
35 #include "SuperChunk.h"
44 #undef USE_READ_SERIAL
71 DmrppArray::dimension get_dimension(
unsigned int dim_num);
73 void insert_constrained_contiguous(Dim_iter dim_iter,
unsigned long *target_index,
74 std::vector<unsigned int> &subset_addr,
75 const std::vector<unsigned int> &array_shape,
char *data);
77 void read_contiguous();
79 #ifdef USE_READ_SERIAL
80 virtual void insert_chunk_serial(
unsigned int dim, std::vector<unsigned int> *target_element_address,
81 std::vector<unsigned int> *chunk_source_address,
Chunk *chunk);
82 virtual void read_chunks_serial();
87 process_one_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
DmrppArray *array,
const vector<unsigned int> &array_shape,
const vector<unsigned int> &chunk_shape);
93 process_one_chunk(std::shared_ptr<Chunk> chunk,
DmrppArray *array,
const vector<unsigned int> &constrained_array_shape);
100 virtual void insert_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
unsigned int dim,
101 unsigned long long array_offset,
const std::vector<unsigned int> &array_shape,
102 unsigned long long chunk_offset,
const std::vector<unsigned int> &chunk_shape,
103 const std::vector<unsigned int> &chunk_origin);
105 void read_chunks_unconstrained();
107 unsigned long long get_chunk_start(
const dimension &thisDim,
unsigned int chunk_origin_for_dim);
109 std::shared_ptr<Chunk> find_needed_chunks(
unsigned int dim, std::vector<unsigned int> *target_element_address, std::shared_ptr<Chunk> chunk);
111 virtual void insert_chunk(
113 std::vector<unsigned int> *target_element_address,
114 std::vector<unsigned int> *chunk_element_address,
115 std::shared_ptr<Chunk> chunk,
116 const vector<unsigned int> &constrained_array_shape);
122 DmrppArray(
const std::string &n, libdap::BaseType *v);
124 DmrppArray(
const std::string &n,
const std::string &d, libdap::BaseType *v);
133 virtual libdap::BaseType *ptr_duplicate();
137 virtual unsigned long long get_size(
bool constrained =
false);
139 virtual std::vector<unsigned int>
get_shape(
bool constrained);
141 virtual void print_dap4(libdap::XMLWriter &writer,
bool constrained =
false);
143 virtual void dump(ostream &strm)
const;
153 void *one_chunk_thread(
void *arg_list);
154 void *one_super_chunk_unconstrained_thread(
void *arg_list);
162 std::shared_ptr<Chunk> chunk;
164 const vector<unsigned int> &array_shape;
166 one_chunk_args(
int *pipe,
unsigned char id, std::shared_ptr<Chunk> c,
DmrppArray *a,
const vector<unsigned int> &a_s)
167 : fds(pipe), tid(
id), chunk(std::move(c)), array(a), array_shape(a_s) {}
173 std::shared_ptr<SuperChunk> super_chunk;
177 : super_chunk(std::move(sc)), array(a) {}
188 std::shared_ptr<Chunk> chunk;
190 const vector<unsigned int> &array_shape;
191 const vector<unsigned int> &chunk_shape;
194 const vector<unsigned int> &c_s)
195 : fds(pipe), tid(
id), chunk(std::move(c)), array(a), array_shape(a_s), chunk_shape(c_s) {}
205 std::shared_ptr<Chunk> child_chunk;
206 std::shared_ptr<Chunk> master_chunk;
208 one_child_chunk_args(
int *pipe,
unsigned char id, std::shared_ptr<Chunk> c_c, std::shared_ptr<Chunk> m_c)
209 : fds(pipe), tid(
id), child_chunk(c_c), master_chunk(m_c) {}
Extend libdap::Array so that a handler can read data using a DMR++ file.
virtual std::vector< unsigned int > get_shape(bool constrained)
Get the array shape.
friend void process_super_chunk(const std::shared_ptr< SuperChunk > &super_chunk, DmrppArray *array)
reads the super chunk, inflates/deshuffles chunks as required and copies the values into array
friend void process_super_chunk_unconstrained(const std::shared_ptr< SuperChunk > &super_chunk, DmrppArray *array)
Insert data from one chunk in this this array.
virtual unsigned long long get_size(bool constrained=false)
Return the total number of elements in this Array.
virtual bool read()
Read data for the array.
virtual void print_dap4(libdap::XMLWriter &writer, bool constrained=false)
Shadow libdap::Array::print_dap4() - optionally prints DMR++ chunk information.
Size and offset information of data included in DMR++ files.