3

MATLAB调用NASTRAN的连续计算解决方案 - 缤纷若风

 2 years ago
source link: https://www.cnblogs.com/bfrf/p/16332236.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用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路径的事还是非常有意思的。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK