1
#ifndef _RHEO_MSG_ASSEMBLY_BEGIN_H
2
#define _RHEO_MSG_ASSEMBLY_BEGIN_H
5
NAME: msg_assembly_begin -- for array or matrix (@PACKAGE@ @VERSION@)
7
Start a dense array or a sparse matrix assembly.
11
inspirated from petsc/src/vec/vec/impls/mpi/pdvec.c
12
METHODS: @msg_assembly_begin
14
LMC-IMAG, 38041 Grenoble cedex 9, France
15
| Pierre.Saramito@imag.fr
21
#ifndef RHEO_MPI_PRUDENCE
22
#define RHEO_MPI_PRUDENCE 1
26
#include "msg_sorted_send_size.h"
27
#include "msg_receive_max_size.h"
28
#include "msg_receive_nproc.h"
29
#include "msg_post_receive.h"
30
#include "msg_length_to_pointer.h"
31
#include "msg_do_send.h"
32
#include "get_pointer_from_iterator.h"
34
//<msg_assembly_begin:
39
typename Stash::size_type
41
const exchangor& exchange,
42
const distributor& ownership,
44
InputIterator last_idx,
49
warning_macro ("assembly_begin[0]");
50
typedef typename Stash::size_type Size;
52
std::vector<Size> msg_size(parallel::n_process());
53
std::vector<Size> msg_mark(parallel::n_process());
54
std::fill (msg_size.begin(), msg_size.end(), Size(0));
55
std::fill (msg_mark.begin(), msg_mark.end(), Size(0));
57
dummy_iterator<Size> owner;
58
Size send_nproc = msg_sorted_send_size (
67
Size n_local = msg_size [parallel::process()];
69
msg_size [parallel::process()] = 0;
70
msg_mark [parallel::process()] = 0;
74
std::vector<Size> work(parallel::n_process()+RHEO_MPI_PRUDENCE);
75
Size receive_max_size = msg_receive_max_size (
76
get_pointer_from_iterator(msg_size.begin()),
77
parallel::n_process(),
80
get_pointer_from_iterator(work.begin()));
82
Size receive_nproc = msg_receive_nproc (
83
get_pointer_from_iterator(msg_mark.begin()),
84
parallel::n_process(),
87
get_pointer_from_iterator(work.begin()));
89
receive.waits.resize(receive_nproc+RHEO_MPI_PRUDENCE);
90
receive.data.resize((receive_nproc+RHEO_MPI_PRUDENCE)*(receive_max_size+RHEO_MPI_PRUDENCE));
92
get_pointer_from_iterator(receive.waits.begin()),
93
get_pointer_from_iterator(receive.waits.begin()) + receive_nproc,
94
get_pointer_from_iterator(receive.data.begin()),
99
std::vector<Size> ptr(parallel::n_process() + 1);
100
msg_length_to_pointer (
105
send.data.resize(stash.size()+RHEO_MPI_PRUDENCE);
106
msg_pair_copy (stash.begin(), stash.end(), send.data.begin());
108
msg_length_to_pointer (
113
send.waits.resize(send_nproc+RHEO_MPI_PRUDENCE);
115
get_pointer_from_iterator(ptr.begin()),
116
get_pointer_from_iterator(ptr.begin()) + ptr.size(),
117
get_pointer_from_iterator(send.data.begin()),
120
get_pointer_from_iterator(send.waits.begin()));
125
warning_macro ("assembly_begin[F]");
126
return receive_max_size;
128
//>msg_assembly_begin:
129
#endif //_RHEO_MSG_ASSEMBLY_BEGIN_H