~ubuntu-branches/ubuntu/saucy/rheolef/saucy

« back to all changes in this revision

Viewing changes to skit/plib/msg_assembly_begin.h

  • Committer: Bazaar Package Importer
  • Author(s): Pierre Saramito
  • Date: 2011-02-08 10:00:06 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20110208100006-jg8rarizvhdm8e82
Tags: 5.92-1
* New upstream release:
  - "rheolef" suffix added to all unix manuals (Closes: #607117)
  - minor source code fixes for g++-4.5 (Closes: #607184)
  - minor reference manual fix (Closes: #607038)
* debian/control: libboost-iostreams-dev dependency added, as required
  by the new upstream version.
 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#ifndef _RHEO_MSG_ASSEMBLY_BEGIN_H
2
 
#define _RHEO_MSG_ASSEMBLY_BEGIN_H
3
 
 
4
 
/*F:
5
 
NAME: msg_assembly_begin -- for array or matrix (@PACKAGE@ @VERSION@)
6
 
DESCRIPTION:
7
 
  Start a dense array or a sparse matrix assembly.
8
 
COMPLEXITY:
9
 
  **TODO**.
10
 
NOTE:
11
 
  inspirated from petsc/src/vec/vec/impls/mpi/pdvec.c
12
 
METHODS: @msg_assembly_begin 
13
 
AUTHORS:
14
 
    LMC-IMAG, 38041 Grenoble cedex 9, France
15
 
    | Pierre.Saramito@imag.fr
16
 
DATE:   23 march 1999
17
 
END:
18
 
*/
19
 
 
20
 
 
21
 
#ifndef RHEO_MPI_PRUDENCE
22
 
#define RHEO_MPI_PRUDENCE 1
23
 
#endif
24
 
 
25
 
#include "msg_util.h"
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"
33
 
 
34
 
//<msg_assembly_begin:
35
 
template <
36
 
    class Stash,
37
 
    class Message,
38
 
    class InputIterator>
39
 
typename Stash::size_type
40
 
msg_assembly_begin (
41
 
    const exchangor&                   exchange,
42
 
    const distributor&                 ownership,
43
 
    InputIterator                      idx,
44
 
    InputIterator                      last_idx,
45
 
    Message&                           receive,
46
 
    Message&                           send,
47
 
    Stash&                             stash)
48
 
{
49
 
warning_macro ("assembly_begin[0]");
50
 
    typedef typename Stash::size_type Size;
51
 
    
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));
56
 
 
57
 
    dummy_iterator<Size> owner;
58
 
    Size send_nproc = msg_sorted_send_size (
59
 
        ownership.begin(),
60
 
        ownership.end(),
61
 
        idx,
62
 
        last_idx,
63
 
        msg_size.begin(),
64
 
        msg_mark.begin(),
65
 
        owner);
66
 
 
67
 
    Size n_local = msg_size [parallel::process()];
68
 
    if (n_local != 0) {
69
 
        msg_size [parallel::process()] = 0;
70
 
        msg_mark [parallel::process()] = 0;
71
 
        send_nproc--;
72
 
    }
73
 
 
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(),
78
 
        parallel::process(),
79
 
        exchange.comm(),
80
 
        get_pointer_from_iterator(work.begin()));
81
 
 
82
 
    Size receive_nproc = msg_receive_nproc (
83
 
        get_pointer_from_iterator(msg_mark.begin()),
84
 
        parallel::n_process(),
85
 
        parallel::process(),
86
 
        exchange.comm(),
87
 
        get_pointer_from_iterator(work.begin()));
88
 
 
89
 
    receive.waits.resize(receive_nproc+RHEO_MPI_PRUDENCE);
90
 
    receive.data.resize((receive_nproc+RHEO_MPI_PRUDENCE)*(receive_max_size+RHEO_MPI_PRUDENCE));
91
 
    msg_post_receive (
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()),
95
 
        receive_max_size,
96
 
        exchange.comm(), 
97
 
        exchange.tag());
98
 
 
99
 
    std::vector<Size> ptr(parallel::n_process() + 1);
100
 
    msg_length_to_pointer (
101
 
        msg_size.begin(),
102
 
        msg_size.end(),
103
 
        ptr.begin());
104
 
 
105
 
    send.data.resize(stash.size()+RHEO_MPI_PRUDENCE);
106
 
    msg_pair_copy (stash.begin(), stash.end(), send.data.begin());
107
 
 
108
 
    msg_length_to_pointer (
109
 
        msg_size.begin(),
110
 
        msg_size.end(),
111
 
        ptr.begin());
112
 
 
113
 
    send.waits.resize(send_nproc+RHEO_MPI_PRUDENCE);
114
 
    msg_do_send (
115
 
        get_pointer_from_iterator(ptr.begin()),
116
 
        get_pointer_from_iterator(ptr.begin()) + ptr.size(),
117
 
        get_pointer_from_iterator(send.data.begin()),
118
 
        exchange.comm(), 
119
 
        exchange.tag(),
120
 
        get_pointer_from_iterator(send.waits.begin()));
121
 
    
122
 
    // reset cache space
123
 
    // stash.clear();
124
 
 
125
 
warning_macro ("assembly_begin[F]");
126
 
    return receive_max_size;
127
 
}
128
 
//>msg_assembly_begin:
129
 
#endif //_RHEO_MSG_ASSEMBLY_BEGIN_H