* Bug #12384 fixed - Using a modelica part linked with explicit link to 25/11225/2
Clément DAVID [Fri, 5 Apr 2013 10:21:36 +0000 (12:21 +0200)]
                     another modelica part lead to an algebraic loop error.

Change-Id: I574346ab5462365c7d579d4bb08f533c9ea2ca0c

scilab/CHANGES_5.5.X
scilab/modules/scicos/macros/scicos_scicos/build_modelica_block.sci
scilab/modules/scicos/macros/scicos_scicos/c_pass1.sci
scilab/modules/scicos/macros/scicos_scicos/create_modelica.sci
scilab/modules/xcos/tests/nonreg_tests/bug_12384.dia.ref [new file with mode: 0644]
scilab/modules/xcos/tests/nonreg_tests/bug_12384.tst [new file with mode: 0644]
scilab/modules/xcos/tests/nonreg_tests/bug_12384.zcos [new file with mode: 0644]

index d74ab47..2ddd28b 100644 (file)
@@ -45,6 +45,8 @@ Xcos
 
 * Bug #12359 fixed - Xcos files has been converted to zcos to gain some space.
 
+* Bug #12384 fixed - Using a modelica part linked with explicit link to 
+                     another modelica part lead to an algebraic loop error.
 
 Bug fixes
 ==========
index 372861b..0553715 100644 (file)
@@ -19,7 +19,7 @@
 // See the file ../license.txt
 //
 
-function [model,ok]=build_modelica_block(blklstm,corinvm,cmmat,NiM,NoM,scs_m,path)
+function [model,ok]=build_modelica_block(blklstm,corinvm,cmmat,NiM,NoM,NvM,scs_m,path)
     // given the blocks definitions in blklstm and connections in cmmat this
     // function first create  the associated modelicablock  and writes its code
     // in the file named 'imppart_'+name+'.mo' in the directory given by path
@@ -34,7 +34,7 @@ function [model,ok]=build_modelica_block(blklstm,corinvm,cmmat,NiM,NoM,scs_m,pat
 
     //## generation of the txt for the main modelica file
     //## plus return ipar/rpar for the model of THE modelica block
-    [txt,rpar,ipar]=create_modelica(blklstm,corinvm,cmmat,name,scs_m);
+    [txt,rpar,ipar]=create_modelica(blklstm,corinvm,cmmat,NvM,name,scs_m);
 
     //## write txt in the file path+name+'.mo'
     path=pathconvert(stripblanks(path),%t,%t)
index 70aada4..a31a5ed 100644 (file)
@@ -155,11 +155,21 @@ function  [blklst,cmat,ccmat,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m,f
         cmmat=mmatfromT(links_table(find(links_table(:,5)==2),:),nb); //modelica links
         cmat=matfromT(links_table(find(links_table(:,5)==1),:),nb); //data flow links
         ccmat=cmatfromT(links_table(find(links_table(:,5)==-1),:),nb);//event links
+
         //build connections between modelica world and regular one. These
         //links should be data flow links
         // links from modelica world to regular world
-        fromM=find(dsearch(cmat(:,1),imp,"d")>0);NoM=size(fromM,"*");
+        fromM=find(dsearch(cmat(:,1),imp,"d")>0);
+
+        // links from regular world to modelica world
+        toM=find(dsearch(cmat(:,3),imp,"d")>0);
 
+        // merge the modelica to modelica as data flow links
+        [varM, kfrom, kto] = intersect(fromM, toM);
+        fromM(kfrom) = [];
+        toM(kto) = [];
+
+        NoM=size(fromM,"*");
         if NoM>0 then
             //add modelica Output ports in Modelica world
             mo=modelica();mo.model="OutPutPort";mo.outputs="vo";mo.inputs="vi";
@@ -170,14 +180,11 @@ function  [blklst,cmat,ccmat,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m,f
             cmat(fromM,1:2) zeros(NoM,1) -(nm+(1:NoM)'),ones(NoM,1),ones(NoM,1)];
 
             nm=nm+NoM;
-
             //add regular connection with regular block replacing the modelica world
-
             cmat(fromM,1:2)=[-(nr+1)*ones(NoM,1),(1:NoM)'];
         end
 
-        // links from regular world to modelica world
-        toM=find(dsearch(cmat(:,3),imp,"d")>0);NiM=size(toM,"*");
+        NiM=size(toM,"*");
         if NiM>0 then
             //add modelica Input ports in Modelica world
             mo=modelica();mo.model="InPutPort";mo.outputs="vo";mo.inputs="vi";
@@ -192,6 +199,17 @@ function  [blklst,cmat,ccmat,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m,f
             cmat(toM,3:4)=[-(nr+1)*ones(NiM,1),(1:NiM)'];
         end
 
+        NvM=size(varM, "*");
+        if NvM>0 then
+            //add modelica Values (both input and output) ports in Modelica world
+            l=[cmat(varM,1:2), zeros(NvM,1), cmat(varM,3:4), ones(NvM,1)];
+            cmmat=[cmmat;
+            l];
+
+            // remove the corresponding explicit link
+            cmat(varM, :) = [];
+        end
+
         // modelica blocks with events ports are not allowed yet
         if size(ccmat,1)>0 then
             if or(dsearch(ccmat(:,[1 3]),imp,"d")>0) then
@@ -249,7 +267,7 @@ function  [blklst,cmat,ccmat,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m,f
 
         //create regular block associated to all modelica blocks
 
-        [model,ok]=build_modelica_block(blklstm,corinvm,cmmat,NiM,NoM,scs_m,TMPDIR+"/");
+        [model,ok]=build_modelica_block(blklstm,corinvm,cmmat,NiM,NoM,NvM,scs_m,TMPDIR+"/");
 
         if ~ok then
             disp(mprintf("%s: build the modelica meta-block failed", "c_pass1"));
index f6c4c91..14eefad 100644 (file)
@@ -19,7 +19,7 @@
 // See the file ../license.txt
 //
 
-function [txt,rpar,ipar] = create_modelica(blklst,corinvm,cmat,name,scs_m)
+function [txt,rpar,ipar] = create_modelica(blklst,corinvm,cmat,NvM,name,scs_m)
 
     if exists("%Modelica_Init")==0 then
         // Modelica_Init becomes true only in "Modelicainitialize_.sci"
@@ -160,6 +160,7 @@ function [txt,rpar,ipar] = create_modelica(blklst,corinvm,cmat,name,scs_m)
 
         if or(blklst(from(1)).equations.model==["InPutPort","OutPutPort"]) ...
             | or(blklst(to(1)).equations.model==["InPutPort","OutPutPort"]) ...
+            | (k > (size(cmat,1) - NvM)) ...
             then
             eqns=[eqns
             "  "+n1+"."+p1+" = "+n2+"."+p2+";"]
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_12384.dia.ref b/scilab/modules/xcos/tests/nonreg_tests/bug_12384.dia.ref
new file mode 100644 (file)
index 0000000..0f674d8
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- XCOS TEST -->
+// <-- Non-regression test for bug 12384 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12384
+//
+// <-- Short Description -->
+// Algebraic loop error while compiling a diagram with a modelica part linked 
+// to another modelica part with an explicit link (using a sensor).
+ilib_verbose(0);
+importXcosDiagram(SCI+"/modules/xcos/tests/nonreg_tests/bug_12384.zcos");
+Info = scicos_simulate(scs_m,list());
+--------------------------------------------\
+ Main Modelica : TMPDIR/Loop_im.mo
+
+ Flat Modelica : TMPDIR/Loop_imf.mo
+ Simulation C code :TMPDIR/Loop_im.c
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_12384.tst b/scilab/modules/xcos/tests/nonreg_tests/bug_12384.tst
new file mode 100644 (file)
index 0000000..6f6c5dc
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- XCOS TEST -->
+
+// <-- Non-regression test for bug 12384 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12384
+//
+// <-- Short Description -->
+// Algebraic loop error while compiling a diagram with a modelica part linked 
+// to another modelica part with an explicit link (using a sensor).
+
+ilib_verbose(0);
+
+importXcosDiagram(SCI+"/modules/xcos/tests/nonreg_tests/bug_12384.zcos");
+Info = scicos_simulate(scs_m,list());
+
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_12384.zcos b/scilab/modules/xcos/tests/nonreg_tests/bug_12384.zcos
new file mode 100644 (file)
index 0000000..aa22561
Binary files /dev/null and b/scilab/modules/xcos/tests/nonreg_tests/bug_12384.zcos differ