next up previous
: この文書について... : 2. 要素モデルの作成例 : 2.3 ヘッダファイル ltank.h

2.4 Ltank の実装 ltank.cc


/* ltank.cc クラス Element_for_test の実装
*/

#include <stdio.h>
#include <time.h>

#include "p_tmp.h"
#include "ltank.h"

// クラス Ltank のメンバ関数の実装.

void Ltank::Save_terminal_state(FILE* fp) {
    if (fp != NULL) {
        fprintf(fp, "%ld %lf", current_time, s);
    }
}

double Ltank::Get_mean_data(void)
{
    double sum = 0., ys;
    time_t t = current_time, te = current_time + time_step, ts;

    // sum: 時刻 current_time から時刻 t までのデータの積分値
    // te:  current_time + time_step
    // ts:  時刻
    // ys:  時刻 ts でのデータ値

    void** data_pack_array;
    int number_of_data_packs, ip;

    // current_time 以後の最初のデータパックを探します。
    rp.Get_data_pack_array(data_pack_array, number_of_data_packs);
    for (ip = 0; ip < number_of_data_packs; ip++) {
        ts = ((Data<double>*) data_pack_array[ip])->Data_time();
        if (ts > current_time) {
            ys = ((Data<double>*) data_pack_array[ip])->Value();
            break;
        }
    }

    // te 以前の折れ線部分の積分値を加算します。
    while (ts < te) {
        sum += 0.5 * (y + ys) * (ts - t);
        t = ts;   y = ys;   ip++;
        ts = ((Data<double>*) data_pack_array[ip])->Data_time();
        ys = ((Data<double>*) data_pack_array[ip])->Value();
    }

    // te までの残りのブロックの積分値を加算します。
    ys = (y*(ts - te) + ys*(te - t))/(ts - t);
    sum += 0.5 * (y + ys) * (te - t);

    // y を更新します。
    y = ys;

    return (sum/time_step);
}


Boolean Ltank::Calculate(void)
{   //  #  Ltank::Calculate(void) (define)

    time_t t0 = current_time;

    double imean = Get_mean_data();

    s = c1 * s + c2 * imean; // 状態量を更新

    double data = alpha * s;
    sp0.Send_data(Next_time(), data); // データの送信
    data = beta  * s;
    sp1.Send_data(Next_time(), data); // データの送信
    return YES;
}

/* end of file */



Michiharu SHIIBA
平成12年10月13日