Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_DefaultMpiComm.cpp
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
11
12// Only enable the contents of this file if building with MPI.
13#ifdef HAVE_TEUCHOS_MPI
14
15namespace Teuchos {
16
17 std::string
18 mpiErrorCodeToString (const int errCode)
19 {
20 if (errCode == MPI_SUCCESS) {
21 return "MPI_SUCCESS";
22 }
23 else {
24 char rawErrString[MPI_MAX_ERROR_STRING];
25 int len = 0;
26 int err = MPI_Error_string (errCode, rawErrString, &len);
27 if (err != MPI_SUCCESS) {
28 // Assume that the string wasn't written. This means it might
29 // not be null terminated, so make it a valid empty string by
30 // writing the null termination character to it.
31 if (MPI_MAX_ERROR_STRING > 0) {
32 rawErrString[0] = '\0';
33 }
34 }
35 return std::string (rawErrString);
36 }
37 }
38
39 namespace details {
40 void safeCommFree (MPI_Comm* comm) {
41 // FIXME (mfh 08 Dec 2014) Use the MPI_Finalize hook trick to
42 // call MPI_Comm_free at MPI_Finalize automatically, if it
43 // hasn't already been called on the object. Store the MPI_Comm
44 // (by allocated pointer) as the value of the (key,value) pair
45 // (used in the hook), and be sure to free the pair if the free
46 // function is called before MPI_Finalize.
47 int finalized = 0;
48 const int err = MPI_Finalized (&finalized);
49 // Just to be safe, don't do anything if calling MPI_Finalized
50 // didn't succeed. It's better to leak memory than to crash.
51 if (err == MPI_SUCCESS && ! finalized) {
52 // Don't throw an exception if MPI_Comm_free reports an error,
53 // since we're likely to be in a destructor and destructors
54 // shouldn't throw exceptions.
55 (void) MPI_Comm_free (comm);
56 }
57 }
58
59 int setCommErrhandler (MPI_Comm comm, MPI_Errhandler handler) {
60#if MPI_VERSION >= 2
61 return MPI_Comm_set_errhandler (comm, handler);
62#else // MPI 1
63 return MPI_Errhandler_set (comm, handler);
64#endif // MPI_VERSION >= 2
65 }
66 } // namespace details
67
68} // namespace Teuchos
69
70#endif // HAVE_TEUCHOS_MPI
Implementation of Teuchos wrappers for MPI.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
Teuchos implementation details.