29 #include <initializer_list> 31 #include "atlas/array.h" 33 #include "atlas/array/DataType.h" 35 #include "atlas/array/SVector.h" 36 #include "atlas/array/Vector.h" 38 #include "atlas/library/config.h" 39 #include "atlas/util/Object.h" 48 constexpr
size_t MAX_STRING_SIZE() {
52 template <
typename ConnectivityImpl>
54 using ConnectivityImpl::ConnectivityImpl;
55 using util::Object::Object;
65 #ifndef DOXYGEN_SHOULD_SKIP_THIS 66 #if ATLAS_HAVE_FORTRAN 67 #define INDEX_DEREF Index 68 #define INDEX_REF Index 69 #define FROM_FORTRAN -1 73 #define INDEX_REF idx_t& 116 ATLAS_HOST_DEVICE
void set(
const idx_t& value ) { *( idx_ ) = value + BASE; }
117 ATLAS_HOST_DEVICE
idx_t get()
const {
return *(idx_)-BASE; }
118 ATLAS_HOST_DEVICE
void operator=(
const idx_t& value ) {
set( value ); }
119 ATLAS_HOST_DEVICE ConnectivityIndex& operator+(
const idx_t& value ) {
123 ATLAS_HOST_DEVICE ConnectivityIndex& operator-(
const idx_t& value ) {
127 ATLAS_HOST_DEVICE ConnectivityIndex& operator--() {
131 ATLAS_HOST_DEVICE ConnectivityIndex& operator++() {
137 ATLAS_HOST_DEVICE
operator idx_t()
const {
return get(); }
145 #if ATLAS_HAVE_FORTRAN 148 using Index =
idx_t&;
154 template <
typename Int>
155 ATLAS_HOST_DEVICE
idx_t operator()( Int i )
const {
156 return data_[i] FROM_FORTRAN;
159 template <
typename Int>
160 ATLAS_HOST_DEVICE INDEX_REF operator()( Int i ) {
161 return INDEX_DEREF( data_ + i );
165 idx_t size()
const {
return size_; }
194 values_( other.values_ ),
195 displs_( other.displs_ ),
196 counts_( other.counts_ ),
197 missing_value_( other.missing_value_ ),
198 rows_( other.rows_ ),
199 maxcols_( other.maxcols_ ),
200 mincols_( other.mincols_ ),
212 const std::string
name()
const {
return std::string( name_ ); }
216 std::strncpy( name_, name.c_str(), std::max( name.size(), MAX_STRING_SIZE() ) );
240 idx_t size()
const {
return values_.size(); }
243 idx_t missing_value()
const {
return missing_value_; }
246 Row row(
idx_t row_idx )
const;
251 void set(
idx_t row_idx,
const idx_t column_values[] );
258 virtual void resize(
idx_t old_size,
idx_t size,
bool initialize,
const idx_t values[],
bool fortran_array );
262 virtual void add(
idx_t rows,
idx_t cols,
const idx_t values[],
bool fortran_array =
false );
270 virtual void add(
idx_t rows,
const idx_t cols[] );
277 virtual void insert(
idx_t position,
idx_t rows,
idx_t cols,
const idx_t values[],
bool fortran_array =
false );
287 virtual void clear();
289 virtual size_t footprint()
const;
291 idx_t displs(
const idx_t row )
const {
return displs_[row]; }
293 void dump( std::ostream& os )
const;
299 virtual void encode( eckit::Stream& s )
const { encode_( s ); }
300 virtual void decode( eckit::Stream& s ) { decode_( s ); }
303 bool owns() {
return owns_; }
304 const idx_t* displs()
const {
return displs_.data(); }
305 const idx_t* counts()
const {
return counts_.data(); }
308 void encode_( eckit::Stream& )
const;
311 void decode_( eckit::Stream& );
328 char name_[MAX_STRING_SIZE()];
336 idx_t missing_value_;
342 typedef void* ctxt_t;
343 typedef void ( *callback_t )( ctxt_t );
348 callback_t callback_update_;
349 callback_t callback_delete_;
429 virtual void add(
idx_t rows,
idx_t cols,
const idx_t values[],
bool fortran_array =
false );
442 virtual void add(
idx_t rows,
const idx_t cols[] );
446 virtual void insert(
idx_t position,
idx_t rows,
idx_t cols,
const idx_t values[],
bool fortran_array =
false );
456 virtual void clear();
458 virtual size_t footprint()
const;
460 virtual void encode( eckit::Stream& s )
const {
461 IrregularConnectivityImpl::encode_( s );
464 virtual void decode( eckit::Stream& s ) {
465 IrregularConnectivityImpl::decode_( s );
471 void encode_( eckit::Stream& )
const;
474 void decode_( eckit::Stream& );
487 void rebuild_block_connectivity();
539 values_( other.values_ ),
540 rows_( other.rows_ ),
541 cols_( other.cols_ ),
542 missing_value_( other.missing_value_ ) {}
580 idx_t* data() {
return values_.data(); }
583 idx_t missing_value()
const {
return missing_value_; }
585 size_t footprint()
const;
591 void set(
idx_t row_idx,
const idx_t column_values[] );
599 void add(
idx_t rows,
idx_t cols,
const idx_t values[],
bool fortran_array =
false );
601 bool owns()
const {
return owns_; }
616 void encode( eckit::Stream& )
const;
619 void decode( eckit::Stream& );
631 void print( std::ostream& )
const;
639 idx_t missing_value_;
649 inline idx_t IrregularConnectivityImpl::operator()(
idx_t row_idx,
idx_t col_idx )
const {
650 assert( counts_[row_idx] > ( col_idx ) );
651 return values_[displs_[row_idx] + col_idx] FROM_FORTRAN;
654 inline void IrregularConnectivityImpl::set(
idx_t row_idx,
const idx_t column_values[] ) {
655 const idx_t N = counts_[row_idx];
656 for (
idx_t n = 0; n < N; ++n ) {
657 values_[displs_[row_idx] + n] = column_values[n] TO_FORTRAN;
661 inline void IrregularConnectivityImpl::set(
idx_t row_idx,
idx_t col_idx,
const idx_t value ) {
662 assert( col_idx < counts_[row_idx] );
663 values_[displs_[row_idx] + col_idx] = value TO_FORTRAN;
668 counts_( row_idx ) );
673 inline idx_t MultiBlockConnectivityImpl::operator()(
idx_t row_idx,
idx_t col_idx )
const {
674 return IrregularConnectivityImpl::operator()( row_idx, col_idx );
677 inline idx_t MultiBlockConnectivityImpl::operator()(
idx_t block_idx,
idx_t block_row_idx,
idx_t block_col_idx )
const {
678 return block( block_idx )( block_row_idx, block_col_idx );
683 inline idx_t BlockConnectivityImpl::operator()(
idx_t row_idx,
idx_t col_idx )
const {
684 return values_[index( row_idx, col_idx )] FROM_FORTRAN;
687 inline void BlockConnectivityImpl::set(
idx_t row_idx,
const idx_t column_values[] ) {
688 for (
idx_t n = 0; n < cols_; ++n ) {
689 values_[index( row_idx, n )] = column_values[n] TO_FORTRAN;
693 inline void BlockConnectivityImpl::set(
idx_t row_idx,
idx_t col_idx,
const idx_t value ) {
694 values_[index( row_idx, col_idx )] = value TO_FORTRAN;
698 return i * cols_ + j;
706 const char* atlas__Connectivity__name(
Connectivity* This );
707 void atlas__Connectivity__rename(
Connectivity* This,
const char* name );
void rename(const std::string &name)
Rename this Connectivity.
Definition: Connectivity.h:215
Definition: Connectivity.cc:821
This file contains the IndexView class, a class that allows to wrap any contiguous raw data into a vi...
This file contains the ArrayView class, a class that allows to wrap any contiguous raw data into a vi...
Definition: Connectivity.h:53
void decode(eckit::Stream &)
Serialization from Stream.
Definition: Connectivity.cc:801
ATLAS_HOST_DEVICE idx_t blocks() const
Number of blocks.
Definition: Connectivity.h:405
ATLAS_HOST_DEVICE idx_t cols() const
Number of columns.
Definition: Connectivity.h:572
ATLAS_HOST_DEVICE idx_t rows() const
Number of rows in the connectivity table.
Definition: Connectivity.h:221
void encode(eckit::Stream &) const
Serialization to Stream.
Definition: Connectivity.cc:794
ATLAS_HOST_DEVICE idx_t mincols() const
Minimum value for number of columns over all rows.
Definition: Connectivity.h:233
ATLAS_HOST_DEVICE idx_t cols(idx_t row_idx) const
Number of columns for specified row in the connectivity table.
Definition: Connectivity.h:225
ATLAS_HOST_DEVICE const BlockConnectivityImpl & block(idx_t block_idx) const
Access to a block connectivity.
Definition: Connectivity.h:409
Definition: Connectivity.h:144
ATLAS_HOST_DEVICE idx_t rows() const
Number of rows.
Definition: Connectivity.h:568
Block Connectivity table.
Definition: Connectivity.h:515
ATLAS_HOST_DEVICE idx_t maxcols() const
Maximum value for number of columns over all rows.
Definition: Connectivity.h:229
Definition: Connectivity.h:106
Connectivity contiguously composed of multiple BlockConnectivityImpl.
Definition: Connectivity.h:388
const std::string name() const
Name associated to this Connetivity.
Definition: Connectivity.h:212
Forward declarations of public API header atlas/array.h.
Contains all atlas classes and methods.
Definition: atlas-grids.cc:33
ATLAS_HOST_DEVICE const idx_t * data() const
Access to raw data.
Definition: Connectivity.h:578
Definition: Connectivity.h:172
long idx_t
Integer type for indices in connectivity tables.
Definition: config.h:42