11function processCanvasState ( canvasState ) {
22 var newElementMap = { } ;
3- var elementsOnNodes = [ ] ;
3+ // var elementsOnNodes = [];
44 var nodeMap = [ ] ;
55 var createNode ;
6- var end1 , end2 , i ;
6+ var end1 , end2 , i , j , k ;
7+ var optimized ;
8+
79
8- console . log ( 'processCanvasState' , canvasState )
10+ //Create a new node for each component
911 canvasState . forEach ( item => {
1012 if ( item . type == "draw2d.Connection" ) {
1113 //get both ends of the connection
1214 end1 = `${ item . source . node } .${ item . source . port } `
1315 end2 = `${ item . target . node } .${ item . target . port } `
14-
15- //check if either end exists in the nodemap, create a new entry or add to existing entry
16- createNode = true ;
17- for ( i = 0 ; i < nodeMap . length ; i ++ ) {
18- if ( nodeMap [ i ] . includes ( end1 ) && ! nodeMap [ i ] . includes ( end2 ) ) {
19- nodeMap [ i ] . push ( end2 ) ;
20- elementsOnNodes [ i ] . push ( item . target . node )
21- createNode = false ;
22- break ;
23- }
24- else if ( ! nodeMap [ i ] . includes ( end1 ) && nodeMap [ i ] . includes ( end2 ) ) {
25- nodeMap [ i ] . push ( end1 ) ;
26- elementsOnNodes [ i ] . push ( item . source . node )
27- createNode = false ;
28- break ;
29- }
30- }
31- if ( createNode ) {
32- nodeMap . push ( [ end1 , end2 ] )
33- elementsOnNodes . push ( [ item . source . node , item . target . node ] )
34- }
35- //Fixme - there needs to be some code here to merge nodes
36-
16+ nodeMap . push ( [ end1 , end2 ] )
17+ // console.log(end1, end2);
3718 } else {
3819 //if its not a connection its an element
3920 newElementMap [ item . id ] = { } ;
4021 }
41-
4222 } ) ;
4323
44- console . log ( 'newElementMap' , newElementMap )
24+ //loop through nodeMap and merge nodes which are the same until nodes are no longer optimized out
25+ do {
26+ optimized = false ;
27+ loop1:
28+ for ( i = 0 ; i < nodeMap . length ; i ++ ) {
29+ for ( j = 0 ; j < nodeMap [ i ] . length ; j ++ ) {
30+ for ( k = i + 1 ; k < nodeMap . length ; k ++ ) {
31+ if ( nodeMap [ k ] . includes ( nodeMap [ i ] [ j ] ) ) {
32+ optimized = true ;
33+ //Before concat with K, must remove the element that is about to be duplicated
34+ const index = nodeMap [ k ] . indexOf ( nodeMap [ i ] [ j ] ) ;
35+ if ( index > - 1 ) { // only splice array when item is found
36+ nodeMap [ k ] . splice ( index , 1 ) ; // 2nd parameter means remove one item only
37+ }
38+ nodeMap [ i ] = nodeMap [ i ] . concat ( nodeMap [ k ] ) ;
39+ nodeMap . splice ( k , 1 ) ;
40+ break loop1;
41+ }
42+ }
43+ }
44+ }
45+ } while ( optimized == true ) ;
46+
47+ // //check if either end exists in the nodemap, create a new entry or add to existing entry
48+ // createNode = true;
49+ // for (i = 0; i < nodeMap.length; i++) {
50+ // if (nodeMap[i].includes(end1) && !nodeMap[i].includes(end2)) {
51+ // nodeMap[i].push(end2);
52+ // createNode = false;
53+ // break;
54+ // }
55+ // else if (!nodeMap[i].includes(end1) && nodeMap[i].includes(end2)) {
56+ // nodeMap[i].push(end1);
57+ // createNode = false;
58+ // break;
59+ // }
60+ // }
61+ // if (createNode) {
62+ // nodeMap.push([end1, end2])
63+ // }
64+ // //Fixme - there needs to be some code here to merge nodes
65+
66+ // } else {
67+ // //if its not a connection its an element
68+ // newElementMap[item.id] = {};
69+ // }
70+
71+ // });
72+
73+ var elementsOnNodes = [ ] ;
74+ var t ;
75+ for ( i = 0 ; i < nodeMap . length ; i ++ ) {
76+ elementsOnNodes [ i ] = [ ] ;
77+ for ( j = 0 ; j < nodeMap [ i ] . length ; j ++ ) {
78+ t = nodeMap [ i ] [ j ] . split ( '.' )
79+ elementsOnNodes [ i ] . push ( t [ 0 ] )
80+ }
81+ }
82+ // console.log('newElementMap', newElementMap)
4583
4684 return [ elementsOnNodes , nodeMap , newElementMap ]
4785
@@ -56,10 +94,14 @@ export function calculateMNA(canvasState, schematicReadiness) {
5694 var elementMap = { } ;
5795 var newElementMap = { } ;
5896 var element ;
97+ var latexResult = null ;
5998
6099 [ elementsOnNodes , nodeMap , newElementMap ] = processCanvasState ( canvasState ) ;
100+ console . log ( "bp1" , elementsOnNodes , nodeMap , newElementMap )
61101
62102 //verify how ready the schematic is
103+ // All this code is just for that! Can't it be done later, for free? //FIXME
104+
63105 schematicReadiness = {
64106 vout : false ,
65107 vin : false ,
@@ -106,9 +148,9 @@ export function calculateMNA(canvasState, schematicReadiness) {
106148
107149
108150 // console.log(json);
109- console . log ( 'nodemap' , nodeMap ) ;
110- console . log ( 'elements on node' , elementsOnNodes ) ;
111- console . log ( 'all elements on this node' , elementsOnThisNode ) ;
151+ // console.log('nodemap', nodeMap);
152+ // console.log('elements on node', elementsOnNodes);
153+ // console.log('all elements on this node', elementsOnThisNode);
112154
113155
114156
@@ -123,7 +165,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
123165 }
124166 var nodeMapNoGnd = nodeMap ;
125167 var rem = nodeMapNoGnd . splice ( gndNode , 1 ) ;
126- console . log ( 'removed' , rem ) ;
127168
128169 // Step 1 - create map of every element and which node it connects too. Doing this here, after node map is complete and ground node is removed
129170 for ( i = 0 ; i < nodeMapNoGnd . length ; i ++ ) {
@@ -133,7 +174,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
133174 else elementMap [ element [ 0 ] ] = [ i ]
134175 }
135176 }
136- console . log ( 'elementMap' , elementMap ) ;
137177 voutNode = elementMap [ 'vout' ] [ 0 ] ;
138178 vinNode = elementMap [ 'vin' ] [ 0 ] ;
139179
@@ -144,7 +184,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
144184 firstLetter = Array . from ( key2 ) [ 0 ] ;
145185 if ( firstLetter == 'R' ) laplaceElement = key2 ;
146186 else laplaceElement = "1/(S*" + key2 + ")" ;
147- console . log ( 'CCC' , firstLetter , laplaceElement ) ;
148187
149188 //2.1 in the diagonal is the sum of all impedances connected to that node
150189 for ( j = 0 ; j < elementMap [ key2 ] . length ; j ++ ) {
@@ -163,6 +202,7 @@ export function calculateMNA(canvasState, schematicReadiness) {
163202 //2.4 Add a 1 in the node connected to Vin to indicate that Iin flows into that node
164203 mnaMatrix [ vinNode ] [ mnaMatrix . length - 1 ] = '1' ;
165204
205+ console . log ( 'elementMap' , elementMap ) ;
166206 console . log ( 'vin, vout and gnd node' , vinNode , voutNode , gndNode ) ;
167207 console . log ( 'mna ' , mnaMatrix ) ;
168208
@@ -173,22 +213,26 @@ export function calculateMNA(canvasState, schematicReadiness) {
173213 }
174214 nerdStr = nerdStrArr . join ( ',' ) ;
175215
176- console . log ( 'nerdStr ' , nerdStr ) ;
177-
178216
179217 //Using algebrite not nerdamer
180- // var t = "mna = ["+nerdStr+"]";
181- // console.log("t",t);
218+ Algebrite . eval ( "clearall" ) ;
182219 Algebrite . eval ( "mna = [" + nerdStr + "]" ) ;
183220 Algebrite . eval ( "inv_mna = inv(mna)" )
184221 Algebrite . eval ( "inv_mna" )
185- Algebrite . eval ( "mna_vo_vi = simplify(inv_mna[" + ( voutNode + 1 ) + "][3])" )
186- var latexResult = Algebrite . run ( "printlatex(mna_vo_vi)" ) ;
187- console . log ( 'Algebrite' ) ;
188- console . log ( Algebrite . eval ( "mna" ) . toString ( ) ) ;
189- console . log ( Algebrite . eval ( "inv_mna" ) . toString ( ) ) ;
190- console . log ( Algebrite . eval ( "mna_vo_vi" ) . toString ( ) ) ;
191- console . log ( latexResult ) ;
222+ Algebrite . eval ( "mna_vo_vi = (inv_mna[" + ( voutNode + 1 ) + "][" + ( mnaMatrix . length ) + "])" )
223+ Algebrite . eval ( "mna_vo_vi_num = simplify(numerator(mna_vo_vi))" )
224+ Algebrite . eval ( "mna_vo_vi_den = simplify(denominator(mna_vo_vi))" )
225+ Algebrite . eval ( "mna_vo_vi_long = simplify(mna_vo_vi_num/mna_vo_vi_den)" )
226+ console . log ( 'vin node' )
227+ latexResult = Algebrite . run ( "printlatex(mna_vo_vi)" ) ;
228+ // console.log('Algebrite');
229+ // console.log(Algebrite.eval("mna").toString());
230+ console . log ( Algebrite . eval ( "mna_vo_vi_num" ) . toString ( ) ) ;
231+ console . log ( Algebrite . eval ( "mna_vo_vi_den" ) . toString ( ) ) ;
232+ console . log ( Algebrite . eval ( "mna_vo_vi_long" ) . toString ( ) ) ;
233+ // console.log(Algebrite.eval("inv_mna").toString());
234+ // console.log(Algebrite.eval("mna_vo_vi").toString());
235+ // console.log(latexResult);
192236 // console.log(MNA_vo_vi.text());
193237
194238 // renderPage();
0 commit comments