Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 82a256a

Browse files
arun3688OpenModelica-Hudson
authored andcommitted
add runtime support to dataReconciliation module
Belonging to [master]: - #2845 - OpenModelica/OpenModelica-testsuite#1096
1 parent a4086ba commit 82a256a

28 files changed

Lines changed: 1659 additions & 103 deletions

Compiler/BackEnd/BackendDAE.mo

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ uniontype Shared "Data shared for all equation-systems"
133133
ExtraInfo info "contains extra info that we send around like the model name";
134134
PartitionsInfo partitionsInfo;
135135
BackendDAEModeData daeModeData "DAEMode Data";
136+
Option<DataReconciliationData> dataReconciliationData;
136137
end SHARED;
137138
end Shared;
138139

@@ -185,6 +186,14 @@ uniontype BackendDAEType "BackendDAEType to indicate different types of BackendD
185186
record DAEMODESYSTEM "Type for DAEmode system BackendDAE.DAE" end DAEMODESYSTEM;
186187
end BackendDAEType;
187188

189+
uniontype DataReconciliationData
190+
record DATA_RECON
191+
Jacobian symbolicJacobian "SET_S w.r.t ...";
192+
Variables setcVars "setc solved vars";
193+
// ... maybe more DATA for the code generation
194+
end DATA_RECON;
195+
end DataReconciliationData;
196+
188197
//
189198
// variables and equations definition
190199
//

Compiler/BackEnd/BackendDAECreate.mo

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ algorithm
167167
BackendDAE.SIMULATION(),
168168
symjacs,inExtraInfo,
169169
BackendDAEUtil.emptyPartitionsInfo(),
170-
BackendDAE.emptyDAEModeData
170+
BackendDAE.emptyDAEModeData,
171+
NONE()
171172
));
172173
BackendDAEUtil.checkBackendDAEWithErrorMsg(outBackendDAE);
173174
BackendDAEUtil.checkIncidenceMatrixSolvability(syst, functionTree);

Compiler/BackEnd/BackendDAEUtil.mo

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8610,7 +8610,8 @@ algorithm
86108610
{},
86118611
ei,
86128612
emptyPartitionsInfo(),
8613-
BackendDAE.emptyDAEModeData
8613+
BackendDAE.emptyDAEModeData,
8614+
NONE()
86148615
);
86158616
end createEmptyShared;
86168617

Compiler/BackEnd/Initialization.mo

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ protected
9393
BackendDAE.Shared shared;
9494
BackendDAE.Variables initVars;
9595
BackendDAE.Variables vars, fixvars;
96-
Boolean b, b1, b2, useHomotopy;
96+
Boolean b, b1, b2, useHomotopy, datarecon=false;
9797
String msg;
9898
list<String> enabledModules, disabledModules;
9999
HashSet.HashSet hs "contains all pre variables";
@@ -149,10 +149,13 @@ algorithm
149149
for v in outAllPrimaryParameters loop
150150
allPrimaryParameters := AvlSetCR.add(allPrimaryParameters, BackendVariable.varCref(v));
151151
end for;
152-
152+
// check for datareconciliation and set the Flag, to set the Qualified Component names as TopLevel Input
153+
if Util.isSome(inDAE.shared.dataReconciliationData) then
154+
datarecon := true;
155+
end if;
153156
((vars, fixvars, eqns, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, introducePreVarsForAliasVariables, (vars, fixvars, eqns, hs));
154-
((vars, fixvars, eqns, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters));
155-
((vars, fixvars, eqns, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.localKnownVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters));
157+
((vars, fixvars, eqns, _, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters,datarecon));
158+
((vars, fixvars, eqns, _, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.localKnownVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters,datarecon));
156159
((eqns, reeqns)) := BackendEquation.traverseEquationArray(dae.shared.initialEqs, collectInitialEqns, (eqns, reeqns));
157160
((eqns, reeqns)) := BackendEquation.traverseEquationArray(dae.shared.removedEqs, collectInitialEqns, (eqns, reeqns));
158161
//if Flags.isSet(Flags.DUMP_INITIAL_SYSTEM) then
@@ -161,7 +164,7 @@ algorithm
161164
execStat("collectInitialEqns (initialization)");
162165

163166
//((vars, fixvars, eqns, reeqns, _, _)) := List.fold(dae.eqs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs, allPrimaryParameters)));
164-
(vars, fixvars, eqns, reeqns) := collectInitialVarsEqnsSystem(dae.eqs, vars, fixvars, eqns, reeqns, hs, allPrimaryParameters);
167+
(vars, fixvars, eqns, reeqns) := collectInitialVarsEqnsSystem(dae.eqs, vars, fixvars, eqns, reeqns, hs, allPrimaryParameters, datarecon);
165168
((eqns, reeqns)) := BackendVariable.traverseBackendDAEVars(vars, collectInitialBindings, (eqns, reeqns));
166169
execStat("collectInitialBindings (initialization)");
167170

@@ -2062,6 +2065,7 @@ protected function collectInitialVarsEqnsSystem
20622065
input output BackendDAE.EquationArray reEqns;
20632066
input HashSet.HashSet hs;
20642067
input AvlSetCR.Tree allPrimaryParams;
2068+
input Boolean datareconFlag;
20652069
algorithm
20662070
for eq in eqSystems loop
20672071
() := match eq
@@ -2074,8 +2078,8 @@ algorithm
20742078

20752079
else
20762080
algorithm
2077-
(vars, fixVars, eqns, _, _) := BackendVariable.traverseBackendDAEVars(eq.orderedVars,
2078-
collectInitialVars, (vars, fixVars, eqns, hs, allPrimaryParams));
2081+
(vars, fixVars, eqns, _, _, _) := BackendVariable.traverseBackendDAEVars(eq.orderedVars,
2082+
collectInitialVars, (vars, fixVars, eqns, hs, allPrimaryParams, datareconFlag));
20792083
(eqns, reEqns) := BackendEquation.traverseEquationArray(eq.orderedEqs, collectInitialEqns, (eqns, reEqns));
20802084
then
20812085
();
@@ -2087,9 +2091,9 @@ protected function collectInitialVars "author: lochel
20872091
This function collects all the vars for the initial system.
20882092
TODO: return additional equations for pre-variables"
20892093
input BackendDAE.Var inVar;
2090-
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, AvlSetCR.Tree> inTpl;
2094+
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, AvlSetCR.Tree, Boolean> inTpl;
20912095
output BackendDAE.Var outVar;
2092-
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, AvlSetCR.Tree> outTpl;
2096+
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, AvlSetCR.Tree, Boolean> outTpl;
20932097
algorithm
20942098
(outVar, outTpl) := matchcontinue (inVar, inTpl)
20952099
local
@@ -2098,7 +2102,7 @@ algorithm
20982102
BackendDAE.EquationArray eqns;
20992103
BackendDAE.Equation eqn;
21002104
DAE.ComponentRef cr, preCR, derCR, startCR;
2101-
Boolean isFixed, isInput, b, preUsed;
2105+
Boolean isFixed, isInput, b, preUsed, datarecon;
21022106
DAE.Type ty;
21032107
DAE.InstDims arryDim;
21042108
Option<DAE.Exp> startValue;
@@ -2112,7 +2116,7 @@ algorithm
21122116
list<DAE.ComponentRef> parameters;
21132117

21142118
// state
2115-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2119+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters,datarecon)) equation
21162120
isFixed = BackendVariable.varFixed(var);
21172121
//_ = BackendVariable.varStartValueOption(var);
21182122
preUsed = BaseHashSet.has(cr, hs);
@@ -2162,10 +2166,10 @@ algorithm
21622166
vars = BackendVariable.addVar(var, vars);
21632167
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
21642168
eqns = if preUsed then BackendEquation.add(eqn, eqns) else eqns;
2165-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2169+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
21662170

21672171
// discrete (preUsed=true)
2168-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2172+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
21692173
true = BaseHashSet.has(cr, hs);
21702174
true = BackendVariable.varFixed(var);
21712175
startValue_ = BackendVariable.varStartValue(var);
@@ -2184,10 +2188,10 @@ algorithm
21842188
vars = BackendVariable.addVar(var, vars);
21852189
vars = BackendVariable.addVar(preVar, vars);
21862190
eqns = BackendEquation.add(eqn, eqns);
2187-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2191+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
21882192

21892193
// discrete
2190-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2194+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
21912195
preUsed = BaseHashSet.has(cr, hs);
21922196
startValue = BackendVariable.varStartValueOption(var);
21932197

@@ -2202,10 +2206,10 @@ algorithm
22022206

22032207
vars = BackendVariable.addVar(var, vars);
22042208
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
2205-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2209+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22062210

22072211
// parameter without binding and fixed=true
2208-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2212+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22092213
true = BackendVariable.varFixed(var);
22102214
startExp = BackendVariable.varStartValueType(var);
22112215

@@ -2224,10 +2228,10 @@ algorithm
22242228
Error.addSourceMessage(Error.UNBOUND_PARAMETER_WITH_START_VALUE_WARNING, {s, str}, info);
22252229

22262230
//vars = BackendVariable.addVar(var, vars);
2227-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2231+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22282232

22292233
// parameter with binding and fixed=false
2230-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2234+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22312235
true = intGt(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
22322236
false = BackendVariable.varFixed(var);
22332237
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2242,12 +2246,12 @@ algorithm
22422246
eqns = BackendEquation.add(eqn, eqns);
22432247

22442248
vars = BackendVariable.addVar(var, vars);
2245-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2249+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22462250

22472251
// *** MODELICA 3.1 COMPATIBLE ***
22482252
// parameter with binding and fixed=false and no start value
22492253
// use the binding as start value
2250-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2254+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22512255
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
22522256
false = BackendVariable.varFixed(var);
22532257
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2261,12 +2265,12 @@ algorithm
22612265
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_31, {s, s, str}, info);
22622266

22632267
vars = BackendVariable.addVar(var, vars);
2264-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2268+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22652269

22662270
// *** MODELICA 3.1 COMPATIBLE ***
22672271
// parameter with binding and fixed=false and a start value
22682272
// ignore the binding and use the start value
2269-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2273+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22702274
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
22712275
false = BackendVariable.varFixed(var);
22722276
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2280,21 +2284,21 @@ algorithm
22802284
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_AND_START_VALUE_31, {s, sv, s, str}, info);
22812285

22822286
vars = BackendVariable.addVar(var, vars);
2283-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2287+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22842288

22852289
// secondary parameter
2286-
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2290+
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22872291
//true = BackendVariable.varFixed(var);
22882292
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
22892293
vars = BackendVariable.addVar(var, vars);
2290-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2294+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22912295

22922296
// external objects
2293-
case (var as BackendDAE.VAR(varKind=BackendDAE.EXTOBJ()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2297+
case (var as BackendDAE.VAR(varKind=BackendDAE.EXTOBJ()), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
22942298
//var = BackendVariable.setVarFixed(var, false);
22952299
//var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
22962300
vars = BackendVariable.addVar(var, vars);
2297-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2301+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
22982302

22992303
// skip constant
23002304
case (var as BackendDAE.VAR(varKind=BackendDAE.CONST()), _) // equation
@@ -2303,11 +2307,15 @@ algorithm
23032307

23042308
// VARIABLE (fixed=true)
23052309
// DUMMY_STATE
2306-
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2310+
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
23072311
true = BackendVariable.varFixed(var);
2308-
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
2312+
// check if dataReconciliation is present and set the Input variables to true, as Qualified components are not handled as toplevel inputs
2313+
if datarecon then
2314+
isInput = checkComponentNames(var.varDirection, cr);
2315+
else
2316+
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
2317+
end if;
23092318
preUsed = BaseHashSet.has(cr, hs);
2310-
23112319
_ = Expression.crefExp(cr);
23122320

23132321
startCR = ComponentReference.crefPrefixStart(cr);
@@ -2345,15 +2353,19 @@ algorithm
23452353
eqns = BackendEquation.add(eqn, eqns);
23462354

23472355
// Error.addCompilerNotification("VARIABLE (fixed=true): " + BackendDump.varString(var));
2348-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2356+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
23492357

23502358
// VARIABLE (fixed=false)
23512359
// DUMMY_STATE
2352-
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
2360+
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon)) equation
23532361
false = BackendVariable.varFixed(var);
2354-
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
2362+
// check if dataReconciliation is present and set the Input variables to true, as Qualified components are not handled as toplevel inputs
2363+
if datarecon then
2364+
isInput = checkComponentNames(var.varDirection, cr);
2365+
else
2366+
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
2367+
end if;
23552368
preUsed = BaseHashSet.has(cr, hs);
2356-
23572369
_ = Expression.crefExp(cr);
23582370

23592371
startCR = ComponentReference.crefPrefixStart(cr);
@@ -2389,14 +2401,28 @@ algorithm
23892401
eqns = if preUsed then BackendEquation.add(eqn, eqns) else eqns;
23902402

23912403
// Error.addCompilerNotification("VARIABLE (fixed=false); " + BackendDump.varString(var));
2392-
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
2404+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters, datarecon));
23932405

23942406
else equation
23952407
Error.addInternalError("function collectInitialVars failed for: " + BackendDump.varString(inVar), sourceInfo());
23962408
then fail();
23972409
end matchcontinue;
23982410
end collectInitialVars;
23992411

2412+
protected function checkComponentNames "author: arun
2413+
This is a special function which sets the inputs for dataReconciliation
2414+
Inorder to handle Qualified component names as inputs."
2415+
input DAE.VarDirection inVarDirection;
2416+
input DAE.ComponentRef inComponentRef;
2417+
output Boolean isTopLevel;
2418+
algorithm
2419+
isTopLevel := match (inVarDirection, inComponentRef)
2420+
case (DAE.INPUT(), DAE.CREF_IDENT()) then true;
2421+
case (DAE.INPUT(), DAE.CREF_QUAL()) then true;
2422+
case (_ , _) then false;
2423+
end match;
2424+
end checkComponentNames;
2425+
24002426
protected function collectInitialClockedVarsEqns "author: rfranke
24012427
This function creates initial equations for a clocked partition.
24022428
Previous states are initialized with the states. All other variables are initialized with start values."

Compiler/BackEnd/SymbolicJacobian.mo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2440,7 +2440,7 @@ algorithm
24402440
end match for component in inComps);
24412441
end calculateJacobiansComponents;
24422442

2443-
protected function prepareTornStrongComponentData
2443+
public function prepareTornStrongComponentData
24442444
input BackendDAE.Variables inVars;
24452445
input BackendDAE.EquationArray inEqns;
24462446
input list<Integer> inIterationvarsInts;
@@ -2759,7 +2759,7 @@ algorithm
27592759
end match;
27602760
end isRecordInvoled;
27612761

2762-
protected function getSymbolicJacobian "author: wbraun
2762+
public function getSymbolicJacobian "author: wbraun
27632763
This function creates a symbolic Jacobian column for non-linear systems and
27642764
tearing systems."
27652765
input BackendDAE.Variables inDiffVars;

0 commit comments

Comments
 (0)