copy<set<int>::const_iterator,int*> (_proc_ids.begin(), _proc_ids.end(), ranks);
for (int i=0; i< (int)_proc_ids.size();i++)
if (ranks[i]>size_world-1)
- throw INTERP_KERNEL::Exception("invalid rank in set<int> argument of MPIProcessorGroup constructor");
+ {
+ delete[] ranks;
+ _comm_interface.groupFree(&group_world); // MPI_Group is a C structure and won't get de-allocated automatically?
+ throw INTERP_KERNEL::Exception("invalid rank in set<int> argument of MPIProcessorGroup constructor");
+ }
_comm_interface.groupIncl(group_world, _proc_ids.size(), ranks, &_group);
_comm_interface.commCreate(_world_comm, _group, &_comm);
+
+ // clean-up
delete[] ranks;
+ _comm_interface.groupFree(&group_world); // MPI_Group is a C structure and won't get de-allocated automatically?
}
/*! Creates a processor group that is based on the processors between \a pstart and \a pend.
_comm_interface.commGroup(_world_comm, &group_world);
if (pend>size_world-1 || pend <pstart || pstart<0)
- throw INTERP_KERNEL::Exception("invalid argument in MPIProcessorGroup constructor (comm,pfirst,plast)");
+ {
+ _comm_interface.groupFree(&group_world);
+ throw INTERP_KERNEL::Exception("invalid argument in MPIProcessorGroup constructor (comm,pfirst,plast)");
+ }
int nprocs=pend-pstart+1;
int* ranks=new int[nprocs];
for (int i=pstart; i<=pend;i++)
_comm_interface.groupIncl(group_world, nprocs, ranks, &_group);
_comm_interface.commCreate(_world_comm, _group, &_comm);
+
+ // clean-up
delete[] ranks;
+ _comm_interface.groupFree(&group_world); // MPI_Group is a C structured and won't get de-allocated automatically?
}
/*!
@}
#ifdef MED_ENABLE_FVM
//can be added again after FVM correction for 2D
// CPPUNIT_TEST(testNonCoincidentDEC_2D);
- CPPUNIT_TEST(testNonCoincidentDEC_3D);
+ CPPUNIT_TEST(testNonCoincidentDEC_3D);
#endif
CPPUNIT_TEST(testStructuredCoincidentDEC);
CPPUNIT_TEST(testStructuredCoincidentDEC);
void ParaMEDMEMTest::testMPIProcessorGroup_constructor()
{
CommInterface comm_interface;
- MPIProcessorGroup* group= new MPIProcessorGroup(comm_interface);
+ MPIProcessorGroup* group;
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+ group= new MPIProcessorGroup(comm_interface);
CPPUNIT_ASSERT_EQUAL(size,group->size());
int size2;
const MPI_Comm* communicator=group->getComm();
MPI_Comm_size(*communicator, &size2);
CPPUNIT_ASSERT_EQUAL(size,size2);
delete group;
-
+
set <int> procs;
-
+
procs.insert(0);
procs.insert(1);
if (size==1)
CPPUNIT_ASSERT_EQUAL (group->size(),2);
delete group;
}
-
-
+
//throws because plast<pfirst
CPPUNIT_ASSERT_THROW(group=new MPIProcessorGroup(comm_interface,1,0),INTERP_KERNEL::Exception);
//throws because plast is beyond size-1
CPPUNIT_ASSERT_EQUAL(group->size(),size-1);
delete group;
}
-
+
}
void ParaMEDMEMTest::testMPIProcessorGroup_boolean()