scicos_simulate
function Info=scicos_simulate(scs_m,Info,%scicos_context,flag,Ignb)
// Function for running scicos simulation in batch mode
// Info=scicos_simulate(scs_m[,Info][,%scicos_context][,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
// 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
// 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
//
// 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
// simulation information and is used to avoid recompilation when not
// needed.
//
// flag: 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.
//
// Ignb : matrix of string : The name of blocks to ignore.
// If flag is set and equal to 'nw' then Ignb contains
// name of blocks that are added to the list
// of blocks to ignore.
//
noguimode=find(sciargs()=="-nogui");
if (noguimode <>[]) then
clear noguimode
flag='nw'
// warning(" Scilab in no gui mode : Scicos unavailable");
// abort;
end;
clear noguimode
//** 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,%scicos_help,..
%scicos_display_mode,modelica_libs,...
scicos_pal_libs]=initial_scicos_tables()
clear 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',...
'cscopexy',...
'cscopexy3d',...
'cmatview',...
'cmat3d',...
'affich',...
'affich2']
//** load macros libraries and palettes
load SCI/macros/scicos/lib
exec(loadpallibs,-1)
//** redefine some gui functions
prot=funcprot();funcprot(0);
deff('disablemenus()',' ')
deff('enablemenus()',' ')
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('scicos_simulate : wrong number of parameters.')
end
//check version
current_version = get_scicos_version()
scicos_ver = find_scicos_version(scs_m)
//do version
if scicos_ver<>current_version then
ierr=execstr('scs_m=do_version(scs_m,scicos_ver)','errcatch')
if ierr<>0 then
message("Can''t convert old diagram (problem in version)")
return
end
end
Ignore=[]
if flag=='nw' then
Ignore=Ignoreb
end
if Ignb<>[] then
Ignore=[Ignore,Ignb]
end
//** retrieve Info list
if Info<>list() then
[%tcur,%cpr,alreadyran,needstart,needcompile,%state0]=Info(:)
else
%tcur=0;%cpr=list();alreadyran=%f;needstart=%t;needcompile=4;%state0=list();
end
//** set solver
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);
if ierr==0 then
[scs_m,%cpr,needcompile,ok]=do_eval(scs_m,%cpr)
if needcompile<>4&size(%cpr)>0 then %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
[%cpr,%state0_n,needcompile,alreadyran,ok]=..
do_update(%cpr,%state0,needcompile)
if ~ok then error('Error updating parameters.'),end
if or(%state0_n<>%state0) then //initial state has been changed
%state0=%state0_n
[alreadyran,%cpr]=do_terminate1(scs_m,%cpr)
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'])
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=0
tolerances(6)=solver
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
end
end
end
if needstart then //scicos initialisation
if alreadyran then
[alreadyran,%cpr]=do_terminate1(scs_m,%cpr)
alreadyran=%f
end
%tcur=0
%cpr.state=%state0
tf=scs_m.props.tf;
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
error(['Initialisation problem:'])
end
%cpr.state=state
end
ierr=execstr('[state,t]=scicosim(%cpr.state,%tcur,tf,%cpr.sim,'+..
'''run'',tolerances)','errcatch')
if ierr==0 then
%cpr.state=state
alreadyran=%t
if tf-t<tolerances(3) then
needstart=%t
[alreadyran,%cpr]=do_terminate1(scs_m,%cpr)
else
%tcur=t
end
else
error(['Simulation problem:';lasterror()])
end
Info=list(%tcur,%cpr,alreadyran,needstart,needcompile,%state0)
endfunction
function [alreadyran,%cpr]=do_terminate1(scs_m,%cpr)
// Copyright INRIA
if prod(size(%cpr))<2 then alreadyran=%f,return,end
par=scs_m.props;
if alreadyran then
alreadyran=%f
//terminate current simulation
ierr=execstr('[state,t]=scicosim(%cpr.state,par.tf,par.tf,'+..
'%cpr.sim,''finish'',par.tol)','errcatch')
%cpr.state=state
if ierr<>0 then
error(['End problem:';lasterror()])
end
end
endfunction