Skip to content

Commit

Permalink
- some fixes from static analysis
Browse files Browse the repository at this point in the history
- improve structure for handling ode order in optimization


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@20552 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed May 12, 2014
1 parent c0a60f8 commit 732151a
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 146 deletions.
23 changes: 12 additions & 11 deletions SimulationRuntime/c/optimization/DataManagement/DerStructure.c
Expand Up @@ -181,16 +181,18 @@ static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStruct
s->seedVec[index] = (modelica_real **)malloc((maxColors)*sizeof(modelica_real*));
free(data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex);
/**********************/
for(ii = 1; ii < maxColors; ++ii){
s->seedVec[index][ii] = (modelica_real*)calloc(sizeCols, sizeof(modelica_real));
for(i = 0; i < sizeCols; i++){
if(cC[i] == ii){
s->seedVec[index][ii][i] = vnom[i];
for(j = lindex[i]; j < lindex[i + 1]; ++j){
l = pindex[j];
J[l][i] = (modelica_boolean)1;
if(index == 4)
++dim->nJderx;
if(sizeCols > 0){
for(ii = 1; ii < maxColors; ++ii){
s->seedVec[index][ii] = (modelica_real*)calloc(sizeCols, sizeof(modelica_real));
for(i = 0; i < sizeCols; i++){
if(cC[i] == ii){
s->seedVec[index][ii][i] = vnom[i];
for(j = lindex[i]; j < lindex[i + 1]; ++j){
l = pindex[j];
J[l][i] = (modelica_boolean)1;
if(index == 4)
++dim->nJderx;
}
}
}
}
Expand Down Expand Up @@ -360,7 +362,6 @@ static inline void print_local_hessian_struct(DATA * data, OptDataDim * dim, Opt
modelica_boolean **H0 = s->H0;
modelica_boolean **H1 = s->H1;
const int nv = dim->nv;
const int nJ = dim->nJ;
const int n1 = dim->nH1;
const int n0 = dim->nH0;

Expand Down
Expand Up @@ -83,7 +83,6 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver

const int nx = optData->dim.nx;
const int nu = optData->dim.nu;
const int nv = optData->dim.nv;
const int np = optData->dim.np;
const int nsi = optData->dim.nsi;
const int nReal = optData->dim.nReal;
Expand Down
31 changes: 13 additions & 18 deletions SimulationRuntime/c/optimization/DataManagement/MoveData.c
Expand Up @@ -122,9 +122,11 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data){

time->dt[0] = (time->tf - time->t0)/nsi;

time->t = malloc(nsi*sizeof(long double));
time->t = (long double**)malloc(nsi*sizeof(long double*));
for(i = 0; i<nsi; ++i)
time->t[i] = malloc(np*sizeof(long double));
time->t[i] = (long double*)malloc(np*sizeof(long double));
if(nsi < 1)
errorStreamPrint(LOG_STDOUT, 0, "Not support numberOfIntervals = %i < 1", nsi);

if(np == 1){
c[0] = 1.0;
Expand All @@ -133,7 +135,7 @@ static inline void pickUpTime(OptDataTime * time, OptDataDim * dim, DATA* data){
c[1] = 0.64494897427831780981972840747058913919659474806567;
c[2] = 1.00000;
}else{
assert(0);
errorStreamPrint(LOG_STDOUT, 0, "Not support np = %i", np);
}

for(k = 0; k < np; ++k){
Expand Down Expand Up @@ -203,7 +205,7 @@ static inline void pickUpBounds(OptDataBounds * bounds, OptDataDim * dim, DATA*
x0 = data->localData[1]->realVars[i];

check_nominal(bounds, min, max, nominal, nominalWasSet, i, x0);
nominal = bounds->vnom[i];
data->modelData.realVarsData[i].attribute.nominal = bounds->vnom[i];
bounds->scalF[i] = 1.0/bounds->vnom[i];
bounds->vmin[i] = min * bounds->scalF[i];
bounds->vmax[i] = max * bounds->scalF[i];
Expand Down Expand Up @@ -241,17 +243,17 @@ static inline void check_nominal(OptDataBounds * bounds, const double min, const
if(set){
bounds->vnom[i] = fmax(fabs(nominal),1e-16);
}else{
double amax, amin, ax0;
double amax, amin;

amax = fabs(max);
amin = fabs(min);
ax0 = fabs(x0);

bounds->vnom[i] = fmax(amax,amin);

if(bounds->vnom[i] > 1e12){
double tmp = fmin(amax,amin);
bounds->vnom[i] = (tmp < 1e12) ? fmax(tmp,x0) : 1.0 + x0;
double ax0 = fabs(x0);
bounds->vnom[i] = (tmp < 1e12) ? fmax(tmp,ax0) : 1.0 + ax0;
}

bounds->vnom[i] = fmax(bounds->vnom[i], 1e-16);
Expand Down Expand Up @@ -436,6 +438,8 @@ void res2file(OptData *optData, SOLVER_INFO* solverInfo, double *vopt){
a[2] = 0.33333333333333333333333333333333333333333333333333;
}else if(np == 1){
a[0] = 1.000;
}else{
errorStreamPrint(LOG_STDOUT, 0, "Not support np = %i", np);
}

optData2ModelData(optData, vopt, 0);
Expand Down Expand Up @@ -497,7 +501,6 @@ void res2file(OptData *optData, SOLVER_INFO* solverInfo, double *vopt){
* author: Vitalij Ruge
**/
void optData2ModelData(OptData *optData, double *vopt, const int index){
const int nReal = optData->dim.nReal;
const int nx = optData->dim.nx;
const int nv = optData->dim.nv;
const int nsi = optData->dim.nsi;
Expand Down Expand Up @@ -568,8 +571,6 @@ void diff_symColoredODE(OptData *optData, modelica_real **J, const int index, co
const int Cmax = data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1;
const int dnx = optData->dim.nx;
const modelica_real * const resultVars = data->simulationInfo.analyticJacobians[index].resultVars;
const modelica_real * const vnom = optData->bounds.vnom;
const long double * const sF = optData->bounds.scalF;
const unsigned int * const sPindex = data->simulationInfo.analyticJacobians[index].sparsePattern.index;

for(i = 1; i < Cmax; ++i){
Expand All @@ -595,18 +596,15 @@ void diff_symColoredODE(OptData *optData, modelica_real **J, const int index, co
* function calculates a symbolic colored jacobian matrix
* authors: Willi Braun, Vitalij Ruge
*/
void diff_symColoredLagrange(OptData *optData, modelica_real **J, const int index, const long double * const scaldt){
void diff_symColoredLagrange(OptData *optData, modelica_real **J, const int index, const long double * const scalb){
DATA * data = optData->data;
int i,j,l,ii;

const unsigned int * const cC = data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
const unsigned int * const lindex = optData->s.lindex[index];
const int nx = data->simulationInfo.analyticJacobians[index].sizeCols;
const int Cmax = data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1;
const int dnx = optData->dim.nx;
const modelica_real * const resultVars = data->simulationInfo.analyticJacobians[index].resultVars;
const modelica_real * const vnom = optData->bounds.vnom;
const long double * const sF = optData->bounds.scalF;
const unsigned int * const sPindex = data->simulationInfo.analyticJacobians[index].sparsePattern.index;

for(i = 1; i < Cmax; ++i){
Expand All @@ -617,7 +615,7 @@ void diff_symColoredLagrange(OptData *optData, modelica_real **J, const int inde
if(cC[ii] == i){
for(j = lindex[ii]; j < lindex[ii + 1]; ++j){
l = sPindex[j];
J[l][ii] = (modelica_real) resultVars[l] * scaldt[l];
J[l][ii] = (modelica_real) resultVars[l] * scalb[l];
}
}
}
Expand All @@ -637,10 +635,7 @@ void diff_symColoredMayer(OptData *optData, modelica_real **J, const int index){
const unsigned int * const lindex = optData->s.lindex[index];
const int nx = data->simulationInfo.analyticJacobians[index].sizeCols;
const int Cmax = data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1;
const int dnx = optData->dim.nx;
const modelica_real * const resultVars = data->simulationInfo.analyticJacobians[index].resultVars;
const modelica_real * const vnom = optData->bounds.vnom;
const long double * const sF = optData->bounds.scalF;
const unsigned int * const sPindex = data->simulationInfo.analyticJacobians[index].sparsePattern.index;

for(i = 1; i < Cmax; ++i){
Expand Down
4 changes: 0 additions & 4 deletions SimulationRuntime/c/optimization/eval_all/EvalF.c
Expand Up @@ -114,8 +114,6 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat
if(la){

const int k = optData->s.derIndex[0];
const long double * const b = optData->rk.b;
const long double * const dt = optData->time.dt;
int i, j, ii;
modelica_real * gradL;

Expand Down Expand Up @@ -150,8 +148,6 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat
* author: Vitalij Ruge
**/
static inline void updateDer(OptData *optData){
const int nReal = optData->dim.nReal;
const int nv = optData->dim.nv;
const int nsi = optData->dim.nsi;
const int np = optData->dim.np;
const modelica_boolean la = optData->s.lagrange;
Expand Down

0 comments on commit 732151a

Please sign in to comment.