19 : matrixGraph_(matrixGraph),
20 sparseRowGraph_(sparseRowGraph),
21 coefs_(sparseRowGraph->packedColumnIndices.size(), 0.0),
38 matrixGraph->createGraph(blockEntry,
true);
46{
return(
"fei::Matrix_Local" ); }
90 if (idx < 0)
return(idx);
100 for(
unsigned i=0; i<
coefs_.size(); ++i)
coefs_[i] = scalar;
109 if (idx < 0)
return(idx);
113 if (length > len) length = len;
115 for(
int i=0; i<length; ++i) {
117 coefs[i] =
coefs_[offset+i];
125 int numCols,
const int* cols,
126 const double*
const* values,
130 if (numRows == 0 || numCols == 0) {
138 const double** myvalues =
const_cast<const double**
>(values);
145 for(
int i=0; i<numRows; ++i) {
148 throw std::runtime_error(
"fei::Matrix_Local::sumIn ERROR, row not found.");
155 double* coefs = &(
coefs_[offset]);
157 for(
int j=0; j<numCols; ++j) {
160 throw std::runtime_error(
"fei::Matrix_Local::sumIn ERROR, col not found.");
164 coefs[idx2] += myvalues[i][j];
167 coefs[idx2] = myvalues[i][j];
178 int numCols,
const int* cols,
179 const double*
const* values,
182 return(
giveToMatrix(numRows, rows, numCols, cols, values,
188 int numCols,
const int* cols,
189 const double*
const* values,
192 return(
giveToMatrix(numRows, rows, numCols, cols, values,
201 const double*
const* data,
207 int fieldSize = (int)rspace->getFieldSize(fieldID);
208 std::vector<int> indices(2*fieldSize);
210 rspace->getGlobalIndex(idType, rowID, fieldID, indices[0]);
211 for(
int i=1; i<fieldSize; ++i) {
212 indices[i] = indices[0]+i;
215 cspace->getGlobalIndex(idType, colID, fieldID, indices[fieldSize]);
216 for(
int i=1; i<fieldSize; ++i) {
217 indices[fieldSize+i] = indices[fieldSize]+i;
220 return(
giveToMatrix(fieldSize, &indices[0], fieldSize, &indices[fieldSize],
221 data,
true, format) );
234 int fieldSize = (int)rspace->getFieldSize(fieldID);
235 std::vector<const double*> data2D(fieldSize);
238 for(
int i=0; i<fieldSize; ++i) {
239 data2D[i] = &data[offset];
244 &data2D[0], format) );
249 const double*
const* values,
253 std::vector<int> indices(numIndices);
256 numIndices, &indices[0], numIndices);
258 return(
giveToMatrix(numIndices, &indices[0], numIndices, &indices[0],
259 values,
true, format) );
288 bool matrixMarketFormat)
292 MPI_Comm comm = vspace->getCommunicator();
297 osstr << filename <<
"." <<
localProc <<
".mtx";
298 std::string fullname = osstr.str();
307 bool matrixMarketFormat)
309 static char mmbanner[] =
"%%MatrixMarket matrix coordinate real general";
315 int numCols = cspace->getEqnNumbers().size();
318 if (matrixMarketFormat) {
320 ostrm << numRows <<
" " << numCols <<
" " << nnz <<
FEI_ENDL;
323 ostrm << numRows <<
" " << numCols <<
" "<<
FEI_ENDL;
334 for(
unsigned i=0; i<rowNumbers.size(); ++i) {
335 int rowlen = rowOffsets[i+1]-rowOffsets[i];
337 for(
int j=0; j<rowlen; ++j) {
338 if (matrixMarketFormat) {
339 ostrm << rowNumbers[i]+1 <<
" " << colIndices[offset]+1
343 ostrm << rowNumbers[i] <<
" " << colIndices[offset]
367const std::vector<int>&
371const std::vector<int>&
375const std::vector<int>&
379const std::vector<double>&
virtual fei::SharedPtr< fei::VectorSpace > getColSpace()=0
virtual fei::SharedPtr< fei::VectorSpace > getRowSpace()=0
virtual int getConnectivityNumIndices(int blockID) const =0
virtual int getConnectivityIndices(int blockID, int connectivityID, int indicesAllocLen, int *indices, int &numIndices)=0
std::vector< double > coefs_
const std::vector< double > & getCoefs() const
int copyIn(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, int format=0)
const std::vector< int > & getRowNumbers() const
fei::SharedPtr< fei::MatrixGraph > matrixGraph_
std::vector< const double * > work_data2D_
Matrix_Local(fei::SharedPtr< fei::MatrixGraph > matrixGraph, fei::SharedPtr< fei::SparseRowGraph > sparseRowGraph)
void setMatrixGraph(fei::SharedPtr< fei::MatrixGraph > matrixGraph)
int gatherFromOverlap(bool accumulate=true)
int sumInFieldData(int fieldID, int idType, int rowID, int colID, const double *const *data, int format=0)
int parameters(const fei::ParameterSet ¶mset)
const std::vector< int > & getRowOffsets() const
std::vector< double > work_data1D_
int getRowIndex(int rowNumber) const
int giveToMatrix(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, bool sumInto, int format)
fei::SharedPtr< fei::SparseRowGraph > sparseRowGraph_
int multiply(fei::Vector *x, fei::Vector *y)
fei::SharedPtr< fei::MatrixGraph > getMatrixGraph() const
int getLocalNumRows() const
static fei::SharedPtr< fei::Matrix > create_Matrix_Local(fei::SharedPtr< fei::MatrixGraph > matrixGraph, bool blockEntry)
int sumIn(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, int format=0)
const std::vector< int > & getColumnIndices() const
int writeToFile(const char *filename, bool matrixMarketFormat=true)
int writeToStream(FEI_OSTREAM &ostrm, bool matrixMarketFormat=true)
bool usingBlockEntryStorage()
int getGlobalNumRows() const
int getRowLength(int row, int &length) const
int copyOutRow(int row, int len, double *coefs, int *indices) const
int putScalar(double scalar)
static void copyTransposeToWorkArrays(int numRows, int numCols, const double *const *values, std::vector< double > &work_1D, std::vector< const double * > &work_2D)
std::vector< int > rowNumbers
std::vector< int > packedColumnIndices
std::vector< int > rowOffsets
#define FEI_OSTRINGSTREAM
int localProc(MPI_Comm comm)
int binarySearch(const T &item, const T *list, int len)