php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 538|回复: 0

MATLAB调用NASTRAN的连续计算解决方案

[复制链接]

3142

主题

3152

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7956
贡献
0
注册时间
2021-4-14
最后登录
2024-11-22
在线时间
763 小时
QQ
发表于 2022-6-1 09:06:55 | 显示全部楼层 |阅读模式
使用MATLAB调用NASTRAN提交bdf文件计算的方法笔者试过几种,分别做一下介绍

MATLAB直接调用操作系统命令
该方法对单次计算可能方便些,定义一个字符串,并使用eval命令调用,具体格式为:
[mw_shl_code=applescript,true]% strNas为NASRTAN路径
% strBDF为bdf文件路径
str = ['!', strNAS, ' ', strBDF];
eval(str);[/mw_shl_code]
印象中该方法似乎是非阻塞的,但最近几次实际使用居然是阻塞调用,可能记忆有所偏差,或者版本不同(笔者版本是2019b)?不过可以顺便提下早期的做法,判断NASTRAN计算的大致时间T,通过pause(T),从而实现每个nastran计算时matlab处于暂停运算的状态,避免多个运算同时进行。当然NASTRAN的每次计算耗时并不一定相同,T只能是一个比计算耗时最大值还要大一些的值,这可能造成了大量的时间浪费。

最早我是遇到了pause的问题,并希望能在需要自动连续计算时减少不必要的等待时间,因此笔者又探索出下一种方法并至今一直在使用。

生成批处理文件调用
批处理(bat)文件功能强大,而且现在看来也很方便。不过似乎在Linux平台上有点问题?但一般在Windows系统中还是比较通用的。此外可以按需附加对一些格式文件的删除功能,代码如下:
[mw_shl_code=applescript,true]% 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);[/mw_shl_code]
此处有几个小点要注意一下:

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





上一篇:原理:C++为什么一般把模板实现放入头文件
下一篇:2021年苹果游戏收入全球第三 仅次于腾讯和索尼
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 19:25 , Processed in 0.271000 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表