function [x,y,typ]=Sigbuilder(job,arg1,arg2) x=[];y=[],typ=[] select job case 'plot' then standard_draw(arg1) case 'getinputs' then [x,y,typ]=standard_inputs(arg1) case 'getoutputs' then [x,y,typ]=standard_outputs(arg1) case 'getorigin' then [x,y]=standard_origin(arg1) case 'set' then //paths to updatable parameters or states ppath = list(1,3) newpar=list(); y=0; for path=ppath do np=size(path,'*') spath=list() for k=1:np spath($+1)='model' spath($+1)='rpar' spath($+1)='objs' spath($+1)=path(k) end xx=arg1(spath)// get the block execstr('xxn='+xx.gui+'(''set'',xx)') if diffobjs(xxn,xx) then model=xx.model model_n=xxn.model if ~is_modelica_block(xx) then modified=or(model.sim<>model_n.sim)|.. ~isequal(model.state,model_n.state)|.. ~isequal(model.dstate,model_n.dstate)|.. ~isequal(model.odstate,model_n.odstate)|.. ~isequal(model.rpar,model_n.rpar)|.. ~isequal(model.ipar,model_n.ipar)|.. ~isequal(model.opar,model_n.opar)|.. ~isequal(model.label,model_n.label) if or(model.in<>model_n.in)|or(model.out<>model_n.out)|.. or(model.in2<>model_n.in2)|or(model.out2<>model_n.out2)|.. or(model.outtyp<>model_n.outtyp)|or(model.intyp<>model_n.intyp) then needcompile=1 end if or(model.firing<>model_n.firing) then needcompile=2 end if (size(model.in,'*')<>size(model_n.in,'*'))|.. (size(model.out,'*')<>size(model_n.out,'*')) then needcompile=4 end if model.sim=='input'|model.sim=='output' then if model.ipar<>model_n.ipar then needcompile=4 end end if or(model.blocktype<>model_n.blocktype)|.. or(model.dep_ut<>model_n.dep_ut) then needcompile=4 end if (model.nzcross<>model_n.nzcross)|(model.nmode<>model_n.nmode) then needcompile=4 end if prod(size(model_n.sim))>1 then if model_n.sim(2)>1000 then if model.sim(1)<>model_n.sim(1) then needcompile=4 end end end else modified=or(model_n<>model) eq=model.equations;eqn=model_n.equations; if or(eq.model<>eqn.model)|or(eq.inputs<>eqn.inputs)|.. or(eq.outputs<>eqn.outputs) then needcompile=4 end end //parameter or states changed arg1(spath)=xxn// Update newpar(size(newpar)+1)=path// Notify modification y=max(y,needcompile) end end x=arg1 typ=newpar case 'define' then scs_m_1=scicos_diagram(.. version="scicos4.2",.. props=scicos_params(.. wpar=[600,450,0,0,600,450],.. Title=["Sigbuilder","./"],.. tol=[0.0001;0.000001;1.000D-10;100001;0;0;0],.. tf=100,.. context=" ",.. void1=[],.. options=tlist(["scsopt","3D","Background","Link","ID","Cmap"],list(%t,33),[8,1],[1,5],.. list([5,1],[4,1]),[0.8,0.8,0.8]),.. void2=[],.. void3=[],.. doc=list())) scs_m_1.objs(1)=scicos_block(.. gui="CURVE_c",.. graphics=scicos_graphics(.. orig=[329.63473,606.18517],.. sz=[40,40],.. flip=%t,.. theta=0,.. exprs=["3";"[0,1,2]";"[10,20,-30]";"y";"n"],.. pin=[],.. pout=6,.. pein=4,.. peout=2,.. gr_i=list(.. ["rpar=arg1.model.rpar;n=model.ipar(1);order=model.ipar(2);"; "xx=rpar(1:n);yy=rpar(n+1:2*n);"; "[XX,YY,rpardummy]=Do_Spline(n,order,xx,yy)"; "xmx=maxi(XX);xmn=mini(XX);"; "ymx=maxi(YY);ymn=mini(YY);"; "dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end"; "xmn=xmn-dx/20;xmx=xmx+dx/20;"; "dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;"; "ymn=ymn-dy/20;ymx=ymx+dy/20;"; "xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));"; "yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));"; "xset(''color'',2)"; "xpoly(xx2,yy2,''lines'');"],8),.. id="",.. in_implicit=[],.. out_implicit="E"),.. model=scicos_model(.. sim=list("curve_c",4),.. in=[],.. in2=[],.. intyp=1,.. out=1,.. out2=[],.. outtyp=1,.. evtin=1,.. evtout=1,.. state=[],.. dstate=[],.. odstate=list(),.. rpar=[0;1;2;10;20;-30],.. ipar=[3;3;1],.. opar=list(),.. blocktype="c",.. firing=0,.. dep_ut=[%f,%t],.. label="",.. nzcross=0,.. nmode=0,.. equations=list()),.. doc=list()) scs_m_1.objs(2)=scicos_link(.. xx=[349.63473;349.49528],.. yy=[600.47089;565.10704],.. id="drawlink",.. thick=[0,0],.. ct=[5,-1],.. from=[1,1,0],.. to=[3,1,1]) scs_m_1.objs(3)=scicos_block(.. gui="CLKSPLIT_f",.. graphics=scicos_graphics(.. orig=[349.49528;565.10704],.. sz=[0.3333333,0.3333333],.. flip=%t,.. theta=0,.. exprs=[],.. pin=[],.. pout=[],.. pein=2,.. peout=[8;4],.. gr_i=list([],8),.. id="",.. in_implicit=[],.. out_implicit=[]),.. model=scicos_model(.. sim="split",.. in=[],.. in2=[],.. intyp=1,.. out=[],.. out2=[],.. outtyp=1,.. evtin=1,.. evtout=[1;1],.. state=[],.. dstate=[],.. odstate=list(),.. rpar=[],.. ipar=[],.. opar=list(),.. blocktype="d",.. firing=[%f,%f,%f],.. dep_ut=[%f,%f],.. label="",.. nzcross=0,.. nmode=0,.. equations=list()),.. doc=list()) scs_m_1.objs(4)=scicos_link(.. xx=[349.49528;266.69602;266.69602;270.35525;342.80795;342.80795;349.63473],.. yy=[565.10704;565.10704;680.99483;680.99483;680.99483;651.89946;651.89946],.. id="drawlink",.. thick=[0,0],.. ct=[5,-1],.. from=[3,2,0],.. to=[1,1,1]) scs_m_1.objs(5)=scicos_block(.. gui="OUT_f",.. graphics=scicos_graphics(.. orig=[398.20616,616.18517],.. sz=[20,20],.. flip=%t,.. theta=0,.. exprs="1",.. pin=6,.. pout=[],.. pein=[],.. peout=[],.. gr_i=list(" ",8),.. id="",.. in_implicit="E",.. out_implicit=[]),.. model=scicos_model(.. sim="output",.. in=-1,.. in2=-2,.. intyp=-1,.. out=[],.. out2=[],.. outtyp=1,.. evtin=[],.. evtout=[],.. state=[],.. dstate=[],.. odstate=list(),.. rpar=[],.. ipar=1,.. opar=list(),.. blocktype="c",.. firing=[],.. dep_ut=[%f,%f],.. label="",.. nzcross=0,.. nmode=0,.. equations=list()),.. doc=list()) scs_m_1.objs(6)=scicos_link(.. xx=[378.20616;398.20616],.. yy=[626.18517;626.18517],.. id="drawlink",.. thick=[0,0],.. ct=[1,1],.. from=[1,1,0],.. to=[5,1,1]) scs_m_1.objs(7)=scicos_block(.. gui="CLKOUTV_f",.. graphics=scicos_graphics(.. orig=[339.49528,505.10704],.. sz=[20,30],.. flip=%t,.. theta=0,.. exprs="1",.. pin=[],.. pout=[],.. pein=8,.. peout=[],.. gr_i=list(" ",8),.. id="",.. in_implicit=[],.. out_implicit=[]),.. model=scicos_model(.. sim="output",.. in=[],.. in2=[],.. intyp=1,.. out=[],.. out2=[],.. outtyp=1,.. evtin=1,.. evtout=[],.. state=[],.. dstate=[],.. odstate=list(),.. rpar=[],.. ipar=1,.. opar=list(),.. blocktype="d",.. firing=[],.. dep_ut=[%f,%f],.. label="",.. nzcross=0,.. nmode=0,.. equations=list()),.. doc=list()) scs_m_1.objs(8)=scicos_link(.. xx=[349.49528;349.49528],.. yy=[565.10704;535.10704],.. id="drawlink",.. thick=[0,0],.. ct=[5,-1],.. from=[3,1,0],.. to=[7,1,1]) model=scicos_model(.. sim="csuper",.. in=[],.. in2=[],.. intyp=1,.. out=-1,.. out2=[],.. outtyp=1,.. evtin=[],.. evtout=1,.. state=[],.. dstate=[],.. odstate=list(),.. rpar=scs_m_1,.. ipar=[],.. opar=list(),.. blocktype="h",.. firing=[],.. dep_ut=[%f,%f],.. label="",.. nzcross=0,.. nmode=0,.. equations=list()) // gr_i='xstringb(orig(1),orig(2),''Sigbuilder'',sz(1),sz(2),''fill'')'; gr_i=['ipar=arg1.model.rpar.objs(1).model.ipar'; 'rpar=arg1.model.rpar.objs(1).model.rpar'; 'n=ipar(1);order=ipar(2);'; 'xx=rpar(1:n);yy=rpar(n+1:2*n);'; '[XX,YY,rpardummy]=Do_Spline2(n,order,xx,yy)'; 'xmx=maxi(XX);xmn=mini(XX);'; 'ymx=maxi(YY);ymn=mini(YY);'; 'dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end'; 'xmn=xmn-dx/20;xmx=xmx+dx/20;'; 'dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;'; 'ymn=ymn-dy/20;ymx=ymx+dy/20;'; 'rect=[xmn,ymn;xmx,ymx];'; 'xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));'; 'yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));'; 'xset(''color'',2)'; 'xpoly(xx2,yy2,''lines'');'] x=standard_define([2 2],model,[],gr_i) end endfunction //========================================================= function [X,Y,orpar]=Do_Spline2(N,order,x,y) X=[];Y=[];orpar=[]; METHOD=getmethod(order); if (METHOD=='zero order') then X=x(1);Y=y(1); for i=1:N-1 X=[X;x(i);x(i+1);x(i+1)]; Y=[Y;y(i);y(i);y(i+1)]; end return; end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='linear') then X=[]; for i=1:N X=[X;x(i)]; Y=[Y;y(i)]; end return; end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (N<20) then NP=4;else if (N<40) then NP=2;else if (N<100) then NP=1;else NP=0;end;end; end for i=1:N-1 X=[X;linspace(x(i),x(i+1),NP+2)']; // pour tous sauf "linear" et "zero order" end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (N>2) & (METHOD=='order 2') then Z=ORDER2(x,y); A=Z(1:N-1); B=Z(N:2*N-2); C=Z(2*N-1:3*N-3); for j=1:size(X,'*') for i=N-1:-1:1 if X(j)>=x(i) then,break;end end Y(j)=A(i)*(X(j)-x(i))^2+B(i)*(X(j)-x(i))+C(i); end orpar=matrix(Z,-1,1) end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='not_a_knot') then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='periodic') then if y(1)<>y(N) then y(N)=y(1) end try d = splin(x, y,METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='monotone' ) then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='fast') then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='clamped') then try d = splin(x, y, METHOD,[0;0]); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end endfunction function METHOD=getmethod(order) select order case 0 then, METHOD='zero order' case 1 then, METHOD='linear' case 2 then, METHOD='order 2' case 3 then, METHOD='not_a_knot' case 4 then, METHOD='periodic' case 5 then, METHOD='monotone' case 6 then, METHOD='fast' case 7 then, METHOD='clamped' end endfunction function [Z]=ORDER2(x,y) N=size(x,'*')-1; A=zeros(3*N-1,N*3); B=zeros(3*N-1,1); for i=1:N j=3*(i-1)+1; A(j,i+2*N)=1; B(j)=y(i); A(j+1,i)=(x(i+1)-x(i))^2; A(j+1,i+N)=x(i+1)-x(i); A(j+1,i+2*N)=1; B(j+1)=y(i+1); end for i=1:N-1 j=3*(i-1)+1; A(j+2,i)=2*(x(i+1)-x(i)); A(j+2,i+N)=1; A(j+2,i+N+1)=-1; end Q=zeros(3*N,3*N); for i=1:N Q(i,i)=4*(x(i+1)-x(i))^2 Q(i,i+N)=2*(x(i+1)-x(i)) Q(i+N,i)=2*(x(i+1)-x(i)) Q(i+N,i+N)=1; end At=[Q,A';A,zeros(3*N-1,3*N-1)] Bt=[zeros(3*N,1);B] Zt=At\Bt; Z=Zt(1:3*N,1) endfunction //===================================================