Changeset 1553 for XIOS/trunk/src/node


Ignore:
Timestamp:
06/28/18 17:53:42 (6 years ago)
Author:
oabramkina
Message:

The zoom is dead, long live the zoom.

Replacing domain_zoom transformation by copying it from domain_extract. From now on, only the zoomed part of a domain is sent to servers. On the user's side all definitions stay the same.

To do soon: axis_zoom.

Location:
XIOS/trunk/src/node
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/domain.cpp

    r1549 r1553  
    3030      , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 
    3131      , isClientAfterTransformationChecked(false), hasLonLat(false) 
    32       , isRedistributed_(false), hasPole(false), doZoomByIndex_(false) 
     32      , isRedistributed_(false), hasPole(false) 
    3333      , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 
    3434      , globalLocalIndexMap_(), computedWrittenIndex_(false) 
    35           , clients() 
     35      , clients() 
    3636   { 
    3737   } 
     
    4242      , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 
    4343      , isClientAfterTransformationChecked(false), hasLonLat(false) 
    44       , isRedistributed_(false), hasPole(false), doZoomByIndex_(false) 
     44      , isRedistributed_(false), hasPole(false) 
    4545      , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 
    4646      , globalLocalIndexMap_(), computedWrittenIndex_(false) 
    47           , clients() 
     47      , clients() 
    4848   { 
    4949    } 
     
    185185   bool CDomain::isEmpty(void) const 
    186186   { 
    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())); 
    189188   } 
    190189 
     
    866865         for (int i = 0; i < ni; ++i) j_index(i+j*ni) = j+jbegin; 
    867866     } 
    868       
    869      checkZoom(); 
    870    } 
    871  
    872    // Check global zoom of a domain 
    873    // If there is no zoom defined for the domain, zoom will have value of global doamin 
    874    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); 
    890867   } 
    891868 
    892869   size_t CDomain::getGlobalWrittenSize(void) 
    893870   { 
    894       return global_zoom_ni*global_zoom_nj ; 
     871     return ni_glo*nj_glo ; 
    895872   } 
    896873   //---------------------------------------------------------------- 
     
    17381715        if (indSrv_.find(nbServer) == indSrv_.end()) 
    17391716        { 
    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(), 
    18711779                 ite = globalIndexDomainOnServer.end(); 
    1872            indSrv_[nbServer].swap(globalIndexDomainOnServer); 
    1873            connectedServerRank_[nbServer].clear(); 
    1874            for (it = indSrv_[nbServer].begin(); it != ite; ++it) 
    1875              connectedServerRank_[nbServer].push_back(it->first); 
    1876  
    1877            for (std::list<int>::const_iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 
    1878               connectedServerRank_[nbServer].push_back(*it); 
    1879  
    1880            // Even if a client has no index, it must connect to at least one server and 
    1881            // send an "empty" data to this server 
    1882            if (connectedServerRank_[nbServer].empty()) 
    1883               connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
    1884  
    1885            nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
    1886            delete clientServerMap; 
     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; 
    18871795        } 
    18881796      } 
     
    19041812 
    19051813      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; 
    19081816      nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 
    19091817      nGlob[0]        = ni_glo;   nGlob[1] = nj_glo; 
     
    20051913 
    20061914      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; 
    20091917      nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 
    20101918      nGlob[0]        = ni_glo;   nGlob[1] = nj_glo; 
     
    20751983 
    20761984  /*! 
    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) 
    20791986  */ 
    20801987  void CDomain::sendIndex() 
     
    20901997 
    20911998      list<CMessage> list_msgsIndex; 
    2092       list<CArray<int,1> > list_indZoom, list_writtenInd, list_indGlob; 
     1999      list<CArray<int,1> > list_indGlob; 
    20932000 
    20942001      std::unordered_map<int, vector<size_t> >::const_iterator itIndex, iteIndex; 
     
    21642071          msg << isUnstructed_; 
    21652072          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(); 
    21672074          msg << isCompressible_; 
    21682075 
     
    25842491 
    25852492  /*! 
    2586     Receive attributes from client(s): zoom info and begin and n of each server 
     2493    Receive attributes from client(s) 
    25872494    \param[in] rank rank of client source 
    25882495    \param[in] buffer message containing attributes info 
     
    25912498  { 
    25922499    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; 
    25942501    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_tmp            
     2502           >> ni_glo_tmp >> nj_glo_tmp 
    25962503           >> isCompressible_; 
     2504 
    25972505    ni.setValue(ni_tmp); 
    25982506    ibegin.setValue(ibegin_tmp); 
    25992507    nj.setValue(nj_tmp); 
    26002508    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); 
    26252511 
    26262512  } 
  • XIOS/trunk/src/node/domain.hpp

    r1542 r1553  
    165165         void checkArea(void); 
    166166         void checkLonLat(); 
    167          void checkZoom(void); 
    168167 
    169168         void setTransformations(const TransMapTypes&);          
     
    183182         static void recvDistributionAttributes(CEventServer& event); 
    184183         static void recvIndex(CEventServer& event); 
    185          static void recvIndexZoom(CEventServer& event); 
    186184         static void recvMask(CEventServer& event);          
    187185         static void recvLon(CEventServer& event); 
     
    206204         std::set<CContextClient*> clientsSet; 
    207205 
    208          bool doZoomByIndex_; 
    209206         bool isChecked, computedWrittenIndex_; 
    210207         std::set<StdString> relFiles, relFilesCompressed; 
  • XIOS/trunk/src/node/grid.cpp

    r1542 r1553  
    16321632          std::vector<CAxis*> axisList = getAxis(); 
    16331633          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 
    16351635          for (int i = 0; i < numElement; ++i) 
    16361636          { 
     
    16381638            if (2 == axis_domain_order(i)) //domain 
    16391639            { 
    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; 
    16431643              nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 
    16441644 
    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; 
    16481648              nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 
    16491649 
Note: See TracChangeset for help on using the changeset viewer.