DswapThread.java

package org.mklab.sdpj.gpack.blaswrap;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * @author koga
 * @version $Revision$, 2009/04/24
 * @param <RS> 実スカラーの型
 * @param <RM> 実行列の型
 * @param <CS> 複素スカラーの型
 * @param <CM> 複素行列の型
 */
public class DswapThread<RS extends RealNumericalScalar<RS, RM, CS, CM>, RM extends RealNumericalMatrix<RS, RM, CS, CM>, CS extends ComplexNumericalScalar<RS, RM, CS, CM>, CM extends ComplexNumericalMatrix<RS, RM, CS, CM>> implements Runnable {

  /** */
  private int n;
  /** */
  private RS[] dx;
  /** */
  private RS[] dy;
  /** */
  private int incx;
  /** */
  private int incy;

  /**
   * 新しく生成された<code>DswapThread</code>オブジェクトを初期化します。
   * 
   * @param n n
   * @param dx dx
   * @param incx incx
   * @param dy dy
   * @param incy incy
   */
  public DswapThread(int n, RS[] dx, int incx, RS[] dy, int incy) {
    this.n = n;
    this.dx = dx;
    this.incx = incx;
    this.incy = incy;
    this.dy = dy;
  }

  /**
   * 新しく生成された<code>DswapThread</code>オブジェクトを初期化します。
   */
  public DswapThread() {
    //nothing to do 
  }

  /**
   * @param n n
   * @param dx dx
   * @param incx incx
   * @param dy dy
   * @param incy incy
   */
  void dswapTh(int n, RS[] dx, int incx, RS[] dy, int incy) {
    int n2 = n / 2;
    Thread subThread = new Thread(new DswapThread<>(n2, dx, incx, dy, incy));
    subThread.start();

    int ix = 0;
    int iy = 0;
    if (incx < 0) {
      ix = (-n + 1) * incx;
    }
    if (incy < 0) {
      iy = (-n + 1) * incy;
    }

    ix += incx * n2;
    iy += incy * n2;
    for (int i = n2; i < n; i++) {
      RS tmp = dx[ix];
      dx[ix] = dy[iy];
      dy[iy] = tmp;
      ix = ix + incx;
      iy = iy + incy;
    }
  }

  /**
   * @see java.lang.Runnable#run()
   */
  @Override
  public void run() {
    this.swap(this.n, this.dx, this.incx, this.dy, this.incy);
  }

  /**
   * @param n n
   * @param dx dx
   * @param incx incx
   * @param dy dy
   * @param incy incy
   */
  private void swap(int n, RS[] dx, int incx, RS[] dy, int incy) {
    int ix = 0;
    int iy = 0;
    if (incx < 0) {
      ix = (-n + 1) * incx;
    }
    if (incy < 0) {
      iy = (-n + 1) * incy;
    }

    for (int i = 0; i < n; i++) {
      RS tmp = dx[ix];
      dx[ix] = dy[iy];
      dy[iy] = tmp;

      ix = ix + incx;
      iy = iy + incy;
    }
  }
}