Ignore:
Timestamp:
11/25/16 14:12:15 (7 years ago)
Author:
mhnguyen
Message:

Some modifications of reading/writing interpolation weight from/into a file
There are 3 attributes concerning read/write weights from/into a file

  • write_weight: true/false. Default value: false
  • weight_filename.
  • mode: Default value: compute + read: read from file whose name is weight_filename + compute: compute weights + read_or_compute: if weight_filename already exists, the weights will be read from it; otherwise the weights will be computed

In mode compute and read_or_compute, if there is no weight_filename, a filename whose format
xios_interpolation_weight_nameOfContext_nameOfDomainSource_nameOfDomainDestination.nc will be used for read/write.

Test
+) On Curie
+) Work

Location:
XIOS/trunk/src/transformation
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/domain_algorithm_interpolate.cpp

    r982 r1004  
    4848 
    4949CDomainAlgorithmInterpolate::CDomainAlgorithmInterpolate(CDomain* domainDestination, CDomain* domainSource, CInterpolateDomain* interpDomain) 
    50 : CDomainAlgorithmTransformation(domainDestination, domainSource), interpDomain_(interpDomain), writeToFile_(false) 
    51 { 
     50: CDomainAlgorithmTransformation(domainDestination, domainSource), interpDomain_(interpDomain), writeToFile_(false), readFromFile_(false) 
     51{ 
     52  CContext* context = CContext::getCurrent(); 
    5253  interpDomain_->checkValid(domainSource); 
    53   if ((CInterpolateDomain::mode_attr::write == interpDomain_->mode) && 
    54       (!interpDomain_->file.isEmpty())) 
    55     writeToFile_ = true; 
     54  fileToReadWrite_ = "xios_interpolation_weights_"; 
     55 
     56  if (interpDomain_->weight_filename.isEmpty()) 
     57  { 
     58    fileToReadWrite_ += context->getId() + "_" +  
     59                    domainSource->getDomainOutputName() + "_" +  
     60                    domainDestination->getDomainOutputName() + ".nc";     
     61  } 
     62  else  
     63    fileToReadWrite_ = interpDomain_->weight_filename; 
     64 
     65  ifstream f(fileToReadWrite_.c_str());   
     66  switch (interpDomain_->mode) 
     67  { 
     68    case CInterpolateDomain::mode_attr::read: 
     69      readFromFile_ = true;       
     70      break; 
     71    case CInterpolateDomain::mode_attr::compute: 
     72      readFromFile_ = false; 
     73      break; 
     74    case CInterpolateDomain::mode_attr::read_or_compute:       
     75      if (!f.good()) 
     76        readFromFile_ = false; 
     77      else 
     78        readFromFile_ = true; 
     79      break; 
     80    default: 
     81      break; 
     82  }  
     83 
     84  writeToFile_ = interpDomain_->write_weight;   
     85     
    5686} 
    5787 
     
    354384  } 
    355385 
    356   if (writeToFile_) 
     386  if (writeToFile_ && !readFromFile_) 
    357387     writeRemapInfo(interpMapValue); 
    358388  exchangeRemapInfo(interpMapValue); 
     
    439469void CDomainAlgorithmInterpolate::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
    440470{ 
    441   if (CInterpolateDomain::mode_attr::read == interpDomain_->mode 
     471  if (readFromFile_ && !writeToFile_ 
    442472    readRemapInfo(); 
    443473  else 
     
    448478 
    449479void CDomainAlgorithmInterpolate::writeRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
    450 { 
    451   std::string filename = interpDomain_->file.getValue(); 
    452   writeInterpolationInfo(filename, interpMapValue); 
     480 
     481  writeInterpolationInfo(fileToReadWrite_, interpMapValue); 
    453482} 
    454483 
    455484void CDomainAlgorithmInterpolate::readRemapInfo() 
    456 { 
    457   std::string filename = interpDomain_->file.getValue(); 
     485 
    458486  std::map<int,std::vector<std::pair<int,double> > > interpMapValue; 
    459   readInterpolationInfo(filename, interpMapValue); 
     487  readInterpolationInfo(fileToReadWrite_, interpMapValue); 
    460488 
    461489  exchangeRemapInfo(interpMapValue); 
  • XIOS/trunk/src/transformation/domain_algorithm_interpolate.hpp

    r982 r1004  
    4848  CInterpolateDomain* interpDomain_; 
    4949  bool writeToFile_; 
     50  bool readFromFile_; 
     51  StdString fileToReadWrite_; 
    5052 
    5153  // class WriteNetCdf; 
Note: See TracChangeset for help on using the changeset viewer.