Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit d3dffea

Browse files
bernhardbachmannOpenModelica-Hudson
authored andcommitted
Improved damping criteria of the newton solver
1 parent e59152f commit d3dffea

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

SimulationRuntime/c/simulation/solver/nonlinearSolverHomotopy.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,8 @@ static int newtonAlgorithm(DATA_HOMOTOPY* solverData, double* x)
12291229
{
12301230
int numberOfIterations = 0 ,i, j, n=solverData->n, m=solverData->m;
12311231
int pos = solverData->n, rank;
1232-
double error_f_sqrd, error_f1_sqrd, error_f2_sqrd, error_f_sqrd_scaled, delta_x_sqrd, delta_x_sqrd_scaled, grad_f;
1232+
double error_f_sqrd, error_f1_sqrd, error_f2_sqrd, error_f_sqrd_scaled, error_f1_sqrd_scaled;
1233+
double delta_x_sqrd, delta_x_sqrd_scaled, grad_f, grad_f_scaled;
12331234
int numberOfSmallSteps = 0;
12341235
double error_f_old = 1e100;
12351236
int countNegativeSteps = 0;
@@ -1258,7 +1259,8 @@ static int newtonAlgorithm(DATA_HOMOTOPY* solverData, double* x)
12581259

12591260
/* calculated error of function values */
12601261
error_f_sqrd = vec2NormSqrd(solverData->n, solverData->f1);
1261-
error_f_sqrd_scaled = error_f_sqrd;
1262+
vecDivScaling(solverData->n, solverData->f1, solverData->resScaling, solverData->fvecScaled);
1263+
error_f_sqrd_scaled = vec2NormSqrd(solverData->n, solverData->fvecScaled);
12621264

12631265
while(1)
12641266
{
@@ -1332,15 +1334,18 @@ static int newtonAlgorithm(DATA_HOMOTOPY* solverData, double* x)
13321334
/* Damping (see Numerical Recipes) */
13331335
/* calculate gradient of quadratic function for damping strategy */
13341336
grad_f = -2.0*error_f_sqrd;
1337+
grad_f_scaled = -2.0*error_f_sqrd_scaled;
13351338
error_f1_sqrd = vec2NormSqrd(solverData->n, solverData->f1);
1339+
vecDivScaling(solverData->n, solverData->f1, solverData->resScaling, solverData->f2);
1340+
error_f1_sqrd_scaled = vec2NormSqrd(solverData->n, solverData->f2);
13361341
debugDouble(LOG_NLS_V,"Need to damp, grad_f = ", grad_f);
13371342
debugDouble(LOG_NLS_V,"Need to damp, error_f = ", sqrt(error_f_sqrd));
1338-
13391343
debugDouble(LOG_NLS_V,"Need to damp this!! lambda1 = ", lambda1);
13401344
debugDouble(LOG_NLS_V,"Need to damp, error_f1 = ", sqrt(error_f1_sqrd));
1341-
13421345
debugDouble(LOG_NLS_V,"Need to damp, forced error = ", error_f_sqrd + alpha*lambda1*grad_f);
1343-
if ((error_f1_sqrd > error_f_sqrd + alpha*lambda1*grad_f) && (error_f_sqrd > 1e-12) && (error_f_sqrd_scaled > 1e-12))
1346+
if ((error_f1_sqrd > error_f_sqrd + alpha*lambda1*grad_f)
1347+
&& (error_f1_sqrd_scaled > error_f_sqrd_scaled + alpha*lambda1*grad_f_scaled)
1348+
&& (error_f_sqrd > 1e-12) && (error_f_sqrd_scaled > 1e-12))
13441349
{
13451350
lambda2 = fmax(-lambda1*lambda1*grad_f/(2*(error_f1_sqrd-error_f_sqrd-lambda1*grad_f)),lambdaMin);
13461351
debugDouble(LOG_NLS_V,"Need to damp this!! lambda2 = ", lambda2);

0 commit comments

Comments
 (0)