atlas
Array.h
1 /*
2  * (C) Copyright 2013 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation
8  * nor does it submit to any jurisdiction.
9  */
10 
11 #pragma once
12 
13 #include <memory>
14 #include <vector>
15 
16 #include "atlas/util/Object.h"
17 
18 #include "atlas/array/ArrayUtil.h"
19 #include "atlas/array/DataType.h"
20 #include "atlas/array_fwd.h"
21 #include "atlas/library/config.h"
22 
23 namespace atlas {
24 namespace array {
25 
26 // --------------------------------------------------------------------------------------------
27 // Forward declarations
28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 template <typename Value>
30 class ArrayT;
31 template <typename Value>
33 #endif
34 
35 // --------------------------------------------------------------------------------------------
36 
37 class Array : public util::Object {
38 public:
39  Array() = default;
40  virtual ~Array();
41 
42  static Array* create( array::DataType, const ArrayShape& );
43 
44  static Array* create( array::DataType, const ArrayShape&, const ArrayLayout& );
45 
46  static Array* create( array::DataType, ArraySpec&& );
47 
48  virtual size_t footprint() const = 0;
49 
50  template <typename Value>
51  static Array* create( idx_t size0 );
52  template <typename Value>
53  static Array* create( idx_t size0, idx_t size1 );
54  template <typename Value>
55  static Array* create( idx_t size0, idx_t size1, idx_t size2 );
56  template <typename Value>
57  static Array* create( idx_t size0, idx_t size1, idx_t size2, idx_t size3 );
58  template <typename Value>
59  static Array* create( idx_t size0, idx_t size1, idx_t size2, idx_t size3, idx_t size4 );
60 
61  template <typename Value>
62  static Array* create( const ArrayShape& shape );
63 
64  template <typename Value>
65  static Array* create( const ArrayShape& shape, const ArrayLayout& layout );
66 
67  template <typename Value>
68  static Array* wrap( Value* data, const ArrayShape& shape );
69 
70  template <typename Value>
71  static Array* wrap( Value* data, const ArraySpec& spec );
72 
73  idx_t bytes() const { return datatype().size() * spec().allocatedSize(); }
74 
75  size_t size() const { return spec_.size(); }
76 
77  idx_t rank() const { return spec_.rank(); }
78 
79  idx_t stride( idx_t i ) const { return spec_.strides()[i]; }
80 
81  idx_t shape( idx_t i ) const { return spec_.shape()[i]; }
82 
83  const ArrayStrides& strides() const { return spec_.strides(); }
84 
85  const ArrayShape& shape() const { return spec_.shape(); }
86 
87  const std::vector<int>& shapef() const { return spec_.shapef(); }
88 
89  const std::vector<int>& stridesf() const { return spec_.stridesf(); }
90 
91  bool contiguous() const { return spec_.contiguous(); }
92 
93  bool hasDefaultLayout() const { return spec_.hasDefaultLayout(); }
94 
95  virtual array::DataType datatype() const = 0;
96 
97  virtual void resize( const ArrayShape& shape ) = 0;
98 
99  virtual void resize( idx_t size0 ) = 0;
100  virtual void resize( idx_t size0, idx_t size1 ) = 0;
101  virtual void resize( idx_t size0, idx_t size1, idx_t size2 ) = 0;
102  virtual void resize( idx_t size0, idx_t size1, idx_t size2, idx_t size3 ) = 0;
103  virtual void resize( idx_t size0, idx_t size1, idx_t size2, idx_t size3, idx_t size4 ) = 0;
104 
105  virtual void insert( idx_t idx1, idx_t size1 ) = 0;
106 
107  virtual void dump( std::ostream& os ) const = 0;
108 
109  virtual bool accMap() const = 0;
110 
111  virtual void* storage() { return data_store_->voidDataStore(); }
112 
113  virtual const void* storage() const { return data_store_->voidDataStore(); }
114 
115  void updateDevice() const { data_store_->updateDevice(); }
116 
117  void updateHost() const { data_store_->updateHost(); }
118 
119  bool valid() const { return data_store_->valid(); }
120 
121  void syncHostDevice() const { data_store_->syncHostDevice(); }
122 
123  bool hostNeedsUpdate() const { return data_store_->hostNeedsUpdate(); }
124 
125  bool deviceNeedsUpdate() const { return data_store_->deviceNeedsUpdate(); }
126 
127  void reactivateDeviceWriteViews() const { data_store_->reactivateDeviceWriteViews(); }
128 
129  void reactivateHostWriteViews() const { data_store_->reactivateHostWriteViews(); }
130 
131  const ArraySpec& spec() const { return spec_; }
132 
133  // -- dangerous methods... You're on your own interpreting the raw data
134  template <typename DATATYPE>
135  DATATYPE const* host_data() const {
136  return data_store_->hostData<DATATYPE>();
137  }
138  template <typename DATATYPE>
139  DATATYPE* host_data() {
140  return data_store_->hostData<DATATYPE>();
141  }
142  template <typename DATATYPE>
143  DATATYPE const* device_data() const {
144  return data_store_->deviceData<DATATYPE>();
145  }
146  template <typename DATATYPE>
147  DATATYPE* device_data() {
148  return data_store_->deviceData<DATATYPE>();
149  }
150  template <typename DATATYPE>
151  DATATYPE const* data() const {
152  return data_store_->hostData<DATATYPE>();
153  }
154  template <typename DATATYPE>
155  DATATYPE* data() {
156  return data_store_->hostData<DATATYPE>();
157  }
158  void const* data() const { return data<void>(); }
159  void* data() { return data<void>(); }
160 
161  const ArrayDataStore& data_store() const { return *data_store_; }
162 
163 protected:
164  Array( ArraySpec&& spec ) : spec_( std::move( spec ) ) {}
165  ArraySpec spec_;
166  std::unique_ptr<ArrayDataStore> data_store_;
167 
168  void replace( Array& array ) {
169  data_store_.swap( array.data_store_ );
170  spec_ = array.spec_;
171  }
172 };
173 
174 // --------------------------------------------------------------------------------------------
175 
176 template <typename Value>
177 class ArrayT : public Array {
178 public:
179  ArrayT( idx_t size0 );
180  ArrayT( idx_t size0, idx_t size1 );
181  ArrayT( idx_t size0, idx_t size1, idx_t size2 );
182  ArrayT( idx_t size0, idx_t size1, idx_t size2, idx_t size3 );
183  ArrayT( idx_t size0, idx_t size1, idx_t size2, idx_t size3, idx_t size4 );
184 
185  ArrayT( ArraySpec&& );
186 
187  ArrayT( const ArrayShape& );
188 
189  ArrayT( const ArrayShape&, const ArrayAlignment& );
190 
191  ArrayT( const ArrayShape&, const ArrayLayout& );
192 
193  virtual void insert( idx_t idx1, idx_t size1 );
194 
195  virtual void resize( const ArrayShape& );
196 
197  virtual void resize( idx_t size0 );
198  virtual void resize( idx_t size0, idx_t size1 );
199  virtual void resize( idx_t size0, idx_t size1, idx_t size2 );
200  virtual void resize( idx_t size0, idx_t size1, idx_t size2, idx_t size3 );
201  virtual void resize( idx_t size0, idx_t size1, idx_t size2, idx_t size3, idx_t size4 );
202 
203  virtual array::DataType datatype() const { return array::DataType::create<Value>(); }
204 
205  virtual void dump( std::ostream& os ) const;
206 
207  // This constructor is used through the Array::create() or the Array::wrap()
208  // methods
209  ArrayT( ArrayDataStore*, const ArraySpec& );
210 
211  virtual size_t footprint() const;
212 
213  virtual bool accMap() const;
214 
215 private:
216  template <typename T>
217  friend class ArrayT_impl;
218  mutable bool acc_map_{false};
219 };
220 
221 extern template class ArrayT<float>;
222 extern template class ArrayT<double>;
223 extern template class ArrayT<int>;
224 extern template class ArrayT<long>;
225 
226 } // namespace array
227 } // namespace atlas
Definition: ArrayShape.h:33
Definition: ArraySpec.h:27
Definition: Array.h:32
Definition: ArrayShape.h:23
Definition: ArrayStrides.h:23
Definition: Object.h:18
Definition: ArrayUtil.h:46
Definition: DataType.h:40
Forward declarations of public API header atlas/array.h.
Definition: Array.h:37
Contains all atlas classes and methods.
Definition: atlas-grids.cc:33
long idx_t
Integer type for indices in connectivity tables.
Definition: config.h:42
Definition: Array.h:30
Definition: ArrayLayout.h:22