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

4章  要素モデル自作の方法
 4.9  「動物プランクトン」要素モデルと「ネクトン」要素モデル
     〜 海洋モデル用要素モデルの作成例(サンプルプロジェクトプレジェクト:McOceanSampleModels.csproj 」)  〜


 海中での生態系の基礎は「植物プランクトン」要素モデルですが、その「植物プランクトン」の捕食者として、「動物プランクトン」を考え、それを捕食する「ネクトン(海流に漂うだけではなく流れに抗って移動可能な遊泳生物を言う)」を考えます。植物プランクトンをネクトン類が捕食したり、小型のネクトンを大型のネクトンが捕食したり複雑な生態系が考えらますが、ここでは、単純に「植物プランクトン」→「動物プランクトン」→「ネクトン」を考えます。尚、「動物プランクトン」や「ネクトン」の糞・死骸は「デトリタス」となり、その分解者として「細菌類」を考えます。また、「デトリタス」を直接、「動物プランクトン」・「ネクトン」が捕食することもあるとします。

 直接、二酸化炭素(CO2)を吸収し有機物として固定するのは「植物プランクトン」ですが、その死骸がデトリタスとなっても粒子も細かく沈降速度は遅いと考えられます。ところが、これをより体長の大きな「動物プランクトン」や「ネクトン」が捕食し、糞や死骸を形成することでより早くデトリタスが海底へ沈降することが可能となり、「生物ポンプ」の大きな動作原動力となっていると考えられます。

 また、ネクトンが繁殖する為には産卵ベッドとなるべき岩礁や海藻の代わりになるものが必要と思われますが、これは イオンカルチャーパックを使用したフロート、アミノ酸を混ぜたコンクリートを使用したフロート等を浮かぶ漁礁として使用することも考えられます。 

 生態系に「動物プランクトン」と「ネクトン」を追加した図を、図4.9.1に示します。上記で述べたフロートは此処では入れておりません。

 海洋生態モデルへ、動物プランクトンとネクトンの追加
  図4.9.1 海中生態系モデルに動物プランクトン要素モデルとネクトン要素モデルを追加する。

 ここで、ネクトンの基本的行動(捕食、増殖)は、動物プランクトンのそれに近いとして、ネクトン要素モデルは、動物プランクトン要素モデルの派生として制作します。この為、プログラム動作については、動物プランクトンについて主に述べます。
 
<動物プランクトンの入出力>
 動物プランクトンのへの入力としては、「捕食(←生態系下位の生物を喰う)」、「呼吸」を考え、出力としては「捕食(←上位捕食者から喰われる)」、「糞・死」を考えます。 これまで述べてきた要素モデルと同様にファクトリークラスのプロパティ設定情報生成メソッドによってそれらを設定します。ソース4.9.1に 入力を設定するソースを示します。

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

            if( csModelKind == ………
      ………
            else  if (csModelKind == MzOceanBaseDefine.ZOOPLANKTONS_KIND)
            {   // 動物プランクトン
                ……… 各種プロパティ情報の設定 ……
                csRtnCellPrptyDt.AddInfoType("m_CapturedRatio", "捕まり易さ:確率", McDefine.ValKind.DOUBLE);
                csRtnCellPrptyDt.SetInfo("m_CapturedRatio", 0.05);
                ……… 各種プロパティ情報の設定 ……
                // 受信可能なパターンを設定
                {
                    // 呼吸
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.BREATHING, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 受信可能パターンの追加

                    // 捕食
                    csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PREDATION, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 受信可能パターンの追加
                }
                // 送信パターンの設定
                {
                    // 被捕食
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PREDATION, csModelKind);
                    csRtnCellPrptyDt.AddSendPattern(csTrnPtn);  // 送信可能パターンの追加

                    // 排泄 or 死
                    csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.EXCRETION_DEATH, 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.ZOOPLANKTONS_KIND)
            {   // 動物プランクトン
                 this.SetInitMass(ref csRtnDt, 1, 1, 1, 1, 1, 1, 1);
            }
     ………
            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.ZOOPLANKTONS_KIND, // モデルの識別子
                    MzOceanBaseDefine.ZOOPLANKTONS_NAME  // モデルの名称
                                          );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("動物プランクトン(Zpoplankton)");
            csModelInfo.SetCreatorInf("S.H.");
            csModelInfo.SetIconName(@"Ocean\Zpoplankton02");
            csModelInfo.SetManualFileName(@".\Ocean\SampleModelExplanation.pdf"); // <-- モデル解説書

            m_csCalModelInforList.AddLast(csModelInfo);

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

プログラムソース:4.9.2

// 計算中データ格納クラス : 親クラス 
  public class MzOceanModelElementCalInfo : McInterCnnctModelCalInfo
  {
      ………………
      // -----------------------
    // 捕食関係(1日当たり)
    /// <summary> 非捕獲率 </summary>
    public double m_CapturedRatio = 0.1;
    /// <summary>捕食した質量の累積 g/m3</summary>
    public double[] m_TotalEatenMass = null;
    /// <summary>★:自身の質量 g/m3</summary>
    public double[] m_TotalSelfMass = null;
    /// <summary>餌の資源量 g/m3</summary>
    public double[] m_TotalFoodMass = null;
    /// <summary>要求質量 g/m3</summary>
    public double[] m_TotalReqedPredationMass = null;
    /// <summary>捕獲された質量 g/m3</summary>
    public double[] m_dCapturedMass = null;

    /// <summary>餌の要求量 g/m3</summary>
    public double[] m_ReqFoodMass = null;
    /// <summary>捕食した質量:1回の計算時間内」g/m3</summary>
    public double[] m_EatenMass = null;
    /// <summary>排泄した質量:1回の計算時間内」 g/m3</summary>
    public double[] m_ExcretionMass = null;
    /// <summary>排泄の比重 </summary>
    public double[] m_dExcretionDencity = null;

    // -----------------------
    // 呼吸関係(1日当たり)
    /// <summary> 呼吸O2要求量[g/g]:単位体重量あたり </summary>
    public double m_O2AbsRatio = 16E-6 * 1E3;
    /// <summary> 代謝によるCO2発生量[g/g]:単位体重量あたり </summary>
    public double m_CO2GenRatio = 28E-6 * 1E3;
    /// <summary>要求するO2</summary>
    public double[] m_ReqO2 = null;
    /// <summary>O2</summary>
    public double[] m_O2 = null;
    /// <summary>CO2</summary>
    public double[] m_CO2 = null;
    /// <summary>その他ガス1</summary>
    public double[] m_Gass1 = null;
      ………………
    // -----------------------
    // 死関係(1日当たり)
    /// <summary>死亡率:1日当たり </summary>
    public double m_dDeathRatio = 0.001;
    /// <summary>死んだ質量:1日当たり」g/m3</summary>
    public double[] m_Death = null;
       ………………
  } 


 入力:「捕食(←生態系下位の生物を喰う)」、「呼吸」、及び、出力:「捕食(←上位捕食者から喰われる)」、「糞・死」に関する送受信処理は既に本クラスの上位クラス(MzOceanModelElement)に実装されており、下記に示す動作となります。

1) 「捕食」に関して
  「捕食者側(←生態系下位の生物を喰う)」に対しては
    MzOceanModelElementCalInfoクラス内のメンバー m_EatenMass  に対して捕食した量(各層毎)が格納され、 
  「被捕食者側(←上位捕食者から喰われる)」に対しては
    MzOceanModelElementCalInfoクラス内のメンバー  m_TotalReqedPredationMass   に対して要求された量(各層毎)が格納されます。 
  「捕食者側(←生態系下位の生物を喰う)」に対しては
    MzOceanModelElementCalInfoクラス内のメンバー m_ReqFoodMass   に対して捕食したい量(各層毎)を設定しておくと、親クラスの SendReqPREDATION( )  メソッドによって送信されます。 また、
  「被捕食者側(←上位捕食者から喰われる)」に対しては
    MzOceanModelElementCalInfoクラス内のメンバー  m_dCapturedMass  に対して捕食された量を設定しておくと、親クラスの SendPREDATION( )  メソッドによって送信されます。

2) 「呼吸」に関して
 「要求する酸素量」と、「排出する二酸化炭素」に対しては
    MzOceanModelElementCalInfoクラス内のメンバー  m_ReqO2m_CO2 に対して設定しておくと、親クラスの 、SendBREATHING( )  メソッドによって送信されます。 また、 親クラスの ReceiveBREATHING( ) メソッドによって「受け取った酸素」は MzOceanModelElementCalInfoクラス内のメンバー  m_O2に格納されます。

3) 「糞・死」に関して
 デトリタスへの送信は、親クラスの  SendEXCRETION_DEATH() メソッドによって送信されますが、糞の量は MzOceanModelElementCalInfoクラス内のメンバー  m_ExcretionMass に格納し、死体の量は、MzOceanModelElementCalInfoクラス内のメンバー  m_Deathに格納しておきます。 糞の大きさは、体長の約1割 (m_csOcnBacedlInf.m_dSelfSize * m_csOcnBacedlInf.m_dEexcretionSize;)とし、死体の大きさは体長と同じとします。

<動物プランクトン動作処理>
     モデル全体構造作成を優先していますので、ここの論理は不正確です。後ほど修正していく予定です。(知識のある方は、要素モデルを自作して、本サンプルと交換してください。)

 要素モデルの計算処理部:Calculate( ) をオーバーライドします。
 この中で下記の順序で計算を行っていきます。
1)現状状態変化
1−1)餓死・窒息死計算
1−2)体重増加=増殖
1−3)呼吸によるCO2の排出量計算
1−4)自然死(例えばウイルス感染等)
1−5)排泄糞量計算

2)捕食者による犠牲者計算

3)次要求量計算
3−1)次の酸素要求量計算
3−2)次の食物量(被捕食者への要求量)計算


●先ず、餓死・窒息死計算は
   (食物不足量) = (生体維持の為に必要な獲物捕食量:要求量) −(実際に捕食した量)として、
 不足した量に応じた餓死を発生させます。
 また、窒息計算は
   (O2不足量) = (生態維持の為に必要なO2量:要求量) − (実際に獲得したO2量)として、
 不足した量に応じて窒息を発生させます。
 この餓死量と、窒息量のうち大きい方を 餓死・窒息量として採用します。

●次に体重増加(増殖)は
   (食物余剰量) = ―(食物不足量)
   (O2余剰量) = ― (O2不足量)
 として、余剰分に見合った量だけ、体重増加(=増殖)とします。(但し、食物余剰から計算した量と、O2余剰から計算した量のどちらか小さい方の値を採用)

●O2消費とCO2排出量は
   (維持した生体量+増殖量)に応じて それぞれの値を計算します。

●自然死は
   (維持した生体量+増殖量)の内、ある一定の割合が死亡するとします。(2022/07/31時点ではウイルス感染は考えていません)

●排泄糞量は
    (全捕食量) ― (体重増加量) ― (死亡量) とします。

●捕食される量は、
  (捕食確率×全体重量) ≧ (要求量) の場合には、 (捕食量) = (要求量) とします。
  (捕食確率×全体重量) < (要求量) の場合には、 (捕食量) = (全体重量×捕食確率) とします。  
  
●次の要求量は
  (現在の全重量×最大増殖率)の動物プランクトンが必要とする酸素と食物の量とします。

 尚、水圧による影響は(2022/07/31時点で)考慮していません。


<テスト> 
 図4.9.2に示した動物プランクトン要素モデルとネクトン要素モデルを追加した生態系の動作を行います。
     (*注意) :ユニットテストは別途おこないますが、ここではユニットテストの記述は省きます。



   植物プランクトンと動物プランクトンとネクトンとデトリタスと細菌からなる生態系でのシミュレーション結果その1
      図4.9.2 生態系(図4.9.1)の生態系における各要素モデルにおける要素の量

 「栄養素」は、7日に1回の割合で海上施肥を行う為、施肥を行った日にスパイク状量が増えています。前章までの結果と同様に「植物プランクトン」は施肥に応じて増殖し、肥料成分が少なくなるにしたがって減少し、次の施肥でまた増殖するという周期的な増減を繰り返しています。次に、「植物プランクトンを捕食する動物プランクトン」は想定通り「植物プランクトン」の数の増減に応じてその数を増減させています。またその生息領域は植物プランクトンが生育可能な「表層混合層」と「真光層」に限られています。一方「デトリタスと細菌を捕食する動物プランクトン」は初期段階で表層混合層、真光層、透光層、中間層、漸深層、深海層と順に数を急激に増加させていますが、途中で急激に死滅してシミュレーション時刻2022/8/27 以降は表面層のみがデトリタスの増減に合わせて増減を繰り返すのみとなっており、現実世界とは異なっており、現時点(2022/08/03)で調査中です。「デトリタス」は、「植物プランクトン」とそれを捕食する「動物プランクトン」を死骸や糞が「デトリタス」となるため、「デトリタス」数はそれに応じて増減を繰り返します。但し、「海底」では、降り積もったデトリタスが蓄積されるため、単純に増加し続けます。一方、「動物プランクトン」と「デトリタス」を捕食する「ネクトン」の数もまた捕食する「動物プランクトン」と「デトリタス」の数に応じて増減を行います。「デトリタス」を分解する「細菌」は「デトリタス」の量に応じて増減を繰り返すと考えられますが、動物プランクトン同様に初期急激に増加した後、途中から数を減らしています。これらの原因も調査中です。

  海洋内での細菌、動物プランクトンと酸素の関係 
     図4.9.3 生態系(図4.9.1)の生態系における各要素モデルにおける水中の酸素量
 図4.9.3に水中の酸素の量を示します。水中の酸素のが一定以上少なくなるとデトリタス量が多くても、本要素モデルでは溶融酸素量が少なくなり一定以下となると、繁殖できなくなるようです。
 但し、水中の酸素量の水圧等の考慮を行っていません。 現実では、水深が深くなると水圧により溶融される酸素の絶対量も増える為、要素モデルの改善が必要です。

 これらの改修は、今は中断しておき、先に必要な要素モデルの作成を急ぎます。
 次は、人間の関与として、漁業関連の要素モデルを作成します。


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

初版:2022/08/02 |