CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起

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

聯(lián)系我們:021-58403100

原作者:三只青蛙

導(dǎo)讀屈指數(shù)一數(shù),我從事cae程序工作十幾年了,沒(méi)有什么成績(jī),只有教訓(xùn)和眼淚。十幾年間幾乎沒(méi)有周末和假日,沒(méi)有娛樂(lè)和休閑,也沒(méi)有了愛(ài)好。我希望能把自己的一些經(jīng)驗(yàn)寫(xiě)下來(lái),對(duì)充滿活力的年輕人有一絲助力和借鑒。讓他們成長(zhǎng)之路更短,略微更平坦一些……


寫(xiě)在前面


4月26日,工信部信息技術(shù)發(fā)展司副司長(zhǎng)王建偉表示,2021年將著力突破CAD、CAE等工業(yè)軟件,推進(jìn)操作系統(tǒng)與芯片、數(shù)據(jù)庫(kù)、中間件及各類(lèi)應(yīng)用軟件的集成、適配、優(yōu)化,引導(dǎo)企業(yè)提升產(chǎn)品化發(fā)展能力。現(xiàn)如今,無(wú)論國(guó)家和民間,都在把工業(yè)軟件作為一個(gè)重要的發(fā)展方向,提出了各種目標(biāo)和口號(hào)。

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

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖1

倪光南院士在天津工業(yè)APP大會(huì)發(fā)言

(1) 有的是教訓(xùn)和眼淚

屈指數(shù)一數(shù),我從事cae程序工作十幾年了,沒(méi)有什么成績(jī),有的只是教訓(xùn)和眼淚。十幾年間,幾乎沒(méi)有周末和假日,沒(méi)有娛樂(lè)和休閑,也沒(méi)有了愛(ài)好。回頭想想,其實(shí)很多很多的路,是在仿徨和猶豫中度過(guò)的,總在猶豫,總在反復(fù),總在時(shí)時(shí)刻刻的考慮,是不是那樣寫(xiě)更好,是不是不應(yīng)該這么寫(xiě)。是的,有很多很多的后悔的作為。

也有無(wú)數(shù)的一步可以跨過(guò)的溝,我卻是繞過(guò)來(lái)趟過(guò)來(lái)的。

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

(2) 以資本的方式去硬砸這個(gè)產(chǎn)業(yè)

在這個(gè)系列的文章里,我只談CAE的程序問(wèn)題,不去觸碰CAE的產(chǎn)業(yè)問(wèn)題,也許那不是我關(guān)心的事情。我只想說(shuō)一句在這里,我是反對(duì)以資本的方式去硬砸這個(gè)產(chǎn)業(yè)的。這個(gè)東西是個(gè)需要時(shí)間積累的東西,很難想象可以用資本能夠擊穿。

我的工作生涯里,有50%的時(shí)間在做計(jì)算,50%的內(nèi)容在做前后處理。前面的寫(xiě)作我只會(huì)涉及計(jì)算,以后會(huì)再寫(xiě)一些前后處理方面的東西。即使計(jì)算方面, 針對(duì)不同的專(zhuān)業(yè),也是千番不同。我想大家可以和我交流的,大多也是更為基礎(chǔ)的程序代碼方法和算法方法,更多的東西,我想我也肯定無(wú)從了解。


為什么CAE程序

會(huì)感覺(jué)很困難


首先這個(gè)問(wèn)題, 是確定的,是的,真的很難, 學(xué)習(xí)成本極高。

(1) 綜合性強(qiáng)

也就是跨學(xué)科了吧,只拿做計(jì)算的來(lái)說(shuō)吧,學(xué)好本專(zhuān)業(yè)已經(jīng)不容易了,還要學(xué)好計(jì)算機(jī)程序編寫(xiě)。至于計(jì)算機(jī)程序的編制, 需要學(xué)習(xí)的還有數(shù)值方法,矩陣論,甚至圖論等……, 幾乎所有的數(shù)學(xué)都要學(xué)差不多,不一定要會(huì)證明和很深,但是大多數(shù)都要理解,才能寫(xiě)出精巧的程序。這個(gè)問(wèn)題,我想以后慢慢做一些框圖來(lái)解釋。給寫(xiě)不同程序的人,不同的建議,要準(zhǔn)備什么書(shū),儲(chǔ)備什么知識(shí)等。

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

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

我這里指的是團(tuán)隊(duì)建設(shè),一加一等于二,沒(méi)有問(wèn)題的,那僅僅是個(gè)理想的相加,現(xiàn)實(shí)中,要筑起一道墻,一塊一塊的磚頭疊加一起,是沒(méi)有意義的,需要砂漿來(lái)粘合,需要時(shí)間來(lái)凝固,需要澆水來(lái)養(yǎng)護(hù)。

很多時(shí)候,我們要求一個(gè)學(xué)力學(xué)的,和一個(gè)學(xué)計(jì)算機(jī)的去合作完成一個(gè)程序,大多數(shù)時(shí)候都是失敗,我不知道老外這種事情的管理是如何的。我知道的,中國(guó)人在這種的合作上,大多是失敗的。我想老外也差不多。

成功的少數(shù)案例,就是學(xué)力學(xué)的會(huì)寫(xiě)程序了,學(xué)計(jì)算機(jī)的也懂力學(xué)了,而且懂的程度很深。并沒(méi)有一條很好的途徑,使得兩者在互相了解對(duì)方知識(shí)很少的情況下完成這件事情。但是最后的結(jié)果,僅僅是完成,還是有問(wèn)題的,起碼在代碼上,可以輕易的看出,是學(xué)力學(xué)的模仿計(jì)算機(jī)寫(xiě)的,還是計(jì)算機(jī)的不懂裝懂的按照學(xué)力學(xué)的說(shuō)的寫(xiě)的。

(3) 被忽視的二級(jí)算法

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖2

CAE專(zhuān)業(yè)和計(jì)算機(jī)代碼之間,是需要二級(jí)算法的。所謂的二級(jí)算法,大多衍生于數(shù)值方法那門(mén)課的內(nèi)容,也有更多的需要完整的學(xué)一門(mén)新課。大多數(shù)有興趣有動(dòng)力來(lái)做CAE程序的人,基本都把自己的專(zhuān)業(yè)部分學(xué)的很好了,理解的很透,但是一旦上手開(kāi)始寫(xiě),又覺(jué)得無(wú)所適從。其實(shí),這中間還差很多很多東西,二級(jí)算法書(shū)上不會(huì)講,基本都是要自己悟的,基本,大多數(shù)人選擇從開(kāi)源的程序?qū)W習(xí)進(jìn)入。以后我想專(zhuān)門(mén)的來(lái)討論開(kāi)源軟件的讀改問(wèn)題。

在計(jì)算機(jī)專(zhuān)業(yè)和cae專(zhuān)業(yè)之間,人員的磨合,代碼的精進(jìn),都是基于二級(jí)算法的建立和改進(jìn)的。這也就是經(jīng)驗(yàn)的集合吧。論文上的東西都差不多的其實(shí),大部分是公開(kāi)的,我們和成熟商軟的距離,就差這個(gè)其實(shí)。


成長(zhǎng)之路之計(jì)算機(jī)語(yǔ)言


這是一個(gè)大項(xiàng)。作者僅僅熟悉c++和fortran語(yǔ)言,所以僅僅能從這兩門(mén)語(yǔ)言的角度進(jìn)行。

(1) 語(yǔ)言是不相同的 

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖3

程序在本質(zhì)上是相同的。那是編程二進(jìn)制之后的事情了。所以有一種說(shuō)法, 所以用哪種語(yǔ)言都一樣。學(xué)好了,都能寫(xiě)出好的程序,這是對(duì)的。這里的不同,說(shuō)的是,其實(shí)每一門(mén)語(yǔ)言,都有自己獨(dú)特的地方和優(yōu)勢(shì),你用那門(mén)語(yǔ)言去寫(xiě),就要利用好那門(mén)語(yǔ)言的優(yōu)勢(shì),才能寫(xiě)出好的程序。才能感到那門(mén)語(yǔ)言的魅力。

在結(jié)構(gòu)化程序上,大多數(shù)語(yǔ)言是可以互相調(diào)用的,基本是相同的。很多書(shū)也如是說(shuō)。

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

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

(2) 關(guān)于c++和fortran

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖4

真的很希望計(jì)算機(jī)就一種語(yǔ)言,起碼不用那么糾結(jié),我想做計(jì)算的大多數(shù)用這兩種語(yǔ)言,已經(jīng)足夠糾結(jié),現(xiàn)在出現(xiàn)了更多的,python,perl等。糾結(jié)更加糾結(jié)。我和大多數(shù)的人一樣,很多時(shí)間花在了糾結(jié)上。糾結(jié)用哪一種語(yǔ)言。

現(xiàn)在呢,我還在糾結(jié)偶爾,還是沒(méi)徹底解決。兩種語(yǔ)言,我都算精通了,不是語(yǔ)言的事情了。但是在做某件事情的時(shí)候,往往希望基于某個(gè)東西去做,那個(gè)既有東西的功能的好壞,也包含了語(yǔ)言的選擇,成為了一個(gè)糾結(jié)的選項(xiàng)。在語(yǔ)言的單獨(dú)選項(xiàng)上,我更偏向于c++語(yǔ)言。以后的程序都是趨向于大型化,利用C++更好管理,這是學(xué)C++的人的借口。其實(shí)新的fortran也能很容易的大型代碼的管理,單獨(dú)做計(jì)算的,無(wú)論程序多大,我想fortan已經(jīng)足夠。我偏向c++,是因?yàn)橥瑫r(shí)在做前后處理。

(3) 學(xué)習(xí)的順序

大多數(shù)做cae計(jì)算程序的人,都是邊學(xué)邊干的,這一點(diǎn)不可避免。我是這么過(guò)來(lái)的。

  1. 但是我現(xiàn)在建議初編者,拿出3-4個(gè)月的時(shí)間,忘記CAE計(jì)算,就所用程序語(yǔ)言本身,去做專(zhuān)業(yè)的學(xué)習(xí),無(wú)論fortran還是c++,或者其他。

  2. 這不算彎路,你腦子中有更多的儲(chǔ)備,遇到cae計(jì)算問(wèn)題,就會(huì)有更多的靈感,也會(huì)有更多的經(jīng)驗(yàn),去更快的處理。

  3. 不要有一種想法,就是CAE還是理論問(wèn)題,程序語(yǔ)言本身,我學(xué)到一定程度就夠了,某種程度上,做CAE程序的,要計(jì)算機(jī)比學(xué)計(jì)算機(jī)的還要學(xué)的深入。

  4. 這一切,都是因?yàn)镃AE的程序更注重效率。編譯原理,其實(shí)對(duì)于學(xué)力學(xué)的人,卻是必學(xué)的。計(jì)算機(jī)的卻可以學(xué)了忘掉其實(shí)。

用一個(gè)計(jì)算機(jī)的本身問(wèn)題,來(lái)解釋這個(gè)事情吧:

  • 馮*諾依曼體系下的計(jì)算機(jī),大多有這樣的問(wèn)題,就是ALU少于FPU。

  • 也就是判斷大多數(shù)時(shí)候是計(jì)算的瓶頸,而不是浮點(diǎn)運(yùn)算。

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

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

所以,我建議在學(xué)程序本身的時(shí)候,要忘記CAE, 不要想這個(gè)我以后用不到,那個(gè)我用到了再說(shuō),先搞定一頭再說(shuō),多余的學(xué)到的語(yǔ)言知識(shí),是你寫(xiě)精巧程序的靈感的來(lái)源。

(4) CAE程序高手的晉級(jí)的幾個(gè)階段

每個(gè)人學(xué)語(yǔ)言都有這樣幾個(gè)階段。每個(gè)階段的成就感是必要的。

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖5
  • 初學(xué),很感興趣,興趣在結(jié)構(gòu)化的循環(huán)控制和實(shí)現(xiàn)自己的算法, 基本一個(gè)小程序都是用來(lái)計(jì)算,都是干貨。

  • 更深入的時(shí)候,發(fā)現(xiàn)管理性的代碼越來(lái)越多。一個(gè)大型程序,基本管理性的代碼要占到60%可能,功能性代碼占比卻逐步減少。基本每一個(gè)搞專(zhuān)業(yè)的都會(huì)有一種煩躁感。很多人專(zhuān)業(yè)搞的非常好,但是就是客服不了這一種煩躁感,很多年都沒(méi)有把自己的東西寫(xiě)出好的軟件程序。這一步也許是成長(zhǎng)最重要的部分。

  • 編輯器的操作是另一個(gè)部分,這一步其實(shí)更多的人在一起工作更好,會(huì)一起獲取更多的使用經(jīng)驗(yàn),編譯器的熟悉程序關(guān)系到編寫(xiě)的效率,也是一個(gè)必須要過(guò)的關(guān)。

  • 因?yàn)楣ぷ鲉?wèn)題,會(huì)去翻更多的別人的代碼,這一步要小心,我是這么過(guò)來(lái)的,在翻別人東西的時(shí)候,有時(shí)會(huì)被別的興趣去吸引,走偏了方向,尤其是技術(shù)控,自己也有自控能力。可能完成導(dǎo)師和老板的任務(wù)更重要,感興趣的以后慢慢再說(shuō)。

  • 學(xué)會(huì)忍受寂寞,接下來(lái)就是在迷茫和清晰之間無(wú)限的循環(huán)了。

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

■ 思維上要做好轉(zhuǎn)換。寫(xiě)計(jì)算軟件,最重要的增大知識(shí)的廣度,不是深度,是更好的實(shí)現(xiàn)自己專(zhuān)業(yè)知識(shí),不是學(xué)更多的轉(zhuǎn)月知識(shí),不能陷入無(wú)限的學(xué)習(xí)循環(huán)。

■ 大概率的,到真正寫(xiě)程序的時(shí)候,所有人都會(huì)發(fā)現(xiàn)自己認(rèn)為學(xué)過(guò)的東西根本不會(huì),像是沒(méi)學(xué)過(guò)。

■ 回去認(rèn)真的復(fù)習(xí)以前的東西,人會(huì)在一個(gè)階段覺(jué)得自己的思路特別清晰,感覺(jué)工作就要完成了。

■ 真正做幾天,又會(huì)別的問(wèn)題發(fā)生,人又會(huì)限于迷茫,這一切循環(huán)往復(fù)。

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


不同的數(shù)值方法和專(zhuān)業(yè)


現(xiàn)在存在的數(shù)值方法種類(lèi)是很多的,有限元,離散元,有限差分,有限體積,非連續(xù)變形,粒子法,近場(chǎng)動(dòng)力學(xué)。。。。等。作者對(duì)上述方法都有涉獵,都略看過(guò)一點(diǎn)。近年也在師兄的的幫助下開(kāi)發(fā)一種新方法,希望完成有限元和離散元的統(tǒng)一,真正實(shí)現(xiàn)離散-連續(xù)的平滑化。這一切都在進(jìn)行,有些緩慢。人生短暫,最終還是希望搞學(xué)術(shù),不再混跡于江湖。

(1) 代碼架構(gòu)

對(duì)于不同的數(shù)值方法,都有不同領(lǐng)域的用途。每種方法寫(xiě)起來(lái),除了算法本身的問(wèn)題,也有不同的編寫(xiě)套路。我想所謂的這些方法“套路”,其實(shí)就是軟件程序的架構(gòu)和實(shí)現(xiàn)細(xì)節(jié)。我對(duì)有限元和離散元的套路知道個(gè)大概。即使同樣的的有限元程序,因?yàn)槟繕?biāo)的專(zhuān)業(yè)不同,架構(gòu)和套路也是千奇百怪。以后慢慢會(huì)很多不同的代碼套路講給大家,每個(gè)作者做這些代碼的時(shí)候,真的是有自己非常深入的考慮。我們有幸學(xué)習(xí)別人的東西,是一件很幸福的事情。

希望以后總結(jié)下,用某種方式發(fā)布出來(lái)。把各個(gè)軟件的架構(gòu)和目標(biāo),都講給希望學(xué)習(xí)CAE程序的人。

  • 我目前在做的工作,就遇到了新的有限元編寫(xiě)的不同套路的問(wèn)題,多了幾個(gè)月來(lái)學(xué)習(xí),使得工作有些拖拉,但是也算是給自己一些好的補(bǔ)充。

  • 看看每個(gè)代碼,基本理論來(lái)源都雷同,但是每一個(gè)細(xì)節(jié)都不相同,在二級(jí)算法的考慮上,都有自己的獨(dú)到之處。

  • 如果你編寫(xiě)代碼的套路,獨(dú)樹(shù)一幟,和其他都不同,說(shuō)明真的理解了,是真正的原創(chuàng)。

說(shuō)了這么多,舉一個(gè)簡(jiǎn)單的例子吧,單元數(shù)據(jù)的計(jì)算,對(duì)于建筑結(jié)構(gòu)軟件類(lèi)軟件來(lái)說(shuō),做設(shè)計(jì)的人都知道,同尺寸通材料的梁柱很多的,在某些時(shí)候,把這些都分好類(lèi),計(jì)算一個(gè),就等于計(jì)算好了很多根。這個(gè)某些時(shí)候比并行化好用。更好的例子,以后慢慢把我的經(jīng)驗(yàn)講給大家。

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

不同的計(jì)算方法,編寫(xiě)都有不同的技巧問(wèn)題,我熟悉有限元的,和離散元的。希望以后和更多人交流。這個(gè)暫時(shí)不展開(kāi)說(shuō)。繁而雜的東西。

(3) 從論文到代碼

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

  • 第一,自己能深刻理解的論文+自己熟悉的代碼架構(gòu),可以做到完美實(shí)現(xiàn),并且會(huì)有創(chuàng)新的思路。

  • 第二,自己不能深刻理解的論文+自己熟悉的代碼架構(gòu),可以做到反復(fù)實(shí)驗(yàn)下的實(shí)現(xiàn),不會(huì)有創(chuàng)新的思路。

  • 第三,自己能深刻理解的論文+自己不熟悉的代碼架構(gòu),可以做到實(shí)現(xiàn)精確的計(jì)算,往往不能實(shí)現(xiàn)深刻靈活的功能。

  • 第四,自己不能深刻理解的論文+自己不熟悉的代碼架構(gòu),這個(gè)…基本什么不能實(shí)現(xiàn)。

很多人更關(guān)心第二項(xiàng),不能理解的也能實(shí)現(xiàn)。這個(gè)確實(shí)有,以后會(huì)寫(xiě)一些相關(guān)的經(jīng)驗(yàn)文章,來(lái)說(shuō)明技巧。但是不建議大家這么做。知其然,不知其所以然,最終還是很難進(jìn)一步寫(xiě)下去的。

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

CAE編程高手之路:從軟件開(kāi)源代碼使用及改造說(shuō)起的圖6

關(guān)注【上海安世亞太】官方微信,獲取更多原創(chuàng)最新文章、活動(dòng)資訊,還有限時(shí)免費(fèi)資料分享,等你來(lái)拿!

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

7
4
15