#ifndef __XMLIO_CDataTreatment__ #define __XMLIO_CDataTreatment__ /// xmlioserver headers /// #include "xmlioserver_spl.hpp" #include "node_type.hpp" #include "mpi_manager.hpp" #include "data_output.hpp" #include "duration.hpp" #include "client.hpp" #include "xios_manager.hpp" namespace xmlioserver { namespace data { /// ////////////////////// Déclarations ////////////////////// /// class CDataTreatment { public : /// Construteurs /// CDataTreatment (boost::shared_ptr _ctxt = CObjectFactory::GetObject(CObjectFactory::GetCurrentContextId())); CDataTreatment(const CDataTreatment & data_treatment); // Not implemented yet. CDataTreatment(const CDataTreatment * const data_treatment); // Not implemented yet. /// Accesseurs /// const boost::shared_ptr getCurrentContext(void) const; const std::vector > & getEnabledFiles (void) const; /// Ecriture et mise à jour du calendrier /// void write_data(const StdString & fieldId, const StdString & fileId, const std::deque & data); template void write_data(const StdString & fieldId, const ARRAY(double, N) & data); template void write_data(const StdString & fieldId, const ARRAY(float, N) & data); void update_calendar(int step); void set_timestep(const date::CDuration & duration); /// Création des sorties /// template void createDataOutput(comm::MPIComm comm_server = CXIOSManager::Comm_Server); /// Destructeur /// ~CDataTreatment(void); private : /// Traitements /// void doTreatment(void); void findAllEnabledFields(void); void solveAllGridRef(void); void solveAllOperation(void); void solveAllInheritance(void) const; void findEnabledFiles(void); /// Propriétés privées /// boost::shared_ptr currentContext; std::vector > enabledFiles; }; // CDataTreatment //---------------------------------------------------------------- template void CDataTreatment::createDataOutput(comm::MPIComm comm_server ) { std::vector >::const_iterator it = this->enabledFiles.begin(), end = this->enabledFiles.end(); for (; it != end; it++) { CXIOSManager::Comm_Server = comm_server; boost::shared_ptr file = *it; StdString filename = (!file->name.isEmpty()) ? file->name.getValue() : file->getId(); StdOStringStream oss; if (!CObjectFactory::GetObject (CObjectFactory::GetCurrentContextId())->output_dir.isEmpty()) oss << CObjectFactory::GetObject(CObjectFactory::GetCurrentContextId())->output_dir.getValue(); oss << filename; if (!file->name_suffix.isEmpty()) oss << file->name_suffix.getValue(); if (comm::CMPIManager::GetCommSize(comm_server) > 1) oss << "." << comm::CMPIManager::GetCommRank(comm_server); oss << ".nc"; boost::shared_ptr dout(new T(oss.str(), false)); file->initializeDataOutput(dout); } } template void CDataTreatment::write_data (const StdString & fieldId, const ARRAY(float, N) & data) { typedef typename boost::multi_array::size_type sizetp; std::vector shape; const sizetp * shapearr = data->shape(); shape.assign(shapearr, shapearr + N); ARRAY(double, N) datad(new CArray(shape)); for (StdSize i = 0; i < datad->num_elements(); i++) datad->data()[i] = data->data()[i]; this->write_data(fieldId, datad); } template void CDataTreatment::write_data (const StdString & fieldId, const ARRAY(double, N) & data) { const date::CDate & currDate = this->currentContext->getCalendar()->getCurrentDate(); const date::CDuration & timestep = this->currentContext->getCalendar()->getTimeStep(); const std::vector > & refField= CObjectFactory::GetObject(fieldId)->getAllReference(); std::vector >::const_iterator it = refField.begin(), end = refField.end(); for (; it != end; it++) { boost::shared_ptr field = *it; boost::shared_ptr file = field->getRelFile(); if (field->updateData(currDate, timestep, data)) { if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT) { boost::shared_ptr client = comm::CClient::GetClient(); client->sendData(fieldId, file->getId(), field->getData()); } else { file->getDataOutput()->writeFieldData(field); } } } } } // namespace data } // namespace xmlioserver #endif // __XMLIO_CDataTreatment__