嘉兴微信网站建设/专业网页设计和网站制作公司
本案例以球阀为对象,基于其仿真参数化文件,演示如何对仿真流程进行界面开发,形成定制化仿真模板的完整过程。1、需求描述球阀控制水通过1英寸(25.4毫米)直径管道,在不同流速和阀门开度时,会对应着不同的管道压降。通过仿真模板开发形成定制化界面,需实现用户通过界面输入流速和阀门开度后,执行计算功能后即可完成整个分析流程,输出并显示管道压降。
2、知识储备在开始之前,我们需要了解:仿真模板开发涉及仿真流程开发和界面开发两个阶段。在仿真流程开发阶段中,首先需要对仿真流程进行参数化,实现的方式有两种:Workbench参数化和脚本参数化;然后通过WB脚本对仿真流程进行集成和调用。界面开发阶段中,我们将仿真流程封装起来,提供与仿真流程中输入和输出参数间交互的用户界面。整个开发过程中,需要掌握的知识内容如下:
3.1 WB参数化在WB中创建分析项目,并对阀门开度(valveAngle)和入口流速(inletVelocity)设置进行参数化,详情查看《案例:流体仿真分析参数化Step by Step》,完成后项目和参数视图如下。
3.2 脚本开发编写WB脚本代码,实现Parameter Set下的输入参数:阀门开度(P1)和入口流速(P3)的修改,并将输入参数初始值用特殊字符替换,脚本内容如下。
3.6 界面后端代码开发后端代码用于实现界面交互功能,包括脚本参数替换、WB批处理调用、求解计算和结果读取等,具体代码如下。
点击ValveApp.exe即可运行仿真模板程序,运行效果如下视频所示。4、后记在实际仿真模板开发项目中,大部分工作量都集中在仿真流程开发上。当然界面开发难度会随着参数数量与交互复杂性的增大而急剧增大。界面开发的方式有很多种,比如常用的C#的WinForms或Python的PyQt5等,大家可以根据自己的喜好去选择。仿真流程参数化是仿真流程开发中的关键部分,我们可以通过WB参数化功能或者是脚本参数化实现。WB参数化方式存在局限性:只适用于几何拓扑和边界类型不变的模型,即计算只会改变其大小与位置尺寸、边界条件值。如果涉及几何拓扑、物理模型、边界类型的更改和自动后处理操作等,就需要采用更灵活和通用性脚本参数化的方式。《往期内容推荐》轻松搞定ANSYS仿真参数化案例:流体仿真分析参数化Step by Step基于Python的Workbench开发指南+案例解析Workbench开发指南:仿真流程集成SCDM二次开发快速入门|应用+技巧SCDM二次开发系列:Doc对象详解SCDM二次开发系列:对象选择SCDM二次开发系列:智能选择SCDM二次开发系列:创建命名组SCDM二次开发系列:参数化建模
觉得有收获记得转发给你的朋友们哦!

- 首先需熟悉ANSYS仿真操作过程,可以在Workbench平台对仿真流程进行参数化;WB参数化方法可以查看往期文章《轻松搞定ANSYS仿真参数化》。如果是采用脚本参数化的方式,需要了解软件模块对应的脚本开发知识,如SCDM中的Python脚本、Fluent中的Scheme脚本、Mechanical中的ACT Python脚本。
- 然后了解WB框架结构和脚本功能,并熟练使用Python对脚本代码进行仿真流程集成和功能扩展。内容参照前期的《基于Python的Workbench开发指南+案例解析》和《Workbench开发指南:仿真流程集成》。
- 最后具备面向对象编程和代码封装能力,至少掌握一种常用界面开发(GUI)技术,如C#的WinForms开发或WPF开发、QT界面开发等技术。


# encoding: utf-8import osvalveAngle = "@valveAngle" # 定义阀门开度参数值inletVelocity = "@inletVelocity" # 定义入口速度参数值# 获取设计点对象,赋值到变量dpdp = Parameters.GetDesignPoint(Name="0")# 设置阀门开度参数-P1值为valveAngle变量值dp.SetParameterExpression(Parameter=Parameters.GetParameter(Name="P1"), Expression="%s [degree]" % valveAngle)# 设置入口速度参数-P3值为inletVelocity变量值dp.SetParameterExpression(Parameter=Parameters.GetParameter(Name="P3"), Expression="%s [m s^-1]" % inletVelocity)# 更新Workbench仿真系统Update()
3.3 脚本功能扩展添加结果输出代码到脚本中,在仿真系统更新完成后,自动输出最大网格扭曲度(P2)和管道压降(P4),最后保存项目文件。# 功能扩展:参数输出
output_list = ["P2", "P4"]
def export_result(param_list):
cur_dir = os.path.split(os.path.realpath(__file__))[0]
with open(os.path.join(cur_dir, "result.txt"), "w") as result:
for param_name in param_list:
param = Parameters.GetParameter(Name=param_name)
result.write(param.DisplayText + "={:.4f}\n".format(param.Value.Value))
# 输出结果值到result.txt文件中
export_result(output_list)
Save(Overwrite=True) # 保存计算文件
3.4 保存项目及脚本文件将上述脚本代码内容放在一起保存为Valve.py;在Workbench界面中,选择File -> Archive功能,将项目文件保存为Valve.wbpz。项目和脚本文件放在同一个文件夹中。3.5 用户界面代码开发采用C#的WinForms开发技术,可以进行可视化的界面设计。首先打开Visual Studio2015,执行文件 -> 新建 -> 项目,选择创建Visual C#模板下的Windows窗体应用程序,解决方案和名称都为ValveApp;然后在VS2015中将工具箱中的Label、GroupBox、TextBox和Button控件拖动到窗体(Form)上,创建下图所示窗体控件布局和内容。
脚本参数替换
private static void CreatePyScript(string srcPath, string srcParam, string dstParam){ var src = new StreamReader(srcPath); string pyScript = src.ReadToEnd(); src.Close(); if (srcParam != null) pyScript = pyScript.Replace(srcParam, dstParam); var dst = new StreamWriter(srcPath); dst.Write(pyScript); dst.Close();}
WB批处理调用
private static bool RunWB2(int ver, string wbpzPath, string pyPath){ Process p = new Process(); string ansysVer = string.Format("AWP_ROOT{0}", ver); string ansysDir = System.Environment.GetEnvironmentVariable(ansysVer); //判断是否安装对应ANSYS版本 if (ansysDir == null) { throw (new Exception("This version of ANSYS is not installed!")); } string ansysWbPath = Path.Combine(ansysDir, "Framework\\bin\\Win64\\runwb2.exe"); try { p.StartInfo.FileName = ansysWbPath; p.StartInfo.Arguments = " -F \"" + wbpzPath + "\" -B -R \"" + pyPath + "\""; p.Start(); p.WaitForExit(); p.Close(); return true; } catch (Exception e) { string errorMsg = "ANSYS calculation failed, please check the Settings!\n" + e.Message; p.Close(); throw (new Exception(errorMsg)); }
求解计算
private bool solve(out string workDir){ string exePath = Directory.GetCurrentDirectory(); //获取当前执行程序地址 string srcWbPath = Path.Combine(exePath, "wb_files", "Valve.wbpz"); string srcScriptPath = Path.Combine(exePath, "wb_files", "Valve.py"); //创建临时工作目录 workDir = Path.Combine(exePath, "temp_files", DateTime.Now.ToString("yyyyMMddHHmm")); if (Directory.Exists(workDir) == false) Directory.CreateDirectory(workDir); string dstScriptPath = Path.Combine(workDir, "Valve.py"); string dstWbPath = Path.Combine(workDir, "Valve.wbpz"); //拷贝项目和脚本文件到工作目录 File.Copy(srcWbPath, dstWbPath, true); File.Copy(srcScriptPath, dstScriptPath, true); //替换脚本参数为界面输入值 CreatePyScript(dstScriptPath, "@valveAngle", txtAngleInput.Text); CreatePyScript(dstScriptPath, "@inletVelocity", txtVelInput.Text); bool flag = RunWB2(193, dstWbPath, dstScriptPath); return flag;}
结果文件读取
Mesh-Max=0.8733
pressure-drop-op=4091.4672
编写代码读取文件数据,将最大网格扭曲度和管道压降的结果存在泛型数组里。private static List<string> GetOutputValues(string resultPath)
{
List<string> res = new List<string>();
if (File.Exists(resultPath))
{
var sr = new StreamReader(resultPath);
string line;
string value;
while ((line = sr.ReadLine()) != null)
{
value = line.Split('=')[1].Trim();
res.Add(value);
}
sr.Close();
}
return res;
}
3.7 界面事件处理事件(Event)基本上说是一个用户操作,如按键、点击、鼠标移动等等;应用程序需要在事件发生时对事件进行响应。通过事件机制可以实现界面控件调用后端功能代码。本案例中,我们为btnSolve按钮添加一个Click事件,挂接到btnSolve_Click方法上,以此实现完整仿真流程调用。private void btnSolve_Click(object sender, EventArgs e)
{
string workDir;
bool flag = solve(out workDir);
if (flag)
{
string outputPath = Path.Combine(workDir, "result.txt");
List<string> resList = null;
//读取结果文件,获取输出参数
resList = GetOutputValues(outputPath);
if (resList.Count == 2) //更新界面控件显示
{
txtMeshOutput.Text = resList[0];
txtPressOutput.Text = resList[1] + " [Pa]";
MessageBox.Show("仿真流程计算完成!", "Valve Simulation");
}
}
}
3.8 编译和运行在VS2015中编译项目代码,生成应用程序ValveApp.exe,然后将原始项目和脚本文件放在wb_files文件夹中,将应用程序和wb_files文件夹放在同一目录,文件结构如下图所示。
