Ignore:
Timestamp:
11/25/17 00:19:11 (6 years ago)
Author:
oabramkina
Message:

Fixing a bug introduced in r1337.

toy_cnrmcm: ok.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/domain.cpp

    r1345 r1346  
    17181718      bool doComputeGlobalIndexServer = true; 
    17191719 
    1720       if (indSrv_.find(nbServer) == indSrv_.end()) 
    1721       { 
    1722          int i,j,i_ind,j_ind, nbIndex, nbIndexZoom; 
    1723          int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 
    1724          int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 
    1725  
    1726          // Precompute number of index 
    1727          int globalIndexCountZoom = 0; 
    1728          nbIndex = i_index.numElements(); 
    1729  
    1730          if (doZoomByIndex_) 
    1731          { 
    1732             globalIndexCountZoom = zoom_i_index.numElements(); 
    1733          } 
    1734          else 
    1735          { 
    1736             for (i = 0; i < nbIndex; ++i) 
    1737             { 
     1720      if (connectedServerRank_.find(nbServer) == connectedServerRank_.end()) 
     1721      { 
     1722 
     1723        if (indSrv_.find(nbServer) == indSrv_.end()) 
     1724        { 
     1725          int i,j,i_ind,j_ind, nbIndex, nbIndexZoom; 
     1726          int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 
     1727          int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 
     1728 
     1729           // Precompute number of index 
     1730           int globalIndexCountZoom = 0; 
     1731           nbIndex = i_index.numElements(); 
     1732 
     1733           if (doZoomByIndex_) 
     1734           { 
     1735             globalIndexCountZoom = zoom_i_index.numElements(); 
     1736           } 
     1737           else 
     1738           { 
     1739             for (i = 0; i < nbIndex; ++i) 
     1740             { 
    17381741               i_ind=i_index(i); 
    17391742               j_ind=j_index(i); 
     
    17431746                  ++globalIndexCountZoom; 
    17441747               } 
    1745             } 
    1746          } 
    1747  
    1748  
    1749          // Fill in index 
    1750          CArray<size_t,1> globalIndexDomainZoom(globalIndexCountZoom); 
    1751          CArray<size_t,1> localIndexDomainZoom(globalIndexCountZoom); 
    1752          CArray<size_t,1> globalIndexDomain(nbIndex); 
    1753          size_t globalIndex; 
    1754          int globalIndexCount = 0; 
    1755  
    1756          for (i = 0; i < nbIndex; ++i) 
    1757          { 
    1758             i_ind=i_index(i); 
    1759             j_ind=j_index(i); 
    1760             globalIndex = i_ind + j_ind * ni_glo; 
    1761             globalIndexDomain(i) = globalIndex; 
    1762          } 
    1763  
    1764          if (globalLocalIndexMap_.empty()) 
    1765          { 
    1766             for (i = 0; i < nbIndex; ++i) 
     1748             } 
     1749           } 
     1750 
     1751           // Fill in index 
     1752           CArray<size_t,1> globalIndexDomainZoom(globalIndexCountZoom); 
     1753           CArray<size_t,1> localIndexDomainZoom(globalIndexCountZoom); 
     1754           CArray<size_t,1> globalIndexDomain(nbIndex); 
     1755           size_t globalIndex; 
     1756           int globalIndexCount = 0; 
     1757 
     1758           for (i = 0; i < nbIndex; ++i) 
     1759           { 
     1760             i_ind=i_index(i); 
     1761             j_ind=j_index(i); 
     1762             globalIndex = i_ind + j_ind * ni_glo; 
     1763             globalIndexDomain(i) = globalIndex; 
     1764           } 
     1765 
     1766           if (globalLocalIndexMap_.empty()) 
     1767           { 
     1768             for (i = 0; i < nbIndex; ++i) 
    17671769               globalLocalIndexMap_[globalIndexDomain(i)] = i; 
    1768          } 
    1769  
    1770          globalIndexCountZoom = 0; 
    1771          if (doZoomByIndex_) 
    1772          { 
    1773             int nbIndexZoom = zoom_i_index.numElements(); 
    1774  
    1775             for (i = 0; i < nbIndexZoom; ++i) 
    1776             { 
     1770           } 
     1771 
     1772           globalIndexCountZoom = 0; 
     1773           if (doZoomByIndex_) 
     1774           { 
     1775             int nbIndexZoom = zoom_i_index.numElements(); 
     1776 
     1777             for (i = 0; i < nbIndexZoom; ++i) 
     1778             { 
    17771779               i_ind=zoom_i_index(i); 
    17781780               j_ind=zoom_j_index(i); 
     
    17801782               globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 
    17811783               ++globalIndexCountZoom; 
    1782             } 
    1783          } 
    1784          else 
    1785          { 
    1786             int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 
    1787             int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 
    1788             for (i = 0; i < nbIndex; ++i) 
    1789             { 
     1784             } 
     1785           } 
     1786           else 
     1787           { 
     1788             int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 
     1789             int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 
     1790             for (i = 0; i < nbIndex; ++i) 
     1791             { 
    17901792               i_ind=i_index(i); 
    17911793               j_ind=j_index(i); 
     
    17961798                  ++globalIndexCountZoom; 
    17971799               } 
    1798             } 
    1799  
    1800             int iend = ibegin + ni -1; 
    1801             int jend = jbegin + nj -1; 
    1802             zoom_ibegin = global_zoom_ibegin > ibegin ? global_zoom_ibegin : ibegin; 
    1803             int zoom_iend  = global_zoom_iend < iend ? zoom_iend : iend ; 
    1804             zoom_ni     = zoom_iend-zoom_ibegin+1 ; 
    1805  
    1806             zoom_jbegin = global_zoom_jbegin > jbegin ? global_zoom_jbegin : jbegin ; 
    1807             int zoom_jend   = global_zoom_jend < jend ? zoom_jend : jend; 
    1808             zoom_nj     = zoom_jend-zoom_jbegin+1; 
    1809          } 
    1810  
    1811  
    1812          size_t globalSizeIndex = 1, indexBegin, indexEnd; 
    1813          int range, clientSize = client->clientSize; 
    1814          std::vector<int> nGlobDomain(2); 
    1815          nGlobDomain[0] = this->ni_glo; 
    1816          nGlobDomain[1] = this->nj_glo; 
    1817          for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 
    1818          indexBegin = 0; 
    1819          if (globalSizeIndex <= clientSize) 
    1820          { 
    1821             indexBegin = rank%globalSizeIndex; 
    1822             indexEnd = indexBegin; 
    1823          } 
    1824          else 
    1825          { 
    1826             for (int i = 0; i < clientSize; ++i) 
    1827             { 
     1800             } 
     1801 
     1802             int iend = ibegin + ni -1; 
     1803             int jend = jbegin + nj -1; 
     1804             zoom_ibegin = global_zoom_ibegin > ibegin ? global_zoom_ibegin : ibegin; 
     1805             int zoom_iend  = global_zoom_iend < iend ? zoom_iend : iend ; 
     1806             zoom_ni     = zoom_iend-zoom_ibegin+1 ; 
     1807 
     1808             zoom_jbegin = global_zoom_jbegin > jbegin ? global_zoom_jbegin : jbegin ; 
     1809             int zoom_jend   = global_zoom_jend < jend ? zoom_jend : jend; 
     1810             zoom_nj     = zoom_jend-zoom_jbegin+1; 
     1811           } 
     1812 
     1813           size_t globalSizeIndex = 1, indexBegin, indexEnd; 
     1814           int range, clientSize = client->clientSize; 
     1815           std::vector<int> nGlobDomain(2); 
     1816           nGlobDomain[0] = this->ni_glo; 
     1817           nGlobDomain[1] = this->nj_glo; 
     1818           for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 
     1819           indexBegin = 0; 
     1820           if (globalSizeIndex <= clientSize) 
     1821           { 
     1822             indexBegin = rank%globalSizeIndex; 
     1823             indexEnd = indexBegin; 
     1824           } 
     1825           else 
     1826           { 
     1827             for (int i = 0; i < clientSize; ++i) 
     1828             { 
    18281829               range = globalSizeIndex / clientSize; 
    18291830               if (i < (globalSizeIndex%clientSize)) ++range; 
    18301831               if (i == client->clientRank) break; 
    18311832               indexBegin += range; 
    1832             } 
    1833             indexEnd = indexBegin + range - 1; 
    1834          } 
    1835  
    1836          // Even if servers have no index, they must received something from client 
    1837          // We only use several client to send "empty" message to these servers 
    1838          CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 
    1839          std::vector<int> serverZeroIndex; 
    1840          if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t,size_t>(indexBegin, indexEnd), 0); 
    1841          else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t,size_t>(indexBegin, indexEnd), 1); 
    1842  
    1843          std::list<int> serverZeroIndexLeader; 
    1844          std::list<int> serverZeroIndexNotLeader; 
    1845          CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 
    1846          for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 
    1847             *it = serverZeroIndex[*it]; 
    1848  
    1849          CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), 
    1850                client->intraComm); 
    1851          clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 
    1852          CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 
    1853  
    1854          CClientServerMapping::GlobalIndexMap::const_iterator it  = globalIndexDomainOnServer.begin(), 
    1855                ite = globalIndexDomainOnServer.end(); 
    1856 //         indSrv_[client].swap(globalIndexDomainOnServer); 
    1857 //         connectedServerRank_[client].clear(); 
    1858 //         for (it = indSrv_[client].begin(); it != ite; ++it) 
    1859 //            connectedServerRank_[client].push_back(it->first); 
    1860          indSrv_[nbServer].swap(globalIndexDomainOnServer); 
    1861          connectedServerRank_[nbServer].clear(); 
    1862          for (it = indSrv_[nbServer].begin(); it != ite; ++it) 
    1863             connectedServerRank_[nbServer].push_back(it->first); 
    1864  
    1865          for (std::list<int>::const_iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 
    1866             connectedServerRank_[nbServer].push_back(*it); 
    1867  
    1868          // Even if a client has no index, it must connect to at least one server and 
    1869         // send an "empty" data to this server 
    1870          if (connectedServerRank_[nbServer].empty()) 
    1871             connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
    1872  
    1873          nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
    1874 //         if (connectedServerRank_[client].empty()) 
    1875 //            connectedServerRank_[client].push_back(client->clientRank % client->serverSize); 
    1876 // 
    1877 //         nbSenders[client] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[client]); 
    1878  
    1879          delete clientServerMap; 
     1833             } 
     1834             indexEnd = indexBegin + range - 1; 
     1835           } 
     1836 
     1837           // Even if servers have no index, they must received something from client 
     1838           // We only use several client to send "empty" message to these servers 
     1839           CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 
     1840           std::vector<int> serverZeroIndex; 
     1841           if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t,size_t>(indexBegin, indexEnd), 0); 
     1842           else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t,size_t>(indexBegin, indexEnd), 1); 
     1843 
     1844           std::list<int> serverZeroIndexLeader; 
     1845           std::list<int> serverZeroIndexNotLeader; 
     1846           CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 
     1847           for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 
     1848              *it = serverZeroIndex[*it]; 
     1849 
     1850           CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), 
     1851                 client->intraComm); 
     1852           clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 
     1853           CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 
     1854 
     1855           CClientServerMapping::GlobalIndexMap::const_iterator it  = globalIndexDomainOnServer.begin(), 
     1856                 ite = globalIndexDomainOnServer.end(); 
     1857           indSrv_[nbServer].swap(globalIndexDomainOnServer); 
     1858           connectedServerRank_[nbServer].clear(); 
     1859           for (it = indSrv_[nbServer].begin(); it != ite; ++it) 
     1860             connectedServerRank_[nbServer].push_back(it->first); 
     1861 
     1862           for (std::list<int>::const_iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 
     1863              connectedServerRank_[nbServer].push_back(*it); 
     1864 
     1865           // Even if a client has no index, it must connect to at least one server and 
     1866           // send an "empty" data to this server 
     1867           if (connectedServerRank_[nbServer].empty()) 
     1868              connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     1869 
     1870           nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
     1871           delete clientServerMap; 
     1872        } 
    18801873      } 
    18811874    } 
Note: See TracChangeset for help on using the changeset viewer.