15#include "HDFSPArrayAddCVField.h"
19#include <libdap/debug.h>
22#include <libdap/InternalErr.h>
29HDFSPArrayAddCVField::read ()
32 BESDEBUG(
"h4",
"Coming to HDFSPArrayAddCVField read "<<endl);
46 int nelms = format_constraint(offset.data(),step.data(),count.data());
48 if (sptype == TRMML3C_V6) {
50 if (dtype != DFNT_FLOAT32) {
51 throw InternalErr (__FILE__, __LINE__,
52 "The Height datatype of TRMM CSH product should be float.");
56 throw InternalErr (__FILE__, __LINE__,
57 "The number of elements should be 19.");
60 vector<float>total_val;
61 total_val.resize(tnumelm);
63 for (
int i = 1; i<tnumelm;i++)
64 total_val[i] = (
float)i;
67 if (nelms == tnumelm) {
68 set_value ((dods_float32 *) total_val.data(), nelms);
75 for (
int i = 0; i < nelms; i++)
76 val[i] = total_val[offset[0] + step[0] * i];
77 set_value ((dods_float32 *) val.data(), nelms);
81 if (sptype == TRMML3S_V7) {
84 if (dtype != DFNT_FLOAT32) {
85 throw InternalErr (__FILE__, __LINE__,
86 "The Height datatype of TRMM CSH product should be float.");
90 Obtain_trmm_v7_layer(nelms,offset,step);
91 else if (tnumelm == 6)
92 Obtain_trmml3s_v7_nthrash(nelms,offset,step);
94 throw InternalErr (__FILE__, __LINE__,
95 "This special coordinate variable is not supported.");
100 if (sptype == TRMML2_V7) {
102 if (dtype != DFNT_FLOAT32) {
103 throw InternalErr (__FILE__, __LINE__,
104 "The Height datatype of TRMM CSH product should be float.");
107 if (tnumelm == 28 && name ==
"nlayer")
108 Obtain_trmm_v7_layer(nelms,offset,step);
110 throw InternalErr (__FILE__, __LINE__,
111 "This special coordinate variable is not supported.");
119void HDFSPArrayAddCVField:: Obtain_trmm_v7_layer(
int nelms, vector<int>&offset,vector<int>&step) {
122 vector<float>total_val;
123 total_val.resize(tnumelm);
124 for (
int i = 0; i<20;i++)
125 total_val[i] = (
float)(0.5*(i+1));
127 for (
int i = 20; i<28;i++)
128 total_val[i] = total_val[19]+(i-19);
134 if (nelms == tnumelm)
135 set_value ((dods_float32 *) total_val.data(), nelms);
141 for (
int i = 0; i < nelms; i++)
142 val[i] = total_val[offset[0] + step[0] * i];
143 set_value ((dods_float32 *) val.data(), nelms);
148void HDFSPArrayAddCVField:: Obtain_trmml3s_v7_nthrash(
int nelms, vector<int>&offset,vector<int>&step) {
150 vector<float>total_val;
151 total_val.resize(tnumelm);
153 if (name ==
"nthrshZO") {
159 total_val[4] = 0.75f;
160 total_val[5] = 50.0f;
163 else if (name ==
"nthrshHB") {
169 total_val[4] = 0.75f;
170 total_val[5] = 0.9999f;
173 else if (name ==
"nthrshSRT") {
184 throw InternalErr (__FILE__, __LINE__,
185 "Unsupported coordinate variable names.");
190 if (nelms == tnumelm) {
191 set_value ((dods_float32 *) total_val.data(), nelms);
198 for (
int i = 0; i < nelms; i++)
199 val[i] = total_val[offset[0] + step[0] * i];
200 set_value ((dods_float32 *) val.data(), nelms);
209HDFSPArrayAddCVField::format_constraint (
int *offset,
int *step,
int *count)
214 Dim_iter p = dim_begin ();
215 while (p != dim_end ()) {
217 int start = dimension_start (p,
true);
218 int stride = dimension_stride (p,
true);
219 int stop = dimension_stop (p,
true);
224 oss <<
"Array/Grid hyperslab start point "<< start <<
225 " is greater than stop point " << stop <<
".";
226 throw Error(malformed_expr, oss.str());
231 count[id] = ((stop - start) / stride) + 1;
235 "=format_constraint():"
236 <<
"id=" <<
id <<
" offset=" << offset[
id]
237 <<
" step=" << step[
id]
238 <<
" count=" << count[
id]