// build maps to make other conversions void buildSubMaps(const Epetra_Map & globalMap,const std::vector<int> & vars,const Epetra_Comm & comm, std::vector<std::pair<int,Teuchos::RCP<Epetra_Map> > > & subMaps) { buildSubMaps(globalMap.NumGlobalElements(),globalMap.NumMyElements(),globalMap.MinMyGID(), vars,comm,subMaps); }
int main(int argc, char *argv[]) { // standard Epetra MPI/Serial Comm startup #ifdef EPETRA_MPI MPI_Init(&argc,&argv); Epetra_MpiComm comm (MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif int MyPID = comm.MyPID(); int ierr = 0; bool verbose = (0 == MyPID); bool reportErrors = (0 == MyPID); // setup MatlabEngine if (verbose) cout << "going to startup a matlab process...\n"; EpetraExt::EpetraExt_MatlabEngine engine (comm); if (verbose) cout << "matlab started\n"; // setup an array of doubles to be used for the examples int M = 20; int numGlobalElements = M * comm.NumProc(); int N = 3; int numMyEntries = M * N; double* A = new double[numMyEntries]; double* Aptr = A; int startValue = numMyEntries * MyPID; for(int col=0; col < N; col++) { for(int row=0; row < M; row++) { *Aptr++ = startValue++; } } // setup an array of ints to be used for the examples int* intA = new int[numMyEntries]; int* intAptr = intA; int intStartValue = numMyEntries * MyPID; for(int i=0; i < M*N; i++) { *intAptr++ = intStartValue++; } // construct a map to be used by distributed objects Epetra_Map map (numGlobalElements, 0, comm); // CrsMatrix example // constructs a globally distributed CrsMatrix and then puts it into Matlab if (verbose) cout << " constructing CrsMatrix...\n"; Epetra_CrsMatrix crsMatrix (Copy, map, N); int* indices = new int[N]; for (int col=0; col < N; col++) { indices[col] = col; } double value = startValue; double* values = new double[numMyEntries]; int minMyGID = map.MinMyGID(); for (int row=0; row < M; row++) { for (int col=0; col < N; col++) { values[col] = value++; } crsMatrix.InsertGlobalValues(minMyGID + row, N, values, indices); } crsMatrix.FillComplete(); if (verbose) cout << " CrsMatrix constructed\n"; if (verbose) cout << " putting CrsMatrix into Matlab as CRSM\n"; ierr = engine.PutRowMatrix(crsMatrix, "CRSM", false); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutRowMatrix(crsMatrix, \"CRSM\", false): " << ierr << endl; } // BlockMap example // puts a map into Matlab if (verbose) cout << " putting Map into Matlab as MAP\n"; ierr = engine.PutBlockMap(map, "MAP", false); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutBlockMap(map, \"MAP\", false);: " << ierr << endl; } // MultiVector example // constructs a globally distributed MultiVector and then puts it into Matlab if (verbose) cout << " constructing MultiVector...\n"; Epetra_MultiVector multiVector (Copy, map, A, M, N); if (verbose) cout << " MultiVector constructed\n"; if (verbose) cout << " putting MultiVector into Matlab as MV\n"; ierr = engine.PutMultiVector(multiVector, "MV"); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutMultiVector(multiVector, \"MV\"): " << ierr << endl; } // SerialDenseMatrix example // constructs a SerialDenseMatrix on every PE if (verbose) cout << " constructing a SerialDenseMatrix...\n"; Epetra_SerialDenseMatrix sdMatrix (Copy, A, M, M, N); if (verbose) cout << " SerialDenseMatrix constructed\n"; if (verbose) cout << " putting SerialDenseMatrix from PE0 into Matlab as SDM_PE0\n"; // since the third parameter is left out, the SerialDenseMatrix from PE0 is used by default ierr = engine.PutSerialDenseMatrix(sdMatrix, "SDM_PE0"); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(sdMatrix, \"SDM_PE0\"): " << ierr << endl; } if (comm.NumProc() > 1) { if (verbose) cout << " putting SerialDenseMatrix from PE1 into Matlab as SDM_PE1\n"; // specifying 1 as the third parameter will put the SerialDenseMatrix from PE1 into Matlab ierr = engine.PutSerialDenseMatrix(sdMatrix, "SDM_PE1", 1); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(sdMatrix, \"SDM_PE1\", 1): " << ierr << endl; } } // SerialDenseVector example // constructs a SerialDenseVector on every PE if (verbose) cout << " constructing a SerialDenseVector...\n"; Epetra_SerialDenseVector sdVector (Copy, A, M); if (verbose) cout << " SerialDenseVector constructed\n"; // since the third parameter is left out, the SerialDenseMatrix from PE0 is used by default if (verbose) cout << " putting SerialDenseVector from PE0 into Matlab as SDV_PE0\n"; ierr = engine.PutSerialDenseMatrix(sdVector, "SDV_PE0"); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(sdVector, \"SDV_PE0\"): " << ierr << endl; } if (comm.NumProc() > 1) { if (verbose) cout << " putting SerialDenseVector from PE1 into Matlab as SDV_PE1\n"; // specifying 1 as the third parameter will put the SerialDenseVector from PE1 into Matlab ierr = engine.PutSerialDenseMatrix(sdVector, "SDV_PE1", 1); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(sdMatrix, \"SDV_PE1\", 1): " << ierr << endl; } } // IntSerialDenseMatrix example // constructs a IntSerialDenseMatrix on every PE if (verbose) cout << " constructing a IntSerialDenseMatrix...\n"; Epetra_IntSerialDenseMatrix isdMatrix (Copy, intA, M, M, N); if (verbose) cout << " IntSerialDenseMatrix constructed\n"; // since the third parameter is left out, the IntSerialDenseMatrix from PE0 is used by default if (verbose) cout << " putting IntSerialDenseMatrix from PE0 into Matlab as ISDM_PE0\n"; ierr = engine.PutIntSerialDenseMatrix(isdMatrix, "ISDM_PE0"); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutIntSerialDenseMatrix(isdMatrix, \"ISDM_PE0\"): " << ierr << endl; } if (comm.NumProc() > 1) { if (verbose) cout << " putting IntSerialDenseMatrix from PE1 into Matlab as ISDM_PE1\n"; // specifying 1 as the third parameter will put the IntSerialDenseMatrix from PE1 into Matlab ierr = engine.PutIntSerialDenseMatrix(isdMatrix, "ISDM_PE1", 1); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(isdMatrix, \"ISDM_PE1\", 1): " << ierr << endl; } } // IntSerialDenseVector example // constructs a IntSerialDenseVector on every PE if (verbose) cout << " constructing a IntSerialDenseVector...\n"; Epetra_IntSerialDenseVector isdVector (Copy, intA, M); if (verbose) cout << " IntSerialDenseVector constructed\n"; // since the third parameter is left out, the IntSerialDenseVector from PE0 is used by default if (verbose) cout << " putting IntSerialDenseVector from PE0 into Matlab as ISDV_PE0\n"; ierr = engine.PutIntSerialDenseMatrix(isdVector, "ISDV_PE0"); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutIntSerialDenseMatrix(isdVector, \"ISDV_PE0\"): " << ierr << endl; } if (comm.NumProc() > 1) { if (verbose) cout << " putting IntSerialDenseVector from PE1 into Matlab as ISDV_PE1\n"; // specifying 1 as the third parameter will put the IntSerialDenseVector from PE1 into Matlab ierr = engine.PutIntSerialDenseMatrix(isdVector, "ISDV_PE1", 1); if (ierr) { if (reportErrors) cout << "There was an error in engine.PutSerialDenseMatrix(isdVector, \"ISDV_PE1\", 1): " << ierr << endl; } } // entering a while loop on PE0 will keep the Matlab workspace alive /* if (MyPID == 0) while(1) { // do nothing } */ const int bufSize = 200; char s [bufSize]; const int matlabBufferSize = 1024 * 16; char matlabBuffer [matlabBufferSize]; // send some commands to Matlab and output the result to stdout engine.EvalString("whos", matlabBuffer, matlabBufferSize); if (verbose) cout << matlabBuffer << endl; engine.EvalString("SDV_PE0", matlabBuffer, matlabBufferSize); if (verbose) cout << matlabBuffer << endl; if (comm.NumProc() > 1) { engine.EvalString("SDV_PE1", matlabBuffer, matlabBufferSize); if (verbose) cout << matlabBuffer << endl; } // the following allows user interaction with Matlab if (MyPID == 0) while(1) { // Prompt the user and get a string printf(">> "); if (fgets(s, bufSize, stdin) == NULL) { printf("Bye\n"); break ; } printf ("command :%s:\n", s) ; // send the command to MATLAB // output goes to stdout ierr = engine.EvalString(s, matlabBuffer, matlabBufferSize); if (ierr != 0) { printf("there was an error: %d", ierr); ierr = 0; } else { printf("Matlab Output:\n%s", matlabBuffer); } } if (verbose) cout << endl << " all done\n"; // standard finalizer for Epetra MPI Comms #ifdef EPETRA_MPI MPI_Finalize(); #endif // we need to delete engine because the MatlabEngine finalizer shuts down the Matlab process associated with this example // if we don't delete the Matlab engine, then this example application will not shut down properly delete &engine; return(0); }
int checkmap(Epetra_Map & Map, int NumGlobalElements, int NumMyElements, int *MyGlobalElements, int IndexBase, Epetra_Comm& Comm, bool DistributedGlobal) { int i, ierr=0, forierr = 0; EPETRA_TEST_ERR(!Map.ConstantElementSize(),ierr); EPETRA_TEST_ERR(DistributedGlobal!=Map.DistributedGlobal(),ierr); EPETRA_TEST_ERR(Map.ElementSize()!=1,ierr); int *MyElementSizeList = new int[NumMyElements]; EPETRA_TEST_ERR(Map.ElementSizeList(MyElementSizeList)!=0,ierr); forierr = 0; for (i=0; i<NumMyElements; i++) forierr += MyElementSizeList[i]!=1; EPETRA_TEST_ERR(forierr,ierr); delete [] MyElementSizeList; const Epetra_Comm & Comm1 = Map.Comm(); EPETRA_TEST_ERR(Comm1.NumProc()!=Comm.NumProc(),ierr); EPETRA_TEST_ERR(Comm1.MyPID()!=Comm.MyPID(),ierr); EPETRA_TEST_ERR(Map.IndexBase()!=IndexBase,ierr); EPETRA_TEST_ERR(!Map.LinearMap() && MyGlobalElements==0,ierr); EPETRA_TEST_ERR(Map.LinearMap() && MyGlobalElements!=0,ierr); EPETRA_TEST_ERR(Map.MaxAllGID()!=NumGlobalElements-1+IndexBase,ierr); EPETRA_TEST_ERR(Map.MaxElementSize()!=1,ierr); int MaxLID = Map.MaxLID(); EPETRA_TEST_ERR(MaxLID!=NumMyElements-1,ierr); int MaxMyGID = (Comm.MyPID()+1)*NumMyElements-1+IndexBase; if (Comm.MyPID()>2) MaxMyGID+=3; if (!DistributedGlobal) MaxMyGID = NumMyElements-1+IndexBase; EPETRA_TEST_ERR(Map.MaxMyGID()!=MaxMyGID,ierr); EPETRA_TEST_ERR(Map.MinAllGID()!=IndexBase,ierr); EPETRA_TEST_ERR(Map.MinElementSize()!=1,ierr); EPETRA_TEST_ERR(Map.MinLID()!=0,ierr); int MinMyGID = Comm.MyPID()*NumMyElements+IndexBase; if (Comm.MyPID()>2) MinMyGID+=3; if (!DistributedGlobal) MinMyGID = 0; EPETRA_TEST_ERR(Map.MinMyGID()!=MinMyGID,ierr); int * MyGlobalElements1 = new int[NumMyElements]; EPETRA_TEST_ERR(Map.MyGlobalElements(MyGlobalElements1)!=0,ierr); forierr = 0; if (MyGlobalElements==0) { for (i=0; i<NumMyElements; i++) forierr += MyGlobalElements1[i]!=MinMyGID+i; EPETRA_TEST_ERR(forierr,ierr); } else { for (i=0; i<NumMyElements; i++) forierr += MyGlobalElements[i]!=MyGlobalElements1[i]; EPETRA_TEST_ERR(forierr,ierr); } EPETRA_TEST_ERR(Map.NumGlobalElements()!=NumGlobalElements,ierr); EPETRA_TEST_ERR(Map.NumGlobalPoints()!=NumGlobalElements,ierr); EPETRA_TEST_ERR(Map.NumMyElements()!=NumMyElements,ierr); EPETRA_TEST_ERR(Map.NumMyPoints()!=NumMyElements,ierr); int MaxMyGID2 = Map.GID(Map.LID(MaxMyGID)); EPETRA_TEST_ERR(MaxMyGID2 != MaxMyGID,ierr); int MaxLID2 = Map.LID(Map.GID(MaxLID)); EPETRA_TEST_ERR(MaxLID2 != MaxLID,ierr); EPETRA_TEST_ERR(Map.GID(MaxLID+1) != IndexBase-1,ierr);// MaxLID+1 doesn't exist EPETRA_TEST_ERR(Map.LID(MaxMyGID+1) != -1,ierr);// MaxMyGID+1 doesn't exist or is on a different processor EPETRA_TEST_ERR(!Map.MyGID(MaxMyGID),ierr); EPETRA_TEST_ERR(Map.MyGID(MaxMyGID+1),ierr); EPETRA_TEST_ERR(!Map.MyLID(MaxLID),ierr); EPETRA_TEST_ERR(Map.MyLID(MaxLID+1),ierr); EPETRA_TEST_ERR(!Map.MyGID(Map.GID(MaxLID)),ierr); EPETRA_TEST_ERR(Map.MyGID(Map.GID(MaxLID+1)),ierr); EPETRA_TEST_ERR(!Map.MyLID(Map.LID(MaxMyGID)),ierr); EPETRA_TEST_ERR(Map.MyLID(Map.LID(MaxMyGID+1)),ierr); // Check RemoteIDList function // Get some GIDs off of each processor to test int TotalNumEle, NumElePerProc, NumProc = Comm.NumProc(); int MinNumEleOnProc; int NumMyEle=Map.NumMyElements(); Comm.MinAll(&NumMyEle,&MinNumEleOnProc,1); if (MinNumEleOnProc > 5) NumElePerProc = 6; else NumElePerProc = MinNumEleOnProc; if (NumElePerProc > 0) { TotalNumEle = NumElePerProc*NumProc; int * MyGIDlist = new int[NumElePerProc]; int * GIDlist = new int[TotalNumEle]; int * PIDlist = new int[TotalNumEle]; int * LIDlist = new int[TotalNumEle]; for (i=0; i<NumElePerProc; i++) MyGIDlist[i] = MyGlobalElements1[i]; Comm.GatherAll(MyGIDlist,GIDlist,NumElePerProc);// Get a few values from each proc Map.RemoteIDList(TotalNumEle, GIDlist, PIDlist, LIDlist); int MyPID= Comm.MyPID(); forierr = 0; for (i=0; i<TotalNumEle; i++) { if (Map.MyGID(GIDlist[i])) { forierr += PIDlist[i] != MyPID; forierr += !Map.MyLID(Map.LID(GIDlist[i])) || Map.LID(GIDlist[i]) != LIDlist[i] || Map.GID(LIDlist[i]) != GIDlist[i]; } else { forierr += PIDlist[i] == MyPID; // If MyGID comes back false, the PID listed should be that of another proc } } EPETRA_TEST_ERR(forierr,ierr); delete [] MyGIDlist; delete [] GIDlist; delete [] PIDlist; delete [] LIDlist; } delete [] MyGlobalElements1; // Check RemoteIDList function (assumes all maps are linear, even if not stored that way) if (Map.LinearMap()) { int * GIDList = new int[3]; int * PIDList = new int[3]; int * LIDList = new int[3]; int MyPID = Map.Comm().MyPID(); int NumIDs = 0; //GIDList[NumIDs++] = Map.MaxAllGID()+1; // Should return -1 for both PID and LID if (Map.MinMyGID()-1>=Map.MinAllGID()) GIDList[NumIDs++] = Map.MinMyGID()-1; if (Map.MaxMyGID()+1<=Map.MaxAllGID()) GIDList[NumIDs++] = Map.MaxMyGID()+1; Map.RemoteIDList(NumIDs, GIDList, PIDList, LIDList); NumIDs = 0; //EPETRA_TEST_ERR(!(PIDList[NumIDs]==-1),ierr); //EPETRA_TEST_ERR(!(LIDList[NumIDs++]==-1),ierr); if (Map.MinMyGID()-1>=Map.MinAllGID()) EPETRA_TEST_ERR(!(PIDList[NumIDs++]==MyPID-1),ierr); if (Map.MaxMyGID()+1<=Map.MaxAllGID()) EPETRA_TEST_ERR(!(PIDList[NumIDs]==MyPID+1),ierr); if (Map.MaxMyGID()+1<=Map.MaxAllGID()) EPETRA_TEST_ERR(!(LIDList[NumIDs++]==0),ierr); delete [] GIDList; delete [] PIDList; delete [] LIDList; } return (ierr); }
int MultiVectorTests(const Epetra_Map & Map, int NumVectors, bool verbose) { const Epetra_Comm & Comm = Map.Comm(); int ierr = 0, i, j; /* get number of processors and the name of this processor */ int MyPID = Comm.MyPID(); // Construct FEVbrMatrix if (verbose && MyPID==0) cout << "constructing Epetra_FEVbrMatrix" << endl; // //we'll set up a tri-diagonal matrix. // int numGlobalRows = Map.NumGlobalElements(); int minLocalRow = Map.MinMyGID(); int rowLengths = 3; Epetra_FEVbrMatrix A(Copy, Map, rowLengths); if (verbose && MyPID==0) { cout << "calling A.InsertGlobalValues with 1-D data array"<<endl; } int numCols = 3; int* ptIndices = new int[numCols]; for(int k=0; k<numCols; ++k) { ptIndices[k] = minLocalRow+k; } double* values_1d = new double[numCols*numCols]; for(j=0; j<numCols*numCols; ++j) { values_1d[j] = 3.0; } //For an extreme test, we'll have all processors sum into all rows. int minGID = Map.MinAllGID(); //For now we're going to assume that there's just one point associated with //each GID (element). double* ptCoefs = new double[3]; {for(i=0; i<numGlobalRows; ++i) { if (i>0 && i<numGlobalRows-1) { ptIndices[0] = minGID+i-1; ptIndices[1] = minGID+i; ptIndices[2] = minGID+i+1; ptCoefs[0] = -1.0; ptCoefs[1] = 2.0; ptCoefs[2] = -1.0; numCols = 3; } else if (i == 0) { ptIndices[0] = minGID+i; ptIndices[1] = minGID+i+1; ptIndices[2] = minGID+i+2; ptCoefs[0] = 2.0; ptCoefs[1] = -1.0; ptCoefs[2] = -1.0; numCols = 3; } else { ptIndices[0] = minGID+i-2; ptIndices[1] = minGID+i-1; ptIndices[2] = minGID+i; ptCoefs[0] = -1.0; ptCoefs[1] = -1.0; ptCoefs[2] = 2.0; numCols = 3; } int row = minGID+i; EPETRA_TEST_ERR( A.BeginInsertGlobalValues(row, rowLengths, ptIndices), ierr); for(j=0; j<rowLengths; ++j) { EPETRA_TEST_ERR( A.SubmitBlockEntry(&(ptCoefs[j]), 1, 1, 1), ierr); } EPETRA_TEST_ERR( A.EndSubmitEntries(), ierr); }} if (verbose&&MyPID==0) { cout << "calling A.GlobalAssemble()" << endl; } EPETRA_TEST_ERR( A.GlobalAssemble(), ierr ); if (verbose&&MyPID==0) { cout << "after globalAssemble"<<endl; } if (verbose) { A.Print(cout); } delete [] values_1d; delete [] ptIndices; delete [] ptCoefs; return(ierr); }