DoubleMatrixExportSink.java
/**
* $Id: DoubleMatrixExportSink.java,v 1.15 2008/06/08 04:28:11 koga Exp $
*
* Copyright (C) 2004-2005 Koga Laboratory. All rights reserved.
*/
package org.mklab.tool.control.system.sink;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.nleq.NonLinearEquationSolver;
import org.mklab.nfc.ode.DoubleEquationSolver;
/**
* {@link DoubleMatrix}に入力信号を格納する、信号のエキスポート先を表わすクラスです。
*
* @author koga
* @version $Revision: 1.15 $
*/
public abstract class DoubleMatrixExportSink extends DoubleExportSink {
/** 信号の系列の長さの単位 */
private final int capacityUnit = 1000;
/** 信号の系列の長さ */
private int dataLength = 0;
/** 信号の系列 */
private DoubleMatrix data;
/**
* 新しく生成された<code>DoubleMatrixExportSink</code>オブジェクトを初期化します。
*/
public DoubleMatrixExportSink() {
super();
}
/**
* {@inheritDoc}
*/
@Override
public void initialize() {
this.data = new DoubleMatrix(getInputSize() + 1, this.capacityUnit);
}
/**
* {@inheritDoc}
*/
@Override
public DoubleMatrix outputEquation(final double t, final DoubleMatrix u) {
// 方程式のソルバーが仮の値で計算しているか判定します
final boolean solverTrial = DoubleEquationSolver.isTrial() || NonLinearEquationSolver.isTrial();
if (solverTrial == false) {
if (this.data.getColumnSize() <= this.dataLength) {
this.data = this.data.resize(getInputSize() + 1, this.dataLength + this.capacityUnit);
}
this.data.setElement(1, this.dataLength + 1, t);
int uSize = getInputSize();
this.data.setSubMatrix(2, 2 + uSize - 1, this.dataLength + 1, this.dataLength + 1, u.createClone());
this.dataLength++;
}
return u.createClone();
}
/**
* {@inheritDoc}
*/
@Override
public void open() {
this.dataLength = 0;
this.data = new DoubleMatrix(getInputSize() + 1, this.capacityUnit);
}
/**
* データの長さを返します。
*
* @return データの長さ
*/
public int getDataLength() {
return this.dataLength;
}
/**
* データを返します。
*
* @return データ
*/
public DoubleMatrix getData() {
return this.data.getColumnVectors(1, this.dataLength);
}
}