35using Teuchos::rcpFromRef;
47 : BelosError(what_arg) {}
64 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
65class MueLuOp :
public OperatorT<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
66#ifdef HAVE_XPETRA_TPETRA
68 public OperatorT<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
94 void Apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
96 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
101#ifdef HAVE_MUELU_AMGX
102 if (!
AMGX_.is_null()) {
103 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX = Xpetra::toTpetra(x);
104 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY = Xpetra::toTpetra(y);
106 AMGX_->apply(tX, tY);
114#ifdef HAVE_XPETRA_TPETRA
121 void Apply(
const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
123 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
128#ifdef HAVE_MUELU_AMGX
129 if (!
AMGX_.is_null())
134 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& temp_x =
const_cast<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
>(x);
136 const Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
137 Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY(rcpFromRef(y));
144 RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
Hierarchy_;
145#ifdef HAVE_MUELU_AMGX
146 RCP<MueLu::AMGXOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
AMGX_;
150#ifdef HAVE_XPETRA_EPETRA
151#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
164class MueLuOp<double, int, int,
Xpetra::
EpetraNode> :
public OperatorT<Xpetra::MultiVector<double, int, int, Xpetra::EpetraNode> >
165#ifdef HAVE_XPETRA_TPETRA
167#if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
168 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
170 public OperatorT<Tpetra::MultiVector<double, int, int, Xpetra::EpetraNode> >
173#ifdef HAVE_XPETRA_EPETRA
175 public OperatorT<Epetra_MultiVector>,
176 public Belos::Operator<double>
182 typedef Xpetra::EpetraNode
Node;
187#ifdef HAVE_MUELU_AMGX
193 void Apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
194 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
195 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
200#ifdef HAVE_MUELU_AMGX
201 if (!
AMGX_.is_null()) {
202 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX = Xpetra::toTpetra(x);
203 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY = Xpetra::toTpetra(y);
205 AMGX_->apply(tX, tY);
212#ifdef HAVE_XPETRA_TPETRA
213#if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
214 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
215 void Apply(
const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
216 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
217 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
222#ifdef HAVE_MUELU_AMGX
223 if (!
AMGX_.is_null())
228 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& temp_x =
const_cast<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
>(x);
230 const Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
231 Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY(rcpFromRef(y));
241#ifdef HAVE_XPETRA_EPETRA
249 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
250 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
254 const Xpetra::EpetraMultiVectorT<GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
255 Xpetra::EpetraMultiVectorT<GlobalOrdinal, Node> tY(rcpFromRef(y));
268 void Apply(
const Belos::MultiVec<double>& x, Belos::MultiVec<double>& y, ETrans trans = NOTRANS)
const {
272 TEUCHOS_TEST_FOR_EXCEPTION(vec_x == NULL || vec_y == NULL, MueLuOpFailure,
273 "Belos::MueLuOp::Apply, x and/or y cannot be dynamic cast to an Epetra_MultiVector.");
275 Apply(*vec_x, *vec_y, trans);
280 RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
Hierarchy_;
281#ifdef HAVE_MUELU_AMGX
282 RCP<MueLu::AMGXOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
AMGX_;
288#ifdef HAVE_XPETRA_EPETRA
289#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
302class MueLuOp<double, int, long long,
Xpetra::
EpetraNode> :
public OperatorT<Xpetra::MultiVector<double, int, long long, Xpetra::EpetraNode> >
303#ifdef HAVE_XPETRA_TPETRA
305#if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
306 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
308 public OperatorT<Tpetra::MultiVector<double, int, long long, Xpetra::EpetraNode> >
311#ifdef HAVE_XPETRA_EPETRA
313 public OperatorT<Epetra_MultiVector>,
314 public Belos::Operator<double>
320 typedef Xpetra::EpetraNode
Node;
325#ifdef HAVE_MUELU_AMGX
331 void Apply(
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
332 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
333 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
338#ifdef HAVE_MUELU_AMGX
339 if (!
AMGX_.is_null()) {
340 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX = Xpetra::toTpetra(x);
341 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY = Xpetra::toTpetra(y);
343 AMGX_->apply(tX, tY);
350#ifdef HAVE_XPETRA_TPETRA
351#if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
352 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
353 void Apply(
const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& x, Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& y, ETrans trans = NOTRANS)
const {
354 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
355 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
360#ifdef HAVE_MUELU_AMGX
361 if (!
AMGX_.is_null())
366 Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& temp_x =
const_cast<Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
>(x);
368 const Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
369 Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> tY(rcpFromRef(y));
379#ifdef HAVE_XPETRA_EPETRA
387 TEUCHOS_TEST_FOR_EXCEPTION(trans != NOTRANS, MueLuOpFailure,
388 "Belos::MueLuOp::Apply, transpose mode != NOTRANS not supported by MueLu preconditionners.");
392 const Xpetra::EpetraMultiVectorT<GlobalOrdinal, Node> tX(rcpFromRef(temp_x));
393 Xpetra::EpetraMultiVectorT<GlobalOrdinal, Node> tY(rcpFromRef(y));
406 void Apply(
const Belos::MultiVec<double>& x, Belos::MultiVec<double>& y, ETrans trans = NOTRANS)
const {
410 TEUCHOS_TEST_FOR_EXCEPTION(vec_x == NULL || vec_y == NULL, MueLuOpFailure,
411 "Belos::MueLuOp::Apply, x and/or y cannot be dynamic cast to an Epetra_MultiVector.");
413 Apply(*vec_x, *vec_y, trans);
418 RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
Hierarchy_;
419#ifdef HAVE_MUELU_AMGX
420 RCP<MueLu::AMGXOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
AMGX_;