前面的42講大部分都是關於網格的,這一講介紹插值以及載荷相關的話題。載荷施加是有限元分析前處理的重要環節,大部分情況下施加載荷並不複雜,本文只講那些略微有點棘手的問題。
首先科普一下什麼是插值
百度百科上的插值定義:
在離散資料的基礎上補插連續函數,使得這條連續曲線通過全部給定的離散資料點。插值是離散函數逼近的重要方法,利用它可通過函數在有限個點處的取值狀況,估算出函數在其他點處的近似值。
Altair HyperGraph
說到插值,我首先想到的HyperGraph
例如在HyperGraph中定義一段正弦曲線:

圖像給人的感覺是連續的,實際上呢?電腦並不懂什麼連續, HyperGraph裡面的所有函數和曲線也都是離散點。如果把資料點顯示出來,效果就變成了這樣。

Altair Compose繪製散點圖的效果如下:

在HyperGraph裡面可以查詢每一個點的數值

但是無法查詢兩個點中間的值,因為並不存在。
如果希望計算一條Altair Radioss輸出的力-位移曲線和實驗測試之間的差別,同樣也因為x座標不一致而無法計算。
如果確實需要呢?需要先進行插值!

比如要計算0,0.03,0.06… …1.47,1.5這些點的值,具體的運算式是:

如果只要計算結果,不需要繪製曲線,可以在TextView裡面寫出運算式來

除了線性插值,HyperGraph裡面還有樣條插值等其它插值演算法。
Altair HyperStudy裡面創建回應使用的運算式和函數也都是通過templex語言實現的,不過目前的版本已經支持註冊python和Compose編寫的函數。
Altair Compose+python
Altair HyperWorks套件裡的科學計算模組Compose也提供了各種插值功能,下圖中是一段3維曲面插值的示例代碼:

篇幅所限,這裡對Compose就不展開介紹了,Compose有免費的版本,Altair也提供教程,有需要的可以發送郵件至info@altair.com.tw索取。
插值有1維/2維/3維/… …/n維。具體的數學演算法和各種c/c++ /c#/python/Java原始程式碼網上很容易找到。如果你對python的插值感興趣,可以去scipy的網站看一下:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html
文中提到了不同插值選項的插值效果(下圖)

Compose內置了python解譯器,可以將CAE結果資料通過變數傳給python,所以只要python能搞定的,都是可以通過Compose提供資料。
Altair HyperMesh
前面的鋪墊有點長,本文主要討論的是插值在HyperMesh軟體中的應用,讓我們趕緊開始吧。
空間變化載荷
如果載荷可以用一個連續函數來表達,那都是屬於比較簡單的情況。
比如施加一個正弦變化的壓力:
首先需要一個局部坐標系,因為在局部坐標系下面寫運算式容易。
然後給出載荷在局部坐標系下的運算式100*sin(0.01*z)

靜水壓力的施加也屬於這種情況,只需要把相應的運算式替換為ρgh。
HyperMesh可以使用雲圖對結果進行直觀顯示,方便使用者進行檢查。

還可以通過現有載荷插值得到新的載荷。
例如已知兩側壓力如下圖(左側的載荷太小,無法看見圖示):


插值得到的中間單元的值如下:

還有的時候需要在圓柱坐標系下施加載荷,比如軸承載荷,施加的方法如下:
Step1,創建圓柱坐標系。

Step2,根據角度,施加單位軸承載荷(這裡屬於cos函數,3.0的係數是為了使函數在載入範圍內剛好為半個週期,2π/ω = π*2/3)。

Step3, 查看載荷匯總資料。

Step4, 根據總載荷的大小對單位載荷進行縮放(因為上一步施加的載荷總量是不對的)。
這一步在loadadd卡片裡面添加一個關鍵字即可

在Altair SimLab裡施加軸承載荷有一個專門的工具,使用起來更加簡單,工具位於Applications /Special /Power Train/Bearing Pressure,介面如下:


對於下圖中的漏斗型結構,當裡面堆放粉末時會產生法向力和切向力,法向力很容易載入,但是切向力的載入似乎有點棘手(因為不同位置的切向力的方向都是不一樣的)。
類似這種問題,可能編寫一個簡短的tcl腳本是最好的辦法。

腳本如下:

由於在HyperMesh使用過程經常會需要一些tcl腳本,我專門錄製了視頻教學資料,預計在《HyperMesh寶典》全部50期連載完前可以發佈。
當然,還有重力載荷和離心力載荷也是非常常見的,這類載荷通過關鍵字直接施加,可以在求解器的説明文檔或者培訓資料中找到使用方法,就不在本文中介紹了。
重点:field
如果要把有限元計算結果施加給另外的模型,這時網格有很多節點,用場進行插值精度會更高。
HyperMesh中有一個通用的創建和映射資料的工具——field。
field功能隱藏得比較深,以至於很多老用戶都不知道這個工具。
Field工具位於Model Browser的右鍵功能表中

創建field時需要確定 Type 是連續場還是離散場

連續:適用于一片網格向另外一片網格插值的情況,這時HyperMesh可以基於源網格的形函數進行場的創建。

離散:適用於沒有源網格的場合,比如從一些不規則點提取資料,再向新的網格插值

下面通過例子來解釋具體步驟。
問題:已經有一個載入了力和邊界位移約束的模型。然後有一套新網格,現在希望把舊的載荷和邊界條件映射到新的網格上。

Step1,在Model Browser右擊創建spc的field,命名為spc_field

設置如下:

Source entity list選所有spc
Step2,創建force的field,命名為force_field 設置如下:

Step3,顯示目標網格,隱藏源網格

Step4,realize spc_field
在spc_field上右擊選擇Realize

在彈出對話方塊中設置如下並點擊Apply:

在Model Browser裡面可以看到生成了一個新的Load Collector,名字為displacementloads1
Step5,Realize Force_field

這時源網格上的spc和force都已經傳遞給了目標網格,但是force傳遞只保證載荷的分佈,如果是壓力或者溫度,結果是對的,如果是力,使用者需要自己再對總載荷進行縮放。具體操作和軸承載荷的step4相同。需要說明的一點是:對於比較複雜的空間網格,可以選擇Nodal Force Balancing方法避免總載荷的不匹配(系統會自動計算相應的力和力矩)
在對離散的field進行realize的時候我們可以選擇很多個插值選項。
-
Shape Function:使用單元的形函數
-
Shape Function and Proximity Mapping:在源網格內部使用單元的形函數,如果目標單元超出源網格以外(按照搜索容差搜不到)的按照最近點賦值。
-
Triangulation:系統會在後臺構建一片三角形網格,並使用三角形單元的線性形函數進行插值
-
inverse distance weighting方法:使用線性形函數
Tolerance值用於確認目標點是在源單元的內部還是外部。
有時我們會先對整體模型進行分析,然後將應力較大的局部細化後再分析局部的應力。
下圖中左側是細化後的局部模型,右側是應力雲圖:

接下來創建field並傳遞位移邊界條件
Step1,從h3d文件創建field

Step2,realize field2
對話方塊設置如下:

Node選擇所有節點,映射完成後得到的強制位移如下圖

或者通過下拉式功能表BCs > Contour查看z向強制位移雲圖

有了新的強制位移就可以計算新的細網格的模型了(過程省略)。
說明:對於目前的電腦性能來說一般直接在局部細化網格就可以了,並不需要這樣截斷後再插值,而且很多求解器本身就帶有Global-Local的分析功能,插值過程在求解器內部完成。所以,本例的方法雖然很酷,但是用到的機會不多。
從csv文件插值
插值需要的結果檔也可以來自csv等檔。
csv檔是指用英文的逗號分隔各列的文字檔格式。
例如要把從cfd計算結果中得到的空間溫度載荷映射到結構網格上(網格佔據的空間位置相同但是網格和流體計算中使用的網格劃分不一樣)
Step1,載入結構網格
Step2,從csv檔創建field,命名為temp_field

Step3, Realize temp_field

Node選擇所有要載入的結構節點。
Step4,在下拉式功能表BCs >Contour檢查載荷,結果如下:

如果選擇的是2D網格,即使csv檔中的座標是3D零件的座標,也可以實現載荷的映射。結果如下:

有時只知道很少的幾個空間點的溫度測量值,需要根據這些值施加所有節點的溫度,這種情況下如果已知溫度在空間的變化是一個低階的比較光順的函數,可以使用morph中的形狀函數進行空間插值。對於複雜的問題來說,由這幾個已知點確定整個模型空間的溫度,精度自然是不高的。而且其它幾個工具也可以解決該問題,所以該方法做瞭解即可。
幫助檔HM-3640: Interpolating Loads Using Shapes中的例子講述了完整的操作流程,本文就不再贅述了。

效果如下:

Field的功能不僅僅是映射載荷,其實幾乎所有的資料都可以通過field來進行映射,比如下面的這個例子中映射2D單元的屬性。
首先創建一個field

然後在新網格上進行映射

結果如下:

類似的,也可以映射2D單元的offset,材料纖維方向,以及其它任何資料(valuefromfile)



本講到此就結束了,謝謝各位讀者耐心讀完~
