43 #include "Epetra_Comm.h" 44 #include "Epetra_Map.h" 45 #include "Epetra_Vector.h" 46 #include "Epetra_IntVector.h" 47 #include "Epetra_SerialDenseVector.h" 48 #include "Epetra_IntSerialDenseVector.h" 49 #include "Epetra_Import.h" 50 #include "Epetra_RowMatrix.h" 51 #include "Epetra_CrsMatrix.h" 60 Epetra_Map map =
A.RowMatrixRowMap();
61 const Epetra_Comm & comm = map.Comm();
62 int numProc = comm.NumProc();
67 int numRows = map.NumMyElements();
70 Epetra_Map allGidsMap(-1, numRows, 0,comm);
73 Epetra_IntVector allGids(allGidsMap);
74 for (
int i=0; i<numRows; i++) allGids[i] = map.GID(i);
77 int numChunks = numProc;
78 int stripSize = allGids.GlobalLength()/numChunks;
79 int remainder = allGids.GlobalLength()%numChunks;
82 Epetra_IntSerialDenseVector importGidList;
83 int numImportGids = 0;
85 importGidList.Size(stripSize+1);
86 for (
int i=0; i<numChunks; i++) {
87 if (comm.MyPID()==0) {
88 curStripSize = stripSize;
89 if (i<remainder) curStripSize++;
90 for (
int j=0; j<curStripSize; j++) importGidList[j] = j + curStart;
91 curStart += curStripSize;
95 Epetra_Map importGidMap(-1, curStripSize, importGidList.Values(), 0, comm);
97 Epetra_Import gidImporter(importGidMap, allGidsMap);
98 Epetra_IntVector importGids(importGidMap);
99 if (importGids.Import(allGids, gidImporter, Insert))
return(-1);
107 Epetra_Map importMap(-1, importGids.MyLength(), importGids.Values(),
A.RowMatrixRowMap().MinAllGID(), comm);
109 Epetra_Import importer(importMap, map);
110 Epetra_CrsMatrix importA(
Copy, importMap, 0);
111 if (importA.Import(
A, importer, Insert))
return(-1);
112 if (importA.FillComplete())
return(-1);
119 if (
A.RowMatrixRowMap().Comm().MyPID() == 0) {
121 int* matlabAcolumnIndicesPtr = mxGetJc(matlabA);
122 matlabAcolumnIndicesPtr[
A.NumGlobalRows()] = valueCount;
131 int numRows =
A.NumGlobalRows();
133 Epetra_Map rowMap =
A.RowMatrixRowMap();
134 Epetra_Map colMap =
A.RowMatrixColMap();
135 int minAllGID = rowMap.MinAllGID();
137 const Epetra_Comm & comm = rowMap.Comm();
139 if (comm.MyPID()!=0) {
140 if (
A.NumMyRows()!=0) ierr = -1;
141 if (
A.NumMyCols()!=0) ierr = -1;
145 double* matlabAvaluesPtr = mxGetPr(matlabA);
146 int* matlabAcolumnIndicesPtr = mxGetJc(matlabA);
147 int* matlabArowIndicesPtr = mxGetIr(matlabA);
150 matlabAvaluesPtr += valueCount;
151 matlabArowIndicesPtr += valueCount;
153 if (numRows!=
A.NumMyRows()) ierr = -1;
154 Epetra_SerialDenseVector values(
A.MaxNumEntries());
155 Epetra_IntSerialDenseVector indices(
A.MaxNumEntries());
157 for (
int i=0; i<numRows; i++) {
159 int I = rowMap.GID(i);
161 if (
A.ExtractMyRowCopy(i, values.Length(), numEntries,
162 values.Values(), indices.Values()))
return(-1);
163 matlabAcolumnIndicesPtr[I - minAllGID] = valueCount;
164 double* serialValuesPtr = values.Values();
165 for (
int j=0; j<numEntries; j++) {
166 int J = colMap.GID(indices[j]);
167 *matlabAvaluesPtr = *serialValuesPtr++;
168 *matlabArowIndicesPtr = J;
171 matlabArowIndicesPtr++;
195 comm.MinAll(&ierr, &ierrGlobal, 1);
int CopyRowMatrix(mxArray *matlabA, const Epetra_RowMatrix &A)
int DoCopyRowMatrix(mxArray *matlabA, int &valueCount, const Epetra_RowMatrix &A)