1#ifndef __Fiber_MultiIndex_HPP
2#define __Fiber_MultiIndex_HPP
4#include <eagle/vecmath.hpp>
5#include <eagle/Assignment.hpp>
6#include <eagle/Operator.hpp>
7#include <eagle/FixedArray.hpp>
8#include <eagle/DomainVector.hpp>
94 Iteratable = this->
inc(Size);
122 : idx(M.idx + D.maxidx() )
126 : idx(M.idx - D.maxidx() )
130 : idx(M.idx * D.maxidx() )
134 : idx(M.idx / D.maxidx() )
138 : idx( (bits & 1) ? 1 : 0 )
142 : idx( M.idx > D.maxidx() ? M.idx - D.maxidx() : D.maxidx() - M.idx )
199 if (idx<
B.idx)
return +1;
200 if (idx>
B.idx)
return -1;
204 constexpr const Index&
operator[](
int)
const noexcept
211 constexpr const Index&maxidx() const noexcept
214 constexpr Index&maxidx() noexcept
217 constexpr Index
size() const noexcept
243 retval.idx =
clamp(M.idx, D.idx);
250 retval.idx =
clamp(M.idx, D.idx-1);
256 {
return idx == D.idx; }
261 return idx != D.maxidx();
267 if (idx >=
Dimens.maxidx() )
278 if (idx >= Dimens.maxidx() )
292 return maxidx() < Range.maxidx();
296#if defined(_IOSTREAM_) || defined(_GLIBCXX_OSTREAM) || _CPP_IOSTREAM || defined(__SGI_STL_IOSTREAM) || defined(__clang__)
300 {
return os << idx; }
305 return MI.print(os,
'x');
310template <
class Functor, Dims_t SuperDims>
311static bool ForEachRecursion(Functor&F,
const MultiIndex<SuperDims>&SuperIndex,
314 for(index_t idx = Start.idx; idx < End.idx; idx += Increment.idx)
316 MultiIndex<SuperDims+1> SupraIndex(SuperIndex, idx);
329template <Dims_t Dims>
342 , idx(M.idx + D.maxidx())
348 , idx(M.idx - D.maxidx())
354 , idx(M.idx * D.maxidx())
360 , idx(M.idx / D.maxidx())
365 , idx( bits & (1<<(Dims-1)) ? 1 : 0 )
370 , idx( M.idx > D.maxidx() ? M.idx - D.maxidx() : D.maxidx() - M.idx )
374 : base_t(M, Power2Alignment() )
384 for(
int i=0; i<Dims; i++)
500 if (N & (1<<(Dims-1) ) )
503 return base_t::log2(N);
550 if (idx<
B.idx)
return +Dims;
551 if (idx>
B.idx)
return -
int(Dims);
552 return subidx().getSignedOrientation(
B.subidx() );
577 for(
int i=0, k=0; i<Dims; i++)
628 {
return (i>=Dims-1) ? idx :
subidx()[i]; }
634 {
return (i>=Dims-1) ? idx :
subidx()[i]; }
646 constexpr index_t&maxidx() noexcept
652 return idx*
subidx().size();
664 return idx == M.maxidx() &&
subidx() == M.subidx() ;
712 if ( idx >=
Dimens.maxidx() )
732 if ( idx >=
Dimens.maxidx() )
749 if (!(idx >= 0 && idx <
Dimens.maxidx() ))
768#if defined(_IOSTREAM_) || defined(_GLIBCXX_OSTREAM) || _CPP_IOSTREAM || defined(__SGI_STL_IOSTREAM) || defined(__clang__)
772 base_t::print(
os,
sep);
773 return os <<
sep << idx;
779 return MI.print(os,
'x');
787 return maxidx() <
Range.maxidx() &&
867template <
class Functor, Dims_t SuperDims>
882template <
class Functor>
885 for(index_t idx = Start.idx; idx < End.idx; idx += Increment.idx)
887 MultiIndex<1> SupraIndex(idx);
888 if (!MultiIndex<Dims-1>::ForEachRecursion(F, SupraIndex, Start, End, Increment) )
896inline constexpr MultiIndex<1> MIndex(index_t i0)
903inline constexpr MultiIndex<2> MIndex(index_t i0, index_t i1)
911inline constexpr MultiIndex<3> MIndex(index_t i0, index_t i1, index_t i2)
918inline constexpr MultiIndex<4> MIndex(index_t i0, index_t i1, index_t i2, index_t i3)
920 return {i0, i1, i2, i3};
926#if defined(_IOSTREAM_) || defined(_GLIBCXX_OSTREAM) || _CPP_IOSTREAM || defined(__SGI_STL_IOSTREAM) || defined(__clang__)
927template <Dims_t Dims>
930 return M.print( os<<
'[',
',') <<
']' ;
939template <Dims_t Dims>
944 for(
Dims_t i=0; i<Dims; i++)
969template <
class VectorType,
class Domain,
class scalar_t>
1006template <
class VectorType,
class Domain,
class scalar_t>
1031template <Dims_t Dims>
1037 for(Dims_t i=0; i<Dims; i++)
1051template <Dims_t Dims>
1062template <Dims_t Dims>
1069template <Dims_t Dims,
class Int>
1074 for(Dims_t i=0; i<Dims; i++)
1081template <Dims_t Dims,
class Int>
1082inline MultiIndex<Dims>&
operator*=(MultiIndex<Dims>&M,
Int Factor)
1084 for(Dims_t i=0; i<Dims; i++)
1091template <Dims_t Dims,
class Int>
1092inline MultiIndex<Dims>
operator/(
const MultiIndex<Dims>&MIn,
Int Factor)
1094MultiIndex<Dims> M = MIn;
1096 for(Dims_t i=0; i<Dims; i++)
1103template <Dims_t Dims,
class Int>
1104inline MultiIndex<Dims>&
operator/=(MultiIndex<Dims>&M,
Int Factor)
1106 for(Dims_t i=0; i<Dims; i++)
1117template <Dims_t Dims>
1121 for(
Dims_t i=0; i<Dims; i++)
1131template <Dims_t Dims>
1135 for(
Dims_t i=0; i<Dims; i++)
1145template <Dims_t Dims>
1149 for(
Dims_t i=0; i<Dims; i++)
1159template <Dims_t Dims>
1162 for(
Dims_t i=0; i<Dims; i++)
1172template <Dims_t Dims>
1175 for(
Dims_t i=0; i<Dims; i++)
1186template <Dims_t Dims>
1191 for(Dims_t i=0; i<Dims; i++)
1192 result[i] = Value[i];
1201template <Dims_t Dims>
1202inline MultiIndex<Dims> FixedArrayToMultiIndex(
const FixedArray<int, Dims>&Value)
1204MultiIndex<Dims> result;
1206 for(Dims_t i=0; i<Dims; i++)
1207 result[i] = Value[i];
1215template <Dims_t Dims>
1216inline MultiIndex<Dims> minMultiIndex(
const MultiIndex<Dims>&
A,
const MultiIndex<Dims>&
B)
1218MultiIndex<Dims> result;
1220 for(Dims_t i=0; i<Dims; i++)
1222 result[i] =
A[i]<
B[i] ?
A[i] :
B[i];
1231template <Dims_t Dims>
1232inline MultiIndex<Dims> maxMultiIndex(
const MultiIndex<Dims>&
A,
const MultiIndex<Dims>&
B)
1234MultiIndex<Dims> result;
1236 for(Dims_t i=0; i<Dims; i++)
1238 result[i] =
A[i]>
B[i] ?
A[i] :
B[i];
1250template <Dims_t Dims>
1251 inline FixedArray<double, Dims> Modulo(
double*a,
double range=1.0)
1253 FixedArray<double, Dims> m;
1254 for(Dims_t i=0; i<Dims; i++)
1255 m[i] = fmod(a[i] , range);
1264template <Dims_t Dims>
1265 inline FixedArray<double, Dims> Modulo(
double*a,
double range=1.0)
1267 FixedArray<double, Dims> m;
1268 for(Dims_t i=0; i<Dims; i++)
1269 m[i] = fmod(a[i] , range);
1277template <Dims_t Dims>
1278 inline FixedArray<double, Dims> Modulo(
const FixedArray<double, Dims>&a,
const FixedArray<double, Dims>&range)
1280 MultiIndex<Dims, double> m;
1281 for(Dims_t i=0; i<Dims; i++)
1282 m[i] = fmod(a[i] , range[i]);
1292template <Fiber::Dims_t Dims>
1299 for(; i<Dims-1; i++)
1310#ifdef ENABLE_MEMCORE_ASSERT
1311#include <memcore/Verbose.hpp>
1317template <Dims_t Dims>
1321 if (!(idx >= 0 && idx <
Dimens.maxidx() ))
1323#ifdef ENABLE_MEMCORE_ASSERT
1324 Verbose(0) <<
"Index " << idx <<
" beyond allowed maximum " <<
Dimens.maxidx() <<
" out of " <<
Dimens;
1337return idx *
L + subidx().linear(
Dimens.subidx() );
constexpr complex< _Tp > & operator*=(const _Tp &)
constexpr complex< _Tp > operator/(const complex< _Tp > &__x, const complex< _Tp > &__y)
constexpr complex< _Tp > & operator/=(const _Tp &)
basic_ostream< char > ostream
constexpr const _Tp & clamp(const _Tp &__val, const _Tp &__lo, const _Tp &__hi)
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
MultiIndexIterator< 1 > end() const
End a ranged loop.
Definition MultiIndex.hpp:184
constexpr MultiIndex(const Index &I) noexcept
Initialize highest index.
Definition MultiIndex.hpp:161
bool operator!=(const MultiIndex &D) const noexcept
inequality comparision operator
Definition MultiIndex.hpp:259
constexpr MultiIndex(const Index &lin_idx, const MultiIndex &Dimens, const CreateFromLinear &)
Multidimensional Index - a linear Index with Dimensions.
Definition MultiIndex.hpp:173
constexpr MultiIndex(const MultiIndex &Midx, const Index &I) noexcept
Multidimensional index as product of subdimension and index.
Definition MultiIndex.hpp:166
MultiIndexIterator< 1 > begin() const
Begin a ranged loop.
Definition MultiIndex.hpp:178
constexpr MultiIndex() noexcept
Default constructor.
Definition MultiIndex.hpp:156
A recursively defined multidimensional index.
Definition MultiIndex.hpp:331
constexpr index_t & operator[](std::size_t i) noexcept
Indexing operator to access values for each dimension.
Definition MultiIndex.hpp:633
MultiIndex operator+(const MultiIndex &D) const noexcept
Add two multidimensional indices.
Definition MultiIndex.hpp:804
friend MultiIndex distance(const MultiIndex &M0, const MultiIndex &M1)
Compute the distance between two multiindices, which is always positive in each index (in contrast to...
Definition MultiIndex.hpp:425
index_t BitIndex() const
From this given multiindex which is supposed to have index values of either 0 or 1 in each direction,...
Definition MultiIndex.hpp:489
constexpr const MultiIndex< Dims-1 > & subidx() const noexcept
Return associated constant dimensionator of one dimension less.
Definition MultiIndex.hpp:615
index_t linear(const MultiIndex &Dimens) const
Compute the linear index from the given dimensionator.
Definition MultiIndex.hpp:1318
constexpr MultiIndex(const index_t &I) noexcept
Initialize all indices with same value.
Definition MultiIndex.hpp:561
constexpr MultiIndex(const MultiIndex< Dims-1 > &Midx, const index_t &I) noexcept
Multidimensional index as tensor product of subdimension and index.
Definition MultiIndex.hpp:566
constexpr MultiIndex(const std::array< index_t, Dims > &A)
Construct from std::array of same size.
Definition MultiIndex.hpp:382
bool inc(const MultiIndex &Dimens) noexcept
Increment the current index, if it is larger than the extent a given in the Dimensions parameter,...
Definition MultiIndex.hpp:706
MultiIndex operator&(int i) const
Shortcut operator to compute the MultiIndex that is just one step aside in the direction as specified...
Definition MultiIndex.hpp:829
MultiIndexIterator< Dims > begin() const
Begin a ranged loop.
Definition MultiIndex.hpp:407
constexpr MultiIndex< Dims-1 > & subidx() noexcept
Return associated dimensionator of one dimension less.
Definition MultiIndex.hpp:619
constexpr MultiIndex(const index_t &lin_idx, const MultiIndex &Dimens, const CreateFromLinear &)
Create multidimensional index from one-dimensional index, given the multidimensional dimension on whe...
Definition MultiIndex.hpp:609
friend MultiIndex operator|(const MultiIndex &M, int i)
Axis index subtraction operator, similar to adding an integer to a multidimensional index,...
Definition MultiIndex.hpp:850
constexpr MultiIndex(const std::initializer_list< index_t > &A)
Construct from set of indices.
Definition MultiIndex.hpp:394
MultiIndex & operator-=(const MultiIndex &D) noexcept
component-wise self-subtraction
Definition MultiIndex.hpp:676
constexpr int getSignedOrientation(const MultiIndex &B) const
Returns the dimension, starting with 1, in which this multidimensional index is non-zero.
Definition MultiIndex.hpp:548
bool isWithin(const MultiIndex &Range) const noexcept
Check whether this multidimensional index is within the specified domain.
Definition MultiIndex.hpp:784
Eagle::Assignment< MultiIndex, 0 > operator=(const index_t &i)
Assignment via comma operator.
Definition MultiIndex.hpp:638
MultiIndexIterator< Dims > end() const
End a ranged loop.
Definition MultiIndex.hpp:413
MultiIndex operator-(const MultiIndex &D) const noexcept
Subtract multidimensional indices.
Definition MultiIndex.hpp:808
constexpr MultiIndex() noexcept
Default constructor (initialization by zero)
Definition MultiIndex.hpp:556
bool operator<(const MultiIndex &Range) const noexcept
Check if the current multiindex is smaller than the range.
Definition MultiIndex.hpp:792
static int log2(index_t N) noexcept
Logarithm of basis 2 where we expect a maximum value of 1<<(Dims-1) here.
Definition MultiIndex.hpp:498
constexpr const index_t & operator[](std::size_t i) const
Indexing operator to access values for each dimension.
Definition MultiIndex.hpp:627
MultiIndex & operator+=(const MultiIndex &D) noexcept
component-wise self-addition
Definition MultiIndex.hpp:668
MultiIndex operator/(const MultiIndex &D) const noexcept
Divide multidimensional indices component-wise.
Definition MultiIndex.hpp:816
constexpr bool operator!=(const MultiIndex &D) const noexcept
inequality comparision operator
Definition MultiIndex.hpp:656
MultiIndex operator*(const MultiIndex &D) const noexcept
Multiply multidimensional indices component-wise.
Definition MultiIndex.hpp:812
constexpr MultiIndex(const MultiIndex< Dims-1 > &m, const index_t &Slice, int SliceDirection)
Multidimensional index as product of subdimension and index for a given slice dimension (create globa...
Definition MultiIndex.hpp:575
@ SIZE
Export an SIZE enum for treatment like an FixedArray.
Definition MultiIndex.hpp:536
@ dims
The dimension of this multidimensional index.
Definition MultiIndex.hpp:533
static MultiIndex BitIndex(unsigned int bits) noexcept
Multidimensional bit indices, that are zero or one in each of the directions as specified by the bits...
Definition MultiIndex.hpp:454
index_t size() const noexcept
Recursive function to compute the entire number of elements.
Definition MultiIndex.hpp:650
bool operator>(const MultiIndex &Range) const noexcept
Check if the current multiindex is larger than the range.
Definition MultiIndex.hpp:798
constexpr MultiIndex(const MultiIndex &M, const MultiIndex &D, const Sub &) noexcept
Computational constructor for subtracting two multidimensional indices.
Definition MultiIndex.hpp:346
constexpr bool operator==(const MultiIndex &M) const noexcept
comparison operator
Definition MultiIndex.hpp:662
constexpr MultiIndex(const MultiIndex &M, const MultiIndex &D, const Add &) noexcept
Computational constructor for adding two multidimensional indices.
Definition MultiIndex.hpp:340
index_t Orientation() const noexcept
Given a MultiIndex that only contains one element of value 1, all others being zero (such as one crea...
Definition MultiIndex.hpp:525
bool inc(const MultiIndex &Dimens, const MultiIndex &Increment) noexcept
Increment the current index by a certain increment.
Definition MultiIndex.hpp:726
constexpr MultiIndex(const MultiIndex &M, const MultiIndex &D, const Div &)
Computational constructor for component-wise division of two multidimensional indices.
Definition MultiIndex.hpp:358
constexpr MultiIndex(const MultiIndex &M, const MultiIndex &D, const Mult &) noexcept
Computational constructor for component-wise multiplication of two multidimensional indices.
Definition MultiIndex.hpp:352
static MultiIndex Axis(unsigned int orientation) noexcept
Return a MultiIndex that points just in the given orientation.
Definition MultiIndex.hpp:469
Information per time slice, mainly a set of Grid objects that are accessed via GridID objects.
Definition Slice.hpp:36
Anemone_Context_t operator<<(Anemone &A, VRenderContext &VC)
constexpr FixedArray< double, Dims > div(const MultiIndex< Dims > &Divisor, const MultiIndex< Dims > &Dividend)
Compute the rational division of two MultiIndex es.
Definition MultiIndex.hpp:940
MultiIndex< Dims > operator+(index_t C, const MultiIndex< Dims > &I)
Add constant plus multi-index.
Definition MultiIndex.hpp:1052
FixedArray< double, Dims > operator*(const FixedArray< double, Dims > &a, const MultiIndex< Dims > &I)
Component-wise multiplication.
Definition MultiIndex.hpp:1118
Eagle::DomainVector< VectorType, Domain, scalar_t > CellSize0(const Eagle::DomainVector< VectorType, Domain, scalar_t > &V, const MultiIndex< VectorType::SIZE > &Dividend, const MultiIndex< VectorType::SIZE > &Stride=MultiIndex< VectorType::SIZE >(1))
Compute the size of a "cell" given a distance between a set of points.
Definition MultiIndex.hpp:1008
FixedArray< double, Dims > & operator*=(FixedArray< double, Dims > &a, const MultiIndex< Dims > &I)
Component-wise multiplication.
Definition MultiIndex.hpp:1173
FixedArray< double, Dims > operator*(const MultiIndex< Dims > &I, const FixedArray< double, Dims > &a)
Component-wise multiplication.
Definition MultiIndex.hpp:1132
MultiIndex< Dims > operator+(const MultiIndex< Dims > &I, index_t C)
Add multi-index plus constant.
Definition MultiIndex.hpp:1063
FixedArray< double, Dims > operator/(const FixedArray< double, Dims > &a, const MultiIndex< Dims > &I)
Component-wise division.
Definition MultiIndex.hpp:1146
FixedArray< double, Dims > & operator/=(FixedArray< double, Dims > &a, const MultiIndex< Dims > &I)
Component-wise division.
Definition MultiIndex.hpp:1160
Eagle::DomainVector< VectorType, Domain, scalar_t > CellSize(const Eagle::DomainVector< VectorType, Domain, scalar_t > &V, const MultiIndex< VectorType::SIZE > &Dividend, const MultiIndex< VectorType::SIZE > &Stride=MultiIndex< VectorType::SIZE >(1))
Compute the size of a "cell" given a distance between a set of points.
Definition MultiIndex.hpp:971
Column< C, Value > operator*(const Column< C, Value > &A, double V)
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
constexpr index_t RoundUpToNextHighestPowerOf2(index_t v)
Align a value to the next fitting power of 2.
Definition Index.hpp:43
IndexTypeConfig< sizeof(void *)>::index_t index_t
Define the index type as according to the size of a pointer, i.e.
Definition Index.hpp:22
void breakpoint(const char *Description)
std::string to_string(const span< char > &s)
string to_string(const Eagle::FixedArray< ElementType, N > &A, const char *OpenBrace="{", const char *CloseBrace="}", const char *Separator=",")
A helper class to be used for multilinear index construction.
Definition MultiIndex.hpp:54
Definition MultiIndex.hpp:77
Definition MultiIndex.hpp:56