Changeset 567 for XIOS/trunk/src/node/grid.cpp
- Timestamp:
- 03/10/15 10:49:02 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/grid.cpp
r553 r567 20 20 CGrid::CGrid(void) 21 21 : CObjectTemplate<CGrid>(), CGridAttributes() 22 , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 23 , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 22 , isChecked(false), isDomainAxisChecked(false), storeIndex(1) 24 23 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 25 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_() 24 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(), writtenDataSize_(0), globalDim_() 26 25 { 27 26 setVirtualDomainGroup(); … … 31 30 CGrid::CGrid(const StdString & id) 32 31 : CObjectTemplate<CGrid>(id), CGridAttributes() 33 , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 34 , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 32 , isChecked(false), isDomainAxisChecked(false), storeIndex(1) 35 33 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 36 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_() 34 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(), writtenDataSize_(0), globalDim_() 37 35 { 38 36 setVirtualDomainGroup(); … … 42 40 CGrid::~CGrid(void) 43 41 { 44 // this->axis.reset() ;45 // this->domain.reset() ;46 42 deque< CArray<int, 1>* >::iterator it ; 47 43 48 44 for(deque< CArray<int,1>* >::iterator it=storeIndex.begin(); it!=storeIndex.end();it++) delete *it ; 49 for(deque< CArray<int,1>* >::iterator it=out_i_index.begin();it!=out_i_index.end();it++) delete *it ;50 for(deque< CArray<int,1>* >::iterator it=out_j_index.begin();it!=out_j_index.end();it++) delete *it ;51 for(deque< CArray<int,1>* >::iterator it=out_l_index.begin();it!=out_l_index.end();it++) delete *it ;52 53 for(map<int,CArray<int,1>* >::iterator it=out_i_fromClient.begin();it!=out_i_fromClient.end();it++) delete it->second ;54 for(map<int,CArray<int,1>* >::iterator it=out_j_fromClient.begin();it!=out_j_fromClient.end();it++) delete it->second ;55 for(map<int,CArray<int,1>* >::iterator it=out_l_fromClient.begin();it!=out_l_fromClient.end();it++) delete it->second ;56 57 45 for(map<int,CArray<size_t,1>* >::iterator it=outIndexFromClient.begin();it!=outIndexFromClient.end();++it) delete (it->second); 58 46 … … 60 48 if (0 != serverDistribution_) delete serverDistribution_; 61 49 if (0 != serverDistributionDescription_) delete serverDistributionDescription_; 62 63 50 } 64 51 … … 77 64 78 65 //--------------------------------------------------------------- 79 80 const std::deque< CArray<int,1>* > & CGrid::getOutIIndex(void) const 81 { 82 return (this->out_i_index ); 83 } 66 // 67 // const std::deque< CArray<int,1>* > & CGrid::getOutIIndex(void) const 68 // { 69 // return (this->out_i_index ); 70 // } 71 // 72 // //--------------------------------------------------------------- 73 // 74 // const std::deque< CArray<int,1>* > & CGrid::getOutJIndex(void) const 75 // { 76 // return (this->out_j_index ); 77 // } 78 // 79 // //--------------------------------------------------------------- 80 // 81 // const std::deque< CArray<int,1>* > & CGrid::getOutLIndex(void) const 82 // { 83 // return (this->out_l_index ); 84 // } 85 // 86 // //--------------------------------------------------------------- 87 // 88 // const CAxis* CGrid::getRelAxis (void) const 89 // { 90 // return (this->axis ); 91 // } 92 93 // //--------------------------------------------------------------- 94 // 95 // const CDomain* CGrid::getRelDomain(void) const 96 // { 97 // return (this->domain ); 98 // } 84 99 85 100 //--------------------------------------------------------------- 86 101 87 const std::deque< CArray<int,1>* > & CGrid::getOutJIndex(void)const88 {89 return (this->out_j_index);90 }102 // bool CGrid::hasAxis(void) const 103 // { 104 // return (this->withAxis); 105 // } 91 106 92 107 //--------------------------------------------------------------- 93 108 94 const std::deque< CArray<int,1>* > & CGrid::getOutLIndex(void) const95 {96 return (this->out_l_index );97 }98 99 //---------------------------------------------------------------100 101 const CAxis* CGrid::getRelAxis (void) const102 {103 return (this->axis );104 }105 106 //---------------------------------------------------------------107 108 const CDomain* CGrid::getRelDomain(void) const109 {110 return (this->domain );111 }112 113 //---------------------------------------------------------------114 115 bool CGrid::hasAxis(void) const116 {117 return (this->withAxis);118 }119 120 //---------------------------------------------------------------121 122 109 StdSize CGrid::getDimension(void) const 123 110 { 124 return ( (this->withAxis)?3:2);111 return (globalDim_.size()); 125 112 } 126 113 … … 176 163 StdSize CGrid::getDataSize(void) const 177 164 { 178 StdSize retvalue=domain->data_ni.getValue() ; 179 if (domain->data_dim.getValue()==2) retvalue*=domain->data_nj.getValue() ; 180 if (this->withAxis) retvalue*=this->axis->size.getValue() ; 181 165 std::vector<int> dataNindex = clientDistribution_->getDataNIndex(); 166 StdSize retvalue = 1; 167 for (int i = 0; i < dataNindex.size(); ++i) retvalue *= dataNindex[i]; 182 168 return (retvalue); 183 169 } … … 201 187 202 188 203 //---------------------------------------------------------------204 205 // void CGrid::solveReference(void)206 // {207 // if (this->isChecked) return;208 // CContext* context = CContext::getCurrent() ;209 // CContextClient* client=context->client ;210 //211 // this->solveDomainRef() ;212 // this->solveAxisRef() ;213 //214 // if (context->hasClient)215 // {216 // checkMask() ;217 // this->computeIndex() ;218 //219 // this->storeIndex.push_front(new CArray<int,1>() );220 // this->out_i_index.push_front(new CArray<int,1>());221 // this->out_j_index.push_front(new CArray<int,1>());222 // this->out_l_index.push_front(new CArray<int,1>());223 // }224 //// this->computeIndexServer();225 // this->isChecked = true;226 // }227 228 189 void CGrid::solveDomainAxisRef(bool areAttributesChecked) 229 190 { … … 250 211 checkMask() ; 251 212 this->computeIndex() ; 252 253 213 this->storeIndex.push_front(new CArray<int,1>() ); 254 this->out_i_index.push_front(new CArray<int,1>());255 this->out_j_index.push_front(new CArray<int,1>());256 this->out_l_index.push_front(new CArray<int,1>());257 214 } 258 // this->computeIndexServer();259 215 this->isChecked = true; 260 216 } 261 217 262 263 218 void CGrid::checkMask(void) 264 219 { 265 220 using namespace std; 266 267 unsigned int niu = domain->ni, nju = domain->nj; 268 unsigned int nlu = 1 ; 269 if (hasAxis()) nlu=axis->size ; 270 271 if (!mask.isEmpty()) 272 { 273 if ((mask.extent(0) != niu) || 274 (mask.extent(1) != nju) || 275 (mask.extent(2) != nlu)) 276 ERROR("CGrid::checkAttributes(void)", 277 <<"The mask has not the same size than the local grid"<<endl 278 <<"Local size is "<<niu<<"x"<<nju<<"x"<<nlu<<endl 279 <<"Mask size is "<<mask.extent(0)<<"x"<<mask.extent(1)<<"x"<<mask.extent(2)); 280 } 281 else 282 { 283 mask.resize(niu,nju,nlu) ; 284 mask=true ; 285 } 286 287 CArray<bool,2>& domainMask = domain->mask ; 288 for (int l=0; l < nlu ; l++) 289 for (int j=0; j < nju ; j++) 290 for(int i=0; i<niu ; i++) mask(i,j,l) = mask(i,j,l) && domainMask(i,j) ; 291 292 293 } 294 221 std::vector<CDomain*> domainP = this->getDomains(); 222 std::vector<CAxis*> axisP = this->getAxis(); 223 int dim = domainP.size() * 2 + axisP.size(); 224 225 std::vector<CArray<bool,2>* > domainMasks(domainP.size()); 226 for (int i = 0; i < domainMasks.size(); ++i) domainMasks[i] = &(domainP[i]->mask); 227 std::vector<CArray<bool,1>* > axisMasks(axisP.size()); 228 for (int i = 0; i < axisMasks.size(); ++i) axisMasks[i] = &(axisP[i]->mask); 229 230 switch (dim) { 231 case 1: 232 checkGridMask(mask1, domainMasks, axisMasks, axisDomainOrder); 233 break; 234 case 2: 235 checkGridMask(mask2, domainMasks, axisMasks, axisDomainOrder); 236 break; 237 case 3: 238 checkGridMask(mask3, domainMasks, axisMasks, axisDomainOrder); 239 break; 240 // case 4: 241 // checkGridMask(mask4, domainMasks, axisMasks, axisDomainOrder); 242 // break; 243 // case 5: 244 // checkGridMask(mask5, domainMasks, axisMasks, axisDomainOrder); 245 // break; 246 // case 6: 247 // checkGridMask(mask6, domainMasks, axisMasks, axisDomainOrder); 248 // break; 249 // case 7: 250 // checkGridMask(mask7, domainMasks, axisMasks, axisDomainOrder); 251 // break; 252 default: 253 break; 254 } 255 } 295 256 //--------------------------------------------------------------- 296 257 297 // void CGrid::solveDomainRef(void)298 // {299 // if (!domain_ref.isEmpty())300 // {301 // if (CDomain::has(domain_ref.getValue()))302 // {303 // this->domain = CDomain::get(domain_ref.getValue()) ;304 // domain->checkAttributes() ;305 // }306 // else ERROR("CGrid::solveDomainRef(void)",307 // << "Wrong domain reference") ;308 // }309 // else ERROR("CGrid::solveDomainRef(void)",310 // << "Domain reference is not defined") ;311 // }312 //313 // //---------------------------------------------------------------314 //315 // void CGrid::solveAxisRef(void)316 // {317 // if (!axis_ref.isEmpty())318 // {319 // this->withAxis = true ;320 // if (CAxis::get(axis_ref.getValue()))321 // {322 // this->axis = CAxis::get(axis_ref.getValue()) ;323 // axis->checkAttributes() ;324 // }325 // else ERROR("CGrid::solveAxisRef(void)",326 // << "Wrong axis reference") ;327 // }328 // else withAxis = false ;329 // }330 331 332 258 void CGrid::solveDomainRef(bool sendAtt) 333 259 { 334 // if (!domain_ref.isEmpty())335 // {336 // if (CDomain::has(domain_ref.getValue()))337 // {338 // this->domain = CDomain::get(domain_ref.getValue()) ;339 // if (sendAtt) domain->sendCheckedAttributes();340 // else domain->checkAttributesOnClient() ;341 // }342 // else ERROR("CGrid::solveDomainRef(void)",343 // << "Wrong domain reference") ;344 // }345 // else ERROR("CGrid::solveDomainRef(void)",346 // << "Domain reference is not defined") ;347 260 setDomainList(); 348 this->domain = CDomain::get(domList_.at(0)); 349 if (0 != this->domain) 350 { 351 // this->domain = this->getDomain(); 352 if (sendAtt) domain->sendCheckedAttributes(); 353 else domain->checkAttributesOnClient() ; 354 } 355 else ERROR("CGrid::solveDomainRef(void)", 356 << "Domain reference is not defined") ; 261 std::vector<CDomain*> domListP = this->getDomains(); 262 if (!domListP.empty()) 263 { 264 computeGridGlobalDimension(getDomains(), getAxis(), axisDomainOrder); 265 for (int i = 0; i < domListP.size(); ++i) 266 { 267 if (sendAtt) domListP[i]->sendCheckedAttributes(); 268 else domListP[i]->checkAttributesOnClient(); 269 } 270 } 357 271 } 358 272 359 273 //--------------------------------------------------------------- 360 274 361 void CGrid::solveAxisRef(bool checkAtt) 362 { 363 // if (!axis_ref.isEmpty()) 364 // { 365 // this->withAxis = true ; 366 // if (CAxis::get(axis_ref.getValue())) 367 // { 368 // this->axis = CAxis::get(axis_ref.getValue()) ; 369 // axis->checkAttributes() ; 370 // } 371 // else ERROR("CGrid::solveAxisRef(void)", 372 // << "Wrong axis reference") ; 373 // } 374 // else withAxis = false ; 375 // getAllAxis(); 275 void CGrid::solveAxisRef(bool sendAtt) 276 { 376 277 setAxisList(); 377 if (!axisList_.empty()) 378 { 379 int sizeList = axisList_.size(); 380 for (int i = 0; i < sizeList; ++i) 278 std::vector<CAxis*> axisListP = this->getAxis(); 279 if (!axisListP.empty()) 280 { 281 int idx = 0; 282 computeGridGlobalDimension(getDomains(), getAxis(), axisDomainOrder); 283 for (int i = 0; i < axisListP.size(); ++i) 381 284 { 382 CAxis::get(axisList_.at(i))->checkAttributes(); 383 this->axis = CAxis::get(axisList_.at(i)); 285 while (this->axisDomainOrder(idx)) idx += 2; 286 if (sendAtt) 287 axisListP[i]->sendCheckedAttributes(globalDim_,idx); 288 else 289 axisListP[i]->checkAttributesOnClient(globalDim_,idx); 290 ++idx; 384 291 } 385 withAxis = true; 386 387 } 388 // if (!axis_ref.isEmpty()) 389 // { 390 // this->withAxis = true ; 391 // if (CAxis::get(axis_ref.getValue())) 392 // { 393 // this->axis = CAxis::get(axis_ref.getValue()) ; 394 // axis->checkAttributes() ; 395 // } 396 // else ERROR("CGrid::solveAxisRef(void)", 397 // << "Wrong axis reference") ; 398 // } 399 else withAxis = false ; 292 293 } 400 294 } 401 295 … … 415 309 416 310 // Finally, compute index mapping between client(s) and server(s) 417 clientServerMap_.computeServerIndexMapping(clientDistribution_->getGlobalIndex(),serverDistributionDescription_->getGlobalIndex()); 311 clientServerMap_.computeServerIndexMapping(clientDistribution_->getGlobalIndex(), 312 clientDistribution_->getLocalDataIndexSendToServerOnClient(), 313 serverDistributionDescription_->getGlobalIndex()); 418 314 const std::map<int, std::vector<size_t> >& globalIndexOnServer = clientServerMap_.getGlobalIndexOnServer(); 419 315 std::vector<int> connectedServerRank; … … 427 323 storeIndex_client = (clientDistribution_->getLocalDataIndexOnClient()); 428 324 429 /*430 const int ni = domain->ni.getValue() ,431 nj = domain->nj.getValue() ,432 size = (this->hasAxis()) ? axis->size.getValue() : 1 ,433 lbegin = (this->hasAxis()) ? axis->zoom_begin.getValue()-1 : 0 ,434 lend = (this->hasAxis()) ? axis->zoom_end.getValue()-1 : 0 ;435 436 437 const int data_dim = domain->data_dim.getValue() ,438 data_n_index = domain->data_n_index.getValue() ,439 data_ibegin = domain->data_ibegin.getValue() ,440 data_jbegin = (data_dim == 2)441 ? domain->data_jbegin.getValue() : -1;442 443 CArray<int,1> data_i_index = domain->data_i_index ;444 CArray<int,1> data_j_index = domain->data_j_index ;445 446 447 int indexCount = 0;448 449 for(int l = 0; l < size ; l++)450 {451 for(int n = 0, i = 0, j = 0; n < data_n_index; n++)452 {453 int temp_i = data_i_index(n) + data_ibegin,454 temp_j = (data_dim == 1) ? -1455 : data_j_index(n) + data_jbegin;456 i = (data_dim == 1) ? (temp_i - 1) % ni457 : (temp_i - 1) ;458 j = (data_dim == 1) ? (temp_i - 1) / ni459 : (temp_j - 1) ;460 461 if ((l >=lbegin && l<= lend) &&462 (i >= 0 && i < ni) &&463 (j >= 0 && j < nj) && mask(i,j,l))464 indexCount++ ;465 }466 }467 468 storeIndex[0] = new CArray<int,1>(indexCount) ;469 out_i_index[0] = new CArray<int,1>(indexCount) ;470 out_j_index[0] = new CArray<int,1>(indexCount) ;471 out_l_index[0] = new CArray<int,1>(indexCount) ;472 473 storeIndex_client.resize(indexCount) ;474 out_i_client.resize(indexCount) ;475 out_j_client.resize(indexCount) ;476 out_l_client.resize(indexCount) ;477 478 479 for(int count = 0, indexCount = 0, l = 0; l < size; l++)480 {481 for(int n = 0, i = 0, j = 0; n < data_n_index; n++, count++)482 {483 int temp_i = data_i_index(n) + data_ibegin,484 temp_j = (data_dim == 1) ? -1485 : data_j_index(n) + data_jbegin;486 i = (data_dim == 1) ? (temp_i - 1) % ni487 : (temp_i - 1) ;488 j = (data_dim == 1) ? (temp_i - 1) / ni489 : (temp_j - 1) ;490 491 if ((l >= lbegin && l <= lend) &&492 (i >= 0 && i < ni) &&493 (j >= 0 && j < nj) && mask(i,j,l))494 {495 (*storeIndex[0])(indexCount) = count ;496 (*out_l_index[0])(indexCount) = l ;497 (*out_i_index[0])(indexCount) = i ;498 (*out_j_index[0])(indexCount) = j ;499 500 storeIndex_client(indexCount) = count ;501 out_i_client(indexCount)=i+domain->ibegin_client-1 ;502 out_j_client(indexCount)=j+domain->jbegin_client-1 ;503 out_l_client(indexCount)=l-lbegin ;504 indexCount++ ;505 }506 }507 }508 */509 // computeDomConServer();510 // sendIndex() ;511 512 513 325 } 514 326 … … 517 329 CGrid* CGrid::createGrid(CDomain* domain) 518 330 { 519 StdString new_id = StdString("__") + domain->getId() + StdString("__") ;520 CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ;521 522 331 std::vector<CDomain*> vecDom(1,domain); 523 grid->setDomainList(vecDom); 524 // grid->domain_ref.setValue(domain->getId()); 332 std::vector<CAxis*> vecAxis; 333 334 CGrid* grid = createGrid(vecDom, vecAxis); 335 525 336 return (grid); 526 337 } … … 528 339 CGrid* CGrid::createGrid(CDomain* domain, CAxis* axis) 529 340 { 530 StdString new_id = StdString("__") + domain->getId() +531 StdString("_") + axis->getId() + StdString("__") ;532 CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ;533 534 341 std::vector<CDomain*> vecDom(1,domain); 535 342 std::vector<CAxis*> vecAxis(1,axis); 536 grid->setDomainList(vecDom); 537 grid->setAxisList(vecAxis); 538 // grid->domain_ref.setValue(domain->getId()); 539 // grid->axis_ref.setValue(axis->getId()); 343 CGrid* grid = createGrid(vecDom, vecAxis); 344 540 345 return (grid); 541 346 } … … 564 369 } 565 370 371 grid->computeGridGlobalDimension(domains, axis, grid->axisDomainOrder); 372 566 373 return (grid); 567 374 } … … 575 382 { 576 383 return (this->vAxisGroup_); 577 }578 579 //----------------------------------------------------------------580 581 void CGrid::outputField(int rank, const CArray<double, 1>& stored, CArray<double, 3>& field)582 {583 CArray<int,1>& out_i=*out_i_fromClient[rank] ;584 CArray<int,1>& out_j=*out_j_fromClient[rank] ;585 CArray<int,1>& out_l=*out_l_fromClient[rank] ;586 587 for(StdSize n = 0; n < stored.numElements(); n++)588 field(out_i(n), out_j(n), out_l(n)) = stored(n) ;589 }590 591 void CGrid::outputField(int rank, const CArray<double, 1>& stored, CArray<double, 2>& field)592 {593 CArray<int,1>& out_i=*out_i_fromClient[rank] ;594 CArray<int,1>& out_j=*out_j_fromClient[rank] ;595 596 for(StdSize n = 0; n < stored.numElements(); n++)597 field(out_i(n), out_j(n)) = stored(n) ; }598 599 //---------------------------------------------------------------600 601 void CGrid::outputField(int rank,const CArray<double, 1>& stored, CArray<double, 1>& field)602 {603 CArray<int,1>& out_i=*out_i_fromClient[rank] ;604 605 for(StdSize n = 0; n < stored.numElements(); n++)606 field(out_i(n)) = stored(n) ;607 384 } 608 385 … … 629 406 } 630 407 631 //---------------------------------------------------------------632 633 // void CGrid::sendIndex(void)634 // {635 // CContext* context = CContext::getCurrent() ;636 // CContextClient* client=context->client ;637 //638 // CEventClient event(getType(),EVENT_ID_INDEX) ;639 // int rank ;640 // list<shared_ptr<CMessage> > list_msg ;641 // list< CArray<int,1>* > list_out_i,list_out_j,list_out_l ;642 //643 // for(int ns=0;ns<domain->connectedServer.size();ns++)644 // {645 // rank=domain->connectedServer[ns] ;646 //647 // int i,j ;648 // int nb=0 ;649 // for(int k=0;k<storeIndex_client.numElements();k++)650 // {651 // i=out_i_client(k)- domain->ibegin +1;652 // j=out_j_client(k)- domain->jbegin +1;653 // if (domain->mapConnectedServer(i,j)==ns) nb++ ;654 // }655 // CArray<int,1> storeIndex(nb) ;656 // CArray<int,1> out_i(nb) ;657 // CArray<int,1> out_j(nb) ;658 // CArray<int,1> out_l(nb) ;659 //660 //661 // nb=0 ;662 // for(int k=0;k<storeIndex_client.numElements();k++)663 // {664 // i=out_i_client(k)- domain->ibegin +1 ;665 // j=out_j_client(k)- domain->jbegin +1 ;666 // if (domain->mapConnectedServer(i,j)==ns)667 // {668 // storeIndex(nb)=k ;669 // out_i(nb)=domain->i_index(i,j) + domain->ibegin-1;670 // out_j(nb)=domain->j_index(i,j) + domain->jbegin-1;671 // out_l(nb)=out_l_client(k) ;672 // nb++ ;673 // }674 // }675 //676 // storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(storeIndex) )) ;677 // nbSenders.insert(pair<int,int>(rank,domain->nbSenders[ns])) ;678 // list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ;679 // list_out_i.push_back(new CArray<int,1>(out_i)) ;680 // list_out_j.push_back(new CArray<int,1>(out_j)) ;681 // list_out_l.push_back(new CArray<int,1>(out_l)) ;682 //683 // *list_msg.back()<<getId()<<*list_out_i.back()<<*list_out_j.back()<<*list_out_l.back() ;684 // event.push(rank,domain->nbSenders[ns],*list_msg.back()) ;685 // }686 // client->sendEvent(event) ;687 //688 // for(list<CArray<int,1>* >::iterator it=list_out_i.begin();it!=list_out_i.end();it++) delete *it ;689 // for(list<CArray<int,1>* >::iterator it=list_out_j.begin();it!=list_out_j.end();it++) delete *it ;690 // for(list<CArray<int,1>* >::iterator it=list_out_l.begin();it!=list_out_l.end();it++) delete *it ;691 //692 // }693 694 void CGrid::computeDomConServer()695 {696 if (!isDomConServerComputed_)697 {698 for(int ns=0;ns<domain->connectedServer.size(); ++ns)699 {700 int rank=domain->connectedServer[ns] ;701 702 int i,j ;703 int nb=0 ;704 for(int k=0;k<storeIndex_client.numElements();++k)705 {706 i=out_i_client(k)- domain->ibegin +1;707 j=out_j_client(k)- domain->jbegin +1;708 if (domain->mapConnectedServer(i,j)==ns) ++nb ;709 }710 711 domConnectedServerSide_.insert(std::make_pair(rank, nb));712 }713 isDomConServerComputed_ = true;714 }715 }716 717 718 std::map<int, int> CGrid::getDomConServerSide()719 {720 return domConnectedServerSide_;721 }722 723 408 void CGrid::sendIndex(void) 724 409 { … … 739 424 itLocal = localIndexSendToServer.begin(); 740 425 741 for (int ns = 0; itGlobal != iteMap; ++itGlobal, ++itLocal, ++ns) 742 { 743 rank = itGlobal->first; 744 int nb = (itGlobal->second).size(); 745 746 CArray<size_t, 1> outGlobalIndexOnServer(nb); 747 CArray<int, 1> outLocalIndexToServer(nb); 748 for (int k = 0; k < nb; ++k) 749 { 750 outGlobalIndexOnServer(k) = itGlobal->second.at(k); 751 outLocalIndexToServer(k) = itLocal->second.at(k); 752 } 753 754 storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(outLocalIndexToServer) )); 755 listOutIndex.push_back(new CArray<size_t,1>(outGlobalIndexOnServer)); 756 757 list_msg.push_back(shared_ptr<CMessage>(new CMessage)); 758 *list_msg.back()<<getId()<<*listOutIndex.back(); 759 event.push(rank, nbSenders[rank], *list_msg.back()); 760 } 761 client->sendEvent(event); 426 if (!doGridHaveDataDistributed()) 427 { 428 if (0 == client->getClientRank()) 429 { 430 for (int ns = 0; itGlobal != iteMap; ++itGlobal, ++itLocal, ++ns) 431 { 432 rank = itGlobal->first; 433 int nb = (itGlobal->second).size(); 434 435 CArray<size_t, 1> outGlobalIndexOnServer(nb); 436 CArray<int, 1> outLocalIndexToServer(nb); 437 for (int k = 0; k < nb; ++k) 438 { 439 outGlobalIndexOnServer(k) = itGlobal->second.at(k); 440 outLocalIndexToServer(k) = itLocal->second.at(k); 441 } 442 443 storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(outLocalIndexToServer) )); 444 listOutIndex.push_back(new CArray<size_t,1>(outGlobalIndexOnServer)); 445 446 list_msg.push_back(shared_ptr<CMessage>(new CMessage)); 447 *list_msg.back()<<getId()<<*listOutIndex.back(); 448 event.push(rank, 1, *list_msg.back()); 449 } 450 client->sendEvent(event); 451 } else client->sendEvent(event); 452 } 453 else 454 { 455 for (int ns = 0; itGlobal != iteMap; ++itGlobal, ++itLocal, ++ns) 456 { 457 rank = itGlobal->first; 458 int nb = (itGlobal->second).size(); 459 460 CArray<size_t, 1> outGlobalIndexOnServer(nb); 461 CArray<int, 1> outLocalIndexToServer(nb); 462 for (int k = 0; k < nb; ++k) 463 { 464 outGlobalIndexOnServer(k) = itGlobal->second.at(k); 465 outLocalIndexToServer(k) = itLocal->second.at(k); 466 } 467 468 storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(outLocalIndexToServer) )); 469 listOutIndex.push_back(new CArray<size_t,1>(outGlobalIndexOnServer)); 470 471 list_msg.push_back(shared_ptr<CMessage>(new CMessage)); 472 *list_msg.back()<<getId()<<*listOutIndex.back(); 473 event.push(rank, nbSenders[rank], *list_msg.back()); 474 } 475 client->sendEvent(event); 476 } 477 762 478 for(list<CArray<size_t,1>* >::iterator it=listOutIndex.begin();it!=listOutIndex.end();++it) delete *it ; 763 764 /*765 if (!isDomConServerComputed_) computeDomConServer();766 767 for(int ns=0;ns<domain->connectedServer.size();ns++)768 {769 rank=domain->connectedServer[ns] ;770 771 int nb = domConnectedServerSide_.find(rank)->second;772 CArray<int,1> storeIndex(nb) ;773 CArray<int,1> out_i(nb) ;774 CArray<int,1> out_j(nb) ;775 CArray<int,1> out_l(nb) ;776 777 int i, j;778 nb=0 ;779 for(int k=0;k<storeIndex_client.numElements();k++)780 {781 i=out_i_client(k)- domain->ibegin +1 ;782 j=out_j_client(k)- domain->jbegin +1 ;783 if (domain->mapConnectedServer(i,j)==ns)784 {785 storeIndex(nb)=k ;786 out_i(nb)=domain->i_index(i,j) + domain->ibegin-1;787 out_j(nb)=domain->j_index(i,j) + domain->jbegin-1;788 out_l(nb)=out_l_client(k) ;789 nb++ ;790 }791 }792 793 storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(storeIndex) )) ;794 nbSenders.insert(pair<int,int>(rank,domain->nbSenders[ns])) ;795 list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ;796 list_out_i.push_back(new CArray<int,1>(out_i)) ;797 list_out_j.push_back(new CArray<int,1>(out_j)) ;798 list_out_l.push_back(new CArray<int,1>(out_l)) ;799 800 *list_msg.back()<<getId()<<*list_out_i.back()<<*list_out_j.back()<<*list_out_l.back() ;801 event.push(rank,domain->nbSenders[ns],*list_msg.back()) ;802 }803 client->sendEvent(event) ;804 805 for(list<CArray<int,1>* >::iterator it=list_out_i.begin();it!=list_out_i.end();it++) delete *it ;806 for(list<CArray<int,1>* >::iterator it=list_out_j.begin();it!=list_out_j.end();it++) delete *it ;807 for(list<CArray<int,1>* >::iterator it=list_out_l.begin();it!=list_out_l.end();it++) delete *it ;808 */809 479 } 810 480 … … 820 490 get(gridId)->recvIndex(rank,*buffer) ; 821 491 } 492 } 493 494 void CGrid::computeGridGlobalDimension(const std::vector<CDomain*>& domains, 495 const std::vector<CAxis*>& axis, 496 const CArray<bool,1>& axisDomainOrder) 497 { 498 globalDim_.resize(domains.size()*2+axis.size()); 499 int idx = 0, idxDomain = 0, idxAxis = 0; 500 for (int i = 0; i < axisDomainOrder.numElements(); ++i) 501 { 502 if (axisDomainOrder(i)) 503 { 504 globalDim_[idx] = domains[idxDomain]->ni_glo.getValue(); 505 globalDim_[idx+1] = domains[idxDomain]->nj_glo.getValue(); 506 ++idxDomain; 507 idx += 2; 508 } 509 else 510 { 511 globalDim_[idx] = axis[idxAxis]->size.getValue(); 512 ++idxAxis; 513 ++idx; 514 } 515 } 516 } 517 518 std::vector<int> CGrid::getGlobalDimension() 519 { 520 return globalDim_; 521 } 522 523 /*! 524 Verify whether one server need to write data 525 There are some cases on which one server has nodata to write. For example, when we 526 just only want to zoom on a domain. 527 */ 528 bool CGrid::doGridHaveDataToWrite() 529 { 530 return (0 != serverDistribution_); 531 } 532 533 /*! 534 Return size of data which is written on each server 535 Whatever dimension of a grid, data which are written on server must be presented as 536 an one dimension array. 537 \return size of data written on server 538 */ 539 size_t CGrid::getWrittenDataSize() const 540 { 541 return writtenDataSize_; 542 } 543 544 545 const CDistributionServer* CGrid::getDistributionServer() const 546 { 547 return serverDistribution_; 548 } 549 550 bool CGrid::doGridHaveDataDistributed() 551 { 552 return clientDistribution_->isDataDistributed(); 822 553 } 823 554 … … 835 566 indexMap[i] = idx; 836 567 if (true == axisDomainOrder(i)) 837 { 838 ++ssize; 839 idx += 2; 840 } 568 { 569 ++ssize; 570 idx += 2; 571 } 572 else 573 ++idx; 841 574 } 842 575 … … 844 577 std::vector<CDomain*> domainList = getDomains(); 845 578 std::vector<CAxis*> axisList = getAxis(); 846 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize) ;579 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize); 847 580 for (int i = 0; i < numElement; ++i) 848 581 { … … 851 584 nZoomBegin[indexMap[i]] = domainList[domainId]->zoom_ibegin_srv; 852 585 nZoomSize[indexMap[i]] = domainList[domainId]->zoom_ni_srv; 586 nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->zoom_ibegin; 853 587 nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 854 588 855 589 nZoomBegin[indexMap[i]+1] = domainList[domainId]->zoom_jbegin_srv; 856 590 nZoomSize[indexMap[i]+1] = domainList[domainId]->zoom_nj_srv; 591 nZoomBeginGlobal[indexMap[i]+1] = domainList[domainId]->zoom_jbegin; 857 592 nGlob[indexMap[i]+1] = domainList[domainId]->nj_glo; 858 593 ++domainId; … … 860 595 else 861 596 { 862 nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin; 863 nZoomSize[indexMap[i]] = axisList[axisId]->zoom_size; 597 nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin_srv; 598 nZoomSize[indexMap[i]] = axisList[axisId]->zoom_size_srv; 599 nZoomBeginGlobal[indexMap[i]] = axisList[axisId]->zoom_begin; 864 600 nGlob[indexMap[i]] = axisList[axisId]->size; 865 601 ++axisId; 866 602 } 867 603 } 868 serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, nGlob); 604 writtenDataSize_ = 1; 605 for (int i = 0; i < nZoomSize.size(); ++i) 606 writtenDataSize_ *= nZoomSize[i]; 607 608 serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 609 nZoomBeginGlobal, nGlob); 869 610 } 870 611 … … 873 614 serverDistribution_->computeLocalIndex(outIndex); 874 615 outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 875 876 /*877 CArray<int,1> out_i ;878 CArray<int,1> out_j ;879 CArray<int,1> out_l ;880 881 buffer>>out_i>>out_j>>out_l ;882 883 out_i -= domain->zoom_ibegin_srv-1 ;884 out_j -= domain->zoom_jbegin_srv-1 ;885 886 out_i_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_i) )) ;887 out_j_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_j) )) ;888 out_l_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_l) )) ;889 */890 616 } 891 617 … … 1240 966 { 1241 967 SuperClass::parse(node); 968 1242 969 // List order of axis and domain in a grid, if there is a domain, it will take value 1 (true), axis 0 (false) 1243 // std::vector<int> axisOrder;1244 970 std::vector<bool> order; 1245 971
Note: See TracChangeset
for help on using the changeset viewer.