Hello all,

You might have to forgive me if this is a silly question but I'm having
some trouble understanding how LibMesh initializes MPI.

I have the code:

using namespace std;
namespace mpi = boost::mpi;

int main(int argc, char **argv) {
  mpi::environment env(argc, argv);

  unique_ptr<mpi::communicator> worldComm =
unique_ptr<mpi::communicator>(new mpi::communicator);

  auto libmeshInit = make_shared<libMesh::LibMeshInit>(argc, argv,
MPI_Comm(*worldComm));

  cout << " size: " << worldComm->size() << " rank: " << worldComm->rank()
<< endl;

  return 0;
}

which I expect to have an output like:

 size: 4 rank: 0
 size: 4 rank: 1
 size: 4 rank: 2
 size: 4 rank: 3

However, I am instead seeing the output:

 size: 4 rank: 0

If I comment out the line auto libmeshInit =
make_shared<libMesh::LibMeshInit>(argc, argv, MPI_Comm(*worldComm)); (i.e.,
I do not initalize LibMesh) then I get the output I expected.

Is this behavior expected? or what I am doing wrong?

The problem I am running into is that the mesh is distributed over all four
processes but when I loop over the elements:

 // first element
  libMesh::MeshBase::const_element_iterator el =
mesh.active_local_elements_begin();

  // last element
  const libMesh::MeshBase::const_element_iterator elEnd =
mesh.active_local_elements_end();

  // loop through the elements
  for( ; el!=elEnd; ++el ) { /* DO SOME STUFF */ }

I only "touch" the elements on the rank 0 process.

Thanks for your help,
Andy
------------------------------------------------------------------------------
_______________________________________________
Libmesh-users mailing list
Libmesh-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to