Fix some localization issues
[scilab.git] / scilab / modules / mpi / sci_gateway / c / sci_mpi_bcast.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011-2011 - DIGITEO - Sylvestre LEDRU
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 #include "api_scilab.h"
14 #include <stdio.h>
15 #include <mpi.h>
16 #include "gw_mpi.h"
17 #include "Scierror.h"
18 #include "MALLOC.h"
19 #include "localization.h"
20 #include "serialization.h"
21 #include "deserialization.h"
22
23 int sci_mpi_bcast(char *fname, unsigned long fname_len)
24 {
25     SciErr sciErr;
26     int iRet = 0;
27     int *piAddr = NULL;
28     int *piAddr2 = NULL;
29
30     int *piBuffer = NULL;
31     int iBufferSize = 0;
32     double rootID = 0;
33     int rank = 0;
34
35     CheckInputArgument(pvApiCtx, 2, 2);
36     CheckOutputArgument(pvApiCtx, 1, 1);
37
38     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
39     if (sciErr.iErr)
40     {
41         printError(&sciErr, 0);
42         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
43         return 0;
44     }
45
46     if (getScalarDouble(pvApiCtx, piAddr2, &rootID))
47     {
48         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar integer value expected.\n"), fname, 1);
49         return 0;
50     }
51
52     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
53     if (sciErr.iErr)
54     {
55         printError(&sciErr, 0);
56         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
57         return 0;
58     }
59
60     iRet = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
61     if (iRet != MPI_SUCCESS)
62     {
63         char error_string[MPI_MAX_ERROR_STRING];
64         int length_of_error_string = 0;
65         MPI_Error_string(iRet, error_string, &length_of_error_string);
66         Scierror(999, _("%s: Could not get communicator rank of the node %d: %s\n"), fname, rootID, error_string);
67         return 0;
68     }
69
70     if (rank == rootID)
71     {
72         iRet = serialize_to_mpi(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
73         if (iRet)
74         {
75             Scierror(999, _("Unable to serialize data\n"));
76             return 0;
77         }
78     }
79
80     /* First, send the size of the data as broadcast */
81     iRet = MPI_Bcast(&iBufferSize, 1, MPI_INT, (int)rootID, MPI_COMM_WORLD);
82     if (iRet != MPI_SUCCESS)
83     {
84         char error_string[MPI_MAX_ERROR_STRING];
85         int length_of_error_string = 0;
86         MPI_Error_string(iRet, error_string, &length_of_error_string);
87         Scierror(999, _("%s: Could not broadcast the variable to the node %d: %s\n"), fname, rootID, error_string);
88         return 0;
89     }
90
91     if (rank != rootID)
92     {
93         piBuffer = (int*)MALLOC(sizeof(int) * iBufferSize);
94     }
95
96     /* Second, restore the data with the right size */
97     iRet = MPI_Bcast(piBuffer, iBufferSize, MPI_INT, (int)rootID, MPI_COMM_WORLD);
98     if (iRet != MPI_SUCCESS)
99     {
100         char error_string[MPI_MAX_ERROR_STRING];
101         int length_of_error_string = 0;
102         MPI_Error_string(iRet, error_string, &length_of_error_string);
103         Scierror(999, _("%s: Could not broadcast the variable to the node %d: %s\n"), fname, rootID, error_string);
104         return 0;
105     }
106
107     iRet = deserialize_from_mpi(pvApiCtx, piBuffer, iBufferSize);
108     FREE(piBuffer);
109     if (iRet)
110     {
111         Scierror(999, _("%s: Unable to deserialize data.\n"), fname);
112         return 0;
113     }
114
115     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
116     ReturnArguments(pvApiCtx);
117     return 0;
118 }