43 #include "Epetra_Comm.h" 44 #include "Epetra_BlockMap.h" 45 #include "Epetra_Map.h" 46 #include "Epetra_IntVector.h" 47 #include "Epetra_IntSerialDenseVector.h" 48 #include "Epetra_Import.h" 56 const Epetra_Comm & comm = map.Comm();
57 int numProc = comm.NumProc();
58 bool doSizes = !map.ConstantElementSize();
61 int * myElements = map.MyGlobalElements();
62 int * elementSizeList = 0;
63 if (doSizes) elementSizeList = map.ElementSizeList();
64 return(
DoCopyBlockMap(matlabA, valueCount, map.NumGlobalElements(), myElements, elementSizeList, doSizes));
67 int numRows = map.NumMyElements();
69 Epetra_Map allGidsMap(-1, numRows, 0,comm);
71 Epetra_IntVector allGids(allGidsMap);
72 for (
int i=0; i<numRows; i++) allGids[i] = map.GID(i);
74 Epetra_IntVector allSizes(allGidsMap);
75 for (
int i=0; i<numRows; i++) allSizes[i] = map.ElementSize(i);
78 int numChunks = numProc;
79 int stripSize = allGids.GlobalLength()/numChunks;
80 int remainder = allGids.GlobalLength()%numChunks;
83 Epetra_IntSerialDenseVector importGidList;
84 Epetra_IntSerialDenseVector importSizeList;
85 int numImportGids = 0;
86 if (comm.MyPID()==0) {
87 importGidList.Size(stripSize+1);
88 if (doSizes) importSizeList.Size(stripSize+1);
90 for (
int i=0; i<numChunks; i++) {
91 if (comm.MyPID()==0) {
92 curStripSize = stripSize;
93 if (i<remainder) curStripSize++;
94 for (
int j=0; j<curStripSize; j++) importGidList[j] = j + curStart;
95 curStart += curStripSize;
98 Epetra_Map importGidMap(-1, curStripSize, importGidList.Values(), 0, comm);
99 Epetra_Import gidImporter(importGidMap, allGidsMap);
101 Epetra_IntVector importGids(importGidMap);
102 if (importGids.Import(allGids, gidImporter, Insert))
return(-1);
103 Epetra_IntVector importSizes(importGidMap);
104 if (doSizes)
if (importSizes.Import(allSizes, gidImporter, Insert))
return(-1);
109 int * myElements = importGids.Values();
110 int * elementSizeList = 0;
111 if (doSizes) elementSizeList = importSizes.Values();
113 if (comm.MyPID()==0) {
114 DoCopyBlockMap(matlabA, valueCount, importGids.MyLength(), myElements, elementSizeList, doSizes);
120 int DoCopyBlockMap(mxArray* matlabA,
int& valueCount,
int length,
const int * v1,
const int * v2,
bool doSizes) {
122 double* matlabAvaluesPtr = mxGetPr(matlabA);
123 int* matlabAcolumnIndicesPtr = mxGetJc(matlabA);
124 int* matlabArowIndicesPtr = mxGetIr(matlabA);
127 matlabAvaluesPtr += valueCount;
128 matlabArowIndicesPtr += valueCount;
129 int numGidsDone = valueCount;
134 matlabAcolumnIndicesPtr += numGidsDone;
136 for (
int i=0; i<length; i++) {
137 *matlabAcolumnIndicesPtr++ = valueCount;
138 *matlabArowIndicesPtr++ = 0;
139 *matlabAvaluesPtr++ = v1[i];
142 *matlabAvaluesPtr++ = v2[i];
144 *matlabArowIndicesPtr++ = 1;
int CopyBlockMap(mxArray *matlabA, const Epetra_BlockMap &map)
int DoCopyBlockMap(mxArray *matlabA, int &valueCount, int length, const int *v1, const int *v2, bool doSizes)