在Matlab可以方便地实现各种优化算法,ABAQUS可以方便地进行有限元建模及求解,有时候两者结合可以更方便做一些自己想做的事,例如通过遗传算法,神经网络等算法进行参数反演,确定本构模型的参数。ABAQUS/CAE的内核语言是Python,通过Python可以方便地读取ABAQUS的结果数据库odb的数据。这里介绍一些关于如何进行三者的交互,编写交互的方法与经验。关于ABAQUS中odb的数据结构这里就不多说,参考相关书籍。通过matlab提交inp文件给ABAQUS计算
可以在matlab里面直接通过系统调用向ABAQUS提交计算文件及相关计算参数,包括用户子程序,cpu数量等。下面是一个函数接口。
接口函数例子:runabaqus(Path,UserFile,InpFile,cpus):
这是一个Matlab接口函数,同时也是实现程序。功能是根据指定参数向ABAQUS提交计算文件,并监测ABAQUS计算过程。参数列表(Path,userFile,InpFile,cpus)含义分别为:
1)Path:inp计算文件所在的绝对路径。
2)UserFile:用户Fortran子程序,如果有子程序就给子程序的文件名,没有的话就不要这个参数,把runabaqus的一行代码inputFile=[‘abaqus job=’,InpFile,’ user=’,userFile,’ cpus=’,cpus],改为inputFile=[‘abaqus job=’,InpFile,’ cpus=’,cpus]。
3)InpFile:inp计算文件的文件名。
4)cpus:指定ABAQUS求解器使用的cup数量。
其实只需一条命令,system(abaqus job=Inpfile )就可以完成提交计算文件,其他都是辅助,使接口函数适用性更好,把实现方法封装起来。有了接口函数,在matlab定义好相关参数,调用接口就行。
应用例子:
—matlab利用python脚本读取odb数据
思路是:matlab把读取数据的要求写入个txt文件(这里是req.txt),调用python脚本,python脚本读取odb的结果数据,并写入另一个txt文件(这里是RF3.txt),matlab再从txt文件读取数据。首先编写python接口函数,实现从odb提取特定的结果数据。
例子:读取一个参考点的反力RF3 这是一个python程序,是get_history_output接口的功能实现程序,被get_history_output接口函数调用。其功能是读取req.txt里的参数,按照设定的参数读取odb数据库,并把结果写入”结果关键字.txt”文件,例如读取的是反力RF3时,其结果会被写入”RF3.txt”文件,以供其他程序使用。
有了python脚本就可以在matlab里调用它来读取ABAQUS的结果数据。当然在matlab里要指定odb文件名,部件名,节点名称等信息,为了把实现封装起来,也把调用python脚本的matlab程序写成一个函数get_history_output。
调用python脚本的matlab函数: get_history_output(Path,OdbFile,step,req)说明:
这是一个matlab接口函数,实现程序是python程序odbHistoryOutput.py。get_history_output的功能是将用户指定的参数写入req.txt文件,调用odbHistoryOutput.py程序读取ABAQUS结果数据库odb的结果数据。(Path,OdbFile,step,req)参数列表含义分别为:
1)Path:odb文件所在的绝对路径。
2)OdbFile:odb数据库的文件名。
3)step:指定读取的分析步。
4)req:读取数据的要求,包括部件名、节点名、结果关键字,例如,req定义如下:
req=’PLATEN-1, Node PLATEN-1.5322,RF3’;
则指明了程序去读取部件名为PLATEN-1,节点名Node PLATEN-1.5322的反力RF3。注意,与历史变量相关的节点名是系统命名的,但是这些节点名有一定的规律,总是这样的形式“Node+空格+instance name.节点号”。
这里的参数(Path,OdbFile,step,req)是读取odb结果需要的,先把它们写入到req.txt文件,供上面的python脚本odbHistoyOutput.py读取。其中showlogfile函数显示python运行时输出的信息,这些信息保存在pylog.txt文件中。该函数的实现在另一篇博客Matlab目录操作及fgetl函数已经介绍。
那么在matlab里就可以指定odb相关信息,调用上面的函数来get_history_output获得odb数据。
应用例子:特别说明
这里与历史变量输出的节点或节点集的名称与你在step里设置历史结果输出指定的节点名是不一样的,与历史变量相关的节点名是系统命名的,这里只有用系统命名的节点名作为参数,才能正确读取所要的历史结果输出。但是这些节点名有一定的规律,总是这样的形式“Node+空格+instance name.节点号”,例如我的模型里有一个部件叫PLATEN-1,定义了一个参考点,并把它设置为一个set,在step里设置了输出它的反力RF3,并且我知道了它的的节点号是5322,那么我设置历史结果相关的节点名称是就是“Node PLATEN-1.5322”。
运行程序后,首先matlab把参数写入req.文件。req.txt记录了指定的相关参数,以逗号隔开,每个参数,如下:然后matlab调用python脚本odbHistoyOutput.py,读取odb数据。odb首先读取req.txt的参数,然后再根据参数去读取odb数据,把结果写入ReqData(即RF3.txt),结果包含时间和反力RF3,如下(部分省略): 这里matlab与python脚本之间可能有比较的参数和数据需要传递,因此,我这里先把要传递的参数和数据写入特定的txt文件,然后再由另一程序去读取。其次是这里尽量把每个简单的功能写成函数,这样有助于更容易调试程序,不断添加新功能和集成。这就是增量式开发的思想。
|
请发表评论