Remove trailing whitespace systematically
[foam-extend-3.2.git] / src / Pstream / mpi / OPwrite.C
blob418d09d21815ca2f9da2fe5b815d1d524b9bcc7e
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     |
5     \\  /    A nd           | For copyright notice see file Copyright
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Description
25     Write primitive and binary block from OPstream
27 \*---------------------------------------------------------------------------*/
29 #include "mpi.h"
31 #include "OPstream.H"
32 #include "PstreamGlobals.H"
34 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
36 Foam::OPstream::~OPstream()
38     if
39     (
40        !write
41         (
42             commsType_,
43             toProcNo_,
44             buf_.begin(),
45             bufPosition_
46         )
47     )
48     {
49         FatalErrorIn("OPstream::~OPstream()")
50             << "MPI_Bsend cannot send outgoing message"
51             << Foam::abort(FatalError);
52     }
56 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
58 bool Foam::OPstream::write
60     const commsTypes commsType,
61     const int toProcNo,
62     const char* buf,
63     const std::streamsize bufSize
66     bool transferFailed = true;
68     if (commsType == blocking)
69     {
70         transferFailed = MPI_Bsend
71         (
72             const_cast<char*>(buf),
73             bufSize,
74             MPI_PACKED,
75             procID(toProcNo),
76             msgType(),
77             MPI_COMM_WORLD
78         );
79     }
80     else if (commsType == scheduled)
81     {
82         transferFailed = MPI_Send
83         (
84             const_cast<char*>(buf),
85             bufSize,
86             MPI_PACKED,
87             procID(toProcNo),
88             msgType(),
89             MPI_COMM_WORLD
90         );
91     }
92     else if (commsType == nonBlocking)
93     {
94         MPI_Request request;
96         transferFailed = MPI_Isend
97         (
98             const_cast<char*>(buf),
99             bufSize,
100             MPI_PACKED,
101             procID(toProcNo),
102             msgType(),
103             MPI_COMM_WORLD,
104             &request
105         );
107         PstreamGlobals::OPstream_outstandingRequests_.append(request);
108     }
109     else
110     {
111         FatalErrorIn
112         (
113             "OPstream::write"
114             "(const int fromProcNo, char* buf, std::streamsize bufSize)"
115         )   << "Unsupported communications type " << commsType
116             << Foam::abort(FatalError);
117     }
119     return !transferFailed;
123 void Foam::OPstream::waitRequests()
125     if (PstreamGlobals::OPstream_outstandingRequests_.size())
126     {
127         if
128         (
129             MPI_Waitall
130             (
131                 PstreamGlobals::OPstream_outstandingRequests_.size(),
132                 PstreamGlobals::OPstream_outstandingRequests_.begin(),
133                 MPI_STATUSES_IGNORE
134             )
135         )
136         {
137             FatalErrorIn
138             (
139                 "OPstream::waitRequests()"
140             )   << "MPI_Waitall returned with error" << Foam::endl;
141         }
143         PstreamGlobals::OPstream_outstandingRequests_.clear();
144     }
148 bool Foam::OPstream::finishedRequest(const label i)
150     if (i >= PstreamGlobals::OPstream_outstandingRequests_.size())
151     {
152         FatalErrorIn
153         (
154             "OPstream::finishedRequest(const label)"
155         )   << "There are "
156             << PstreamGlobals::OPstream_outstandingRequests_.size()
157             << " outstanding send requests and you are asking for i=" << i
158             << nl
159             << "Maybe you are mixing blocking/non-blocking comms?"
160             << Foam::abort(FatalError);
161     }
163     int flag;
164     MPI_Test
165     (
166         &PstreamGlobals::OPstream_outstandingRequests_[i],
167         &flag,
168         MPI_STATUS_IGNORE
169     );
171     return flag != 0;
175 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
177 // ************************************************************************* //