ztgsy2 function

void ztgsy2(
  1. String TRANS,
  2. int IJOB,
  3. int M,
  4. int N,
  5. Matrix<Complex> A_,
  6. int LDA,
  7. Matrix<Complex> B_,
  8. int LDB,
  9. Matrix<Complex> C_,
  10. int LDC,
  11. Matrix<Complex> D_,
  12. int LDD,
  13. Matrix<Complex> E_,
  14. int LDE,
  15. Matrix<Complex> F_,
  16. int LDF,
  17. Box<double> SCALE,
  18. Box<double> RDSUM,
  19. Box<double> RDSCAL,
  20. Box<int> INFO,
)

Implementation

void ztgsy2(
  final String TRANS,
  final int IJOB,
  final int M,
  final int N,
  final Matrix<Complex> A_,
  final int LDA,
  final Matrix<Complex> B_,
  final int LDB,
  final Matrix<Complex> C_,
  final int LDC,
  final Matrix<Complex> D_,
  final int LDD,
  final Matrix<Complex> E_,
  final int LDE,
  final Matrix<Complex> F_,
  final int LDF,
  final Box<double> SCALE,
  final Box<double> RDSUM,
  final Box<double> RDSCAL,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final B = B_.having(ld: LDB);
  final C = C_.having(ld: LDC);
  final D = D_.having(ld: LDD);
  final E = E_.having(ld: LDE);
  final F = F_.having(ld: LDF);
  const ZERO = 0.0, ONE = 1.0, LDZ = 2;
  bool NOTRAN;
  int I, J, K;
  Complex ALPHA;
  final IPIV = Array<int>(LDZ), JPIV = Array<int>(LDZ);
  final RHS = Array<Complex>(LDZ), Z = Matrix<Complex>(LDZ, LDZ);
  final SCALOC = Box(0.0);
  final IERR = Box(0);

  // Decode and test input parameters

  INFO.value = 0;
  IERR.value = 0;
  NOTRAN = lsame(TRANS, 'N');
  if (!NOTRAN && !lsame(TRANS, 'C')) {
    INFO.value = -1;
  } else if (NOTRAN) {
    if ((IJOB < 0) || (IJOB > 2)) {
      INFO.value = -2;
    }
  }
  if (INFO.value == 0) {
    if (M <= 0) {
      INFO.value = -3;
    } else if (N <= 0) {
      INFO.value = -4;
    } else if (LDA < max(1, M)) {
      INFO.value = -6;
    } else if (LDB < max(1, N)) {
      INFO.value = -8;
    } else if (LDC < max(1, M)) {
      INFO.value = -10;
    } else if (LDD < max(1, M)) {
      INFO.value = -12;
    } else if (LDE < max(1, N)) {
      INFO.value = -14;
    } else if (LDF < max(1, M)) {
      INFO.value = -16;
    }
  }
  if (INFO.value != 0) {
    xerbla('ZTGSY2', -INFO.value);
    return;
  }

  if (NOTRAN) {
    // Solve (I, J) - system
    //    A(I, I) * R(I, J) - L(I, J) * B(J, J) = C(I, J)
    //    D(I, I) * R(I, J) - L(I, J) * E(J, J) = F(I, J)
    // for I = M, M - 1, ..., 1; J = 1, 2, ..., N

    SCALE.value = ONE;
    SCALOC.value = ONE;
    for (J = 1; J <= N; J++) {
      for (I = M; I >= 1; I--) {
        // Build 2 by 2 system

        Z[1][1] = A[I][I];
        Z[2][1] = D[I][I];
        Z[1][2] = -B[J][J];
        Z[2][2] = -E[J][J];

        // Set up right hand side(s)

        RHS[1] = C[I][J];
        RHS[2] = F[I][J];

        // Solve Z * x = RHS

        zgetc2(LDZ, Z, LDZ, IPIV, JPIV, IERR);
        if (IERR.value > 0) INFO.value = IERR.value;
        if (IJOB == 0) {
          zgesc2(LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC);
          if (SCALOC.value != ONE) {
            for (K = 1; K <= N; K++) {
              zscal(M, Complex(SCALOC.value, ZERO), C(1, K).asArray(), 1);
              zscal(M, Complex(SCALOC.value, ZERO), F(1, K).asArray(), 1);
            }
            SCALE.value *= SCALOC.value;
          }
        } else {
          zlatdf(IJOB, LDZ, Z, LDZ, RHS, RDSUM, RDSCAL, IPIV, JPIV);
        }

        // Unpack solution vector(s)

        C[I][J] = RHS[1];
        F[I][J] = RHS[2];

        // Substitute R(I, J) and L(I, J) into remaining equation.

        if (I > 1) {
          ALPHA = -RHS[1];
          zaxpy(I - 1, ALPHA, A(1, I).asArray(), 1, C(1, J).asArray(), 1);
          zaxpy(I - 1, ALPHA, D(1, I).asArray(), 1, F(1, J).asArray(), 1);
        }
        if (J < N) {
          zaxpy(N - J, RHS[2], B(J, J + 1).asArray(), LDB,
              C(I, J + 1).asArray(), LDC);
          zaxpy(N - J, RHS[2], E(J, J + 1).asArray(), LDE,
              F(I, J + 1).asArray(), LDF);
        }
      }
    }
  } else {
    // Solve transposed (I, J) - system:
    //    A(I, I)**H * R(I, J) + D(I, I)**H * L(J, J) = C(I, J)
    //    R(I, I) * B(J, J) + L(I, J) * E(J, J)   = -F(I, J)
    // for I = 1, 2, ..., M, J = N, N - 1, ..., 1

    SCALE.value = ONE;
    SCALOC.value = ONE;
    for (I = 1; I <= M; I++) {
      for (J = N; J >= 1; J--) {
        // Build 2 by 2 system Z**H

        Z[1][1] = A[I][I].conjugate();
        Z[2][1] = -B[J][J].conjugate();
        Z[1][2] = D[I][I].conjugate();
        Z[2][2] = -E[J][J].conjugate();

        // Set up right hand side(s)

        RHS[1] = C[I][J];
        RHS[2] = F[I][J];

        // Solve Z**H * x = RHS

        zgetc2(LDZ, Z, LDZ, IPIV, JPIV, IERR);
        if (IERR.value > 0) INFO.value = IERR.value;
        zgesc2(LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC);
        if (SCALOC.value != ONE) {
          for (K = 1; K <= N; K++) {
            zscal(M, Complex(SCALOC.value, ZERO), C(1, K).asArray(), 1);
            zscal(M, Complex(SCALOC.value, ZERO), F(1, K).asArray(), 1);
          }
          SCALE.value *= SCALOC.value;
        }

        // Unpack solution vector(s)

        C[I][J] = RHS[1];
        F[I][J] = RHS[2];

        // Substitute R(I, J) and L(I, J) into remaining equation.

        for (K = 1; K <= J - 1; K++) {
          F[I][K] +=
              RHS[1] * B[K][J].conjugate() + RHS[2] * E[K][J].conjugate();
        }
        for (K = I + 1; K <= M; K++) {
          C[K][J] -=
              A[I][K].conjugate() * RHS[1] + D[I][K].conjugate() * RHS[2];
        }
      }
    }
  }
}