Epetra Package Browser (Single Doxygen Collection)  Development
Epetra_MpiDistributor.h
Go to the documentation of this file.
1 /*
2 //@HEADER
3 // ************************************************************************
4 //
5 // Epetra: Linear Algebra Services Package
6 // Copyright 2011 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39 //
40 // ************************************************************************
41 //@HEADER
42 */
43 
44 #ifndef EPETRA_MPIDISTRIBUTOR_H
45 #define EPETRA_MPIDISTRIBUTOR_H
46 #include "Epetra_Object.h"
47 #include "Epetra_Distributor.h"
48 class Epetra_MpiComm;
49 #include <mpi.h>
50 
60 
61  public:
62 
64 
65 
68 
70  Epetra_MpiDistributor(const Epetra_MpiDistributor & Distributor);
71 
73  Epetra_Distributor * Clone(){return(dynamic_cast<Epetra_Distributor *>(new Epetra_MpiDistributor(*this)));};
74 
76 
80 
82  virtual ~Epetra_MpiDistributor();
84 
85 
87 
88 
104  int CreateFromSends( const int & NumExportIDs,
105  const int * ExportPIDs,
106  bool Deterministic,
107  int & NumRemoteIDs );
108 
133  int CreateFromRecvs( const int & NumRemoteIDs,
134  const int * RemoteGIDs,
135  const int * RemotePIDs,
136  bool Deterministic,
137  int & NumExportIDs,
138  int *& ExportGIDs,
139  int *& ExportPIDs);
140 
141 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
142  int CreateFromRecvs( const int & NumRemoteIDs,
143  const long long * RemoteGIDs,
144  const int * RemotePIDs,
145  bool Deterministic,
146  int & NumExportIDs,
147  long long *& ExportGIDs,
148  int *& ExportPIDs);
149 #endif
150 
151 
152 
153 
156 
179 
180  int CreateFromSendsAndRecvs( const int & NumExportIDs,
181  const int * ExportPIDs,
182  const int & NumRemoteIDs,
183  const int * RemoteGIDs,
184  const int * RemotePIDs,
185  bool Deterministic);
186 
187 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
188  int CreateFromSendsAndRecvs( const int & NumExportIDs,
189  const int * ExportPIDs,
190  const int & NumRemoteIDs,
191  const long long * RemoteGIDs,
192  const int * RemotePIDs,
193  bool Deterministic);
194 #endif
195 
196 
198 
200 
201 
203  int Do( char * export_objs,
204  int obj_size,
205  int & len_import_objs,
206  char *& import_objs );
207 
209  int DoReverse( char * export_objs,
210  int obj_size,
211  int & len_import_objs,
212  char *& import_objs );
213 
215  int DoPosts( char * export_objs,
216  int obj_size,
217  int & len_import_objs,
218  char *& import_objs );
220  int DoWaits();
221 
223  int DoReversePosts( char * export_objs,
224  int obj_size,
225  int & len_import_objs,
226  char *& import_objs );
227 
229  int DoReverseWaits();
231 
233 
234 
236  int Do( char * export_objs,
237  int obj_size,
238  int *& sizes,
239  int & len_import_objs,
240  char *& import_objs );
241 
243  int DoReverse( char * export_objs,
244  int obj_size,
245  int *& sizes,
246  int & len_import_objs,
247  char *& import_objs );
248 
250  int DoPosts( char * export_objs,
251  int obj_size,
252  int *& sizes,
253  int & len_import_objs,
254  char *& import_objs);
255 
257  int DoReversePosts( char * export_objs,
258  int obj_size,
259  int *& sizes,
260  int & len_import_objs,
261  char *& import_objs );
263 
264 
266 
267  int NumReceives() const {return nrecvs_;}
269 
271  int NumSends() const {return nsends_;}
272 
274  int MaxSendLength() const {return max_send_length_;}
275 
277  int TotalReceiveLength() const { return total_recv_length_;}
278 
280  const int * ProcsFrom() const {return procs_from_;}
281 
283  const int * ProcsTo() const {return procs_to_;}
284 
286 
287  const int * LengthsFrom() const {return lengths_from_;}
288 
290 
291  const int * LengthsTo() const {return lengths_to_;}
292 
296  void GetLastDoStatistics(int & bytes_sent, int & bytes_recvd) const {
297  bytes_sent = lastRoundBytesSend_;
298  bytes_recvd = lastRoundBytesRecv_;
299  }
300 
302 
304 
305  void Print(std::ostream & os) const;
307  private:
308  int CreateSendStructures_(int my_proc,
309  int nprocs,
310  const int & NumExportIDs,
311  const int * ExportPIDs);
312 
313 
314  int CreateRecvStructures_(const int & NumRemoteIDs,
315  const int * RemotePIDs);
316 
317 
318  int ComputeRecvs_( int my_proc,
319  int nprocs );
320 
321  template<typename id_type>
322  int ComputeSends_( int num_imports,
323  const id_type *& import_ids,
324  const int *& import_procs,
325  int & num_exports,
326  id_type *& export_ids,
327  int *& export_procs,
328  int my_proc );
329 
330 
331  int Resize_(int *sizes);
332 
333  int Sort_ints_( int *vals, int *other, int nvals );
334 
335  private:
337 
339 
340  int * lengths_to_;
341  int * procs_to_;
342  int * indices_to_;
344 
346  int * procs_from_;
349 
350  bool resized_;
351  int * sizes_;
352 
353  int * sizes_to_;
354  int * starts_to_;
357 
358  int * sizes_from_;
362 
363  int nrecvs_;
364  int nsends_;
366 
368 
371 
372  int tag_;
373 
375  const MPI_Comm comm_;
376 
377  MPI_Request * request_;
378  MPI_Status * status_;
379 
381 
382  char * send_array_;
384 
386 
389 };
390 #endif /* EPETRA_MPIDISTRIBUTOR_H */
Epetra_MpiDistributor::procs_to_
int * procs_to_
Definition: Epetra_MpiDistributor.h:341
Epetra_Object
Epetra_Object: The base Epetra class.
Definition: Epetra_Object.h:57
Epetra_MpiDistributor::ComputeSends_
int ComputeSends_(int num_imports, const id_type *&import_ids, const int *&import_procs, int &num_exports, id_type *&export_ids, int *&export_procs, int my_proc)
Definition: Epetra_MpiDistributor.cpp:678
Epetra_MpiDistributor::~Epetra_MpiDistributor
virtual ~Epetra_MpiDistributor()
Destructor (declared virtual for memory safety).
Definition: Epetra_MpiDistributor.cpp:189
Epetra_MpiDistributor::indices_from_
int * indices_from_
Definition: Epetra_MpiDistributor.h:347
Epetra_MpiDistributor::ProcsFrom
const int * ProcsFrom() const
A list of procs sending values to this proc.
Definition: Epetra_MpiDistributor.h:280
Epetra_MpiDistributor::send_array_size_
int send_array_size_
Definition: Epetra_MpiDistributor.h:383
Epetra_MpiDistributor::CreateReverseDistributor
void CreateReverseDistributor()
Definition: Epetra_MpiDistributor.cpp:1544
Epetra_MpiDistributor::CreateSendStructures_
int CreateSendStructures_(int my_proc, int nprocs, const int &NumExportIDs, const int *ExportPIDs)
Definition: Epetra_MpiDistributor.cpp:369
Epetra_MpiDistributor::indices_to_
int * indices_to_
Definition: Epetra_MpiDistributor.h:342
Epetra_MpiDistributor::Sort_ints_
int Sort_ints_(int *vals, int *other, int nvals)
Definition: Epetra_MpiDistributor.cpp:1476
Epetra_MpiDistributor
MPI implementation of Epetra_Distributor.
Definition: Epetra_MpiDistributor.h:59
Epetra_MpiDistributor::request_
MPI_Request * request_
Definition: Epetra_MpiDistributor.h:377
Epetra_MpiDistributor::CreateFromRecvs
int CreateFromRecvs(const int &NumRemoteIDs, const int *RemoteGIDs, const int *RemotePIDs, bool Deterministic, int &NumExportIDs, int *&ExportGIDs, int *&ExportPIDs)
Create a communication plan from receive list.
Definition: Epetra_MpiDistributor.cpp:252
Epetra_MpiDistributor::DoReverseWaits
int DoReverseWaits()
Wait on a reverse set of posts.
Definition: Epetra_MpiDistributor.cpp:967
Epetra_MpiDistributor::starts_from_
int * starts_from_
Definition: Epetra_MpiDistributor.h:359
Epetra_MpiDistributor::no_delete_
bool no_delete_
Definition: Epetra_MpiDistributor.h:380
Epetra_MpiDistributor::DoPosts
int DoPosts(char *export_objs, int obj_size, int &len_import_objs, char *&import_objs)
Post buffer of export objects (can do other local work before executing Waits)
Definition: Epetra_MpiDistributor.cpp:781
Epetra_MpiDistributor::CreateRecvStructures_
int CreateRecvStructures_(const int &NumRemoteIDs, const int *RemotePIDs)
Definition: Epetra_MpiDistributor.cpp:504
Epetra_MpiDistributor::sizes_to_
int * sizes_to_
Definition: Epetra_MpiDistributor.h:353
Epetra_MpiDistributor::operator=
Epetra_MpiDistributor & operator=(const Epetra_MpiDistributor &src)
Definition: Epetra_MpiDistributor.cpp:1531
Epetra_MpiDistributor::epComm_
const Epetra_MpiComm * epComm_
Definition: Epetra_MpiDistributor.h:374
Epetra_MpiDistributor::size_indices_from_
int size_indices_from_
Definition: Epetra_MpiDistributor.h:348
Epetra_MpiDistributor::GetLastDoStatistics
void GetLastDoStatistics(int &bytes_sent, int &bytes_recvd) const
Information on the last call to Do/DoReverse.
Definition: Epetra_MpiDistributor.h:296
Epetra_MpiDistributor::lastRoundBytesRecv_
int lastRoundBytesRecv_
Definition: Epetra_MpiDistributor.h:388
Epetra_MpiDistributor::DoReversePosts
int DoReversePosts(char *export_objs, int obj_size, int &len_import_objs, char *&import_objs)
Do reverse post of buffer of export objects (can do other local work before executing Waits)
Definition: Epetra_MpiDistributor.cpp:949
Epetra_MpiDistributor::starts_to_ptr_
int * starts_to_ptr_
Definition: Epetra_MpiDistributor.h:355
Epetra_MpiDistributor::nsends_
int nsends_
Definition: Epetra_MpiDistributor.h:364
Epetra_MpiDistributor::CreateFromSendsAndRecvs
int CreateFromSendsAndRecvs(const int &NumExportIDs, const int *ExportPIDs, const int &NumRemoteIDs, const int *RemoteGIDs, const int *RemotePIDs, bool Deterministic)
Create a communication plan from send list and a recv list.
Definition: Epetra_MpiDistributor.cpp:313
Epetra_MpiDistributor::ProcsTo
const int * ProcsTo() const
A list of procs to which this proc is sending values.
Definition: Epetra_MpiDistributor.h:283
Epetra_MpiDistributor::NumSends
int NumSends() const
The number of procs to which we will send data.
Definition: Epetra_MpiDistributor.h:271
Epetra_MpiDistributor::DoReverse
int DoReverse(char *export_objs, int obj_size, int &len_import_objs, char *&import_objs)
Execute reverse of plan on buffer of export objects in a single step.
Definition: Epetra_MpiDistributor.cpp:761
Epetra_MpiDistributor::nexports_
int nexports_
Definition: Epetra_MpiDistributor.h:365
Epetra_MpiDistributor::lengths_from_
int * lengths_from_
Definition: Epetra_MpiDistributor.h:345
Epetra_MpiDistributor::send_array_
char * send_array_
Definition: Epetra_MpiDistributor.h:382
Epetra_MpiDistributor::Resize_
int Resize_(int *sizes)
Definition: Epetra_MpiDistributor.cpp:980
Epetra_MpiComm
Epetra_MpiComm: The Epetra MPI Communication Class.
Definition: Epetra_MpiComm.h:64
Epetra_MpiDistributor::status_
MPI_Status * status_
Definition: Epetra_MpiDistributor.h:378
Epetra_MpiDistributor::MaxSendLength
int MaxSendLength() const
Maximum number of values that this proc is sending to another single proc.
Definition: Epetra_MpiDistributor.h:274
Epetra_MpiDistributor::ReverseClone
Epetra_Distributor * ReverseClone()
Create and extract the reverse version of the distributor.
Definition: Epetra_MpiDistributor.cpp:1589
Epetra_MpiDistributor::LengthsFrom
const int * LengthsFrom() const
Number of values we're receiving from each proc.
Definition: Epetra_MpiDistributor.h:287
Epetra_MpiDistributor::DoWaits
int DoWaits()
Wait on a set of posts.
Definition: Epetra_MpiDistributor.cpp:941
Epetra_MpiDistributor::indices_from_ptr_
int * indices_from_ptr_
Definition: Epetra_MpiDistributor.h:361
Epetra_MpiDistributor::LengthsTo
const int * LengthsTo() const
Number of values we're sending to each proc.
Definition: Epetra_MpiDistributor.h:291
Epetra_MpiDistributor::Do
int Do(char *export_objs, int obj_size, int &len_import_objs, char *&import_objs)
Execute plan on buffer of export objects in a single step.
Definition: Epetra_MpiDistributor.cpp:743
Epetra_MpiDistributor::indices_to_ptr_
int * indices_to_ptr_
Definition: Epetra_MpiDistributor.h:356
Epetra_MpiDistributor::comm_plan_reverse_
Epetra_MpiDistributor * comm_plan_reverse_
Definition: Epetra_MpiDistributor.h:385
Epetra_MpiDistributor::starts_to_
int * starts_to_
Definition: Epetra_MpiDistributor.h:354
Epetra_MpiDistributor::lastRoundBytesSend_
int lastRoundBytesSend_
Definition: Epetra_MpiDistributor.h:387
Epetra_MpiDistributor::Print
void Print(std::ostream &os) const
Definition: Epetra_MpiDistributor.cpp:1349
Epetra_MpiDistributor::lengths_to_
int * lengths_to_
Definition: Epetra_MpiDistributor.h:340
Epetra_MpiDistributor::resized_
bool resized_
Definition: Epetra_MpiDistributor.h:350
Epetra_MpiDistributor::CreateFromSends
int CreateFromSends(const int &NumExportIDs, const int *ExportPIDs, bool Deterministic, int &NumRemoteIDs)
Create a communication plan from send list.
Definition: Epetra_MpiDistributor.cpp:221
Epetra_MpiDistributor::Epetra_MpiDistributor
Epetra_MpiDistributor(const Epetra_MpiComm &Comm)
Default constructor.
Definition: Epetra_MpiDistributor.cpp:49
Epetra_MpiDistributor::max_send_length_
int max_send_length_
Definition: Epetra_MpiDistributor.h:369
Epetra_MpiDistributor::size_indices_to_
int size_indices_to_
Definition: Epetra_MpiDistributor.h:343
Epetra_MpiDistributor::self_msg_
int self_msg_
Definition: Epetra_MpiDistributor.h:367
Epetra_MpiDistributor::Clone
Epetra_Distributor * Clone()
Clone method.
Definition: Epetra_MpiDistributor.h:73
Epetra_MpiDistributor::comm_
const MPI_Comm comm_
Definition: Epetra_MpiDistributor.h:375
Epetra_MpiDistributor::sizes_
int * sizes_
Definition: Epetra_MpiDistributor.h:351
Epetra_MpiDistributor::NumReceives
int NumReceives() const
The number of procs from which we will receive data.
Definition: Epetra_MpiDistributor.h:268
Epetra_Distributor
Epetra_Distributor: The Epetra Gather/Scatter Setup Base Class.
Definition: Epetra_Distributor.h:61
Epetra_MpiDistributor::procs_from_
int * procs_from_
Definition: Epetra_MpiDistributor.h:346
Epetra_MpiDistributor::sizes_from_
int * sizes_from_
Definition: Epetra_MpiDistributor.h:358
Epetra_MpiDistributor::ComputeRecvs_
int ComputeRecvs_(int my_proc, int nprocs)
Definition: Epetra_MpiDistributor.cpp:552
Epetra_Object.h
Epetra_MpiDistributor::starts_from_ptr_
int * starts_from_ptr_
Definition: Epetra_MpiDistributor.h:360
Epetra_MpiDistributor::tag_
int tag_
Definition: Epetra_MpiDistributor.h:372
Epetra_Distributor.h
Epetra_MpiDistributor::total_recv_length_
int total_recv_length_
Definition: Epetra_MpiDistributor.h:370
Epetra_MpiDistributor::nrecvs_
int nrecvs_
Definition: Epetra_MpiDistributor.h:363
Epetra_MpiDistributor::TotalReceiveLength
int TotalReceiveLength() const
Total number of values that this proc is receiving from other procs.
Definition: Epetra_MpiDistributor.h:277