diff --git a/src/Classic/AbsBeamline/Bend2D.cpp b/src/Classic/AbsBeamline/Bend2D.cpp index ceb2de9a6e992f5eee55f1eb8034dcb7443b8646..87a0f7e5feda0db756a6df481fe24e0fc231979e 100644 --- a/src/Classic/AbsBeamline/Bend2D.cpp +++ b/src/Classic/AbsBeamline/Bend2D.cpp @@ -692,31 +692,22 @@ void Bend2D::findBendStrength() { if (error < tolerance) return; - double fieldStep = estimateFieldAdjustmentStep(actualBendAngle); + double fieldStep = std::copysign(1.0, fieldAmplitude_m) * std::abs(estimateFieldAdjustmentStep(actualBendAngle)); double amplitude1 = fieldAmplitude_m; + double amplitude2 = amplitude1; double bendAngle1 = actualBendAngle; - - double amplitude2 = fieldAmplitude_m + fieldStep; - fieldAmplitude_m = amplitude2; - double bendAngle2 = calculateBendAngle(); - - if (std::abs(bendAngle1) > std::abs(angle_m)) { - while (std::abs(bendAngle2) > std::abs(angle_m)) { - amplitude1 = amplitude2; - bendAngle1 = bendAngle2; - - amplitude2 += fieldStep; - fieldAmplitude_m = amplitude2; - bendAngle2 = calculateBendAngle(); - } - } else { - while (std::abs(bendAngle2) < std::abs(angle_m)) { - amplitude1 = amplitude2; - bendAngle1 = bendAngle2; - - amplitude2 += fieldStep; - fieldAmplitude_m = amplitude2; - bendAngle2 = calculateBendAngle(); + double bendAngle2 = bendAngle1; + + int stepSign = std::abs(bendAngle1) > std::abs(angle_m) ? -1: 1; + while (true) { + amplitude1 = amplitude2; + bendAngle1 = bendAngle2; + + amplitude2 += stepSign * fieldStep; + fieldAmplitude_m = amplitude2; + bendAngle2 = calculateBendAngle(); + if (stepSign * (std::abs(bendAngle2) - std::abs(angle_m)) > 0) { + break; } }