怎樣開發一款有限元軟體,從哪些方面學習?
或者基於現有有限元軟體做進一步改進,我需要學習哪些內容?
關於語言的問題,補充一下
先前我不太推薦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工具,直接從代碼生成文檔。開發一款有限元軟體基於兩個方面。
- 首先,需要具備專業的有限元知識與理論,就是我們所說的演算法思想。比如理解位移法,薄板理論,梁理論,等等。當然,也可以在想編寫的軟體內加入最新研究成果,比如界面粘結等先進理論等等,成為國內首創應用軟體,就更具有誘惑力~~
- 然後,你需要具備一門或一門以上的程序設計語言。傳統的有限元程序採用的是面向過程的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++中拋出一個編譯錯誤?