Ignore:
Timestamp:
11/23/21 13:12:46 (3 years ago)
Author:
ymipsl
Message:

Scalar can be now distributed on server side, avoiding incorrect result coming from redondant nature of scalar grid.
YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src/io
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.cpp

    r1962 r2264  
    22822282                  std::vector<StdString> domainList = grid->getDomainList(); 
    22832283                  std::vector<StdString> axisList   = grid->getAxisList(); 
     2284                  std::vector<StdString> scalarList  = grid->getScalarList() ; 
    22842285                  int numElement = axisDomainOrder.numElements(); 
    22852286                  int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 
     
    23182319                      if (1 == axisDomainOrder.numElements()) 
    23192320                      { 
     2321                        CScalar* scalar = CScalar::get(scalarList[scalarList.size()-1]); 
    23202322                        start.push_back(0); 
    2321                         count.push_back(1); 
     2323                        count.push_back(scalar->n); 
    23222324                      } 
    23232325                      --idx; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/io/onetcdf4.cpp

    r1957 r2264  
    477477         if (sizes.size()==0)  
    478478         { 
    479             array_size=1 ; 
    480             sstart.push_back(0); 
    481             scount.push_back(1); 
     479             
     480            if ((start != NULL) && (count != NULL) && start->size()==1 && count->size()==1) // pur scalar case 
     481              array_size*=(*count)[0] ; 
     482            else array_size=1 ; 
    482483         } 
    483484         else 
     
    492493             sstart.push_back(record); 
    493494             scount.push_back(1); 
    494               if ((start == NULL) && 
    495                   (count == NULL)) i++; 
    496               it++; 
     495             if ((start == NULL) && (count == NULL)) i++; 
     496             it++; 
     497             if (it==end) 
     498             { 
     499               if ((start != NULL) && (count != NULL) && start->size()==1 && count->size()==1) // pur scalar case 
     500               { 
     501                 scount[0]=(*count)[0] ; 
     502                 array_size *= (*count)[0]; 
     503               } 
     504             } 
    497505           } 
    498  
     506            
    499507           for (;it != end; it++) 
    500508           { 
     
    569577         int grpid = this->getCurrentGroup(); 
    570578         int varid = this->getVariable(name); 
     579          
    571580         StdSize array_size = 1; 
    572581         std::vector<StdSize> sstart, scount; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/io/onetcdf4_impl.hpp

    r1755 r2264  
    1919    std::vector<StdSize> sstart, scount; 
    2020 
    21     if (this->wmpi && collective) 
    22     CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE); 
    23     if (this->wmpi && !collective) 
    24     CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT); 
     21    if (this->wmpi && collective) CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE); 
     22    if (this->wmpi && !collective) CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT); 
    2523 
    2624    CTimer::get("Files : get data infos").resume(); 
    27     this->getWriteDataInfos 
    28     (name, record, array_size,  sstart, scount, start, count); 
     25    this->getWriteDataInfos(name, record, array_size,  sstart, scount, start, count); 
    2926    CTimer::get("Files : get data infos").suspend(); 
    30  
     27    
    3128    if (data.numElements() != array_size) 
    3229    { 
     
    3633      << " ] Invalid input data !" ); 
    3734    } 
    38  
    39     this->writeData_(grpid, varid, sstart, scount, data.dataFirst()); 
     35     
     36    if (this->wmpi && sstart.size()==0) CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT); // pure scalar case 
     37    if (data.numElements()==0 && sstart.size()==0) {}// pure scalar case if nothing to write, write nothing (independent access)  
     38    else this->writeData_(grpid, varid, sstart, scount, data.dataFirst()); 
    4039  } 
    4140 
Note: See TracChangeset for help on using the changeset viewer.