OpenVSP Python API安装配置与使用记录(持续更新)
安装与配环境
Vsp api的安装较为简单,不需要装conda,只要python版本一致即可,我用的3.11(如果不一致,需要自行编译VSP)。找到程序目录下python文件夹,pip install -r requirements.txt就行,装requirements-dev.txt也行。卸载就pip uninstall -r requirements-uninstall.txt。如果在反复安装时遇到error: Cannot update time stamp of directory 'utilities.egg-info'之类的错误,是因为当前终端没有权限写.egg-info子文件夹,把每个模块下的.egg-info目录删除,再尝试即可。
装好后记得把目录加到PATH里面。
无论是用vspscript、python api还是MATLAB API,套路都差不多。照着文档(https://openvsp.org/pyapi_docs/latest/)里写的做,把自带的例子(程序目录下python\openvsp\openvsp\tests子目录下的脚本)跑起来再逐渐改即可。自带脚本的错误捕获功能很不错,可以用来帮助定位错误:
num_err = errorMgr.GetNumTotalErrors()
print("Total Errors: ",num_err)
for i in range(0, num_err):
err = errorMgr.PopLastError()
print("error = ", err.m_ErrorString)
下面是过程中踩的坑和一些例子。
3.42.3版本的VSP API有bug,无法导入翼型。升级到3.43.0解决。也可能是因为doc的版本有更新,函数调用方式改变的原因。总之推荐3.43.0版本,更新了不少有用的内容。但是新版本的部分模块计算不一定稳定,之前有人反映过3.3x版本的涡格法螺旋桨计算不稳定,3.26版本反而要好(具体版本记不清了,总之是这个意思)。
如果在GUI操作时发现从文件导入翼型时没反应,看一眼程序启动时的那个cmd窗口,如果报Unknown IO Error可能是权限不够,也可能是目录有中文名或者空格,把翼型放在不需要管理员权限的目录下才能读。
稳定性分析需要关闭对称面,设定基准工况才能算出此工况下的动导数。相关内容可参考我的另一篇博文。
调用
从官方给的例子开始改。基本套路:检查配置 - 打开文件 - 添加部件 - 设置参数 - 查错 - 输出文件 - 调用VSPAERO进行分析 - 处理结果。
几何建模
一开始要检查配置和初始化错误输出。之后添加部件。
import openvsp as vsp
vsp.VSPCheckSetup()
stdout = vsp.cvar.cstdout
errorMgr = vsp.ErrorMgrSingleton.getInstance()
vsp.ClearVSPModel()
wing_id = vsp.AddGeom("WING")
vsp.SetGeomName(wing_id, "Main Wing")
wing_id这个变量就像个类一样,可以设置它下面的一堆参数。
pos = [0.4, 0.3, -0.05]
vsp.SetParmVal(vtail_id,"X_Rel_Rotation","XForm",90.0)
vsp.SetParmVal(vtail_id,"X_Rel_Location","XForm",pos[0])
vsp.SetParmVal(vtail_id,"Y_Rel_Location","XForm",pos[1])
vsp.SetParmVal(vtail_id,"Z_Rel_Location","XForm",pos[2])
vsp.InsertXSec(wing_id,1,vsp.XS_FILE_AIRFOIL) # 注意这里的"1"不是截面编号,不要改
# 如果你有一堆参数放在数组里,可以这样批量改
vsp.SetParmVal(wing_id, "Root_Chord", f"XSec_{i}", chord[i-1])
vsp.SetParmVal(wing_id, "Tip_Chord", f"XSec_{i}", chord[i])
vsp.SetParmVal(wing_id, "Span", f"XSec_{i}", span[i-1])
vsp.SetParmVal(wing_id, "Sweep", f"XSec_{i}", sweep[i-1])
vsp.SetParmVal(wing_id, "Twist", f"XSec_{i}", twist[i-1])
vsp.SetParmVal(wing_id, "Dihedral", f"XSec_{i}", dihedral[i-1])
如果要批量添加Wing Section,先执行n-1次Insert(假设有n段,第一段不用Insert,默认就有),再逐一设置参数,否则前一段设置完了,插入下一段时会盖掉前一段的Tip Chord。注意这里的XSec编号从1开始。
如果要设置翼型的话,这么写。AF_path_list是我定义的翼型文件名的数组。这个例子是从文件导入翼型。
xsec_surf = vsp.GetXSecSurf(wing_id,i)
vsp.ChangeXSecShape(xsec_surf, i, vsp.XS_FILE_AIRFOIL)
wing_xsec = vsp.GetXSec(xsec_surf,i)
af_path = os.path.abspath(AF_path_list[i])
vsp.ReadFileAirfoil(wing_xsec, af_path)
可以把所有参数打出来,看看所有可以设置的参数列表。在GUI里点对应参数的名字也可以看到参数的详细信息与全名。实在不行还可以用文本编辑器打开生成的.vsp3文件,它本质上是个xml文件,能看到部件的层级、参数名字、部件的ID等信息。
如果要设置截面形状/翼型,可以查截面与翼型的各种类型对应的关键字。
# 获取 wing_id 的所有参数
parm_ids = vsp.GetGeomParmIDs(wing_id)
# 打印参数层级
for parm_id in parm_ids:
group = vsp.GetParmGroupName(parm_id) # 参数组(如"XSec_1")
name = vsp.GetParmName(parm_id) # 参数名(如"Chord")
value = vsp.GetParmVal(parm_id) # 当前值
print(f"{group}/{name} = {value}")
最后更新一下状态,查错,写文件。
vsp.Update()
num_err = errorMgr.GetNumTotalErrors()
print("Total Errors: ",num_err)
for i in range(0, num_err):
err = errorMgr.PopLastError()
print("error = ", err.m_ErrorString)
filename = "PR8.vsp3"
vsp.WriteVSPFile(filename)
接下来可以调用那堆分析工具进行分析。
VSPAERO
首先加载几何模型。一开始例行的检查配置和初始化错误输出什么的略去不表。
vsp.ReadVSPFile(fname)
vsp.Update()
geoms = vsp.FindGeoms()
之后也是类似的办法。
analysis_name = "VSPAEROComputeGeometry"
vsp.SetAnalysisInputDefaults(analysis_name)
method = list(vsp.GetIntAnalysisInput(analysis_name, "AnalysisMethod"))
method[0] = vsp.VORTEX_LATTICE
vsp.SetIntAnalysisInput(analysis_name, "AnalysisMethod", method)
# vsp.PrintAnalysisInputs(analysis_name)
vsp.ExecAnalysis(analysis_name)
## setup VSPAERO - preconfigure everything else in the vsp3 file
analysis_name = "VSPAEROSweep"
vsp.SetAnalysisInputDefaults(analysis_name)
wid = vsp.FindGeomsWithName("Main Wing")
vsp.SetStringAnalysisInput(analysis_name, "WingID", wid, 0)
vsp.SetDoubleAnalysisInput(analysis_name, "AlphaStart", (float(5),), 0)
vsp.SetIntAnalysisInput(analysis_name, "AlphaNpts", (1,), 0)
vsp.SetDoubleAnalysisInput(analysis_name, "MachStart", (0.0,), 0)
vsp.SetIntAnalysisInput(analysis_name, "MachNpts", (1,), 0)
vsp.Update()
# # vsp.PrintAnalysisInputs(analysis_name)
vsp.ExecAnalysis(analysis_name)
# process outputs
history_res = vsp.FindLatestResultsID("VSPAERO_History")
# load_res = vsp.FindLatestResultsID("VSPAERO_Load")
CL = vsp.GetDoubleResults(history_res, "CL", 0)
如果要进行稳定性分析呢?之后完善。

浙公网安备 33010602011771号