Changeset 1328 for XIOS/dev/branch_openmp/src/node
- Timestamp:
- 11/15/17 12:14:34 (7 years ago)
- Location:
- XIOS/dev/branch_openmp/src/node
- Files:
-
- 29 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/src/node/axis.cpp
r1205 r1328 44 44 { /* Ne rien faire de plus */ } 45 45 46 std::map<StdString, ETranformationType> *CAxis::transformationMapList_ptr = 0; //new std::map<StdString, ETranformationType>(); 47 //bool CAxis::dummyTransformationMapList_ = CAxis::initializeTransformationMap(CAxis::transformationMapList_ptr); 48 46 //std::map<StdString, ETranformationType> CAxis::transformationMapList_ = std::map<StdString, ETranformationType>(); 47 std::map<StdString, ETranformationType> *CAxis::transformationMapList_ptr = 0; 48 //bool CAxis::dummyTransformationMapList_ = CAxis::initializeTransformationMap(CAxis::transformationMapList_); 49 49 50 bool CAxis::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 50 51 { … … 55 56 m["extract_domain"] = TRANS_EXTRACT_DOMAIN_TO_AXIS; 56 57 } 57 58 58 59 59 bool CAxis::initializeTransformationMap() … … 66 66 (*CAxis::transformationMapList_ptr)["extract_domain"] = TRANS_EXTRACT_DOMAIN_TO_AXIS; 67 67 } 68 69 68 70 69 ///--------------------------------------------------------------- … … 500 499 globalAxisZoom[nZoomCount] = globalZoomIndex; 501 500 ++nZoomCount; 502 } 501 } 503 502 } 504 503 … … 831 830 CContextServer* server = CContext::getCurrent()->server; 832 831 axis->numberWrittenIndexes_ = axis->indexesToWrite.size(); 833 ep_lib::MPI_Allreduce(&axis->numberWrittenIndexes_, &axis->totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm);834 ep_lib::MPI_Scan(&axis->numberWrittenIndexes_, &axis->offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm);832 MPI_Allreduce(&axis->numberWrittenIndexes_, &axis->totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 833 MPI_Scan(&axis->numberWrittenIndexes_, &axis->offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 835 834 axis->offsetWrittenIndexes_ -= axis->numberWrittenIndexes_; 836 835 } … … 978 977 msg << ni << begin << end; 979 978 msg << global_zoom_begin.getValue() << global_zoom_n.getValue(); 980 msg << isCompressible_; 979 msg << isCompressible_; 981 980 msg << zoomIndex; 982 981 if (zoomIndex) … … 1157 1156 1158 1157 nodeElementName = node.getElementName(); 1159 1158 //std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_.end(), it; 1160 1159 if(transformationMapList_ptr == 0) initializeTransformationMap(); 1161 //transformationMapList_ptr = new std::map<StdString, ETranformationType>(); 1162 1163 std::map<StdString, ETranformationType>::const_iterator ite = (*CAxis::transformationMapList_ptr).end(), it; 1164 it = (*CAxis::transformationMapList_ptr).find(nodeElementName); 1160 std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_ptr->end(), it; 1161 //it = transformationMapList_.find(nodeElementName); 1162 it = transformationMapList_ptr->find(nodeElementName); 1165 1163 if (ite != it) 1166 1164 { … … 1184 1182 1185 1183 } // namespace xios 1186 -
XIOS/dev/branch_openmp/src/node/axis.hpp
r1205 r1328 172 172 private: 173 173 static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m); 174 //static bool initializeTransformationMap(std::map<StdString, ETranformationType>* m);175 174 static bool initializeTransformationMap(); 176 177 175 //static std::map<StdString, ETranformationType> transformationMapList_; 178 179 176 static std::map<StdString, ETranformationType> *transformationMapList_ptr; 180 #pragma omp threadprivate(transformationMapList_ptr) 181 182 //static bool dummyTransformationMapList_; 183 //#pragma omp threadprivate(dummyTransformationMapList_) 177 static bool dummyTransformationMapList_; 184 178 185 179 DECLARE_REF_FUNC(Axis,axis) … … 193 187 194 188 #endif // __XIOS_CAxis__ 195 -
XIOS/dev/branch_openmp/src/node/compute_connectivity_domain.hpp
r1134 r1328 60 60 static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 64 62 }; // class CComputeConnectivityDomain 65 63 -
XIOS/dev/branch_openmp/src/node/context.cpp
r1287 r1328 1 1 2 #include "context.hpp" 2 3 #include "attribute_template.hpp" … … 17 18 #include "memtrack.hpp" 18 19 20 using namespace ep_lib; 21 19 22 20 23 namespace xios { 21 24 22 //shared_ptr<CContextGroup> CContext::root; 23 boost::shared_ptr<CContextGroup> * CContext::root_ptr = 0; 24 25 /// ////////////////////// Dfinitions ////////////////////// /// 25 shared_ptr<CContextGroup> CContext::root; 26 27 /// ////////////////////// Définitions ////////////////////// /// 26 28 27 29 CContext::CContext(void) … … 57 59 CContextGroup* CContext::getRoot(void) 58 60 { 59 //if (root.get()==NULL) root=shared_ptr<CContextGroup>(new CContextGroup(xml::CXMLNode::GetRootName())); 60 //return root.get(); 61 62 //static shared_ptr<CContextGroup> *root_ptr; 63 if(root_ptr == 0) //root_ptr = new shared_ptr<CContextGroup>; 64 // if (root_ptr->get()==NULL) 65 root_ptr = new boost::shared_ptr<CContextGroup>(new CContextGroup(xml::CXMLNode::GetRootName())); 66 return root_ptr->get(); 61 if (root.get()==NULL) root=shared_ptr<CContextGroup>(new CContextGroup(xml::CXMLNode::GetRootName())); 62 return root.get(); 67 63 } 68 64 … … 186 182 if (!this->hasChild()) 187 183 { 188 //oss << "<!-- No definition -->" << std::endl; // fait planter l'incr mentation184 //oss << "<!-- No definition -->" << std::endl; // fait planter l'incrémentation 189 185 } 190 186 else … … 248 244 { 249 245 hasClient=true; 250 client = new CContextClient(this, intraComm, interComm, cxtServer); 251 252 int tmp_rank; 253 MPI_Comm_rank(intraComm, &tmp_rank); 254 MPI_Barrier(intraComm); 255 256 246 client = new CContextClient(this,intraComm, interComm, cxtServer); 257 247 registryIn=new CRegistry(intraComm); 258 248 registryIn->setPath(getId()) ; … … 271 261 else 272 262 { 273 MPI_Comm_dup(intraComm, &intraCommServer);263 ep_lib::MPI_Comm_dup(intraComm, &intraCommServer); 274 264 comms.push_back(intraCommServer); 275 MPI_Comm_dup(interComm, &interCommServer);265 ep_lib::MPI_Comm_dup(interComm, &interCommServer); 276 266 comms.push_back(interCommServer); 277 267 } … … 353 343 else 354 344 { 355 MPI_Comm_dup(intraComm, &intraCommClient);345 ep_lib::MPI_Comm_dup(intraComm, &intraCommClient); 356 346 comms.push_back(intraCommClient); 357 MPI_Comm_dup(interComm, &interCommClient);347 ep_lib::MPI_Comm_dup(interComm, &interCommClient); 358 348 comms.push_back(interCommClient); 359 349 } … … 395 385 396 386 for (std::list<ep_lib::MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 397 MPI_Comm_free(&(*it));387 ep_lib::MPI_Comm_free(&(*it)); 398 388 comms.clear(); 399 389 } … … 527 517 } 528 518 529 void CContext:: checkPrefetchingOfEnabledReadModeFiles()519 void CContext::doPostTimestepOperationsForEnabledReadModeFiles() 530 520 { 531 521 int size = enabledReadModeFiles.size(); 532 522 for (int i = 0; i < size; ++i) 533 523 { 534 enabledReadModeFiles[i]-> prefetchEnabledReadModeFieldsIfNeeded();524 enabledReadModeFiles[i]->doPostTimestepOperationsForEnabledReadModeFields(); 535 525 } 536 526 } … … 563 553 } 564 554 565 void CContext::solveAllInheritance(bool apply) 566 { 567 // R solution des hritages descendants (cd des hritages de groupes)555 void CContext::solveAllInheritance(bool apply) // default : apply = true 556 { 557 // Résolution des héritages descendants (cà d des héritages de groupes) 568 558 // pour chacun des contextes. 569 559 solveDescInheritance(apply); 570 560 571 // R solution des hritages par rfrence au niveau des fichiers.561 // Résolution des héritages par référence au niveau des fichiers. 572 562 const vector<CFile*> allFiles=CFile::getAll(); 573 563 const vector<CGrid*> allGrids= CGrid::getAll(); … … 593 583 594 584 for (unsigned int i = 0; i < allFiles.size(); i++) 595 if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est d fini.585 if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini. 596 586 { 597 if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fix 587 if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai. 598 588 { 599 589 if ((initDate + allFiles[i]->output_freq.getValue()) < (initDate + this->getCalendar()->getTimeStep())) … … 620 610 621 611 if (enabledFiles.size() == 0) 622 DEBUG(<<"Aucun fichier ne va tre sorti dans le contexte nomm\""612 DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \"" 623 613 << getId() << "\" !"); 624 614 } … … 836 826 void CContext::postProcessing() 837 827 { 838 int myRank;839 MPI_Comm_rank(MPI_COMM_WORLD, &myRank);840 841 828 if (isPostProcessed) return; 842 829 … … 860 847 prepareTimeseries(); 861 848 862 //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers sortir.849 //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. 863 850 this->findEnabledFiles(); 864 851 this->findEnabledReadModeFiles(); … … 1218 1205 void CContext::updateCalendar(int step) 1219 1206 { 1220 #pragma omp critical (_output) 1221 {info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;} 1207 info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl; 1222 1208 calendar->update(step); 1223 #pragma omp critical (_output) 1224 {info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;} 1209 info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl; 1225 1210 #ifdef XIOS_MEMTRACK_LIGHT 1226 #pragma omp critical (_output) 1227 {info(50) << " Current memory used by XIOS : "<< MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;} 1211 info(50) << " Current memory used by XIOS : "<< MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ; 1228 1212 #endif 1229 1213 if (hasClient) 1230 1214 { 1231 checkPrefetchingOfEnabledReadModeFiles();1215 doPostTimestepOperationsForEnabledReadModeFiles(); 1232 1216 garbageCollector.invalidate(calendar->getCurrentDate()); 1233 1217 } … … 1273 1257 CContext* context = CObjectFactory::CreateObject<CContext>(id).get(); 1274 1258 getRoot(); 1275 if (!hasctxt) CGroupFactory::AddChild( *root_ptr, context->getShared());1259 if (!hasctxt) CGroupFactory::AddChild(root, context->getShared()); 1276 1260 1277 1261 #define DECLARE_NODE(Name_, name_) \ -
XIOS/dev/branch_openmp/src/node/context.hpp
r1287 r1328 5 5 #include "xios_spl.hpp" 6 6 //#include "node_type.hpp" 7 #include "mpi_std.hpp" 7 8 #include "calendar_wrapper.hpp" 8 9 … … 13 14 #include "garbage_collector.hpp" 14 15 #include "registry.hpp" 15 #include "mpi.hpp"16 16 17 17 … … 115 115 void buildFilterGraphOfEnabledFields(); 116 116 void startPrefetchingOfEnabledReadModeFiles(); 117 void checkPrefetchingOfEnabledReadModeFiles();117 void doPostTimestepOperationsForEnabledReadModeFiles(); 118 118 void findFieldsWithReadAccess(void); 119 119 void solveAllRefOfFieldsWithReadAccess(); … … 206 206 207 207 // Context root 208 //static shared_ptr<CContextGroup> root; 209 210 static boost::shared_ptr<CContextGroup> *root_ptr; 211 #pragma omp threadprivate(root_ptr) 208 static shared_ptr<CContextGroup> root; 212 209 213 210 // Determine context on client or not … … 222 219 // Concrete contex client 223 220 CContextClient* client; 224 225 226 221 CRegistry* registryIn ; //!< input registry which is read from file 227 222 CRegistry* registryOut ; //!< output registry which will be wrote on file at the finalize 228 229 223 230 224 private: -
XIOS/dev/branch_openmp/src/node/domain.cpp
r1138 r1328 26 26 namespace xios { 27 27 28 /// ////////////////////// D finitions ////////////////////// ///28 /// ////////////////////// Définitions ////////////////////// /// 29 29 30 30 CDomain::CDomain(void) … … 66 66 67 67 //std::map<StdString, ETranformationType> CDomain::transformationMapList_ = std::map<StdString, ETranformationType>(); 68 std::map<StdString, ETranformationType> *CDomain::transformationMapList_ptr = 0; 68 69 //bool CDomain::_dummyTransformationMapList = CDomain::initializeTransformationMap(CDomain::transformationMapList_); 69 70 std::map<StdString, ETranformationType> *CDomain::transformationMapList_ptr = 0;71 70 72 71 bool CDomain::initializeTransformationMap(std::map<StdString, ETranformationType>& m) … … 88 87 (*CDomain::transformationMapList_ptr)["expand_domain"] = TRANS_EXPAND_DOMAIN; 89 88 } 90 91 89 92 90 const std::set<StdString> & CDomain::getRelFiles(void) const … … 445 443 break; 446 444 } 445 completeLonLatClient() ; 447 446 448 447 } … … 636 635 { 637 636 CContext* context = CContext::getCurrent(); 638 637 CContextClient* client = context->client; 639 638 lon_g.resize(ni_glo) ; 640 639 lat_g.resize(nj_glo) ; … … 1495 1494 1496 1495 if (context->hasClient) 1497 { // C tclient uniquement1496 { // CÃŽté client uniquement 1498 1497 this->checkMask(); 1499 1498 this->checkDomainData(); … … 1502 1501 } 1503 1502 else 1504 { // C tserveur uniquement1503 { // CÃŽté serveur uniquement 1505 1504 } 1506 1505 … … 1535 1534 1536 1535 if (context->hasClient) 1537 { // C tclient uniquement1536 { // CÃŽté client uniquement 1538 1537 this->checkMask(); 1539 1538 this->checkDomainData(); … … 1543 1542 } 1544 1543 else 1545 { // C tserveur uniquement1544 { // CÃŽté serveur uniquement 1546 1545 } 1547 1546 … … 1726 1725 client->intraComm); 1727 1726 clientServerMap->computeServerIndexMapping(globalIndexDomain); 1728 1729 1727 const CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 1730 1728 … … 2365 2363 nodeElementName = node.getElementName(); 2366 2364 if(transformationMapList_ptr == 0) initializeTransformationMap(); 2367 std::map<StdString, ETranformationType>::const_iterator ite = (*transformationMapList_ptr).end(), it; 2368 it = (*transformationMapList_ptr).find(nodeElementName); 2365 //std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_.end(), it; 2366 std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_ptr->end(), it; 2367 //it = transformationMapList_.find(nodeElementName); 2368 it = transformationMapList_ptr->find(nodeElementName); 2369 2369 if (ite != it) 2370 2370 { -
XIOS/dev/branch_openmp/src/node/domain.hpp
r1134 r1328 218 218 static bool initializeTransformationMap(); 219 219 //static std::map<StdString, ETranformationType> transformationMapList_; 220 221 220 static std::map<StdString, ETranformationType> *transformationMapList_ptr; 222 #pragma omp threadprivate(transformationMapList_ptr) 223 224 //static bool _dummyTransformationMapList; 225 //#pragma omp threadprivate(_dummyTransformationMapList) 221 static bool _dummyTransformationMapList; 226 222 227 223 DECLARE_REF_FUNC(Domain,domain) -
XIOS/dev/branch_openmp/src/node/expand_domain.hpp
r1134 r1328 60 60 static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 64 62 }; // class CExpandDomain 65 63 -
XIOS/dev/branch_openmp/src/node/extract_axis_to_scalar.hpp
r1134 r1328 60 60 static CTransformation<CScalar>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CExtractAxisToScalar 64 63 -
XIOS/dev/branch_openmp/src/node/extract_domain_to_axis.hpp
r1134 r1328 60 60 static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CExtractDomainToAxis 64 63 -
XIOS/dev/branch_openmp/src/node/field.cpp
r1209 r1328 24 24 #include "spatial_transform_filter.hpp" 25 25 26 #include <stdio.h> 27 26 28 namespace xios{ 27 29 28 30 /// ////////////////////// Dfinitions ////////////////////// /// 31 32 CField* CField::my_getDirectFieldReference(void) const 33 { 34 // if (this->field_ref.isEmpty()) 35 // ERROR("C" #type "* C" #type "::getDirect" #type "Reference(void)", 36 // << "The " #name_ " with id = '" << getId() << "'" 37 // << " has no " #name_ "_ref."); 38 39 // if (!C##type::has(this->name_##_ref)) 40 // ERROR("C" #type "* C" #type "::getDirect" #type "Reference(void)", 41 // << this->name_##_ref 42 // << " refers to an unknown " #name_ " id."); 43 44 return CField::get(this->field_ref); 45 } 46 29 47 30 48 CField::CField(void) … … 38 56 , hasTimeInstant(false) 39 57 , hasTimeCentered(false) 58 , wasDataRequestedFromServer(false) 40 59 , wasDataAlreadyReceivedFromServer(false) 41 60 , isEOF(false) … … 52 71 , hasTimeInstant(false) 53 72 , hasTimeCentered(false) 73 , wasDataRequestedFromServer(false) 54 74 , wasDataAlreadyReceivedFromServer(false) 55 75 , isEOF(false) … … 261 281 lastDataRequestedFromServer = tsDataRequested; 262 282 263 if (!isEOF) // No need to send the request if we already know we are at EOF 283 // No need to send the request if we are sure that we are already at EOF 284 if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF) 264 285 { 265 286 CEventClient event(getType(), EVENT_ID_READ_DATA); … … 277 298 else 278 299 serverSourceFilter->signalEndOfStream(tsDataRequested); 300 301 wasDataRequestedFromServer = true; 279 302 280 303 return !isEOF; … … 293 316 while (currentDate >= lastDataRequestedFromServer) 294 317 { 295 #pragma omp critical (_output) 296 { 297 info(20) << "currentDate : " << currentDate << endl ; 298 info(20) << "lastDataRequestedFromServer : " << lastDataRequestedFromServer << endl ; 299 info(20) << "file->output_freq.getValue() : " << file->output_freq.getValue() << endl ; 300 info(20) << "lastDataRequestedFromServer + file->output_freq.getValue() : " << lastDataRequestedFromServer + file->output_freq << endl ; 301 } 318 info(20) << "currentDate : " << currentDate << endl ; 319 info(20) << "lastDataRequestedFromServer : " << lastDataRequestedFromServer << endl ; 320 info(20) << "file->output_freq.getValue() : " << file->output_freq.getValue() << endl ; 321 info(20) << "lastDataRequestedFromServer + file->output_freq.getValue() : " << lastDataRequestedFromServer + file->output_freq << endl ; 322 302 323 dataRequested |= sendReadDataRequest(lastDataRequestedFromServer + file->output_freq); 303 324 } … … 435 456 { 436 457 CContext* context = CContext::getCurrent(); 437 int record;438 458 std::map<int, CArray<double,1> > data; 459 const bool wasEOF = isEOF; 439 460 440 461 for (int i = 0; i < ranks.size(); i++) 441 462 { 442 463 int rank = ranks[i]; 464 int record; 443 465 *buffers[i] >> record; 444 466 isEOF = (record == int(-1)); … … 459 481 460 482 if (isEOF) 483 { 484 if (!wasEOF) 485 dateEOF = lastDataReceivedFromServer; 486 461 487 serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer); 488 } 462 489 else 463 490 serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data); 491 } 492 493 void CField::checkForLateDataFromServer(void) 494 { 495 CContext* context = CContext::getCurrent(); 496 const CDate& currentDate = context->getCalendar()->getCurrentDate(); 497 498 // Check if data previously requested has been received as expected 499 if (wasDataRequestedFromServer && (!isEOF || currentDate <= dateEOF)) 500 { 501 CTimer timer("CField::checkForLateDataFromServer"); 502 503 bool isDataLate; 504 do 505 { 506 const CDate nextDataDue = wasDataAlreadyReceivedFromServer ? (lastDataReceivedFromServer + file->output_freq) : context->getCalendar()->getInitDate(); 507 isDataLate = nextDataDue < currentDate; 508 509 if (isDataLate) 510 { 511 timer.resume(); 512 513 context->checkBuffersAndListen(); 514 515 timer.suspend(); 516 } 517 } 518 while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout); 519 520 if (isDataLate) 521 ERROR("void CField::checkForLateDataFromServer(void)", 522 << "Late data at timestep = " << currentDate); 523 } 464 524 } 465 525 … … 694 754 CContext* context = CContext::getCurrent(); 695 755 solveOnlyReferenceEnabledField(doSending2Server); 696 int myRank; 697 MPI_Comm_rank(context->client->intraComm, &myRank);756 757 //std::cout<<"Field "<<this->getId()<<" areAllReferenceSolved = "<<areAllReferenceSolved<<std::endl; 698 758 699 759 if (!areAllReferenceSolved) 700 760 { 701 761 areAllReferenceSolved = true; 702 762 //std::cout<<"Field "<<this->getId()<<" all reference solved"<<std::endl; 703 763 if (context->hasClient) 704 764 { … … 825 885 // Check if the data is to be read from a file 826 886 else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read) 827 instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,828 freq_offset.isEmpty() ? NoneDu : freq_offset,829 887 { 888 checkAttributes(); 889 instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 830 890 detectMissingValues, defaultValue)); 891 } 831 892 else // The data might be passed from the model 832 893 { … … 910 971 { 911 972 if (!serverSourceFilter) 912 serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,913 freq_offset.isEmpty() ? NoneDu : freq_offset,914 973 { 974 checkAttributes(); 975 serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 915 976 detectMissingValues, defaultValue)); 977 } 916 978 917 979 selfReferenceFilter = serverSourceFilter; … … 958 1020 << "An operation must be defined for field \"" << getId() << "\"."); 959 1021 960 if (freq_op.isEmpty()) 961 freq_op.setValue(TimeStep); 962 if (freq_offset.isEmpty()) 963 freq_offset.setValue(NoneDu); 1022 checkAttributes(); 964 1023 965 1024 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 966 967 1025 boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 968 1026 CContext::getCurrent()->getCalendar()->getInitDate(), … … 1000 1058 << "An operation must be defined for field \"" << getId() << "\"."); 1001 1059 1002 if (freq_op.isEmpty()) freq_op.setValue(TimeStep); 1003 if (freq_offset.isEmpty()) freq_offset.setValue(NoneDu); 1060 checkAttributes(); 1004 1061 1005 1062 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 1006 1007 1063 boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 1008 1064 CContext::getCurrent()->getCalendar()->getInitDate(), … … 1450 1506 1451 1507 /*! 1508 * Check on freq_off and freq_op attributes. 1509 */ 1510 void CField::checkAttributes(void) 1511 { 1512 bool isFieldRead = file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read; 1513 if (isFieldRead && operation.getValue() != "instant") 1514 ERROR("void CField::checkAttributes(void)", 1515 << "Unsupported operation for field '" << getFieldOutputName() << "'." << std::endl 1516 << "Currently only \"instant\" is supported for fields read from file.") 1517 1518 if (freq_op.isEmpty()) 1519 { 1520 if (operation.getValue() == "instant") 1521 freq_op.setValue(file->output_freq.getValue()); 1522 else 1523 freq_op.setValue(TimeStep); 1524 } 1525 if (freq_offset.isEmpty()) 1526 freq_offset.setValue(isFieldRead ? NoneDu : (freq_op.getValue() - TimeStep)); 1527 } 1528 1529 /*! 1452 1530 * Returns string arithmetic expression associated to the field. 1453 1531 * \return if content is defined return content string, otherwise, if "expr" attribute is defined, return expr string. -
XIOS/dev/branch_openmp/src/node/field.hpp
r1119 r1328 150 150 static void recvReadDataReady(CEventServer& event); 151 151 void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers); 152 void checkForLateDataFromServer(void); 152 153 void outputField(CArray<double,3>& fieldOut); 153 154 void outputField(CArray<double,2>& fieldOut); … … 176 177 void sendAddAllVariables(); 177 178 179 /// Vérifications /// 180 void checkAttributes(void); 178 181 179 182 const std::vector<StdString>& getRefDomainAxisIds(); … … 181 184 const string& getExpression(void); 182 185 bool hasExpression(void) const; 186 187 CField* my_getDirectFieldReference(void) const; 188 189 183 190 184 191 public: … … 195 202 bool isEOF; 196 203 CDate lastlast_Write_srv, last_Write_srv, last_operation_srv; 197 CDate lastDataRequestedFromServer, lastDataReceivedFromServer ;198 bool wasData AlreadyReceivedFromServer;204 CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF; 205 bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer; 199 206 200 207 map<int,boost::shared_ptr<func::CFunctor> > foperation_srv; -
XIOS/dev/branch_openmp/src/node/file.cpp
r1287 r1328 18 18 #include "timer.hpp" 19 19 20 20 21 namespace xios { 21 22 … … 24 25 CFile::CFile(void) 25 26 : CObjectTemplate<CFile>(), CFileAttributes() 26 , vFieldGroup(), data_out(), enabledFields() , fileComm(MPI_COMM_NULL)27 , vFieldGroup(), data_out(), enabledFields() 27 28 , allDomainEmpty(false), isOpen(false) 28 29 { … … 33 34 CFile::CFile(const StdString & id) 34 35 : CObjectTemplate<CFile>(id), CFileAttributes() 35 , vFieldGroup(), data_out(), enabledFields() , fileComm(MPI_COMM_NULL)36 , vFieldGroup(), data_out(), enabledFields() 36 37 , allDomainEmpty(false), isOpen(false) 37 38 { … … 263 264 // create sub communicator for file 264 265 int color = allDomainEmpty ? 0 : 1; 265 MPI_Comm_split(server->intraComm, color, server->intraCommRank, &fileComm);266 if (allDomainEmpty) MPI_Comm_free(&fileComm);266 ep_lib::MPI_Comm_split(server->intraComm, color, server->intraCommRank, &fileComm); 267 if (allDomainEmpty) ep_lib::MPI_Comm_free(&fileComm); 267 268 268 269 // if (time_counter.isEmpty()) time_counter.setValue(time_counter_attr::centered); … … 461 462 { 462 463 int commSize, commRank; 463 MPI_Comm_size(fileComm, &commSize);464 MPI_Comm_rank(fileComm, &commRank);464 ep_lib::MPI_Comm_size(fileComm, &commSize); 465 ep_lib::MPI_Comm_rank(fileComm, &commRank); 465 466 466 467 if (server->intraCommSize > 1) … … 482 483 if (isOpen) data_out->closeFile(); 483 484 484 data_out = boost::shared_ptr<CDataOutput>(new CNc4DataOutput(this, oss.str(), append, useClassicFormat, useCFConvention,485 static_cast< ::MPI_Comm >(fileComm.mpi_comm), multifile, isCollective, time_counter_name));485 data_out = shared_ptr<CDataOutput>(new CNc4DataOutput(this, oss.str(), append, useClassicFormat, useCFConvention, 486 fileComm, multifile, isCollective, time_counter_name)); 486 487 isOpen = true; 487 488 … … 577 578 { 578 579 int commSize, commRank; 579 MPI_Comm_size(fileComm, &commSize);580 MPI_Comm_rank(fileComm, &commRank);580 ep_lib::MPI_Comm_size(fileComm, &commSize); 581 ep_lib::MPI_Comm_rank(fileComm, &commRank); 581 582 582 583 if (server->intraCommSize > 1) … … 596 597 bool isCollective = par_access.isEmpty() || par_access == par_access_attr::collective; 597 598 598 #ifdef _usingEP599 //printf("multifile was %d\n", multifile);600 multifile = true;601 599 if (isOpen) data_out->closeFile(); 602 if (time_counter_name.isEmpty()) data_in = boost::shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), static_cast< ::MPI_Comm >(fileComm.mpi_comm), multifile, isCollective));603 else data_in = boost::shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), static_cast< ::MPI_Comm >(fileComm.mpi_comm), multifile, isCollective, time_counter_name));600 if (time_counter_name.isEmpty()) data_in = shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), fileComm, multifile, isCollective)); 601 else data_in = shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), fileComm, multifile, isCollective, time_counter_name)); 604 602 isOpen = true; 605 #else606 if (isOpen) data_out->closeFile();607 if (time_counter_name.isEmpty()) data_in = boost::shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), static_cast< ::MPI_Comm >(fileComm.mpi_comm), multifile, isCollective));608 else data_in = boost::shared_ptr<CDataInput>(new CNc4DataInput(oss.str(), static_cast< ::MPI_Comm >(fileComm.mpi_comm), multifile, isCollective, time_counter_name));609 isOpen = true;610 #endif611 612 613 603 } 614 604 } … … 625 615 this->data_in->closeFile(); 626 616 } 627 if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm); 617 // if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm); 618 //if (fileComm.mpi_comm != ::MPI_COMM_NULL) MPI_Comm_free(&fileComm); 628 619 } 629 620 //---------------------------------------------------------------- … … 638 629 639 630 // It would probably be better to call initFile() somehow 640 641 MPI_Comm_dup(client->intraComm, &fileComm); 631 ep_lib::MPI_Comm_dup(client->intraComm, &fileComm); 642 632 if (time_counter_name.isEmpty()) time_counter_name = "time_counter"; 643 633 644 //#pragma omp critical (_readAttributesOfEnabledFieldsInReadMode_) 645 //{ 646 checkFile(); // calls nc_open 634 checkFile(); 647 635 648 636 for (int idx = 0; idx < enabledFields.size(); ++idx) … … 658 646 659 647 // Read necessary value from file 660 #pragma omp critical (_func) 661 { 662 //checkFile(); 663 this->data_in->readFieldAttributesValues(enabledFields[idx]); 664 //close(); 665 } 666 648 this->data_in->readFieldAttributesValues(enabledFields[idx]); 649 667 650 // Fill attributes for base reference 668 651 enabledFields[idx]->solveGridDomainAxisBaseRef(); … … 671 654 // Now everything is ok, close it 672 655 close(); 673 //}674 675 //if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm);676 677 656 } 678 657 … … 806 785 807 786 /*! 808 Prefetching the data for enabled fields read from file whose data is out-of-date. 809 */ 810 void CFile::prefetchEnabledReadModeFieldsIfNeeded(void) 787 Do all post timestep operations for enabled fields in read mode: 788 - Prefetch the data read from file when needed 789 - Check that the data excepted from server has been received 790 */ 791 void CFile::doPostTimestepOperationsForEnabledReadModeFields(void) 811 792 { 812 793 if (mode.isEmpty() || mode.getValue() != mode_attr::read) … … 815 796 int size = this->enabledFields.size(); 816 797 for (int i = 0; i < size; ++i) 798 { 799 this->enabledFields[i]->checkForLateDataFromServer(); 817 800 this->enabledFields[i]->sendReadDataRequestIfNeeded(); 801 } 818 802 } 819 803 … … 1121 1105 CField* field = this->enabledFields[i]; 1122 1106 this->sendAddField(field->getId()); 1107 field->checkAttributes(); 1123 1108 field->sendAllAttributesToServer(); 1124 1109 field->sendAddAllVariables(); -
XIOS/dev/branch_openmp/src/node/file.hpp
r1134 r1328 4 4 /// XIOS headers /// 5 5 #include "xios_spl.hpp" 6 #include "mpi_std.hpp" 6 7 #include "field.hpp" 7 8 #include "data_output.hpp" … … 11 12 #include "attribute_enum.hpp" 12 13 #include "attribute_enum_impl.hpp" 13 #include "mpi.hpp"14 #ifdef _usingEP15 #include "ep_declaration.hpp"16 #endif17 14 18 15 namespace xios { … … 110 107 void buildFilterGraphOfEnabledFields(CGarbageCollector& gc); 111 108 void prefetchEnabledReadModeFields(); 112 void prefetchEnabledReadModeFieldsIfNeeded();109 void doPostTimestepOperationsForEnabledReadModeFields(); 113 110 114 111 // Add component into file -
XIOS/dev/branch_openmp/src/node/generate_rectilinear_domain.hpp
r1134 r1328 60 60 static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CGenerateRectilinearDomain 64 63 -
XIOS/dev/branch_openmp/src/node/grid.cpp
r1205 r1328 1114 1114 outLocalIndexToServer(idx) = itIndex->second; 1115 1115 } 1116 1116 1117 1117 const std::list<int>& ranks = client->getRanksServerLeader(); 1118 1118 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) … … 1750 1750 pDom->solveRefInheritance(apply); 1751 1751 pDom->solveInheritanceTransformation(); 1752 //cout<<"pDom check"<<endl; 1752 1753 } 1753 1754 } -
XIOS/dev/branch_openmp/src/node/interpolate_axis.hpp
r1134 r1328 62 62 static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node); 63 63 static bool _dummyRegistered; 64 #pragma omp threadprivate(_dummyRegistered)65 66 64 }; // class CInterpolateAxis 67 65 -
XIOS/dev/branch_openmp/src/node/interpolate_domain.hpp
r1134 r1328 60 60 static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CInterpolateDomain 64 63 -
XIOS/dev/branch_openmp/src/node/inverse_axis.hpp
r1134 r1328 59 59 static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node); 60 60 static bool _dummyRegistered; 61 #pragma omp threadprivate(_dummyRegistered)62 61 63 62 }; // class CInverseAxis -
XIOS/dev/branch_openmp/src/node/mesh.cpp
r1134 r1328 6 6 7 7 #include "mesh.hpp" 8 using namespace ep_lib; 8 9 9 10 namespace xios { … … 31 32 } 32 33 33 std::map <StdString, CMesh> CMesh::meshList = std::map <StdString, CMesh>();34 std::map <StdString, vector<int> > CMesh::domainList = std::map <StdString, vector<int> >();34 //std::map <StdString, CMesh> CMesh::meshList = std::map <StdString, CMesh>(); 35 //std::map <StdString, vector<int> > CMesh::domainList = std::map <StdString, vector<int> >(); 35 36 36 37 std::map <StdString, CMesh> *CMesh::meshList_ptr = 0; 37 38 std::map <StdString, vector<int> > *CMesh::domainList_ptr = 0; 38 39 39 40 40 ///--------------------------------------------------------------- … … 45 45 * \param [in] nvertex Number of verteces (1 for nodes, 2 for edges, 3 and up for faces). 46 46 */ 47 48 /* bkp49 CMesh* CMesh::getMesh (StdString meshName, int nvertex)50 {51 CMesh::domainList[meshName].push_back(nvertex);52 53 if ( CMesh::meshList.begin() != CMesh::meshList.end() )54 {55 for (std::map<StdString, CMesh>::iterator it=CMesh::meshList.begin(); it!=CMesh::meshList.end(); ++it)56 {57 if (it->first == meshName)58 return &meshList[meshName];59 else60 {61 CMesh newMesh;62 CMesh::meshList.insert( make_pair(meshName, newMesh) );63 return &meshList[meshName];64 }65 }66 }67 else68 {69 CMesh newMesh;70 CMesh::meshList.insert( make_pair(meshName, newMesh) );71 return &meshList[meshName];72 }73 }74 */75 76 47 CMesh* CMesh::getMesh (StdString meshName, int nvertex) 77 48 { … … 79 50 if(CMesh::meshList_ptr == NULL) CMesh::meshList_ptr = new std::map <StdString, CMesh>(); 80 51 81 (*CMesh::domainList_ptr)[meshName].push_back(nvertex); 82 83 if ( (*CMesh::meshList_ptr).begin() != (*CMesh::meshList_ptr).end() ) 84 { 85 for (std::map<StdString, CMesh>::iterator it=(*CMesh::meshList_ptr).begin(); it!=(*CMesh::meshList_ptr).end(); ++it) 52 //CMesh::domainList[meshName].push_back(nvertex); 53 CMesh::domainList_ptr->at(meshName).push_back(nvertex); 54 55 //if ( CMesh::meshList.begin() != CMesh::meshList.end() ) 56 if ( CMesh::meshList_ptr->begin() != CMesh::meshList_ptr->end() ) 57 { 58 //for (std::map<StdString, CMesh>::iterator it=CMesh::meshList.begin(); it!=CMesh::meshList.end(); ++it) 59 for (std::map<StdString, CMesh>::iterator it=CMesh::meshList_ptr->begin(); it!=CMesh::meshList_ptr->end(); ++it) 86 60 { 87 61 if (it->first == meshName) 88 return &((*CMesh::meshList_ptr)[meshName]); 62 //return &meshList[meshName]; 63 return &meshList_ptr->at(meshName); 89 64 else 90 65 { 91 66 CMesh newMesh; 92 (*CMesh::meshList_ptr).insert( make_pair(meshName, newMesh) ); 93 return &((*CMesh::meshList_ptr)[meshName]); 67 //CMesh::meshList.insert( make_pair(meshName, newMesh) ); 68 CMesh::meshList_ptr->insert( make_pair(meshName, newMesh) ); 69 //return &meshList[meshName]; 70 return &meshList_ptr->at(meshName); 94 71 } 95 72 } … … 98 75 { 99 76 CMesh newMesh; 100 (*CMesh::meshList_ptr).insert( make_pair(meshName, newMesh) ); 101 return &((*CMesh::meshList_ptr)[meshName]); 77 //CMesh::meshList.insert( make_pair(meshName, newMesh) ); 78 CMesh::meshList_ptr->insert( make_pair(meshName, newMesh) ); 79 //return &meshList[meshName]; 80 return &meshList_ptr->at(meshName); 102 81 } 103 82 } … … 524 503 * \param [in] bounds_lat Array of boundary latitudes. Its size depends on the element type. 525 504 */ 526 void CMesh::createMeshEpsilon(const ep_lib::MPI_Comm& comm,505 void CMesh::createMeshEpsilon(const MPI_Comm& comm, 527 506 const CArray<double, 1>& lonvalue, const CArray<double, 1>& latvalue, 528 507 const CArray<double, 2>& bounds_lon, const CArray<double, 2>& bounds_lat) … … 1724 1703 */ 1725 1704 1726 void CMesh::getGloNghbFacesNodeType(const ep_lib::MPI_Comm& comm, const CArray<int, 1>& face_idx,1705 void CMesh::getGloNghbFacesNodeType(const MPI_Comm& comm, const CArray<int, 1>& face_idx, 1727 1706 const CArray<double, 2>& bounds_lon, const CArray<double, 2>& bounds_lat, 1728 1707 CArray<int, 2>& nghbFaces) … … 1880 1859 */ 1881 1860 1882 void CMesh::getGloNghbFacesEdgeType(const ep_lib::MPI_Comm& comm, const CArray<int, 1>& face_idx,1861 void CMesh::getGloNghbFacesEdgeType(const MPI_Comm& comm, const CArray<int, 1>& face_idx, 1883 1862 const CArray<double, 2>& bounds_lon, const CArray<double, 2>& bounds_lat, 1884 1863 CArray<int, 2>& nghbFaces) … … 2061 2040 */ 2062 2041 2063 void CMesh::getGlobalNghbFaces(const int nghbType, const ep_lib::MPI_Comm& comm,2042 void CMesh::getGlobalNghbFaces(const int nghbType, const MPI_Comm& comm, 2064 2043 const CArray<int, 1>& face_idx, 2065 2044 const CArray<double, 2>& bounds_lon, const CArray<double, 2>& bounds_lat, -
XIOS/dev/branch_openmp/src/node/mesh.hpp
r1134 r1328 80 80 int nbFaces_; 81 81 82 static std::map <StdString, CMesh> meshList; 83 static std::map <StdString, vector<int> > domainList; 84 82 //static std::map <StdString, CMesh> meshList; 85 83 static std::map <StdString, CMesh> *meshList_ptr; 84 //static std::map <StdString, vector<int> > domainList; 86 85 static std::map <StdString, vector<int> > *domainList_ptr; 87 #pragma omp threadprivate(meshList_ptr, domainList_ptr)88 89 86 CClientClientDHTSizet* pNodeGlobalIndex; // pointer to a map <nodeHash, nodeIdxGlo> 90 87 CClientClientDHTSizet* pEdgeGlobalIndex; // pointer to a map <edgeHash, edgeIdxGlo> -
XIOS/dev/branch_openmp/src/node/reduce_axis_to_scalar.hpp
r1134 r1328 59 59 static CTransformation<CScalar>* create(const StdString& id, xml::CXMLNode* node); 60 60 static bool _dummyRegistered; 61 #pragma omp threadprivate(_dummyRegistered)62 61 }; // class CReduceAxisToScalar 63 62 -
XIOS/dev/branch_openmp/src/node/reduce_domain_to_axis.hpp
r1134 r1328 60 60 static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CReduceDomainToAxis 64 63 -
XIOS/dev/branch_openmp/src/node/reduce_domain_to_scalar.hpp
r1134 r1328 60 60 static CTransformation<CScalar>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CReduceDomainToScalar 64 63 -
XIOS/dev/branch_openmp/src/node/scalar.cpp
r1134 r1328 28 28 29 29 //std::map<StdString, ETranformationType> CScalar::transformationMapList_ = std::map<StdString, ETranformationType>(); 30 std::map<StdString, ETranformationType> *CScalar::transformationMapList_ptr = 0; 30 31 //bool CScalar::dummyTransformationMapList_ = CScalar::initializeTransformationMap(CScalar::transformationMapList_); 31 32 std::map<StdString, ETranformationType> *CScalar::transformationMapList_ptr = 0;33 34 32 bool CScalar::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 35 33 { … … 175 173 176 174 nodeElementName = node.getElementName(); 175 //std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_.end(), it; 177 176 if(CScalar::transformationMapList_ptr == 0) initializeTransformationMap(); 178 std::map<StdString, ETranformationType>::const_iterator ite = (*CScalar::transformationMapList_ptr).end(), it; 179 it = (*CScalar::transformationMapList_ptr).find(nodeElementName); 177 std::map<StdString, ETranformationType>::const_iterator ite = transformationMapList_ptr->end(), it; 178 //it = transformationMapList_.find(nodeElementName); 179 it = transformationMapList_ptr->find(nodeElementName); 180 180 if (ite != it) 181 181 { -
XIOS/dev/branch_openmp/src/node/scalar.hpp
r1134 r1328 88 88 static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m); 89 89 static bool initializeTransformationMap(); 90 91 //static bool dummyTransformationMapList_; 92 90 //static std::map<StdString, ETranformationType> transformationMapList_; 93 91 static std::map<StdString, ETranformationType> *transformationMapList_ptr; 94 #pragma omp threadprivate(transformationMapList_ptr)92 static bool dummyTransformationMapList_; 95 93 96 94 -
XIOS/dev/branch_openmp/src/node/transformation.hpp
r1138 r1328 35 35 typedef std::map<ETranformationType, CreateTransformationCallBack> CallBackMap; 36 36 static CallBackMap* transformationCreationCallBacks_; 37 //#pragma omp threadprivate(transformationCreationCallBacks_)38 37 39 38 static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn); … … 66 65 if (0 == transformationCreationCallBacks_) 67 66 transformationCreationCallBacks_ = new CallBackMap(); 67 68 68 return (*transformationCreationCallBacks_).insert(make_pair(transType, createFn)).second; 69 69 } -
XIOS/dev/branch_openmp/src/node/zoom_axis.hpp
r1134 r1328 60 60 static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 62 }; // class CZoomAxis 64 63 -
XIOS/dev/branch_openmp/src/node/zoom_domain.hpp
r1134 r1328 60 60 static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node); 61 61 static bool _dummyRegistered; 62 #pragma omp threadprivate(_dummyRegistered)63 64 62 }; // class CZoomDomain 65 63
Note: See TracChangeset
for help on using the changeset viewer.