Skip to content

Commit ad11e88

Browse files
arun3688sjoelund
authored andcommitted
generate seperate c function for setting datarecon inputs
1 parent 00057d2 commit ad11e88

File tree

12 files changed

+83
-17
lines changed

12 files changed

+83
-17
lines changed

OMCompiler/Compiler/BackEnd/BackendDAE.mo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ uniontype DataReconciliationData
190190
record DATA_RECON
191191
Jacobian symbolicJacobian "SET_S w.r.t ...";
192192
Variables setcVars "setc solved vars";
193+
Variables datareconinputs;
193194
// ... maybe more DATA for the code generation
194195
end DATA_RECON;
195196
end DataReconciliationData;

OMCompiler/Compiler/BackEnd/Uncertainties.mo

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ algorithm
435435

436436
/* Prepare Torn systems for Jacobians */
437437
//create the Set-S equation to BackendDae innerequation structure
438-
sets_inner_equations=createInnerEquations(tempsetS,var,setS,knowns);
438+
sets_inner_equations=createInnerEquations(tempsetS,var,setS,knowns,inputvarlist);
439439
//sets_inner_equations={BackendDAE.INNEREQUATION(eqn = 56, vars = {48}), BackendDAE.INNEREQUATION(eqn = 3, vars = {70}), BackendDAE.INNEREQUATION(eqn = 6, vars = {77}),BackendDAE.INNEREQUATION(eqn = 23, vars = {55}), BackendDAE.INNEREQUATION(eqn = 20, vars = {42}), BackendDAE.INNEREQUATION(eqn = 50, vars = {20})};
440440
(outDiffVars,outResidualVars,outOtherVars,outResidualEqns,outOtherEqns)=SymbolicJacobian.prepareTornStrongComponentData(allVars,allEqs,listReverse(knowns),setC,sets_inner_equations,shared.functionTree);
441441
// Dump the torn systems
@@ -449,7 +449,7 @@ algorithm
449449
(simcodejacobian,shared)=SymbolicJacobian.getSymbolicJacobian(outDiffVars,outResidualEqns,outResidualVars,outOtherEqns,outOtherVars,shared,BackendVariable.listVar(List.map1r(extractedvars,BackendVariable.getVarAt,allVars)),"F",false);
450450
// put the jacobian also into shared object
451451
setcVars=BackendVariable.listVar(List.map1r(getRemovedEquationSolvedVariables(tempsetC,var),BackendVariable.getVarAt,allVars));
452-
shared.dataReconciliationData = SOME(BackendDAE.DATA_RECON(symbolicJacobian=simcodejacobian,setcVars=outResidualVars));
452+
shared.dataReconciliationData = SOME(BackendDAE.DATA_RECON(symbolicJacobian=simcodejacobian,setcVars=outResidualVars,datareconinputs=outDiffVars));
453453
//BackendDump.dumpVariables(setcVars,"SET_C_SOLVEDVARS");
454454

455455
// Prepare the final DAE System with Set-c equations as residual equations
@@ -496,16 +496,21 @@ public function createInnerEquations
496496
input list<tuple<Integer,Integer>> solvedeqvar;
497497
input list<Integer> sets;
498498
input list<Integer> knowns;
499+
input list<Integer> inputlist;
499500
output BackendDAE.InnerEquations outequations={};
500501
protected
501502
Integer eqnumber,varnumber;
502503
Integer count=1;
504+
Integer inpcount=1;
503505
algorithm
504506
for i in tempsets loop
505507
(eqnumber,varnumber):=getSolvedVariableNumber(i,solvedeqvar);
506508
// map the tempsets with setS, to get the correct equation index for example (26/37) in ordered equation list
507509
if not listMember(varnumber,knowns) then
508510
outequations:=BackendDAE.INNEREQUATION(listGet(sets, count),{varnumber})::outequations;
511+
else
512+
outequations:=BackendDAE.INNEREQUATION(listGet(sets, count),{listGet(inputlist, inpcount)})::outequations;
513+
inpcount:=inpcount+1;
509514
end if;
510515
count:=count+1;
511516
end for;

OMCompiler/Compiler/SimCode/ReduceDAE.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,14 +2173,14 @@ algorithm
21732173
local
21742174
list<SimCodeVar.SimVar> states,derVar,alg,disAlg,intAlg,boolAlg,inVar,outVar,algAlias,intAlias,boolAlias,param,
21752175
intParam,boolParam,stringAlg,stringParam,stringAlias,extObjVar,const,intConst,boolConst,stringConst,jacobianVar,
2176-
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar;
2176+
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar,datareconinputvar;
21772177
SimCodeVar.SimVar simVar_1,simVar_2;
21782178
list<SimCodeVar.SimVar> param_1,param_2;
21792179
Integer i,p;
21802180
String name, name1, name2, indexStr;
21812181
case (SimCodeVar.SIMVARS(states,derVar,alg,disAlg,intAlg,boolAlg,inVar,outVar,algAlias,intAlias,boolAlias,param,
21822182
intParam,boolParam,stringAlg,stringParam,stringAlias,extObjVar,const,intConst,boolConst,stringConst,jacobianVar,
2183-
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar),p,i)
2183+
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar,datareconinputvar),p,i)
21842184

21852185
equation
21862186
indexStr = intString(i);
@@ -2206,7 +2206,7 @@ algorithm
22062206

22072207
(SimCodeVar.SIMVARS(states,derVar,alg,disAlg,intAlg,boolAlg,inVar,outVar,algAlias,intAlias,boolAlias,param_2,
22082208
intParam,boolParam,stringAlg,stringParam,stringAlias,extObjVar,const,intConst,boolConst,stringConst,jacobianVar,
2209-
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar),name);
2209+
seedVar,realOptConst,realOptFinalConst,sensVar,setcVar,datareconinputvar),name);
22102210

22112211
end matchcontinue;
22122212
end createLabelVar;

OMCompiler/Compiler/SimCode/SimCode.mo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ uniontype VarInfo "Number of variables of various types in a Modelica model."
273273
Integer numOptimizeFinalConstraints;
274274
Integer numSensitivityParameters;
275275
Integer numSetcVars;
276+
Integer numDataReconVars;
276277
end VARINFO;
277278
end VarInfo;
278279

OMCompiler/Compiler/SimCode/SimCodeUtil.mo

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ protected
279279
BackendDAE.Var dtVar;
280280
HashTableSimCodeEqCache.HashTable eqCache;
281281
BackendDAE.Jacobian dataReconJac;
282-
BackendDAE.Variables setcVars;
283-
list<SimCodeVar.SimVar> tmpsetcVars;
282+
BackendDAE.Variables setcVars,datareconinputvars;
283+
list<SimCodeVar.SimVar> tmpsetcVars,tmpdatareconinputvars;
284284
SimCode.JacobianMatrix dataReconSimJac;
285285
String fullPathPrefix;
286286

@@ -525,7 +525,7 @@ algorithm
525525

526526
// Generate jacobian code for DataReconciliation
527527
if Util.isSome(shared.dataReconciliationData) then
528-
BackendDAE.DATA_RECON(dataReconJac,setcVars) := Util.getOption(shared.dataReconciliationData);
528+
BackendDAE.DATA_RECON(dataReconJac,setcVars,datareconinputvars) := Util.getOption(shared.dataReconciliationData);
529529
(SOME(dataReconSimJac), uniqueEqIndex, tempvars) := createSymbolicSimulationJacobian(dataReconJac, uniqueEqIndex, tempvars);
530530
(SymbolicJacsdatarecon, modelInfo, SymbolicJacsTemp) := addAlgebraicLoopsModelInfoSymJacs({dataReconSimJac}, modelInfo);
531531
SymbolicJacsNLS := listAppend(SymbolicJacsTemp, SymbolicJacsNLS);
@@ -616,9 +616,17 @@ algorithm
616616
tmpsetcVars := rewriteIndex(tmpsetcVars, 0);
617617
tmpSimVars.dataReconSetcVars := tmpsetcVars;
618618
modelInfo.vars := tmpSimVars;
619+
620+
//add the input vars for dataReconciliation
621+
((tmpdatareconinputvars, _)) := BackendVariable.traverseBackendDAEVars(datareconinputvars, traversingdlowvarToSimvar, ({}, emptyVars));
622+
tmpdatareconinputvars := rewriteIndex(listReverse(tmpdatareconinputvars), 0);
623+
tmpSimVars.dataReconinputVars := tmpdatareconinputvars;
624+
modelInfo.vars := tmpSimVars;
625+
619626
// set varInfo nsetcvars
620627
varInfo := modelInfo.varInfo;
621628
varInfo.numSetcVars := listLength(tmpsetcVars);
629+
varInfo.numDataReconVars := listLength(tmpdatareconinputvars);
622630
modelInfo.varInfo := varInfo;
623631
//print("\n simcode gen setc:*****"+anyString(tmpsetcVars) + "\n lenght of vars :" +anyString(listLength(tmpsetcVars)));
624632
end if;
@@ -7247,7 +7255,7 @@ algorithm
72477255
numTimeEvents := numTimeEvents;
72487256
numRelations := numRelations;
72497257
varInfo := SimCode.VARINFO(numZeroCrossings, numTimeEvents, numRelations, numMathEventFunctions, nx, ny, ndy, ny_int, ny_bool, na, na_int, na_bool, np, np_int, np_bool, numOutVars, numInVars,
7250-
next, ny_string, np_string, na_string, 0, 0, 0, 0, numStateSets,0,numOptimizeConstraints, numOptimizeFinalConstraints, 0,0);
7258+
next, ny_string, np_string, na_string, 0, 0, 0, 0, numStateSets,0,numOptimizeConstraints, numOptimizeFinalConstraints, 0,0,0);
72517259
end createVarInfo;
72527260

72537261
protected function evaluateStartValues"evaluates functions in the start values in the variableAttributes"
@@ -7700,6 +7708,7 @@ protected type SimVarsIndex = enumeration(
77007708

77017709
sensitivity,
77027710
setcvars,
7711+
datareconinputvars,
77037712
jacobian,
77047713
seed
77057714
);
@@ -7831,7 +7840,8 @@ algorithm
78317840
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.realOptimizeConstraints)),
78327841
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.realOptimizeFinalConstraints)),
78337842
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.sensitivity)),
7834-
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.setcvars))
7843+
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.setcvars)),
7844+
Dangerous.arrayGetNoBoundsChecking(simVars, Integer(SimVarsIndex.datareconinputvars))
78357845
);
78367846
GC.free(simVars);
78377847
end createVars;
@@ -10665,11 +10675,11 @@ algorithm
1066510675
paramVars, intParamVars, boolParamVars, stringParamVars,
1066610676
constVars, intConstVars, boolConstVars, stringConstVars,
1066710677
sensitivityVars, extObjVars, jacobianVars, seedVars,
10668-
realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars,setcVars;
10678+
realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars,setcVars,datareconinputvars;
1066910679
tpl intpl;
1067010680

1067110681
case (SimCodeVar.SIMVARS(stateVars, derivativeVars, algVars, discreteAlgVars, intAlgVars, boolAlgVars, inputVars, outputVars, aliasVars, intAliasVars, boolAliasVars,
10672-
paramVars, intParamVars, boolParamVars, stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, sensitivityVars,setcVars), _, intpl)
10682+
paramVars, intParamVars, boolParamVars, stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, sensitivityVars,setcVars,datareconinputvars), _, intpl)
1067310683
equation
1067410684
(stateVars, intpl) = List.mapFoldTuple(stateVars, func, intpl);
1067510685
(derivativeVars, intpl) = List.mapFoldTuple(derivativeVars, func, intpl);
@@ -10698,10 +10708,10 @@ algorithm
1069810708
(realOptimizeFinalConstraintsVars, intpl) = List.mapFoldTuple(realOptimizeFinalConstraintsVars, func, intpl);
1069910709
(sensitivityVars, intpl) = List.mapFoldTuple(sensitivityVars, func, intpl);
1070010710
(setcVars, intpl) = List.mapFoldTuple(setcVars, func, intpl);
10701-
10711+
(datareconinputvars, intpl) = List.mapFoldTuple(datareconinputvars, func, intpl);
1070210712

1070310713
then (SimCodeVar.SIMVARS(stateVars, derivativeVars, algVars, discreteAlgVars, intAlgVars, boolAlgVars, inputVars, outputVars, aliasVars, intAliasVars, boolAliasVars,
10704-
paramVars, intParamVars, boolParamVars, stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, sensitivityVars,setcVars), intpl);
10714+
paramVars, intParamVars, boolParamVars, stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, sensitivityVars,setcVars,datareconinputvars), intpl);
1070510715
case (_, _, _) then fail();
1070610716
end match;
1070710717
end traveseSimVars;

OMCompiler/Compiler/SimCode/SimCodeVar.mo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ uniontype SimVars "Container for metadata about variables in a Modelica model."
7070
list<SimVar> realOptimizeFinalConstraintsVars;
7171
list<SimVar> sensitivityVars; // variable used to calculate sensitivities for parameters nSensitivitityParameters + nRealParam*nStates
7272
list<SimVar> dataReconSetcVars;
73+
list<SimVar> dataReconinputVars;
7374
end SIMVARS;
7475
end SimVars;
7576

OMCompiler/Compiler/Template/CodegenC.tpl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,8 @@ template simulationFile(SimCode simCode, String guid, String isModelExchangeFMU)
10571057
const VAR_INFO dummyVAR_INFO = omc_dummyVarInfo;
10581058
10591059
<%functionInput(simCode, modelInfo, modelNamePrefixStr)%>
1060+
1061+
<%functionDataInput(modelInfo, modelNamePrefixStr)%>
10601062
10611063
<%functionOutput(modelInfo, modelNamePrefixStr)%>
10621064
@@ -1095,6 +1097,7 @@ template simulationFile(SimCode simCode, String guid, String isModelExchangeFMU)
10951097
<%symbolName(modelNamePrefixStr,"input_function")%>,
10961098
<%symbolName(modelNamePrefixStr,"input_function_init")%>,
10971099
<%symbolName(modelNamePrefixStr,"input_function_updateStartValues")%>,
1100+
<%symbolName(modelNamePrefixStr,"data_function")%>,
10981101
<%symbolName(modelNamePrefixStr,"output_function")%>,
10991102
<%symbolName(modelNamePrefixStr,"setc_function")%>,
11001103
<%symbolName(modelNamePrefixStr,"function_storeDelayed")%>,
@@ -1314,6 +1317,7 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
13141317
data->modelData->nSensitivityVars = <%listLength(vars.sensitivityVars)%>;
13151318
data->modelData->nSensitivityParamVars = <%varInfo.numSensitivityParameters%>;
13161319
data->modelData->nSetcVars = <%varInfo.numSetcVars%>;
1320+
data->modelData->ndataReconVars = <%varInfo.numDataReconVars%>;
13171321
>>
13181322
end match
13191323
end populateModelInfo;
@@ -1674,6 +1678,27 @@ template functionInput(SimCode simCode, ModelInfo modelInfo, String modelNamePre
16741678
end match
16751679
end functionInput;
16761680

1681+
template functionDataInput(ModelInfo modelInfo, String modelNamePrefix)
1682+
"Generates function in simulation file."
1683+
::=
1684+
match modelInfo
1685+
case MODELINFO(vars=SIMVARS(__)) then
1686+
<<
1687+
int <%symbolName(modelNamePrefix,"data_function")%>(DATA *data, threadData_t *threadData)
1688+
{
1689+
TRACE_PUSH
1690+
1691+
<%vars.dataReconinputVars |> SIMVAR(name=name, type_=T_REAL()) hasindex i0 =>
1692+
'<%cref(name)%> = data->simulationInfo->datainputVars[<%i0%>];'
1693+
;separator="\n"
1694+
%>
1695+
TRACE_POP
1696+
return 0;
1697+
}
1698+
>>
1699+
end match
1700+
end functionDataInput;
1701+
16771702
template functionOutput(ModelInfo modelInfo, String modelNamePrefix)
16781703
"Generates function in simulation file."
16791704
::=

OMCompiler/Compiler/Template/SimCodeTV.mo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ package SimCodeVar
238238
list<SimVar> algebraicDAEVars;
239239
list<SimVar> sensitivityVars;
240240
list<SimVar> dataReconSetcVars;
241+
list<SimVar> dataReconinputVars;
241242
end SIMVARS;
242243
end SimVars;
243244

@@ -705,6 +706,7 @@ package SimCode
705706
Integer numOptimizeFinalConstraints;
706707
Integer numSensitivityParameters;
707708
Integer numSetcVars;
709+
Integer numDataReconVars;
708710
end VARINFO;
709711
end VarInfo;
710712

OMCompiler/SimulationRuntime/c/dataReconciliation/dataReconciliation.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -772,9 +772,11 @@ inputData getInputDataFromStartAttribute(csvData Sx_result , DATA* data, threadD
772772
data->callback->inputNames(data, knowns);
773773
int headercount = Sx_result.headers.size();
774774
/* Read data from input vars which has start attribute value set as input */
775+
775776
for (int h=0; h < headercount; h++)
776777
{
777778
tempx[h]=Sx_result.xdata[h];
779+
/*
778780
bool flag=false;
779781
for (int in=0; in < data->modelData->nInputVars; in++)
780782
{
@@ -792,7 +794,7 @@ inputData getInputDataFromStartAttribute(csvData Sx_result , DATA* data, threadD
792794
logfile << "| error | " << "Input Variable Not matched or not generated: "<< Sx_result.headers[h] << " , getInputDataFromStartAttribute failed()! \n";
793795
logfile.close();
794796
exit(1);
795-
}
797+
} */
796798
}
797799
inputData x_data ={Sx_result.rowcount,1,tempx,index};
798800
free(knowns);
@@ -996,13 +998,24 @@ void checkInExpensiveMatrixInverse(ofstream & logfile)
996998
int RunReconciliation(DATA* data, threadData_t *threadData, inputData x, matrixData Sx, matrixData tmpjacF, matrixData tmpjacFt, double eps, int iterationcount, csvData csvinputs, matrixData xdiag, matrixData sxdiag, ofstream& logfile)
997999
{
9981000
// set the inputs first
1001+
/*
9991002
for (int i=0; i< x.rows*x.column; i++)
10001003
{
10011004
data->simulationInfo->inputVars[x.index[i]]=x.data[i];
10021005
//logfile << "input data:" << x.data[i]<<"\n";
1006+
}*/
1007+
1008+
for (int i=0; i< x.rows*x.column; i++)
1009+
{
1010+
data->simulationInfo->datainputVars[i]=x.data[i];
1011+
//logfile << "input data:" << x.data[i]<<"\n";
10031012
}
1004-
//data->callback->input_function_updateStartValues(data, threadData);
1005-
data->callback->input_function(data, threadData);
1013+
1014+
/* set the inputs via this special function generated for dataReconciliation
1015+
* which also sets inputs for models not involving top level inputs
1016+
*/
1017+
data->callback->data_function(data, threadData);
1018+
//data->callback->input_function(data, threadData);
10061019
data->callback->functionDAE(data,threadData);
10071020
//data->callback->functionODE(data,threadData);
10081021
data->callback->setc_function(data, threadData);
@@ -1394,6 +1407,7 @@ int dataReconciliation(DATA* data, threadData_t *threadData)
13941407
// Start the Algorithm
13951408
RunReconciliation(data,threadData,x,Sx,jacF,jacFt,atof(epselon),1,Sx_data,x_diag,tmpSx_diag,logfile);
13961409
logfile << "| info | " << "DataReconciliation Completed! \n";
1410+
logfile.flush();
13971411
logfile.close();
13981412
free(Sx.data);
13991413
free(x.data);

OMCompiler/SimulationRuntime/c/openmodelica_func.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ int (*functionLocalKnownVars)(DATA *data, threadData_t*);
120120
int (*input_function)(DATA*, threadData_t*);
121121
int (*input_function_init)(DATA*, threadData_t*);
122122
int (*input_function_updateStartValues)(DATA*, threadData_t*);
123+
/* functions for setting dataReconciliation inputs */
124+
int (*data_function)(DATA*, threadData_t*);
125+
123126
int (*output_function)(DATA*, threadData_t*);
124127

125128
/* functions for setc data_reconciliation */

0 commit comments

Comments
 (0)