zlarnv function

void zlarnv(
  1. int IDIST,
  2. Array<int> ISEED_,
  3. int N,
  4. Array<Complex> X_,
)

Implementation

void zlarnv(
  final int IDIST,
  final Array<int> ISEED_,
  final int N,
  final Array<Complex> X_,
) {
  final ISEED = ISEED_.having(length: 4);
  final X = X_.having();
  const ZERO = 0.0, ONE = 1.0, TWO = 2.0;
  const LV = 128;
  const TWOPI = 6.28318530717958647692528676655900576839;
  int I, IL, IV;
  final U = Array<double>(LV);

  for (IV = 1; IV <= N; IV += LV ~/ 2) {
    IL = min(LV ~/ 2, N - IV + 1);

    // Call DLARUV to generate 2*IL real numbers from a uniform (0,1)
    // distribution (2*IL <= LV)

    dlaruv(ISEED, 2 * IL, U);

    if (IDIST == 1) {
      // Copy generated numbers

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = Complex(U[2 * I - 1], U[2 * I]);
      }
    } else if (IDIST == 2) {
      // Convert generated numbers to uniform (-1,1) distribution

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = Complex(TWO * U[2 * I - 1] - ONE, TWO * U[2 * I] - ONE);
      }
    } else if (IDIST == 3) {
      // Convert generated numbers to normal (0,1) distribution

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = sqrt(-TWO * log(U[2 * I - 1])).toComplex() *
            Complex(ZERO, TWOPI * U[2 * I]).exp();
      }
    } else if (IDIST == 4) {
      // Convert generated numbers to complex numbers uniformly
      // distributed on the unit disk

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = sqrt(U[2 * I - 1]).toComplex() *
            Complex(ZERO, TWOPI * U[2 * I]).exp();
      }
    } else if (IDIST == 5) {
      // Convert generated numbers to complex numbers uniformly
      // distributed on the unit circle

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = Complex(ZERO, TWOPI * U[2 * I]).exp();
      }
    }
  }
}