43 #ifndef IFPACK_SPARSECONTAINER_H 44 #define IFPACK_SPARSECONTAINER_H 46 #include "Ifpack_Container.h" 47 #include "Epetra_IntSerialDenseVector.h" 48 #include "Epetra_MultiVector.h" 49 #include "Epetra_Vector.h" 50 #include "Epetra_Map.h" 51 #include "Epetra_RowMatrix.h" 52 #include "Epetra_CrsMatrix.h" 53 #include "Epetra_LinearProblem.h" 54 #include "Epetra_IntSerialDenseVector.h" 55 #include "Teuchos_ParameterList.hpp" 56 #include "Teuchos_RefCountPtr.hpp" 58 #include "Epetra_MpiComm.h" 60 #include "Epetra_SerialComm.h" 127 if (NumVectors_ != NumVectors_in)
129 NumVectors_=NumVectors_in;
130 LHS_=Teuchos::rcp(
new Epetra_MultiVector(*Map_,NumVectors_));
131 RHS_=Teuchos::rcp(
new Epetra_MultiVector(*Map_,NumVectors_));
137 virtual double&
LHS(
const int i,
const int Vector = 0);
140 virtual double&
RHS(
const int i,
const int Vector = 0);
152 virtual int&
ID(
const int i);
162 return(IsInitialized_);
177 return(Label_.c_str());
181 Teuchos::RCP<const Epetra_Map>
Map()
const 187 Teuchos::RCP<const Epetra_MultiVector>
LHS()
const 193 Teuchos::RCP<const Epetra_MultiVector>
RHS()
const 199 Teuchos::RCP<const Epetra_CrsMatrix>
Matrix()
const 205 const Epetra_IntSerialDenseVector&
ID()
const 227 virtual int Compute(
const Epetra_RowMatrix& Matrix_in);
244 if (Inverse_ == Teuchos::null)
247 return(Inverse_->InitializeFlops());
253 if (Inverse_ == Teuchos::null)
256 return(Inverse_->ComputeFlops());
268 if (Inverse_ == Teuchos::null)
271 return(Inverse_->ApplyInverseFlops());
275 virtual std::ostream&
Print(std::ostream& os)
const;
280 virtual int Extract(
const Epetra_RowMatrix& Matrix_in);
287 Teuchos::RefCountPtr<Epetra_Map> Map_;
289 Teuchos::RefCountPtr<Epetra_CrsMatrix> Matrix_;
291 Teuchos::RefCountPtr<Epetra_MultiVector> LHS_;
293 Teuchos::RefCountPtr<Epetra_MultiVector> RHS_;
295 Epetra_IntSerialDenseVector GID_;
301 Teuchos::RefCountPtr<Epetra_Comm> SerialComm_;
303 Teuchos::RefCountPtr<T> Inverse_;
306 Teuchos::ParameterList List_;
315 NumRows_(NumRows_in),
316 NumVectors_(NumVectors_in),
317 IsInitialized_(false),
323 SerialComm_ = Teuchos::rcp(
new Epetra_MpiComm(MPI_COMM_SELF) );
325 SerialComm_ = Teuchos::rcp(
new Epetra_SerialComm );
341 SerialComm_ = Teuchos::rcp(
new Epetra_MpiComm(MPI_COMM_SELF) );
343 SerialComm_ = Teuchos::rcp(
new Epetra_SerialComm );
346 if (!rhs.
Map().is_null())
347 Map_ = Teuchos::rcp(
new Epetra_Map(*rhs.
Map()) );
349 if (!rhs.
Matrix().is_null())
350 Matrix_ = Teuchos::rcp(
new Epetra_CrsMatrix(*rhs.
Matrix()) );
352 if (!rhs.
LHS().is_null())
353 LHS_ = Teuchos::rcp(
new Epetra_MultiVector(*rhs.
LHS()) );
355 if (!rhs.
RHS().is_null())
356 RHS_ = Teuchos::rcp(
new Epetra_MultiVector(*rhs.
RHS()) );
381 if (IsInitialized_ ==
true)
384 IsInitialized_ =
false;
386 #if !defined(EPETRA_NO_32BIT_GLOBAL_INDICES) || !defined(EPETRA_NO_64BIT_GLOBAL_INDICES) 387 Map_ = Teuchos::rcp(
new Epetra_Map(NumRows_,0,*SerialComm_) );
390 LHS_ = Teuchos::rcp(
new Epetra_MultiVector(*Map_,NumVectors_) );
391 RHS_ = Teuchos::rcp(
new Epetra_MultiVector(*Map_,NumVectors_) );
392 GID_.Reshape(NumRows_,1);
394 Matrix_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy,*Map_,0) );
397 Inverse_ = Teuchos::rcp(
new T(Matrix_.get()) );
399 if (Inverse_ == Teuchos::null)
402 IFPACK_CHK_ERR(Inverse_->SetParameters(List_));
408 Label_ =
"Ifpack_SparseContainer";
410 IsInitialized_ =
true;
419 return(((*LHS_)(Vector))->Values()[i]);
426 return(((*RHS_)(Vector))->Values()[i]);
437 if ((row < 0) || (row >=
NumRows())) {
441 if ((col < 0) || (col >=
NumRows())) {
445 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 446 if(Matrix_->RowMatrixRowMap().GlobalIndicesInt()) {
447 int ierr = Matrix_->InsertGlobalValues((
int)row,1,(
double*)&value,(
int*)&col);
449 ierr = Matrix_->SumIntoGlobalValues((
int)row,1,(
double*)&value,(
int*)&col);
456 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 457 if(Matrix_->RowMatrixRowMap().GlobalIndicesLongLong()) {
458 long long col_LL = col;
459 int ierr = Matrix_->InsertGlobalValues(row,1,(
double*)&value,&col_LL);
461 ierr = Matrix_->SumIntoGlobalValues(row,1,(
double*)&value,&col_LL);
468 throw "Ifpack_SparseContainer<T>::SetMatrixElement: GlobalIndices type unknown";
485 IFPACK_CHK_ERR(Extract(Matrix_in));
488 IFPACK_CHK_ERR(Inverse_->Initialize());
491 IFPACK_CHK_ERR(Inverse_->Compute());
493 Label_ =
"Ifpack_SparseContainer";
508 IFPACK_CHK_ERR(Matrix_->Apply(*RHS_, *LHS_));
510 ApplyFlops_ += 2 * Matrix_->NumGlobalNonzeros64();
521 IFPACK_CHK_ERR(Inverse_->ApplyInverse(*RHS_, *LHS_));
531 IsInitialized_ =
false;
558 for (
int j = 0 ; j < NumRows_ ; ++j) {
563 if (
ID(j) > Matrix_in.NumMyRows())
567 int Length = Matrix_in.MaxNumEntries();
568 std::vector<double> Values;
569 Values.resize(Length);
570 std::vector<int> Indices;
571 Indices.resize(Length);
573 for (
int j = 0 ; j < NumRows_ ; ++j) {
580 Matrix_in.ExtractMyRowCopy(LRID, Length, NumEntries,
581 &Values[0], &Indices[0]);
582 IFPACK_CHK_ERR(ierr);
584 for (
int k = 0 ; k < NumEntries ; ++k) {
586 int LCID = Indices[k];
589 if (LCID >= Matrix_in.NumMyRows())
596 for (
int kk = 0 ; kk < NumRows_ ; ++kk)
606 IFPACK_CHK_ERR(Matrix_->FillComplete());
617 os <<
"================================================================================" << endl;
618 os <<
"Ifpack_SparseContainer" << endl;
619 os <<
"Number of rows = " <<
NumRows() << endl;
620 os <<
"Number of vectors = " <<
NumVectors() << endl;
622 os <<
"IsComputed() = " <<
IsComputed() << endl;
624 os <<
"Flops in Compute() = " <<
ComputeFlops() << endl;
626 os <<
"================================================================================" << endl;
631 #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 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 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 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.