4章
要素モデル自作の方法
4.3
「植物プランクトン」要素モデル(その1)
〜 海洋モデル用要素モデルの作成例(サンプルプロジェクト:「McOceanSampleModels.csproj
」) 〜
ここでは、全体モデルが要素モデルの組み合わせで制作可能である事を示すことを主な目的としております。
この為、各要素モデルの詳細論理は不正確です。
そこで、各要素の動作に詳しい方は自ら要素モデルを生成して入れ替えて 頂けると良いと思います。
さらに、不足要素モデルの追加や、接続の誤りなども自由に変更し、新しい要素モデル接続を作成して頂 けることを期待しています。
正に、CommonMPはこのようにして色々な専門家の目を通してモデルを成長させていく事を目的の一つにしています 。
この段階で作成する要素モデルは『それっぽい』モデルであり、定量的な検証等は何もしておりません。
今後、モデル全体の完成が見えてきた所で、モデルの中身を詳細に検証し一つずつ正確なモデルに置き換えていきます。
この様に、CommonMPを使用すると、トップダウン的にモデルの構築を行う ことが可能です。
此処で作成するプロジェクトは要素モデルを作成するサンプルとして「McOceanSampleModels.csprj」とします。 下にプロジェクトで作成する要素モデルのソースファイルと、ライブラリ管理画面での表示の例を示します。
図 これから作成するサンプルプロジェクト内のソース、及びライブラリ管理画面に表示される要素モデル
先ずは、生態系モデルの根幹をなす「植物プランクトン」要素モデルを作成します。
図4.3.1に示しように植物プランクトンを中心として、関連する要素モデルを接続します。 先ず、植物プランクトンが光合成を行う為には、海中のCO2と肥料成分が必要です。そこで、要素モデルとして、「海中溶融ガス」、「栄養成分」を制作します。「植物プランクトン」へ入力としては、「海中溶融ガス」からは、CO2の供給を受けます。また「栄養成分」からは、「リン」、「窒素」、「鉄」、「シリカ」の供給を受けます。
光については、必ず晴天であり、光強度は深さと海水中の濁り(有機物量)に応じて一意に決定できるとして、要素モデルとして作成しません。
一方、植物プランクトンからの出力として、捕食により「動物プランクトン」に有機物を供給します。また、「植物プランクトン」が死を迎えた場合にその死骸は有機物として「デトリタス」に提供されます。
図4.3.1 植物プランクトンに関連する要素モデル
先ず、植物プランクトンモデルは、親クラスの「MzOceanModelElement」クラスから派生で制作します。
型紙プロジェクト「McOceanModelTemplate」をコピーして作成したプロジェクトにおいて、「MzOceanXXXMdl」クラスが存在するので、その名称を植物プランクトンモデルのクラス名とします。
サンプルプロジェクトに於いては、植物プランクトンのクラス名「MzOceanPhytoplanktons」というクラス名としています。
同様に、植物プランクトンの演算モデル内変数クラスを「MzOceanModelElementCalInfo」から派生させた「MzOceanPhytoplanktonsCalInfo」名称で作成します。
植物プランクトンの識別子は、
namespace
CommonMP.HYMCO.Ocean.McOceanSampleModels
//
光合成CO2吸収
// 排泄 or
死
}
m_csCalModelInforList.AddLast(csModelInfo); } // end of class } |
public class MzOceanPhytoplanktons :
MzOceanModelElement // 光合成肥料吸収:
McOceanBaseDefine.PHOTOSYNTHESIS |
/// 入力側の接続情報チェック // 【植物プランクトン固有】光合成CO2吸収 // 【植物プランクトン固有】光合成による養分使用 return bRtn; |
/// 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に加算 } } } } |
/// CO2関連情報送信処理 // ここで、送信するセルを準備する
(セル数は海の層の数) |
/// 光合成用肥料関連受信処理 // ここで、要素モデルから受信したセルを取得する
(セル数は海の層の数) // ここで、送信するセルを準備する
(セル数は海の層の数) |
/// 受信 // 養分吸収 // CO2吸収 //被捕食:捕食者へ提供(親クラスで実装) // CO2吸収:O2排出
return; |
if (csModelKind ==
MzOceanBaseDefine.PHYTOPLANKTONS_KIND)
csRtnCellPrptyDt.AddInfoType("m_CapturedRatio",
"捕まり易さ:確率",
McDefine.ValKind.DOUBLE);
csRtnCellPrptyDt.AddInfoType("m_dSelfSize", "一個体の大きさ mm
", McDefine.ValKind.DOUBLE); // 代謝関係 csRtnCellPrptyDt.AddInfoType("m_dPsat", "Monod
の式:肥料(窒素)成長飽和濃度", McDefine.ValKind.DOUBLE); ………………………
//
光合成CO2吸収 // 排泄 or
死 |
public override bool SetProperty(McCellModelPropertyIF
csCellMdlPropertyInfo) // プロパティ設定
csPrptyInfo.GetInfo("m_O2AbsRatio", ref
m_csOcnBacedlInf.m_O2AbsRatio); |
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 |