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;
}
}
}