Skip to content

Commit 8312a2a

Browse files
author
Jens Frenkel
committed
- tearing implenetation: check if tearing succeed, make negative entries from IncidenceMatrix positiv to get a working matchingAlgorithm
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4915 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 8a291c9 commit 8312a2a

File tree

2 files changed

+70
-38
lines changed

2 files changed

+70
-38
lines changed

Compiler/DAELow.mo

Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
1565015622
end 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+
1565215669
protected 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

Compiler/SimCodegen.mo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4057,6 +4057,8 @@ algorithm
40574057
(v1,v2,subsystem_dae_1,m_2,mT_2) = DAELow.matchingAlgorithm(subsystem_dae, m_1, mt_1, (DAELow.NO_INDEX_REDUCTION(), DAELow.EXACT(), DAELow.KEEP_SIMPLE_EQN()));
40584058
(comps) = DAELow.strongComponents(m_2, mT_2, v1,v2);
40594059
(subsystem_dae_2,m_3,mT_3,v1_1,v2_1,comps_1,r,t) = DAELow.tearingSystem(subsystem_dae_1,m_2,mT_2,v1,v2,comps);
4060+
true = listLength(r) > 0;
4061+
true = listLength(t) > 0;
40604062
comps_flat = Util.listFlatten(comps_1);
40614063
rf = Util.listFlatten(r);
40624064
tf = Util.listFlatten(t);

0 commit comments

Comments
 (0)