59 #if defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR)
61 #include <Epetra_ConfigDefs.h>
62 #include <Teuchos_ConfigDefs.hpp>
65 #if defined(EPETRA_MPI) && ! defined(HAVE_TEUCHOS_MPI)
66 # error "The Epetra package defines EPETRA_MPI, but the Teuchos package does NOT define HAVE_TEUCHOS_MPI. This means that one package thinks MPI exists, but the other package doesn't. This may indicate that Trilinos was not configured correctly. We can't continue building Trilinos in this case."
67 #elif ! defined(EPETRA_MPI) && defined(HAVE_TEUCHOS_MPI)
68 # error "The Epetra package does not define EPETRA_MPI, but the Teuchos package DOES define HAVE_TEUCHOS_MPI. This means that one package thinks MPI exists, but the other package doesn't. This may indicate that Trilinos was not configured correctly. We can't continue building Trilinos in this case."
73 # include <Epetra_MpiComm.h>
75 #include <Epetra_SerialComm.h>
78 #ifdef HAVE_TEUCHOS_MPI
79 # include <Teuchos_DefaultMpiComm.hpp>
80 #endif // HAVE_TEUCHOS_MPI
81 #include <Teuchos_DefaultSerialComm.hpp>
87 Teuchos::RCP<const Teuchos::Comm<int> >
88 extractTeuchosComm (
const Teuchos::RCP<const Epetra_Comm>& epetraComm)
92 using Teuchos::rcp_dynamic_cast;
93 using Teuchos::rcp_implicit_cast;
96 RCP<const Epetra_MpiComm> epetraMpiComm =
97 rcp_dynamic_cast<
const Epetra_MpiComm> (epetraComm,
false);
98 if (! epetraMpiComm.is_null ()) {
102 MPI_Comm rawMpiComm = epetraMpiComm->Comm ();
103 RCP<const Teuchos::MpiComm<int> > teuchosMpiComm =
104 rcp (
new Teuchos::MpiComm<int> (rawMpiComm));
105 return rcp_implicit_cast<
const Teuchos::Comm<int> > (teuchosMpiComm);
109 RCP<const Epetra_SerialComm> epetraSerialComm =
110 rcp_dynamic_cast<
const Epetra_SerialComm> (epetraComm,
false);
111 if (! epetraSerialComm.is_null ()) {
112 RCP<const Teuchos::SerialComm<int> > teuchosSerialComm =
113 rcp (
new Teuchos::SerialComm<int> ());
114 return rcp_implicit_cast<
const Teuchos::Comm<int> > (teuchosSerialComm);
117 TEUCHOS_TEST_FOR_EXCEPTION(
118 true, std::invalid_argument,
"The input Epetra_Comm object is neither "
119 "an Epetra_MpiComm nor an Epetra_SerialComm. This means that we don't"
120 " know how to convert it into a Teuchos::Comm<int> instance. You are "
121 "probably seeing this error message as a result of trying to invoke "
122 "TSQR (the Tall Skinny QR factorization) on an Epetra_MultiVector, "
123 "probably as a block orthogonalization method in either Anasazi or "
124 "Belos. TSQR currently only works on an Epetra_MultiVector if the "
125 "latter's communicator is either an Epetra_MpiComm (wraps MPI) or an "
126 "Epetra_SerialComm (\"stub\" communicator for a single process without "
132 #endif // defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR)
Function for wrapping Epetra_Comm in a communicator wrapper that TSQR can use.