Skip to content

Commit a105abc

Browse files
author
Vitalij Ruge
committed
- fixed lobatto solver
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15313 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 725c447 commit a105abc

File tree

2 files changed

+40
-53
lines changed

2 files changed

+40
-53
lines changed

SimulationRuntime/c/simulation/solver/radau.c

Lines changed: 39 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,14 @@ int initKinsol(KINODE *kinOde)
328328
KDATAODE *kData = kinOde->kData;
329329
NLPODE *nlp = kinOde->nlp;
330330
double* derx;
331-
double tmp,tmp1,h;
331+
double tmp,h;
332332
double* xeq = NV_DATA_S(kData->x);
333+
333334
nlp->currentStep = &kinOde->solverInfo->currentStepSize;
334-
kinOde->nlp->derx = data->localData[0]->realVars + nStates;
335-
kinOde->nlp->x0 = data->localData[1]->realVars;
336-
kinOde->nlp->t0 = data->localData[1]->timeValue;
335+
nlp->derx = data->localData[0]->realVars + nStates;
336+
nlp->x0 = data->localData[1]->realVars;
337+
nlp->f0 = data->localData[1]->realVars + nStates;
338+
nlp->t0 = data->localData[1]->timeValue;
337339
derx = nlp->derx;
338340

339341
xlow = xeq + N*nStates;
@@ -349,45 +351,44 @@ int initKinsol(KINODE *kinOde)
349351
KINInit(kData->kmem, radau5Res, kinOde->kData->x);
350352
break;
351353
case 7:
352-
nlp->dt = *(kinOde->nlp->currentStep);
353-
KINInit(kinOde->kData->kmem, radau3Res, kinOde->kData->x);
354+
nlp->dt = *(nlp->currentStep);
355+
KINInit(kData->kmem, radau3Res, kinOde->kData->x);
354356
break;
355357
case 8:
356-
nlp->dt = *(kinOde->nlp->currentStep);
357-
KINInit(kinOde->kData->kmem, radau1Res, kinOde->kData->x);
358+
nlp->dt = *(nlp->currentStep);
359+
KINInit(kData->kmem, radau1Res, kinOde->kData->x);
358360
break;
359361
case 9:
360-
nlp->dt = *(kinOde->nlp->currentStep);
361-
KINInit(kinOde->kData->kmem, lobatto2Res, kinOde->kData->x);
362+
nlp->dt = *(nlp->currentStep);
363+
KINInit(kData->kmem, lobatto2Res, kinOde->kData->x);
362364
break;
363365
case 10:
364-
nlp->dt = *(kinOde->nlp->currentStep);
365-
KINInit(kinOde->kData->kmem, lobatto4Res, kinOde->kData->x);
366+
nlp->dt = *(nlp->currentStep);
367+
KINInit(kData->kmem, lobatto4Res, kinOde->kData->x);
366368
break;
367369
case 11:
368-
nlp->dt = *(kinOde->nlp->currentStep);
369-
KINInit(kinOde->kData->kmem, lobatto6Res, kinOde->kData->x);
370+
nlp->dt = *(nlp->currentStep);
371+
KINInit(kData->kmem, lobatto6Res, kinOde->kData->x);
370372
break;
371373

372374
default:
373375
assert(0);
374376
}
377+
375378
h = nlp->dt;
379+
376380
for(j=0,k=0;j<N;j++)
377381
{
378382
for(i=0;i<nStates;i++,k++)
379383
{
380-
tmp1 = fabs(derx[i])*h;
381-
tmp = tmp1 > 1e-6 ? 1.0/(tmp1) : 1e6;
382384
if(nlp->a != NULL)
383-
{
384-
tmp /= nlp->a[j] > 0 ? nlp->a[j] : 1.0;
385-
xeq[k] = nlp->x0[i] + nlp->a[j]*derx[i]*h;
386-
}
385+
xeq[k] = nlp->x0[i] + nlp->a[j]*nlp->f0[i]*h;
387386
else
388-
xeq[k] = nlp->x0[i] + derx[i]*h;
387+
xeq[k] = nlp->x0[i] + nlp->f0[i]*h;
388+
389389
xlow[k] = xeq[k] - nlp->min[i];
390390
xup[k] = xeq[k] - nlp->max[i];
391+
tmp = 1.0/(fabs(nlp->x0[i] - xeq[k]) + 1e-6);
391392
seq[k] = tmp;
392393
slow[k] = tmp;
393394
sup[k] = tmp;
@@ -560,7 +561,6 @@ int radau1Res(N_Vector x, N_Vector f, void* user_data)
560561
int n = nlp->nStates;
561562
double* xlow, *xup;
562563
double*derx = nlp->derx;
563-
double*a = nlp->a;
564564
double* flow, *fup;
565565

566566
N = kinOde->N;
@@ -597,30 +597,27 @@ int lobatto2Res(N_Vector x, N_Vector f, void* user_data)
597597
double* lb = nlp->min;
598598
double* ub = nlp->max;
599599

600-
double *x0,*x1;
600+
double *x0,*x1, *f0;
601601
int n = nlp->nStates;
602602
double* xlow, *xup;
603603
double*derx = nlp->derx;
604-
double*a = nlp->a;
605604
double* flow, *fup;
606605

607606
N = kinOde->N;
608607

609-
flow = feq + N*n;
610-
fup = flow + N*n;
608+
flow = feq + n;
609+
fup = flow + n;
611610

612611
x0 = nlp->x0;
612+
f0 = nlp->f0;
613613
x1 = NV_DATA_S(x);
614614
xlow = x1 + n;
615-
xup = xlow + N*n;
616-
617-
for(i = 0;i<n;i++)
618-
feq[i] = derx[i];
615+
xup = xlow + n;
619616

620617
refreshModell(data, x1,t0 + h);
621618
for(i = 0;i<n;i++)
622619
{
623-
feq[i] = x0[i] - x1[i] + 0.5*h*(derx[i]+feq[i]);
620+
feq[i] = x0[i] - x1[i] + 0.5*h*(f0[i]+derx[i]);
624621
flow[i] = xlow[i] - x1[i] + lb[i];
625622
fup[i] = xup[i] - x1[i] + ub[i];
626623
}
@@ -641,7 +638,7 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
641638
double* lb = nlp->min;
642639
double* ub = nlp->max;
643640

644-
double *x0, *x1, *x2;
641+
double *x0, *x1, *x2, *f0;
645642
int n = nlp->nStates;
646643
double* xlow, *xup;
647644
double*derx = nlp->derx;
@@ -653,21 +650,17 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
653650
flow = feq + N*n;
654651
fup = flow + N*n;
655652

653+
f0 = nlp->f0;
656654
x0 = nlp->x0;
657655
x1 = NV_DATA_S(x);
658656
x2 = x1 + n;
659657
xlow = x2 + n;
660658
xup = xlow + N*n;
661-
for(i = 0;i<n;i++)
662-
{
663-
feq[i] = derx[i];
664-
feq[i+n] = derx[i];
665-
}
666659

667660
refreshModell(data, x1,t0 + 0.5*h);
668661
for(i = 0;i<n;i++)
669662
{
670-
feq[i] = (h*(2.0*derx[i] +feq[i]) + 5.0*x0[i]) - (4*x1[i] + x2[i]);
663+
feq[i] = (h*(2.0*derx[i] +f0[i]) + 5.0*x0[i]) - (4*x1[i] + x2[i]);
671664
flow[i] = xlow[i] - x1[i] + lb[i];
672665
fup[i] = xup[i] - x1[i] + ub[i];
673666
}
@@ -676,7 +669,7 @@ int lobatto4Res(N_Vector x, N_Vector f, void* user_data)
676669
for(i = 0;i<n;i++)
677670
{
678671
sub2 = i + n;
679-
feq[sub2] = (2.0*h*derx[i] + 16.0*x1[i]) - (8.0*(x0[i] + x2[i]) +2.0*h*feq[sub2]);
672+
feq[sub2] = (2.0*h*derx[i] + 16.0*x1[i]) - (8.0*(x0[i] + x2[i]) +2.0*h*f0[i]);
680673
flow[sub2] = xlow[sub2] - x2[i] + lb[i];
681674
fup[sub2] = xup[sub2] - x2[i] + ub[i];
682675
}
@@ -697,7 +690,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
697690
double* lb = nlp->min;
698691
double* ub = nlp->max;
699692

700-
double *x0, *x1, *x2, *x3;
693+
double *x0, *x1, *x2, *x3, *f0;
701694
int n = nlp->nStates;
702695
double* xlow, *xup;
703696
double*derx = nlp->derx;
@@ -709,24 +702,19 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
709702
flow = feq + N*n;
710703
fup = flow + N*n;
711704

705+
f0 = nlp->f0;
712706
x0 = nlp->x0;
713707
x1 = NV_DATA_S(x);
714708
x2 = x1 + n;
715709
x3 = x2 + n;
716710

717711
xlow = x3 + n;
718712
xup = xlow + N*n;
719-
for(i = 0;i<n;i++)
720-
{
721-
feq[i] = derx[i];
722-
feq[i+n] = derx[i];
723-
feq[i+2*n] = derx[i];
724-
}
725713

726714
refreshModell(data, x1,t0 + nlp->a[0]*h);
727715
for(i = 0;i<n;i++)
728716
{
729-
feq[i] = (h*(derx[i] + nlp->c[0][4]*feq[i]) + nlp->c[0][0]*x0[i] + nlp->c[0][3]*x3[i]) - (nlp->c[0][1]*x1[i] + nlp->c[0][3]*x3[i]);
717+
feq[i] = (h*(derx[i] + nlp->c[0][4]*f0[i]) + nlp->c[0][0]*x0[i] + nlp->c[0][3]*x3[i]) - (nlp->c[0][1]*x1[i] + nlp->c[0][3]*x3[i]);
730718
flow[i] = xlow[i] - x1[i] + lb[i];
731719
fup[i] = xup[i] - x1[i] + ub[i];
732720
}
@@ -735,7 +723,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
735723
for(i = 0;i<n;i++)
736724
{
737725
sub2 = i + n;
738-
feq[sub2] = (h*derx[i] + nlp->c[1][1]*x1[i]) - (h*nlp->c[1][4]*feq[sub2] + nlp->c[1][0]*x0[i] + nlp->c[1][2]*x2[i] + nlp->c[1][3]*x3[i]);
726+
feq[sub2] = (h*derx[i] + nlp->c[1][1]*x1[i]) - (h*nlp->c[1][4]*f0[i] + nlp->c[1][0]*x0[i] + nlp->c[1][2]*x2[i] + nlp->c[1][3]*x3[i]);
739727
flow[sub2] = xlow[sub2] - x2[i] + lb[i];
740728
fup[sub2] = xup[sub2] - x2[i] + ub[i];
741729
}
@@ -744,7 +732,7 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
744732
for(i = 0;i<n;i++)
745733
{
746734
sub2 = i + 2*n;
747-
feq[sub2] = (h*(feq[sub2] + derx[i]) + nlp->c[2][0]*x0[i] + nlp->c[2][2]*x2[i]) - (nlp->c[2][1]*x1[i] + nlp->c[2][3]*x3[i]);
735+
feq[sub2] = (h*(f0[i] + derx[i]) + nlp->c[2][0]*x0[i] + nlp->c[2][2]*x2[i]) - (nlp->c[2][1]*x1[i] + nlp->c[2][3]*x3[i]);
748736
flow[sub2] = xlow[sub2] - x3[i] + lb[i];
749737
fup[sub2] = xup[sub2] - x3[i] + ub[i];
750738
}
@@ -755,7 +743,6 @@ int lobatto6Res(N_Vector x, N_Vector f, void* user_data)
755743

756744
int kinsolOde(void* ode)
757745
{
758-
int retValue;
759746
KINODE *kinOde = (KINODE*) ode;
760747
KDATAODE *kData = kinOde->kData;
761748
NLPODE *nlp = kinOde->nlp;
@@ -773,10 +760,9 @@ int kinsolOde(void* ode)
773760
kData->glstr, /* global stragegy choice */
774761
kData->sVars, /* scaling vector, for the variable cc */
775762
kData->sEqns );
776-
retValue = kData->error_code;
777-
}while(retValue < 0 && (++kData->glstr) <= KIN_LINESEARCH);
763+
}while(kData->error_code < 0 && (++kData->glstr) <= KIN_LINESEARCH);
778764
refreshModell(kinOde->data, NV_DATA_S(kData->x) + (N-1)*nlp->nStates, nlp->t0 + (nlp->dt));
779-
return retValue;
765+
return kData->error_code;
780766
}
781767
#else
782768

SimulationRuntime/c/simulation/solver/radau.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868

6969
typedef struct{
7070
double *x0;
71+
double *f0;
7172
double *x;
7273
int nStates;
7374
double dt;

0 commit comments

Comments
 (0)