蛇島伸吾メール蛇島伸吾     (前頁)<<      >>(次頁)          (Up)

4章  要素モデル自作の方法
 4.4  「デトリタス」要素モデル
     〜 海洋モデル用要素モデルの作成例(サンプルプロジェクトプレジェクト:McOceanSampleModels.csproj 」)  〜



 「デトリタス」要素モデルは、生物の死体や排泄物が粒子状になったもので、ゆるやかに沈降していきます。「デトリタス」の表面・内部では細菌等の微生物が繁殖し、次第に分解されます。
 ここでは、要素モデルとして、「デトリタス」と「バクテリア(細菌)」を別の要素モデルとして制作します。

  デトリタスモデル
  図4.4.1 細菌、植物プランクトン、動物プランクトン、ネクトン等の生物の死骸や糞が粒状となりデトリタスを形成する。


植物プランクトンの場合と同じようにファクトリークラスから関連するクラスを生成します。(ソースコード4.4.1参照)

ソースコード:4.4.1

namespace CommonMP.HYMCO.Ocean.McOceanSampleModels
{
   // ファクトリークラス
    public class MzOceanSmplFactory : McBasicModelFactoryBase
    {
        //  ●演算モデル生成
        public override McCalModel CreateCalModel( HySObjectKind csModelKind )
        {
            McCalModel csCalModel = null;
            if( csModelKind == ………
      ………
            else if (csModelKind == MzOceanBaseDefine.DETRITUS_KIND)
            {   // デトリタス
                csCalModel = new MzOceanDetritus();
            }
     ………
            return cCalModel;
        }
        //  ●要素内演算中データクラス生成
        public override McCalInfo CreateCalInfo( HySObjectKind csModelKind )
        {
            McCalInfo csCalInfoData = null;
            if( csModelKind == ………
      ………
            else if (csModelKind == MzOceanBaseDefine.DETRITUS_KIND)
            {   // デトリタス
                csCalInfoData = new MzOceanDetritusCalInfo();
            }
     ………
            return csCalInfoData ;
        }
        //  ●要素モデルに対する変数値、入出力データの設定等のプロパティ情報生成
        public override McCellModelPropertyIF CreateModelProperty(HySID csLibraryID, HySObjectKind csModelKind)
        {
             McCellModelPropertyInfo csRtnCellPrptyDt = new McCellModelPropertyInfo(csLibraryID, csModelKind);

            if( csModelKind == ………
      ………
            else  if (csModelKind == MzOceanBaseDefine.DETRITUS_KIND)
            {   // デトリタス
                ……… 各種プロパティ情報の設定 ……
                csRtnCellPrptyDt.AddInfoType("m_AggregationRatio10", "凝集率(<10μm)", McDefine.ValKind.DOUBLE);
                csRtnCellPrptyDt.SetInfo("m_AggregationRatio10", 0.05);
                ……… 各種プロパティ情報の設定 ……
                // 受信可能なパターンを設定
                {
                    // 排泄 or  死
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.EXCRETION_DEATH, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 送信可能パターンの追加
                }
                // 送信パターンの設定
                {
                    // 被捕食
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PREDATION, csModelKind);
                    csRtnCellPrptyDt.AddSendPattern(csTrnPtn);    // 送信可能パターンの追加

                    // 腐敗・分解(細菌がデトリタスを分解する) 
                    csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.DECOMPOSE, csModelKind);
                    csRtnCellPrptyDt.AddSendPattern(csTrnPtn);  // 受信可能パターンの追加                                                                  
                }
            }
     ………
            return csRtnCellPrptyDt ;
        }
        //  ● 要素モデル初期値データ生成
        public override McPropertyInfoRoot CreateModelInitialInfo(HySID csLibraryID, HySObjectKind csModelKind)
        {   
            McInitialInfo csRtnDt = new McInitialInfo(csLibraryID, csModelKind);
            if( csModelKind == ………
      ………
            else  if (csModelKind == MzOceanBaseDefine.DETRITUS_KIND)
            {   // デトリタス
                this.SetInitMass(ref csRtnDt, 1E-6, 1E-9, 1E-9, 0, 0, 0, 0);
                csRtnDt.AddInfoType("m_dDtrtsSize", "デトリタスサイズ[mm]", McDefine.ValKind.DOUBLE);
                csRtnDt.SetInfo("m_dDtrtsSize", 30.0E-3);
                csRtnDt.AddInfoType("m_dDcty", "密度", McDefine.ValKind.DOUBLE);
                csRtnDt.SetInfo("m_dDcty", 1.2);
            }
     ………
            return csRtnDt ;
        }

        //  ● 作成した要素モデルをライブラリ管理画面に表示するための情報を生成する。
        public override HySDataLinkedList GetCalModelInfoList()
        {
            McModelInfo csModelInfo = null;

            …………
            //--   デトリタス
            csModelInfo = new McModelInfo (
                    (HySID)this.GetFactoryID(),
                    McModelLibraryDefine.DIVISION_CALCULATION_MODEL, // <-- 演算モデルは、必ずこの値にして下さい(LibraryCategoryXML.xmlに記述されている)
                    new HySObjectKind("CAL_OCEAN_MODELS"), // LibraryCategoryXML.xmlに記述されている <Category>タグ内のIDに対応します。
                    MzOceanBaseDefine.DETRITUS_KIND, // モデルの識別子
                    MzOceanBaseDefine.DETRITUS_NAME  // モデルの名称
                                          );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("デトリタス(Detritus)  死骸、糞等 ");
            csModelInfo.SetCreatorInf("S.H.");
            csModelInfo.SetIconName(@"Ocean\Detritus02");
            csModelInfo.SetManualFileName(@".\Ocean\SampleModelExplanation.pdf"); // <-- モデル解説書

            m_csCalModelInforList.AddLast(csModelInfo);

            //--
            return m_csCalModelInforList;
        }
    }    // end of class
} 


 先ず、デトリタスの入力としては、「植物プランクトン」、「動物プランクトン」、「ネクトン」、「細菌類」からの「死骸や排泄物」とします。陸上から流れてきた有機物等も考えられますが、このモデルでは遠海洋を対象としているため、それは考慮しません。
 デトリタスの出力としては、デトリタスを食料とする「細菌類」、「動物プランクトン」、「ネクトン(小魚)」への有機物提供を考えます。

 デトリタス要素モデルは「MzOceanModelElement」クラスの派生で作成されているため、出力側は親クラスの「捕食関係」の接続を使用します。
 一方で、受信側は、デトリタス固有の受信処理であり、新規に実装します。
 伝送データ「排泄または死」はソースコード:4.2.7に示したように一つのセルに8つの変数を持っています。
 
 デトリタス内は、モデル内部でサイズ別に22個(変数:MzOceanBaseDefine.iPARTICLE_SIZE_NUM に定義)に分けて保持しています。
 ( 0.1μm,0.2μm,0.5μm,1μm,2μm,5μm,  〜〜〜  50cm,1m)
  このため、他の要素モデルから受信した死骸や糞はそれらのサイズ別に分割されてモデル内で保持されます。(下記ソースコード:4.4.2の AddDetritus( ) メソッド内で計算する ) 

 (糞・死骸受信時の処理)
ソースコード:4.4.2

// 糞・死骸の受信
protected virtual void ReceiveEXCRETION_DEATH()
{
    for (int i = 0; i < m_csRcvExcretionDeathCnnct.m_RcvInfNum; i++)
    {   // 要素分繰り返す(植物プランクトン、動物プランクトン、ネクトン等からの入力)
        HySCellData[] csCell = m_csRcvExcretionDeathCnnct.m_csRcvInfArry[i].GetInterpolatedCellD1();
        if (csCell != null)
        {
            for (int ll = 0; ll < m_DtrtsInf.m_lLayerNumber; ll++)
            {  // 層毎に計算
                // 量を受信
                double dEXMass = csCell[ll].m_dData[0];  // 全体量
                double dEXSize = csCell[ll].m_dData[2];  // 中心サイズ
                double dEXDty = csCell[ll].m_dData[3];   // 密度
                m_DtrtsInf.d_TotalIN += dEXMass;

                // :平均サイズ:dEXSizeを中心としてそのサイズ近傍に分散保持する
                m_DtrtsInf.AddDetritus(ll, dEXMass, dEXSize, dEXDty);

                // 死骸量を受信
                double dDtMass = csCell[ll].m_dData[4];  // 全体量
                double dDtSize = csCell[ll].m_dData[6];  // 中心サイズ
                double dEDtDty = csCell[ll].m_dData[7];  // 密度
                m_DtrtsInf.d_TotalIN += dDtMass;

                // :平均サイズ:dDtSizeを中心としてそのサイズ近傍に分散保持する
                m_DtrtsInf.AddDetritus(ll, dDtMass, dDtSize, dEDtDty);
            }
        }
    }  // end of for(i)
    return ;
}



「デトリタス」要素モデルとしては、以下の状態を計算します。
      モデル全体構造作成を優先していますので、ここの論理は不正確です。後ほど修正していく予定です。(知識のある方は、要素モデルを自作して、本サンプルと交換してください。)



1)デトリタス同士の凝集
 近傍の小さなデトリタス同士は、一定の割合で凝集する。

2)デトリタスの分解
 これは、「細菌」要素モデルが行う為、デトリタスモデル内では行わない。

3)細菌、動物プランクトン、小魚等へ捕食されるときにはサイズの小さなモノ程捕食されやすい とする。

4)沈降  
 デトリタスは、ストークス沈降の式によって深海へと沈降する。 尚、デトリタスの形状は球形と見なし、密度は伝送されてきた糞や死骸の密度によって変化する。 

5)<注意>
 2020/07/20現在の論理では、分解等によりのサイズが小さくなることを考慮していない。 

<テスト>
 制作したデトリタスモデルのテストを行います。
     (*注意) :ユニットテストは別途おこないますが、ここではユニットテストの記述は省きます。

 テストとして、図4.4.1に示すモデルで動作させます。
 ここで、栄養成分要素モデルは、4.3章で用いたテスト用の栄養モデル(図4.3.7参照)で作成したテスト用モデルを使用します。
 初期値として養分を持っていますが、補給されない為次第に減っていきます。


 植物プランクトンの死骸がデトリタスとなる
   図4.4.1 デトリタスのテスト用モデル

 図4.4.2にテストを実行した結果を示します。
 デトリタスの沈降が無い場合には、前回の図4.3.8に示したように 植物プランクトンの死骸は水中に何時までも浮遊しています。しかしデトリタスの沈降処理を入れると、次第にデトリタスは沈降し、上層部から次第にデトリタスの量が減っていく様子が観察されます。
 表層混合層では、最初に植物プランクトンが増殖し枯死する間はデトリタスは増加しますが、植物プランクトンが無くなると、それ以降表層混合層のデトリタスは単調に減少します。真光層では少し遅れて、デトリタスが増加した後減少します。
 中間層、漸深層は上から降ってくるデトリタスの量に応じて最初にデトリタスの量が増加した後、減少に転じています。深海層は深さ3000m 〜 6000m の範囲がある為、計算時間の中ではデトリタスは海底に届くには至っていません。
 デトリタスの量の推移
  図4.4.2 海中のデトリタスの量 

 次頁では、「栄養成分」要素モデルの制作を行います。

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

初版:2022/07/19 |