[1918] | 1 | #include "local_view.hpp" |
---|
| 2 | #include "element.hpp" |
---|
| 3 | #include "array_new.hpp" |
---|
| 4 | #include "remote_connector.hpp" |
---|
[2385] | 5 | #include "grid_transform_connector.hpp" |
---|
[1918] | 6 | |
---|
| 7 | namespace xios |
---|
| 8 | { |
---|
[2267] | 9 | CLocalView::CLocalView(shared_ptr<CLocalElement> parent, CElementView::type type, const CArray<int,1>& indexView) |
---|
[1918] | 10 | : CDistributedView( parent, type, {{ parent->localRank_, indexView }} ), |
---|
| 11 | localRank_(parent->localRank_), |
---|
| 12 | globalIndex_(parent->globalIndex_), size_(CDistributedView::size_[parent->localRank_]), |
---|
| 13 | index_(CDistributedView::index_[parent->localRank_]), localSize_(CDistributedView::localSize_[parent->localRank_]) |
---|
| 14 | { |
---|
| 15 | |
---|
| 16 | } |
---|
| 17 | |
---|
[2267] | 18 | CLocalView::CLocalView(shared_ptr<CLocalElement> parent, CElementView::type type, const CArray<bool,1>& maskView) |
---|
[1930] | 19 | : CDistributedView( parent, type, {{ parent->localRank_, maskView }} ), |
---|
| 20 | localRank_(parent->localRank_), |
---|
| 21 | globalIndex_(parent->globalIndex_), size_(CDistributedView::size_[parent->localRank_]), |
---|
| 22 | index_(CDistributedView::index_[parent->localRank_]), localSize_(CDistributedView::localSize_[parent->localRank_]) |
---|
| 23 | { |
---|
[1918] | 24 | |
---|
[1930] | 25 | } |
---|
| 26 | |
---|
[2267] | 27 | void CLocalView::sendRemoteElement(shared_ptr<CRemoteConnector> connector, CContextClient* client, CEventClient& event, const CMessage& messageHeader) |
---|
[1918] | 28 | { |
---|
| 29 | int n = index_.numElements() ; |
---|
| 30 | int nglo=globalIndex_.numElements() ; |
---|
| 31 | CArray<size_t,1> ind(n) ; |
---|
| 32 | for(int i=0; i<n;i++) |
---|
| 33 | { |
---|
| 34 | if (index_(i)>=0 && index_(i)<nglo) ind(i) = globalIndex_(index_(i)) ; |
---|
| 35 | else ind(i)=index_(i) ; |
---|
| 36 | } |
---|
| 37 | CMessage message(messageHeader) ; |
---|
| 38 | message<<globalSize_ ; |
---|
[2267] | 39 | connector->transferToServer(ind, client, event, message) ; |
---|
[1918] | 40 | } |
---|
[2385] | 41 | |
---|
| 42 | void CLocalView::createWithoutRedundancyFullViewConnector( int globalSize, MPI_Comm comm_file, shared_ptr<CGridTransformConnector>& gridTransformConnector, CArray<size_t,1>& globalIndex ) |
---|
| 43 | { |
---|
| 44 | int comm_file_rank(0); |
---|
| 45 | MPI_Comm_rank( comm_file, &comm_file_rank ); |
---|
| 46 | int comm_file_size(1); |
---|
| 47 | MPI_Comm_size( comm_file, &comm_file_size ); |
---|
[1918] | 48 | |
---|
[2385] | 49 | vector<shared_ptr<CLocalView>> srcViews; |
---|
| 50 | shared_ptr<CLocalView> srcView = shared_from_this(); |
---|
| 51 | srcViews.push_back( srcView ); |
---|
| 52 | |
---|
| 53 | // Compute a without redundancy element FULL view to enable a consistent hash computation |
---|
| 54 | vector<shared_ptr<CLocalView>> remoteViews; |
---|
| 55 | shared_ptr<CLocalView> remoteView; |
---|
| 56 | // define the remote view without redundancy (naive distribution of the remote view) |
---|
| 57 | int localSize = globalSize/comm_file_size; |
---|
| 58 | if ( (comm_file_rank==comm_file_size-1) && (localSize*comm_file_size != globalSize ) ) |
---|
| 59 | localSize += globalSize-localSize*comm_file_size; |
---|
| 60 | globalIndex.resize( localSize ); |
---|
| 61 | CArray<int,1> index( localSize ); |
---|
| 62 | for (int iloc=0; iloc<localSize ; iloc++ ) |
---|
| 63 | { |
---|
| 64 | globalIndex(iloc) = comm_file_rank*(globalSize/comm_file_size) + iloc; |
---|
| 65 | index(iloc) = iloc; |
---|
| 66 | } |
---|
| 67 | shared_ptr<CLocalElement> localElement = make_shared<CLocalElement>(comm_file_rank, globalSize, globalIndex) ; |
---|
| 68 | localElement->addView(CElementView::FULL, index) ; |
---|
| 69 | remoteView = localElement->getView(CElementView::FULL) ; |
---|
| 70 | remoteViews.push_back( remoteView ); |
---|
| 71 | |
---|
| 72 | // Compute the connector between current and without redundancy FULL views |
---|
| 73 | gridTransformConnector = make_shared<CGridTransformConnector>(srcViews, remoteViews, comm_file ) ; |
---|
| 74 | gridTransformConnector->computeConnector(true) ; // eliminateRedondant = true |
---|
[1918] | 75 | |
---|
[2385] | 76 | } |
---|
| 77 | |
---|
| 78 | } |
---|