Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_Details_gathervPrint.cpp
1/*
2// @HEADER
3// ***********************************************************************
4//
5// Tpetra: Templated Linear Algebra Services Package
6// Copyright (2008) 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
45#include <Teuchos_CommHelpers.hpp>
46#include <algorithm>
47
48namespace Tpetra {
49namespace Details {
50
51void
52gathervPrint (std::ostream& out,
53 const std::string& s,
54 const Teuchos::Comm<int>& comm)
55{
56 using Teuchos::ArrayRCP;
57 using Teuchos::CommRequest;
58 using Teuchos::ireceive;
59 using Teuchos::isend;
60 using Teuchos::outArg;
61 using Teuchos::RCP;
62 using Teuchos::wait;
63
64 const int myRank = comm.getRank ();
65 const int rootRank = 0;
66 if (myRank == rootRank) {
67 out << s; // Proc 0 prints its buffer first
68 }
69
70 const int numProcs = comm.getSize ();
71 const int sizeTag = 42;
72 const int msgTag = 43;
73
75 ArrayRCP<char> msgBuf; // to be resized later
77
78 for (int p = 1; p < numProcs; ++p) {
79 if (myRank == p) {
80 sizeBuf[0] = s.size ();
82 (void) wait<int> (comm, outArg (req));
83
84 const size_t msgSize = s.size ();
85 msgBuf.resize (msgSize + 1); // for the '\0'
86 std::copy (s.begin (), s.end (), msgBuf.begin ());
87 msgBuf[msgSize] = '\0';
88
90 (void) wait<int> (comm, outArg (req));
91 }
92 else if (myRank == rootRank) {
93 sizeBuf[0] = 0; // just a precaution
95 (void) wait<int> (comm, outArg (req));
96
97 const size_t msgSize = sizeBuf[0];
98 msgBuf.resize (msgSize + 1); // for the '\0'
100 (void) wait<int> (comm, outArg (req));
101
102 std::string msg (msgBuf.getRawPtr ());
103 out << msg;
104 }
105 }
106}
107
108} // namespace Details
109} // namespace Tpetra
Declaration of a function that prints strings from each process.
Struct that holds views of the contents of a CrsMatrix.
Implementation details of Tpetra.
void gathervPrint(std::ostream &out, const std::string &s, const Teuchos::Comm< int > &comm)
On Process 0 in the given communicator, print strings from each process in that communicator,...
Namespace Tpetra contains the class and methods constituting the Tpetra library.