Skip to content

Commit 449b40c

Browse files
author
Vitalij Ruge
committed
- improve evaluation jacobian,gradient in optimization
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@20027 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 20e2c3d commit 449b40c

File tree

3 files changed

+29
-49
lines changed

3 files changed

+29
-49
lines changed

SimulationRuntime/c/optimization/constraints/evalfDiffG.c

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static int radauJac1(long double *a, long double *J, long double dt, double * v
181181
/*1*/
182182
for(l=0; l<nv; ++l){
183183
if(iData->sopt.knowedJ[j][l]){
184-
values[(*k)++] = (j == l) ? dt*J[l]-a[1] : dt*J[l];
184+
values[(*k)++] = (j == l) ? dt*J[l] - a[1] : dt*J[l];
185185
}
186186
}
187187

@@ -201,19 +201,15 @@ static int lobattoJac1(long double *a, long double *J, long double *J0, long do
201201
{
202202
int l;
203203
/*0*/
204-
for(l = 0; l< nv; ++l){
205-
if(j == l) {
206-
values[(*k)++] = tmp*J0[l] + a[0];
207-
} else if(iData->sopt.knowedJ[j][l]) {
208-
values[(*k)++] = tmp*J0[l];
209-
}
210-
}
204+
for(l = 0; l< nv; ++l)
205+
if(iData->sopt.knowedJ[j][l])
206+
values[(*k)++] = (j == l) ? tmp*J0[l] + a[0] : tmp*J0[l];
207+
211208
/*1*/
212-
for(l = 0; l< nv; ++l){
213-
if(iData->sopt.knowedJ[j][l]){
209+
for(l = 0; l< nv; ++l)
210+
if(iData->sopt.knowedJ[j][l])
214211
values[(*k)++] = ((j == l)? dt*J[l] - a[1] : dt*J[l]);
215-
}
216-
}
212+
217213
/*2*/
218214
values[(*k)++] = -a[2];
219215

@@ -256,22 +252,17 @@ static int lobattoJac2(long double *a, long double *J, long double *J0, long do
256252
{
257253
int l;
258254
/*0*/
259-
for(l = 0; l< nv; ++l){
260-
if( j==l){
261-
values[(*k)++] = -(tmp*J0[l] + a[0]);
262-
} else if(iData->sopt.knowedJ[j][l]) {
263-
values[(*k)++] = -tmp*J0[l];
264-
}
265-
}
255+
for(l = 0; l< nv; ++l)
256+
if(iData->sopt.knowedJ[j][l])
257+
values[(*k)++] = ( j==l)? -(tmp*J0[l] + a[0]) : -tmp*J0[l];
266258
/*1*/
267259
values[(*k)++] = a[1];
268260

269261
/*2*/
270-
for(l = 0; l< nv; ++l){
271-
if(iData->sopt.knowedJ[j][l]){
262+
for(l = 0; l< nv; ++l)
263+
if(iData->sopt.knowedJ[j][l])
272264
values[(*k)++] = ((j == l)? dt*J[l]-a[2] : dt*J[l]);
273-
}
274-
}
265+
275266
/*3*/
276267
values[(*k)++] = -a[3];
277268
return 0;
@@ -291,11 +282,10 @@ static int radauJac3(long double *a, long double *J, long double dt, double * v
291282
/*2*/
292283
values[(*k)++] = a[2];
293284
/*3*/
294-
for(l = 0; l< nv; ++l){
295-
if(iData->sopt.knowedJ[j][l]){
285+
for(l = 0; l< nv; ++l)
286+
if(iData->sopt.knowedJ[j][l])
296287
values[(*k)++] = ((j == l)? dt*J[l] - a[3] : dt*J[l]);
297-
}
298-
}
288+
299289
return 0;
300290
}
301291

@@ -307,23 +297,19 @@ static int lobattoJac3(long double *a, long double *J, long double *J0, long do
307297
{
308298
int l;
309299
/*0*/
310-
for(l=0; l<nv; ++l){
311-
if(j==l){
312-
values[(*k)++] = tmp*J0[l] + a[0];
313-
}else if(iData->sopt.knowedJ[j][l]) {
314-
values[(*k)++] = tmp*J0[l];
315-
}
316-
}
300+
for(l=0; l<nv; ++l)
301+
if(iData->sopt.knowedJ[j][l])
302+
values[(*k)++] = (j==l) ? tmp*J0[l] + a[0]: tmp*J0[l];
303+
317304
/*1*/
318305
values[(*k)++] = -a[1];
319306
/*2*/
320307
values[(*k)++] = a[2];
321308
/*3*/
322-
for(l=0; l<nv; ++l){
323-
if(iData->sopt.knowedJ[j][l]){
309+
for(l=0; l<nv; ++l)
310+
if(iData->sopt.knowedJ[j][l])
324311
values[(*k)++] = ((j == l)? dt*J[l] - a[3] : dt*J[l]);
325-
}
326-
}
312+
327313
return 0;
328314
}
329315

SimulationRuntime/c/optimization/goal/evalF.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Bool evalfF(Index n, double * v, Bool new_x, Number *objValue, void * useData)
5151
{
5252
IPOPT_DATA_ *iData = (IPOPT_DATA_*) useData;
5353
double mayer = 0.0;
54-
double lagrange = 0.0;
54+
long double lagrange = 0.0;
5555
OPTIMIZER_MBASE *mbase = &iData->mbase;
5656

5757
if(iData->sopt.mayer){
@@ -89,10 +89,10 @@ Bool evalfF(Index n, double * v, Bool new_x, Number *objValue, void * useData)
8989
erg_ += erg*iData->dtime.dt[i];
9090
}
9191

92-
lagrange = (double) erg_;
92+
lagrange = erg_;
9393
}
9494

95-
*objValue = mayer + lagrange;
95+
*objValue = mayer + (double)lagrange;
9696
return TRUE;
9797
}
9898

@@ -167,9 +167,7 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
167167
}
168168

169169
} else {
170-
/*ToDo */
171-
for(i=0; i<iData->dim.endN; ++i)
172-
gradF[i] = 0.0;
170+
memcpy(gradF, iData->evalf.f, iData->dim.NV* sizeof(double));
173171
}
174172
if(iData->sopt.mayer){
175173
x = v + iData->dim.endN;
@@ -185,10 +183,6 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
185183
gradF[iData->dim.endN + j] = iData->df.dMayer[j];
186184
}
187185
}
188-
}else if(!iData->sopt.lagrange){
189-
/*ToDo */
190-
for(j=0; j<iData->dim.nv; ++j)
191-
gradF[iData->dim.endN + j] = 0.0;
192186
}
193187
return TRUE;
194188
}

SimulationRuntime/c/optimization/initialOptimizer/allocate_optimizer_vars.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
169169
iData->input_name = (char**)malloc(dim->nv*sizeof(char*));
170170

171171
evalf->g = (double*)malloc((dim->NRes) *sizeof(double));
172-
evalf->f = (double*)malloc((dim->NV) *sizeof(double));
172+
evalf->f = (double*)calloc((dim->NV), sizeof(double));
173173
evalf->v = (double**)malloc((dim->nt+1) *sizeof(double*));
174174

175175
for(i =0; i< dim->nt+1; ++i)

0 commit comments

Comments
 (0)