Changeset 914 for XIOS/trunk/src


Ignore:
Timestamp:
08/03/16 18:04:57 (8 years ago)
Author:
mhnguyen
Message:

Ticket 98: Fixing bug relating to element size

+) Correct return value of size computation for each element of grid

Test
+) On Curie
+) Size returns correctly

File:
1 edited

Legend:

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

    r895 r914  
    543543       size_t elementSize; 
    544544       size_t elementGlobalSize = 1; 
    545        if (2 == axis_domain_order(idx)) 
     545       if (2 == axis_domain_order(idx)) // This is domain 
    546546       { 
    547547         elementSize = domList[domainIdx]->i_index.numElements(); 
     
    554554         ++domainIdx; 
    555555       } 
    556        else if (1 == axis_domain_order(idx)) 
     556       else if (1 == axis_domain_order(idx))  // This is axis 
    557557       { 
    558558         elementSize = axisList[axisIdx]->index.numElements(); 
     
    565565         ++axisIdx; 
    566566       } 
    567        else 
     567       else  // Of course, this is scalar 
    568568       { 
    569569         globalIndexElement[idx].resize(1); 
     
    576576     std::vector<std::vector<bool> > elementOnServer(nbElement, std::vector<bool>(serverSize, false)); 
    577577     std::vector<boost::unordered_map<int,std::vector<size_t> > > globalElementIndexOnServer(nbElement); 
     578     CArray<int,1> nbIndexOnServer(serverSize); // Number of distributed global index held by each client for each server 
     579     // Number of temporary distributed global index held by each client for each server 
     580     // We have this variable for the case of non-distributed element (often axis) to check the duplicate server rank 
     581     CArray<int,1> nbIndexOnServerTmp(serverSize); 
    578582     for (int idx = 0; idx < nbElement; ++idx) 
    579583     { 
    580        std::vector<int> nbIndexOnServer(serverSize,0); 
     584       nbIndexOnServer = 0; 
    581585       const boost::unordered_map<size_t,std::vector<int> >& indexServerElement = indexServerOnElement[idx]; 
    582586       const CArray<size_t,1>& globalIndexElementOnClient = globalIndexElement[idx]; 
     
    589593       { 
    590594         const std::vector<int>& tmp = it->second; 
     595         nbIndexOnServerTmp = 0; 
    591596         for (int i = 0; i < tmp.size(); ++i) 
    592597         { 
    593            ++nbIndexOnServer[tmp[i]]; 
     598           if (0 == nbIndexOnServerTmp(tmp[i])) ++nbIndexOnServerTmp(tmp[i]); 
    594599         } 
     600         nbIndexOnServer += nbIndexOnServerTmp; 
    595601       } 
    596602 
    597603       for (int i = 0; i < serverSize; ++i) 
    598604       { 
    599          if (0 != nbIndexOnServer[i]) 
     605         if (0 != nbIndexOnServer(i)) 
    600606         { 
    601            globalElementIndexOnServer[idx][i].resize(nbIndexOnServer[i]); 
    602            nbIndexOnServer[i] = 0; 
     607           globalElementIndexOnServer[idx][i].resize(nbIndexOnServer(i)); 
    603608           elementOnServer[idx][i] = true; 
    604609         } 
    605610       } 
    606611 
     612       nbIndexOnServer = 0; 
    607613       for (it = itb; it != ite; ++it) 
    608614       { 
    609615         const std::vector<int>& tmp = it->second; 
     616         nbIndexOnServerTmp = 0; 
    610617         for (int i = 0; i < tmp.size(); ++i) 
    611618         { 
    612            globalElementIndexOnServer[idx][tmp[i]][nbIndexOnServer[tmp[i]]] = it->first; 
    613            ++nbIndexOnServer[tmp[i]]; 
     619           if (0 == nbIndexOnServerTmp(tmp[i])) 
     620           { 
     621             globalElementIndexOnServer[idx][tmp[i]][nbIndexOnServer(tmp[i])] = it->first; 
     622             ++nbIndexOnServerTmp(tmp[i]); 
     623           } 
    614624         } 
     625         nbIndexOnServer += nbIndexOnServerTmp; 
    615626       } 
    616627     } 
     
    17241735    else 
    17251736    { 
    1726 //      int ssize = axis_domain_order.numElements(); 
    1727 //      for (int i = 0; i < ssize; ++i) 
    1728 //        if (axis_domain_order(i) != (transformGridSrc->axis_domain_order)(i)) 
    1729 //          ERROR("CGrid::transformGrid(CGrid* transformGridSrc)", 
    1730 //                << "Grids " << this->getId() << " and " << transformGridSrc->getId() 
    1731 //                << " don't have elements in the same order"); 
    17321737    } 
    17331738 
     
    17421747  bool CGrid::hasTransform() 
    17431748  { 
     1749    if (hasTransform_) return hasTransform_; 
     1750 
     1751    std::vector<CDomain*> domList = getDomains(); 
     1752    std::vector<CAxis*> axisList = getAxis(); 
     1753    std::vector<CScalar*> scalarList = getScalars(); 
     1754 
     1755    for (int idx = 0; idx < domList.size(); ++idx) hasTransform_ |= domList[idx]->hasTransformation(); 
     1756    for (int idx = 0; idx < axisList.size(); ++idx) hasTransform_ |= axisList[idx]->hasTransformation(); 
     1757    for (int idx = 0; idx < scalarList.size(); ++idx) hasTransform_ |= scalarList[idx]->hasTransformation(); 
     1758 
    17441759    return hasTransform_; 
    17451760  } 
Note: See TracChangeset for help on using the changeset viewer.