Ignore:
Timestamp:
09/06/18 18:55:44 (6 years ago)
Author:
oabramkina
Message:

Taking care of cases when a process doesn't possess a grid (its domain or axe size is zero).

Tested with CMIP6 toy models and IPSL model.

To do: remove grid mask from transformations.

Location:
XIOS/dev/dev_olga/src/node
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/node/axis.cpp

    r1570 r1571  
    245245   void CAxis::checkAttributes(void) 
    246246   { 
    247       if (this->n_glo.isEmpty()) 
     247     CContext* context=CContext::getCurrent(); 
     248 
     249     if (this->n_glo.isEmpty()) 
    248250        ERROR("CAxis::checkAttributes(void)", 
    249251              << "[ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] " 
     
    287289      if (!this->value.isEmpty()) 
    288290      { 
    289         StdSize true_size = value.numElements(); 
    290         if (this->n.getValue() != true_size) 
    291           ERROR("CAxis::checkAttributes(void)", 
     291        // Avoid this check at writing because it fails in case of a hole 
     292        if (context->hasClient) 
     293        { 
     294          StdSize true_size = value.numElements(); 
     295          if (this->n.getValue() != true_size) 
     296            ERROR("CAxis::checkAttributes(void)", 
    292297                << "[ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] " 
    293                 << "The axis is wrongly defined, attribute 'value' has a different size (" << true_size << ") than the one defined by the \'size\' attribute (" << n.getValue() << ")."); 
     298                << "The axis is wrongly defined, attribute 'value' has a different size (" << true_size 
     299                << ") than the one defined by the \'size\' attribute (" << n.getValue() << ")."); 
     300        } 
    294301        this->hasValue = true; 
    295302      } 
     
    297304      this->checkBounds(); 
    298305 
    299       CContext* context=CContext::getCurrent(); 
    300306      if (context->hasClient) 
    301307      { 
     
    651657         // Even if a client has no index, it must connect to at least one server and  
    652658         // send an "empty" data to this server 
    653          if (connectedServerRank_[nbServer].empty()) 
    654           connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     659//         if (connectedServerRank_[nbServer].empty()) 
     660//          connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     661        // Send empty data to all servers 
     662        if (connectedServerRank_[nbServer].empty()) 
     663          for (int i=0; i<nbServer; ++i) 
     664            connectedServerRank_[nbServer].push_back(i); 
     665 
    655666 
    656667         nbSenders[nbServer] = CClientServerMapping::computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
     
    690701    CArray<size_t,1>::const_iterator itSrvb = writtenGlobalIndex.begin(), 
    691702                                     itSrve = writtenGlobalIndex.end(), itSrv;   
     703//    for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 
     704//    { 
     705//      indGlo = *itSrv; 
     706//      if (ite != globalLocalIndexMap_.find(indGlo)) 
     707//      { 
     708//        ++nbWritten; 
     709//      } 
     710//    } 
     711 
     712    localIndexToWriteOnServer.resize(writtenGlobalIndex.numElements()); 
     713//    localIndexToWriteOnServer.resize(nbWritten); 
     714 
     715    nbWritten = 0; 
    692716    for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 
    693717    { 
     
    695719      if (ite != globalLocalIndexMap_.find(indGlo)) 
    696720      { 
    697         ++nbWritten; 
    698       } 
    699     } 
    700  
    701     localIndexToWriteOnServer.resize(writtenGlobalIndex.numElements()); 
    702 //      localIndexToWriteOnServer.resize(nbWritten); 
    703  
    704     nbWritten = 0; 
    705     for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 
    706     { 
    707       indGlo = *itSrv; 
    708       if (ite != globalLocalIndexMap_.find(indGlo)) 
    709       { 
    710721        localIndexToWriteOnServer(nbWritten) = globalLocalIndexMap_[indGlo]; 
    711         ++nbWritten; 
    712       } 
    713     } 
     722      } 
     723      else 
     724      { 
     725        localIndexToWriteOnServer(nbWritten) = -1; 
     726      } 
     727      ++nbWritten; 
     728    } 
     729 
    714730  } 
    715731 
     
    11941210         if (0 == globalLocalIndexMap_.count(gloInd)) 
    11951211         { 
    1196            index(nbIndLoc) = gloInd % n_glo; 
    1197            globalLocalIndexMap_[gloInd] = nbIndLoc; 
     1212//           index(nbIndLoc) = gloInd % n_glo; 
     1213//           globalLocalIndexMap_[gloInd] = nbIndLoc; 
     1214//           ++nbIndexGlob; 
     1215           index(nbIndexGlob) = gloInd % n_glo; 
     1216           globalLocalIndexMap_[gloInd] = nbIndexGlob; 
    11981217           ++nbIndexGlob; 
    11991218         }  
     
    12711290  } 
    12721291 
    1273  
    12741292  /*! 
    12751293    Compare two axis objects.  
  • XIOS/dev/dev_olga/src/node/axis.hpp

    r1568 r1571  
    114114         void computeWrittenIndex(); 
    115115         void computeWrittenCompressedIndex(MPI_Comm); 
     116 
     117         template <class T> void outputAxis(CArray<T,1>& valueIn, CArray<T,1>& valueOut); 
     118 
    116119         bool hasTransformation(); 
    117120         void solveInheritanceTransformation(); 
     
    126129        bool hasLabel; 
    127130 
    128         CArray<size_t,1> localIndexToWriteOnServer; 
     131//        CArray<size_t,1> localIndexToWriteOnServer; 
     132        CArray<int,1> localIndexToWriteOnServer; 
     133        CArray<size_t,1> localIndexToWriteOnClient; 
    129134 
    130135      private: 
     
    185190   ///-------------------------------------------------------------- 
    186191 
     192   template <class T> void CAxis::outputAxis(CArray<T,1>& valueIn, CArray<T,1>& valueOut) 
     193   { 
     194     int sizeServer = localIndexToWriteOnServer.numElements(); 
     195     int sizeClient = localIndexToWriteOnClient.numElements(); 
     196     valueOut.resize(sizeClient); 
     197 
     198     if (sizeServer == sizeClient) 
     199     { 
     200       valueOut = valueIn; 
     201     } 
     202     else 
     203     // a hole 
     204     { 
     205       valueOut = valueIn; 
     206       //valueOut = -1; initialize here to some value ???? 
     207     } 
     208//      CArray<size_t,1>& outIndexClient = grid->localIndexToWriteOnClient; 
     209//      CArray<size_t,1>& outIndexServer = grid->localIndexToWriteOnServer; 
     210//      for (size_t idx = 0; idx < outIndexServer.numElements(); ++idx) 
     211//      { 
     212//        fieldOut(outIndexServer(idx)) = recvDataSrv(outIndexClient(idx)); 
     213//      } 
     214   } 
     215 
    187216   // Declare/Define CAxisGroup and CAxisDefinition 
    188217   DECLARE_GROUP(CAxis); 
  • XIOS/dev/dev_olga/src/node/domain.cpp

    r1570 r1571  
    18481848          // Even if a client has no index, it must connect to at least one server and 
    18491849          // send an "empty" data to this server 
     1850//          if (connectedServerRank_[nbServer].empty()) 
     1851//            connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     1852 
     1853          // Trying instead: send empty data to all servers 
    18501854          if (connectedServerRank_[nbServer].empty()) 
    1851             connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     1855            for (int i = 0; i < client->serverSize; ++i) 
     1856            connectedServerRank_[nbServer].push_back(i); 
     1857 
    18521858 
    18531859          nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
     
    19041910        { 
    19051911          localIndexToWriteOnServer(nbWritten) = globalLocalIndexMap_[indGlo]; 
    1906           ++nbWritten; 
    19071912        } 
    19081913        else 
    19091914        { 
    1910           localIndexToWriteOnServer(nbWritten) = 0; 
    1911           ++nbWritten; 
    1912         } 
     1915          localIndexToWriteOnServer(nbWritten) = -1; 
     1916        } 
     1917        ++nbWritten; 
    19131918      } 
    19141919       
     
    25122517           nbIndLoc = iIndex + ni * jIndex; 
    25132518//           if (nbIndLoc < nbIndexGlobMax)  // THIS CONDITION IMPEDES THE CASE OF A HOLE 
    2514            { 
    2515              i_index(nbIndLoc) = index % ni_glo; 
    2516              j_index(nbIndLoc) = index / ni_glo; 
    2517              globalLocalIndexMap_[index] = nbIndLoc;   
    2518              ++nbIndGlob; 
    2519            } 
    2520            // i_index(nbIndGlob) = index % ni_glo; 
    2521            // j_index(nbIndGlob) = index / ni_glo; 
    2522            // globalLocalIndexMap_[index] = nbIndGlob;   
    2523            // ++nbIndGlob; 
     2519//           { 
     2520//             i_index(nbIndLoc) = index % ni_glo; 
     2521//             j_index(nbIndLoc) = index / ni_glo; 
     2522//             globalLocalIndexMap_[index] = nbIndLoc; 
     2523//             ++nbIndGlob; 
     2524//           } 
     2525            i_index(nbIndGlob) = index % ni_glo; 
     2526            j_index(nbIndGlob) = index / ni_glo; 
     2527            globalLocalIndexMap_[index] = nbIndGlob; 
     2528            ++nbIndGlob; 
    25242529         }  
    25252530      }  
  • XIOS/dev/dev_olga/src/node/domain.hpp

    r1553 r1571  
    142142         CArray<double, 1> areavalue; 
    143143 
    144          CArray<size_t,1> localIndexToWriteOnServer;          
     144         CArray<int,1> localIndexToWriteOnServer; 
    145145 
    146146         CArray<bool, 1> domainMask; // mask_1d, mask_2d -> domainMask 
  • XIOS/dev/dev_olga/src/node/grid.cpp

    r1570 r1571  
    841841         // Even if a client has no index, it must connect to at least one server and 
    842842         // send an "empty" data to this server 
     843//         if (connectedServerRank_[receiverSize].empty()) 
     844//          connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 
     845 
     846         // Trying instead: send empty data to all servers 
    843847         if (connectedServerRank_[receiverSize].empty()) 
    844           connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 
     848           for (int i = 0; i < client->serverSize; ++i) 
     849           connectedServerRank_[receiverSize].push_back(i); 
    845850 
    846851         nbSenders[receiverSize] = clientServerMap_->computeConnectedClients(receiverSize, client->clientSize, client->intraComm, connectedServerRank_[receiverSize]); 
Note: See TracChangeset for help on using the changeset viewer.