#ifndef __CACHEINTERFACE_H__ #define __CACHEINTERFACE_H__ /** @file CacheInterface.h * * Declares the interfaces used by the CacheManager: the software * cache for requesting off processor particle and node data. */ #include #include "config.h" #include "gravity.h" #include "GenericTreeNode.h" #include "keytype.h" /********************************************************* * Gravity interface: Particles *********************************************************/ /// @brief The data in a GravityParticle cache entry. class CacheParticle { public: /// Message containing the data for this entry. CkCacheFillMsg *msg; /// Index of the first particle in the home processor's myParticles array. int begin; /// Index of the last particle in the home processor's myParticles array. int end; /// The rest of the structure is an array of particles. Declared as /// length 1, but can be arbitrary length. It is assumed that these /// particles are contiguous in the myParticles array. ExternalGravityParticle part[1]; }; /// @brief Cache interface to particles for the gravity calculation. /// This is a read-only cache of particles. class EntryTypeGravityParticle : public CkCacheEntryType { public: EntryTypeGravityParticle(); /// @brief Request a bucket of particles from a TreePiece. void * request(CkArrayIndexMax&, KeyType); /// @brief Return data from fufilled cache request. void * unpack(CkCacheFillMsg *, int, CkArrayIndexMax &); /// @brief Do nothing: this is a read-only cache. void writeback(CkArrayIndexMax&, KeyType, void *); /// @brief free cached data. void free(void *); /// @brief return size of cached data. int size(void *); /// @brief callback to TreePiece after data is received. static void callback(CkArrayID, CkArrayIndexMax&, KeyType, CkCacheUserData &, void*, int); }; /********************************************************* * Smooth interface: Particles *********************************************************/ /// @brief particle data in the smooth particle cache messages class CacheSmoothParticle { public: int begin; ///< Beginning particle number int end; ///< ending Particle number int nActual; ///< actual number of particles sent KeyType key; ///< Key of this bucket (for writeback) GravityParticle *partCached; ///< particle data extraSPHData *extraSPHCached; ///< particle extraData ExternalSmoothParticle partExt[1]; ///< particle data in the message }; /// @brief Cache interface to the particles for smooth calculations. /// This cache is a writeback cache. class EntryTypeSmoothParticle : public CkCacheEntryType { // N.B. can't have helpful attributes because of the static function. public: EntryTypeSmoothParticle(); /// @brief Request a bucket of particles from a TreePiece. void * request(CkArrayIndexMax&, KeyType); /// @brief Return data from fufilled cache request. void * unpack(CkCacheFillMsg *, int, CkArrayIndexMax &); void writeback(CkArrayIndexMax&, KeyType, void *); /// @brief free cached data. void free(void *); /// @brief return size of cached data. int size(void *); /// @brief callback to TreePiece after data is received. static void callback(CkArrayID, CkArrayIndexMax&, KeyType, CkCacheUserData &, void*, int); }; /********************************************************* * Gravity interface: Nodes *********************************************************/ /// @brief Cache interface to the Tree Nodes. class EntryTypeGravityNode : public CkCacheEntryType { void *vptr; // For saving a copy of the virtual function table. // It's use will be compiler dependent. void unpackSingle(CkCacheFillMsg *, Tree::BinaryTreeNode *, int, CkArrayIndexMax &, bool); public: EntryTypeGravityNode(); void * request(CkArrayIndexMax&, KeyType); void * unpack(CkCacheFillMsg *, int, CkArrayIndexMax &); void writeback(CkArrayIndexMax&, KeyType, void *); void free(void *); int size(void *); static void callback(CkArrayID, CkArrayIndexMax&, KeyType, CkCacheUserData &, void*, int); }; #endif