[Trilinos-Users] Problem inserting non-local data in Epetra_FECrsMatrix
Eric Marttila
eric.marttila at thermoanalytics.com
Wed Feb 15 08:19:35 MST 2012
Dear all,
I've been using Epetra_CrsMatrix to store a linear system, but recently
encountered a situation where I need to fill the entire matrix from the master
process. From reading the Epetra documentation I believe I need to switch to
a EpetraFECrs_Matrix to do this.
I changed my code to use the EpetraFECrs_Matrix, but my call to
InsertGlobalValues() fails on the first row of the matrix that is non-local to
the master process.
I've attached a small section of code that reproduces the behavior. It runs
fine with 1 process, but fails when inserting row index 2 when run with 2
processors.
I would appreciate any thoughts on what I'm missing with my usage of
EpetraFECrs_Matrix.
Thanks.
--Eric
p.s. I'm running Trilinos 10.8.5 on linux x86_64, using mpich2.
--
Eric A. Marttila
ThermoAnalytics, Inc.
23440 Airpark Blvd.
Calumet, MI 49913
email: Eric.Marttila at ThermoAnalytics.com
phone: 810-636-2443
fax: 906-482-9755
web: http://www.thermoanalytics.com
-------------- next part --------------
/*--------------------------------------------------------------------*/
#include "mpi.h"
#include "Epetra_FECrsMatrix.h"
#include "Epetra_Map.h"
#include "Epetra_MpiComm.h"
int main(int argCount, char **argValue)
{
int ierr;
MPI_Init(&argCount,&argValue);
Epetra_MpiComm Comm(MPI_COMM_WORLD);
const int rank = Comm.MyPID();
// Construct a Map
const int nGlobalElements = 4;
Epetra_Map Map(nGlobalElements, 0, Comm);
// Create a matrix
Epetra_FECrsMatrix A(Copy, Map, 1);
// Fill matrix on the master process
if (rank == 0) {
double values[1];
int indices[1];
const int numEntries = 1;
for (int globalRowIdx=0; globalRowIdx<nGlobalElements; ++globalRowIdx) {
indices[0] = globalRowIdx;
values[0] = 3.2;
cerr << "About to insert row " << globalRowIdx << "\n";
ierr = A.InsertGlobalValues(globalRowIdx, numEntries,
&values[0], &indices[0]);
assert(ierr==0);
}
}
// Finish up
ierr = A.GlobalAssemble();
assert(ierr==0);
// Print the matrix
A.Print(cerr);
MPI_Finalize();
return 0;
}
/*--------------------------------------------------------------------*/
More information about the Trilinos-Users
mailing list