- Timestamp:
- 09/24/20 12:12:53 (4 years ago)
- Location:
- XIOS/dev/dev_ym/XIOS_COUPLING/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/config/scalar_attribute.conf
r1493 r1940 8 8 9 9 /* LOCAL and GLOBAL*/ 10 DECLARE_ATTRIBUTE(bool, mask, false) 10 11 DECLARE_ATTRIBUTE(double, value) 11 12 DECLARE_ATTRIBUTE(StdString, bounds_name) 12 13 DECLARE_ARRAY(double, 1 , bounds) 14 13 15 14 16 DECLARE_ATTRIBUTE(StdString, scalar_ref) -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp
r1938 r1940 3266 3266 std::vector<CDomain*> domainList = this->getDomains(); 3267 3267 std::vector<CAxis*> axisList = this->getAxis(); 3268 std::vector<CScalar*> scalarList = this->getScalars(); 3268 3269 auto domain=domainList.begin() ; 3269 3270 auto axis=axisList.begin() ; 3271 auto scalar=scalarList.begin() ; 3270 3272 vector<CLocalElement*> elements; 3271 3273 for(auto order : order_) … … 3283 3285 else if (order==0) 3284 3286 { 3287 elements.push_back((*scalar)->getLocalElement()); 3288 scalar++ ; 3285 3289 } 3286 3290 } -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp
r1934 r1940 9 9 #include "context.hpp" 10 10 11 namespace xios { 12 13 /// ////////////////////// Définitions ////////////////////// /// 14 15 CScalar::CScalar(void) 16 : CObjectTemplate<CScalar>() 17 , CScalarAttributes() 18 , relFiles() 19 { /* Ne rien faire de plus */ } 20 21 CScalar::CScalar(const StdString & id) 22 : CObjectTemplate<CScalar>(id) 23 , CScalarAttributes() 24 , relFiles() 25 { /* Ne rien faire de plus */ } 26 27 CScalar::~CScalar(void) 28 { /* Ne rien faire de plus */ } 29 30 std::map<StdString, ETranformationType> CScalar::transformationMapList_ = std::map<StdString, ETranformationType>(); 31 bool CScalar::dummyTransformationMapList_ = CScalar::initializeTransformationMap(CScalar::transformationMapList_); 32 bool CScalar::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 33 { 34 m["reduce_axis"] = TRANS_REDUCE_AXIS_TO_SCALAR; 35 m["extract_axis"] = TRANS_EXTRACT_AXIS_TO_SCALAR; 36 m["reduce_domain"] = TRANS_REDUCE_DOMAIN_TO_SCALAR; 37 m["reduce_scalar"] = TRANS_REDUCE_SCALAR_TO_SCALAR; 38 } 39 40 StdString CScalar::GetName(void) { return (StdString("scalar")); } 41 StdString CScalar::GetDefName(void){ return (CScalar::GetName()); } 42 ENodeType CScalar::GetType(void) { return (eScalar); } 43 44 CScalar* CScalar::createScalar() 45 { 46 CScalar* scalar = CScalarGroup::get("scalar_definition")->createChild(); 47 return scalar; 48 } 49 50 bool CScalar::IsWritten(const StdString & filename) const 51 { 52 return (this->relFiles.find(filename) != this->relFiles.end()); 53 } 54 55 void CScalar::addRelFile(const StdString& filename) 56 { 11 namespace xios 12 { 13 14 /// ////////////////////// Définitions ////////////////////// /// 15 16 CScalar::CScalar(void) 17 : CObjectTemplate<CScalar>() 18 , CScalarAttributes() 19 , relFiles() 20 { /* Ne rien faire de plus */ } 21 22 CScalar::CScalar(const StdString & id) 23 : CObjectTemplate<CScalar>(id) 24 , CScalarAttributes() 25 , relFiles() 26 { /* Ne rien faire de plus */ } 27 28 CScalar::~CScalar(void) 29 { /* Ne rien faire de plus */ } 30 31 std::map<StdString, ETranformationType> CScalar::transformationMapList_ = std::map<StdString, ETranformationType>(); 32 bool CScalar::dummyTransformationMapList_ = CScalar::initializeTransformationMap(CScalar::transformationMapList_); 33 bool CScalar::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 34 { 35 m["reduce_axis"] = TRANS_REDUCE_AXIS_TO_SCALAR; 36 m["extract_axis"] = TRANS_EXTRACT_AXIS_TO_SCALAR; 37 m["reduce_domain"] = TRANS_REDUCE_DOMAIN_TO_SCALAR; 38 m["reduce_scalar"] = TRANS_REDUCE_SCALAR_TO_SCALAR; 39 } 40 41 StdString CScalar::GetName(void) { return (StdString("scalar")); } 42 StdString CScalar::GetDefName(void){ return (CScalar::GetName()); } 43 ENodeType CScalar::GetType(void) { return (eScalar); } 44 45 CScalar* CScalar::createScalar() 46 { 47 CScalar* scalar = CScalarGroup::get("scalar_definition")->createChild(); 48 return scalar; 49 } 50 51 bool CScalar::IsWritten(const StdString & filename) const 52 { 53 return (this->relFiles.find(filename) != this->relFiles.end()); 54 } 55 56 void CScalar::addRelFile(const StdString& filename) 57 { 57 58 this->relFiles.insert(filename); 58 } 59 60 void CScalar::checkAttributes(void) 61 { 62 if (checkAttributes_done_) return ; 63 64 checkAttributes_done_ = true ; 65 } 59 } 60 61 void CScalar::checkAttributes(void) 62 { 63 if (checkAttributes_done_) return ; 64 checkAttributes_done_ = true ; 65 66 if (mask.isEmpty()) mask=true ; 67 68 initializeLocalElement() ; 69 addFullView() ; 70 addWorkflowView() ; 71 addModelView() ; 72 } 66 73 67 74 void CScalar::checkAttributesOnClient() … … 243 250 CArray<size_t,1> ind(1) ; 244 251 ind(0)=0 ; 245 246 252 localElement_ = new CLocalElement(rank, 1, ind) ; 247 253 } … … 256 262 void CScalar::addWorkflowView(void) 257 263 { 258 CArray<int,1> index(1) ; 259 for(int i=0; i<1 ; i++) index(0)=0 ; 260 localElement_ -> addView(CElementView::WORKFLOW, index) ; 264 CArray<int,1> index ; 265 if (mask) 266 { 267 index.resize(1) ; 268 index(0)=0 ; 269 } 270 else index.resize(0) ; 271 localElement_ -> addView(CElementView::WORKFLOW, index) ; 261 272 } 262 273 … … 277 288 278 289 279 290 void CScalar::computeRemoteElement(CContextClient* client, EDistributionType type) 280 291 { 281 292 CContext* context = CContext::getCurrent(); … … 284 295 int nbServer = client->serverSize; 285 296 size_t nglo=1 ; 286 CArray<size_t,1> indGlo ;297 CArray<size_t,1> indGlo(nglo) ; 287 298 for(size_t i=0;i<nglo;i++) indGlo(i) = i ; 288 for (auto& rankServer : client->getRanksServerLeader()) globalIndex[rankServer] = indGlo;299 for (auto& rankServer : client->getRanksServerLeader()) globalIndex[rankServer].reference(indGlo.copy()) ; 289 300 290 301 remoteElement_[client] = new CDistributedElement(nglo, globalIndex) ; … … 292 303 } 293 304 294 void CScalar::distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex) 295 { 305 void CScalar::distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex, const string& scalarId) 306 { 307 308 string serverScalarId = scalarId.empty() ? this->getId() : scalarId ; 296 309 CContext* context = CContext::getCurrent(); 310 311 this->sendAllAttributesToServer(client, serverScalarId) ; 312 297 313 CDistributedElement scatteredElement(1,globalIndex) ; 298 clientToServerConnector_[client] = new CScattererConnector(localElement_->getView(CElementView::FULL), scatteredElement.getView(CElementView::FULL), 299 context->getIntraComm()) ; 300 clientToServerConnector_[client] ->computeConnector() ; 301 302 // need to be completed 303 304 } 314 scatteredElement.addFullView() ; 315 CScattererConnector scattererConnector(localElement_->getView(CElementView::FULL), scatteredElement.getView(CElementView::FULL), context->getIntraComm()) ; 316 scattererConnector.computeConnector() ; 317 318 // phase 0 319 // send remote element to construct the full view on server, ie without hole 320 CEventClient event0(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 321 CMessage message0 ; 322 message0<<serverScalarId<<0 ; 323 remoteElement_[client]->sendToServer(client,event0,message0) ; 324 325 // phase 1 326 // send the full view of element to construct the connector which connect distributed data coming from client to the full local view 327 CEventClient event1(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 328 CMessage message1 ; 329 message1<<serverScalarId<<1<<localElement_->getView(CElementView::FULL)->getGlobalSize() ; 330 scattererConnector.transfer(localElement_->getView(CElementView::FULL)->getGlobalIndex(),client,event1,message1) ; 331 332 sendDistributedAttributes(client, scattererConnector, scalarId) ; 333 334 // phase 2 send the mask : data index + mask2D 335 CArray<bool,1> maskIn(localElement_->getView(CElementView::WORKFLOW)->getSize()); 336 CArray<bool,1> maskOut ; 337 CLocalConnector workflowToFull(localElement_->getView(CElementView::WORKFLOW), localElement_->getView(CElementView::FULL)) ; 338 workflowToFull.computeConnector() ; 339 maskIn=true ; 340 workflowToFull.transfer(maskIn,maskOut,false) ; 341 342 // phase 3 : prepare grid scatterer connector to send data from client to server 343 map<int,CArray<size_t,1>> workflowGlobalIndex ; 344 map<int,CArray<bool,1>> maskOut2 ; 345 scattererConnector.transfer(maskOut, maskOut2) ; 346 scatteredElement.addView(CElementView::WORKFLOW, maskOut2) ; 347 scatteredElement.getView(CElementView::WORKFLOW)->getGlobalIndexView(workflowGlobalIndex) ; 348 // create new workflow view for scattered element 349 CDistributedElement clientToServerElement(scatteredElement.getGlobalSize(), workflowGlobalIndex) ; 350 clientToServerElement.addFullView() ; 351 CEventClient event2(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 352 CMessage message2 ; 353 message2<<serverScalarId<<2 ; 354 clientToServerElement.sendToServer(client, event2, message2) ; 355 clientToServerConnector_[client] = new CScattererConnector(localElement_->getView(CElementView::WORKFLOW), 356 clientToServerElement.getView(CElementView::FULL), context->getIntraComm()) ; 357 clientToServerConnector_[client]->computeConnector() ; 358 359 360 CEventClient event3(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 361 CMessage message3 ; 362 message3<<serverScalarId<<3 ; 363 clientToServerConnector_[client]->transfer(maskIn,client,event3,message3) ; 364 365 clientFromServerConnector_[client] = new CGathererConnector(clientToServerElement.getView(CElementView::FULL), localElement_->getView(CElementView::WORKFLOW)); 366 clientFromServerConnector_[client]->computeConnector() ; 367 368 } 369 370 void CScalar::recvScalarDistribution(CEventServer& event) 371 TRY 372 { 373 string scalarId; 374 int phasis ; 375 for (auto& subEvent : event.subEvents) (*subEvent.buffer) >> scalarId >> phasis ; 376 get(scalarId)->receivedScalarDistribution(event, phasis); 377 } 378 CATCH 379 380 void CScalar::receivedScalarDistribution(CEventServer& event, int phasis) 381 TRY 382 { 383 CContext* context = CContext::getCurrent(); 384 if (phasis==0) // receive the remote element to construct the full view 385 { 386 localElement_ = new CLocalElement(context->getIntraCommRank(),event) ; 387 localElement_->addFullView() ; 388 // construct the local dimension and indexes 389 auto& globalIndex=localElement_->getGlobalIndex() ; 390 int nk=globalIndex.numElements() ; 391 // no distribution for scalar => nk ==1 or maybe 0 ? 392 } 393 else if (phasis==1) // receive the sent view from client to construct the full distributed full view on server 394 { 395 CContext* context = CContext::getCurrent(); 396 CDistributedElement* elementFrom = new CDistributedElement(event) ; 397 elementFrom->addFullView() ; 398 gathererConnector_ = new CGathererConnector(elementFrom->getView(CElementView::FULL), localElement_->getView(CElementView::FULL)) ; 399 gathererConnector_->computeConnector() ; 400 } 401 else if (phasis==2) 402 { 403 delete gathererConnector_ ; 404 elementFrom_ = new CDistributedElement(event) ; 405 elementFrom_->addFullView() ; 406 gathererConnector_ = new CGathererConnector(elementFrom_->getView(CElementView::FULL), localElement_->getView(CElementView::FULL)) ; 407 gathererConnector_ -> computeConnector() ; 408 } 409 else if (phasis==3) 410 { 411 CArray<bool,1> localMask ; 412 gathererConnector_->transfer(event,localMask,false) ; 413 localElement_->addView(CElementView::WORKFLOW, localMask) ; 414 mask = localMask(0) ; 415 416 serverFromClientConnector_ = new CGathererConnector(elementFrom_->getView(CElementView::FULL), localElement_->getView(CElementView::WORKFLOW)) ; 417 serverFromClientConnector_->computeConnector() ; 418 419 serverToClientConnector_ = new CScattererConnector(localElement_->getView(CElementView::WORKFLOW), elementFrom_->getView(CElementView::FULL), 420 context->getIntraComm()) ; 421 serverToClientConnector_->computeConnector() ; 422 423 } 424 } 425 CATCH 426 427 void CScalar::sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) 428 { 429 string serverScalarId = scalarId.empty() ? this->getId() : scalarId ; 430 CContext* context = CContext::getCurrent(); 431 432 // nothing for now 433 } 434 435 void CScalar::recvDistributedAttributes(CEventServer& event) 436 TRY 437 { 438 string scalarId; 439 string type ; 440 for (auto& subEvent : event.subEvents) (*subEvent.buffer) >> scalarId >> type ; 441 get(scalarId)->recvDistributedAttributes(event, type); 442 } 443 CATCH 444 445 void CScalar::recvDistributedAttributes(CEventServer& event, const string& type) 446 TRY 447 { 448 // nothing for now 449 } 450 CATCH 451 452 bool CScalar::dispatchEvent(CEventServer& event) 453 TRY 454 { 455 if (SuperClass::dispatchEvent(event)) return true; 456 else 457 { 458 switch(event.type) 459 { 460 case EVENT_ID_SCALAR_DISTRIBUTION: 461 recvScalarDistribution(event); 462 return true; 463 break; 464 case EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE: 465 recvDistributedAttributes(event); 466 return true; 467 break; 468 default : 469 ERROR("bool CScalar::dispatchEvent(CEventServer& event)", 470 << "Unknown Event"); 471 return false; 472 } 473 } 474 } 475 CATCH 305 476 306 477 -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp
r1934 r1940 41 41 , public CScalarAttributes 42 42 { 43 friend class CScalarGroup; 44 43 45 /// typedef /// 44 46 typedef CObjectTemplate<CScalar> SuperClass; 45 47 typedef CScalarAttributes SuperClassAttribute; 46 48 47 friend class CScalarGroup; 49 public: 50 enum EEventId 51 { 52 EVENT_ID_SCALAR_DISTRIBUTION, 53 EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE, 54 } ; 55 static bool dispatchEvent(CEventServer& event); 56 48 57 49 58 public : … … 166 175 public: 167 176 void computeRemoteElement(CContextClient* client, EDistributionType) ; 168 void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex) ; 177 void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex, const string& scalarId="") ; 178 static void recvScalarDistribution(CEventServer& event) ; 179 void receivedScalarDistribution(CEventServer& event, int phasis) ; 180 void sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) ; 181 static void recvDistributedAttributes(CEventServer& event) ; 182 void recvDistributedAttributes(CEventServer& event, const string& type) ; 183 169 184 private: 170 185 map<CContextClient*, CDistributedElement*> remoteElement_ ; … … 179 194 CGathererConnector* gathererConnector_ ; 180 195 CGathererConnector* serverFromClientConnector_ ; 196 CDistributedElement* elementFrom_ ; 181 197 public: 182 198 CGathererConnector* getServerFromClientConnector(void) { return serverFromClientConnector_ ;}
Note: See TracChangeset
for help on using the changeset viewer.