dlasr function

void dlasr(
  1. String SIDE,
  2. String PIVOT,
  3. String DIRECT,
  4. int M,
  5. int N,
  6. Array<double> C_,
  7. Array<double> S_,
  8. Matrix<double> A_,
  9. int LDA,
)

Implementation

void dlasr(
  final String SIDE,
  final String PIVOT,
  final String DIRECT,
  final int M,
  final int N,
  final Array<double> C_,
  final Array<double> S_,
  final Matrix<double> A_,
  final int LDA,
) {
  final C = C_.having();
  final S = S_.having();
  final A = A_.having(ld: LDA);
  const ONE = 1.0, ZERO = 0.0;
  int I, INFO, J;
  double CTEMP, STEMP, TEMP;

  // Test the input parameters

  INFO = 0;
  if (!(lsame(SIDE, 'L') || lsame(SIDE, 'R'))) {
    INFO = 1;
  } else if (!(lsame(PIVOT, 'V') || lsame(PIVOT, 'T') || lsame(PIVOT, 'B'))) {
    INFO = 2;
  } else if (!(lsame(DIRECT, 'F') || lsame(DIRECT, 'B'))) {
    INFO = 3;
  } else if (M < 0) {
    INFO = 4;
  } else if (N < 0) {
    INFO = 5;
  } else if (LDA < max(1, M)) {
    INFO = 9;
  }
  if (INFO != 0) {
    xerbla('DLASR', INFO);
    return;
  }

  // Quick return if possible

  if ((M == 0) || (N == 0)) return;
  if (lsame(SIDE, 'L')) {
    // Form  P * A

    if (lsame(PIVOT, 'V')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 1; J <= M - 1; J++) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J + 1][I];
              A[J + 1][I] = CTEMP * TEMP - STEMP * A[J][I];
              A[J][I] = STEMP * TEMP + CTEMP * A[J][I];
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = M - 1; J >= 1; J--) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J + 1][I];
              A[J + 1][I] = CTEMP * TEMP - STEMP * A[J][I];
              A[J][I] = STEMP * TEMP + CTEMP * A[J][I];
            }
          }
        }
      }
    } else if (lsame(PIVOT, 'T')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 2; J <= M; J++) {
          CTEMP = C[J - 1];
          STEMP = S[J - 1];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J][I];
              A[J][I] = CTEMP * TEMP - STEMP * A[1][I];
              A[1][I] = STEMP * TEMP + CTEMP * A[1][I];
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = M; J >= 2; J--) {
          CTEMP = C[J - 1];
          STEMP = S[J - 1];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J][I];
              A[J][I] = CTEMP * TEMP - STEMP * A[1][I];
              A[1][I] = STEMP * TEMP + CTEMP * A[1][I];
            }
          }
        }
      }
    } else if (lsame(PIVOT, 'B')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 1; J <= M - 1; J++) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J][I];
              A[J][I] = STEMP * A[M][I] + CTEMP * TEMP;
              A[M][I] = CTEMP * A[M][I] - STEMP * TEMP;
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = M - 1; J >= 1; J--) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= N; I++) {
              TEMP = A[J][I];
              A[J][I] = STEMP * A[M][I] + CTEMP * TEMP;
              A[M][I] = CTEMP * A[M][I] - STEMP * TEMP;
            }
          }
        }
      }
    }
  } else if (lsame(SIDE, 'R')) {
    // Form A * P**T

    if (lsame(PIVOT, 'V')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 1; J <= N - 1; J++) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J + 1];
              A[I][J + 1] = CTEMP * TEMP - STEMP * A[I][J];
              A[I][J] = STEMP * TEMP + CTEMP * A[I][J];
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = N - 1; J >= 1; J--) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J + 1];
              A[I][J + 1] = CTEMP * TEMP - STEMP * A[I][J];
              A[I][J] = STEMP * TEMP + CTEMP * A[I][J];
            }
          }
        }
      }
    } else if (lsame(PIVOT, 'T')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 2; J <= N; J++) {
          CTEMP = C[J - 1];
          STEMP = S[J - 1];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J];
              A[I][J] = CTEMP * TEMP - STEMP * A[I][1];
              A[I][1] = STEMP * TEMP + CTEMP * A[I][1];
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = N; J >= 2; J--) {
          CTEMP = C[J - 1];
          STEMP = S[J - 1];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J];
              A[I][J] = CTEMP * TEMP - STEMP * A[I][1];
              A[I][1] = STEMP * TEMP + CTEMP * A[I][1];
            }
          }
        }
      }
    } else if (lsame(PIVOT, 'B')) {
      if (lsame(DIRECT, 'F')) {
        for (J = 1; J <= N - 1; J++) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J];
              A[I][J] = STEMP * A[I][N] + CTEMP * TEMP;
              A[I][N] = CTEMP * A[I][N] - STEMP * TEMP;
            }
          }
        }
      } else if (lsame(DIRECT, 'B')) {
        for (J = N - 1; J >= 1; J--) {
          CTEMP = C[J];
          STEMP = S[J];
          if ((CTEMP != ONE) || (STEMP != ZERO)) {
            for (I = 1; I <= M; I++) {
              TEMP = A[I][J];
              A[I][J] = STEMP * A[I][N] + CTEMP * TEMP;
              A[I][N] = CTEMP * A[I][N] - STEMP * TEMP;
            }
          }
        }
      }
    }
  }
}