CAE編程高手之路:從軟件開源代碼使用及改造說起

文章發布:上海安世亞太官方訂閱號(搜索:PeraShanghai)

聯系我們:021-58403100

原作者:三只青蛙

導讀屈指數一數,我從事cae程序工作十幾年了,沒有什么成績,只有教訓和眼淚。十幾年間幾乎沒有周末和假日,沒有娛樂和休閑,也沒有了愛好。我希望能把自己的一些經驗寫下來,對充滿活力的年輕人有一絲助力和借鑒。讓他們成長之路更短,略微更平坦一些……


寫在前面


4月26日,工信部信息技術發展司副司長王建偉表示,2021年將著力突破CAD、CAE等工業軟件,推進操作系統與芯片、數據庫、中間件及各類應用軟件的集成、適配、優化,引導企業提升產品化發展能力。現如今,無論國家和民間,都在把工業軟件作為一個重要的發展方向,提出了各種目標和口號。

CAE軟件作為工業軟件的重要組成部分,更是得到了十足的重視。

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖1

倪光南院士在天津工業APP大會發言

(1) 有的是教訓和眼淚

屈指數一數,我從事cae程序工作十幾年了,沒有什么成績,有的只是教訓和眼淚。十幾年間,幾乎沒有周末和假日,沒有娛樂和休閑,也沒有了愛好。回頭想想,其實很多很多的路,是在仿徨和猶豫中度過的,總在猶豫,總在反復,總在時時刻刻的考慮,是不是那樣寫更好,是不是不應該這么寫。是的,有很多很多的后悔的作為。

也有無數的一步可以跨過的溝,我卻是繞過來趟過來的。

很榮幸,我還活著,還在做著這個工作,希望能把自己的一些看法,一些想法,一些理解,寫下來,對希望充滿活力的年輕人有一絲助力和借鑒。使得成長的路更短,略微更平坦一些。最近的時間比較緊,在完成目前工作后,會加速的做這些事情。

(2) 以資本的方式去硬砸這個產業

在這個系列的文章里,我只談CAE的程序問題,不去觸碰CAE的產業問題,也許那不是我關心的事情。我只想說一句在這里,我是反對以資本的方式去硬砸這個產業的。這個東西是個需要時間積累的東西,很難想象可以用資本能夠擊穿。

我的工作生涯里,有50%的時間在做計算,50%的內容在做前后處理。前面的寫作我只會涉及計算,以后會再寫一些前后處理方面的東西。即使計算方面, 針對不同的專業,也是千番不同。我想大家可以和我交流的,大多也是更為基礎的程序代碼方法和算法方法,更多的東西,我想我也肯定無從了解。


為什么CAE程序

會感覺很困難


首先這個問題, 是確定的,是的,真的很難, 學習成本極高。

(1) 綜合性強

也就是跨學科了吧,只拿做計算的來說吧,學好本專業已經不容易了,還要學好計算機程序編寫。至于計算機程序的編制, 需要學習的還有數值方法,矩陣論,甚至圖論等……, 幾乎所有的數學都要學差不多,不一定要會證明和很深,但是大多數都要理解,才能寫出精巧的程序。這個問題,我想以后慢慢做一些框圖來解釋。給寫不同程序的人,不同的建議,要準備什么書,儲備什么知識等。

其實,看過太多的開源的很多的程序,可以看出,都是學力學的人寫的,雖然寫的整齊漂亮,但是還是很多不符合計算機原理的,我們不能拿著當做圣經。也有很多程序,可以看出是計算機的按照學力學的要求去寫的,寫的啰里啰嗦,整理規整,似乎增一分則肥,減一分則瘦,實則編排亂七八糟,這些程序不應作為學習的目標。別人的程序,看的多了,自然都會有深刻的理解,都會看的出來,但是改成自己的,卻需要更深入的理解,仍然是非常痛苦的事情。

(2) 1+1<=2, 兩塊磚頭的結合需要砂漿

我這里指的是團隊建設,一加一等于二,沒有問題的,那僅僅是個理想的相加,現實中,要筑起一道墻,一塊一塊的磚頭疊加一起,是沒有意義的,需要砂漿來粘合,需要時間來凝固,需要澆水來養護。

很多時候,我們要求一個學力學的,和一個學計算機的去合作完成一個程序,大多數時候都是失敗,我不知道老外這種事情的管理是如何的。我知道的,中國人在這種的合作上,大多是失敗的。我想老外也差不多。

成功的少數案例,就是學力學的會寫程序了,學計算機的也懂力學了,而且懂的程度很深。并沒有一條很好的途徑,使得兩者在互相了解對方知識很少的情況下完成這件事情。但是最后的結果,僅僅是完成,還是有問題的,起碼在代碼上,可以輕易的看出,是學力學的模仿計算機寫的,還是計算機的不懂裝懂的按照學力學的說的寫的。

(3) 被忽視的二級算法

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖2

CAE專業和計算機代碼之間,是需要二級算法的。所謂的二級算法,大多衍生于數值方法那門課的內容,也有更多的需要完整的學一門新課。大多數有興趣有動力來做CAE程序的人,基本都把自己的專業部分學的很好了,理解的很透,但是一旦上手開始寫,又覺得無所適從。其實,這中間還差很多很多東西,二級算法書上不會講,基本都是要自己悟的,基本,大多數人選擇從開源的程序學習進入。以后我想專門的來討論開源軟件的讀改問題。

在計算機專業和cae專業之間,人員的磨合,代碼的精進,都是基于二級算法的建立和改進的。這也就是經驗的集合吧。論文上的東西都差不多的其實,大部分是公開的,我們和成熟商軟的距離,就差這個其實。


成長之路之計算機語言


這是一個大項。作者僅僅熟悉c++和fortran語言,所以僅僅能從這兩門語言的角度進行。

(1) 語言是不相同的 

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖3

程序在本質上是相同的。那是編程二進制之后的事情了。所以有一種說法, 所以用哪種語言都一樣。學好了,都能寫出好的程序,這是對的。這里的不同,說的是,其實每一門語言,都有自己獨特的地方和優勢,你用那門語言去寫,就要利用好那門語言的優勢,才能寫出好的程序。才能感到那門語言的魅力。

在結構化程序上,大多數語言是可以互相調用的,基本是相同的。很多書也如是說。

但是,還要精心的考慮,很多事情,并不是相通的。

C++的行存儲和fortran的列存儲,就會給互相調用帶來很多的困擾空間。C++的指針和fortran指針并不是一個概念。Fortran的“class”和C++的也完全不是一個東西,有了“class”的fortran程序是不能供C++使用的。你要fortran面對對象到底,還是以后要和C++混用,要一開始就想清楚。這僅僅是一個例子,每種語言學到深處,都是有它自己的精妙所在的。而一旦你用了它精妙的部分,大概率的和其他程序不會相同。這也是很多人爭論用哪種原因好的原因。

(2) 關于c++和fortran

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖4

真的很希望計算機就一種語言,起碼不用那么糾結,我想做計算的大多數用這兩種語言,已經足夠糾結,現在出現了更多的,python,perl等。糾結更加糾結。我和大多數的人一樣,很多時間花在了糾結上。糾結用哪一種語言。

現在呢,我還在糾結偶爾,還是沒徹底解決。兩種語言,我都算精通了,不是語言的事情了。但是在做某件事情的時候,往往希望基于某個東西去做,那個既有東西的功能的好壞,也包含了語言的選擇,成為了一個糾結的選項。在語言的單獨選項上,我更偏向于c++語言。以后的程序都是趨向于大型化,利用C++更好管理,這是學C++的人的借口。其實新的fortran也能很容易的大型代碼的管理,單獨做計算的,無論程序多大,我想fortan已經足夠。我偏向c++,是因為同時在做前后處理。

(3) 學習的順序

大多數做cae計算程序的人,都是邊學邊干的,這一點不可避免。我是這么過來的。

  1. 但是我現在建議初編者,拿出3-4個月的時間,忘記CAE計算,就所用程序語言本身,去做專業的學習,無論fortran還是c++,或者其他。

  2. 這不算彎路,你腦子中有更多的儲備,遇到cae計算問題,就會有更多的靈感,也會有更多的經驗,去更快的處理。

  3. 不要有一種想法,就是CAE還是理論問題,程序語言本身,我學到一定程度就夠了,某種程度上,做CAE程序的,要計算機比學計算機的還要學的深入。

  4. 這一切,都是因為CAE的程序更注重效率。編譯原理,其實對于學力學的人,卻是必學的。計算機的卻可以學了忘掉其實。

用一個計算機的本身問題,來解釋這個事情吧:

  • 馮*諾依曼體系下的計算機,大多有這樣的問題,就是ALU少于FPU。

  • 也就是判斷大多數時候是計算的瓶頸,而不是浮點運算。

  • 我們邊學邊干,更不停的一會思考力學問題,一會思考程序問題,相當于不停的在兩者之間判斷切換,會搞的腦子很亂,很多人甚至崩潰不干了,也是這樣一個道理。

  • 這樣做還有一個后果,就是會不斷的會翻前面的程序,不斷的修正,迭代以前的程序。

所以,我建議在學程序本身的時候,要忘記CAE, 不要想這個我以后用不到,那個我用到了再說,先搞定一頭再說,多余的學到的語言知識,是你寫精巧程序的靈感的來源。

(4) CAE程序高手的晉級的幾個階段

每個人學語言都有這樣幾個階段。每個階段的成就感是必要的。

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖5
  • 初學,很感興趣,興趣在結構化的循環控制和實現自己的算法, 基本一個小程序都是用來計算,都是干貨。

  • 更深入的時候,發現管理性的代碼越來越多。一個大型程序,基本管理性的代碼要占到60%可能,功能性代碼占比卻逐步減少。基本每一個搞專業的都會有一種煩躁感。很多人專業搞的非常好,但是就是客服不了這一種煩躁感,很多年都沒有把自己的東西寫出好的軟件程序。這一步也許是成長最重要的部分。

  • 編輯器的操作是另一個部分,這一步其實更多的人在一起工作更好,會一起獲取更多的使用經驗,編譯器的熟悉程序關系到編寫的效率,也是一個必須要過的關。

  • 因為工作問題,會去翻更多的別人的代碼,這一步要小心,我是這么過來的,在翻別人東西的時候,有時會被別的興趣去吸引,走偏了方向,尤其是技術控,自己也有自控能力。可能完成導師和老板的任務更重要,感興趣的以后慢慢再說。

  • 學會忍受寂寞,接下來就是在迷茫和清晰之間無限的循環了。

一個CAE軟件工程師,最后計算機軟件的知識,可能占到總體知識的60%,而力學知識僅僅會占到40%,這是自然的。我們大部分不再搞研究工作,即使搞研究工作,大量的計算機知識會更有利也:

■ 思維上要做好轉換。寫計算軟件,最重要的增大知識的廣度,不是深度,是更好的實現自己專業知識,不是學更多的轉月知識,不能陷入無限的學習循環。

■ 大概率的,到真正寫程序的時候,所有人都會發現自己認為學過的東西根本不會,像是沒學過。

■ 回去認真的復習以前的東西,人會在一個階段覺得自己的思路特別清晰,感覺工作就要完成了。

■ 真正做幾天,又會別的問題發生,人又會限于迷茫,這一切循環往復。

■ 忍受住寂寞,甚至學會忍受寂寞,基本上就是高手之路走了一半了。


不同的數值方法和專業


現在存在的數值方法種類是很多的,有限元,離散元,有限差分,有限體積,非連續變形,粒子法,近場動力學。。。。等。作者對上述方法都有涉獵,都略看過一點。近年也在師兄的的幫助下開發一種新方法,希望完成有限元和離散元的統一,真正實現離散-連續的平滑化。這一切都在進行,有些緩慢。人生短暫,最終還是希望搞學術,不再混跡于江湖。

(1) 代碼架構

對于不同的數值方法,都有不同領域的用途。每種方法寫起來,除了算法本身的問題,也有不同的編寫套路。我想所謂的這些方法“套路”,其實就是軟件程序的架構和實現細節。我對有限元和離散元的套路知道個大概。即使同樣的的有限元程序,因為目標的專業不同,架構和套路也是千奇百怪。以后慢慢會很多不同的代碼套路講給大家,每個作者做這些代碼的時候,真的是有自己非常深入的考慮。我們有幸學習別人的東西,是一件很幸福的事情。

希望以后總結下,用某種方式發布出來。把各個軟件的架構和目標,都講給希望學習CAE程序的人。

  • 我目前在做的工作,就遇到了新的有限元編寫的不同套路的問題,多了幾個月來學習,使得工作有些拖拉,但是也算是給自己一些好的補充。

  • 看看每個代碼,基本理論來源都雷同,但是每一個細節都不相同,在二級算法的考慮上,都有自己的獨到之處。

  • 如果你編寫代碼的套路,獨樹一幟,和其他都不同,說明真的理解了,是真正的原創。

說了這么多,舉一個簡單的例子吧,單元數據的計算,對于建筑結構軟件類軟件來說,做設計的人都知道,同尺寸通材料的梁柱很多的,在某些時候,把這些都分好類,計算一個,就等于計算好了很多根。這個某些時候比并行化好用。更好的例子,以后慢慢把我的經驗講給大家。

(2) 不同數值方法的編程技巧

不同的計算方法,編寫都有不同的技巧問題,我熟悉有限元的,和離散元的。希望以后和更多人交流。這個暫時不展開說。繁而雜的東西。

(3) 從論文到代碼

一篇論文的編寫,作者大概最后寫出的方式大概不會太多。公式是一定的。不會有更多的差異,但是這篇實現到代碼的時候,可能會有千百種方式。我想分成下面幾種情況:

  • 第一,自己能深刻理解的論文+自己熟悉的代碼架構,可以做到完美實現,并且會有創新的思路。

  • 第二,自己不能深刻理解的論文+自己熟悉的代碼架構,可以做到反復實驗下的實現,不會有創新的思路。

  • 第三,自己能深刻理解的論文+自己不熟悉的代碼架構,可以做到實現精確的計算,往往不能實現深刻靈活的功能。

  • 第四,自己不能深刻理解的論文+自己不熟悉的代碼架構,這個…基本什么不能實現。

很多人更關心第二項,不能理解的也能實現。這個確實有,以后會寫一些相關的經驗文章,來說明技巧。但是不建議大家這么做。知其然,不知其所以然,最終還是很難進一步寫下去的。

但是有一點是肯定的,熟悉代碼可以幫助更好的熟悉理論,熟悉理論可以幫助更好的熟悉些代碼,倆者是相輔相成的。

CAE編程高手之路:從軟件開源代碼使用及改造說起的圖6

關注【上海安世亞太】官方微信,獲取更多原創最新文章、活動資訊,還有限時免費資料分享,等你來拿!

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

7
4
15