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
36
37namespace casacore
38{
39
41{
42public:
43 Adios2StManColumn(Adios2StMan::impl *aParent, int aDataType, String aColName, std::shared_ptr<adios2::IO> aAdiosIO);
44
45 virtual void create(std::shared_ptr<adios2::Engine> aAdiosEngine,
46 char aOpenMode) = 0;
47 virtual void setShapeColumn(const IPosition &aShape) override;
48 virtual IPosition shape(rownr_t aRowNr) override;
49 Bool canChangeShape() const override;
50 void setShape (rownr_t aRowNr, const IPosition& aShape) override;
51
55
56protected:
57
58 // scalar get/put
59 virtual void getBool(rownr_t aRowNr, Bool *aDataPtr) override;
60 virtual void getuChar(rownr_t aRowNr, uChar *aDataPtr) override;
61 virtual void getShort(rownr_t aRowNr, Short *aDataPtr) override;
62 virtual void getuShort(rownr_t aRowNr, uShort *aDataPtr) override;
63 virtual void getInt(rownr_t aRowNr, Int *aDataPtr) override;
64 virtual void getuInt(rownr_t aRowNr, uInt *aDataPtr) override;
65 virtual void getInt64(rownr_t aRowNr, Int64 *aDataPtr) override;
66 virtual void getfloat(rownr_t aRowNr, Float *aDataPtr) override;
67 virtual void getdouble(rownr_t aRowNr, Double *aDataPtr) override;
68 virtual void getComplex(rownr_t aRowNr, Complex *aDataPtr) override;
69 virtual void getDComplex(rownr_t aRowNr, DComplex *aDataPtr) override;
70 virtual void getString(rownr_t aRowNr, String *aDataPtr) override;
71
72 virtual void putBool(rownr_t aRowNr, const Bool *aDataPtr) override;
73 virtual void putuChar(rownr_t aRowNr, const uChar *aDataPtr) override;
74 virtual void putShort(rownr_t aRowNr, const Short *aDataPtr) override;
75 virtual void putuShort(rownr_t aRowNr, const uShort *aDataPtr) override;
76 virtual void putInt(rownr_t aRowNr, const Int *aDataPtr) override;
77 virtual void putuInt(rownr_t aRowNr, const uInt *aDataPtr) override;
78 virtual void putInt64(rownr_t aRowNr, const Int64 *aDataPtr) override;
79 virtual void putfloat(rownr_t aRowNr, const Float *aDataPtr) override;
80 virtual void putdouble(rownr_t aRowNr, const Double *aDataPtr) override;
81 virtual void putComplex(rownr_t aRowNr, const Complex *aDataPtr) override;
82 virtual void putDComplex(rownr_t aRowNr, const DComplex *aDataPtr) override;
83 virtual void putString(rownr_t aRowNr, const String *aDataPtr) override;
84
85 // The rest of the get and put functions
86 virtual void getScalarColumnV (ArrayBase& dataPtr) override;
87 virtual void putScalarColumnV (const ArrayBase& dataPtr) override;
88 virtual void getScalarColumnCellsV (const RefRows& rownrs,
89 ArrayBase& dataPtr) override;
90 virtual void putScalarColumnCellsV (const RefRows& rownrs,
91 const ArrayBase& dataPtr) override;
92 virtual void getArrayV (rownr_t rownr, ArrayBase& dataPtr) override;
93 virtual void putArrayV (rownr_t rownr, const ArrayBase& data) override;
94 virtual void getArrayColumnV (ArrayBase& data) override;
95 virtual void putArrayColumnV (const ArrayBase& data) override;
96 virtual void getArrayColumnCellsV (const RefRows& rownrs,
97 ArrayBase& data) override;
98 virtual void putArrayColumnCellsV (const RefRows& rownrs,
99 const ArrayBase& data) override;
100 virtual void getSliceV (rownr_t rownr, const Slicer& slicer, ArrayBase& data) override;
101 virtual void putSliceV (rownr_t rownr, const Slicer& slicer,
102 const ArrayBase& data) override;
103 virtual void getColumnSliceV (const Slicer& slicer, ArrayBase& data) override;
104 virtual void putColumnSliceV (const Slicer& slicer, const ArrayBase& data) override;
105 virtual void getColumnSliceCellsV (const RefRows& rownrs,
106 const Slicer& slicer, ArrayBase& data) override;
107 virtual void putColumnSliceCellsV (const RefRows& rownrs,
108 const Slicer& slicer,
109 const ArrayBase& data) override;
110
111
112private:
113 void putScalar(rownr_t rownr, const void *dataPtr);
114 void getScalar(rownr_t rownr, void *dataPtr);
115 virtual void toAdios(const ArrayBase *arrayPtr) = 0;
116 virtual void fromAdios(ArrayBase *arrayPtr) = 0;
117 virtual void toAdios(const void *dataPtr, std::size_t offset=0) = 0;
118 virtual void fromAdios(void *dataPtr, std::size_t offset=0) = 0;
119
120
121protected:
127 void sliceVToSelection(rownr_t rownr, const Slicer &ns);
129 void columnSliceCellsVToSelection(const RefRows &rows, const Slicer &ns);
130 void columnSliceCellsVToSelection(rownr_t row_start, rownr_t row_end, const Slicer &ns);
131
133
136 std::unordered_map<rownr_t, IPosition> itsCasaShapes;
138
139 std::shared_ptr<adios2::IO> itsAdiosIO;
140 std::shared_ptr<adios2::Engine> itsAdiosEngine;
141 std::string itsAdiosDataType;
142 adios2::Dims itsAdiosShape = {std::numeric_limits<rownr_t>::max()};
143 adios2::Dims itsAdiosStart = {0};
144 adios2::Dims itsAdiosCount = {1};
145}; // class Adios2StManColumn
146
147
148template <class T>
150{
151public:
152
154
155 void create(std::shared_ptr<adios2::Engine> aAdiosEngine, char aOpenMode)
156 {
157 itsAdiosEngine = aAdiosEngine;
158 itsAdiosVariable = itsAdiosIO->InquireVariable<T>(itsColumnName);
159 if (!itsAdiosVariable && aOpenMode == 'w')
160 {
161 itsAdiosVariable = itsAdiosIO->DefineVariable<T>(
166 }
167 }
168
169private:
170 adios2::Variable<T> itsAdiosVariable;
171
172 void toAdios(const void *data, std::size_t offset)
173 {
174 const T *tData = static_cast<const T *>(data);
175 if(!isShapeFixed)
178 itsAdiosEngine->Put<T>(itsAdiosVariable, tData + offset, adios2::Mode::Sync);
179 }
180
181 void fromAdios(void *data, std::size_t offset)
182 {
183 T *tData = static_cast<T *>(data);
185 itsAdiosEngine->Get<T>(itsAdiosVariable, tData + offset, adios2::Mode::Sync);
186 }
187
188 void toAdios(const ArrayBase *arrayPtr)
189 {
190 Bool deleteIt;
191 const void *data = arrayPtr->getVStorage(deleteIt);
192 toAdios(data, 0);
193 arrayPtr->freeVStorage (data, deleteIt);
194 }
195
196 void fromAdios(ArrayBase *arrayPtr)
197 {
198 Bool deleteIt;
199 void *data = arrayPtr->getVStorage(deleteIt);
200 fromAdios(data, 0);
201 arrayPtr->putVStorage(data, deleteIt);
202 }
203
204}; // class Adios2StManColumnT
205
207{
208public:
209 using Adios2StManColumnT::Adios2StManColumnT;
210
211protected:
212 void putArrayV(rownr_t rownr, const ArrayBase& data);
213 void getArrayV(rownr_t rownr, ArrayBase& data);
214 void getSliceV(rownr_t /*aRowNr*/, const Slicer &/*ns*/, ArrayBase &/*data*/);
215 void putSliceV(rownr_t /*aRowNr*/, const Slicer &/*ns*/, const ArrayBase &/*data*/);
216 void getColumnSliceV(const Slicer &/*ns*/, ArrayBase &/*data*/);
217 void putColumnSliceV(const Slicer &/*ns*/, const ArrayBase &/*data*/);
218 void getColumnSliceCellsV(const RefRows& /*rownrs*/, const Slicer& /*slicer*/, ArrayBase& /*data*/);
219 void putColumnSliceCellsV(const RefRows& /*rownrs*/, const Slicer& /*slicer*/, const ArrayBase& /*data*/);
220
221private:
222 const String itsStringArrayBarrier = "ADIOS2BARRIER";
223}; // class Adios2StManColumnString
224
225} // namespace casacore
226
227#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)
void fromAdios(void *data, std::size_t offset)
void toAdios(const void *data, std::size_t offset)
void fromAdios(ArrayBase *arrayPtr)
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? Default is no.
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:71
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)
String: the storage and methods of handling collections of characters.
Definition String.h:223
this file contains all the compiler specific defines
Definition mainpage.dox:28
unsigned char uChar
Definition aipstype.h:45
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