#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 "expr_node.hpp" #include "declare_ref_func.hpp" #include "transformation_enum.hpp" namespace xios { /// ////////////////////// Déclarations ////////////////////// /// class CFieldGroup; class CFieldAttributes; class CField; class CFile; class CGrid; class CContext ; class CGenericFilter; ///-------------------------------------------------------------- // 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 ; public : StdSize getNStep(void) const; const CDuration & getFreqOperation(void) const; const CDuration & getFreqWrite(void) const; boost::shared_ptr getLastWriteDate(void) const; boost::shared_ptr getLastOperationDate(void) const; boost::shared_ptr getFieldOperation(void) const; CArray getData(void) const; template void getData(CArray& _data) const; /// Mutateur /// void setRelFile(CFile* _file); void incrementNStep(void); void resetNStep() ; void resetNStepMax(); template bool updateData(const CArray& data); template bool updateFilteredData(CArray& data); template void updateDataWithoutOperation(const CArray& _data, CArray& updatedData); bool updateDataFromExpression(const CArray& data); void setDataFromExpression(const CArray& _data) ; bool updateDataServer (const CDate & currDate, const std::deque< CArray* > storedClient); std::map getGridDataSize(); public : bool isActive(void) const; bool active ; bool hasOutputFile ; bool hasFieldOut ; /// Traitements /// void processEnabledField(void) ; void solveGridReference(void); void solveOperation(void); void solveCheckMaskIndex(bool doSendingIndex); void solveAllReferenceEnabledField(bool doSending2Sever); void buildAllExpressionEnabledField(); void solveGridDomainAxisRef(bool checkAtt); void solveTransformedGrid(); CGrid* getGridRefOfBaseReference(); // 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(void) ; 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 scaleFactorAddOffset(double scaleFactor, double addOffset) ; void invertScaleFactorAddOffset(double scaleFactor, double addOffset); void parse(xml::CXMLNode & node) ; CArray* getInstantData(void) ; 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(); const std::vector& getFilterSources(); void applyFilter(const CArray& dataToSend, CArray& dataToReceive); void sendAndReceiveTransformedData(const std::map* >& localIndexToSend, const CArray& dataSrc, const std::map* > >& localIndexToReceive, CArray& dataDest); public : /// Propriétés privées /// CVariableGroup* vVariableGroup ; CGrid* grid ; CFile* file; CField* fieldOut ; CDuration freq_operation, freq_write; CDuration freq_operation_srv, freq_write_srv; StdSize nstep, nstepMax; bool isEOF; boost::shared_ptr last_Write, last_operation; boost::shared_ptr lastlast_Write_srv,last_Write_srv, last_operation_srv; CDate lastDataRequestedFromServer; boost::shared_ptr foperation; map > foperation_srv; CArray data; CArray instantData; CArray filteredData; bool hasInstantData ; map* > data_srv ; bool isOnceOperation ; bool isFirstOperation ; string content ; list< pair > fieldDependency ; void buildExpression(void) ; void addDependency(CField* field, int slotId) ; void resetSlots(void) ; vector slots ; CDate* slotUpdateDate ; CFieldNode * expression ; bool hasExpression ; bool slotsFull(void) ; void setSlot(int slotId); bool processed ; bool areAllReferenceSolved; bool areAllExpressionBuilt; std::pair domAxisIds_; bool isReadDataRequestPending; std::vector filterSources_; DECLARE_REF_FUNC(Field,field) }; // class CField ///-------------------------------------------------------------- // Declare/Define CFieldGroup and CFieldDefinition DECLARE_GROUP(CField); ///----------------------------------------------------------------- template <> void CGroupTemplate::solveRefInheritance(void); ///----------------------------------------------------------------- } // namespace xios #endif // __XIOS_CField__