Management of errors in differential equations functions.
[scilab.git] / scilab / modules / differential_equations / sci_gateway / cpp / sci_int3d.cpp
index b16b166..d438b08 100644 (file)
@@ -67,69 +67,69 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
     // X
     if (in[0]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 1);
         return types::Function::Error;
     }
     pDblX = in[0]->getAs<types::Double>();
     if (pDblX->isComplex())
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 1);
         return types::Function::Error;
     }
 
     if (pDblX->getRows() != 4)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : A 4 by N matrix expected.\n"), "int3d", 1);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A 4 by N matrix expected.\n"), "int3d", 1);
         return types::Function::Error;
     }
 
     // Y
     if (in[1]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 2);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 2);
         return types::Function::Error;
     }
     pDblY = in[1]->getAs<types::Double>();
     if (pDblY->isComplex())
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 2);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 2);
         return types::Function::Error;
     }
 
     if (pDblY->getRows() != 4)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : A 4 by N matrix expected.\n"), "int3d", 2);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A 4 by N matrix expected.\n"), "int3d", 2);
         return types::Function::Error;
     }
 
     if (pDblY->getCols() != pDblX->getCols())
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : Same size of input argument %d expected.\n"), "int3d", 2, 1);
+        Scierror(999, _("%s: Wrong size for input argument #%d: Same size of input argument %d expected.\n"), "int3d", 2, 1);
         return types::Function::Error;
     }
 
     // Z
     if (in[2]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 3);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 3);
         return types::Function::Error;
     }
     pDblZ = in[2]->getAs<types::Double>();
     if (pDblZ->isComplex())
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 3);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 3);
         return types::Function::Error;
     }
 
     if (pDblZ->getRows() != 4)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : A 4 by N matrix expected.\n"), "int3d", 4);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A 4 by N matrix expected.\n"), "int3d", 4);
         return types::Function::Error;
     }
 
     if (pDblZ->getCols() != pDblX->getCols())
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : Same size of input argument %d expected.\n"), "int3d", 3, 1);
+        Scierror(999, _("%s: Wrong size for input argument #%d: Same size of input argument %d expected.\n"), "int3d", 3, 1);
         return types::Function::Error;
     }
 
@@ -141,18 +141,6 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
     {
         types::Callable* pCall = in[3]->getAs<types::Callable>();
         deFunctionsManager->setFFunction(pCall);
-
-        // check function
-        double xyz[3] = {1, 1, 1};
-        int numfun = 1;
-        double out;
-        double ret = int3d_f(xyz, &numfun, &out);
-        if (ret == 0)
-        {
-            Scierror(50, _("%s: Argument #%d : Variable returned by scilab argument function is incorrect.\n"), "int3d", 4);
-            DifferentialEquation::removeDifferentialEquationFunctions();
-            return types::Function::Error;
-        }
     }
     else if (in[3]->isString())
     {
@@ -175,7 +163,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
 
         if (pList->getSize() == 0)
         {
-            Scierror(50, _("%s: Argument #%d : Subroutine not found in list: %s\n"), "int3d", 4, "(string empty)");
+            Scierror(50, _("%s: Argument #%d: Subroutine not found in list: %s\n"), "int3d", 4, "(string empty)");
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -190,14 +178,14 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
         }
         else
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : The first argument in the list must be a Scilab function.\n"), "int3d", 4);
+            Scierror(999, _("%s: Wrong type for input argument #%d: The first argument in the list must be a Scilab function.\n"), "int3d", 4);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
     }
     else
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A function expected.\n"), "int3d", 4);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A function expected.\n"), "int3d", 4);
         DifferentialEquation::removeDifferentialEquationFunctions();
         return types::Function::Error;
     }
@@ -207,21 +195,21 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
     {
         if (in[4]->isDouble() == false)
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 5);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 5);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
         types::Double* pDblNf = in[4]->getAs<types::Double>();
         if (pDblNf->isComplex())
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 5);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 5);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
 
         if (pDblNf->isScalar() == false)
         {
-            Scierror(999, _("%s: Wrong size for input argument #%d : A scalar expected.\n"), "int3d", 5);
+            Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "int3d", 5);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -229,7 +217,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
 
         if (nf < 1)
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d : A positive value expected.\n"), "int3d", 5);
+            Scierror(999, _("%s: Wrong value for input argument #%d: A positive value expected.\n"), "int3d", 5);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -240,7 +228,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
     {
         if (in[5]->isDouble() == false)
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 6);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 6);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -248,14 +236,14 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
         types::Double* pDblParams = in[5]->getAs<types::Double>();
         if (pDblParams->isComplex())
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : A real matrix expected.\n"), "int3d", 6);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "int3d", 6);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
 
         if (pDblParams->getSize() != 4)
         {
-            Scierror(999, _("%s: Wrong size for input argument #%d : %d expected.\n"), "int3d", 6, 4);
+            Scierror(999, _("%s: Wrong size for input argument #%d: %d expected.\n"), "int3d", 6, 4);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -266,7 +254,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
             {
                 if (pDblParams->get(i) < 0)
                 {
-                    sciprint(_("%ls: Warning : Wrong value for the element %d of argument #%d : The default value will be used.\n"), L"int3d", i + 1, 6);
+                    sciprint(_("%ls: Warning: Wrong value for the element %d of argument #%d: The default value will be used.\n"), L"int3d", i + 1, 6);
                 }
             }
         }
@@ -280,7 +268,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
         {
             if (getWarningMode())
             {
-                sciprint(_("%ls: Warning : Wrong value for the element %d and %d of argument #%d : The default value will be used.\n"), L"int3d", 3, 4, 6);
+                sciprint(_("%ls: Warning: Wrong value for the element %d and %d of argument #%d: The default value will be used.\n"), L"int3d", 3, 4, 6);
             }
             epsabs = 0.0;
             epsrel = 1.0e-5;
@@ -288,7 +276,7 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
 
         if (minpts > maxpts)
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d : minpts smaller than maxpts expected.\n"), "int3d", 6);
+            Scierror(999, _("%s: Wrong value for input argument #%d: minpts smaller than maxpts expected.\n"), "int3d", 6);
             DifferentialEquation::removeDifferentialEquationFunctions();
             return types::Function::Error;
         }
@@ -302,32 +290,46 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
     int maxsub  = 7 * (maxpts - 43 * pDblX->getCols()) / (8 * 43) + pDblX->getCols();
     int size    = 4 * pDblX->getCols();
 
-    // input data : 3 rows, 4*maxsub cols
+    // input data: 3 rows, 4*maxsub cols
     int dataSize = 3 * 4 * maxsub;
-    double* pdData = (double*)malloc(dataSize * sizeof(double));
+    double* pdData = (double*)MALLOC(dataSize * sizeof(double));
     C2F(dcopy)(&size, pDblX->get(), &one, pdData, &three);
     C2F(dcopy)(&size, pDblY->get(), &one, pdData + 1, &three);
     C2F(dcopy)(&size, pDblZ->get(), &one, pdData + 2, &three);
 
     // output result
-    double* pdResult = (double*)malloc(nf * sizeof(double));
+    double* pdResult = (double*)MALLOC(nf * sizeof(double));
 
     // output err
-    double* pdErr = (double*)malloc(nf * sizeof(double));
+    double* pdErr = (double*)MALLOC(nf * sizeof(double));
 
     // workspace
     int mdiv = 1; // default value, but can be changed on parallel computers. (see dcutet.f)
     int dworkSize   = maxsub * (2 * nf + 1) + 7 * Max(8 * mdiv, pDblX->getCols()) * nf + 1;
     int iworkSize   = maxsub + mdiv;
-    double* dwork   = (double*)malloc(dworkSize * sizeof(double));
-    int* iwork      = (int*)malloc(iworkSize * sizeof(int));
+    double* dwork   = (double*)MALLOC(dworkSize * sizeof(double));
+    int* iwork      = (int*)MALLOC(iworkSize * sizeof(int));
 
     int cols = pDblX->getCols();
-    C2F(dcutet)(int3d_f, &nf, pdData, &cols, &minpts, &maxpts, &epsabs, &epsrel, &maxsub, &dworkSize, &irestar, pdResult, pdErr, &nevals, &ifail, dwork, iwork);
+    try
+    {
+        C2F(dcutet)(int3d_f, &nf, pdData, &cols, &minpts, &maxpts, &epsabs, &epsrel, &maxsub, &dworkSize, &irestar, pdResult, pdErr, &nevals, &ifail, dwork, iwork);
+    }
+    catch (ScilabError &e)
+    {
+        char* pstrMsg = wide_string_to_UTF8(e.GetErrorMessage().c_str());
+        sciprint(_("%s: exception caught in '%s' subroutine.\n"), "int3d", "dcutet");
+        Scierror(999, pstrMsg);
+        FREE(pdData);
+        FREE(dwork);
+        FREE(iwork);
+        DifferentialEquation::removeDifferentialEquationFunctions();
+        return types::Function::Error;
+    }
 
-    free(pdData);
-    free(dwork);
-    free(iwork);
+    FREE(pdData);
+    FREE(dwork);
+    FREE(iwork);
     DifferentialEquation::removeDifferentialEquationFunctions();
 
     if (ifail)
@@ -336,21 +338,21 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
         {
             if (getWarningMode())
             {
-                sciprint(_("%ls: Warning : maxpts was too small to obtain the required accuracy.\n"), L"int3d");
+                sciprint(_("%ls: Warning: maxpts was too small to obtain the required accuracy.\n"), L"int3d");
             }
         }
         else if (ifail == 3)
         {
             Scierror(999, _("%s: The volume of one of the initially given tetrahedrons is zero.\n"), "int3d");
-            free(pdResult);
-            free(pdErr);
+            FREE(pdResult);
+            FREE(pdErr);
             return types::Function::Error;
         }
         else // normaly nerver call.
         {
             Scierror(999, _("%s: dcutet return with error %d.\n"), "int3d", ifail);
-            free(pdResult);
-            free(pdErr);
+            FREE(pdResult);
+            FREE(pdErr);
             return types::Function::Error;
         }
     }
@@ -373,8 +375,8 @@ types::Function::ReturnValue sci_int3d(types::typed_list &in, int _iRetCount, ty
         out.push_back(pDblNevalsOut);
     }
 
-    free(pdResult);
-    free(pdErr);
+    FREE(pdResult);
+    FREE(pdErr);
 
     return types::Function::OK;
 }