(前頁)<<      >>(次頁)          (Up)

6章 再び要素モデルの作成
6.2 色々な要素モデル
堰モデル


 堰の流量の公式(JIS B 8302-1990)を用いて、流入量:Qin がある時の越流水位:hを求める要素モデルを作成します。

 
    

  Qin = Qout   ・・・・・・・・・・・・・・@
 Qout = K*b*h^(3/2)  ・・・・・・・A
  ここに、K = 107.1 + (0.177/h) + 14.2*(h/D) - 25.7*((B-b)*h/(D*B))^(1/2) + 2.04*(B/D)^(1/2)

  堰が蓄える水量は比較的小さく 20分以内(要素モデルの儺を1200 秒)に 流入量と流出量が同じになるとします。
 ここで制作する要素モデルは この時の 越流水位:h の値を求めます。


 要素モデルは、流入量に対して、定常状態となった時の越流水位を求めるので、現況計算型(McStateCalModelBase)を用います。
 また、上記の@、Aを解くために、ニュートン法を用います。

 これまで要素モデルを作成したと同様に堰モデルの種別と名称のディファイン値をMyExerciseModelDefineクラス内に定義します。
 

    public class MyExerciseModelDefine
    {
         。。。。。。。。。。。。。

        /// <summary>演習:堰モデル種別</summary>
        public static readonly HySObjectKind MY_SLUICE_MODEL_KIND = new HySObjectKind("MySluice");
        /// <summary>演習:堰モデル名称</summary>
        public static readonly HySString MY_SLUICE_MODEL_NAME = new HySString("演習:堰モデル");


        /// <summary>流入 m3/sec </summary>
        public static readonly HySID IN_PATTERN_Q = new HySID("Q_IN");
        /// <summary>流出 m3/sec </summary>
        public static readonly HySID OUT_PATTERN_Q = new HySID("Q_OUT");


 これまでと同様に、スタブの制作とその内部の実装を行います。 
 要素モデルの制作手順を整理すると


<スタブ作成>
(1)型紙(MyHydrologicalModel、MyHydrologicalCalInfo)をコピーして要素モデルクラスと演算データクラスファイルを作成します。
(2)コピーして作成した2つのファイルを プロジェクトに追加します。
(3)追加した2つのファイルを開き namespace 名称を DLLの namespace 名に一致させます。
(4)要素モデルクラスと演算データクラスの名称を変更します。 
(5)ファクトリークラスの下記メソッドに 新しい要素モデルに関連するクラスのインスタンス生成処理を追加します。
  @CreateCalModel メソッド
  ACreateCalInfo メソッド
  BCreateModelProperty メソッド
  CCreateModelInitialInfo メソッド
  DGetCalModelInfoList メソッド

<演算データクラス内メソッドの実装>
(6)メンバー変数追加
(7)CopyInfo メソッド実装

<要素モデルクラス内メソッドの実装>
(8)プロパティ設定、チェックメソッドの実装
   @SetProperty メソッド
   AReceiveConnectionCheck、SendConnectionCheck メソッド
(9)初期化(Initialize) メソッドの実装
(10)計算に必要なメソッド実装
   @Calculate メソッド
   ADataFusion メソッド

 となります。

 
 新しく作成するクラスは型紙クラスをコピーして作成します。
    MyHydraulicsModel.cs  → MyTankModel.cs
    MyHydraulicsCalInfo.cs → MyTankCalInfo.cs
 
 作成したソースをプロジェクトに追加し、ネームスペースとクラス名を変更します。
 
namespace CommonMP.HYMCO.OptionImpl.MyExerciseModelLIB
{
    public class MySluiceModel : McStateCalModelBase
    {
      

namespace CommonMP.HYMCO.OptionImpl.MyExerciseModelLIB
{
    public class MySluiceCalInfo : McCalInfo
    {
      


  ファクトリークラス内の各メソッドに 関連するインスタンスを生成する処理を追加します。

    public class MyExerciseModelFactory : McBasicModelFactoryBase
    {
        public override McCalModel CreateCalModel(HySObjectKind csModelKind)
        {
        。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_SLUICE_MODEL_KIND) == true)
            {
                csCalModel = new MySluiceModel();
            }
      。。。。。。。
        public override McCalInfo CreateCalInfo(HySObjectKind csModelKind)
        {
      。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_SLUICE_MODEL_KIND) == true)
            {
                csCalInfoData = new MySluiceCalInfo();
            }
      。。。。。。。。
        public override McCellModelPropertyIF CreateModelProperty(HySID csLibraryID, HySObjectKind csModelKind)
        {
      。。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_SLUICE_MODEL_KIND) == true)
            {
                csRtnCellPrptyDt = new McCellModelPropertyInfo(csLibraryID, csModelKind);
      。。。。。。。。
        public override McPropertyInfoRoot CreateModelInitialInfo(HySID csLibraryID, HySObjectKind csModelKind)
        {
      。。。。。。。。
            else if (csModelKind.Equals(MyExerciseModelDefine.MY_SLUICE_MODEL_KIND) == true)
            {
                csRtnDt = new McInitialInfo(csLibraryID, csModelKind);
      。。。。。。。。。
        public override HySDataLinkedList GetCalModelInfoList()
        {
            McModelInfo csModelInfo=null;
      。。。。。。。。。
            csModelInfo = new McModelInfo(
                (HySID)this.GetFactoryID(),
                McModelLibraryDefine.DIVISION_CALCULATION_MODEL,    // <-- 演算モデルは、必ずこの値にして下さい
                new HySObjectKind("CAL_SAMPLE_MODELS"), // <-- LibraryCategoryXML.xmlに定義されている値を使用する
                MyExerciseModelDefine.MY_SLUICE_MODEL_KIND, // モデルの識別子
                MyExerciseModelDefine.MY_SLUICE_MODEL_NAME // モデルの名称
                              );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("各種実験用 要素モデルです");
            csModelInfo.SetCreatorInf("要素モデル開発演習者");
            csModelInfo.SetIconName("Dam");

            m_csCalModelInforList.AddLast(csModelInfo); // 演算モデル情報の追加

  
 演算データクラス内にメンバー変数を追加し、メソッドの実装を行います。

    [Serializable]
    public class MySluiceCalInfo : McCalInfo
    {
        public long m_lNum=25; // 収束計算回数

        public double m_dB=5.0; // 堰の幅
        public double m_db=0.4; // 越流幅
        public double m_dD=3.0; // 越流高

       。。。。。。
        public override bool CopyInfo(McCalInfo csOrgInfo)
        {
            MyTankCalInfo csOrdDt = csOrgInfo as MyTankCalInfo;
            if (csOrdDt != null)
            {
                m_lNum = csOrdDt.m_lNum;
                m_dB = csOrdDt.m_dB;
         。。。。。。。。


 要素モデルの各メソッドの実装を行います。 実装例の一部を示します。

     public class MySluiceModel : McStateCalModelBase
    {

        protected override bool Initialize(ref McPropertyInfoRoot csInitialData, long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
        {
            bool bRtn = false;
            // 引数で与えられたデータを キャストしています。
            McInitialInfo csInDt = csInitialData as McInitialInfo;
            if (csInDt != null)
            {
                bRtn = true;

                csInDt.GetInfo("dh", ref m_csMyInf.m_dH);
         。。。。。。。。
         。。。。。。。。

        public override bool SetProperty(McCellModelPropertyIF csCellMdlPropertyInfo)
        {
            bool bRtn = false;
            // 使用しやすいようにキャストしておく
            m_csMyInf = (MySluiceCalInfo)m_csCalInfo;

            // プロパティ設定
            McCellModelPropertyInfo csPrptyInfo = csCellMdlPropertyInfo as McCellModelPropertyInfo;
            if (csPrptyInfo != null)
            {
                // 演算ステップ時刻設定
                this.m_csDltTime = new HySTime(csPrptyInfo.GetStepTime());

                csPrptyInfo.GetInfo("N", ref m_csMyInf.m_lNum);
                csPrptyInfo.GetInfo("dB", ref m_csMyInf.m_dB);
          。。。。。。。。
          。。。。。。。。

        protected override long Calculate(long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
        {
            HySCellData csRcvCellData = null;
            double dQIn = 0.0; // 流入量

            for (long lLp = 0; lLp < lInputDataNum; lLp++)
            {
                //  ポイント時系列伝送データを取得します。
                csRcvCellData = csInputCellData[lLp].GetInterpolatedCell(0);

                //  セル内の0番目の情報を取得します
                dQIn += csInputCellData[lLp].Data(csRcvCellData, 0);
            }
           
            //
            // ニュートン法による計算
            double dDlt = m_csMyInf.m_dDlt; // 微小変動値
            double dH = m_csMyInf.m_dH; // 越流水位:初期値

            double dQf = 0.0;
            double dQp = 0.0;
            double dQ0 = 0.0;
            double dDltH = 0.0;
            int iLp = 0;
            for (iLp = 0; iLp < m_csMyInf.m_lNum; iLp++)
            {   // 収束までの最大繰り返し
               
                dQf = this.QOut(dH - dDlt)-dQIn;
                dQ0 = this.QOut(dH)-dQIn;
                dQp = this.QOut(dH + dDlt)-dQIn;
               
                dDltH = -2.0 * dQ0 / (dQp - dQf) * dDlt;
                dH += dDltH;
                if (Math.Abs(dDltH) < m_csMyInf.m_dLimitDlt)
                {   // 収束完了ならば繰り返しを終了する
                    break;
                }
            }
            m_csMyInf.m_dH = dH;    // 越流水位
            m_csMyInf.m_dQ = dQ0+dQIn;  // 越流流量

            if (iLp < m_csMyInf.m_lNum - 1)
            {   // 最大回数内に収束すれば
                return 0;
            }
            else
            {   // 収束しなければ
                return -1;
            }
         }

    。。。。。。。。


 実装を完了したならば、ディバッグモードで立ち上げ、動作を確認します。


 ここで作成した要素モデル開発プロジェクト(Ex15_CommonMP.lzh

 ダウンロードしたら解凍して生成されたフォルダー「MyExerciseModel」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。   
 解凍して生成されたプロジェクト:MyExerciseModel.csproj を ディバッグ用ソリューションに追加し、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に追加します。 
 また、 解凍して生成された、「MyExerciseStep1」フォルダーを \CommonMP\CommonMPData\ 下に置きます。



(前頁)<<      >>(次頁) 

初版:2013/08/18 |