Ignore:
Timestamp:
07/20/18 14:02:55 (6 years ago)
Author:
oabramkina
Message:

Grid mask is not reconstructed anymore based on elements' masks.

Whenever it is needed, either elements' masks are used directly or grid mask if it is defined by a user.

File:
1 edited

Legend:

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

    r1542 r1564  
    1919namespace xios { 
    2020 
    21    /// ////////////////////// Dᅵᅵclarations ////////////////////// /// 
     21   /// ////////////////////// Declarations ////////////////////// /// 
    2222 
    2323   class CGridGroup; 
     
    9191         StdSize  getDataSize(void) const; 
    9292 
    93          /// Entrᅵᅵes-sorties de champs 
     93         /// Entrees-sorties de champs 
    9494         template <int n> 
    9595         void inputField(const CArray<double,n>& field, CArray<double,1>& stored) const; 
     
    417417                             bool createMask) 
    418418   { 
    419      int idx = 0; 
    420      int numElement = axisDomainOrder.numElements(); 
    421      int dim = domainMasks.size() * 2 + axisMasks.size(); 
    422      std::vector<CDomain*> domainP = this->getDomains(); 
    423      std::vector<CAxis*> axisP = this->getAxis(); 
    424  
    425      std::vector<int> idxLoop(dim,0), indexMap(numElement), eachDimSize(dim); 
    426      std::vector<int> currentIndex(dim); 
    427      int idxDomain = 0, idxAxis = 0; 
    428     for (int i = 0; i < numElement; ++i) 
    429     { 
    430       indexMap[i] = idx; 
    431       if (2 == axisDomainOrder(i)) { 
    432           eachDimSize[indexMap[i]]   = domainP[idxDomain]->ni; 
    433           eachDimSize[indexMap[i]+1] = domainP[idxDomain]->nj; 
    434           idx += 2; ++idxDomain; 
     419     if (!gridMask.isEmpty() || createMask) 
     420     { 
     421       int idx = 0; 
     422       int numElement = axisDomainOrder.numElements(); 
     423       int dim = domainMasks.size() * 2 + axisMasks.size(); 
     424       std::vector<CDomain*> domainP = this->getDomains(); 
     425       std::vector<CAxis*> axisP = this->getAxis(); 
     426 
     427       std::vector<int> idxLoop(dim,0), indexMap(numElement), eachDimSize(dim); 
     428       std::vector<int> currentIndex(dim); 
     429       int idxDomain = 0, idxAxis = 0; 
     430      for (int i = 0; i < numElement; ++i) 
     431      { 
     432        indexMap[i] = idx; 
     433        if (2 == axisDomainOrder(i)) { 
     434            eachDimSize[indexMap[i]]   = domainP[idxDomain]->ni; 
     435            eachDimSize[indexMap[i]+1] = domainP[idxDomain]->nj; 
     436            idx += 2; ++idxDomain; 
     437        } 
     438        else if (1 == axisDomainOrder(i)) { 
     439  //        eachDimSize[indexMap[i]] = axisMasks[idxAxis]->numElements(); 
     440          eachDimSize[indexMap[i]] = axisP[idxAxis]->n; 
     441          ++idx; ++idxAxis; 
     442        } 
     443        else {}; 
    435444      } 
    436       else if (1 == axisDomainOrder(i)) { 
    437 //        eachDimSize[indexMap[i]] = axisMasks[idxAxis]->numElements(); 
    438         eachDimSize[indexMap[i]] = axisP[idxAxis]->n; 
    439         ++idx; ++idxAxis; 
    440       } 
    441       else {}; 
    442     } 
    443  
    444     if (!gridMask.isEmpty() && !createMask) 
    445     { 
    446       for (int i = 0; i < dim; ++i) 
     445 
     446//      if (!gridMask.isEmpty() && !createMask) 
     447      if (!createMask) 
    447448      { 
    448         if (gridMask.extent(i) != eachDimSize[i]) 
    449           ERROR("CGrid::checkMask(void)", 
    450                 << "The mask has one dimension whose size is different from the one of the local grid." << std::endl 
    451                 << "Local size of dimension " << i << " is " << eachDimSize[i] << "." << std::endl 
    452                 << "Mask size for dimension " << i << " is " << gridMask.extent(i) << "." << std::endl 
    453                 << "Grid = " << this->getId()) 
    454       } 
    455     } 
    456     else { 
    457         CArrayBoolTraits<CArray<bool,N> >::resizeArray(gridMask,eachDimSize); 
    458         gridMask = true; 
    459     } 
    460  
    461     int ssize = gridMask.numElements(); 
    462     idx = 0; 
    463     while (idx < ssize) 
    464     { 
    465       for (int i = 0; i < dim-1; ++i) 
    466       { 
    467         if (idxLoop[i] == eachDimSize[i]) 
     449        for (int i = 0; i < dim; ++i) 
    468450        { 
    469           idxLoop[i] = 0; 
    470           ++idxLoop[i+1]; 
     451          if (gridMask.extent(i) != eachDimSize[i]) 
     452            ERROR("CGrid::checkMask(void)", 
     453                  << "The mask has one dimension whose size is different from the one of the local grid." << std::endl 
     454                  << "Local size of dimension " << i << " is " << eachDimSize[i] << "." << std::endl 
     455                  << "Mask size for dimension " << i << " is " << gridMask.extent(i) << "." << std::endl 
     456                  << "Grid = " << this->getId()) 
    471457        } 
    472458      } 
    473  
    474       // Find out outer index 
    475       idxDomain = idxAxis = 0; 
    476       bool maskValue = true; 
    477       for (int i = 0; i < numElement; ++i) 
     459      else { 
     460          CArrayBoolTraits<CArray<bool,N> >::resizeArray(gridMask,eachDimSize); 
     461          gridMask = true; 
     462      } 
     463 
     464      int ssize = gridMask.numElements(); 
     465      idx = 0; 
     466      while (idx < ssize) 
    478467      { 
    479         if (2 == axisDomainOrder(i)) 
     468        for (int i = 0; i < dim-1; ++i) 
    480469        { 
    481           int idxTmp = idxLoop[indexMap[i]] + idxLoop[indexMap[i]+1] * eachDimSize[indexMap[i]]; 
    482           if (idxTmp < (*domainMasks[idxDomain]).numElements()) 
    483             maskValue = maskValue && (*domainMasks[idxDomain])(idxTmp); 
    484           else 
    485             maskValue = false; 
    486           ++idxDomain; 
     470          if (idxLoop[i] == eachDimSize[i]) 
     471          { 
     472            idxLoop[i] = 0; 
     473            ++idxLoop[i+1]; 
     474          } 
    487475        } 
    488         else if (1 == axisDomainOrder(i)) 
     476 
     477        // Find out outer index 
     478        idxDomain = idxAxis = 0; 
     479        bool maskValue = true; 
     480        for (int i = 0; i < numElement; ++i) 
    489481        { 
    490           int idxTmp = idxLoop[indexMap[i]]; 
    491           if (idxTmp < (*axisMasks[idxAxis]).numElements()) 
    492             maskValue = maskValue && (*axisMasks[idxAxis])(idxTmp); 
    493           else 
    494             maskValue = false; 
    495  
    496           ++idxAxis; 
     482          if (2 == axisDomainOrder(i)) 
     483          { 
     484            int idxTmp = idxLoop[indexMap[i]] + idxLoop[indexMap[i]+1] * eachDimSize[indexMap[i]]; 
     485            if (idxTmp < (*domainMasks[idxDomain]).numElements()) 
     486              maskValue = maskValue && (*domainMasks[idxDomain])(idxTmp); 
     487            else 
     488              maskValue = false; 
     489            ++idxDomain; 
     490          } 
     491          else if (1 == axisDomainOrder(i)) 
     492          { 
     493            int idxTmp = idxLoop[indexMap[i]]; 
     494            if (idxTmp < (*axisMasks[idxAxis]).numElements()) 
     495              maskValue = maskValue && (*axisMasks[idxAxis])(idxTmp); 
     496            else 
     497              maskValue = false; 
     498 
     499            ++idxAxis; 
     500          } 
    497501        } 
     502 
     503        int maskIndex = idxLoop[0]; 
     504        int mulDim = 1; 
     505        for (int k = 1; k < dim; ++k) 
     506        { 
     507          mulDim *= eachDimSize[k-1]; 
     508          maskIndex += idxLoop[k]*mulDim; 
     509        } 
     510        *(gridMask.dataFirst()+maskIndex) &= maskValue; 
     511 
     512        ++idxLoop[0]; 
     513        ++idx; 
    498514      } 
    499  
    500       int maskIndex = idxLoop[0]; 
    501       int mulDim = 1; 
    502       for (int k = 1; k < dim; ++k) 
    503       { 
    504         mulDim *= eachDimSize[k-1]; 
    505         maskIndex += idxLoop[k]*mulDim; 
    506       } 
    507       *(gridMask.dataFirst()+maskIndex) &= maskValue; 
    508  
    509       ++idxLoop[0]; 
    510       ++idx; 
    511     } 
    512  
     515     } 
    513516   } 
    514517 
Note: See TracChangeset for help on using the changeset viewer.