Skip to content

Commit

Permalink
- restructure data for optimization (continuing)
Browse files Browse the repository at this point in the history
 - poly coeff


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19861 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Mar 31, 2014
1 parent 3954a9f commit eb9728e
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 69 deletions.
19 changes: 10 additions & 9 deletions SimulationRuntime/c/optimization/constraints/evalfDiffG.c
Expand Up @@ -112,9 +112,10 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo

ipoptDebuge(iData,x);

tmp[0] = iData->dt[0]*mbase->d1[4];
tmp[1] = iData->dt[0]*mbase->d2[4];
tmp[2] = iData->dt[0]*mbase->d3[4];
/*ToDo */
tmp[0] = iData->dt[0]*mbase->d[0][4];
tmp[1] = iData->dt[0]*mbase->d[1][4];
tmp[2] = iData->dt[0]*mbase->d[2][4];

diff_functionODE(x, iData->t0 , iData, iData->J0);

Expand All @@ -125,13 +126,13 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
lobattoJac1(mbase->d1, iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[0], iData);
lobattoJac1(mbase->d[l], iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 1:
lobattoJac2(mbase->d2, iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[1], iData);
lobattoJac2(mbase->d[l], iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 2:
lobattoJac3(mbase->d3, iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[2], iData);
lobattoJac3(mbase->d[l], iData->J[j], iData->J0[j], iData->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
}
}
Expand All @@ -148,13 +149,13 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
radauJac1(mbase->a1, iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
radauJac1(mbase->a[l], iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
break;
case 1:
radauJac2(mbase->a2, iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
radauJac2(mbase->a[l], iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
break;
case 2:
radauJac3(mbase->a3, iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
radauJac3(mbase->a[l], iData->J[j], iData->dt[i], values, dim->nv, &k, j, iData);
break;
}
}
Expand Down
12 changes: 6 additions & 6 deletions SimulationRuntime/c/optimization/constraints/evalfG.c
Expand Up @@ -256,7 +256,7 @@ static inline int evalG11(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->mbase.a1[0]*x0[j] + iData->mbase.a1[3]*iData->x3[j] + iData->scalf[j]*iData->dt[i]*iData->dotx1[j]) - (iData->mbase.a1[1]*iData->x1[j] + iData->mbase.a1[2]*iData->x2[j]);
g[j] = (iData->mbase.a[0][0]*x0[j] + iData->mbase.a[0][3]*iData->x3[j] + iData->scalf[j]*iData->dt[i]*iData->dotx1[j]) - (iData->mbase.a[0][1]*iData->x1[j] + iData->mbase.a[0][2]*iData->x2[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand All @@ -271,7 +271,7 @@ static inline int evalG12(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->mbase.a2[1]*iData->x1[j] + iData->scalf[j]*iData->dt[i]*iData->dotx2[j]) - (iData->mbase.a2[0]*x0[j] + iData->mbase.a2[2]*iData->x2[j] + iData->mbase.a2[3]*iData->x3[j]);
g[j] = (iData->mbase.a[1][1]*iData->x1[j] + iData->scalf[j]*iData->dt[i]*iData->dotx2[j]) - (iData->mbase.a[1][0]*x0[j] + iData->mbase.a[1][2]*iData->x2[j] + iData->mbase.a[1][3]*iData->x3[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand All @@ -286,7 +286,7 @@ static inline int evalG13(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->mbase.a3[0]*x0[j] + iData->mbase.a3[2]*iData->x2[j] + iData->scalf[j]*iData->dt[i]*iData->dotx3[j]) - (iData->mbase.a3[1]*iData->x1[j] + iData->mbase.a3[3]*iData->x3[j]);
g[j] = (iData->mbase.a[2][0]*x0[j] + iData->mbase.a[2][2]*iData->x2[j] + iData->scalf[j]*iData->dt[i]*iData->dotx3[j]) - (iData->mbase.a[2][1]*iData->x1[j] + iData->mbase.a[2][3]*iData->x3[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand All @@ -301,7 +301,7 @@ static inline int evalG21(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->scalf[j]*iData->dt[i]*(iData->dotx1[j] + iData->mbase.d1[4]*iData->dotx0[j]) + iData->mbase.d1[0]*x0[j] + iData->mbase.d1[3]*iData->x3[j]) - (iData->mbase.d1[1]*iData->x1[j] + iData->mbase.d1[2]*iData->x2[j]);
g[j] = (iData->scalf[j]*iData->dt[i]*(iData->dotx1[j] + iData->mbase.d[0][4]*iData->dotx0[j]) + iData->mbase.d[0][0]*x0[j] + iData->mbase.d[0][3]*iData->x3[j]) - (iData->mbase.d[0][1]*iData->x1[j] + iData->mbase.d[0][2]*iData->x2[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand All @@ -316,7 +316,7 @@ static inline int evalG22(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->scalf[j]*iData->dt[i]*iData->dotx2[j] + iData->mbase.d2[1]*iData->x1[j]) - (iData->scalf[j]*iData->dt[i]*iData->mbase.d2[4]*iData->dotx0[j] + iData->mbase.d2[0]*x0[j] + iData->mbase.d2[2]*iData->x2[j] + iData->mbase.d2[3]*iData->x3[j]);
g[j] = (iData->scalf[j]*iData->dt[i]*iData->dotx2[j] + iData->mbase.d[1][1]*iData->x1[j]) - (iData->scalf[j]*iData->dt[i]*iData->mbase.d[1][4]*iData->dotx0[j] + iData->mbase.d[1][0]*x0[j] + iData->mbase.d[1][2]*iData->x2[j] + iData->mbase.d[1][3]*iData->x3[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand All @@ -331,7 +331,7 @@ static inline int evalG23(Number *g, IPOPT_DATA_ *iData, double *x0, int i)
{
int j;
for(j=0; j<iData->dim.nx; ++j)
g[j] = (iData->scalf[j]*iData->dt[i]*(iData->mbase.d3[4]*iData->dotx0[j] + iData->dotx3[j]) + iData->mbase.d3[0]*x0[j] + iData->mbase.d3[2]*iData->x2[j]) - (iData->mbase.d3[1]*iData->x1[j] + iData->mbase.d3[3]*iData->x3[j]);
g[j] = (iData->scalf[j]*iData->dt[i]*(iData->mbase.d[2][4]*iData->dotx0[j] + iData->dotx3[j]) + iData->mbase.d[2][0]*x0[j] + iData->mbase.d[2][2]*iData->x2[j]) - (iData->mbase.d[2][1]*iData->x1[j] + iData->mbase.d[2][3]*iData->x3[j]);

memcpy(g + iData->dim.nx, &iData->data->localData[0]->realVars[iData->data->modelData.nVariablesReal - iData->dim.nc], sizeof(double)*iData->dim.nc);
return 0;
Expand Down
62 changes: 31 additions & 31 deletions SimulationRuntime/c/optimization/initialOptimizer/allocate_ipopt.c
Expand Up @@ -399,39 +399,39 @@ static int optimizer_coeff_setings(IPOPT_DATA_ *iData)
mbase->c[1][1] = 0.64494897427831780981972840747058913919659474806567;
mbase->c[1][2] = 1.0;

mbase->a1[0] = 4.1393876913398137178367408896470696703591369767880;
mbase->a1[1] = 3.2247448713915890490986420373529456959829737403284;
mbase->a1[2] = 1.1678400846904054949240412722156950122337492313015;
mbase->a1[3] = 0.25319726474218082618594241992157103785758599484179;

mbase->a2[0] = 1.7393876913398137178367408896470696703591369767880;
mbase->a2[1] = 3.5678400846904054949240412722156950122337492313015;
mbase->a2[2] = 0.7752551286084109509013579626470543040170262596716;
mbase->a2[3] = 1.0531972647421808261859424199215710378575859948418;

mbase->a3[0] = 3.0;
mbase->a3[1] = 5.5319726474218082618594241992157103785758599484179;
mbase->a3[2] = 7.5319726474218082618594241992157103785758599484179;
mbase->a3[3] = 5.0;

mbase->d1[0] = 4.3013155617496424838955952368431696002490512113396;
mbase->d1[1] = 3.6180339887498948482045868343656381177203091798058;
mbase->d1[2] = 0.8541019662496845446137605030969143531609275394172;
mbase->d1[3] = 0.17082039324993690892275210061938287063218550788345;
mbase->d1[4] = 0.44721359549995793928183473374625524708812367192230;
mbase->a[0][0] = 4.1393876913398137178367408896470696703591369767880;
mbase->a[0][1] = 3.2247448713915890490986420373529456959829737403284;
mbase->a[0][2] = 1.1678400846904054949240412722156950122337492313015;
mbase->a[0][3] = 0.25319726474218082618594241992157103785758599484179;

mbase->a[1][0] = 1.7393876913398137178367408896470696703591369767880;
mbase->a[1][1] = 3.5678400846904054949240412722156950122337492313015;
mbase->a[1][2] = 0.7752551286084109509013579626470543040170262596716;
mbase->a[1][3] = 1.0531972647421808261859424199215710378575859948418;

mbase->a[2][0] = 3.0;
mbase->a[2][1] = 5.5319726474218082618594241992157103785758599484179;
mbase->a[2][2] = 7.5319726474218082618594241992157103785758599484179;
mbase->a[2][3] = 5.0;

mbase->d[0][0] = 4.3013155617496424838955952368431696002490512113396;
mbase->d[0][1] = 3.6180339887498948482045868343656381177203091798058;
mbase->d[0][2] = 0.8541019662496845446137605030969143531609275394172;
mbase->d[0][3] = 0.17082039324993690892275210061938287063218550788345;
mbase->d[0][4] = 0.44721359549995793928183473374625524708812367192230;
mbase->invd1_4 = 2.2360679774997896964091736687312762354406183596115;

mbase->d2[0] = 3.3013155617496424838955952368431696002490512113396;
mbase->d2[1] = 5.8541019662496845446137605030969143531609275394172;
mbase->d2[2] = 1.3819660112501051517954131656343618822796908201942;
mbase->d2[3] = 1.1708203932499369089227521006193828706321855078834;
mbase->d2[4] = 0.44721359549995793928183473374625524708812367192230;

mbase->d3[0] = 7.0;
mbase->d3[1] = 11.180339887498948482045868343656381177203091798058;
mbase->d3[2] = 11.180339887498948482045868343656381177203091798058;
mbase->d3[3] = 7.0;
mbase->d3[4] = 1.0;
mbase->d[1][0] = 3.3013155617496424838955952368431696002490512113396;
mbase->d[1][1] = 5.8541019662496845446137605030969143531609275394172;
mbase->d[1][2] = 1.3819660112501051517954131656343618822796908201942;
mbase->d[1][3] = 1.1708203932499369089227521006193828706321855078834;
mbase->d[1][4] = 0.44721359549995793928183473374625524708812367192230;

mbase->d[2][0] = 7.0;
mbase->d[2][1] = 11.180339887498948482045868343656381177203091798058;
mbase->d[2][2] = 11.180339887498948482045868343656381177203091798058;
mbase->d[2][3] = 7.0;
mbase->d[2][4] = 1.0;

mbase->b[0][0] = 0.083333333333333333333333333333333333333333333333333;
mbase->b[0][1] = 0.41666666666666666666666666666666666666666666666667;
Expand Down
Expand Up @@ -79,12 +79,6 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
iData->mult_g = (double*)malloc(ng*sizeof(double));
iData->mult_x_L = (double*)malloc(dim->NV*sizeof(double));
iData->mult_x_U = (double*)malloc(dim->NV*sizeof(double));
mbase->a1 = (long double*)malloc(deg1*sizeof(long double));
mbase->a2 = (long double*)malloc(deg1*sizeof(long double));
mbase->a3 = (long double*)malloc(deg1*sizeof(long double));
mbase->d1 = (long double*)malloc(deg2*sizeof(long double));
mbase->d2 = (long double*)malloc(deg2*sizeof(long double));
mbase->d3 = (long double*)malloc(deg2*sizeof(long double));
iData->lhs = (double*)malloc((int)dim->nJ*sizeof(double));
iData->rhs = (double*)malloc((int)dim->nJ*sizeof(double));
iData->dotx0 = (double*)malloc(dim->nx*sizeof(double));
Expand Down Expand Up @@ -226,12 +220,6 @@ static int freeIpoptData(IPOPT_DATA_ *iData)
free(iData->mult_g);
free(iData->mult_x_L);
free(iData->mult_x_U);
free(mbase->a1);
free(mbase->a2);
free(mbase->a3);
free(mbase->d1);
free(mbase->d2);
free(mbase->d3);
free(iData->dotx0);
free(iData->dotx1);
free(iData->dotx2);
Expand Down
12 changes: 3 additions & 9 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -81,21 +81,15 @@ typedef struct OPTIMIZER_DIM_VARS{

typedef struct OPTIMIZER_MBASE{

long double b[3][10];
long double b[3][5];

long double c[3][5];

long double *a1;
long double *a2;
long double *a3;
long double a[5][5];
long double d[5][5];

long double *d1;
long double *d2;
long double *d3;
long double invd1_4;



}OPTIMIZER_MBASE;

typedef struct IPOPT_DATA_
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c
Expand Up @@ -148,9 +148,9 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
for(i = 0; i< dim->nx; ++i){
if(ll[i] != ll[i + nJ]){
if(mbase->invd1_4*ll[i+2*nJ] != ll[i + nJ])
iData->sh[i] = mbase->d1[4]*(ll[i] + (mbase->invd1_4*ll[i+2*nJ] - ll[i + nJ]));
iData->sh[i] = mbase->d[0][4]*(ll[i] + (mbase->invd1_4*ll[i+2*nJ] - ll[i + nJ]));
else
iData->sh[i] = mbase->d1[4]*ll[i];
iData->sh[i] = mbase->d[0][4]*ll[i];
}else{
iData->sh[i] = ll[i+2*nJ];
}
Expand Down

0 comments on commit eb9728e

Please sign in to comment.