16 , nLocal_(), nGlob_(), nBeginLocal_(), nBeginGlobal_()
17 , dataNIndex_(), dataDims_(), dataBegin_(), dataIndex_()
18 , gridMask_(), indexMap_()
19 , isDataDistributed_(true), axisNum_(0), domainNum_(0)
20 , localDataIndex_(), localMaskIndex_()
21 , globalLocalDataSendToServerMap_()
22 , infoIndex_(), isComputed_(false)
23 , elementLocalIndex_(), elementGlobalIndex_(), elementIndexData_()
24 , elementNLocal_(), elementNGlobal_()
37 std::vector<int> void3 ;
38 std::vector<bool> void4 ;
54 std::vector<CDomain*> domList = grid->
getDomains();
55 std::vector<CAxis*> axisList = grid->
getAxis();
56 std::vector<CScalar*> scalarList = grid->
getScalars();
62 int gridDim = domList.size() * 2 + axisList.size();
107 const std::vector<CAxis*>& axisList,
108 const std::vector<CScalar*>& scalarList,
126 if (2 == axisDomainOrder(i))
150 int domIndex = 0, axisIndex = 0, scalarIndex = 0;
160 size_t localSize = 1, globalSize = 1;
166 int eleDim = axisDomainOrder(idx);
193 dataNIndex_.at(idx) = domList[domIndex]->data_i_index.numElements();
194 dataDims_.at(idx) = domList[domIndex]->data_dim.getValue();
202 else if (1 == eleDim)
212 dataNIndex_.at(idx) = axisList[axisIndex]->data_index.numElements();
260 int iIdx, jIdx = 0,
count = 0, localIndex;
281 for (
int j = 0; j < dataNIndex_[i]; ++j)
283 if (tmpIndexElementData(j))
310 int iIdx = 0,
count = 0;
328 for (
int j = 0; j < dataNIndex_[i]; ++j)
330 if (tmpIndexElementData(j))
380 int idxDomain = 0, idxAxis = 0;
390 std::vector<StdSize> idxLoop(numElement_,0);
391 std::vector<StdSize> currentIndex(numElement_,0);
392 std::vector<StdSize> currentGlobalIndex(numElement_,0);
393 int innerLoopSize = eachElementSize[0];
394 size_t idx = 0, indexLocalDataOnClientCount = 0;
397 for (
int i = 0; i <
numElement_; ++i) ssize *= eachElementSize[i];
407 idxLoop.assign(numElement_,0);
408 idx = indexLocalDataOnClientCount = 0;
411 int countLocalData = 0;
412 std::vector<int> correctIndexOfElement(numElement_,0);
413 bool isOuterIndexCorrect =
true;
416 for (
int i = 0; i < numElement_-1; ++i)
421 correctIndexOfElement[i] = 0;
423 if (isOuterIndexCorrect) ++correctIndexOfElement[i+1];
429 bool isIndexElementDataCorrect =
true;
436 isIndexElementDataCorrect &=
true;
438 else isIndexElementDataCorrect =
false;
441 isOuterIndexCorrect = isIndexElementDataCorrect;
443 if (isOuterIndexCorrect)
446 int correctIndexInnerElement = 0;
447 for (
int i = 0; i < innerLoopSize; ++i)
449 bool isCurrentIndexDataCorrect = isOuterIndexCorrect;
454 isCurrentIndexDataCorrect &=
true;
455 ++correctIndexInnerElement;
457 else isCurrentIndexDataCorrect =
false;
459 if (isCurrentIndexDataCorrect)
462 bool maskGridTmp =
true;
463 size_t globalIndex = 0;
476 int gridMaskIndex = 0;
488 ++indexLocalDataOnClientCount;
492 correctIndexOfElement[0] = correctIndexInnerElement;;
495 else countLocalData+=innerLoopSize ;
497 idxLoop[0] += innerLoopSize;
498 idx += innerLoopSize;
521 const int& dataIBegin,
const int& dataJBegin,
522 const int& dataDim,
const int& ni,
int& j)
525 int tempI = dataIIndex + dataIBegin,
526 tempJ = (dataJIndex + dataJBegin);
533 if ((tempI < 0) || (tempJ < 0))
541 i = (dataDim == 1) ? (tempI) % ni : (tempI) ;
542 j = (dataDim == 1) ? (tempI) / ni : (tempJ) ;
560 int tempI = dataIndex;
561 if ((tempI < 0) || (tempI > ni))
const std::vector< int > & getLocalMaskedDataIndexOnClient()
Return local mask index of client.
virtual ~CDistributionClient()
void createLocalDomainDataIndex()
Create local index of a domain.
void readGridMaskInfo(const CArray< bool, N > &gridMask)
A grid can have multiple dimension, so can its mask in the form of multi-dimension array...
void createLocalScalarDataIndex()
Create local index of a scalar.
std::vector< int > indexMap_
Mapping element index to dimension index.
void createLocalAxisDataIndex()
Create local index of an axis.
std::vector< size_t > elementNLocal_
virtual const std::vector< int > & getLocalDataIndexOnClient()
Return local data index of client.
std::vector< size_t > elementNGlobal_
(Only for grid with one axis or scalar)Flag to determine whether data is distributed or not ...
The parent class of CDistributionClient and CDistributionServer, which declares and defines some basi...
std::vector< int > localMaskedDataIndex_
CArray< int, 1 > & i_index
GlobalLocalDataMap & getGlobalLocalDataSendToServer()
Return global local data mapping of client.
std::vector< CArray< int, 1 > > infoIndex_
i_index, j_index
std::vector< CArray< int, 1 > > elementLocalIndex_
Local index of each element.
CArray< int, 1 > axisDomainOrder_
Order of axis and domain of a grid.
std::vector< int > localDataIndex_
Array holding masked data indexes.
std::vector< int > dataBegin_
Data begin (data_ibegin, data_jbegin, etc)
std::vector< CDomain * > getDomains()
Get the list of domain pointers.
std::vector< CScalar * > getScalars()
Get the list of axis pointers.
GlobalLocalDataMap & getGlobalDataIndexOnClient()
void readDistributionInfo(CGrid *grid)
Read information of a grid to generate distribution.
static int getAxisIndex(const int &dataIndex, const int &dataBegin, const int &ni)
Retrieve index of an axis from its data index.
GlobalLocalDataMap globalDataIndex_
std::vector< int > dataNIndex_
Data_n_index in case of domain.
std::vector< CArray< bool, 1 > > elementIndexData_
// The correct index of a domain has true value, the ghost one has false value
std::vector< CAxis * > getAxis()
Get the list of axis pointers.
virtual bool isEmpty(void) const
CArray< bool, 1 > gridMask_
Mask of grid.
CDistributionClient(int rank, CGrid *grid)
std::vector< int > nGlob_
Global size of each dimension (e.x: ni_glo, nj_glo, etc, ...)
std::vector< int > nBeginLocal_
Begin index of each dimension (e.x: for domain, it's always 0, for axis, it's zoom_begin, ...)
int numElement_
Domains and axis are considered elements.
std::vector< bool > localMaskIndex_
Array holding grid mask.
std::vector< int > nLocal_
Local size of each dimension (ni, nj, etc, ...)
void createGlobalIndexSendToServer()
Create global index on client In order to do the mapping between client-server, each client creates i...
GlobalLocalDataMap globalLocalDataSendToServerMap_
< LocalData index on client
void createGlobalIndex()
clear heavy sized attibutes
std::vector< int > dataDims_
Data_dim, domain can have data_dim == 1 or 2.
std::vector< CArray< size_t, 1 > > elementGlobalIndex_
Global index of each element.
Index distribution on client side.
std::unordered_map< size_t, int > GlobalLocalMap
std::vector< int > nBeginGlobal_
Begin index of each dimension (e.x: ibegin, jbegin, ...)
CDistribution::GlobalLocalMap GlobalLocalDataMap
const std::vector< bool > & getLocalMaskIndexOnClient()
Return local mask index of client.
static int getDomainIndex(const int &dataIIndex, const int &dataJIndex, const int &dataIBegin, const int &dataJBegin, const int &dataDim, const int &ni, int &j)
Retrieve index i and index j of a domain from its data index Data contains not only true data...
std::vector< CArray< int, 1 > > dataIndex_
Data index.