00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "EpetraExt_PutBlockMap.h"
00030 #include "Epetra_Comm.h"
00031 #include "Epetra_BlockMap.h"
00032 #include "Epetra_Map.h"
00033 #include "Epetra_IntVector.h"
00034 #include "Epetra_IntSerialDenseVector.h"
00035 #include "Epetra_Import.h"
00036
00037 using namespace Matlab;
00038 namespace Matlab {
00039
00040 int CopyBlockMap(mxArray* matlabA, const Epetra_BlockMap& map) {
00041
00042 int valueCount = 0;
00043 const Epetra_Comm & comm = map.Comm();
00044 int numProc = comm.NumProc();
00045 bool doSizes = !map.ConstantElementSize();
00046
00047 if (numProc==1) {
00048 int * myElements = map.MyGlobalElements();
00049 int * elementSizeList = 0;
00050 if (doSizes) elementSizeList = map.ElementSizeList();
00051 return(DoCopyBlockMap(matlabA, valueCount, map.NumGlobalElements(), myElements, elementSizeList, doSizes));
00052 }
00053
00054 int numRows = map.NumMyElements();
00055
00056 Epetra_Map allGidsMap(-1, numRows, 0,comm);
00057
00058 Epetra_IntVector allGids(allGidsMap);
00059 for (int i=0; i<numRows; i++) allGids[i] = map.GID(i);
00060
00061 Epetra_IntVector allSizes(allGidsMap);
00062 for (int i=0; i<numRows; i++) allSizes[i] = map.ElementSize(i);
00063
00064
00065 int numChunks = numProc;
00066 int stripSize = allGids.GlobalLength()/numChunks;
00067 int remainder = allGids.GlobalLength()%numChunks;
00068 int curStart = 0;
00069 int curStripSize = 0;
00070 Epetra_IntSerialDenseVector importGidList;
00071 Epetra_IntSerialDenseVector importSizeList;
00072 int numImportGids = 0;
00073 if (comm.MyPID()==0) {
00074 importGidList.Size(stripSize+1);
00075 if (doSizes) importSizeList.Size(stripSize+1);
00076 }
00077 for (int i=0; i<numChunks; i++) {
00078 if (comm.MyPID()==0) {
00079 curStripSize = stripSize;
00080 if (i<remainder) curStripSize++;
00081 for (int j=0; j<curStripSize; j++) importGidList[j] = j + curStart;
00082 curStart += curStripSize;
00083 }
00084
00085 Epetra_Map importGidMap(-1, curStripSize, importGidList.Values(), 0, comm);
00086 Epetra_Import gidImporter(importGidMap, allGidsMap);
00087
00088 Epetra_IntVector importGids(importGidMap);
00089 if (importGids.Import(allGids, gidImporter, Insert)) return(-1);
00090 Epetra_IntVector importSizes(importGidMap);
00091 if (doSizes) if (importSizes.Import(allSizes, gidImporter, Insert)) return(-1);
00092
00093
00094
00095
00096 int * myElements = importGids.Values();
00097 int * elementSizeList = 0;
00098 if (doSizes) elementSizeList = importSizes.Values();
00099
00100 if (comm.MyPID()==0) {
00101 DoCopyBlockMap(matlabA, valueCount, importGids.MyLength(), myElements, elementSizeList, doSizes);
00102 }
00103 }
00104 return(0);
00105 }
00106
00107 int DoCopyBlockMap(mxArray* matlabA, int& valueCount, int length, const int * v1, const int * v2, bool doSizes) {
00108
00109 double* matlabAvaluesPtr = mxGetPr(matlabA);
00110 int* matlabAcolumnIndicesPtr = mxGetJc(matlabA);
00111 int* matlabArowIndicesPtr = mxGetIr(matlabA);
00112
00113
00114 matlabAvaluesPtr += valueCount;
00115 matlabArowIndicesPtr += valueCount;
00116 int numGidsDone = valueCount;
00117 if (doSizes) {
00118 numGidsDone /= 2;
00119 }
00120
00121 matlabAcolumnIndicesPtr += numGidsDone;
00122
00123 for (int i=0; i<length; i++) {
00124 *matlabAcolumnIndicesPtr++ = valueCount;
00125 *matlabArowIndicesPtr++ = 0;
00126 *matlabAvaluesPtr++ = v1[i];
00127
00128 if (doSizes) {
00129 *matlabAvaluesPtr++ = v2[i];
00130 valueCount += 2;
00131 *matlabArowIndicesPtr++ = 1;
00132 }
00133 else {
00134 valueCount++;
00135 }
00136 }
00137
00138 return(0);
00139 }
00140 }