Rescale での複数の動作点シミュレーションの計算時間を短縮する

アンドラブログ2
概要
コンピューター シミュレーションは、さまざまな条件下でシステムがどのように動作するかを調べるためによく使用されます。たとえば、ある範囲のマッハ数で動作する翼やさまざまな圧力比でジェット エンジンのコンプレッサーを動作させる数値流体力学 (CFD) シミュレーションなどです。 これらのシミュレーションは計算コストが高く、実行には数時間から数日かかる場合があります。 解決までの時間を短縮する XNUMX つの戦略は、より適切な初期条件を使用してシミュレーションを開始することです。 最終解に「近い」初期条件をソルバーに提供することで、必要な反復回数が減り、計算時間が短縮されます。 適切な初期条件を提供すると、特に翼の失速などの複雑な物理現象を伴う動作点でのシミュレーションの安定性も向上します。
この投稿では、約 0.5 度の迎え角でマッハ数 0.9 ~ 3 の範囲で翼の周りの乱流をシミュレーションします。前の計算の結果は次の計算の初期条件として使用されます。 (たとえば、マッハ 0.5 の結果はマッハ 0.6 の計算を初期化するために使用されます)。 激動のONERA M6 チュートリアル オープンソースのスタンフォード大学非構造化 (SU2) CFD ソルバーは、これらの計算の基礎として機能します。 ここで使用されるメッシュと構成ファイルは SU2 からのものです。 Githubリポジトリ。 以前のソリューションを次の計算への入力として使用することは、Rescale インターフェイスを使用していつでも可能でしたが、新しい「カスタム最適化」Python SDK を使用すると、ユーザーはこれを単一のジョブ内でプログラム的に行うことができます。
次のリンクを使用してジョブを複製または表示し、手順に従うことができます。
クローンジョブ
仕事を見る
Python スクリプト開発
最初のステップは、計算を実行し、タスク用の SU2 構成ファイルを変更するための Python スクリプトを開発することです。 ここでは、実験計画法ジョブで使用される「テンプレート」と同様の概念を使用します。 構成ファイル input-template.cfg のいくつかの行は、Python スクリプトによって値を入力できるように変更されています (以下のようにマッハ数を設定します)。 完全な構成ファイルのテンプレートはジョブ内にあります。

%--- 圧縮可能な自由ストリームの定義 ---% % % マッハ数 (無次元、自由ストリームの値に基づく) MACH_NUMBER= ${Mach} % % 迎え角 (度、圧縮性流れの場合のみ) AoA = 3.06

計算の実行に使用される Python スクリプトの全文を以下に示します。 次に、各部分について説明し、重要な概念を指摘し、提案を提供します。 SU2 計算では、別の計算を開始するために特定の「再起動」ファイルが生成されることに注意してください。 このリスタート ファイルには、各ノード ポイントのソリューション プリミティブの値が含まれています。

import optimization_sdk as rescale import os import shutil CONFIG_TEMPLATE_FILE = 'input-template.cfg' MESH_FILE = 'mesh.su2' # テンプレートを設定するためのヘルパー関数 def replace_in_file(filepath, pattern, replace): with open(filepath, 'r') as f: data = f.read() data = data.replace(pattern, replace) with open(filepath, 'w') as f: f.write(data) # 操作点を (Mach で) 定義します op_points = ( 0.5, 0.6, 0.7, 0.8, 0.9) # 全体的な実行回数を定義します rescale_run = 1 # op_points の mach の操作点をループします: print "Run: %d Mach: %0.4f..." % (rescale_run, mach ) # 入力テンプレート構成ファイルをコピーし、config_run = 'input-%d.cfg' を設定します。 % rescale_run shutil.copyfile(CONFIG_TEMPLATE_FILE, config_run) replace_in_file(config_run, "${Mach}", str(mach)) input_files = [config_run , MESH_FILE] # 計算結果の「再起動」ファイルを定義します restart_file = 'restart_file_%d.dat' % rescale_run replace_in_file(config_run, "${Restart-file-out}", restart_file) Output_files = [restart_file] # rescale_run != 1 の場合、前のソリューションから再起動するソルバー: # 再起動は可能 replace_in_file(config_run, "${Restart}", 'YES') restart_file_previous = 'restart_file_%d.dat' % (rescale_run - 1) input_files.append( restart_file_previous) else: # これは最初の実行であるため、再起動はできません replace_in_file(config_run, "${Restart}", 'NO') restart_file_previous = 'none' replace_in_file(config_run, "${Restart-file-in}" 、restart_file_previous) # 計算クラスター上で SU2 を実行するコマンドを生成し、送信します。 command = 'Parallel_computation.py -n $RESCALE_CORES_PER_SLOT -f %s' % config_run run = rescale.submit( command, input_files=input_files, Output_files=output_files, var_values={'Mach': mach} ) # 実行が完了するまで待ちます実行番号をインクリメントします run.wait() rescale_run += 1

最初のブロックから始めて、

import optimization_sdk as rescale import os import shutil CONFIG_TEMPLATE_FILE = 'input-template.cfg' MESH_FILE = 'mesh.su2'

ここでは、ファイル操作に便利な Python モジュール os と shutil をインポートしています。 ただし、より重要なのは、実行の送信に使用される Rescale 最適化 SDK です。 このモジュールは、カスタム最適化ジョブの実行時に Python パスに自動的に配置されます。 構成テンプレートとメッシュのファイル名も宣言されます。

# 操作点を (Mach 単位で) 定義します op_points = (0.5, 0.6, 0.7, 0.8, 0.9) # 全体の実行回数を定義します rescale_run = 1 # op_points で mach の操作点をループします: print "Run: %d Mach: %0.4f..." % (rescale_run, mach) # 入力テンプレート構成ファイルをコピーし、config_run = 'input-%d.cfg' を設定します % rescale_run shutil.copyfile(CONFIG_TEMPLATE_FILE, config_run) replace_in_file(config_run, "${Mach }", str(mach)) input_files = [config_run, MESH_FILE] # 計算結果の「リスタート」ファイルを定義 restart_file = 'restart_file_%d.dat' % rescale_run replace_in_file(config_run, "${Restart-file-out} "、再起動ファイル) 出力ファイル = [再起動ファイル]

このブロックでは、まず各操作点を表すマッハ数のリストを定義し、グローバル実行カウントを定義します (rescale_run)。 この実行カウントは必須ではありませんが、追跡目的には役立ちます。 次に、for ループに入り、各操作点を実行します。 実行固有の構成ファイルが作成され、必要なマッハ数が設定されます。 次に、実行の入力ファイル名のリスト、つまり構成ファイルとメッシュ ファイルを定義します。 これらのファイルは、オプティマイザー ノードからコンピューティング ノードに転送されます。 最後に、計算の結果として得られる「再起動」ファイルは restart_file_.dat という名前になり、構成ファイルに設定されます。 この再起動ファイルは、実行終了後に計算ノードからオプテ​​ィマイザー ノードに転送される出力ファイルのリストに追加されます。
残りのブロックはすべて、上で定義した for ループ内にあることに注意してください。

# rescale_run != 1 の場合、前のソリューションから再起動するようにソルバーをセットアップします: # 再起動は可能 replace_in_file(config_run, "${Restart}", 'YES') restart_file_previous = 'restart_file_%d.dat' % (rescale_run - 1) input_files .append(restart_file_previous) else: # これは最初の実行であるため、再起動はできません replace_in_file(config_run, "${Restart}", 'NO') restart_file_previous = 'none' replace_in_file(config_run, "${Restart-file-内}"、restart_file_previous)

ここでソルバーの初期条件を設定します。 初めての実行ではない場合は、初期条件を設定するために使用できる再起動ファイルがあります。 この場合、構成ファイルは前回の実行の再起動ファイルを使用するように設定され、この再起動ファイルが入力ファイルのリストに追加されます。 初めての実行の場合、使用可能な再起動ファイルはなく、これは構成ファイルで設定されます。

# 計算クラスター上で SU2 を実行するコマンドを生成し、送信します。 command = 'Parallel_computation.py -n $RESCALE_CORES_PER_SLOT -f %s' % config_run run = rescale.submit( command, input_files=input_files, Output_files=output_files, var_values={'Mach': mach} )

次に、計算を実行するコマンドを定義します。 Parallel_computation.py は、マルチコア計算を実行するために SU2 によって提供される Python ラッパー スクリプトです。 $RESCALE_CORES_PER_SLOT を使用してコアの数を定義していることに注意してください。 この環境変数は、ハードウェア設定に基づいて自動的に作成されます。 次に、実行するコマンド、入力ファイルと出力ファイル、そして最後にこの実行の変数値 (この場合は単なるマッハ数) を指定して実行が送信されます。

# 実行が完了するのを待ち、実行番号をインクリメントします run.wait() rescale_run += 1

最後のブロックでは、for ループを続行して実行回数を増やす前に、実行が完了するまで待機するようにスクリプトに指示します。 実行からのリスタート ファイルは、出力ファイルとして宣言したため、計算ノードからオプテ​​ィマイザー ノードに自動的に転送されます。
Rescale でのジョブの実行
Python スクリプトを開発したら、次に Rescale プラットフォームでジョブを実行します。 「ジョブ タイプ」は「最適化」に設定され、Python スクリプト、メッシュ ファイル、構成テンプレート ファイルを含む zip ファイル MachOpPoints.zip が入力ファイルとしてアップロードされます。
入力ファイル
「オプティマイザー設定」で、「カスタム」オプションとコマンドが Python スクリプト (python runOpPoints.py) を実行するように設定されています。 この作業用のソフトウェアとしても SU2 が選択されています。
オプティマイザ設定
最後に、「ハードウェア設定」ページで、スロットごとに 4 つのニッケル コアと XNUMX つのスロット (計算が次々に実行されるため) を選択します。 これでジョブを送信する準備が整いました。
ハードウェア設定
各操作点は、実行 1 の「子実行」として表示されます (1.1、1.2 などのラベルが付いています)。 各計算のファイルをライブ テールできます。 下の画像では、2 回目の計算 (マッハ 0.7) について、SUXNUMX からの残留情報が含まれる process_output.log ファイルを調べています。
ライブテール
作業が完了するまでに約 5 時間かかります。 完了すると、以下のように「結果」タブが表示され、XNUMX つの実行が表示されます。
結果ウィンドウすべて
1.2 番目の実行 XNUMX をクリックすると、そのジョブに固有のファイルが表示されます。
run2-結果
Python スクリプトによって生成された input-2.cfg 構成ファイルと、前回の実行からの再起動ファイル restart_file_1.dat が表示されます。 process_output.log ファイルを調べると、次の行が表示されます。

フロー ソリューションを restart_file_1.dat から読み取ります。

リスタートファイルの初期条件を使用して計算が開始されたことを確認します。
Rescale のプラットフォームの詳細に興味がある場合は、info@rescale.com までお問い合わせください。

類似の投稿