Changeset 1232 for XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
- Timestamp:
- 07/31/17 17:59:25 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
r1227 r1232 477 477 finalized = true; 478 478 479 closeAllFile(); // Just move to here to make sure that server-level 1 can close files 479 480 if (hasServer && !hasClient) 480 { 481 closeAllFile(); 481 { 482 482 registryOut->hierarchicalGatherRegistry() ; 483 483 if (server->intraCommRank==0) CXios::globalRegistry->mergeRegistry(*registryOut) ; … … 525 525 526 526 // Check grid and calculate its distribution 527 checkGridEnabledFields(); 528 527 checkGridEnabledFields(); 528 529 529 // Distribute files between secondary servers according to the data size 530 530 distributeFiles(); … … 548 548 // We have enough information to send to server 549 549 // First of all, send all enabled files 550 sendEnabledFiles(); 551 552 // Then, send all enabled fields 553 sendEnabledFields(); 550 sendEnabledFiles(this->enabledWriteModeFiles); 551 // We only use server-level 1 (for now) to read data 552 if (!hasServer) 553 sendEnabledFiles(this->enabledReadModeFiles); 554 555 // Then, send all enabled fields 556 sendEnabledFieldsInFiles(this->enabledWriteModeFiles); 557 if (!hasServer) 558 sendEnabledFieldsInFiles(this->enabledReadModeFiles); 554 559 555 560 // At last, we have all info of domain and axis, then send them 556 sendRefDomainsAxis(); 561 sendRefDomainsAxisScalars(this->enabledWriteModeFiles); 562 if (!hasServer) 563 sendRefDomainsAxisScalars(this->enabledReadModeFiles); 557 564 558 565 // After that, send all grid (if any) 559 sendRefGrid(); 566 sendRefGrid(this->enabledWriteModeFiles); 567 if (!hasServer) 568 sendRefGrid(this->enabledReadModeFiles); 560 569 561 570 // We have a xml tree on the server side and now, it should be also processed 562 571 sendPostProcessing(); 563 564 sendGridEnabledFields(); 572 573 sendGridEnabledFieldsInFiles(this->enabledWriteModeFiles); 574 if (!hasServer) 575 sendGridEnabledFieldsInFiles(this->enabledReadModeFiles); 565 576 } 566 577 allProcessed = true; … … 630 641 } 631 642 632 checkGridEnabledFields(); 643 checkGridEnabledFields(); 633 644 634 645 if (hasClient) this->sendProcessingGridOfEnabledFields(); … … 646 657 } 647 658 648 void CContext::findAllEnabledFields(void) 649 { 650 for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 651 (void)this->enabledFiles[i]->getEnabledFields(); 652 } 653 654 void CContext::findAllEnabledFieldsInReadModeFiles(void) 655 { 656 for (unsigned int i = 0; i < this->enabledReadModeFiles.size(); ++i) 657 (void)this->enabledReadModeFiles[i]->getEnabledFields(); 659 void CContext::findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles) 660 { 661 for (unsigned int i = 0; i < activeFiles.size(); i++) 662 (void)activeFiles[i]->getEnabledFields(); 658 663 } 659 664 … … 664 669 } 665 670 666 void CContext::sendGridEnabledFields() 671 /*! 672 Send active (enabled) fields in file from a client to others 673 \param [in] activeFiles files contains enabled fields to send 674 */ 675 void CContext::sendGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles) 676 { 677 int size = activeFiles.size(); 678 for (int i = 0; i < size; ++i) 679 { 680 activeFiles[i]->sendGridOfEnabledFields(); 681 } 682 } 683 684 void CContext::checkGridEnabledFields() 685 { 686 int size = enabledFiles.size(); 687 for (int i = 0; i < size; ++i) 688 { 689 enabledFiles[i]->checkGridOfEnabledFields(); 690 } 691 } 692 693 /*! 694 Check grid of active (enabled) fields in file 695 \param [in] activeFiles files contains enabled fields whose grid needs checking 696 */ 697 void CContext::checkGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles) 698 { 699 int size = activeFiles.size(); 700 for (int i = 0; i < size; ++i) 701 { 702 activeFiles[i]->checkGridOfEnabledFields(); 703 } 704 } 705 706 /*! 707 Go up the hierachical tree via field_ref and do check of attributes of fields 708 This can be done in a client then all computed information will be sent from this client to others 709 \param [in] sendToServer Flag to indicate whether calculated information will be sent 710 */ 711 void CContext::solveOnlyRefOfEnabledFields(bool sendToServer) 667 712 { 668 713 int size = this->enabledFiles.size(); 669 714 for (int i = 0; i < size; ++i) 670 { 671 this->enabledFiles[i]->sendGridOfEnabledFields(); 672 } 673 } 674 675 void CContext::checkGridEnabledFields() 676 { 677 int size = this->enabledFiles.size(); 715 { 716 this->enabledFiles[i]->solveOnlyRefOfEnabledFields(sendToServer); 717 } 718 678 719 for (int i = 0; i < size; ++i) 679 720 { 680 this->enabledFiles[i]->checkGridOfEnabledFields();681 }682 }683 684 void CContext::solveOnlyRefOfEnabledFields(bool sendToServer)685 {686 int size = this->enabledFiles.size();687 for (int i = 0; i < size; ++i)688 {689 this->enabledFiles[i]->solveOnlyRefOfEnabledFields(sendToServer);690 }691 692 for (int i = 0; i < size; ++i)693 {694 721 this->enabledFiles[i]->generateNewTransformationGridDest(); 695 722 } 696 723 } 697 724 725 /*! 726 Go up the hierachical tree via field_ref and do check of attributes of fields. 727 The transformation can be done in this step. 728 All computed information will be sent from this client to others. 729 \param [in] sendToServer Flag to indicate whether calculated information will be sent 730 */ 698 731 void CContext::solveAllRefOfEnabledFieldsAndTransform(bool sendToServer) 699 732 { … … 831 864 832 865 // (1) Find all enabled files in write mode 833 for (int i = 0; i < this->enabledFiles.size(); ++i)834 {835 if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write ))836 enabledWriteModeFiles.push_back(enabledFiles[i]);837 }866 // for (int i = 0; i < this->enabledFiles.size(); ++i) 867 // { 868 // if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 869 // enabledWriteModeFiles.push_back(enabledFiles[i]); 870 // } 838 871 839 872 // (2) Estimate the data volume for each file … … 882 915 883 916 for (int i = 0; i < this->enabledReadModeFiles.size(); ++i) 884 enabledReadModeFiles[i]->setContextClient(client); 917 { 918 enabledReadModeFiles[i]->setContextClient(client); 919 } 885 920 } 886 921 else … … 891 926 } 892 927 928 /*! 929 Find all files in write mode 930 */ 931 void CContext::findEnabledWriteModeFiles(void) 932 { 933 int size = this->enabledFiles.size(); 934 for (int i = 0; i < size; ++i) 935 { 936 if (enabledFiles[i]->mode.isEmpty() || 937 (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 938 enabledWriteModeFiles.push_back(enabledFiles[i]); 939 } 940 } 941 942 /*! 943 Find all files in read mode 944 */ 893 945 void CContext::findEnabledReadModeFiles(void) 894 946 { … … 1217 1269 1218 1270 //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. 1219 this->findEnabledFiles(); 1220 1271 findEnabledFiles(); 1272 findEnabledWriteModeFiles(); 1273 findEnabledReadModeFiles(); 1274 1221 1275 // For now, only read files with client and only one level server 1222 if (hasClient && !hasServer) this->findEnabledReadModeFiles(); 1223 1224 // Find all enabled fields of each file 1225 this->findAllEnabledFields(); 1276 // if (hasClient && !hasServer) findEnabledReadModeFiles(); 1277 1278 // Find all enabled fields of each file 1279 findAllEnabledFieldsInFiles(this->enabledWriteModeFiles); 1280 findAllEnabledFieldsInFiles(this->enabledReadModeFiles); 1281 1226 1282 // For now, only read files with client and only one level server 1227 if (hasClient && !hasServer) this->findAllEnabledFieldsInReadModeFiles();1228 1283 // if (hasClient && !hasServer) 1284 // findAllEnabledFieldsInFiles(this->enabledReadModeFiles); 1229 1285 1230 1286 if (hasClient && !hasServer) 1231 1287 { 1232 // Try to read attributes of fields in file then fill in corresponding grid (or domain, axis) 1233 this->readAttributesOfEnabledFieldsInReadModeFiles(); 1288 initReadFiles(); 1289 // Try to read attributes of fields in file then fill in corresponding grid (or domain, axis) 1290 this->readAttributesOfEnabledFieldsInReadModeFiles(); 1234 1291 } 1235 1292 … … 1259 1316 if (hasClient) 1260 1317 { 1261 size_t numEnabledFiles = this->enabled Files.size();1318 size_t numEnabledFiles = this->enabledWriteModeFiles.size(); 1262 1319 for (size_t i = 0; i < numEnabledFiles; ++i) 1263 1320 { 1264 CFile* file = this->enabled Files[i];1321 CFile* file = this->enabledWriteModeFiles[i]; 1265 1322 // if (file->getContextClient() == contextClient) 1266 1323 { … … 1280 1337 if (maxEventSize[it->first] < it->second) 1281 1338 maxEventSize[it->first] = it->second; 1339 } 1340 } 1341 } 1342 } 1343 1344 // Not a good approach here, duplicate code 1345 if (!hasServer) 1346 { 1347 size_t numEnabledFiles = this->enabledReadModeFiles.size(); 1348 for (size_t i = 0; i < numEnabledFiles; ++i) 1349 { 1350 CFile* file = this->enabledReadModeFiles[i]; 1351 { 1352 std::vector<CField*> enabledFields = file->getEnabledFields(); 1353 size_t numEnabledFields = enabledFields.size(); 1354 for (size_t j = 0; j < numEnabledFields; ++j) 1355 { 1356 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(); 1357 std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 1358 for (; it != itE; ++it) 1359 { 1360 // If attributesSize[it->first] does not exist, it will be zero-initialized 1361 // so we can use it safely without checking for its existance 1362 if (attributesSize[it->first] < it->second) 1363 attributesSize[it->first] = it->second; 1364 1365 if (maxEventSize[it->first] < it->second) 1366 maxEventSize[it->first] = it->second; 1367 } 1282 1368 } 1283 1369 } … … 1341 1427 1342 1428 //! Client side: Send infomation of active files (files are enabled to write out) 1343 void CContext::sendEnabledFiles( )1344 { 1345 int size = this->enabledFiles.size();1429 void CContext::sendEnabledFiles(const std::vector<CFile*>& activeFiles) 1430 { 1431 int size = activeFiles.size(); 1346 1432 1347 1433 // In a context, each type has a root definition, e.g: axis, domain, field. … … 1353 1439 for (int i = 0; i < size; ++i) 1354 1440 { 1355 cfgrpPtr->sendCreateChild(this->enabledFiles[i]->getId(),enabledFiles[i]->getContextClient()); 1356 this->enabledFiles[i]->sendAllAttributesToServer(enabledFiles[i]->getContextClient()); 1357 this->enabledFiles[i]->sendAddAllVariables(enabledFiles[i]->getContextClient()); 1441 CFile* f = activeFiles[i]; 1442 cfgrpPtr->sendCreateChild(f->getId(),f->getContextClient()); 1443 f->sendAllAttributesToServer(f->getContextClient()); 1444 f->sendAddAllVariables(f->getContextClient()); 1358 1445 } 1359 1446 } 1360 1447 1361 1448 //! Client side: Send information of active fields (ones are written onto files) 1362 void CContext::sendEnabledFields ()1363 { 1364 int size = this->enabledFiles.size();1449 void CContext::sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles) 1450 { 1451 int size = activeFiles.size(); 1365 1452 for (int i = 0; i < size; ++i) 1366 1453 { 1367 this->enabledFiles[i]->sendEnabledFields(enabledFiles[i]->getContextClient());1454 activeFiles[i]->sendEnabledFields(activeFiles[i]->getContextClient()); 1368 1455 } 1369 1456 } … … 1488 1575 1489 1576 //! Client side: Send information of reference grid of active fields 1490 void CContext::sendRefGrid( )1577 void CContext::sendRefGrid(const std::vector<CFile*>& activeFiles) 1491 1578 { 1492 1579 std::set<StdString> gridIds; 1493 int sizeFile = this->enabledFiles.size();1580 int sizeFile = activeFiles.size(); 1494 1581 CFile* filePtr(NULL); 1495 1582 … … 1497 1584 for (int i = 0; i < sizeFile; ++i) 1498 1585 { 1499 filePtr = this->enabledFiles[i];1586 filePtr = activeFiles[i]; 1500 1587 std::vector<CField*> enabledFields = filePtr->getEnabledFields(); 1501 1588 int sizeField = enabledFields.size(); … … 1521 1608 } 1522 1609 1523 1524 //! Client side: Send information of reference domain and axis of active fields 1525 void CContext::sendRefDomainsAxis() 1610 //! Client side: Send information of reference domain, axis and scalar of active fields 1611 void CContext::sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles) 1526 1612 { 1527 1613 std::set<StdString> domainIds, axisIds, scalarIds; 1528 1614 1529 1615 // Find all reference domain and axis of all active fields 1530 int numEnabledFiles = this->enabledFiles.size();1616 int numEnabledFiles = activeFiles.size(); 1531 1617 for (int i = 0; i < numEnabledFiles; ++i) 1532 1618 { 1533 std::vector<CField*> enabledFields = this->enabledFiles[i]->getEnabledFields();1619 std::vector<CField*> enabledFields = activeFiles[i]->getEnabledFields(); 1534 1620 int numEnabledFields = enabledFields.size(); 1535 1621 for (int j = 0; j < numEnabledFields; ++j) … … 1592 1678 info(50) << " Current memory used by XIOS : "<< MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ; 1593 1679 #endif 1594 if (hasClient) 1680 //if (hasClient) 1681 if (hasClient && !hasServer) // For now we only use server level 1 to read data 1595 1682 { 1596 1683 checkPrefetchingOfEnabledReadModeFiles(); … … 1599 1686 } 1600 1687 1688 void CContext::initReadFiles(void) 1689 { 1690 vector<CFile*>::const_iterator it; 1691 1692 for (it=enabledReadModeFiles.begin(); it != enabledReadModeFiles.end(); it++) 1693 { 1694 (*it)->initRead(); 1695 } 1696 } 1697 1601 1698 //! Server side: Create header of netcdf file 1602 void CContext::createFileHeader(void 1699 void CContext::createFileHeader(void) 1603 1700 { 1604 1701 vector<CFile*>::const_iterator it; 1605 1702 1606 1703 for (it=enabledFiles.begin(); it != enabledFiles.end(); it++) 1704 // for (it=enabledWriteModeFiles.begin(); it != enabledWriteModeFiles.end(); it++) 1607 1705 { 1608 (*it)->init File();1706 (*it)->initWrite(); 1609 1707 } 1610 1708 }
Note: See TracChangeset
for help on using the changeset viewer.