Skip to content

Commit a62d144

Browse files
author
Vitalij Ruge
committed
fixed pre-sim for optimization
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21489 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 9ca15af commit a62d144

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

SimulationRuntime/c/optimization/DataManagement/InitialGuess.c

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343

4444
static int initial_guess_ipopt_cflag(OptData *optData, char* cflags);
45-
static inline void smallIntSolverStep(DATA* data, SOLVER_INFO* solverInfo, double tstop);
45+
static inline void smallIntSolverStep(DATA* data, SOLVER_INFO* solverInfo, const double tstop);
4646
static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solverInfo);
4747
static inline void init_ipopt_data(OptData *optData);
4848

@@ -55,6 +55,16 @@ inline void initial_guess_optimizer(OptData *optData, SOLVER_INFO* solverInfo){
5555
char *cflags;
5656
int opt = 1;
5757
int i, j;
58+
char buffer[4096];
59+
const int nu = optData->dim.nu;
60+
61+
optData->pFile = fopen("optimizeInput.csv", "wt");
62+
fprintf(optData->pFile, "%s ", "time");
63+
for(i=0; i < nu; ++i){
64+
sprintf(buffer, "%s", optData->dim.inputName[i]);
65+
fprintf(optData->pFile, "%s ", buffer);
66+
}
67+
fprintf(optData->pFile, "%s", "\n");
5868

5969
cflags = (char*)omc_flagValue[FLAG_IPOPT_INIT];
6070

@@ -87,7 +97,6 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver
8797
const int nsi = optData->dim.nsi;
8898
const int nReal = optData->dim.nReal;
8999

90-
91100
DATA* data = optData->data;
92101
SIMULATION_INFO *sInfo = &(data->simulationInfo);
93102

@@ -116,6 +125,39 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver
116125

117126
printGuess = (short)(ACTIVE_STREAM(LOG_INIT) && !ACTIVE_STREAM(LOG_SOLVER));
118127

128+
if((double)data->simulationInfo.startTime < optData->time.t0){
129+
double t = data->simulationInfo.startTime;
130+
FILE * pFile = optData->pFile;
131+
fprintf(pFile, "%lf ",(double)t);
132+
for(i = 0; i < nu; ++i){
133+
fprintf(pFile, "%lf ", (float)data->simulationInfo.inputVars[i]);
134+
}
135+
fprintf(pFile, "%s", "\n");
136+
if(1){
137+
printf("\nPreSim");
138+
printf("\n========================================================\n");
139+
printf("\ndone: time[%i] = %g",0,(double)data->simulationInfo.startTime);
140+
}
141+
while(t < optData->time.t0){
142+
externalInputUpdate(data);
143+
smallIntSolverStep(data, solverInfo, fmin(t += optData->time.dt[0], optData->time.t0));
144+
printf("\ndone: time[%i] = %g",0,(double)solverInfo->currentTime);
145+
sim_result.emit(&sim_result,data);
146+
fprintf(pFile, "%lf ",(double)t);
147+
for(i = 0; i < nu; ++i){
148+
fprintf(pFile, "%lf ", (float)data->simulationInfo.inputVars[i]);
149+
}
150+
fprintf(pFile, "%s", "\n");
151+
}
152+
memcpy(optData->v0, data->localData[1]->realVars, nReal*sizeof(modelica_real));
153+
if(1){
154+
printf("\n--------------------------------------------------------");
155+
printf("\nfinished: PreSim");
156+
printf("\n========================================================\n");
157+
}
158+
}
159+
160+
119161
if(printGuess){
120162
printf("\nInitial Guess");
121163
printf("\n========================================================\n");
@@ -254,7 +296,7 @@ static inline void init_ipopt_data(OptData *optData){
254296

255297
}
256298

257-
static inline void smallIntSolverStep(DATA* data, SOLVER_INFO* solverInfo, double tstop){
299+
static inline void smallIntSolverStep(DATA* data, SOLVER_INFO* solverInfo, const double tstop){
258300
long double a;
259301
int iter;
260302
int err;

SimulationRuntime/c/optimization/DataManagement/MoveData.c

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#include "../../simulation/options.h"
3838

3939
static inline void pickUpDim(OptDataDim * dim, DATA* data);
40-
static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data);
40+
static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data, const double preSimTime);
4141
static inline void pickUpBounds(OptDataBounds * bounds, OptDataDim * dim, DATA* data);
4242
static inline void check_nominal(OptDataBounds * bounds, const double min, const double max,
4343
const double nominal, const modelica_boolean set, const int i, const double x0);
@@ -57,8 +57,8 @@ int pickUpModelData(DATA* data, SOLVER_INFO* solverInfo)
5757
OptDataDim *dim;
5858

5959
pickUpDim(&optData->dim, data);
60-
pickUpTime(&optData->time, &optData->dim, data);
6160
pickUpBounds(&optData->bounds, &optData->dim, data);
61+
pickUpTime(&optData->time, &optData->dim, data, optData->bounds.preSim);
6262
setRKCoeff(&optData->rk, optData->dim.np);
6363
calculatedScalingHelper(&optData->bounds,&optData->time, &optData->dim, &optData->rk);
6464
messageClose(LOG_SOLVER);
@@ -119,7 +119,7 @@ static inline void pickUpDim(OptDataDim * dim, DATA* data){
119119
/* pick up information(startTime, stopTime, dt) from model data to optimizer struct
120120
* author: Vitalij Ruge
121121
*/
122-
static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data){
122+
static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data, const double preSimTime){
123123
const int nsi = dim->nsi;
124124
const int np = dim->np;
125125
const int np1 = np - 1;
@@ -128,7 +128,7 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data){
128128
int i, k;
129129
double t;
130130

131-
time->t0 = (long double)data->simulationInfo.startTime;
131+
time->t0 = (long double)fmax(data->simulationInfo.startTime, preSimTime);
132132
time->tf = (long double)data->simulationInfo.stopTime;
133133

134134
time->dt[0] = (time->tf - time->t0)/nsi;
@@ -178,7 +178,7 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data){
178178
*/
179179
static inline void pickUpBounds(OptDataBounds * bounds, OptDataDim * dim, DATA* data){
180180
char ** inputName;
181-
double min, max, nominal, x0, tmpOptTime;
181+
double min, max, nominal, x0;
182182
double *umin, *umax, *unom;
183183
modelica_boolean nominalWasSet;
184184
modelica_boolean * nominalWasSetInput;
@@ -209,7 +209,7 @@ static inline void pickUpBounds(OptDataBounds * bounds, OptDataDim * dim, DATA*
209209
umax = bounds->vmax + nx;
210210
unom = bounds->vnom + nx;
211211

212-
data->callback->pickUpBoundsForInputsInOptimization(data,umin, umax, unom, nominalWasSetInput, inputName, bounds->u0, &tmpOptTime);
212+
data->callback->pickUpBoundsForInputsInOptimization(data,umin, umax, unom, nominalWasSetInput, inputName, bounds->u0, &bounds->preSim);
213213

214214
for(i = 0; i < nx; ++i){
215215
min = data->modelData.realVarsData[i].attribute.min;
@@ -435,7 +435,7 @@ void res2file(OptData *optData, SOLVER_INFO* solverInfo, double *vopt){
435435
DATA * data = optData->data;
436436
SIMULATION_DATA *sData = (SIMULATION_DATA*)data->localData[0];
437437

438-
FILE * pFile;
438+
FILE * pFile = optData->pFile;
439439
double * v0 = optData->v0;
440440
double *vnom = optData->bounds.vnom;
441441
long double **t = optData->time.t;
@@ -456,14 +456,6 @@ void res2file(OptData *optData, SOLVER_INFO* solverInfo, double *vopt){
456456
optData2ModelData(optData, vopt, 0);
457457

458458
/******************/
459-
pFile = fopen("optimizeInput.csv", "wt");
460-
fprintf(pFile, "%s ", "time");
461-
for(i=0; i < nu; ++i){
462-
sprintf(buffer, "%s", optData->dim.inputName[i]);
463-
fprintf(pFile, "%s ", buffer);
464-
}
465-
fprintf(pFile, "%s", "\n");
466-
467459
fprintf(pFile, "%lf ",(double)t0);
468460

469461
for(i=0,j = nx; i < nu; ++i,++j){

SimulationRuntime/c/optimization/OptimizerData.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ typedef struct OptDataBounds{
9696
long double **scalb;
9797

9898
modelica_real *u0;
99+
double preSim;
99100
}OptDataBounds;
100101

101102
typedef struct OptDataRK{
@@ -154,6 +155,7 @@ typedef struct OptData{
154155
long double **Hl;
155156
long double **Hm;
156157
DATA *data;
158+
FILE * pFile;
157159

158160
double *oldH;
159161

0 commit comments

Comments
 (0)