Model Definition¶
In [1]:
import gstlearn as gl
import gstlearn.plot as gp
import gstlearn.widgets as gw
import gstlearn.document as gdoc
import numpy as np
import os
import pandas as pd
from scipy.spatial import distance_matrix
%matplotlib inline
%matplotlib notebook
gdoc.setNoScroll()
We create the Dictionary of the available basic structures in gstlearn: we concentrate on the only ones that can be simulated using the Turning Bands method
In [2]:
modelList = gl.CovHelper.getAllCovariances(flagSimtub = True)
models = dict()
for rank in range(len(modelList)):
loctype = gl.ECov.fromKey(modelList[rank])
locname = gl.ECov.getDescr(loctype)
models[locname] = loctype
In [3]:
modelList
Out[3]:
('NUGGET', 'EXPONENTIAL', 'SPHERICAL', 'GAUSSIAN', 'CUBIC', 'SINCARD', 'BESSELJ', 'MATERN', 'STABLE')
In [4]:
model = gl.Model.createFromParam(gl.ECov.SPHERICAL,range=2,sill=3)
Defining the visualization function
In [5]:
def plotModel(axs, model, n=50, ymax=1.4, nbtuba=200, nlag=25):
# Calculate the Grids
dbp = gl.DbGrid.create(nx=[1,1],x0=[n,n])
db = gl.DbGrid.create(nx=[2*n,2*n])
gl.simtub(None,db,model,nbtuba=nbtuba)
db["model"] = 1 - model.evalCovMat(db,dbp).toTL()
sill = model.getSill(0,0,0)
# Calculate the experimental variogram
varioparam = gl.VarioParam.createMultipleFromGrid(db, nlag)
vario = gl.Vario.computeFromDb(varioparam, db)
# Draw the Theoretical variogram Map
axs[0][0].clear()
axs[0][0].raster(db,"model")
axs[0][0].decoration(title="Model")
# Draw one simulation
axs[0][1].clear()
axs[0][1].raster(db,"*Simu")
axs[0][1].decoration(title="Simulation")
# Draw the Model
axs[1][0].clear()
axs[1][0].model(model,hmax=70,codir=[1,0],color="red")
axs[1][0].model(model,hmax=70,codir=[0,1],color="black")
axs[1][0].geometry(xlim=[0,None])
axs[1][0].geometry(ylim=[0,sill*ymax])
axs[1][0].decoration(title="Variogram Model")
# Draw the experimental variograms in the two main Grid directions
axs[1][1].clear()
axs[1][1].variogram(vario,idir=0,color="red")
axs[1][1].variogram(vario,idir=1,color="black")
axs[1][1].geometry(xlim=[0,None])
axs[1][1].geometry(ylim=[0,sill*ymax])
axs[1][1].decoration(title="Experimental Variogram")
# Delete the newly created variables on the grid
db.deleteColumn("model")
db.deleteColumn("*Simu")
Sensitivity of Model parameters¶
In [6]:
def myCallBack(model):
plotModel(axs, model)
In [7]:
objectModel = gw.WModel(models, myCallBack, defrank=2)
display(objectModel)
fig, axs = gp.init(2,2,figsize=(7,7))
plotModel(axs, model)
gp.close()
Creating a Model with drift¶
We consider building a Model of a 2-D Random Variable by pieces.
We first define the covariance part (nested structures with a Nugget Effect and an isotropic Spherical scheme); then we add some drift conditions (first order Random Function).
In [8]:
# Creating an empty Model
model = gl.Model()
# Adding the covariance elements
model.addCovFromParam(type=gl.ECov.NUGGET, sill=2)
model.addCovFromParam(type=gl.ECov.SPHERICAL, range=10, sill=3)
# Adding the drift items
model.addDrift(gl.DriftM())
model.addDrift(gl.DriftM([1]))
model.addDrift(gl.DriftM([0,1]))
model
Out[8]:
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 2 Number of drift function(s) = 3 Number of drift equation(s) = 3 Covariance Part --------------- Nugget Effect - Sill = 2.000 Spherical - Sill = 3.000 - Range = 10.000 Total Sill = 5.000 Drift Part ---------- Universality_Condition Drift:x1 Drift:x2