Skip to content

Commit

Permalink
improve scaling, thanks Kshitij Kulshreshtha
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19886 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Mar 31, 2014
1 parent aa117f8 commit 7eb7b66
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 13 deletions.
13 changes: 5 additions & 8 deletions SimulationRuntime/c/optimization/constraints/evalfG.c
Expand Up @@ -182,12 +182,6 @@ int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, double **J)

refreshSimData(x,u,t,iData);
diff_symColoredODE(v,t,iData,J);
for(i = 0;i<iData->dim.nv;++i){
for(j = 0; j <iData->dim.nx; ++j)
J[j][i] *= iData->scaling.scalf[j]*iData->scaling.vnom[i];
for(; j <nJ; ++j)
J[j][i] *= iData->scaling.vnom[i];
}

/*
#ifdef JAC_ADOLC
Expand Down Expand Up @@ -223,7 +217,7 @@ int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i){
for(ii = 0; ii<nx; ++ii){
if(cC[ii] == i){
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
data->simulationInfo.analyticJacobians[index].seedVars[ii] = iData->scaling.vnom[ii];
}
}

Expand All @@ -236,7 +230,10 @@ int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)

for(; j<lindex[ii]; ++j){
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
if(l < iData->dim.nx)
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l]*iData->scaling.scalf[l];
else
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}
Expand Down
12 changes: 7 additions & 5 deletions SimulationRuntime/c/optimization/goal/evalF.c
Expand Up @@ -149,8 +149,9 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF,iData->lagrange_index);
iData->scaling.scald = iData->dtime.dt[i]*mbase->b[0][k];
for(j=0; j<iData->dim.nv; ++j)
gradF[id++] = iData->dtime.dt[i]*mbase->b[0][k]*iData->gradF[j]*iData->scaling.vnom[j];
gradF[id++] = iData->scaling.scald*iData->gradF[j];
}
}

Expand All @@ -160,8 +161,9 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF, iData->lagrange_index);
iData->scaling.scald = iData->dtime.dt[i]*mbase->b[1][k];
for(j = 0; j<iData->dim.nv; ++j)
gradF[id++] = iData->dtime.dt[i]*mbase->b[1][k]*iData->gradF[j]*iData->scaling.vnom[j];
gradF[id++] = iData->scaling.scald*iData->gradF[j];
}
}

Expand All @@ -180,9 +182,9 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
for(j=0; j<iData->dim.nv; ++j)
{
if(iData->sopt.lagrange){
gradF[iData->endN + j] += iData->gradF[j]*iData->scaling.vnom[j];
gradF[iData->endN + j] += iData->gradF[j];
} else {
gradF[iData->endN + j] = iData->gradF[j]*iData->scaling.vnom[j];
gradF[iData->endN + j] = iData->gradF[j];
}
}
}
Expand Down Expand Up @@ -224,7 +226,7 @@ int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
{
if(cC[ii] == i)
{
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
data->simulationInfo.analyticJacobians[index].seedVars[ii] = iData->scaling.vnom[ii];
}
}

Expand Down
2 changes: 2 additions & 0 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -158,6 +158,8 @@ typedef struct OPTIMIZER_SCALING{
long double *scalf;
long double ** scaldt;

long double scald;

}OPTIMIZER_SCALING;


Expand Down

0 comments on commit 7eb7b66

Please sign in to comment.