Skip to content

sdc_newton_subdivide() never attempts MAX_NSUB due to strict < loop bound #3258

@WeiqunZhang

Description

@WeiqunZhang

Summary

The outer retry loop uses while (nsub < MAX_NSUB && ...) with nsub doubling each attempt from 1. This means nsub == MAX_NSUB is never attempted.

Location

  • Source/sdc/sdc_newton_solve.H:254
  • Source/sdc/sdc_newton_solve.H:270

Problem Details

Current logic:

const int MAX_NSUB = 64;
int nsub = 1;
while (nsub < MAX_NSUB && ierr != newton::NEWTON_SUCCESS) {
    ...
    nsub *= 2;
}

Attempt sequence is 1, 2, 4, 8, 16, 32; 64 is skipped.

Impact

  • Solver may report failure one subdivision level earlier than intended.
  • Effective retry budget is lower than configured/documented by MAX_NSUB.

Suggested Patch

Include the maximum configured subdivision in the loop condition:

diff --git a/Source/sdc/sdc_newton_solve.H b/Source/sdc/sdc_newton_solve.H
--- a/Source/sdc/sdc_newton_solve.H
+++ b/Source/sdc/sdc_newton_solve.H
@@
-    while (nsub < MAX_NSUB && ierr != newton::NEWTON_SUCCESS) {
+    while (nsub <= MAX_NSUB && ierr != newton::NEWTON_SUCCESS) {

Prepared by Codex

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions