PR

OpenVSPのPythonAPIでポーラーカーブを計算する

OpenVSPのPythonAPIで作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行う

スポンサーリンク

はじめに

OpenVSPのPythonAPIで作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行う

↓参考にしたサンプルプログラム(PythonではなくAngelScriptで書かれている)

OpenVSP/examples/scripts/TestAnalysisVSPAERO.vspscript at fc4a97b75c92399fecf74b21f2a57087f89e12b7 · OpenVSP/OpenVSP
A parametric aircraft geometry tool. Contribute to OpenVSP/OpenVSP development by creating an account on GitHub.

ドキュメントが乏しいのはOpen○○系の宿命なのか...

↓まとめ記事

ソースコードの解説

ソースコード全文はこれ

import openvsp as vsp

def vsp_sweep(vsp, alpha, mach):

    print('\n-> Calculate alpha & mach sweep analysis\n')

    # //==== Analysis: VSPAero Compute Geometry to Create Vortex Lattice DegenGeom File ====//
    
    # Set defaults
    compgeom_name = 'VSPAEROComputeGeometry'
    vsp.SetAnalysisInputDefaults(compgeom_name)

    # List inputs, type, and current values
    print(compgeom_name)
    vsp.PrintAnalysisInputs(compgeom_name)
    print('')

    # Execute
    print('\tExecuting...')
    compgeom_resid = vsp.ExecAnalysis(compgeom_name)
    print('\tCOMPLETE')

    # Get & Display Results
    vsp.PrintResults(compgeom_resid)
    print('')

    # //==== Analysis: VSPAero Sweep ====//

    # Set defaults
    analysis_name = 'VSPAEROSweep'
    vsp.SetAnalysisInputDefaults(analysis_name)

    # Reference geometry set
    geom_set = [0]
    vsp.SetIntAnalysisInput(analysis_name, 'GeomSet', geom_set, 0)
    ref_flag = [1]
    vsp.SetIntAnalysisInput(analysis_name, 'RefFlag', ref_flag, 0)
    wid = vsp.FindGeomsWithName('WingGeom')
    vsp.SetStringAnalysisInput(analysis_name, 'WingID', wid, 0)

    # Freestream Parameters
    alpha_npts = len(alpha)
    vsp.SetDoubleAnalysisInput(analysis_name, "AlphaStart", [alpha[0]], 0)
    vsp.SetDoubleAnalysisInput(analysis_name, "AlphaEnd", [alpha[-1]], 0)
    vsp.SetIntAnalysisInput(analysis_name, "AlphaNpts", [alpha_npts], 0)
    mach_npts = [len(mach)]
    vsp.SetDoubleAnalysisInput(analysis_name, 'MachStart', mach, 0)
    vsp.SetIntAnalysisInput(analysis_name, 'MachNpts', mach_npts, 0)

    vsp.Update()

    # List inputs, type, and current values
    print(analysis_name)
    vsp.PrintAnalysisInputs(analysis_name)
    print('')

    # Execute
    print('\tExecuting...')
    rid = vsp.ExecAnalysis(analysis_name)
    print('COMPLETE')

    # Get & Display Results
    # vsp.PrintResults(rid)

使い方のサンプル

import sys
import os

import openvsp as vsp

# ../bin/AnalysisVSPAERO.py をモジュールとしてインポート
sys.path.append(os.path.join(os.path.dirname(__file__), '..')) # 親ディレクトリをモジュール探索パスに追加
from bin.AnalysisVSPAERO import vsp_sweep

if __name__ == '__main__':

    # //==== Analysis: VSPAero Sweep ====//

    # Close and open the file
    vsp.ClearVSPModel()
    vsp.Update()
    vsp.ReadVSPFile('G103A.vsp3')  # Sets VSP3 file name
    vsp.Update()

    alpha = list(range(-4, 13, 2))  # -4 to 12 with step of 2
    mach = [0.1]
    vsp_sweep(vsp=vsp, alpha=alpha, mach=mach)

解説していく

準備するもの

今回はGUIで作成したモデルを用いて、VSPAEROによる解析の部分だけをプログラムにする

https://github.com/mtkbirdman/OpenVSP/blob/main/G103A/G103A.vsp3

GUIにおけるモデリングのやり方もいつか記事にはしたいと思っている

全体の流れ

全体の流れは以下の通り

大きく分けて3ステップで、各ステップのプログラムはそこまで複雑ではないので案外読めばわかると思う

ステップ1: モデルの初期化と読み込み

# Close and open the file
vsp.ClearVSPModel()
vsp.Update()
vsp.ReadVSPFile('G103A.vsp3')  # Sets VSP3 file name
vsp.Update()

まず、vspクラスを初期化し、事前に作成したモデルファイル(G103A.vsp3)を読み込む

↓メソッドの詳細

vsp.ReadVSPFile(file_name)

VSP3ファイルからOpenVSPプロジェクトをロードする関数

引数
file_name:*.vsp3 のファイル名

ステップ2: Degen_Geomの生成

# //==== Analysis: VSPAero Compute Geometry to Create Vortex Lattice DegenGeom File ====//

# Set defaults
compgeom_name = 'VSPAEROComputeGeometry'
vsp.SetAnalysisInputDefaults(compgeom_name)
print(compgeom_name)

# List inputs, type, and current values
vsp.PrintAnalysisInputs(compgeom_name)

# Execute
print('\tExecuting...')
compgeom_resid = vsp.ExecAnalysis(compgeom_name)
print('COMPLETE')

# Get & Display Results
vsp.PrintResults(compgeom_resid)

ここでは、VSPAEROの解析を行うためのDegenGeomファイル(作成したモデルを簡略化したパネルのモデル)を作成している

↓メソッドの詳細

vsp.SetAnalysisInputDefaults(analysis_name)

実行する解析に必要なすべての入力にデフォルトの値を設定する関数

引数
analysis_name:実行する解析の名前 [str]

analysis_nameとして設定できる名前の例

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

'VSPAEROComputeGeometry'におけるInputはこれ

VSPAEROComputeGeometry
   [input_name]                  [type]         [#]     [current values-->]
   AlternateInputFormatFlag      integer        1       0
   AnalysisMethod                integer        1       0
   GeomSet                       integer        1       0
   Symmetry                      integer        1       0

AnalysisMethod:VLMかパネル法かを選択するフラグ
GeomSet:DegenGeomを作成するもととなるSet
Symmetry:左右対称のモデルかどうか

このInputをもとにCompGeomを実行し、DegenGeomファイルを作成している

vsp.PrintAnalysisInputs( analysis_name )

実行する解析の入力値を標準出力する関数

引数
analysis_name:実行する解析の名前 [str]

↓こんな感じで出力される

   [input_name]                  [type]         [#]     [current values-->]
   AlternateInputFormatFlag      integer        1       0
   AnalysisMethod                integer        1       0
   GeomSet                       integer        1       0
   Symmetry                      integer        1       0
results_id = vsp.ExecAnalysis(analysis_name)

Analysis Managerを通して指定した解析を実行する関数

引数
analysis_name:実行する解析の名前 [str]

返値
results_id:実行された解析ID [str]

vsp.PrintResults(results_id)

指定した解析IDの解析結果を標準出力する関数

引数
results_id:解析ID [str]

↓こんなのが出力される

VSPAERO Geometry results.
   [result_name]                 [type]         [#]     [current values-->]
   AnalysisMethod                integer        1       0
   Analysis_Duration_Sec         double         1       9.090000000000000302e-01
   CompGeomFileName              string         1
   DegenGeomFileName             string         1       G103A_DegenGeom.csv
   GeometrySet                   integer        1       0
   Mesh_GeomID                   string         2

ステップ3: VSPAEROのスイープ解析の実行

# //==== Analysis: VSPAero Sweep ====//

# Set defaults
analysis_name = 'VSPAEROSweep'
vsp.SetAnalysisInputDefaults(analysis_name)

# Reference geometry set
geom_set = [0]
vsp.SetIntAnalysisInput(analysis_name, 'GeomSet', geom_set, 0)
ref_flag = [1]
vsp.SetIntAnalysisInput(analysis_name, 'RefFlag', ref_flag, 0)
wid = vsp.FindGeomsWithName('WingGeom')
vsp.SetStringAnalysisInput(analysis_name, 'WingID', wid, 0)

# Freestream Parameters
alpha_npts = len(alpha)
vsp.SetDoubleAnalysisInput(analysis_name, "AlphaStart", [alpha[0]], 0)
vsp.SetDoubleAnalysisInput(analysis_name, "AlphaEnd", [alpha[-1]], 0)
vsp.SetIntAnalysisInput(analysis_name, "AlphaNpts", [alpha_npts], 0)
mach_npts = [len(mach)]
vsp.SetDoubleAnalysisInput(analysis_name, 'MachStart', mach, 0)
vsp.SetIntAnalysisInput(analysis_name, 'MachNpts', mach_npts, 0)

vsp.Update()

# List inputs, type, and current values
vsp.PrintAnalysisInputs(analysis_name)
print('')

# Execute
print('\tExecuting...')
rid = vsp.ExecAnalysis(analysis_name)
print('COMPLETE')

生成されたDegenGeomをもとに以下の手順でVSPAEROの解析を行う

↓メソッドの詳細

vsp.SetAnalysisInputDefaults(analysis_name)

実行する解析に必要なすべての入力にデフォルトの値を設定する関数

引数
analysis_name:実行する解析の名前 [str]

'VSPAEROSweep'のInputはこれ

VSPAEROSweep
   [input_name]                  [type]         [#]     [current values-->]
   2DFEMFlag                     integer        1       0
   ActuatorDiskFlag              integer        1       0
   AlphaEnd                      double         1       12.000000
   AlphaNpts                     integer        1       9
   AlphaStart                    double         1       -4.000000
   AlternateInputFormatFlag      integer        1       0
   AnalysisMethod                integer        1       0
   AutoTimeNumRevs               integer        1       5
   AutoTimeStepFlag              integer        1       1
   BetaEnd                       double         1       0.000000
   BetaNpts                      integer        1       1
   BetaStart                     double         1       0.000000
   CGGeomSet                     integer        1       0
   Clmax                         double         1       -1.000000
   ClmaxToggle                   integer        1       0
   FarDist                       double         1       -1.000000
   FarDistToggle                 integer        1       0
   FixedWakeFlag                 integer        1       0
   FromSteadyState               integer        1       0
   GeomSet                       integer        1       0
   GroundEffect                  double         1       -1.000000
   GroundEffectToggle            integer        1       0
   HoverRamp                     double         1       0.000000
   HoverRampFlag                 integer        1       0
   KTCorrection                  integer        1       0
   MachEnd                       double         1       0.000000
   MachNpts                      integer        1       1
   MachStart                     double         1       0.100000
   Machref                       double         1       0.300000
   ManualVrefFlag                integer        1       0
   MassSliceDir                  integer        1       0
   MaxTurnAngle                  double         1       -1.000000
   MaxTurnToggle                 integer        1       0
   NCPU                          integer        1       4
   NoiseCalcFlag                 integer        1       0
   NoiseCalcType                 integer        1       0
   NoiseUnits                    integer        1       0
   NumMassSlice                  integer        1       10
   NumTimeSteps                  integer        1       100
   NumWakeNodes                  integer        1       64
   Precondition                  integer        1       0
   ReCref                        double         1       4400000.000000
   ReCrefEnd                     double         1       20000000.000000 
   ReCrefNpts                    integer        1       1
   RedirectFile                  string         1       stdout
   RefFlag                       integer        1       1
   Rho                           double         1       0.002377
   RotateBladesFlag              integer        1       0
   Sref                          double         1       17.881853
   Symmetry                      integer        1       0
   TimeStepSize                  double         1       0.001250
   UnsteadyType                  integer        1       0
   Vinf                          double         1       30.000000
   Vref                          double         1       30.000000
   WakeNumIter                   integer        1       5
   WingID                        string         1       FJECIMNCTU
   Xcg                           double         1       3.030569
   Ycg                           double         1       -0.000000
   Zcg                           double         1       0.409975
   bref                          double         1       17.536553
   cref                          double         1       0.996386

多い!と思うが、よく見ると変数名がGUIのこれと対応している

vsp.SetIntAnalysisInput( analysis, name, indata, index=0)

実行する解析に整数の入力値を設定する関数

引数
analysis:実行する解析の名前 [str]
name:入力の名前 [str]
indata:整数の入力値の配列 [list <int>]
index:データのインデックス [int]

↓使い方の例

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

↓今回はGUIでいうところのこれを設定している

「From Model」の部分
右側の「Npts」の部分

geom_id = vsp.FindGeomsWithName( name )

指定された名前を持つすべてのGeom IDを検索して返す関数

引数
name:ジオメトリの名前 [str]

返値
geom_id:ジオメトリ名の配列 [array of str]

↓使い方の例

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

vsp.SetStringAnalysisInput(analysis_name, name, indata, index)

特定の解析に対して文字列型の入力の値を設定する関数

引数
analysis_name:特定の解析の名前 [str]
name:入力名 [str]
indata:入力の値の配列 [Array of str]
index:データのインデックス [int]

↓使い方の例

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

vsp.SetDoubleAnalysisInput(analysis_name, name, indata, index)

特定の解析に対してDouble型の入力の値を設定する関数

引数
analysis_name:特定の解析の名前 [str]
name:入力名 [str]
indata:入力の値の配列 [Array of double]
index:データのインデックス [int]

↓使い方の例

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

↓今回はGUIでいうところのこれを設定している

右側の「Alpha Start」「End」「Mach Start」の部分

vsp.PrintAnalysisInputs( analysis_name )

実行する解析の入力値を標準出力する関数

引数
analysis_name:実行する解析の名前 [str]

↓こんな感じで出力される

VSPAEROSweep
   [input_name]                  [type]         [#]     [current values-->]
   2DFEMFlag                     integer        1       0
   ActuatorDiskFlag              integer        1       0
   AlphaEnd                      double         1       12.000000
   AlphaNpts                     integer        1       9
   AlphaStart                    double         1       -4.000000
   AlternateInputFormatFlag      integer        1       0
   AnalysisMethod                integer        1       0
   AutoTimeNumRevs               integer        1       5
   AutoTimeStepFlag              integer        1       1
   BetaEnd                       double         1       0.000000
   BetaNpts                      integer        1       1
   BetaStart                     double         1       0.000000
   CGGeomSet                     integer        1       0
   Clmax                         double         1       -1.000000
   ClmaxToggle                   integer        1       0
   FarDist                       double         1       -1.000000
   FarDistToggle                 integer        1       0
   FixedWakeFlag                 integer        1       0
   FromSteadyState               integer        1       0
   GeomSet                       integer        1       0
   GroundEffect                  double         1       -1.000000
   GroundEffectToggle            integer        1       0
   HoverRamp                     double         1       0.000000
   HoverRampFlag                 integer        1       0
   KTCorrection                  integer        1       0
   MachEnd                       double         1       0.000000
   MachNpts                      integer        1       1
   MachStart                     double         1       0.100000
   Machref                       double         1       0.300000
   ManualVrefFlag                integer        1       0
   MassSliceDir                  integer        1       0
   MaxTurnAngle                  double         1       -1.000000
   MaxTurnToggle                 integer        1       0
   NCPU                          integer        1       4
   NoiseCalcFlag                 integer        1       0
   NoiseCalcType                 integer        1       0
   NoiseUnits                    integer        1       0
   NumMassSlice                  integer        1       10
   NumTimeSteps                  integer        1       100
   NumWakeNodes                  integer        1       64
   Precondition                  integer        1       0
   ReCref                        double         1       4400000.000000
   ReCrefEnd                     double         1       20000000.000000 
   ReCrefNpts                    integer        1       1
   RedirectFile                  string         1       stdout
   RefFlag                       integer        1       1
   Rho                           double         1       0.002377
   RotateBladesFlag              integer        1       0
   Sref                          double         1       17.881853
   Symmetry                      integer        1       0
   TimeStepSize                  double         1       0.001250
   UnsteadyType                  integer        1       0
   Vinf                          double         1       30.000000
   Vref                          double         1       30.000000
   WakeNumIter                   integer        1       5
   WingID                        string         1       FJECIMNCTU
   Xcg                           double         1       3.030569
   Ycg                           double         1       -0.000000
   Zcg                           double         1       0.409975
   bref                          double         1       17.536553
   cref                          double         1       0.996386
results_id = vsp.ExecAnalysis(analysis_name)

Analysis Managerを通して指定した解析を実行する関数

引数
analysis_name:実行する解析の名前 [str]

返値
results_id:実行された解析ID [str]

使い方

↓環境構築はこれ

ディレクトリ構成は以下の通り

./
├─bin
│  │  AnalysisVSPAERO.py
│  └─ CST.py
└─G103A
    │  test_sweep.py
    └─ G103A.vsp3

G103A.vsp3のモデルをtest_sweep.pyで解析する

import sys
import os

# ../bin/AnalysisVSPAERO.py をモジュールとしてインポート
sys.path.append(os.path.join(os.path.dirname(__file__), '..')) # 親ディレクトリをモジュール探索パスに追加
from bin.AnalysisVSPAERO import vsp_sweep

if __name__ == '__main__':
    alpha = list(range(-4, 13, 2))  # -4 to 12 with step of 2
    mach = [0.1]
    vsp_sweep(alpha=alpha, mach=mach)

PowerShellを立ち上げ、以下のコマンドで実行する(ログが標準出力されるので、VSPSweepにリダイレクトする)

conda activate vsppytools
python .\test_sweep.py > VSPAEROSweep.log

↓リダイレクトって何?

about_Redirection - PowerShell
PowerShell からテキスト ファイルに出力をリダイレクトする方法について説明します。

↓リダイレクトされたログはこれ

OpenVSP/G103A/VSPAEROSweep.log at main · mtkbirdman/OpenVSP
Contribute to mtkbirdman/OpenVSP development by creating an account on GitHub.

GUIでVSPAEROを実行したときに下のウィンドウに表示されるのと同じものである

結果は「G103A_DegenGeom.polar」というファイルに保存される

      Beta             Mach             AoA             Re/1e6             CL              CDo              CDi             CDtot             CDt            CDtot_t             CS              L/D               E               CFx              CFy              CFz              CMx              CMy              CMz              CMl              CMm              CMn              FOpt 
  0.000000000000   0.100000000000  -4.000000000000   4.400000000000  -0.079953934012   0.009375010969  -0.000156555160   0.009218455809   0.000803055806   0.010178066774  -0.000001190684  -8.673245896242   0.012834996971   0.003618695615  -0.000001190684  -0.080402217217   0.000000466719   0.012530194910  -0.000000416986  -0.000000466719   0.012530194910   0.000000416986   0.000000000000
  0.000000000000   0.100000000000  -2.000000000000   4.400000000000   0.139006218840   0.009553011860   0.000769246699   0.010322258559   0.000603130375   0.010156142235  -0.000001118964  13.466647637739   0.034647188638   0.015167217594  -0.000001118964   0.138561298379   0.000000444343   0.017771001005  -0.000000394351  -0.000000444343   0.017771001005   0.000000394351   0.000000000000
  0.000000000000   0.100000000000   0.000000000000   4.400000000000   0.358058196922   0.010258243768   0.002169378539   0.012427622307   0.002309103374   0.012567347141  -0.000001338727  28.811480433009   0.190938483338   0.012427622307  -0.000001338727   0.358058196922   0.000000178963   0.023561131269  -0.000000454546  -0.000000178963   0.023561131269   0.000000454546   0.000000000000
  0.000000000000   0.100000000000   2.000000000000   4.400000000000   0.576666663177   0.011478691829   0.004055630839   0.015534322668   0.005921701822   0.017400393650  -0.000000306917  37.122098948154   0.396215666411  -0.004600516732  -0.000000306917   0.576857513469  -0.000000126855   0.030476336725  -0.000000237646   0.000000126855   0.030476336725   0.000000237646   0.000000000000
  0.000000000000   0.100000000000   4.000000000000   4.400000000000   0.795319503490   0.013200193032   0.006451234613   0.019651427645   0.011455319998   0.024655513031   0.000001795207  40.471334594003   0.595749151627  -0.035875126308   0.000001795207   0.794752959449  -0.000000373731   0.037175967747   0.000000416358   0.000000373731   0.037175967747  -0.000000416358   0.000000000000
  0.000000000000   0.100000000000   6.000000000000   4.400000000000   1.013554402126   0.015398690357   0.009361287283   0.024759977640   0.018910961135   0.034309651491   0.000000691625  40.935190526484   0.767923846663  -0.081320944201   0.000000691625   1.010590167474  -0.000000505225   0.044423282222  -0.000000121172   0.000000505225   0.044423282222   0.000000121172   0.000000000000
  0.000000000000   0.100000000000   8.000000000000   4.400000000000   1.229254331131   0.018019399576   0.012922757803   0.030942157379   0.028625915029   0.046645314605   0.000008272918  39.727492691811   0.903872508432  -0.140438106702   0.000008272918   1.221597628474  -0.000000397574   0.050843366707   0.000001871375   0.000000397574   0.050843366707  -0.000001871375   0.000000000000
  0.000000000000   0.100000000000  10.000000000000   4.400000000000   1.446412420567   0.021083397920   0.017030330297   0.038113728217   0.040227780140   0.061311178061   0.000011997211  37.949906457428   1.015961208605  -0.213632185942   0.000011997211   1.431056545276  -0.000000755050   0.058410703700   0.000002497380   0.000000755050   0.058410703700  -0.000002497380   0.000000000000
  0.000000000000   0.100000000000  12.000000000000   4.400000000000   1.659519895799   0.024468682538   0.021943574428   0.046412256966   0.054815407120   0.079284089658   0.000012465276  35.756069716901   1.098263404672  -0.299635549685   0.000012465276   1.632905055266  -0.000001489137   0.063929393350   0.000001881569   0.000001489137   0.063929393350  -0.000001881569   0.000000000000

以上

おわりに

OpenVSPのPythonAPIで作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行った

ドキュメントの読み方もなんとなくわかってきたので、次はトリムドポーラーを計算できるようになりたい

↓関連記事

コメント