casacore
Loading...
Searching...
No Matches
Adios2StManColumn.h
Go to the documentation of this file.
1// # Adios2StManColumn.h: A Column in the ADIOS2 Storage Manager
2// # Copyright (C) 2018
3// # Associated Universities, Inc. Washington DC, USA.
4// #
5// # This library is free software; you can redistribute it and/or modify it
6// # under the terms of the GNU Library General Public License as published by
7// # the Free Software Foundation; either version 2 of the License, or (at your
8// # option) any later version.
9// #
10// # This library is distributed in the hope that it will be useful, but WITHOUT
11// # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12// # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13// # License for more details.
14// #
15// # You should have received a copy of the GNU Library General Public License
16// # along with this library; if not, write to the Free Software Foundation,
17// # Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18// #
19// # Correspondence concerning AIPS++ should be addressed as follows:
20// # Internet email: casa-feedback@nrao.edu.
21// # Postal address: AIPS++ Project Office
22// # National Radio Astronomy Observatory
23// # 520 Edgemont Road
24// # Charlottesville, VA 22903-2475 USA
25
26#ifndef ADIOS2STMANCOLUMN_H
27#define ADIOS2STMANCOLUMN_H
28
29#include <unordered_map>
30#include <casacore/casa/Arrays/Array.h>
31#include <casacore/tables/DataMan/StManColumnBase.h>
32#include <casacore/tables/Tables/RefRows.h>
33
34#include "Adios2StManImpl.h"
35
36namespace casacore {
37
39 public:
40 Adios2StManColumn(Adios2StMan::impl *aParent, int aDataType, String aColName,
41 std::shared_ptr<adios2::IO> aAdiosIO);
42
43 virtual void create(std::shared_ptr<adios2::Engine> aAdiosEngine, char aOpenMode) = 0;
44 virtual void setShapeColumn(const IPosition &aShape) override;
45 virtual IPosition shape(rownr_t aRowNr) override;
46 Bool canChangeShape() const override;
47 void setShape(rownr_t aRowNr, const IPosition &aShape) override;
48
52
53 protected:
54 // scalar get/put
55 virtual void getBool(rownr_t aRowNr, Bool *aDataPtr) override;
56 virtual void getuChar(rownr_t aRowNr, uChar *aDataPtr) override;
57 virtual void getShort(rownr_t aRowNr, Short *aDataPtr) override;
58 virtual void getuShort(rownr_t aRowNr, uShort *aDataPtr) override;
59 virtual void getInt(rownr_t aRowNr, Int *aDataPtr) override;
60 virtual void getuInt(rownr_t aRowNr, uInt *aDataPtr) override;
61 virtual void getInt64(rownr_t aRowNr, Int64 *aDataPtr) override;
62 virtual void getfloat(rownr_t aRowNr, Float *aDataPtr) override;
63 virtual void getdouble(rownr_t aRowNr, Double *aDataPtr) override;
64 virtual void getComplex(rownr_t aRowNr, Complex *aDataPtr) override;
65 virtual void getDComplex(rownr_t aRowNr, DComplex *aDataPtr) override;
66 virtual void getString(rownr_t aRowNr, String *aDataPtr) override;
67
68 virtual void putBool(rownr_t aRowNr, const Bool *aDataPtr) override;
69 virtual void putuChar(rownr_t aRowNr, const uChar *aDataPtr) override;
70 virtual void putShort(rownr_t aRowNr, const Short *aDataPtr) override;
71 virtual void putuShort(rownr_t aRowNr, const uShort *aDataPtr) override;
72 virtual void putInt(rownr_t aRowNr, const Int *aDataPtr) override;
73 virtual void putuInt(rownr_t aRowNr, const uInt *aDataPtr) override;
74 virtual void putInt64(rownr_t aRowNr, const Int64 *aDataPtr) override;
75 virtual void putfloat(rownr_t aRowNr, const Float *aDataPtr) override;
76 virtual void putdouble(rownr_t aRowNr, const Double *aDataPtr) override;
77 virtual void putComplex(rownr_t aRowNr, const Complex *aDataPtr) override;
78 virtual void putDComplex(rownr_t aRowNr, const DComplex *aDataPtr) override;
79 virtual void putString(rownr_t aRowNr, const String *aDataPtr) override;
80
81 // The rest of the get and put functions
82 virtual void getScalarColumnV(ArrayBase &dataPtr) override;
83 virtual void putScalarColumnV(const ArrayBase &dataPtr) override;
84 virtual void getScalarColumnCellsV(const RefRows &rownrs, ArrayBase &dataPtr) override;
85 virtual void putScalarColumnCellsV(const RefRows &rownrs, const ArrayBase &dataPtr) override;
86 virtual void getArrayV(rownr_t rownr, ArrayBase &dataPtr) override;
87 virtual void putArrayV(rownr_t rownr, const ArrayBase &data) override;
88 virtual void getArrayColumnV(ArrayBase &data) override;
89 virtual void putArrayColumnV(const ArrayBase &data) override;
90 virtual void getArrayColumnCellsV(const RefRows &rownrs, ArrayBase &data) override;
91 virtual void putArrayColumnCellsV(const RefRows &rownrs, const ArrayBase &data) override;
92 virtual void getSliceV(rownr_t rownr, const Slicer &slicer, ArrayBase &data) override;
93 virtual void putSliceV(rownr_t rownr, const Slicer &slicer, const ArrayBase &data) override;
94 virtual void getColumnSliceV(const Slicer &slicer, ArrayBase &data) override;
95 virtual void putColumnSliceV(const Slicer &slicer, const ArrayBase &data) override;
96 virtual void getColumnSliceCellsV(const RefRows &rownrs, const Slicer &slicer,
97 ArrayBase &data) override;
98 virtual void putColumnSliceCellsV(const RefRows &rownrs, const Slicer &slicer,
99 const ArrayBase &data) override;
100
101 private:
102 void putScalar(rownr_t rownr, const void *dataPtr);
103 void getScalar(rownr_t rownr, void *dataPtr);
104 virtual void toAdios(const ArrayBase *arrayPtr) = 0;
105 virtual void fromAdios(ArrayBase *arrayPtr) = 0;
106 virtual void toAdios(const void *dataPtr, std::size_t offset = 0) = 0;
107 virtual void fromAdios(void *dataPtr, std::size_t offset = 0) = 0;
108
109 protected:
115 public:
117
119 bool finished() const;
120
124 std::size_t next_offset();
125
126 private:
129 std::size_t itsOffset{0};
130 };
131
137 void sliceVToSelection(rownr_t rownr, const Slicer &ns);
139 void columnSliceCellsVToSelection(const RefRows &rows, const Slicer &ns);
140 void columnSliceCellsVToSelection(rownr_t row_start, rownr_t row_end, const Slicer &ns);
141
143
146 std::unordered_map<rownr_t, IPosition> itsCasaShapes;
148
149 std::shared_ptr<adios2::IO> itsAdiosIO;
150 std::shared_ptr<adios2::Engine> itsAdiosEngine;
151 std::string itsAdiosDataType;
152 adios2::Dims itsAdiosShape = {std::numeric_limits<rownr_t>::max()};
153 adios2::Dims itsAdiosStart = {0};
154 adios2::Dims itsAdiosCount = {1};
155}; // class Adios2StManColumn
156
157template <class T>
159 public:
161
162 void create(std::shared_ptr<adios2::Engine> aAdiosEngine, char aOpenMode) {
163 itsAdiosEngine = aAdiosEngine;
164 itsAdiosVariable = itsAdiosIO->InquireVariable<T>(itsColumnName);
165 if (!itsAdiosVariable && aOpenMode == 'w') {
168 }
169 }
170
171 private:
172 adios2::Variable<T> itsAdiosVariable;
173
174 void toAdios(const void *data, std::size_t offset) {
175 const T *tData = static_cast<const T *>(data);
178 itsAdiosEngine->Put<T>(itsAdiosVariable, tData + offset, adios2::Mode::Sync);
179 }
180
181 void fromAdios(void *data, std::size_t offset) {
182 T *tData = static_cast<T *>(data);
184 itsAdiosEngine->Get<T>(itsAdiosVariable, tData + offset, adios2::Mode::Sync);
185 }
186
187 void toAdios(const ArrayBase *arrayPtr) {
188 Bool deleteIt;
189 const void *data = arrayPtr->getVStorage(deleteIt);
190 toAdios(data, 0);
191 arrayPtr->freeVStorage(data, deleteIt);
192 }
193
194 void fromAdios(ArrayBase *arrayPtr) {
195 Bool deleteIt;
196 void *data = arrayPtr->getVStorage(deleteIt);
197 fromAdios(data, 0);
198 arrayPtr->putVStorage(data, deleteIt);
199 }
200
201}; // class Adios2StManColumnT
202
203class Adios2StManColumnString : public Adios2StManColumnT<std::string> {
204 public:
205 using Adios2StManColumnT::Adios2StManColumnT;
206
207 protected:
208 void putArrayV(rownr_t rownr, const ArrayBase &data);
209 void getArrayV(rownr_t rownr, ArrayBase &data);
210 void getSliceV(rownr_t /*aRowNr*/, const Slicer & /*ns*/, ArrayBase & /*data*/);
211 void putSliceV(rownr_t /*aRowNr*/, const Slicer & /*ns*/, const ArrayBase & /*data*/);
212 void getColumnSliceV(const Slicer & /*ns*/, ArrayBase & /*data*/);
213 void putColumnSliceV(const Slicer & /*ns*/, const ArrayBase & /*data*/);
214 void getColumnSliceCellsV(const RefRows & /*rownrs*/, const Slicer & /*slicer*/,
215 ArrayBase & /*data*/);
216 void putColumnSliceCellsV(const RefRows & /*rownrs*/, const Slicer & /*slicer*/,
217 const ArrayBase & /*data*/);
218
219 private:
220 const String itsStringArrayBarrier = "ADIOS2BARRIER";
221}; // class Adios2StManColumnString
222
223} // namespace casacore
224
225#endif // ADIOS2STMANCOLUMN_H
void putColumnSliceCellsV(const RefRows &, const Slicer &, const ArrayBase &)
Put into a section of some arrays in the column.
void putColumnSliceV(const Slicer &, const ArrayBase &)
Put into a section of all arrays in the column.
void getColumnSliceV(const Slicer &, ArrayBase &)
Get a section of all arrays in the column.
void getColumnSliceCellsV(const RefRows &, const Slicer &, ArrayBase &)
Get a section of some arrays in the column.
void getArrayV(rownr_t rownr, ArrayBase &data)
Get the array value in the given row.
void getSliceV(rownr_t, const Slicer &, ArrayBase &)
Get a section of the array in the given row.
void putSliceV(rownr_t, const Slicer &, const ArrayBase &)
Put into a section of the array in the given row.
void putArrayV(rownr_t rownr, const ArrayBase &data)
Put the array value into the given row.
adios2::Variable< T > itsAdiosVariable
void toAdios(const ArrayBase *arrayPtr)
void create(std::shared_ptr< adios2::Engine > aAdiosEngine, char aOpenMode)
Adios2StManColumn(Adios2StMan::impl *aParent, int aDataType, String aColName, std::shared_ptr< adios2::IO > aAdiosIO)
void fromAdios(void *data, std::size_t offset)
void toAdios(const void *data, std::size_t offset)
void fromAdios(ArrayBase *arrayPtr)
std::size_t next_offset()
Adjusts the Adios2StManColumn's adios variable selection to cover the next set of rows,...
bool finished() const
Whether there are more rows to go through.
ArrayColumnCellsVIter(Adios2StManColumn &column, const RefRows &rownrs)
virtual void putColumnSliceCellsV(const RefRows &rownrs, const Slicer &slicer, const ArrayBase &data) override
Put into a section of some arrays in the column.
virtual void getScalarColumnV(ArrayBase &dataPtr) override
The rest of the get and put functions.
virtual void putdouble(rownr_t aRowNr, const Double *aDataPtr) override
virtual void putSliceV(rownr_t rownr, const Slicer &slicer, const ArrayBase &data) override
Put into a section of the array in the given row.
virtual void getDComplex(rownr_t aRowNr, DComplex *aDataPtr) override
void columnSliceVToSelection(const Slicer &ns)
Bool canChangeShape() const override
Can the data manager handle chaging the shape of an existing array?
virtual void getArrayColumnCellsV(const RefRows &rownrs, ArrayBase &data) override
Get some array values in the column.
virtual void getColumnSliceCellsV(const RefRows &rownrs, const Slicer &slicer, ArrayBase &data) override
Get a section of some arrays in the column.
virtual void getuInt(rownr_t aRowNr, uInt *aDataPtr) override
virtual void create(std::shared_ptr< adios2::Engine > aAdiosEngine, char aOpenMode)=0
void columnSliceCellsVToSelection(const RefRows &rows, const Slicer &ns)
void sliceVToSelection(rownr_t rownr, const Slicer &ns)
std::shared_ptr< adios2::Engine > itsAdiosEngine
virtual void putDComplex(rownr_t aRowNr, const DComplex *aDataPtr) override
virtual void putScalarColumnV(const ArrayBase &dataPtr) override
Put all scalar values in the column.
virtual void putuInt(rownr_t aRowNr, const uInt *aDataPtr) override
virtual void getArrayColumnV(ArrayBase &data) override
Get all array values in the column.
virtual void putShort(rownr_t aRowNr, const Short *aDataPtr) override
virtual void getArrayV(rownr_t rownr, ArrayBase &dataPtr) override
Get the array value in the given row.
virtual void putuChar(rownr_t aRowNr, const uChar *aDataPtr) override
virtual void getuShort(rownr_t aRowNr, uShort *aDataPtr) override
virtual void putColumnSliceV(const Slicer &slicer, const ArrayBase &data) override
Put into a section of all arrays in the column.
virtual void getBool(rownr_t aRowNr, Bool *aDataPtr) override
scalar get/put
virtual void getInt64(rownr_t aRowNr, Int64 *aDataPtr) override
virtual void putArrayColumnCellsV(const RefRows &rownrs, const ArrayBase &data) override
Put some array values in the column.
Adios2StManColumn(Adios2StMan::impl *aParent, int aDataType, String aColName, std::shared_ptr< adios2::IO > aAdiosIO)
virtual void getShort(rownr_t aRowNr, Short *aDataPtr) override
virtual void getScalarColumnCellsV(const RefRows &rownrs, ArrayBase &dataPtr) override
Get some scalar values in the column.
virtual void putScalarColumnCellsV(const RefRows &rownrs, const ArrayBase &dataPtr) override
Put some scalar values in the column.
virtual void putuShort(rownr_t aRowNr, const uShort *aDataPtr) override
void putScalar(rownr_t rownr, const void *dataPtr)
virtual void fromAdios(ArrayBase *arrayPtr)=0
void columnSliceCellsVToSelection(rownr_t row_start, rownr_t row_end, const Slicer &ns)
virtual void putComplex(rownr_t aRowNr, const Complex *aDataPtr) override
virtual void getuChar(rownr_t aRowNr, uChar *aDataPtr) override
std::unordered_map< rownr_t, IPosition > itsCasaShapes
void getScalar(rownr_t rownr, void *dataPtr)
virtual void getSliceV(rownr_t rownr, const Slicer &slicer, ArrayBase &data) override
Get a section of the array in the given row.
virtual void getString(rownr_t aRowNr, String *aDataPtr) override
virtual void putInt(rownr_t aRowNr, const Int *aDataPtr) override
void setShape(rownr_t aRowNr, const IPosition &aShape) override
Set the shape of an (variable-shaped) array in the given row.
void scalarToSelection(rownr_t rownr)
std::shared_ptr< adios2::IO > itsAdiosIO
virtual void fromAdios(void *dataPtr, std::size_t offset=0)=0
void scalarColumnCellsVToSelection(const RefRows &rownrs)
virtual void putArrayV(rownr_t rownr, const ArrayBase &data) override
Put the array value into the given row.
Adios2StMan::impl * itsStManPtr
virtual void putString(rownr_t aRowNr, const String *aDataPtr) override
virtual IPosition shape(rownr_t aRowNr) override
Get the shape of the item in the given row.
virtual void putBool(rownr_t aRowNr, const Bool *aDataPtr) override
Put the scalar value into the given row.
virtual void toAdios(const void *dataPtr, std::size_t offset=0)=0
virtual void getInt(rownr_t aRowNr, Int *aDataPtr) override
virtual void getfloat(rownr_t aRowNr, Float *aDataPtr) override
virtual void getComplex(rownr_t aRowNr, Complex *aDataPtr) override
virtual void getdouble(rownr_t aRowNr, Double *aDataPtr) override
void arrayVToSelection(rownr_t rownr)
virtual void putInt64(rownr_t aRowNr, const Int64 *aDataPtr) override
virtual void putfloat(rownr_t aRowNr, const Float *aDataPtr) override
virtual void toAdios(const ArrayBase *arrayPtr)=0
virtual void putArrayColumnV(const ArrayBase &data) override
Put all array values in the column.
virtual void getColumnSliceV(const Slicer &slicer, ArrayBase &data) override
Get a section of all arrays in the column.
virtual void setShapeColumn(const IPosition &aShape) override
Set the shape of all (fixed-shaped) arrays in the column.
Non-templated base class for templated Array class.
Definition ArrayBase.h:69
virtual void freeVStorage(const void *&storage, bool deleteIt) const
virtual void * getVStorage(bool &deleteIt)
The following functions behave the same as the corresponding getStorage functions in the derived temp...
virtual void putVStorage(void *&storage, bool deleteAndCopy)
Class to iterate through a RefRows object.
Definition RefRows.h:200
StManColumnBase(int dataType)
Default constructor.
String: the storage and methods of handling collections of characters.
Definition String.h:355
For temporary backward namespace compatibility, use casa as alias for casacore.
Definition mainpage.dox:28
unsigned char uChar
Definition aipstype.h:45
int offset(int, int) const
compute a linear offset from array indicies
short Short
Definition aipstype.h:46
unsigned int uInt
Definition aipstype.h:49
unsigned short uShort
Definition aipstype.h:47
long long Int64
Define the extra non-standard types used by Casacore (like proposed uSize, Size).
Definition aipsxtype.h:36
float Float
Definition aipstype.h:52
int Int
Definition aipstype.h:48
bool Bool
Define the standard types used by Casacore.
Definition aipstype.h:40
double Double
Definition aipstype.h:53
uInt64 rownr_t
Define the type of a row number in a table.
Definition aipsxtype.h:44