Xpetra
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
Xpetra_EpetraUtils.cpp
Go to the documentation of this file.
1
// @HEADER
2
//
3
// ***********************************************************************
4
//
5
// Xpetra: A linear algebra interface package
6
// Copyright 2012 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
39
// Jonathan Hu (jhu@sandia.gov)
40
// Andrey Prokopenko (aprokop@sandia.gov)
41
// Ray Tuminaro (rstumin@sandia.gov)
42
//
43
// ***********************************************************************
44
//
45
// @HEADER
46
#include "
Xpetra_ConfigDefs.hpp
"
47
48
#ifdef HAVE_XPETRA_EPETRA
49
50
#include "
Xpetra_EpetraUtils.hpp
"
51
52
// header files for comm objects conversion
53
#ifdef HAVE_MPI
54
#include <mpi.h>
55
#include <
Teuchos_DefaultMpiComm.hpp
>
56
#include <Teuchos_OpaqueWrapper.hpp>
57
#endif
58
#include <Teuchos_DefaultSerialComm.hpp>
59
#ifdef HAVE_MPI
60
#include <Epetra_MpiComm.h>
61
#endif
62
#include <Epetra_SerialComm.h>
63
64
#include "
Xpetra_Exceptions.hpp
"
65
66
67
namespace
Xpetra
{
68
69
using
Teuchos::RCP;
70
71
const
RCP<const Epetra_Comm>
toEpetra
(
const
RCP
<
const
Teuchos::Comm<int>
> & comm) {
72
#ifdef HAVE_MPI
73
const
RCP<const Teuchos::MpiComm<int>
> mpiComm = Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
74
if
(mpiComm != Teuchos::null) {
75
return
Teuchos::rcp
(
new
Epetra_MpiComm
(*mpiComm->getRawMpiComm()));
76
}
else
77
#endif
78
if
((Teuchos::rcp_dynamic_cast<
const
Teuchos::SerialComm<int>
>(comm) != Teuchos::null))
79
return
Teuchos::rcp
(
new
Epetra_SerialComm
());
80
else
81
TEUCHOS_TEST_FOR_EXCEPTION
(1,
Xpetra::Exceptions::BadCast
,
"Cannot convert a Teuchos::Comm to an Epetra_Comm: The exact type of the Teuchos::Comm object is unknown"
);
82
}
83
84
const
RCP<const Teuchos::Comm<int>
>
toXpetra
(
const
Epetra_Comm
& comm) {
85
#ifdef HAVE_MPI
86
try
{
87
const
Epetra_MpiComm
& mpiComm =
dynamic_cast<
const
Epetra_MpiComm
&
>
(comm);
88
// We need to pass some tag to the Teuchos::MpiComm constructor. We
89
// cannot use Epetra's GetMpiTag() as that increases the tag counter.
90
const
int
MAGIC_TAG = 26077;
91
return
Teuchos::rcp
(
new
Teuchos::MpiComm<int>(Teuchos::opaqueWrapper(mpiComm.
Comm
()), MAGIC_TAG));
92
}
catch
(std::bad_cast &
/*b*/
) {}
93
#endif
94
try
{
95
const
Epetra_SerialComm
& serialComm =
dynamic_cast<
const
Epetra_SerialComm
&
>
(comm);
96
serialComm.
NumProc
();
// avoid compilation warning
97
return
Teuchos::rcp
(
new
Teuchos::SerialComm<int>
());
98
}
catch
(std::bad_cast &
/*b*/
) {
99
TEUCHOS_TEST_FOR_EXCEPTION
(1,
Xpetra::Exceptions::BadCast
,
"Cannot convert an Epetra_Comm to a Teuchos::Comm: The exact type of the Epetra_Comm object is unknown"
);
100
}
101
}
102
103
bool
toEpetra
(
Teuchos::ETransp
trans) {
104
if
(trans ==
Teuchos::NO_TRANS
)
105
return
false
;
106
else
if
(trans ==
Teuchos::TRANS
)
107
return
true
;
108
else
{
109
TEUCHOS_TEST_FOR_EXCEPTION
((trans !=
Teuchos::NO_TRANS
) && (trans ==
Teuchos::TRANS
),
Xpetra::Exceptions::NotImplemented
,
"Cannot convert Teuchos::ETransp to a boolean."
);
110
}
111
112
return
false
;
// to skip a compilation warning msg.
113
}
114
115
}
116
117
#endif
Teuchos_DefaultMpiComm.hpp
Xpetra_ConfigDefs.hpp
Xpetra_EpetraUtils.hpp
Xpetra_Exceptions.hpp
Epetra_Comm
Epetra_MpiComm
Epetra_MpiComm::Comm
MPI_Comm Comm() const
Epetra_SerialComm
Epetra_SerialComm::NumProc
int NumProc() const
Teuchos::Comm
Teuchos::RCP
Teuchos::SerialComm
Xpetra::Exceptions::BadCast
Exception indicating invalid cast attempted.
Definition
Xpetra_Exceptions.hpp:87
Xpetra::Exceptions::NotImplemented
Exception throws when you call an unimplemented method of Xpetra.
Definition
Xpetra_Exceptions.hpp:95
TEUCHOS_TEST_FOR_EXCEPTION
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::rcp
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::ETransp
ETransp
Teuchos::NO_TRANS
NO_TRANS
Teuchos::TRANS
TRANS
Xpetra
Xpetra namespace
Definition
Xpetra_BlockedCrsMatrix.hpp:89
Xpetra::toEpetra
const Epetra_CrsGraph & toEpetra(const RCP< const CrsGraph< int, GlobalOrdinal, Node > > &graph)
Definition
Xpetra_EpetraCrsGraph.cpp:57
Xpetra::toXpetra
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
Definition
Xpetra_EpetraCrsGraph.cpp:65
src
Utils
Xpetra_EpetraUtils.cpp
Generated by
1.17.0