Management of errors in differential equations functions.
[scilab.git] / scilab / modules / differential_equations / sci_gateway / cpp / sci_bvode.cpp
index 4c00695..c527674 100644 (file)
@@ -1,6 +1,6 @@
 /*
 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (//) 2011 - DIGITEO - Cedric DELAMARRE
+* Copyright (C) 2011 - DIGITEO - Cedric DELAMARRE
 *
 * This file must be used under the terms of the CeCILL.
 * This source file is licensed as described in the file COPYING, which
@@ -25,6 +25,7 @@ extern "C"
 #include "localization.h"
 #include "Scierror.h"
 #include "scifunctions.h"
+#include "sciprint.h"
 }
 
 /*--------------------------------------------------------------------------*/
@@ -68,7 +69,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // xpoints
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
         return types::Function::Error;
     }
 
@@ -78,7 +79,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // ncomp
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
         return types::Function::Error;
     }
 
@@ -86,7 +87,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblN->isScalar() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
         return types::Function::Error;
     }
 
@@ -94,7 +95,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (ncomp > 20)
     {
-        Scierror(999, _("%s: Wrong value for input argument #%d : Value at most 20 expected.\n"), "bvode", iPos + 1);
+        Scierror(999, _("%s: Wrong value for input argument #%d: Value at most 20 expected.\n"), "bvode", iPos + 1);
         return types::Function::Error;
     }
     iPos++;
@@ -102,7 +103,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // m
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
         return types::Function::Error;
     }
 
@@ -110,11 +111,11 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblM->getSize() != ncomp)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : A vector of size %d (N) expected.\n"), "bvode", iPos + 1, ncomp);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A vector of size %d (N) expected.\n"), "bvode", iPos + 1, ncomp);
         return types::Function::Error;
     }
 
-    int* M = (int*)malloc(pDblM->getSize() * sizeof(int));
+    int* M = (int*)MALLOC(pDblM->getSize() * sizeof(int));
     for (int i = 0; i < pDblM->getSize(); i++)
     {
         M[i] = (int)pDblM->get(i);
@@ -124,8 +125,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (sumM > 40)
     {
-        Scierror(999, _("%s: Wrong value for input argument #%d : Sum of m (%d) must be less than 40.\n"), "bvode", iPos + 1, sumM);
-        free(M);
+        Scierror(999, _("%s: Wrong value for input argument #%d: Sum of m (%d) must be less than 40.\n"), "bvode", iPos + 1, sumM);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -134,8 +135,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // aleft
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -143,8 +144,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblXLow->isScalar() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -154,8 +155,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // aright
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -163,8 +164,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblXUp->isScalar() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A scalar expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -174,8 +175,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // zeta
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -185,8 +186,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     {
         if (pDblZeta->get(i) > pDblZeta->get(i + 1))
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d : zeta(j) lower or equal to zeta(j+1) expected.\n"), "bvode", iPos + 1);
-            free(M);
+            Scierror(999, _("%s: Wrong value for input argument #%d: zeta(j) lower or equal to zeta(j+1) expected.\n"), "bvode", iPos + 1);
+            FREE(M);
             return types::Function::Error;
         }
     }
@@ -196,8 +197,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // ipar
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -205,8 +206,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblIpar->getSize() != 11)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : A vector of size 11 expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A vector of size 11 expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -221,7 +222,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[0] != 0 && ipar[0] != 1)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %s: %d or %d expected.\n"), "bvode", iPos + 1, 1, 0, 1);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -234,7 +235,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[1] < 0 || ipar[1] > 7)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %s: %d to %d expected.\n"), "bvode", iPos + 1, 2, 0, 7);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -248,7 +249,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[3] < 0 || ipar[3] > sumM)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %s: %d to sum of m (=%d) expected.\n"), "bvode", iPos + 1, 4, 0, sumM);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -270,7 +271,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[4] < nmax * nsizef)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d.\n"), "bvode", iPos + 1, 5);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -279,7 +280,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[5] < nmax * nsizei)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d.\n"), "bvode", iPos + 1, 6);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -287,7 +288,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[6] < -1 || ipar[6] > 1)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d: %d to %d expected.\n"), "bvode", iPos + 1, 7, -1, 1);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -295,7 +296,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[7] < 0 || ipar[7] > 2)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d: %d to %d expected.\n"), "bvode", iPos + 1, 8, 0, 2);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -303,7 +304,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[8] < 0 || ipar[8] > 4)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d: %d to %d expected.\n"), "bvode", iPos + 1, 9, 0, 4);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -311,7 +312,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     if (ipar[9] < 0 || ipar[9] > 2)
     {
         Scierror(999, _("%s: Wrong value for input argument #%d: Wrong value for element %d: %d to %d expected.\n"), "bvode", iPos + 1, 9, 0, 2);
-        free(M);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -321,8 +322,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // ltol
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -330,8 +331,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblLtol->getSize() != ipar[3])
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : An array of size %d (ipar(4)) expected.\n"), "bvode", iPos + 1, ipar[3]);
-        free(M);
+        Scierror(999, _("%s: Wrong size for input argument #%d: An array of size %d (ipar(4)) expected.\n"), "bvode", iPos + 1, ipar[3]);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -343,8 +344,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     double* pdblLtol = pDblLtol->get();
     if (pdblLtol[0] < 1 || pdblLtol[0] > sumM)
     {
-        Scierror(999, _("%s: Wrong value for input argument #%d : %d to sum of m (=%d) expected.\n"), "bvode", iPos + 1, 1, sumM);
-        free(M);
+        Scierror(999, _("%s: Wrong value for input argument #%d: %d to sum of m (=%d) expected.\n"), "bvode", iPos + 1, 1, sumM);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -353,8 +354,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     {
         if (pdblLtol[i - 1] >= pdblLtol[i] || pdblLtol[i - 1] > sumM)
         {
-            Scierror(999, _("%s: Wrong value for input argument #%d : Bad value for ltol(%d) : ltol(1) < ltol(2) < ... < ltol(NTOL) <= M (sum of m) expected.\n"), "bvode", iPos + 1, i);
-            free(M);
+            Scierror(999, _("%s: Wrong value for input argument #%d: Bad value for ltol(%d): ltol(1) < ltol(2) < ... < ltol(NTOL) <= M (sum of m) expected.\n"), "bvode", iPos + 1, i);
+            FREE(M);
             return types::Function::Error;
         }
     }
@@ -364,8 +365,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // tol
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -373,8 +374,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblTol->getSize() != ipar[3])
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : An array of size %d (ipar(4)) expected.\n"), "bvode", iPos + 1, ipar[3]);
-        free(M);
+        Scierror(999, _("%s: Wrong size for input argument #%d: An array of size %d (ipar(4)) expected.\n"), "bvode", iPos + 1, ipar[3]);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -383,8 +384,8 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
     // fixpnt
     if (in[iPos]->isDouble() == false)
     {
-        Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "bvode", iPos + 1);
-        free(M);
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "bvode", iPos + 1);
+        FREE(M);
         return types::Function::Error;
     }
 
@@ -392,14 +393,14 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     if (pDblFixpnt->getSize() != ipar[10] && ipar[10] != 0)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d : An array of size %d (ipar(11)) expected.\n"), "bvode", iPos + 1, ipar[10]);
-        free(M);
+        Scierror(999, _("%s: Wrong size for input argument #%d: An array of size %d (ipar(11)) expected.\n"), "bvode", iPos + 1, ipar[10]);
+        FREE(M);
         return types::Function::Error;
     }
 
     iPos++;
 
-    // functions : fsub,dfsub,gsub,dgsub,guess
+    // functions: fsub,dfsub,gsub,dgsub,guess
     DifferentialEquationFunctions* deFunctionsManager = new DifferentialEquationFunctions(L"bvode");
     DifferentialEquation::addDifferentialEquationFunctions(deFunctionsManager);
     deFunctionsManager->setBvodeM(sumM);
@@ -462,7 +463,7 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
                 Scierror(50, _("%s: Subroutine not found: %s\n"), "bvode", pst);
                 FREE(pst);
                 DifferentialEquation::removeDifferentialEquationFunctions();
-                free(M);
+                FREE(M);
                 return types::Function::Error;
             }
         }
@@ -472,9 +473,9 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
             if (pList->getSize() == 0)
             {
-                Scierror(50, _("%s: Argument #%d : Subroutine not found in list: %s\n"), "bvode", i + 1, "(string empty)");
+                Scierror(50, _("%s: Argument #%d: Subroutine not found in list: %s\n"), "bvode", i + 1, "(string empty)");
                 DifferentialEquation::removeDifferentialEquationFunctions();
-                free(M);
+                FREE(M);
                 return types::Function::Error;
             }
 
@@ -523,101 +524,50 @@ types::Function::ReturnValue sci_bvode(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"), "bvode", i + 1);
+                Scierror(999, _("%s: Wrong type for input argument #%d: The first argument in the list must be a Scilab function.\n"), "bvode", i + 1);
                 DifferentialEquation::removeDifferentialEquationFunctions();
-                free(M);
+                FREE(M);
                 return types::Function::Error;
             }
         }
         else
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d : A function expected.\n"), "bvode", i + 1);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A function expected.\n"), "bvode", i + 1);
             DifferentialEquation::removeDifferentialEquationFunctions();
-            free(M);
+            FREE(M);
             return types::Function::Error;
         }
     }
 
-    // *** check functions. ***
-
-    int ret     = 0;
-    int i       = 1;
-    double x    = 1;
-    double* z   = (double*)malloc(sumM * sizeof(double));
-    double* d   = (double*)malloc(ncomp * sumM * sizeof(double)); // max size
-
-    memset(z, 0x01, sumM);
-
-    // fsub
-    ret = bvode_fsub(&x, z, d);
-    if (ret == 0)
-    {
-        Scierror(98, _("%s: Argument #%d : Execution of %s function failed.\n"), "bvode", 11, "fsub");
-        free(d);
-        free(z);
-        DifferentialEquation::removeDifferentialEquationFunctions();
-        return types::Function::Error;
-    }
+    // *** Perform operation. ***
+    double* rwork   = (double*)MALLOC(ipar[4] * sizeof(double));
+    int* iwork      = (int*)MALLOC(ipar[5] * sizeof(int));
+    int* ltol       = (int*)MALLOC(pDblLtol->getSize() * sizeof(int));
 
-    // dfsub
-    ret = bvode_dfsub(&x, z, d);
-    if (ret == 0)
+    for (int i = 0; i < pDblLtol->getSize(); i++)
     {
-        Scierror(98, _("%s: Argument #%d : Execution of %s function failed.\n"), "bvode", 12, "dfsub");
-        free(d);
-        free(z);
-        DifferentialEquation::removeDifferentialEquationFunctions();
-        return types::Function::Error;
+        ltol[i] = (int)pDblLtol->get(i);
     }
 
-    // gsub
-    ret = bvode_gsub(&i, z, d);
-    if (ret == 0)
+    try
     {
-        Scierror(98, _("%s: Argument #%d : Execution of %s function failed.\n"), "bvode", 13, "gsub");
-        free(d);
-        free(z);
-        DifferentialEquation::removeDifferentialEquationFunctions();
-        return types::Function::Error;
+        C2F(colnew)(&ncomp, M, &aleft, &aright, pDblZeta->get(), ipar, ltol, pDblTol->get(), pDblFixpnt->get(), iwork, rwork, &iflag, bvode_fsub, bvode_dfsub, bvode_gsub, bvode_dgsub, bvode_guess);
     }
-
-    // dgsub
-    ret = bvode_dgsub(&i, z, d);
-    if (ret == 0)
+    catch (ScilabError &e)
     {
-        Scierror(98, _("%s: Argument #%d : Execution of ls function failed.\n"), "bvode", 14, "dgsub");
-        free(d);
-        free(z);
+        char* pstrMsg = wide_string_to_UTF8(e.GetErrorMessage().c_str());
+        sciprint(_("%s: exception caught in '%s' subroutine.\n"), "bvode", "colnew");
+        Scierror(999, pstrMsg);
+        FREE(pstrMsg);
+        FREE(iwork);
+        FREE(rwork);
+        FREE(M);
+        FREE(ltol);
         DifferentialEquation::removeDifferentialEquationFunctions();
-        return types::Function::Error;
-    }
 
-    // guess
-    ret = bvode_guess(&x, z, d);
-    if (ret == 0)
-    {
-        Scierror(98, _("%s: Argument #%d : Execution of %s function failed.\n"), "bvode", 15, "guess");
-        free(d);
-        free(z);
-        DifferentialEquation::removeDifferentialEquationFunctions();
         return types::Function::Error;
     }
 
-    free(d);
-    free(z);
-
-    // *** Perform operation. ***
-    double* rwork   = (double*)malloc(ipar[4] * sizeof(double));
-    int* iwork      = (int*)malloc(ipar[5] * sizeof(int));
-    int* ltol       = (int*)malloc(pDblLtol->getSize() * sizeof(int));
-
-    for (int i = 0; i < pDblLtol->getSize(); i++)
-    {
-        ltol[i] = (int)pDblLtol->get(i);
-    }
-
-    C2F(colnew)(&ncomp, M, &aleft, &aright, pDblZeta->get(), ipar, ltol, pDblTol->get(), pDblFixpnt->get(), iwork, rwork, &iflag, bvode_fsub, bvode_dfsub, bvode_gsub, bvode_dgsub, bvode_guess);
-
     if (iflag != 1)
     {
         if (iflag == 0)
@@ -637,17 +587,17 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
             Scierror(999, _("%s: There is an input data error.\n"), "bvode");
         }
 
-        free(iwork);
-        free(rwork);
-        free(M);
-        free(ltol);
+        FREE(iwork);
+        FREE(rwork);
+        FREE(M);
+        FREE(ltol);
         DifferentialEquation::removeDifferentialEquationFunctions();
 
         return types::Function::Error;
     }
 
     types::Double* pDblRes = new types::Double(sumM, pDblXpts->getSize());
-    double* res = (double*)malloc(pDblXpts->getSize() * sumM * sizeof(double));
+    double* res = (double*)MALLOC(pDblXpts->getSize() * sumM * sizeof(double));
     for (int i = 0; i < pDblXpts->getSize(); i++)
     {
         double val = pDblXpts->get(i);
@@ -656,11 +606,11 @@ types::Function::ReturnValue sci_bvode(types::typed_list &in, int _iRetCount, ty
 
     pDblRes->set(res);
 
-    free(iwork);
-    free(rwork);
-    free(M);
-    free(ltol);
-    free(res);
+    FREE(iwork);
+    FREE(rwork);
+    FREE(M);
+    FREE(ltol);
+    FREE(res);
     DifferentialEquation::removeDifferentialEquationFunctions();
 
     // *** Return result in Scilab. ***