* Bug #13491 fixed - DE: intg now properly returns when the user function produces... 20/14820/4
Paul Bignier [Tue, 8 Jul 2014 08:26:07 +0000 (10:26 +0200)]
Change-Id: Iea5f984b6b58256215853bedc14bbb5b01e76264

scilab/CHANGES_5.5.X
scilab/modules/differential_equations/src/fortran/dqk21.f
scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.dia.ref [new file with mode: 0644]
scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.tst [new file with mode: 0644]

index ccdec82..e91c6a1 100644 (file)
@@ -138,6 +138,8 @@ Scilab Bug Fixes
 
 * Bug #13438 fixed - drawaxis did not return the handle of the created axis.
 
+* Bug #13491 fixed - intg now properly returns when the user function produces an error.
+
 * Bug #13501 fixed - Typos fixed in English help pages.
 
 
index 9ea1458..29bd2e9 100644 (file)
@@ -55,6 +55,7 @@ c
      *  resg,resk,reskh,result,uflow,wg,wgk,xgk
       integer j,jtw,jtwm1
       external f
+      common/ierajf/iero
 c
       dimension fv1(10),fv2(10),wg(5),wgk(11),xgk(11)
 c
@@ -140,13 +141,16 @@ c           the integral, and estimate the absolute error.
 c
       resg = 0.0d+00
       fc = f(centr)
+      if(iero.gt.0) return
       resk = wgk(11)*fc
       resabs = dabs(resk)
       do 10 j=1,5
         jtw = 2*j
         absc = hlgth*xgk(jtw)
         fval1 = f(centr-absc)
+        if(iero.gt.0) return
         fval2 = f(centr+absc)
+        if(iero.gt.0) return
         fv1(jtw) = fval1
         fv2(jtw) = fval2
         fsum = fval1+fval2
@@ -158,7 +162,9 @@ c
         jtwm1 = 2*j-1
         absc = hlgth*xgk(jtwm1)
         fval1 = f(centr-absc)
+        if(iero.gt.0) return
         fval2 = f(centr+absc)
+        if(iero.gt.0) return
         fv1(jtwm1) = fval1
         fv2(jtwm1) = fval2
         fsum = fval1+fval2
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.dia.ref b/scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.dia.ref
new file mode 100644 (file)
index 0000000..913f0cd
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13491 -->
+//
+// <-- Bugzilla URL -->
+//http://bugzilla.scilab.org/show_bug.cgi?id=13491
+//
+// <-- Short Description -->
+// intg now properly returns when the user function produces an error.
+deff("y = f(x)", "y = sin(x) ./ x");
+// This function is going to be evaluated by intg at the midpoint of the interval [-1; 1], so it will produce a "Division by zero" error.
+refMsg = msprintf(_("Division by zero...\n"));
+assert_checkerror("intg(-1, 1, f)", refMsg);
+deff("y = f(x)", "y = b");
+Attention : Red√©finition de la fonction : f                       . Utilisez funcprot(0) pour ne pas afficher ce message.
+
+// In any evaluation point, 'b' is unknown so the function will yield an error.
+refMsg = msprintf(_("Undefined variable: %s\n"), "b");
+assert_checkerror("intg(-1, 1, f)", refMsg);
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.tst b/scilab/modules/differential_equations/tests/nonreg_tests/bug_13491.tst
new file mode 100644 (file)
index 0000000..3073e21
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13491 -->
+//
+// <-- Bugzilla URL -->
+//http://bugzilla.scilab.org/show_bug.cgi?id=13491
+//
+// <-- Short Description -->
+// intg now properly returns when the user function produces an error.
+
+deff("y = f(x)", "y = sin(x) ./ x");
+// This function is going to be evaluated by intg at the midpoint of the interval [-1; 1], so it will produce a "Division by zero" error.
+refMsg = msprintf(_("Division by zero...\n"));
+assert_checkerror("intg(-1, 1, f)", refMsg);
+
+deff("y = f(x)", "y = b");
+// In any evaluation point, 'b' is unknown so the function will yield an error.
+refMsg = msprintf(_("Undefined variable: %s\n"), "b");
+assert_checkerror("intg(-1, 1, f)", refMsg);