43 #ifndef IFPACK_SPARSECONTAINER_H 
   44 #define IFPACK_SPARSECONTAINER_H 
   46 #if defined(Ifpack_SHOW_DEPRECATED_WARNINGS) 
   48 #warning "The Ifpack package is deprecated" 
   52 #include "Ifpack_Container.h" 
   53 #include "Epetra_IntSerialDenseVector.h" 
   54 #include "Epetra_MultiVector.h" 
   55 #include "Epetra_Vector.h" 
   56 #include "Epetra_Map.h" 
   57 #include "Epetra_RowMatrix.h" 
   58 #include "Epetra_CrsMatrix.h" 
   59 #include "Epetra_LinearProblem.h" 
   60 #include "Epetra_IntSerialDenseVector.h" 
   61 #include "Teuchos_ParameterList.hpp" 
   62 #include "Teuchos_RefCountPtr.hpp" 
   64 #include "Epetra_MpiComm.h" 
   66 #include "Epetra_SerialComm.h" 
  133      if (NumVectors_ != NumVectors_in)
 
  135        NumVectors_=NumVectors_in;
 
  143   virtual double& 
LHS(
const int i, 
const int Vector = 0);
 
  146   virtual double& 
RHS(
const int i, 
const int Vector = 0);
 
  158   virtual int& 
ID(
const int i);
 
  168     return(IsInitialized_);
 
  183     return(Label_.c_str());
 
  187   Teuchos::RCP<const Epetra_Map> 
Map()
 const 
  193   Teuchos::RCP<const Epetra_MultiVector> 
LHS()
 const 
  199   Teuchos::RCP<const Epetra_MultiVector> 
RHS()
 const 
  205   Teuchos::RCP<const Epetra_CrsMatrix> 
Matrix()
 const 
  250     if (Inverse_ == Teuchos::null)
 
  253       return(Inverse_->InitializeFlops());
 
  259     if (Inverse_ == Teuchos::null)
 
  262       return(Inverse_->ComputeFlops());
 
  274     if (Inverse_ == Teuchos::null)
 
  277       return(Inverse_->ApplyInverseFlops());
 
  281   virtual std::ostream& 
Print(std::ostream& os) 
const;
 
  293   Teuchos::RefCountPtr<Epetra_Map> Map_;
 
  295   Teuchos::RefCountPtr<Epetra_CrsMatrix> Matrix_;
 
  297   Teuchos::RefCountPtr<Epetra_MultiVector> LHS_;
 
  299   Teuchos::RefCountPtr<Epetra_MultiVector> RHS_;
 
  307   Teuchos::RefCountPtr<Epetra_Comm> SerialComm_;
 
  309   Teuchos::RefCountPtr<T> Inverse_;
 
  312   Teuchos::ParameterList List_;
 
  321   NumRows_(NumRows_in),
 
  322   NumVectors_(NumVectors_in),
 
  323   IsInitialized_(false),
 
  340   NumRows_(rhs.NumRows()),
 
  341   NumVectors_(rhs.NumVectors()),
 
  342   IsInitialized_(rhs.IsInitialized()),
 
  343   IsComputed_(rhs.IsComputed())
 
  352   if (!rhs.
Map().is_null())
 
  355   if (!rhs.
Matrix().is_null())
 
  358   if (!rhs.
LHS().is_null())
 
  361   if (!rhs.
RHS().is_null())
 
  376   if (IsInitialized() == 
false)
 
  387   if (IsInitialized_ == 
true)
 
  390   IsInitialized_ = 
false;
 
  392 #if !defined(EPETRA_NO_32BIT_GLOBAL_INDICES) || !defined(EPETRA_NO_64BIT_GLOBAL_INDICES) 
  393   Map_ = Teuchos::rcp( 
new Epetra_Map(NumRows_,0,*SerialComm_) );
 
  398   GID_.Reshape(NumRows_,1);
 
  400 #if defined(HAVE_TEUCHOSCORE_CXX11) 
  401   Matrix_ = Teuchos::rcp( 
new Epetra_CrsMatrix(Epetra_DataAccess::Copy,*Map_,0) );
 
  407   Inverse_ = Teuchos::rcp( 
new T(Matrix_.get()) );
 
  409   if (Inverse_ == Teuchos::null)
 
  412   IFPACK_CHK_ERR(Inverse_->SetParameters(List_));
 
  418   Label_ = 
"Ifpack_SparseContainer";
 
  420   IsInitialized_ = 
true;
 
  429   return(((*LHS_)(Vector))->Values()[i]);
 
  436   return(((*RHS_)(Vector))->Values()[i]);
 
  444   if (!IsInitialized())
 
  447   if ((row < 0) || (row >= NumRows())) {
 
  451   if ((col < 0) || (col >= NumRows())) {
 
  455 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  456    if(Matrix_->RowMatrixRowMap().GlobalIndicesInt()) {
 
  457      int ierr = Matrix_->InsertGlobalValues((
int)row,1,(
double*)&value,(
int*)&col);
 
  459        ierr = Matrix_->SumIntoGlobalValues((
int)row,1,(
double*)&value,(
int*)&col);
 
  466 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  467    if(Matrix_->RowMatrixRowMap().GlobalIndicesLongLong()) {
 
  468      long long col_LL = col;
 
  469      int ierr = Matrix_->InsertGlobalValues(row,1,(
double*)&value,&col_LL);
 
  471        ierr = Matrix_->SumIntoGlobalValues(row,1,(
double*)&value,&col_LL);
 
  478      throw "Ifpack_SparseContainer<T>::SetMatrixElement: GlobalIndices type unknown";
 
  490   if (!IsInitialized()) {
 
  491     IFPACK_CHK_ERR(Initialize());
 
  495   IFPACK_CHK_ERR(Extract(Matrix_in));
 
  498   IFPACK_CHK_ERR(Inverse_->Initialize());
 
  501   IFPACK_CHK_ERR(Inverse_->Compute());
 
  503   Label_ = 
"Ifpack_SparseContainer";
 
  514   if (IsComputed() == 
false) {
 
  518   IFPACK_CHK_ERR(Matrix_->Apply(*RHS_, *LHS_));
 
  520   ApplyFlops_ += 2 * Matrix_->NumGlobalNonzeros64();
 
  531   IFPACK_CHK_ERR(Inverse_->ApplyInverse(*RHS_, *LHS_));
 
  541   IsInitialized_ = 
false;
 
  568   for (
int j = 0 ; j < NumRows_ ; ++j) {
 
  578   std::vector<double> Values;
 
  579   Values.resize(Length);
 
  580   std::vector<int> Indices;
 
  581   Indices.resize(Length);
 
  583   for (
int j = 0 ; j < NumRows_ ; ++j) {
 
  591                                &Values[0], &Indices[0]);
 
  592     IFPACK_CHK_ERR(ierr);
 
  594     for (
int k = 0 ; k < NumEntries ; ++k) {
 
  596       int LCID = Indices[k];
 
  606       for (
int kk = 0 ; kk < NumRows_ ; ++kk)
 
  611         SetMatrixElement(j,jj,Values[k]);
 
  616   IFPACK_CHK_ERR(Matrix_->FillComplete());
 
  627   os << 
"================================================================================" << endl;
 
  628   os << 
"Ifpack_SparseContainer" << endl;
 
  629   os << 
"Number of rows          = " << NumRows() << endl;
 
  630   os << 
"Number of vectors       = " << NumVectors() << endl;
 
  631   os << 
"IsInitialized()         = " << IsInitialized() << endl;
 
  632   os << 
"IsComputed()            = " << IsComputed() << endl;
 
  633   os << 
"Flops in Initialize()   = " << InitializeFlops() << endl;
 
  634   os << 
"Flops in Compute()      = " << ComputeFlops() << endl;
 
  635   os << 
"Flops in ApplyInverse() = " << ApplyInverseFlops() << endl;
 
  636   os << 
"================================================================================" << endl;
 
  641 #endif // IFPACK_SPARSECONTAINER_H 
virtual double ComputeFlops() const 
Returns the flops in Compute(). 
virtual double InitializeFlops() const 
Returns the flops in Compute(). 
Teuchos::RCP< const Epetra_MultiVector > LHS() const 
Returns a pointer to the internally stored solution multi-vector. 
virtual int NumRows() const 
Returns the number of rows of the matrix and LHS/RHS. 
Ifpack_SparseContainer & operator=(const Ifpack_SparseContainer< T > &rhs)
Operator =. 
Teuchos::RCP< const Epetra_MultiVector > RHS() const 
Returns a pointer to the internally stored rhs multi-vector. 
virtual int SetParameters(Teuchos::ParameterList &List)
Sets all necessary parameters. 
virtual bool IsInitialized() const 
Returns true is the container has been successfully initialized. 
Teuchos::RCP< const Epetra_CrsMatrix > Matrix() const 
Returns a pointer to the internally stored matrix. 
virtual double & LHS(const int i, const int Vector=0)
Returns the i-th component of the vector Vector of LHS. 
virtual int Initialize()
Initializes the container, by completing all the operations based on matrix structure. 
virtual int SetMatrixElement(const int row, const int col, const double value)
Set the matrix element (row,col) to value. 
virtual const char * Label() const 
Returns the label of this container. 
virtual double & RHS(const int i, const int Vector=0)
Returns the i-th component of the vector Vector of RHS. 
Teuchos::RCP< const Epetra_Map > Map() const 
Returns a pointer to the internally stored map. 
virtual int MaxNumEntries() const =0
virtual int NumVectors() const 
Returns the number of vectors in LHS/RHS. 
Ifpack_SparseContainer: a class for storing and solving linear systems using sparse matrices...
virtual int SetNumVectors(const int NumVectors_in)
Sets the number of vectors for LHS/RHS. 
virtual int ApplyInverse()
Apply the inverse of the matrix to RHS, result is stored in LHS. 
Ifpack_SparseContainer(const int NumRows, const int NumVectors=1)
Constructor. 
virtual int NumMyRows() const =0
virtual double ApplyFlops() const 
Returns the flops in Apply(). 
virtual std::ostream & Print(std::ostream &os) const 
Prints basic information on iostream. This function is used by operator<<. 
virtual ~Ifpack_SparseContainer()
Destructor. 
Teuchos::RCP< const T > Inverse() const 
Returns a pointer to the internally stored inverse operator. 
const Epetra_IntSerialDenseVector & ID() const 
Returns a pointer to the internally stored ID's. 
virtual int Destroy()
Destroys all data. 
Ifpack_Container: a pure virtual class for creating and solving local linear problems. 
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const =0
virtual bool IsComputed() const 
Returns true is the container has been successfully computed. 
virtual int Compute(const Epetra_RowMatrix &Matrix_in)
Finalizes the linear system matrix and prepares for the application of the inverse. 
virtual double ApplyInverseFlops() const 
Returns the flops in ApplyInverse(). 
virtual int Apply()
Apply the matrix to RHS, result is stored in LHS.