ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / Pstream / mpi / UOPwrite.C
blob2a1b3f719503874f42afef85b2425e20b28427c1
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  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 "UOPstream.H"
32 #include "PstreamGlobals.H"
34 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
36 bool Foam::UOPstream::write
38     const commsTypes commsType,
39     const int toProcNo,
40     const char* buf,
41     const std::streamsize bufSize,
42     const int tag
45     if (debug)
46     {
47         Pout<< "UOPstream::write : starting write to:" << toProcNo
48             << " tag:" << tag << " size:" << label(bufSize)
49             << " commsType:" << UPstream::commsTypeNames[commsType]
50             << Foam::endl;
51     }
53     bool transferFailed = true;
55     if (commsType == blocking)
56     {
57         transferFailed = MPI_Bsend
58         (
59             const_cast<char*>(buf),
60             bufSize,
61             MPI_PACKED,
62             procID(toProcNo),
63             tag,
64             MPI_COMM_WORLD
65         );
67         if (debug)
68         {
69             Pout<< "UOPstream::write : finished write to:" << toProcNo
70                 << " tag:" << tag << " size:" << label(bufSize)
71                 << " commsType:" << UPstream::commsTypeNames[commsType]
72                 << Foam::endl;
73         }
74     }
75     else if (commsType == scheduled)
76     {
77         transferFailed = MPI_Send
78         (
79             const_cast<char*>(buf),
80             bufSize,
81             MPI_PACKED,
82             procID(toProcNo),
83             tag,
84             MPI_COMM_WORLD
85         );
87         if (debug)
88         {
89             Pout<< "UOPstream::write : finished write to:" << toProcNo
90                 << " tag:" << tag << " size:" << label(bufSize)
91                 << " commsType:" << UPstream::commsTypeNames[commsType]
92                 << Foam::endl;
93         }
94     }
95     else if (commsType == nonBlocking)
96     {
97         MPI_Request request;
99         transferFailed = MPI_Isend
100         (
101             const_cast<char*>(buf),
102             bufSize,
103             MPI_PACKED,
104             procID(toProcNo),
105             tag,
106             MPI_COMM_WORLD,
107             &request
108         );
110         if (debug)
111         {
112             Pout<< "UOPstream::write : started write to:" << toProcNo
113                 << " tag:" << tag << " size:" << label(bufSize)
114                 << " commsType:" << UPstream::commsTypeNames[commsType]
115                 << " request:" << PstreamGlobals::outstandingRequests_.size()
116                 << Foam::endl;
117         }
119         PstreamGlobals::outstandingRequests_.append(request);
120     }
121     else
122     {
123         FatalErrorIn
124         (
125             "UOPstream::write"
126             "(const int fromProcNo, char* buf, std::streamsize bufSize"
127             ", const int)"
128         )   << "Unsupported communications type "
129             << UPstream::commsTypeNames[commsType]
130             << Foam::abort(FatalError);
131     }
133     return !transferFailed;
137 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
139 // ************************************************************************* //