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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users