Skip to content

Commit ec3d002

Browse files
author
Willi Braun
committed
- bug fixing non-linear solver
(updated 2 fluid models as they began to work) git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@16022 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 6274b01 commit ec3d002

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

SimulationRuntime/c/simulation/solver/nonlinearSolverHybrd.c

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ static int getNumericalJacobian(DATA* data, double* jac, double* x, double* f)
241241
{
242242
delta_hhh = solverData->epsfcn * f[i];
243243
delta_hh = fmax(delta_h * fmax(abs(x[i]), abs(delta_hhh)), delta_h);
244+
delta_hh = ((f[i] >= 0) ? delta_hh : -delta_hh);
244245
delta_hh = x[i] + delta_hh - x[i];
245246
deltaInv = 1. / delta_hh;
246247
xsave = x[i];
@@ -414,9 +415,9 @@ int solveHybrd(DATA *data, int sysNumber)
414415
INDENT(LOG_NLS);
415416
for(i=0; i<solverData->n; i++)
416417
{
417-
INFO2(LOG_NLS, "x[%d] = %g", i, systemData->nlsx[i]);
418+
INFO2(LOG_NLS, "x[%d] = %f", i, systemData->nlsx[i]);
418419
INDENT(LOG_NLS);
419-
INFO3(LOG_NLS, "scaling = %g\nold = %g\nextrapolated = %g",
420+
INFO3(LOG_NLS, "scaling = %f\nold = %f\nextrapolated = %f",
420421
systemData->nominal[i], systemData->nlsxOld[i], systemData->nlsxExtrapolation[i]);
421422
RELEASE(LOG_NLS);
422423
}
@@ -429,10 +430,8 @@ int solveHybrd(DATA *data, int sysNumber)
429430
else
430431
memcpy(solverData->x, systemData->nlsxExtrapolation, solverData->n*(sizeof(double)));
431432

432-
for(i=0; i<solverData->n; i++){
433-
solverData->xScalefactors[i] = fmax(solverData->x[i], systemData->nominal[i]);
434-
}
435-
433+
for(i=0; i<solverData->n; i++)
434+
solverData->xScalefactors[i] = fmax(fabs(solverData->x[i]), systemData->nominal[i]);
436435

437436
/* evaluate with discontinuities */
438437
{
@@ -448,9 +447,13 @@ int solveHybrd(DATA *data, int sysNumber)
448447
/* start solving loop */
449448
while(!giveUp && !success)
450449
{
450+
451451
/* debug output */
452452
if(ACTIVE_STREAM(LOG_NLS_V))
453+
{
454+
printVector(solverData->xScalefactors, &(solverData->n), LOG_NLS_V, "scaling factors x vector");
453455
printVector(solverData->x, &(solverData->n), LOG_NLS_V, "Iteration variable values");
456+
}
454457

455458
/* Scaling x vector */
456459
if(solverData->useXScaling)
@@ -622,8 +625,15 @@ int solveHybrd(DATA *data, int sysNumber)
622625
{
623626
/* try old values as x-Scaling factors */
624627

628+
/* set x vector */
629+
if(data->simulationInfo.discreteCall)
630+
memcpy(solverData->x, systemData->nlsx, solverData->n*(sizeof(double)));
631+
else
632+
memcpy(solverData->x, systemData->nlsxExtrapolation, solverData->n*(sizeof(double)));
633+
634+
625635
for(i=0; i<solverData->n; i++)
626-
solverData->xScalefactors[i] = fmax(systemData->nlsxOld[i], systemData->nominal[i]);
636+
solverData->xScalefactors[i] = fmax(fabs(systemData->nlsxOld[i]), systemData->nominal[i]);
627637

628638
retries++;
629639
giveUp = 0;
@@ -638,11 +648,20 @@ int solveHybrd(DATA *data, int sysNumber)
638648
{
639649
/* try to disable x-Scaling */
640650

651+
/* set x vector */
652+
if(data->simulationInfo.discreteCall)
653+
memcpy(solverData->x, systemData->nlsx, solverData->n*(sizeof(double)));
654+
else
655+
memcpy(solverData->x, systemData->nlsxExtrapolation, solverData->n*(sizeof(double)));
656+
641657
int scaling = solverData->useXScaling;
642658
if(scaling)
643659
solverData->useXScaling = 0;
644660

645-
memcpy(solverData->xScalefactors, systemData->nominal, solverData->n*(sizeof(double)));
661+
/* reset x-scalling factors */
662+
for(i=0; i<solverData->n; i++)
663+
solverData->xScalefactors[i] = fmax(fabs(solverData->x[i]), systemData->nominal[i]);
664+
646665
retries++;
647666
giveUp = 0;
648667
nfunc_evals += solverData->nfev;
@@ -677,6 +696,10 @@ int solveHybrd(DATA *data, int sysNumber)
677696
/* set x vector */
678697
memcpy(solverData->x, systemData->nlsxOld, solverData->n*(sizeof(double)));
679698

699+
int scaling = solverData->useXScaling;
700+
if(!scaling)
701+
solverData->useXScaling = 1;
702+
680703
continuous = 1;
681704
solverData->factor = initial_factor;
682705

@@ -749,7 +772,7 @@ int solveHybrd(DATA *data, int sysNumber)
749772

750773
for(i = 0; i < solverData->n; i++) {
751774
solverData->diag[i] = fabs(solverData->resScaling[i]);
752-
if(solverData->diag[i] <= 0)
775+
if(solverData->diag[i] <= 1e-16)
753776
solverData->diag[i] = 1e-16;
754777
}
755778
retries = 0;
@@ -762,7 +785,7 @@ int solveHybrd(DATA *data, int sysNumber)
762785
printStatus(solverData, &nfunc_evals, &xerror, &xerror_scaled, LOG_NLS_V);
763786
}
764787
/* try without internal scaling */
765-
} else if((solverData->info == 4 || solverData->info == 5) && retries3 < 2) {
788+
} else if((solverData->info == 4 || solverData->info == 5) && retries3 < 1) {
766789
/* set x vector */
767790
if(data->simulationInfo.discreteCall)
768791
memcpy(solverData->x, systemData->nlsx, solverData->n*(sizeof(double)));
@@ -784,7 +807,7 @@ int solveHybrd(DATA *data, int sysNumber)
784807
printStatus(solverData, &nfunc_evals, &xerror, &xerror_scaled, LOG_NLS_V);
785808
}
786809
/* try to reduce the tolerance a bit */
787-
} else if((solverData->info == 4 || solverData->info == 5) && retries3 < 7) {
810+
} else if((solverData->info == 4 || solverData->info == 5) && retries3 < 6) {
788811
/* set x vector */
789812
if(data->simulationInfo.discreteCall)
790813
memcpy(solverData->x, systemData->nlsx, solverData->n*(sizeof(double)));
@@ -815,7 +838,7 @@ int solveHybrd(DATA *data, int sysNumber)
815838
}
816839
if(ACTIVE_STREAM(LOG_NLS)) {
817840
RELEASE(LOG_NLS);
818-
INFO1(LOG_NLS, "### No Solution! ###\n after %d restarts", retries+retries2+retries3);
841+
INFO1(LOG_NLS, "### No Solution! ###\n after %d restarts", retries*retries2*retries3);
819842
printStatus(solverData, &nfunc_evals, &xerror, &xerror_scaled, LOG_NLS);
820843
}
821844
}

0 commit comments

Comments
 (0)