81 typedef ScalarType
ST;
83 typedef Teuchos::ScalarTraits<ScalarType>
STS;
85 typedef typename STS::magnitudeType
MT;
87 typedef Tpetra::Operator<
typename MV::scalar_type,
88 typename MV::local_ordinal_type,
89 typename MV::global_ordinal_type,
92 typedef Tpetra::RowMatrix<
typename MV::scalar_type,
93 typename MV::local_ordinal_type,
94 typename MV::global_ordinal_type,
97 typedef Tpetra::Vector<
typename MV::scalar_type,
98 typename MV::local_ordinal_type,
99 typename MV::global_ordinal_type,
100 typename MV::node_type>
V;
102 typedef Tpetra::Map<
typename MV::local_ordinal_type,
103 typename MV::global_ordinal_type,
114 Chebyshev (Teuchos::RCP<const row_matrix_type> A);
125 Chebyshev (Teuchos::RCP<const row_matrix_type> A, Teuchos::ParameterList& params);
237 void setZeroStartingSolution (
bool zeroStartingSolution) { zeroStartingSolution_ = zeroStartingSolution; }
292 ST getLambdaMaxForApply()
const;
295 Teuchos::RCP<const row_matrix_type>
getMatrix ()
const;
302 void setMatrix (
const Teuchos::RCP<const row_matrix_type>& A);
308 void print (std::ostream& out);
319 describe (Teuchos::FancyOStream& out,
320 const Teuchos::EVerbosityLevel verbLevel =
321 Teuchos::Describable::verbLevel_default)
const;
333 Teuchos::RCP<const row_matrix_type> A_;
336 Teuchos::RCP<ChebyshevKernel<op_type> > ck_;
348 Teuchos::RCP<const V> D_;
351 typedef Kokkos::View<size_t*, typename MV::node_type::device_type> offsets_type;
358 offsets_type diagOffsets_;
367 bool savedDiagOffsets_;
377 Teuchos::RCP<MV> W2_;
384 ST computedLambdaMax_;
391 ST computedLambdaMin_;
399 ST lambdaMaxForApply_;
410 ST lambdaMinForApply_;
413 ST eigRatioForApply_;
423 Teuchos::RCP<const V> userInvDiag_;
456 bool eigKeepVectors_;
459 std::string eigenAnalysisType_;
462 Teuchos::RCP<V> eigVector_;
463 Teuchos::RCP<V> eigVector2_;
466 int eigNormalizationFreq_;
469 bool zeroStartingSolution_;
477 bool assumeMatrixUnchanged_;
480 std::string chebyshevAlgorithm_;
483 bool computeMaxResNorm_;
486 bool computeSpectralRadius_;
490 bool ckUseNativeSpMV_;
495 Teuchos::RCP<Teuchos::FancyOStream> out_;
505 void checkConstructorInput ()
const;
508 void checkInputMatrix ()
const;
524 Teuchos::RCP<MV> makeTempMultiVector (
const MV& B);
532 Teuchos::RCP<MV> makeSecondTempMultiVector (
const MV& B);
536 firstIterationWithZeroStartingSolution
538 const ScalarType& alpha,
545 computeResidual (MV& R,
const MV& B,
const op_type& A,
const MV& X,
546 const Teuchos::ETransp mode = Teuchos::NO_TRANS);
553 static void solve (MV& Z,
const V& D_inv,
const MV& R);
560 static void solve (MV& Z,
const ST alpha,
const V& D_inv,
const MV& R);
569 Teuchos::RCP<const V>
570 makeInverseDiagonal (
const row_matrix_type& A,
const bool useDiagOffsets=
false)
const;
581 Teuchos::RCP<V> makeRangeMapVector (
const Teuchos::RCP<V>& D)
const;
584 Teuchos::RCP<const V>
585 makeRangeMapVectorConst (
const Teuchos::RCP<const V>& D)
const;
606 textbookApplyImpl (
const op_type& A,
613 const V& D_inv)
const;
637 fourthKindApplyImpl (
const op_type& A,
667 ifpackApplyImpl (
const op_type& A,
689 cgMethodWithInitGuess (
const op_type& A,
const V& D_inv,
const int numIters,
V& x);
701 cgMethod (
const op_type& A,
const V& D_inv,
const int numIters);
704 static MT maxNormInf (
const MV& X);
742 const ST zero = Teuchos::as<ST> (0);
743 const ST one = Teuchos::as<ST> (1);
744 const ST two = Teuchos::as<ST> (2);
746 MV pAux (B.getMap (), B.getNumVectors ());
747 MV dk (B.getMap (), B.getNumVectors ());
748 MV R (B.getMap (), B.getNumVectors ());
750 ST beta = Teuchos::as<ST> (1.1) * lambdaMax;
751 ST alpha = lambdaMax / eigRatio;
753 ST delta = (beta - alpha) / two;
754 ST theta = (beta + alpha) / two;
755 ST s1 = theta / delta;
766 if (lambdaMin == one && lambdaMin == lambdaMax) {
775 if (! zeroStartingSolution_) {
779 R.update (-one, pAux, one);
780 dk.elementWiseMultiply (one/theta, D_inv, R, zero);
781 X.update (one, dk, one);
783 dk.elementWiseMultiply (one/theta, D_inv, B, zero);
787 ST rhokp1, dtemp1, dtemp2;
788 for (
int k = 0; k < numIters-1; ++k) {
790 rhokp1 = one / (two*s1 - rhok);
791 dtemp1 = rhokp1*rhok;
792 dtemp2 = two*rhokp1/delta;
796 R.update (-one, pAux, one);
798 dk.elementWiseMultiply (dtemp2, D_inv, B, dtemp1);
799 X.update (one, dk, one);
Tpetra::Vector< typename MV::scalar_type, typename MV::local_ordinal_type, typename MV::global_ordinal_type, typename MV::node_type > V
Specialization of Tpetra::Vector.
Definition Ifpack2_Details_Chebyshev_decl.hpp:100
Tpetra::RowMatrix< typename MV::scalar_type, typename MV::local_ordinal_type, typename MV::global_ordinal_type, typename MV::node_type > row_matrix_type
Specialization of Tpetra::RowMatrix.
Definition Ifpack2_Details_Chebyshev_decl.hpp:95
Tpetra::Operator< typename MV::scalar_type, typename MV::local_ordinal_type, typename MV::global_ordinal_type, typename MV::node_type > op_type
Specialization of Tpetra::Operator.
Definition Ifpack2_Details_Chebyshev_decl.hpp:90