dsygs2 function

void dsygs2(
  1. int ITYPE,
  2. String UPLO,
  3. int N,
  4. Matrix<double> A_,
  5. int LDA,
  6. Matrix<double> B_,
  7. int LDB,
  8. Box<int> INFO,
)

Implementation

void dsygs2(
  final int ITYPE,
  final String UPLO,
  final int N,
  final Matrix<double> A_,
  final int LDA,
  final Matrix<double> B_,
  final int LDB,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final B = B_.having(ld: LDB);
  const ONE = 1.0, HALF = 0.5;
  bool UPPER;
  int K;
  double AKK, BKK, CT;

  // Test the input parameters.

  INFO.value = 0;
  UPPER = lsame(UPLO, 'U');
  if (ITYPE < 1 || ITYPE > 3) {
    INFO.value = -1;
  } else if (!UPPER && !lsame(UPLO, 'L')) {
    INFO.value = -2;
  } else if (N < 0) {
    INFO.value = -3;
  } else if (LDA < max(1, N)) {
    INFO.value = -5;
  } else if (LDB < max(1, N)) {
    INFO.value = -7;
  }
  if (INFO.value != 0) {
    xerbla('DSYGS2', -INFO.value);
    return;
  }

  if (ITYPE == 1) {
    if (UPPER) {
      // Compute inv(U**T)*A*inv(U)

      for (K = 1; K <= N; K++) {
        // Update the upper triangle of A(k:n,k:n)

        AKK = A[K][K];
        BKK = B[K][K];
        AKK /= pow(BKK, 2);
        A[K][K] = AKK;
        if (K < N) {
          dscal(N - K, ONE / BKK, A(K, K + 1).asArray(), LDA);
          CT = -HALF * AKK;
          daxpy(N - K, CT, B(K, K + 1).asArray(), LDB, A(K, K + 1).asArray(),
              LDA);
          dsyr2(UPLO, N - K, -ONE, A(K, K + 1).asArray(), LDA,
              B(K, K + 1).asArray(), LDB, A(K + 1, K + 1), LDA);
          daxpy(N - K, CT, B(K, K + 1).asArray(), LDB, A(K, K + 1).asArray(),
              LDA);
          dtrsv(UPLO, 'Transpose', 'Non-unit', N - K, B(K + 1, K + 1), LDB,
              A(K, K + 1).asArray(), LDA);
        }
      }
    } else {
      // Compute inv(L)*A*inv(L**T)

      for (K = 1; K <= N; K++) {
        // Update the lower triangle of A(k:n,k:n)

        AKK = A[K][K];
        BKK = B[K][K];
        AKK /= pow(BKK, 2);
        A[K][K] = AKK;
        if (K < N) {
          dscal(N - K, ONE / BKK, A(K + 1, K).asArray(), 1);
          CT = -HALF * AKK;
          daxpy(N - K, CT, B(K + 1, K).asArray(), 1, A(K + 1, K).asArray(), 1);
          dsyr2(UPLO, N - K, -ONE, A(K + 1, K).asArray(), 1,
              B(K + 1, K).asArray(), 1, A(K + 1, K + 1), LDA);
          daxpy(N - K, CT, B(K + 1, K).asArray(), 1, A(K + 1, K).asArray(), 1);
          dtrsv(UPLO, 'No transpose', 'Non-unit', N - K, B(K + 1, K + 1), LDB,
              A(K + 1, K).asArray(), 1);
        }
      }
    }
  } else {
    if (UPPER) {
      // Compute U*A*U**T

      for (K = 1; K <= N; K++) {
        // Update the upper triangle of A(1:k,1:k)

        AKK = A[K][K];
        BKK = B[K][K];
        dtrmv(UPLO, 'No transpose', 'Non-unit', K - 1, B, LDB,
            A(1, K).asArray(), 1);
        CT = HALF * AKK;
        daxpy(K - 1, CT, B(1, K).asArray(), 1, A(1, K).asArray(), 1);
        dsyr2(UPLO, K - 1, ONE, A(1, K).asArray(), 1, B(1, K).asArray(), 1, A,
            LDA);
        daxpy(K - 1, CT, B(1, K).asArray(), 1, A(1, K).asArray(), 1);
        dscal(K - 1, BKK, A(1, K).asArray(), 1);
        A[K][K] = AKK * pow(BKK, 2);
      }
    } else {
      // Compute L**T *A*L

      for (K = 1; K <= N; K++) {
        // Update the lower triangle of A(1:k,1:k)

        AKK = A[K][K];
        BKK = B[K][K];
        dtrmv(UPLO, 'Transpose', 'Non-unit', K - 1, B, LDB, A(K, 1).asArray(),
            LDA);
        CT = HALF * AKK;
        daxpy(K - 1, CT, B(K, 1).asArray(), LDB, A(K, 1).asArray(), LDA);
        dsyr2(UPLO, K - 1, ONE, A(K, 1).asArray(), LDA, B(K, 1).asArray(), LDB,
            A, LDA);
        daxpy(K - 1, CT, B(K, 1).asArray(), LDB, A(K, 1).asArray(), LDA);
        dscal(K - 1, BKK, A(K, 1).asArray(), LDA);
        A[K][K] = AKK * pow(BKK, 2);
      }
    }
  }
}