MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_AMGXOperator_def.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // MueLu: A package for multigrid based preconditioning
4 //
5 // Copyright 2012 NTESS and the MueLu contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef MUELU_AMGXOPERATOR_DEF_HPP
11 #define MUELU_AMGXOPERATOR_DEF_HPP
12 
13 #if defined(HAVE_MUELU_AMGX)
15 
16 namespace MueLu {
17 
18 template <class Node>
21  return domainMap_;
22 }
23 
24 template <class Node>
26  return rangeMap_;
27 }
28 
29 template <class Node>
32  Teuchos::ETransp mode, double alpha, double beta) const {
33  RCP<const Teuchos::Comm<int> > comm = Y.getMap()->getComm();
34 
35  ArrayRCP<const double> mueluXdata, amgxXdata;
36  ArrayRCP<double> mueluYdata, amgxYdata;
37 
38  try {
39  for (int i = 0; i < (int)Y.getNumVectors(); i++) {
40  {
41  vectorTimer1_->start();
42 
43  mueluXdata = X.getData(i);
44  mueluYdata = Y.getDataNonConst(i);
45 
46  if (comm->getSize() == 1) {
47  amgxXdata = mueluXdata;
48  amgxYdata = mueluYdata;
49 
50  } else {
51  int n = mueluXdata.size();
52 
53  amgxXdata.resize(n);
54  amgxYdata.resize(n);
55 
56  ArrayRCP<double> amgxXdata_nonConst = Teuchos::arcp_const_cast<double>(amgxXdata);
57  for (int j = 0; j < n; j++) {
58  amgxXdata_nonConst[muelu2amgx_[j]] = mueluXdata[j];
59  amgxYdata[muelu2amgx_[j]] = mueluYdata[j];
60  }
61  }
62 
63  AMGX_vector_upload(X_, N_, 1, &amgxXdata[0]);
64  AMGX_vector_upload(Y_, N_, 1, &amgxYdata[0]);
65 
66  vectorTimer1_->stop();
67  vectorTimer1_->incrementNumCalls();
68  }
69 
70  // Solve the system and time.
71  solverTimer_->start();
72  AMGX_solver_solve(Solver_, X_, Y_);
73  solverTimer_->stop();
74  solverTimer_->incrementNumCalls();
75 
76  {
77  vectorTimer2_->start();
78 
79  AMGX_vector_download(Y_, &amgxYdata[0]);
80 
81  if (comm->getSize() > 1) {
82  int n = mueluYdata.size();
83 
84  for (int j = 0; j < n; j++)
85  mueluYdata[j] = amgxYdata[muelu2amgx_[j]];
86  }
87 
88  vectorTimer2_->stop();
89  vectorTimer2_->incrementNumCalls();
90  }
91  }
92 
93  } catch (std::exception& e) {
94  std::string errMsg = std::string("Caught an exception in MueLu::AMGXOperator::Apply():\n") + e.what() + "\n";
95  throw Exceptions::RuntimeError(errMsg);
96  }
97 }
98 
99 template <class Node>
101  return false;
102 }
103 
104 } // namespace MueLu
105 #endif // if defined(HAVE_MUELU_AMGX)
106 
107 #endif // ifdef MUELU_AMGXOPERATOR_DEF_HPP
size_t getNumVectors() const
Teuchos::RCP< const Map > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
size_type size() const
Teuchos::ArrayRCP< const Scalar > getData(size_t j) const
void resize(const size_type n, const T &val=T())
void apply(const MultiVector &X, MultiVector &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Returns a solution for the linear system AX=Y in the Tpetra::MultiVector X.
Teuchos::ArrayRCP< Scalar > getDataNonConst(size_t j)
Teuchos::RCP< const Map > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
virtual Teuchos::RCP< const map_type > getMap() const
Exception throws to report errors in the internal logical of the program.
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.