Nektar++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::LibUtilities::Comm Class Referenceabstract

Base communications class. More...

#include <Comm.h>

Inheritance diagram for Nektar::LibUtilities::Comm:
[legend]

Public Member Functions

 Comm (int narg, char *arg[])
 
virtual ~Comm ()
 
void Finalise ()
 
int GetSize () const
 Returns number of processes. More...
 
int GetRank ()
 
const std::string & GetType () const
 
void Block ()
 Block execution until all processes reach this point. More...
 
NekDouble Wtime ()
 Return the time in seconds. More...
 
template<class T >
void Send (int pProc, T &pData)
 
template<class T >
void Recv (int pProc, T &pData)
 
template<class T >
void SendRecv (int pSendProc, T &pSendData, int pRecvProc, T &pRecvData)
 
template<class T >
void SendRecvReplace (int pSendProc, int pRecvProc, T &pData)
 
template<class T >
void AllReduce (T &pData, enum ReduceOperator pOp)
 
template<class T >
void AlltoAll (T &pSendData, T &pRecvData)
 
template<class T1 , class T2 >
void AlltoAllv (T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
 
template<class T >
void AllGather (T &pSendData, T &pRecvData)
 
template<class T >
void AllGatherv (T &pSendData, T &pRecvData, Array< OneD, int > &pRecvDataSizeMap, Array< OneD, int > &pRecvDataOffsetMap)
 
template<class T >
void AllGatherv (T &pRecvData, Array< OneD, int > &pRecvDataSizeMap, Array< OneD, int > &pRecvDataOffsetMap)
 
template<class T >
void Bcast (T &pData, int pRoot)
 
template<class T >
void Exscan (T &pData, enum ReduceOperator pOp, T &ans)
 
template<class T >
Gather (int rootProc, T &val)
 
template<class T >
Scatter (int rootProc, T &pData)
 
template<class T >
void DistGraphCreateAdjacent (T &sources, T &sourceweights, int reorder)
 
template<class T1 , class T2 >
void NeighborAlltoAllv (T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
 
template<class T >
void Irsend (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void Isend (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void SendInit (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void Irecv (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void RecvInit (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
void StartAll (const CommRequestSharedPtr &request)
 
void WaitAll (const CommRequestSharedPtr &request)
 
CommRequestSharedPtr CreateRequest (int num)
 
CommSharedPtr CommCreateIf (int flag)
 If the flag is non-zero create a new communicator. More...
 
void SplitComm (int pRows, int pColumns, int pTime=1)
 Splits this communicator into a grid of size pRows*pColumns and creates row and column communicators. By default the communicator is a single row. More...
 
CommSharedPtr GetRowComm ()
 Retrieve the row communicator to which this process belongs. More...
 
CommSharedPtr GetColumnComm ()
 Retrieve the column communicator to which this process belongs. More...
 
CommSharedPtr GetTimeComm ()
 Retrieve the time communicator to which this process belongs. More...
 
CommSharedPtr GetSpaceComm ()
 Retrieve the space communicator to which this process belongs. More...
 
bool TreatAsRankZero ()
 
bool IsSerial ()
 
std::tuple< int, int, int > GetVersion ()
 
bool RemoveExistingFiles ()
 
std::pair< CommSharedPtr, CommSharedPtrSplitCommNode ()
 

Protected Member Functions

 Comm ()
 
virtual void v_Finalise ()=0
 
virtual int v_GetRank ()=0
 
virtual void v_Block ()=0
 
virtual NekDouble v_Wtime ()=0
 
virtual void v_Send (void *buf, int count, CommDataType dt, int dest)=0
 
virtual void v_Recv (void *buf, int count, CommDataType dt, int source)=0
 
virtual void v_SendRecv (void *sendbuf, int sendcount, CommDataType sendtype, int dest, void *recvbuf, int recvcount, CommDataType recvtype, int source)=0
 
virtual void v_SendRecvReplace (void *buf, int count, CommDataType dt, int pSendProc, int pRecvProc)=0
 
virtual void v_AllReduce (void *buf, int count, CommDataType dt, enum ReduceOperator pOp)=0
 
virtual void v_AlltoAll (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
 
virtual void v_AlltoAllv (void *sendbuf, int sendcounts[], int sensdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_AllGather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
 
virtual void v_AllGatherv (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_AllGatherv (void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_Bcast (void *buffer, int count, CommDataType dt, int root)=0
 
virtual void v_Exscan (Array< OneD, unsigned long long > &pData, enum ReduceOperator pOp, Array< OneD, unsigned long long > &ans)=0
 
virtual void v_Gather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
 
virtual void v_Scatter (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
 
virtual CommSharedPtr v_CommCreateIf (int flag)=0
 
virtual void v_DistGraphCreateAdjacent (int indegree, const int sources[], const int sourceweights[], int reorder)=0
 
virtual void v_NeighborAlltoAllv (void *sendbuf, int sendcounts[], int sdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_Irsend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_Isend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_SendInit (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_Irecv (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
 
virtual void v_RecvInit (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
 
virtual void v_StartAll (CommRequestSharedPtr request)=0
 
virtual void v_WaitAll (CommRequestSharedPtr request)=0
 
virtual CommRequestSharedPtr v_CreateRequest (int num)=0
 
virtual void v_SplitComm (int pRows, int pColumns, int pTime)=0
 
virtual bool v_TreatAsRankZero ()=0
 
virtual bool v_IsSerial ()=0
 
virtual std::tuple< int, int, int > v_GetVersion ()=0
 
virtual bool v_RemoveExistingFiles ()
 
virtual std::pair< CommSharedPtr, CommSharedPtrv_SplitCommNode ()
 

Protected Attributes

int m_size
 Number of processes. More...
 
std::string m_type
 Type of communication. More...
 
CommSharedPtr m_commRow
 Row communicator. More...
 
CommSharedPtr m_commColumn
 Column communicator. More...
 
CommSharedPtr m_commTime
 
CommSharedPtr m_commSpace
 

Detailed Description

Base communications class.

Definition at line 89 of file Comm.h.

Constructor & Destructor Documentation

◆ Comm() [1/2]

Nektar::LibUtilities::Comm::Comm ( int  narg,
char *  arg[] 
)

Definition at line 43 of file Communication/Comm.cpp.

44 {
45  boost::ignore_unused(narg, arg);
46 }

◆ ~Comm()

Nektar::LibUtilities::Comm::~Comm ( )
virtual

Definition at line 52 of file Communication/Comm.cpp.

53 {
54 }

◆ Comm() [2/2]

Nektar::LibUtilities::Comm::Comm ( )
protected

Definition at line 48 of file Communication/Comm.cpp.

49 {
50 }

Member Function Documentation

◆ AllGather()

template<class T >
void Nektar::LibUtilities::Comm::AllGather ( T &  pSendData,
T &  pRecvData 
)

Definition at line 408 of file Comm.h.

409 {
410  BOOST_STATIC_ASSERT_MSG(
412  "AllGather only valid with Array or vector arguments.");
413 
414  int sendSize = CommDataTypeTraits<T>::GetCount(pSendData);
415  int recvSize = sendSize;
416 
417  pRecvData = T(recvSize * GetSize());
418 
419  v_AllGather(CommDataTypeTraits<T>::GetPointer(pSendData), sendSize,
421  CommDataTypeTraits<T>::GetPointer(pRecvData), recvSize,
423 }
int GetSize() const
Returns number of processes.
Definition: Comm.h:279
virtual void v_AllGather(void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0

References Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), GetSize(), and v_AllGather().

◆ AllGatherv() [1/2]

template<class T >
void Nektar::LibUtilities::Comm::AllGatherv ( T &  pRecvData,
Array< OneD, int > &  pRecvDataSizeMap,
Array< OneD, int > &  pRecvDataOffsetMap 
)

Definition at line 450 of file Comm.h.

452 {
453  BOOST_STATIC_ASSERT_MSG(
455  "AllGatherv only valid with Array or vector arguments.");
456 
458  pRecvDataSizeMap.get(), pRecvDataOffsetMap.get(),
460 }
virtual void v_AllGatherv(void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0

References v_AllGatherv().

◆ AllGatherv() [2/2]

template<class T >
void Nektar::LibUtilities::Comm::AllGatherv ( T &  pSendData,
T &  pRecvData,
Array< OneD, int > &  pRecvDataSizeMap,
Array< OneD, int > &  pRecvDataOffsetMap 
)

Definition at line 429 of file Comm.h.

432 {
433  BOOST_STATIC_ASSERT_MSG(
435  "AllGatherv only valid with Array or vector arguments.");
436 
437  int sendSize = CommDataTypeTraits<T>::GetCount(pSendData);
438 
439  v_AllGatherv(CommDataTypeTraits<T>::GetPointer(pSendData), sendSize,
442  pRecvDataSizeMap.get(), pRecvDataOffsetMap.get(),
444 }

References Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), and v_AllGatherv().

◆ AllReduce()

template<class T >
void Nektar::LibUtilities::Comm::AllReduce ( T &  pData,
enum ReduceOperator  pOp 
)

Definition at line 359 of file Comm.h.

360 {
364 }
virtual void v_AllReduce(void *buf, int count, CommDataType dt, enum ReduceOperator pOp)=0

References v_AllReduce().

◆ AlltoAll()

template<class T >
void Nektar::LibUtilities::Comm::AlltoAll ( T &  pSendData,
T &  pRecvData 
)

Definition at line 366 of file Comm.h.

367 {
368  static_assert(CommDataTypeTraits<T>::IsVector,
369  "AlltoAll only valid with Array or vector arguments.");
370  int sendSize = CommDataTypeTraits<T>::GetCount(pSendData);
371  int recvSize = CommDataTypeTraits<T>::GetCount(pRecvData);
372  ASSERTL0(sendSize == recvSize,
373  "Send and Recv arrays have incompatible sizes in AlltoAll");
374 
375  int count = sendSize / GetSize();
376  ASSERTL0(count * GetSize() == sendSize,
377  "Array size incompatible with size of communicator");
378 
381  CommDataTypeTraits<T>::GetPointer(pRecvData), count,
383 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
virtual void v_AlltoAll(void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0

References ASSERTL0, Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), GetSize(), and v_AlltoAll().

◆ AlltoAllv()

template<class T1 , class T2 >
void Nektar::LibUtilities::Comm::AlltoAllv ( T1 &  pSendData,
T2 &  pSendDataSizeMap,
T2 &  pSendDataOffsetMap,
T1 &  pRecvData,
T2 &  pRecvDataSizeMap,
T2 &  pRecvDataOffsetMap 
)

Definition at line 389 of file Comm.h.

392 {
393  static_assert(CommDataTypeTraits<T1>::IsVector,
394  "AlltoAllv only valid with Array or vector arguments.");
395  static_assert(std::is_same<T2, std::vector<int>>::value ||
396  std::is_same<T2, Array<OneD, int>>::value,
397  "Alltoallv size and offset maps should be integer vectors.");
399  (int *)CommDataTypeTraits<T2>::GetPointer(pSendDataSizeMap),
400  (int *)CommDataTypeTraits<T2>::GetPointer(pSendDataOffsetMap),
403  (int *)CommDataTypeTraits<T2>::GetPointer(pRecvDataSizeMap),
404  (int *)CommDataTypeTraits<T2>::GetPointer(pRecvDataOffsetMap),
406 }
virtual void v_AlltoAllv(void *sendbuf, int sendcounts[], int sensdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0

References v_AlltoAllv().

◆ Bcast()

template<class T >
void Nektar::LibUtilities::Comm::Bcast ( T &  pData,
int  pRoot 
)

Definition at line 465 of file Comm.h.

466 {
470 }
virtual void v_Bcast(void *buffer, int count, CommDataType dt, int root)=0

References v_Bcast().

◆ Block()

void Nektar::LibUtilities::Comm::Block ( )
inline

Block execution until all processes reach this point.

Definition at line 303 of file Comm.h.

304 {
305  v_Block();
306 }
virtual void v_Block()=0

References v_Block().

◆ CommCreateIf()

CommSharedPtr Nektar::LibUtilities::Comm::CommCreateIf ( int  flag)
inline

If the flag is non-zero create a new communicator.

Definition at line 716 of file Comm.h.

717 {
718  return v_CommCreateIf(flag);
719 }
virtual CommSharedPtr v_CommCreateIf(int flag)=0

References v_CommCreateIf().

◆ CreateRequest()

CommRequestSharedPtr Nektar::LibUtilities::Comm::CreateRequest ( int  num)
inline

Creates a number of CommRequests.

Parameters
numNumber of requests to generate in the communication request object
Returns
Communication request object

Definition at line 708 of file Comm.h.

709 {
710  return v_CreateRequest(num);
711 }
virtual CommRequestSharedPtr v_CreateRequest(int num)=0

References v_CreateRequest().

◆ DistGraphCreateAdjacent()

template<class T >
void Nektar::LibUtilities::Comm::DistGraphCreateAdjacent ( T &  sources,
T &  sourceweights,
int  reorder 
)

This replaces the current MPI communicator with a new one that also holds the distributed graph topology information. If reordering is enabled using this might break code where process/rank numbers are assumed to remain constant. This also assumes that the graph is bi-directional, so all sources are also destinations with equal weighting.

Parameters
sourcesRanks of processes for which the calling process is the destination/source
sourceweightsWeights of the corresponding edges into the calling process
reorderRanks may be reordered (true) or not (false)

Definition at line 538 of file Comm.h.

539 {
540  static_assert(
542  "DistGraphCreateAdjacent only valid with Array or vector arguments.");
543 
545  CommDataTypeTraits<T>::GetCount(sourceweights),
546  "Sources and weights array sizes don't match");
547 
548  int indegree = CommDataTypeTraits<T>::GetCount(sources);
549 
551  indegree, (const int *)CommDataTypeTraits<T>::GetPointer(sources),
552  (const int *)CommDataTypeTraits<T>::GetPointer(sourceweights), reorder);
553 }
virtual void v_DistGraphCreateAdjacent(int indegree, const int sources[], const int sourceweights[], int reorder)=0

References ASSERTL0, Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), and v_DistGraphCreateAdjacent().

◆ Exscan()

template<class T >
void Nektar::LibUtilities::Comm::Exscan ( T &  pData,
enum ReduceOperator  pOp,
T &  ans 
)

Definition at line 473 of file Comm.h.

474 {
477  "Input and output array sizes don't match");
482 }
virtual void v_Exscan(Array< OneD, unsigned long long > &pData, enum ReduceOperator pOp, Array< OneD, unsigned long long > &ans)=0

References ASSERTL0, and v_Exscan().

◆ Finalise()

void Nektar::LibUtilities::Comm::Finalise ( )
inline

Definition at line 271 of file Comm.h.

272 {
273  v_Finalise();
274 }
virtual void v_Finalise()=0

References v_Finalise().

◆ Gather()

template<class T >
T Nektar::LibUtilities::Comm::Gather ( int  rootProc,
T &  val 
)

Concatenate all the input arrays, in rank order, onto the process with rank == rootProc

Definition at line 488 of file Comm.h.

489 {
490  static_assert(CommDataTypeTraits<T>::IsVector,
491  "Gather only valid with Array or vector arguments.");
492  bool amRoot = (GetRank() == rootProc);
493  unsigned nEl = CommDataTypeTraits<T>::GetCount(val);
494 
495  unsigned nOut = amRoot ? GetSize() * nEl : 0;
496  T ans(nOut);
497  void *recvbuf = amRoot ? CommDataTypeTraits<T>::GetPointer(ans) : NULL;
498 
500  CommDataTypeTraits<T>::GetDataType(), recvbuf, nEl,
502  return ans;
503 }
virtual void v_Gather(void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0

References Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), Nektar::LibUtilities::CommDataTypeTraits< T >::GetPointer(), GetRank(), GetSize(), and v_Gather().

◆ GetColumnComm()

CommSharedPtr Nektar::LibUtilities::Comm::GetColumnComm ( )
inline

Retrieve the column communicator to which this process belongs.

Definition at line 750 of file Comm.h.

751 {
752  if (!m_commColumn.get())
753  {
754  return shared_from_this();
755  }
756  else
757  {
758  return m_commColumn;
759  }
760 }
CommSharedPtr m_commColumn
Column communicator.
Definition: Comm.h:184

References m_commColumn.

◆ GetRank()

int Nektar::LibUtilities::Comm::GetRank ( )
inline

Definition at line 287 of file Comm.h.

288 {
289  return v_GetRank();
290 }
virtual int v_GetRank()=0

References v_GetRank().

Referenced by export_Comm(), Gather(), and Scatter().

◆ GetRowComm()

CommSharedPtr Nektar::LibUtilities::Comm::GetRowComm ( )
inline

Retrieve the row communicator to which this process belongs.

Definition at line 734 of file Comm.h.

735 {
736  if (!m_commRow.get())
737  {
738  return shared_from_this();
739  }
740  else
741  {
742  return m_commRow;
743  }
744 }
CommSharedPtr m_commRow
Row communicator.
Definition: Comm.h:183

References m_commRow.

◆ GetSize()

int Nektar::LibUtilities::Comm::GetSize ( ) const
inline

Returns number of processes.

Definition at line 279 of file Comm.h.

280 {
281  return m_size;
282 }
int m_size
Number of processes.
Definition: Comm.h:181

References m_size.

Referenced by AllGather(), AlltoAll(), export_Comm(), Gather(), Scatter(), and Nektar::LibUtilities::CommMpi::v_AllReduce().

◆ GetSpaceComm()

CommSharedPtr Nektar::LibUtilities::Comm::GetSpaceComm ( )
inline

Retrieve the space communicator to which this process belongs.

Definition at line 782 of file Comm.h.

783 {
784  if (!m_commSpace.get())
785  {
786  return shared_from_this();
787  }
788  else
789  {
790  return m_commSpace;
791  }
792 }
CommSharedPtr m_commSpace
Definition: Comm.h:186

References m_commSpace.

◆ GetTimeComm()

CommSharedPtr Nektar::LibUtilities::Comm::GetTimeComm ( )
inline

Retrieve the time communicator to which this process belongs.

Definition at line 766 of file Comm.h.

767 {
768  if (!m_commTime.get())
769  {
770  return shared_from_this();
771  }
772  else
773  {
774  return m_commTime;
775  }
776 }
CommSharedPtr m_commTime
Definition: Comm.h:185

References m_commTime.

◆ GetType()

const std::string & Nektar::LibUtilities::Comm::GetType ( ) const
inline

Definition at line 295 of file Comm.h.

296 {
297  return m_type;
298 }
std::string m_type
Type of communication.
Definition: Comm.h:182

References m_type.

Referenced by export_Comm().

◆ GetVersion()

std::tuple< int, int, int > Nektar::LibUtilities::Comm::GetVersion ( )
inline
Returns
tuple of {major, minor, patch} version numbers

Definition at line 807 of file Comm.h.

808 {
809  return v_GetVersion();
810 }
virtual std::tuple< int, int, int > v_GetVersion()=0

References v_GetVersion().

◆ Irecv()

template<class T >
void Nektar::LibUtilities::Comm::Irecv ( int  pProc,
T &  pData,
int  count,
const CommRequestSharedPtr request,
int  loc 
)

Begins a nonblocking receive

Parameters
pProcRank of source
pDataArray/vector to place incoming data in to
countNumber of elements to receive in to pData
requestCommunication request object
locLocation in request to use

Definition at line 657 of file Comm.h.

659 {
661  CommDataTypeTraits<T>::GetDataType(), pProc, request, loc);
662 }
virtual void v_Irecv(void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0

References CG_Iterations::loc, and v_Irecv().

◆ Irsend()

template<class T >
void Nektar::LibUtilities::Comm::Irsend ( int  pProc,
T &  pData,
int  count,
const CommRequestSharedPtr request,
int  loc 
)

Starts a ready-mode nonblocking send

Parameters
pProcRank of destination
pDataArray/vector to send
countNumber of elements to send in pData
requestCommunication request object
locLocation in request to use

Definition at line 606 of file Comm.h.

608 {
610  CommDataTypeTraits<T>::GetDataType(), pProc, request, loc);
611 }
virtual void v_Irsend(void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0

References CG_Iterations::loc, and v_Irsend().

◆ Isend()

template<class T >
void Nektar::LibUtilities::Comm::Isend ( int  pProc,
T &  pData,
int  count,
const CommRequestSharedPtr request,
int  loc 
)

Starts a nonblocking send

Parameters
pProcRank of destination
pDataArray/vector to send
countNumber of elements to send in pData
requestCommunication request object
locLocation in request to use

Definition at line 623 of file Comm.h.

625 {
627  CommDataTypeTraits<T>::GetDataType(), pProc, request, loc);
628 }
virtual void v_Isend(void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0

References CG_Iterations::loc, and v_Isend().

◆ IsSerial()

bool Nektar::LibUtilities::Comm::IsSerial ( )
inline

Definition at line 799 of file Comm.h.

800 {
801  return v_IsSerial();
802 }
virtual bool v_IsSerial()=0

References v_IsSerial().

◆ NeighborAlltoAllv()

template<class T1 , class T2 >
void Nektar::LibUtilities::Comm::NeighborAlltoAllv ( T1 &  pSendData,
T2 &  pSendDataSizeMap,
T2 &  pSendDataOffsetMap,
T1 &  pRecvData,
T2 &  pRecvDataSizeMap,
T2 &  pRecvDataOffsetMap 
)

Sends data to neighboring processes in a virtual topology communicator. All processes send different amounts of data to, and receive different amounts of data from, all neighbors

Parameters
pSendDataArray/vector to send to neighbors
pSendDataSizeMapArray/vector where entry i specifies the number of elements to send to neighbor i
pSendDataOffsetMapArray/vector where entry i specifies the displacement (offset from pSendData) from which to send data to neighbor i
pRecvDataArray/vector to place incoming data in to
pRecvDataSizeMapArray/vector where entry i specifies the number of elements to receive from neighbor i
pRecvDataOffsetMapArray/vector where entry i specifies the displacement (offset from pRecvData) from which to receive data from neighbor i

Definition at line 574 of file Comm.h.

577 {
578  static_assert(
580  "NeighbourAlltoAllv only valid with Array or vector arguments.");
581  static_assert(
582  std::is_same<T2, std::vector<int>>::value ||
583  std::is_same<T2, Array<OneD, int>>::value,
584  "NeighborAllToAllv size and offset maps should be integer vectors.");
587  (int *)CommDataTypeTraits<T2>::GetPointer(pSendDataSizeMap),
588  (int *)CommDataTypeTraits<T2>::GetPointer(pSendDataOffsetMap),
591  (int *)CommDataTypeTraits<T2>::GetPointer(pRecvDataSizeMap),
592  (int *)CommDataTypeTraits<T2>::GetPointer(pRecvDataOffsetMap),
594 }
virtual void v_NeighborAlltoAllv(void *sendbuf, int sendcounts[], int sdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0

References v_NeighborAlltoAllv().

◆ Recv()

template<class T >
void Nektar::LibUtilities::Comm::Recv ( int  pProc,
T &  pData 
)

Definition at line 323 of file Comm.h.

324 {
328 }
virtual void v_Recv(void *buf, int count, CommDataType dt, int source)=0

References v_Recv().

◆ RecvInit()

template<class T >
void Nektar::LibUtilities::Comm::RecvInit ( int  pProc,
T &  pData,
int  count,
const CommRequestSharedPtr request,
int  loc 
)

Create a persistent request for a receive

Parameters
pProcRank of source
pDataArray/vector to place incoming data in to
countNumber of elements to receive in to pData
requestCommunication request object
locLocation in request to use

Definition at line 674 of file Comm.h.

676 {
678  CommDataTypeTraits<T>::GetDataType(), pProc, request, loc);
679 }
virtual void v_RecvInit(void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0

References CG_Iterations::loc, and v_RecvInit().

◆ RemoveExistingFiles()

bool Nektar::LibUtilities::Comm::RemoveExistingFiles ( )
inline

Definition at line 812 of file Comm.h.

813 {
814  return v_RemoveExistingFiles();
815 }

References v_RemoveExistingFiles().

◆ Scatter()

template<class T >
T Nektar::LibUtilities::Comm::Scatter ( int  rootProc,
T &  pData 
)

Scatter pData across ranks in chunks of len(pData)/num_ranks

Definition at line 507 of file Comm.h.

508 {
509  static_assert(CommDataTypeTraits<T>::IsVector,
510  "Scatter only valid with Array or vector arguments.");
511 
512  bool amRoot = (GetRank() == rootProc);
513  unsigned nEl = CommDataTypeTraits<T>::GetCount(pData) / GetSize();
514 
515  void *sendbuf = amRoot ? CommDataTypeTraits<T>::GetPointer(pData) : NULL;
516  T ans(nEl);
517 
521  return ans;
522 }
virtual void v_Scatter(void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0

References Nektar::LibUtilities::CommDataTypeTraits< T >::GetCount(), Nektar::LibUtilities::CommDataTypeTraits< T >::GetPointer(), GetRank(), GetSize(), and v_Scatter().

◆ Send()

template<class T >
void Nektar::LibUtilities::Comm::Send ( int  pProc,
T &  pData 
)

Definition at line 316 of file Comm.h.

317 {
321 }
virtual void v_Send(void *buf, int count, CommDataType dt, int dest)=0

References v_Send().

◆ SendInit()

template<class T >
void Nektar::LibUtilities::Comm::SendInit ( int  pProc,
T &  pData,
int  count,
const CommRequestSharedPtr request,
int  loc 
)

Creates a persistent request for a send

Parameters
pProcRank of destination
pDataArray/vector to send
countNumber of elements to send in pData
requestCommunication request object
locLocation in request to use

Definition at line 640 of file Comm.h.

642 {
644  CommDataTypeTraits<T>::GetDataType(), pProc, request, loc);
645 }
virtual void v_SendInit(void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0

References CG_Iterations::loc, and v_SendInit().

◆ SendRecv()

template<class T >
void Nektar::LibUtilities::Comm::SendRecv ( int  pSendProc,
T &  pSendData,
int  pRecvProc,
T &  pRecvData 
)

Definition at line 334 of file Comm.h.

335 {
342 }
virtual void v_SendRecv(void *sendbuf, int sendcount, CommDataType sendtype, int dest, void *recvbuf, int recvcount, CommDataType recvtype, int source)=0

References v_SendRecv().

◆ SendRecvReplace()

template<class T >
void Nektar::LibUtilities::Comm::SendRecvReplace ( int  pSendProc,
int  pRecvProc,
T &  pData 
)

Definition at line 348 of file Comm.h.

349 {
353  pRecvProc);
354 }
virtual void v_SendRecvReplace(void *buf, int count, CommDataType dt, int pSendProc, int pRecvProc)=0

References v_SendRecvReplace().

◆ SplitComm()

void Nektar::LibUtilities::Comm::SplitComm ( int  pRows,
int  pColumns,
int  pTime = 1 
)
inline

Splits this communicator into a grid of size pRows*pColumns and creates row and column communicators. By default the communicator is a single row.

Definition at line 726 of file Comm.h.

727 {
728  v_SplitComm(pRows, pColumns, pTime);
729 }
virtual void v_SplitComm(int pRows, int pColumns, int pTime)=0

References v_SplitComm().

◆ SplitCommNode()

std::pair< CommSharedPtr, CommSharedPtr > Nektar::LibUtilities::Comm::SplitCommNode ( )
inline

Definition at line 817 of file Comm.h.

818 {
819  return v_SplitCommNode();
820 }
virtual std::pair< CommSharedPtr, CommSharedPtr > v_SplitCommNode()

References v_SplitCommNode().

◆ StartAll()

void Nektar::LibUtilities::Comm::StartAll ( const CommRequestSharedPtr request)
inline

Starts a collection of persistent requests

Parameters
requestCommunication request object

Definition at line 686 of file Comm.h.

687 {
688  v_StartAll(request);
689 }
virtual void v_StartAll(CommRequestSharedPtr request)=0

References v_StartAll().

◆ TreatAsRankZero()

bool Nektar::LibUtilities::Comm::TreatAsRankZero ( )
inline

Definition at line 794 of file Comm.h.

795 {
796  return v_TreatAsRankZero();
797 }
virtual bool v_TreatAsRankZero()=0

References v_TreatAsRankZero().

◆ v_AllGather()

virtual void Nektar::LibUtilities::Comm::v_AllGather ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype 
)
protectedpure virtual

◆ v_AllGatherv() [1/2]

virtual void Nektar::LibUtilities::Comm::v_AllGatherv ( void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
protectedpure virtual

◆ v_AllGatherv() [2/2]

virtual void Nektar::LibUtilities::Comm::v_AllGatherv ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
protectedpure virtual

◆ v_AllReduce()

virtual void Nektar::LibUtilities::Comm::v_AllReduce ( void buf,
int  count,
CommDataType  dt,
enum ReduceOperator  pOp 
)
protectedpure virtual

◆ v_AlltoAll()

virtual void Nektar::LibUtilities::Comm::v_AlltoAll ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype 
)
protectedpure virtual

◆ v_AlltoAllv()

virtual void Nektar::LibUtilities::Comm::v_AlltoAllv ( void sendbuf,
int  sendcounts[],
int  sensdispls[],
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
protectedpure virtual

◆ v_Bcast()

virtual void Nektar::LibUtilities::Comm::v_Bcast ( void buffer,
int  count,
CommDataType  dt,
int  root 
)
protectedpure virtual

◆ v_Block()

virtual void Nektar::LibUtilities::Comm::v_Block ( )
protectedpure virtual

◆ v_CommCreateIf()

virtual CommSharedPtr Nektar::LibUtilities::Comm::v_CommCreateIf ( int  flag)
protectedpure virtual

◆ v_CreateRequest()

virtual CommRequestSharedPtr Nektar::LibUtilities::Comm::v_CreateRequest ( int  num)
protectedpure virtual

◆ v_DistGraphCreateAdjacent()

virtual void Nektar::LibUtilities::Comm::v_DistGraphCreateAdjacent ( int  indegree,
const int  sources[],
const int  sourceweights[],
int  reorder 
)
protectedpure virtual

◆ v_Exscan()

virtual void Nektar::LibUtilities::Comm::v_Exscan ( Array< OneD, unsigned long long > &  pData,
enum ReduceOperator  pOp,
Array< OneD, unsigned long long > &  ans 
)
protectedpure virtual

◆ v_Finalise()

virtual void Nektar::LibUtilities::Comm::v_Finalise ( )
protectedpure virtual

◆ v_Gather()

virtual void Nektar::LibUtilities::Comm::v_Gather ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  root 
)
protectedpure virtual

◆ v_GetRank()

virtual int Nektar::LibUtilities::Comm::v_GetRank ( )
protectedpure virtual

◆ v_GetVersion()

virtual std::tuple<int, int, int> Nektar::LibUtilities::Comm::v_GetVersion ( )
protectedpure virtual

◆ v_Irecv()

virtual void Nektar::LibUtilities::Comm::v_Irecv ( void buf,
int  count,
CommDataType  dt,
int  source,
CommRequestSharedPtr  request,
int  loc 
)
protectedpure virtual

◆ v_Irsend()

virtual void Nektar::LibUtilities::Comm::v_Irsend ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
protectedpure virtual

◆ v_Isend()

virtual void Nektar::LibUtilities::Comm::v_Isend ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
protectedpure virtual

◆ v_IsSerial()

virtual bool Nektar::LibUtilities::Comm::v_IsSerial ( )
protectedpure virtual

◆ v_NeighborAlltoAllv()

virtual void Nektar::LibUtilities::Comm::v_NeighborAlltoAllv ( void sendbuf,
int  sendcounts[],
int  sdispls[],
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
protectedpure virtual

◆ v_Recv()

virtual void Nektar::LibUtilities::Comm::v_Recv ( void buf,
int  count,
CommDataType  dt,
int  source 
)
protectedpure virtual

◆ v_RecvInit()

virtual void Nektar::LibUtilities::Comm::v_RecvInit ( void buf,
int  count,
CommDataType  dt,
int  source,
CommRequestSharedPtr  request,
int  loc 
)
protectedpure virtual

◆ v_RemoveExistingFiles()

bool Nektar::LibUtilities::Comm::v_RemoveExistingFiles ( void  )
protectedvirtual

Reimplemented in Nektar::FieldUtils::FieldConvertComm.

Definition at line 57 of file Communication/Comm.cpp.

58 {
59  return true;
60 }

Referenced by RemoveExistingFiles().

◆ v_Scatter()

virtual void Nektar::LibUtilities::Comm::v_Scatter ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  root 
)
protectedpure virtual

◆ v_Send()

virtual void Nektar::LibUtilities::Comm::v_Send ( void buf,
int  count,
CommDataType  dt,
int  dest 
)
protectedpure virtual

◆ v_SendInit()

virtual void Nektar::LibUtilities::Comm::v_SendInit ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
protectedpure virtual

◆ v_SendRecv()

virtual void Nektar::LibUtilities::Comm::v_SendRecv ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
int  dest,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  source 
)
protectedpure virtual

◆ v_SendRecvReplace()

virtual void Nektar::LibUtilities::Comm::v_SendRecvReplace ( void buf,
int  count,
CommDataType  dt,
int  pSendProc,
int  pRecvProc 
)
protectedpure virtual

◆ v_SplitComm()

virtual void Nektar::LibUtilities::Comm::v_SplitComm ( int  pRows,
int  pColumns,
int  pTime 
)
protectedpure virtual

◆ v_SplitCommNode()

std::pair< CommSharedPtr, CommSharedPtr > Nektar::LibUtilities::Comm::v_SplitCommNode ( )
protectedvirtual

Reimplemented in Nektar::LibUtilities::CommMpi.

Definition at line 62 of file Communication/Comm.cpp.

63 {
64  return std::make_pair(CommSharedPtr(), CommSharedPtr());
65 }
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:54

Referenced by SplitCommNode().

◆ v_StartAll()

virtual void Nektar::LibUtilities::Comm::v_StartAll ( CommRequestSharedPtr  request)
protectedpure virtual

◆ v_TreatAsRankZero()

virtual bool Nektar::LibUtilities::Comm::v_TreatAsRankZero ( )
protectedpure virtual

◆ v_WaitAll()

virtual void Nektar::LibUtilities::Comm::v_WaitAll ( CommRequestSharedPtr  request)
protectedpure virtual

◆ v_Wtime()

virtual NekDouble Nektar::LibUtilities::Comm::v_Wtime ( )
protectedpure virtual

◆ WaitAll()

void Nektar::LibUtilities::Comm::WaitAll ( const CommRequestSharedPtr request)
inline

Waits for all CommRequests in the request object to complete.

Parameters
requestCommunication request object

Definition at line 696 of file Comm.h.

697 {
698  v_WaitAll(request);
699 }
virtual void v_WaitAll(CommRequestSharedPtr request)=0

References v_WaitAll().

◆ Wtime()

double Nektar::LibUtilities::Comm::Wtime ( )
inline

Return the time in seconds.

Definition at line 311 of file Comm.h.

312 {
313  return v_Wtime();
314 }
virtual NekDouble v_Wtime()=0

References v_Wtime().

Member Data Documentation

◆ m_commColumn

CommSharedPtr Nektar::LibUtilities::Comm::m_commColumn
protected

◆ m_commRow

CommSharedPtr Nektar::LibUtilities::Comm::m_commRow
protected

◆ m_commSpace

CommSharedPtr Nektar::LibUtilities::Comm::m_commSpace
protected

Definition at line 186 of file Comm.h.

Referenced by GetSpaceComm(), and Nektar::LibUtilities::CommMpi::v_SplitComm().

◆ m_commTime

CommSharedPtr Nektar::LibUtilities::Comm::m_commTime
protected

Definition at line 185 of file Comm.h.

Referenced by GetTimeComm(), and Nektar::LibUtilities::CommMpi::v_SplitComm().

◆ m_size

int Nektar::LibUtilities::Comm::m_size
protected

◆ m_type

std::string Nektar::LibUtilities::Comm::m_type
protected