@@ -15561,42 +15561,14 @@ algorithm
1556115561 Integer[:] v1,v2,v1_1,v2_1;
1556215562 list<list<Integer>> comps,comps_1;
1556315563 list<list<Integer>> r,t;
15564- Variables ordvars,knvars,exobj,ordvars1;
15565- EquationArray eqns,remeqns,inieqns,eqns1;
15566- MultiDimEquation[:] arreqns;
15567- DAE.Algorithm[:] algorithms;
15568- EventInfo einfo;
15569- ExternalObjectClasses eoc;
15570- Value n,size,n1,size1;
15571- Option<Equation>[:] arr_1,arr;
15572- list<CrefIndex>[:] crefIdxLstArr,crefIdxLstArr1;
15573- list<StringIndex>[:] strIdxLstArr,strIdxLstArr1;
15574- VariableArray varArr;
15575- Integer bucketSize;
15576- Integer numberOfVars;
15577- Option<Var>[:] varOptArr,varOptArr1;
1557815564 case (dlow,m,mT,v1,v2,comps)
1557915565 equation
1558015566 // add flag her if no tearing is desired
1558115567 true = RTOpts.debugFlag("tearing");
1558215568 Debug.fcall("tearingdump", print, "Tearing\n==========\n");
1558315569 // get residual eqn and tearing var for each block
1558415570 // copy dlow
15585- DAELOW(ordvars,knvars,exobj,eqns,remeqns,inieqns,arreqns,algorithms,einfo,eoc) = dlow;
15586- VARIABLES(crefIdxLstArr,strIdxLstArr,varArr,bucketSize,numberOfVars) = ordvars;
15587- VARIABLE_ARRAY(n1,size1,varOptArr) = varArr;
15588- crefIdxLstArr1 = fill({}, size1);
15589- crefIdxLstArr1 = Util.arrayCopy(crefIdxLstArr, crefIdxLstArr1);
15590- strIdxLstArr1 = fill({}, size1);
15591- strIdxLstArr1 = Util.arrayCopy(strIdxLstArr, strIdxLstArr1);
15592- varOptArr1 = fill(NONE, size1);
15593- varOptArr1 = Util.arrayCopy(varOptArr, varOptArr1);
15594- ordvars1 = VARIABLES(crefIdxLstArr1,strIdxLstArr1,VARIABLE_ARRAY(n1,size1,varOptArr1),bucketSize,numberOfVars);
15595- EQUATION_ARRAY(numberOfElement = n,arrSize = size,equOptArr = arr) = eqns;
15596- arr_1 = fill(NONE, size);
15597- arr_1 = Util.arrayCopy(arr, arr_1);
15598- eqns1 = EQUATION_ARRAY(n,size,arr_1);
15599- dlow1 = DAELOW(ordvars1,knvars,exobj,eqns1,remeqns,inieqns,arreqns,algorithms,einfo,eoc);
15571+ dlow1 = copyDaeLowforTearing(dlow);
1560015572 (r,t,_,dlow_1,m_1,mT_1,v1_1,v2_1,comps_1) = tearingSystem1(dlow,dlow1,m,mT,v1,v2,comps);
1560115573 Debug.fcall("tearingdump", dumpIncidenceMatrix, m_1);
1560215574 Debug.fcall("tearingdump", dumpIncidenceMatrixT, mT_1);
@@ -15649,6 +15621,51 @@ algorithm
1564915621 end matchcontinue;
1565015622end dumpTearing;
1565115623
15624+ protected function copyDaeLowforTearing
15625+ " function: copyDaeLowforTearing
15626+ autor: Frenkel TUD
15627+ Copy the dae to avoid changes in
15628+ vectors."
15629+ input DAELow inDlow;
15630+ output DAELow outDlow;
15631+ algorithm
15632+ outDlow:=
15633+ matchcontinue (inDlow)
15634+ local
15635+ Variables ordvars,knvars,exobj,ordvars1;
15636+ EquationArray eqns,remeqns,inieqns,eqns1;
15637+ MultiDimEquation[:] arreqns;
15638+ DAE.Algorithm[:] algorithms;
15639+ EventInfo einfo;
15640+ ExternalObjectClasses eoc;
15641+ Value n,size,n1,size1;
15642+ Option<Equation>[:] arr_1,arr;
15643+ list<CrefIndex>[:] crefIdxLstArr,crefIdxLstArr1;
15644+ list<StringIndex>[:] strIdxLstArr,strIdxLstArr1;
15645+ VariableArray varArr;
15646+ Integer bucketSize;
15647+ Integer numberOfVars;
15648+ Option<Var>[:] varOptArr,varOptArr1;
15649+ case (DAELOW(ordvars,knvars,exobj,eqns,remeqns,inieqns,arreqns,algorithms,einfo,eoc))
15650+ equation
15651+ VARIABLES(crefIdxLstArr,strIdxLstArr,varArr,bucketSize,numberOfVars) = ordvars;
15652+ VARIABLE_ARRAY(n1,size1,varOptArr) = varArr;
15653+ crefIdxLstArr1 = fill({}, size1);
15654+ crefIdxLstArr1 = Util.arrayCopy(crefIdxLstArr, crefIdxLstArr1);
15655+ strIdxLstArr1 = fill({}, size1);
15656+ strIdxLstArr1 = Util.arrayCopy(strIdxLstArr, strIdxLstArr1);
15657+ varOptArr1 = fill(NONE, size1);
15658+ varOptArr1 = Util.arrayCopy(varOptArr, varOptArr1);
15659+ ordvars1 = VARIABLES(crefIdxLstArr1,strIdxLstArr1,VARIABLE_ARRAY(n1,size1,varOptArr1),bucketSize,numberOfVars);
15660+ EQUATION_ARRAY(numberOfElement = n,arrSize = size,equOptArr = arr) = eqns;
15661+ arr_1 = fill(NONE, size);
15662+ arr_1 = Util.arrayCopy(arr, arr_1);
15663+ eqns1 = EQUATION_ARRAY(n,size,arr_1);
15664+ then
15665+ DAELOW(ordvars1,knvars,exobj,eqns1,remeqns,inieqns,arreqns,algorithms,einfo,eoc);
15666+ end matchcontinue;
15667+ end copyDaeLowforTearing;
15668+
1565215669protected function tearingSystem1
1565315670" function: tearingSystem1
1565415671 autor: Frenkel TUD
@@ -15857,11 +15874,11 @@ algorithm
1585715874 (outTearVars,outResEqns,outTearEqns,outDlow,outDlow1,outM,outMT,outV1,outV2,outComp):=
1585815875 matchcontinue (inDlow,inDlow1,inM,inMT,inV1,inV2,inComp,inTVars,inExclude,inResEqn,inResEqns,inTearVars,inTearEqns)
1585915876 local
15860- DAELow dlow,dlow_1,dlow_2,dlow_3,dlow1,dlow1_1,dlow1,dlow1_1,dlow1_2;
15861- IncidenceMatrix m,m_1,m_2,m_3;
15877+ DAELow dlow,dlow_1,dlow_2,dlow_3,dlow1,dlow1_1,dlow1,dlow1_1,dlow1_2,dlowc,dlowc1 ;
15878+ IncidenceMatrix m,m_1,m_2,m_3,m_1p ;
1586215879 IncidenceMatrixT mT,mT_1,mT_2,mT_3;
1586315880 Integer[:] v1,v2,v1_1,v2_1,v1_2,v2_2;
15864- list<list<Integer>> comps,comps_1;
15881+ list<list<Integer>> comps,comps_1,lstm,lstmp ;
1586515882 list<Integer> vars,comp,comp_1,comp_2,r,t,exclude,b,cmops_flat;
1586615883 String str,str1,str2;
1586715884 Integer tearingvar,residualeqn,compcount,tearingeqnid;
@@ -15882,9 +15899,7 @@ algorithm
1588215899 DAE.ExpType identType;
1588315900 list<DAE.Subscript> subscriptLst;
1588415901 Integer replace,replace1;
15885- case (dlow as DAELOW(ordvars as VARIABLES(varArr=varr),knvars,exobj,eqns,remeqns,inieqns,arreqns,algorithms,einfo,eoc),
15886- dlow1 as DAELOW(orderedVars = ordvars1,orderedEqs = eqns1),
15887- m,mT,v1,v2,comp,vars,exclude,residualeqn,residualeqns,tearingvars,tearingeqns)
15902+ case (dlow,dlow1,m,mT,v1,v2,comp,vars,exclude,residualeqn,residualeqns,tearingvars,tearingeqns)
1588815903 equation
1588915904 tearingvar = getMaxfromListList(mT,vars,comp,0,0,exclude);
1589015905 // check if tearing var is found
@@ -15893,6 +15908,11 @@ algorithm
1589315908 str1 = stringAppend("\nTearingVar: ", str);
1589415909 str2 = stringAppend(str1,"\n");
1589515910 Debug.fcall("tearingdump", print, str2);
15911+ // copy dlow
15912+ dlowc = copyDaeLowforTearing(dlow);
15913+ DAELOW(ordvars as VARIABLES(varArr=varr),knvars,exobj,eqns,remeqns,inieqns,arreqns,algorithms,einfo,eoc) = dlowc;
15914+ dlowc1 = copyDaeLowforTearing(dlow1);
15915+ DAELOW(orderedVars = ordvars1,orderedEqs = eqns1) = dlowc1;
1589615916 // add Tearing Var
1589715917 VAR(varName = cr as DAE.CREF_IDENT(ident = ident, identType = identType, subscriptLst = subscriptLst )) = vararrayNth(varr, tearingvar-1);
1589815918 ident_t = stringAppend("tearingresidual_",ident);
@@ -15918,18 +15938,26 @@ algorithm
1591815938 dlow1_1 = DAELOW(ordvars1,knvars,exobj,eqns1_1,remeqns,inieqns,arreqns,algorithms,einfo,eoc);
1591915939 // try causalisation
1592015940 m_1 = incidenceMatrix(dlow_1);
15921- mT_1 = transposeMatrix(m_1);
15922- nvars = arrayLength(m_1);
15941+ lstm = arrayList(m_1);
15942+ lstmp = Util.listListMap(lstm, intAbs);
15943+ m_1p = listArray(lstmp);
15944+ mT_1 = transposeMatrix(m_1p);
15945+ nvars = arrayLength(m_1p);
1592315946 neqns = arrayLength(mT_1);
1592415947 memsize = nvars + nvars "Worst case, all eqns are differentiated once. Create nvars2 assignment elements" ;
1592515948 assign1 = assignmentsCreate(nvars, memsize, 0);
1592615949 assign2 = assignmentsCreate(nvars, memsize, 0);
1592715950 // try matching
1592815951 checkMatching(dlow_1, (NO_INDEX_REDUCTION(), EXACT(), KEEP_SIMPLE_EQN()));
15929- (ass1,ass2,dlow_2,m_2,mT_2) = matchingAlgorithm2(dlow_1, m_1, mT_1, nvars, neqns, 1, assign1, assign2, (NO_INDEX_REDUCTION(), EXACT(), KEEP_SIMPLE_EQN()));
15952+ Debug.fcall("tearingdump", dumpIncidenceMatrix, m_1);
15953+ Debug.fcall("tearingdump", dumpIncidenceMatrixT, mT_1);
15954+ Debug.fcall("tearingdump", dump, dlow_1);
15955+ (ass1,ass2,dlow_2,m_2,mT_2) = matchingAlgorithm2(dlow_1, m_1p, mT_1, nvars, neqns, 1, assign1, assign2, (NO_INDEX_REDUCTION(), EXACT(), KEEP_SIMPLE_EQN()));
1593015956 v1_1 = assignmentsVector(ass1);
1593115957 v2_1 = assignmentsVector(ass2);
1593215958 (comps) = strongComponents(m_2, mT_2, v1_1, v2_1);
15959+ Debug.fcall("tearingdump", dumpMatching, v1_1);
15960+ Debug.fcall("tearingdump", dumpComponents, comps);
1593315961 // check strongComponents (simply start again with tearingSystems4)
1593415962 (residualeqns_1,tearingvars_1,tearingeqns_1,dlow_3,dlow1_2,m_3,mT_3,v1_2,v2_2,comps_1,compcount) = tearingSystem4(dlow_2,dlow1_1,m_2,mT_2,v1_1,v2_1,comps,residualeqns,tearingvars,tearingeqns,comp,0);
1593515963 // Add Tearing Equation
@@ -15947,6 +15975,8 @@ algorithm
1594715975 tearingvar = getMaxfromListList(mT,vars,comp,0,0,exclude);
1594815976 // check if tearing var is found
1594915977 true = tearingvar > 0;
15978+ // clear errors
15979+ Error.clearMessages();
1595015980 // try next TearingVar
1595115981 (tearingvars_1,residualeqns_1,tearingeqns_1,dlow_1,dlow1_1,m_1,mT_1,v1_1,v2_1,comp_1) = tearingSystem3(dlow,dlow1,m,mT,v1,v2,comp,vars,tearingvar::exclude,residualeqn,residualeqns,tearingvars,tearingeqns);
1595215982 then
0 commit comments