
一晩中大規模なパラメトリックスイープを実行したものの, 翌朝パラメトリックソルバーがまだ完了していないことに気付いたという経験はありませんか? 最後のいくつかのパラメーターが収束するのを待っている間に, すでに計算されているパラメーターの解を検査したいと思うかもしれません. この問題の解決策はバッチスイープを使用することです. これにより, 既に計算されたパラメトリック解が, 可視化や結果評価の目的で開くことができるファイルに自動的に保存されます.
編集者注: このブログは, 2016 年 2 月 2 日に最初に公開されました. その後, 新しい機能を反映するために更新されました.
バッチスイープ: 多くのシミュレーションケースに役立つソリューション
前回のブログでは, バッチスイープにおけるタスク並列処理の付加価値について説明しました. このブログでは, バッチスイープがもう1つの重要な目的, つまり求解プロセス中にパラメトリックスイープの解を取得する方法をどのように満たすのかを見ていきます. バッチスイープを使用すると, 一部のパラメーターでソルバーが失敗した場合でも, 部分的な解を取得できる場合があります. バッチスイープは, 問題の定式化で各パラメーターの解が他のすべてのパラメーターの解から独立している場合に役立ちます.
ソルバースイープ中に部分的な結果を検査したい場合が多くあります. 例えば:
- 入力データのテーブルに基づいてスイープを実行していると, これらの表にまとめられた値の一部の解を取得するのに予想外に長い時間がかかることがわかりましたが, 事前にどの値がどれであるかはわかりません. スイープ全体が完了する前に, 求解プロセスを終了するべきか, 結果の分析を開始すべきかを判断するために, できるだけ多くのパラメーターについて解法を検査したい場合
- 特定の材料特性または境界条件に対して数式を使用しているため, 一部のパラメーターに対して非物理的な結果が得られることが判明している場合
- 複雑な材料を定義するために C または FORTRAN で外部関数を作成したが, すべての入力データに対して確実に機能していないため, 特定のパラメーター値に対して不正な出力データが返される場合
- パラメーターの 1 つがジオメトリの寸法であるようなパラメトリックスイープを実行する場合で, 誤って定義した寸法の範囲が広すぎる場合. これに気づいても, 求解はすでに長期間実行されており, それを停止したくない場合.
これらのいずれかのケースでバッチスイープを使用すると, 各パラメーターを個別に開始および停止できる個別のプロセスで解決できます. すでに求解されたパラメーターの結果は, パラメーター値ごとに MPH ファイルとして保存でき, 求解プロセス中にいくつでも開いて確認できます. 以下の例では, プローブ結果をテキストファイルに保存する方法も示します.
静電センシングの例
実際のバッチスイープを示すために, COMSOL Multiphysics® コア製品のアプリケーションライブラリにある例, 電気センサー を使用します. このモデル例は, ボックスの境界に電位差を適用することによってボックスの内部の画像を返す方法を示します. その結果, ボックス内の媒体の誘電率に依存する表面電荷が得られ, これを使用して, たとえば, ボックス内に物体があるかどうかを判断したり, 物体の形状に関する情報を見つけることさえできます. 同様の技術ですが, 医学的診断用で交流を使用する, 電気インピーダンス断層撮影という応用例もあります.
オリジナルのモデルでは, オブジェクトが 0.8 m の厚さに押し出されています. この例では, 押し出し距離を 0.5 m に変更しました.
パラメトリックスイープの入力データ
10 個のサンプルオブジェクトの集合があり, それぞれの形状は同じですが, 誘電率の値が異なる異なる材料で作られているとします. 私たちは物体が何でできているかに関係なく, その物体とその形状を検出する能力を調査したいと考えています. 10 個のサンプルの誘電率値を補間関数テーブル int1 に保存します. 実際にテーブルを使用して何かを補間するのではなく, 単に表形式の値を保存したり呼び出したりする便利な方法として使用します. (ここでは, 補間方法をデフォルトの線形から最近傍に変更できますが, この場合でも結果は同じになります. )
誘電率値のテーブル.
次に, グローバルパラメーター sn (サンプル番号の略) を使用してサンプル集合に番号を付けましょう.
グローバルパラメーターとしてのサンプル番号パラメーター sn.
モデルには, 材料ノードで定義された 3 つの材料があります. 材料 3 はボックス内の星形のオブジェクトを表し, 材料 2 はその他のオブジェクトを表します. 材料 1 は, 箱の中の物体の周囲の空気に対応します. 材料 3 の材料特性定義内の補間テーブル int1 を適切に呼び出して, 星型オブジェクトの誘電率を変更します. 使用される構文は int1(sn) です. 誘電率には単位がないため, 単位を気にする必要がないことに注意してください.
星形のオブジェクトの誘電率は, パラメーター sn で番号付けされたテーブルから取得されます.
表面電荷のプローブ
星形のオブジェクト上の表面電荷を監視するために, 上面の x = 1.5, y = 1.5, z = 1.0 の位置に境界点プローブを定義します. これをすばやく定義するには, オブジェクト上のおおよその位置でサーフェスをクリックし, 設定ウィンドウで座標値を手動で調整します.
ポイントプローブ式の場合, 変数名 es.nD と単位 nC/m^2 を使用して表面電荷の大きさ (ノルム) を選択します.
単位 nC/m^2 の表面電荷のポイントプローブ式.
後で, このプローブの出力をテキストファイルに書き込みます. このステップの準備をするには, 結果の更新 をクリックします. これにより計算値とテーブル項目が生成されます.
プローブの結果更新ボタン.
COMSOL Multiphysics® におけるバッチスイープの設定
バッチスイープオプションはデフォルトでは表示されません. これを有効にするには, モデルビルダーツールバーから その他のオプションを表示 を選択します. その他のオプションを表示 ダイアログ ボックスで, スタディ→バッチとクラスター を選択します.
モデルビルダーの詳細オプションを表示で有効化されている詳細スタディオプション.
スタディノードを右クリックすると, リストからバッチスイープを選択できます(単一の実行にはバッチスイープの代わりにバッチを選択します).
スタディメニューより選択されたバッチスイープ.
バッチスイープは, スイープ範囲の定義方法に関してはパラメトリックスイープと似ています. ここでは, パラメーター sn を 1 から 10 まで整数ステップでスイープします.
バッチスイープのパラメーター範囲.
結果に何が起こるかを制御するための設定は, バッチスイープ モデルツリーノードにある設定ウィンドウのバッチ設定セクションに収集されます.
バッチスイープを制御する設定.
デフォルトのファイル名はbatchmodel.mphです. この名前は, スイープ内の個々のパラメーターに対応する一連の MPH ファイルを自動的に作成するために使用されます. この名前は変更できますが, この例ではそのままにしておきます. 結果の MPH ファイルの名前は, batchmodel_sn_1.mph, batchmodel_sn_2.mph, …, batchmodel_sn_10.mph となります. 以下では, これらの各ファイルが個別に開いてポスト処理できる完全なモデルであることを示します.
スイープ前セクションには, メッシュ消去と解消去という 2 つのオプションがあります. これらのチェックボックスは, クラスターまたはクラウド上でリモートコンピューティングを実行し, ネットワーク経由で転送されるファイルのサイズを最小限に抑えたい場合にのみ重要であるため, これらのチェックボックスをオフにします (フローティングネットワークライセンスでのみ利用可能).
スイープ中 セクションには, 解の同期と蓄積プローブテーブルの同期の 2 つのオプションがあります. 解の同期は, 保存されているすべてのファイルから結果を取得し, シミュレーションを開始するメインMPH ファイルにそれを収集します. 最終的な結果は, パラメトリックスイープを実行した場合の結果と非常によく似ています. この例では, 個々の結果の検査のみに関心があると想定しているため, このチェックボックスをオフにします. さらに, 大規模なスイープがある場合, すべての結果を収集すると, 多くの時間, RAM, およびディスク容量が消費される可能性があります. ここでは蓄積プローブテーブルを同期を選択したままにします. 蓄積プローブテーブルはプローブからの出力を表し, この情報の収集は完全な解情報と比較して非常に簡単です.
スイープ後で, モデルをファイルに出力チェックボックスをオンにします. これにより, 追加のディスク容量を犠牲にして, 自動的に保存される MPH ファイルに (各パラメータの) 解が確実に含まれるようになります.
次のセクションでは, クラスター計算設定をユーザー制御に変更します. 次に, ディレクトリをC:\COMSOLに変更します. これは, すべてのバッチファイルが保存される場所です.
フローティングネットワークライセンスを持っており, リモートの場所にインストールしてこの計算を実行したい場合は, サーバーディレクトリパスの指定 オプションを使用できます. ここでは, シングルユーザーライセンスを含む, すべての種類の COMSOL ライセンスで利用できる機能のみを取り上げます.
プローブデータをファイルに保存
プローブデータをファイルに保存するには, 通常のプローブテーブルを使用できません. 代わりに, 蓄積プローブテーブルと呼ばれる特別な種類のプローブテーブルを使用する必要があります. 最初のステップは, 結果の下のテーブルノードを右クリックして, プローブテーブルを手動で追加することです. このテーブルの名前を保存されたプローブテーブルに変更します. 間もなく, バッチスイープ機構にここに蓄積プローブテーブルのデータを書き込ませます. 蓄積プローブテーブルは, テーブル内に特定の順序で配置する必要があるデータを非同期的に生成した場合に使用されます. 一般に, さまざまなパラメーターに対応する解がどのような順序で準備されるかはわかりません.
手動による保存プローブテーブルの追加.
保存プローブテーブルの設定で, テーブル保存設定をモデル内およびファイル上に変更します. この例では, プローブ結果をC:\COMSOL\results.txtに保存しています. 非常に大規模なスイープがある場合は, 最大行数の値を増やす必要がある場合があります. (これは通常, 大規模なスイープまたは一時的な解に必要です. )
保存プローブテーブルの設定.
バッチスイープの設定の求解中の出力セクションで, 出力テーブルを保存プローブテーブルに変更します. これが蓄積プローブテーブルになります.
蓄積プローブテーブルとして保存プローブテーブルを使用
バッチスイープの実行
ここで, 計算をクリックまたは選択してバッチスイープを開始できます. 求解中, 外部プロセスウィンドウがグラフィックスウィンドウの下の情報ウィンドウ領域に表示されます.
外部プロセスウィンドウでは, 実行中のバッチプロセスとそのステータスの概要が表示されます. この例では, スイープの各パラメーターに対応するプロセスが 10 個あります.
この段階では, ユーザーインターフェースの大部分は非対話型ですが, 進捗バーの左側にあるジョブの切り離しをクリックして, ユーザーインターフェースの制御を取り戻すことができます.
ジョブの切り離しオプション.
ジョブの切り離しを使用している間, プロセス状態の更新をリアルタイムに取得することはできません. ただし, 個別のプロセスに対して操作を実行することはできます.
すべてのプロセスを停止することも, 行をクリックして特定のプロセスを停止することもできます. テーブル内のステータスが完了のプロセスをクリックして, 別の COMSOL Desktop® ウィンドウで開くこともできます. そこでは, 通常モデルに対して実行するあらゆる種類の可視化タスクやポスト処理タスクを実行できます.
完了した外部プロセスのファイルを開くをクリックすると, COMSOL Desktop® に新しいウィンドウが開き, 結果が表示されます.
プロセス状態のリアルタイム更新に戻るには, 外部プロセスウィンドウの左上隅にあるジョブの接続をクリックします.
外部プロセスウィンドウの接続.
プローブ結果ファイル
テキストエディタを使用して, プローブ出力が含まれるファイル results.txt を開くことができます.
境界ポイントプローブの結果を含むテキストファイルresults.txt.
このファイルは, 解析プロセス中の検査にも使用でき, すべてのパラメーターが収束する前に結果を素早く確認する方法として機能します. これは, バッチスイープだけでなく, 通常のパラメトリックスイープ用にファイルに保存されたテーブルにも当てはまります.
バッチスイープ使用における他の検討事項
パフォーマンス
この例のように, 各計算が高速で多くのメモリを必要としないスイープの場合, バッチスイープを使用した場合の計算時間は, 通常のパラメトリックスイープを使用した場合よりも長くなります. オーバーヘッドは, パラメーターごとに個別の COMSOL Multiphysics® プロセスが開始されることから発生します. 各パラメーターの計算がより要求の厳しいスイープの場合, この時間は比較的短く, あまり問題になりません.
あるパラメーターにおけるクラッシュの取扱い
補間テーブルの代わりに, ユーザー定義の外部 C 関数を呼び出したとします. さらに, C コードでプログラミングエラーが発生し, その結果, スイープしているパラメーターの 1 つまたはいくつかでセグメンテーションフォールトが発生したとします. この場合でも, C:\COMSOL ディレクトリ (または MPH ファイルの保存に選択した任意のディレクトリ) を参照し, それらのファイルを開いて可視化やポスト処理, さらには他の計算を行うことができます.
上記の例でこれをエミュレートする簡単な方法は, 誘電率値の 1 つをゼロに設定し, バッチジョブを開始することです. 誘電率がゼロということは, ソルバーに不適切に定義された (特異な) 方程式 (0 = 1 と同様) を入力していることを意味し, ソルバーがその誤ったパラメーターに対応する解を見つけることができなかったことを示すエラーメッセージが表示されます. ここでも, 保存した MPH ファイルを開いてポスト処理することができます. エントリをゼロ以外のエントリに変更してテーブルを修正すると, エラーメッセージを表示せずにバッチジョブを再度実行できます. エラーが存在する間は, エラーが発生せずに外部プロセスウィンドウを接続することはできないことに注意してください. ウィンドウを接続すると, 蓄積プローブテーブルが他のパラメーターに対して更新されます. エラーを修正して実行するとすぐに, 外部プロセスウィンドウを接続して再びアクセスできるようになります.
マルチコアプロセスの管理
マルチコアマシンを使用している場合は (最近では非常に一般的ですが), バッチスイープで実行できる同時プロセスの数と, それぞれのプロセスにおけるコア数を制御するバッチ 設定を変更できます. 6 コアのマシンがある場合は, たとえば同時ジョブの数を 3 に, コアの数を 2 に変更できます. これにより, 3 つのパラメーターを並行して求解できるようになり, 各ソルバープロセスが 2 つのコアにアクセスできるようになり, この例ではシミュレーション時間が半分に短縮されます.
各パラメーターが小さな計算問題を表すシミュレーションの場合, 同時ジョブの数をコンピューター上のコアの数まで増やすことができます. より大きな問題の場合は, ソルバーのマルチコア処理能力を最大限に活用するために, この設定を 1 つの同時ジョブに維持する必要があります.
同時ジョブとコア数のバッチ設定.
スタディ拡張機能セクションのバッチスイープノードから同時ジョブ数を制御することもできることに注意してください. この場合, コア数は, 物理コアの数を同時ジョブの数で割った値から自動的に計算されます. (これを自動にするには, バッチ設定のコア数チェックボックスを選択しないでください. グレー表示された数値 1 は使用されません. )
バッチスイープとアプリケーションビルダー
アプリケーションビルダーを使用すると, アプリの構築に使用されるモデルでバッチスイープ ノードを使用できます. この場合, アプリはバッチスイープのドライバーとして機能し, 外部プロセスウィンドウに情報は表示されません. 保存された MPH ファイルは, アプリのユーザーインターフェースがない場合と同じ目的で使用されます. 実行が終了したら, ファイルを開いて従来のモデルのポスト処理を行うことができます. バッチスイープを使用するアプリを作成する際の柔軟性を高めるには, プログラミングリファレンスマニュアルに記載のバッチスイープの組み込みメソッドを含むメソッドを使用します. (記録されたコードの生成はライブ実行バッチコマンドと競合するため, ここではコード記録ツールの使用が制限されていることに注意してください. )
バッチスイープとクラスタースイープ
バッチスイープ 機能は, すべての COMSOL Multiphysics® ライセンスタイプで利用できます. フローティングネットワークライセンスをお持ちの場合は, クラスタースイープと呼ばれる追加機能にアクセスできます. これら 2 つの機能は似ていますが, クラスタースイープ オプションにはリモートコンピューティングとクラスター構成のための追加設定があります. クラスタースイープ機能を使用すると, (大規模な可能性がある) クラスターに大規模なスイープを分散できます. 独立したスイープ (厄介な並列計算とも呼ばれます) は通常, 非常に適切に拡張できるため, そうすることによるパフォーマンス上の利点は非常に大きくなります. バッチスイープをマスターしていれば, クラスタースイープを実行するためのステップはそれほど大きくありません.
次のステップ
このブログで説明されているモデルを自分で調べてみませんか? アプリケーションギャラリからダウンロードできます:
参考文献
バッチスイープとクラスタースイープの詳細については, COMSOL ブログの次の記事を参照してください.
コメント (0)