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

Commit df2b1c7

Browse files
lochelOpenModelica-Hudson
authored andcommitted
Initialize external objects together with parameters
- see ticket:3446
1 parent d2c938f commit df2b1c7

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

Compiler/BackEnd/Initialization.mo

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ protected function selectInitializationVariablesDAE "author: lochel
780780
This function wraps selectInitializationVariables.
781781
All primary parameters get removed from the dae."
782782
input output BackendDAE.BackendDAE dae;
783-
output BackendDAE.Variables outVars;
783+
output BackendDAE.Variables outInitVars;
784784
output list<BackendDAE.Var> outPrimaryParameters = {};
785785
output list<BackendDAE.Var> outAllPrimaryParameters = {};
786786
protected
@@ -797,15 +797,16 @@ protected
797797
BackendDAE.Var p;
798798
DAE.Exp bindExp;
799799
algorithm
800-
outVars := selectInitializationVariables(dae.eqs);
801-
outVars := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectInitializationVariables2, outVars);
802-
outVars := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, selectInitializationVariables2, outVars);
800+
outInitVars := selectInitializationVariables(dae.eqs);
801+
outInitVars := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectInitializationVariables2, outInitVars);
802+
outInitVars := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, selectInitializationVariables2, outInitVars);
803803

804804
// select all parameters
805805
allParameters := BackendVariable.emptyVars();
806806
allParameterEqns := BackendEquation.emptyEqns();
807807
otherVariables := BackendVariable.emptyVars();
808808
(allParameters, allParameterEqns, otherVariables) := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectParameter2, (allParameters, allParameterEqns, otherVariables));
809+
(allParameters, allParameterEqns, otherVariables) := BackendVariable.traverseBackendDAEVars(dae.shared.externalObjects, selectParameter2, (allParameters, allParameterEqns, otherVariables));
809810
nParam := BackendVariable.varsSize(allParameters);
810811

811812
if nParam > 0 then
@@ -843,11 +844,11 @@ algorithm
843844
if 1 == secondary[i] then
844845
otherVariables := BackendVariable.addVar(p, otherVariables);
845846
p := BackendVariable.setVarFixed(p, false);
846-
outVars := BackendVariable.addVar(p, outVars);
847+
outInitVars := BackendVariable.addVar(p, outInitVars);
847848
else
848849
outAllPrimaryParameters := p::outAllPrimaryParameters;
849850
bindExp := BackendVariable.varBindExpStartValueNoFail(p);
850-
if (not Expression.isConst(bindExp)) or BackendVariable.isFinalOrProtectedVar(p) then
851+
if (not Expression.isConst(bindExp)) or BackendVariable.isFinalOrProtectedVar(p) or BackendVariable.isExtObj(p) then
851852
outPrimaryParameters := p::outPrimaryParameters "this is used in SimCode to generate parameter equations";
852853
end if;
853854
end if;
@@ -857,6 +858,10 @@ algorithm
857858
outPrimaryParameters := listReverse(outPrimaryParameters);
858859
outAllPrimaryParameters := listReverse(outAllPrimaryParameters);
859860
dae := BackendDAEUtil.setKnownVars(dae, otherVariables);
861+
862+
//BackendDump.dumpVarList(outPrimaryParameters, "outPrimaryParameters");
863+
//BackendDump.dumpVarList(outAllPrimaryParameters, "outAllPrimaryParameters");
864+
//BackendDump.dumpVariables(otherVariables, "otherVariables");
860865
end if;
861866
end selectInitializationVariablesDAE;
862867

@@ -985,6 +990,17 @@ algorithm
985990
eqns = BackendEquation.addEquation(eqn, eqns);
986991
then ((vars, eqns, otherVars));
987992

993+
// external object with binding
994+
case (BackendDAE.VAR(varKind=BackendDAE.EXTOBJ(), bindExp=SOME(bindExp)), (vars, eqns, otherVars)) equation
995+
var = BackendVariable.setVarFixed(inVar, true);
996+
vars = BackendVariable.addVar(var, vars);
997+
998+
cref = BackendVariable.varCref(inVar);
999+
crefExp = Expression.crefExp(cref);
1000+
eqn = BackendDAE.EQUATION(crefExp, bindExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
1001+
eqns = BackendEquation.addEquation(eqn, eqns);
1002+
then ((vars, eqns, otherVars));
1003+
9881004
else equation
9891005
(vars, eqns, otherVars) = inTpl;
9901006
otherVars = BackendVariable.addVar(inVar, otherVars);

SimulationRuntime/c/simulation/solver/solver_main.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,7 @@ int initializeModel(DATA* data, threadData_t *threadData, const char* init_initM
474474

475475
data->localData[0]->timeValue = simInfo->startTime;
476476

477-
/* instance all external Objects */
478-
data->callback->callExternalObjectConstructors(data, threadData);
477+
479478

480479
threadData->currentErrorStage = ERROR_SIMULATION;
481480
/* try */

0 commit comments

Comments
 (0)