blob: d511a95f1492780513d56596aa1fd6609f0bc19f [file] [log] [blame]
/// \file
/// Communicate halo data such as "ghost" atoms with neighboring tasks.
#ifndef __HALO_EXCHANGE_
#define __HALO_EXCHANGE_
#include "mytype.h"
struct AtomsSt;
struct LinkCellSt;
struct DomainSt;
/// A polymorphic structure to store information about a halo exchange.
/// This structure can be thought of as an abstract base class that
/// specifies the interface and implements the communication patterns of
/// a halo exchange. Concrete sub-classes supply actual implementations
/// of the loadBuffer, unloadBuffer, and destroy functions, that are
/// specific to the actual data being exchanged. If the subclass needs
/// additional data members, these can be stored in a structure that is
/// pointed to by parms.
///
/// Designing the structure this way allows us to re-use the
/// communication code for both atom data and partial force data.
///
/// \see eamForce
/// \see redistributeAtoms
typedef struct HaloExchangeSt
{
/// The MPI ranks of the six face neighbors of the local domain.
/// Ranks are stored in the order specified in HaloFaceOrder.
int nbrRank[6];
/// The maximum send/recv buffer size (in bytes) that will be needed
/// for this halo exchange.
int bufCapacity;
/// Pointer to a sub-class specific function to load the send buffer.
/// \param [in] parms The parms member of the structure. This is a
/// pointer to a sub-class specific structure that can
/// be used by the load and unload functions to store
/// sub-class specific data.
/// \param [in] data A pointer to a structure that the contains the data
/// that is needed by the loadBuffer function. The
/// loadBuffer function will cast the pointer to a
/// concrete type that is appropriate for the data
/// being exchanged.
/// \param [in] face Specifies the face across which data is being sent.
/// \param [in] buf The send buffer to be loaded
/// \return The number of bytes loaded into the send buffer.
int (*loadBuffer)(void* parms, void* data, int face, char* buf);
/// Pointer to a sub-class specific function to unload the recv buffer.
/// \param [in] parms The parms member of the structure. This is a
/// pointer to a sub-class specific structure that can
/// be used by the load and unload functions to store
/// sub-class specific data.
/// \param [out] data A pointer to a structure that the contains the data
/// that is needed by the unloadBuffer function. The
/// unloadBuffer function will cast the pointer to a
/// concrete type that is appropriate for the data
/// being exchanged.
/// \param [in] face Specifies the face across which data is being sent.
/// \param [in] bufSize The number of bytes in the recv buffer.
/// \param [in] buf The recv buffer to be unloaded.
void (*unloadBuffer)(void* parms, void* data, int face, int bufSize, char* buf);
/// Pointer to a function to deallocate any memory used by the
/// sub-class parms. Essentially this is a virtual destructor.
void (*destroy)(void* parms);
/// A pointer to a sub-class specific structure that contains
/// additional data members needed by the sub-class.
void* parms;
}
HaloExchange;
/// Create a HaloExchange for atom data.
HaloExchange* initAtomHaloExchange(struct DomainSt* domain, struct LinkCellSt* boxes);
/// Create a HaloExchange for force data.
HaloExchange* initForceHaloExchange(struct DomainSt* domain, struct LinkCellSt* boxes);
/// HaloExchange destructor.
void destroyHaloExchange(HaloExchange** haloExchange);
/// Execute a halo exchange.
void haloExchange(HaloExchange* haloExchange, void* data);
/// Sort the atoms by gid in the specified link cell.
void sortAtomsInCell(struct AtomsSt* atoms, struct LinkCellSt* boxes, int iBox);
#endif