1#ifndef DUNE_GRID_SPGRID_MESSAGEBUFFER_HH
2#define DUNE_GRID_SPGRID_MESSAGEBUFFER_HH
12#include <dune/common/parallel/communication.hh>
13#include <dune/common/parallel/mpicommunication.hh>
54 std::memcpy(
static_cast< char *
>(
buffer_ ) +
position_, &value,
sizeof( T ) );
69 void *buffer = std::realloc(
buffer_, capacity );
73 buffer = std::realloc(
buffer_, capacity );
75 DUNE_THROW( OutOfMemoryError,
"Cannot allocate sufficiently large buffer." );
90 template<
class CollectiveCommunication >
103 void send (
int rank,
int tag ) {}
118 void send (
int rank,
int tag )
120 MPI_Isend( buffer_, position_, MPI_PACKED, rank, tag, comm_, &request_ );
123 void wait () { MPI_Wait( &request_, MPI_STATUS_IGNORE ); }
170 std::memcpy(
static_cast< void *
>( &value ),
static_cast< char *
>(
buffer_ ) +
position_,
sizeof( T ) );
174 DUNE_THROW( IOError,
"Cannot read beyond the buffer's end." );
190 DUNE_THROW( OutOfMemoryError,
"Cannot allocate sufficiently large buffer." );
203 template<
class CollectiveCommunication >
216 void receive (
int rank,
int rag, std::size_t size )
218 DUNE_THROW( IOError,
"Nothing to receive in a serial communication." );
224 int rank ()
const {
return 0 ; }
228 friend inline typename std::vector< This >::iterator
waitAny ( std::vector< This > &readBuffers )
230 return readBuffers.end();
245 void receive (
int rank,
int tag, std::size_t size )
249 MPI_Irecv( buffer_, size_, MPI_BYTE, rank, tag, comm_, &request_ );
255 MPI_Probe( rank, tag, comm_, &status );
257 MPI_Get_count( &status, MPI_BYTE, &count );
258 receive( status.MPI_SOURCE, tag, count );
263 int rank ()
const {
return rank_; }
265 void wait () { MPI_Wait( &request_, MPI_STATUS_IGNORE ); }
267 friend inline typename std::vector< This >::iterator
waitAny ( std::vector< This > &readBuffers )
269 const std::size_t numBuffers = readBuffers.size();
270 std::vector< MPI_Request > requests( numBuffers );
271 for( std::size_t i = 0; i < numBuffers; ++i )
272 requests[ i ] = readBuffers[ i ].request_;
274 int index = MPI_UNDEFINED;
275 MPI_Waitany( numBuffers, requests.data(), &index, MPI_STATUS_IGNORE );
276 if( index == MPI_UNDEFINED )
277 return readBuffers.end();
279 readBuffers[ index ].request_ = requests[ index ];
280 return readBuffers.begin() + index;
Dune::SPMultiIndex< dim > max(const Dune::SPMultiIndex< dim > &a, const Dune::SPMultiIndex< dim > &b)
Definition: multiindex.hh:307
Definition: iostream.hh:7
Definition: messagebuffer.hh:22
void reserve(std::size_t size)
Definition: messagebuffer.hh:63
This & operator=(const This &)=delete
void initialize()
Definition: messagebuffer.hh:61
void * buffer_
Definition: messagebuffer.hh:81
SPBasicPackedMessageWriteBuffer(This &&other)
Definition: messagebuffer.hh:30
std::size_t capacity_
Definition: messagebuffer.hh:82
std::size_t position() const
Definition: messagebuffer.hh:58
SPBasicPackedMessageWriteBuffer(const This &)=delete
SPBasicPackedMessageWriteBuffer()
Definition: messagebuffer.hh:26
std::size_t position_
Definition: messagebuffer.hh:82
void write(const T &value)
Definition: messagebuffer.hh:51
~SPBasicPackedMessageWriteBuffer()
Definition: messagebuffer.hh:37
Definition: messagebuffer.hh:91
Definition: messagebuffer.hh:96
SPPackedMessageWriteBuffer(const CollectiveCommunication< C > &comm)
Definition: messagebuffer.hh:101
void wait()
Definition: messagebuffer.hh:104
void send(int rank, int tag)
Definition: messagebuffer.hh:103
Definition: messagebuffer.hh:111
void send(int rank, int tag)
Definition: messagebuffer.hh:118
SPPackedMessageWriteBuffer(const CollectiveCommunication< MPI_Comm > &comm)
Definition: messagebuffer.hh:116
MPI_Comm comm_
Definition: messagebuffer.hh:126
MPI_Request request_
Definition: messagebuffer.hh:127
void wait()
Definition: messagebuffer.hh:123
Definition: messagebuffer.hh:137
void reset(std::size_t size)
Definition: messagebuffer.hh:182
SPBasicPackedMessageReadBuffer(const This &)=delete
This & operator=(const This &)=delete
std::size_t size_
Definition: messagebuffer.hh:195
void * buffer_
Definition: messagebuffer.hh:194
std::size_t position_
Definition: messagebuffer.hh:195
SPBasicPackedMessageReadBuffer()
Definition: messagebuffer.hh:141
std::size_t position() const
Definition: messagebuffer.hh:177
void initialize()
Definition: messagebuffer.hh:180
~SPBasicPackedMessageReadBuffer()
Definition: messagebuffer.hh:152
SPBasicPackedMessageReadBuffer(This &&other)
Definition: messagebuffer.hh:145
void read(T &value)
Definition: messagebuffer.hh:166
Definition: messagebuffer.hh:204
Definition: messagebuffer.hh:209
int rank() const
Definition: messagebuffer.hh:224
void wait()
Definition: messagebuffer.hh:226
void receive(int rank, int rag, std::size_t size)
Definition: messagebuffer.hh:216
SPPackedMessageReadBuffer(const CollectiveCommunication< C > &comm)
Definition: messagebuffer.hh:214
void receive(int tag)
Definition: messagebuffer.hh:222
friend std::vector< This >::iterator waitAny(std::vector< This > &readBuffers)
Definition: messagebuffer.hh:228
void receive(int rank, int tag)
Definition: messagebuffer.hh:221
Definition: messagebuffer.hh:238
int rank_
Definition: messagebuffer.hh:284
MPI_Comm comm_
Definition: messagebuffer.hh:285
SPPackedMessageReadBuffer(const CollectiveCommunication< MPI_Comm > &comm)
Definition: messagebuffer.hh:243
int rank() const
Definition: messagebuffer.hh:263
MPI_Request request_
Definition: messagebuffer.hh:286
void receive(int tag)
Definition: messagebuffer.hh:261
friend std::vector< This >::iterator waitAny(std::vector< This > &readBuffers)
Definition: messagebuffer.hh:267
void receive(int rank, int tag)
Definition: messagebuffer.hh:252
void receive(int rank, int tag, std::size_t size)
Definition: messagebuffer.hh:245
void wait()
Definition: messagebuffer.hh:265