https://github.com/N-BodyShop/changa
Raw File
Tip revision: d8f2b15b85d41f73d55567bedfb07d35fcd80b62 authored by Tom Quinn on 16 August 2020, 16:16:20 UTC
finishNodeCache(): be sure cache is synced before the finish.
Tip revision: d8f2b15
CacheInterface.h
#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 <CkCache.h>
#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<KeyType> *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<KeyType> {
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<KeyType> *, 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<KeyType> {
    // 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<KeyType> *, 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<KeyType> {
  void *vptr; // For saving a copy of the virtual function table.
	      // It's use will be compiler dependent.
  void unpackSingle(CkCacheFillMsg<KeyType> *, Tree::BinaryTreeNode *, int, CkArrayIndexMax &, bool);
public:
  EntryTypeGravityNode();
  void * request(CkArrayIndexMax&, KeyType);
  void * unpack(CkCacheFillMsg<KeyType> *, int, CkArrayIndexMax &);
  void writeback(CkArrayIndexMax&, KeyType, void *);
  void free(void *);
  int size(void *);
  
  static void callback(CkArrayID, CkArrayIndexMax&, KeyType, CkCacheUserData &, void*, int);
};

#endif


back to top