Changeset 1553 for XIOS/trunk/src/node
- Timestamp:
- 06/28/18 17:53:42 (6 years ago)
- Location:
- XIOS/trunk/src/node
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/domain.cpp
r1549 r1553 30 30 , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 31 31 , isClientAfterTransformationChecked(false), hasLonLat(false) 32 , isRedistributed_(false), hasPole(false) , doZoomByIndex_(false)32 , isRedistributed_(false), hasPole(false) 33 33 , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 34 34 , globalLocalIndexMap_(), computedWrittenIndex_(false) 35 35 , clients() 36 36 { 37 37 } … … 42 42 , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 43 43 , isClientAfterTransformationChecked(false), hasLonLat(false) 44 , isRedistributed_(false), hasPole(false) , doZoomByIndex_(false)44 , isRedistributed_(false), hasPole(false) 45 45 , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 46 46 , globalLocalIndexMap_(), computedWrittenIndex_(false) 47 47 , clients() 48 48 { 49 49 } … … 185 185 bool CDomain::isEmpty(void) const 186 186 { 187 return ((this->zoom_i_index.isEmpty()) || (0 == this->zoom_i_index.numElements())); 188 187 return ((this->i_index.isEmpty()) || (0 == this->i_index.numElements())); 189 188 } 190 189 … … 866 865 for (int i = 0; i < ni; ++i) j_index(i+j*ni) = j+jbegin; 867 866 } 868 869 checkZoom();870 }871 872 // Check global zoom of a domain873 // If there is no zoom defined for the domain, zoom will have value of global doamin874 void CDomain::checkZoom(void)875 {876 if (global_zoom_ibegin.isEmpty())877 global_zoom_ibegin.setValue(0);878 if (global_zoom_ni.isEmpty())879 global_zoom_ni.setValue(ni_glo);880 if (global_zoom_jbegin.isEmpty())881 global_zoom_jbegin.setValue(0);882 if (global_zoom_nj.isEmpty())883 global_zoom_nj.setValue(nj_glo);884 if (zoom_i_index.isEmpty()) zoom_i_index.setValue(i_index.getValue());885 if (zoom_j_index.isEmpty()) zoom_j_index.setValue(j_index.getValue());886 if (zoom_ibegin.isEmpty()) zoom_ibegin.setValue(ibegin);887 if (zoom_ni.isEmpty()) zoom_ni.setValue(ni);888 if (zoom_jbegin.isEmpty()) zoom_jbegin.setValue(jbegin);889 if (zoom_nj.isEmpty()) zoom_nj.setValue(nj);890 867 } 891 868 892 869 size_t CDomain::getGlobalWrittenSize(void) 893 870 { 894 return global_zoom_ni*global_zoom_nj;871 return ni_glo*nj_glo ; 895 872 } 896 873 //---------------------------------------------------------------- … … 1738 1715 if (indSrv_.find(nbServer) == indSrv_.end()) 1739 1716 { 1740 int i,j,i_ind,j_ind, nbIndex, nbIndexZoom; 1741 int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 1742 int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 1743 1744 // Precompute number of index 1745 int globalIndexCountZoom = 0; 1746 nbIndex = i_index.numElements(); 1747 1748 if (doZoomByIndex_) 1749 { 1750 globalIndexCountZoom = zoom_i_index.numElements(); 1751 } 1752 else 1753 { 1754 for (i = 0; i < nbIndex; ++i) 1755 { 1756 i_ind=i_index(i); 1757 j_ind=j_index(i); 1758 1759 if (i_ind >= global_zoom_ibegin && i_ind <= global_zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= global_zoom_jend) 1760 { 1761 ++globalIndexCountZoom; 1762 } 1763 } 1764 } 1765 1766 // Fill in index 1767 CArray<size_t,1> globalIndexDomainZoom(globalIndexCountZoom); 1768 CArray<size_t,1> localIndexDomainZoom(globalIndexCountZoom); 1769 CArray<size_t,1> globalIndexDomain(nbIndex); 1770 size_t globalIndex; 1771 int globalIndexCount = 0; 1772 1773 for (i = 0; i < nbIndex; ++i) 1774 { 1775 i_ind=i_index(i); 1776 j_ind=j_index(i); 1777 globalIndex = i_ind + j_ind * ni_glo; 1778 globalIndexDomain(i) = globalIndex; 1779 } 1780 1781 if (globalLocalIndexMap_.empty()) 1782 { 1783 for (i = 0; i < nbIndex; ++i) 1784 globalLocalIndexMap_[globalIndexDomain(i)] = i; 1785 } 1786 1787 globalIndexCountZoom = 0; 1788 if (doZoomByIndex_) 1789 { 1790 int nbIndexZoom = zoom_i_index.numElements(); 1791 1792 for (i = 0; i < nbIndexZoom; ++i) 1793 { 1794 i_ind=zoom_i_index(i); 1795 j_ind=zoom_j_index(i); 1796 globalIndex = i_ind + j_ind * ni_glo; 1797 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 1798 ++globalIndexCountZoom; 1799 } 1800 } 1801 else 1802 { 1803 int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 1804 int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 1805 for (i = 0; i < nbIndex; ++i) 1806 { 1807 i_ind=i_index(i); 1808 j_ind=j_index(i); 1809 globalIndex = i_ind + j_ind * ni_glo; 1810 if (i_ind >= global_zoom_ibegin && i_ind <= global_zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= global_zoom_jend) 1811 { 1812 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 1813 ++globalIndexCountZoom; 1814 } 1815 } 1816 1817 int iend = ibegin + ni -1; 1818 int jend = jbegin + nj -1; 1819 zoom_ibegin = global_zoom_ibegin > ibegin ? global_zoom_ibegin.getValue() : ibegin; 1820 int zoom_iend = global_zoom_iend < iend ? zoom_iend : iend ; 1821 zoom_ni = zoom_iend-zoom_ibegin+1 ; 1822 1823 zoom_jbegin = global_zoom_jbegin > jbegin ? global_zoom_jbegin.getValue() : jbegin ; 1824 int zoom_jend = global_zoom_jend < jend ? zoom_jend : jend; 1825 zoom_nj = zoom_jend-zoom_jbegin+1; 1826 } 1827 1828 size_t globalSizeIndex = 1, indexBegin, indexEnd; 1829 int range, clientSize = client->clientSize; 1830 std::vector<int> nGlobDomain(2); 1831 nGlobDomain[0] = this->ni_glo; 1832 nGlobDomain[1] = this->nj_glo; 1833 for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 1834 indexBegin = 0; 1835 if (globalSizeIndex <= clientSize) 1836 { 1837 indexBegin = rank%globalSizeIndex; 1838 indexEnd = indexBegin; 1839 } 1840 else 1841 { 1842 for (int i = 0; i < clientSize; ++i) 1843 { 1844 range = globalSizeIndex / clientSize; 1845 if (i < (globalSizeIndex%clientSize)) ++range; 1846 if (i == client->clientRank) break; 1847 indexBegin += range; 1848 } 1849 indexEnd = indexBegin + range - 1; 1850 } 1851 1852 // Even if servers have no index, they must received something from client 1853 // We only use several client to send "empty" message to these servers 1854 CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 1855 std::vector<int> serverZeroIndex; 1856 if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 0); 1857 else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 1); 1858 1859 std::list<int> serverZeroIndexLeader; 1860 std::list<int> serverZeroIndexNotLeader; 1861 CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 1862 for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1863 *it = serverZeroIndex[*it]; 1864 1865 CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), 1866 client->intraComm); 1867 clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 1868 CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 1869 1870 CClientServerMapping::GlobalIndexMap::const_iterator it = globalIndexDomainOnServer.begin(), 1717 int i,j,i_ind,j_ind, nbIndex=i_index.numElements(); 1718 int globalIndexCount = i_index.numElements(); 1719 // Fill in index 1720 CArray<size_t,1> globalIndexDomain(nbIndex); 1721 size_t globalIndex; 1722 1723 for (i = 0; i < nbIndex; ++i) 1724 { 1725 i_ind=i_index(i); 1726 j_ind=j_index(i); 1727 globalIndex = i_ind + j_ind * ni_glo; 1728 globalIndexDomain(i) = globalIndex; 1729 } 1730 1731 if (globalLocalIndexMap_.empty()) 1732 { 1733 for (i = 0; i < nbIndex; ++i) 1734 globalLocalIndexMap_[globalIndexDomain(i)] = i; 1735 } 1736 1737 size_t globalSizeIndex = 1, indexBegin, indexEnd; 1738 int range, clientSize = client->clientSize; 1739 std::vector<int> nGlobDomain(2); 1740 nGlobDomain[0] = this->ni_glo; 1741 nGlobDomain[1] = this->nj_glo; 1742 for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 1743 indexBegin = 0; 1744 if (globalSizeIndex <= clientSize) 1745 { 1746 indexBegin = rank%globalSizeIndex; 1747 indexEnd = indexBegin; 1748 } 1749 else 1750 { 1751 for (int i = 0; i < clientSize; ++i) 1752 { 1753 range = globalSizeIndex / clientSize; 1754 if (i < (globalSizeIndex%clientSize)) ++range; 1755 if (i == client->clientRank) break; 1756 indexBegin += range; 1757 } 1758 indexEnd = indexBegin + range - 1; 1759 } 1760 1761 // Even if servers have no index, they must received something from client 1762 // We only use several client to send "empty" message to these servers 1763 CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 1764 std::vector<int> serverZeroIndex; 1765 if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 0); 1766 else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 1); 1767 1768 std::list<int> serverZeroIndexLeader; 1769 std::list<int> serverZeroIndexNotLeader; 1770 CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 1771 for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1772 *it = serverZeroIndex[*it]; 1773 1774 CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), client->intraComm); 1775 clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 1776 CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 1777 1778 CClientServerMapping::GlobalIndexMap::const_iterator it = globalIndexDomainOnServer.begin(), 1871 1779 ite = globalIndexDomainOnServer.end(); 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1780 indSrv_[nbServer].swap(globalIndexDomainOnServer); 1781 connectedServerRank_[nbServer].clear(); 1782 for (it = indSrv_[nbServer].begin(); it != ite; ++it) 1783 connectedServerRank_[nbServer].push_back(it->first); 1784 1785 for (std::list<int>::const_iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1786 connectedServerRank_[nbServer].push_back(*it); 1787 1788 // Even if a client has no index, it must connect to at least one server and 1789 // send an "empty" data to this server 1790 if (connectedServerRank_[nbServer].empty()) 1791 connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 1792 1793 nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 1794 delete clientServerMap; 1887 1795 } 1888 1796 } … … 1904 1812 1905 1813 std::vector<int> nBegin(2), nSize(2), nBeginGlobal(2), nGlob(2); 1906 nBegin[0] = zoom_ibegin; nBegin[1] = zoom_jbegin;1907 nSize[0] = zoom_ni; nSize[1] = zoom_nj;1814 nBegin[0] = ibegin; nBegin[1] = jbegin; 1815 nSize[0] = ni; nSize[1] = nj; 1908 1816 nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 1909 1817 nGlob[0] = ni_glo; nGlob[1] = nj_glo; … … 2005 1913 2006 1914 std::vector<int> nBegin(2), nSize(2), nBeginGlobal(2), nGlob(2); 2007 nBegin[0] = zoom_ibegin; nBegin[1] = zoom_jbegin;2008 nSize[0] = zoom_ni; nSize[1] = zoom_nj;1915 nBegin[0] = ibegin; nBegin[1] = jbegin; 1916 nSize[0] = ni; nSize[1] = nj; 2009 1917 nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 2010 1918 nGlob[0] = ni_glo; nGlob[1] = nj_glo; … … 2075 1983 2076 1984 /*! 2077 Send global index and zoom index from client to connected client(s) 2078 zoom index can be smaller than global index 1985 Send global index from client to connected client(s) 2079 1986 */ 2080 1987 void CDomain::sendIndex() … … 2090 1997 2091 1998 list<CMessage> list_msgsIndex; 2092 list<CArray<int,1> > list_ind Zoom, list_writtenInd, list_indGlob;1999 list<CArray<int,1> > list_indGlob; 2093 2000 2094 2001 std::unordered_map<int, vector<size_t> >::const_iterator itIndex, iteIndex; … … 2164 2071 msg << isUnstructed_; 2165 2072 msg << ni_srv << ibegin_srv << nj_srv << jbegin_srv; 2166 msg << global_zoom_ni.getValue() << global_zoom_ibegin.getValue() << global_zoom_nj.getValue() << global_zoom_jbegin.getValue();2073 msg << ni_glo.getValue() << nj_glo.getValue(); 2167 2074 msg << isCompressible_; 2168 2075 … … 2584 2491 2585 2492 /*! 2586 Receive attributes from client(s) : zoom info and begin and n of each server2493 Receive attributes from client(s) 2587 2494 \param[in] rank rank of client source 2588 2495 \param[in] buffer message containing attributes info … … 2591 2498 { 2592 2499 int ni_tmp, ibegin_tmp, nj_tmp, jbegin_tmp; 2593 int global_zoom_ni_tmp, global_zoom_ibegin_tmp, global_zoom_nj_tmp, global_zoom_jbegin_tmp;2500 int ni_glo_tmp, nj_glo_tmp; 2594 2501 buffer >> isUnstructed_ >> ni_tmp >> ibegin_tmp >> nj_tmp >> jbegin_tmp 2595 >> global_zoom_ni_tmp >> global_zoom_ibegin_tmp >> global_zoom_nj_tmp >> global_zoom_jbegin_tmp2502 >> ni_glo_tmp >> nj_glo_tmp 2596 2503 >> isCompressible_; 2504 2597 2505 ni.setValue(ni_tmp); 2598 2506 ibegin.setValue(ibegin_tmp); 2599 2507 nj.setValue(nj_tmp); 2600 2508 jbegin.setValue(jbegin_tmp); 2601 2602 global_zoom_ni.setValue(global_zoom_ni_tmp); 2603 global_zoom_ibegin.setValue(global_zoom_ibegin_tmp); 2604 global_zoom_nj.setValue(global_zoom_nj_tmp); 2605 global_zoom_jbegin.setValue(global_zoom_jbegin_tmp); 2606 2607 int iend = ibegin + ni - 1; 2608 int jend = jbegin + nj - 1; 2609 int zoom_iend_glob = global_zoom_ibegin + global_zoom_ni - 1; 2610 int zoom_jend_glob = global_zoom_jbegin + global_zoom_nj - 1; 2611 2612 zoom_ibegin.setValue(global_zoom_ibegin > ibegin ? global_zoom_ibegin.getValue() : ibegin); 2613 int zoom_iend = zoom_iend_glob < iend ? zoom_iend_glob : iend ; 2614 zoom_ni.setValue(zoom_iend-zoom_ibegin+1); 2615 2616 zoom_jbegin.setValue(global_zoom_jbegin > jbegin ? global_zoom_jbegin.getValue() : jbegin); 2617 int zoom_jend = zoom_jend_glob < jend ? zoom_jend_glob : jend ; 2618 zoom_nj.setValue(zoom_jend-zoom_jbegin+1); 2619 2620 if (zoom_ni<=0 || zoom_nj<=0) 2621 { 2622 zoom_ni=0 ; zoom_ibegin=global_zoom_ibegin ; //=0; zoom_iend=0 ; 2623 zoom_nj=0 ; zoom_jbegin=global_zoom_jbegin ; //=0; zoom_jend=0 ; 2624 } 2509 ni_glo.setValue(ni_glo_tmp); 2510 nj_glo.setValue(nj_glo_tmp); 2625 2511 2626 2512 } -
XIOS/trunk/src/node/domain.hpp
r1542 r1553 165 165 void checkArea(void); 166 166 void checkLonLat(); 167 void checkZoom(void);168 167 169 168 void setTransformations(const TransMapTypes&); … … 183 182 static void recvDistributionAttributes(CEventServer& event); 184 183 static void recvIndex(CEventServer& event); 185 static void recvIndexZoom(CEventServer& event);186 184 static void recvMask(CEventServer& event); 187 185 static void recvLon(CEventServer& event); … … 206 204 std::set<CContextClient*> clientsSet; 207 205 208 bool doZoomByIndex_;209 206 bool isChecked, computedWrittenIndex_; 210 207 std::set<StdString> relFiles, relFilesCompressed; -
XIOS/trunk/src/node/grid.cpp
r1542 r1553 1632 1632 std::vector<CAxis*> axisList = getAxis(); 1633 1633 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize), nGlobElement(numElement); 1634 std::vector<CArray<int,1> > globalZoomIndex(numElement); 1634 std::vector<CArray<int,1> > globalZoomIndex(numElement); // RENAME INTO globalIndex 1635 1635 for (int i = 0; i < numElement; ++i) 1636 1636 { … … 1638 1638 if (2 == axis_domain_order(i)) //domain 1639 1639 { 1640 nZoomBegin[indexMap[i]] = domainList[domainId]-> zoom_ibegin;1641 nZoomSize[indexMap[i]] = domainList[domainId]-> zoom_ni;1642 nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->global_zoom_ibegin;1640 nZoomBegin[indexMap[i]] = domainList[domainId]->ibegin; 1641 nZoomSize[indexMap[i]] = domainList[domainId]->ni; 1642 nZoomBeginGlobal[indexMap[i]] = 0; 1643 1643 nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 1644 1644 1645 nZoomBegin[indexMap[i] + 1] = domainList[domainId]-> zoom_jbegin;1646 nZoomSize[indexMap[i] + 1] = domainList[domainId]-> zoom_nj;1647 nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->global_zoom_jbegin;1645 nZoomBegin[indexMap[i] + 1] = domainList[domainId]->jbegin; 1646 nZoomSize[indexMap[i] + 1] = domainList[domainId]->nj; 1647 nZoomBeginGlobal[indexMap[i] + 1] = 0; 1648 1648 nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 1649 1649
Note: See TracChangeset
for help on using the changeset viewer.