探索ANSYS APDL与二次开发:联合仿真分析基础

引言

前文我们主要介绍了APDL语言的一些基本功能,如循环(*do)、判断(*if)和读(*vread)写(*vwrite)文件等功能,这些功能都是二次开发的基础。


目前主流的有限元分析仿真软件有ANSYS、ABAQUS和NASTRAN等,而程序语言有FORTRAN、C++等编译语言,以及MATLAB、Python等解释语言。

本文我们主要讨论仿真软件和MATLAB以及C++实现联合仿真分析的一些关键基础问题,且结构分析部分用ANSYS实现,其余功能由C++和MATLAB实现。

联合仿真分析需要处理如下几个问题:

  • 主程序(函数)和子程序(函数)分别是什么;
  • 各自的接口是什么;
  • 数据信息如何传递。

以上三个问题得以解决,则联合仿真流程就算是建立起来了。

主程序(函数)和子程序(函数)

一个完整的联合仿真分析,必须由一个主程序和若干个子程序构成,至于哪个软件充当主程序,哪个软件充当子程序,完全取决于具体的问题。

结构受外力作用会产生变形,需要对结构变形指标进行评估。显然,此问题中,负责计算结构变形的程序就是主程序,而计算变形指标的程序就是子程序。

以上问题如果引入控制因素,情况就不一样了。若结构受到的外力取决于结构的变形情况,即外力会根据变形而实时进行调整,这个问题就是一个典型的带反馈的控制问题,在该情况下,我们通常将控制程序作为主程序,负责计算结构变形程序作为子程序。

值得注意的是,确定主程序和子程序的大原则就是逻辑清晰,程序实现高效便捷。

接口

ANSYS接口:/SYS命令和/SYP命令

  • /SYS, String ——调用不带参数的外部子程序。

如调用Windows拷贝和删除文件等操作。

/sys,copy E:\AnsysWork\Test1.txt E:\AnsysWork\Test2.txt

/sys,del E:\AnsysWork\Test.txt

当然,我们可以在外部用FORTRAN、C++和MATLAB生成一个exe程序,然后用String参数表示exe可执行程序的完整路径,命令格式如下:

/sys,E:\Vc_work\Debug\Test.exe

  • /SYP, String, ARG1, ARG2,…, ARG8 ——调用带参数的外部子程序。

考虑C++编译生成的exe程序(MATLAB生成exe程序将在下一篇讨论),主函数如下:


void main(int argc, char**argv)
{
	fstream InFileR("E:\\VC_work\\Result.dat",ios::out | ios::in);
	InFileR<<"参数个数argc="<<argc<<endl;
	InFileR<<"参数值路径(String)argv[0]="<<argv[0]<<endl;
	InFileR<<"参数值(ARG1)argv[1]="<<argv[1]<<endl;
	InFileR<<"参数值(ARG2)argv[2]="<<argv[2]<<endl;
	InFileR.close();	
}

值得注意的是,main函数的第一个变量argc存储的是传入参数的个数,路径也当做一个参数计算在内;字符指针argv的第一个元素值argv[0]即为exe程序的路径,其余argv[1]、argv[2]、…argv[8]为具体的参数值。

在ANSYS中执行如下命令:

/syp,E:\VC_work\Debug\Test.exe,4,10

则显示结果如下:


MATLAB接口:命令符“!”、system函数和open函数

对于system函数和open函数,读者可查看帮助文件,学习使用方法。在此,笔者仅列出使用命令符“!”调用exe程序(ANSYS)的代码。

!"D:\Program Files\ANSYS Inc\v150\ansys\bin\winx64\ANSYS150.exe" -B -I E:\AnsysWork\APDL.txt -O E:\AnsysWork\Out.txt

以上三个绝对路径分别为:ANSYS安装路径、APDL文件路径和ANSYS输出文件路径。

C++接口:WinExec函数、ShellExec函数和CrateProcess函数

对于ShellExec函数和CrateProcess函数,读者可查看帮助文件,学习使用方法。在此,笔者仅给出WinExec函数的使用方法。

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow)

其中lpCmdLine表示exe程序路径;uCmdShow表示显示关键字,如SW_SHOW,SW_MAXIMIZE,SW_HIDE等。

调用exe程序(ANSYS)的代码如下:

int Status=WinExec("D:\\Program Files\\ANSYS Inc\\v150\\ansys\\bin\\winx64\\

ANSYS150.exe -B -I E:\\AnsysWork\\APDL.txt -O E:\\AnsysWork\\Out.txt",

SW_HIDE);

数据信息传递

当子程序(函数)是带参数和返回值的函数时,主程序(函数)可直接通过传参调用的方式将参数传递给子程序(函数),然后子程序(函数)通过变量或指针返回。虽然C++和MATLAB分别和ANSYS之间调用时,上述方法不能实现,但是可以通过文件的形式实现数据信息的传递(虽然效率较低)。

比如:C++调用ANSYS时,前者为主程序(函数),后者为子程序(函数),因此首先运行C++写输入数据文件;然后调用ANSYS,在ANSYS中首先读入输入数据文件,然后分析计算,最后写结果数据文件;当ANSYS运行完以后程序回到C++当中,此时,可以读取结果数据文件,程序继续执行,再加上终止条件就构成了一套完整的分析流程。


最后

本文主要介绍了如何确定主程序和子程序、ANSYS分别和C++以及MATLAB之间相互调用的接口和数据信息传递,下一篇主要用实例演示ANSYS和MATLAB以及C++之间的相互调用过程实现联合仿真分析。


-完-

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空