bug 4715 fix
Serge Steer [Sat, 8 Aug 2009 20:30:37 +0000 (22:30 +0200)]
scilab/modules/scicos/macros/scicos_auto/scicos_simulate.sci
scilab/modules/scicos/macros/scicos_scicos/do_eval.sci
scilab/modules/scicos/tests/nonreg_tests/bug_4715.cos [new file with mode: 0644]
scilab/modules/scicos/tests/nonreg_tests/bug_4715.dia.ref [new file with mode: 0644]
scilab/modules/scicos/tests/nonreg_tests/bug_4715.tst [new file with mode: 0644]
scilab/modules/scicos_blocks/macros/Linear/CLR.sci
scilab/modules/scicos_blocks/macros/Linear/CLR_f.sci
scilab/modules/scicos_blocks/macros/Linear/DLR.sci
scilab/modules/scicos_blocks/macros/Linear/DLR_f.sci

index 03ffac0..7f72978 100644 (file)
@@ -83,17 +83,17 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
   //** list of scopes to ignore
   Ignoreb = ['bouncexy', ...
              'cscope', ...
-                                                'cmscope', ...
-                                                'canimxy', ...
-                                                'canimxy3d', ...
-                                                'cevscpe', ...
-                                                'cfscope', ...
-                                                'cscopxy', ...
-                                                'cscopxy3d', ...
-                                                'cmatview', ...
-                                                'cmat3d', ...
-                                                'affich', ...
-                                                'affich2']
+            'cmscope', ...
+            'canimxy', ...
+            'canimxy3d', ...
+            'cevscpe', ...
+            'cfscope', ...
+            'cscopxy', ...
+            'cscopxy3d', ...
+            'cmatview', ...
+            'cmat3d', ...
+            'affich', ...
+            'affich2']
 
   //** load macros libraries and palettes
   // Scilab 5 new modules split
@@ -117,7 +117,7 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
     flag            = []
     Ignb            = []
 
-       elseif argn(2) == 2 then
+  elseif argn(2) == 2 then
     if type(Info) == 10 & (stripblanks(Info) == 'nw') then
       Info = list()
       flag = 'nw'
@@ -145,7 +145,7 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
     end
     Ignb = []
 
-       elseif argn(2) == 4 then
+  elseif argn(2) == 4 then
     if type(Info) <> 15 then
       Info = list()
     end
@@ -159,7 +159,7 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
     end
     Ignb = []
 
-       elseif argn(2) == 5 then
+  elseif argn(2) == 5 then
     if type(Info) <> 15 then
       Info = list()
     end
@@ -177,10 +177,10 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
       Ignb = (Ignb(:))'
     end
 
-       else
-     error(mprintf(gettext("%s: Wrong number of input arguments. Must be between %d and %d.\n"), "scicos_simulate", 1, 5))
+  else
+    error(mprintf(gettext("%s: Wrong number of input arguments. Must be between %d and %d.\n"), "scicos_simulate", 1, 5))
   end
-
+  
   //check version
   current_version = get_scicos_version()
   scicos_ver = find_scicos_version(scs_m)
@@ -231,11 +231,11 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
     [%tcur, %cpr, alreadyran, needstart, needcompile, %state0] = Info(:)
   else
     %tcur = 0;
-               %cpr = list();
-               alreadyran = %f;
-               needstart = %t;
-               needcompile = 4;
-               %state0 = list();
+    %cpr = list();
+    alreadyran = %f;
+    needstart = %t;
+    needcompile = 4;
+    %state0 = list();
   end
 
   //** set solver
@@ -246,30 +246,32 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
   //** set variables of context
   [%scicos_context, ierr] = script2var(scs_m.props.context, ...
                %scicos_context);
-
   if ierr == 0 then //++ no error
 
     [scs_m, %cpr, needcompile, ok] = do_eval(scs_m, %cpr)
-
+    if ~ok then 
+       error(['Error during block parameters evaluation , ' + lasterror()])
+    end
     if needcompile <> 4 & size(%cpr) > 0 then
-                       %state0 = %cpr.state
-               end
+      %state0 = %cpr.state
+    end
     alreadyran = %f
   else
     error(['Incorrect context definition, ' + lasterror()])
   end
 
   if %cpr == list() then
-               need_suppress  =%t
-       else
-               need_suppress = %f
-       end
+    need_suppress  =%t
+  else
+    need_suppress = %f
+  end
 
   [%cpr, %state0_n, needcompile, alreadyran, ok] = do_update(%cpr, ...
-               %state0, needcompile)
+               %state0, needcompile)   
+  
   if ~ok then
-               error('Error updating parameters.')
-       end
+    error('Error updating parameters.')
+  end
 
   if or(%state0_n <> %state0) then //initial state has been changed
     %state0 = %state0_n
@@ -292,9 +294,9 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
   if need_suppress then //this is done only once
     for i = 1:length(%cpr.sim.funs)
       if type(%cpr.sim.funs(i)) <> 13 then
-                               if find(%cpr.sim.funs(i)(1) == Ignore) <> [] then
-                                       %cpr.sim.funs(i)(1) = 'trash';
-                               end
+       if find(%cpr.sim.funs(i)(1) == Ignore) <> [] then
+         %cpr.sim.funs(i)(1) = 'trash';
+       end
       end
     end
   end
@@ -310,7 +312,6 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
     if tf*tolerances == [] then
       error(['Simulation parameters not set']);
     end
-
     ierr = execstr('[state, t] = scicosim(%cpr.state, %tcur, tf, %cpr.sim,' + ..
                 '''start'', tolerances)','errcatch')
     if ierr <> 0 then
@@ -321,7 +322,6 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
 
   ierr = execstr('[state, t] = scicosim(%cpr.state, %tcur, tf, %cpr.sim,' + ..
                '''run'', tolerances)','errcatch')
-
   if ierr == 0 then
     %cpr.state = state
     alreadyran = %t
index d1196f2..a90e88d 100644 (file)
 //
 
 function [scs_m, cpr, needcompile, ok] = do_eval(scs_m, cpr)
-       // This function (re)-evaluates blocks in the scicos data structure scs_m
+// This function (re)-evaluates blocks in the scicos data structure scs_m
 
-       ok = %t
-       needcompile1 = max(2,needcompile)
-       %mprt = funcprot()
-       funcprot(0)
-       getvalue = setvalue;
+  ok = %t
+  needcompile1 = max(2,needcompile)
+  %mprt = funcprot()
+  funcprot(0)
+  getvalue = setvalue;
+  
+  function message(txt)
+    messagebox(['In block ' + o.gui + ': ';
+               txt;
+              'current parameter value kept'],'error','modal'); 
+    %scicos_prob = resume(%t)
+  endfunction
 
-       deff('message(txt)','messagebox(''In block '' + o.gui + '': '' + txt,""modal""); %scicos_prob = resume(%t)')
-
-       %scicos_prob = %f
-       deff('[ok, tt] = FORTR(funam, tt, i, o)','ok = %t')
-       deff('[ok, tt] = CFORTR2(funam, tt, i, o)','ok = %t')
-       deff('[ok, tt] = CFORTR(funam, tt, i, o)','ok = %t')
-       deff('[x, y, ok, gc] = edit_curv(x, y, job, tit, gc)','ok = %t')
-       deff('[ok,tt,dep_ut] = genfunc1(tt, ni, no, nci, nco, nx, nz, nrp, type_)',..
-                       'dep_ut = model.dep_ut; ok = %t')
-       deff('result = dialog(labels, valueini)','result = valueini')
-       %nx = lstsize(scs_m.objs)
-       deff('[ok, tt] = MODCOM(funam, tt, vinp, vout, vparam, vparamv, vpprop)',..
-                '[dirF, nameF, extF]=fileparts(funam);..
-                       tarpath = pathconvert(TMPDIR + ''/Modelica/'', %f, %t);..
-                       if (extF == '''')  then,..
-                                       funam1 = tarpath + nameF + ''.mo'';..
-                       elseif fileinfo(funam) == [] then,..
-                                       funam1 = funam;..
-                       end;..
-                       mputl(tt, funam1);..
-                       compilerpath = pathconvert(SCI + ''/bin/'', %f, %t);..
-                       if MSDOS then,..
-                               compilerpath = compilerpath + ''modelicac.exe'';..
-                       else,..
-                               compilerpath = compilerpath + ''modelicac'';..
-                       end;..
-                       ..
-                       if execstr(''unix_s(compilerpath + '''' -c '''' + funam1 + '''' -o '''' + tarpath + nameF + ''''.moc'''')'',''errcatch'') <> 0 then,..
-                               ok = %f;..
-                       else,..
-                               ok=%t;..
-                       end;')
-       funcprot(%mprt)
-
-       for %kk = 1:%nx
-               o = scs_m.objs(%kk)
-               if typeof(o) == 'Block' then
-                       model = o.model
-                       if model.sim == 'super' | (model.sim == 'csuper' & model.ipar <> 1) then  //exclude mask
-                               sblock = model.rpar
-                               context = sblock.props.context
-
-                               [%scicos_context, ierr] = script2var(context, %scicos_context)
-
-                               if ierr <> 0 then
-                                       %now_win = xget('window')
-                                       message(['Cannot evaluate a context '; lasterror()])
-                                       xset('window', %now_win)
-                               else
-                                       [sblock, %w, needcompile2, ok] = do_eval(sblock, list())
-                                       needcompile1 = max(needcompile1, needcompile2)
-                                       if ok then
-                                               scs_m.objs(%kk).model.rpar = sblock
-                                       end
-                               end
-                       else
-                               model = o.model
-
-                               // should we generate a message here ?
-                               ier = execstr('o = ' + o.gui + '(''set'',o)', 'errcatch')
-
-                               if ier == 0 then //++ no error
-                                       needcompile1 = max(needcompile1, needcompile) // for scifunc_block
-                                       model_n = o.model
-                                       if or(model.blocktype <> model_n.blocktype) | .. // type 'c','d','z','l'
-                                                or(model.dep_ut <> model_n.dep_ut) | ..
-                                                (model.nzcross <> model_n.nzcross) | ..
-                                                (model.nmode <> model_n.nmode) then
-                                        needcompile1 = 4
-                                       end
-                                       if (size(model.in,'*')    <> size(model_n.in,'*')) | ..
-                                                (size(model.out,'*')   <> size(model_n.out,'*')) | ..
-                                                (size(model.evtin,'*') <> size(model_n.evtin,'*')) then
-                                        // number of input (evt or regular ) or output  changed
-                                        needcompile1 = 4
-                                       end
-                                       if model.sim == 'input' | model.sim == 'output' then
-                                               if model.ipar <> model_n.ipar then
-                                                        needcompile1 = 4
-                                               end
-                                       end
-                                       scs_m.objs(%kk) = o
-                               end // message for else here
-                       end
-               end
-       end
-
-       needcompile = needcompile1
-
-       if needcompile == 4 then
-               cpr = list()
+  %scicos_prob = %f
+  deff('[ok, tt] = FORTR(funam, tt, i, o)','ok = %t')
+  deff('[ok, tt] = CFORTR2(funam, tt, i, o)','ok = %t')
+  deff('[ok, tt] = CFORTR(funam, tt, i, o)','ok = %t')
+  deff('[x, y, ok, gc] = edit_curv(x, y, job, tit, gc)','ok = %t')
+  deff('[ok,tt,dep_ut] = genfunc1(tt, ni, no, nci, nco, nx, nz, nrp, type_)',..
+       'dep_ut = model.dep_ut; ok = %t')
+  deff('result = dialog(labels, valueini)','result = valueini')
+  %nx = lstsize(scs_m.objs)
+  deff('[ok, tt] = MODCOM(funam, tt, vinp, vout, vparam, vparamv, vpprop)',..
+       ['[dirF, nameF, extF]=fileparts(funam);'
+       'tarpath = pathconvert(TMPDIR + ''/Modelica/'', %f, %t);'
+       'if (extF == '''')  then'
+       '  funam1 = tarpath + nameF + ''.mo'';'
+       'elseif fileinfo(funam) == [] then'
+       '  funam1 = funam;'
+       'end;'
+       'mputl(tt, funam1);'
+       'compilerpath = pathconvert(SCI + ''/bin/'', %f, %t);'
+       'if MSDOS then'
+       '  compilerpath = compilerpath + ''modelicac.exe'';'
+       'else'
+       '  compilerpath = compilerpath + ''modelicac'';'
+       'end'
+       'if execstr(''unix_s(compilerpath + '''' -c '''' + funam1 + '''' -o '''' + tarpath + nameF + ''''.moc'''')'',''errcatch'') <> 0 then'
+       '  ok = %f;'
+       'else'
+       '  ok=%t;'
+       'end;'])
+  
+  funcprot(%mprt)
+  
+  for %kk = 1:%nx
+    o = scs_m.objs(%kk)
+    if typeof(o) == 'Block' then
+      model = o.model
+      if model.sim == 'super' | (model.sim == 'csuper' & model.ipar <> 1) then  //exclude mask
+       sblock = model.rpar
+       context = sblock.props.context
+       
+       [%scicos_context, ierr] = script2var(context, %scicos_context)
+       
+       if ierr <> 0 then
+         %now_win = xget('window')
+         message(['Cannot evaluate a context '; lasterror()])
+         xset('window', %now_win)
+       else
+         
+         [sblock, %w, needcompile2, ok] = do_eval(sblock, list())
+         needcompile1 = max(needcompile1, needcompile2)
+         if ok then
+           scs_m.objs(%kk).model.rpar = sblock
+         end
        end
+      else
+       model = o.model
+       // should we generate a message here ?
+       ier = execstr('o = ' + o.gui + '(''set'',o)', 'errcatch')
+       mprintf('%s:%d\n',o.gui,ier)
+       if ier == 0 then //++ no error
+         needcompile1 = max(needcompile1, needcompile) // for scifunc_block
+         model_n = o.model
+         if or(model.blocktype <> model_n.blocktype) | .. // type 'c','d','z','l'
+               or(model.dep_ut <> model_n.dep_ut) | ..
+               (model.nzcross <> model_n.nzcross) | ..
+               (model.nmode <> model_n.nmode) then
+           needcompile1 = 4
+         end
+         if (size(model.in,'*')    <> size(model_n.in,'*')) | ..
+               (size(model.out,'*')   <> size(model_n.out,'*')) | ..
+               (size(model.evtin,'*') <> size(model_n.evtin,'*')) then
+           // number of input (evt or regular ) or output  changed
+           needcompile1 = 4
+         end
+         if model.sim == 'input' | model.sim == 'output' then
+           if model.ipar <> model_n.ipar then
+             needcompile1 = 4
+           end
+         end
+         scs_m.objs(%kk) = o
+       end // message for else here
+      end
+    end
+  end
+  
+  needcompile = needcompile1
+  
+  if needcompile == 4 then
+    cpr = list()
+  end
 endfunction
-
+  
+  
diff --git a/scilab/modules/scicos/tests/nonreg_tests/bug_4715.cos b/scilab/modules/scicos/tests/nonreg_tests/bug_4715.cos
new file mode 100644 (file)
index 0000000..aaf291b
Binary files /dev/null and b/scilab/modules/scicos/tests/nonreg_tests/bug_4715.cos differ
diff --git a/scilab/modules/scicos/tests/nonreg_tests/bug_4715.dia.ref b/scilab/modules/scicos/tests/nonreg_tests/bug_4715.dia.ref
new file mode 100644 (file)
index 0000000..0bdf7c4
--- /dev/null
@@ -0,0 +1,43 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 INRIA Serge.Steer@inria.fr
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 4715 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=4715
+//
+// <-- Short Description -->
+//
+//
+path=get_absolute_file_path('bug_4715.tst')
+ path  =
+ TMPDIR/   
+load(SCI+'/modules/scicos/tests/nonreg_tests/bug_4715.cos');
+%scicos_context.a=0.1;
+%scicos_context.b=0.1;
+global AA
+Info=scicos_simulate(scs_m,list(),%scicos_context,'nw');
+STEP:0
+OUT_f:0
+CLKOUT_f:0
+EVTDLY_f:0
+CLKSPLIT_f:0
+CSCOPE:0
+MUX:0
+CLR:0
+SUMMATION:0
+CLR:0
+SPLIT_f:0
+SPLIT_f:0
+SUMMATION:0
+SPLIT_f:0
+SPLIT_f:0
+INTEGRAL:0
+POWBLK_f:0
+scifunc_block:0
+res=AA;clearglobal AA
+if abs(res-1.56012845688924151)>1d-10 then bugmes();quit;end
diff --git a/scilab/modules/scicos/tests/nonreg_tests/bug_4715.tst b/scilab/modules/scicos/tests/nonreg_tests/bug_4715.tst
new file mode 100644 (file)
index 0000000..da5e38c
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 INRIA Serge.Steer@inria.fr
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 4715 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=4715
+//
+// <-- Short Description -->
+// 
+// 
+path=get_absolute_file_path('bug_4715.tst')
+load(SCI+'/modules/scicos/tests/nonreg_tests/bug_4715.cos');
+%scicos_context.a=0.1;
+%scicos_context.b=0.1;
+global AA
+Info=scicos_simulate(scs_m,list(),%scicos_context,'nw');
+res=AA;clearglobal AA
+if abs(res-1.56012845688924151)>1d-10 then pause,end
index 6be8a24..cbad4f1 100644 (file)
@@ -37,7 +37,8 @@ case 'set' then
   x0=model.state
   rpar=model.rpar
   ns=prod(size(x0));nin=1;nout=1
-  %scicos_context.s=%s
+  %scicos_context=%scicos_context; //copy the semi-global variable locally
+  %scicos_context.s=%s //add s definition to the context
   while %t do
     [ok,num,den,exprs]=getvalue('Set continuous SISO transfer parameters',..
        ['Numerator (s)';
index 9a1c544..c96e188 100644 (file)
@@ -37,7 +37,9 @@ case 'set' then
   x0=model.state
   rpar=model.rpar
   ns=prod(size(x0));nin=1;nout=1
-  %scicos_context.s=%s
+  %scicos_context=%scicos_context; //copy the semi-global variable locally
+  %scicos_context.s=%s //add s definition to the context
+
   while %t do
     [ok,num,den,exprs]=getvalue('Set continuous SISO transfer parameters',..
        ['Numerator (s)';
index 5b313e4..1a8019b 100644 (file)
@@ -35,7 +35,8 @@ case 'set' then
   graphics=arg1.graphics;exprs=graphics.exprs
   model=arg1.model;
   x0=model.dstate;ns=prod(size(x0));
-    %scicos_context.z=%z
+  %scicos_context=%scicos_context; //copy the semi-global variable locally
+  %scicos_context.z=%z //add z definition to the context
   while %t do
     [ok,num,den,exprs]=getvalue('Set discrete SISO transfer parameters',..
        ['Numerator (z)';
index a8554e1..c5590e2 100644 (file)
@@ -35,7 +35,8 @@ case 'set' then
   graphics=arg1.graphics;exprs=graphics.exprs
   model=arg1.model;
   x0=model.dstate;ns=prod(size(x0));
-  %scicos_context.z=%z
+  %scicos_context=%scicos_context; //copy the semi-global variable locally
+  %scicos_context.z=%z //add z definition to the context
   while %t do
     [ok,num,den,exprs]=getvalue('Set discrete SISO transfer parameters',..
        ['Numerator (z)';