ee4c2c4dd93edfbae792cccc48b6ef81a1aadd68
[scilab.git] / scilab / modules / matio / src / c / CreateSparseVariable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT 
4  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #include "CreateMatlabVariable.h"
15 #include "stack-c.h"
16 #include "api_scilab.h"
17 #include "MALLOC.h"
18 #include "localization.h"
19 #include "Scierror.h"
20 #include "sciprint.h"
21
22
23 #define MATIO_ERROR if(_SciErr.iErr) \
24     {                                \
25       printError(&_SciErr, 0);       \
26       return 0;                      \
27     }
28
29 /* Defined in SCI/modules/sparse/src/fortran/spt.f */
30 extern int C2F(spt)(int *m, int *n, int *nel, int *it, int *workArray, 
31                     double *A_R, double *A_I, int *A_mnel, int *A_icol,
32                     double *At_R, double *At_I, int *At_mnel, int *At_icol);
33                    
34 int CreateSparseVariable(int iVar, matvar_t *matVariable, int * parent, int item_position)
35 {
36   int K = 0;
37   sparse_t *sparseData = NULL;
38   SciSparse *scilabSparse = NULL;
39   SciSparse *scilabSparseT = NULL; /* Transpose */
40   int *colIndexes = NULL;
41   int *rowIndexes = NULL;
42   int *workArray = NULL;
43   struct ComplexSplit *complexData = NULL;
44   SciErr _SciErr;
45
46   sparseData = (sparse_t*) matVariable->data;
47
48   scilabSparse = (SciSparse*) MALLOC(sizeof(SciSparse));
49   if (scilabSparse==NULL)
50     {
51       Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
52       return FALSE;
53     }
54
55   /* Computes column indexes from Matlab indexes */
56   if (sparseData->njc > 1)
57     {
58       colIndexes = (int*) MALLOC(sizeof(int) *  (sparseData->njc-1));
59       if (colIndexes==NULL)
60         {
61           Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
62           return FALSE;
63         }
64       
65       for (K=0; K<sparseData->njc-1; K++)
66         {
67           colIndexes[K] = sparseData->jc[K+1] - sparseData->jc[K];
68         }
69     }
70
71   /* Computes row indexes from Matlab indexes */
72   rowIndexes = (int*) MALLOC(sizeof(int) * sparseData->nir);
73   if (rowIndexes==NULL)
74     {
75       Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
76       return FALSE;
77     }
78
79   for (K=0; K<sparseData->nir; K++)
80     {
81       rowIndexes[K] = sparseData->ir[K] + 1;
82     }
83
84   /* Create sparse matrix to be transposed */
85   scilabSparse->m    = matVariable->dims[1];
86   scilabSparse->n    = matVariable->dims[0];
87   scilabSparse->it   = matVariable->isComplex;
88   scilabSparse->nel  = sparseData->ndata;
89   scilabSparse->mnel = colIndexes;
90   scilabSparse->icol = rowIndexes;
91
92   if (scilabSparse->it == 0)
93     {
94       scilabSparse->R = (double*) sparseData->data;
95       scilabSparse->I = NULL;
96     }
97   else
98     {
99       complexData = (struct ComplexSplit *) sparseData->data;
100       scilabSparse->R = (double *) complexData->Re;
101       scilabSparse->I = (double *) complexData->Im;
102     }
103
104   /* Create transpose */
105   scilabSparseT = (SciSparse*) MALLOC(sizeof(SciSparse));
106   if (scilabSparseT==NULL)
107     {
108       Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
109       return FALSE;
110     }
111
112   scilabSparseT->m   = scilabSparse->n;
113   scilabSparseT->n   = scilabSparse->m;
114   scilabSparseT->it  = scilabSparse->it;
115   scilabSparseT->nel = scilabSparse->nel;
116
117   if (scilabSparseT->m == 0)
118     {
119       workArray = (int*) MALLOC(sizeof(int));
120     }
121   else
122     {
123       workArray = (int*) MALLOC(sizeof(int) * scilabSparseT->m);
124     }
125
126   if (workArray==NULL)
127     {
128       Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
129       return FALSE;
130     }
131
132   if (scilabSparseT->m != 0) {
133     scilabSparseT->mnel = (int*) MALLOC(sizeof(int) * scilabSparseT->m); 
134     if (scilabSparseT->mnel==NULL)
135       {
136         Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
137         return FALSE;
138       }
139   }
140
141   if (scilabSparseT->nel != 0) {
142     scilabSparseT->icol = (int*) MALLOC(sizeof(int) * scilabSparseT->nel); 
143     if (scilabSparseT->icol==NULL)
144       {
145         Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
146         return FALSE;
147       }
148   }
149
150   if (scilabSparseT->nel != 0) {
151     scilabSparseT->R = (double*) MALLOC(sizeof(double) * scilabSparseT->nel); 
152     if (scilabSparseT->R==NULL)
153       {
154         Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
155         return FALSE;
156       }
157   }
158
159   if (scilabSparseT->it)
160     {
161       scilabSparseT->I = (double*) MALLOC(sizeof(double) * scilabSparseT->nel);
162       if (scilabSparseT->I==NULL)
163         {
164           Scierror(999, _("%s: No more memory.\n"), "CreateSparseVariable");
165           return FALSE;
166         }
167     }
168   
169   C2F(spt)(&scilabSparse->m, &scilabSparse->n, &scilabSparse->nel, &scilabSparse->it, workArray, 
170            scilabSparse->R, scilabSparse->I, scilabSparse->mnel, scilabSparse->icol,
171            scilabSparseT->R, scilabSparseT->I, scilabSparseT->mnel, scilabSparseT->icol);
172
173   if (scilabSparse->it)
174     {
175       if (parent==NULL)
176         {
177           _SciErr = createComplexSparseMatrix(pvApiCtx, iVar, scilabSparse->m, scilabSparse->n, scilabSparse->nel,
178                                               scilabSparseT->mnel, scilabSparseT->icol, scilabSparseT->R, scilabSparseT->I);
179         }
180       else
181         {
182           _SciErr = createComplexSparseMatrixInList(pvApiCtx, iVar, parent, item_position,
183                                                     scilabSparse->m, scilabSparse->n, scilabSparse->nel,
184                                                     scilabSparseT->mnel, scilabSparseT->icol, scilabSparseT->R, scilabSparseT->I);
185         }
186     }
187   else
188     {
189       if (parent==NULL)
190         {
191           _SciErr = createSparseMatrix(pvApiCtx, iVar, scilabSparseT->m, scilabSparseT->n, scilabSparseT->nel,
192                                        scilabSparseT->mnel, scilabSparseT->icol, scilabSparseT->R);
193         }
194       else
195         {
196           _SciErr = createSparseMatrixInList(pvApiCtx, iVar, parent, item_position, 
197                                              scilabSparseT->m, scilabSparseT->n, scilabSparseT->nel,
198                                              scilabSparseT->mnel, scilabSparseT->icol, scilabSparseT->R);
199         }
200     }
201
202   /* Free all arrays */
203   if (scilabSparse != NULL)    FREE(scilabSparse);
204   if (colIndexes != NULL)      FREE(colIndexes);
205   if (rowIndexes != NULL)      FREE(rowIndexes);
206   if (workArray != NULL)       FREE(workArray);
207   if (scilabSparseT->m != 0)   FREE(scilabSparseT->mnel);
208   if (scilabSparseT->nel != 0) FREE(scilabSparseT->icol);
209   if (scilabSparseT->nel != 0) FREE(scilabSparseT->R);
210   if ((scilabSparseT->nel != 0) && (scilabSparseT->it != 0)) FREE(scilabSparseT->I);
211   if (scilabSparseT != NULL)   FREE(scilabSparseT);
212   
213   return TRUE;
214 }