#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" 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; ///-------------------------------------------------------------- // 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; 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: StdSize getNStep(void) const; template void getData(CArray& _data) const; boost::shared_ptr getInstantDataFilter(); /// Mutateur /// void setRelFile(CFile* _file); void incrementNStep(void); void resetNStep(StdSize nstep = 0); void resetNStepMax(); std::map getGridDataSize(); public: bool isActive(void) 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 doSending2Sever); void solveGridDomainAxisRef(bool checkAtt); void solveTransformedGrid(); void solveGenerateGrid(); void buildFilterGraph(CGarbageCollector& gc, bool enableOutput); boost::shared_ptr getSelfReference(CGarbageCollector& gc); boost::shared_ptr getTemporalDataFilter(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); static void recvUpdateData(CEventServer& event); void recvUpdateData(vector& ranks, vector& buffers); void writeField(void); void sendReadDataRequest(void); bool sendReadDataRequestIfNeeded(void); static void recvReadDataRequest(CEventServer& event); void recvReadDataRequest(void); bool 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); void setVirtualVariableGroup(void); 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 = ""); void sendAddVariableGroup(const string& id = ""); static void recvAddVariable(CEventServer& event); void recvAddVariable(CBufferIn& buffer); static void recvAddVariableGroup(CEventServer& event); void recvAddVariableGroup(CBufferIn& buffer); void sendAddAllVariables(); const std::pair& getRefDomainAxisIds(); 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; string content; bool areAllReferenceSolved; std::pair domAxisIds_; bool isReadDataRequestPending; bool useCompressedOutput; DECLARE_REF_FUNC(Field,field) 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 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; }; // class CField ///-------------------------------------------------------------- // Declare/Define CFieldGroup and CFieldDefinition DECLARE_GROUP(CField); ///----------------------------------------------------------------- template <> void CGroupTemplate::solveRefInheritance(void); ///----------------------------------------------------------------- } // namespace xios #endif // __XIOS_CField__