46 #ifndef MUELU_AMESOS2SMOOTHER_DEF_HPP
47 #define MUELU_AMESOS2SMOOTHER_DEF_HPP
52 #if defined (HAVE_MUELU_TPETRA) && defined(HAVE_MUELU_AMESOS2)
55 #include <Amesos2_config.h>
56 #include <Amesos2.hpp>
60 #include "MueLu_Utilities.hpp"
65 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
67 : type_(type), useTransformation_(false) {
73 std::transform(
type_.begin(), ++
type_.begin(),
type_.begin(), ::toupper);
75 if (
type_ ==
"Superlu_dist")
76 type_ =
"Superludist";
81 if (
type_ ==
"" || Amesos2::query(
type_) ==
false) {
82 std::string oldtype =
type_;
83 #if defined(HAVE_AMESOS2_SUPERLU)
85 #elif defined(HAVE_AMESOS2_KLU2)
87 #elif defined(HAVE_AMESOS2_SUPERLUDIST)
88 type_ =
"Superludist";
89 #elif defined(HAVE_AMESOS2_BASKER)
92 throw Exceptions::RuntimeError(
"Amesos2 has been compiled without SuperLU_DIST, SuperLU, Klu, or Basker. By default, MueLu tries"
93 "to use one of these libraries. Amesos2 must be compiled with one of these solvers, "
94 "or a valid Amesos2 solver has to be specified explicitly.");
97 this->
GetOStream(
Warnings0) <<
"MueLu::Amesos2Smoother: \"" << oldtype <<
"\" is not available. Using \"" <<
type_ <<
"\" instead" << std::endl;
104 "Amesos2 has been compiled without the support of this solver, or the solver name is misspelled.");
107 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
110 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
115 validParamList->
set<
bool>(
"fix nullspace",
false,
"Remove zero eigenvalue by adding rank one correction.");
116 return validParamList;
119 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
123 this->Input(currentLevel,
"A");
124 if (pL.
get<
bool>(
"fix nullspace"))
125 this->Input(currentLevel,
"Nullspace");
128 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
133 this->GetOStream(
Warnings0) <<
"MueLu::Amesos2Smoother::Setup(): Setup() has already been called" << std::endl;
135 RCP<Matrix> A = Factory::Get< RCP<Matrix> >(currentLevel,
"A");
139 if (rowMap->getGlobalNumElements() != as<size_t>((rowMap->getMaxAllGlobalIndex() - rowMap->getMinAllGlobalIndex())+1)) {
148 this->GetOStream(
Runtime1) <<
"MueLu::Amesos2Smoother::Setup(): using system transformation" << std::endl;
151 "MueLu::Amesos2Smoother::Setup Fixing coarse matrix for Amesos2 for multiple processors has not been implemented yet.");
153 "MueLu::Amesos2Smoother::Setup Fixing coarse matrix for Amesos2 when row map is different from column map has not been implemented yet.");
157 "MueLu::Amesos2Smoother::Setup Fixing coarse matrix for Amesos2 when matrix is not a Crs matrix has not been implemented yet.");
159 useTransformation_ =
true;
164 Acrs->getCrsMatrix()->getAllValues(rowPointers, colIndices, values);
167 RCP<Map> map = MapFactory::Build(rowMap->lib(), rowMap->getGlobalNumElements(), 0, rowMap->getComm());
169 RCP<CrsMatrix> newAcrs = rcp_dynamic_cast<CrsMatrixWrap>(newA)->getCrsMatrix();
171 using Teuchos::arcp_const_cast;
172 newAcrs->setAllValues(arcp_const_cast<size_t>(rowPointers), arcp_const_cast<LO>(colIndices), arcp_const_cast<SC>(values));
173 newAcrs->expertStaticFillComplete(map, map);
177 X_ = MultiVectorFactory::Build(map, 1);
178 B_ = MultiVectorFactory::Build(map, 1);
183 if (pL.
get<
bool>(
"fix nullspace")) {
184 this->GetOStream(
Runtime1) <<
"MueLu::Amesos2Smoother::Setup(): fixing nullspace" << std::endl;
186 rowMap = A->getRowMap();
187 size_t M = rowMap->getGlobalNumElements();
189 RCP<MultiVector> Nullspace = Factory::Get< RCP<MultiVector> >(currentLevel,
"Nullspace");
192 "MueLu::Amesos2Smoother::Setup Fixing nullspace for coarse matrix for Amesos2 for nullspace of dim > 1 has not been implemented yet.");
197 if (rowMap->getComm()->getSize() > 1) {
198 this->GetOStream(
Warnings0) <<
"MueLu::Amesos2Smoother::Setup(): Applying nullspace fix on distributed matrix. Try rebalancing to single rank!" << std::endl;
202 for (
size_t k = 0; k<M; k++)
203 elements[k] = Teuchos::as<GO>(k);
205 importer = ImportFactory::Build(rowMap,colMap);
206 NullspaceImp = MultiVectorFactory::Build(colMap, Nullspace->getNumVectors());
209 NullspaceImp = Nullspace;
215 nullspaceRCP = Nullspace->getData(0);
216 nullspace = nullspaceRCP();
217 nullspaceImpRCP = NullspaceImp->getData(0);
218 nullspaceImp = nullspaceImpRCP();
223 "MueLu::Amesos2Smoother::Setup Fixing nullspace for coarse matrix for Amesos2 when matrix is not a Crs matrix has not been implemented yet.");
228 Acrs->getCrsMatrix()->getAllValues(rowPointers, colIndices, values);
234 size_t N = rowMap->getNodeNumElements();
235 newRowPointers_RCP.
resize(N+1);
236 newColIndices_RCP.
resize(N*M);
237 newValues_RCP.
resize(N*M);
243 SC normalization = Nullspace->getVector(0)->norm2();
247 for (
size_t i = 0; i < N; i++) {
248 newRowPointers[i] = i*M;
249 for (
size_t j = 0; j < M; j++) {
250 newColIndices[i*M+j] = Teuchos::as<LO>(j);
254 newRowPointers[N] = N*M;
257 for (
size_t i = 0; i < N; i++) {
258 for (
size_t jj = rowPointers[i]; jj < rowPointers[i+1]; jj++) {
259 LO j = colMap->getLocalElement(A->getColMap()->getGlobalElement(colIndices[jj]));
261 newValues[i*M+j] += v;
266 RCP<CrsMatrix> newAcrs = rcp_dynamic_cast<CrsMatrixWrap>(newA)->getCrsMatrix();
268 using Teuchos::arcp_const_cast;
269 newAcrs->setAllValues(arcp_const_cast<size_t>(newRowPointers_RCP), arcp_const_cast<LO>(newColIndices_RCP), arcp_const_cast<SC>(newValues_RCP));
270 newAcrs->expertStaticFillComplete(A->getDomainMap(), A->getRangeMap(),
271 importer, A->getCrsGraph()->getExporter());
280 prec_ = Amesos2::create<Tpetra_CrsMatrix,Tpetra_MultiVector>(type_, tA);
286 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
291 if (!useTransformation_) {
296 size_t numVectors = X.getNumVectors();
297 size_t length = X.getLocalLength();
300 "MueLu::Amesos2Smoother::Apply: Fixing coarse matrix for Amesos2 for multivectors has not been implemented yet.");
302 ArrayRCP<SC> X_data = X_->getDataNonConst(0), B_data = B_->getDataNonConst(0);
304 for (
size_t i = 0; i < length; i++) {
305 X_data[i] = Xdata[i];
306 B_data[i] = Bdata[i];
318 prec_->setX(Teuchos::null);
319 prec_->setB(Teuchos::null);
321 if (useTransformation_) {
323 size_t length = X.getLocalLength();
328 for (
size_t i = 0; i < length; i++)
329 Xdata[i] = X_data[i];
333 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
341 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
343 std::ostringstream out;
346 out << prec_->description();
350 out <<
"{type = " << type_ <<
"}";
355 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
360 out0 <<
"Prec. type: " << type_ << std::endl;
363 out0 <<
"Parameter list: " << std::endl;
365 out << this->GetParameterList();
368 if ((verbLevel &
External) && prec_ != Teuchos::null) {
370 out << *prec_ << std::endl;
373 if (verbLevel &
Debug)
376 <<
"RCP<prec_>: " << prec_ << std::endl;
379 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
382 return prec_->getStatus().getNnzLU();
389 #endif // HAVE_MUELU_TPETRA && HAVE_MUELU_AMESOS2
390 #endif // MUELU_AMESOS2SMOOTHER_DEF_HPP
Important warning messages (one line)
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
Print external lib objects.
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
std::string type_
amesos2-specific key phrase that denote smoother type
void Apply(MultiVector &X, const MultiVector &B, bool InitialGuessIsZero=false) const
Apply the direct solver. Solves the linear system AX=B using the constructed solver.
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void swap(RCP< T > &r_ptr)
Print additional debugging information.
std::string tolower(const std::string &str)
Amesos2Smoother(const std::string &type="", const Teuchos::ParameterList ¶mList=Teuchos::ParameterList())
Constructor Creates a MueLu interface to the direct solvers in the Amesos2 package. If you are using type=="", then either SuperLU or KLU2 are used by default.
std::string description() const
Return a simple one-line description of this object.
void resize(const size_type n, const T &val=T())
RCP< SmootherPrototype > Copy() const
virtual void SetParameterList(const Teuchos::ParameterList ¶mList)
Set parameters from a parameter list and return with default values.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
Class that encapsulates Amesos2 direct solvers.
static RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > MV2NonConstTpetraMV2(Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &vec)
bool IsSetup() const
Get the state of a smoother prototype.
void DeclareInput(Level ¤tLevel) const
Input.
#define MUELU_DESCRIBE
Helper macro for implementing Describable::describe() for BaseClass objects.
virtual ~Amesos2Smoother()
Destructor.
void Setup(Level ¤tLevel)
Set up the direct solver. This creates the underlying Amesos2 solver object according to the paramete...
Print class parameters (more parameters, more verbose)
Exception throws to report errors in the internal logical of the program.
Description of what is happening (more verbose)
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the object with some verbosity level to an FancyOStream object.
virtual std::string description() const
Return a simple one-line description of this object.
std::string toString(const T &t)