[Trilinos-Users] Thyra::LinearOpBase - Constructing blocked operators

Bartlett, Roscoe A. bartlettra at ornl.gov
Fri Mar 9 12:22:27 MST 2012


These vector spaces are *not* compatible, as shown in the error message.  The range space on this blocked matrix is a 2x product vector (with two Tpetra vectors) and the vector you are trying to pass in for y is just a regular single concrete Tpetra vector.  As you can see in the error messages, the types are not the same (Thyra::DefaultProductVectorSpace vs. Thyra::TpetraVectorSpace).  Just because they have the same global dimension does not mean they are compatible.  For a simple serial vector you would think they should be but for more complex vector spaces, it is not trivial to implement and is instead counter-productive to try to make them compatible.

You need to create your vectors given the range and domain spaces of the linear operators if possible.  For example:

  RCP<Thyra::LinearOpBase<double> > myOp;
  // Create myOp and fill it
  const RCP<Thyra::VectorBase<double> > x = createMember(myOp->domain());
  // Fill the RHS x
  const RCP<Thyra::VectorBase<double > > y = createMember(myOp->range());
  apply(*myOp, Thyra::NOTRANS, *x, y.ptr());

The above is guaranteed to work.

Since you have a 2x product vector, you will have to dynamic cast to get the individual members.  For example:

    const RCP<Thyra::ProductVectorBase<double> > y_prod = Thyra::nonconstProductVectorBase(y);
    const RCP<Thyra::VectorBase<double> > y_0 = y_prod->getNonconstVectorBlock(0);
    const RCP<Thyra::VectorBase<double> > y_1 = y_prod->getNonconstVectorBlock(1);

We likely need better tutorial material for this stuff to describe type compatibility, how things fit together, and where dyanamic casting is needed to perform certain tasks.



From: trilinos-users-bounces at software.sandia.gov [mailto:trilinos-users-bounces at software.sandia.gov] On Behalf Of Einar Otnes
Sent: Friday, March 09, 2012 12:47 PM
To: trilinos-users at software.sandia.gov
Subject: [Trilinos-Users] Thyra::LinearOpBase - Constructing blocked operators

Dear experts,
I've been trying to construct blocky matrices using Thyra::PhysicallyBlockedLinearOpBase and I'm struggling a bit with understanding the error message below
as it complains about non-compatible vector spaces between the blocky operator and the vectors it operates on. From what I can read from the messages below is that I have
"compatible" vector spaces. Or have I missed something?

The output from throwing the instance follows below.

Thanks for all your help.

Einar Otnes

Error message follows:

terminate called after throwing an instance of 'Thyra::Exceptions::IncompatibleVectorSpaces'
 what():  /dd/packages/trilinos/10.10.1/gcc/64/debug/include/Thyra_DefaultBlockedLinearOp_def.hpp:447:

Throw number = 1

Throw test that evaluated to true: !l_isCompatible


Spaces check failed for *this * X_in and &*Y_inout:

Error, the following vector spaces are not compatible:

(*this).range() : Thyra::DefaultProductVectorSpace<float>{dim=4,numBlocks=2}
  Constituent vector spaces V[0], V[1], ... V[numBlocks-1]:
   V[0] = Thyra::TpetraVectorSpace<float, int, int, Kokkos::TPINode>{globalDim=2,localSubDim=2,localOffset=0,comm=Teuchos::SerialComm<long int>}
   V[1] = Thyra::TpetraVectorSpace<float, int, int, Kokkos::TPINode>{globalDim=2,localSubDim=2,localOffset=0,comm=Teuchos::SerialComm<long int>}

*(&*Y_inout)->range() : Thyra::TpetraVectorSpace<float, int, int, Kokkos::TPINode>{globalDim=4,localSubDim=4,localOffset=0,comm=Teuchos::SerialComm<long int>}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://software.sandia.gov/pipermail/trilinos-users/attachments/20120309/36ad73ef/attachment.html 

More information about the Trilinos-Users mailing list