Skip to content

Commit

Permalink
- CevalScript: Bugfix Interval, calculation of stepSize
Browse files Browse the repository at this point in the history
- simulation_init.cpp, use "&&" instead of "and" makes Visual Studio happy
- bugfix SimulationResultsCmp.c
- update tests msl3.1 simulate

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8677 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Apr 16, 2011
1 parent c436c10 commit fb3dd3a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 22 deletions.
3 changes: 1 addition & 2 deletions Compiler/Script/CevalScript.mo
Expand Up @@ -519,8 +519,7 @@ algorithm
populateSimulationOptions(inSimOpt, rest);

DAE.RCONST(rStartTime) = startTime;
DAE.RCONST(rStopTime) = startTime;

DAE.RCONST(rStopTime) = stopTime;
iNumberOfIntervals = realInt(realDiv(realSub(rStopTime, rStartTime), rStepSize));

numberOfIntervals = DAE.ICONST(iNumberOfIntervals);
Expand Down
58 changes: 41 additions & 17 deletions Compiler/runtime/SimulationResultsCmp.c
Expand Up @@ -194,7 +194,7 @@ DataField getData(const char *varname,const char *filename, unsigned int size, S
res.data = newvars;

//for (i=0;i<res.n;i++)
// fprintf(stderr, "%.6g\n", res.data[i]);
// fprintf(stderr, "%d: %.6g\n", i, res.data[i]);


return res;
Expand All @@ -211,14 +211,14 @@ void cmpData(char* varname, DataField *time, DataField *reftime, DataField *data
tr = reftime->data[j];
dr = refdata->data[j];

//fprintf(stderr, "compare: %s\n",varname);
// fprintf(stderr, "compare: %s\n",varname);
for (i=0;i<data->n;i++){
t = time->data[i];
d = data->data[i];
// fprintf(stderr, " t: %.6g d:%.6g\n",t,d);
increased = 0;
// fprintf(stderr, "i: %d t: %.6g d:%.6g\n",i,t,d);
while(tr < t){
if (j < reftime->n) {
if (j +1< reftime->n) {
j += 1;
tr = reftime->data[j];
increased = 1;
Expand All @@ -227,11 +227,10 @@ void cmpData(char* varname, DataField *time, DataField *reftime, DataField *data
break;
}
if (increased==1){
if ((t - reftime->data[j-1]) < (tr-t)) {
j -= 1;
tr = reftime->data[j];
}
j -= 1;
tr = reftime->data[j];
}
// fprintf(stderr, "i: %d t: %.6g d:%.6g j: %d tr:%.6g\n",i,t,d,j,tr);
// events
if(i>0) {
// an event
Expand All @@ -241,15 +240,15 @@ void cmpData(char* varname, DataField *time, DataField *reftime, DataField *data
char te = 0;
if (i+1<data->n) {
if (time->data[i+1] < t+0.00000065) {
te = 1;
te = 1;
}
}
while(te==1){
i +=1;
te = 0;
if (i+1<data->n) {
if (time->data[i+1] < t+0.00000065) {
te = 1;
te = 1;
}
}
}
Expand All @@ -260,15 +259,15 @@ void cmpData(char* varname, DataField *time, DataField *reftime, DataField *data
te == 0;
if (j+1<reftime->n) {
if (reftime->data[j+1] < tr+0.00000065) {
te = 1;
te = 1;
}
}
while(te==1){
j +=1;
te = 0;
if (j+1<reftime->n) {
if (reftime->data[j+1] < tr+0.00000065) {
te = 1;
te = 1;
}
}
}
Expand All @@ -283,18 +282,43 @@ void cmpData(char* varname, DataField *time, DataField *reftime, DataField *data

dr = refdata->data[j];
if (interpolate==1){
//fprintf(stderr, "interpolate d:%.6g ",t,dr);
dr = dr + ((refdata->data[j+1]-dr)/(reftime->data[j+1]-tr))*(t-tr);
//fprintf(stderr, "-> dr:%.6g\n",dr);
// fprintf(stderr, "interpolate %.6g:%.6g ",t,dr);
// look for interpolation partner
if (j+1<reftime->n) {
unsigned int jj = j+1;
char te=0;
increased = 0;
if (reftime->data[j+1] == tr){
te = 1;
increased = 1;
}
while(te==1){
jj += 1;
te = 0;
if (jj<reftime->n) {
if (reftime->data[jj] == tr){
te = 1;
}
}
}
if (increased == 1){
jj -= 1;
}
//fprintf(stderr, "-> %d %.6g %.6g\n",jj,reftime->data[jj],tr);
if (reftime->data[jj] != tr){
dr = dr + ((refdata->data[jj] - dr)/(reftime->data[jj] - tr))*absdouble(t-tr);
}
}
// fprintf(stderr, "-> dr:%.6g\n",dr);
}
//fprintf(stderr, "j: %d tr: %.6g dr:%.6g\n",j,tr,dr);
// fprintf(stderr, "j: %d tr: %.6g dr:%.6g\n",j,tr,dr);

if (dr != 0){
delta = absdouble(d-dr)/dr;
}
else
delta = d;
//fprintf(stderr, "delta:%.6g reltol:%.6g\n",absdouble(delta),reltol);
// fprintf(stderr, "delta:%.6g reltol:%.6g\n",absdouble(delta),reltol);

if ((absdouble(delta) > reltol) && (absdouble(d-dr) > abstol)){

Expand Down
6 changes: 3 additions & 3 deletions c_runtime/simulation_init.cpp
Expand Up @@ -48,7 +48,7 @@ void leastSquare(long *nz, double *z, double *funcValue)

// for real parameters
for (ind=0,indAct=startIndPar; ind<globalData->nParameters; ind++, indAct++)
if (globalData->initFixed[indAct]==0 and globalData->var_attr[indAct-globalData->nStates]==1)
if (globalData->initFixed[indAct]==0 && globalData->var_attr[indAct-globalData->nStates]==1)
globalData->parameters[ind] = z[indz++];

bound_parameters();
Expand Down Expand Up @@ -219,7 +219,7 @@ int initialize(const std::string init_method)
int startIndPar = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic;
int endIndPar = startIndPar+globalData->nParameters;
for (ind = startIndPar; ind < endIndPar; ind++){
if (globalData->initFixed[ind]==0 and globalData->var_attr[ind-globalData->nStates]==1){
if (globalData->initFixed[ind]==0 && globalData->var_attr[ind-globalData->nStates]==1){
if (sim_verbose >= LOG_INIT)
printf("Parameter %s is unfixed.\n",globalData->parametersNames[ind-startIndPar].name);
nz++;
Expand Down Expand Up @@ -253,7 +253,7 @@ int initialize(const std::string init_method)
}
// for real parameters
for (ind=0,indAct=startIndPar; ind<globalData->nParameters; ind++) {
if (globalData->initFixed[indAct++]==0 and globalData->var_attr[indAct-globalData->nStates]==1)
if (globalData->initFixed[indAct++]==0 && globalData->var_attr[indAct-globalData->nStates]==1)
z[indz++] = globalData->parameters[ind];
}

Expand Down

0 comments on commit fb3dd3a

Please sign in to comment.