bug 8798 fix, The context parameter of scicos_simulate is not taken into account 48/2948/7
Serge Steer [Tue, 18 Jan 2011 16:36:17 +0000 (17:36 +0100)]
Change-Id: I039dfcc35b174b6ae9be3575b9f0c153c43012d6

12 files changed:
scilab/CHANGES_5.3.X
scilab/modules/scicos/macros/scicos_auto/scicos_simulate.sci
scilab/modules/scicos/macros/scicos_scicos/script2var.sci
scilab/modules/scicos/macros/scicos_utils/scicos_workspace_init.sci [new file with mode: 0644]
scilab/modules/xcos/demos/batch_simulation.xcos [new file with mode: 0644]
scilab/modules/xcos/help/en_US/batch_functions/scicos_simulate.xml
scilab/modules/xcos/help/images/batch_simulation.png [new file with mode: 0644]
scilab/modules/xcos/macros/xcos_simulate.sci
scilab/modules/xcos/macros/xcos_workspace_init.sci [moved from scilab/modules/scicos/macros/scicos_utils/xcos_workspace_init.sci with 69% similarity]
scilab/modules/xcos/tests/nonreg_tests/batch_simulation.xcos [new file with mode: 0644]
scilab/modules/xcos/tests/nonreg_tests/bug_8798.dia.ref [new file with mode: 0644]
scilab/modules/xcos/tests/nonreg_tests/bug_8798.tst [new file with mode: 0644]

index 4251512..7b992c9 100644 (file)
@@ -237,6 +237,9 @@ Xcos:
 * bug 8737 fixed - Compilation failed when a diagram contains any hidden links
                    (wrong indexes issues).
 
+* bug 8798 fixed - The context parameter of scicos_simulate was not taken into 
+                   account.
+
 * bug 8818 fixed - Generic modelica blocks did not transform Scilab exponential
                    notation to Modelica one.
 
@@ -258,7 +261,6 @@ Module skeleton:
 
 * New example added (function with copy instead of reference)
 
-
 Localization:
 =============
 
index 9f5540c..4c83aa8 100644 (file)
@@ -1,6 +1,8 @@
 //  Scicos
 //
 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
+//  Copyright (C) 2011 - INRIA - Serge Steer
+
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 // See the file ./license.txt
 //
 
-function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
+function Info = scicos_simulate(scs_m, Info, updated_vars, flag, Ignb)
 // Function for running scicos simulation in batch mode
-// Info = scicos_simulate(scs_m[,Info][,%scicos_context][,flag][,Ignb])
+// Info = scicos_simulate(scs_m[,Info][,updated_vars][,flag][,Ignb])
 //
 // scs_m: scicos diagram (obtained by "load file.cos"). Note that
 // the version of file.cos must be the current version. If not, load
 // into scicos and save.
 //
-// %scicos_context: a scilab struct containing values of
+// updated_vars: a scilab struct containing values of
 // symbolic variables used in the context and Scicos blocks. This
 // is often used to change a parameter in the diagram context. In that
 // case, make sure that in the diagram context the variable is defined such
@@ -37,7 +39,7 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
 //  if ~exists('a') then a=1,end
 // If you want then to run the simulation in batch mode using the value
 // a=2, set:
-// %scicos_context.a=2
+// updated_vars.a=2
 //
 // Info: a list. It must be list() at the first call, then use output
 // Info as input Info for the next calls. Info contains compilation and
@@ -54,144 +56,148 @@ function Info = scicos_simulate(scs_m, Info, %scicos_context, flag, Ignb)
 // of blocks to ignore.
 //
 
-  noguimode = find(sciargs() == "-nogui");
-  if (noguimode <> []) then
-     clear noguimode
-     flag = 'nw'
-  //    warning(" Scilab in no gui mode : Scicos unavailable");
-  //    abort;
+
+//** check/set rhs parameters
+//---------------------------
+  if argn(2) == 1 then
+    //scicos_simulate(scs_m)
+    Info            = list()
+    updated_vars = struct()
+    flag            = ""
+    Ignb            = ""
+  elseif argn(2) == 2 then
+    //scicos_simulate(scs_m, Info)
+    //or scicos_simulate(scs_m,updated_vars)
+    //or scicos_simulate(scs_m,flag)
+    select typeof(Info)
+    case "st" then //scicos_simulate(scs_m,updated_vars)
+      updated_vars = Info
+      Info=list()
+      ku=2
+      flag = ""
+    case "string" then //scicos_simulate(scs_m,flag)
+      flag=Info
+      Info=list()
+      kf=2
+      updated_vars = struct()
+    else  //scicos_simulate(scs_m,Info)
+      flag = ""
+      updated_vars = struct()
+      ki=2
+    end
+    Ignb = ""
+  elseif argn(2) == 3 then
+    //scicos_simulate(scs_m, Info,updated_vars) or scicos_simulate(scs_m, Info,"nw")
+    if type(updated_vars) == 10 then
+      flag = updated_vars
+      updated_vars = struct()
+    else
+      ku=3
+      flag = ""
+    end
+    Ignb = ""
+  elseif argn(2) >= 4 then
+    //scicos_simulate(scs_m, Info,updated_vars,"nw") or
+    //scicos_simulate(scs_m, Info,"nw",updated_vars)
+    ku=3;kf=4
+    if type(updated_vars) == 10 then
+      [updated_vars,flag]=(flag,updated_vars)
+      kf=3;ku=4
+    end
+    if argn(2) == 4 then Ignb = "",end
+  else
+    error(mprintf(_("%s: Wrong number of input arguments. Must be between %d and %d.\n"),...
+                  "scicos_simulate", 1, 5))
+  end
+
+  //Check variable types
+  if typeof(scs_m)<>"diagram" then
+    error(msprintf(_("%s: Wrong type for input argument #%d: %s data structure expected.\n"),...
+                   "scicos_simulate",1,"scs_m"))
+  end
+  if type(Info)<>15 then
+    error(msprintf(_("%s: Wrong type for input argument #%d: A list expected.\n"),..
+                   "scicos_simulate",2))
+  end
+  if typeof(updated_vars)<>"st" then
+    error(msprintf(_("%s: Wrong type for input argument #%d: A list expected.\n"),...
+                   "scicos_simulate",ku))
+  end
+  if and(stripblanks(flag)<>["nw" ""]) then
+    error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'' expected.\n"),...
+                   "scicos_simulate",kf,"nw"))
+  end
+  if type(Ignb) <> 10 then
+    error(msprintf(_("%s: Wrong type for input argument #%d: String array expected.\n"),...
+                   "scicos_simulate",5))
   end
-  clear noguimode
 
-if ~isdef('scicos_menuslib') then
-  load('SCI/modules/scicos/macros/scicos_menus/lib')
-end
+  if or(sciargs() == "-nogui")|or(sciargs() == "-nwni")  then
+    flag = 'nw'
+  end
+  //**blocks to ignore requested by user
+  Ignb = matrix(Ignb,1,-1)//make it row vector
 
-if exists('scicos_scicoslib')==0 then
+  //**blocks to ignore in any cases
+  Ignore=['affich',...
+          'affich2']
+  //**blocks to ignore with flag=="nw"
+  Ignoreb = ['bouncexy', ...
+             'cscope', ...
+             'cmscope', ...
+             'canimxy', ...
+             'canimxy3d', ...
+             'cevscpe', ...
+             'cfscope', ...
+             'cscopxy', ...
+             'cscopxy3d', ...
+             'cmatview', ...
+             'cmat3d']
+
+  //** load the scicos function libraries
+  //------------------------------------
+  if exists('scicos_menuslib')==0 then
+    load("SCI/modules/scicos/macros/scicos_menus/lib") ;
+  end
+
+  if exists('scicos_scicoslib')==0 then
     load("SCI/modules/scicos/macros/scicos_scicos/lib") ;
-end
+  end
 
-if exists('scicos_autolib')==0 then
+  if exists('scicos_autolib')==0 then
     load("SCI/modules/scicos/macros/scicos_auto/lib") ;
-end
+  end
 
-if exists('scicos_utilslib')==0 then
+  if exists('scicos_utilslib')==0 then
     load("SCI/modules/scicos/macros/scicos_utils/lib") ;
-end
-
-// Define Scicos data tables ===========================================
-if ( ~isdef("scicos_pal") | ~isdef("%scicos_menu") | ..
-     ~isdef("%scicos_short") | ~isdef("%scicos_help") | ..
-     ~isdef("%scicos_display_mode") | ~isdef("modelica_libs") | ..
-     ~isdef("scicos_pal_libs") ) then
-  [scicos_pal, %scicos_menu, %scicos_short, modelica_libs, scicos_pal_libs,...
-   %scicos_lhb_list, %CmenuTypeOneVector, %scicos_gif,%scicos_contrib, ..
-   %scicos_libs, %scicos_with_grid, %scs_wgrid] = initial_scicos_tables();
-end
-// =====================================================================
+  end
+
+  //** Define Scicos data tables
+  //----------------------------
+  if ( ~isdef("scicos_pal") | ~isdef("%scicos_menu") | ..
+       ~isdef("%scicos_short") | ~isdef("%scicos_help") | ..
+       ~isdef("%scicos_display_mode") | ~isdef("modelica_libs") | ..
+       ~isdef("scicos_pal_libs") ) then
+    [scicos_pal, %scicos_menu, %scicos_short, modelica_libs, scicos_pal_libs,...
+     %scicos_lhb_list, %CmenuTypeOneVector, %scicos_gif,%scicos_contrib, ..
+     %scicos_libs, %scicos_with_grid, %scs_wgrid] = initial_scicos_tables();
+  end
+  // =====================================================================
 
   //** initialize a "scicos_debug_gr" variable
   %scicos_debug_gr = %f;
 
-  //** list of scopes to ignore
-  Ignoreb = ['bouncexy', ...
-             'cscope', ...
-            'cmscope', ...
-            'canimxy', ...
-            'canimxy3d', ...
-            'cevscpe', ...
-            'cfscope', ...
-            'cscopxy', ...
-            'cscopxy3d', ...
-            'cmatview', ...
-            'cmat3d', ...
-            'affich', ...
-            'affich2']
-
-  //** load macros libraries and palettes
-  // Scilab 5 new modules split
-  load('SCI/modules/scicos/macros/scicos_auto/lib')
-  load('SCI/modules/scicos/macros/scicos_utils/lib')
-  load('SCI/modules/scicos/macros/scicos_scicos/lib')
 
+  //** load palettes
+  //----------------
   exec(loadpallibs,-1)
 
-  //** redefine some gui functions
+  //** redefine some  functions
   prot = funcprot();funcprot(0);
   do_terminate = do_terminate1
   funcprot(prot)
 
-  //** check/set rhs parameters
-  if argn(2) == 1 then
-    Info            = list()
-    %scicos_context = struct()
-    flag            = []
-    Ignb            = []
 
-  elseif argn(2) == 2 then
-    if type(Info) == 10 & (stripblanks(Info) == 'nw') then
-      Info = list()
-      flag = 'nw'
-    elseif type(Info) <> 15 then
-      Info = list()
-      flag = []
-    else
-      flag = []
-    end
-    %scicos_context = struct()
-    Ignb = []
-
-       elseif argn(2) == 3 then
-    if type(Info) <> 15 then
-      Info = list()
-    end
-    if type(%scicos_context) == 10 & (stripblanks(%scicos_context) == 'nw') then
-      %scicos_context = struct()
-      flag = 'nw'
-    elseif type(%scicos_context) <> 17 then
-      %scicos_context = struct()
-      flag = []
-    else
-      flag = []
-    end
-    Ignb = []
-
-  elseif argn(2) == 4 then
-    if type(Info) <> 15 then
-      Info = list()
-    end
-    if type(%scicos_context) <> 17 then
-      %scicos_context = struct()
-    end
-    if type(flag) <> 10 then
-     flag = []
-    elseif (stripblanks(flag) <> 'nw') then
-       flag = []
-    end
-    Ignb = []
-
-  elseif argn(2) == 5 then
-    if type(Info) <> 15 then
-      Info = list()
-    end
-    if type(%scicos_context) <> 17 then
-      %scicos_context = struct()
-    end
-    if type(flag) <> 10 then
-      flag = []
-    elseif (stripblanks(flag) <> 'nw') then
-      flag = []
-    end
-    if type(Ignb) <> 10 then
-      Ignb = []
-    else
-      Ignb = (Ignb(:))'
-    end
-
-  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)
@@ -200,42 +206,20 @@ end
   if scicos_ver <> current_version then
     ierr = execstr('scs_m = do_version(scs_m, scicos_ver)','errcatch')
     if ierr <> 0 then
-      messagebox("Can''t convert old diagram (problem in version)","modal")
+      messagebox(_("Can''t convert old diagram (problem in version)"),"modal")
       return
     end
   end
 
-  //prepare from and to workspace stuff
-  curdir = pwd()
-  chdir(TMPDIR)
-  mkdir('Workspace')
-  chdir('Workspace')
-  %a = who('get');
-  %a = %a(1:$-predef()+1);  // exclude protected variables
-  for %ij = 1:size(%a,1)
-    var = %a(%ij)
-    if var <> 'ans' & typeof(evstr(var)) == 'st' then
-      ierr = execstr('x = ' + var + '.values','errcatch')
-      if ierr == 0 then
-        ierr = execstr('t = ' + var + '.time','errcatch')
-      end
-      if ierr == 0 then
-        execstr('save('"' + var + ''",x,t)')
-      end
-    end
-  end
-  chdir(curdir)
-  // end of /prepare from and to workspace stuff
-
-  Ignore = []
+  //** prepare from and to workspace stuff
+  //-------------------------------------
+  scicos_workspace_init()
 
   if flag == 'nw' then
-    Ignore = Ignoreb
-  end
-
-  if Ignb <> [] then
-    Ignore = [Ignore, Ignb]
+    Ignore = [Ignore,Ignoreb]
   end
+  //add user ignored blocks if any
+  Ignore = [Ignore, Ignb]
 
   //** retrieve Info list
   if Info <> list() then
@@ -253,15 +237,23 @@ end
   tolerances     = scs_m.props.tol
   solver         = tolerances(6)
   %scicos_solver = solver
-
   //** set variables of context
-  [%scicos_context, ierr] = script2var(scs_m.props.context, ...
-               %scicos_context);
+  [%scicos_context, ierr] = script2var(scs_m.props.context,struct())
+  //overload %scicos_context variables with those defined by updated_vars
+  contextvars=fieldnames(%scicos_context)
+  updatedvars=fieldnames(updated_vars)
+  for k=1:size(updatedvars,'*')
+    u=updatedvars(k)
+    if or(u==contextvars) then
+      %scicos_context(u)=updated_vars(u)
+    else
+      mprintf(_("Warning the variable %s do not match any context variable name\nignored"),u)
+    end
+  end
   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()])
+    [scs_m, %cpr, needcompile, ok] = do_eval(scs_m, %cpr,%scicos_context)
+    if ~ok then
+      error(['Error during block parameters evaluation , ' + lasterror()])
     end
     if needcompile <> 4 & size(%cpr) > 0 then
       %state0 = %cpr.state
@@ -278,8 +270,8 @@ end
   end
 
   [%cpr, %state0_n, needcompile, alreadyran, ok] = do_update(%cpr, ...
-               %state0, needcompile)   
-  
+                                                  %state0, needcompile)
+
   if ~ok then
     error('Error updating parameters.')
   end
@@ -290,14 +282,12 @@ end
     choix = []
   end
   if (%cpr.sim.xptr($) - 1) < size(%cpr.state.x,'*') & solver < 100 then
-    warning(['Diagram has been compiled for implicit solver'
-            'switching to implicit solver'])
+    warning(msprintf(_("Diagram has been compiled for implicit solver\nswitching to implicit solver")))
     solver = 100
     tolerances(6) = solver
   elseif (%cpr.sim.xptr($) - 1) == size(%cpr.state.x,'*') & ...
-               solver == 100 & size(%cpr.state.x,'*') <> 0 then
-    warning(['Diagram has been compiled for explicit solver'
-            'switching to explicit solver'])
+        solver == 100 & size(%cpr.state.x,'*') <> 0 then
+    warning(msprintf(_("Diagram has been compiled for explicit solver\nswitching to explicit solver")))
     solver = 0
     tolerances(6) = solver
   end
@@ -305,9 +295,9 @@ end
   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
@@ -321,18 +311,18 @@ end
     %cpr.state = %state0
     tf = scs_m.props.tf;
     if tf*tolerances == [] then
-      error(['Simulation parameters not set']);
+      error(_("Simulation parameters not set:"));
     end
     ierr = execstr('[state, t] = scicosim(%cpr.state, %tcur, tf, %cpr.sim,' + ..
-                '''start'', tolerances)','errcatch')
+                   '''start'', tolerances)','errcatch')
     if ierr <> 0 then
-      error(['Initialisation problem:'])
+      error(_("Initialisation problem:"))
     end
     %cpr.state = state
   end
 
   ierr = execstr('[state, t] = scicosim(%cpr.state, %tcur, tf, %cpr.sim,' + ..
-               '''run'', tolerances)','errcatch')
+                 '''run'', tolerances)','errcatch')
   if ierr == 0 then
     %cpr.state = state
     alreadyran = %t
@@ -343,7 +333,7 @@ end
       %tcur = t
     end
   else
-    error(['Simulation problem: ';lasterror()])
+    error([_("Simulation problem: ");lasterror()])
   end
 
   Info = list(%tcur, %cpr, alreadyran, needstart, needcompile, %state0)
@@ -361,11 +351,11 @@ function [alreadyran, %cpr] = do_terminate1(scs_m, %cpr)
 // Copyright INRIA
 
   if prod(size(%cpr)) < 2 then
-               alreadyran = %f
-               return
-       end
+    alreadyran = %f
+    return
+  end
 
-       par = scs_m.props;
+  par = scs_m.props;
 
   if alreadyran then
     alreadyran = %f
@@ -374,7 +364,7 @@ function [alreadyran, %cpr] = do_terminate1(scs_m, %cpr)
 
     %cpr.state = state
     if ierr <> 0 then
-      error(['End problem: ' ; lasterror()])
+      error([_("End problem: ");lasterror()])
     end
   end
 endfunction
index 1da13f3..52406f6 100644 (file)
@@ -1,6 +1,8 @@
 //  Scicos
 //
 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
+//  Copyright (C) 2011 - INRIA - Serge Steer
+
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 
 function [%ll,%ierr] = script2var(%txt, %ll)
 //** [%scicos_context, ierr] = script2var(context, %scicos_context)
-
+//** context is the scs_m.props.context (string array) associated with the current level
+//** %scicos_context  is a struct containing the values defined by the
+//    calling contexts
 //**
-//** 10 Jan 2006 
-  %ierr = 0 ; //** init 
-  %mm = getfield(1,%ll)
-  for %mi=%mm(3:$)
+//** 10 Jan 2006
+//local variable names are prefixed with a %  to limit conflicts with
+//variables  defined in %txt instructions
+  %ierr = 0 ; //** init
+
+  //next lines checks if variable defined in %ll struct can be evaluated
+  //why ???
+  %mm = fieldnames(%ll)';
+  for %mi=%mm
     if execstr(%mi+'=%ll(%mi)','errcatch')<>0 then
-      disp(lasterror())
+      mprintf("%s\n",lasterror())
       %ierr=1
       return
     end
   end
-  
   [%ll,%ierr] = getvardef(%txt,%ll)
-  if %ierr<>0 then 
-    return,
-  end
+  if %ierr<>0 then return, end
 endfunction
 
 //**--------------------------------------------------------------------------
 function [%ll,%ierr]=getvardef(%txt,%ll)
-  %nww='';%ierr=0;  // to make sure %ww does not enter the difference
+//extend and modify the %scicos_context variable (%ll) with the variable
+//defined in the current level scs_m.props.context (%txt) instructions
+
+//local variable names are prefixed with a %  to limit conflicts with
+//variables  defined in %txt instructions
+
+  %nww='';%ierr=0;  // to make sure %nww and %ierr does not enter the difference
+  if isempty(%txt) then return,end
   %nww=size(who('get'),'*')
-  if isempty(%txt) then
-    %ierr = 0;
-  else
-    %ierr=execstr(%txt,'errcatch')
-  end
-  if %ierr<>0 then 
-    return,
-  end
+
+  %ierr=execstr(%txt,'errcatch')
+  if %ierr<>0 then return,end
+
   %mm=who('get')
-  %nww2=size(%mm,'*')
-  %mm=%mm(1:%nww2-%nww)
+  %mm=%mm(1:size(%mm,'*')-%nww)
+  //%mm contains the list of the variables defined by execstr(%txt,'errcatch')
   for %mi=%mm(:)'
-    if type(evstr(%mi)) <> 13 then
-      if %mi=="scs_m" then
-       disp('the name scs_m is reseved; it cannot be used as block"+...
-            " parameter')
-      else
-       %ll(%mi)=evstr(%mi)
-      end
+    if %mi=="scs_m" then
+      mprintf(_("The variable name %s cannot be used as block parameter: ignored"),"scs_m")
+    else
+      %ll(%mi)=evstr(%mi)
     end
   end
 endfunction
+
diff --git a/scilab/modules/scicos/macros/scicos_utils/scicos_workspace_init.sci b/scilab/modules/scicos/macros/scicos_utils/scicos_workspace_init.sci
new file mode 100644 (file)
index 0000000..7c32edd
--- /dev/null
@@ -0,0 +1,52 @@
+//  Scicos
+//
+//  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// See the file ./license.txt
+//
+//
+function scicos_workspace_init()
+//preserve all variables of type struct having a "time" and a "value"
+//field in temporary binary files 
+  path=TMPDIR+"/Workspace/"
+  mkdir(path);
+  
+  
+  //prepare the fromworkspace stuff We need to store all variables of
+  //type struct which have 2 fields "values" and "time". these variables
+  //are stored into Scilab binary files whose name are the variable names
+  //and which contain 2 variables "x" and "t"
+  //
+  prt=funcprot(),funcprot(0)
+  varnames = who("get")   ;
+  varnames = varnames(1:$-predef()+1);  //** exclude protected variables
+  varnames(varnames=='ans')=[];
+  for var=varnames'
+    v=evstr(var);
+    if typeof(v)=='st' then
+      fn=fieldnames(v)
+      if or(fn==["values";"time"])&or(fn==["time";"value"]) then
+        if execstr('x=v.values','errcatch')==0 then
+          if execstr('t=v.time','errcatch') ==0 then
+            execstr('save(""'+path+var+''",x,t)')
+          end
+        end
+      end
+    end
+  end
+  funcprot(prt)
+endfunction
diff --git a/scilab/modules/xcos/demos/batch_simulation.xcos b/scilab/modules/xcos/demos/batch_simulation.xcos
new file mode 100644 (file)
index 0000000..0d52fad
Binary files /dev/null and b/scilab/modules/xcos/demos/batch_simulation.xcos differ
index cf9d348..9fb960e 100644 (file)
@@ -4,6 +4,7 @@
  * 
  * Copyright (C) INRIA - METALAU Project <scicos@inria.fr> (HTML version)
  * Copyright (C) DIGITEO - Scilab Consortium (XML Docbook version)
+ * Copyright (C) INRIA - Serge Steer - (format standardized, context argument explained, example added)
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
   </refnamediv>
   <refsynopsisdiv>
     <title>Calling Sequence</title>
-    <synopsis>Info=scicos_simulate(scs_m,Info[,%scicos_context][,flag])</synopsis>
+    <synopsis>Info=scicos_simulate(scs_m)</synopsis>
+    <synopsis>Info=scicos_simulate(scs_m,Info)</synopsis>
+    <synopsis>Info=scicos_simulate(scs_m,context)</synopsis>
+    <synopsis>Info=scicos_simulate(scs_m,flag)</synopsis>
+    <synopsis>Info=scicos_simulate(scs_m ,Info [, context] [,flag])</synopsis>
   </refsynopsisdiv>
+  <refsection id="Parameters_scicos_simulate">
+    <title>Arguments</title>
+    <variablelist>
+      <varlistentry><term>scs_m</term>: A diagram data structure (see <link linkend="scicos_diagram">scs_m structure</link>).
+        <para/></varlistentry>
+      <varlistentry><term>Info</term>: A list. It must be set to <literal>list()</literal> at
+        the first call, then use output <literal>Info</literal> as
+        input <literal>Info </literal>for the next
+        calls. <literal>Info</literal> contains compilation and
+        simulation information and is used to avoid recompilation when
+        not needed.
+        <para/>
+      </varlistentry>
+      <varlistentry><term>ContextValues</term>: A Scilab struct containing values of symbolic variables
+        used in the context and xcos blocks.
+        <para/></varlistentry>
+      <varlistentry><term>flag</term>: A string. If it equals 'nw' (no window),
+        then blocks using graphical windows are not executed. Note
+        that the list of such blocks must be updated as new blocks are
+        added.
+      </varlistentry>
+    </variablelist>
+  </refsection>
   <refsection id="Module_scicos_simulate">
     <title>Module</title>
     <itemizedlist>
       </listitem>
     </itemizedlist>
   </refsection>
-  <refsection id="Description_scicos_simulate">
-    <title>Description</title>
-    <para>
-This function is used to simulate xcos diagrams in batch mode. It requires the scs_m structure which can be obtained by loading in Scilab the .cos file (e.g. load mydiagram.cos).  
-</para>
-    <para>
-Contrary to the function , the diagram need not be compiled before being saved.  
-</para>
-    <para>
-</para>
-    <programlisting role="example"><![CDATA[ 
-Info=scicos_simulate(scs_m,Info[,%scicos_context][,flag])
- ]]></programlisting>
-  </refsection>
-  <refsection id="Parameters_scicos_simulate">
-    <title>Arguments</title>
-    <itemizedlist>
-      <listitem>
-        <para><emphasis role="bold">scs_m :</emphasis> xcos diagram (obtained by "load file.cos"). Note that the version of file.cos must be the current version. If not, load into xcos and save.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">Info :</emphasis> a list. It must be list() at the first call, then use output Info as input Info for the next calls. Info contains compilation and simulation information and is used to avoid recompilation when not needed.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">%scicos_context :</emphasis> a Scilab struct containing values of symbolic variables used in the context and xcos blocks. This is often used to change a parameter in the diagram context. In that case, make sure that in the diagram context the variable is defined such that it can be modified. Say a variable "a" is to be defined in the context having value 1, and later in batch mode, we want to change the value of "a". In that case, in the context of the diagram place: if exists('a') then a=1,end If you want then to run the simulation in batch mode using the value a=2, set: %scicos_context.a=2</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">flag :</emphasis> string. If it equals 'nw' (no window), then blocks using graphical windows are not executed. Note that the list of such blocks must be updated as new blocks are added.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">Info :</emphasis> contains compilation and simulation information and is used to avoid recompilation when not needed. Normally it should not be modified.</para>
-      </listitem>
-    </itemizedlist>
-  </refsection>
+  <refsection id="Description_scicos_simulate"><title>Description</title>
+      This function is used to simulate xcos diagrams in batch
+      mode. It requires the <link linkend="scicos_diagram">scs_m
+      structure</link>which can be obtained by loading in Scilab the
+      <literal>.xcos</literal> file (see <link linkend="importXcosDiagram">
+      importXcosDiagram</link>).
+
+    <para> The <literal>ContextValues</literal> may be used to change
+    the main parameters value set in the main diagram
+    context. example: if the variable <literal>A</literal> is set to 1
+    in the main context of the diagram. One can change the
+    <literal>A</literal> value for a <literal>scicos_simulate</literal> simulation by setting
+    <programlisting role="example"><![CDATA[
+    ContextValues.A=2 
+    ]]></programlisting></para>
+    <para> It is also possible to use variables defined inside Scilab
+    directly without using the <literal>ContextValues</literal>
+    argument, but for such a use the context definition must allow
+    this: example, if one wants to allow simulation use the
+    <literal>A</literal> Scilab variable value for the parameter
+    <literal>A</literal> the diagram context definition should contain
+    <programlisting role="example"><![CDATA[
+    if ~exists('A') then  A=1,end
+    ]]></programlisting> Note that this second solution is
+    fragile because it rely on the current value of
+    <literal>A</literal> in Scilab.</para>
+ </refsection>
   <refsection id="Filecontent_scicos_simulate">
     <title>File content</title>
     <itemizedlist>
@@ -82,33 +103,60 @@ Info=scicos_simulate(scs_m,Info[,%scicos_context][,flag])
       </listitem>
     </itemizedlist>
   </refsection>
+  <refsection id="Examples_scicos_simulate"><title>Examples</title>
+    The xcos diagram in <literal>SCI/modules/xcos/demos/batch_simulation.xcos</literal>
+    <mediaobject><imageobject><imagedata align="center" fileref="../../images/batch_simulation.png"/></imageobject></mediaobject>
+    <programlisting role="example"><![CDATA[ 
+importXcosDiagram("SCI/modules/xcos/demos/batch_simulation.xcos")
+
+typeof(scs_m) //The diagram data structure
+
+//This diagram uses 3 context variables : 
+//  Amplitude : the sin function amplitude
+//  Pulsation : the sin function pulsation
+//  Tf        : the final simulation time
+scs_m.props.context; //the embedded definition
+
+//first batch simulation with the parameters embedded in the diagram 
+scicos_simulate(scs_m);
+// Change the final time value
+Context.Tf=10;
+scicos_simulate(scs_m,Context);
+// without display
+Context.Tf=10;
+Context.Pulsation=9;
+scicos_simulate(scs_m,list(),Context,'nw');
+//get the variable created by the "from workspace block"
+counter 
+
+    ]]></programlisting>
+  </refsection>
   <refsection id="SeeAlso_scicos_simulate">
     <title>See Also</title>
-    <itemizedlist>
-      <listitem>
-        <para>
-          <link linkend="scicosim">scicosim - Scicos (batch) simulation function (Scilab Function)</link>
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          <link linkend="xcos">xcos - Block diagram editor and GUI for the hybrid simulator (Scilab Function)</link>
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          <link linkend="steadycos">steadycos - Finds an equilibrium state of a general dynamical system described by a xcos diagram (Scilab Function)</link>
-        </para>
-      </listitem>
-      <listitem>
-        <para>
-          <link linkend="lincos">lincos - Constructs by linearization a linear state-space model from a general dynamical system described by a xcos diagram (Scilab Function)</link>
-        </para>
-      </listitem>
-    </itemizedlist>
+    <simplelist type="inline">
+      <member>
+        <link linkend="scicos_diagram">scs_m structure</link>
+      </member>
+      <member>
+        <link linkend="importXcosDiagram"> importXcosDiagram</link>
+      </member>
+      <member>
+        <link linkend="scicosim">scicosim: xcos batch simulation function</link>
+      </member>
+      <member>
+        <link linkend="xcos">xcos: Block diagram editor and GUI for the hybrid simulator</link>
+      </member>
+      <member>
+        <link linkend="steadycos">steadycos: Finds an equilibrium state of an xcos diagram</link>
+      </member>
+      <member>
+        <link linkend="lincos">lincos: Constructs by linearization a linear state-space model from an xcos diagram</link>
+      </member>
+    </simplelist>
   </refsection>
   <refsection id="Authors_scicos_simulate">
     <title>Authors</title>
     <para><emphasis role="bold">Ramine Nikoukhah</emphasis> - INRIA</para>
+    <para><emphasis role="bold">Serge Steer</emphasis> - INRIA</para>
   </refsection>
 </refentry>
diff --git a/scilab/modules/xcos/help/images/batch_simulation.png b/scilab/modules/xcos/help/images/batch_simulation.png
new file mode 100644 (file)
index 0000000..c60c597
Binary files /dev/null and b/scilab/modules/xcos/help/images/batch_simulation.png differ
index 321d787..f99e0ed 100644 (file)
@@ -75,29 +75,9 @@ end
   //-- end
 
   //**---- prepare from and to workspace stuff ( "From workspace" block )
-  curdir = pwd() ;
-  chdir(TMPDIR)     ;
-  mkdir("Workspace");
-  chdir("Workspace");
-  %a = who("get")   ;
-  %a = %a(1:$-predef()+1);  //** exclude protected variables
-
-  for %ij=1:size(%a,1)
-    var = %a(%ij)
-    if var<>'ans' & typeof(evstr(var))=='st' then
-      ierr = execstr('x='+var+'.values','errcatch')
-      if ierr==0 then
-        ierr = execstr('t='+var+'.time','errcatch')
-      end
-      if ierr==0 then
-        execstr('save('"'+var+''",x,t)')
-      end
-    end
-  end
-
-  chdir(curdir)
-  //**----- end of /prepare from and to workspace stuff
+   xcos_workspace_init()
 
 //** extract tolerances from scs_m.props.tol
   tolerances = scs_m.props.tol ;
   //** extract solver type from tolerances
@@ -1,5 +1,3 @@
-//  Scicos
-//
 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -24,6 +22,13 @@ function xcos_workspace_init()
 //field in temporary binary files 
   path=TMPDIR+"/Workspace/"
   mkdir(path);
+  
+  
+  //prepare the fromworkspace stuff We need to store all variables of
+  //type struct which have 2 fields "values" and "time". these variables
+  //are stored into Scilab binary files whose name are the variable names
+  //and which contain 2 variables "x" and "t"
+  //
   prt=funcprot(),funcprot(0)
   varnames = who("get")   ;
   varnames = varnames(1:$-predef()+1);  //** exclude protected variables
@@ -31,10 +36,13 @@ function xcos_workspace_init()
   for var=varnames'
     v=evstr(var);
     if typeof(v)=='st' then
-      if execstr('x=v.values','errcatch')==0 then
-       if execstr('t=v.time','errcatch') ==0 then
-           execstr('save(path'+var+''",x,t)')
-       end
+      fn=fieldnames(v)
+      if or(fn==["values";"time"])&or(fn==["time";"value"]) then
+        if execstr('x=v.values','errcatch')==0 then
+          if execstr('t=v.time','errcatch') ==0 then
+            execstr('save(""'+path+var+''",x,t)')
+          end
+        end
       end
     end
   end
diff --git a/scilab/modules/xcos/tests/nonreg_tests/batch_simulation.xcos b/scilab/modules/xcos/tests/nonreg_tests/batch_simulation.xcos
new file mode 100644 (file)
index 0000000..0d52fad
Binary files /dev/null and b/scilab/modules/xcos/tests/nonreg_tests/batch_simulation.xcos differ
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_8798.dia.ref b/scilab/modules/xcos/tests/nonreg_tests/bug_8798.dia.ref
new file mode 100644 (file)
index 0000000..f705885
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 -INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 8789 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8789
+//
+// <-- Short Description -->
+// The context parameter of scicos_simulate is not taken into account
+importXcosDiagram("SCI/modules/xcos/tests/nonreg_tests/batch_simulation.xcos")
+ ans  =
+  T  
+scicos_simulate(scs_m,list(),'nw');
+c1=counter;
+if size(counter.time,'*')<>15 then bugmes();quit;end
+Context.Pulsation=6;
+scicos_simulate(scs_m,list(),Context,'nw');
+if size(counter.time,'*')<>29 then bugmes();quit;end
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_8798.tst b/scilab/modules/xcos/tests/nonreg_tests/bug_8798.tst
new file mode 100644 (file)
index 0000000..53a0594
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 -INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//
+// <-- Non-regression test for bug 8789 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8789
+//
+// <-- Short Description -->
+// The context parameter of scicos_simulate is not taken into account
+
+importXcosDiagram("SCI/modules/xcos/tests/nonreg_tests/batch_simulation.xcos")
+
+scicos_simulate(scs_m,list(),'nw');
+c1=counter;
+if size(counter.time,'*')<>15 then pause,end
+
+Context.Pulsation=6;
+scicos_simulate(scs_m,list(),Context,'nw');
+if size(counter.time,'*')<>29 then pause,end