Fix some easy to fix warnings
[scilab.git] / scilab / modules / sparse / sci_gateway / cpp / sci_luget.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Anais AUBERT
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #include "sparse_gw.hxx"
17 #include "function.hxx"
18 #include "types.hxx"
19 #include "double.hxx"
20 #include "sparse.hxx"
21 #include "pointer.hxx"
22 #include "overload.hxx"
23
24 extern "C"
25 {
26 #include "Scierror.h"
27 #include "localization.h"
28 #include "elem_common.h"
29 #include "lu.h"
30
31 }
32 types::Function::ReturnValue sci_luget(types::typed_list &in, int _iRetCount, types::typed_list &out)
33 {
34     double abstol   = 0;
35     double reltol   = 0.001;
36     int nrank       = 0;
37     int ierr        = 0;
38     int n1          = 0;
39     int nl          = 0;
40     int nu          = 0;
41     int tp          = 0;
42     int nonZerosP   = 0;
43     int nonZerosL   = 0;
44     int nonZerosU   = 0;
45     int nonZerosQ   = 0;
46
47     bool cplx           = false;
48     const void* pData   = NULL;
49
50     double* dblP    = NULL;
51     double* dblL    = NULL;
52     double* dblU    = NULL;
53     double* dblQ    = NULL;
54     int* itemsRowP  = NULL;
55     int* itemsRowL  = NULL;
56     int* itemsRowU  = NULL;
57     int* itemsRow   = NULL;
58     int* itemsRowQ  = NULL;
59     int* fmatindex  = NULL;
60
61     //check input parameters
62     if (in.size() != 1 )
63     {
64         Scierror(999, _("%s: Wrong number of input argument(s): %d  expected.\n"), "luget", 1);
65         return types::Function::Error;
66     }
67
68     if (_iRetCount != 4)
69     {
70         Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "luget", 4);
71         return types::Function::Error;
72     }
73
74     if (in[0]->isPointer() == false)
75     {
76         Scierror(999, _("%s: Wrong type for argument %d:  Handle to sparse lu factors expected.\n"), "luget", 1);
77         return types::Function::Error;
78     }
79
80     types::Pointer *pPointerIn = in[0]->getAs<types::Pointer>();
81     n1 = pPointerIn->getCols();
82     cplx = pPointerIn->isComplex();
83     pData = pPointerIn->get();
84     fmatindex = (int*)pData;
85
86     C2F(lusiz1)(fmatindex, &nl, &nu, &ierr);
87     if (ierr > 0)
88     {
89         Scierror(999, _("Wrong value for argument #%d: the lu handle is no more valid.\n"), 1);
90         return types::Function::Error;
91     }
92
93     dblP = new double[n1];
94     dblL = new double[nl];
95     dblU = new double[nu];
96     dblQ = new double[n1];
97
98     types::Sparse *p = new types::Sparse(n1, n1, cplx);
99     types::Sparse *l = new types::Sparse(n1, n1, cplx);
100     types::Sparse *u = new types::Sparse(n1, n1, cplx);
101     types::Sparse *q = new types::Sparse(n1, n1, cplx);
102
103     itemsRowP = new int[n1 + n1];
104     itemsRowL = new int[nl + n1];
105     itemsRowU = new int[nu + n1];
106     itemsRowQ = new int[n1 + n1];
107
108     C2F(luget1)(fmatindex, itemsRowP, dblP, itemsRowL, dblL, itemsRowU, dblU, itemsRowQ, dblQ, &ierr);
109
110     tp = n1;
111     for (int i = 0; i < n1; i++)
112     {
113         for (int j = 0; j < itemsRowP[i]; j++)
114         {
115             p->set(i, itemsRowP[j + tp] - 1, dblP[j + tp - n1], true);
116         }
117         tp += itemsRowP[i];
118     }
119
120     tp = n1;
121     for (int i = 0; i < n1; i++)
122     {
123         for (int j = 0; j < itemsRowL[i]; j++)
124         {
125
126             l->set(i, itemsRowL[j + tp] - 1, dblL[j + tp - n1], true);
127         }
128         tp += itemsRowL[i];
129     }
130
131     tp = n1;
132     for (int i = 0; i < n1; i++)
133     {
134         for (int j = 0; j < itemsRowU[i]; j++)
135         {
136             u->set(i, itemsRowU[j + tp] - 1, dblU[j + tp - n1], true);
137         }
138         tp += itemsRowU[i];
139     }
140
141     tp = n1;
142     for (int i = 0; i < n1; i++)
143     {
144         for (int j = 0; j < itemsRowQ[i]; j++)
145         {
146             q->set(i, itemsRowQ[j + tp] - 1, dblQ[j + tp - n1], true);
147         }
148         tp += itemsRowQ[i];
149     }
150
151     out.push_back(p);
152     out.push_back(l);
153     out.push_back(u);
154     out.push_back(q);
155
156     delete[] dblP;
157     delete[] dblL;
158     delete[] dblU;
159     delete[] dblQ;
160     delete[] itemsRowP;
161     delete[] itemsRowL;
162     delete[] itemsRowU;
163     delete[] itemsRowQ;
164
165     return types::Function::OK;
166 }