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

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

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

revision 2876 by caltinay, Fri Jan 15 03:35:05 2010 UTC revision 2877 by caltinay, Thu Jan 28 00:28:45 2010 UTC
# Line 298  bool EscriptDataset::saveSilo(string fil Line 298  bool EscriptDataset::saveSilo(string fil
298          }          }
299    
300          if (tensorDefs.size()) {          if (tensorDefs.size()) {
301                DBSetDir(dbfile, "/");
302              DBoptlist* optList = DBMakeOptlist(2);              DBoptlist* optList = DBMakeOptlist(2);
303              DBAddOption(optList, DBOPT_CYCLE, &cycle);              DBAddOption(optList, DBOPT_CYCLE, &cycle);
304              DBAddOption(optList, DBOPT_DTIME, &time);              DBAddOption(optList, DBOPT_DTIME, &time);
# Line 476  bool EscriptDataset::loadVarFromNetCDF(c Line 477  bool EscriptDataset::loadVarFromNetCDF(c
477  void EscriptDataset::updateSampleDistribution(VarInfo& vi)  void EscriptDataset::updateSampleDistribution(VarInfo& vi)
478  {  {
479      IntVec sampleDist;      IntVec sampleDist;
     int numBlocks = 0;  
480      const DataBlocks& varBlocks = vi.dataBlocks;      const DataBlocks& varBlocks = vi.dataBlocks;
481    
482      if (mpiSize > 1) {      if (mpiSize > 1) {
483  #if HAVE_MPI  #if HAVE_MPI
484          int myNumSamples = varBlocks[0]->getNumberOfSamples();          int myNumSamples = varBlocks[0]->getNumberOfSamples();
485          if (mpiRank == 0) {          sampleDist.insert(sampleDist.end(), mpiSize, 0);
486              numBlocks = mpiSize;          MPI_Allgather(
487              sampleDist.insert(sampleDist.end(), numBlocks, 0);              &myNumSamples, 1, MPI_INT, &sampleDist[0], 1, MPI_INT, mpiComm);
         }  
         MPI_Gather(  
             &myNumSamples, 1, MPI_INT, &sampleDist[0], 1, MPI_INT, 0, mpiComm);  
488  #endif  #endif
489      } else {      } else {
         numBlocks = varBlocks.size();  
490          DataBlocks::const_iterator it;          DataBlocks::const_iterator it;
491          for (it = varBlocks.begin(); it != varBlocks.end(); it++) {          for (it = varBlocks.begin(); it != varBlocks.end(); it++) {
492              sampleDist.push_back((*it)->getNumberOfSamples());              sampleDist.push_back((*it)->getNumberOfSamples());
# Line 505  void EscriptDataset::updateSampleDistrib Line 501  void EscriptDataset::updateSampleDistrib
501  void EscriptDataset::putSiloMultiMesh(DBfile* dbfile, const string& meshName)  void EscriptDataset::putSiloMultiMesh(DBfile* dbfile, const string& meshName)
502  {  {
503  #if USE_SILO  #if USE_SILO
504      int numBlocks = 0;      vector<int> meshtypes;
   
     if (mpiSize > 1) {  
         // FIXME: empty ranks are not accounted for  
         numBlocks = mpiSize;  
     } else {  
         MeshBlocks::iterator meshIt;  
         for (meshIt = meshBlocks.begin(); meshIt != meshBlocks.end(); meshIt++) {  
             const StringVec& meshNames = (*meshIt)->getMeshNames();  
             if (find(meshNames.begin(), meshNames.end(), meshName) != meshNames.end()) {  
                 numBlocks++;  
             }  
         }  
     }  
     vector<int> meshtypes(numBlocks, DB_UCDMESH);  
505      vector<string> tempstrings;      vector<string> tempstrings;
506      vector<char*> meshnames;      vector<char*> meshnames;
507      string pathPrefix;      string pathPrefix;
508    
509      int ppIndex = meshBlocks[0]->getSiloPath().find(':');      int ppIndex = meshBlocks[0]->getSiloPath().find(':');
510      if (ppIndex != string::npos) {      if (ppIndex != string::npos) {
511          pathPrefix = meshBlocks[0]->getSiloPath().substr(0, ppIndex+1);          pathPrefix = meshBlocks[0]->getSiloPath().substr(0, ppIndex+1);
512      }      }
513    
514      for (size_t idx = 0; idx < numBlocks; idx++) {      // find a variable belonging to this mesh to get the sample
515          stringstream siloPath;      // distribution (which tells us which ranks contribute to this mesh).
516          siloPath << pathPrefix << "/block";      // Try mesh variables first, then regular ones.
517          int prevWidth = siloPath.width(4);      VarVector::const_iterator viIt;
518          char prevFill = siloPath.fill('0');      for (viIt = meshVariables.begin(); viIt != meshVariables.end(); viIt++) {
519          siloPath << right << idx;          if (meshName == viIt->dataBlocks[0]->getMeshName())
520          siloPath.width(prevWidth);              break;
521          siloPath.fill(prevFill);      }
522          siloPath << "/";  
523          siloPath << meshName;      if (viIt == meshVariables.end()) {
524          tempstrings.push_back(siloPath.str());          for (viIt = variables.begin(); viIt != variables.end(); viIt++) {
525          meshnames.push_back((char*)tempstrings.back().c_str());              if (meshName == viIt->dataBlocks[0]->getMeshName())
526                    break;
527            }
528        }
529        // this probably means that the mesh is empty
530        if (viIt == variables.end()) {
531            return;
532        }
533    
534        for (size_t idx = 0; idx < viIt->sampleDistribution.size(); idx++) {
535            if (viIt->sampleDistribution[idx] > 0) {
536                stringstream siloPath;
537                siloPath << pathPrefix << "/block";
538                int prevWidth = siloPath.width(4);
539                char prevFill = siloPath.fill('0');
540                siloPath << right << idx;
541                siloPath.width(prevWidth);
542                siloPath.fill(prevFill);
543                siloPath << "/";
544                siloPath << meshName;
545                tempstrings.push_back(siloPath.str());
546                meshnames.push_back((char*)tempstrings.back().c_str());
547                meshtypes.push_back(DB_UCDMESH);
548            }
549      }      }
550    
551      // ignore empty mesh      // ignore empty mesh
552      if (meshnames.size() > 0) {      if (meshnames.size() > 0) {
553            DBSetDir(dbfile, "/");
554          DBoptlist* optList = DBMakeOptlist(2);          DBoptlist* optList = DBMakeOptlist(2);
555          DBAddOption(optList, DBOPT_CYCLE, &cycle);          DBAddOption(optList, DBOPT_CYCLE, &cycle);
556          DBAddOption(optList, DBOPT_DTIME, &time);          DBAddOption(optList, DBOPT_DTIME, &time);
557          DBPutMultimesh(dbfile, meshName.c_str(), numBlocks, &meshnames[0],          DBPutMultimesh(dbfile, meshName.c_str(), meshnames.size(),
558                  &meshtypes[0], optList);                  &meshnames[0], &meshtypes[0], optList);
559          DBFreeOptlist(optList);          DBFreeOptlist(optList);
560      }      }
561  #endif  #endif
# Line 591  void EscriptDataset::putSiloMultiVar(DBf Line 598  void EscriptDataset::putSiloMultiVar(DBf
598    
599      // ignore empty variables      // ignore empty variables
600      if (varnames.size() > 0) {      if (varnames.size() > 0) {
601            DBSetDir(dbfile, "/");
602          DBoptlist* optList = DBMakeOptlist(2);          DBoptlist* optList = DBMakeOptlist(2);
603          DBAddOption(optList, DBOPT_CYCLE, &cycle);          DBAddOption(optList, DBOPT_CYCLE, &cycle);
604          DBAddOption(optList, DBOPT_DTIME, &time);          DBAddOption(optList, DBOPT_DTIME, &time);
# Line 613  void EscriptDataset::putSiloMultiVar(DBf Line 621  void EscriptDataset::putSiloMultiVar(DBf
621  void EscriptDataset::putSiloMultiTensor(DBfile* dbfile, const VarInfo& vi)  void EscriptDataset::putSiloMultiTensor(DBfile* dbfile, const VarInfo& vi)
622  {  {
623  #if USE_SILO  #if USE_SILO
     int numBlocks = 0;  
     if (mpiSize > 1) {  
         // FIXME: empty ranks are not accounted for  
         numBlocks = mpiSize;  
     } else {  
         DataBlocks::const_iterator it;  
         for (it = vi.dataBlocks.begin(); it != vi.dataBlocks.end(); it++) {  
             if ((*it)->getNumberOfSamples() > 0)  
                 numBlocks++;  
         }  
     }  
624      string tensorDir = vi.varName+string("_comps/");      string tensorDir = vi.varName+string("_comps/");
625      DBSetDir(dbfile, "/");      DBSetDir(dbfile, "/");
626      DBMkdir(dbfile, tensorDir.c_str());      DBMkdir(dbfile, tensorDir.c_str());
# Line 632  void EscriptDataset::putSiloMultiTensor( Line 629  void EscriptDataset::putSiloMultiTensor(
629      DBAddOption(optList, DBOPT_CYCLE, &cycle);      DBAddOption(optList, DBOPT_CYCLE, &cycle);
630      DBAddOption(optList, DBOPT_DTIME, &time);      DBAddOption(optList, DBOPT_DTIME, &time);
631      DBAddOption(optList, DBOPT_HIDE_FROM_GUI, &one);      DBAddOption(optList, DBOPT_HIDE_FROM_GUI, &one);
     vector<int> vartypes(numBlocks, DB_UCDVAR);  
632      const IntVec& shape = vi.dataBlocks[0]->getShape();      const IntVec& shape = vi.dataBlocks[0]->getShape();
633    
634      for (int i=0; i<shape[1]; i++) {      for (int i=0; i<shape[1]; i++) {
635          for (int j=0; j<shape[0]; j++) {          for (int j=0; j<shape[0]; j++) {
636              vector<string> tempstrings;              vector<string> tempstrings;
637              vector<char*> varnames;              vector<char*> varnames;
638                vector<int> vartypes;
639              stringstream comp;              stringstream comp;
640              comp << vi.varName << "_comps/a_";              comp << vi.varName << "_comps/a_";
641              comp << i;              comp << i;
642              comp << j;              comp << j;
643              for (size_t idx = 0; idx < numBlocks; idx++) {              for (size_t idx = 0; idx < vi.sampleDistribution.size(); idx++) {
644                  stringstream siloPath;                  if (vi.sampleDistribution[idx] > 0) {
645                  siloPath << "/block";                      stringstream siloPath;
646                  int prevWidth = siloPath.width(4);                      siloPath << "/block";
647                  char prevFill = siloPath.fill('0');                      int prevWidth = siloPath.width(4);
648                  siloPath << right << idx;                      char prevFill = siloPath.fill('0');
649                  siloPath.width(prevWidth);                      siloPath << right << idx;
650                  siloPath.fill(prevFill);                      siloPath.width(prevWidth);
651                  siloPath << "/" << comp.str();                      siloPath.fill(prevFill);
652                  tempstrings.push_back(siloPath.str());                      siloPath << "/" << comp.str();
653                  varnames.push_back((char*)tempstrings.back().c_str());                      tempstrings.push_back(siloPath.str());
654                        varnames.push_back((char*)tempstrings.back().c_str());
655                        vartypes.push_back(DB_UCDVAR);
656                    }
657                }
658                if (varnames.size() > 0) {
659                    DBPutMultivar(dbfile, comp.str().c_str(), varnames.size(),
660                            &varnames[0], &vartypes[0], optList);
661              }              }
             DBPutMultivar(dbfile, comp.str().c_str(), numBlocks, &varnames[0],  
                     &vartypes[0], optList);  
662          }          }
663      }      }
664      DBFreeOptlist(optList);      DBFreeOptlist(optList);

Legend:
Removed from v.2876  
changed lines
  Added in v.2877

  ViewVC Help
Powered by ViewVC 1.1.26