#ifndef __XIOS_CField__ #define __XIOS_CField__ /// XIOS headers /// #include "xios_spl.hpp" #include "group_factory.hpp" #include "functor.hpp" #include "functor_type.hpp" #include "duration.hpp" #include "date.hpp" #include "declare_group.hpp" #include "calendar_util.hpp" #include "array_new.hpp" #include "attribute_array.hpp" #include "declare_ref_func.hpp" #include "transformation_enum.hpp" #include "variable.hpp" #include "context_client.hpp" namespace xios { /// ////////////////////// Déclarations ////////////////////// /// class CFieldGroup; class CFieldAttributes; class CField; class CFile; class CGrid; class CContext; class CGenericFilter; class CGarbageCollector; class COutputPin; class CSourceFilter; class CStoreFilter; class CFileWriterFilter; class CFileServerWriterFilter; ///-------------------------------------------------------------- // Declare/Define CFieldAttribute BEGIN_DECLARE_ATTRIBUTE_MAP(CField) # include "field_attribute.conf" END_DECLARE_ATTRIBUTE_MAP(CField) ///-------------------------------------------------------------- class CField : public CObjectTemplate , public CFieldAttributes { /// friend /// friend class CFile; /// typedef /// typedef CObjectTemplate SuperClass; typedef CFieldAttributes SuperClassAttribute; enum EReadField { RF_NODATA, RF_EOF, RF_DATA }; public: typedef CFieldAttributes RelAttributes; typedef CFieldGroup RelGroup; enum EEventId { EVENT_ID_UPDATE_DATA, EVENT_ID_READ_DATA, EVENT_ID_READ_DATA_READY, EVENT_ID_ADD_VARIABLE, EVENT_ID_ADD_VARIABLE_GROUP }; /// Constructeurs /// CField(void); explicit CField(const StdString& id); CField(const CField& field); // Not implemented yet. CField(const CField* const field); // Not implemented yet. /// Accesseurs /// CGrid* getRelGrid(void) const; CFile* getRelFile(void) const; func::CFunctor::ETimeType getOperationTimeType() const; public: int getNStep(void) const; template void getData(CArray& _data) const; boost::shared_ptr getInstantDataFilter(); /// Mutateur /// void setRelFile(CFile* _file); void incrementNStep(void); void resetNStep(int nstep = 0); void resetNStepMax(); std::map getGridAttributesBufferSize(CContextClient* client); std::map getGridDataBufferSize(CContextClient* client); // Grid data buffer size for each connection of contextclient public: bool isActive(bool atCurrentTimestep = false) const; bool hasOutputFile; bool wasWritten() const; void setWritten(); bool getUseCompressedOutput() const; void setUseCompressedOutput(); /// Traitements /// void solveGridReference(void); void solveServerOperation(void); void solveCheckMaskIndex(bool doSendingIndex); void solveAllReferenceEnabledField(bool doSending2Server); void solveOnlyReferenceEnabledField(bool doSending2Server); void generateNewTransformationGridDest(); void updateRef(CGrid* grid); void buildGridTransformationGraph(); void solveGridDomainAxisRef(bool checkAtt); void solveTransformedGrid(); void solveGenerateGrid(); void solveGridDomainAxisBaseRef(); void solveAllEnabledFieldsAndTransform(); void checkGridOfEnabledFields(); void sendGridOfEnabledFields(); void sendGridComponentOfEnabledFields(); /// Vérifications /// void checkAttributes(void); void buildFilterGraph(CGarbageCollector& gc, bool enableOutput); size_t getGlobalWrittenSize(void) ; boost::shared_ptr getFieldReference(CGarbageCollector& gc); boost::shared_ptr getSelfReference(CGarbageCollector& gc); boost::shared_ptr getTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq); boost::shared_ptr getSelfTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq); // virtual void fromBinary(StdIStream& is); /// Destructeur /// virtual ~CField(void); /// Accesseurs statiques /// static StdString GetName(void); static StdString GetDefName(void); static ENodeType GetType(void); template void setData(const CArray& _data); static bool dispatchEvent(CEventServer& event); void sendUpdateData(const CArray& data); void sendUpdateData(const CArray& data, CContextClient* client); static void recvUpdateData(CEventServer& event); void recvUpdateData(std::map& rankBuffers); void writeField(void); bool sendReadDataRequest(const CDate& tsDataRequested); bool sendReadDataRequestIfNeeded(void); static void recvReadDataRequest(CEventServer& event); void recvReadDataRequest(void); EReadField readField(void); static void recvReadDataReady(CEventServer& event); void recvReadDataReady(vector ranks, vector buffers); void outputField(CArray& fieldOut); void outputField(CArray& fieldOut); void outputField(CArray& fieldOut); void inputField(CArray& fieldOut); void inputField(CArray& fieldOut); void inputField(CArray& fieldOut); void outputCompressedField(CArray& fieldOut); void scaleFactorAddOffset(double scaleFactor, double addOffset); void invertScaleFactorAddOffset(double scaleFactor, double addOffset); void parse(xml::CXMLNode& node); void setVirtualVariableGroup(CVariableGroup* newVVariableGroup); CVariableGroup* getVirtualVariableGroup(void) const; vector getAllVariables(void) const; virtual void solveDescInheritance(bool apply, const CAttributeMap* const parent = 0); CVariable* addVariable(const string& id = ""); CVariableGroup* addVariableGroup(const string& id = ""); void sendAddVariable(const string& id, CContextClient* client); void sendAddVariableGroup(const string& id, CContextClient* client); static void recvAddVariable(CEventServer& event); void recvAddVariable(CBufferIn& buffer); static void recvAddVariableGroup(CEventServer& event); void recvAddVariableGroup(CBufferIn& buffer); void sendAddAllVariables(CContextClient* client); void writeUpdateData(const CArray& data); const std::vector& getRefDomainAxisIds(); const string& getExpression(void); bool hasExpression(void) const; public: /// Propriétés privées /// CVariableGroup* vVariableGroup; CGrid* grid; CFile* file; CDuration freq_operation_srv, freq_write_srv; bool written; // > foperation_srv; // map > data_srv; CArray recvDataSrv; boost::shared_ptr recvFoperationSrv; string content; std::vector domAxisScalarIds_; bool useCompressedOutput; // Two variables to identify the time_counter meta data written in file, which has no time_counter bool hasTimeInstant; bool hasTimeCentered; DECLARE_REF_FUNC(Field,field) private: bool areAllReferenceSolved; bool isReferenceSolved; bool isReferenceSolvedAndTransformed; bool nstepMaxRead; private: //! The type of operation attached to the field func::CFunctor::ETimeType operationTimeType; //! The output pin of the filter providing the instant data for the field boost::shared_ptr instantDataFilter; //! The output pin of the filters providing the result of the field's temporal operation std::map, DurationFakeLessComparator> temporalDataFilters; //! The output pin of the filter providing the instant data for self references boost::shared_ptr selfReferenceFilter; //! The source filter for data provided by the client boost::shared_ptr clientSourceFilter; //! The source filter for data provided by the server boost::shared_ptr serverSourceFilter; //! The terminal filter which stores the instant data boost::shared_ptr storeFilter; //! The terminal filter which writes the data to file boost::shared_ptr fileWriterFilter; //! The terminal filter which writes data to file boost::shared_ptr fileServerWriterFilter; }; // class CField ///-------------------------------------------------------------- // Declare/Define CFieldGroup and CFieldDefinition DECLARE_GROUP(CField); ///----------------------------------------------------------------- template <> void CGroupTemplate::solveRefInheritance(void); ///----------------------------------------------------------------- } // namespace xios #endif // __XIOS_CField__