//========================================================================= // NOTE: This method should be removed and replaced with calls to Epetra_Util_ExtractHbData() int Epetra_LinearProblemRedistor::ExtractHbData(int & M, int & N, int & nz, int * & ptr, int * & ind, double * & val, int & Nrhs, double * & rhs, int & ldrhs, double * & lhs, int & ldlhs) const { Epetra_CrsMatrix * RedistMatrix = dynamic_cast<Epetra_CrsMatrix *>(RedistProblem_->GetMatrix()); if (RedistMatrix==0) EPETRA_CHK_ERR(-1); // This matrix is zero or not an Epetra_CrsMatrix if (!RedistMatrix->IndicesAreContiguous()) { // Data must be contiguous for this to work EPETRA_CHK_ERR(-2); } M = RedistMatrix->NumMyRows(); N = RedistMatrix->NumMyCols(); nz = RedistMatrix->NumMyNonzeros(); val = (*RedistMatrix)[0]; // Dangerous, but cheap and effective way to access first element in const Epetra_CrsGraph & RedistGraph = RedistMatrix->Graph(); ind = RedistGraph[0]; // list of values and indices Epetra_MultiVector * LHS = RedistProblem_->GetLHS(); Epetra_MultiVector * RHS = RedistProblem_->GetRHS(); Nrhs = RHS->NumVectors(); if (Nrhs>1) { if (!RHS->ConstantStride()) {EPETRA_CHK_ERR(-3)}; // Must have strided vectors if (!LHS->ConstantStride()) {EPETRA_CHK_ERR(-4)}; // Must have strided vectors } ldrhs = RHS->Stride(); rhs = (*RHS)[0]; // Dangerous but effective (again) ldlhs = LHS->Stride(); lhs = (*LHS)[0]; // Finally build ptr vector if (ptr_==0) { ptr_ = new int[M+1]; ptr_[0] = 0; for (int i=0; i<M; i++) ptr_[i+1] = ptr_[i] + RedistGraph.NumMyIndices(i); } ptr = ptr_; return(0); }