3章 CommonMPの要素モデルを作成する
3.5 計算結果を
他の要素モデルへ送る
3.5.2 要素モデル間の接続方法 ・・・・ 接続線上の伝送情報(その2)
次に、セルに情報を設定したり、セルから情報を取得したりする方法を示します。
実際のセルクラス内は 下のように定義されています。 メンバー変数は public
として定義されているため、直接外部で参照する事が可能です。
public class HySCellData :
(親クラスから派生) { public long m_lDim; public double[] m_dData; }; |
(雑談)
オブジェクト指向では、内部のメンバー変数は原則として public にしないで隠蔽し、内部情報のアクセスにはメンバー関数を介して行う事を説明して来ました。 しかしながら、セルへのアクセス数は オーダーで考えても レコード内セル数×接続線上レコード数×要素モデル数×計算の繰り返し回数 .... と膨大な数になります。 このため、メンバー変数を介した事によるオーバーヘッドのロスを少なくするため、メンバー変数をpublic としています。
以降の説明では、送信要素モデルはセル内に 「流量」、「水位」、「流速」の順に設定し、受信要素モデルは、「流速」、「流量」、「水位」の順に取得する場合を例にとって説明します。(下図)
☆送信データの設定
先に、送信する側は送信する都度レコードを生成する事を説明しました。 実際のコーディング時には、レコードの生成は接続線に依頼します。 依頼して生成したレコード内のセルに対して、送信したい情報を設定します。
「ポイント時系列情報」のレコードの生成と送信データの設定方法
McSendCellDataIF csOutputCellData; // 送信側
接続線のインスタンス(通常は引数で与えられる) HySCellData[ ] csSndCellData; // 生成するレコード内のセル配列(1次元) csSndCellData = csOutputCellData.PrepareSendCellD1(); // ここで、レコード内のセル1次元配列を生成する // 「ポイント時系列情報」の場合には配列数が1個の1次元配列と見なします。 csSndCellData[0].m_dData[0] = 流量値; csSndCellData[0].m_dData[1] = 水位値; csSndCellData[0].m_dData[2] = 流速値; |
「ポイント時系列情報」の場合には 配列数1個の 1次元配列と見なします。
「1次元配列時系列情報」のレコードの生成と送信データの設定方法
McSendCellDataIF csOutputCellData; // 送信側
接続線のインスタンス(通常は引数で与えられる) HySCellData[ ] csSndCellData; // 生成するレコード内のセル配列(1次元) csSndCellData = csOutputCellData.PrepareSendCellD1(); // ここで、レコード内のセル1次元配列を生成する // 3番目のセルに情報を設定する場合の例 csSndCellData[2].m_dData[0] = 流量値; csSndCellData[2].m_dData[1] = 水位値; csSndCellData[2].m_dData[2] = 流速値; |
「2次元配列時系列情報」のレコードの生成と送信データの設定方法
McSendCellDataIF csOutputCellData; // 送信側
接続線のインスタンス(通常は引数で与えられる) HySCellData[ , ] csSndCellData; // 生成するレコード内のセル配列(2次元) csSndCellData = csOutputCellData.PrepareSendCellD2(); // ここで、レコード内のセル2次元配列を生成する // [2,4]番目のセルに情報を設定する場合の例 csSndCellData[1 , 3].m_dData[0] = 流量値; csSndCellData[1 , 3].m_dData[1] = 水位値; csSndCellData[1 , 3].m_dData[2] = 流速値; |
「3次元配列時系列情報」のレコードの生成と送信データの設定方法
McSendCellDataIF csOutputCellData; // 送信側
接続線のインスタンス(通常は引数で与えられる) HySCellData[ , , ] csSndCellData; // 生成するレコード内のセル配列(3次元) csSndCellData = csOutputCellData.PrepareSendCellD3(); // ここで、レコード内のセル3次元配列を生成する // [2,4,3]番目のセルに情報を設定する場合の例 csSndCellData[1 , 3, 2].m_dData[0] = 流量値; csSndCellData[1 , 3, 2].m_dData[1] = 水位値; csSndCellData[1 , 3, 2].m_dData[2] = 流速値; |
☆受信データの取得
受信側要素モデルでは、 指定した時刻のレコード内のセルを取得し、『接続の対応表』を用いて所定の情報を取得します。 『接続の対応表』は、HySCellDataGetter
クラスが対応し、受信側の接続線からそのインスタンスを取得します。
「ポイント時系列情報」のレコードとセル内の受信情報取得方法
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 long lReadIdxV = csGetter.GetIdx(0); // 受信側は 0番目が流速と認識している (対応表によりセル内位置を取得) long lReadIdxQ = csGetter.GetIdx(1); // 受信側は 1番目が流量と認識している (対応表によりセル内位置を取得) long lReadIdxH = csGetter.GetIdx(2); // 受信側は 2番目が水位と認識している (対応表によりセル内位置を取得) HySCellData csRcvCellData = csInputCellData.GetInterpolatedCell(0); // セル取得(1次元配列の最初のセルと見なします) 流速値 = csRcvCellData.m_dData[ lReadIdxV ]; 流量値 = csRcvCellData.m_dData[ lReadIdxQ ]; 水位値 = csRcvCellData.m_dData[ lReadIdxH ]; |
「1次元配列時系列情報」のレコードとセル内の受信情報取得方法 (特定のセル情報だけを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 long lReadIdxV = csGetter.GetIdx(0); // 受信側は 0番目が流速と認識している (対応表によりセル内位置を取得) long lReadIdxQ = csGetter.GetIdx(1); // 受信側は 1番目が流量と認識している (対応表によりセル内位置を取得) long lReadIdxH = csGetter.GetIdx(2); // 受信側は 2番目が水位と認識している (対応表によりセル内位置を取得) HySCellData csRcvCellData = csInputCellData.GetInterpolatedCell(2); // セル取得(配列の3番目のセルを取得する) 流速値 = csRcvCellData.m_dData[ lReadIdxV ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellData.m_dData[ lReadIdxQ ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellData.m_dData[ lReadIdxH ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
「1次元配列時系列情報」のレコードとセル内の受信情報取得方法 (配列全てを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 long lReadIdxV = csGetter.GetIdx(0); // 受信側は 0番目が流速と認識している (対応表によりセル内位置を取得) long lReadIdxQ = csGetter.GetIdx(1); // 受信側は 1番目が流量と認識している (対応表によりセル内位置を取得) long lReadIdxH = csGetter.GetIdx(2); // 受信側は 2番目が水位と認識している (対応表によりセル内位置を取得) HySCellData[ ] csRcvCellDataD1 = csInputCellData.GetInterpolatedCellD1(); // セルの1次元配列を全て取得する // セル配列の3番目のセル情報を取得する場合 流速値 = csRcvCellDataD1[2].m_dData[ lReadIdxV ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellDataD1[2].m_dData[ lReadIdxQ ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellDataD1[2].m_dData[ lReadIdxH ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
2次元、3次元の場合にも1次元の場合とほぼ同様に処理を行います。
「2次元配列時系列情報」のレコードとセル内の受信情報取得方法 (特定のセル情報だけを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 HySCellData csRcvCellData = csInputCellData.GetInterpolatedCell(2,4); // セル取得(2次元配列の[3,5]のセルを取得する) 流速値 = csRcvCellData.m_dData[ csGetter..GetIdx(0) ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellData.m_dData[ csGetter..GetIdx(1) ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellData.m_dData[ csGetter..GetIdx(2) ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
「2次元配列時系列情報」のレコードとセル内の受信情報取得方法 (配列全てを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 HySCellData[ , ] csRcvCellDataD2 = csInputCellData.GetInterpolatedCellD2(); // セルの2次元配列を全て取得する // 2次元配列の[3,5]のセル情報を取得する場合 流速値 = csRcvCellDataD2[2,4].m_dData[ csGetter..GetIdx(0) ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellDataD2[2,4].m_dData[ csGetter..GetIdx(1) ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellDataD2[2,4].m_dData[ csGetter..GetIdx(2) ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
「3次元配列時系列情報」のレコードとセル内の受信情報取得方法 (特定のセル情報だけを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 HySCellData csRcvCellData = csInputCellData.GetInterpolatedCell(2,4,0); // セル取得(2次元配列の[3,5,1]のセルを取得する) 流速値 = csRcvCellData.m_dData[ csGetter..GetIdx(0) ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellData.m_dData[ csGetter..GetIdx(1) ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellData.m_dData[ csGetter..GetIdx(2) ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
「3次元配列時系列情報」のレコードとセル内の受信情報取得方法 (配列全てを取得する場合)
McReceiveCellDataIF csInputCellData; // 受信側
接続線のインスタンス(通常は引数で与えられる) HySCellDataGetter csGetter = csInputCellData[lLp].GetCellDataGetter(); // 接続の対応表の取得 HySCellData[ , , ] csRcvCellDataD3 = csInputCellData.GetInterpolatedCellD3(); // セルの3次元配列を全て取得する // 2次元配列の[3,5,1]のセル情報を取得する場合 流速値 = csRcvCellDataD3[2,4,0].m_dData[ csGetter..GetIdx(0) ]; // 受信側は 0番目が流速と認識している (対応表を介して取得) 流量値 = csRcvCellDataD3[2,4,0].m_dData[ csGetter..GetIdx(1) ]; // 受信側は 1番目が流量と認識している (対応表を介して取得) 水位値 = csRcvCellDataD3[2,4,0].m_dData[ csGetter..GetIdx(2) ]; // 受信側は 2番目が水位と認識している (対応表を介して取得) |
☆特定のセル取得と セル配列全体取得の違い
1次元、2次元、3次元のセルを取得する場合には 上記に示したように「特定のセルだけを取得する」方法と、「配列全てを取得する」方法があります。この使い分けは次のように考えて行います。
先に、受信側の要素モデルが欲しい時刻ピッタリのレコードが存在しない時には、内挿した情報が取得できる事を説明しました。 「特定のセルだけを取得する」場合には、取得するセルだけに内挿処理を行います。 一方、「配列全てを取得する」場合には、全てのセルに対して内挿処理が行われます。 したがって、受信側の要素モデルが受信したセルの一部の情報だけを使用する場合には、「特定のセルだけを取得する」方法を使用した方が計算の負荷を考えると有利です。 一方、セルほとんどの情報を使用する場合には、一括して内挿処理が行われる「配列全てを取得する」方法が便利です。
初版:2013/06/23 |