46fb93e33e4707b12b94b0076035243188f5746f
[scilab.git] / scilab / modules / mpi / includes / sciMpiComm.hxx
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) Scilab-Enterprises - 2016 - Cedric DELAMARRE
4 *
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution.  The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #ifndef __SCIMPICOMM_HXX__
14 #define __SCIMPICOMM_HXX__
15
16 #include <string>
17 #include <mpi.h>
18 #include "user.hxx"
19
20 extern "C"
21 {
22     #include "dynlib_mpi.h"
23 }
24
25 class MPI_IMPEXP SciMpiComm : public types::UserType
26 {
27
28 public :
29     SciMpiComm(int* piRanks, int iSize)
30     {
31         m_iGroupSize = iSize;
32         m_piWorldIndex = new int[m_iGroupSize];
33         memcpy(m_piWorldIndex, piRanks, m_iGroupSize * sizeof(int));
34         // create group from the world communicator
35         MPI_Group world_group;
36         MPI_Comm_group(MPI_COMM_WORLD, &world_group);
37
38         // create communicator from the group
39         MPI_Group_incl(world_group, m_iGroupSize, m_piWorldIndex, &m_group);
40         MPI_Comm_create(MPI_COMM_WORLD, m_group, &m_comm);
41     }
42
43     SciMpiComm* clone()
44     {
45         return new SciMpiComm(m_piWorldIndex, m_iGroupSize);
46     }
47
48     std::wstring getTypeStr()
49     {
50         return L"SciMpiComm";
51     }
52
53     std::wstring getShortTypeStr()
54     {
55         return L"smc";
56     }
57
58     bool hasToString()
59     {
60         return true;
61     }
62
63     bool toString(std::wostringstream& ostr)
64     {
65         ostr << L"MPI communicator of size " << m_iGroupSize << std::endl;
66         ostr << L"World ranks:" << std::endl;
67         for (int i = 0; i < m_iGroupSize; i++)
68         {
69             ostr << " " << m_piWorldIndex[i];
70         }
71
72         return true;
73     }
74
75     MPI_Comm getComm()
76     {
77         return m_comm;
78     }
79
80     ~SciMpiComm()
81     {
82         delete[] m_piWorldIndex;
83     }
84
85 private :
86     MPI_Group m_group;
87     MPI_Comm m_comm;
88     int m_iGroupSize;
89     int* m_piWorldIndex;
90 };
91
92 #endif //__SCIMPICOMM_HXX__