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