Changeset 1346 for XIOS/dev/XIOS_DEV_CMIP6/src/node/domain.cpp
- Timestamp:
- 11/25/17 00:19:11 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/node/domain.cpp
r1345 r1346 1718 1718 bool doComputeGlobalIndexServer = true; 1719 1719 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 { 1738 1741 i_ind=i_index(i); 1739 1742 j_ind=j_index(i); … … 1743 1746 ++globalIndexCountZoom; 1744 1747 } 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) 1767 1769 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 { 1777 1779 i_ind=zoom_i_index(i); 1778 1780 j_ind=zoom_j_index(i); … … 1780 1782 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 1781 1783 ++globalIndexCountZoom; 1782 }1783 }1784 else1785 {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 { 1790 1792 i_ind=i_index(i); 1791 1793 j_ind=j_index(i); … … 1796 1798 ++globalIndexCountZoom; 1797 1799 } 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 { 1828 1829 range = globalSizeIndex / clientSize; 1829 1830 if (i < (globalSizeIndex%clientSize)) ++range; 1830 1831 if (i == client->clientRank) break; 1831 1832 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 } 1880 1873 } 1881 1874 }
Note: See TracChangeset
for help on using the changeset viewer.