Salome HOME
431b5142a9a08707b3bac69460d1ff1238150012
[modules/kernel.git] / src / MPIContainer / MPIObject_i.cxx
1 using namespace std;
2 #include "MPIObject_i.hxx"
3 #include "utilities.h"
4 #include <mpi.h>
5
6 MPIObject_i::MPIObject_i()
7 {
8   _nbproc = 1;
9   _numproc = 0;
10   _tior=NULL;
11 }
12
13 MPIObject_i::MPIObject_i(int nbproc, int numproc)
14 {
15   _nbproc = nbproc;
16   _numproc = numproc;
17   _tior=NULL;
18 }
19
20 MPIObject_i::~MPIObject_i()
21 {
22   if(_tior) delete _tior;
23 }
24
25 Engines::IORTab* MPIObject_i::tior()
26 {
27   Engines::IORTab* tior = new Engines::IORTab;
28   tior->length(_tior->length());
29   for(unsigned int ip=0;ip<tior->length();ip++)
30     (*tior)[ip] = (*_tior)[ip];
31   return tior; 
32 };
33
34 void MPIObject_i::tior(const Engines::IORTab& ior)
35 {
36   _tior = new Engines::IORTab;
37   _tior->length(ior.length());
38   for(unsigned int ip=0;ip<ior.length();ip++)
39     (*_tior)[ip] = ior[ip];
40 }
41
42 void MPIObject_i::BCastIOR(CORBA::ORB_ptr orb, Engines::MPIObject_var pobj, 
43                            bool amiCont)
44 {
45   int err, ip, n;
46   char *ior;
47   MPI_Status status; /* status de reception de message MPI */
48
49   // Conversion IOR vers string
50   CORBA::String_var sior(orb->object_to_string(pobj));
51
52   if( _numproc == 0 ){
53
54     //Allocation du tableau des IOR
55     Engines::IORTab *iort = new Engines::IORTab;
56     iort->length(_nbproc);
57
58     (*iort)[0] = pobj;
59
60     // Process 0 recupere les ior de l'object sur les autres process
61     for(ip=1;ip<_nbproc;ip++){
62       err = MPI_Recv(&n,1,MPI_INTEGER,ip,ip,MPI_COMM_WORLD,&status);
63       if(err){
64         MESSAGE("[" << _numproc << "] MPI_RECV error");
65         exit(1);
66       }
67       // Allocation de la chaine de longueur n
68       ior = (char*)calloc(n,sizeof(char));
69       err = MPI_Recv(ior,n,MPI_CHARACTER,ip,2*ip,MPI_COMM_WORLD,&status);
70       if(err){
71         MESSAGE("[" << _numproc << "] MPI_RECV error");
72         exit(1);
73       }
74       (*iort)[ip] = Engines::MPIObject::_narrow(orb->string_to_object(ior));
75       free(ior);
76     }
77     // On donne le tableau des ior a l'objet Corba du process 0
78     if( amiCont )
79       tior(*iort);
80     else
81       pobj->tior(*iort);
82
83   }
84   else{
85     // On envoie l'IOR au process 0
86     n = strlen((char*)sior);
87     err = MPI_Send(&n,1,MPI_INTEGER,0,_numproc,MPI_COMM_WORLD);
88     if(err){
89       MESSAGE("[" << _numproc << "] MPI_SEND error");
90       exit(1);
91     }
92     err = MPI_Send((char*)sior,n,MPI_CHARACTER,0,2*_numproc,MPI_COMM_WORLD);
93     if(err){
94       MESSAGE("[" << _numproc << "] MPI_SEND error");
95       exit(1);
96     }
97   }
98
99 }
100