我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記

1 Spring3D應(yīng)該長啥樣

我在之前一篇文章中提到過,要啟動三維結(jié)冰程序的研發(fā),這是20年6月份的事情。

結(jié)冰程序,有三個關(guān)鍵的技術(shù):流場計算、水滴收集系數(shù)計算、冰形計算。而在三維結(jié)冰這個方面,一般能完成前兩個,就已經(jīng)達到了相當高的程度,并具備了很強的實用性。

在研發(fā)之前,一個非常重要的問題就是要確定,這個軟件應(yīng)該長啥樣?這個問題倒不是說界面炫不炫,而是整個軟件的設(shè)計理念是什么?也就是所謂的概念設(shè)計。

基于前面二維結(jié)冰程序開發(fā)的經(jīng)驗,還有我自己的從業(yè)經(jīng)歷,我給這個三維軟件一些要求如下:

(1)快。真男人就是要快。好軟件就是要快??炀鸵馕吨杀镜停馕吨矢?,意味著設(shè)計迭代短??炀褪钦x。部件級別的完成計算,用時2小時以內(nèi),整機級別的計算,控制在4-6小時。

(2)具備可用的精度。工程上能夠接受的精度,這個是軟件的底線。

(3)程序模塊化。大到流場計算模塊,小到一個判斷單元位置的算法,通通模塊化,設(shè)置為自定義函數(shù),在主程序里面調(diào)用。這樣主程序簡潔、清晰,子程序可以隨時優(yōu)化更新,不斷升級。

(4)設(shè)計輸入規(guī)范。根據(jù)軟件自身特點,確定輸入文件的格式,并具有普適性。就是說,只要按照這個格式和要求提供輸入,就能成功計算。

(5)軟件輸出可直接用于設(shè)計。比如像Fensap三維結(jié)冰軟件,計算完水滴撞擊后,如果你想在數(shù)模上畫出撞擊范圍,就需要自己后處理,取多個剖面的結(jié)果。Spring3D軟件則要根據(jù)設(shè)計研發(fā)需求,直接給出可用的結(jié)果,避免過多的人工后處理操作。

20年6月份啟動的研發(fā),那時我仍在西北,搞飛機試飛,當月就采用三維面元法解決了流場計算問題。進入7月后,一邊寫參研課題的3萬字報告,一邊改給科普雜志的1.5萬字稿子,一邊搞一型飛機的改裝與試飛,一邊寫另一型飛機的重要報告,最后一邊,搞三維的水滴收集系數(shù)算法(Spring3D-Drop)。

生生忙成了五邊人。 

8月初,試飛工作告一段落,告別了西北的美食和酒,我返回上海。這個時候,程序已經(jīng)可以實現(xiàn)三維水滴軌跡的計算,滴收集系數(shù)算法進入最難點攻堅階段。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖1

2 如何判斷撞擊

水滴運動軌跡程序,其中一個門檻就是解決如何判斷水滴撞在了翼面上。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖2

物理現(xiàn)象的背后是數(shù)學模型。實際上這是個空間幾何問題。當前時間的水滴位置和上個時間的水滴位置,連起來是個線段。而翼面已經(jīng)被我們離散成一個又一個的單元。也就是說,我要判斷線段與空間平面的位置關(guān)系。

根據(jù)空間幾何學,他們之間的可能的關(guān)系如下:

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖3

目前傳統(tǒng)的方法就是用空間幾何來解決。他們的思路大致是這樣的:

(1)根據(jù)單元的節(jié)點坐標,建立每個單元所在平面特征方程。解方程 1;

(2)根據(jù)水滴線段,建立水滴所在直線的特征方程。解方程 2;

(3)求水滴直線與單元平面的交點。解方程 3;

(4)若無交點,則認為是平行。若不平行,判斷交點是否在單元內(nèi)。解方程(or線性代數(shù)) 4。

因為你事先不知道水滴會撞在哪個單元上,所有你要循環(huán)很多個單元作上述的操作,而且只要水滴在翼面附近,你就得全程監(jiān)控,實時重復(fù)上面的操作,非常耗時。就像日本防空自衛(wèi)隊,被我空軍整的疲憊不堪,天天緊急升空,全程伴飛。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖4

這個情況嚴重違反了我前面提到的設(shè)計理念的第一條,必須改變。解決這個問題的關(guān)鍵就是,減少解方程?,F(xiàn)在是4次解方程,如果能縮減成一次或者兩次,就能大大提高效率。

當時是8月份,我白天忙著應(yīng)付飛機運營后航空公司反饋的的各種問題。只能在每天坐班車和地鐵的路上,在腦子里想反復(fù)琢磨怎么少解方程。然后晚上回去嘗試。

終于,忽然有一天,我想到一個模型:射箭!

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖5

箭擊中箭靶,命中點和箭頭、箭尾之間,可用建立向量關(guān)系。通過引入向量關(guān)系,可用把4次解方程的操作縮減為一次。

然而,這個喜悅并未持續(xù)太久。我的工作越來越忙,晚上都很難擠出時間做研究。

3 我想逆轉(zhuǎn)時間

撞擊判斷搞定以后,那么每個水滴在流場中的運動軌跡都可以做出來。即便事先有心理準備,但是程序的計算效率之低仍然出乎我的意料。只算一個剖面數(shù)十根水滴,就畫了兩三個小時。這要是整個部件,再考慮到為了計算每個的單元收集系數(shù),需要迭代的數(shù)十根水滴,整個部件的收集系數(shù)沒一個星期時間是算不出來的。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖6

前面的文章中我們提到過,求解每個單元收集系數(shù)的關(guān)鍵,是確定單元邊界位置對應(yīng)的水滴初始發(fā)射位置。通常來說,水滴迎面過來,撞在機翼上。是不是恰好打在單元的邊界,是不確定的,因此需要不停的迭代修正,這個過程需要計算很多水滴。如果我能根據(jù)邊界位置,反推出水滴初始發(fā)射位置,是不是可以不用迭代,一步到位呢?

我當時的設(shè)想是,我從翼面單元邊界發(fā)射水滴,逆著時間線,反推之。就像相控陣雷達那樣,每個單元發(fā)射信號,接受回波,修正下就可以了。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖7

想的很美,但是現(xiàn)實太丑!逆時間出來的線,和順時間出來的線,完全對應(yīng)不上。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖8

時間進入9月份,剛好諾蘭的大作《信條》上映。電影展示了正向、逆向時間下,各種反常而有趣的操作。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖9

我一下子又被點燃了激情。勞資也要逆轉(zhuǎn)時間!

在正時間下,水滴軌跡的求解思路是:

(1)已知初始時間點,水滴的位置、速度。

(2)根據(jù)控制方程得到水滴加速度,考慮時間推進一定時間后,移動到新的位置,并在氣動力、流場速度的共同影響下,更新速度;

(3)重復(fù)上述操作,不斷推進時間,得到水滴運動完整軌跡。

逆時間最大的問題是,我知曉水滴的在時間T的位置,但并不知曉它的速度,也不知曉它從上個時間點過來的加速度。那我只能假設(shè)一個T時間速度。用假設(shè)的T時間速度,和T時間的加速度,反向推進時間,更新軌跡。初始速度不準確,每個時間點用的加速度也不準確,最后的軌跡必然不準。

我不死心的嘗試在正向、逆向時間之間,建立修正關(guān)系。然而這個關(guān)系并不具備普適性,反復(fù)嘗試,可以達到修正部分水滴的效果,但卻難以應(yīng)對更多、更復(fù)雜的情形。

逆轉(zhuǎn)時間,失敗!

4 生活改變

就在這個階段,我的工作已經(jīng)忙到無力再做自己的研究了,每天要處理多個完全不搭嘎的事務(wù),大部分都不是技術(shù)問題,不要說業(yè)余,生活時間都沒有了。10月初參加完好基友朋友婚禮后不久,大病一場。晚上中低燒到醫(yī)院,做完核酸、抽血、CT一套流程以后,變成高燒。確認是細菌感染,又等了很久掛上水,這個是時候我已經(jīng)燒迷糊了,渾身疼的控不住自己,大口大口地喘氣。水是4瓶,我以為兩瓶掛完,我應(yīng)該就退燒了。萬萬沒想到,四瓶掛完,并未好轉(zhuǎn)。

好在,高燒在,智商仍在。我判斷我掛的水里面只有消炎藥,沒有退燒藥。然后我開始翻醫(yī)生開的藥,找到退燒藥后,兩倍量吞下。裹著被子迷迷糊糊睡著了,不多久,渾身被汗?jié)裢?,終于舒服了一點。

后面又掛了幾天的水,才徹底好轉(zhuǎn)。就在第二天掛水的時候,我意識到,生活要必須要改變,不拿身體開玩笑。然后下載了求職app,準備換工作。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖10

折騰了兩個多月,面試了將近20個單位,最終確定下來。這個時候工作交接差不多,我也沒啥任務(wù)了,又空出時間來。

在寫了幾個復(fù)材程序練手以后,我決定再次向Spring3D發(fā)起沖鋒。

5 塵埃落定,再出手

剛開始我把希望寄托于現(xiàn)有的文獻。輾轉(zhuǎn)找到了NASA LEWICE 3D的說明文檔,試圖找到思路。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖11

看完以后,喜憂參半。憂的是,NASA LEWICE 3D文檔里面,并沒有說他采用了何種提高效率的做法,一無所獲。喜的是,文檔里面的配圖的畫風跟我出圖的畫風很像,我不相信他們沒有遇到過類似的問題。從蛛絲馬跡之中,我預(yù)感到,他們一定遇到了并且解決了。這堅定了我發(fā)展這類插值方法的決心。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖12

仔細思考以后,決定從三個方面入手,提高效率。’

(1)縮短單根水滴的計算時間;

(2)提高水滴的使用率,避免射出百箭僅中一靶的情況。

(3)搞出三維水滴收集系數(shù)插值法,用僅可能少的水滴,插值出收集系數(shù)。

縮短單根水滴的計算時間

經(jīng)過調(diào)試發(fā)現(xiàn)。當前水滴程序里面,最耗時的仍舊是判斷是否撞擊到翼面的子模塊。程序模塊化的優(yōu)勢這個時候體現(xiàn)了出來,它還能精準的幫助我們優(yōu)化程序。

這個時候我剛好去西北出我的最后一次差。再次回到奮戰(zhàn)數(shù)個月的地方,特別感概,覺今是而昨非。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖13

在西北的那幾天,我前后探索了兩種思路都取決了不錯的效果。一種是開發(fā)一個專門的精確識別是否需要啟動撞擊判斷程序的算法,減少撞擊判斷。另一種是,開發(fā)一個精確識別哪些單元需要被判斷的算法,減少撞擊判斷中的循環(huán)單元數(shù)量。

這兩個方法用上以后,效果是立竿見影的。原先數(shù)個小時的工作,現(xiàn)在只要四到五分鐘就能算完。

提高水滴的使用率

提高水滴的使用率的目的,前面也提了,就是要做神手。爭取一個水滴消滅一個單元,而不是像下圖這樣。我在原先程序基礎(chǔ)上也做了兩個方案,一個是水滴非均勻發(fā)射,一個是保持總數(shù)不變,嵌套迭代。也都取得了很好的效果。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖14

基本上,通過有限個水滴,就能把撞擊范圍精確定位出來。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖15

三維水滴收集系數(shù)插值法

這個是我最得意的一招,無論是原創(chuàng)性還是精妙程度,都值得吹噓很久。之前搞二維的時候,我就搞過一個插值。而三維的插值,對于物理現(xiàn)象的把握、思路和程序設(shè)計水平提出了難度高出幾個量級的要求。

限于核心技術(shù)不外泄的原則,這里只講下插值方法需要解決的難點:

(1)每個單元邊界對應(yīng)的水滴發(fā)射位置的插值定位技術(shù);

(2)有限個水滴,如何精確定位撞擊邊界線;

(3)從剖面到展向,二維、三維尺度上結(jié)果的精確性保證。

我先解決了剖面收集系數(shù)曲線,然后又解決了三維尺度上單元交界的處理,這個時候,應(yīng)該是可以一次算出水滴收集系數(shù)的三維云圖了。但是近鄉(xiāng)情更怯,我先計算多剖面的云圖,確定沒有問題了,才最終點下終極計算的按鈕。

終于,在離職前一天的晚上,心心念念的水滴收集系數(shù)云圖,在不到20分鐘的時間,出來了。

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖16

我能逆轉(zhuǎn)時間嗎?—Spring3D-Drop結(jié)冰程序研發(fā)記的圖17

云圖結(jié)果和預(yù)期一致。這個圖,我在腦子里期待了半年,它是我不斷克服困難,加班加點的動力所在。怎么形容這種成就感都不過分。

云圖拿到的第二天,我徹底離開了單位。畢業(yè)前就開始做結(jié)冰算法,學結(jié)構(gòu)強度的我,從零開始進入這個領(lǐng)域,而后參加工作,至今三載。無數(shù)個日夜的思考,無數(shù)個日夜的探索,無數(shù)次的失敗,無數(shù)次的喜悅。

一段征程在這里畫上句號,或許正當其時。

最后,更多精彩內(nèi)容,歡迎大家關(guān)注“320科技工作室”微信公眾號。

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

TOP

14
12
7