@@ -115,68 +115,6 @@ std::vector<uint32_t> FesapiHdfProxy::getElementCountPerDimension(const std::str
115
115
return result;
116
116
}
117
117
118
- template <typename T>
119
- void FesapiHdfProxy::writeSubArrayNd (
120
- const std::string& uri,
121
- const std::string& pathInResource,
122
- std::vector<int64_t >& totalCounts,
123
- std::vector<int64_t > starts,
124
- std::vector<int64_t > counts,
125
- const void * values)
126
- {
127
- // Calculate array size
128
- size_t totalCount{ 1 };
129
-
130
- for (const auto & count : counts) {
131
- totalCount *= count;
132
- }
133
-
134
- // [Base Condition] Array size is OK to be transmitted.
135
- if ((totalCount * sizeof (T)) <= maxArraySize_) {
136
-
137
- // PUT DATA SUBARRAYS
138
- Energistics::Etp::v12::Protocol::DataArray::PutDataSubarrays pdsa{};
139
- pdsa.dataSubarrays [" 0" ].uid .uri = uri;
140
- pdsa.dataSubarrays [" 0" ].uid .pathInResource = pathInResource;
141
- pdsa.dataSubarrays [" 0" ].starts = starts;
142
- pdsa.dataSubarrays [" 0" ].counts = counts;
143
-
144
- // Cast values in T values.
145
- const T* typeValues{ static_cast <const T*>(values) };
146
-
147
- // Create 1D Array for Sub Values.
148
- T* subValues = new T[totalCount];
149
- size_t valueIndex{ 0 };
150
-
151
- // Recursively populate subValues starting from first dimension.
152
- populateSubValuesNd<T>(
153
- 0 ,
154
- totalCounts, starts, counts,
155
- valueIndex, typeValues, subValues);
156
-
157
- // Create AVRO Array
158
- Energistics::Etp::v12::Datatypes::AnyArray data;
159
- createAnyArray<T>(data, totalCount, subValues); // Type-specific code is written in explicit specializations for createAnyArray().
160
- pdsa.dataSubarrays [" 0" ].data = data;
161
-
162
- std::cout << " Writing subarray..." << std::endl;
163
-
164
- // Send putDataSubarrays Message
165
- session_->sendAndBlock (pdsa, 0 , 0x02 );
166
-
167
- // Delete Array
168
- delete[] subValues;
169
- }
170
- // [Divide and Conquer Approach] If sub array is still large, partition it into more sub arrays.
171
- else {
172
- // Recursively divide all dimensions starting from first dimension.
173
- createSubArrayNd<T>(
174
- 0 ,
175
- uri, pathInResource, totalCounts,
176
- starts, counts, values);
177
- }
178
- }
179
-
180
118
template <typename T>
181
119
void FesapiHdfProxy::populateSubValuesNd (
182
120
size_t dimensionIndex,
@@ -245,7 +183,7 @@ int64_t FesapiHdfProxy::getCountsProduct(
245
183
}
246
184
247
185
template <typename T>
248
- void FesapiHdfProxy::createSubArrayNd (
186
+ void FesapiHdfProxy::writeSubArrayNd (
249
187
size_t dimensionIndex,
250
188
const std::string& uri,
251
189
const std::string& pathInResource,
@@ -254,15 +192,56 @@ void FesapiHdfProxy::createSubArrayNd(
254
192
std::vector<int64_t > counts,
255
193
const void * values)
256
194
{
257
- // [Base Condition] If dimensionIndex exceeds the last dimension.
258
- if (dimensionIndex >= starts.size ()) {
259
- // Recursively Write Subarray.
195
+ // Calculate array size
196
+ size_t totalCount{ 1 };
197
+
198
+ for (const auto & count : counts) {
199
+ totalCount *= count;
200
+ }
201
+
202
+ // [Base Condition] If subarray can be transmitted.
203
+ if ((totalCount * sizeof (T)) <= maxArraySize_) {
204
+ // PUT DATA SUBARRAYS
205
+ Energistics::Etp::v12::Protocol::DataArray::PutDataSubarrays pdsa{};
206
+ pdsa.dataSubarrays [" 0" ].uid .uri = uri;
207
+ pdsa.dataSubarrays [" 0" ].uid .pathInResource = pathInResource;
208
+ pdsa.dataSubarrays [" 0" ].starts = starts;
209
+ pdsa.dataSubarrays [" 0" ].counts = counts;
210
+
211
+ // Cast values in T values.
212
+ const T* typeValues{ static_cast <const T*>(values) };
213
+
214
+ // Create 1D Array for Sub Values.
215
+ T* subValues = new T[totalCount];
216
+ size_t valueIndex{ 0 };
217
+
218
+ // Recursively populate subValues starting from first dimension.
219
+ populateSubValuesNd<T>(
220
+ 0 ,
221
+ totalCounts, starts, counts,
222
+ valueIndex, typeValues, subValues);
223
+
224
+ // Create AVRO Array
225
+ Energistics::Etp::v12::Datatypes::AnyArray data;
226
+ createAnyArray<T>(data, totalCount, subValues); // Type-specific code is written in explicit specializations for createAnyArray().
227
+ pdsa.dataSubarrays [" 0" ].data = data;
228
+
229
+ std::cout << " Writing subarray..." << std::endl;
230
+
231
+ // Send putDataSubarrays Message
232
+ session_->sendAndBlock (pdsa, 0 , 0x02 );
233
+
234
+ // Delete Array
235
+ delete[] subValues;
236
+ }
237
+ // Again divide all dimensions starting from first dimension.
238
+ else if (dimensionIndex >= starts.size ()) {
260
239
writeSubArrayNd<T>(
240
+ 0 ,
261
241
uri, pathInResource, totalCounts,
262
- starts,
263
- counts,
264
- values);
242
+ starts, counts, values);
265
243
}
244
+ // Divide the values of current dimension in halves.
266
245
else {
267
246
int64_t numberOfValues = counts[dimensionIndex];
268
247
@@ -273,7 +252,7 @@ void FesapiHdfProxy::createSubArrayNd(
273
252
newCounts[dimensionIndex] = firstHalfValues;
274
253
275
254
// Recursively divide next dimension.
276
- createSubArrayNd <T>(
255
+ writeSubArrayNd <T>(
277
256
dimensionIndex + 1 ,
278
257
uri, pathInResource, totalCounts,
279
258
starts,
@@ -285,7 +264,7 @@ void FesapiHdfProxy::createSubArrayNd(
285
264
newCounts[dimensionIndex] = secondHalfValues;
286
265
287
266
// Recursively divide next dimension.
288
- createSubArrayNd <T>(
267
+ writeSubArrayNd <T>(
289
268
dimensionIndex + 1 ,
290
269
uri, pathInResource, totalCounts,
291
270
newStarts,
@@ -543,43 +522,41 @@ void FesapiHdfProxy::writeArrayNd(const std::string & groupName,
543
522
544
523
// Recursively Write Subarrays
545
524
if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::DOUBLE) {
546
- writeSubArrayNd<double >(uri, pathInResource, counts,
525
+ writeSubArrayNd<double >(0 , uri, pathInResource, counts,
547
526
starts,
548
527
counts,
549
528
values);
550
529
}
551
530
else if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::FLOAT) {
552
- writeSubArrayNd<float >(uri, pathInResource, counts,
531
+ writeSubArrayNd<float >(0 , uri, pathInResource, counts,
553
532
starts,
554
533
counts,
555
534
values);
556
535
}
557
536
else if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::INT64 ||
558
537
datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::UINT64) {
559
- writeSubArrayNd<int64_t >(uri, pathInResource, counts,
538
+ writeSubArrayNd<int64_t >(0 , uri, pathInResource, counts,
560
539
starts,
561
540
counts,
562
541
values);
563
542
}
564
543
else if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::INT32 ||
565
544
datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::UINT32) {
566
- writeSubArrayNd<int32_t >(uri, pathInResource, counts,
545
+ writeSubArrayNd<int32_t >(0 , uri, pathInResource, counts,
567
546
starts,
568
547
counts,
569
548
values);
570
549
}
571
550
else if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::INT16 ||
572
551
datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::UINT16) {
573
- writeSubArrayNd<short >(
574
- uri, pathInResource, counts,
552
+ writeSubArrayNd<short >(0 , uri, pathInResource, counts,
575
553
starts,
576
554
counts,
577
555
values);
578
556
}
579
557
else if (datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::INT8 ||
580
558
datatype == COMMON_NS::AbstractObject::numericalDatatypeEnum::UINT8) {
581
- writeSubArrayNd<char >(
582
- uri, pathInResource, counts,
559
+ writeSubArrayNd<char >(0 , uri, pathInResource, counts,
583
560
starts,
584
561
counts,
585
562
values);
0 commit comments