怎樣開發一款有限元軟體,從哪些方面學習?

或者基於現有有限元軟體做進一步改進,我需要學習哪些內容?


關於語言的問題,補充一下

先前我不太推薦c++

主要因為複雜度高,對於開發人員要求較高。同時要求開發人員既是計算力學專家,又是c++高手,這對hr來說是艱巨的任務。

不過隨著技術發展,c++在一些領域有很強的優勢體現出來,那是非用不可了。

------------本人寫過cfd程序,雖然和fem不是一碼事,但是從計算力學求解器的角度看本質也差不多。

兩條路

1 從頭自己寫。

2 在開源庫基礎上開發。

前者適合快速實現功能,但是如果經驗不足會花費很多時間修改重構。後者適合你有足夠的時間嘗試和學習,因為那麼多開源庫並非都名符其實,或者適合你的需要。

對於從頭開發,我的經驗是:

1 循序漸進,先考慮串列單塊。設計好松耦合的模塊:幾何處理,邊界條件,單元內rhs和lhs構造,全局lhs構造,線性方程組求解.... 同時設計好層次結構,形成高層模塊基於低層模塊的結構。單塊串列的設計非常基礎也非常重要。在這個階段設計決定了整體設計的好壞。而且一個簡單的單塊版本適合於一些新方法和新思路的快速嘗試。

2 構造較為獨立的並行框架,結合第一步的單塊求解器,形成另一個獨立的並行求解器。

3 基於各個模塊,可以採用python腳本編寫高層次邏輯,實現靈活的定製應用開發。這似乎可以成為一種DSL了,不過這並不是必須的。

4 充分利用現有的基礎庫,線性代數方面有blas/lapack,petsc,superlu等,輸入輸出方面有xml,json以及hdf5或者cgns,分區方面有metis,還有日誌、trace等等

5 版本控制是必須的,git目前是標準了,svn也不錯

6 前處理我沒有搞過,都是用現有的工具生成的網格;後處理也是如此。

7 準備幾個常用測試算例,每次修改後都必須通過全部測試。

8 語言的選擇。這個最容易引起爭議,因為這是最容易噴的話題。我的建議是fortran95或者c這樣成熟且簡單的語言,而不是fortran2003和c++這種新的還未成熟穩定或者複雜容易出錯的語言。

------------------

補充

文檔工作也非常重要,推薦doxy工具,直接從代碼生成文檔。


開發一款有限元軟體基於兩個方面。

  1. 首先,需要具備專業的有限元知識與理論,就是我們所說的演算法思想。比如理解位移法,薄板理論,梁理論,等等。當然,也可以在想編寫的軟體內加入最新研究成果,比如界面粘結等先進理論等等,成為國內首創應用軟體,就更具有誘惑力~~

  2. 然後,你需要具備一門或一門以上的程序設計語言。傳統的有限元程序採用的是面向過程的Fortran程序,當然,近年來面向對象的C++語言更多的應用於有限元軟體設計內。當然,如果你對其他程序語言感興趣,比如C語言,Java都可以編寫出優秀的應用軟體。甚至你完全可以基於JavaEE用Android開發出相應的有限元軟體。

軟體的開發最主要的在於演算法的思想,其次,在於界面的顯示。對於日臻成熟的演算法思想下,現今都在比拼界面的優化。提倡界面的簡潔,易用性。

題主還說對於目前的某些有限元軟體如何做進一步的改進,一般而言是以插件的形式改進。比如我們可以用Python語言作為ABAQUS軟體的擴展,用Fortran作為ANSYS的擴展,可以用lisp語言開發AutoCAD(非有限元軟體)。

題主,只要你有想法,多鑽研,肯定能有相應的解決方法的,一定會乘風破浪會有時的!


先用 PYTHON 寫點基本模塊 CLASS, 比較好玩兒. 過半年一年, 如果真的上癮入迷, 並且有時間, 能保證不上網不來知乎, 就進入狀態了.

要寫時間積分顯式格式, 寫結構非線性, 然後材料非線性. 寫准靜態, 然後寫動態. 寫接觸問題, 流固耦合, 電磁與流固耦合, 燃爆與流固熱耦合.

這些東西網上(如果,,,)很充足. 要一點一點來. 英文是必須的.


這是一項非常複雜的工程。。。

如果你想做成像ANSYS/ABAQUS那樣的軟體,那麼憑一個人的能力基本不可能;即使是3d3s這樣的優秀國產軟體,背後也是一個公司在支撐。

但是,國內確實有幾乎憑個人能力就做成的軟體,那就是 MSTCAD。雖然有些功能不太完善,但確實是國內空間網格結構設計的優秀專業軟體。

好吧,這是一個廣告貼,哈哈

--------------------------------------

如果真要個人開發軟體的話,那麼再說一說:

軟體應該具備前處理、核心演算法模塊及後處理,並且易於擴展。

簡單的前處理包括讀入數據文件,複雜一點的前處理則包含顯示、交互建模、網格劃分功能,這些可以用OpenGL及開源程序庫實現,但要做到無所不包則不太可能。

核心演算法則與有限元相關,要盡量做到通用、可擴展,例如擴展材料庫、單元庫等等。

後處理包括結果文件輸出、位移雲圖/應力雲圖顯示、時程曲線顯示等等。

可以看出,要做好一個有限元軟體是十分費時費力的。


寫一個有限元求解器的程序相對容易,而做成一個完整的軟體很難


還有模型輸入,網格剖分,組裝矩陣,矩陣求解,輸出顯示。主要就這幾個部分吧。多少都接觸過。


在有限元行業十多年了,一直都有很多能人異士想開發通用有限元產品,只能說這是一個非常難的項目。我知道的一位好友開發了一款WELSIM軟體,還不錯。


關注


了解一下「有限元語言」


做什麼不好做有限元分析 就算現有的很多有限元分析軟體有些方面是錯的或者做不到的

比如post-crack analysis 但是該用的還是會用那些 而且人家算出來的東西95%都是對的

又易於操作 你自己寫一個 就算寫出來了 也不如人家好用 自己寫過幾個有限元程序 光是

高級的mesh generation都不單單是你一個人能做到的

如果想改現有的程序 那就簡單很多 不過要學語句 要學有限元的基本知識 要學非線性材料

不過加個subroutine就行 可行性比較高


推薦閱讀:

C++ #include " " 與 <>有什麼區別?
C++ 函數返回局部變數的std::move()問題?
在開發大C++工程的時候如何判斷和避免循環include?
為什麼C++使用sizeof關鍵字的時候不需要include <cstddef>頭文件就可以使用?
如何在C++中拋出一個編譯錯誤?

TAG:軟體 | 編程 | CC | 有限元分析FEA |