OpenVSPのPythonAPIで作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行う
はじめに
OpenVSPのPythonAPIで作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行う
↓参考にしたサンプルプログラム(PythonではなくAngelScriptで書かれている)
ドキュメントが乏しいのは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による解析の部分だけをプログラムにする
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.ClearVSPModel()
現在のOpenVSPモデルをクリアする関数
↓使い方の例
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
として設定できる名前の例
'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を作成するもととなるSetSymmetry
:左右対称のモデルかどうか
この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]
↓使い方の例
↓今回はGUIでいうところのこれを設定している
geom_id = vsp.FindGeomsWithName( name )
指定された名前を持つすべてのGeom IDを検索して返す関数
引数name
:ジオメトリの名前 [str]
返値geom_id
:ジオメトリ名の配列 [array of str]
↓使い方の例
vsp.SetStringAnalysisInput(analysis_name, name, indata, index)
特定の解析に対して文字列型の入力の値を設定する関数
引数analysis_name
:特定の解析の名前 [str]name
:入力名 [str]indata
:入力の値の配列 [Array of str]index
:データのインデックス [int]
↓使い方の例
vsp.SetDoubleAnalysisInput(analysis_name, name, indata, index)
特定の解析に対してDouble型の入力の値を設定する関数
引数analysis_name
:特定の解析の名前 [str]name
:入力名 [str]indata
:入力の値の配列 [Array of double]index
:データのインデックス [int]
↓使い方の例
↓今回はGUIでいうところのこれを設定している
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
↓リダイレクトって何?
↓リダイレクトされたログはこれ
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で作成済みのモデルのポーラーカーブの計算(αスイープの計算)を行った
ドキュメントの読み方もなんとなくわかってきたので、次はトリムドポーラーを計算できるようになりたい
↓関連記事
コメント