57 #if defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR)
59 #include <Epetra_ConfigDefs.h>
60 #include <Teuchos_ConfigDefs.hpp>
63 #if defined(EPETRA_MPI) && ! defined(HAVE_TEUCHOS_MPI)
64 # 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."
65 #elif ! defined(EPETRA_MPI) && defined(HAVE_TEUCHOS_MPI)
66 # 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."
71 # include <Epetra_MpiComm.h>
73 #include <Epetra_SerialComm.h>
76 #ifdef HAVE_TEUCHOS_MPI
77 # include <Teuchos_DefaultMpiComm.hpp>
78 #endif // HAVE_TEUCHOS_MPI
79 #include <Teuchos_DefaultSerialComm.hpp>
85 Teuchos::RCP<const Teuchos::Comm<int> >
86 extractTeuchosComm (
const Teuchos::RCP<const Epetra_Comm>& epetraComm)
90 using Teuchos::rcp_dynamic_cast;
91 using Teuchos::rcp_implicit_cast;
94 RCP<const Epetra_MpiComm> epetraMpiComm =
95 rcp_dynamic_cast<
const Epetra_MpiComm> (epetraComm,
false);
96 if (! epetraMpiComm.is_null ()) {
100 MPI_Comm rawMpiComm = epetraMpiComm->Comm ();
101 RCP<const Teuchos::MpiComm<int> > teuchosMpiComm =
102 rcp (
new Teuchos::MpiComm<int> (rawMpiComm));
103 return rcp_implicit_cast<
const Teuchos::Comm<int> > (teuchosMpiComm);
107 RCP<const Epetra_SerialComm> epetraSerialComm =
108 rcp_dynamic_cast<
const Epetra_SerialComm> (epetraComm,
false);
109 if (! epetraSerialComm.is_null ()) {
110 RCP<const Teuchos::SerialComm<int> > teuchosSerialComm =
111 rcp (
new Teuchos::SerialComm<int> ());
112 return rcp_implicit_cast<
const Teuchos::Comm<int> > (teuchosSerialComm);
115 TEUCHOS_TEST_FOR_EXCEPTION(
116 true, std::invalid_argument,
"The input Epetra_Comm object is neither "
117 "an Epetra_MpiComm nor an Epetra_SerialComm. This means that we don't"
118 " know how to convert it into a Teuchos::Comm<int> instance. You are "
119 "probably seeing this error message as a result of trying to invoke "
120 "TSQR (the Tall Skinny QR factorization) on an Epetra_MultiVector, "
121 "probably as a block orthogonalization method in either Anasazi or "
122 "Belos. TSQR currently only works on an Epetra_MultiVector if the "
123 "latter's communicator is either an Epetra_MpiComm (wraps MPI) or an "
124 "Epetra_SerialComm (\"stub\" communicator for a single process without "
130 #endif // defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR)
Function for wrapping Epetra_Comm in a communicator wrapper that TSQR can use.