summaryrefslogtreecommitdiff
path: root/macros/Misc/MBLOCK.sci
diff options
context:
space:
mode:
Diffstat (limited to 'macros/Misc/MBLOCK.sci')
-rw-r--r--macros/Misc/MBLOCK.sci468
1 files changed, 468 insertions, 0 deletions
diff --git a/macros/Misc/MBLOCK.sci b/macros/Misc/MBLOCK.sci
new file mode 100644
index 00000000..71ae263c
--- /dev/null
+++ b/macros/Misc/MBLOCK.sci
@@ -0,0 +1,468 @@
+// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See the file ../license.txt
+//
+
+function [x,y,typ]=MBLOCK(job,arg1,arg2)
+ x=[];
+ y=[];
+ typ=[];
+ select job
+ case "set" then
+ x=arg1
+ model=arg1.model
+ graphics=arg1.graphics
+ //label=graphics.exprs;
+ exprs=graphics.exprs
+
+ //Compatibility
+ if type(exprs)==15 then
+ paramv=list();
+ pprop=[];
+ //must do something better than that !
+ for i=1:size(model.rpar,"*")
+ paramv($+1)=string(model.rpar(i))
+ pprop($+1) = 0
+ end
+
+ exprs = tlist(["MBLOCK","in","intype","out","outtype",...
+ "param","paramv","pprop","nameF","funtxt"],...
+ exprs(1)(1),..
+ exprs(1)(2),..
+ exprs(1)(3),..
+ exprs(1)(4),..
+ exprs(1)(5),..
+ paramv,...
+ sci2exp(pprop(:)),..
+ exprs(1)(7),exprs(2))
+
+ end
+
+ //lab_1 = [in,intype,out,outtype,param,nameF]
+ lab_1 = list(exprs.in,.. //1
+ exprs.intype,.. //2
+ exprs.out,.. //3
+ exprs.outtype,.. //4
+ exprs.param,.. //5
+ exprs.pprop,.. //6
+ exprs.nameF) //7
+
+ //lab_2 = [paramv]
+ lab_2 = exprs.paramv //already a list
+
+ //store exprs before modif
+ //exprs.prev_exprs=exprs;
+ //exprs.prev_exprs.prev_exprs=tlist("MBLOCK");
+
+ while %t do
+ // [ok,Tin,Tintype,Tout,Touttype,Tparam,Tparamv,Tfunam,lab]=..
+ // scicos_getvalue('Set Modelica generic block parameters',..
+ // ['Input variables: ';..
+ // 'Input variables types: ';..
+ // 'Output variables: ';..
+ // 'Output variables types:';..
+ // 'Parameters in Modelica:';..
+ // 'Parameter values: ';..
+ // 'Function name: '],..
+ // list('str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1),label(1))
+
+ //warning here lab_1 is a list
+ [ok,Tin,Tintype,Tout,Touttype,Tparam,pprop,Tfunam,lab_1]=..
+ scicos_getvalue("Set Modelica generic block parameters",..
+ ["Input variables: ";..
+ "Input variables types: ";..
+ "Output variables: ";..
+ "Output variables types:";..
+ "Parameters in Modelica:";..
+ "Parameters properties: ";..
+ "Function name: "],..
+ list("str",-1,"str",-1,"str",-1,"str",-1,"str",-1,..
+ "vec",-1,"str",-1),lab_1)
+
+ //Cancel case
+ if ~ok then
+ break
+ end
+ // ierr=execstr("in=stripblanks(evstr(Tin));..
+ // intype=stripblanks(evstr(Tintype));..
+ // out=stripblanks(evstr(Tout));..
+ // outtype=stripblanks(evstr(Touttype));..
+ // param=stripblanks(evstr(Tparam));..
+ // paramv=evstr(Tparamv);..
+ // funam=stripblanks(Tfunam)",'errcatch')
+ //
+ //first stage of checking variable name
+ //put string symbolic parameters in variable
+ ierr=execstr("in=stripblanks(evstr(Tin));..
+ intype=stripblanks(evstr(Tintype));..
+ out=stripblanks(evstr(Tout));..
+ outtype=stripblanks(evstr(Touttype));..
+ param=stripblanks(evstr(Tparam));..
+ funam=stripblanks(Tfunam)","errcatch")
+
+ if ierr<>0 then
+ //You lose! Try again! Insert coin!
+ //messagebox("Error, try again please!","modal","error");
+ messagebox("Error in evaluation of variables.","modal","error");
+ ok=%f
+ //break
+ end
+
+ //check for valid name variable
+ //in
+ if ok then
+ for i=1:size(in,"*")
+ r=%f;
+ ierr=execstr("r=validvar(in(i))","errcatch")
+ if ~r then
+ ok=%f
+ break
+ end
+ end
+ if ~ok then
+ messagebox(["Invalid variable name for the input "+string(i)+".";
+ """"+in(i)+"""";
+ "Please choose another variable name."],"modal","error");
+ end
+ end
+ //out
+ if ok then
+ for i=1:size(out,"*")
+ r=%f;
+ ierr=execstr("r=validvar(out(i))","errcatch")
+ if ~r then
+ ok=%f
+ break
+ end
+ end
+ if ~ok then
+ messagebox(["Invalid variable name for the output "+string(i)+".";
+ """"+out(i)+"""";
+ "Please choose another variable name."],"modal","error");
+ end
+ end
+ //param
+ if ok then
+ param=param(:)
+ for i=1:size(param,"*")
+ r=%f;
+ ierr=execstr("r=validvar(param(i))","errcatch")
+ if ~r then
+ ok=%f
+ break
+ end
+ end
+ if ~ok then
+ messagebox(["Invalid variable name for the parameter "+string(i)+".";
+ """"+param(i)+"""";
+ "Please choose another variable name."],"modal","error");
+ end
+ end
+
+ // type checking
+ //typeok=%t;
+ if ok then
+ for i=1:size(intype,"*")
+ if intype(i)<>"E"&intype(i)<>"I" then
+ //typeok=%f;
+ messagebox("Input type should be ''E'' or ''I''!","modal","error");
+ ok=%f
+ break
+ end
+ end
+ end
+ // if ~typeok then
+ // ok=%f
+ // //break
+ // end
+
+ if ok then
+ for i=1:size(outtype,"*")
+ if outtype(i)<>"E"&outtype(i)<>"I" then
+ //typeok=%f;
+ messagebox("Output type should be ''E'' or ''I''!","modal","error");
+ ok=%f
+ break
+ end
+ end
+ end
+ // if ~typeok then break, end
+
+ //cross size checking
+ if ok then
+ if or(size(intype)<>size(in)) then
+ messagebox("Input variables are not well defined!","modal","error");
+ ok=%f
+ //break;
+ end
+ end
+
+ if ok then
+ if or(size(outtype)<>size(out)) then
+ messagebox("Output variables are not well defined!","modal","error");
+ ok=%f
+ //break;
+ end
+ end
+
+ //check param properties
+ if ok then
+ pprop = pprop(:)
+ if (size(param,"*")<>size(pprop,"*")) then
+ messagebox(["There is differences in";
+ "size of param and size ";
+ "of param properties."],"modal","error");
+ ok=%f
+ //break;
+ end
+ end
+
+ if ok then
+ if max(pprop)>2 | min(pprop)<0 then
+ messagebox(["Parameters properties must be :";
+ "0 : for simple paramater,";
+ "1 : for initial state value,";
+ "2 : for a fixed initial state value."],"modal","error");
+ ok=%f
+ //break;
+ end
+ end
+
+ //check name of modelica file
+ if ok then
+ if funam=="" then
+ messagebox("The filename is not defined!","modal","error");
+ ok=%f
+ //break
+ end
+ end
+
+ if ok then
+ [dirF,nameF,extF]=fileparts(funam);
+ if (extF<>"" & extF<>".mo")|(dirF<>"" & extF<>".mo") then
+ messagebox("Filename extention should be ''.mo '' !","modal","error");
+ ok=%f
+ //break
+ end
+ end
+
+ if ok then
+ //set_io checking
+ intypex=find(intype=="I"); outtypex=find(outtype=="I");
+ //[model,graphics,ok]=check_io(model,graphics,ones(in),..
+ // ones(out),[],[],intypex,outtypex)
+ [model,graphics,ok]=set_io(model,graphics,list([ones(in),ones(in)],ones(in)),..
+ list([ones(out),ones(out)],ones(out)),..
+ [],[],intypex,outtypex)
+ end
+
+ //*****************************************************************************
+ //generate second dialog box from Tparam
+ if ok then
+
+ Tparam_lab=evstr(Tparam) //labels
+ Tparam_sz=size(Tparam_lab,"*") //numbers of labels
+
+ //adjust size of lab_2 according to size of Tparam
+ if Tparam_sz>lstsize(lab_2) then
+ for i=1:(Tparam_sz-lstsize(lab_2))
+ lab_2($+1)="0"
+ end
+ elseif Tparam_sz<lstsize(lab_2) then
+ lab_2_tmp=list()
+ if Tparam_sz<>0 then //if param
+ for i=1:(lstsize(lab_2)-Tparam_sz)
+ lab_2_tmp(i)=lab_2(i)
+ end
+ end
+ lab_2=lab_2_tmp
+ end
+
+ //generate lhs, label and rhs txt for scicos_getvalue
+ if Tparam_sz<>0 then //if param
+ lhs_txt="" //lhs txt
+ lab_txt="" //label txt
+ rhs_txt="" //rhs txt
+ for i=1:Tparam_sz
+ lhs_txt=lhs_txt+"%v"+string(i)+","
+ if pprop(i) == 0 then
+ lab_txt=lab_txt+"''"+Tparam_lab(i)+"'';"
+ elseif pprop(i) == 1 then
+ lab_txt=lab_txt+"''"+Tparam_lab(i)+" (state) '';"
+ elseif pprop(i) == 2 then
+ lab_txt=lab_txt+"''"+Tparam_lab(i)+" (fixed state) '';"
+ end
+ rhs_txt=rhs_txt+"''vec'',-1,"
+ end
+ lhs_txt=part(lhs_txt,1:length(lhs_txt)-1)
+ lab_txt=part(lab_txt,1:length(lab_txt)-1)
+ rhs_txt=part(rhs_txt,1:length(rhs_txt)-1)
+
+ //generate main scicos_getvalue cmd
+ //warning here lab_2 is a list in input and a string in output
+ getvalue_txt = "[ok,"+lhs_txt+",lab_2]=scicos_getvalue(''Set parameters values'',["+..
+ lab_txt+"],"+..
+ "list("+rhs_txt+"),lab_2)"
+
+ //display the second dialog box
+ execstr(getvalue_txt)
+
+ //restore original lab_2 if not ok
+ if ~ok then
+ lab_2 = exprs.paramv
+ end
+ end
+ end
+
+ //put output param in the form of a list
+ //in paramv
+ if ok then
+ paramv=list();
+ for i=1:Tparam_sz
+ execstr("paramv("+string(i)+")=%v"+string(i))
+ end
+ end
+ //*****************************************************************************
+
+ //============================---------MBLOCK2
+ if ok then
+ if extF==".mo" & fileinfo(funam)<>[] then
+ tt=mgetl(funam)
+ else
+ tt=exprs.funtxt
+ mo=model.equations
+ //if model.sim(1)<>nameF then
+ if mo.model<>nameF then
+ tt=[]
+ end
+ end
+ //============================
+ [ok,tt]=MODCOM(funam,tt,in,out,param,paramv,pprop)
+ if ~ok then
+ break
+ end
+ end
+
+ if ok then
+ //------------------
+ mo=modelica()
+ mo.model=nameF
+ mo.inputs=in;
+ mo.outputs=out;
+ if max(pprop)>0 then
+ mo.parameters=list(param',paramv,pprop')
+ else
+ mo.parameters=list(param',paramv)
+ end
+ model.equations=mo
+ //------------------
+ //model.rpar=paramv;
+ model.rpar=[]
+ for i=1:lstsize(paramv)
+ model.rpar=[model.rpar;
+ paramv(i)(:)]//value
+ end
+ model.sim(1)=funam
+ //------------------
+ exprs.in=lab_1(1)
+ exprs.intype=lab_1(2)
+ exprs.out=lab_1(3)
+ exprs.outtype=lab_1(4)
+ exprs.param=lab_1(5)
+ exprs.paramv=list();
+ if Tparam_sz<>0 then //if param
+ if type(lab_2)==15 then //for eval
+ for i=1:lstsize(lab_2)
+ exprs.paramv(i)=lab_2(i);//string
+ end
+ else
+ for i=1:size(lab_2,"*")
+ exprs.paramv(i)=lab_2(i);
+ end
+ end
+ end
+ exprs.pprop=lab_1(6)
+ exprs.nameF=lab_1(7)
+ exprs.funtxt=tt
+ //label(2)=tt
+ //------------------
+ x.model=model
+ graphics.gr_i(1)(1)="txt=[''Modelica'';'' " + nameF + " ''];"
+ graphics.in_implicit =intype
+ graphics.out_implicit=outtype
+ //graphics.exprs=label
+ graphics.exprs=exprs
+ x.graphics=graphics
+ break
+ end
+ end
+
+ //Define
+ case "define" then
+ in=["u1"]
+ intype=["I"]
+ out=["y1";"y2"]
+ outtype=["I";"E"]
+ param=["R";"L"];
+ //paramv=[0.1;0.0001];
+ paramv=list(0.1,.0001)
+ pprop=[0;0];
+ nameF="generic"
+
+ //label=list([sci2exp(in),sci2exp(intype,sci2exp(out),..
+ // sci2exp(outtype),sci2exp(param),sci2exp(paramv),nameF]',[])
+
+ exprs = tlist(["MBLOCK","in","intype","out","outtype",...
+ "param","paramv","pprop","nameF","funtxt"],...
+ sci2exp(in(:)),..
+ sci2exp(intype(:)),..
+ sci2exp(out(:)),..
+ sci2exp(outtype(:)),..
+ sci2exp(param(:)),..
+ list(string(0.1),string(.0001)),...
+ sci2exp(pprop(:)),..
+ nameF,[])
+
+ model=scicos_model()
+ model.blocktype="c"
+ model.dep_ut=[%f %t]
+ //model.rpar=paramv;
+ model.rpar=[]
+ for i=1:lstsize(paramv)
+ model.rpar=[model.rpar;
+ paramv(i)(:)]
+ end
+
+ mo=modelica()
+ mo.model=nameF
+ mo.parameters=list(param,paramv)
+ model.sim=list(mo.model,30004)
+ mo.inputs=in
+ mo.outputs=out
+ model.in=ones(size(mo.inputs,"r"),1)
+ model.out=ones(size(mo.outputs,"r"),1)
+ model.equations=mo
+ gr_i=[]
+ //x=standard_define([3 2],model,label,gr_i)
+ x=standard_define([3 2],model,exprs,gr_i)
+ x.graphics.in_implicit =intype
+ x.graphics.out_implicit=outtype
+ end
+endfunction
+