Skip to content

Commit

Permalink
improved time grid in dyn. optimization
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@24933 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Mar 5, 2015
1 parent 76f0fa7 commit de54b76
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 28 deletions.
21 changes: 9 additions & 12 deletions SimulationRuntime/c/optimization/DataManagement/MoveData.c
Expand Up @@ -173,6 +173,7 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data,
time->t0 = (long double)fmax(data->simulationInfo.startTime, preSimTime);
time->tf = (long double)data->simulationInfo.stopTime;

time->dt = (long double*) malloc((nsi+1)*sizeof(long double));
time->dt[0] = (time->tf - time->t0)/nsi;

time->t = (long double**)malloc(nsi*sizeof(long double*));
Expand All @@ -199,18 +200,18 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data,
time->t[0][k] = time->t0 + dc[k];
}

for(i = 1; i < nsi; ++i)
for(i = 1; i < nsi; ++i){
time->dt[i] = time->dt[i-1];
for(k = 0; k < np; ++k)
time->t[i][k] = time->t[i-1][np1] + dc[k];

}
time->t[nsi-1][np1] = time->tf;

if(nsi > 1){
i = nsi - 1;
time->dt[1] = time->t[i][np1] - time->t[i-1][np1];
time->dt[nsi-1] = time->t[i][np1] - time->t[i-1][np1];
for(k = 0; k < np; ++k)
time->t[i][k] = time->t[i-1][np1] + c[k]*time->dt[1];

time->t[i][k] = time->t[i-1][np1] + c[k]*time->dt[nsi-1];
}else
time->dt[1] = time->dt[0];
}
Expand Down Expand Up @@ -331,20 +332,16 @@ static inline void calculatedScalingHelper(OptDataBounds * bounds, OptDataTime *
for(i = 0; i < nsi; ++i)
bounds->scaldt[i] = (long double*) malloc(nx*sizeof(long double));

for(i = 0; i+1 < nsi; ++i)
for(i = 0; i < nsi; ++i)
for(j = 0; j < nx; ++j){
bounds->scaldt[i][j] = bounds->scalF[j]*time->dt[0];
bounds->scaldt[i][j] = bounds->scalF[j]*time->dt[i];
}
for(j = 0; j < nx; ++j){
bounds->scaldt[i][j] = bounds->scalF[j]*time->dt[1];
}

bounds->scalb = (long double**)malloc(nsi*sizeof(long double*));
for(i = 0; i < nsi; ++i){
bounds->scalb[i] = (long double*)malloc(np*sizeof(long double));
l = (i + 1 < nsi ) ? 0 : 1;
for(j = 0; j < np; ++j){
bounds->scalb[i][j] = time->dt[l]*rk->b[j];
bounds->scalb[i][j] = time->dt[i]*rk->b[j];
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/optimization/OptimizerData.h
Expand Up @@ -86,7 +86,7 @@ typedef struct OptDataDim{
typedef struct OptDataTime{
long double t0;
long double tf;
long double dt[2];
long double *dt;

long double **t;
}OptDataTime;
Expand Down
21 changes: 6 additions & 15 deletions SimulationRuntime/c/optimization/eval_all/EvalF.c
Expand Up @@ -60,30 +60,21 @@ Bool evalfF(Index n, Number * vopt, Bool new_x, Number *objValue, void * useData
const long double * const dt = optData->time.dt;

modelica_real *** v = optData->v;
long double erg = 0.0;
long double erg1 = 0.0;
long double erg0[np];
long double erg[np];
int i,j;

for(j = 0; j< np; ++j){
erg0[j] = v[0][j][il];
erg[j] = dt[0]*v[0][j][il];
}

for(i = 1; i + 1 < nsi; ++i){
for(i = 1; i < nsi; ++i){
for(j = 0; j< np; ++j){
erg0[j] += v[i][j][il];
erg[j] += dt[i]*v[i][j][il];
}
}

for(j = 0; j< np; ++j){
erg += b[j]*erg0[j];
}

i = nsi - 1;
for(j = 0; j < np; ++j)
erg1 += b[j]*v[i][j][il];

lagrange = (erg*dt[0] + erg1*dt[1]);
for(j = 0; j< np; ++j)
lagrange += b[j]*erg[j];
}

if(ma){
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/optimization/optimizer_main.c
Expand Up @@ -232,6 +232,7 @@ static inline void freeOptimizerData(OptData*optData){
for(i=0; i < nsi; ++i)
free(optData->time.t[i]);
free(optData->time.t);
free(optData->time.dt);
/*************************/
free(optData->bounds.vmin);
free(optData->bounds.vmax);
Expand Down

0 comments on commit de54b76

Please sign in to comment.