Changeset 1961
- Timestamp:
- 10/12/20 11:26:40 (4 years ago)
- Location:
- XIOS/dev/dev_ym/XIOS_COUPLING/src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/data_output.cpp
r1882 r1961 122 122 //---------------------------------------------------------------- 123 123 124 void CDataOutput::writeFieldData(CField* field, const CArray<double,1>& data)124 int CDataOutput::writeFieldData(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep) 125 125 TRY 126 126 { 127 // CGrid* grid = CGrid::get(field->grid_ref.getValue()); 128 // CDomain* domain = CDomain::get(grid->domain_ref.getValue()); 129 this->writeFieldData_(field, data); 127 return this->writeFieldData_(field, data, lastWrite, currentWrite, nstep); 130 128 } 131 129 CATCH 130 132 131 133 132 ///---------------------------------------------------------------- -
XIOS/dev/dev_ym/XIOS_COUPLING/src/data_output.hpp
r1882 r1961 28 28 void writeFieldGrid(CField* field); 29 29 void writeTimeDimension(void); 30 void writeFieldData(CField* field, const CArray<double,1>& data);30 int writeFieldData(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep); 31 31 32 32 virtual void definition_start(void) = 0; … … 52 52 virtual void syncFile_ (void) = 0; 53 53 virtual void writeField_ (CField* field) = 0; 54 virtual void writeFieldData_(CField* field, const CArray<double,1>& data) = 0;54 virtual int writeFieldData_ (CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep) = 0; 55 55 virtual void writeDomain_ (CDomain* domain) = 0; 56 56 virtual void writeAxis_ (CAxis* axis) = 0; -
XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_writer_store_filter.cpp
r1935 r1961 2 2 #include "exception.hpp" 3 3 #include "field.hpp" 4 #include "file.hpp" 5 #include "context.hpp" 4 6 5 7 namespace xios … … 7 9 CFileWriterStoreFilter::CFileWriterStoreFilter(CGarbageCollector& gc, CField* field) 8 10 : CInputPin(gc, 1) 9 , field(field) 11 , field_(field) 12 10 13 { 11 if (!field) 12 ERROR("CFileWriterStoreFilter::CFileWriterStoreFilter(CField* field)", 13 "The field cannot be null."); 14 CContext* context = CContext::getCurrent(); 15 16 if (!field) ERROR("CFileWriterStoreFilter::CFileWriterStoreFilter(CField* field)", "The field cannot be null."); 17 file_ = field->getFileOut() ; 18 grid_= field->getGrid() ; 19 freqWrite_ = file_->output_freq ; 20 lastWrite_ = context->getCalendar()->getInitDate(); 21 if (!file_->isEmptyZone() && (field->getGrid()->doGridHaveDataToWrite() || file_->type == CFile::type_attr::one_file)) 22 needToWrite_=true ; 23 else needToWrite_=false; 24 lastFileSplit_ = file_->getLastSplit() ; 25 nstep_ = 0 ; 26 if (!field->scale_factor.isEmpty()) { scaleFactor_ = field->scale_factor ; hasScaleFactor_ = true ; } 27 if (!field->add_offset.isEmpty()) { addOffset_ = field->add_offset ; hasAddOffset_ = true ; } 28 if (!field->prec.isEmpty() && field->prec == 2) hasRounding_ = true ; 29 if (!field->default_value.isEmpty()) {hasDefaultValue_=true ; defaultValue_ = field->default_value ;} 14 30 } 15 31 16 32 void CFileWriterStoreFilter::onInputReady(std::vector<CDataPacketPtr> data) 17 33 { 18 field->writeUpdateData(data[0]->data); 34 const CDate currentWrite = lastWrite_ + freqWrite_; 35 if (needToWrite_) 36 { 37 file_->checkWriteFile(); 38 if (file_->getLastSplit() != lastFileSplit_) 39 { 40 nstep_ = 0 ; 41 lastFileSplit_ = file_->getLastSplit() ; 42 } 43 nstep_ = nstep_+1; 44 45 CArray<double,1> dataIn = data[0]->data ; 46 CArray<double,1> fieldData ; 47 48 if (hasAddOffset_ || hasScaleFactor_ || hasRounding_) dataIn = data[0]->data ; 49 else dataIn.reference(data[0]->data) ; 50 51 if (hasAddOffset_) dataIn = dataIn - addOffset_ ; 52 if (hasScaleFactor_) dataIn = dataIn / scaleFactor_; 53 if (hasRounding_) dataIn = round(dataIn); 54 55 if (hasDefaultValue_) 56 { 57 size_t nbData=dataIn.numElements() ; 58 for (size_t idx = 0; idx < nbData; ++idx) if ( NumTraits<double>::isNan(dataIn(idx)) ) dataIn(idx)=defaultValue_ ; 59 } 60 61 if (field_->getUseCompressedOutput()) fieldData.reference(dataIn) ; 62 else 63 { 64 fieldData.resize(grid_->getWorkflowToFullConnector()->getDstSize()); 65 if (hasDefaultValue_) grid_->getWorkflowToFullConnector()->transfer(dataIn, fieldData, defaultValue_ ) ; 66 else grid_->getWorkflowToFullConnector()->transfer(dataIn, fieldData ) ; 67 } 68 nstep_ = file_->getDataOutput()->writeFieldData(field_, fieldData, lastWrite_,currentWrite, nstep_); 69 } 70 71 lastWrite_ = currentWrite ; 72 19 73 } 20 74 -
XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_writer_store_filter.hpp
r1935 r1961 7 7 { 8 8 class CField; 9 class CFile; 10 class CGrid; 9 11 10 12 /*! … … 46 48 47 49 private: 48 CField* field; //<! The associated field 49 std::map<Time, CDataPacketPtr> packets; //<! The stored packets 50 CField* field_; //<! The associated field 51 CFile* file_ ; 52 CGrid* grid_ ; 53 CDate lastWrite_ ; 54 CDate lastFileSplit_ ; 55 CDuration freqWrite_ ; 56 int nstep_ ; 57 bool needToWrite_ ; 58 double scaleFactor_ = 1.0; 59 double addOffset_ = 0.0; 60 bool hasScaleFactor_ = false ; 61 bool hasAddOffset_ = false ; 62 double defaultValue_ ; 63 bool hasDefaultValue_=false; 64 bool hasRounding_=false ; 65 50 66 }; // class CFileWriterStoreFilter 51 67 } // namespace xios -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.cpp
r1959 r1961 1713 1713 } 1714 1714 1715 if (compressedOutput && grid->isCompressible())1715 while (!dimIdList.empty()) 1716 1716 { 1717 dims.push_back(grid->getId() + "_points"); 1718 field->setUseCompressedOutput(); 1719 } 1720 else 1721 { 1722 while (!dimIdList.empty()) 1723 { 1724 dims.push_back(dimIdList.back()); 1725 dimIdList.pop_back(); 1726 } 1717 dims.push_back(dimIdList.back()); 1718 dimIdList.pop_back(); 1727 1719 } 1728 1720 … … 2070 2062 //--------------------------------------------------------------- 2071 2063 2072 void CNc4DataOutput::writeFieldData_ (CField* field, const CArray<double,1>& data) 2064 int CNc4DataOutput::writeFieldData_ (CField* field, const CArray<double,1>& data, const CDate& lastWrite, 2065 const CDate& currentWrite, int nstep) 2073 2066 { 2074 2067 CContext* context = CContext::getCurrent(); 2075 2068 CGrid* grid = field->getGrid(); 2076 CArray<double,1> dataIn(data.copy()) ; 2077 2078 if (field->getNStep()<1) 2069 2070 if (nstep<1) 2079 2071 { 2080 return ;2072 return nstep; 2081 2073 } 2082 2074 … … 2084 2076 if (SuperClass::type == MULTI_FILE || !isCollective) 2085 2077 { 2086 return ;2078 return nstep; 2087 2079 } 2088 2080 … … 2109 2101 factorUnit=context->getCalendar()->getDayLengthInSeconds() ; 2110 2102 else factorUnit=1 ; 2111 field->resetNStep(getRecordFromTime(field->last_Write_srv,factorUnit) + 1);2103 nstep = getRecordFromTime(field->last_Write_srv,factorUnit) + 1; 2112 2104 } 2113 2105 … … 2128 2120 if (wtime) 2129 2121 { 2130 Time lastWrite = field->last_Write_srv;2131 Time lastLastWrite = field->lastlast_Write_srv;2132 2133 2122 2134 2123 if (field->hasTimeInstant) 2135 2124 { 2136 time_data(0) = time_data_bound(1) = lastWrite;2137 time_data_bound(0) = time_data_bound(1) = lastWrite;2125 time_data(0) = time_data_bound(1) = (Time) lastWrite; 2126 time_data_bound(0) = time_data_bound(1) = (Time) currentWrite; 2138 2127 if (timeCounterType==instant) 2139 2128 { … … 2147 2136 else if (field->hasTimeCentered) 2148 2137 { 2149 time_data(0) = ( lastWrite + lastLastWrite) / 2;2150 time_data_bound(0) = lastLastWrite;2151 time_data_bound(1) = lastWrite;2138 time_data(0) = ((Time)currentWrite + (Time)lastWrite) / 2; 2139 time_data_bound(0) = (Time)lastWrite; 2140 time_data_bound(1) = (Time)currentWrite; 2152 2141 if (timeCounterType==centered) 2153 2142 { … … 2162 2151 if (timeCounterType==record) 2163 2152 { 2164 time_counter(0) = field->getNStep()- 1;2165 time_counter_bound(0) = time_counter_bound(1) = field->getNStep()- 1;2153 time_counter(0) = nstep - 1; 2154 time_counter_bound(0) = time_counter_bound(1) = nstep - 1; 2166 2155 wtimeCounter=true ; 2167 2156 } … … 2179 2168 bool isRoot = (context->intraCommRank_ == 0); 2180 2169 2181 if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty())2182 {2183 double scaleFactor = 1.0;2184 double addOffset = 0.0;2185 if (!field->scale_factor.isEmpty()) scaleFactor = field->scale_factor;2186 if (!field->add_offset.isEmpty()) addOffset = field->add_offset;2187 field->scaleFactorAddOffset(dataIn, scaleFactor, addOffset);2188 }2189 2190 2170 try 2191 2171 { 2192 size_t writtenSize;2193 if (field->getUseCompressedOutput())2194 writtenSize = grid->getNumberWrittenIndexes();2195 else2196 writtenSize = grid->getWrittenDataSize();2197 2198 CArray<double,1> fieldData(writtenSize);2199 if (!field->default_value.isEmpty()) fieldData = field->default_value;2200 2201 if (field->getUseCompressedOutput()) fieldData.reference(dataIn) ;2202 // field->outputCompressedField(dataIn, fieldData);2203 else2204 {2205 //field->outputField(dataIn, fieldData);2206 if (!field->default_value.isEmpty()) field->getGrid()->getWorkflowToFullConnector()->transfer(dataIn, fieldData, (double)field->default_value ) ;2207 else field->getGrid()->getWorkflowToFullConnector()->transfer(dataIn, fieldData ) ;2208 }2209 2210 if (!field->prec.isEmpty() && field->prec == 2) fieldData = round(fieldData);2211 2212 2172 switch (SuperClass::type) 2213 2173 { … … 2215 2175 { 2216 2176 CTimer::get("Files : writing data").resume(); 2217 SuperClassWriter::writeData( fieldData, fieldid, isCollective, field->getNStep()- 1);2177 SuperClassWriter::writeData(data, fieldid, isCollective, nstep - 1); 2218 2178 CTimer::get("Files : writing data").suspend(); 2219 2179 if (wtime) … … 2222 2182 if ( wtimeData) 2223 2183 { 2224 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()- 1, isRoot);2225 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()- 1, isRoot);2184 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, nstep - 1, isRoot); 2185 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, nstep - 1, isRoot); 2226 2186 } 2227 2187 if (wtimeCounter) 2228 2188 { 2229 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep()- 1,isRoot);2230 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep()- 1, isRoot);2189 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, nstep - 1,isRoot); 2190 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, nstep - 1, isRoot); 2231 2191 } 2232 2192 CTimer::get("Files : writing time axis").suspend(); … … 2316 2276 } 2317 2277 } 2318 }2278 } 2319 2279 else 2320 2280 { … … 2368 2328 2369 2329 CTimer::get("Files : writing data").resume(); 2370 SuperClassWriter::writeData( fieldData, fieldid, isCollective, field->getNStep()- 1, &start, &count);2330 SuperClassWriter::writeData(data, fieldid, isCollective, nstep - 1, &start, &count); 2371 2331 CTimer::get("Files : writing data").suspend(); 2372 2332 … … 2376 2336 if ( wtimeData) 2377 2337 { 2378 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()- 1, isRoot);2379 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()- 1, isRoot);2338 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, nstep - 1, isRoot); 2339 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, nstep - 1, isRoot); 2380 2340 } 2381 2341 if (wtimeCounter) 2382 2342 { 2383 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep()- 1,isRoot);2384 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep()- 1, isRoot);2343 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, nstep - 1,isRoot); 2344 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, nstep - 1, isRoot); 2385 2345 2386 2346 } … … 2391 2351 } 2392 2352 } 2353 return nstep ; 2393 2354 } 2394 2355 catch (CNetCdfException& e) -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.hpp
r1882 r1961 56 56 virtual void writeAttribute_(CVariable* var); 57 57 virtual void writeAttribute_(CVariable* var, const string& fieldId); 58 virtual void writeFieldData_(CField* field, const CArray<double,1>& data);58 virtual int writeFieldData_(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep); 59 59 virtual void writeFile_ (CFile* file); 60 60 virtual void closeFile_ (void); -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp
r1949 r1961 163 163 CATCH 164 164 165 165 /* 166 166 void CField::writeUpdateData(const CArray<double,1>& data) 167 167 TRY … … 169 169 const CDate writeDate = last_Write_srv + freq_write_srv; 170 170 last_Write_srv = writeDate; 171 // grid_->computeWrittenIndex(); -> obselete function need to be removed172 /*173 recvDataSrv.resize(data.numElements()) ;174 recvDataSrv = data ;175 */176 171 writeField(data); 177 172 lastlast_Write_srv = last_Write_srv; 178 173 } 179 174 CATCH_DUMP_ATTR 180 181 175 */ 176 177 /* 182 178 void CField::writeField(const CArray<double,1>& data) 183 179 TRY … … 194 190 } 195 191 CATCH_DUMP_ATTR 196 192 */ 193 197 194 /* 198 195 Send a request for reading data. -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp
r1935 r1961 203 203 void recvUpdateDataFromCoupler(std::map<int,CBufferIn*>& rankBuffers); // old interface to be removed 204 204 205 void writeField(const CArray<double,1>& data);205 // void writeField(const CArray<double,1>& data); 206 206 bool sendReadDataRequest(const CDate& tsDataRequested); 207 207 bool sendReadDataRequestIfNeeded(void); … … 246 246 void recvAddVariableGroup(CBufferIn& buffer); 247 247 void sendAddAllVariables(CContextClient* client); 248 void writeUpdateData(const CArray<double,1>& data);248 //void writeUpdateData(const CArray<double,1>& data); 249 249 250 250 const std::vector<StdString>& getRefDomainAxisIds(); -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/file.cpp
r1934 r1961 318 318 { 319 319 CContext* context = CContext::getCurrent(); 320 // Done by classical server or secondary server 321 // This condition should be changed soon 322 //ym if (CServer::serverLevel == 0 || CServer::serverLevel == 2) 323 if (context->getServiceType()==CServicesManager::IO_SERVER || context->getServiceType()==CServicesManager::OUT_SERVER) 324 { 325 if (mode.isEmpty() || mode.getValue() == mode_attr::write) 326 { 327 CTimer::get("Files : create headers").resume(); 328 if (!isOpen) createHeader(); 329 CTimer::get("Files : create headers").suspend(); 330 checkSync(); 331 } 332 checkSplit(); // REally need this? 333 } 320 321 if (mode.isEmpty() || mode.getValue() == mode_attr::write) 322 { 323 CTimer::get("Files : create headers").resume(); 324 if (!isOpen) createHeader(); 325 CTimer::get("Files : create headers").suspend(); 326 checkSync(); 327 } 328 checkSplit(); 334 329 } 335 330 CATCH_DUMP_ATTR … … 417 412 lastSplit = lastSplit + split_freq.getValue(); 418 413 std::vector<CField*>::iterator it, end = this->enabledFields.end(); 419 for (it = this->enabledFields.begin(); it != end; it++)414 /* for (it = this->enabledFields.begin(); it != end; it++) 420 415 { 421 416 (*it)->resetNStep(); 422 417 (*it)->resetNStepMax(); 423 } 418 }*/ 424 419 if (mode.isEmpty() || mode.getValue() == mode_attr::write) 425 420 createHeader(); … … 432 427 } 433 428 CATCH_DUMP_ATTR 429 434 430 435 431 /*! -
XIOS/dev/dev_ym/XIOS_COUPLING/src/node/file.hpp
r1871 r1961 179 179 CDate lastSync; 180 180 CDate lastSplit; 181 182 const CDate& getLastSplit(void) { return lastSplit ; } 183 181 184 int nbAxis, nbDomains; 182 185 bool isOpen;
Note: See TracChangeset
for help on using the changeset viewer.