dynamic_link remove support of old VS versions
[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 // avoid c++ openmpi include
17 #define OMPI_SKIP_MPICXX
18
19 #include <string>
20 #include <mpi.h>
21 #include "user.hxx"
22
23 extern "C"
24 {
25 #include "dynlib_mpi.h"
26 }
27
28 class MPI_IMPEXP SciMpiComm : public types::UserType
29 {
30
31 public :
32     SciMpiComm(int* piRanks, int iSize)
33     {
34         m_iGroupSize = iSize;
35         m_piWorldIndex = new int[m_iGroupSize];
36         memcpy(m_piWorldIndex, piRanks, m_iGroupSize * sizeof(int));
37         // create group from the world communicator
38         MPI_Group world_group;
39         MPI_Comm_group(MPI_COMM_WORLD, &world_group);
40
41         // create communicator from the group
42         MPI_Group_incl(world_group, m_iGroupSize, m_piWorldIndex, &m_group);
43         MPI_Comm_create(MPI_COMM_WORLD, m_group, &m_comm);
44     }
45
46     SciMpiComm* clone()
47     {
48         return new SciMpiComm(m_piWorldIndex, m_iGroupSize);
49     }
50
51     std::wstring getTypeStr() const override
52     {
53         return L"SciMpiComm";
54     }
55
56     std::wstring getShortTypeStr() const override
57     {
58         return L"smc";
59     }
60
61     bool hasToString()
62     {
63         return true;
64     }
65
66     bool toString(std::wostringstream& ostr)
67     {
68         ostr << L"MPI communicator of size " << m_iGroupSize << std::endl;
69         ostr << L"World ranks:" << std::endl;
70         for (int i = 0; i < m_iGroupSize; i++)
71         {
72             ostr << " " << m_piWorldIndex[i];
73         }
74
75         return true;
76     }
77
78     MPI_Comm getComm()
79     {
80         return m_comm;
81     }
82
83     ~SciMpiComm()
84     {
85         delete[] m_piWorldIndex;
86     }
87
88 private :
89     MPI_Group m_group;
90     MPI_Comm m_comm;
91     int m_iGroupSize;
92     int* m_piWorldIndex;
93 };
94
95 #endif //__SCIMPICOMM_HXX__