#ifndef __XIOS_CDomain__ #define __XIOS_CDomain__ /// XIOS headers /// #include "xios_spl.hpp" #include "group_factory.hpp" #include "declare_group.hpp" #include "declare_ref_func.hpp" #include "event_client.hpp" #include "event_server.hpp" #include "buffer_in.hpp" #include "array_new.hpp" #include "attribute_array.hpp" #include "attribute_enum.hpp" #include "transformation.hpp" #include "transformation_enum.hpp" namespace xios { /// ////////////////////// DĂ©clarations ////////////////////// /// class CDomainGroup; class CDomainAttributes; class CDomain; ///-------------------------------------------------------------- // Declare/Define CDomainAttribute BEGIN_DECLARE_ATTRIBUTE_MAP(CDomain) # include "domain_attribute.conf" # include "domain_attribute_private.conf" END_DECLARE_ATTRIBUTE_MAP(CDomain) ///-------------------------------------------------------------- class CDomain : public CObjectTemplate , public CDomainAttributes { enum EEventId { EVENT_ID_SERVER_ATTRIBUT, EVENT_ID_INDEX, EVENT_ID_LON, EVENT_ID_LAT, EVENT_ID_AREA } ; /// typedef /// typedef CObjectTemplate SuperClass; typedef CDomainAttributes SuperClassAttribute; public: typedef CDomainAttributes RelAttributes; typedef CDomainGroup RelGroup; typedef CTransformation::TransformationMapTypes TransMapTypes; /// Constructeurs /// CDomain(void); explicit CDomain(const StdString & id); CDomain(const CDomain & domain); // Not implemented yet. CDomain(const CDomain * const domain); // Not implemented yet. static CDomain* createDomain(); void duplicateAttributes(CDomain* domain); virtual void parse(xml::CXMLNode & node); /// VĂ©rifications /// void checkAttributes(void); void checkAttributesOnClient(); void checkAttributesOnClientAfterTransformation(); void checkEligibilityForCompressedOutput(void); void sendCheckedAttributes(); bool hasTransformation(); void solveInheritanceTransformation(); void solveSrcInheritance(); CDomain* getDomainSrc(); TransMapTypes getAllTransformations(); void redistribute(int nbLocalDomain); public: const std::set & getRelFiles(void) const; bool IsWritten(const StdString & filename) const; bool isWrittenCompressed(const StdString& filename) const; const std::vector& getIndexesToWrite(void) const; int getNumberWrittenIndexes() const; int getTotalNumberWrittenIndexes() const; int getOffsetWrittenIndexes() const; std::map getAttributesBufferSize(); bool isEmpty(void) const; bool isDistributed(void) const; bool isCompressible(void) const; int global_zoom_ibegin, global_zoom_ni; int global_zoom_jbegin, global_zoom_nj; int ni_srv,ibegin_srv,iend_srv ; int zoom_ni_srv,zoom_ibegin_srv,zoom_iend_srv ; int nj_srv,jbegin_srv,jend_srv ; int zoom_nj_srv,zoom_jbegin_srv,zoom_jend_srv ; CArray lonvalue_srv, latvalue_srv ; CArray bounds_lon_srv, bounds_lat_srv ; CArray lonvalue_client, latvalue_client; CArray bounds_lon_client, bounds_lat_client; CArray area_srv; vector connectedServer ; // list of connected server vector nbSenders ; // for each communication with a server, number of communicating client vector nbDataSrv ; // size of data to send to each server vector< vector > i_indSrv ; // for each server, i global index to send vector< vector > j_indSrv ; // for each server, j global index to send public: /// Mutateur /// void addRelFile(const StdString & filename); void addRelFileCompressed(const StdString& filename); void completeLonLatClient(void); void sendServerAttribut(void) ; void sendLonLatArea(void); void computeConnectedServer(void) ; void fillInRectilinearBoundLonLat(CArray& boundsLon, CArray& boundsLat, bool isNorthPole = false, bool isSouthPole = false); void fillInRectilinearLonLat(); static bool dispatchEvent(CEventServer& event); static void recvServerAttribut(CEventServer& event); static void recvIndex(CEventServer& event); static void recvLon(CEventServer& event); static void recvLat(CEventServer& event); static void recvArea(CEventServer& event); void recvServerAttribut(CBufferIn& buffer); void recvIndex(int rank, CBufferIn& buffer); void recvLon(int rank, CBufferIn& buffer); void recvLat(int rank, CBufferIn& buffer); void recvArea(int rank, CBufferIn& buffer); /// Destructeur /// virtual ~CDomain(void); /// Accesseurs statiques /// static StdString GetName(void); static StdString GetDefName(void); static ENodeType GetType(void); const std::map >& getIndexServer() const; CArray local_mask; bool isCurvilinear ; bool hasBounds ; bool hasArea; bool hasLonLat; private: void checkDomain(void); void checkLocalIDomain(void); void checkLocalJDomain(void); void checkMask(void); void checkDomainData(void); void checkCompression(void); void checkBounds(void); void checkArea(void); void checkLonLat(); void checkTransformations(); void setTransformations(const TransMapTypes&); void computeNGlobDomain(); void sendIndex(); void sendArea(); void sendLonLat(); private: bool isChecked; std::set relFiles, relFilesCompressed; bool isClientChecked; // Verify whether all attributes of domain on the client side are good bool isClientAfterTransformationChecked; std::map > indiSrv, indjSrv; std::map nbConnectedClients_; // Mapping of number of communicating client to a server std::map > indSrv_; // Global index of each client sent to server std::map > indWrittenSrv_; // Global written index of each client sent to server std::vector indexesToWrite; int numberWrittenIndexes_, totalNumberWrittenIndexes_, offsetWrittenIndexes_; std::vector connectedServerRank_; bool isDistributed_; //! True if and only if the data defined on the domain can be outputted in a compressed way bool isCompressible_; bool isRedistributed_; TransMapTypes transformationMap_; std::vector nGlobDomain_; bool isUnstructed_; CDomain* srcObject_; DECLARE_REF_FUNC(Domain,domain) }; // class CDomain ///-------------------------------------------------------------- // Declare/Define CDomainGroup and CDomainDefinition DECLARE_GROUP(CDomain); ///-------------------------------------------------------------- } // namespace xios #endif // __XIOS_CDomain__