MATLAB調用NASTRAN的連續計算解決方案
- 2022 年 5 月 31 日
- 筆記
- matlab, Nastran, Nastran/Patran
使用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路徑的事還是非常有意思的。


