dlaed5 function

void dlaed5(
  1. int I,
  2. Array<double> D_,
  3. Array<double> Z_,
  4. Array<double> DELTA_,
  5. double RHO,
  6. Box<double> DLAM,
)

Implementation

void dlaed5(
  final int I,
  final Array<double> D_,
  final Array<double> Z_,
  final Array<double> DELTA_,
  final double RHO,
  final Box<double> DLAM,
) {
  final D = D_.having();
  final Z = Z_.having();
  final DELTA = DELTA_.having();
  const ZERO = 0.0, ONE = 1.0, TWO = 2.0, FOUR = 4.0;
  double B, C, DEL, TAU, TEMP, W;

  DEL = D[2] - D[1];
  if (I == 1) {
    W = ONE + TWO * RHO * (Z[2] * Z[2] - Z[1] * Z[1]) / DEL;
    if (W > ZERO) {
      B = DEL + RHO * (Z[1] * Z[1] + Z[2] * Z[2]);
      C = RHO * Z[1] * Z[1] * DEL;

      // B > ZERO, always

      TAU = TWO * C / (B + sqrt((B * B - FOUR * C).abs()));
      DLAM.value = D[1] + TAU;
      DELTA[1] = -Z[1] / TAU;
      DELTA[2] = Z[2] / (DEL - TAU);
    } else {
      B = -DEL + RHO * (Z[1] * Z[1] + Z[2] * Z[2]);
      C = RHO * Z[2] * Z[2] * DEL;
      if (B > ZERO) {
        TAU = -TWO * C / (B + sqrt(B * B + FOUR * C));
      } else {
        TAU = (B - sqrt(B * B + FOUR * C)) / TWO;
      }
      DLAM.value = D[2] + TAU;
      DELTA[1] = -Z[1] / (DEL + TAU);
      DELTA[2] = -Z[2] / TAU;
    }
    TEMP = sqrt(DELTA[1] * DELTA[1] + DELTA[2] * DELTA[2]);
    DELTA[1] /= TEMP;
    DELTA[2] /= TEMP;
  } else {
    // Now I=2

    B = -DEL + RHO * (Z[1] * Z[1] + Z[2] * Z[2]);
    C = RHO * Z[2] * Z[2] * DEL;
    if (B > ZERO) {
      TAU = (B + sqrt(B * B + FOUR * C)) / TWO;
    } else {
      TAU = TWO * C / (-B + sqrt(B * B + FOUR * C));
    }
    DLAM.value = D[2] + TAU;
    DELTA[1] = -Z[1] / (DEL + TAU);
    DELTA[2] = -Z[2] / TAU;
    TEMP = sqrt(DELTA[1] * DELTA[1] + DELTA[2] * DELTA[2]);
    DELTA[1] /= TEMP;
    DELTA[2] /= TEMP;
  }
}