- Timestamp:
- 07/05/16 15:59:10 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp
r887 r888 17 17 : transformationMapping_(), transformationWeight_(), transformationPosition_(), idAuxInputs_() 18 18 { 19 } 20 21 void 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 33 void 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 } 19 78 } 20 79 … … 82 141 } 83 142 143 // compute position of elements on grids 144 computePositionElements(gridDst, gridSrc); 145 std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 84 146 std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 85 147 std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 86 148 CArray<int,1> axisDomainDstOrder = gridDst->axis_domain_order; 149 std::vector<CScalar*> scalarListSrcP = gridSrc->getScalars(); 87 150 std::vector<CAxis*> axisListSrcP = gridSrc->getAxis(); 88 151 std::vector<CDomain*> domainListSrcP = gridSrc->getDomains(); 152 CArray<int,1> axisDomainSrcOrder = gridSrc->axis_domain_order; 89 153 90 154 // Find out global index source of transformed element on corresponding process. … … 95 159 { 96 160 if (idx == elementPositionInGrid) 97 computeExchangeGlobalIndex(indexSrc, globalIndexOfTransformedElementOnProc); //globalElementIndexOnProc[idx]);161 computeExchangeGlobalIndex(indexSrc, axisDomainSrcOrder(idx), globalIndexOfTransformedElementOnProc); //globalElementIndexOnProc[idx]); 98 162 if (2 == axisDomainDstOrder(idx)) // It's domain 99 163 { 100 164 if (idx != elementPositionInGrid) 101 computeExchangeDomainIndex(domainListDestP[ domainIndex],102 domainListSrcP[ domainIndex],165 computeExchangeDomainIndex(domainListDestP[elementPositionInGridDst2DomainPosition_[idx]], 166 domainListSrcP[elementPositionInGridSrc2DomainPosition_[idx]], 103 167 transPos, 104 168 globalElementIndexOnProc[idx]); … … 109 173 { 110 174 if (idx != elementPositionInGrid) 111 computeExchangeAxisIndex(axisListDestP[ axisIndex],112 axisListSrcP[ axisIndex],175 computeExchangeAxisIndex(axisListDestP[elementPositionInGridDst2AxisPosition_[idx]], 176 axisListSrcP[elementPositionInGridSrc2AxisPosition_[idx]], 113 177 transPos, 114 178 globalElementIndexOnProc[idx]); 115 179 ++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]); 116 189 117 190 } … … 269 342 { 270 343 nGlobDst[idx] = globalDstSize; 271 int elementDimension = axisDomain SrcOrder(idx);344 int elementDimension = axisDomainDstOrder(idx); 272 345 273 346 // If this is a domain … … 359 432 /*! 360 433 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 */ 439 void 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 361 458 \param[in] axisDst Axis destination 362 459 \param[in] axisSrc Axis source
Note: See TracChangeset
for help on using the changeset viewer.