Ignore:
Timestamp:
06/22/15 13:36:27 (9 years ago)
Author:
mhnguyen
Message:

Final testing transfomation algorithm: inverse axis (local commit)

+) Make some minor change to make sure one element (axis or domain) be able to have several similar transformation

Test
+) On Curie
+) test_new_feature: test passed with correct data written

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/filter/grid_transformation.cpp

    r621 r622  
    11#include "grid_transformation.hpp" 
    22#include "axis_inverse.hpp" 
     3#include "axis_zoom.hpp" 
     4#include "context.hpp" 
     5#include "context_client.hpp" 
    36#include "transformation_mapping.hpp" 
    4 #include "transformation_enum.hpp" 
     7 
    58#include "axis_algorithm_transformation.hpp" 
    69 
    710namespace xios { 
    811CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 
    9 : gridSource_(source), gridDestination_(destination) 
     12: gridSource_(source), gridDestination_(destination), originalGridSource_(source), 
     13  globalIndexOfCurrentGridSource_(0), globalIndexOfOriginalGridSource_(0) 
    1014{ 
    1115  //Verify the compatibity between two grids 
     
    2630  } 
    2731 
     32  std::vector<CAxis*> axisSrcTmp = gridSource_->getAxis(), axisSrc; 
     33  std::vector<CDomain*> domainSrcTmp = gridSource_->getDomains(), domainSrc; 
     34  for (int idx = 0; idx < axisSrcTmp.size(); ++idx) 
     35  { 
     36    CAxis* axis = CAxis::createAxis(); 
     37    axisSrcTmp[idx]->duplicateAttributes(axis); 
     38    axisSrc.push_back(axis); 
     39  } 
     40 
     41  for (int idx = 0; idx < domainSrcTmp.size(); ++idx) 
     42  { 
     43    CDomain* domain = CDomain::createDomain(); 
     44    domainSrcTmp[idx]->duplicateAttributes(domain); 
     45    domainSrc.push_back(domain); 
     46  } 
     47 
     48  gridSource_ = CGrid::createGrid(domainSrc, axisSrc, gridDestination_->axis_domain_order); 
    2849  gridSourceDimensionSize_ = gridSource_->getGlobalDimension(); 
    2950  gridDestinationDimensionSize_ = gridDestination_->getGlobalDimension(); 
     51 
     52  initializeMappingOfOriginalGridSource(); 
    3053  initializeAlgorithms(); 
    3154} 
    3255 
     56void CGridTransformation::initializeMappingOfOriginalGridSource() 
     57{ 
     58  CContext* context = CContext::getCurrent(); 
     59  CContextClient* client=context->client; 
     60 
     61  CDistributionClient distribution(client->clientRank, originalGridSource_); 
     62  const CArray<size_t,1>& globalIndexGridDestSendToServer = distribution.getGlobalDataIndexSendToServer(); 
     63 
     64  globalIndexOfCurrentGridSource_   = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 
     65  globalIndexOfOriginalGridSource_  = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 
     66  *globalIndexOfCurrentGridSource_  = globalIndexGridDestSendToServer; 
     67  *globalIndexOfOriginalGridSource_ = globalIndexGridDestSendToServer; 
     68} 
     69 
    3370CGridTransformation::~CGridTransformation() 
    3471{ 
    35   std::map<int, std::vector<CGenericAlgorithmTransformation*> >::const_iterator itb = algoTransformation_.begin(), it, 
    36                                                                                 ite = algoTransformation_.end(); 
    37   for (it = itb; it != ite; ++it) 
    38     for (int idx = 0; idx < (it->second).size(); ++idx) 
    39       delete (it->second)[idx]; 
     72  std::list<CGenericAlgorithmTransformation*>::const_iterator itb = algoTransformation_.begin(), it, 
     73                                                              ite = algoTransformation_.end(); 
     74  for (it = itb; it != ite; ++it) delete (*it); 
    4075 
    4176  std::map<int, std::vector<CArray<int,1>* > >::const_iterator itMapRecv, iteMapRecv; 
     
    5287  iteMap = localIndexToSendFromGridSource_.end(); 
    5388  for (; itMap != iteMap; ++itMap) delete (itMap->second); 
     89 
     90  if (0 != globalIndexOfCurrentGridSource_) delete globalIndexOfCurrentGridSource_; 
     91  if (0 != globalIndexOfOriginalGridSource_) delete globalIndexOfOriginalGridSource_; 
    5492} 
    5593 
     
    86124    for (int i = 0; i < axisListDestP.size(); ++i) 
    87125    { 
     126      elementPosition2AxisPositionInGrid_[axisPositionInGrid[i]] = i; 
    88127      if (axisListDestP[i]->hasTransformation()) 
    89128      { 
    90         CGenericAlgorithmTransformation* algo = 0; 
    91129        CAxis::TransMapTypes trans = axisListDestP[i]->getAllTransformations(); 
    92130        CAxis::TransMapTypes::const_iterator itb = trans.begin(), it, 
    93131                                             ite = trans.end(); 
    94         std::vector<ETranformationType> algoAxis; 
     132        int transformationOrder = 0; 
    95133        for (it = itb; it != ite; ++it) 
    96134        { 
    97           algoAxis.push_back(it->first); 
     135          listAlgos_.push_back(std::make_pair(axisPositionInGrid[i], std::make_pair(it->first, transformationOrder))); 
     136          ++transformationOrder; 
    98137        } 
    99         algo = new CAxisAlgorithmTransformation(axisListDestP[i], axisListSrcP[i], algoAxis); 
    100         algoTransformation_[axisPositionInGrid[i]].push_back(algo); 
    101138      } 
    102139    } 
     
    108145 
    109146} 
     147 
     148void CGridTransformation::selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     149{ 
     150   selectAxisAlgo(elementPositionInGrid, transType, transformationOrder); 
     151} 
     152 
     153void CGridTransformation::selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     154{ 
     155  std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 
     156  std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 
     157 
     158  int axisIndex =  elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 
     159  CAxis::TransMapTypes trans = axisListDestP[axisIndex]->getAllTransformations(); 
     160  CAxis::TransMapTypes::const_iterator it = trans.begin(); 
     161 
     162  for (int i = 0; i < transformationOrder; ++i, ++it) {}  // Find the correct transformation 
     163 
     164  CZoomAxis* zoomAxis = 0; 
     165  CGenericAlgorithmTransformation* algo = 0; 
     166  switch (transType) 
     167  { 
     168    case TRANS_ZOOM_AXIS: 
     169      zoomAxis = dynamic_cast<CZoomAxis*> (it->second); 
     170      algo = new CAxisZoom(axisListDestP[axisIndex], axisListSrcP[axisIndex], zoomAxis); 
     171      break; 
     172    case TRANS_INVERSE_AXIS: 
     173      algo = new CAxisInverse(axisListDestP[axisIndex], axisListSrcP[axisIndex]); 
     174      break; 
     175    default: 
     176      break; 
     177  } 
     178  algoTransformation_.push_back(algo); 
     179 
     180} 
     181 
     182void CGridTransformation::selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     183{ 
     184 
     185} 
     186 
     187void CGridTransformation::setUpGrid(int elementPositionInGrid, ETranformationType transType) 
     188{ 
     189  std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 
     190  std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 
     191 
     192  int axisIndex; 
     193  switch (transType) 
     194  { 
     195    case TRANS_ZOOM_AXIS: 
     196    case TRANS_INVERSE_AXIS: 
     197      axisIndex =  elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 
     198      axisListDestP[axisIndex]->duplicateAttributes(axisListSrcP[axisIndex]); 
     199      break; 
     200    default: 
     201      break; 
     202  } 
     203} 
     204 
     205void CGridTransformation::computeAll() 
     206{ 
     207  CContext* context = CContext::getCurrent(); 
     208  CContextClient* client=context->client; 
     209 
     210  ListAlgoType::const_iterator itb = listAlgos_.begin(), 
     211                               ite = listAlgos_.end(), it; 
     212  CGenericAlgorithmTransformation* algo = 0; 
     213  for (it = itb; it != ite; ++it) 
     214  { 
     215    std::map<size_t, std::set<size_t> > globaIndexMapFromDestToSource; 
     216    int elementPositionInGrid = it->first; 
     217    ETranformationType transType = (it->second).first; 
     218    int transformationOrder = (it->second).second; 
     219 
     220    // First of all, select an algorithm 
     221    selectAlgo(elementPositionInGrid, transType, transformationOrder); 
     222    algo = algoTransformation_.back(); 
     223 
     224    // Recalculate the distribution of grid destination 
     225    CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 
     226    const CArray<size_t,1>& globalIndexGridDestSendToServer = distributionClientDest.getGlobalDataIndexSendToServer(); 
     227 
     228    // ComputeTransformation of global index of each element 
     229    std::vector<int> gridDestinationDimensionSize = gridDestination_->getGlobalDimension(); 
     230    int elementPosition = it->first; 
     231    algo->computeGlobalSourceIndex(elementPosition, 
     232                                   gridDestinationDimensionSize, 
     233                                   globalIndexGridDestSendToServer, 
     234                                   globaIndexMapFromDestToSource); 
     235 
     236    // Compute transformation of global indexes among grids 
     237    computeTransformationFromOriginalGridSource(globaIndexMapFromDestToSource); 
     238 
     239    // Now grid destination becomes grid source in a new transformation 
     240    setUpGrid(elementPositionInGrid, transType); 
     241  } 
     242 
     243 std::cout << "global index destination 0 " << *globalIndexOfCurrentGridSource_ << std::endl; 
     244 std::cout << "global index destination 1 " << *globalIndexOfOriginalGridSource_ << std::endl; 
     245  computeFinalTransformationMapping(); 
     246} 
     247 
    110248 
    111249/*! 
     
    116254void CGridTransformation::computeTransformation() 
    117255{ 
    118   const CArray<size_t,1>& globalIndexGridDestSendToServer = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
    119   std::map<int, std::vector<CGenericAlgorithmTransformation*> >::const_iterator itbMap, itMap, iteMap; 
    120   itbMap = algoTransformation_.begin(); 
    121   iteMap = algoTransformation_.end(); 
    122  
    123   std::vector<CGenericAlgorithmTransformation*>::const_iterator itbVec, itVec, iteVec; 
    124  
    125   for (itMap = itbMap; itMap != iteMap; ++itMap) 
    126   { 
    127     int elementPosition = itMap->first; 
    128     itbVec = (itMap->second).begin(); 
    129     iteVec = (itMap->second).end(); 
    130     for (itVec = itbVec; itVec != iteVec; ++itVec) 
    131     { 
    132       (*itVec)->computeGlobalSourceIndex(elementPosition, 
    133                                          gridDestinationDimensionSize_, 
    134                                          globalIndexGridDestSendToServer, 
    135                                          globaIndexMapFromDestToSource_); 
    136     } 
    137   } 
     256//  const CArray<size_t,1>& globalIndexGridDestSendToServer = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
     257//  std::list<std::pair<int,CGenericAlgorithmTransformation*> >::const_iterator itbMap, itMap, iteMap; 
     258//  itbMap = algoTransformation_.begin(); 
     259//  iteMap = algoTransformation_.end(); 
     260// 
     261//  std::vector<CGenericAlgorithmTransformation*>::const_iterator itbVec, itVec, iteVec; 
     262// 
     263//  for (itMap = itbMap; itMap != iteMap; ++itMap) 
     264//  { 
     265//    int elementPosition = itMap->first; 
     266//    itbVec = (itMap->second).begin(); 
     267//    iteVec = (itMap->second).end(); 
     268//    for (itVec = itbVec; itVec != iteVec; ++itVec) 
     269//    { 
     270//      (*itVec)->computeGlobalSourceIndex(elementPosition, 
     271//                                         gridDestinationDimensionSize_, 
     272//                                         globalIndexGridDestSendToServer, 
     273//                                         globaIndexMapFromDestToSource_); 
     274//    } 
     275//  } 
     276} 
     277 
     278/*! 
     279  A transformation from a grid source to grid destination often passes several intermediate grids, which play a role of 
     280temporary grid source and/or grid destination. This function makes sure that global index of original grid source are mapped correctly to 
     281the final grid destination 
     282*/ 
     283void CGridTransformation::computeTransformationFromOriginalGridSource(const std::map<size_t, std::set<size_t> >& globaIndexMapFromDestToSource) 
     284{ 
     285  CContext* context = CContext::getCurrent(); 
     286  CContextClient* client=context->client; 
     287 
     288  CTransformationMapping transformationMap(gridDestination_, gridSource_); 
     289 
     290    // Then compute transformation mapping among clients 
     291  transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource); 
     292 
     293  const std::map<int,std::vector<std::vector<size_t> > >& globalIndexToReceive = transformationMap.getGlobalIndexReceivedOnGridDestMapping(); 
     294  const std::map<int,std::vector<size_t> >& globalIndexToSend = transformationMap.getGlobalIndexSendToGridDestMapping(); 
     295 
     296 // Sending global index of original grid source 
     297  std::map<int,std::vector<size_t> >::const_iterator itbSend = globalIndexToSend.begin(), itSend, 
     298                                                     iteSend = globalIndexToSend.end(); 
     299  CArray<size_t,1>::const_iterator itbArr = globalIndexOfCurrentGridSource_->begin(), itArr, 
     300                                   iteArr = globalIndexOfCurrentGridSource_->end(); 
     301 int sendBuffSize = 0; 
     302 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize += (itSend->second).size(); 
     303 
     304 unsigned long* sendBuff, *currentSendBuff; 
     305 if (0 != sendBuffSize) sendBuff = new unsigned long [sendBuffSize]; 
     306 int currentBuffPosition = 0; 
     307 for (itSend = itbSend; itSend != iteSend; ++itSend) 
     308 { 
     309   int destRank = itSend->first; 
     310   const std::vector<size_t>& globalIndexOfCurrentGridSourceToSend = itSend->second; 
     311   int countSize = globalIndexOfCurrentGridSourceToSend.size(); 
     312   for (int idx = 0; idx < (countSize); ++idx) 
     313   { 
     314     itArr = std::find(itbArr, iteArr, globalIndexOfCurrentGridSourceToSend[idx]); 
     315     if (iteArr != itArr) 
     316     { 
     317       int index = std::distance(itbArr, itArr); 
     318       sendBuff[idx+currentBuffPosition] = (*globalIndexOfOriginalGridSource_)(index); 
     319     } 
     320   } 
     321   currentSendBuff = sendBuff + currentBuffPosition; 
     322   MPI_Send(currentSendBuff, countSize, MPI_UNSIGNED_LONG, destRank, 14, client->intraComm); 
     323   currentBuffPosition += countSize; 
     324 } 
     325 
     326 // Receiving global index of grid source sending from current grid source 
     327 std::map<int,std::vector<std::vector<size_t> > >::const_iterator itbRecv = globalIndexToReceive.begin(), itRecv, 
     328                                                                  iteRecv = globalIndexToReceive.end(); 
     329 int recvBuffSize = 0; 
     330 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += (itRecv->second).size(); 
     331 
     332 unsigned long* recvBuff, *currentRecvBuff; 
     333 if (0 != recvBuffSize) recvBuff = new unsigned long [recvBuffSize]; 
     334 int currentRecvBuffPosition = 0; 
     335 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 
     336 { 
     337   MPI_Status status; 
     338   int srcRank = itRecv->first; 
     339   int countSize = (itRecv->second).size(); 
     340   currentRecvBuff = recvBuff + currentRecvBuffPosition; 
     341   MPI_Recv(currentRecvBuff, countSize, MPI_UNSIGNED_LONG, srcRank, 14, client->intraComm, &status); 
     342   currentRecvBuffPosition += countSize; 
     343 } 
     344 
     345 int nbCurrentGridSource = 0; 
     346 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 
     347 { 
     348   int ssize = (itRecv->second).size(); 
     349   for (int idx = 0; idx < ssize; ++idx) 
     350   { 
     351     nbCurrentGridSource += (itRecv->second)[idx].size(); 
     352   } 
     353 } 
     354 
     355 globalIndexOfCurrentGridSource_->resize(nbCurrentGridSource); 
     356 globalIndexOfOriginalGridSource_->resize(nbCurrentGridSource); 
     357 int k = 0; 
     358 currentRecvBuff = recvBuff; 
     359 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 
     360 { 
     361   int countSize = (itRecv->second).size(); 
     362   for (int idx = 0; idx < countSize; ++idx, ++currentRecvBuff) 
     363   { 
     364     int ssize = (itRecv->second)[idx].size(); 
     365     for (int i = 0; i < ssize; ++i) 
     366     { 
     367       (*globalIndexOfCurrentGridSource_)(k) = (itRecv->second)[idx][i]; 
     368       (*globalIndexOfOriginalGridSource_)(k) = *currentRecvBuff; 
     369       ++k; 
     370     } 
     371   } 
     372 } 
     373 
     374 if (0 != sendBuffSize) delete [] sendBuff; 
     375 if (0 != recvBuffSize) delete [] recvBuff; 
    138376} 
    139377 
     
    143381of two grids. Then local index mapping between data on each grid will be found out thanks to these global indexes 
    144382*/ 
    145 void CGridTransformation::computeTransformationMapping() 
    146 { 
    147   CTransformationMapping transformationMap(gridDestination_, gridSource_); 
    148  
    149   // First of all, need to compute global index mapping representing transformation algorithms 
    150   computeTransformation(); 
     383void CGridTransformation::computeFinalTransformationMapping() 
     384{ 
     385  CContext* context = CContext::getCurrent(); 
     386  CContextClient* client=context->client; 
     387 
     388  CTransformationMapping transformationMap(gridDestination_, originalGridSource_); 
     389 
     390  std::map<size_t, std::set<size_t> > globaIndexMapFromDestToSource; 
     391 
     392  int nb = globalIndexOfCurrentGridSource_->numElements(); 
     393  for (int idx = 0; idx < nb; ++idx) 
     394  { 
     395    globaIndexMapFromDestToSource[(*globalIndexOfCurrentGridSource_)(idx)].insert((*globalIndexOfOriginalGridSource_)(idx)); 
     396  } 
    151397 
    152398  // Then compute transformation mapping among clients 
    153   transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource_); 
     399  transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource); 
    154400 
    155401  const std::map<int,std::vector<std::vector<size_t> > >& globalIndexToReceive = transformationMap.getGlobalIndexReceivedOnGridDestMapping(); 
    156402  const std::map<int,std::vector<size_t> >& globalIndexToSend = transformationMap.getGlobalIndexSendToGridDestMapping(); 
    157403 
    158   CArray<int, 1> localIndexOnClientDest = gridDestination_->getDistributionClient()->getLocalDataIndexOnClient(); 
    159   CArray<size_t,1> globalIndexOnClientDest = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
    160  
    161   CArray<int, 1> localIndexOnClientSrc = gridSource_->getDistributionClient()->getLocalDataIndexOnClient(); 
    162   CArray<size_t,1> globalIndexOnClientSrc = gridSource_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
    163  
     404  CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 
     405  CDistributionClient distributionClientSrc(client->clientRank, gridSource_); 
     406 
     407  CArray<int, 1> localIndexOnClientDest = distributionClientDest.getLocalDataIndexOnClient(); //gridDestination_->getDistributionClient()->getLocalDataIndexOnClient(); 
     408  CArray<size_t,1> globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer(); //gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
     409 
     410 std::cout << "dest: local index " << localIndexOnClientDest << std::endl; 
     411 std::cout << "dest: global index " << globalIndexOnClientDest << std::endl; 
     412  CArray<int, 1> localIndexOnClientSrc = distributionClientSrc.getLocalDataIndexOnClient(); //gridSource_->getDistributionClient()->getLocalDataIndexOnClient(); 
     413  CArray<size_t,1> globalIndexOnClientSrc = distributionClientSrc.getGlobalDataIndexSendToServer(); //gridSource_->getDistributionClient()->getGlobalDataIndexSendToServer(); 
     414 std::cout << "src: local index " << localIndexOnClientSrc << std::endl; 
     415 std::cout << "src: global index " << globalIndexOnClientSrc << std::endl; 
    164416  std::vector<size_t>::const_iterator itbVec, itVec, iteVec; 
    165417  CArray<size_t, 1>::iterator itbArr, itArr, iteArr; 
Note: See TracChangeset for help on using the changeset viewer.