專(zhuān)利名稱(chēng):面向?qū)ο蟮臒N儲(chǔ)集層系統(tǒng)模擬的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)值模擬,尤其涉及模擬烴系統(tǒng)的一種改進(jìn)方法,烴系統(tǒng)包括下面的一個(gè)或多個(gè)地下含烴地層,穿過(guò)該地層的注入井,穿透該地層的生產(chǎn)井,地面流送管,相關(guān)含水層,以及地面流體處理設(shè)施。
背景技術(shù):
數(shù)值模擬作為一種使用計(jì)算機(jī)來(lái)模擬物理系統(tǒng)的方法被廣泛用于工業(yè)領(lǐng)域中。在大多數(shù)情況下,希望模擬在物理系統(tǒng)中發(fā)生的輸運(yùn)過(guò)程。被輸運(yùn)的典型地是質(zhì)量,能量,動(dòng)量,或其某種組合。通過(guò)使用數(shù)值模擬,能夠模擬并觀察物理現(xiàn)象,以及確定設(shè)計(jì)參數(shù),而不需要實(shí)際的實(shí)驗(yàn)室試驗(yàn)和實(shí)地試驗(yàn)。
儲(chǔ)集層模擬法是很有意義的,因?yàn)樗鼜膬?chǔ)集層模型的性能推斷真實(shí)含烴儲(chǔ)集層的性狀。儲(chǔ)集層模擬的典型目的在于充分地了解在儲(chǔ)集層中發(fā)生的復(fù)雜的化學(xué),物理和流體流動(dòng)過(guò)程來(lái)預(yù)測(cè)儲(chǔ)集層將來(lái)的性狀使烴的開(kāi)采達(dá)到最大。儲(chǔ)集層模擬經(jīng)常指的是儲(chǔ)集層中流的流體力學(xué),但是在更大的意義上,儲(chǔ)集層模擬也可以指整個(gè)烴系統(tǒng),其可以不僅包括儲(chǔ)集層,而且包括注入井,生產(chǎn)井,地面流送管,相關(guān)含水層,以及地面處理設(shè)施。這種烴系統(tǒng)中的儲(chǔ)集層模擬計(jì)算基于通過(guò)被模擬的整個(gè)烴系統(tǒng)的流體流動(dòng)。這些計(jì)算以不同的精確度來(lái)執(zhí)行,依賴(lài)于具體模擬研究的需求和所使用的模擬軟件的能力。
數(shù)值模擬的原理是使用計(jì)算機(jī)來(lái)數(shù)值地求解描述物理現(xiàn)象的方程。這種方程通常是常微分方程和偏微分方程。作為用于數(shù)值地求解這種方程的方法,已知的有有限元法,有限差分法,有限容積法等。不管使用哪種方法,被模擬的物理系統(tǒng)被分成單元(稱(chēng)為格或網(wǎng)格的集),并且在整個(gè)模型的空間中變化的狀態(tài)變量由每個(gè)單元的值的集來(lái)表示。儲(chǔ)集巖的性質(zhì)例如孔隙率和滲透率在單元內(nèi)典型地被假設(shè)為常數(shù)。其他變量例如流體壓力和相飽和度在單元內(nèi)規(guī)定點(diǎn),有時(shí)稱(chēng)作節(jié)點(diǎn)處指定。兩個(gè)節(jié)點(diǎn)之間的鏈接稱(chēng)作“連接”。
因?yàn)閮?chǔ)集層模擬可以包括非常不同的流體流動(dòng)環(huán)境(例如,多孔巖石,油管,處理設(shè)施),單元集可以包括不同流動(dòng)環(huán)境的多個(gè)段。雖然各個(gè)段,例如生產(chǎn)設(shè)施和地面管段,可以由單個(gè)單元來(lái)表示,但是有時(shí)儲(chǔ)集層模擬程序?qū)⑦@些段細(xì)分成多個(gè)單元。
一組方程被開(kāi)發(fā)來(lái)表示每個(gè)單元內(nèi)質(zhì)量,能量和/或動(dòng)量守恒的基本原理以及單元之間質(zhì)量,能量和/或動(dòng)量運(yùn)動(dòng)的基本原理。這些方程可以百萬(wàn)來(lái)計(jì)算。用每個(gè)單元的有限數(shù)目的變量值來(lái)代替在整個(gè)模型的空間中變化的狀態(tài)變量稱(chēng)作“離散化”。為了分析隨時(shí)間變化的現(xiàn)象,需要在稱(chēng)作時(shí)間步的離散時(shí)間間隔計(jì)算物理量,而不管為時(shí)間函數(shù)的連續(xù)變化條件。因此,輸運(yùn)過(guò)程的時(shí)間依賴(lài)模擬以時(shí)間步序列進(jìn)行。在希望的一段時(shí)間中的流的模擬通過(guò)增量地向前移過(guò)時(shí)間,并且在每個(gè)時(shí)間步對(duì)每個(gè)節(jié)點(diǎn)的壓力和流體含量求解方程來(lái)進(jìn)行。
已經(jīng)作出努力來(lái)以單一計(jì)算機(jī)代碼執(zhí)行廣泛變化的儲(chǔ)集層模擬方法。但是,這種“通用”模擬系統(tǒng)非常復(fù)雜,主要因?yàn)樗鼈儽辉O(shè)計(jì)來(lái)具有下面能力的一個(gè)或多個(gè)(1)表示許多不同類(lèi)型的單元(例如,儲(chǔ)集層的不同疇,油管,地面油氣集輸和分配設(shè)施,以及地面處理設(shè)施);(2)使用不同的時(shí)間步計(jì)算方法(例如,IMPES,全隱式,順序隱式,自適應(yīng)隱式,和/或逐級(jí)測(cè)量法);(3)使用不同的表示儲(chǔ)集層流體的方法;(4)使用多種計(jì)算單元之間輸運(yùn)的方法;(5)執(zhí)行把烴看作由兩種成分組成的所謂的“黑油模型”,并且也具有執(zhí)行組成表示的能力,其中烴被假設(shè)包含化合物例如甲烷,乙烷,丙烷以及更重的烴;(6)模擬蒸汽噴射或就地燃燒過(guò)程,其必須考慮為時(shí)間函數(shù)的溫度變化,這需要能量平衡和相關(guān)計(jì)算;(7)使用專(zhuān)門(mén)的流體性質(zhì)和輸運(yùn)計(jì)算來(lái)模擬可混合開(kāi)采過(guò)程;(8)模擬烴開(kāi)采過(guò)程,其考慮表面活性劑,聚合物或其他化合物的注入,以及這些流體流入儲(chǔ)集層的流動(dòng);(9)模擬相互之間,與儲(chǔ)集層烴或儲(chǔ)集巖起化學(xué)反應(yīng)的化合物的注入;(10)模擬烴和地質(zhì)沉積物在地質(zhì)時(shí)期的遷移。
在歷史上,因?yàn)橥ㄓ媚M系統(tǒng)是復(fù)雜的,儲(chǔ)集層模擬程序典型地僅模擬地下儲(chǔ)集層中的流體運(yùn)動(dòng),或者它們模擬地下流體運(yùn)動(dòng)并包括簡(jiǎn)化計(jì)算,例如水力學(xué)模型,來(lái)模擬儲(chǔ)集層和地面之間的井管中的流動(dòng)。為了更逼真地模擬通過(guò)井的以及在附接的地面生產(chǎn)設(shè)施(例如歧管,泵,壓縮機(jī),分離機(jī)和管道)中的流,典型地需要不同于儲(chǔ)集層模擬模型的分立的設(shè)施模擬模型。因?yàn)檫@些儲(chǔ)集層和設(shè)施模擬模型試圖描述很長(zhǎng)一段時(shí)期,典型地許多年的流動(dòng)特性,并且模擬被離散化成覆蓋希望的模擬時(shí)期的時(shí)間步,試圖基于這兩個(gè)不同的模型設(shè)計(jì)集成的模擬過(guò)程是麻煩而且昂貴的。這種過(guò)程通常涉及在兩個(gè)模型之間交替時(shí)間步,使得在一個(gè)模型中發(fā)生的變化可以并入第二模型的隨后時(shí)間步的輸入中。
在過(guò)去的儲(chǔ)集層模擬中的一個(gè)挑戰(zhàn)性問(wèn)題是缺乏通過(guò)儲(chǔ)集層模擬系統(tǒng)中的井管和地面設(shè)施的輸運(yùn)現(xiàn)象的精確模擬。傳統(tǒng)的儲(chǔ)集層模擬器典型地具有兩個(gè)重大的限制。首先,許多儲(chǔ)集層管理研究需要比可能在儲(chǔ)集層模擬器中的更高級(jí)的地面設(shè)施流動(dòng)模型。為了解決該問(wèn)題,模擬器用戶(hù)典型地為儲(chǔ)集層特性開(kāi)發(fā)并維持一個(gè)模擬模型而為設(shè)施特性開(kāi)發(fā)并維持另一個(gè)模擬模型,沒(méi)有方便的方法來(lái)綜合來(lái)自?xún)蓚€(gè)模型的結(jié)果,或者來(lái)容易地計(jì)算一個(gè)模型中的變化對(duì)另一個(gè)的特性的影響。其次,儲(chǔ)集層管理典型地涉及井或設(shè)施比率的動(dòng)態(tài)變化。因?yàn)樵O(shè)施率用作儲(chǔ)集層模擬計(jì)算的邊界條件,那些邊界條件的動(dòng)態(tài)變化經(jīng)常導(dǎo)致難于管理的模擬計(jì)算中的數(shù)值不穩(wěn)定性。
儲(chǔ)集層模擬中的另一個(gè)挑戰(zhàn)性問(wèn)題是模擬器用戶(hù)指定模擬中的設(shè)施管理邏輯的能力。為了優(yōu)化烴從油田的生產(chǎn)需要一個(gè)連續(xù)的過(guò)程來(lái)在持續(xù)30或更多年的油田生命期內(nèi)監(jiān)測(cè)并控制生產(chǎn)和注入設(shè)施。為了使用儲(chǔ)集層模擬器來(lái)更準(zhǔn)確地預(yù)測(cè)儲(chǔ)集層的特性要求地面設(shè)施控制的影響在模擬過(guò)程中被考慮。專(zhuān)門(mén)的控制,以及它們的順序和同步難以編程到模擬器中,如果不是特別不可能的話,因?yàn)榕帕袑⑹菬o(wú)限的并且依賴(lài)于每個(gè)油田和每個(gè)模擬器用戶(hù)管理油田的方法。因此,儲(chǔ)集層模擬器用戶(hù)需要一個(gè)工具來(lái)能夠給模擬器指定用戶(hù)相信會(huì)優(yōu)化儲(chǔ)集層生產(chǎn)的自定義檢驗(yàn)和控制。然后,那些檢驗(yàn)和控制需要變成模擬器計(jì)算的組成部分。簡(jiǎn)而言之,需要一個(gè)直觀的工具來(lái)捕捉每個(gè)模擬器用戶(hù)的自定義設(shè)施管理邏輯,將其轉(zhuǎn)換成與儲(chǔ)集層模擬器代碼集成的可執(zhí)行代碼,然后執(zhí)行作為結(jié)果產(chǎn)生的系統(tǒng)來(lái)預(yù)測(cè)儲(chǔ)集層在其生命期內(nèi)的全部特性。
該問(wèn)題的典型解決方法是向用戶(hù)提供結(jié)構(gòu)能力的軟件的開(kāi)發(fā)。模擬器用戶(hù)被提供有基于文本的編輯器或者他或她能夠從中獲得結(jié)構(gòu)集和固定的關(guān)鍵字集的界面。使用這些結(jié)構(gòu),模擬器用戶(hù)可以定義可能的條件,這些條件如果在模擬中被滿足,那么觸發(fā)修改井的特性的某種響應(yīng)。該方法對(duì)于用戶(hù)不是很直觀。匯編結(jié)構(gòu)和關(guān)鍵字的過(guò)程會(huì)是令人厭煩的,并且結(jié)果不容易讀或解釋?zhuān)绕涫菍?duì)于原來(lái)不涉及儲(chǔ)集層工程的人。沒(méi)有清晰的邏輯視圖,意味著不容易跟蹤邏輯背后推理的高級(jí)線。用戶(hù)在過(guò)程中具有有限的控制,并且可用于執(zhí)行的補(bǔ)救也被模擬器識(shí)別的有限的一組組合所限制,導(dǎo)致系統(tǒng)適應(yīng)非傳統(tǒng)儲(chǔ)集層管理策略的有限的適應(yīng)性。
在工業(yè)中需要一種儲(chǔ)集層模擬系統(tǒng)(1)提供通過(guò)井管和地面設(shè)施的流的更逼真的模擬(2)捕捉由儲(chǔ)集層模擬器用戶(hù)自定義的設(shè)施管理邏輯并將它作為儲(chǔ)集層模擬的一部分來(lái)執(zhí)行。
本發(fā)明概述本發(fā)明涉及一種用于模擬復(fù)雜系統(tǒng)中的輸運(yùn)現(xiàn)象的計(jì)算機(jī)系統(tǒng)和方法。該計(jì)算機(jī)系統(tǒng)包括內(nèi)存裝置,存儲(chǔ)裝置,以及一種面向?qū)ο蟮能浖a(chǎn)品。該軟件產(chǎn)品包括面向?qū)ο蟮目蓴U(kuò)展的類(lèi)層次結(jié)構(gòu),其具有表示多種對(duì)象類(lèi)型的通用類(lèi)和表示對(duì)象類(lèi)型的成員變量的分立的通用類(lèi)。該可擴(kuò)展類(lèi)層次結(jié)構(gòu)允許添加額外的對(duì)象類(lèi)型或額外的成員變量,而不修改類(lèi)層次結(jié)構(gòu)本身。
本發(fā)明對(duì)模擬儲(chǔ)集層系統(tǒng)特別有用。在將本發(fā)明應(yīng)用于儲(chǔ)集層系統(tǒng)模型中,設(shè)施網(wǎng)絡(luò)模型(“FNM”)被開(kāi)發(fā),其擴(kuò)展離散化的儲(chǔ)集層模擬模型(包括節(jié)點(diǎn)和流連接)超出儲(chǔ)集層來(lái)包括用于模擬井管以及地面生產(chǎn)和注入設(shè)施(例如歧管,泵,壓縮機(jī),集輸管線,分離器和管道)中的流體流動(dòng)的節(jié)點(diǎn)和連接。每個(gè)不同的設(shè)施類(lèi)型被模擬成專(zhuān)門(mén)類(lèi)型的節(jié)點(diǎn),連接或幾個(gè)節(jié)點(diǎn)和連接的組合。在其最基本的形式中,整個(gè)模擬模型可以包括油田的每個(gè)部分,從地下儲(chǔ)集層,所有井和井硬件,以及地面設(shè)施一直到包括產(chǎn)品輸出口。
儲(chǔ)集層模擬系統(tǒng)優(yōu)選地隨儲(chǔ)集層模擬器使用設(shè)施管理邏輯(“FML”)。FML提供容易被模擬方法的用戶(hù)使用的邏輯視圖。FML的使用是靈活的并且可以與儲(chǔ)集層模擬器集成。FML包括三個(gè)部分(1)邏輯圖界面,(2)從邏輯圖的C++代碼(工業(yè)標(biāo)準(zhǔn)編程語(yǔ)言)生成器(3)將代碼與儲(chǔ)集層模擬器本身集成的專(zhuān)門(mén)的軟件設(shè)計(jì)。
附圖簡(jiǎn)述新的儲(chǔ)集層模擬系統(tǒng)及其優(yōu)點(diǎn)通過(guò)參考下面的詳細(xì)描述和附圖將變得更加明白。
圖1說(shuō)明離散化的儲(chǔ)集層模擬模型以及它的油井和地面設(shè)施的附接網(wǎng)絡(luò)。
圖2和3說(shuō)明顯示設(shè)施網(wǎng)絡(luò)模型的通用C++類(lèi)層次結(jié)構(gòu)。圖3是圖2中所示的類(lèi)層次結(jié)構(gòu)的一部分。
圖4用其表示的設(shè)施的名字來(lái)標(biāo)記的圖標(biāo)和箭頭的圖形表示來(lái)說(shuō)明一個(gè)簡(jiǎn)單的設(shè)施網(wǎng)絡(luò)。
圖5說(shuō)明顯示簡(jiǎn)化的設(shè)施管理邏輯的邏輯圖。
圖6說(shuō)明實(shí)例模擬器類(lèi)層次結(jié)構(gòu)一小部分的示意圖。
圖7擴(kuò)展圖6中的圖,說(shuō)明動(dòng)態(tài)專(zhuān)門(mén)化如何被用來(lái)支持用戶(hù)編寫(xiě)操作。
附圖并不打算著將作為這些具體實(shí)施方案的正常和期望修改的結(jié)果的其他實(shí)施方案排斥在新的儲(chǔ)集層模擬系統(tǒng)的范圍之外。
本發(fā)明詳述本發(fā)明的具有內(nèi)存裝置,存儲(chǔ)裝置,和面向?qū)ο蟮能浖a(chǎn)品的計(jì)算機(jī)系統(tǒng)可以用于模擬復(fù)雜的系統(tǒng),例如被離散化為結(jié)構(gòu)網(wǎng)格,非結(jié)構(gòu)網(wǎng)格,或兩者組合的烴系統(tǒng)的二維和三維疇。該計(jì)算機(jī)系統(tǒng)也可以用于計(jì)算方法得到具有多于三維的拓?fù)?,例如在模擬通過(guò)斷裂多孔介質(zhì)的流體流動(dòng)時(shí)發(fā)生的情況中。模擬系統(tǒng)對(duì)模擬其中發(fā)生輸運(yùn)現(xiàn)象的復(fù)雜系統(tǒng)的特性是有用的。術(shù)語(yǔ)“輸運(yùn)現(xiàn)象”在廣泛意義上用于本描述中,包括動(dòng)量輸運(yùn)(粘滯流動(dòng)),能量輸運(yùn)(熱傳導(dǎo),對(duì)流和輻射)以及質(zhì)量輸運(yùn)(擴(kuò)散)。例如,模擬系統(tǒng)對(duì)模擬烴從儲(chǔ)集巖中使用各種輔助開(kāi)采技術(shù)的提取特別有用,這些技術(shù)例如,但不局限于,基于熱方法的開(kāi)采方法例如注蒸汽操作,注水操作,以及可以在可混合或不可混合條件下操作的基于氣體驅(qū)動(dòng)的方法。模擬系統(tǒng)也可以用于模擬通過(guò)地層的雜質(zhì)運(yùn)送。在本描述中,模擬系統(tǒng)將關(guān)于在非結(jié)構(gòu)網(wǎng)格系統(tǒng)上執(zhí)行通用的儲(chǔ)集層模擬來(lái)描述,并且對(duì)于模擬不僅包括儲(chǔ)集層,而且包括相關(guān)含水層,生產(chǎn)井,注入井,地面流送管,歧管,分離器,閥,泵,壓縮機(jī),或者任何其他地面處理或輸運(yùn)設(shè)施的含烴系統(tǒng)中的并行計(jì)算特別有用。
出于詳細(xì)描述本發(fā)明的目的,幾個(gè)術(shù)語(yǔ)被定義來(lái)闡明它們的意思。“儲(chǔ)集層模擬模型”是真實(shí)烴儲(chǔ)集層的專(zhuān)門(mén)數(shù)學(xué)表示。管理烴儲(chǔ)集層的工程師可以創(chuàng)建可能具有不同復(fù)雜度的許多不同的儲(chǔ)集層模擬模型,以便量化儲(chǔ)集層過(guò)去的性能并預(yù)測(cè)它未來(lái)的性能。在本發(fā)明中,儲(chǔ)集層模擬模型是儲(chǔ)集層的物理空間以及在烴流體開(kāi)采中使用的井和地面設(shè)施的離散化表示。在本描述中使用的“設(shè)施”是烴流體通過(guò)其從儲(chǔ)集層中生產(chǎn)或者注入儲(chǔ)集層的有形物理裝備。在其最廣泛的意義上,術(shù)語(yǔ)設(shè)施適用于沿著儲(chǔ)集層和作為烴流體離開(kāi)模型(生產(chǎn)流體)或者進(jìn)入模型(注入流體)的位置的其輸出口之間的流動(dòng)路徑出現(xiàn)的任何裝備。設(shè)施可以包括生產(chǎn)井,注入井,井管,井源裝備,集輸管線,歧管,泵,壓縮機(jī),分離器,地面流線和輸出口。在某些情況下,術(shù)語(yǔ)“地面設(shè)施”用來(lái)區(qū)分那些設(shè)施和油井?!霸O(shè)施網(wǎng)絡(luò)”是在模型中出現(xiàn)的設(shè)施的全集,其包括所有的井以及井源和輸出口之間的地面設(shè)施。
包括三維含烴儲(chǔ)集層及其相關(guān)設(shè)施的儲(chǔ)集層模擬模型在圖1中說(shuō)明。在圖1中示意地說(shuō)明的儲(chǔ)集層模擬模型包括被用虛線表示的井106a,108a和110a穿過(guò)的離散化的儲(chǔ)集層100,并且包含另外的設(shè)施節(jié)點(diǎn)102,103和104以及設(shè)施連接112,114,116,118和120。在圖1中,儲(chǔ)集層100被表示為包括用窄實(shí)線畫(huà)出的許多體積單元101。雖然在圖1中沒(méi)有明確地顯示,每個(gè)單元101表示在其中心包含一個(gè)節(jié)點(diǎn)的三維的空間容積。雖然沒(méi)有明確地顯示,每對(duì)相鄰的儲(chǔ)集層節(jié)點(diǎn)具有相應(yīng)節(jié)點(diǎn)之間的連接。在儲(chǔ)集層模擬模型中,烴流體基于節(jié)點(diǎn)之間的壓力差和連接的傳輸性質(zhì)流過(guò)一對(duì)節(jié)點(diǎn)之間的連接。這樣,烴流體可以從一個(gè)體積單元輸運(yùn)到一個(gè)相鄰的體積單元。每個(gè)井106a,108a和110a分別包括各自的一個(gè)節(jié)點(diǎn)106b,108b和110b。雖然同樣在圖1中沒(méi)有明確地顯示,每個(gè)井節(jié)點(diǎn)經(jīng)由連接附接到相應(yīng)井軌道所經(jīng)過(guò)的每個(gè)儲(chǔ)集層節(jié)點(diǎn)。設(shè)施節(jié)點(diǎn)103和104以及設(shè)施連接112,114,116,118和120表示將從儲(chǔ)集層100生產(chǎn)到井106a,108a和110a中的流體運(yùn)送到公共傳送點(diǎn)102的流線的集輸網(wǎng)絡(luò)。
面向?qū)ο缶幊瘫景l(fā)明的實(shí)現(xiàn)使用面向?qū)ο缶幊?“OOP”)技術(shù)。最通用OOP的編程語(yǔ)言是Simula,Eiffel,C++,Smalltalk,Objective-C,或其變種。但是,本發(fā)明的實(shí)踐并不局限于具體的OOP語(yǔ)言。C++在本詳述中用來(lái)幫助讀者更好地理解和認(rèn)識(shí)OOP的好處。OOP的設(shè)計(jì)對(duì)OOP系統(tǒng)領(lǐng)域的技術(shù)人員是眾所周知的,并且僅一般地描述。
在面向?qū)ο蟮某绦蛑校裹c(diǎn)主要集中在數(shù)據(jù)上,其次集中在訪問(wèn)該數(shù)據(jù)的函數(shù)上,而不是主要集中在函數(shù)上,而其次集中在它們需要的數(shù)據(jù)上。與數(shù)據(jù)輸入到每個(gè)過(guò)程或從每個(gè)過(guò)程輸出的主要通過(guò)過(guò)程來(lái)描述的程序(例如用FORTRAN或COBOL編寫(xiě)的程序)不同,面向?qū)ο蟮某绦驀@“對(duì)象”來(lái)組織。對(duì)象是一種數(shù)據(jù)結(jié)構(gòu)以及可以訪問(wèn)該數(shù)據(jù)結(jié)構(gòu)的一組操作或函數(shù)。OOP系統(tǒng)典型地將包含大量的對(duì)象??梢栽L問(wèn)數(shù)據(jù)結(jié)構(gòu)的每個(gè)操作(函數(shù))稱(chēng)作“方法”。出于本發(fā)明的目的,對(duì)象包含的數(shù)據(jù)稱(chēng)作“成員變量”,而對(duì)象具有的方法稱(chēng)作“成員函數(shù)”。對(duì)象可以被認(rèn)為是巧妙的數(shù)據(jù)集,因?yàn)閷?duì)象的成員函數(shù)給予對(duì)象改變自身,也就是,改變其成員變量的值的能力。
“類(lèi)”是專(zhuān)門(mén)類(lèi)型對(duì)象的模板。類(lèi)定義與對(duì)象相關(guān)聯(lián)的信息(它的數(shù)據(jù))以及它可以執(zhí)行的操作(它的方法)。當(dāng)對(duì)象被創(chuàng)建時(shí),類(lèi)被用作模板來(lái)定義該對(duì)象具有的什么數(shù)據(jù)和方法。對(duì)象被稱(chēng)作定義它的類(lèi)的“實(shí)例”。可以有許多不同的對(duì)象,都是同一個(gè)類(lèi)的實(shí)例,但是每個(gè)實(shí)例具有其自己的數(shù)據(jù)和方法。
典型的面向?qū)ο蟮能浖O(shè)計(jì)在其核心包含可以集體地稱(chēng)作“數(shù)據(jù)模型”的一組類(lèi)。數(shù)據(jù)模型中給定的類(lèi)定義一個(gè)專(zhuān)門(mén)類(lèi)型的“對(duì)象”,其可以包含數(shù)據(jù)(“成員變量”)和方法(“成員函數(shù)”)。數(shù)據(jù)模型是面向?qū)ο筌浖摹绑w系結(jié)構(gòu)”的主要部分。面向?qū)ο筌浖a(chǎn)品的“體系結(jié)構(gòu)”包括軟件的全部設(shè)計(jì),包括它圍繞之建立的數(shù)據(jù)模型。
OOP使得對(duì)象能夠用由數(shù)據(jù)表示的其特征和由可以使用數(shù)據(jù)來(lái)執(zhí)行的方法表示的其行為來(lái)模擬實(shí)際上任何真實(shí)世界的實(shí)體。這樣,對(duì)象可以模擬具體事物象儲(chǔ)集層模擬中的單元以及抽象概念象數(shù)字。出于本發(fā)明的目的,OOP的好處起于三個(gè)基本的原理封裝,繼承和多態(tài)。
對(duì)象隱藏或封裝其數(shù)據(jù)的內(nèi)部結(jié)構(gòu),即對(duì)象包含的成員變量的顯式集,以及其成員函數(shù)用來(lái)工作的算法。代替暴露這些實(shí)現(xiàn)細(xì)節(jié),對(duì)象給出明確表示其抽象的沒(méi)有任何無(wú)關(guān)信息的接口。接口僅允許外部世界和對(duì)象之間有限數(shù)目的交互。在C++編程中,大部分這些交互涉及調(diào)用對(duì)象的成員函數(shù)。通過(guò)調(diào)用對(duì)象的成員函數(shù),外部世界可以告訴對(duì)象去做一些事情,但是對(duì)象如何執(zhí)行該動(dòng)作的細(xì)節(jié)對(duì)外部世界是不可見(jiàn)的。實(shí)際上,對(duì)象封裝其數(shù)據(jù)和方法,并且對(duì)外部世界隱藏它們。
例如,計(jì)算節(jié)點(diǎn)性質(zhì)的軟件系統(tǒng)的面向?qū)ο髷?shù)據(jù)模型可能具有稱(chēng)作“BaseNode”的類(lèi)。BaseNode類(lèi)可以具有成員變量例如包含數(shù)值來(lái)定義BaseNode對(duì)象在空間中的位置的“x_位置”,“y_位置”和“z_位置”,以及包括成員函數(shù)來(lái)改變BaseNode對(duì)象的x,y或z坐標(biāo)值的值。建立于該實(shí)例數(shù)據(jù)模型上的軟件系統(tǒng)可能包含代碼來(lái)創(chuàng)建和修改任何數(shù)目的不同的BaseNode對(duì)象。每個(gè)BaseNode對(duì)象都包含其自己獨(dú)一無(wú)二的其成員變量的值,并且每個(gè)都具有內(nèi)部的成員函數(shù)來(lái)修改那些成員變量。從軟件系統(tǒng)的角度,BaseNode對(duì)象如何維護(hù)其位置信息是無(wú)關(guān)緊要的。軟件系統(tǒng)僅需要BaseNode成員函數(shù)來(lái)設(shè)置和取得該數(shù)據(jù)。這種將數(shù)據(jù)(成員變量)和代碼(成員函數(shù))組織成類(lèi)稱(chēng)作封裝。
繼承允許軟件開(kāi)發(fā)者以“類(lèi)層次結(jié)構(gòu)”的形式來(lái)設(shè)計(jì)數(shù)據(jù)模型,使得相關(guān)的類(lèi)模仿對(duì)象類(lèi)型的自然分類(lèi)。繼承的三個(gè)主要好處在于,它允許軟件開(kāi)發(fā)者來(lái)設(shè)計(jì)有效地封裝數(shù)據(jù)的代碼,它允許在專(zhuān)門(mén)類(lèi)上實(shí)現(xiàn)方法使得這些方法可以用于許多專(zhuān)門(mén)化類(lèi)型的對(duì)象,以及它促進(jìn)先存在設(shè)計(jì)和代碼的重用。在類(lèi)層次結(jié)構(gòu)中,通用的數(shù)據(jù)和方法屬于“基”類(lèi)或“超類(lèi)”。更專(zhuān)門(mén)化的類(lèi)(“子類(lèi)”)“繼承”基類(lèi)的數(shù)據(jù)和方法,并且定義它們自己的另外的數(shù)據(jù)和方法。這些專(zhuān)門(mén)化的類(lèi)從基類(lèi)派生。繼承允許軟件開(kāi)發(fā)者定義類(lèi)以及隨后從它們創(chuàng)建的并且通過(guò)類(lèi)層次結(jié)構(gòu)相關(guān)聯(lián)的對(duì)象。特別地,類(lèi)可以指定為其他基類(lèi)的子類(lèi)。子類(lèi)繼承并且具有到其基類(lèi)的所有函數(shù)的通路據(jù)就好像這些函數(shù)出現(xiàn)在子類(lèi)中。繼承允許以前編寫(xiě)的程序通過(guò)創(chuàng)建對(duì)象新的超類(lèi)和子類(lèi)來(lái)擴(kuò)展。新的對(duì)象通過(guò)它們?nèi)绾尾煌谙却嬖诘膶?duì)象使得不需要編寫(xiě)完全新的程序來(lái)處理新的數(shù)據(jù)類(lèi)型或函數(shù)來(lái)描述。
作為說(shuō)明繼承的類(lèi)層次結(jié)構(gòu)的一個(gè)實(shí)例,擴(kuò)展先前的BaseNode類(lèi)的實(shí)例,稱(chēng)作“WellNode”的第二個(gè)類(lèi)從BaseNode類(lèi)繼承。WellNode的對(duì)象既是WellNode又是BaseNode,但是WellNode類(lèi)可以定義專(zhuān)門(mén)對(duì)WellNode的數(shù)據(jù)和代碼。如果定義第三個(gè)類(lèi)“NetworkNode”,其也從BaseNode繼承,但是不從WellNode繼承,那么NetworkNode的對(duì)象將不包含WellNode專(zhuān)用的數(shù)據(jù)或代碼。但是,WellNode的對(duì)象和NetworkNode的對(duì)象都將包含BaseNode專(zhuān)用的數(shù)據(jù)和代碼。該簡(jiǎn)單的實(shí)例僅顯示具有一級(jí)附加專(zhuān)門(mén)化(WellNode和NetworkNode類(lèi))的BaseNode類(lèi)。但是,繼承允許任意數(shù)目的專(zhuān)門(mén)化層次,使得WellNode類(lèi)可以具有進(jìn)一步的子類(lèi),并且BaseNode也可以具有進(jìn)一步的超類(lèi)。
多態(tài)使得封裝更進(jìn)一步。一個(gè)軟件成分可以請(qǐng)求另一個(gè)成分而不用確切地知道該成分是什么。接收請(qǐng)求的成分解釋它并根據(jù)其變量和數(shù)據(jù)來(lái)確定如何執(zhí)行請(qǐng)求。使用先前作為例子來(lái)描述的簡(jiǎn)單的類(lèi)層次結(jié)構(gòu),軟件成分可以調(diào)用BaseNode的對(duì)象的成員函數(shù)。軟件成分不需要知道BaseNode的對(duì)象實(shí)際上是WellNode的對(duì)象還是NetworkNode的對(duì)象。但是,類(lèi)層次結(jié)構(gòu)使得WellNode的對(duì)象和NetworkNode的對(duì)象能夠包含被調(diào)用成員函數(shù)的不同的實(shí)現(xiàn)。層次結(jié)構(gòu)中的每個(gè)類(lèi)可以包含成員函數(shù)的相同的抽象接口,但是他們可以具有適合于執(zhí)行成員函數(shù)的專(zhuān)門(mén)類(lèi)型對(duì)象的不同的功能性。
設(shè)施網(wǎng)絡(luò)模型本發(fā)明的儲(chǔ)集層模擬系統(tǒng)包括設(shè)施網(wǎng)絡(luò)模型(“FNM”)。FNM被設(shè)計(jì)來(lái)使代碼改變和重新編譯的需要達(dá)到最小。這通過(guò)在FNM C++類(lèi)層次結(jié)構(gòu)中定義通用類(lèi)來(lái)實(shí)現(xiàn)。典型的通用C++類(lèi)層次結(jié)構(gòu)在圖2和3中顯示。圖2中的每個(gè)方框(編號(hào)200到218)表示一個(gè)C++類(lèi)。類(lèi)之間的在一端具有空三角形的實(shí)線表示類(lèi)之間的繼承關(guān)系,基類(lèi)在具有三角形的一端而派生類(lèi)在相對(duì)的一端。兩個(gè)類(lèi)之間的虛線表示那兩個(gè)類(lèi)的對(duì)象之間的關(guān)聯(lián)。標(biāo)注虛線的文本表示關(guān)聯(lián)的名字,并且在每個(gè)關(guān)聯(lián)兩端的數(shù)字標(biāo)注表示關(guān)聯(lián)的基數(shù)。例如,關(guān)聯(lián)“node_is_child_of”220在“Node”端具有“1”標(biāo)注,在“Connection”端具有“0..*”標(biāo)注。這些標(biāo)注表示每個(gè)Connection的對(duì)象正好具有為該Connection的對(duì)象的孩子的1個(gè)Node,并且每個(gè)Node的對(duì)象具有該Node的對(duì)象為其孩子的零或許多Connection的對(duì)象。每個(gè)通用類(lèi)僅包含成員變量和成員函數(shù)的最小集來(lái)定義所有的該類(lèi)對(duì)象的通用行為。例如,通用節(jié)點(diǎn)類(lèi)(圖2中的Node 203)是通過(guò)節(jié)點(diǎn)的某些專(zhuān)門(mén)化來(lái)模擬的所有設(shè)施類(lèi)型的類(lèi)層次結(jié)構(gòu)中最專(zhuān)門(mén)化類(lèi)型的類(lèi),不管該節(jié)點(diǎn)表示井中的位置,地面流線,分離器,還是可以通過(guò)節(jié)點(diǎn)來(lái)表示的某種其他設(shè)施。分立的通用類(lèi)被用來(lái)定義專(zhuān)門(mén)化設(shè)施類(lèi)型的命名“屬性”(參看AttributeValue 211及其派生類(lèi)212和213)。使用通用的設(shè)施類(lèi)型類(lèi)(200到205)和通用的命名屬性類(lèi)(207和213)允許希望的設(shè)施類(lèi)型的基本上所有專(zhuān)門(mén)化行為在“定義數(shù)據(jù)文件”(以下稱(chēng)作“DDF”)中定義。在本描述末尾的附錄6列出該文件的一個(gè)實(shí)例。使用通用設(shè)施和通用屬性類(lèi)的關(guān)鍵設(shè)計(jì)特點(diǎn)使得FNM能夠可變通和可擴(kuò)展,使得新的設(shè)施類(lèi)型或新的屬性可以通過(guò)增加或修改DDF的內(nèi)容而被并入。該特點(diǎn)避免增加或改變數(shù)據(jù)模型中的類(lèi),這需要大大地修改源代碼并且重新編譯修改后代碼。
FNM數(shù)據(jù)模型在圖3中繼續(xù),其顯示記住在DDF中定義的設(shè)施類(lèi)型和屬性類(lèi)型的一系列類(lèi)。
DDF包含每個(gè)可能設(shè)施類(lèi)型的文本描述,例如“WellNode”,“NetworkNode”,“SeparatorNode”,“Well”以及“NetworkConnection”。它也包含那些設(shè)施類(lèi)型的每個(gè)專(zhuān)門(mén)化命名屬性的文本描述。當(dāng)DDF被軟件處理時(shí),它為DDF中的每個(gè)專(zhuān)門(mén)化設(shè)施類(lèi)型創(chuàng)建FacilityTypeSystemAttributes對(duì)象(303),并且為DFF中的每個(gè)命名屬性創(chuàng)建AttributeDefinition對(duì)象(304)。FacilityTypeSystemAttributes對(duì)象從基類(lèi)VarBase300,VariableAttributesBase 301和FacilityType 302繼承。facility_has_system_attribute關(guān)聯(lián)(305)將專(zhuān)門(mén)的FacilityTypeSystemAttributes對(duì)象(具體設(shè)施類(lèi)型的定義)關(guān)聯(lián)到該設(shè)施類(lèi)型的所有AttributeDefinition的對(duì)象(專(zhuān)門(mén)的命名屬性的定義)。在DDF已被完全處理之后,儲(chǔ)集層模擬系統(tǒng)包含定義可能的設(shè)施類(lèi)型(FacilityTypeSystemAttributes對(duì)象303的集合)的對(duì)象和那些設(shè)施類(lèi)型中的每個(gè)必須具有的屬性(AttributeDefinition對(duì)象304的集合)??捎玫脑O(shè)施類(lèi)型和命名屬性的定義在軟件中保持不變,直到DDF被修改并被再次處理,這典型地僅當(dāng)新的設(shè)施類(lèi)型或?qū)傩员恍枰獣r(shí)發(fā)生。
使用本發(fā)明的儲(chǔ)集層模擬系統(tǒng)包括用于定義作為給定模擬模型一部分的設(shè)施的網(wǎng)絡(luò)(“設(shè)施網(wǎng)絡(luò)”)的圖形用戶(hù)界面(GUI)。GUI將設(shè)施網(wǎng)絡(luò)顯示為通過(guò)連接箭頭相互附接的圖標(biāo)的集合。
圖4說(shuō)明簡(jiǎn)單設(shè)施網(wǎng)絡(luò)的這種圖形用戶(hù)界面。不同的圖標(biāo)可以被用來(lái)表示不同的設(shè)施類(lèi)型(井,分離器,網(wǎng)絡(luò)結(jié)點(diǎn)),而連接箭頭表示“象節(jié)點(diǎn)”的設(shè)施之間的流線。在圖4中,每個(gè)文本框(以“b”為后綴的401b到410b)表示用圖標(biāo)或箭頭(以“a”為后綴的401a到410a)表示的設(shè)施的名字。圖4中的實(shí)例設(shè)施網(wǎng)絡(luò)包含三個(gè)井406a,408a,410a,以及這些井附接到的地面流動(dòng)網(wǎng)絡(luò)。該地面網(wǎng)絡(luò)包含網(wǎng)絡(luò)節(jié)點(diǎn)403a和404a,終端節(jié)點(diǎn)401a,網(wǎng)絡(luò)連接405a,407a和409a,以及終端連接402a。井406a和408a生產(chǎn)通過(guò)網(wǎng)絡(luò)連接405a和407a移到網(wǎng)絡(luò)節(jié)點(diǎn)404a的流體。來(lái)自井410a的流體在網(wǎng)絡(luò)節(jié)點(diǎn)403a與來(lái)自其他兩個(gè)井的產(chǎn)品融合。從網(wǎng)絡(luò)節(jié)點(diǎn)403a,流體繼續(xù)到輸出口終端節(jié)點(diǎn)401a。
FNM GUI提供自定義的對(duì)話框,菜單和工具條,使得用戶(hù)可以相對(duì)容易地構(gòu)建并修改設(shè)施網(wǎng)絡(luò)。當(dāng)用戶(hù)為了儲(chǔ)集層模擬研究向設(shè)施網(wǎng)絡(luò)增加專(zhuān)門(mén)設(shè)施時(shí),儲(chǔ)集層模擬系統(tǒng)使用適當(dāng)?shù)腇acilityTypeSystemAttributes對(duì)象303(給出用戶(hù)增加的設(shè)施的類(lèi)型)來(lái)定位AttributeDefinition對(duì)象(304)的集合,這向系統(tǒng)提供需要用來(lái)創(chuàng)建實(shí)際設(shè)施對(duì)象(202,203,204或205)以及所有其系統(tǒng)定義的屬性對(duì)象(212)的信息。
自定義設(shè)施管理邏輯的支持FNM的通用C++數(shù)據(jù)模型簡(jiǎn)化下面描述的補(bǔ)充自定義設(shè)施管理邏輯系統(tǒng)(“FML”)。FML系統(tǒng)被設(shè)計(jì)用于在正在運(yùn)行的模擬模型中監(jiān)測(cè)和控制設(shè)施的操作來(lái)最優(yōu)化烴在油田生命期內(nèi)的生產(chǎn)。FML在模擬運(yùn)行期間操作從FNM數(shù)據(jù)模型的對(duì)象創(chuàng)建并類(lèi)似于FNM數(shù)據(jù)模型的對(duì)象的設(shè)施對(duì)象。為了使FML的可定制性達(dá)到最大,F(xiàn)NM數(shù)據(jù)模型包括用戶(hù)定義的命名屬性(UserAttributeValue,213,圖2)。用戶(hù)可以為任何一個(gè)可用的設(shè)施類(lèi)型創(chuàng)建另外的命名屬性(超出用戶(hù)在DDF中定義的那些),然后在其自定義FML中使用那些自定義的命名屬性。用戶(hù)定義的命名屬性的定義保存為AttributeDefinition對(duì)象(218,圖2),并且與對(duì)應(yīng)于屬性已經(jīng)為其定義的設(shè)施類(lèi)型的FacilityTypeUserAttributes對(duì)象(217,圖2)相關(guān)聯(lián)。
FNM可以用任何適合的面向?qū)ο缶幊陶Z(yǔ)言來(lái)使用。包括通用設(shè)施類(lèi)型,通用命名屬性,和用戶(hù)定義屬性的數(shù)據(jù)模型設(shè)計(jì)并不局限于C++實(shí)現(xiàn)。但是,F(xiàn)NM將優(yōu)選地使用與儲(chǔ)集層模擬程序中使用的相同的面向?qū)ο缶幊陶Z(yǔ)言來(lái)促進(jìn)與儲(chǔ)集層模擬器的其他成分的兼容性。
OOP類(lèi)層次結(jié)構(gòu)的新穎用法對(duì)于本發(fā)明的計(jì)算機(jī)系統(tǒng),新的方法已經(jīng)被用來(lái)分開(kāi)大量成員變量和它們所屬的對(duì)象。類(lèi)層次結(jié)構(gòu)包括兩個(gè)類(lèi)子層次結(jié)構(gòu),一個(gè)子層次結(jié)構(gòu)包含定義多種“設(shè)施類(lèi)型”的類(lèi),而另一個(gè)子層次結(jié)構(gòu)包含定義多種“屬性值”的類(lèi)。兩個(gè)子層次結(jié)構(gòu)通過(guò)它們各自的基類(lèi)來(lái)相互引用-基本的設(shè)施類(lèi)型類(lèi)(FacBase,圖2中的200)具有通過(guò)ValueUse類(lèi)(206,圖2)到基本的命名屬性值類(lèi)(Value,圖2中的207)的關(guān)聯(lián)或引用。在本用法中,設(shè)施對(duì)象將引用許多不同的屬性值對(duì)象。每個(gè)屬性值對(duì)象包含幫助定義設(shè)施對(duì)象的特征的專(zhuān)門(mén)化的數(shù)據(jù)單元。概念地,設(shè)施由相關(guān)對(duì)象的集合-設(shè)施對(duì)象本身加上所有其相關(guān)屬性值對(duì)象來(lái)定義。這種類(lèi)體系結(jié)構(gòu)并不嚴(yán)格遵循傳統(tǒng)的OOP封裝慣例,因?yàn)樵O(shè)施的數(shù)據(jù)并不全部地包含于單個(gè)對(duì)象中。但是,屬性值對(duì)象被有效地封裝,因?yàn)樗鼈兊脑L問(wèn)仍然通過(guò)設(shè)施對(duì)象的方法來(lái)提供。
本發(fā)明的計(jì)算機(jī)系統(tǒng)的另一個(gè)獨(dú)特的特征在于設(shè)施類(lèi)型類(lèi)和屬性值類(lèi)都是“通用的”。特別地,這意味著在兩個(gè)先前描述的子層次結(jié)構(gòu)的每個(gè)中最專(zhuān)門(mén)化的類(lèi)能夠表示許多不同的,更專(zhuān)門(mén)化的設(shè)施類(lèi)型,以及許多不同的屬性值。例如,一種類(lèi)型的專(zhuān)門(mén)化設(shè)施類(lèi)是Node(203,圖2)。該類(lèi)是通用的因?yàn)镹ode的對(duì)象可以被實(shí)例化來(lái)表示多種不同的節(jié)點(diǎn)設(shè)施類(lèi)型,即使類(lèi)層次結(jié)構(gòu)不具有每個(gè)節(jié)點(diǎn)設(shè)施類(lèi)型的不同的專(zhuān)門(mén)化節(jié)點(diǎn)類(lèi)。同樣地,SystemAttributeValue(212,圖2)是通用屬性類(lèi)因?yàn)镾ystemAttributeValue對(duì)象可以被實(shí)例化來(lái)表示多種不同的屬性類(lèi)型,例如浮點(diǎn)標(biāo)量,整型標(biāo)量,字符串,枚舉類(lèi)型,浮點(diǎn)數(shù)組,以及整型數(shù)組。
包含通用的設(shè)施類(lèi)型和屬性值類(lèi)的類(lèi)層次結(jié)構(gòu)的關(guān)鍵優(yōu)點(diǎn)在于軟件系統(tǒng)中支持的設(shè)施類(lèi)型和屬性值的集合可以被修改(另外的設(shè)施類(lèi)型和屬性值被定義,或現(xiàn)有的設(shè)施類(lèi)型和屬性值被刪除)而不改變類(lèi)層次結(jié)構(gòu),從而避免需要重新編譯源代碼來(lái)適應(yīng)對(duì)設(shè)施類(lèi)型或?qū)傩灾档母淖?。在?dāng)前系統(tǒng)中,可以稱(chēng)作“數(shù)據(jù)定義文件”的明文文件,例如,ASCII文件包含定義每種設(shè)施類(lèi)型和每種設(shè)施類(lèi)型的所有屬性值的文本輸入。該數(shù)據(jù)定義文件被程序處理來(lái)創(chuàng)建軟件系統(tǒng)中的定義。設(shè)施類(lèi)型定義是FacilityType類(lèi)(302,圖3)的對(duì)象。屬性值定義是AttributeDefinition類(lèi)(305,圖3)的對(duì)象。當(dāng)用戶(hù)操作系統(tǒng)來(lái)創(chuàng)建模擬模型時(shí),定義對(duì)象被軟件使用,無(wú)論什么時(shí)候用戶(hù)需要?jiǎng)?chuàng)建設(shè)施的實(shí)例及其附隨屬性值的實(shí)例時(shí)。
本發(fā)明的FNM解決了地下含烴儲(chǔ)集層及相關(guān)生產(chǎn)設(shè)施的復(fù)雜模擬模型的開(kāi)發(fā)者所面臨的三個(gè)挑戰(zhàn)性問(wèn)題1.設(shè)施和儲(chǔ)集層的流體流動(dòng)計(jì)算的集成,在過(guò)去這需要每個(gè)的模型,這些模型足夠相似以致允許統(tǒng)一的解決方法。
2.本發(fā)明的設(shè)施流體流動(dòng)計(jì)算模型是可變通而且可容易擴(kuò)展的,使得現(xiàn)有設(shè)施類(lèi)型的性狀可以被擴(kuò)展或另外的設(shè)施類(lèi)型可以被加入,而相對(duì)較小地改變軟件。
3.設(shè)施模型體系結(jié)構(gòu)支持自定義設(shè)施管理邏輯系統(tǒng),其被希望在模擬運(yùn)行期間動(dòng)態(tài)地控制設(shè)施的性狀。
設(shè)施管理邏輯設(shè)施管理邏輯(“FML”)是為物理系統(tǒng)例如儲(chǔ)集層模擬系統(tǒng)中的井及相關(guān)地面設(shè)施的操作控制而設(shè)計(jì)的一種編程系統(tǒng)。FML包括三個(gè)部分(1)邏輯界面,這里稱(chēng)作“邏輯圖”,(2)從邏輯圖的C++代碼(工業(yè)標(biāo)準(zhǔn)編程語(yǔ)言)產(chǎn)生器,以及(3)將FML代碼和儲(chǔ)集層模擬器本身集成的專(zhuān)門(mén)軟件設(shè)計(jì)。
邏輯圖邏輯圖包括圖形用戶(hù)界面,模擬器用戶(hù)可以用它來(lái)動(dòng)態(tài)地構(gòu)建設(shè)施管理邏輯的流程圖,從而使得用戶(hù)能夠自定義被模擬的物理系統(tǒng)的模擬。動(dòng)態(tài)構(gòu)建邏輯的能力指用戶(hù)構(gòu)建需要用來(lái)解決設(shè)施管理問(wèn)題的邏輯的能力。邏輯可以由用戶(hù)通過(guò)邏輯界面來(lái)構(gòu)建。邏輯界面可以用來(lái)執(zhí)行選自下面的至少一步開(kāi)發(fā)新的邏輯;選擇并使用用戶(hù)或其他人以前可能為其他設(shè)施管理問(wèn)題而構(gòu)建的現(xiàn)有邏輯;選擇并修改現(xiàn)有邏輯。流程圖包括表示基本的邏輯控制結(jié)構(gòu)的圖標(biāo)和表示邏輯從一個(gè)圖標(biāo)前進(jìn)到另一個(gè)的箭頭。邏輯圖的出發(fā)點(diǎn)包括開(kāi)始圖標(biāo)(表示邏輯的入口點(diǎn)),結(jié)束圖標(biāo)(表示邏輯的出口點(diǎn)),以及兩者之間的單箭頭。箭頭具有單方向,它們表示圖標(biāo)被計(jì)算的順序。用戶(hù)的任務(wù)是思考希望的邏輯,并且通過(guò)建立代表性的流程圖來(lái)模擬該邏輯。所有邏輯可以在一個(gè)高級(jí)圖中,或者它可以被分解為多個(gè)圖,每個(gè)表示邏輯的一個(gè)模塊。邏輯的每個(gè)模塊稱(chēng)作操作。主操作是最高級(jí)的操作。這種邏輯的一個(gè)簡(jiǎn)化實(shí)例在圖5中顯示。
圖5圖解地說(shuō)明顯示一個(gè)簡(jiǎn)單設(shè)施管理邏輯的簡(jiǎn)化邏輯圖的一個(gè)實(shí)例。該邏輯使用三種圖標(biāo)類(lèi)型(三個(gè)處理圖標(biāo)512,520和526,兩個(gè)邏輯測(cè)試圖標(biāo)516和522,以及一個(gè)循環(huán)圖標(biāo)514)。在執(zhí)行儲(chǔ)集層模擬的過(guò)程中,該邏輯以規(guī)則的間隔重復(fù)地執(zhí)行,每次在生產(chǎn)井上執(zhí)行檢驗(yàn)和控制。特別地,在生產(chǎn)井上有一個(gè)循環(huán)(循環(huán)圖標(biāo)514),其在“生產(chǎn)者”集的所有成員上重復(fù)。在循環(huán)體(圖標(biāo)516,520,522,526,528,530以及將這些圖標(biāo)相互連接和連接到循環(huán)圖標(biāo)514的箭頭)中,“生產(chǎn)者”集中專(zhuān)門(mén)的生產(chǎn)井的水率被檢驗(yàn)兩次(在邏輯測(cè)試圖標(biāo)516和522處)。如果在邏輯測(cè)試圖標(biāo)516處水率超過(guò)每天4000桶,那么井被修理(處理圖標(biāo)520)試圖減少水率。如果在邏輯測(cè)試圖標(biāo)522處水率超過(guò)每天5000桶,那么井被關(guān)閉(處理圖標(biāo)526)。
三種類(lèi)型的圖標(biāo)形成流程圖的構(gòu)件塊。處理圖標(biāo)用來(lái)表示等式或者對(duì)作用于設(shè)施來(lái)用某種方法改變它們的狀態(tài)的操作(例如打開(kāi)或關(guān)閉井)的調(diào)用。處理圖標(biāo)表示語(yǔ)句執(zhí)行,并且總是具有單一向內(nèi)箭頭和單一向外箭頭,表明只有一條執(zhí)行路徑通過(guò)該處理圖標(biāo)。邏輯測(cè)試圖標(biāo)用來(lái)在流程圖中作出判斷。邏輯測(cè)試圖標(biāo)包含計(jì)算為真(是)或假(否)的用戶(hù)指定的表達(dá)式。邏輯測(cè)試圖標(biāo)具有兩個(gè)向外箭頭,沿著一個(gè)如果表達(dá)式為真(在圖5中,邏輯測(cè)試圖標(biāo)516的箭頭518和邏輯測(cè)試圖標(biāo)522的箭頭524),沿著另一個(gè)如果表達(dá)式為假(在圖5中,邏輯測(cè)試圖標(biāo)516的箭頭519和邏輯測(cè)試圖標(biāo)522的箭頭525)?!斑壿嫓y(cè)試結(jié)構(gòu)”包括邏輯測(cè)試“圖標(biāo)”,以及沿著是和否邏輯分支直到邏輯測(cè)試結(jié)構(gòu)的結(jié)束標(biāo)記(邏輯測(cè)試圖標(biāo)522的圖標(biāo)528和邏輯測(cè)試圖標(biāo)516的圖標(biāo)530)的所有邏輯。循環(huán)圖標(biāo)用于在邏輯上循環(huán),例如無(wú)論什么時(shí)候邏輯必須在流程圖中被重復(fù)地計(jì)算時(shí)。循環(huán)圖標(biāo)包含控制什么類(lèi)型的循環(huán)將發(fā)生的邏輯(在圖5中,循環(huán)圖標(biāo)514是在一個(gè)集的成員上的循環(huán))?!把h(huán)結(jié)構(gòu)”包括循環(huán)圖標(biāo)以及在循環(huán)圖標(biāo)的開(kāi)始箭頭(515)和下一個(gè)箭頭(531)之間的所有邏輯圖標(biāo)。經(jīng)常地,設(shè)施管理邏輯實(shí)際上是重復(fù)的,并且循環(huán)圖標(biāo)和循環(huán)結(jié)構(gòu)是支持這一概念的方法。
FML用戶(hù)通過(guò)在適當(dāng)?shù)膱D形用戶(hù)界面(邏輯圖)中使用鼠標(biāo)光標(biāo)瞄準(zhǔn)并點(diǎn)擊來(lái)為模擬模型中希望的應(yīng)用建立流程圖。使用在GUI中顯示的流程圖,用戶(hù)決定下一步需要三種圖標(biāo)類(lèi)型中的哪種,然后通過(guò)在希望的按鈕上點(diǎn)擊來(lái)激活三個(gè)工具條按鈕中的一個(gè)。接下來(lái),用戶(hù)將光標(biāo)移到流程圖中表示下一個(gè)圖標(biāo)的插入點(diǎn)的現(xiàn)有箭頭上。當(dāng)用戶(hù)通過(guò)在其上點(diǎn)擊來(lái)選擇箭頭時(shí),系統(tǒng)插入圖標(biāo)并管理現(xiàn)有和新的箭頭的創(chuàng)建和附接。
模擬器用戶(hù)的下一個(gè)任務(wù)是給插入的圖標(biāo)填上關(guān)于該圖標(biāo)具體地作什么的信息。例如,如果它是邏輯測(cè)試圖標(biāo),那么用戶(hù)定義作為真/假測(cè)試的基礎(chǔ)的表達(dá)式。如果它是循環(huán)圖標(biāo),那么需要信息來(lái)指定重復(fù)的基礎(chǔ),以及重復(fù)應(yīng)該執(zhí)行多少次。對(duì)于處理圖標(biāo),用戶(hù)可能需要編寫(xiě)等式或指定關(guān)于操作將如何被調(diào)用的細(xì)節(jié)。對(duì)于這些任務(wù)中每個(gè),用戶(hù)可以鍵入信息,或者可以利用指導(dǎo)用戶(hù)通過(guò)建立圖標(biāo)內(nèi)容所需的許多步驟的一系列上下文相關(guān)菜單和對(duì)話框。
對(duì)于信息在每個(gè)圖標(biāo)中被指定的方式,專(zhuān)門(mén)的語(yǔ)法是優(yōu)選的。語(yǔ)法可以通過(guò)稱(chēng)作設(shè)施管理控制語(yǔ)言的FML專(zhuān)門(mén)格式來(lái)定義。當(dāng)使用菜單和對(duì)話框時(shí),許多語(yǔ)法細(xì)節(jié)被自動(dòng)處理。如果用戶(hù)直接為每個(gè)圖標(biāo)鍵入信息,那么遵守語(yǔ)法規(guī)則是用戶(hù)的責(zé)任。如果用戶(hù)不喜歡用圖形邏輯圖來(lái)操作,他或她可以可選地專(zhuān)門(mén)在基于文本的邏輯代碼界面(稱(chēng)作文本模式視圖)中工作,其中用戶(hù)可以輸入直接作為文本的所有設(shè)施管理控制語(yǔ)言,而沒(méi)有在FML邏輯圖視圖中提供的可見(jiàn)的幫助(圖標(biāo),箭頭,菜單或?qū)υ捒?。一旦用戶(hù)開(kāi)始在文本模式視圖中工作,他或她不能回到與他們正在指定的邏輯相對(duì)應(yīng)的邏輯圖。
在本說(shuō)明書(shū)末尾的附錄1包含來(lái)自圖5中以流程圖形式表示的邏輯的文本模式視圖的文本。在附錄1中出現(xiàn)的文本符合設(shè)施管理控制語(yǔ)言的語(yǔ)法。一旦用戶(hù)已經(jīng)使用流程圖視圖輸入邏輯,F(xiàn)ML自動(dòng)生成該文本模式視圖。用戶(hù)不需要看到該視圖或以該視圖來(lái)操作,如果他或她不想的話。另一方面,一些用戶(hù)可能選擇直接在文本模式視圖中輸入所有的邏輯,或者它們可能喜歡編輯,包括輸入,修改或刪除一旦處于這種形式中的邏輯。如果他們是這樣,那么邏輯圖視圖對(duì)該組邏輯不再可用。只要用戶(hù)僅使用邏輯圖視圖來(lái)創(chuàng)建或編輯邏輯,那么用戶(hù)可以在兩種視圖之間來(lái)回切換。
C++代碼的生成當(dāng)邏輯被完成,并且用戶(hù)準(zhǔn)備開(kāi)始模擬時(shí),系統(tǒng)必須將設(shè)施管理控制語(yǔ)言轉(zhuǎn)換成C++代碼,使得它可以和模擬器一起執(zhí)行。如果使用邏輯圖,那么系統(tǒng)首先將流程圖轉(zhuǎn)換成設(shè)施管理控制語(yǔ)言。邏輯到面向?qū)ο蟠a的轉(zhuǎn)換可以使用任何適合的轉(zhuǎn)換方法來(lái)執(zhí)行。這是對(duì)用戶(hù)隱藏的自動(dòng)步驟。如果使用文本模式,那么已經(jīng)在視圖中的設(shè)施管理控制語(yǔ)言被使用。
然后系統(tǒng)開(kāi)始解析設(shè)施管理控制語(yǔ)言的處理來(lái)驗(yàn)證語(yǔ)法。隨著解析的進(jìn)行,句法上正確而且完整的表示邏輯的設(shè)施管理控制語(yǔ)言自動(dòng)地轉(zhuǎn)換成ANSI標(biāo)準(zhǔn)面向?qū)ο驝++代碼。如果發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,那么它們被報(bào)告。如果沒(méi)有錯(cuò)誤,那么C++代碼的完整集與其他的模擬器輸入數(shù)據(jù)一起寫(xiě)入文件。
位于本說(shuō)明書(shū)末尾的附錄2到5描述為圖5和附錄1中的樣本邏輯而生成的C++代碼。
在附錄2中,指向網(wǎng)絡(luò)中每個(gè)設(shè)施的全局指針被聲明并初始化。該列表基于網(wǎng)絡(luò)中的設(shè)施的數(shù)目和類(lèi)型以及由用戶(hù)指定的設(shè)施名字而不同。指針指向在隨后部分以及圖6和7中描述的接口類(lèi)。
在附錄3中,附錄2中所示的所有的全局設(shè)施指針被初始化來(lái)指向模擬器中的實(shí)際設(shè)施對(duì)象。
在附錄4中,在每個(gè)時(shí)間步,模擬器調(diào)用名為wm initialize()的函數(shù)。這保證全局設(shè)施指針指向模擬器對(duì)象(通過(guò)調(diào)用附錄3中的wm_initialize_globals()),然后它調(diào)用實(shí)際的設(shè)施管理邏輯。剩余的聲明描述動(dòng)態(tài)專(zhuān)門(mén)化的一個(gè)實(shí)例,其中當(dāng)Functor0類(lèi)出于定義用來(lái)形成生產(chǎn)井集的方法的唯一目的而被聲明時(shí),SimWmWellInterface類(lèi)被專(zhuān)門(mén)化。動(dòng)態(tài)專(zhuān)門(mén)化關(guān)于圖6來(lái)討論,在本說(shuō)明書(shū)后面將更詳細(xì)地討論。
附錄5列出圖5和附錄1中描述的設(shè)施管理邏輯的C++代碼。
當(dāng)主模擬器產(chǎn)生時(shí),它從輸入文件中提取C++代碼,并將該代碼放入編譯文件。主模擬器啟動(dòng)模擬器運(yùn)行平臺(tái)本地的C++編譯器,然后編譯器將代碼轉(zhuǎn)換成目標(biāo)文件。然后C++鏈接器被啟動(dòng)來(lái)創(chuàng)建動(dòng)態(tài)鏈接庫(kù)(NT上)或共享程序庫(kù)(UNIX上)。然后模擬器裝載該庫(kù),準(zhǔn)備執(zhí)行代碼。當(dāng)主模擬器已經(jīng)裝載庫(kù)時(shí),集成模擬系統(tǒng)被創(chuàng)建,包括主模擬器和自定義邏輯。
當(dāng)集成模擬系統(tǒng)正在執(zhí)行的適當(dāng)時(shí)間,模擬器調(diào)用與如前所述包含所有設(shè)施管理邏輯或者調(diào)用包含邏輯模塊的其他操作的主操作相對(duì)應(yīng)的C++代碼。在任何一種情況下,所有邏輯被執(zhí)行,并且一旦完成,代碼將控制返回給模擬器。然后模擬器繼續(xù)它的計(jì)算,這可能受邏輯改變?cè)O(shè)施狀態(tài)的方式的影響。然后模擬器繼續(xù)隨時(shí)間“前移”來(lái)計(jì)算儲(chǔ)集層的性狀。有規(guī)律地貫穿該推進(jìn),相同的設(shè)施管理邏輯被執(zhí)行,從而不斷地影響油田在其模擬生命期內(nèi)的性狀。然后模擬器用戶(hù)可以檢查結(jié)果,并且可能改進(jìn)設(shè)施管理邏輯或模擬器輸入數(shù)據(jù)。最終,當(dāng)結(jié)果可以接受時(shí),該設(shè)施管理邏輯可以形成實(shí)際的設(shè)施管理策略的基礎(chǔ)然后將被用于實(shí)際的儲(chǔ)集層。
與儲(chǔ)集層模擬器的結(jié)合為了使邏輯影響模擬器使用的設(shè)施的狀態(tài),模擬器執(zhí)行邏輯是不夠的。邏輯,或者更特別地從邏輯生成的面向?qū)ο驝++代碼,與主模擬器的數(shù)據(jù)模型集成。主模擬器系統(tǒng)和與主模擬器的數(shù)據(jù)模型集成的面向?qū)ο驝++代碼的組合總體地稱(chēng)作集成模擬系統(tǒng)。為了將面向?qū)ο驝++代碼和數(shù)據(jù)模型集成,并且為了使處理更有效,利用面向?qū)ο蟮臄?shù)據(jù)模擬技術(shù),尤其是多繼承和多態(tài),以及動(dòng)態(tài)專(zhuān)門(mén)化?,F(xiàn)在將描述使用面向?qū)ο蠹夹g(shù)的優(yōu)選方法。
多繼承和多態(tài)為了編譯和鏈接C++代碼并將它與模擬器集成,C++代碼必須知道模擬器的數(shù)據(jù)和方法的各個(gè)方面。這通過(guò)包含數(shù)據(jù)和方法的描述的“包含”文件來(lái)實(shí)現(xiàn)。這些文件稱(chēng)作頭文件。這些頭文件優(yōu)選地與模擬器一起提供,使得編譯和鏈接可以被執(zhí)行。當(dāng)更多的頭文件被包含于C++代碼中時(shí),編譯和鏈接的處理會(huì)慢下來(lái)。為了提高性能,優(yōu)選地減少頭文件的數(shù)目及其包含的數(shù)據(jù)。多繼承和多態(tài)優(yōu)選地用來(lái)實(shí)現(xiàn)這一目的。
一系列空的“接口”對(duì)象被創(chuàng)建,其表示實(shí)際上包含數(shù)據(jù)和方法的模擬器對(duì)象。該方法在圖6中概述。
圖6示意地說(shuō)明模擬器數(shù)據(jù)模型的一小部分。虛線對(duì)角線608隔開(kāi)“接口”端的類(lèi)和“模擬器”端的類(lèi)。在一端具有空三角形的實(shí)線表示繼承關(guān)系,基類(lèi)在關(guān)系的三角形一端,派生類(lèi)在相對(duì)的一端。虛線608左邊的接口類(lèi)600和602基本上是空的。它們不包含成員變量,僅包含空的成員函數(shù)聲明(數(shù)據(jù)模型的C++實(shí)現(xiàn)中的“純虛”操作)。接口類(lèi)WellInterface 602包含空操作“shut_in”和“open”。Well的模擬器端版本(606)具有Well的對(duì)象的成員變量和成員函數(shù)“sbut_in”和“open”的真實(shí)實(shí)現(xiàn)。多繼承允許接口類(lèi)的使用和聲明。模擬器端的Well類(lèi)606既經(jīng)由繼承箭頭609從接口類(lèi)WellInterface 602繼承,又經(jīng)由繼承箭頭610從模擬器類(lèi)Object 604繼承。WellInterface類(lèi)602是ObjectInterface 600的專(zhuān)門(mén)化。模擬器端的基類(lèi)Object 604經(jīng)由繼承箭頭611從ObjectInterface類(lèi)600繼承。多態(tài)允許空接口操作“open”在接口類(lèi)WellInterface 602上被調(diào)用,然后在實(shí)際的模擬器類(lèi)Well 606上執(zhí)行真實(shí)的“open”操作。該范例用來(lái)用相應(yīng)的接口類(lèi)表示每個(gè)模擬器設(shè)施類(lèi)。
只有接口對(duì)象需要能夠編譯和鏈接邏輯。因?yàn)榫幾g器只看到簡(jiǎn)單的接口類(lèi),復(fù)雜部分和私有信息仍然對(duì)編譯器和可能查看文件的任何人隱藏。附錄2中所示的設(shè)施管理控制語(yǔ)言?xún)H包含接口對(duì)象指針,而不包含模擬器對(duì)象指針。因?yàn)榻涌趯?duì)象是空的,編譯/連接處理快,并且有關(guān)模擬器需要的數(shù)據(jù)和方法集的細(xì)節(jié)不公開(kāi)(例如對(duì)可能掃描計(jì)算機(jī)磁盤(pán)以獲取文件的人)。多繼承允許接口類(lèi)與模擬器類(lèi)相關(guān)聯(lián),而多態(tài)允許使用在接口類(lèi)中聲明的空方法來(lái)間接調(diào)用真實(shí)的方法。
動(dòng)態(tài)專(zhuān)門(mén)化由模擬器用戶(hù)開(kāi)發(fā)的每個(gè)邏輯操作與一般的設(shè)施網(wǎng)絡(luò)或?qū)iT(mén)的設(shè)施相關(guān)聯(lián)。用戶(hù)依賴(lài)于邏輯的本質(zhì)來(lái)作選擇。為了使這些操作可以在已經(jīng)描述的模擬器數(shù)據(jù)模型框架中執(zhí)行,操作需要變成類(lèi)的方法。因?yàn)镃++不允許向現(xiàn)有的類(lèi)增加方法而不重新編譯模擬器(或其重要部分),方法必須增加到只有邏輯代碼知道的新的類(lèi)中。這導(dǎo)致在運(yùn)行時(shí)間新的類(lèi)從現(xiàn)有的接口類(lèi)專(zhuān)門(mén)化的設(shè)計(jì)。該方法在圖7中示意地顯示。
圖7擴(kuò)展圖6中的圖,說(shuō)明動(dòng)態(tài)專(zhuān)門(mén)化如何被用來(lái)支持用戶(hù)編寫(xiě)操作。對(duì)角虛線710隔開(kāi)接口類(lèi)700,702和704以及模擬器類(lèi)706和708。這里,用戶(hù)已經(jīng)為Well類(lèi)型的設(shè)施編寫(xiě)名為“special_well_logic”的新的操作。為了支持新操作的聲明,接口類(lèi)通過(guò)使用由設(shè)施管理控制語(yǔ)言到C++的語(yǔ)法分析器編寫(xiě)的類(lèi)聲明在運(yùn)行時(shí)間自動(dòng)地被專(zhuān)門(mén)化。在本實(shí)例中,類(lèi)“WellInterface_User”704被語(yǔ)法分析器創(chuàng)建,并且它包含新的邏輯操作的聲明以及包括新的邏輯操作的代碼。因此,對(duì)于屬于Well類(lèi)型的設(shè)施,既可以調(diào)用內(nèi)部操作(來(lái)自WellInterface 702和ObjectInterface 700),又可以調(diào)用用戶(hù)操作(來(lái)自WellInterface_User704)。
數(shù)據(jù)模型被擴(kuò)展,但是僅對(duì)于邏輯代碼。模擬器的其他部分并不知道該擴(kuò)展,所以從模擬器的角度,數(shù)據(jù)模型并沒(méi)有改變,因此模擬器代碼不需要被編譯來(lái)使用用戶(hù)定義的邏輯。同時(shí),邏輯知道新的類(lèi)并認(rèn)識(shí)新的操作。從用戶(hù)的角度,模擬器知道的內(nèi)部操作和模擬器不知道的自定義操作都用完全相同的方法來(lái)調(diào)用。而且,屬于從接口類(lèi)派生的類(lèi)的新操作,具有與接口類(lèi)相同的到內(nèi)部操作和數(shù)據(jù)的通道。結(jié)果是模擬器代碼和自定義代碼之間的表面無(wú)縫集成。
FML系統(tǒng)可以通過(guò)本領(lǐng)域技術(shù)人員而與使用面向?qū)ο笤O(shè)計(jì)的優(yōu)選地使用C++來(lái)編碼的儲(chǔ)集層模擬器集成在一起。FML系統(tǒng)的先決條件是它必須與具有面向?qū)ο笤O(shè)計(jì)的模擬器集成在一起。
正是面向?qū)ο笤碇С侄嗬^承,多態(tài)和類(lèi)專(zhuān)門(mén)化的概念,這對(duì)于無(wú)縫集成FML和模擬器是必須的。FML可以和使用C++之外的面向?qū)ο笳Z(yǔ)言來(lái)實(shí)現(xiàn)的模擬器一起使用。其他面向?qū)ο缶幊?“OOP”)技術(shù)可以被使用,包括但不局限于,Simula,Eiffel,Smalltalk,Objective-C,或其變種。FML的實(shí)施并不局限于具體的OOP語(yǔ)言。
如果使用C++之外的其他OOP系統(tǒng),C++代碼生成步驟將需要修改來(lái)生成替換的OOP語(yǔ)言,并且這也隱含著模擬器也具有面向?qū)ο蟮臄?shù)據(jù)模型。
具有FML系統(tǒng)結(jié)構(gòu)的儲(chǔ)集層模擬模型允許用戶(hù)開(kāi)發(fā)自定義設(shè)施管理邏輯來(lái)實(shí)際地模擬任何策略。因而,邏輯的排列實(shí)際上是無(wú)窮的。
可變通而且可擴(kuò)展的數(shù)據(jù)模型設(shè)計(jì)儲(chǔ)集層模擬系統(tǒng)優(yōu)選地也使用C++的面向?qū)ο筇卣鱽?lái)解決可擴(kuò)展性問(wèn)題。軟件設(shè)計(jì)優(yōu)選地使用C++類(lèi)的集合(集體地稱(chēng)作“數(shù)據(jù)模型”)來(lái)定義具有指定數(shù)據(jù)(成員變量)和行為(成員函數(shù))的對(duì)象。成員變量和成員函數(shù)是硬編碼的,也就是說(shuō),它們?cè)陬?lèi)自身中定義,意味著對(duì)類(lèi)作擴(kuò)展;例如,新的成員變量,新的成員函數(shù),新的類(lèi)需要代碼改變和重新編譯。
在典型的OOP類(lèi)層次結(jié)構(gòu)中,給定類(lèi)的所有成員變量都被封裝在該類(lèi)中。因此,作為該類(lèi)的實(shí)例的對(duì)象通過(guò)作為成員函數(shù)的其公用接口來(lái)保護(hù)并控制到它們的成員變量的訪問(wèn)。
已經(jīng)描述了新的儲(chǔ)集層模擬系統(tǒng)的原理以及試圖應(yīng)用該原理的最佳方式。對(duì)本領(lǐng)域技術(shù)人員明顯的是,可以不背離于上面描述的本儲(chǔ)集層模擬系統(tǒng)的精神和范圍而對(duì)上面描述的實(shí)施方案作各種改變。因此,應(yīng)該理解的是,本發(fā)明并不局限于所顯示和描述的具體細(xì)節(jié)。
附錄1<pre listing-type="program-listing"><![CDATA[∥ Start of Global Variable Declarations∥ End of Global Variable Declarationswm_main( ){ ∥ Start of module code∥ Start of Local Variable DeclarationsSet<Well> producers;Ref<Well> well in set;∥ End of Local Variable Declarations{ ∥ Start of Process icon constructproducers.form_set(candidate.facility_descriptor==″producer″);} ∥ End of Process icon construct{ ∥ Start of loop constructforeach well_in_set in producers{ ∥ Start of loop body{ ∥ Start of logical test constructif (( well_in_set.get_phase_rate(WATER) >4000. )){{ ∥ Start of Process icon constructwell_in_set.workover(WRKOVR_CLOSE,BY_RESCONN,″WCUT>. 6″);} ∥ End of Process icon construct{ ∥ Start of logical test constructif ((well_in_set.get_phase_rate(WATER)>5000.)){{ ∥ Start of Process icon constructwell_in_set.shut_in(NO_CROSS_FLOW);} ∥ End of Process icon construct}else{}} ∥ End of logical test construct}else{} ∥ End of logical test construct} ∥ End of loop body} ∥ End of loop construct{return;}} ∥ End of module code]]></pre>
附錄2<pre listing-type="program-listing"><![CDATA[#include″q\rell_sim\bin\runtime_includes\wm_headers.h″SimWmWellNodeInterface* wellnode_potnorth = NULL;SimWmWellNodeInterface* wellnode_potsouth = NULL;SimWmWellNodeInterface* wellnode_prod100 = NULL;SimWmWellNodeInterface* wellnode_prod82 = NULL;SimWmNetworkNodeInterface* netnode_injector = NULL;SimWmNetworkNodeInterface* netnode_producer = NULL;SimWmTerminalNodeInterface* termnode_injector = NULL;SimWmTerminalNodeInterface* termnode_producer = NULL;SimWmReservoirConnectionInterface* potnorth_rc_0 = NULL;SimWmReservoirConnectionInterface* potnorth_rc_1 = NULL;SimWmReservoirConnectionInterface* potnorth_rc_2 = NULL;SimWmReservoirConnectionInterface* potsouth_rc_0 = NULL;SimWmReservoirConnectionInterface* potsouth_rc_1 = NULL;SimWmReservoirConnectionInterface* potsouth_rc_2 =NULL;SimWmReservoirConnectionInterface* prod100_rc_0 = NULL;SimWmReservoirConnectionInterface* prod100_rc_1 = NULL;SimWmReservoirConnectionInterface* prod100_rc_2 = NULL;SimWmReservoirConnectionInterface* prod82_rc_0 = NULL;SimWmReservoirConnectionInterface* prod82_rc_1 = NULL;SimWmReservoirConnectionInterface* prod82_rc_2 = NULL;SimWmTerminalConnectionInterface* termconn_injector = NULL;SimWmNetworkConnectionInterface* netconn_potnorth = NULL;SimWmNetworkConnectionInterface* netconn_potsouth = NULL;SimWmNetworkConnectionInterface* netconn_prod100 = NULL;SimWmTerminalConnectionInterface* termconn_producer = NULL;SimWmNetworkConnectionInterface* netconn_prod82 = NULL;SimWmWellInterface* potnorth = NULL;SimWmWellBranchInterface* wellbranch1 = NULL;SimWmWellInterface* potsouth = NULL;SimWmWellBranchInterface* wellbranch2 = NULL;SimWmWellInterface* prod100 = NULL;SimWmWellBranchInterface* wellbranch3 = NULL;SimWmWellInterface* prod82 = NULL;SimWmWellBranchInterface* wellbranch4 = NULL;]]></pre>
附錄3<pre listing-type="program-listing"><![CDATA[void wm_initialize_globals(){static int wmig_was_called = 0;if (wmig_was_called) return;wmig_was_called = 1;wellnode_potnorth = (SimWmWellNodeInterface*) SimWmFNControllerUtility∷lookup_object(″wellnode_potnorth″, VM_GetInterfaceID<SimWmWellNodeInterface>() ());wellnode_potsouth = (SimWmWellNodeInterface*) SimWmFNControllerUtility∷lookup_object(″wellnode_potsouth″, VM_GetInterfaceID<SimWmWellNodeInterface>() ());wellnode_prod100 = (SimWmWellNodeInterface*) SimWmFNControllerUtility∷lookup_object(″wellnode_prod100″, VM_GetInterfaceID<SimWmWellNodeInterface>() ());wellnode_prod82 = (SimWmWellNodeInterface*) SimWmFNControllerUtility∷lookup_object(″wellnode_prod82″, VM_GetInterfaceID<SimWmWellNodeInterface>()());netnode_injector = (SimWmNetworkNodeInterface*) SimWmFNControllerUtility∷lookup_object(″netnode_injector″, VM_GetInterfaceID<SimWmNetworkNodeInterface>()());netnode_producer = (SimWmNetworkNodeInterface*) SimWmFNControllerUtility∷lookup_object(″netnode_producèr″, VM_GetInterfaceID<SimWmNetworkNodeInterface>()());termnode_injector = (SimWmTerminalNodeInterface*) SimWmFNControllerUtility∷lookup_object(″termnode_injector″, VM_GetInterfaceID<SimWmTerminalNodeInterface>()());termnode_producer = (SimWmTerminalNodeInterface*) SimWmFNControllerUtility∷lookup_object(″termnode_producer″, VM_GetInterfaceID<SimWmTerminalNodeInterface>() ());potnorth_rc_0 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potnorth_rc_0″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());potnorth__rc_1 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potnorth_rc_1″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());potnorth_rc_2 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potnorth_rc_2″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>() ());potsouth_rc_0 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potsouth_rc_0″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>() ());potsouth_rc_1 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potsouth_rc_1″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());potsouth_rc_2 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″potsouth_rc_2″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());prod100_rc_0 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″prod100_rc_0″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());prod100_rc_1= (SimWmReservoirConnectionInterface* ) SimWmFNControllerUtility∷lookup_object(″prod100_rc_1″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());prod100_rc_2 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″prod100_rc_2″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>() ());prod82_rc_0 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″prod82_rc_0″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()());prod82_rc_1 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″prod82_rc_1″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()()); prod82_rc_2 = (SimWmReservoirConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″prod82_rc_2″, VM_GetInterfaceID<SimWmReservoirConnectionInterface>()()); termconn_injector = (SimWmTerminalConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″termconn_injector″, VM_GetInterfaceID<SimWmTerminalConnectionInterface>()()); netconn_potnorth = (SimWmNetworkConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″netconn_potnorth″, VM_GetInterfaceID<SimWmNetworkConnectionInterface>()()); netconn_potsouth = (SimWmNetworkConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″netconn_potsouth″, VM_GetInterfaceID<SimWmNetworkConnectionInterface>()()); netconn_prod100 = (SimWmNetworkConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″netconn_prod100″, VM_GetInterfaceID<SimWmNetworkConnectionInterface>()()); termconn_producer = (SimWmTerminalConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″termconn_producer″, VM_GetInterfaceID<SimWmTerminalConnectionInterface>()()); netconn_prod82 = (SimWmNetworkConnectionInterface*) SimWmFNControllerUtility∷lookup_object(″netconn_prod82″, VM_GetInterfaceID<SimWmNetworkConnectionInterface>()()); potnorth = (SimWmWellInterface*) SimWmFNControllerUtility∷lookup_object(″potnorth″, VM_GetInterfaceID<SimWmWellInterface>()()); wellbranchl = (SimWmWellBranchInterface*) SimWmFNControllerUtility∷lookup_object(″wellbranchl″, VM_GetInterfaceID<SimWmWellBranchInterface>()()); potsouth = (SimWmWellInterface*) SimWmFNControllerUtility∷lookup_object(″potsouth″, VM_GetInterfaceID<SimWmWellInterface>() ()); wellbranch2 = (SimWmWellBranchInterface*) SimWmFNControllerUtility∷lookup_object(″wellbranch2″, VM_GetInterfaceID<SimWmWellBranchInterface>()()); prod100 = (SimWmWellInterface*) SimWmFNControllerUtility∷lookup_object(″prod100″, VM_GetInterfaceID<SimWmWellInterface>()()); wellbranch3 = (SimWmWellBranchInterface*) SimWmFNControllerUtility∷lookup_object(″wellbranch3″, VM_GetInterfaceID<SimWmWellBranchInterface>()()); prod82 = (SimWmWellInterface*) SimWmFNControllerUtility∷lookup_object(″prod82″, VM_GetInterfaceID<SimWmWellInterface>()()); wellbranch4 = (SimWmWellBranchInterface*) SimWmFNControllerUtility∷lookup_object(″wellbranch4″, VM_GetInterfaceID<SimWmWellBranchInterface>() ()); }]]></pre>
附錄4<pre listing-type="program-listing"><![CDATA[ void wm_main(); extern ″C″{ void wm_initialize() { wm_initialize_globals(); wm_main(); } } class Functor0public Selector<SimWmWellInterface> { public Functor0(); virtual ~Functor0(); virtual Bool operator() (SimWmWellInterface* candidate) const; }; Functor0∷Functor0() { ∥ do nothing else } Functor0∷~Functor0() { ∥ do nothing else } Bool Functor0∷operator() (SimWmWellInterface* candidate) const { return (*((String*)(candidate->lookup_attribute(″facility_descriptor″,0, TYPE_String))) == ″producer″); }]]></pre>
附錄5<pre listing-type="program-listing"><![CDATA[ void wm_main() { Set<SimWmWellInterface>producers; SimWmWellInterface* well_in_set = NULL; { producers.foRM_set(new Functor0()); } { producers.reset(); while(producers.get_next(well_in_set)) { PhaseTypeEnum scratch_0 = (PhaseTypeEnum)(WATER); if ((well_in_set->get_phase_rate(scratch_0) > 4000.)) { { WorkoverTypeEnum scratch_1 =(WorkoverTypeEnum)(WRKOVR_CLOSE); WorkoverLevelTypeEnum scratch_2 = (WorkoverLevelTypeEnum)(BY_RESCONN); String scratch_3 = ″WCUT>.6″; well_in_set->workover(scratch_1,scratch_2,scratch_3); } { PhaseTypeEnum scratch_4 = (PhaseTypeEnum)(WATER); if ((well_in_set->get_phase_rate(scratch_4)>5000.)) { ShutInTypeEnum scratch_5 =ShutInTypeEnum)(NO_CROSS_FLOW); well_in_set->shut_in(scratch_5); } else { } } } else { } } } return; }]]></pre>
附錄6這一來(lái)自數(shù)據(jù)定義文件的摘錄說(shuō)明設(shè)施類(lèi)型定義和命名屬性定義的層次結(jié)構(gòu)本質(zhì)。包含于該摘錄中的設(shè)施類(lèi)型示范了定義終端用戶(hù)設(shè)施類(lèi)型“網(wǎng)絡(luò)節(jié)點(diǎn)”的基本設(shè)施類(lèi)型級(jí)。摘錄包括網(wǎng)絡(luò)節(jié)點(diǎn)具有的三個(gè)命名屬性的定義。命名屬性中兩個(gè)在設(shè)施對(duì)象級(jí)定義,第三個(gè)在節(jié)點(diǎn)級(jí)定義。
<pre listing-type="program-listing"><![CDATA[∥ Comments in the Data Definitions File begin with ″∥″∥ ″\″at the end of a line indicates continuation on the subsequent line∥ Highest level base facility type is FacBaseName ″FacBase″ Definition ″FacBase Definition″ Is Obsolete F IOArchive Class Name ″NA″ Long Name ″FacBase″ View Name ″View Name″ Decomp Hierarchy″″ Dimensionality ″″ Req by Restart Rule ″restart rule″ Req by Simulator Rule ″simulator rule″ Req by User Rule″user rule″ Valid Rule ″valid rule″ Bitmap Resource it is only defined in the DataDefinitions File. Name ″GeneralFacilityNode″ Definition ″generic class used to represent mostfacility types″ Is Obsolete F IOArchive Class Name ″NA″ Long Name ″GeneralFacilityNode″ View Name ″View Name″ Decomp Hierarchy″″ Dimensionality ″″ Req by Restart Rule ″restart rule″ Req by Simulator Rule ″simulator rule″ Req by User Rule″user rule″ Valid Rule ″valid rule″ Bitmap Resource it is only defined in the DataDefinitions ∥File. Name ″NetworkNode″ Definition ″NetworkNode Definition″ Is Obsolete F IOArchive Class Name ″NA″ Long Name ″NetworkNode″ View Name ″View Name″ Decomp Hierarchy″″ Dimensionality ″″ Req by Restart Rule ″restart rule″ Req by Simulator Rule ″simulator rule″ Req by User Rule″user rule″ Valid Rule ″valid rule″ Bitmap Resource ID 0 Instantiable F Member of Granule F Simulator Variable F Time Variant FDecomposable F Spec for all Nodes F Change Invalidates F Parent Facility ″GeneralFacilityNode″ Is Abstract F]]></pre>
權(quán)利要求
1.一種計(jì)算機(jī)系統(tǒng),包括內(nèi)存裝置,存儲(chǔ)裝置和面向?qū)ο蟮能浖a(chǎn)品,該軟件產(chǎn)品包含用于存儲(chǔ)輸運(yùn)現(xiàn)象模擬數(shù)據(jù)的面向?qū)ο蟮目蓴U(kuò)展類(lèi)層次結(jié)構(gòu),該類(lèi)層次結(jié)構(gòu)包括表示多種對(duì)象類(lèi)型的通用類(lèi)的第一集合和表示對(duì)象類(lèi)型的成員變量的通用類(lèi)的第二集合,該可擴(kuò)展的類(lèi)層次結(jié)構(gòu)允許增加另外的對(duì)象類(lèi)型和另外的成員變量,而不修改類(lèi)層次結(jié)構(gòu)本身。
2.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中輸運(yùn)現(xiàn)象包括下列一種或多種地下含烴儲(chǔ)集層中以及地下含烴儲(chǔ)集層和地面上的一個(gè)或多個(gè)輸送位置之間的動(dòng)量、能量、和質(zhì)量輸運(yùn)。
3.權(quán)利要求2的計(jì)算機(jī)系統(tǒng),其中地下含烴儲(chǔ)集層和一個(gè)或多個(gè)輸送位置之間的輸運(yùn)包括一種或多種輸運(yùn)路徑,輸運(yùn)路徑包括至少一種生產(chǎn)和注入井類(lèi)型和一種或多種設(shè)施類(lèi)型,它們被鏈接在一起來(lái)形成一種設(shè)施網(wǎng)絡(luò),通過(guò)該設(shè)施網(wǎng)絡(luò)烴流體在地下儲(chǔ)集層和輸送位置之間輸運(yùn)。
4.權(quán)利要求3的計(jì)算機(jī)系統(tǒng),其中包含于輸運(yùn)路徑中的設(shè)施類(lèi)型包括選自地面流線,歧管,分離器,閥,泵和壓縮機(jī)中的至少一種設(shè)施。
5.權(quán)利要求4的計(jì)算機(jī)系統(tǒng),其中文本文件(數(shù)據(jù)定義文件)包含可以包含于模擬模型中的可能設(shè)施類(lèi)型的定義和每種設(shè)施類(lèi)型的可能成員變量類(lèi)型的定義。
6.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中面向?qū)ο蟮能浖a(chǎn)品包括圖形用戶(hù)界面,由此計(jì)算機(jī)系統(tǒng)的用戶(hù)定義包含井和設(shè)施對(duì)象的專(zhuān)門(mén)網(wǎng)絡(luò)的模擬模型來(lái)模擬進(jìn)出專(zhuān)門(mén)含烴儲(chǔ)集層的輸運(yùn)現(xiàn)象。
7.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中另外的數(shù)據(jù)成員類(lèi)型由權(quán)利要求1的面向?qū)ο筌浖a(chǎn)品計(jì)算機(jī)系統(tǒng)的用戶(hù)來(lái)定義,其中計(jì)算機(jī)系統(tǒng)的用戶(hù)通過(guò)圖形用戶(hù)界面來(lái)定義另外的設(shè)施數(shù)據(jù)成員,所述另外的數(shù)據(jù)成員以用戶(hù)自定義的方式擴(kuò)展計(jì)算機(jī)系統(tǒng)的功能性。
8.權(quán)利要求1的面向?qū)ο蟮能浖a(chǎn)品,其中面向?qū)ο筌浖肅++來(lái)編寫(xiě)。
9.權(quán)利要求1的計(jì)算機(jī)系統(tǒng),其中存儲(chǔ)裝置包括面向?qū)ο蟮臄?shù)據(jù)庫(kù)。
10.一種通過(guò)使用具有內(nèi)存裝置,存儲(chǔ)裝置和面向?qū)ο筌浖挠?jì)算機(jī)來(lái)模擬設(shè)施網(wǎng)絡(luò)中的輸運(yùn)現(xiàn)象的方法,該方法包括步驟(a)構(gòu)建包括設(shè)施網(wǎng)絡(luò)的模型;(b)為每種設(shè)施指定成員變量的值;(c)在設(shè)施網(wǎng)絡(luò)中的輸運(yùn)現(xiàn)象的數(shù)學(xué)模擬中使用成員變量的指定值作為時(shí)間的函數(shù)。
11.權(quán)利要求10的方法,其中設(shè)施網(wǎng)絡(luò)是更大的模擬模型的一部分,所述設(shè)施網(wǎng)絡(luò)能夠與該模擬模型的至少一個(gè)其他部分交換流體。
12.權(quán)利要求11的方法,其中模擬模型包括設(shè)施網(wǎng)絡(luò)和含烴地層。
13.一種模擬物理系統(tǒng)中輸運(yùn)現(xiàn)象的方法,其中物理系統(tǒng)包括被多個(gè)井穿過(guò)的含烴儲(chǔ)集層以及連接到井的地面設(shè)施,該方法包括a.將物理系統(tǒng)離散化為許多體積單元,其中每個(gè)體積單元被模擬為一個(gè)節(jié)點(diǎn),并且相鄰的節(jié)點(diǎn)能夠通過(guò)節(jié)點(diǎn)之間的連接來(lái)交換流體;b.使用權(quán)利要求1的類(lèi)層次結(jié)構(gòu)的設(shè)施對(duì)象和成員變量對(duì)象來(lái)模擬離散化模型的表示井和表面設(shè)施的部分中的節(jié)點(diǎn)和連接;c.指定每個(gè)節(jié)點(diǎn)和連接的幾何和輸運(yùn)性質(zhì);d.指定每個(gè)節(jié)點(diǎn)和連接的初始條件;e.以時(shí)間的函數(shù)來(lái)模擬離散化系統(tǒng)中的輸運(yùn)現(xiàn)象。
14.一種具有多個(gè)類(lèi)的面向?qū)ο筌浖到y(tǒng)結(jié)構(gòu),其將成員變量和成員變量邏輯上從屬的類(lèi)分開(kāi),所述軟件系統(tǒng)結(jié)構(gòu)包括a.設(shè)施類(lèi)的層次結(jié)構(gòu),其中設(shè)施類(lèi)的層次結(jié)構(gòu)中最專(zhuān)門(mén)化的派生類(lèi)(Node,Connection,Compound,Well)被設(shè)計(jì)來(lái)一般地表示可以被模擬的設(shè)施的類(lèi)型;b.成員變量類(lèi)的層次結(jié)構(gòu),其中成員變量類(lèi)的層次結(jié)構(gòu)中最專(zhuān)門(mén)化的派生類(lèi)(SystemAttributeValue,UserAttributeValue,RateConstraint,PressureConstraint)被設(shè)計(jì)來(lái)一般地表示設(shè)施可以具有的成員變量的類(lèi)型,所述成員變量是下列類(lèi)型的一種浮點(diǎn)標(biāo)量或數(shù)組,整型標(biāo)量或數(shù)組,字符串,布爾,枚舉類(lèi)型,流動(dòng)速率限制,和壓力限制;c.ValueUse類(lèi)(206,圖2),其具有與數(shù)據(jù)成員類(lèi)的層次結(jié)構(gòu)中的基類(lèi)(Value,207,圖2)的多對(duì)一的關(guān)聯(lián)以及與設(shè)施類(lèi)的層次結(jié)構(gòu)中的基類(lèi)(FacBase,200,圖2)的多對(duì)一的關(guān)聯(lián),使得每個(gè)Value對(duì)象具有到ValueUse對(duì)象一個(gè)或多個(gè)引用,ValueUse對(duì)象將Value對(duì)象的使用關(guān)聯(lián)到邏輯上擁有它并控制到它的訪問(wèn)的FacBase對(duì)象。
15.權(quán)利要求14的面向?qū)ο筌浖到y(tǒng)結(jié)構(gòu),其中類(lèi)的完整層次結(jié)構(gòu)包括除前述設(shè)施類(lèi)和成員變量類(lèi)之外的類(lèi),所述另外的類(lèi)提供可變通性來(lái)在多種模擬實(shí)現(xiàn)中重用設(shè)施對(duì)象,每種不同的實(shí)現(xiàn)能夠重用使用設(shè)施對(duì)象的一種或多種其他實(shí)現(xiàn)中的成員變量對(duì)象的全部、一些或沒(méi)有,所述另外的類(lèi)包括a.WmSystem控制器類(lèi)(217,圖2),其具有與設(shè)施類(lèi)的層次結(jié)構(gòu)中的基類(lèi)(FacBase,200,圖2)的直接一對(duì)多的關(guān)聯(lián),使得模擬實(shí)現(xiàn)的集合中的WmSystem類(lèi)的對(duì)象具有到用于那些模擬實(shí)現(xiàn)中的所有設(shè)施對(duì)象的超集的直接引用;b.Case類(lèi)(215,圖2),其具有與WmSystem類(lèi)的多對(duì)一的關(guān)聯(lián),使得WmSystem類(lèi)的對(duì)象可以被Case類(lèi)的許多對(duì)象使用,Case對(duì)象包括用于模擬實(shí)現(xiàn)的數(shù)據(jù)的完整集;c.ValueUse類(lèi)(206,圖2),其具有與數(shù)據(jù)層次結(jié)構(gòu)中的基類(lèi)(Value,207,圖2)的多對(duì)一的關(guān)聯(lián)以及與Case類(lèi)的多對(duì)一的關(guān)聯(lián),使得在給定模擬Case中,Value類(lèi)的每個(gè)對(duì)象直接引用ValueUse類(lèi)的一個(gè)或多個(gè)對(duì)象,ValueUse類(lèi)的每個(gè)被引用的對(duì)象將Value對(duì)象的使用關(guān)聯(lián)到使用它的Cases或模擬實(shí)現(xiàn),包括該給定的Case。
16.一種用于模擬物理系統(tǒng)的計(jì)算機(jī)系統(tǒng),包括內(nèi)存裝置,存儲(chǔ)裝置和在主模擬系統(tǒng)中的面向?qū)ο筌浖鲇?jì)算機(jī)系統(tǒng)還包括a)使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠動(dòng)態(tài)地構(gòu)造邏輯來(lái)自定義物理系統(tǒng)的模擬的邏輯界面;b)用于將構(gòu)造的邏輯轉(zhuǎn)換成相應(yīng)的面向?qū)ο蟠a的裝置;c)用于將面向?qū)ο蟠a與包括模擬數(shù)據(jù)模型和模擬算法的主模擬系統(tǒng)集成在一起的,導(dǎo)致集成模擬系統(tǒng)的裝置;d)用于執(zhí)行集成模擬系統(tǒng)的裝置。
17.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中構(gòu)造的邏輯包括設(shè)施管理邏輯,設(shè)施管理邏輯表示用于監(jiān)測(cè)和控制與物理系統(tǒng)相關(guān)聯(lián)的機(jī)械設(shè)施的步驟。
18.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中邏輯界面包括邏輯流程圖界面。
19.權(quán)利要求18的計(jì)算機(jī)系統(tǒng),其中邏輯流程圖界面包括圖標(biāo),箭頭,菜單,對(duì)話框,工具條按鈕以及文本中的一個(gè)或多個(gè),來(lái)使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠構(gòu)建、編輯和顯示流程圖的形式的設(shè)施管理邏輯。
20.權(quán)利要求18的計(jì)算機(jī)系統(tǒng),其中邏輯流程圖界面包括表示用于循環(huán),判斷,語(yǔ)句執(zhí)行,以及邏輯進(jìn)入和退出的基本邏輯控制結(jié)構(gòu)的圖標(biāo)。
21.權(quán)利要求20的計(jì)算機(jī)系統(tǒng),其中表示邏輯控制機(jī)制的圖標(biāo)使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠構(gòu)造自定義的邏輯流程圖。
22.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中邏輯界面包括基于文本的邏輯代碼界面。
23.權(quán)利要求22的計(jì)算機(jī)系統(tǒng),其中基于文本的邏輯代碼界面包括用于執(zhí)行輸入,修改和刪除字母數(shù)字文本行的一種或多種操作的圖形文本編輯器。
24.權(quán)利要求22的計(jì)算機(jī)系統(tǒng),其中基于文本的邏輯代碼,其是設(shè)施管理控制語(yǔ)言,能夠從邏輯流程圖自動(dòng)地創(chuàng)建。
25.權(quán)利要求24的計(jì)算機(jī)系統(tǒng),其中設(shè)施管理控制語(yǔ)言能夠自動(dòng)地轉(zhuǎn)換成C++形式的面向?qū)ο蟮脑O(shè)施管理代碼。
26.權(quán)利要求24的方法,其中設(shè)施管理控制語(yǔ)言是具有適合于具體化設(shè)施管理邏輯的特征和范圍的面向?qū)ο笳Z(yǔ)言。
27.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中面向?qū)ο蟠a是C++形式的設(shè)施管理面向?qū)ο蟠a。
28.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中邏輯界面使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠使用邏輯流程圖界面或者基于文本的邏輯代碼界面來(lái)開(kāi)發(fā)邏輯。
29.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中面向?qū)ο蟠a具有通過(guò)創(chuàng)建從模擬數(shù)據(jù)模型繼承的新的類(lèi)來(lái)擴(kuò)展模擬數(shù)據(jù)模型,從而使面向?qū)ο蟠a能夠調(diào)用模擬數(shù)據(jù)模型的函數(shù)和使用模擬數(shù)據(jù)模型的成員數(shù)據(jù)的能力。
30.權(quán)利要求16的計(jì)算機(jī)系統(tǒng)還包括用于將面向?qū)ο蟠a編譯成面向?qū)ο笤O(shè)施管理目標(biāo)代碼的裝置,以及用于鏈接設(shè)施管理目標(biāo)代碼來(lái)產(chǎn)生共享程序庫(kù),從而能夠?qū)⒐蚕沓绦驇?kù)裝載到主模擬系統(tǒng)中的裝置。
31.權(quán)利要求16的計(jì)算機(jī)系統(tǒng)還包括用于將面向?qū)ο蟠a編譯成面向?qū)ο笤O(shè)施管理目標(biāo)代碼的裝置,以及用于鏈接設(shè)施管理目標(biāo)代碼來(lái)產(chǎn)生動(dòng)態(tài)連接庫(kù),從而能夠?qū)?dòng)態(tài)連接庫(kù)裝載到主模擬系統(tǒng)中的裝置。
32.權(quán)利要求16的計(jì)算機(jī)系統(tǒng)能夠通過(guò)在模擬期間的多個(gè)時(shí)間步調(diào)用面向?qū)ο笤O(shè)施管理代碼來(lái)執(zhí)行集成模擬系統(tǒng)。
33.權(quán)利要求32的計(jì)算機(jī)系統(tǒng),其中面向?qū)ο笤O(shè)施管理代碼能夠在設(shè)施管理代碼已經(jīng)完成當(dāng)前時(shí)間步的執(zhí)行之后,將控制返回給主模擬系統(tǒng)。
34.權(quán)利要求16的計(jì)算機(jī)系統(tǒng)包括多個(gè)連接的處理器來(lái)執(zhí)行模擬。
35.一種在計(jì)算機(jī)系統(tǒng)中模擬物理系統(tǒng)的方法,其中計(jì)算機(jī)系統(tǒng)包括內(nèi)存裝置,存儲(chǔ)裝置,以及主模擬系統(tǒng)中的面向?qū)ο筌浖摲椒òú襟Ea)動(dòng)態(tài)地構(gòu)造邏輯來(lái)自定義物理系統(tǒng)的模擬;b)通過(guò)啟動(dòng)下面的步驟,來(lái)開(kāi)始物理系統(tǒng)的模擬i)自動(dòng)地將邏輯轉(zhuǎn)換成相應(yīng)的面向?qū)ο蟠a;ii)將面向?qū)ο蟠a與包括模擬數(shù)據(jù)模型和模擬算法的主模擬系統(tǒng)集成在一起,導(dǎo)致用于模擬物理系統(tǒng)的集成模擬系統(tǒng);iii)執(zhí)行集成模擬系統(tǒng)來(lái)模擬物理系統(tǒng)。
36.權(quán)利要求35的方法,其中物理系統(tǒng)包括含烴地層。
37.權(quán)利要求36的方法,其中物理系統(tǒng)包括與烴從含烴地層的生產(chǎn)相關(guān)的包含流體的設(shè)施。
38.權(quán)利要求35的方法,其中邏輯的構(gòu)造包括使用圖形用戶(hù)界面來(lái)執(zhí)行選自下面的至少一步a)選擇并使用現(xiàn)有邏輯;b)選擇并修改現(xiàn)有邏輯;c)開(kāi)發(fā)新的邏輯。
39.權(quán)利要求38的方法,其中邏輯的構(gòu)造產(chǎn)生邏輯流程圖。
40.權(quán)利要求35的方法,其中邏輯的構(gòu)造產(chǎn)生基于文本的邏輯代碼。
41.權(quán)利要求39的方法,其中邏輯流程圖的構(gòu)造包括使用圖標(biāo),箭頭,菜單,對(duì)話框,工具條按鈕和文本的一種或多種,來(lái)使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠構(gòu)建、編輯和顯示流程圖形式的設(shè)施管理邏輯。
42.權(quán)利要求39的方法,其中邏輯流程圖的構(gòu)造包括使用基于文本的邏輯代碼界面,該界面包括用于執(zhí)行輸入,修改和刪除字母數(shù)字文本行的圖形文本編輯器。
43.權(quán)利要求35的方法,其中邏輯的轉(zhuǎn)換是轉(zhuǎn)換成C++代碼。
44.權(quán)利要求35的方法,其中轉(zhuǎn)換的面向?qū)ο蟠a具有通過(guò)創(chuàng)建從模擬數(shù)據(jù)模型繼承的新的類(lèi)來(lái)擴(kuò)展模擬數(shù)據(jù)模型,從而使面向?qū)ο蟠a能夠調(diào)用模擬數(shù)據(jù)模型的函數(shù)和使用模擬數(shù)據(jù)模型的成員數(shù)據(jù)的能力。
45.權(quán)利要求35的方法,其中被啟動(dòng)的模擬系統(tǒng)的執(zhí)行產(chǎn)生預(yù)測(cè)物理系統(tǒng)整體行為的結(jié)果。
46.權(quán)利要求35的方法,其中被啟動(dòng)的模擬系統(tǒng)的執(zhí)行使用多個(gè)相連的處理器來(lái)實(shí)施。
全文摘要
本發(fā)明公開(kāi)一種用于模擬復(fù)雜系統(tǒng)中輸運(yùn)現(xiàn)象的計(jì)算機(jī)系統(tǒng)。該系統(tǒng)包括內(nèi)存裝置,存儲(chǔ)裝置,和面向?qū)ο筌浖T撥浖嫦驅(qū)ο蟮目蓴U(kuò)展類(lèi)層次結(jié)構(gòu),該類(lèi)層次結(jié)構(gòu)包括表示多種對(duì)象類(lèi)型的通用類(lèi)的第一集合和表示對(duì)象類(lèi)型的成員變量的通用類(lèi)的第二集合??蓴U(kuò)展的類(lèi)層次結(jié)構(gòu)允許增加另外的對(duì)象類(lèi)型或另外的成員變量,而不修改類(lèi)層次結(jié)構(gòu)本身。在另一種實(shí)施方案中,計(jì)算機(jī)系統(tǒng)也包含使計(jì)算機(jī)系統(tǒng)的用戶(hù)能夠動(dòng)態(tài)地構(gòu)造邏輯來(lái)自定義物理系統(tǒng)的模擬的邏輯界面,用于將構(gòu)造的邏輯轉(zhuǎn)換成相應(yīng)的面向?qū)ο蟠a的裝置,用于將面向?qū)ο蟠a與主模擬系統(tǒng)集成在一起的裝置,以及用于執(zhí)行集成模擬系統(tǒng)的裝置。
文檔編號(hào)G06F9/44GK1483181SQ01821462
公開(kāi)日2004年3月17日 申請(qǐng)日期2001年12月11日 優(yōu)先權(quán)日2000年12月29日
發(fā)明者阿蒂拉·D·班基, 阿蒂拉 D 班基, C 奈特梅爾, 斯蒂芬·C·奈特梅爾 申請(qǐng)人:??松梨谏嫌窝芯抗?