Changeset 1403


Ignore:
Timestamp:
01/16/18 23:53:00 (4 years ago)
Author:
ymipsl
Message:

Fix bug in transformation when using mask and overlapped grid element (axis or domain).

YM

Location:
XIOS/dev/XIOS_DEV_CMIP6/src/transformation
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_transformation.cpp

    r1275 r1403  
    7474  size_t globalIndex; 
    7575  int nIndexSize = 0; 
    76   if (2 == elementType) nIndexSize = domainSrc_->i_index.numElements(); 
    77   else if (1 == elementType) nIndexSize = axisSrc_->index.numElements(); 
    78   else nIndexSize=1  ; //  scalar 
     76  CArray<bool,1>* ptLocalMask ; 
     77  CArray<bool,1> scalarMask(1) ; 
     78  scalarMask=true ; 
     79   
     80  if (2 == elementType)  
     81  { 
     82    nIndexSize = domainSrc_->i_index.numElements(); 
     83    ptLocalMask=&(domainSrc_->localMask) ; 
     84  } 
     85  else if (1 == elementType) 
     86  { 
     87     nIndexSize = axisSrc_->index.numElements(); 
     88     ptLocalMask=&(axisSrc_->mask) ; 
     89  } 
     90  else 
     91  { 
     92     nIndexSize=1  ; //  scalar 
     93     ptLocalMask=&scalarMask ; 
     94  } 
     95  CArray<bool,1>& localMask=*ptLocalMask ; 
    7996   
    8097  CClientClientDHTInt::Index2VectorInfoTypeMap globalIndex2ProcRank; 
     
    8299  for (int idx = 0; idx < nIndexSize; ++idx) 
    83100  { 
    84     if (2 == elementType) // domain 
     101    if (localMask(idx)) 
    85102    { 
    86       globalIndex = domainSrc_->i_index(idx) + domainSrc_->j_index(idx) * domainSrc_->ni_glo; 
     103      if (2 == elementType) // domain 
     104      { 
     105       globalIndex = domainSrc_->i_index(idx) + domainSrc_->j_index(idx) * domainSrc_->ni_glo; 
     106      } 
     107      else if (1 == elementType) // axis 
     108      { 
     109        globalIndex = axisSrc_->index(idx); 
     110      } 
     111      else // scalar 
     112      { 
     113        globalIndex = 0; 
     114      } 
     115      
     116      globalIndex2ProcRank[globalIndex].resize(1); 
     117      globalIndex2ProcRank[globalIndex][0] = clientRank; 
    87118    } 
    88     else if (1 == elementType) // axis 
    89     { 
    90       globalIndex = axisSrc_->index(idx); 
    91     } 
    92     else // scalar 
    93     { 
    94       globalIndex = 0; 
    95     } 
    96  
    97     globalIndex2ProcRank[globalIndex].resize(1); 
    98     globalIndex2ProcRank[globalIndex][0] = clientRank; 
    99119  } 
    100120 
  • XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_transformation.cpp

    r888 r1403  
    4848  CClientClientDHTInt::Index2VectorInfoTypeMap globalIndex2ProcRank; 
    4949  globalIndex2ProcRank.rehash(std::ceil(nIndexSize/globalIndex2ProcRank.max_load_factor())); 
     50  CArray<bool,1>& localMask=domainSrc_->localMask ; 
    5051  for (int idx = 0; idx < nIndexSize; ++idx) 
    5152  { 
    52     i_ind=domainSrc_->i_index(idx) ; 
    53     j_ind=domainSrc_->j_index(idx) ; 
     53    if (localMask(idx)) 
     54    { 
     55      i_ind=domainSrc_->i_index(idx) ; 
     56      j_ind=domainSrc_->j_index(idx) ; 
    5457 
    55     globalIndex = i_ind + j_ind * niGlob; 
    56     globalIndex2ProcRank[globalIndex].push_back(clientRank); 
     58      globalIndex = i_ind + j_ind * niGlob; 
     59      globalIndex2ProcRank[globalIndex].push_back(clientRank); 
     60    } 
    5761  } 
    5862 
  • XIOS/dev/XIOS_DEV_CMIP6/src/transformation/scalar_algorithm_transformation.cpp

    r976 r1403  
    7070    CArray<int,1>& jIndex = domainSrc_->j_index; 
    7171    int niGlo = domainSrc_->ni_glo; 
    72  
     72    CArray<bool,1>& localMask = domainSrc_ -> localMask ; 
    7373    CClientClientDHTInt::Index2VectorInfoTypeMap globalIndex2ProcRank; 
    7474    globalIndex2ProcRank.rehash(std::ceil(nIndexSize/globalIndex2ProcRank.max_load_factor())); 
    7575    for (int idx = 0; idx < nIndexSize; ++idx) 
    7676    { 
    77       globalIndex = jIndex(idx) * niGlo + iIndex(idx); 
    78       globalIndex2ProcRank[globalIndex].resize(1); 
    79       globalIndex2ProcRank[globalIndex][0] = clientRank; 
     77      if (localMask(idx)) 
     78      { 
     79        globalIndex = jIndex(idx) * niGlo + iIndex(idx); 
     80        globalIndex2ProcRank[globalIndex].resize(1); 
     81        globalIndex2ProcRank[globalIndex][0] = clientRank; 
     82      } 
    8083    } 
    8184 
     
    9093    CClientClientDHTInt::Index2VectorInfoTypeMap globalIndex2ProcRank; 
    9194    globalIndex2ProcRank.rehash(std::ceil(nIndexSize/globalIndex2ProcRank.max_load_factor())); 
     95    CArray<bool,1>& localMask = axisSrc_ -> mask ; 
     96    
    9297    for (int idx = 0; idx < nIndexSize; ++idx) 
    9398    { 
    94       globalIndex = axisSrc_->index(idx); 
    95       globalIndex2ProcRank[globalIndex].resize(1); 
    96       globalIndex2ProcRank[globalIndex][0] = clientRank; 
     99      if (localMask(idx)) 
     100      { 
     101        globalIndex = axisSrc_->index(idx); 
     102        globalIndex2ProcRank[globalIndex].resize(1); 
     103        globalIndex2ProcRank[globalIndex][0] = clientRank; 
     104      } 
    97105    } 
    98106 
Note: See TracChangeset for help on using the changeset viewer.