回應的三大類
Altair OptiStruct之所以被認為是最強大的優化軟體之一,其中一個原因就是豐富的內置響應。OptiStruct回應分三大類:
第一類回應DRESP1
OptiStruct 可以直接計算得到,具體可以看下圖:

(點擊圖片可查看高清大圖)
實際應用中90%以上的案例都是使用第一類回應。第一類回應很容易使用,而且OptiStruct會自動計算靈敏度,可以大幅度提高優化的計算速度。
第二類回應DRESP2
如果遇到第一類回應解決不了的問題,要優先考慮使用第二類回應。這樣估計可以解決99%的優化問題了。第二類回應是第一類回應的代數運算式,OptiStruct自帶了很多常用公式,如下圖:

您也可以編寫自己的公式,例如計算點到平面距離的公式:

公式可能相當複雜,這時可以選擇使用腳本生成公式卡片或者在fem檔裡面填寫或者把整個公式寫成一行(腳本裡面的str1),然後使用下面的這個腳本進行格式調整。

運行結果就是一個DEQATN卡片,複製到fem檔即可(id號可能需要自己更改)

為了簡化複雜的方程,可以把複雜的方程分成幾個方程來實現,但是要注意的一點是所有參數必須寫在第一行,後面的運算式直接用就可以了,通常最後一行是方程最終的返回值。
m1(x1,x2,x3,x4) = max(x1,x2);
m2 = max(x3,x4);
myavg = (m1 + m2)/2;
第三類回應DRESP3
如果你遇到了前面兩類回應無法解決的那1%,那麼還有第三類回應,也就是借助外部程式來完成回應計算。
DRESP3可以使用 Compose / EXCEL / c / c++ / FORTRAN 來創建。但這只是表面上的限制,實際上程式都是可以互相訪問的,比如你熟悉python,那麼不用遺憾這裡沒有python,因為可以通過Compose去調用python完成回應的創建,中間需要訪問檔或者資料庫或者再調用別的程式都是允許的。
是否能提供靈敏度給OptiStruct優化引擎對優化的速度有很大影響,DRESP1/2都是自動提供的。而DRESP3大多數情況都提供不了,這也是DRESP3的速度比DRESP1/2慢很多的原因。
選擇回應的幾個原則
-
剛度優先,例如應變能和加權應變能
-
全域性回應優先,例如模態頻率/體積/體積分數
-
魯棒性高的回應優先,例如應力,高階模態頻率等要慎重
常見的優化問題設置有
-
位移+體積(百分比)
-
(加權)應變能+體積(百分比)
-
頻率+體積(百分比)
考慮到創建回應的複雜性,所以本講選擇大家最熟悉的簡單模型,把注意力集中在回應上。
案例講解
初始問題模型

優化三要素:
目標:最小化體積百分比
約束:載入點位移 < 0.07
設計變數:所有單元
這種體積+位移的優化設置是最容易得到結果的,因此得到了廣泛的應用。
拓撲優化的結果如下:

優化前最大位移0.032 => 優化前最大位移0.07
優化前最大應力35MPa => 優化前最大應力69.8MPa
施加應力約束
也可以通過施加通用應力約束考慮應力:

或者選擇施加精確應力約束:


不同應力約束的優化效果如下(密度閾值都是0.3):

從上圖可以看出,應力要求高了,剩餘材料自然就多了。
通用應力約束自動過濾應力奇異的單元(不影響後續優化反覆運算),這是老方法,也是比較穩健的方法,建議大部分情況下使用。
精確應力約束的優點是應力約束被嚴格滿足,但是這種用法必須要小心地把應力奇異的單元排除在外,否則將無法得到優化結果。
本次的優化的應力結果如下圖:

影響剛度的因素是全域的,而影響局部應力的因素往往是局部。所以設計初期主要考慮剛度,兼顧強度。剛度設計好了,相當於身體強壯了,局部應力問題解決起來也就容易了。
如何降低應力
接下來講怎麼降低應力,先根據拓撲優化結果得到一個新設計,然後使用形狀優化對設計進行微調將應力水準降低。新模型如下:

優化三要素:
目標:最小化體積
約束:應力< 50MPa
設計變數:25個形狀變數
形狀變數使用HyperMorph創建,具體情況請見如下動圖:
優化結果如下:
黃色線條是優化前,粉色的部分是優化結果。

優化後的應力結果如下圖:

很多時候自由形狀優化是降低局部應力集中的更好工具,而且使用更加簡單。
只需要將形狀變數刪掉(不刪也可以),然後創建自由形狀變數,其它設置不變。



優化結果如下:

優化後的應力結果如下:

自由形狀優化也可以用在3D模型中,而且支援四面體的網格重劃分。
創建第三類回應
有時希望控制的指標不是有限元求解器的直接計算結果,例如把該問題的位移控制定義為:abs(max1+max2),這時可以使用DRESP2或者使用EXCEL創建第三類回應。

在第一個例子的基礎上來做。
第一步:創建26個位移回應,需要操作下圖26次,每次只換節點。

或者運行一個腳本來批量生成,腳本如下:

第二步:編寫EXCEL檔
檔案名是yplus1.xlsx,後面會在HyperMesh中引用。
A列數值先隨便給,被OptiStruct調用的時候會被替換成真實回應值。
B2的内容 = MAX(A2:A14)
B3的内容 = MAX(A16:A28)
C2的内容 = ABS(B3+B2)
第三步:使用Ctr+f快速鍵,然後搜索LOADLIB回應LOADLIB卡片(或者在control card裡面找到這個卡片)。

第四步:創建第三類回應

點擊create後再點擊edit把26個回應依次選上(如果要選的很多也可以寫腳本或者直接編輯fem檔解決),這裡的卡片非常長,介面上看起來像這樣(部分):

fem檔中顯示的卡片:

最後的 SENSOPT AUTO 表示靈敏度的計算方法是由差分得到。預設是沒有靈敏度(變數和回應多時計算速度會非常慢)。這行卡片需要匯出fem檔後手工編輯dresp3卡片,注意編輯卡片的時候要注意每個欄位只能放在屬於它的那8列。防止出錯的簡單辦法是在上面加一行參考列。
$$111111222222223333333344444444555555556666666677777777888888889999999900000000
更徹底的辦法是乾脆把整張卡片轉換為自由格式,這樣編輯起來就容易多了。腳本如下(把要轉換成自由格式的卡片複製到頂上大括弧內即可):

轉換結果如下:
DRESP3,28,disp_df,ELIB,disp,,
+,DRESP1,2,3,4,5,6,7,8
+,,9,10,11,12,13,14,15
+,,16,17,18,19,20,21,22
+,,23,24,25,26,27
+,CELLIN,A2,A3,A4,A5,A6,A7,A8
+,CELLIN,A9,A10,A11,A12,A13,A14,A16
+,CELLIN,A17,A18,A19,A20,A21,A22,A23
+,CELLIN,A24,A25,A26,A27,A28
+,CELLOUT,C2
+,SENSOPT,AUTO
優化結果如下:

如果加上通用應力約束,優化結果如下:

詳細的操作過程可以參考如下視頻(視頻操作和以上文字略有不同,但都正確):
Excel的優點是幾乎所有電腦上都安裝了,而且不用寫程式。
正解:第二類回應
該題目的正解是使用第二類回應。理由是除非第二類回應實現非常困難或者根本無法實現才考慮使用第三類回應解決,而對本題而言幾乎沒有難度可言。
第二類回應創建步驟如下:
第一步:刪除excel優化相關的幾個卡片(略)
第二步:創建max1回應(上半部分的最大變形)

點擊右側edit輸入13個點的回應

然後點擊create創建。
第三步:和第二步類似,創建max2(下半部分的最大變形)
第四步:創建求和的回應add。


第五步:創建約束

第六步:編輯fem檔,引用約束,在工況部分引用約束id。

另外,需要刪除或者注釋掉如下選中的一行(全域約束):

這樣就可以開始優化了。優化結果是一樣的,但是對於較大的模型來說,時間上可以節約非常多。
果需要創建的回應的數量比較多,在介面上要選擇這些回應進行第二類回應創建的時候選擇起來會比較麻煩。可以改為使用DRESP1V,具體可以參考如下視頻:
利用Compose創建優化回應
創建優化回應的事當然不能少了Compose,特別是針對複雜的問題,使用方法類似EXCEL ,先在這個問題上小試牛刀。
第一步:創建Compose腳本
這個問題比較簡單,一行搞定函數體,函數頭每次拷貝就可以了。

第二步:創建loadlib卡片(Ctrl+f搜索loadlib)

第三步:創建DRESP3回應

點擊create然後點擊edit編輯

第四步:創建約束

然後就可以優化了,結果和前面是一樣的(略)。
本來這種簡單的情況根本犯不著使用Compose。接下來看一個稍微複雜一點的問題,使用Compose會比使用DRESP2方便很多。
使用Compose解決複雜問題
模型如下:

優化三要素:
目標:最小化品質
約束1:應力<65MPa
約束2:RBE中心節點到底面的距離<17.8mm
設計變數:板厚
最大的困難在於怎麼計算點到平面的距離。因為整個結構都在變形,計算距離時要考慮原始的座標值和各個方向的變形。如果使用DRESP2來計算這個回應稍微有點麻煩。大家可以在Altair的企業網盤中下載徐自立工程師以前錄的操作視頻。具體的公式推導過程如下:

公式中的ABC三個點定義了一個平面
在Compose中使用100000、110000、130000、120000四個節點的對角線叉乘來定義平面的法向n。n與PA向量點乘即可得到想要的距離值。關鍵的公式只有如下幾行:
db = b - d;
ac = c - a;
pc = c - p;
normal = cross(db,ac);
unit_normal = normal/norm(normal);
dist = abs(dot(unit_normal,pc))
需要從OptiStruct向Compose傳遞30個參數。完整程式如下(前面30行只是給參數取個別名方便後面引用),也可在文末下載附件查看具體參數:
詳細操作過程如下:
第一步:創建Compose腳本
第二步:創建loadlib卡片

第三步:創建DRESP3回應


DRESP3卡片比較長,具體請下載fem文件查看。
第四步:創建約束:


第五步:創建目標:

然後就可以優化了。
優化前後的情況:
優化前:

優化後:

還可以使用c/c++語言,但是通常Compose是更好的選擇,所以這裡只放一個操作視頻供有興趣的人參考。
實際工程中會碰到複雜得多的問題,主要的麻煩之一就是創建回應,特別是怎麼確保Compose的程式運行無誤。你可以先在Compose中進行debug,傳過的參數就是一個1xn的矩陣,所以測試調用的時候只需要寫成:
res = mydist([1,2,3,4等等])
如果不事先在Compose把程式調好,那麼後續會遇到很多麻煩。
上面c語言的例子演示了如何把相關的資料寫入到暫存檔案進行檢查,對Compose等語言也是適用的。
本講雖然看起來只是變著花樣玩一塊板子,實際上有較高難度。用例子進行演示是因為,例子是帶你入門的最好方式。如果你希望提高自己的優化水準,建議你親手完成一次,那時你才知道自己到底有沒有“掌握核心科技 “。此外,Altair有非常多的優化案例,大家可以上Altair 官網案例資源庫查看。

OptiStruct優化的教程和本講用到的一些檔案可以從以下連結中下載:
之前經常使用tcl腳本,下一講會發佈二次開發的視頻教程(大約90個例子,4G影片)。
那本講到這裡就結束啦,我們下期再見~