2章 準備勉強
2.2 FORTRANのモデルをC#で制作する (その3)
namespace RiverModelDLL { public class PrptyInf { } } |
namespace RiverModelDLL |
メンバー変数には m_ という接頭文字を付けます。 この方法はハンガリアン表記法の中の一つの規則で、CommonMPも大枠はハンガリアン表記法に準じています。 ハンガリアン表記法には色々批判もありますが、ローカル変数とメンバー変数の区別が区別できるなど プログラムをわかり易くする効果があります。
// -- メンバー変数 -- /// <summary>シミュレーション時刻</summary> protected double m_T; /// <summary>計算目標時刻</summary> protected double m_GoalT; /// <summary>δT</summary> protected double m_DT; /// <summary>出力ファイル名称</summary> protected string m_sOutFileName = "CalOut.csv"; |
RiverModelクラスのINPUTメソッドで RiverModelのメンバー変数に値を設定したいので、INPUTメソッドの引数であるPrptyInf クラスに、計算目標時刻と時刻増加分のメンバー変数を追加します。コメント ///<summary>。。。。。</summary>はMicrosoft Visual C# を使用し、変数定義文の前行で’ /// ’ と入力すると自動的に追加されます。 メンバー変数の宣言及びメソッドの宣言を Microsoft Visual C# が追記してくれたコメント形式で作成しておくと、Doxgen等のツールを利用してのソースからドキュメント生成等に役立ちます。
// -- メンバー変数 -- /// <summary>計算目標時刻(秒)</summary> public double m_GoalT = 48.0 * 3600.0; /// <summary>δT(秒)</summary> public double m_DT = 48.0 * 3600.0 / 2400.0; |
///
<summary>プロパティ設定</summary>
if( m_T > m_GoalT
) Calculate(); // 計算 OUTPUT(); // 計算結果出力
m_T = m_T +
m_DT; }
|
using RiverModelDLL; //
プロパティ情報を設定 csRvrMdl. INITIAL(); //
計算開始 |
using RiverModelDLL; namespace DynamicWaveLine |
using RiverModelDLL; namespace DynamicWaveLine { public class DynamicWavePrptyInf : PrptyInf { 。。。。。。。。。 |
・INPUTメソッド: オーバーライドするメソッドであるので override を追加し、引数を 「DynamicWavePrptyInf」の親クラスである「PrptyInf」に変更します。
・INITIALメソッド: オーバーライドするメソッドであるので override を追加します。
・OUTPUTメソッド: オーバーライドするメソッドであるので override を追加します。 また、親クラスのメソッドは protected 宣言されているので、このメソッドもprotected に変更します。 さらに、引数:Jは不要であり、もう一方の引数:T は 親クラスのメンバー変数:m_T と同じなのでこの引数も不要となります。
・COEFFメソッド: 外部には一切開放しないので アクセス権限を public から private に変更します。
・QINメソッドもCOEFFメソッドと同様の変更を行います。
public override void INPUT(PrptyInf csPrpty)
public override void INITIAL()
protected override void OUTPUT()
private double QIN(double T)
private void COEFF(long I,ref double FQ, ref double FV, ref double FP, ref double FF)
DYNAMICメソッドの for (long J = 0; J <= NT - 1;
J++)のループ内部に記述している内容が実際のモデルの計算を行う部分なので、
protected override void
Calculate()
の 内部に移動させます。
///
<summary>計算</summary>
double dQIN =
QIN(m_T); for
(long I = 1; I <= NX;
I++)
H1[I] = H[I] - FQ *
m_DT; for
(long I = 0; I <= NX;
I++) //if
((NSKIP * (long)(J1 / NSKIP) - J1) ==
0) ←この部分は不要 |
protected override void
OUTPUT
() |
public override void INPUT
(PrptyInf csPrpty)
DynamicWavePrptyInf csPrptyInf = csPrpty as
DynamicWavePrptyInf; // 派生クラス側にキャスト //XL
= 100.0 *
1000.0;
//SLOPE = 1.0 /
2000.0; QB =
200.0;
m_sOutFileName =
csPrptyInf.OutFileName; |
//
モデルインスタンス生成 //RiverModel csRvrMdl = new RiverModel(); // <-- コメントアウト RiverModel csRvrMdl = new DynamicWaveModel(); // <-- 派生クラスに置き換え // プロパティ情報インスタンス生成 //PrptyInf csMdlPrp = new PrptyInf(); // <-- コメントアウト PrptyInf csMdlPrp = new DynamicWavePrptyInf(); // <-- 派生クラスに置き換え |
//
モデルインスタンス生成 //RiverModel csRvrMdl = new RiverModel(); // <-- コメントアウト RiverModel csRvrMdl = new KinematicWaveModel(); // <-- 派生クラスに置き換え // プロパティ情報インスタンス生成 //PrptyInf csMdlPrp = new PrptyInf(); // <-- コメントアウト PrptyInf csMdlPrp = new KinematicWavePrptyInf(); // <-- 派生クラスに置き換え |
初版:2013/06/12 |