/[escript]/trunk/weipa/src/EscriptDataset.cpp
ViewVC logotype

Diff of /trunk/weipa/src/EscriptDataset.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3106 by caltinay, Tue Aug 24 06:08:12 2010 UTC revision 3107 by caltinay, Thu Aug 26 03:41:28 2010 UTC
# Line 14  Line 14 
14  #include <weipa/EscriptDataset.h>  #include <weipa/EscriptDataset.h>
15  #include <weipa/DataVar.h>  #include <weipa/DataVar.h>
16  #include <weipa/ElementData.h>  #include <weipa/ElementData.h>
17    #include <weipa/FileWriter.h>
18  #include <weipa/FinleyMesh.h>  #include <weipa/FinleyMesh.h>
19  #include <weipa/NodeData.h>  #include <weipa/NodeData.h>
20    
# Line 21  Line 22 
22  #include <escript/Data.h>  #include <escript/Data.h>
23  #endif  #endif
24    
 #include <fstream>  
 #include <iostream>  
25  #include <numeric> // for std::accumulate  #include <numeric> // for std::accumulate
 #include <sstream>  
26    
27  #if USE_SILO  #if USE_SILO
28  #include <silo.h>  #include <silo.h>
# Line 85  bool EscriptDataset::initFromEscript( Line 83  bool EscriptDataset::initFromEscript(
83          const StringVec& varNames)          const StringVec& varNames)
84  {  {
85  #ifndef VISIT_PLUGIN  #ifndef VISIT_PLUGIN
86      // Set the domain      // sanity check
87        if (escriptVars.size() != varNames.size()) {
88            return false;
89        }
90    
91        // set the domain
92      if (!setDomain(escriptDomain)) {      if (!setDomain(escriptDomain)) {
93          return false;          return false;
94      }      }
# Line 94  bool EscriptDataset::initFromEscript( Line 97  bool EscriptDataset::initFromEscript(
97      DataVec::iterator varIt = escriptVars.begin();      DataVec::iterator varIt = escriptVars.begin();
98      StringVec::const_iterator nameIt = varNames.begin();      StringVec::const_iterator nameIt = varNames.begin();
99      for (; varIt != escriptVars.end(); varIt++, nameIt++) {      for (; varIt != escriptVars.end(); varIt++, nameIt++) {
100          addData(*varIt, *nameIt);          if (varIt->getDomain().get() == escriptDomain) {
101                addData(*varIt, *nameIt);
102            } else {
103                cerr << "Warning, all data must be on the same domain. Not adding "
104                    << *nameIt << "." << endl;
105            }
106      }      }
107    
108      return true;      return true;
# Line 110  bool EscriptDataset::loadNetCDF(const st Line 118  bool EscriptDataset::loadNetCDF(const st
118                                  const StringVec& varFiles,                                  const StringVec& varFiles,
119                                  const StringVec& varNames, int nBlocks)                                  const StringVec& varNames, int nBlocks)
120  {  {
121      // Load the domain files      // sanity check
122        if (varFiles.size() != varNames.size()) {
123            return false;
124        }
125    
126        // load the domain files
127      if (!setDomain(meshFilePattern, nBlocks)) {      if (!setDomain(meshFilePattern, nBlocks)) {
128          return false;          return false;
129      }      }
130    
131      // Load the variables      // load the variables
132      StringVec::const_iterator fileIt = varFiles.begin();      StringVec::const_iterator fileIt = varFiles.begin();
133      StringVec::const_iterator nameIt = varNames.begin();      StringVec::const_iterator nameIt = varNames.begin();
134      for (; fileIt != varFiles.end(); fileIt++, nameIt++) {      for (; fileIt != varFiles.end(); fileIt++, nameIt++) {
# Line 132  bool EscriptDataset::loadNetCDF(const Me Line 145  bool EscriptDataset::loadNetCDF(const Me
145                                  const StringVec& varFiles,                                  const StringVec& varFiles,
146                                  const StringVec& varNames)                                  const StringVec& varNames)
147  {  {
148      // Set the domain      // sanity check
149        if (varFiles.size() != varNames.size()) {
150            return false;
151        }
152    
153        // set the domain
154      if (!setDomain(mesh)) {      if (!setDomain(mesh)) {
155          return false;          return false;
156      }      }
157    
158      // Load the variables      // load the variables
159      StringVec::const_iterator fileIt = varFiles.begin();      StringVec::const_iterator fileIt = varFiles.begin();
160      StringVec::const_iterator nameIt = varNames.begin();      StringVec::const_iterator nameIt = varNames.begin();
161      for (; fileIt != varFiles.end(); fileIt++, nameIt++) {      for (; fileIt != varFiles.end(); fileIt++, nameIt++) {
# Line 345  bool EscriptDataset::saveVTK(string file Line 363  bool EscriptDataset::saveVTK(string file
363      int gNumCells = 0;      int gNumCells = 0;
364      int gCellSizeAndType[2] = { 0, 0 };      int gCellSizeAndType[2] = { 0, 0 };
365    
366  #if HAVE_MPI      FileWriter* fw = NULL;
     // remove file first if it exists  
     int error = 0;  
     int mpiErr;  
     if (mpiRank == 0) {  
         ifstream f(fileName.c_str());  
         if (f.is_open()) {  
             f.close();  
             if (remove(fileName.c_str())) {  
                 error=1;  
             }  
         }  
     }  
     MPI_Allreduce(&error, &mpiErr, 1, MPI_INT, MPI_MAX, mpiComm);  
     if (mpiErr != 0) {  
         cerr << "Error removing " << fileName << "!" << endl;  
         return false;  
     }  
   
     MPI_File mpiFileHandle;  
     MPI_Info mpiInfo = MPI_INFO_NULL;  
     int amode = MPI_MODE_CREATE|MPI_MODE_WRONLY|MPI_MODE_UNIQUE_OPEN;  
     mpiErr = MPI_File_open(mpiComm, const_cast<char*>(fileName.c_str()),  
             amode, mpiInfo, &mpiFileHandle);  
     if (mpiErr == MPI_SUCCESS) {  
         mpiErr = MPI_File_set_view(mpiFileHandle, 0, MPI_CHAR, MPI_CHAR,  
                 const_cast<char*>("native"), mpiInfo);  
     }  
     if (mpiErr != MPI_SUCCESS) {  
         cerr << "Error opening " << fileName << " for parallel writing!" << endl;  
         return false;  
     }  
   
     // these definitions make the code more readable and life easier -  
     // WRITE_ORDERED causes all ranks to write the contents of the stream while  
     // WRITE_SHARED should only be called for rank 0.  
 #define WRITE_ORDERED(_stream) \  
     do {\  
         MPI_Status mpiStatus;\  
         string contents = _stream.str();\  
         mpiErr = MPI_File_write_ordered(\  
             mpiFileHandle, const_cast<char*>(contents.c_str()),\  
             contents.length(), MPI_CHAR, &mpiStatus);\  
         _stream.str("");\  
     } while(0)  
   
 #define WRITE_SHARED(_stream) \  
     do {\  
         MPI_Status mpiStatus;\  
         string contents = _stream.str();\  
         mpiErr = MPI_File_write_shared(\  
             mpiFileHandle, const_cast<char*>(contents.c_str()),\  
             contents.length(), MPI_CHAR, &mpiStatus);\  
         _stream.str("");\  
     } while(0)  
   
 #else /*********** non-MPI version follows ************/  
   
     ofstream ofs(fileName.c_str());  
   
     // the non-MPI versions of WRITE_ORDERED and WRITE_SHARED are  
     // identical.  
 #define WRITE_ORDERED(_stream) \  
     do {\  
         ofs << _stream.str();\  
         _stream.str("");\  
     } while(0)  
   
 #define WRITE_SHARED(_stream) \  
     do {\  
         ofs << _stream.str();\  
         _stream.str("");\  
     } while(0)  
   
 #endif // HAVE_MPI  
367    
368      if (mpiSize > 1) {      if (mpiSize > 1) {
369  #if HAVE_MPI  #if HAVE_MPI
370            fw = new FileWriter(mpiComm);
371          meshBlocks[0]->removeGhostZones(mpiRank);          meshBlocks[0]->removeGhostZones(mpiRank);
372          ElementData_ptr elements = meshBlocks[0]->getElementsByName(meshName);          ElementData_ptr elements = meshBlocks[0]->getElementsByName(meshName);
373          int myNumCells = elements->getNumElements();          int myNumCells = elements->getNumElements();
# Line 439  bool EscriptDataset::saveVTK(string file Line 384  bool EscriptDataset::saveVTK(string file
384                  0, mpiComm);                  0, mpiComm);
385  #endif  #endif
386      } else {      } else {
387            fw = new FileWriter();
388          int idx = 0;          int idx = 0;
389          for (meshIt = meshBlocks.begin(); meshIt != meshBlocks.end(); meshIt++, idx++) {          for (meshIt = meshBlocks.begin(); meshIt != meshBlocks.end(); meshIt++, idx++) {
390              if (meshBlocks.size() > 1)              if (meshBlocks.size() > 1)
# Line 457  bool EscriptDataset::saveVTK(string file Line 403  bool EscriptDataset::saveVTK(string file
403      ostringstream oss;      ostringstream oss;
404      oss.setf(ios_base::scientific, ios_base::floatfield);      oss.setf(ios_base::scientific, ios_base::floatfield);
405    
406        if (!fw->openFile(fileName)) {
407            return false;
408        }
409    
410      if (mpiRank == 0) {      if (mpiRank == 0) {
411  #ifdef _DEBUG  #ifdef _DEBUG
412          cout << meshName << ": pts=" << gNumPoints << ", cells=" << gNumCells          cout << meshName << ": pts=" << gNumPoints << ", cells=" << gNumCells
# Line 502  bool EscriptDataset::saveVTK(string file Line 452  bool EscriptDataset::saveVTK(string file
452          (*meshIt)->getNodes()->writeCoordinatesVTK(oss, blockNum);          (*meshIt)->getNodes()->writeCoordinatesVTK(oss, blockNum);
453      }      }
454    
455      WRITE_ORDERED(oss);      if (!fw->writeOrdered(oss)) {
456            cerr << "Warning, ignoring file write error!" << endl;
457        }
458    
459      if (mpiRank == 0) {      if (mpiRank == 0) {
460          oss << "</DataArray>" << endl << "</Points>" << endl;          oss << "</DataArray>" << endl << "</Points>" << endl;
# Line 518  bool EscriptDataset::saveVTK(string file Line 470  bool EscriptDataset::saveVTK(string file
470          el->writeConnectivityVTK(oss);          el->writeConnectivityVTK(oss);
471      }      }
472    
473      WRITE_ORDERED(oss);      if (!fw->writeOrdered(oss)) {
474            cerr << "Warning, ignoring file write error!" << endl;
475        }
476    
477      //      //
478      // offsets & types      // offsets & types
# Line 535  bool EscriptDataset::saveVTK(string file Line 489  bool EscriptDataset::saveVTK(string file
489              oss << gCellSizeAndType[1] << endl;              oss << gCellSizeAndType[1] << endl;
490          }          }
491          oss << "</DataArray>" << endl << "</Cells>" << endl;          oss << "</DataArray>" << endl << "</Cells>" << endl;
492          WRITE_SHARED(oss);          if (!fw->writeShared(oss)) {
493                cerr << "Warning, ignoring file write error!" << endl;
494            }
495      }      }
496    
497      // now write all variables - first the nodal data, then cell data      // now write all variables - first the nodal data, then cell data
# Line 546  bool EscriptDataset::saveVTK(string file Line 502  bool EscriptDataset::saveVTK(string file
502              oss << "<PointData>" << endl;              oss << "<PointData>" << endl;
503          for (viIt = nodalVars.begin(); viIt != nodalVars.end(); viIt++) {          for (viIt = nodalVars.begin(); viIt != nodalVars.end(); viIt++) {
504              writeVarToVTK(*viIt, oss);              writeVarToVTK(*viIt, oss);
505              WRITE_ORDERED(oss);              if (!fw->writeOrdered(oss)) {
506                    cerr << "Warning, ignoring file write error!" << endl;
507                }
508              if (mpiRank == 0)              if (mpiRank == 0)
509                  oss << "</DataArray>" << endl;                  oss << "</DataArray>" << endl;
510          }          }
# Line 560  bool EscriptDataset::saveVTK(string file Line 518  bool EscriptDataset::saveVTK(string file
518              oss << "<CellData>" << endl;              oss << "<CellData>" << endl;
519          for (viIt = cellVars.begin(); viIt != cellVars.end(); viIt++) {          for (viIt = cellVars.begin(); viIt != cellVars.end(); viIt++) {
520              writeVarToVTK(*viIt, oss);              writeVarToVTK(*viIt, oss);
521              WRITE_ORDERED(oss);              if (!fw->writeOrdered(oss)) {
522                    cerr << "Warning, ignoring file write error!" << endl;
523                }
524              if (mpiRank == 0)              if (mpiRank == 0)
525                  oss << "</DataArray>" << endl;                  oss << "</DataArray>" << endl;
526          }          }
# Line 571  bool EscriptDataset::saveVTK(string file Line 531  bool EscriptDataset::saveVTK(string file
531      if (mpiRank == 0) {      if (mpiRank == 0) {
532          oss << "</Piece>" << endl << "</UnstructuredGrid>" << endl          oss << "</Piece>" << endl << "</UnstructuredGrid>" << endl
533              << "</VTKFile>" << endl;              << "</VTKFile>" << endl;
534          WRITE_SHARED(oss);          if (!fw->writeShared(oss)) {
535                cerr << "Warning, ignoring file write error!" << endl;
536            }
537      }      }
538    
539  #if HAVE_MPI      fw->close();
540      mpiErr = MPI_File_close(&mpiFileHandle);      delete fw;
 #else  
     ofs.close();  
 #endif  
   
541      return true;      return true;
542  }  }
543    
# Line 623  bool EscriptDataset::setDomain(const esc Line 581  bool EscriptDataset::setDomain(const esc
581      if (meshBlocks.size() > 0) {      if (meshBlocks.size() > 0) {
582          cerr << "Domain has already been set!" << endl;          cerr << "Domain has already been set!" << endl;
583          myError = 1;          myError = 1;
584        } else if (!domain) {
585            cerr << "Domain is NULL!" << endl;
586            myError = 1;
587      } else {      } else {
588          FinleyMesh_ptr mesh(new FinleyMesh());          FinleyMesh_ptr mesh(new FinleyMesh());
589          if (mesh->initFromEscript(domain)) {          if (mesh->initFromEscript(domain)) {
# Line 632  bool EscriptDataset::setDomain(const esc Line 592  bool EscriptDataset::setDomain(const esc
592              meshBlocks.push_back(mesh);              meshBlocks.push_back(mesh);
593          } else {          } else {
594              cerr << "Error initializing domain!" << endl;              cerr << "Error initializing domain!" << endl;
595              myError = 1;              myError = 2;
596          }          }
597      }      }
598    
# Line 646  bool EscriptDataset::setDomain(const esc Line 606  bool EscriptDataset::setDomain(const esc
606          gError = myError;          gError = myError;
607      }      }
608    
609      if (gError) {      if (gError>1) {
610          meshBlocks.clear();          meshBlocks.clear();
611      } else {      } else if (gError==0) {
612          // Convert mesh data to variables          // Convert mesh data to variables
613          convertMeshVariables();          convertMeshVariables();
614      }      }
615      return !gError;      return (gError==0);
616    
617  #else // VISIT_PLUGIN  #else // VISIT_PLUGIN
618      return false;      return false;

Legend:
Removed from v.3106  
changed lines
  Added in v.3107

  ViewVC Help
Powered by ViewVC 1.1.26