]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
improvement for parallel Salome component
authorsecher <secher>
Tue, 2 Dec 2008 11:26:09 +0000 (11:26 +0000)
committersecher <secher>
Tue, 2 Dec 2008 11:26:09 +0000 (11:26 +0000)
src/ParaMEDMEM/MPIProcessorGroup.cxx
src/ParaMEDMEM/MPIProcessorGroup.hxx
src/ParaMEDMEM/MPI_AccessDEC.cxx
src/ParaMEDMEM/Makefile.am

index 226c301d7a217a1b57c51760c1a4e02ac6793c0a..5eab47e12fc1676f9167238a15fac9a7eb054a3a 100644 (file)
@@ -47,12 +47,12 @@ MPI_COMM_WORLD processor.This routine must be called by all processors in MPI_CO
 communication layer
        */
 MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface):
-ProcessorGroup(interface)
+ProcessorGroup(interface),_world_comm(MPI_COMM_WORLD)
 {
-  _comm=MPI_COMM_WORLD;
-  _comm_interface.commGroup(MPI_COMM_WORLD, &_group);
+  _comm=_world_comm;
+  _comm_interface.commGroup(_world_comm, &_group);
   int size;
-  _comm_interface.commSize(MPI_COMM_WORLD,&size);
+  _comm_interface.commSize(_world_comm,&size);
   for (int i=0; i<size; i++)
        _proc_ids.insert(i);
 
@@ -67,17 +67,17 @@ communication layer
 to be understood in terms of MPI_COMM_WORLD ranks.
        */
 
-MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids):
-ProcessorGroup(interface, proc_ids)
+MPIProcessorGroup::MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids, const MPI_Comm& world_comm):
+  ProcessorGroup(interface, proc_ids),_world_comm(world_comm)
 {
   //Creation of a communicator 
   MPI_Group group_world;
   
   int size_world;
-  _comm_interface.commSize(MPI_COMM_WORLD,&size_world);
+  _comm_interface.commSize(_world_comm,&size_world);
   int rank_world;
-  _comm_interface.commRank(MPI_COMM_WORLD,&rank_world);
-  _comm_interface.commGroup(MPI_COMM_WORLD, &group_world);
+  _comm_interface.commRank(_world_comm,&rank_world);
+  _comm_interface.commGroup(_world_comm, &group_world);
 
   int* ranks=new int[proc_ids.size()];
    
@@ -89,9 +89,10 @@ ProcessorGroup(interface, proc_ids)
       
   _comm_interface.groupIncl(group_world, proc_ids.size(), ranks, &_group);
   
-  _comm_interface.commCreate(MPI_COMM_WORLD, _group, &_comm);
+  _comm_interface.commCreate(_world_comm, _group, &_comm);
   delete[] ranks;
 }
+
        /*! Creates a processor group that is based on the processors between \a pstart and \a pend.
 This routine must be called by all processors in MPI_COMM_WORLD.
 
@@ -100,16 +101,16 @@ communication layer
 \param pstart id in MPI_COMM_WORLD of the first processor in the group
 \param pend id in MPI_COMM_WORLD of the last processor in the group
        */
-MPIProcessorGroup::MPIProcessorGroup (const CommInterface& comm_interface, int pstart, int pend): ProcessorGroup(comm_interface,pstart,pend)
+MPIProcessorGroup::MPIProcessorGroup (const CommInterface& comm_interface, int pstart, int pend): ProcessorGroup(comm_interface,pstart,pend),_world_comm(MPI_COMM_WORLD)
 {
  //Creation of a communicator 
   MPI_Group group_world;
   
   int size_world;
-  _comm_interface.commSize(MPI_COMM_WORLD,&size_world);
+  _comm_interface.commSize(_world_comm,&size_world);
   int rank_world;
-  _comm_interface.commRank(MPI_COMM_WORLD,&rank_world);
-  _comm_interface.commGroup(MPI_COMM_WORLD, &group_world);
+  _comm_interface.commRank(_world_comm,&rank_world);
+  _comm_interface.commGroup(_world_comm, &group_world);
 
   if (pend>size_world-1 || pend <pstart || pstart<0)
     throw MEDMEM::MEDEXCEPTION("invalid argument in MPIProcessorGroup constructor (comm,pfirst,plast)");
@@ -122,7 +123,7 @@ MPIProcessorGroup::MPIProcessorGroup (const CommInterface& comm_interface, int p
 
   _comm_interface.groupIncl(group_world, nprocs, ranks, &_group);
   
-  _comm_interface.commCreate(MPI_COMM_WORLD, _group, &_comm);
+  _comm_interface.commCreate(_world_comm, _group, &_comm);
    delete[] ranks;
 }
 /*!
@@ -130,7 +131,7 @@ MPIProcessorGroup::MPIProcessorGroup (const CommInterface& comm_interface, int p
 */
 
 MPIProcessorGroup::MPIProcessorGroup (const ProcessorGroup& proc_group, set<int> proc_ids) :
-ProcessorGroup(proc_group.getCommInterface())
+ProcessorGroup(proc_group.getCommInterface()),_world_comm(MPI_COMM_WORLD)
 {
        cout << "MPIProcessorGroup (const ProcessorGroup& proc_group, set<int> proc_ids)" <<endl;
        cout << "Not implemented yet !"<<endl;
@@ -140,7 +141,7 @@ ProcessorGroup(proc_group.getCommInterface())
 MPIProcessorGroup::~MPIProcessorGroup()
 {
        _comm_interface.groupFree(&_group);
-       if (_comm!=MPI_COMM_WORLD && _comm !=MPI_COMM_NULL)
+       if (_comm!=_world_comm && _comm !=MPI_COMM_NULL)
                _comm_interface.commFree(&_comm);
        
 }
@@ -192,7 +193,7 @@ ProcessorGroup*  MPIProcessorGroup::fuse (const ProcessorGroup& group) const
   {
     procs.insert(*iter);
   }
-  return new MPIProcessorGroup(_comm_interface,procs);
+  return new MPIProcessorGroup(_comm_interface,procs,_world_comm);
 }
 /*!
  @}
index 8e4a723309f2ba45c7e31cbf3da059cba02f892b..ed416859ecda80daa3e9bfbd3626dc5914917cf9 100644 (file)
@@ -14,7 +14,7 @@ class MPIProcessorGroup:public ProcessorGroup
 {
 public:
   MPIProcessorGroup(const CommInterface& interface);
-  MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids);
+  MPIProcessorGroup(const CommInterface& interface, set<int> proc_ids, const MPI_Comm& world_comm=MPI_COMM_WORLD);
   MPIProcessorGroup (const ProcessorGroup& proc_group, set<int> proc_ids);
   MPIProcessorGroup(const CommInterface& interface,int pstart, int pend);
   virtual ~MPIProcessorGroup();
@@ -26,9 +26,11 @@ public:
   const MPI_Comm* getComm() const {return &_comm;}
   ProcessorGroup* createComplementProcGroup() const;
   ProcessorGroup* createProcGroup() const;
+  MPI_Comm getWorldComm() { return _world_comm;}
   
 private:
   MPI_Group _group;
+  const MPI_Comm _world_comm;
   MPI_Comm _comm;
 };
 
index c32fc310a2eb36cc776ca69c21c637bb5346a044..d725e33e6931dc64962a6aa8e6f1859539a4d432 100644 (file)
@@ -32,8 +32,9 @@ MPI_AccessDEC::MPI_AccessDEC( const ProcessorGroup& local_group,
   for ( i = 0 ; i < union_group->size() ; i++ ) {
      procs.insert(i) ;
   }
-  _MPI_union_group = new ParaMEDMEM::MPIProcessorGroup(
-                                     union_group->getCommInterface() , procs);
+  MPIProcessorGroup *mpilg = (MPIProcessorGroup *)_local_group;
+  _MPI_union_group = new ParaMEDMEM::MPIProcessorGroup( union_group->getCommInterface() , procs,
+                                                       mpilg->getWorldComm());
   delete union_group ;
   _MyRank = _MPI_union_group->myRank() ;
   _GroupSize = _MPI_union_group->size() ;
index 8bcb9dfc8e23bc41122f2cd20adb450ef422fe19..c990f6f75681c58f9e31b0946d6d40c318f2f13e 100644 (file)
@@ -126,6 +126,7 @@ EXTRA_DIST += \
        CommInterface.cxx \
        NonCoincidentDEC.cxx \
        NonCoincidentDEC.hxx \
+       DECOptions.hxx \
        README_JR \
        TODO_JR \
        Topology.cxx
\ No newline at end of file