Skip to content

Commit

Permalink
- added pre simulation for optimization
Browse files Browse the repository at this point in the history
 - using startTime from Optimica


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19294 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Feb 25, 2014
1 parent 4b58181 commit 7021281
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 18 deletions.
22 changes: 15 additions & 7 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -468,7 +468,7 @@ template simulationFile_opt_header(SimCode simCode, String guid)
#endif
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real* res);
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real* res);
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start);
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);
#if defined(_MSC_VER)
}
#endif
Expand Down Expand Up @@ -572,7 +572,7 @@ template simulationFile(SimCode simCode, String guid)
extern const char* <%symbolName(modelNamePrefixStr,"linear_model_frame")%>(void);
extern int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real* res);
extern int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real* res);
extern int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start);
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);
struct OpenModelicaGeneratedFunctionCallbacks <%symbolName(modelNamePrefixStr,"callback")%> = {
(int (*)(DATA *, void *)) <%symbolName(modelNamePrefixStr,"performSimulation")%>,
Expand Down Expand Up @@ -10707,7 +10707,7 @@ template optimizationComponents( list<DAE.ClassAttributes> classAttributes ,SimC
<<
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real* res){return -1;}
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real* res){return -1;}
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start){return -1;}
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;}
>>
else
(classAttributes |> classAttribute => optimizationComponents1(classAttribute,simCode, modelNamePrefixStr); separator="\n")
Expand All @@ -10729,7 +10729,13 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
*res = $P$TMP_mayerTerm;
return 0;
>>

let startTimeOpt = match startTimeE
case SOME(exp) then
let startTimeOptExp = daeExp(exp, contextOther, &preExp, &varDecls)
<<
*startTimeOpt = <%startTimeOptExp%>;
>>

let objectiveIntegrand = match objectiveIntegrandE case SOME(exp) then
<<
*res = $P$TMP_lagrangeTerm;
Expand Down Expand Up @@ -10764,10 +10770,12 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
return -1;
}

/* constraints */
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start)
/* opt vars */
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)
{
<%inputBounds%>
<%inputBounds%>
*startTimeOpt = data->simulationInfo.startTime - 1.0;
<%startTimeOpt%>
return 0;
}
>>
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/openmodelica_func.h
Expand Up @@ -274,7 +274,7 @@ int (*lagrange)(DATA* data, modelica_real* res);
* and pick up the bounds of inputs. In case it's not present
* a dummy function is added which return -1.
*/
int (*pickUpBoundsForInputsInOptimization)(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start);
int (*pickUpBoundsForInputsInOptimization)(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt);


};
Expand Down
Expand Up @@ -325,8 +325,8 @@ int loadDAEmodel(DATA *data, IPOPT_DATA_ *iData)
/***********************/
allocateIpoptData(iData);
move_grid(iData);
//optimizer_time_setings(iData);
optimizer_coeff_setings(iData);

/***********************/
local_diffObject_struct(iData);
set_local_jac_struct(iData, &id, &nH);
Expand Down Expand Up @@ -720,9 +720,8 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
iData->xmin[i] = data->modelData.realVarsData[i].attribute.min*iData->scalVar[i];
iData->xmax[i] = data->modelData.realVarsData[i].attribute.max*iData->scalVar[i];
}

iData->data->callback->pickUpBoundsForInputsInOptimization(data,iData->umin, iData->umax, &iData->vnom[iData->nx], tmp, tmpname, start);

iData->data->callback->pickUpBoundsForInputsInOptimization(data,iData->umin, iData->umax, &iData->vnom[iData->nx], tmp, tmpname, start, &iData->startTimeOpt);
iData->preSim = (iData->t0 < (iData->startTimeOpt));
if(ACTIVE_STREAM(LOG_IPOPT)){
char buffer[200];
printf("Optimizer Variables");
Expand Down
103 changes: 97 additions & 6 deletions SimulationRuntime/c/optimization/initialOptimizer/initial_guess.c
Expand Up @@ -41,11 +41,14 @@
#include "../ipoptODEstruct.h"
#include "../simulation/solver/dassl.h"
#include "../../simulation/options.h"
#include "../../simulation/results/simulation_result.h"

#ifdef WITH_IPOPT

static int initial_guess_ipopt_cflag(IPOPT_DATA_ *iData,char* cflags);
static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo);
static int pre_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo);
static int optimizer_time_setings_update(IPOPT_DATA_ *iData);

/*!
* create initial guess
Expand Down Expand Up @@ -137,6 +140,11 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
data->simulationInfo.inputVars[i] = u0[i];
else
externalInputUpdate(data);
if(iData->preSim){
printf("\npre simulation");
pre_ipopt_sim(iData, solverInfo);
printf("\npre simulation done!!!");
}

printGuess = (short)(ACTIVE_STREAM(LOG_INIT) && !ACTIVE_STREAM(LOG_SOLVER));
if(printGuess){
Expand All @@ -153,7 +161,7 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
dasrt_step(data, solverInfo);

if(printGuess)
printf("\n #####done time[%i] = %f",k,iData->time[k]);
printf("\n #####done time[%i] = %f", k, iData->time[k]);

for(j=0; j< iData->nx; ++j)
v[j] = sData->realVars[j] * iData->scalVar[j];
Expand All @@ -171,11 +179,11 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
if(id >=iData->nv)
id = 0;

if(id <iData->nx){
iData->v[i] =fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}else if(id< iData->nv){
iData->v[i] = fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}
if(id <iData->nx){
iData->v[i] =fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}else if(id< iData->nv){
iData->v[i] = fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}
}

if(printGuess)
Expand All @@ -192,4 +200,87 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
return 0;
}

static int pre_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
{
int k = 1,i,j;
DATA * data = iData->data;

if(iData->time[k] > iData->startTimeOpt)
iData->time[k] = iData->startTimeOpt;

while(iData->data->localData[0]->timeValue < iData->startTimeOpt){
solverInfo->currentStepSize = iData->time[k] - iData->time[k-1];
iData->data->localData[1]->timeValue = iData->time[k];
externalInputUpdate(data);
dasrt_step(data, solverInfo);
data->simulationInfo.terminal = 1;
sim_result.emit(&sim_result,data);
data->simulationInfo.terminal = 0;
rotateRingBuffer(iData->data->simulationData, 1, (void**) iData->data->localData);
++k;
}
if(iData->data->localData[0]->timeValue > iData->startTimeOpt){
solverInfo->currentStepSize = iData->startTimeOpt - iData->time[k-1];
iData->data->localData[1]->timeValue = iData->time[k];
externalInputUpdate(data);
dasrt_step(data, solverInfo);
data->simulationInfo.terminal = 1;
sim_result.emit(&sim_result,data);
data->simulationInfo.terminal = 0;
rotateRingBuffer(iData->data->simulationData, 1, (void**) iData->data->localData);
}
iData->t0 = iData->data->localData[0]->timeValue;
printf("time = %g | %g", iData->t0,iData->startTimeOpt );
/*ToDo*/
for(i=0; i< iData->nx; ++i)
{
iData->Vmin[i] = (*iData).Vmax[i] = iData->data->localData[1]->realVars[i]*iData->scalVar[i];
iData->v[i] = iData->Vmin[i];
}
for(j=0; i< iData->nv; ++i,++j){
iData->Vmin[i] = iData->Vmax[i] = data->simulationInfo.inputVars[j]*iData->scalVar[i];
iData->v[i] = iData->Vmin[i];
}

optimizer_time_setings_update(iData);
return 0;
}

static int optimizer_time_setings_update(IPOPT_DATA_ *iData)
{
int i,k,id;
double t;

iData->time[0] = iData->t0;
t = iData->t0;
iData->dt_default = (iData->tf - iData->t0)/(iData->nsi);
for(i=0;i<iData->nsi; ++i){
iData->dt[i] = iData->dt_default;
t = iData->t0 + (i+1)*iData->dt_default;
}

iData->dt[iData->nsi-1] = iData->dt_default + (iData->tf - t );

if(iData->deg == 3){
for(i = 0,k=0,id=0; i<iData->nsi; ++i,id += iData->deg){
if(i){
if(iData->deg == 3){
iData->time[++k] = iData->time[id] + iData->c1*iData->dt[i];
iData->time[++k] = iData->time[id] + iData->c2*iData->dt[i];
}
iData->time[++k] = iData->time[0]+ (i+1)*iData->dt[i];
}else{
if(iData->deg == 3){
iData->time[++k] = iData->time[id] + iData->e1*iData->dt[i];
iData->time[++k] = iData->time[id] + iData->e2*iData->dt[i];
}
iData->time[++k] = iData->time[0]+ (i+1)*iData->dt[i];
}
}
}
iData->time[k] = iData->tf;
return 0;
}


#endif
3 changes: 3 additions & 0 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -91,6 +91,7 @@ typedef struct IPOPT_DATA_
/*time*/
double t0;
double tf;
modelica_real startTimeOpt;
/* double dt; */
double t;
double dt_min;
Expand Down Expand Up @@ -153,6 +154,7 @@ typedef struct IPOPT_DATA_
long int njac;
long int nhess;
long int nsi;
long int nsi_old;
long int np;
int nlocalJac;

Expand Down Expand Up @@ -202,6 +204,7 @@ typedef struct IPOPT_DATA_
double *vsave;
double *eps;

modelica_boolean preSim;
/*Debuger*/
FILE **pFile;
long index_debug_iter;
Expand Down

0 comments on commit 7021281

Please sign in to comment.