* Bug #8561 fixed - Differential_equations: controlling size of tolerances 37/11737/8
Paul BIGNIER [Wed, 19 Jun 2013 10:13:39 +0000 (12:13 +0200)]
Absolute and relative tolerances had to be of the same size, but could be different of 1 and neq

Change-Id: I6a3a630497c26aed0baa93775b5f23e17f9bf594

scilab/CHANGES_5.5.X
scilab/modules/differential_equations/help/en_US/daskr.xml
scilab/modules/differential_equations/help/en_US/dasrt.xml
scilab/modules/differential_equations/help/en_US/dassl.xml
scilab/modules/differential_equations/help/fr_FR/daskr.xml
scilab/modules/differential_equations/sci_gateway/fortran/sci_f_daskr.f
scilab/modules/differential_equations/sci_gateway/fortran/sci_f_dasrt.f
scilab/modules/differential_equations/sci_gateway/fortran/sci_f_dassl.f
scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.dia.ref [new file with mode: 0644]
scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.tst [new file with mode: 0644]

index 505b6b2..c753da0 100644 (file)
@@ -255,6 +255,8 @@ Bug fixes
 * Bug #8511 fixed - sprand used rand and grand functions, and internal state of the random
                     generator was changed.
 
+* Bug #8561 fixed - ddassl(), ddasrt(), ddaskr(): abs and rel tolerances sizes are now checked.
+
 * Bug #8597 fixed - Uncontrolled message of grand/clcg4 should be displayed as warning.
 
 * Bug #8607 fixed - Some error messages in modules/overloading/macros were not standard and not localized.
index e1f710a..3d4bd85 100644 (file)
@@ -70,9 +70,9 @@
                 <term>atol, rtol</term>
                 <listitem>
                     <para>real scalars or column vectors of same size as
-                        <literal>y</literal>. <literal>atol</literal> and <literal>rtol</literal> give respectively
-                        absolute and relative error tolerances of solution.
-                        If vectors, then the tolerances are specified for each component of
+                        <literal>y</literal> or both of size 1. <literal>atol</literal> and <literal>rtol</literal> give respectively
+                        absolute and relative error tolerances of solution. If vectors, the
+                        tolerances are specified for each component of
                         <literal>y</literal>.
                     </para>
                 </listitem>
index 764b6f2..b3e07c8 100644 (file)
@@ -83,8 +83,8 @@
                 <term>atol, rtol</term>
                 <listitem>
                     <para>real scalars or column vectors of same size as
-                        <literal>y</literal>. <literal>atol, rtol</literal> give respectively
-                        absolute and relative error tolerances of solution. If vectors the
+                        <literal>y</literal> or both of size 1. <literal>atol, rtol</literal> give respectively
+                        absolute and relative error tolerances of solution. If vectors, the
                         tolerances are specified for each component of
                         <literal>y</literal>.
                     </para>
index cbf8fbd..ef94585 100644 (file)
@@ -71,9 +71,9 @@
             <varlistentry>
                 <term>atol, rtol</term>
                 <listitem>
-                    <para>a real scalars or column vectors of same size as
-                        <literal>y</literal>. <literal>atol, rtol</literal> give respectively
-                        absolute and relative error tolerances of solution. If vectors the
+                    <para>real scalars or column vectors of same size as
+                        <literal>y</literal> or both of size 1. <literal>atol, rtol</literal> give respectively
+                        absolute and relative error tolerances of solution. If vectors, the
                         tolerances are specified for each component of
                         <literal>y</literal>.
                     </para>
index f324865..d4c2d67 100644 (file)
@@ -70,7 +70,7 @@
                 <term>atol, rtol</term>
                 <listitem>
                     <para>réels scalaires ou vecteurs colonnes de même taille que
-                        <literal>y</literal>. <literal>atol</literal> et <literal>rtol</literal> représentent
+                        <literal>y</literal> ou tous deux de taille <literal>1</literal>. <literal>atol</literal> et <literal>rtol</literal> représentent
                         les tolérances d'erreur absolue et relative de la solution.
                         Si ce sont des vecteurs, alors les tolérances sont spécifiées pour chaque composante de
                         <literal>y</literal>.
index 7a25ce3..ef0db5c 100644 (file)
@@ -114,7 +114,7 @@ c     --------------------------------
       endif
       if(.not.getrvect(fname,topk,top-rhs+5,m5,n5,lrtol))return
       m5 = m5*n5
-      if(m5.ne.m4) then
+      if(m5.ne.m4.or.(m5.ne.1.and.m5.ne.neq)) then
          call error(60)
          return
       endif
index e670a51..688b31e 100644 (file)
@@ -109,7 +109,7 @@ c     --------------------------------
       endif
       if(.not.getrvect(fname,topk,top-rhs+5,m5,n5,lrtol))return
       m5 = m5*n5
-      if(m5.ne.m4) then
+      if(m5.ne.m4.or.(m5.ne.1.and.m5.ne.neq)) then
          call error(60)
          return
       endif
index 2525e10..93f56e9 100644 (file)
@@ -106,7 +106,7 @@ c     --------------------------------
       endif
       if(.not.getrvect(fname,topk,top-rhs+5,m5,n5,lrtol))return
       m5 = m5*n5
-      if(m5.ne.m4) then
+      if(m5.ne.m4.or.(m5.ne.1.and.m5.ne.neq)) then
          call error(60)
          return
       endif
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.dia.ref b/scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.dia.ref
new file mode 100644 (file)
index 0000000..5f651b4
--- /dev/null
@@ -0,0 +1,107 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+// <-- Non-regression test for bug 8561 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8561
+//
+// <-- Short Description -->
+//    Absolute and relative tolerances sizes were not properly checked.
+m = 1; l = 1; g = 10;
+theta0 = 0.2; fi0 = %pi/4;
+x0 = l*sin(fi0)*cos(theta0);
+y0 = l*cos(fi0)*cos(theta0);
+z0 = l*sin(theta0);
+Y0  = [x0; y0; z0; cos(fi0)/sin(fi0); -1; 0; 0];
+Yd0 = [Y0(4:6) ; 0; 0; -g; 0];
+t = 0:0.01:15;
+function [res, ires] = f(t, y, yd)
+  res = [yd(1:3) - y(4:6);
+         yd(4:6) + 2*y(1:3)*y(7)/m + [0; 0; g];
+         2*y(4:6)'*y(1:3)];
+  ires = 0;
+endfunction
+// DASSL
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+assert_checkfalse(execstr("y = dassl([Y0 Yd0], 0, t, atol, rtol, f);", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("y = dassl([Y0 Yd0], 0, t, atol, rtol, f);", refMsg);
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+y = dassl([Y0 Yd0], 0, t, atol, rtol, f);
+expected = [ 15.;
+              0.1104081129188701354549;
+              0.5384584912402592404845;
+             -0.8336030864039580823288;
+              1.7825915530763680738602;
+             -3.8054019000300813857507;
+             -2.2219595142170018853278;
+             15.511893653170394813401;
+              1.78229669499488441176;
+             -3.8049312150854541769718;
+             -2.2214274190024529964660;
+             -3.4259257364524438038700;
+            -16.6998600484128587595;
+             15.860513004937361714042;
+             33.034886001109668995923 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);
+// DASRT
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+assert_checkfalse(execstr("[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", refMsg);
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, 'gr1');
+expected = [ 15.;
+              0.1104081129188701354549;
+              0.5384584912402592404845;
+             -0.8336030864039580823288;
+              1.7825915530763680738602;
+             -3.8054019000300813857507;
+             -2.2219595142170018853278;
+             15.511893653170394813401;
+              1.78229669499488441176;
+             -3.8049312150854541769718;
+             -2.2214274190024529964660;
+             -3.4259257364524438038700;
+            -16.6998600484128587595;
+             15.860513004937361714042;
+             33.034886001109668995923 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);
+// DASKR
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+assert_checkfalse(execstr("[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", refMsg);
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, 'gr1');
+expected = [ 15.;
+              0.1092127719669352264864;
+              0.5544355723986162942651;
+             -0.824314447102621028485;
+              1.754185750256217479759;
+             -3.7591067613357669330298;
+             -2.2959555478405855311053;
+             15.383436140631456368055;
+              1.7541507611964979318486;
+             -3.7586982499985461814163;
+             -2.2961083123431151875593;
+             -3.3610655360531245250399;
+            -17.04596009480534490876;
+             15.354244029596573639651;
+             34.3716099776587071801 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.tst b/scilab/modules/differential_equations/tests/nonreg_tests/bug_8561.tst
new file mode 100644 (file)
index 0000000..d18c132
--- /dev/null
@@ -0,0 +1,122 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+
+// <-- Non-regression test for bug 8561 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8561
+//
+// <-- Short Description -->
+//    Absolute and relative tolerances sizes were not properly checked.
+
+m = 1; l = 1; g = 10;
+theta0 = 0.2; fi0 = %pi/4;
+x0 = l*sin(fi0)*cos(theta0);
+y0 = l*cos(fi0)*cos(theta0);
+z0 = l*sin(theta0);
+Y0  = [x0; y0; z0; cos(fi0)/sin(fi0); -1; 0; 0];
+Yd0 = [Y0(4:6) ; 0; 0; -g; 0];
+t = 0:0.01:15;
+function [res, ires] = f(t, y, yd)
+  res = [yd(1:3) - y(4:6);
+         yd(4:6) + 2*y(1:3)*y(7)/m + [0; 0; g];
+         2*y(4:6)'*y(1:3)];
+  ires = 0;
+endfunction
+
+// DASSL
+
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+
+assert_checkfalse(execstr("y = dassl([Y0 Yd0], 0, t, atol, rtol, f);", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("y = dassl([Y0 Yd0], 0, t, atol, rtol, f);", refMsg);
+
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+y = dassl([Y0 Yd0], 0, t, atol, rtol, f);
+expected = [ 15.;
+              0.1104081129188701354549;
+              0.5384584912402592404845;
+             -0.8336030864039580823288;
+              1.7825915530763680738602;
+             -3.8054019000300813857507;
+             -2.2219595142170018853278;
+             15.511893653170394813401;
+              1.78229669499488441176;
+             -3.8049312150854541769718;
+             -2.2214274190024529964660;
+             -3.4259257364524438038700;
+            -16.6998600484128587595;
+             15.860513004937361714042;
+             33.034886001109668995923 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);
+
+// DASRT
+
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+
+assert_checkfalse(execstr("[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", refMsg);
+
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+[y, n] = dasrt([Y0 Yd0], 0, t, atol, rtol, f, 0, 'gr1');
+expected = [ 15.;
+              0.1104081129188701354549;
+              0.5384584912402592404845;
+             -0.8336030864039580823288;
+              1.7825915530763680738602;
+             -3.8054019000300813857507;
+             -2.2219595142170018853278;
+             15.511893653170394813401;
+              1.78229669499488441176;
+             -3.8049312150854541769718;
+             -2.2214274190024529964660;
+             -3.4259257364524438038700;
+            -16.6998600484128587595;
+             15.860513004937361714042;
+             33.034886001109668995923 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);
+
+// DASKR
+
+//rtol and atol should have 7 elements, because neq = 7
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4];
+atol = 2*rtol;
+
+assert_checkfalse(execstr("[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", "errcatch") == 0);
+refMsg = msprintf(_("Wrong size for argument: Incompatible dimensions.\n"));
+assert_checkerror("[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, ''gr1'');", refMsg);
+
+rtol = [1e-5, 1e-5, 1e-5, 1e-4, 1e-4, 1e-4, 1e-3];
+atol = 2*rtol;
+[y, n] = daskr([Y0 Yd0], 0, t, atol, rtol, f, 0, 'gr1');
+expected = [ 15.;
+              0.1092127719669352264864;
+              0.5544355723986162942651;
+             -0.824314447102621028485;
+              1.754185750256217479759;
+             -3.7591067613357669330298;
+             -2.2959555478405855311053;
+             15.383436140631456368055;
+              1.7541507611964979318486;
+             -3.7586982499985461814163;
+             -2.2961083123431151875593;
+             -3.3610655360531245250399;
+            -17.04596009480534490876;
+             15.354244029596573639651;
+             34.3716099776587071801 ];
+assert_checkalmostequal(y(:,1501), expected, 5*10^-1);