37 if (TpetraHelpers::isTpetraLinearOp(lo)) {
38 RCP<const Thyra::TpetraLinearOp<ST, LO, GO, NT> > tlo =
39 Teuchos::rcp_dynamic_cast<const Thyra::TpetraLinearOp<ST, LO, GO, NT> >(lo,
true);
40 RCP<const Tpetra::Operator<ST, LO, GO, NT> > top = tlo->getConstTpetraOperator();
41 RCP<const Tpetra::CrsMatrix<ST, LO, GO, NT> > MAT =
42 Teuchos::rcp_dynamic_cast<const Tpetra::CrsMatrix<ST, LO, GO, NT> >(top,
true);
44 RCP<Tpetra::Ext::PointToBlockDiagPermute<ST, LO, GO, NT> > BDP;
45 if (MyState.BDP_ == Teuchos::null) {
46 BDP = Teuchos::rcp(
new Tpetra::Ext::PointToBlockDiagPermute<ST, LO, GO, NT>(*MAT));
47 BDP->setParameters(
List_);
54 RCP<Tpetra::CrsMatrix<ST, LO, GO, NT> > Hcrs = BDP->createCrsMatrix();
55 return Thyra::tpetraLinearOp<ST, LO, GO, NT>(
56 Thyra::tpetraVectorSpace<ST, LO, GO, NT>(Hcrs->getRangeMap()),
57 Thyra::tpetraVectorSpace<ST, LO, GO, NT>(Hcrs->getDomainMap()), Hcrs);
60 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
61 "DiagonalPreconditionerFactory::buildPreconditionerOperator: "
62 "BlkDiag requested, but operator is not Tpetra-supported.");
65 return getInvDiagonalOp(lo, diagonalType_);