Ignore:
Timestamp:
07/05/16 15:59:10 (8 years ago)
Author:
mhnguyen
Message:

Adding new transformation for scalar: Reducing an axis to a scalar

+) Add new xml node for new transformation
+) Add new algorithms for axis reduction
+) Make change in some place to make sure everything work fine

Test
+) On Curie
+) Tests pass and are correct

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp

    r887 r888  
    1717 : transformationMapping_(), transformationWeight_(), transformationPosition_(), idAuxInputs_() 
    1818{ 
     19} 
     20 
     21void CGenericAlgorithmTransformation::apply(const std::vector<std::pair<int,double> >& localIndex, 
     22                                            const double* dataInput, 
     23                                            CArray<double,1>& dataOut, 
     24                                            std::vector<bool>& flagInitial) 
     25{ 
     26  int nbLocalIndex = localIndex.size(); 
     27  for (int idx = 0; idx < nbLocalIndex; ++idx) 
     28  { 
     29    dataOut(localIndex[idx].first) = *(dataInput + idx) * localIndex[idx].second; 
     30  } 
     31} 
     32 
     33void CGenericAlgorithmTransformation::computePositionElements(CGrid* dst, CGrid* src) 
     34{ 
     35  int idxScalar = 0, idxAxis = 0, idxDomain = 0; 
     36  CArray<int,1> axisDomainOrderDst = dst->axis_domain_order; 
     37  for (int i = 0; i < axisDomainOrderDst.numElements(); ++i) 
     38  { 
     39    int dimElement = axisDomainOrderDst(i); 
     40    if (2 == dimElement) 
     41    { 
     42      elementPositionInGridDst2DomainPosition_[i] = idxDomain; 
     43      ++idxDomain; 
     44    } 
     45    else if (1 == dimElement) 
     46    { 
     47      elementPositionInGridDst2AxisPosition_[i] = idxAxis; 
     48      ++idxAxis; 
     49    } 
     50    else 
     51    { 
     52      elementPositionInGridDst2ScalarPosition_[i] = idxScalar; 
     53      ++idxScalar; 
     54    } 
     55  } 
     56 
     57  idxScalar = idxAxis = idxDomain = 0; 
     58  CArray<int,1> axisDomainOrderSrc = src->axis_domain_order; 
     59  for (int i = 0; i < axisDomainOrderSrc.numElements(); ++i) 
     60  { 
     61    int dimElement = axisDomainOrderSrc(i); 
     62    if (2 == dimElement) 
     63    { 
     64      elementPositionInGridSrc2DomainPosition_[i] = idxDomain; 
     65      ++idxDomain; 
     66    } 
     67    else if (1 == dimElement) 
     68    { 
     69      elementPositionInGridSrc2AxisPosition_[i] = idxAxis; 
     70      ++idxAxis; 
     71    } 
     72    else 
     73    { 
     74      elementPositionInGridSrc2ScalarPosition_[i] = idxScalar; 
     75      ++idxScalar; 
     76    } 
     77  } 
    1978} 
    2079 
     
    82141  } 
    83142 
     143  // compute position of elements on grids 
     144  computePositionElements(gridDst, gridSrc); 
     145  std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 
    84146  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
    85147  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
    86148  CArray<int,1> axisDomainDstOrder = gridDst->axis_domain_order; 
     149  std::vector<CScalar*> scalarListSrcP  = gridSrc->getScalars(); 
    87150  std::vector<CAxis*> axisListSrcP = gridSrc->getAxis(); 
    88151  std::vector<CDomain*> domainListSrcP = gridSrc->getDomains(); 
     152  CArray<int,1> axisDomainSrcOrder = gridSrc->axis_domain_order; 
    89153 
    90154  // Find out global index source of transformed element on corresponding process. 
     
    95159  { 
    96160    if (idx == elementPositionInGrid) 
    97       computeExchangeGlobalIndex(indexSrc, globalIndexOfTransformedElementOnProc); //globalElementIndexOnProc[idx]); 
     161      computeExchangeGlobalIndex(indexSrc, axisDomainSrcOrder(idx), globalIndexOfTransformedElementOnProc); //globalElementIndexOnProc[idx]); 
    98162    if (2 == axisDomainDstOrder(idx)) // It's domain 
    99163    { 
    100164      if (idx != elementPositionInGrid) 
    101         computeExchangeDomainIndex(domainListDestP[domainIndex], 
    102                                    domainListSrcP[domainIndex], 
     165        computeExchangeDomainIndex(domainListDestP[elementPositionInGridDst2DomainPosition_[idx]], 
     166                                   domainListSrcP[elementPositionInGridSrc2DomainPosition_[idx]], 
    103167                                   transPos, 
    104168                                   globalElementIndexOnProc[idx]); 
     
    109173    { 
    110174      if (idx != elementPositionInGrid) 
    111         computeExchangeAxisIndex(axisListDestP[axisIndex], 
    112                                  axisListSrcP[axisIndex], 
     175        computeExchangeAxisIndex(axisListDestP[elementPositionInGridDst2AxisPosition_[idx]], 
     176                                 axisListSrcP[elementPositionInGridSrc2AxisPosition_[idx]], 
    113177                                 transPos, 
    114178                                 globalElementIndexOnProc[idx]); 
    115179      ++axisIndex; 
     180 
     181    } 
     182    else //it's a scalar 
     183    { 
     184      if (idx != elementPositionInGrid) 
     185        computeExchangeScalarIndex(scalarListDestP[elementPositionInGridDst2ScalarPosition_[idx]], 
     186                                   scalarListSrcP[elementPositionInGridSrc2ScalarPosition_[idx]], 
     187                                   transPos, 
     188                                   globalElementIndexOnProc[idx]); 
    116189 
    117190    } 
     
    269342  { 
    270343    nGlobDst[idx] = globalDstSize; 
    271     int elementDimension = axisDomainSrcOrder(idx); 
     344    int elementDimension = axisDomainDstOrder(idx); 
    272345 
    273346    // If this is a domain 
     
    359432/*! 
    360433  Find out proc and global index of axis source which axis destination is on demande 
     434  \param[in] scalar Scalar destination 
     435  \param[in] scalar Scalar source 
     436  \param[in] destGlobalIndexPositionInGrid Relative position of axis corresponds to other element of grid. 
     437  \param[out] globalScalarIndexOnProc Global index of axis source on different procs 
     438*/ 
     439void CGenericAlgorithmTransformation::computeExchangeScalarIndex(CScalar* scalarDst, 
     440                                                                 CScalar* scalarSrc, 
     441                                                                 CArray<size_t,1>& destGlobalIndexPositionInGrid, 
     442                                                                 boost::unordered_map<int,std::vector<size_t> >& globalScalarIndexOnProc) 
     443{ 
     444  CContext* context = CContext::getCurrent(); 
     445  CContextClient* client=context->client; 
     446  int clientRank = client->clientRank; 
     447  int clientSize = client->clientSize; 
     448 
     449  globalScalarIndexOnProc.rehash(std::ceil(clientSize/globalScalarIndexOnProc.max_load_factor())); 
     450  for (int idx = 0; idx < clientSize; ++idx) 
     451  { 
     452    globalScalarIndexOnProc[idx].push_back(0); 
     453  } 
     454} 
     455 
     456/*! 
     457  Find out proc and global index of axis source which axis destination is on demande 
    361458  \param[in] axisDst Axis destination 
    362459  \param[in] axisSrc Axis source 
Note: See TracChangeset for help on using the changeset viewer.