GsTL介紹

1、爲什麼要有GsTL

簡單來講GsTL(Geostatistal Template Library)就是大名鼎鼎的GSLIB的C++版本,由於GSLIB是fortran編寫的,越來越不適應當代變成的需要,因此斯坦福大學的SCRF小組就開發了GsTL,並將其開源,它僅包含頭文件,使用起來很方便。

2、GsTL的總體設計

2.1 GsTL的組成

按照GSLIB的傳統,GsTL同樣也包含構建模塊庫和一系列程序模擬用於執行基本的地質統計學算法。但重點是構建模塊庫,使其能爲未來軟件開發提供整體框架。

  • 基礎庫:這部分主要提供構建模塊,使開發者能建立新程序實現新算法。地質統計估計和模擬常用的實體可以抽象爲幾個概念,每個概念可以定義爲一系列類型,這些類型滿足一些特定的要求。在c++中,這些概念通過類(class)表示,基礎庫也提供一些常用的地質統計學算法,Remy(2001)的文章有關於這些類和從用地質統計學算法的描述。
  • 一系列程序:這部分的程序主要是空間變化性表徵(變差函數模型、訓練圖像中結構提取等)、克里金估計、隨機模擬。終端用戶可以直接使用這些程序,不需任何修改。但是,這些程序模塊必須重新組裝,以滿足他們的特定需求。

2.2 設計步驟

通過分析地質統計學算法和典型的應用問題尋找常用的概念,地質統計學算法常見的操作實體通過一系列概念表示。比如,很多地質統計估計和算法可以抽象爲:

(1)建立網格系統,它包含一組位置,每個位置的屬性值需要被估計或模擬;

(2)定義一個路徑,可以訪問到網格系統中的所有位置;

(3)對沿着路徑的所有位置:

                根據相鄰數據評價該位置處的累計概率分佈(ccdf)

                從ccdf重採樣賦值到所在位置

(4)結束

對這種通用的算法,我們可以定義一些重要的概念,包括:位置(location),屬性值(property value),路徑(path),網格系統(grid),鄰域(neighbourbood),累計概率分佈古蹟器(ccdf estimator),累計概率分佈採樣器(ccdf sampler)。這些概念可以是實體對象,比如位置,也可以是行爲或函數,比如ccdf估計器。Remy2001對這些問題有詳細討論。

需要注意的是這些概念不是一小段c++代碼,而是模塊化成了c++的類。這些類爲維數相關信息提供了重要支撐,是對一組數據和算法的封裝。

3 一些GsTL基礎類型的設計與實現

對每個類型,首先展示聲明函數,然後討論它的設計和實現,緊接着是類型的模板參數,公開基類,它模擬的概念,它用到的類型及接口等。

3.1 點Point

template <class coordinate_type, size_t Dimension = 3>

struct Point

點是N維歐拉空間的元素,表達爲笛卡爾座標(p0, p1, p2, …, PN-1),可以通過下標[]的方式訪問點在某個維度的座標,比如通過p[0]獲取點p的第一個維度的座標值。

除了支持+-*/操作,點的操作符+=, -=, -, ==, 已經重載,可以使用。<<和>>也重載了,方便輸入和輸出。

下面是個簡單的實例

Point<int, 3> p = {{1, 2, 3}};

Point<int, 3> shift = {{1, 1, 1}};

Point<int, 3> q = p + shift; // q’s coordinates are (2, 3, 4)

q[0] = 5; // change q[0] from 2 to 5

 

3.2 地質值GeoValue

template<class location_type, class property_type>

class GeoValue

地質值是GeoValue位置和屬性的點對,屬性可以是連續變量,比如孔隙度、滲透率,也可以是離散變量,比如巖性。GeoValue也要一個標籤指示是否爲硬數據,已估計和未估計數據。GeoValue是很多地質統計學最基本的元素,因此它的設計對要率要求很高。

操作符<<和>>也支持,方便輸出和輸入

3.3 笛卡爾結構CartesianMesh

template<class location_type>

class CartesianMesh

笛卡爾網格通過初始點,每個維度上的維數,以及每個維度上的網格的大小組成。爲了計算或搜索,很多地質統計學算法中地質值在網格中的存儲都遵循一定的順序。比如,在GISLIB中,地質值在規則的三維笛卡爾座標系中通過網格索引排序:先一個一個點向東排序,然後一行一行向被排序,然後一層一層向上排序。非結構化的樣本數據按照一維方式排序,通過索引訪問。兩種方式下都是通過笛卡爾網格構建地質網格的排序。因此,笛卡爾網格的職責就是翻譯地質值的座標與每個維度上的網格索引。

3.4 網格Grid

網格Grid是地質值GeoValue的集合,地質值不需要是均勻間隔,每個地質的位置都需要指定。網格內置了個笛卡爾網格座標系,可以在構造函數中顯示地輸入,也可以通過網格中存儲的地質值組成。

在搜索相鄰網格過程中,需要在網格Grid中通過隨機的方式訪問地質值GeoValue,所以網格Grid也設計成了隨機訪問容器,即Grid提供了隨機訪問迭代器。

有時,我們需要迭代地訪問網格中地質值的內容,比如搜索相鄰數據計算兩個位置的協方差,因此,也提供了帶幫助函數的迭代器。

3.5 笛卡爾網格CartesianGrid

template <class geoValue_type>

class CartesianGrid : public Grid<geoValue_type>

可以看出笛卡爾網格繼承自網格,它是均勻間隔的網格座標系。在每個維度上通過索引即可計算座標值。構建起來比Grid更簡單。

3.6 網格適應器GridAdapter

template<class grid_type>

class GridAdapter

當利用笛卡爾網格的迭代器訪問時,它先沿第一維度訪問,然後第二維度,以此循環。這種方法對尋找地質值,搜索相鄰數據很有優勢。但是,我們優勢需要按照不同的方式訪問地質值,比如比如,很多序貫模擬算法要求按照隨機的方式訪問地質以避免人爲性。

網格適應器接口可以用來提供一種獲取相鄰數據的方法,接口上洞的個數就是相鄰數據的個數。從第一個觀察洞,可以獲取第一個最近的相鄰數據,從第二個觀察洞,可以獲取第二臨近的數據,依次類推。總之,網格適應器時細化的隨機訪問器,返回的地質值的索引。

3.7 搜索面積SearchArea

template<class location_type>

class SearchArea

很多地質統計學算法要求相鄰網格的搜索要限制在一定範圍內的子網格,這個區域成爲搜索面域,它包含一系列網格的集合,這些網格分佈在中心點的n維空間。它的返回值是圍繞中心點的一組點。

3.8 鄰域Neighborhood

template<class grid_type, class BinOp>

class Neighborhood : public GridAdapter<grid_type>

鄰域的關鍵作用是爲地質值尋找相鄰數據提供服務,相鄰數據的搜索要基於所複數的網格,並且搜索要限定在給定的面域內,用戶需要指定計算兩個地質值距離的方法。

鄰域的搜索策略根據網格類型的不同分爲兩種:如果採用了笛卡爾網格,則採用螺旋式搜索方法;如果是非結構網格,則採用超級塊搜索。

3.9 隨機路徑RandonPath

template<class grid_type>

class RandomPath : public GridAdapter<grid_type>

很多地質統計學算法都要求按照隨機方法訪問地質值,隨機路徑爲地質值所在網格提供了接口,因此很容易實現序貫地訪問網格節點。

因爲網格適應器繼承了隨機路徑,網格適應器已經實現了很多功能。除了構造器,隨機路徑爲新的模擬路徑提供了一種方法,它重新爲訪問節點提供隨機路徑,同時把網格標記爲未模擬,除了已知的贏數據。

 

Reference

Zhanjun Ying. Design and implementation of some GsTL foundation classes. Stanford Center for Reservoir Forecasting, Department of Petroleum Engineering, Stanford University, CA 94305, April 25, 2001

Remy N , Shtuka A , Levy B , et al. GSTL: the geostatistical template library in C++[J]. Computers & Geosciences, 2002, 28(8):971-979.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章