#ifndef __DISTRIBUTED_VIEW_HPP__ #define __DISTRIBUTED_VIEW_HPP__ #include "xios_spl.hpp" #include "array_new.hpp" #include "element_view.hpp" namespace xios { class CDistributedElement; class CDistributedView : public CElementView { public: CDistributedView(shared_ptr parent, CElementView::type type, const std::map>& indexView) ; CDistributedView(shared_ptr parent, CElementView::type type, const std::map>& maskView) ; std::map>& getIndex(void) { return index_ ;} std::map>& getGlobalIndex(void) { return globalIndex_ ;} std::map& getSize(void) { return size_ ;} std::map& getLocalSize(void) { return localSize_ ;} size_t getGlobalSize(void) { return globalSize_ ;} void getGlobalIndexView(map>& globalIndexView) { for(auto& it : globalIndex_) { int rank=it.first ; auto& globalIndex = it.second; auto& globalIndView = globalIndexView[rank] ; auto& index = index_[rank] ; auto& size = size_[rank] ; auto& localSize = localSize_[rank] ; globalIndView.resize(size) ; int pos=0 ; for(int i=0 ; i=0 && index(i)& globalIndex, size_t sliceIndex, size_t* sliceSize, shared_ptr* view, int pos) { // using map can be expensive, find an otherway later auto& globalInd=globalIndex_[rank] ; int localSize=globalInd.numElements() ; auto& index=index_[rank] ; int size=index.numElements() ; if (pos==0) { for(int i=0;i=0 && index(i)=0 && index(i)getGlobalIndex(rank, globalIndex, sliceIndex + globalInd(index(i))*sliceSize[pos], sliceSize, view , pos-1) ; } } protected: std::map> index_ ; std::map size_; std::map>& globalIndex_ ; size_t& globalSize_ ; std::map& localSize_ ; } ; } #endif