Skip to content

Commit 0e77d95

Browse files
author
Vitalij Ruge
committed
fixed extends dynamic optimization formulation
- initial guess with file - handling der(x) git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25224 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 56bd4dc commit 0e77d95

File tree

10 files changed

+54
-16
lines changed

10 files changed

+54
-16
lines changed

Compiler/BackEnd/BackendDAE.mo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,9 @@ uniontype VarKind "variable kind"
227227
record OPT_INPUT_WITH_DER end OPT_INPUT_WITH_DER;
228228
record OPT_INPUT_DER end OPT_INPUT_DER;
229229
record OPT_TGRID end OPT_TGRID;
230+
record OPT_LOOP_INPUT
231+
.DAE.ComponentRef replaceExp;
232+
end OPT_LOOP_INPUT;
230233
end VarKind;
231234

232235
public uniontype TearingSelect

Compiler/BackEnd/BackendDump.mo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2302,6 +2302,7 @@ algorithm
23022302
case BackendDAE.OPT_INPUT_WITH_DER() then "OPT_INPUT_WITH_DER";
23032303
case BackendDAE.OPT_INPUT_DER() then "OPT_INPUT_DER";
23042304
case BackendDAE.OPT_TGRID() then "OPT_TGRID";
2305+
case BackendDAE.OPT_LOOP_INPUT() then "OPT_LOOP_INPUT";
23052306
end match;
23062307
end kindString;
23072308

Compiler/BackEnd/BackendVariable.mo

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,7 @@ algorithm
862862
case (BackendDAE.VAR(varKind=BackendDAE.OPT_INPUT_WITH_DER())) then ();
863863
case (BackendDAE.VAR(varKind=BackendDAE.OPT_INPUT_DER())) then ();
864864
case (BackendDAE.VAR(varKind=BackendDAE.OPT_TGRID())) then ();
865+
case (BackendDAE.VAR(varKind=BackendDAE.OPT_LOOP_INPUT())) then ();
865866
end match;
866867
end failIfNonState;
867868

@@ -973,6 +974,7 @@ algorithm
973974
case ((BackendDAE.VAR(varKind=BackendDAE.OPT_INPUT_WITH_DER()) :: _)) then true;
974975
case ((BackendDAE.VAR(varKind=BackendDAE.OPT_INPUT_DER()) :: _)) then true;
975976
case ((BackendDAE.VAR(varKind=BackendDAE.OPT_TGRID()) :: _)) then true;
977+
case ((BackendDAE.VAR(varKind=BackendDAE.OPT_LOOP_INPUT()) :: _)) then true;
976978
case ((_ :: vs)) then hasContinousVar(vs);
977979
case ({}) then false;
978980
end match;
@@ -991,12 +993,21 @@ algorithm
991993
/* Real non discrete variable */
992994
case (BackendDAE.VAR(varKind = kind, varType = DAE.T_REAL(_,_))) equation
993995
kind_lst = {BackendDAE.VARIABLE(), BackendDAE.DUMMY_DER(), BackendDAE.DUMMY_STATE(), BackendDAE.OPT_INPUT_WITH_DER(), BackendDAE.OPT_INPUT_DER()};
994-
then listMember(kind, kind_lst);
996+
then listMember(kind, kind_lst) or isOptLoopInput(kind);
995997

996998
else false;
997999
end match;
9981000
end isVarNonDiscreteAlg;
9991001

1002+
protected function isOptLoopInput
1003+
input BackendDAE.VarKind kind;
1004+
output Boolean b;
1005+
algorithm
1006+
b := match(kind) case(BackendDAE.OPT_LOOP_INPUT()) then true;
1007+
else false;
1008+
end match;
1009+
end isOptLoopInput;
1010+
10001011
public function isVarDiscreteAlg
10011012
input BackendDAE.Var var;
10021013
output Boolean result;

Compiler/BackEnd/DynamicOptimization.mo

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ protected function makeVar "author: Vitalij Ruge"
201201

202202
algorithm
203203
cr := ComponentReference.makeCrefIdent(name, DAE.T_REAL_DEFAULT, {});
204-
v := BackendDAE.VAR(cr, BackendDAE.VARIABLE(), DAE.OUTPUT(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), NONE(), DAE.NON_CONNECTOR(), DAE.NOT_INNER_OUTER());
204+
v := BackendDAE.VAR(cr, BackendDAE.VARIABLE(), DAE.OUTPUT(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), SOME(BackendDAE.AVOID()), NONE(), DAE.NON_CONNECTOR(), DAE.NOT_INNER_OUTER());
205205
end makeVar;
206206

207207
protected function addOptimizationVarsEqns1
@@ -652,13 +652,17 @@ algorithm
652652
// new input(resvar)
653653
(cr,var) := makeVar("OMC$Input" + intString(ind_v));
654654
var := BackendVariable.setVarDirection(var, DAE.INPUT());
655-
var := BackendVariable.mergeAliasVars(var, var_, false, knvars);
656-
oshared := BackendVariable.addKnVarDAE(var, oshared);
657655
// resvar = new input(resvar)
658656
e := Expression.crefExp(cr_var);
659657
if BackendVariable.isStateVar(var_) then
660658
e := Expression.expDer(e);
659+
var := BackendVariable.setVarKind(var, BackendDAE.OPT_LOOP_INPUT(ComponentReference.crefPrefixDer(cr_var)));
660+
else
661+
// don't merge der(x) with x
662+
var := BackendVariable.mergeAliasVars(var, var_, false, knvars);
663+
var := BackendVariable.setVarKind(var, BackendDAE.OPT_LOOP_INPUT(cr_var));
661664
end if;
665+
oshared := BackendVariable.addKnVarDAE(var, oshared);
662666
oeqns := BackendEquation.addEquation(BackendDAE.EQUATION(e, Expression.crefExp(cr), DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_UNKNOWN), oeqns);
663667

664668
end for;

Compiler/SimCode/SerializeModelInfo.mo

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,10 @@ algorithm
766766
equation
767767
File.write(file,"time grid for optimization");
768768
then ();
769+
case BackendDAE.OPT_LOOP_INPUT()
770+
equation
771+
File.write(file,"variable for transform loop in constraint");
772+
then ();
769773
else
770774
equation
771775
Error.addMessage(Error.INTERNAL_ERROR, {"serializeVarKind failed"});

Compiler/SimCode/SimCodeUtil.mo

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10004,6 +10004,11 @@ algorithm
1000410004
case (BackendDAE.VAR(varKind = BackendDAE.EXTOBJ(_), bindExp = SOME(e)))
1000510005
then SOME(e);
1000610006

10007+
case (BackendDAE.VAR(values = dae_var_attr))
10008+
guard(BackendVariable.isVarNonDiscreteAlg(daelowVar))
10009+
then SOME(DAEUtil.getStartAttrFail(dae_var_attr));
10010+
10011+
1000710012
else NONE();
1000810013
end matchcontinue;
1000910014
end getStartValue;

Compiler/Template/CodegenC.tpl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ template simulationFile_opt_header(SimCode simCode, String guid)
518518
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res, short*);
519519
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short *, short *);
520520
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt);
521-
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data);
521+
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data, const modelica_boolean file);
522522
int <%symbolName(modelNamePrefixStr,"getTimeGrid")%>(DATA *data, modelica_integer * nsi, modelica_real**t);
523523
#if defined(__cplusplus)
524524
}
@@ -644,7 +644,7 @@ template simulationFile(SimCode simCode, String guid)
644644
extern int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res, short *);
645645
extern int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short *, short *);
646646
extern int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt);
647-
extern int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data);
647+
extern int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data, const modelica_boolean file);
648648
extern int <%symbolName(modelNamePrefixStr,"getTimeGrid")%>(DATA *data, modelica_integer * nsi, modelica_real**t);
649649
650650
struct OpenModelicaGeneratedFunctionCallbacks <%symbolName(modelNamePrefixStr,"callback")%> = {
@@ -10846,7 +10846,7 @@ template optimizationComponents( list<DAE.ClassAttributes> classAttributes ,SimC
1084610846
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res,short *i){return -1;}
1084710847
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short * i1, short*i2){return -1;}
1084810848
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt){return -1;}
10849-
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data){return -1;}
10849+
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data, const modelica_boolean file){return -1;}
1085010850
int <%symbolName(modelNamePrefixStr,"getTimeGrid")%>(DATA *data, modelica_integer * nsi, modelica_real**t){return -1;}
1085110851
>>
1085210852
else
@@ -10897,6 +10897,12 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
1089710897
match modelInfo
1089810898
case MODELINFO(vars=SIMVARS(__)) then
1089910899
<<
10900+
if(file){
10901+
<%vars.inputVars |> SIMVAR(varKind = OPT_LOOP_INPUT(replaceExp=cr)) hasindex i0 =>
10902+
'<%cref(name)%> = <%cref(cr)%> ;'
10903+
;separator="\n"
10904+
%>
10905+
}
1090010906
<%vars.inputVars |> SIMVAR(__) hasindex i0 =>
1090110907
'data->simulationInfo.inputVars[<%i0%>] = <%cref(name)%>;'
1090210908
;separator="\n"
@@ -10954,7 +10960,7 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
1095410960
return 0;
1095510961
}
1095610962

10957-
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data)
10963+
int <%symbolName(modelNamePrefixStr,"setInputData")%>(DATA *data, const modelica_boolean file)
1095810964
{
1095910965
TRACE_PUSH
1096010966
<%setInput%>

Compiler/Template/SimCodeTV.mo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,9 @@ package BackendDAE
945945
record OPT_INPUT_WITH_DER end OPT_INPUT_WITH_DER;
946946
record OPT_INPUT_DER end OPT_INPUT_DER;
947947
record OPT_TGRID end OPT_TGRID;
948+
record OPT_LOOP_INPUT
949+
DAE.ComponentRef replaceExp;
950+
end OPT_LOOP_INPUT;
948951
end VarKind;
949952

950953
uniontype ZeroCrossing

SimulationRuntime/c/openmodelica_func.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ int (*pickUpBoundsForInputsInOptimization)(DATA* data, modelica_real* min, model
276276
* and set simulationInfo.inputVars. In case it's not present
277277
* a dummy function is added which return -1.
278278
*/
279-
int (*setInputData)(DATA* data);
279+
int (*setInputData)(DATA* data, const modelica_boolean file);
280280

281281

282282
/*

SimulationRuntime/c/optimization/DataManagement/InitialGuess.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444

4545
static int initial_guess_ipopt_cflag(OptData *optData, char* cflags);
4646
static inline void smallIntSolverStep(DATA* data, SOLVER_INFO* solverInfo, const double tstop);
47-
static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solverInfo, const short o);
48-
static inline void init_ipopt_data(OptData *optData);
47+
static short initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solverInfo, const short o);
48+
static inline void init_ipopt_data(OptData *optData, const short o);
4949

5050
/*!
5151
* create initial guess
@@ -74,17 +74,17 @@ inline void initial_guess_optimizer(OptData *optData, SOLVER_INFO* solverInfo){
7474
}
7575

7676
if(opt > 0)
77-
initial_guess_ipopt_sim(optData, solverInfo, opt);
77+
opt = initial_guess_ipopt_sim(optData, solverInfo, opt);
7878

79-
init_ipopt_data(optData);
79+
init_ipopt_data(optData, opt);
8080
}
8181

8282

8383
/*!
8484
* create initial guess dasslColorSymJac
8585
* author: Vitalij Ruge
8686
**/
87-
static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solverInfo, const short o)
87+
static short initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solverInfo, const short o)
8888
{
8989
double *u0;
9090
int i,j,k,l;
@@ -227,6 +227,7 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver
227227
data->simulationInfo.tolerance = tol;
228228

229229
externalInputFree(data);
230+
return op;
230231
}
231232

232233

@@ -272,7 +273,7 @@ static int initial_guess_ipopt_cflag(OptData *optData, char* cflags)
272273
* init ipopt data struct
273274
* author: Vitalij Ruge
274275
**/
275-
static inline void init_ipopt_data(OptData *optData){
276+
static inline void init_ipopt_data(OptData *optData, const short op){
276277
OptDataIpopt* ipop = &optData->ipop;
277278
DATA * data = optData->data;
278279
const int NV = optData->dim.NV;
@@ -301,7 +302,7 @@ static inline void init_ipopt_data(OptData *optData){
301302
for(i = 0, shift = 0; i < nsi; ++i){
302303
for(j = 0; j < np; ++j, shift+=nv){
303304
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
304-
optData->data->callback->setInputData(optData->data);
305+
optData->data->callback->setInputData(optData->data, op == 2);
305306
for(l = 0; l<nx; ++l){
306307
ipop->vopt[l + shift] = optData->v[i][j][l]*optData->bounds.scalF[l];
307308
}

0 commit comments

Comments
 (0)