有限元編程中關于邊界條件的處理,深入探討
2017-02-27 by:CAE仿真在線 來源:互聯網
引言:在有限編程的一般流程中,在獲得原始總剛度矩陣之后,就是引入邊界條件了。力邊界條件直接表示在激振力向量中,而對于位移邊界條件的處理較為復雜。位移邊界條件的處理方法有萬能鑰匙型的“罰函數法”和“拉格朗日乘子法”,以及處理特定情形的“置大數法”和“劃0置1”法。而且對于靜力學分析,模態(tài)分析,瞬態(tài)響應分析和諧響應分析,在一些細節(jié)上的處理稍有不同。在編程中,可能遇到的技術難點是:
-
從理論上,應該選擇哪種技術來處理邊界條件按更合適?
-
在技術細節(jié)上,邊界條件的處理應該在前處理器中實現,還是在求解器中實現?在這里我打算根據個人的一些經驗談一談這些問題,拋磚引玉。
1位移邊界條件的一般形式和“萬能鑰匙型”處理方法
位移邊界條件的一般形式可寫為:
其中A和B是常數矩陣,而u是有限元模型節(jié)點自由度列向量。實際上,要解決的問題是,如何在原始動力矩陣中引入這些補充方程的影響,即聯解方程組:
由于多了若干個(設為m個)位移邊界條件,因此上述方程組有N個未知數卻有N+m個方程,無法直接聯立求解。既然稱這里討論的邊界條件形式為“一般形式”,那么能處理這種“一般形式”的方法在這里就姑且稱為“萬能鑰匙型”處理方法。
既然問題的關鍵在于未知數個數和方程數目的不匹配,那么解決方案也就是如下兩種:減少方程個數(罰函數法)和增加未知數個數(拉格朗日乘子法)。在這里不打算展開方法的細節(jié),要知道細節(jié)google即可。這里只是想說明兩個方法的區(qū)別。
罰函數法最終將m個約束方程修正到了原始剛度矩陣中,從而保證了自由度數的不變,這可以視作它的一個優(yōu)點。但它的缺點也是顯而易見的,即需要指定懲罰系數,而且在有多個約束方程的場合,甚至有必要為不同的約束方程指定不同的懲罰系數。而懲罰系數的確定完全是經驗的,例如在筆者編寫的有限元程序在用罰函數方法來處理壓電結構的約束時,需要分別指定針對電場自由度和機械場自由度的懲罰系數才可以達到較滿意的精度。拉格朗日乘子法增加了m個未知數,不需要經驗的懲罰系數,卻增大系統的自由度,在約束方程數量比較多的場合并不令人滿意。
注:在ANSYS中,對應于CE命令。
2特殊位移邊界條件及其處理方法:直接位移約束
對于形如:
的位移邊界條件,即直接給出部分自由度位移的情形,常見的有兩種解決方案,都可以從罰函數方法導出,稱為“置大數法”和“劃0置1法”。相比較而言,前者所謂的“大數”就是罰函數法中的懲罰系數,因而同樣有大數的取值問題。而后者相當于是運用了主對角元素是大數,對方程進行了簡化,從而不需要取“大數”,其代價是操作過程稍嫌麻煩。但考慮到“劃0置1法”幾乎可視作精確地考慮了上述位移邊界條件,過程的稍微繁瑣似乎也是可以接受的。
實際上,若在這兩種方法的基礎上再往后走,還有一種更“暴力”的方法,姑且稱之為“刪除行列法”。其基本出發(fā)非常好理解,既然一些自由度的取值已經給出,那么它們就可以不作為未知數包含到求解中了。它們的影響體現為一個施加到剩余自由度上的力向量(類似于C-B模態(tài)綜合法中的約束模態(tài))。其本身對應的行,列將從總體矩陣中刪除。這個方法看上去很美,尤其在矩陣中刪除行列的操作大多數現代編程語言的數值計算庫都能提供的情況下,更顯得手到擒來。它唯一的不足是增加了后處理的難度,需要設計數據結構儲存那些被刪去的自由度的取值并將它們融合到后處理中。
注:在ANSYS中,對應于D命令。
3特殊位移邊界條件及其處理方法:自由度耦合
對于形如:
的位移邊界條件,通常稱為自由度耦合,即表示若干個廣義自由度實際上可以由其中任意一個表出。作為一般形式邊界條件的一個特例,它當然可以用“萬能鑰匙型”方法來解決,這里還有一個帖子詳細進行了詳細的討論請教結構的自由度耦合的問題。
但實際上我發(fā)現有一種更簡單直接的方法,既然有幾個自由度可以由同一個自由度表出,何不就將它們視為一個自由度?具體地,在內部的“自由度”,“方程編號”映射表中,可以作如下處理:
節(jié)點 自由度 方程編號
1 UX 10
6 UX 10
19 UX 10
這樣自由度1UX,6Ux和19UX就都被u10表出了。這樣做的好處是,所有與這些自由度相關的系數(單元剛度系數,質量系數等)都會組集到同一個實際自由度u10上。當然,其代價是要重新調整“自由度”,“方程編號”映射表,甚至要重新組集總體剛度矩陣。其優(yōu)點也是顯然的,即無需任何經驗系數,不增加反而減少了系統的自由度。也許文獻中對這種處理方法有命名,有知道的同志請指點一下。這個思路類似于上面的“刪除行列法”但是實際操作卻并是刪除那么簡單。
注:在ANSYS中,對應于CP命令。
4實現的問題:前處理器還是求解器?
那么,在實際編程中,一個即將遭遇的問題是,對約束條件的處理應當在前處理器中實現還是在求解器中實現?也許根據程序流程思路的不同,你的代碼并沒有明確的區(qū)分前處理器和求解器。但是一個顯而易見的問題是代碼的復用性,如果邊界條件的引入過程都是一樣的,為什么不在前處理器中進行,這樣,求解器收到的,都是一個已經考慮了邊界條件的模型,直接按照各自的算法求解就可以了,不是更好么?
問題在于,并不是所有的邊界條件都適合在前處理器中進行引入,有些邊界條件的處理隨著求解器的不同而不同,有些邊界條件的處理又與求解器無關。這似乎說明有必要將一部分邊界條件在前處理器中編碼,一部分在求解器中編碼,以實現代碼的最佳復用性。這也是我們在“另一個的問題:既然有一般方法,為什么仍然有必要實現特殊方法?”小節(jié)中給出的理由之一。
例如,在靜力學分析中,處理由約束ui=1引起的節(jié)點力只需要考慮靜剛度矩陣K;然而在諧響應分析中,則需要考慮動力剛度:
姑且不論還有另一個更大的問題,即諧響應分析中約束表達式ui=1存在歧義,即無法區(qū)分它意味著靜約束:
還是簡諧約束:
前者產生一個靜變形,不在諧響應分析考察的范疇內,將被處理為:
而后者將產生一個簡諧力,將被完整地處理。由于這樣的歧義,求解器必須知道約束的意義,與此同時,前處理器在不知道下游的求解器是什么時也無法確定如何處理該約束。
這里列出了幾種常規(guī)求解情況下的約束處理需要修正的原始有限元數據:約束類型(以ANSYS命令命名)
可見,D型和CE型約束的處理與求解器相關,因為它們都會產生等效力載荷向量,這個力載荷怎么計算,是“靜”的還是“動”的都只能由求解器來解釋。而CP型約束本身不產生約束力,所以與求解器無關。
5另一個的問題:既然有一般方法,為什么仍然有必要實現特殊方法?
這個問題擴展開來,是:既然我們有一般處理方法(罰函數法,拉格朗日乘子),那么何不選擇一種實現,然后在前處理中或者求解器中調用,將邊界條件引入,然后求解?為什么要將約束按照各種類型分開處理?
原因1:如第4節(jié)所言,處于代碼維護和重用性的角度考慮,CP型約束適合在前處理器中進行,而D型和CE型適合在求解器中進行。既然分開處理,就可以用各自更適用更簡單的處理方式了。原因2:一般處理方法各有弊端,選擇罰函數必須冒著求解精度下降的風險,而選擇拉格朗日乘子則會增大模型的自由度規(guī)模。而將特殊情況用各自的特殊方法處理,可以獲得精確解。只有在約束條件不特殊時再用一般方法進行處理。這樣可以更好的控制模型的精度和規(guī)模。
6一種實現方式
綜上所示,根據個人的編程經驗,推薦這樣的實現方式:
D 型, 求解器實現,劃0置1法
CE型,求解器實現,罰函數法
CP型,前處理器實現,“重新組集法”
即盡可能采用精確的處理方式,實在避不過時(只能用CE型表示時),用近似解法。
相關標簽搜索:有限元編程中關于邊界條件的處理,深入探討 Ansys有限元培訓 Ansys workbench培訓 ansys視頻教程 ansys workbench教程 ansys APDL經典教程 ansys資料下載 ansys技術咨詢 ansys基礎知識 ansys代做 Fluent、CFX流體分析 HFSS電磁分析 Abaqus培訓