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

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



 ここで、具体的な要素モデルの作成例を示します。制作するプロジェクトは「サンプルプロジェクト:「McOceanSampleModels.csproj」」です。

 

ここでは、全体モデルが要素モデルの組み合わせで制作可能である事を示すことを主な目的としております。
この為、各要素モデルの詳細論理は不正確です。
そこで、各要素の動作に詳しい方は自ら要素モデルを生成して入れ替えて 頂けると良いと思います。
さらに、不足要素モデルの追加や、接続の誤りなども自由に変更し、新しい要素モデル接続を作成して頂 けることを期待しています。
正に、CommonMPはこのようにして色々な専門家の目を通してモデルを成長させていく事を目的の一つにしています

この段階で作成する要素モデルは『それっぽい』モデルであり、定量的な検証等は何もしておりません。
今後、モデル全体の完成が見えてきた所で、モデルの中身を詳細に検証し一つずつ正確なモデルに置き換えていきます。


この様に、CommonMPを使用すると、トップダウン的にモデルの構築を行う ことが可能です。

 此処で作成するプロジェクトは要素モデルを作成するサンプルとして「McOceanSampleModels.csprj」とします。 下にプロジェクトで作成する要素モデルのソースファイルと、ライブラリ管理画面での表示の例を示します。
     植物プランクトン等を含モデルプログラムプロジェクト
       図 これから作成するサンプルプロジェクト内のソース、及びライブラリ管理画面に表示される要素モデル
 先ずは、生態系モデルの根幹をなす「植物プランクトン」要素モデルを作成します。
 図4.3.1に示しように植物プランクトンを中心として、関連する要素モデルを接続します。 先ず、植物プランクトンが光合成を行う為には、海中のCO2と肥料成分が必要です。そこで、要素モデルとして、「海中溶融ガス」、「栄養成分」を制作します。「植物プランクトン」へ入力としては、「海中溶融ガス」からは、CO2の供給を受けます。また「栄養成分」からは、「リン」、「窒素」、「鉄」、「シリカ」の供給を受けます。
 光については、必ず晴天であり、光強度は深さと海水中の濁り(有機物量)に応じて一意に決定できるとして、要素モデルとして作成しません。
 一方、植物プランクトンからの出力として、捕食により「動物プランクトン」に有機物を供給します。また、「植物プランクトン」が死を迎えた場合にその死骸は有機物として「デトリタス」に提供されます。

 植物プランクトンを中心とした生態系
   図4.3.1 植物プランクトンに関連する要素モデル
  
 先ず、植物プランクトンモデルは、親クラスの「MzOceanModelElement」クラスから派生で制作します。
 型紙プロジェクト「McOceanModelTemplate」をコピーして作成したプロジェクトにおいて、「MzOceanXXXMdl」クラスが存在するので、その名称を植物プランクトンモデルのクラス名とします。
 サンプルプロジェクトに於いては、植物プランクトンのクラス名「MzOceanPhytoplanktons」というクラス名としています。
 同様に、植物プランクトンの演算モデル内変数クラスを「MzOceanModelElementCalInfo」から派生させた「MzOceanPhytoplanktonsCalInfo」名称で作成します。

 植物プランクトンの識別子は、
プロジェクト「McOceanBaseModel」のMzOceanBaseDefineクラスに PHYTOPLANKTONS_KIND として定義されております。
 そこで、サンプルプロジェクトのファクトリークラスで、以下のようにして植物プランクトンのインスタンスを生成します。

ソースコード:4.3.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.PHYTOPLANKTONS_KIND)
            {   // 植物プランクトン
                csCalModel = new MzOceanPhytoplanktons();     // 植物プランクトン要素モデルの生成
            }
     ………
            return cCalModel;
        }
        //  ●要素内演算中データクラス生成
        public override McCalInfo CreateCalInfo( HySObjectKind csModelKind )
        {
            McCalInfo csCalInfoData = null;
            if( csModelKind == ………
      ………
           else  if (csModelKind == MzOceanBaseDefine.PHYTOPLANKTONS_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.PHYTOPLANKTONS_KIND)
            {   // 植物プランクトン
                ……… 各種プロパティ情報の設定 ……
                csRtnCellPrptyDt.AddInfoType("m_dSelfSize", "一個体の大きさ mm ", McDefine.ValKind.DOUBLE);
                csRtnCellPrptyDt.SetInfo("m_dSelfSize", 0.04);
                ……… 各種プロパティ情報の設定 ……
                // 受信可能なパターンを設定
                {
                    //  光合成養分吸収
                    McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PHOTOSYNTHESIS, csModelKind);
                    csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 受信可能パターンの追加

                    // 光合成CO2吸収
                    csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.CO2_ABSORPTION, 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.PHYTOPLANKTONS_KIND)
            {   // 植物プランクトン
                  this.SetInitMass(ref csRtnDt, 1, 1E-2, 1E-9, 0, 0, 0, 0);  // 各層における初期のプランクトン量設定
            }
     ………
            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.PHYTOPLANKTONS_KIND, // モデルの識別子
                    MzOceanBaseDefine.PHYTOPLANKTONS_NAME  // モデルの名称
                                          );
            csModelInfo.SetVersionInf("Ver1.0 ");
            csModelInfo.SetSummaryInf("植物プランクトン(Phytoplankton)");  // モデルの簡単な説明
            csModelInfo.SetCreatorInf("S.H.");
            csModelInfo.SetIconName(@"Ocean\Phytoplankton02");    // アイコンを設定
            csModelInfo.SetManualFileName(@".\Ocean\SampleModelExplanation.pdf"); // <-- モデル解説書(自作したモデルの詳細がある場合)

            m_csCalModelInforList.AddLast(csModelInfo);
            //--
            return m_csCalModelInforList;
        }

    }    // end of class

}


 本モデルでは、植物プランクトンの入出力は4種類であるため、プロパティ情報生成メソッド:CreateModelProperty( )内でも、入力=光合成養分吸収、光合成CO2吸収 出力=被捕食、死 の4種類を設定してあります。

 植物プランクトンモデルは「MzOceanModelElement」クラスから派生であるため、「捕食関係」、「死」、に関する接続は定義されています。そこで、植物プランクトンとして固有の「光合成時のCO2吸収」、「肥料成分の吸収」を設定します。どちらの接続も、植物プランクトン側が受けて「下流要素モデル」となります。接続の種類は既に定義されているので、その接続を使用します。
 接続の端末は下記の通り定義します。

ソースコード:4.3.2

public class MzOceanPhytoplanktons : MzOceanModelElement
{
    //========================================================
    // 光合成CO2吸収: McOceanBaseDefine.CO2_ABSORPTION
    protected McPatternRdvSndTranInfoPair m_csRcvPhytoCO2Cnnct = new McPatternRdvSndTranInfoPair();
    protected McPatternRdvSndTranInfoPair m_csSndPhytoCO2Cnnct = new McPatternRdvSndTranInfoPair();  // <-- 植物プランクトン側は使用しない

    // 光合成肥料吸収: McOceanBaseDefine.PHOTOSYNTHESIS
    protected McPatternRdvSndTranInfoPair m_csRcvFertilizerCnnct = new McPatternRdvSndTranInfoPair();
    protected McPatternRdvSndTranInfoPair m_csSndFertilizerCnnct = new McPatternRdvSndTranInfoPair();  // <-- 植物プランクトン側は使用しない
} 


 定義された接続端末に対して、実際の接続を行います。実装は、入力側の接続情報チェック ( CheckReceiveDataConnection() )メソッド内で行います。

ソースコード:4.3.3

/// 入力側の接続情報チェック
protected override bool CheckReceiveDataConnection(ref McStructErrorInfo csErrorInf, long lInputDataNum, McReceiveCellDataIF[] csInputCellData)
{
    // 親クラスのチェック処理をコールする <-- 親クラスで 捕食関係、死関係の接続が設定される
    bool bRtn = base.CheckReceiveDataConnection(ref csErrorInf, lInputDataNum, csInputCellData);

    // 【植物プランクトン固有】光合成CO2吸収
    (m_csRcvPhytoCO2Cnnct, m_csSndPhytoCO2Cnnct) = this.PrepareRcvSndPattern(MzOceanBaseDefine.CO2_ABSORPTION);

    // 【植物プランクトン固有】光合成による養分使用
    (m_csRcvFertilizerCnnct, m_csSndFertilizerCnnct) = this.PrepareRcvSndPattern(MzOceanBaseDefine.PHOTOSYNTHESIS);

    return bRtn;
} 


 光合成CO2吸収(MzOceanBaseDefine.CO2_ABSORPTION)で受信する情報は 表4.2.2 に示す通り 「"CO2", "g/m3"」なので CO2受信処理は下記の通りとなります。受信したCO2は、 自メンバー変数構造体:m_PhytoPlanktonInf.m_CO2[ll] に加算されます。

ソースコード4.3.4
/// CO2受信処理
protected virtual void ReceiveCO2()
{
    // CO2吸収:
    for (int i = 0; i < m_csRcvPhytoCO2Cnnct.m_RcvInfNum; i++)
    {   // 受信は溶融ガス要素モデルなので実際には、m_csRcvPhytoCO2Cnnct.m_RcvInfNum = 1 となる
        // ここで、要素モデルから受信したセルを取得する (セル数は海の層の数)
        HySCellData[] csCell = m_csRcvPhytoCO2Cnnct.m_csRcvInfArry[i].GetInterpolatedCellD1();
        if (csCell != null)
        {
            // 各層の受信情報を取得する
            for (int ll = 0; ll < m_PhytoPlanktonInf.m_lLayerNumber; ll++)
            {
                m_PhytoPlanktonInf.m_CO2[ll] += csCell[ll].m_dData[0];
                // 自変数の各層の CO2に加算
            }
        }
    }
} 

 一方、光合成によるO2の排出は 表4.2.2 に示す通り 「"O2 排出量", "g/m3"」、「"CO2 要求量","g/m3"」なので、O2排出量、CO2の要求量の送信は下記の通りおこないます。 尚、SendCO2()がコールされる時点では、生成したO2、要求するCO2の量は設定されています。

ソースコード:4.3.5

/// CO2関連情報送信処理
protected virtual void SendCO2()
{
    HySCellData[] csSndDt = null;
    //呼吸者
    // 供給O2量、排気ガス
    for (int i = 0; i < m_csRcvPhytoCO2Cnnct.m_RcvInfNum; i++)
    {   // CO2を供給する要素モデル数くりかえし

        // ここで、送信するセルを準備する (セル数は海の層の数)
        csSndDt = m_csRcvPhytoCO2Cnnct.m_csSndInfArry[i].PrepareSendCellD1();
        if (csSndDt == null) { break; }
        for (int ll = 0; ll < m_PhytoPlanktonInf.m_lLayerNumber; ll++)
        {   // 各層に対応するセルの各変数に値を設定する
            csSndDt[ll].m_dData[0] = m_PhytoPlanktonInf.m_O2Prduct[ll];  // 生成したO2量
            csSndDt[ll].m_dData[1] = m_PhytoPlanktonInf.m_ReqCO2[ll];    // 要求するCO2量
        }
    }
}


 同様に、肥料関係についても下記の通り送受信処理を実装します。

ソースコード4.3.6

/// 光合成用肥料関連受信処理
protected virtual void ReceiveFertilizer()
{
    for (int i = 0; i < m_csRcvFertilizerCnnct.m_RcvInfNum; i++)
    {   // 肥料を供給する要素モデル数くりかえし

        // ここで、要素モデルから受信したセルを取得する (セル数は海の層の数)
        HySCellData[] csCell = m_csRcvFertilizerCnnct.m_csRcvInfArry[i].GetInterpolatedCellD1();
        if (csCell != null)
        {
            for (int ll = 0; ll < m_PhytoPlanktonInf.m_lLayerNumber; ll++)
            {  // 層の数だけ繰り返し
                m_PhytoPlanktonInf.m_N[ll] += csCell[ll].m_dData[0];
                m_PhytoPlanktonInf.m_P[ll] += csCell[ll].m_dData[1];
                m_PhytoPlanktonInf.m_Si[ll] += csCell[ll].m_dData[2];
                m_PhytoPlanktonInf.m_Fe[ll] += csCell[ll].m_dData[3];
            }
        }
    }
}
/// 光合成用肥料関連送信処理
protected virtual void SendFertilizer()
{
    // 要求量を送信
    for (int i = 0; i < m_csRcvFertilizerCnnct.m_RcvInfNum; i++)
    {   // 肥料を供給する要素モデル数くりかえし

        // ここで、送信するセルを準備する (セル数は海の層の数)
        HySCellData[] csSndDt = m_csRcvFertilizerCnnct.m_csSndInfArry[i].PrepareSendCellD1();
        if (csSndDt == null) { break; }
        for (int ll = 0; ll < m_PhytoPlanktonInf.m_lLayerNumber; ll++)
        {  // 層の数だけ繰り返し
            csSndDt[ll].m_dData[0] = m_PhytoPlanktonInf.m_ReqN[ll];
            csSndDt[ll].m_dData[1] = m_PhytoPlanktonInf.m_ReqP[ll];
            csSndDt[ll].m_dData[2] = m_PhytoPlanktonInf.m_ReqSi[ll];
            csSndDt[ll].m_dData[3] = m_PhytoPlanktonInf.m_ReqFe[ll];
        }
    }
}

 
 ここで、受信/送信処理を作成しましたが、実際の送受信を行う為にはそれらをコールする必要があります。
 そこで、親クラスの  void ReceiveData( )、 void SendData( ) をオーバーライドして必要な送受信を行います。

ソースコード4.3.7

/// 受信
protected override void ReceiveData()
{
    ClearAllCalValue();

    // 養分吸収
    ReceiveFertilizer();
   
    // 捕食:動物プランクトン等からの要求量の取得(親クラスで実装)
    ReceiveReqPREDATION();

    // CO2吸収
    ReceiveCO2();
   
    return;
}
/// 送信例
protected override void SendData()
{
    // 養分吸収:要求量送信
    SendFertilizer();

    //被捕食:捕食者へ提供(親クラスで実装)
    SendPREDATION(m_csOcnBacedlInf.m_dCapturedMass, 0.1, 0.005);

    // CO2吸収:O2排出
    SendCO2();
   
    // 死
    SendEXCRETION_DEATH(m_csOcnBacedlInf.m_dExcretionDencity, m_csOcnBacedlInf.m_dBulkDensity);

    return;
} 


 さて、ここから要素モデルの計算論理を実装していきますが、その前に、計算に必要な定数値や初期値を設定する必要があります。
 本ページのソースコード:4.3.1でプロパティ情報と初期値情報を生成しました。
 その時に定数として設定すべき情報、初期値として設定すべき情報を定義します。
 ソースコード4.3.1のプロパティ情報生成部を詳しく表示します。ここで、設定する変数名にてそのデフォルト値を設定します。
 この設定を行って、モデルのプロパティ画面を表示すると 図4.3.2の様に、プロパティとして設定した値が画面に表示されます。
 この画面で設定値を変更する事が可能です。

ソースコード4.3.8 

if (csModelKind == MzOceanBaseDefine.PHYTOPLANKTONS_KIND)
{   // 植物プランクトン(Phytoplankton)クラス

    csRtnCellPrptyDt.AddInfoType("m_CapturedRatio", "捕まり易さ:確率", McDefine.ValKind.DOUBLE);
                                                       ↑          ↑
                                                       変数名      変数名の説明(プロパティ画面に表示)
    csRtnCellPrptyDt.SetInfo("m_CapturedRatio", 0.05);
                                                                   ↑
                                                                 デフォルト値

    csRtnCellPrptyDt.AddInfoType("m_dSelfSize", "一個体の大きさ mm ", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dSelfSize", 0.04);
    csRtnCellPrptyDt.AddInfoType("m_dSelfWeight", "一個体の体重 g ", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dSelfWeight", 0.004 * 0.004 * 0.004 * 3 * 1.02);
    csRtnCellPrptyDt.AddInfoType("m_dBulkDensity", "比重 ", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dBulkDensity", 1.03);

    // 代謝関係
    csRtnCellPrptyDt.AddInfoType("m_dVMax", "理想時最大成長係数", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dVMax", 6.0);
    csRtnCellPrptyDt.AddInfoType("m_dLight", "懸濁による減光係数", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dLight", 5000.0);

    csRtnCellPrptyDt.AddInfoType("m_dPsat", "Monod の式:肥料(窒素)成長飽和濃度", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dPsat", 1.0);
    csRtnCellPrptyDt.AddInfoType("m_dNsat", "Monod の式:肥料(リン)成長飽和濃度", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dNsat", 1.0);
    csRtnCellPrptyDt.AddInfoType("m_dFesat", "Monod の式:肥料(鉄)成長飽和濃度", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dFesat", 1.0);
    csRtnCellPrptyDt.AddInfoType("m_dSisat", "Monod の式:肥料(珪素)成長飽和濃度", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("m_dSisat", 1.0);

    ………………………
 
    csRtnCellPrptyDt.AddInfoType("d_KDetritus", "枯死率", McDefine.ValKind.DOUBLE);
    csRtnCellPrptyDt.SetInfo("d_KDetritus", 0.001);


    // 受信可能なパターン
    {
        //  光合成養分吸収
        McTranInfoPattern csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.PHOTOSYNTHESIS, csModelKind);
        csRtnCellPrptyDt.AddReceivePattern(csTrnPtn);    // 受信可能パターンの追加

        // 光合成CO2吸収
        csTrnPtn = MzFlowObjBaseFactory.CreateFlow(MzOceanBaseDefine.CO2_ABSORPTION, 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);    // 送信可能パターンの追加
    }
  …………
} 




植物プランクトンのプロパティ設定
    図4.3.2 プロパティ設定コードと、プロパティ画面 

 プロパティ画面で設定した内容を、要素モデルに取り込むには、要素モデルの SetProperty( ) メソッド内で取り込むことができます。
 
ソースコード:4.3.9

public override bool SetProperty(McCellModelPropertyIF csCellMdlPropertyInfo)
{
    bool bRtn = base.SetProperty(csCellMdlPropertyInfo);

    // 使用しやすいようにキャストしておく
    m_csOcnBacedlInf = (MzOceanModelElementCalInfo)m_csCalInfo;

    // プロパティ設定
    McCellModelPropertyInfo csPrptyInfo = csCellMdlPropertyInfo as McCellModelPropertyInfo;
    if (csPrptyInfo != null)
    {
         …………              
            csPrptyInfo.GetInfo("m_CapturedRatio", ref m_csOcnBacedlInf.m_CapturedRatio);
                                                     ↑                   ↑
                                                 変数名                格納する変数
            csPrptyInfo.GetInfo("m_dSelfSize", ref m_csOcnBacedlInf.m_dSelfSize);
            csPrptyInfo.GetInfo("m_dSelfWeight", ref m_csOcnBacedlInf.m_dSelfWeight);
            csPrptyInfo.GetInfo("m_dBulkDensity", ref m_csOcnBacedlInf.m_dBulkDensity);
            csPrptyInfo.GetInfo("m_dEatK", ref m_csOcnBacedlInf.m_dEatK);
            csPrptyInfo.GetInfo("m_dMetabolismK", ref m_csOcnBacedlInf.m_dMetabolismK);
            csPrptyInfo.GetInfo("m_dEexcretionRatio", ref m_csOcnBacedlInf.m_dEexcretionRatio);
            csPrptyInfo.GetInfo("m_dEexcretionSize", ref m_csOcnBacedlInf.m_dEexcretionSize);
 

            csPrptyInfo.GetInfo("m_O2AbsRatio", ref m_csOcnBacedlInf.m_O2AbsRatio);
            csPrptyInfo.GetInfo("m_CO2GenRatio", ref m_csOcnBacedlInf.m_CO2GenRatio);
         …………     
    }
    return bRtn;
} 


 初期値も同様に、ファクトリクラスの CreateModelInitialInfo( )内で設定します。
 図4.3.3に示す様に、プロパティ情報と同様の方法で、変数名とデフォルト値を共に登録します。登録した変数は、初期情報設定画面で確認可能で、またこの画面で設定値を変更可能です。ここで設定した初期値は、要素モデルの Initialize( )メソッドで取得します(ソースコード4.3.10)。
      
 植物プランクトンの初期値設定
   図4.3.3 初期値の設定と初期値設定画面

ソースコード:4.3.10
protected override bool Initialize(ref McPropertyInfoRoot csInitialData, long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
{
  McInitialInfo csInDt = csInitialData as McInitialInfo;
   if (csInDt != null)
   {   // 初期化情報有り
     …………
      double dDtH = 0.0;
      csInDt.GetInfo("TotalMass_L0", ref dDtH);
      m_csOcnBacedlInf.m_TotalSelfMass[0] = dDtH;    // <-- 表層混合層の初期値設定

       csInDt.GetInfo("TotalMass_L1", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[1] = dDtH;   // <-- 真光層の初期値設定

       csInDt.GetInfo("TotalMass_L2", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[2] = dDtH;
       csInDt.GetInfo("TotalMass_L3", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[3] = dDtH;
       csInDt.GetInfo("TotalMass_L4", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[4] = dDtH;
       csInDt.GetInfo("TotalMass_L5", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[5] = dDtH;
       csInDt.GetInfo("TotalMass_L6", ref dDtH);
       m_csOcnBacedlInf.m_TotalSelfMass[6] = dDtH;
    }
} 


 ここまでで、計算を行うための周辺処理(プロパティ情報/初期値情報の設定、接続された他の要素モデルとのデータ送受信)について説明しました。
 次頁では、実際の論理実装を行っていきます。

 


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

初版:2022/07/10 |