14. Python & Batch: pvpythonとpvbatch

14.1. はじめに

ParaViewはParaView GUIを開かずに実行でき、Pythonでコントロールできます。Pythonインターフェースは、pvpythonとpvbatchの2つがあります。

14.2. pvpython

pvpython は、ParaViewのPythonインターフェースです。pvpython はPythonインターフェースを持ったParaViewと考えることができます。Python Shellでやったように、手動で pvpython にコマンドを入力することができます。まず最初にすることは、次のようにimport paraview simpleをすることでしょう。

from paraview.simple import *

pvpython はPythonのコマンドファイルを読むこともできます。引数には pvpython --help とタイプしてください。pvpython のファイルを実行すると、以下のようになります。

/pathTopvpython/pvpython /pathToPythonCommandFile/commandFile.py

# Example
D:/alan/paraview/pvpython D:/alan/scripts/disk_out_ref-A.py
  • pvpython がスクリプトを実行し、終了することに気づくでしょう。スクリプトの出力は、スクリーンショットや他のデータ生成物です。

  • 上記のスクリプトの中で編集が必要な箇所には、editMeHere という文字列が表示されます。

  • データへのパス、出力生成物へのパスを明記する必要があります。

  • 初めて pvpython でスクリプトを実行したとき、出力は切手サイズのウィンドウになります。これを変更するには、renderView1.ViewSize という行を見つけてコメントを解除します。

  • 自分でスクリプトを作って実行してみてください。あるいは、以下のような例もあります。以下をカットして、greenSphere.pyというファイルに貼り付けてください。

    #!/usr/bin/env pvpython
    
    from paraview.simple import *
    
    # Lets create a sphere
    sphere=Sphere()
    Show()
    Render()
    
    # get active view
    renderView1 = GetActiveViewOrCreate('RenderView')
    renderView1.ViewSize = [1670, 1091]
    
    # get display properties
    sphere1Display = GetDisplayProperties(sphere, view=renderView1)
    
    # change solid color
    sphere1Display.AmbientColor = [0.0, 1.0, 0.0]
    sphere1Display.DiffuseColor = [0.0, 1.0, 0.0]
    
    # save screenshot
    SaveScreenshot('greenSphereScreenshot.png', renderView1,
    ImageResolution=[1670, 1091])
    
  • これを次のように実行します。

    /pathTopvpython/pvpython greenSphere.py
    

14.3. pvbatch

pvbatchpvpython に似ていますが、2つの例外があります。pvbatch は入力スクリプトからしかコマンドを受け付けないことと、MPIを使ってビルドされた場合、pvbatch は並列で実行されることです。入力は pvpython と全く同じです。

14.3.1. 一般ユーザー向けセクション

14.3.1.1. ここでは、Windows PCでのpvbatchの使用方法について説明します。

  • Linuxでトレーニングしている場合、pvbatch はbinディレクトリに存在します。

  • OS Xでトレーニングしている場合、ターミナルウィンドウを開き、/Applications/ParaView x.x.x/Contents/bin にcdします。pvbatch はここにあります。

  • Windowsでトレーニングする場合、pvbatch は存在しません。しかし、今回のトレーニングのような単一プロセスでは、pvpython で代用可能です。

14.3.1.2. Pythonトレースを作成してみましょう。

Windowを使っているので、pythonのトレースを作成し、pvpython を使って処理します。

  • exodusのデータ、スクリーンショット、ムービーを読むことができます。

    • paraview を実行します。

    • Tools → Start Trace を選択します。

    • can.ex2を開きます。

    • すべての変数をオンにします。

    • Apply を実行します。

    • +Y.

    • 1タイムステップ進みます。

    • ColoringEQPS に設定します。

    • File → Save Screenshot を選択します。

    • File → Save Animation.

    • Tools → Stop trace.

    • スクリプトをデスクトップに保存します。

    • ファイルを編集し、以下を変更します。

      • 入力データへのパスを修正し、スクリーンショットやアニメーションを出力します(トレースを作成したので必要ありません)。

      • renderView*.ViewSizeの行をアンコメントします。これを適切なサイズに変更します(1920x1080くらい)。

14.3.1.3. Pythonトレースを一括で実行してみよう

  • 上記で作成したスクリーンショットとアニメーションを削除してください。これらを再作成したいと考えています。

  • CMD ウィンドウを開きます。(スタートボタンにcmdと入力し、「コマンドプロンプト」をクリックします)。

  • ParaViewのbinディレクトリにcdコマンドを実行する

    cd C:/Program Files (x86)/ParaView x.x.x/bin**
    
  • トレースを処理するには pvpython を使用します。pvpython はフォワードスラッシュを理解することに注意してください。

    pvpython.exe C:/Users/myUserName/Desktop/trainingExampleScriptA.py
    
  • 先ほど作成したスクリーンショットとアニメーションを開いてください。

14.3.1.4. 引数を受け付けるようにトレースを編集してみよう

  • Pythonトレースを編集します。

  • ExodusIIReaderのすぐ上に、以下のコードを入力します。

    datasetIn = sys.argv[1]
    directoryOut = sys.argv[2]
    imageFilesOut = sys.argv[3]
    print("datasetIn = " + datasetIn)
    print("directoryOut = " + directoryOut)
    print("imageFilesOut = " + imageFilesOut)
    
  • canex2 = ExodusIIReader の行を以下のように編集してください。

    canex2 = ExodusIIReader(FileName=[datasetIn])
    
  • SaveScreenshot(...) の行を以下のように編集してください。

    SaveScreenshot(directoryOut+imageFilesOut+'.png', renderView1,
    ImageResolution=[1425, 1324])
    
  • SaveAnimation(...) の行を以下のように編集してください。

    SaveAnimation(directoryOut+imageFilesOut+'.avi', renderView1,
    ImageResolution=[1424, 1324], FrameWindow=[0, 43])
    
  • ここで、コマンドウィンドウで次のように実行します。

    pvpython.exe "c:/Users/myUserName/Desktop/trainingExampleScriptA.py" "C:/Users/myUsername/Desktop" "coolVizA"
    

14.3.1.5. Linuxでのpvbatchのための汎用Pythonスクリプト

以下は、トレースを作成せずに pvbatch を実行した例です。

  • pvpython の項で説明したように、greenSphere.pyというファイルを作成します。

  • greenSphere.pyをコピーしてredSphere.pyとします。

  • redSphere.pyを編集します。

    • AmbientColor と DiffuseColor を [1.0, 0.0, 0.0] に変更します。

    • 出力ファイルをgreenSphereScreenshot.pngからredShpereScreenshot.pngに変更します。

  • ファイルrunner.shを作成します。

  • 以下のように編集します。

    #!/usr/bin/bash
    
    /pathTopvbatch/pvbatch greenSphere.py
    /pathTopvbatch/pvbatch redSphere.py
    
  • 以下のように実行します。

    source runner.sh
    

14.3.2. Sandia National Labs の特定セクション

このセクションは、Sandia National Laboratoriesのクラスタと環境に特化したものです。

14.3.2.1. クラスタ上のpvbatch

クラスタの1つにsshでログインします。ログインしたノードで pvbatch を実行すると、魔法のように計算ノードを獲得し、バッチ可視化を並列で実行します。プロジェクト/viz/training/paraviewにテストスクリプトがあります。これらのスクリプトは以下のように実行されます。

/projects/viz/paraview/bin/pvbatch_chama_mesa
This is version x.x.x of |pvbatch|.
Incorrect number of argument supplied. Expecting 4 but have 0

Usage: /projects/viz/paraview/bin/pvbatch_chama_mesa <Nodes> <Minutes> <HERT estimate> batchFileFullPath

一例を挙げると:

/projects/viz/paraview/bin/pvbatch_chama_mesa 1 10 FY123456 /projects/viz/training/paraview/whipple-A.py

14.3.2.2. クラスタ上のpvbatchOnNode

pvbatch は、シミュレーションと同じノードで実行することができます。この機能の使い方の詳細はParaViewのヘルプを参照してください。

14.3.2.3. スクリプト例

ここでは、4つの例を紹介します。トレースレコーダーを使用してスクリプトを作成し、これらのスクリプトを pvbatch を使用して実行する予定です。

  • exodusのデータ、スクリーンショット、ムービーを読むことができます。

    • paraview を実行します。

    • Tools → Start Trace.

    • g1s1.e.16.[0-15]をお読みください。

    • 最後のタイムステップへ移動します。

    • 1つ前のタイムステップに戻ります。

    • ColoringEQPS に設定します。

    • File → Save Screenshot.

    • File → Save Animation.

    • Tools → Stop trace.

    • このスクリプトをクラスタに保存します。

    • ファイルを編集し、以下を変更します。

      • 入力データのパスを修正し、スクリーンショットやアニメーションを出力します。

      • renderView*.ViewSize という行をアンコメントします。これを妥当なサイズに変更します(おそらく1920x1080)。

  • exodusデータ読み込みます、Clip、Slice、スクリーンショット、動画。

    • paraview を実行します。

    • Tools → Start Trace.

    • g1s1.e.16.[0-15]をお読みください。

    • 最後のタイムステップへ移動します。

    • 1つ前のタイムステップに戻ります。

    • ColoringEQPS に設定します。

    • Filters → Common → Clip を選択します。

    • Y Normal でスライスします。

    • File → Save Screenshot.

    • File → Save Animation.

    • Tools → Stop trace.

    • このスクリプトをクラスタに保存します。

    • ファイルを編集し、以下を変更します。

      • 入力データへのパスを修正し、スクリーンショットまたはアニメーションを出力します。

      • renderView*.ViewSize という行をアンコメントします。これを妥当なサイズに変更します(おそらく1920x1080)。

      • 以下の行を ColorBy(...,('EQPS')) の上に追加してください。

        g1s110fpse16Display.SetScalarBarVisibility(renderView1, False)
        
  • exodusのデータ読み込み、2Dプロット、スクリーンショット、動画。

    • paraview を実行します。

    • Tools → Start Trace.

    • g1s1.e.16.[0-15]をお読みください。

    • 可能であれば、ポイントを選択します。

    • プロット選択(必要であればライン上にプロット)。

    • プロットEQPS。

    • File → Save Screenshot.

    • File → Save Animation.

    • Tools → Stop trace.

    • ファイルを編集し、以下を変更します。

      • 入力データのパスを修正し、スクリーンショットやアニメーションを出力します。

      • renderView*.ViewSize という行をアンコメントします。これを妥当なサイズに変更します(おそらく1920x1080)。

  • cthデータの読み込み、CTHPartの抽出、スクリーンショット、動画。

    • paraview を実行します。

    • Tools → Start Trace.

    • cth-med/spcthを読み出す[0-3]。

    • ExtractCTHParts - 1。

    • ExtractCTHParts - 2。

    • Tools → Stop trace.