Skip to content

Commit ef810e8

Browse files
author
Vitalij Ruge
committed
improve memory handling
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@20544 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent d9508f8 commit ef810e8

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

SimulationRuntime/c/optimization/eval_all/EvalF.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Bool evalfF(Index n, Number * vopt, Bool new_x, Number *objValue, void * useData
4949
long double mayer = 0.0;
5050
long double lagrange = 0.0;
5151

52-
if(1 || !new_x)
52+
if(new_x)
5353
optData2ModelData(optData, vopt, 0);
5454

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

109-
if(1 || !new_x)
109+
if(new_x)
110110
optData2ModelData(optData, vopt, 3);
111111
else
112112
updateDer(optData);
@@ -157,14 +157,23 @@ static inline void updateDer(OptData *optData){
157157
const modelica_boolean la = optData->s.lagrange;
158158
const modelica_boolean ma = optData->s.mayer;
159159
DATA * data = optData->data;
160+
modelica_real * realV[3];
161+
162+
{
163+
int i;
164+
for(i = 0; i < 3; ++i)
165+
realV[i] = data->localData[i]->realVars;
166+
}
160167

161168
if(la){
162169
const int index_la = optData->s.derIndex[0];
163170
const long double *** const scalb = optData->bounds.scalb;
164-
int i, j;
171+
int i, j, ii;
165172
for(i = 0; i < nsi; ++i){
166173
for(j = 0; j < np; ++j){
167-
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
174+
for(ii = 0; ii < 3; ++ii)
175+
data->localData[ii]->realVars = optData->v[i][j];
176+
168177
data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];
169178
diff_symColoredLagrange(optData, &optData->J[i][j][index_la], 2, scalb[i][j]);
170179
}
@@ -175,9 +184,19 @@ static inline void updateDer(OptData *optData){
175184
const int index_ma = optData->s.derIndex[1];
176185
const int i = nsi - 1;
177186
const int j = np - 1;
178-
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
187+
int ii;
188+
189+
for(ii = 0; ii < 3; ++ii)
190+
data->localData[ii]->realVars = optData->v[i][j];
191+
179192
data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];
180193
diff_symColoredMayer(optData, &optData->J[i][j][index_ma], 3);
181194
}
182195

196+
{
197+
int ii;
198+
for(ii = 0; ii < 3; ++ii)
199+
data->localData[ii]->realVars = realV[ii];
200+
}
201+
183202
}

SimulationRuntime/c/optimization/eval_all/EvalG.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Bool evalfG(Index n, double * vopt, Bool new_x, int m, Number *g, void * useData
8989
double * vv[np+1];
9090
int i, j, k, shift;
9191

92-
if(1|| !new_x)
92+
if(new_x)
9393
optData2ModelData(optData, vopt, 0);
9494

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

198-
if(1 || !new_x)
198+
if(new_x)
199199
optData2ModelData(optData, vopt, 4);
200200
else
201201
updateDer(optData);
@@ -567,18 +567,24 @@ static inline void updateDer(OptData *optData){
567567
const int nsi = optData->dim.nsi;
568568
const int np = optData->dim.np;
569569

570+
modelica_real * realVars[3];
570571
int i, j;
571572
DATA * data = optData->data;
572573

574+
for(i = 0; i < 3; ++i)
575+
realVars[i] = data->localData[i]->realVars;
576+
573577
for(i = 0; i < nsi; ++i){
574578
for(j = 0; j < np; ++j){
575-
576-
memcpy(data->localData[0]->realVars, optData->v[i][j], nReal*sizeof(double));
579+
data->localData[0]->realVars = optData->v[i][j];
577580
data->localData[0]->timeValue = (modelica_real) optData->time.t[i][j];
578581

579582
diff_symColoredODE(optData, optData->J[i][j], 4, optData->bounds.scaldt[i]);
580583
}
581584
}
585+
586+
for(i = 0; i < 3; ++i)
587+
data->localData[i]->realVars = realVars[i];
582588
}
583589

584590

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

595-
596601
for(i = 0; i < m; ++i){
597602
k = i % nJ;
598603
if(k < nx){

SimulationRuntime/c/optimization/eval_all/EvalL.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ Bool ipopt_h(int n, double *vopt, Bool new_x, double obj_factor, int m, double *
127127
modelica_boolean upC;
128128
modelica_boolean upC2;
129129
upC = obj_factor != 0;
130-
if(!new_x){
130+
if(new_x){
131131
optData2ModelData(optData, vopt, 4);
132132
if(upC)
133133
updateDerF(optData);

0 commit comments

Comments
 (0)