Replace Min, Max and Abs by std::min, std::max and std::abs
[scilab.git] / scilab / modules / interpolation / sci_gateway / cpp / sci_cshep2d.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - 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
14 #include "interpolation_gw.hxx"
15 #include "function.hxx"
16 #include "double.hxx"
17 #include "string.hxx"
18 #include "tlist.hxx"
19 #include "int.hxx"
20
21 extern "C"
22 {
23 #include "localization.h"
24 #include "Scierror.h"
25 #include "interpolation_functions.h"
26 }
27 /*--------------------------------------------------------------------------*/
28
29 types::Function::ReturnValue sci_cshep2d(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     //input
32     types::Double* pDblXYZ = NULL;
33
34     //output
35     types::TList* pTListCoef = NULL;
36
37     const wchar_t * wcsStr[] = {L"cshep2d", L"xyz", L"lcell", L"lnext", L"grdim", L"rmax", L"rw", L"a"};
38
39     // *** check the minimal number of input args. ***
40     if (in.size() != 1)
41     {
42         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cshep2d", 1);
43         return types::Function::Error;
44     }
45
46     // *** check number of output args according the methode. ***
47     if (_iRetCount > 1)
48     {
49         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "cshep2d", 1);
50         return types::Function::Error;
51     }
52
53     // *** check type of input args and get it. ***
54     //xyz
55     if (in[0]->isDouble() == false)
56     {
57         Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "cshep2d", 1);
58         return types::Function::Error;
59     }
60
61     pDblXYZ = in[0]->getAs<types::Double>()->clone()->getAs<types::Double>();
62
63     if (pDblXYZ->isComplex())
64     {
65         Scierror(999, _("%s: Wrong type for argument #%d: Real matrix expected.\n"), "cshep2d", 1);
66         return types::Function::Error;
67     }
68
69     if (pDblXYZ->getCols() != 3 || pDblXYZ->getRows() < 10)
70     {
71         Scierror(999, _("%s: Wrong size for input argument #%d : A matrix of size n x 3 expected.(n >= 10)\n"), "cshep2d", 1);
72         return types::Function::Error;
73     }
74
75     // *** Perform operation. ***
76     // choise for nc (can be a futur optionnal parameter)
77     int nc = std::min(17, pDblXYZ->getRows() - 1);
78     // choise for nw
79     int nw = std::min(30, pDblXYZ->getRows() - 1);
80     // choise for nr (grid nr x nr)
81     int nr = (int) sqrt(pDblXYZ->getRows() / 3.0); // comme n >= 10 nr >= 1
82
83     pTListCoef = new types::TList();
84
85     types::String* pStr = new types::String(1, 8);
86     pStr->set(wcsStr);
87
88     types::Int32* pInt32Cell    = new types::Int32(nr, nr);
89     types::Int32* pInt32Next    = new types::Int32(1, pDblXYZ->getRows());
90     types::Double* pDblGrid     = new types::Double(1, 4);
91     types::Double* pDblRMax     = new types::Double(1, 1);
92     types::Double* pDblRW       = new types::Double(1, pDblXYZ->getRows());
93     types::Double* pDblA        = new types::Double(9, pDblXYZ->getRows());
94
95     int ier = 0;
96     int rows = pDblXYZ->getRows();
97
98     C2F(cshep2)(&rows, pDblXYZ->get(), pDblXYZ->get() + rows, pDblXYZ->get() + (2 * rows),
99                 &nc, &nw, &nr, pInt32Cell->get(), pInt32Next->get(), pDblGrid->get(),
100                 pDblGrid->get() + 1, pDblGrid->get() + 2, pDblGrid->get() + 3,
101                 pDblRMax->get(), pDblRW->get(), pDblA->get(), &ier);
102
103     if (ier != 0)
104     {
105         Scierror(999, _("%s: Duplicate nodes or all nodes colinears (ier = %d).\n"), "cshep2d", ier);
106         return types::Function::Error;
107     }
108
109
110     // *** Return result in Scilab. ***
111     pTListCoef->append(pStr);
112     pTListCoef->append(pDblXYZ);
113     pTListCoef->append(pInt32Cell);
114     pTListCoef->append(pInt32Next);
115     pTListCoef->append(pDblGrid);
116     pTListCoef->append(pDblRMax);
117     pTListCoef->append(pDblRW);
118     pTListCoef->append(pDblA);
119
120     out.push_back(pTListCoef);
121
122     return types::Function::OK;
123 }
124