Model Definition¶

In [1]:
import gstlearn as gl
import gstlearn.plot as gp
import gstlearn.widgets as gw
import gstlearn.document as gdoc

%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