43 #ifndef IFPACK2_ILUT_DEF_HPP 
   44 #define IFPACK2_ILUT_DEF_HPP 
   47 #if defined (__clang__) && !defined (__INTEL_COMPILER) 
   48 #pragma clang system_header 
   51 #include "Ifpack2_Heap.hpp" 
   52 #include "Ifpack2_LocalFilter.hpp" 
   53 #include "Ifpack2_LocalSparseTriangularSolver.hpp" 
   54 #include "Ifpack2_Parameters.hpp" 
   55 #include "Ifpack2_Details_getParamTryingTypes.hpp" 
   56 #include "Tpetra_CrsMatrix.hpp" 
   59 #include <type_traits> 
   89     template<
class ScalarType>
 
   91     ilutDefaultDropTolerance () {
 
   93       typedef typename STS::magnitudeType magnitude_type;
 
   97       const magnitude_type oneHalf = STM::one() / (STM::one() + STM::one());
 
  102       return std::min (static_cast<magnitude_type> (1000) * STS::magnitude (STS::eps ()), oneHalf);
 
  109     ilutDefaultDropTolerance<double> () {
 
  116 template <
class MatrixType>
 
  119   Athresh_ (Teuchos::ScalarTraits<magnitude_type>::zero ()),
 
  120   Rthresh_ (Teuchos::ScalarTraits<magnitude_type>::one ()),
 
  121   RelaxValue_ (Teuchos::ScalarTraits<magnitude_type>::zero ()),
 
  123   DropTolerance_ (ilutDefaultDropTolerance<
scalar_type> ()),
 
  124   InitializeTime_ (0.0),
 
  130   IsInitialized_ (false),
 
  136 template<
class MatrixType>
 
  143 template <
class MatrixType>
 
  146   using Details::getParamTryingTypes;
 
  147   const char prefix[] = 
"Ifpack2::ILUT: ";
 
  156   double fillLevel = LevelOfFill_;
 
  158     const std::string paramName (
"fact: ilut level-of-fill");
 
  159     getParamTryingTypes<double, double, float>
 
  160       (fillLevel, params, paramName, prefix);
 
  162       (fillLevel < 1.0, std::runtime_error,
 
  163        "Ifpack2::ILUT: The \"fact: ilut level-of-fill\" parameter must be >= " 
  164        "1.0, but you set it to " << fillLevel << 
".  For ILUT, the fill level " 
  165        "means something different than it does for ILU(k).  ILU(0) produces " 
  166        "factors with the same sparsity structure as the input matrix A. For " 
  167        "ILUT, level-of-fill = 1.0 will produce factors with nonzeros matching " 
  168        "the sparsity structure of A. level-of-fill > 1.0 allows for additional " 
  172   magnitude_type absThresh = Athresh_;
 
  174     const std::string paramName (
"fact: absolute threshold");
 
  175     getParamTryingTypes<magnitude_type, magnitude_type, double>
 
  176       (absThresh, params, paramName, prefix);
 
  179   magnitude_type relThresh = Rthresh_;
 
  181     const std::string paramName (
"fact: relative threshold");
 
  182     getParamTryingTypes<magnitude_type, magnitude_type, double>
 
  183       (relThresh, params, paramName, prefix);
 
  186   magnitude_type relaxValue = RelaxValue_;
 
  188     const std::string paramName (
"fact: relax value");
 
  189     getParamTryingTypes<magnitude_type, magnitude_type, double>
 
  190       (relaxValue, params, paramName, prefix);
 
  193   magnitude_type dropTol = DropTolerance_;
 
  195     const std::string paramName (
"fact: drop tolerance");
 
  196     getParamTryingTypes<magnitude_type, magnitude_type, double>
 
  197       (dropTol, params, paramName, prefix);
 
  201   L_solver_->setParameters(params);
 
  202   U_solver_->setParameters(params);
 
  204   LevelOfFill_ = fillLevel;
 
  205   Athresh_ = absThresh;
 
  206   Rthresh_ = relThresh;
 
  207   RelaxValue_ = relaxValue;
 
  208   DropTolerance_ = dropTol;
 
  212 template <
class MatrixType>
 
  216     A_.is_null (), std::runtime_error, 
"Ifpack2::ILUT::getComm: " 
  217     "The matrix is null.  Please call setMatrix() with a nonnull input " 
  218     "before calling this method.");
 
  219   return A_->getComm ();
 
  223 template <
class MatrixType>
 
  230 template <
class MatrixType>
 
  235     A_.is_null (), std::runtime_error, 
"Ifpack2::ILUT::getDomainMap: " 
  236     "The matrix is null.  Please call setMatrix() with a nonnull input " 
  237     "before calling this method.");
 
  238   return A_->getDomainMap ();
 
  242 template <
class MatrixType>
 
  247     A_.is_null (), std::runtime_error, 
"Ifpack2::ILUT::getRangeMap: " 
  248     "The matrix is null.  Please call setMatrix() with a nonnull input " 
  249     "before calling this method.");
 
  250   return A_->getRangeMap ();
 
  254 template <
class MatrixType>
 
  260 template <
class MatrixType>
 
  262   return NumInitialize_;
 
  266 template <
class MatrixType>
 
  272 template <
class MatrixType>
 
  278 template <
class MatrixType>
 
  280   return InitializeTime_;
 
  284 template<
class MatrixType>
 
  290 template<
class MatrixType>
 
  296 template<
class MatrixType>
 
  299     A_.is_null (), std::runtime_error, 
"Ifpack2::ILUT::getNodeSmootherComplexity: " 
  300     "The input matrix A is null.  Please call setMatrix() with a nonnull " 
  301     "input matrix, then call compute(), before calling this method.");
 
  303   return A_->getNodeNumEntries() + getNodeNumEntries();
 
  307 template<
class MatrixType>
 
  309   return L_->getGlobalNumEntries () + U_->getGlobalNumEntries ();
 
  313 template<
class MatrixType>
 
  315   return L_->getNodeNumEntries () + U_->getNodeNumEntries ();
 
  319 template<
class MatrixType>
 
  325       ! A.
is_null () && A->getComm ()->getSize () == 1 &&
 
  326       A->getNodeNumRows () != A->getNodeNumCols (),
 
  327       std::runtime_error, 
"Ifpack2::ILUT::setMatrix: If A's communicator only " 
  328       "contains one process, then A must be square.  Instead, you provided a " 
  329       "matrix A with " << A->getNodeNumRows () << 
" rows and " 
  330       << A->getNodeNumCols () << 
" columns.");
 
  336     IsInitialized_ = 
false;
 
  338     A_local_ = Teuchos::null;
 
  345     if (! L_solver_.is_null ()) {
 
  346       L_solver_->setMatrix (Teuchos::null);
 
  348     if (! U_solver_.is_null ()) {
 
  349       U_solver_->setMatrix (Teuchos::null);
 
  359 template<
class MatrixType>
 
  368       A_.is_null (), std::runtime_error, 
"Ifpack2::ILUT::initialize: " 
  369       "The matrix to precondition is null.  Please call setMatrix() with a " 
  370       "nonnull input before calling this method.");
 
  373     IsInitialized_ = 
false;
 
  375     A_local_ = Teuchos::null;
 
  379     A_local_ = makeLocalFilter (A_); 
 
  381     IsInitialized_ = 
true;
 
  388 template<
typename ScalarType>
 
  390 scalar_mag (
const ScalarType& s)
 
  396 template<
class MatrixType>
 
  430   if (! isInitialized ()) {
 
  445 #ifdef IFPACK2_WRITE_FACTORS 
  446     std::ofstream ofsL(
"L.tif.mtx", std::ios::out);
 
  447     std::ofstream ofsU(
"U.tif.mtx", std::ios::out);
 
  452     double local_nnz = 
static_cast<double> (A_local_->getNodeNumEntries ());
 
  453     double fill = ((getLevelOfFill () - 1.0) * local_nnz) / (2 * myNumRows);
 
  458     double fill_ceil=std::ceil(fill);
 
  462     size_type fillL = 
static_cast<size_type
>(fill_ceil);
 
  463     size_type fillU = 
static_cast<size_type
>(fill_ceil);
 
  465     Array<scalar_type> InvDiagU (myNumRows, zero);
 
  467     Array<Array<local_ordinal_type> > L_tmp_idx(myNumRows);
 
  468     Array<Array<scalar_type> > L_tmpv(myNumRows);
 
  469     Array<Array<local_ordinal_type> > U_tmp_idx(myNumRows);
 
  470     Array<Array<scalar_type> > U_tmpv(myNumRows);
 
  472     enum { UNUSED, ORIG, FILL };
 
  475     Array<int> pattern(max_col, UNUSED);
 
  476     Array<scalar_type> cur_row(max_col, zero);
 
  477     Array<magnitude_type> unorm(max_col);
 
  478     magnitude_type rownorm;
 
  479     Array<local_ordinal_type> L_cols_heap;
 
  480     Array<local_ordinal_type> U_cols;
 
  481     Array<local_ordinal_type> L_vals_heap;
 
  482     Array<local_ordinal_type> U_vals_heap;
 
  487     greater_indirect<scalar_type,local_ordinal_type> vals_comp(cur_row);
 
  493     ArrayRCP<local_ordinal_type> ColIndicesARCP;
 
  494     ArrayRCP<scalar_type>       ColValuesARCP;
 
  495     if (! A_local_->supportsRowViews ()) {
 
  496       const size_t maxnz = A_local_->getNodeMaxNumRowEntries ();
 
  497       ColIndicesARCP.resize (maxnz);
 
  498       ColValuesARCP.resize (maxnz);
 
  502       ArrayView<const local_ordinal_type> ColIndicesA;
 
  503       ArrayView<const scalar_type> ColValuesA;
 
  506       if (A_local_->supportsRowViews ()) {
 
  507         A_local_->getLocalRowView (row_i, ColIndicesA, ColValuesA);
 
  508         RowNnz = ColIndicesA.size ();
 
  511         A_local_->getLocalRowCopy (row_i, ColIndicesARCP (), ColValuesARCP (), RowNnz);
 
  512         ColIndicesA = ColIndicesARCP (0, RowNnz);
 
  513         ColValuesA = ColValuesARCP (0, RowNnz);
 
  518       U_cols.push_back(row_i);
 
  519       cur_row[row_i] = zero;
 
  520       pattern[row_i] = ORIG;
 
  522       size_type L_cols_heaplen = 0;
 
  523       rownorm = STM::zero ();
 
  524       for (
size_t i = 0; i < RowNnz; ++i) {
 
  525         if (ColIndicesA[i] < myNumRows) {
 
  526           if (ColIndicesA[i] < row_i) {
 
  527             add_to_heap(ColIndicesA[i], L_cols_heap, L_cols_heaplen);
 
  529           else if (ColIndicesA[i] > row_i) {
 
  530             U_cols.push_back(ColIndicesA[i]);
 
  533           cur_row[ColIndicesA[i]] = ColValuesA[i];
 
  534           pattern[ColIndicesA[i]] = ORIG;
 
  535           rownorm += scalar_mag(ColValuesA[i]);
 
  542       const magnitude_type rthresh = getRelativeThreshold();
 
  544       cur_row[row_i] = as<scalar_type> (getAbsoluteThreshold() * IFPACK2_SGN(v)) + rthresh*v;
 
  546       size_type orig_U_len = U_cols.size();
 
  547       RowNnz = L_cols_heap.size() + orig_U_len;
 
  548       rownorm = getDropTolerance() * rownorm/RowNnz;
 
  551       size_type L_vals_heaplen = 0;
 
  552       while (L_cols_heaplen > 0) {
 
  555         scalar_type multiplier = cur_row[row_k] * InvDiagU[row_k];
 
  556         cur_row[row_k] = multiplier;
 
  557         magnitude_type mag_mult = scalar_mag(multiplier);
 
  558         if (mag_mult*unorm[row_k] < rownorm) {
 
  559           pattern[row_k] = UNUSED;
 
  563         if (pattern[row_k] != ORIG) {
 
  564           if (L_vals_heaplen < fillL) {
 
  565             add_to_heap(row_k, L_vals_heap, L_vals_heaplen, vals_comp);
 
  567           else if (L_vals_heaplen==0 ||
 
  568                    mag_mult < scalar_mag(cur_row[L_vals_heap.front()])) {
 
  569             pattern[row_k] = UNUSED;
 
  574             pattern[L_vals_heap.front()] = UNUSED;
 
  576             add_to_heap(row_k, L_vals_heap, L_vals_heaplen, vals_comp);
 
  582         ArrayView<local_ordinal_type> ColIndicesU = U_tmp_idx[row_k]();
 
  583         ArrayView<scalar_type> ColValuesU = U_tmpv[row_k]();
 
  584         size_type ColNnzU = ColIndicesU.size();
 
  586         for(size_type j=0; j<ColNnzU; ++j) {
 
  587           if (ColIndicesU[j] > row_k) {
 
  590             if (pattern[col_j] != UNUSED) {
 
  591               cur_row[col_j] -= tmp;
 
  593             else if (scalar_mag(tmp) > rownorm) {
 
  594               cur_row[col_j] = -tmp;
 
  595               pattern[col_j] = FILL;
 
  597                 U_cols.push_back(col_j);
 
  613       for (size_type i = 0; i < ColIndicesA.size (); ++i) {
 
  614         if (ColIndicesA[i] < row_i) {
 
  615           L_tmp_idx[row_i].push_back(ColIndicesA[i]);
 
  616           L_tmpv[row_i].push_back(cur_row[ColIndicesA[i]]);
 
  617           pattern[ColIndicesA[i]] = UNUSED;
 
  622       for (size_type j = 0; j < L_vals_heaplen; ++j) {
 
  623         L_tmp_idx[row_i].push_back(L_vals_heap[j]);
 
  624         L_tmpv[row_i].push_back(cur_row[L_vals_heap[j]]);
 
  625         pattern[L_vals_heap[j]] = UNUSED;
 
  633 #ifdef IFPACK2_WRITE_FACTORS 
  634       for (size_type ii = 0; ii < L_tmp_idx[row_i].size (); ++ii) {
 
  635         ofsL << row_i << 
" " << L_tmp_idx[row_i][ii] << 
" "  
  636                              << L_tmpv[row_i][ii] << std::endl;
 
  642       if (cur_row[row_i] == zero) {
 
  643         std::cerr << 
"Ifpack2::ILUT::Compute: zero pivot encountered! " 
  644                   << 
"Replacing with rownorm and continuing..." 
  645                   << 
"(You may need to set the parameter " 
  646                   << 
"'fact: absolute threshold'.)" << std::endl;
 
  647         cur_row[row_i] = rownorm;
 
  649       InvDiagU[row_i] = one / cur_row[row_i];
 
  652       U_tmp_idx[row_i].push_back(row_i);
 
  653       U_tmpv[row_i].push_back(cur_row[row_i]);
 
  654       unorm[row_i] = scalar_mag(cur_row[row_i]);
 
  655       pattern[row_i] = UNUSED;
 
  661       size_type U_vals_heaplen = 0;
 
  662       for(size_type j=1; j<U_cols.size(); ++j) {
 
  664         if (pattern[col] != ORIG) {
 
  665           if (U_vals_heaplen < fillU) {
 
  666             add_to_heap(col, U_vals_heap, U_vals_heaplen, vals_comp);
 
  668           else if (U_vals_heaplen!=0 && scalar_mag(cur_row[col]) >
 
  669                    scalar_mag(cur_row[U_vals_heap.front()])) {
 
  671             add_to_heap(col, U_vals_heap, U_vals_heaplen, vals_comp);
 
  675           U_tmp_idx[row_i].push_back(col);
 
  676           U_tmpv[row_i].push_back(cur_row[col]);
 
  677           unorm[row_i] += scalar_mag(cur_row[col]);
 
  679         pattern[col] = UNUSED;
 
  682       for(size_type j=0; j<U_vals_heaplen; ++j) {
 
  683         U_tmp_idx[row_i].push_back(U_vals_heap[j]);
 
  684         U_tmpv[row_i].push_back(cur_row[U_vals_heap[j]]);
 
  685         unorm[row_i] += scalar_mag(cur_row[U_vals_heap[j]]);
 
  688       unorm[row_i] /= (orig_U_len + U_vals_heaplen);
 
  690 #ifdef IFPACK2_WRITE_FACTORS 
  691       for(
int ii=0; ii<U_tmp_idx[row_i].size(); ++ii) {
 
  692         ofsU <<row_i<< 
" " <<U_tmp_idx[row_i][ii]<< 
" "  
  693                            <<U_tmpv[row_i][ii]<< std::endl;
 
  704     Array<size_t> nnzPerRow(myNumRows);
 
  707       nnzPerRow[row_i] = L_tmp_idx[row_i].size();
 
  711                                    nnzPerRow(), Tpetra::StaticProfile));
 
  714       L_->insertLocalValues (row_i, L_tmp_idx[row_i](), L_tmpv[row_i]());
 
  720       nnzPerRow[row_i] = U_tmp_idx[row_i].size();
 
  724                                    nnzPerRow(), Tpetra::StaticProfile));
 
  727       U_->insertLocalValues (row_i, U_tmp_idx[row_i](), U_tmpv[row_i]());
 
  732     L_solver_->setMatrix(L_);
 
  733     L_solver_->initialize ();
 
  734     L_solver_->compute ();
 
  736     U_solver_->setMatrix(U_);
 
  737     U_solver_->initialize ();
 
  738     U_solver_->compute ();
 
  746 template <
class MatrixType>
 
  748 apply (
const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
 
  749        Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
 
  756   using Teuchos::rcpFromRef;
 
  760     ! isComputed (), std::runtime_error,
 
  761     "Ifpack2::ILUT::apply: You must call compute() to compute the incomplete " 
  762     "factorization, before calling apply().");
 
  765     X.getNumVectors() != Y.getNumVectors(), std::runtime_error,
 
  766     "Ifpack2::ILUT::apply: X and Y must have the same number of columns.  " 
  767     "X has " << X.getNumVectors () << 
" columns, but Y has " 
  768     << Y.getNumVectors () << 
" columns.");
 
  777     if (alpha == one && beta == zero) {
 
  780         L_solver_->apply (X, Y, mode);
 
  783         U_solver_->apply (Y, Y, mode);
 
  788         U_solver_->apply (X, Y, mode);
 
  791         L_solver_->apply (Y, Y, mode);
 
  805         MV Y_tmp (Y.getMap (), Y.getNumVectors ());
 
  806         apply (X, Y_tmp, mode);
 
  807         Y.update (alpha, Y_tmp, beta);
 
  817 template <
class MatrixType>
 
  820   std::ostringstream os;
 
  825   os << 
"\"Ifpack2::ILUT\": {";
 
  826   os << 
"Initialized: " << (isInitialized () ? 
"true" : 
"false") << 
", " 
  827      << 
"Computed: " << (isComputed () ? 
"true" : 
"false") << 
", ";
 
  829   os << 
"Level-of-fill: " << getLevelOfFill() << 
", " 
  830      << 
"absolute threshold: " << getAbsoluteThreshold() << 
", " 
  831      << 
"relative threshold: " << getRelativeThreshold() << 
", " 
  832      << 
"relaxation value: " << getRelaxValue() << 
", ";
 
  835     os << 
"Matrix: null";
 
  838     os << 
"Global matrix dimensions: [" 
  839        << A_->getGlobalNumRows () << 
", " << A_->getGlobalNumCols () << 
"]" 
  840        << 
", Global nnz: " << A_->getGlobalNumEntries();
 
  848 template <
class MatrixType>
 
  871     out << 
"\"Ifpack2::ILUT\":" << endl;
 
  873     out << 
"MatrixType: " << TypeNameTraits<MatrixType>::name () << endl;
 
  874     if (this->getObjectLabel () != 
"") {
 
  875       out << 
"Label: \"" << this->getObjectLabel () << 
"\"" << endl;
 
  877     out << 
"Initialized: " << (isInitialized () ? 
"true" : 
"false")
 
  879         << 
"Computed: " << (isComputed () ? 
"true" : 
"false")
 
  881         << 
"Level of fill: " << getLevelOfFill () << endl
 
  882         << 
"Absolute threshold: " << getAbsoluteThreshold () << endl
 
  883         << 
"Relative threshold: " << getRelativeThreshold () << endl
 
  884         << 
"Relax value: " << getRelaxValue () << endl;
 
  887       const double fillFraction =
 
  888         (double) getGlobalNumEntries () / (double) A_->getGlobalNumEntries ();
 
  889       const double nnzToRows =
 
  890         (double) getGlobalNumEntries () / (double) U_->getGlobalNumRows ();
 
  892       out << 
"Dimensions of L: [" << L_->getGlobalNumRows () << 
", " 
  893           << L_->getGlobalNumRows () << 
"]" << endl
 
  894           << 
"Dimensions of U: [" << U_->getGlobalNumRows () << 
", " 
  895           << U_->getGlobalNumRows () << 
"]" << endl
 
  896           << 
"Number of nonzeros in factors: " << getGlobalNumEntries () << endl
 
  897           << 
"Fill fraction of factors over A: " << fillFraction << endl
 
  898           << 
"Ratio of nonzeros to rows: " << nnzToRows << endl;
 
  901     out << 
"Number of initialize calls: " << getNumInitialize () << endl
 
  902         << 
"Number of compute calls: " << getNumCompute () << endl
 
  903         << 
"Number of apply calls: " << getNumApply () << endl
 
  904         << 
"Total time in seconds for initialize: " << getInitializeTime () << endl
 
  905         << 
"Total time in seconds for compute: " << getComputeTime () << endl
 
  906         << 
"Total time in seconds for apply: " << getApplyTime () << endl;
 
  908     out << 
"Local matrix:" << endl;
 
  909     A_local_->describe (out, vl);
 
  913 template <
class MatrixType>
 
  917   if (A->getComm ()->getSize () > 1) {
 
  932 #define IFPACK2_ILUT_INSTANT(S,LO,GO,N) \ 
  933   template class Ifpack2::ILUT< Tpetra::RowMatrix<S, LO, GO, N> >; 
ILUT(const Teuchos::RCP< const row_matrix_type > &A)
Constructor. 
Definition: Ifpack2_ILUT_def.hpp:117
 
bool hasTransposeApply() const 
Whether this object's apply() method can apply the transpose (or conjugate transpose, if applicable). 
Definition: Ifpack2_ILUT_def.hpp:255
 
basic_OSTab< char > OSTab
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
global_size_t getGlobalNumEntries() const 
Returns the number of nonzero entries in the global graph. 
Definition: Ifpack2_ILUT_def.hpp:308
 
void initialize()
Clear any previously computed factors. 
Definition: Ifpack2_ILUT_def.hpp:360
 
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const 
Print the object with some verbosity level to an FancyOStream object. 
Definition: Ifpack2_ILUT_def.hpp:851
 
std::string description() const 
Return a simple one-line description of this object. 
Definition: Ifpack2_ILUT_def.hpp:818
 
ILUT (incomplete LU factorization with threshold) of a Tpetra sparse matrix. 
Definition: Ifpack2_ILUT_decl.hpp:91
 
size_t getNodeNumEntries() const 
Returns the number of nonzero entries in the local graph. 
Definition: Ifpack2_ILUT_def.hpp:314
 
void rm_heap_root(Teuchos::Array< Ordinal > &heap, SizeType &heap_len)
Definition: Ifpack2_Heap.hpp:92
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
Teuchos::RCP< const map_type > getRangeMap() const 
Tpetra::Map representing the range of this operator. 
Definition: Ifpack2_ILUT_def.hpp:244
 
"Preconditioner" that solves local sparse triangular systems. 
Definition: Ifpack2_LocalSparseTriangularSolver_decl.hpp:77
 
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType. 
Definition: Ifpack2_ILUT_decl.hpp:106
 
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
 
void compute()
Compute factors L and U using the specified diagonal perturbation thresholds and relaxation parameter...
Definition: Ifpack2_ILUT_def.hpp:397
 
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned. 
Definition: Ifpack2_ILUT_def.hpp:320
 
static magnitudeType magnitude(T a)
 
int getNumInitialize() const 
Returns the number of calls to Initialize(). 
Definition: Ifpack2_ILUT_def.hpp:261
 
double getApplyTime() const 
Returns the time spent in apply(). 
Definition: Ifpack2_ILUT_def.hpp:291
 
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const 
Returns the input matrix's communicator. 
Definition: Ifpack2_ILUT_def.hpp:214
 
Tpetra::CrsMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > crs_matrix_type
Type of the Tpetra::CrsMatrix specialization that this class uses for the L and U factors...
Definition: Ifpack2_ILUT_decl.hpp:126
 
TypeTo as(const TypeFrom &t)
 
Teuchos::RCP< const map_type > getDomainMap() const 
Tpetra::Map representing the domain of this operator. 
Definition: Ifpack2_ILUT_def.hpp:232
 
double totalElapsedTime(bool readCurrentTime=false) const 
 
void add_to_heap(const Ordinal &idx, Teuchos::Array< Ordinal > &heap, SizeType &heap_len)
Definition: Ifpack2_Heap.hpp:70
 
size_t getNodeSmootherComplexity() const 
Get a rough estimate of cost per iteration. 
Definition: Ifpack2_ILUT_def.hpp:297
 
Access only local rows and columns of a sparse matrix. 
Definition: Ifpack2_LocalFilter_decl.hpp:160
 
double getInitializeTime() const 
Returns the time spent in Initialize(). 
Definition: Ifpack2_ILUT_def.hpp:279
 
int getNumApply() const 
Returns the number of calls to apply(). 
Definition: Ifpack2_ILUT_def.hpp:273
 
void apply(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const 
Apply the ILUT preconditioner to X, resulting in Y. 
Definition: Ifpack2_ILUT_def.hpp:748
 
double getComputeTime() const 
Returns the time spent in Compute(). 
Definition: Ifpack2_ILUT_def.hpp:285
 
void setParameters(const Teuchos::ParameterList ¶ms)
Set preconditioner parameters. 
Definition: Ifpack2_ILUT_def.hpp:144
 
int getNumCompute() const 
Returns the number of calls to Compute(). 
Definition: Ifpack2_ILUT_def.hpp:267
 
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType. 
Definition: Ifpack2_ILUT_decl.hpp:109
 
Teuchos::RCP< const row_matrix_type > getMatrix() const 
Returns a reference to the matrix to be preconditioned. 
Definition: Ifpack2_ILUT_def.hpp:225