207 using Teuchos::rcp_dynamic_cast;
208 using Teuchos::rcp_implicit_cast;
209 typedef Thyra::VectorSpaceBase<Scalar> space_base_type;
210 typedef Thyra::SpmdVectorSpaceBase<Scalar> space_type;
214 RCP<const space_base_type> rangeBase = X.range ();
215 TEUCHOS_TEST_FOR_EXCEPTION(rangeBase.is_null (), std::runtime_error,
"X.range() is null.");
216 RCP<const space_type> range = rcp_dynamic_cast<const space_type> (rangeBase);
217 TEUCHOS_TEST_FOR_EXCEPTION(range.is_null (), std::runtime_error,
"X.range() is not an SpmdVectorSpaceBase.");
228 RCP<const Teuchos::Comm<Thyra::Ordinal> > thyraComm = range->getComm ();
230 RCP<const Teuchos::MpiComm<Thyra::Ordinal> > thyraMpiComm =
231 rcp_dynamic_cast<const Teuchos::MpiComm<Thyra::Ordinal> > (thyraComm);
232 if (thyraMpiComm.is_null ()) {
233 RCP<const Teuchos::SerialComm<Thyra::Ordinal> > thyraSerialComm =
234 rcp_dynamic_cast<const Teuchos::SerialComm<Thyra::Ordinal> > (thyraComm);
235 TEUCHOS_TEST_FOR_EXCEPTION(
236 thyraSerialComm.is_null (), std::runtime_error,
237 "Thyra's communicator is neither an MpiComm nor a SerialComm. "
238 "Sorry, I have no idea what to do with it in that case.");
242 return rcp_implicit_cast<const Teuchos::Comm<int> > (rcp (
new Teuchos::SerialComm<int>));
245 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > rawMpiComm = thyraMpiComm->getRawMpiComm ();
249 return rcp_implicit_cast<const Teuchos::Comm<int> > (rcp (
new Teuchos::MpiComm<int> (rawMpiComm)));
253 RCP<const Teuchos::SerialComm<Thyra::Ordinal> > thyraSerialComm =
254 rcp_dynamic_cast<const Teuchos::SerialComm<Thyra::Ordinal> > (thyraComm);
255 TEUCHOS_TEST_FOR_EXCEPTION(
256 thyraSerialComm.is_null (), std::runtime_error,
257 "Thyra's communicator is not a SerialComm, and MPI is not enabled, so "
258 "it can't be an MpiComm either. That means it must be some other "
259 "subclass of Comm, about which I don't know. "
260 "Sorry, I have no idea what to do with it in that case.");
264 return rcp_implicit_cast<const Teuchos::Comm<int> > (rcp (
new Teuchos::SerialComm<int>));