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

4章  要素モデル自作の方法
 4.5  「栄養成分(植物プランクトン光合成用)」要素モデル
     〜 海洋モデル用要素モデルの作成例(サンプルプロジェクトプレジェクト:McOceanSampleModels.csproj 」)  〜



 「栄養成分」要素モデルは、植物プランクトンが生育するための海中の栄養成分を示します。海洋で必要な栄養素を遠海洋部で不足している 「窒素」、「リン」、「珪素」、「鉄」とします。
 含まれるそれらの要素成分の量は、[mol/m3] ではなく、[g/m3]の単位で表すことにします。
 図4.5.1に「栄養成分」要素モデルと他の要素モデルの関連を示します。

 栄養成分モデルは植物プランクトンに栄養を与える 
  図4.5.1 栄養成分要素モデルと他の要素モデルの接続


 「栄養成分」要素モデルも、以前に出てきた「植物プランクトン」、「デトリタス」と同様にファクトリークラスを使用して生成します。(ソースコード4.5.1参照)

ソースコード:4.5.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.FERTILIZER_KIND)
            {   // 栄養成分
                csCalModel = new MzOceanNutrient();
            }
     ………
            return cCalModel;
        }
        //  ●要素内演算中データクラス生成
        public override McCalInfo CreateCalInfo( HySObjectKind csModelKind )
        {
            McCalInfo csCalInfoData = null;
            if( csModelKind == ………
      ………
            else if (csModelKind == MzOceanBaseDefine.FERTILIZER_KIND)
            {   //栄養成分
                csCalInfoData = new MzOceanNutrientCalInfo();
            }
     ………
            return csCalInfoData ;
        }
        //  ●要素モデルに対する変数値、入出力データの設定等のプロパティ情報生成
        public override McCellModelPropertyIF CreateModelProperty(HySID csLibraryID, HySObjectKind csModelKind)
        {
             McCellModelPropertyInfo csRtnCellPrptyDt = new McCellModelPropertyInfo(csLibraryID, csModelKind);

            if( csModelKind == ………
      ………
            else  if (csModelKind == MzOceanBaseDefine.FERTILIZER_KIND)
            {   // 栄養成分
                ……… 各種プロパティ情報の設定 ……
                csRtnCellPrptyDt.AddInfoType("m_Density_Si", "SiO2密度  [g/cm^3]", McDefine.ValKind.DOUBLE);
                csRtnCellPrptyDt.SetInfo("m_Density_Si", 2.65);
                csRtnCellPrptyDt.AddInfoType("m_Dissolve_Si", "SiO2溶解度係数", McDefine.ValKind.DOUBLE);
                csRtnCellPrptyDt.SetInfo("m_Dissolve_Si", 30.0E-3);
                ……… 各種プロパティ情報の設定 ……
                // 受信可能なパターンを設定
                {
                    //  デトリタス分解による海洋肥料生成
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.BCT_FERTILIZER, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);  // 受信可能パターンの追加
                    //  海洋施肥:人間による施肥
                    csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.HUMAN_FERTILIZER, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);  // 受信可能パターンの追加                }
                // 送信パターンの設定
                {
                   //  光合成によって消費される栄養素
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PHOTOSYNTHESIS, 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.FERTILIZER_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.FERTILIZER_KIND, // モデルの識別子
                    SMPL + MzOceanBaseDefine.FERTILIZER_NAME  // モデルの名称
                                          );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("栄養素(Nutrient) ");
            csModelInfo.SetCreatorInf("S.H.");
            csModelInfo.SetIconName(@"Ocean\Nutrient");
            csModelInfo.SetManualFileName(@".\Ocean\SampleModelExplanation.pdf"); // <-- モデル解説書

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


 図4.5.1に示したように、「栄養成分」要素モデルの出力は、「植物プランクトン」の光合成に必要な栄養分を送信します。現在の海水中の栄養分の量が「植物プランクトン」からの要求量より多い場合には、要求量分送信できますが、それ以下であれば、現在存在している分量のみを送信します。

ソースコード4.5.2
            for (int ll = 0; ll < m_csOcnBacedlInf.m_lLayerNumber; ll++)
            {   // 各層について計算
                //-----窒素分--------
                // 可能な量を計算
                if (m_OcLyrMdlInf.m_N[ll] > m_OcLyrMdlInf.m_ReqN[ll])
                {
                    m_OcLyrMdlInf.m_AvailableN[ll] = m_OcLyrMdlInf.m_ReqN[ll];
                }
                else
                {
                    m_OcLyrMdlInf.m_AvailableN[ll] = m_OcLyrMdlInf.m_N[ll];
                }
                // 送る量だけ減らす
                m_OcLyrMdlInf.m_N[ll] -= m_OcLyrMdlInf.m_AvailableN[ll];
                //-----リン分--------
                // 可能な量を計算
                ………………
 

 一方、「栄養成分」要素モデルへの入力は、人間による「海洋施肥」による直接入力、及びデトリタスを細菌が分解して発生した栄養成分の還元を考えます。
 これらの接続の種類は 表4.2.2 伝送パターン に定義されている 「人間による海洋施肥: MzOceanBaseDefine.HUMAN_FERTILIZER」、「有機物分解による肥料要素生成: MzOceanBaseDefine.BCT_FERTILIZER」の接続を使用します。 接続の端末は下記の通り定義します。

ソースコード:4.5.3 

///栄養成分要素モデル
public class MzOceanNutrient : MzOceanModelElement
{
    ……………

    //========================================================
    // 双方向接合:送受信:光合成肥料使用量: McOceanBaseDefine.PHOTOSYNTHESIS送信 
    protected McPatternRdvSndTranInfoPair m_csRcvPhytoCnnct = new McPatternRdvSndTranInfoPair();
    protected McPatternRdvSndTranInfoPair m_csSndPhytoCnnct = new McPatternRdvSndTranInfoPair();

    // 受信:人間による施肥料 :     McOceanBaseDefine.HUMAN_FERTILIZER_KIND 
    protected McPatternRdvSndTranInfoPair m_csRcvHmnFertilizerCnnct = new McPatternRdvSndTranInfoPair();

    // 受信:バクテリア等からの:受信
    protected McPatternRdvSndTranInfoPair m_csRcvFertilizerCnnct = new McPatternRdvSndTranInfoPair();

    /// <para>入力側の接続情報チェック</para>
    protected override bool CheckReceiveDataConnection(ref McStructErrorInfo csErrorInf, long lInputDataNum, McReceiveCellDataIF[] csInputCellData)
    {
        // 親クラスチェック処理
        bool bRtn = base.CheckReceiveDataConnection(ref csErrorInf, lInputDataNum, csInputCellData);

        // 双方向結合:光合成への養分補給
        (m_csRcvPhytoCnnct, m_csSndPhytoCnnct) = this.PrepareRcvSndPattern(MzOceanBaseDefine.PHOTOSYNTHESIS);

         // 受信:人間による施肥料 :     McOceanBaseDefine.HUMAN_FERTILIZER_KIND 
        m_csRcvHmnFertilizerCnnct = this.PrepareRcvPattern(MzOceanBaseDefine.HUMAN_FERTILIZER);
  
        // 受信:バクテリア等からの肥料成分
        m_csRcvFertilizerCnnct = this.PrepareRcvPattern(MzOceanBaseDefine.BCT_FERTILIZER);
   ………… 


 人間による海上施肥では、受信するのは、海面最上層である「表面混合層」のみであり、窒素、リン成分はすぐに海水に溶けるとしますが、珪素、鉄は固形物で与えられるとします。この為、海上施肥に対する情報として、固形物のサイズを与えます。(ソースコード:4.5.4参照)
ソースコード:4.5.4

/// 人間による施肥
protected virtual void ReceiveHmnFertilize()
{
    for (int i = 0; i < m_csRcvHmnFertilizerCnnct.m_RcvInfNum; i++)
    {   // 受信要素モデル数繰り返す

        // 人工施肥分を受信
        HySCellData[] csCell = m_csRcvHmnFertilizerCnnct.m_csRcvInfArry[i].GetInterpolatedCellD1();
        if (csCell != null)
        {
            // ――― 最上部に配布する ―――
            // ●N
            m_OcLyrMdlInf.m_N[0] += csCell[0].m_dData[0];
            // ●P
            m_OcLyrMdlInf.m_P[0] += csCell[0].m_dData[1];
            // ●Si
            double DetritusMass = csCell[0].m_dData[2];
            double SizeD = csCell[0].m_dData[3];
            if (SizeD > 0.0)
            {
                // 受信サイズを中心に分布を持った大きさのSiが投入される
                m_OcLyrMdlInf.AddIOPMass(MzOceanNutrientCalInfo.Si, 0, DetritusMass, SizeD, m_OcLyrMdlInf.m_Density_Si);
            }
            // ●Fe
            DetritusMass = csCell[0].m_dData[4];
            SizeD = csCell[0].m_dData[5];
            if (SizeD > 0.0)
            {
                // 受信サイズを中心に分布を持った大きさのFeが投入される
                m_OcLyrMdlInf.AddIOPMass(MzOceanNutrientCalInfo.Fe, 0, DetritusMass, SizeD, m_OcLyrMdlInf.m_Density_Fe);
            }
        }
    }  // end of for(i)
} 


 ここで、珪素、鉄分は無機物固形体として与えられて、海中に浮遊している間に次第に海中に溶融すると考えます。
 珪素、鉄分は固形物であるため、デトリタスと同様に沈降します。 そこで、珪素、鉄のサイズの分布もデトリタスと同様にサイズ別に22個(変数:MzOceanBaseDefine.iPARTICLE_SIZE_NUM に定義)に分けて保持しています。
 ( 0.1μm,0.2μm,0.5μm,1μm,2μm,5μm,  〜〜〜  50cm,1m)
 各サイズの粒子について、ストークスの沈降の式を用いて沈降させていきます。
 沈降中に、各粒子から 珪素、鉄が海水中に溶融することとします。


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



1) 細菌類から得た栄養成分はそのまま海水内部に取り込む
   (各層で行う)

2) 人工的海上施肥に関しては、表面混合層のみに投入される。
   この時、窒素、リン成分はそのまま溶融して海水に取り込まれる。
   一方、珪素、鉄分は固形物として与えられるため、代表サイズの周囲に分布した大きさの固形物として取り込まれる。

3) 固形物である珪素、鉄分はストークスの沈降の式に基づいて深海部へ沈降してゆく。
   また、それらは、一定の割合で海水中にイオンとして溶けだし、植物プランクトンは溶けだした成分を使用することとする。

4) 植物プランクトンが使用した各栄養成分は、海水から取り除かれていく


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


  栄養成分モデルのテストを行う。植物プランクトン、海上施肥等を接続する
   図4.5.2 デトリタスのテスト用モデル

 テストとして、図4.5.2に示すモデルで動作させます。  ここで、海洋施肥は7日毎に行います。
 図4.5.3はテスト用の細菌モデルから、一定量の分解物の供給が有るか無いかによる、海中栄養成分の推移を示したものです。
 7日毎の表面混合層の施肥により、栄養成分は上昇しますが速やかに植物プランクトンによって消費されていることがわかります。
 テスト用細菌から各層に同じ量の栄養分供給があった場合には、太陽光が多少届き光合成が行われる真光層では、直ちに消費されてゼロになりますが、光合成が行われない透光層以下の層では、供給された栄養成分が層内に蓄積されています。

 海中の栄養素の量の推移
  図4.5.3 栄養成分要素モデル内の栄養成分(7日毎に施肥実施)


  植物プランクトンの量
  図4.5.4 植物プランクトンの量の推移(7日毎の施肥に応じて増減を繰り返している)

 図4.5.4に植物プランクトンの量を示します。海上施肥のみの場合に比べて、細菌からの補給も含めているため、植物プランクトン量が最低の時の量が多くなっています。また、真光層では光合成が行われるため細菌から提供された栄養成分を用いて、植物プランクトンが存在しています。これは、図4.5.3において、真光層で細菌から提供された栄養成分が消費されて層内に蓄積されていないことと整合しています。


 次頁では、「細菌」要素モデルの制作を行います。

 


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

初版:2022/07/19 |


東経135.0度