使用MATLAB调用NASTRAN提交bdf文件计算的方法笔者试过几种,分别做一下介绍
MATLAB直接调用操作系统命令
该方法对单次计算可能方便些,定义一个字符串,并使用eval命令调用,具体格式为:
% strNas为NASRTAN路径 % strBDF为bdf文件路径 str = ['!', strNAS, ' ', strBDF]; eval(str);
印象中该方法似乎是非阻塞的,但最近几次实际使用居然是阻塞调用,可能记忆有所偏差,或者版本不同(笔者版本是2019b)?不过可以顺便提下早期的做法,判断NASTRAN计算的大致时间T,通过pause(T),从而实现每个nastran计算时matlab处于暂停运算的状态,避免多个运算同时进行。当然NASTRAN的每次计算耗时并不一定相同,T只能是一个比计算耗时最大值还要大一些的值,这可能造成了大量的时间浪费。
最早我是遇到了pause的问题,并希望能在需要自动连续计算时减少不必要的等待时间,因此笔者又探索出下一种方法并至今一直在使用。
生成批处理文件调用
批处理(bat)文件功能强大,而且现在看来也很方便。不过似乎在Linux平台上有点问题?但一般在Windows系统中还是比较通用的。此外可以按需附加对一些格式文件的删除功能,代码如下:
% strNas为NASRTAN路径 % strBDF为bdf文件路径 % strBAT为bat文件路径 strDEL = ['del /a /f /q *.MASTER' newline... 'del /a /f /q *.DBALL' newline... 'del /a /f /q *.f04' newline... 'del /a /f /q *.IFPDAT' newline... 'del /a /f /q *.xdb']; fidbat = fopen(strBAT,'w'); strCOM = [strNas ' ' strBDF]; fprintf(fidbat,'%s/n',strCOM); fprintf(fidbat,'%s/n',strDEL); % 删除一些不需要的文件 fclose(fidbat); system(strBAT);
此处有几个小点要注意一下:
1.bdf文件与bat文件如果在同一文件夹下只需提供文件名即可,否则还是需要完整路径的。
2.matlab中调用bat分两种情况,一种是阻塞型,一种是非阻塞型,前者在被调程序运行结束后将控制权返给matlab,而后者是同步运行,在调用格式上的区别是后者是需要加标识符&的。
这是阻塞型调用:
str = 'test.bat'; system(str);
这是非阻塞型调用:
str = 'test.bat &'; system(str);
bat被调后会有相应输出重定向至MATLAB界面,若不希望显示在界面上,则可使用该格式
[s,c] = system(str);
若需要记录这些内容,则可以进一步地,使用diary命令,将界面内容存盘。
3.在编辑路径如strNas时,建议使用双引号括上字符串,这样的格式是一定不会出问题的,如下:
strNas = '"C:/Program Files/MSC.Software/MSC_Nastran/2020sp1/bin/nast20200.exe"';
这当中就扯到一个很有意思的话题了,如果不用双引号可不可以?在笔者这个路径下不行,原因就是笔者的NASTRAN安装在C:/Program Files/…下,该文件夹居然有空格。但如果一定不想用双引号也是有办法的,恰巧之前在知乎上看到相关的讨论,在DOS下文件夹最长识别8字符,因此需要用PROGRA~1代替表示,这也算是一个非常古早的系统设计了吧。
需要注意的是,bat的路径在MATLAB当前工作路径下,如果存在子文件夹,则需要cd进所需路径,否则nastran计算生成的一堆内容全塞在当前路径下了。
后话
其实一直百思不得其解的问题是,在最早笔者用的应当是第1种方法,当时被计算时间的问题整的无力吐槽,恰逢当时遇到了需要连续计算大量bdf文件的问题,因此自己尝试了很多方法,最后用批处理文件至今。但回过头去发现该方法似乎和第一种大同小异,因为批处理也把控制权交由MATLAB来管理,即若在MATLAB运行bat文件时使用Ctrl+C强行中止是能够中止计算与MATLAB程序的,这与第一种已无差别。权做一个没啥用的小发现吧(手动狗头)。不过还是觉得关于PROGRA~1路径的事还是非常有意思的。