43 #ifndef IFPACK2_HYPRE_DEF_HPP
44 #define IFPACK2_HYPRE_DEF_HPP
46 #include "Ifpack2_Hypre_decl.hpp"
47 #if defined(HAVE_IFPACK2_HYPRE) && defined(HAVE_IFPACK2_MPI)
50 #include "Tpetra_Import.hpp"
54 #include "HYPRE_IJ_mv.h"
55 #include "HYPRE_parcsr_ls.h"
57 #include "_hypre_parcsr_mv.h"
58 #include "_hypre_IJ_mv.h"
59 #include "HYPRE_parcsr_mv.h"
65 using Teuchos::rcpFromRef;
70 template<
class LocalOrdinal,
class Node>
71 Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::
74 IsInitialized_(false),
75 IsComputed_(false), NumInitialize_(0),
86 IsSolverCreated_(false),
87 IsPrecondCreated_(false),
88 SolveOrPrec_(Hypre_Is_Solver),
92 UsePreconditioner_(false),
95 MPI_Comm comm = * (Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(A->getRowMap()->getComm())->getRawMpiComm());
100 if (!A_->getRowMap()->isSameAs(*A_->getRangeMap())) {
101 IFPACK2_CHK_ERRV(-1);
104 if (A_->getRowMap()->isContiguous()) {
105 GloballyContiguousRowMap_ = A_->getRowMap();
106 GloballyContiguousColMap_ = A_->getColMap();
109 if(A_->getDomainMap()->isSameAs(*A_->getRowMap())) {
111 GloballyContiguousColMap_ = MakeContiguousColumnMap(Aconst);
112 GloballyContiguousRowMap_ =
rcp(
new map_type(A_->getRowMap()->getGlobalNumElements(),
113 A_->getRowMap()->getLocalNumElements(), 0, A_->getRowMap()->getComm()));
116 throw std::runtime_error(
"Ifpack_Hypre: Unsupported map configuration: Row/Domain maps do not match");
120 HYPRE_Int ilower = GloballyContiguousRowMap_->getMinGlobalIndex();
121 HYPRE_Int iupper = GloballyContiguousRowMap_->getMaxGlobalIndex();
123 IFPACK2_CHK_ERRV(HYPRE_IJVectorCreate(comm, ilower, iupper, &XHypre_));
124 IFPACK2_CHK_ERRV(HYPRE_IJVectorSetObjectType(XHypre_, HYPRE_PARCSR));
125 IFPACK2_CHK_ERRV(HYPRE_IJVectorInitialize(XHypre_));
126 IFPACK2_CHK_ERRV(HYPRE_IJVectorAssemble(XHypre_));
127 IFPACK2_CHK_ERRV(HYPRE_IJVectorGetObject(XHypre_, (
void**) &ParX_));
128 XVec_ =
Teuchos::rcp((hypre_ParVector *) hypre_IJVectorObject(((hypre_IJVector *) XHypre_)),
false);
131 IFPACK2_CHK_ERRV(HYPRE_IJVectorCreate(comm, ilower, iupper, &YHypre_));
132 IFPACK2_CHK_ERRV(HYPRE_IJVectorSetObjectType(YHypre_, HYPRE_PARCSR));
133 IFPACK2_CHK_ERRV(HYPRE_IJVectorInitialize(YHypre_));
134 IFPACK2_CHK_ERRV(HYPRE_IJVectorAssemble(YHypre_));
135 IFPACK2_CHK_ERRV(HYPRE_IJVectorGetObject(YHypre_, (
void**) &ParY_));
136 YVec_ =
Teuchos::rcp((hypre_ParVector *) hypre_IJVectorObject(((hypre_IJVector *) YHypre_)),
false);
139 VectorCache_.resize(A->getRowMap()->getLocalNumElements());
143 template<
class LocalOrdinal,
class Node>
144 Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::~Hypre() {
149 template<
class LocalOrdinal,
class Node>
150 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Destroy(){
152 IFPACK2_CHK_ERRV(HYPRE_IJMatrixDestroy(HypreA_));
154 IFPACK2_CHK_ERRV(HYPRE_IJVectorDestroy(XHypre_));
155 IFPACK2_CHK_ERRV(HYPRE_IJVectorDestroy(YHypre_));
156 if(IsSolverCreated_){
157 IFPACK2_CHK_ERRV(SolverDestroyPtr_(Solver_));
159 if(IsPrecondCreated_){
160 IFPACK2_CHK_ERRV(PrecondDestroyPtr_(Preconditioner_));
165 IFPACK2_CHK_ERRV(HYPRE_IJMatrixDestroy(HypreG_));
168 IFPACK2_CHK_ERRV(HYPRE_IJVectorDestroy(xHypre_));
171 IFPACK2_CHK_ERRV(HYPRE_IJVectorDestroy(yHypre_));
174 IFPACK2_CHK_ERRV(HYPRE_IJVectorDestroy(zHypre_));
179 template<
class LocalOrdinal,
class Node>
180 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::initialize(){
181 const std::string timerName (
"Ifpack2::Hypre::initialize");
185 if(IsInitialized_)
return;
186 double startTime = timer->
wallTime();
194 InitializeTime_ += (timer->
wallTime() - startTime);
198 template<
class LocalOrdinal,
class Node>
199 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::setParameters(
const Teuchos::ParameterList& list){
201 std::map<std::string, Hypre_Solver> solverMap;
202 solverMap[
"BoomerAMG"] = BoomerAMG;
203 solverMap[
"ParaSails"] = ParaSails;
204 solverMap[
"Euclid"] = Euclid;
205 solverMap[
"AMS"] = AMS;
206 solverMap[
"Hybrid"] = Hybrid;
207 solverMap[
"PCG"] = PCG;
208 solverMap[
"GMRES"] =
GMRES;
209 solverMap[
"FlexGMRES"] = FlexGMRES;
210 solverMap[
"LGMRES"] = LGMRES;
211 solverMap[
"BiCGSTAB"] = BiCGSTAB;
213 std::map<std::string, Hypre_Chooser> chooserMap;
214 chooserMap[
"Solver"] = Hypre_Is_Solver;
215 chooserMap[
"Preconditioner"] = Hypre_Is_Preconditioner;
218 Hypre_Solver solType;
219 if (list.
isType<std::string>(
"hypre: Solver"))
220 solType = solverMap[list.
get<std::string>(
"hypre: Solver")];
222 solType = (Hypre_Solver) list.
get<
int>(
"hypre: Solver");
225 SolverType_ = solType;
226 Hypre_Solver precType;
227 if (list.
isType<std::string>(
"hypre: Preconditioner"))
228 precType = solverMap[list.
get<std::string>(
"hypre: Preconditioner")];
230 precType = (Hypre_Solver) list.
get<
int>(
"hypre: Preconditioner");
233 PrecondType_ = precType;
234 Hypre_Chooser chooser;
235 if (list.
isType<std::string>(
"hypre: SolveOrPrecondition"))
236 chooser = chooserMap[list.
get<std::string>(
"hypre: SolveOrPrecondition")];
237 else if(list.
isParameter(
"hypre: SolveOrPrecondition"))
238 chooser = (Hypre_Chooser) list.
get<
int>(
"hypre: SolveOrPrecondition");
240 chooser = Hypre_Is_Solver;
241 SolveOrPrec_ = chooser;
242 bool SetPrecond = list.
isParameter(
"hypre: SetPreconditioner") ? list.
get<
bool>(
"hypre: SetPreconditioner") :
false;
243 IFPACK2_CHK_ERR(SetParameter(SetPrecond));
244 int NumFunctions = list.
isParameter(
"hypre: NumFunctions") ? list.
get<
int>(
"hypre: NumFunctions") : 0;
247 if(NumFunctions > 0){
248 RCP<FunctionParameter>* params = list.
get<RCP<FunctionParameter>*>(
"hypre: Functions");
249 for(
int i = 0; i < NumFunctions; i++){
250 IFPACK2_CHK_ERR(AddFunToList(params[i]));
254 if (list.
isSublist(
"hypre: Solver functions")) {
256 for (
auto it = solverList.
begin(); it != solverList.
end(); ++it) {
257 std::string funct_name = it->first;
258 if (it->second.isType<HYPRE_Int>()) {
259 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Solver, funct_name , Teuchos::getValue<HYPRE_Int>(it->second)))));
260 }
else if (!std::is_same<HYPRE_Int,int>::value && it->second.isType<
int>()) {
261 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Solver, funct_name , Teuchos::as<HYPRE_Int>(Teuchos::getValue<int>(it->second))))));
262 }
else if (it->second.isType<HYPRE_Real>()) {
263 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Solver, funct_name , Teuchos::getValue<HYPRE_Real>(it->second)))));
270 if (list.
isSublist(
"hypre: Preconditioner functions")) {
272 for (
auto it = precList.
begin(); it != precList.
end(); ++it) {
273 std::string funct_name = it->first;
274 if (it->second.isType<HYPRE_Int>()) {
275 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , Teuchos::getValue<HYPRE_Int>(it->second)))));
276 }
else if (!std::is_same<HYPRE_Int,int>::value && it->second.isType<
int>()) {
277 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , Teuchos::as<HYPRE_Int>(Teuchos::getValue<int>(it->second))))));
278 }
else if (it->second.isType<HYPRE_Real>()) {
279 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , Teuchos::getValue<HYPRE_Real>(it->second)))));
280 }
else if (it->second.isList()) {
282 if (FunctionParameter::isFuncIntInt(funct_name)) {
283 HYPRE_Int arg0 = pl.
get<HYPRE_Int>(
"arg 0");
284 HYPRE_Int arg1 = pl.
get<HYPRE_Int>(
"arg 1");
285 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , arg0, arg1))));
286 }
else if (FunctionParameter::isFuncIntIntDoubleDouble(funct_name)) {
287 HYPRE_Int arg0 = pl.
get<HYPRE_Int>(
"arg 0");
288 HYPRE_Int arg1 = pl.
get<HYPRE_Int>(
"arg 1");
289 HYPRE_Real arg2 = pl.
get<HYPRE_Real>(
"arg 2");
290 HYPRE_Real arg3 = pl.
get<HYPRE_Real>(
"arg 3");
291 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , arg0, arg1, arg2, arg3))));
292 }
else if (FunctionParameter::isFuncIntIntIntDoubleIntInt(funct_name)) {
293 HYPRE_Int arg0 = pl.
get<HYPRE_Int>(
"arg 0");
294 HYPRE_Int arg1 = pl.
get<HYPRE_Int>(
"arg 1");
295 HYPRE_Int arg2 = pl.
get<HYPRE_Int>(
"arg 2");
296 HYPRE_Real arg3 = pl.
get<HYPRE_Real>(
"arg 3");
297 HYPRE_Int arg4 = pl.
get<HYPRE_Int>(
"arg 4");
298 HYPRE_Int arg5 = pl.
get<HYPRE_Int>(
"arg 5");
299 IFPACK2_CHK_ERR(AddFunToList(
rcp(
new FunctionParameter(Hypre_Is_Preconditioner, funct_name , arg0, arg1, arg2, arg3, arg4, arg5))));
312 Dump_ = list.
isParameter(
"hypre: Dump") ? list.
get<
bool>(
"hypre: Dump") :
false;
316 template<
class LocalOrdinal,
class Node>
317 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::AddFunToList(RCP<FunctionParameter> NewFun){
318 NumFunsToCall_ = NumFunsToCall_+1;
319 FunsToCall_.resize(NumFunsToCall_);
320 FunsToCall_[NumFunsToCall_-1] = NewFun;
325 template<
class LocalOrdinal,
class Node>
326 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Int), HYPRE_Int parameter){
327 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter));
328 IFPACK2_CHK_ERR(AddFunToList(temp));
333 template<
class LocalOrdinal,
class Node>
334 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Real), HYPRE_Real parameter){
335 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter));
336 IFPACK2_CHK_ERR(AddFunToList(temp));
341 template<
class LocalOrdinal,
class Node>
342 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Real, HYPRE_Int), HYPRE_Real parameter1, HYPRE_Int parameter2){
343 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter1, parameter2));
344 IFPACK2_CHK_ERR(AddFunToList(temp));
349 template<
class LocalOrdinal,
class Node>
350 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Int, HYPRE_Real), HYPRE_Int parameter1, HYPRE_Real parameter2){
351 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter1, parameter2));
352 IFPACK2_CHK_ERR(AddFunToList(temp));
357 template<
class LocalOrdinal,
class Node>
358 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Int, HYPRE_Int), HYPRE_Int parameter1, HYPRE_Int parameter2){
359 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter1, parameter2));
360 IFPACK2_CHK_ERR(AddFunToList(temp));
365 template<
class LocalOrdinal,
class Node>
366 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Real*), HYPRE_Real* parameter){
367 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter));
368 IFPACK2_CHK_ERR(AddFunToList(temp));
373 template<
class LocalOrdinal,
class Node>
374 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Int*), HYPRE_Int* parameter){
375 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter));
376 IFPACK2_CHK_ERR(AddFunToList(temp));
381 template<
class LocalOrdinal,
class Node>
382 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, HYPRE_Int (*pt2Func)(HYPRE_Solver, HYPRE_Int**), HYPRE_Int** parameter){
383 RCP<FunctionParameter> temp =
rcp(
new FunctionParameter(chooser, pt2Func, parameter));
384 IFPACK2_CHK_ERR(AddFunToList(temp));
389 template<
class LocalOrdinal,
class Node>
390 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetParameter(Hypre_Chooser chooser, Hypre_Solver solver){
391 if(chooser == Hypre_Is_Solver){
392 SolverType_ = solver;
394 PrecondType_ = solver;
400 template<
class LocalOrdinal,
class Node>
402 using LO = local_ordinal_type;
403 using GO = global_ordinal_type;
407 if(!A_->getRowMap()->isSameAs(*G->getRowMap()))
408 throw std::runtime_error(
"Hypre<Tpetra::RowMatrix<double, HYPRE_Int, long long, Node>: Edge map mismatch: A and discrete gradient");
411 GloballyContiguousNodeRowMap_ =
rcp(
new map_type(G->getDomainMap()->getGlobalNumElements(),
412 G->getDomainMap()->getLocalNumElements(), 0, A_->getRowMap()->getComm()));
413 GloballyContiguousNodeColMap_ = MakeContiguousColumnMap(G);
416 MPI_Comm comm = * (Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(A_->getRowMap()->getComm())->getRawMpiComm());
417 GO ilower = GloballyContiguousRowMap_->getMinGlobalIndex();
418 GO iupper = GloballyContiguousRowMap_->getMaxGlobalIndex();
419 GO jlower = GloballyContiguousNodeRowMap_->getMinGlobalIndex();
420 GO jupper = GloballyContiguousNodeRowMap_->getMaxGlobalIndex();
421 IFPACK2_CHK_ERR(HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &HypreG_));
422 IFPACK2_CHK_ERR(HYPRE_IJMatrixSetObjectType(HypreG_, HYPRE_PARCSR));
423 IFPACK2_CHK_ERR(HYPRE_IJMatrixInitialize(HypreG_));
425 std::vector<GO> new_indices(G->getLocalMaxNumRowEntries());
426 for(LO i = 0; i < (LO)G->getLocalNumRows(); i++){
427 typename crs_matrix_type::values_host_view_type values;
428 typename crs_matrix_type::local_inds_host_view_type indices;
429 G->getLocalRowView(i, indices, values);
430 for(LO j = 0; j < (LO) indices.extent(0); j++){
431 new_indices[j] = GloballyContiguousNodeColMap_->getGlobalElement(indices(j));
434 GO numEntries = (GO) indices.extent(0);
435 GlobalRow[0] = GloballyContiguousRowMap_->getGlobalElement(i);
436 IFPACK2_CHK_ERR(HYPRE_IJMatrixSetValues(HypreG_, 1, &numEntries, GlobalRow, new_indices.data(), values.data()));
438 IFPACK2_CHK_ERR(HYPRE_IJMatrixAssemble(HypreG_));
439 IFPACK2_CHK_ERR(HYPRE_IJMatrixGetObject(HypreG_, (
void**)&ParMatrixG_));
442 HYPRE_ParCSRMatrixPrint(ParMatrixG_,
"G.mat");
444 if(SolverType_ == AMS)
445 HYPRE_AMSSetDiscreteGradient(Solver_, ParMatrixG_);
446 if(PrecondType_ == AMS)
447 HYPRE_AMSSetDiscreteGradient(Preconditioner_, ParMatrixG_);
452 template<
class LocalOrdinal,
class Node>
455 if(!G_.is_null() && !G_->getDomainMap()->isSameAs(*coords->getMap()))
456 throw std::runtime_error(
"Hypre<Tpetra::RowMatrix<double, HYPRE_Int, long long, Node>: Node map mismatch: G->DomainMap() and coords");
458 if(SolverType_ != AMS && PrecondType_ != AMS)
461 scalar_type *xPtr = coords->getDataNonConst(0).
getRawPtr();
462 scalar_type *yPtr = coords->getDataNonConst(1).
getRawPtr();
463 scalar_type *zPtr = coords->getDataNonConst(2).
getRawPtr();
465 MPI_Comm comm = * (Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(A_->getRowMap()->getComm())->getRawMpiComm());
466 local_ordinal_type NumEntries = coords->getLocalLength();
467 global_ordinal_type * indices =
const_cast<global_ordinal_type*
>(GloballyContiguousNodeRowMap_->getLocalElementList().getRawPtr());
469 global_ordinal_type ilower = GloballyContiguousNodeRowMap_->getMinGlobalIndex();
470 global_ordinal_type iupper = GloballyContiguousNodeRowMap_->getMaxGlobalIndex();
472 if( NumEntries != iupper-ilower+1) {
473 std::cout<<
"Ifpack2::Hypre::SetCoordinates(): Error on rank "<<A_->getRowMap()->getComm()->getRank()<<
": MyLength = "<<coords->getLocalLength()<<
" GID range = ["<<ilower<<
","<<iupper<<
"]"<<std::endl;
474 throw std::runtime_error(
"Hypre<Tpetra::RowMatrix<double, HYPRE_Int, long long, Node>: SetCoordinates: Length mismatch");
477 IFPACK2_CHK_ERR(HYPRE_IJVectorCreate(comm, ilower, iupper, &xHypre_));
478 IFPACK2_CHK_ERR(HYPRE_IJVectorSetObjectType(xHypre_, HYPRE_PARCSR));
479 IFPACK2_CHK_ERR(HYPRE_IJVectorInitialize(xHypre_));
480 IFPACK2_CHK_ERR(HYPRE_IJVectorSetValues(xHypre_,NumEntries,indices,xPtr));
481 IFPACK2_CHK_ERR(HYPRE_IJVectorAssemble(xHypre_));
482 IFPACK2_CHK_ERR(HYPRE_IJVectorGetObject(xHypre_, (
void**) &xPar_));
484 IFPACK2_CHK_ERR(HYPRE_IJVectorCreate(comm, ilower, iupper, &yHypre_));
485 IFPACK2_CHK_ERR(HYPRE_IJVectorSetObjectType(yHypre_, HYPRE_PARCSR));
486 IFPACK2_CHK_ERR(HYPRE_IJVectorInitialize(yHypre_));
487 IFPACK2_CHK_ERR(HYPRE_IJVectorSetValues(yHypre_,NumEntries,indices,yPtr));
488 IFPACK2_CHK_ERR(HYPRE_IJVectorAssemble(yHypre_));
489 IFPACK2_CHK_ERR(HYPRE_IJVectorGetObject(yHypre_, (
void**) &yPar_));
491 IFPACK2_CHK_ERR(HYPRE_IJVectorCreate(comm, ilower, iupper, &zHypre_));
492 IFPACK2_CHK_ERR(HYPRE_IJVectorSetObjectType(zHypre_, HYPRE_PARCSR));
493 IFPACK2_CHK_ERR(HYPRE_IJVectorInitialize(zHypre_));
494 IFPACK2_CHK_ERR(HYPRE_IJVectorSetValues(zHypre_,NumEntries,indices,zPtr));
495 IFPACK2_CHK_ERR(HYPRE_IJVectorAssemble(zHypre_));
496 IFPACK2_CHK_ERR(HYPRE_IJVectorGetObject(zHypre_, (
void**) &zPar_));
499 HYPRE_ParVectorPrint(xPar_,
"coordX.dat");
500 HYPRE_ParVectorPrint(yPar_,
"coordY.dat");
501 HYPRE_ParVectorPrint(zPar_,
"coordZ.dat");
504 if(SolverType_ == AMS)
505 HYPRE_AMSSetCoordinateVectors(Solver_, xPar_, yPar_, zPar_);
506 if(PrecondType_ == AMS)
507 HYPRE_AMSSetCoordinateVectors(Preconditioner_, xPar_, yPar_, zPar_);
514 template<
class LocalOrdinal,
class Node>
515 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::compute(){
516 const std::string timerName (
"Ifpack2::Hypre::compute");
519 double startTime = timer->
wallTime();
524 if(isInitialized() ==
false){
533 MPI_Comm comm = * (Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(A_->getRowMap()->getComm())->getRawMpiComm());
534 global_ordinal_type ilower = GloballyContiguousRowMap_->getMinGlobalIndex();
535 global_ordinal_type iupper = GloballyContiguousRowMap_->getMaxGlobalIndex();
536 IFPACK2_CHK_ERR(HYPRE_IJMatrixCreate(comm, ilower, iupper, ilower, iupper, &HypreA_));
537 IFPACK2_CHK_ERR(HYPRE_IJMatrixSetObjectType(HypreA_, HYPRE_PARCSR));
538 IFPACK2_CHK_ERR(HYPRE_IJMatrixInitialize(HypreA_));
540 if(SolveOrPrec_ == Hypre_Is_Solver) {
541 IFPACK2_CHK_ERR(SetSolverType(SolverType_));
542 if (SolverPrecondPtr_ != NULL && UsePreconditioner_) {
544 IFPACK2_CHK_ERR(SetPrecondType(PrecondType_));
546 IFPACK2_CHK_ERR(SolverPrecondPtr_(Solver_, PrecondSolvePtr_, PrecondSetupPtr_, Preconditioner_));
551 IFPACK2_CHK_ERR(SetPrecondType(PrecondType_));
556 SetDiscreteGradient(G_);
559 if (!Coords_.is_null()) {
560 SetCoordinates(Coords_);
564 if(SolveOrPrec_ == Hypre_Is_Solver){
565 IFPACK2_CHK_ERR(SolverSetupPtr_(Solver_, ParMatrix_, ParX_, ParY_));
567 IFPACK2_CHK_ERR(PrecondSetupPtr_(Preconditioner_, ParMatrix_, ParX_, ParY_));
574 ComputeTime_ += (timer->
wallTime() - startTime);
578 template<
class LocalOrdinal,
class Node>
579 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::CallFunctions()
const{
580 for(
int i = 0; i < NumFunsToCall_; i++){
581 IFPACK2_CHK_ERR(FunsToCall_[i]->CallFunction(Solver_, Preconditioner_));
587 template<
class LocalOrdinal,
class Node>
588 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::apply (
const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& X,
589 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& Y,
592 scalar_type beta)
const {
593 using LO = local_ordinal_type;
594 using SC = scalar_type;
595 const std::string timerName (
"Ifpack2::Hypre::apply");
598 double startTime = timer->
wallTime();
603 if(isComputed() ==
false){
606 hypre_Vector *XLocal_ = hypre_ParVectorLocalVector(XVec_);
607 hypre_Vector *YLocal_ = hypre_ParVectorLocalVector(YVec_);
608 bool SameVectors =
false;
609 size_t NumVectors = X.getNumVectors();
610 if (NumVectors != Y.getNumVectors()) IFPACK2_CHK_ERR(-1);
619 for(
int VecNum = 0; VecNum < (int) NumVectors; VecNum++) {
622 SC * XValues =
const_cast<SC*
>(X.getData(VecNum).getRawPtr());
625 YValues =
const_cast<SC*
>(Y.getData(VecNum).getRawPtr());
627 YValues = VectorCache_.getRawPtr();
630 SC *XTemp = XLocal_->data;
632 XLocal_->data = XValues;
633 SC *YTemp = YLocal_->data;
634 YLocal_->data = YValues;
636 IFPACK2_CHK_ERR(HYPRE_ParVectorSetConstantValues(ParY_, 0.0));
637 if(SolveOrPrec_ == Hypre_Is_Solver){
639 IFPACK2_CHK_ERR(SolverSolvePtr_(Solver_, ParMatrix_, ParX_, ParY_));
642 IFPACK2_CHK_ERR(PrecondSolvePtr_(Preconditioner_, ParMatrix_, ParX_, ParY_));
647 LO NumEntries = Y.getLocalLength();
648 for(LO i = 0; i < NumEntries; i++)
651 XLocal_->
data = XTemp;
652 YLocal_->data = YTemp;
656 ApplyTime_ += (timer->
wallTime() - startTime);
661 template<
class LocalOrdinal,
class Node>
662 void Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::applyMat (
const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& X,
663 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& Y,
669 template<
class LocalOrdinal,
class Node>
670 std::string Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::description()
const {
671 std::ostringstream out;
676 out <<
"\"Ifpack2::Hypre\": {";
677 out <<
"Initialized: " << (isInitialized () ?
"true" :
"false") <<
", "
678 <<
"Computed: " << (isComputed () ?
"true" :
"false") <<
", ";
681 out <<
"Matrix: null";
684 out <<
"Global matrix dimensions: ["
685 << A_->getGlobalNumRows () <<
", "
686 << A_->getGlobalNumCols () <<
"]"
687 <<
", Global nnz: " << A_->getGlobalNumEntries();
695 template<
class LocalOrdinal,
class Node>
699 os <<
"================================================================================" << endl;
700 os <<
"Ifpack2::Hypre: " << endl << endl;
701 os <<
"Using " << A_->getComm()->getSize() <<
" processors." << endl;
702 os <<
"Global number of rows = " << A_->getGlobalNumRows() << endl;
703 os <<
"Global number of nonzeros = " << A_->getGlobalNumEntries() << endl;
706 os <<
"Phase # calls Total Time (s)"<<endl;
707 os <<
"----- ------- --------------"<<endl;
708 os <<
"Initialize() " << std::setw(5) << NumInitialize_
709 <<
" " << std::setw(15) << InitializeTime_<<endl;
710 os <<
"Compute() " << std::setw(5) << NumCompute_
711 <<
" " << std::setw(15) << ComputeTime_ << endl;
712 os <<
"ApplyInverse() " << std::setw(5) << NumApply_
713 <<
" " << std::setw(15) << ApplyTime_ <<endl;
714 os <<
"================================================================================" << endl;
719 template<
class LocalOrdinal,
class Node>
720 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetSolverType(Hypre_Solver Solver){
723 if(IsSolverCreated_){
724 SolverDestroyPtr_(Solver_);
725 IsSolverCreated_ =
false;
727 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_BoomerAMGCreate;
728 SolverDestroyPtr_ = &HYPRE_BoomerAMGDestroy;
729 SolverSetupPtr_ = &HYPRE_BoomerAMGSetup;
730 SolverPrecondPtr_ = NULL;
731 SolverSolvePtr_ = &HYPRE_BoomerAMGSolve;
734 if(IsSolverCreated_){
735 SolverDestroyPtr_(Solver_);
736 IsSolverCreated_ =
false;
738 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_AMSCreate;
739 SolverDestroyPtr_ = &HYPRE_AMSDestroy;
740 SolverSetupPtr_ = &HYPRE_AMSSetup;
741 SolverSolvePtr_ = &HYPRE_AMSSolve;
742 SolverPrecondPtr_ = NULL;
745 if(IsSolverCreated_){
746 SolverDestroyPtr_(Solver_);
747 IsSolverCreated_ =
false;
749 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRHybridCreate;
750 SolverDestroyPtr_ = &HYPRE_ParCSRHybridDestroy;
751 SolverSetupPtr_ = &HYPRE_ParCSRHybridSetup;
752 SolverSolvePtr_ = &HYPRE_ParCSRHybridSolve;
753 SolverPrecondPtr_ = &HYPRE_ParCSRHybridSetPrecond;
756 if(IsSolverCreated_){
757 SolverDestroyPtr_(Solver_);
758 IsSolverCreated_ =
false;
760 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRPCGCreate;
761 SolverDestroyPtr_ = &HYPRE_ParCSRPCGDestroy;
762 SolverSetupPtr_ = &HYPRE_ParCSRPCGSetup;
763 SolverSolvePtr_ = &HYPRE_ParCSRPCGSolve;
764 SolverPrecondPtr_ = &HYPRE_ParCSRPCGSetPrecond;
767 if(IsSolverCreated_){
768 SolverDestroyPtr_(Solver_);
769 IsSolverCreated_ =
false;
771 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRGMRESCreate;
772 SolverDestroyPtr_ = &HYPRE_ParCSRGMRESDestroy;
773 SolverSetupPtr_ = &HYPRE_ParCSRGMRESSetup;
774 SolverPrecondPtr_ = &HYPRE_ParCSRGMRESSetPrecond;
777 if(IsSolverCreated_){
778 SolverDestroyPtr_(Solver_);
779 IsSolverCreated_ =
false;
781 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRFlexGMRESCreate;
782 SolverDestroyPtr_ = &HYPRE_ParCSRFlexGMRESDestroy;
783 SolverSetupPtr_ = &HYPRE_ParCSRFlexGMRESSetup;
784 SolverSolvePtr_ = &HYPRE_ParCSRFlexGMRESSolve;
785 SolverPrecondPtr_ = &HYPRE_ParCSRFlexGMRESSetPrecond;
788 if(IsSolverCreated_){
789 SolverDestroyPtr_(Solver_);
790 IsSolverCreated_ =
false;
792 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRLGMRESCreate;
793 SolverDestroyPtr_ = &HYPRE_ParCSRLGMRESDestroy;
794 SolverSetupPtr_ = &HYPRE_ParCSRLGMRESSetup;
795 SolverSolvePtr_ = &HYPRE_ParCSRLGMRESSolve;
796 SolverPrecondPtr_ = &HYPRE_ParCSRLGMRESSetPrecond;
799 if(IsSolverCreated_){
800 SolverDestroyPtr_(Solver_);
801 IsSolverCreated_ =
false;
803 SolverCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRBiCGSTABCreate;
804 SolverDestroyPtr_ = &HYPRE_ParCSRBiCGSTABDestroy;
805 SolverSetupPtr_ = &HYPRE_ParCSRBiCGSTABSetup;
806 SolverSolvePtr_ = &HYPRE_ParCSRBiCGSTABSolve;
807 SolverPrecondPtr_ = &HYPRE_ParCSRBiCGSTABSetPrecond;
817 template<
class LocalOrdinal,
class Node>
818 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::SetPrecondType(Hypre_Solver Precond){
821 if(IsPrecondCreated_){
822 PrecondDestroyPtr_(Preconditioner_);
823 IsPrecondCreated_ =
false;
825 PrecondCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_BoomerAMGCreate;
826 PrecondDestroyPtr_ = &HYPRE_BoomerAMGDestroy;
827 PrecondSetupPtr_ = &HYPRE_BoomerAMGSetup;
828 PrecondSolvePtr_ = &HYPRE_BoomerAMGSolve;
831 if(IsPrecondCreated_){
832 PrecondDestroyPtr_(Preconditioner_);
833 IsPrecondCreated_ =
false;
835 PrecondCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParaSailsCreate;
836 PrecondDestroyPtr_ = &HYPRE_ParaSailsDestroy;
837 PrecondSetupPtr_ = &HYPRE_ParaSailsSetup;
838 PrecondSolvePtr_ = &HYPRE_ParaSailsSolve;
841 if(IsPrecondCreated_){
842 PrecondDestroyPtr_(Preconditioner_);
843 IsPrecondCreated_ =
false;
845 PrecondCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_EuclidCreate;
846 PrecondDestroyPtr_ = &HYPRE_EuclidDestroy;
847 PrecondSetupPtr_ = &HYPRE_EuclidSetup;
848 PrecondSolvePtr_ = &HYPRE_EuclidSolve;
851 if(IsPrecondCreated_){
852 PrecondDestroyPtr_(Preconditioner_);
853 IsPrecondCreated_ =
false;
855 PrecondCreatePtr_ = &Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_AMSCreate;
856 PrecondDestroyPtr_ = &HYPRE_AMSDestroy;
857 PrecondSetupPtr_ = &HYPRE_AMSSetup;
858 PrecondSolvePtr_ = &HYPRE_AMSSolve;
869 template<
class LocalOrdinal,
class Node>
870 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::CreateSolver(){
872 HYPRE_ParCSRMatrixGetComm(ParMatrix_, &comm);
873 int ierr = (this->*SolverCreatePtr_)(comm, &Solver_);
874 IsSolverCreated_ =
true;
879 template<
class LocalOrdinal,
class Node>
880 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::CreatePrecond(){
882 HYPRE_ParCSRMatrixGetComm(ParMatrix_, &comm);
883 int ierr = (this->*PrecondCreatePtr_)(comm, &Preconditioner_);
884 IsPrecondCreated_ =
true;
890 template<
class LocalOrdinal,
class Node>
891 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::CopyTpetraToHypre(){
892 using LO = local_ordinal_type;
893 using GO = global_ordinal_type;
898 throw std::runtime_error(
"Hypre<Tpetra::RowMatrix<double, LocalOrdinal, HYPRE_Int, Node>: Unsupported matrix configuration: Tpetra::CrsMatrix required");
900 std::vector<HYPRE_Int> new_indices(Matrix->getLocalMaxNumRowEntries());
901 for(LO i = 0; i < (LO) Matrix->getLocalNumRows(); i++){
902 typename crs_matrix_type::values_host_view_type values;
903 typename crs_matrix_type::local_inds_host_view_type indices;
904 Matrix->getLocalRowView(i, indices, values);
905 for(LO j = 0; j < (LO)indices.extent(0); j++){
906 new_indices[j] = GloballyContiguousColMap_->getGlobalElement(indices(j));
908 HYPRE_Int GlobalRow[1];
909 HYPRE_Int numEntries = (GO) indices.extent(0);
910 GlobalRow[0] = GloballyContiguousRowMap_->getGlobalElement(i);
911 IFPACK2_CHK_ERR(HYPRE_IJMatrixSetValues(HypreA_, 1, &numEntries, GlobalRow, new_indices.data(), values.data()));
913 IFPACK2_CHK_ERR(HYPRE_IJMatrixAssemble(HypreA_));
914 IFPACK2_CHK_ERR(HYPRE_IJMatrixGetObject(HypreA_, (
void**)&ParMatrix_));
916 HYPRE_ParCSRMatrixPrint(ParMatrix_,
"A.mat");
921 template<
class LocalOrdinal,
class Node>
922 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_BoomerAMGCreate(MPI_Comm , HYPRE_Solver *solver)
923 {
return HYPRE_BoomerAMGCreate(solver);}
926 template<
class LocalOrdinal,
class Node>
927 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParaSailsCreate(MPI_Comm comm, HYPRE_Solver *solver)
928 {
return HYPRE_ParaSailsCreate(comm, solver);}
931 template<
class LocalOrdinal,
class Node>
932 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_EuclidCreate(MPI_Comm comm, HYPRE_Solver *solver)
933 {
return HYPRE_EuclidCreate(comm, solver);}
936 template<
class LocalOrdinal,
class Node>
937 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_AMSCreate(MPI_Comm , HYPRE_Solver *solver)
938 {
return HYPRE_AMSCreate(solver);}
941 template<
class LocalOrdinal,
class Node>
942 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRHybridCreate(MPI_Comm , HYPRE_Solver *solver)
943 {
return HYPRE_ParCSRHybridCreate(solver);}
946 template<
class LocalOrdinal,
class Node>
947 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRPCGCreate(MPI_Comm comm, HYPRE_Solver *solver)
948 {
return HYPRE_ParCSRPCGCreate(comm, solver);}
951 template<
class LocalOrdinal,
class Node>
952 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
953 {
return HYPRE_ParCSRGMRESCreate(comm, solver);}
956 template<
class LocalOrdinal,
class Node>
957 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRFlexGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
958 {
return HYPRE_ParCSRFlexGMRESCreate(comm, solver);}
961 template<
class LocalOrdinal,
class Node>
962 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRLGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
963 {
return HYPRE_ParCSRLGMRESCreate(comm, solver);}
966 template<
class LocalOrdinal,
class Node>
967 HYPRE_Int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::Hypre_ParCSRBiCGSTABCreate(MPI_Comm comm, HYPRE_Solver *solver)
968 {
return HYPRE_ParCSRBiCGSTABCreate(comm, solver);}
971 template<
class LocalOrdinal,
class Node>
974 using import_type = Tpetra::Import<local_ordinal_type,global_ordinal_type,node_type>;
975 using go_vector_type = Tpetra::Vector<global_ordinal_type,local_ordinal_type,global_ordinal_type,node_type>;
982 throw std::runtime_error(
"Hypre<Tpetra::RowMatrix<HYPRE_Real, HYPRE_Int, long long, Node>: Unsupported matrix configuration: Tpetra::CrsMatrix required");
983 RCP<const map_type> DomainMap = Matrix->getDomainMap();
984 RCP<const map_type> ColumnMap = Matrix->getColMap();
985 RCP<const import_type> importer = Matrix->getGraph()->getImporter();
987 if(DomainMap->isContiguous() ) {
994 DomainMap->getLocalNumElements(), 0, DomainMap->getComm()));
997 go_vector_type MyGIDsHYPRE(DomainMap,ContiguousDomainMap->getLocalElementList());
1000 go_vector_type ColGIDsHYPRE(ColumnMap);
1001 ColGIDsHYPRE.doImport(MyGIDsHYPRE, *importer, Tpetra::INSERT);
1004 return Teuchos::rcp(
new map_type(ColumnMap->getGlobalNumElements(),ColGIDsHYPRE.getDataNonConst()(),0, ColumnMap->getComm()));
1008 return Teuchos::rcp(
new map_type(ColumnMap->getGlobalNumElements(),ContiguousDomainMap->getLocalElementList(), 0, ColumnMap->getComm()));
1015 template<
class LocalOrdinal,
class Node>
1016 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getNumInitialize()
const {
1017 return NumInitialize_;
1021 template<
class LocalOrdinal,
class Node>
1022 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getNumCompute()
const {
1027 template<
class LocalOrdinal,
class Node>
1028 int Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getNumApply()
const {
1033 template<
class LocalOrdinal,
class Node>
1034 double Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getInitializeTime()
const {
1035 return InitializeTime_;
1039 template<
class LocalOrdinal,
class Node>
1040 double Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getComputeTime()
const {
1041 return ComputeTime_;
1045 template<
class LocalOrdinal,
class Node>
1046 double Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::getApplyTime()
const {
1050 template<
class LocalOrdinal,
class Node>
1052 Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::
1053 getDomainMap ()
const
1057 A.
is_null (), std::runtime_error,
"Ifpack2::Hypre::getDomainMap: The "
1058 "input matrix A is null. Please call setMatrix() with a nonnull input "
1059 "matrix before calling this method.");
1060 return A->getDomainMap ();
1064 template<
class LocalOrdinal,
class Node>
1066 Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::
1067 getRangeMap ()
const
1071 A.
is_null (), std::runtime_error,
"Ifpack2::Hypre::getRangeMap: The "
1072 "input matrix A is null. Please call setMatrix() with a nonnull input "
1073 "matrix before calling this method.");
1074 return A->getRangeMap ();
1078 template<
class LocalOrdinal,
class Node>
1081 if (A.
getRawPtr () != getMatrix().getRawPtr ()) {
1082 IsInitialized_ =
false;
1083 IsComputed_ =
false;
1089 template<
class LocalOrdinal,
class Node>
1091 Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::
1097 template<
class LocalOrdinal,
class Node>
1098 bool Hypre<Tpetra::RowMatrix<HYPRE_Real, LocalOrdinal, HYPRE_Int, Node> >::hasTransposeApply()
const {
1105 #define IFPACK2_HYPRE_INSTANT(S,LO,GO,N) \
1106 template class Ifpack2::Hypre< Tpetra::RowMatrix<S, LO, GO, N> >;
1109 #endif // HAVE_HYPRE && HAVE_MPI
1110 #endif // IFPACK2_HYPRE_DEF_HPP
ConstIterator end() const
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
bool isParameter(const std::string &name) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
bool isSublist(const std::string &name) const
ConstIterator begin() const
bool isType(const std::string &name) const
Uses AztecOO's GMRES.
Definition: Ifpack2_CondestType.hpp:53
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")