Skip to content

Commit

Permalink
improve memory handling
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@20544 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed May 11, 2014
1 parent d9508f8 commit ef810e8
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 11 deletions.
29 changes: 24 additions & 5 deletions SimulationRuntime/c/optimization/eval_all/EvalF.c
Expand Up @@ -49,7 +49,7 @@ Bool evalfF(Index n, Number * vopt, Bool new_x, Number *objValue, void * useData
long double mayer = 0.0;
long double lagrange = 0.0;

if(1 || !new_x)
if(new_x)
optData2ModelData(optData, vopt, 0);

if(la){
Expand Down Expand Up @@ -106,7 +106,7 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat
const modelica_boolean la = optData->s.lagrange;
const modelica_boolean ma = optData->s.mayer;

if(1 || !new_x)
if(new_x)
optData2ModelData(optData, vopt, 3);
else
updateDer(optData);
Expand Down Expand Up @@ -157,14 +157,23 @@ static inline void updateDer(OptData *optData){
const modelica_boolean la = optData->s.lagrange;
const modelica_boolean ma = optData->s.mayer;
DATA * data = optData->data;
modelica_real * realV[3];

{
int i;
for(i = 0; i < 3; ++i)
realV[i] = data->localData[i]->realVars;
}

if(la){
const int index_la = optData->s.derIndex[0];
const long double *** const scalb = optData->bounds.scalb;
int i, j;
int i, j, ii;
for(i = 0; i < nsi; ++i){
for(j = 0; j < np; ++j){
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
for(ii = 0; ii < 3; ++ii)
data->localData[ii]->realVars = optData->v[i][j];

data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];
diff_symColoredLagrange(optData, &optData->J[i][j][index_la], 2, scalb[i][j]);
}
Expand All @@ -175,9 +184,19 @@ static inline void updateDer(OptData *optData){
const int index_ma = optData->s.derIndex[1];
const int i = nsi - 1;
const int j = np - 1;
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
int ii;

for(ii = 0; ii < 3; ++ii)
data->localData[ii]->realVars = optData->v[i][j];

data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];
diff_symColoredMayer(optData, &optData->J[i][j][index_ma], 3);
}

{
int ii;
for(ii = 0; ii < 3; ++ii)
data->localData[ii]->realVars = realV[ii];
}

}
15 changes: 10 additions & 5 deletions SimulationRuntime/c/optimization/eval_all/EvalG.c
Expand Up @@ -89,7 +89,7 @@ Bool evalfG(Index n, double * vopt, Bool new_x, int m, Number *g, void * useData
double * vv[np+1];
int i, j, k, shift;

if(1|| !new_x)
if(new_x)
optData2ModelData(optData, vopt, 0);

v = optData->v;
Expand Down Expand Up @@ -195,7 +195,7 @@ Bool evalfDiffG(Index n, double * vopt, Bool new_x, Index m, Index njac, Index *
const modelica_boolean ** const J = optData->s.J[4];
int i, j, k, l, ii;

if(1 || !new_x)
if(new_x)
optData2ModelData(optData, vopt, 4);
else
updateDer(optData);
Expand Down Expand Up @@ -567,18 +567,24 @@ static inline void updateDer(OptData *optData){
const int nsi = optData->dim.nsi;
const int np = optData->dim.np;

modelica_real * realVars[3];
int i, j;
DATA * data = optData->data;

for(i = 0; i < 3; ++i)
realVars[i] = data->localData[i]->realVars;

for(i = 0; i < nsi; ++i){
for(j = 0; j < np; ++j){

memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
data->localData[0]->realVars = optData->v[i][j];
data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];

diff_symColoredODE(optData, optData->J[i][j], 4, optData->bounds.scaldt[i]);
}
}

for(i = 0; i < 3; ++i)
data->localData[i]->realVars = realVars[i];
}


Expand All @@ -592,7 +598,6 @@ static inline void printMaxError(Number *g, const int m, const int nx, const int
{
int i, j, k;


for(i = 0; i < m; ++i){
k = i % nJ;
if(k < nx){
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/optimization/eval_all/EvalL.c
Expand Up @@ -127,7 +127,7 @@ Bool ipopt_h(int n, double *vopt, Bool new_x, double obj_factor, int m, double *
modelica_boolean upC;
modelica_boolean upC2;
upC = obj_factor != 0;
if(!new_x){
if(new_x){
optData2ModelData(optData, vopt, 4);
if(upC)
updateDerF(optData);
Expand Down

0 comments on commit ef810e8

Please sign in to comment.