Changeset 676 for XIOS/trunk/src/node/grid.cpp
- Timestamp:
- 08/25/15 16:52:45 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/grid.cpp
r671 r676 25 25 : CObjectTemplate<CGrid>(), CGridAttributes() 26 26 , isChecked(false), isDomainAxisChecked(false) 27 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 28 , serverDistribution_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 29 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 27 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false) 28 , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 29 , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 30 , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 31 , transformations_(0), isTransformed_(false) 30 32 , axisPositionInGrid_(), positionDimensionDistributed_(1) 31 33 { … … 37 39 : CObjectTemplate<CGrid>(id), CGridAttributes() 38 40 , isChecked(false), isDomainAxisChecked(false) 39 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 40 , serverDistribution_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 41 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 41 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false) 42 , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 43 , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 44 , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 45 , transformations_(0), isTransformed_(false) 42 46 , axisPositionInGrid_(), positionDimensionDistributed_(1) 43 47 { … … 149 153 } 150 154 155 //--------------------------------------------------------------- 156 157 /*! 158 * Test whether the data defined on the grid can be outputted in a compressed way. 159 * 160 * \return true if and only if a mask was defined for this grid 161 */ 162 bool CGrid::isCompressible(void) const 163 { 164 return isCompressible_; 165 } 166 167 //--------------------------------------------------------------- 168 169 void CGrid::addRelFileCompressed(const StdString& filename) 170 { 171 this->relFilesCompressed.insert(filename); 172 } 173 174 bool CGrid::isWrittenCompressed(const StdString& filename) const 175 { 176 return (this->relFilesCompressed.find(filename) != this->relFilesCompressed.end()); 177 } 178 179 //--------------------------------------------------------------- 180 151 181 void CGrid::solveDomainAxisRef(bool areAttributesChecked) 152 182 { … … 157 187 computeGridGlobalDimension(getDomains(), getAxis(), axis_domain_order); 158 188 this->isDomainAxisChecked = areAttributesChecked; 189 } 190 191 void CGrid::checkEligibilityForCompressedOutput() 192 { 193 // We don't check if the mask is valid here, just if a mask has been defined at this point. 194 isCompressible_ = !mask1.isEmpty() || !mask2.isEmpty() || !mask3.isEmpty(); 159 195 } 160 196 … … 488 524 } 489 525 526 void CGrid::outputCompressedField(int rank, const CArray<double,1>& stored, double* field) 527 { 528 const CArray<size_t,1>& out_i = compressedOutIndexFromClient[rank]; 529 StdSize numElements = stored.numElements(); 530 for (StdSize n = 0; n < numElements; ++n) 531 { 532 field[out_i(n)] = stored(n); 533 } 534 } 535 490 536 //---------------------------------------------------------------- 491 537 … … 518 564 } 519 565 isDataDistributed_ = false; 566 } 567 568 void CGrid::computeCompressedIndex() 569 { 570 compressedOutIndexFromClient = outIndexFromClient; 571 572 std::map<size_t, size_t> indexes; 573 574 { 575 std::map<int, CArray<size_t,1> >::const_iterator it = compressedOutIndexFromClient.begin(); 576 std::map<int, CArray<size_t,1> >::const_iterator itEnd = compressedOutIndexFromClient.end(); 577 for (; it != itEnd; ++it) 578 { 579 for (int i = 0; i < it->second.numElements(); ++i) 580 indexes.insert(std::make_pair(it->second(i), 0)); 581 } 582 } 583 584 { 585 std::map<size_t, size_t>::iterator it = indexes.begin(); 586 std::map<size_t, size_t>::iterator itEnd = indexes.end(); 587 for (size_t i = 0; it != itEnd; ++it, ++i) 588 it->second = i; 589 } 590 591 { 592 std::map<int, CArray<size_t,1> >::iterator it = compressedOutIndexFromClient.begin(); 593 std::map<int, CArray<size_t,1> >::iterator itEnd = compressedOutIndexFromClient.end(); 594 for (; it != itEnd; ++it) 595 { 596 for (int i = 0; i < it->second.numElements(); ++i) 597 it->second(i) = indexes[it->second(i)]; 598 } 599 } 520 600 } 521 601 … … 547 627 548 628 listMsg.push_back(CMessage()); 549 listMsg.back() << getId( )<< isDataDistributed_ << listOutIndex.back();629 listMsg.back() << getId( )<< isDataDistributed_ << isCompressible_ << listOutIndex.back(); 550 630 551 631 event.push(rank, 1, listMsg.back()); … … 589 669 590 670 listMsg.push_back(CMessage()); 591 listMsg.back() << getId() << isDataDistributed_ << listOutIndex.back();671 listMsg.back() << getId() << isDataDistributed_ << isCompressible_ << listOutIndex.back(); 592 672 593 673 event.push(rank, 1, listMsg.back()); … … 650 730 651 731 listMsg.push_back(CMessage()); 652 listMsg.back() << getId() << isDataDistributed_ << listOutIndex.back();732 listMsg.back() << getId() << isDataDistributed_ << isCompressible_ << listOutIndex.back(); 653 733 654 734 event.push(rank, nbSenders[rank], listMsg.back()); … … 741 821 } 742 822 823 /*! 824 Returns the number of indexes written by each server. 825 \return the number of indexes written by each server 826 */ 827 int CGrid::getNumberWrittenIndexes() const 828 { 829 return numberWrittenIndexes_; 830 } 831 832 /*! 833 Returns the total number of indexes written by the servers. 834 \return the total number of indexes written by the servers 835 */ 836 int CGrid::getTotalNumberWrittenIndexes() const 837 { 838 return totalNumberWrittenIndexes_; 839 } 840 841 /*! 842 Returns the offset of indexes written by each server. 843 \return the offset of indexes written by each server 844 */ 845 int CGrid::getOffsetWrittenIndexes() const 846 { 847 return offsetWrittenIndexes_; 848 } 849 743 850 const CDistributionServer* CGrid::getDistributionServer() const 744 851 { … … 762 869 CContext* context = CContext::getCurrent(); 763 870 CContextServer* server = context->server; 871 numberWrittenIndexes_ = totalNumberWrittenIndexes_ = offsetWrittenIndexes_ = 0; 764 872 765 873 for (int n = 0; n < ranks.size(); n++) … … 768 876 CBufferIn& buffer = *buffers[n]; 769 877 770 buffer >> isDataDistributed_ ;878 buffer >> isDataDistributed_ >> isCompressible_; 771 879 size_t dataSize = 0; 772 880 773 881 if (isScalarGrid()) 774 882 { 775 writtenDataSize_ = 1;883 writtenDataSize_ = numberWrittenIndexes_ = totalNumberWrittenIndexes_ = 1; 776 884 CArray<size_t,1> outIndex; 777 885 buffer >> outIndex; … … 849 957 outIndexFromClient.insert(std::make_pair(rank, outIndex)); 850 958 connectedDataSize_[rank] = outIndex.numElements(); 851 } 959 numberWrittenIndexes_ += outIndex.numElements(); 960 } 961 962 if (isDataDistributed_) 963 { 964 MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 965 MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 966 offsetWrittenIndexes_ -= numberWrittenIndexes_; 967 } 968 else 969 totalNumberWrittenIndexes_ = numberWrittenIndexes_; 852 970 853 971 nbSenders = CClientServerMappingDistributed::computeConnectedClients(context->client->serverSize, context->client->clientSize, context->client->intraComm, ranks);
Note: See TracChangeset
for help on using the changeset viewer.