鞠 琳,劉金飛,宋飛揚
(1.中國電建集團成都勘測設計研究院有限公司,四川 成都 610072;2.武漢大學,湖北 武漢 430072)
我國于二十世紀八十年代初開始,在各大型混凝土拱壩建設中,應用計算機仿真技術對拱壩施工全過程進行動態模擬,并引入隨機循環網絡、模糊網絡、Petri網絡、VR技術等新技術,取得了豐碩的成果。武漢大學對小灣拱壩的混凝土澆筑和壩肩、壩基開挖進行了仿真[1],得到了各澆筑塊的澆筑順序,得出了不同方案下的澆筑強度、纜機利用率等系統方案決策指標。天津大學提出了高拱壩施工全過程動態仿真建模理論與方法[2]、基于BIM的混凝土壩澆筑仿真智能建模方法[3]等理論方法與技術,推動了施工仿真技術的快速發展,將隨機排隊理論引入混凝土壩澆筑順序優化中,建立了考慮纜機之間運行空間沖突問題和考慮纜機生產率利用問題的混凝土高拱壩澆筑仿真可視化系統[4]。中國電建成都院通過對溪洛渡水電站大壩進行混凝土施工與計算機仿真研究,對纜機布置、壩體混凝土澆筑方案提出了大壩混凝土澆筑的計算機仿真方法[5],隨后利用施工仿真技術結合數字大壩綜合信息平臺提供的現場數據對施工進度進行跟蹤分析[6],快速地為施工方案優選和進度控制提供了決策。拱壩澆筑仿真過程中涉及大量的系統狀態信息,仿真系統需要將內存中的對象保存到磁盤或數據庫中,以便調試、修改或分發到其他的仿真終端。為此,需要建立內存中的仿真對象與磁盤或數據庫對象的對應關系,這樣的技術方法一般稱為內存對象的持久化。下面從仿真系統動態性、中繼仿真、分布式仿真三個方面說明持久化算法的需求。
(1)仿真動態性的需求。拱壩澆筑施工系統是一個動態系統,其系統參數隨時間變化而變化。如:開始施工的時候,只有輕型起重設備或少量重型起重設備,隨著施工過程深入,起重設備的數量和能力逐漸增加。這些變化一般與施工進度或者系統中的某些節點關聯,因此,需要仿真系統能夠處理動態變化的參數環境。而動態的模型參數則需要仿真系統提供某種接口方法動態處理仿真系統屬性,解決方案之一即是利用持久化技術。
(2)中繼仿真的需求。中繼仿真是系統在仿真過程中,用戶可以隨時要求中斷或者暫停,在修改系統運行條件或者類屬性后繼續運行。該功能需要仿真系統具有一種可以提交內存中的仿真類對象實例到持久存儲介質的方法,以便用戶可以通過修改持久介質達到修改仿真系統中的對象之目的。
(3)分布式仿真的需求。大型仿真系統的計算量十分巨大,分布式并行計算是縮短計算時間的一種有效方式。但是,計算任務的分配和計算參數的傳遞難以用簡單的系統消息傳遞解決。而在進行并行仿真的場合,使用共享內存的方式傳遞數據比較復雜也不安全。因此,必須提供仿真系統計算參數的傳輸方式,即仿真系統類對象的持久化或流化手段,形成仿真系統狀態的數據包,將計算參數分發到計算節點。仿真類持久化是離線共享數據的重要手段。
持久化的目的主要是將內存中的對象存儲到數據庫、磁盤文件、XML數據文件等外存中。由于在用戶共享訪問、并發訪問以及數據分析方面的顯著優勢,主流的持久化多采用關系數據庫方案。但是,由于仿真系統中的數據為內存對象,而關系數據庫中的數據為數據表記錄,關系數據庫記錄和面向對象實例的存儲模式不匹配,所以必須解決轉換映射的問題。
本文針對上述需求,建立數據庫實體對象與內存中仿真對象之間的映射關系,利用仿真對象的持久化技術,建立了一種拱壩澆筑施工仿真對象的持久化算法,實現了仿真對象的存取。
針對現有系統仿真技術的不足,本文提出了一種將仿真過程中涉及的大量系統狀態信息保存到數據庫中并形成系統快照的持久化算法。基于對象數據映射ORM(Object Relational Mapper)持久化技術模式,建立仿真對象與數據庫表記錄的映射關系。仿真系統一方面可以將仿真對象保存到內存以外的介質中,便于數據分析和數據分享;同時,可以利用該映射將對應數據庫中的數據恢復為內存中的類屬性,從而實現仿真參數的動態調整,進一步利用類對象持久化可以方便的在計算進程間分發計算參數。
算法由三個主要部分組成:(1)ORM持久化環境構建,即建立數據結構一致的數據庫表和仿真對象環境;(2)仿真對象實例數據導出,即將內存中的仿真對象保存到數據庫表中;(3)仿真對象實例從數據庫恢復,根據數據庫表中的仿真對象信息重建內存中的仿真對象。
ORM持久化環境構建,需要建立拱壩澆筑施工仿真軟件、數據庫管理系統及其映射,旨在建立拱壩澆筑施工仿真對象與數據庫表記錄的映射關系,如圖1所示。

圖1 拱壩澆筑施工仿真對象持久化映射關系
2.1.1 拱壩澆筑施工仿真對象
運用面向對象分析方法分析施工系統編制施工仿真軟件。建立可持久化基類CInstClass,由基類衍生出各仿真對象。以CBlocks為例,仿真對象CBlocks的結構包括一系列的屬性和方法,持久化只需要處理屬性,如表1所示。

表1 可持久化基類結構和范例說明
可見,可持久化類使用屬性TableName保存與之對應的數據庫表名,利用Items屬性指向一個指針數組,保存與該類相關的仿真對象實例數據,Items中的數據即為需要持久化處理的數據。為了實現對象實例屬性的快速存取,專門建立了一個屬性映射數組FldTlts,其結構如表2所示。

表2 屬性映射數組FldTlts的結構
表2中DtTp的可選參數詳見表3。

表3 可處理的屬性數據類型
表2中Offset存儲位置的偏移量,需要根據屬性的數據在內存中存儲的相對位置決定。在高級語言中可以使用系統內建的數據類型存儲寬度函數取得屬性占位寬度,再累加得到。
2.1.2 數據庫表記錄
為了將內存中的仿真對象保存到數據庫表中,實現仿真對象的持久化,需要建立與類對象屬性對應的數據庫表結構。每個對象屬性對應一個字段,對象屬性的數據類型與字段數據類型相對應。數據庫表結構的說明如表4所示。

表4 可持久化對象對應的數據庫表結構說明
2.1.3 實例和記錄的映射關系
為了保持類對象在內存中存儲與類對象在數據庫表中存儲的一致性(數據類型的不當轉換會帶來信息丟失)。需要將內存存儲的屬性變量與數據庫表的字段變量建立映射關系,并保持二者數據結構的一致性。仿真對象屬性與數據庫表結構之間的映射關系保存在可持久化類的屬性映射數組FldTlts中,映射關系如表5所示。

表5 仿真對象屬性與數據庫表結構之間的映射關系
設某仿真對象O有n個實例記為O1,…,On,每個實例Oi(i=1,…,n)包括m個屬性記為Oi1,…,Oim,每個屬性Oij(j=1,…,m)都有其屬性項目描述信息Pj(保存在前述屬性數組FldTlts中),與數據庫表T的結構Tj相對應。為了將內存中的仿真對象的實例Oi全部導出,需要的步驟如圖2所示。

圖2 拱壩澆筑施工仿真對象導出的信息處理步驟
選定一個對象實例。例如,在上述n個實例中選定實例O1。
針對選定的實例O1,選定一個屬性,如O11。選定具體屬性后,再將其轉換為數據格式。基于前述持久化信息環境,根據O11取得其對應的屬性數據類型信息Pj。取得Pj中包含的“DtTp”表示該屬性的數據類型。可利用取得的數據類型,將O11轉換為正確的字符串類型和格式待用。
針對實例O1的所有屬性O1j,重復執行以上步驟,即可將實例O1的所有屬性均轉換為字符串類型。
在將實例的屬性轉換為字符串后,需要將對象寫入數據庫。利用SQL插入語句的模板,將前面生成的各屬性數據的字符串組合成插入表T的SQL語句。將上述SQL語句提交給數據庫管理系統,即可完成實例O1的持久化操作。對于實例O1的對象識別碼(ID)在表T中已經存在的情況,需要先將其刪除,再插入語句。
針對所有的Oi,i=1,…,n,重復執行以上所有步驟,即可將仿真對象O的所有實例全部保存到數據庫表T中,完成所有對象實例的導出。
設某仿真對象O,與數據庫表T對應,現需要將仿真對象實例從數據庫表T中恢復起來。設數據庫表T有n條記錄T1,…,Tn,對應n個仿真對象的實例記為O1,…,On;每條記錄包括m個字段T1,…,Tm對應對象實例的m個屬性O1,…,Om;Tj(j=1,…,m)和Oj(j=1,…,m)的映射關系由實例和記錄的映射關系R決定。為了將仿真對象實例從數據庫表T從恢復出來,需要的步驟如圖3所示。

圖3 拱壩澆筑施工仿真對象屬性恢復信息處理步驟
仿真系統中有很多仿真對象,針對特定的仿真對象,可以根據其持久化映射關系,取得該對象的關聯表,在數據庫表中定位到特定的記錄。對于根據對象ID恢復特定實例的情況,利用ID定位到特定記錄;而對于恢復所有實例的情況,可以首先定位到第1條記錄。
建立待恢復的對象實例并為其分配內存空間。在新建立的待恢復對象實例中,選定一個屬性作為待恢復的屬性。根據對象描述信息,取得該屬性的名稱和數據類型信息,再通過屬性名在數據庫表中定位字段并取得該屬性數值,最后利用數值、類型、偏移量恢復屬性數據,其中恢復屬性數據的具體操作為:在內存中首先定位到該仿真對象實例的起點地址,利用偏移量定位到該屬性的起點地址,再利用屬性類型確定該屬性的數據寬度,將確定的地址范圍內的內存替換為屬性數值,完成對當前實例、當前屬性值的恢復。
針對特定實例的每個屬性,重復執行建立該對象特定實例之后的步驟,將該實例的所有屬性全部賦值完成;針對每個需要恢復的仿真對象,分別建立對象實例并重復執行以上步驟,即可將該對象的所有實例全部從對應的數據庫表中恢復出來。
本文算法在某300 m級高拱壩混凝土工程施工進度動態仿真中應用。仿真過程中一旦暫停,系統會將當時的仿真狀態持久化到數據庫中,如圖4中a。可以根據施工進度和大壩澆筑條件修改仿真對象數據庫,如圖4中b。修改完成后,仿真系統從數據庫中加載仿真對象并反映修改,如圖4中c,即為中繼仿真。或者將數據庫分發給各計算終端,即可在各并行計算終端重建仿真對象,實現基于相同條件的并行仿真,如圖4中d。

圖4 持久化方法在中繼仿真和并行仿真中的數據流程
表6為中繼仿真結果對比,在計算過程中中斷并對邊界參數進行調整后繼續仿真,仿真完工工期隨之變化;表7為利用本算法開發的分布式仿真系統與常規仿真系統的計算效率對比,其中常規仿真系統運行于1臺計算機、分布式仿真系統運行于3臺、計算機配置相同,同樣計算100組擬定方案,利用本算法實現的分布式仿真系統效率顯著提高。

表6 本算法在中繼仿真中的應用

表7 本算法在分布式仿真中的應用
在進行混凝土拱壩施工進度動態仿真、中繼仿真、分布式仿真時,內存中的仿真計算對象存在持久化的需求。為此,提出了基于對象數據映射ORM持久化技術方法,可建立仿真對象與數據庫表記錄的映射關系。利用該算法可以將仿真對象保存到內存以外的持久介質中,便于仿真系統處理和分享;隨后,可以利用該映射將數據庫中的數據恢復為內存中的類屬性,實現仿真參數的調整;進一步利用仿真對象持久化可以方便地在計算單元間分發計算參數。某高混凝土拱壩澆筑過程仿真系統中運用,驗證了該算法的可行性。