DgemmThreadCh.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;
import org.mklab.sdpj.gpack.blaswrap.DgemmThread.Trans;


/**
 * @author koga
 * @version $Revision$, 2009/04/24
 * @param <RS> 実スカラーの型
 * @param <RM> 実行列の型
 * @param <CS> 複素スカラーの型
 * @param <CM> 複素行列の型
 */
public class DgemmThreadCh<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 Trans ch;
  /** */
  private int m2;
  /** */
  private int n;
  /** */
  private int k;
  /** */
  private int lda;
  /** */
  private int ldb;
  /** */
  private int ldc;

  /** */
  private RS alpha;
  /** */
  private RS beta;
  /** */
  private RS[] A;
  /** */
  private RS[] B;
  /** */
  private RS[] C;

  /**
   * 新しく生成された<code>DgemmThreadCh</code>オブジェクトを初期化します。
   * 
   * @param ch ch
   * @param m m
   * @param n n
   * @param k k
   * @param alpha alpha
   * @param a a
   * @param lda lda
   * @param b b
   * @param ldb ldb
   * @param beta beta
   * @param c c
   * @param ldc ldc
   */
  public DgemmThreadCh(Trans ch, int m, int n, int k, RS alpha, RS[] a, int lda, RS[] b, int ldb, RS beta, RS[] c, int ldc) {
    this.ch = ch;
    this.m2 = m;
    this.n = n;
    this.k = k;
    this.alpha = alpha;
    this.beta = beta;
    this.A = a;
    this.lda = lda;
    this.ldb = ldb;
    this.ldc = ldc;
    this.B = b;
    this.C = c;
  }

  /**
   * @see java.lang.Runnable#run()
   */
  @Override
  public void run() {
    // new Dgemm().dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c__, ldc)
    for (int i = 0; i < this.m2; i++) {
      for (int j = 0; j < this.n; j++) {
        RS temp = this.A[0].createZero();
        for (int indexk = 0; indexk < this.k; indexk++) {
          if (this.ch == Trans.NN) {
            temp = temp.add(this.A[i + indexk * this.lda].multiply(this.B[indexk + j * this.ldb]));
          } else if (this.ch == Trans.NT) {
            temp = temp.add(this.A[i + indexk * this.lda].multiply(this.B[j + indexk * this.ldb]));
          } else if (this.ch == Trans.TN) {
            temp = temp.add(this.A[indexk + i * this.lda].multiply(this.B[indexk + j * this.ldb]));
          } else if (this.ch == Trans.TT) {
            temp = temp.add(this.A[indexk + i * this.lda].multiply(this.B[j + indexk * this.ldb]));
          }
        }
        this.C[i + j * this.ldc] = (this.beta.multiply(this.C[i + j * this.ldc])).add(this.alpha.multiply(temp));
      }
    }
  }
}