Skip to content

Commit 81ab0f3

Browse files
author
Vitalij Ruge
committed
- improve code for optimization based on static analyse
thanks Martin git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19808 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 2b3a32a commit 81ab0f3

File tree

4 files changed

+36
-38
lines changed

4 files changed

+36
-38
lines changed

SimulationRuntime/c/optimization/constraints/evalfG.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,19 +162,20 @@ int functionODE_(double * x, double *u, double t, double * dotx, IPOPT_DATA_ *iD
162162
int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, double **J)
163163
{
164164
int i, j;
165-
double *x, *u;
165+
166166
int nJ = (int)iData->nJ;
167-
x = v;
168-
u = v + iData->nx;
169167

170-
if(iData->useNumJac>0){
171168

169+
if(iData->useNumJac>0){
172170
num_diff_symColoredODE(v,t,iData,J);
173171
for(i = 0;i<iData->nv;++i)
174172
for(j = 0; j <iData->nx; ++j)
175173
iData->numJ[j][i] *= iData->scalf[j];
176-
177174
}else{
175+
double *x, *u;
176+
x = v;
177+
u = v + iData->nx;
178+
178179
refreshSimData(x,u,t,iData);
179180
diff_symColoredODE(v,t,iData,J);
180181
for(i = 0;i<iData->nv;++i){
@@ -209,7 +210,7 @@ int num_diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
209210
DATA * data = iData->data;
210211
const int index = 2;
211212
double*x,*u;
212-
SIMULATION_DATA *sData = (SIMULATION_DATA*)iData->data->localData[0];
213+
/*SIMULATION_DATA *sData = (SIMULATION_DATA*)iData->data->localData[0];*/
213214
int i,j,l,ii,nx;
214215
int *cC,*lindex;
215216

@@ -282,7 +283,7 @@ int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
282283
int *cC,*lindex;
283284

284285
x = v;
285-
u = x + iData->nx;
286+
/*u = x + iData->nx;*/
286287

287288
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
288289
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
@@ -416,6 +417,7 @@ static int printMaxError(IPOPT_DATA_ *iData, double *g,double t, double * max_er
416417
double tmp;
417418
int j;
418419

420+
tmp = -1;
419421
for(j = 0; j<(int)iData->nx; ++j){
420422
tmp = fabs(g[j]);
421423
//printf("\n time %g vs. %g | %g vs. %g",t,*tt,tmp,*max_err);
@@ -428,7 +430,7 @@ static int printMaxError(IPOPT_DATA_ *iData, double *g,double t, double * max_er
428430

429431
for(; j<(int)iData->nJ; ++j){
430432
if((double)g[j]> (double)*max_err){
431-
*max_err = tmp;
433+
*max_err = g[j];
432434
*tt = t;
433435
*xi = j;
434436
}

SimulationRuntime/c/optimization/goal/evalF.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,8 @@ int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
216216
int i,j,l,ii,nx;
217217
int *cC,*lindex;
218218

219-
/*ToDo*/
220219
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
221220

222-
223221
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
224222
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
225223

@@ -270,21 +268,21 @@ int num_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
270268
{
271269
DATA * data = iData->data;
272270
const int index = 2;
273-
double*x,*u;
271+
double*x/*,*u*/;
274272
SIMULATION_DATA *sData = (SIMULATION_DATA*)iData->data->localData[0];
275273
int i,j,l,ii,nx,k;
276-
int *cC,*lindex;
274+
/*int *cC,*lindex;*/
277275
double lhs, rhs;
278276
double *v;
279277
double t = (double)sData->timeValue;
280278

281279
v = iData->cv;
282280
x = v;
283-
u = x + iData->nx;
281+
/*u = x + iData->nx;*/
284282

285283
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
286-
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
287-
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
284+
/*cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
285+
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;*/
288286
memcpy(iData->vsave, v, sizeof(double)*iData->nv);
289287

290288
for(ii = 0; ii<nx; ++ii){

SimulationRuntime/c/optimization/initialOptimizer/initial_guess.c

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ static int initial_guess_ipopt_cflag(IPOPT_DATA_ *iData,char* cflags)
101101
**/
102102
static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
103103
{
104-
double *u0, *x, uu,tmp ,lhs, rhs;
104+
double *u0, /*x,*/ uu,tmp ,lhs, rhs;
105105
int i,j,k,ii,jj,id;
106106
double *v;
107107
long double tol;
@@ -126,7 +126,7 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
126126
solverInfo->solverData = dasslData;
127127

128128
u0 = iData->start_u;
129-
x = data->localData[0]->realVars;
129+
/*x = data->localData[0]->realVars;*/
130130
v = iData->v;
131131

132132
for(ii=iData->nx,j=0; j < iData->nu; ++j, ++ii){
@@ -244,33 +244,31 @@ static int optimizer_time_setings_update(IPOPT_DATA_ *iData)
244244
int i,k,id;
245245
double t;
246246

247+
assert(iData->nsi > 0);
248+
247249
iData->time[0] = iData->t0;
248250
t = iData->t0;
249251
iData->dt_default = (iData->tf - iData->t0)/(iData->nsi);
250-
for(i=0;i<iData->nsi; ++i){
252+
253+
t = iData->nsi*iData->dt_default;
254+
255+
for(i=0;i<iData->nsi; ++i)
251256
iData->dt[i] = iData->dt_default;
252-
t = iData->t0 + (i+1)*iData->dt_default;
257+
258+
iData->dt[iData->nsi-1] = iData->dt_default + (iData->tf - t);
259+
260+
for(i = 0, k=0, id=0; i<iData->nsi; ++i,id += iData->deg){
261+
iData->time[++k] = iData->time[id] + iData->e1*iData->dt[i];
262+
iData->time[++k] = iData->time[id] + iData->e2*iData->dt[i];
263+
iData->time[++k] = iData->time[0]+ (i+1)*iData->dt[i];
253264
}
254265

255-
iData->dt[iData->nsi-1] = iData->dt_default + (iData->tf - t );
256-
257-
if(iData->deg == 3){
258-
for(i = 0,k=0,id=0; i<iData->nsi; ++i,id += iData->deg){
259-
if(i){
260-
if(iData->deg == 3){
261-
iData->time[++k] = iData->time[id] + iData->c1*iData->dt[i];
262-
iData->time[++k] = iData->time[id] + iData->c2*iData->dt[i];
263-
}
264-
iData->time[++k] = iData->time[0]+ (i+1)*iData->dt[i];
265-
}else{
266-
if(iData->deg == 3){
267-
iData->time[++k] = iData->time[id] + iData->e1*iData->dt[i];
268-
iData->time[++k] = iData->time[id] + iData->e2*iData->dt[i];
269-
}
266+
for(; i<iData->nsi; ++i,id += iData->deg){
267+
iData->time[++k] = iData->time[id] + iData->c1*iData->dt[i];
268+
iData->time[++k] = iData->time[id] + iData->c2*iData->dt[i];
270269
iData->time[++k] = iData->time[0]+ (i+1)*iData->dt[i];
271-
}
272-
}
273270
}
271+
274272
iData->time[k] = iData->tf;
275273
return 0;
276274
}

SimulationRuntime/c/optimization/mainOptimizer/ipoptODE.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ int refreshSimData(double *x, double *u, double t, IPOPT_DATA_ *iData)
124124
DATA* data = iData->data;
125125

126126
SIMULATION_DATA *sData = (SIMULATION_DATA*)data->localData[0];
127-
MODEL_DATA *mData = &(data->modelData);
128-
SIMULATION_INFO *sInfo = &(data->simulationInfo);
127+
/*MODEL_DATA *mData = &(data->modelData);
128+
SIMULATION_INFO *sInfo = &(data->simulationInfo);*/
129129
for(j = 0; j<iData->nx;++j){
130130
sData->realVars[j] = x[j]*iData->vnom[j];
131131
}

0 commit comments

Comments
 (0)