OneFLOW代碼主要由adt,array,basic,database,force,geometry,global,gte,io,main,math,multiarray,ns,parallel,register,solver,special,task,test,turb,uns,usolver,uturb,visual,zone等組成。

其中,database,register,task,solver,geometry,parallel屬於核心目錄。ns,turb屬於多求解器架構中可以添加的具體solver。

這個架構並不必然調用ns和turb,這是可選的。只不過我們以NS方程作為切入點,還有經常用的湍流模型。原則上來說,將ns方程替換為magnet則變為求解電磁散射的求解器。這時的目錄結構變為ns,turb,magnet。求解時可以調用其中幾個或者全部。這就是OneFLOW架構設計的大概思路。

Database是OneFLOW運行中需要的資料庫,也就是這個架構的一個核心概念。資料庫和大量的數據操作直接相關,會降低代碼的複雜度,有利於集中精力進行架構的抽象。資料庫也和並行等操作有關係和交互。

目前資料庫部分的代碼是我們自己寫的,隨著架構的演變也可以調用其他開源資料庫或者雲上的介面,所以說,這個概念是重要的,實現是開放的。

register的功能對於OneFLOW也是至關重要的,這關係到所有的腳本解釋,它的主要功能就是可以動態定義類及函數實現(也是一種類)。Register負責註冊運行中所有需要的函數和類(這不是固定的,是依賴於腳本輸入的)。

Task目錄也是架構核心概念之一。OneFLOW裡面的核心代碼執行都是以任務列表的形式實現的。也就是不同的求解器都是在執行一個任務流,或者簡單或者複雜。任務流的執行不依賴於求解器。也就是對於一個和多個求解器執行方式是一樣的。有點象Windows的消息映射。實際上OneFLOW就是這麼設計的。

也就是說這個架構從表面上看和CFD沒什麼關係,這更象操作系統的調度。

每個task原則上是可以加優先順序的,任務不斷被壓入命令列表,不斷被執行,有可能被撤銷中斷(還沒實現,不過不是本質沒問題)。

舉個例子來說,如果僅僅執行NS方程,那麼命令列表中壓入的就是NS方程的一些消息映射。如果要計算湍流,那麼任務列表中就會加入湍流計算的部分。這本身是平淡無奇的。關鍵在於CMD::ExecuteCmd()在這個過程中是不變的,對於一個求解器還是多個求解器保持著幸福的無知狀態。就是再加10個求解器對於核心架構也是不變的,從這點上來說,這個架構是可擴充的。


推薦閱讀:
相關文章