為什麼現代CFD和PIC模擬大量採用C++編寫?針對這些模擬C++相對於C的優勢在哪?
CFD界:您為什麼選擇C++開發CFD代碼而不是FORTRAN?
Henry:在1984年本科之前,我最開始的時候從Basic語言學起,然後轉移到Pascal和C。在我的論文里我使用FORTRAN-77,不得不說,這實在AWFUL!!!太差勁了!C和Pascal比FORTRAN-77會好一點,實際上在1960年ALGOL-60問世之後,FORTRAN就差不多廢棄了。
當我開始我的CFD研究的時候,我拿到的代碼是一堆不能編譯的令人費解的FORTRAN-77代碼。在我學習了幾個月之後,我認為我可以玩的更好。在1989年,我接觸到了C++,並立即看到了對象起源編程的優勢。從那時起,我就開始用C++設計FOAM。然而,在那個年代,C++剛剛問世,並且編譯器VERY脆弱甚至不能工作。慢慢的我認識到泛型編程(Generic Programming)對操作場、矩陣、方程等是非常有必要的,在C++模板問世之前,我就使用C方法、宏和腳本得方法來實現。在C++模板問世之後,以及gcc編譯器的發布,我把我之前寫的代碼用C++模板重寫,這就是OpenFOAM的前身。
當然了,FORTRAN不能做這些。不過FORTRAN-90有一些面向對象的能力,但是它完全沒有泛型編程的功能,據我所知,FORTRAN以後亦不會添加泛型編程的概念。基本上,我個人認為FORTRAN語言快要廢了,在1960年那時候就應該埋在土裡了。目前使用FORTRAN的人大部分是由於歷史原因,只為了新代碼能和非常久遠的代碼兼容。
FORTRAN和C++都因為「向下兼容」而有一些致命的缺點。FORTRAN為了和FORTRAN-77兼容,C++為了和ANSI C兼容。然而最大的區別是,ANSI C本身就是一個非常好的語言,FORTRAN可不是。
在未來,我希望C++被一個更乾淨、簡單、有力的語言代替,這個語言需要支持泛型編程,這對OpenFOAM以及其他相類似的代碼非常重要。我一直關注編程語言的發展,我認為C++的可能的代替品有Nim,Rust以及Chapel,然而目前這些語言缺少一些我需要的必要功能,添加這些功能,比如C++中的高度的泛型編程概念,可能需要很多年。我希望他們在若干年後添加這些特性。同時,C++的缺陷需要妥善處理。在C++17中,我希望「概念」(concept)和「模塊」(module)特性會被加入,所有的C++編程人員都會受益。
額,這個問題我想說的太多了,尤其是關於C++的缺陷以及我對未來編程語言的期望。這越說越遠了,就這麼遭!
C++對C的優勢就在於其面向對象特性:減少代碼量,增加代碼可讀性,提高代碼重用率。也就是說其優點主要就是面向對象方法的優點。
其它優勢我不知道。
就當前CFD大規模並行計算的程序的結構來說,代碼可讀性和並行效率是相互矛盾的。幾乎不存在能夠把程序可讀性和計算效率同時提高的一般方法,不管你是用什麼語言。一個設計良好的C++的對象掩蓋了它底部計算的具體過程,假如想要對它計算效率進行優化,必然需要把某個對象的某個過程獨立出來,具體問題具體分析。
曾經去天河一號開並行計算會議(其實就是intel Phi系列產品介紹),中間休息時和intel前工程師討論過,他們為別人(包括中科院所)做程序優化時並不期望程序是不是面向對象或者結構邏輯非常清晰,他們更希望的是能有個詳細的科學手冊,並且能夠及時更新。
作為一個工科生,我個人認為C++目前對我是完全沒有必要的,與其費盡心思非要把對象用到模型里,不如去寫個結構和模塊化都很清晰的C或者Fortran程序,最關鍵的還是要有配套手冊,其他都是浮雲。謝邀,我覺得應該反過來思考,現代的CFD已經是相當巨大的軟體了,採用C++是必然的,因為CFD軟體也是軟體啊,具有所有其他軟體的一切特性,別的大型軟體用C++開發,為什麼CFD就不用呢?
面向對象,讀fortran代碼,如果開發者不負責任的話,會讀的人慾仙欲死
C++的優勢主要體現在多物理模型和複雜IO。如果只在簡單的構型上解NS,意義不大。
推薦閱讀:
※C、C++、MATLAB、Python、Go 哪個比較適合寫演算法?
※C++如何調用matlab庫函數?
※linux下子進程退出狀態為什麼永遠是非正常?
※LYP是一位怎樣優秀的巨巨?
※為什麼C++書上的.h文件上不加預編譯語句?