前の章 (連立代数方程式と解の存在性) では連立方程式の組み立てを説明しました。連立方程式が組み立てられ、ブロック三角化まで処理が進行すれば、 計算順序が決定します。
このトピックスは以下のセクションを含みます。
計算時期の決定
連立方程式は一般に非線形ですので繰り返し計算で解きます(もし線形なら1回か2回の繰り返しで解が得られるはずです)。 また、時間に依存する要素がある場合(<I>型等)、時刻の進行と共に値が変化していくので計算は一度で済むわけではありません。 ただ、直接もしくは間接的に<S>型や<T>型だけから計算されるものは最初に一度計算するだけで、 何度も計算する必要はありません。このようなことを考慮してProcessor は無駄な計算を実行しないように、 計算タイミングに応じて変数をグループ分けして以下のようにフラグを設定します。
-
FLAG.COMPUTED_INITIAL_STAGE
<S>型や<T>型だけから直接もしくは間接的に計算されるので最初に一度だけ計算すればいいもの。
-
FLAG.COMPUTED_PRINT_TIME
値の出力時(印刷時刻)ににだけ計算すればいいもの。 時間に影響される変数を上流に持ち、それ自身は時刻、積分変数、微分変数等を計算することに寄与しないものです。
-
FLAG.COMPUTED_EVERY_TIME
時刻、積分変数、微分変数と、それらの上流に位置する変数で、時刻が変わったら必ず計算する必要があるもの。
-
FLAG.COMPUTED_FINAL_STAGE
上記以外で、最終結果のみ必要と指定されたもの。
出力タイミングの指定
上記 FLAG.COMPUTED_xxxxx のフラグは Processor が設定し、実際の計算は設定されたタイミングで実行されます。 同様に以下のように、利用者が値の出力タイミングを設定できます。 <R>型(USERFLAG.REQUIRED)指定は実際には以下のフラグ全てを | で結合したものです。
USERFLAG.PRINT_INITIAL_STAGE
最初に一度だけ出力すればよいもの。
USERFLAG.PRINT_PRINT_TIME
出力時刻がきたときに出力。
USERFLAG.PRINT_EVERY_TIME
毎積分ステップ時に出力。
USERFLAG.PRINT_FINAL_STAGE
最終結果のみ出力。
注意事項: |
---|
USERFLAG.PRINT_xxxxx のフラグは値の出力タイミングの設定(ユーザが設定)であり、 FLAG.COMPUTED_xxxxx のフラグは実際の計算タイミングの設定(Processorが設定)です。 従って、USERFLAG.PRINT_FINAL_STAGEで、かつ、FLAG.COMPUTED_EVERY_TIMEのフラグを持つこともあり得ます。 |
注意事項: |
---|
出力指定といっても、Dsl には具体的に変数の値を出力する機能はありません。 値の出力は代数計算の開始や終了、そして積分ステップの終了時に呼ばれる delegate 等を設定して利用者が自分でファイルやデータベースに出力することになります。 |