#include "grid_transform_connector.hpp" #include "element.hpp" #include "scatterer_connector.hpp" #include "gatherer_connector.hpp" #include "grid_remote_connector.hpp" namespace xios { void CGridTransformConnector::computeConnector(bool eliminateRedundant) { int commSize ; int commRank ; MPI_Comm_size(localComm_, &commSize) ; MPI_Comm_rank(localComm_, &commRank) ; int nElements = srcViews_.size() ; auto remoteConnector = make_shared(srcViews_, remoteViews_, localComm_, commSize) ; remoteConnector->computeConnector(eliminateRedundant) ; vector> sendElements(nElements) ; scattererConnector_.resize(nElements) ; gathererConnector_.resize(nElements) ; for(int i=0;i(srcViews_[i]->getGlobalSize(), remoteConnector->getDistributedGlobalIndex(i)) ; sendElements[i]->addFullView() ; scattererConnector_[i] = make_shared(srcViews_[i], sendElements[i]->getView(CElementView::FULL), localComm_, commSize) ; scattererConnector_[i]->computeConnector() ; std::map>& sendIndex = sendElements[i]->getGlobalIndex() ; // how much sender ? vector nbSenders(commSize) ; int nbSender ; for(auto& it : sendIndex) nbSenders[it.first]=1 ; vector recvCounts(commSize,1) ; MPI_Reduce_scatter(nbSenders.data(), &nbSender, recvCounts.data(), MPI_INT, MPI_SUM, localComm_) ; // transfer global index // send Index vector sendReq ; for(auto& it : sendIndex) { MPI_Request req ; MPI_Isend(it.second.dataFirst(), it.second.numElements(), MPI_SIZE_T, it.first,0, localComm_, &req) ; sendReq.push_back(req) ; } // receive index map> recvIndex ; for(int j=0; j recvBuff(size) ; MPI_Recv(recvBuff.data(), size, MPI_SIZE_T, status.MPI_SOURCE,0, localComm_,&status) ; if (size!=0) { CArray arrayTmp(recvBuff.data(), shape(recvBuff.size()), duplicateData) ; recvIndex[status.MPI_SOURCE].reference(arrayTmp) ; } else { CArray arrayTmp(0) ; recvIndex[status.MPI_SOURCE].reference(arrayTmp) ; } if (recvRankSize_.count(status.MPI_SOURCE)==0) recvRankSize_[status.MPI_SOURCE] = size ; else recvRankSize_[status.MPI_SOURCE] *= size ; } vector sendStatus(sendReq.size()) ; MPI_Waitall(sendReq.size(),sendReq.data(),sendStatus.data()) ; // create gatherer connector auto recvElement = make_shared(remoteViews_[i]->getGlobalSize(), recvIndex) ; recvElement->addFullView() ; gathererConnector_[i] = make_shared(recvElement->getView(CElementView::FULL), remoteViews_[i]) ; gathererConnector_[i]->computeConnector() ; } gridScattererConnector_ = make_shared(scattererConnector_) ; gridGathererConnector_ = make_shared(gathererConnector_) ; } }