In [1]:
import matplotlib.pyplot as plt
import gstlearn as gl
import gstlearn.plot as gp
import gstlearn.document as gdoc
import numpy as np
import pandas as pd
import scipy as sp
from scipy import interpolate
import os
import urllib.request
import tempfile
gdoc.setNoScroll()
Creation of the data base for thickness¶
In [2]:
# Use either Oise_Thickness.csv, Oise_Thickness_withSides.csv or Oise_Ztop500.csv
# Data files are available here: https://soft.mines-paristech.fr/gstlearn/data-latest/Alluvial
filename = gdoc.loadData("Alluvial", "Oise_Ztop500.csv")
csv = gl.CSVformat(True, 0, ";", ",", "9999")
data = gl.Db.createFromCSV(filename, csv, False)
data
Out[2]:
Data Base Characteristics ========================= Data Base Summary ----------------- File is organized as a set of isolated points Space dimension = 1 Number of Columns = 5 Total number of samples = 2470 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = X - Locator = x1 Column = 2 - Name = Y - Locator = NA Column = 3 - Name = Z - Locator = NA Column = 4 - Name = Z_1 - Locator = z1
In [3]:
data.setLocator("X",gl.ELoc.X,0)
data.setLocator("Y",gl.ELoc.X,1)
data.setLocator("Z",gl.ELoc.L,0)
data.setLocator("Z_1",gl.ELoc.U,0)
sf = gl.DbStringFormat()
sf.setFlags(flag_stats=True)
thickness = data.getWithinBounds(0)
err = data.addColumns(thickness,"Elev",gl.ELoc.Z)
err = gl.DbHelper.db_duplicate(data)
data
Out[3]:
Data Base Characteristics ========================= Data Base Summary ----------------- File is organized as a set of isolated points Space dimension = 2 Number of Columns = 7 Total number of samples = 2470 Number of active samples = 2470 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = X - Locator = x1 Column = 2 - Name = Y - Locator = x2 Column = 3 - Name = Z - Locator = lower1 Column = 4 - Name = Z_1 - Locator = upper1 Column = 5 - Name = Elev - Locator = z1 Column = 6 - Name = Duplicate - Locator = sel
In [4]:
plt.scatter(data.getColumn("X"), data.getColumn("Y"), c=data.getColumn("Elev"))
Out[4]:
<matplotlib.collections.PathCollection at 0x7f8df2c01ad0>
In [5]:
plt.hist(thickness)
Out[5]:
(array([120., 787., 658., 447., 198., 118., 63., 51., 22., 6.]), array([ 16. , 24.4, 32.8, 41.2, 49.6, 58. , 66.4, 74.8, 83.2, 91.6, 100. ]), <BarContainer object of 10 artists>)
In [6]:
#data.dumpToNF("Oise_Data_Elev500.ascii")
Creation of the grid¶
1) Creation of the polygon¶
In [7]:
# Data files are available here: https://soft.mines-paristech.fr/gstlearn/data-latest/Alluvial
filename = gdoc.loadData("Alluvial", "Oise_Shapefile_AlluvialPlain.csv")
poly = gl.Polygons.createFromCSV(filename, csv, False)
ax = poly.plot()
In [8]:
grid = gl.DbGrid.create(nx = [3300,400],dx = [50.,50.], x0 = [630000.,6865000.],angles=[40,0])
In [9]:
fig, ax = gp.initGeographic()
ax.raster(grid,"x1",alpha=0.3)
ax.symbol(data)
Out[9]:
<matplotlib.collections.PathCollection at 0x7f8df07912d0>
In [10]:
err = gl.db_polygon(grid,poly)
grid
Out[10]:
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 4 Total number of samples = 1320000 Number of active samples = 138248 Grid characteristics: --------------------- Origin : 630000.0006865000.000 Mesh : 50.000 50.000 Number : 3300 400 Rotation Angles = 40.000 0.000 Direct Rotation Matrix [, 0] [, 1] [ 0,] 0.766 -0.643 [ 1,] 0.643 0.766 Inverse Rotation Matrix [, 0] [, 1] [ 0,] 0.766 0.643 [ 1,] -0.643 0.766 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Polygon - Locator = sel
2) Creation of angles¶
In [11]:
# Data files are available here: https://soft.mines-paristech.fr/gstlearn/data-latest/Alluvial
filename = gdoc.loadData("Alluvial", "Oise_Shapefile_Centerline.csv")
## Loading Centerline data from file
df1 = pd.read_csv (filename, sep=';')
xc = list(df1['X'])
yc = list(df1['Y'])
x1=xc[1:499]
y1=yc[1:499]
# Data files are available here: https://soft.mines-paristech.fr/gstlearn/data-latest/Alluvial
filename = gdoc.loadData("Alluvial", "Oise_Shapefile_AlluvialPlain.csv")
## Loading alluvial plain contours from file & Separate into two polylines
df = pd.read_csv (filename, sep=';')
xp = list(df['X'])
yp = list(df['Y'])
x2=xp[1:xp.index(max(xp))]
x3=xp[len(xp):xp.index(max(xp))+1:-1]
y2=yp[1:xp.index(max(xp))]
y3=yp[len(xp):xp.index(max(xp))+1:-1]
## Adding supplementary control points at the edges
# coordinates of extremes
XA1=640000
YA1=6875000
XB1=740000
YB1=6955000
XA2=630000
YA2=6890000
XB2=735000
YB2=6980000
# Forming two supplementary vectors at the edges
n=19
x4= np.zeros(n)
y4= np.zeros(n)
x5= np.zeros(n)
y5= np.zeros(n)
for i in range(0,len(x4)):
x4[i]=(XA1+(XB1-XA1)/(n-1)*i)
y4[i]=(YA1+(YB1-YA1)/(n-1)*i)
x5[i]=(XA2+(XB2-XA2)/(n-1)*i)
y5[i]=(YA2+(YB2-YA2)/(n-1)*i)
In [12]:
# Gradient method
# https://stackoverflow.com/questions/28269379/curve-curvature-in-numpy
dx_dt1 = np.gradient(x1)
dy_dt1 = np.gradient(y1)
velocity = np.array([ [dx_dt1[i], dy_dt1[i]] for i in range(dx_dt1.size)])
ds_dt1 = np.sqrt(dx_dt1 * dx_dt1 + dy_dt1 * dy_dt1)
tangent1 = np.array([1/ds_dt1] * 2).transpose() * velocity
dx_dt2 = np.gradient(x2)
dy_dt2 = np.gradient(y2)
velocity2 = np.array([ [dx_dt2[i], dy_dt2[i]] for i in range(dx_dt2.size)])
ds_dt2 = np.sqrt(dx_dt2 * dx_dt2 + dy_dt2 * dy_dt2)
tangent2 = np.array([1/ds_dt2] * 2).transpose() * velocity2
dx_dt3 = np.gradient(x3)
dy_dt3 = np.gradient(y3)
velocity3 = np.array([ [dx_dt3[i], dy_dt3[i]] for i in range(dx_dt3.size)])
ds_dt3 = np.sqrt(dx_dt3 * dx_dt3 + dy_dt3 * dy_dt3)
tangent3 = np.array([1/ds_dt3] * 2).transpose() * velocity3
dx_dt4 = np.gradient(x4)
dy_dt4 = np.gradient(y4)
velocity4 = np.array([ [dx_dt4[i], dy_dt4[i]] for i in range(dx_dt4.size)])
ds_dt4 = np.sqrt(dx_dt4 * dx_dt4 + dy_dt4 * dy_dt4)
tangent4 = np.array([1/ds_dt4] * 2).transpose() * velocity4
dx_dt5 = np.gradient(x5)
dy_dt5 = np.gradient(y5)
velocity5 = np.array([ [dx_dt5[i], dy_dt5[i]] for i in range(dx_dt5.size)])
ds_dt5 = np.sqrt(dx_dt5 * dx_dt5 + dy_dt5 * dy_dt5)
tangent5 = np.array([1/ds_dt5] * 2).transpose() * velocity5
tangent=np.concatenate((tangent1,tangent2,tangent3,tangent4,tangent5),axis=0)
x0=np.concatenate((x1,x2,x3,x4,x5),axis=0)
y0=np.concatenate((y1,y2,y3,y4,y5),axis=0)
u0 = tangent[:, 0]
v0 = tangent[:, 1]
In [13]:
# Numpy arctan2 Method
angles = np.arctan2(v0, u0) * 180 / np.pi
plt.hist(angles)
Out[13]:
(array([ 23., 11., 8., 36., 238., 545., 700., 270., 98., 41.]), array([-178.33971763, -142.50574587, -106.6717741 , -70.83780234, -35.00383058, 0.83014118, 36.66411295, 72.49808471, 108.33205647, 144.16602824, 180. ]), <BarContainer object of 10 artists>)
In [14]:
# Interpolating the angles into angles map -> https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html
xx = np.linspace(630000, 742000, 2240)
yy = np.linspace(6875000, 6982200, 2144)
xx, yy = np.meshgrid(xx, yy)
angles.shape=(np.size(angles),)
np.shape(angles)
points = np.transpose(np.vstack((x0, y0)))
angles_interp = interpolate.griddata(points, angles, (xx, yy), method='linear')
xx1 = np.concatenate(xx)
yy1 = np.concatenate(yy)
angles_interp1 = np.concatenate(angles_interp)
In [15]:
#Create a point Db point using xx, yy, angles_interp
dbv = gl.Db()
dbv.addColumns(xx1,"xx",gl.ELoc.X, 0)
dbv.addColumns(yy1,"yy",gl.ELoc.X, 1)
dbv.addColumns(angles_interp1,"angles_interp",gl.ELoc.Z, 0)
dbv.display()
grid.setLocator("Pol*")
grid.display()
Data Base Characteristics ========================= Data Base Summary ----------------- File is organized as a set of isolated points Space dimension = 2 Number of Columns = 3 Total number of samples = 4802560 Variables --------- Column = 0 - Name = xx - Locator = x1 Column = 1 - Name = yy - Locator = x2 Column = 2 - Name = angles_interp - Locator = z1 Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 4 Total number of samples = 1320000 Grid characteristics: --------------------- Origin : 630000.0006865000.000 Mesh : 50.000 50.000 Number : 3300 400 Rotation Angles = 40.000 0.000 Direct Rotation Matrix [, 0] [, 1] [ 0,] 0.766 -0.643 [ 1,] 0.643 0.766 Inverse Rotation Matrix [, 0] [, 1] [ 0,] 0.766 0.643 [ 1,] -0.643 0.766 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Polygon - Locator = NA
In [16]:
#Tester la valeur retournée par migrate :
grid.deleteColumn("Migr*")
gl.migrateMulti(dbv, grid, ["angles_interp"])
grid.setLocator("Migrate*", gl.ELoc.Z)
grid.display()
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 5 Total number of samples = 1320000 Grid characteristics: --------------------- Origin : 630000.0006865000.000 Mesh : 50.000 50.000 Number : 3300 400 Rotation Angles = 40.000 0.000 Direct Rotation Matrix [, 0] [, 1] [ 0,] 0.766 -0.643 [ 1,] 0.643 0.766 Inverse Rotation Matrix [, 0] [, 1] [ 0,] 0.766 0.643 [ 1,] -0.643 0.766 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Polygon - Locator = NA Column = 4 - Name = Migrate.angles_interp - Locator = z1
In [17]:
grid.useSel = False
grid.setLocator("Polygon")
uid_selection=grid.addSelectionByLimit("*angles_interp*", gl.Limits([-10], [10]), "angle_define")
In [18]:
xplt = grid.getColumnByLocator(gl.ELoc.X,0,useSel=True)
yplt = grid.getColumnByLocator(gl.ELoc.X,1,useSel=True)
aplt = grid.getColumnByLocator(gl.ELoc.Z,0,useSel=True)
3) Creation of a selection (polygon + borders by morphological dilation)¶
In [19]:
grid.setLocator("Poly*", gl.ELoc.SEL)
In [20]:
vmin = 0.5
vmax = 1.5
nxy = grid.getNXs()
image2 = gl.BImage(nxy)
tab = grid.getColumn("Polygon",useSel=False)
image = gl.morpho_double2image(nxy,tab,vmin,vmax)
localVD = gl.VectorDouble(len(tab))
gl.morpho_dilation(0, [3,3], image, image2)
for i in range(10):
gl.morpho_dilation(0, [1,1], image, image2)
gl.morpho_dilation(0, [1,1], image2, image)
#gl.morpho_dilation(0, [1,1], image, image2)
gl.morpho_image2double(image2, 0, 1., 0., localVD)
In [21]:
grid["res"]=localVD.getVector()
In [22]:
grid.setLocator("res",gl.ELoc.SEL)
grid
Out[22]:
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 7 Total number of samples = 1320000 Number of active samples = 278129 Grid characteristics: --------------------- Origin : 630000.0006865000.000 Mesh : 50.000 50.000 Number : 3300 400 Rotation Angles = 40.000 0.000 Direct Rotation Matrix [, 0] [, 1] [ 0,] 0.766 -0.643 [ 1,] 0.643 0.766 Inverse Rotation Matrix [, 0] [, 1] [ 0,] 0.766 0.643 [ 1,] -0.643 0.766 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Polygon - Locator = NA Column = 4 - Name = Migrate.angles_interp - Locator = z1 Column = 5 - Name = angle_define - Locator = NA Column = 6 - Name = res - Locator = sel
In [23]:
gp.raster(grid,"Migrate.angles_interp",cmap="turbo", flagLegend = True)
Out[23]:
<matplotlib.collections.QuadMesh at 0x7f8e5f323cd0>
4) Save the result¶
In [24]:
#grid.dumpToNF("Oise_GridAnglesModifFinal.ascii")
Start Kriging here once data is properly saved¶
In [25]:
#grid = gl.DbGrid.createFromNF("Oise_GridAnglesModifFinal.ascii")
grid
Out[25]:
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 7 Total number of samples = 1320000 Number of active samples = 278129 Grid characteristics: --------------------- Origin : 630000.0006865000.000 Mesh : 50.000 50.000 Number : 3300 400 Rotation Angles = 40.000 0.000 Direct Rotation Matrix [, 0] [, 1] [ 0,] 0.766 -0.643 [ 1,] 0.643 0.766 Inverse Rotation Matrix [, 0] [, 1] [ 0,] 0.766 0.643 [ 1,] -0.643 0.766 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Polygon - Locator = NA Column = 4 - Name = Migrate.angles_interp - Locator = z1 Column = 5 - Name = angle_define - Locator = NA Column = 6 - Name = res - Locator = sel
In [26]:
# Modify the ranges to 8000, 800 if wished
ranges = [2000,200]
#If old method is set to True, a classical SPDE kriging will be used
oldMethod = False
In [27]:
# Load data, use either with or without the sides; For the top of the alluvial plain use "Oise_Data_Elev500.ascii"
# Data files are available here: https://soft.mines-paristech.fr/gstlearn/data-latest/Alluvial
filename = gdoc.loadData("Alluvial", "Oise_Data_ThicknessSides.ascii")
data = gl.Db.createFromNF(filename)
data
Out[27]:
Data Base Characteristics ========================= Data Base Summary ----------------- File is organized as a set of isolated points Space dimension = 2 Number of Columns = 7 Total number of samples = 2334 Number of active samples = 2319 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = X - Locator = x1 Column = 2 - Name = Y - Locator = x2 Column = 3 - Name = Thickness - Locator = lower1 Column = 4 - Name = Thickness_1 - Locator = upper1 Column = 5 - Name = ThicknessSides - Locator = z1 Column = 6 - Name = Duplicate - Locator = sel
In [28]:
# Selection to calculate variogram only on non-zero values
data["selVario"]=(data["Duplicate"]*(data["ThicknessSides"]>0))
data.setLocators(["selVario"],gl.ELoc.SEL)
data
Out[28]:
Data Base Characteristics ========================= Data Base Summary ----------------- File is organized as a set of isolated points Space dimension = 2 Number of Columns = 8 Total number of samples = 2334 Number of active samples = 1010 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = X - Locator = x1 Column = 2 - Name = Y - Locator = x2 Column = 3 - Name = Thickness - Locator = lower1 Column = 4 - Name = Thickness_1 - Locator = upper1 Column = 5 - Name = ThicknessSides - Locator = z1 Column = 6 - Name = Duplicate - Locator = NA Column = 7 - Name = selVario - Locator = sel
In [29]:
myVarioParamBidir = gl.VarioParam()
mydir = gl.DirParam(40,800.,0.5,45.,0,0,np.nan,np.nan,0.,[],[1,1])
myVarioParamBidir.addDir(mydir)
mydir = gl.DirParam(20,400.,0.5,45.,0,0,np.nan,np.nan,0.,[],[-1,1])
myVarioParamBidir.addDir(mydir)
myVarioBidir = gl.Vario(myVarioParamBidir)
err = myVarioBidir.compute(data,gl.ECalcVario.VARIOGRAM)
myVarioBidir.display()
ax = gp.varmod(myVarioBidir,idir=0)
ax.decoration(title="Bi-directional Variogram for thickness(45°)")
ax = gp.varmod(myVarioBidir,idir=1)
ax.decoration(title="Bi-directional Variogram for thickness(45/135°)")
Variogram characteristics ========================= Number of variable(s) = 1 Number of direction(s) = 2 Space dimension = 2 Variance-Covariance Matrix 8.283 Direction #1 ------------ Number of lags = 40 Direction coefficients = 1.000 1.000 Direction angles (degrees) = 45.000 0.000 Tolerance on direction = 45.000 (degrees) Calculation lag = 800.000 Tolerance on distance = 50.000 (Percent of the lag value) For variable 1 Rank Npairs Distance Value 0 1491.000 222.985 4.285 1 4135.000 817.513 6.027 2 5005.000 1597.763 5.766 3 5177.000 2403.961 7.196 4 4931.000 3202.456 7.062 5 5414.000 3996.471 6.883 6 5969.000 4804.571 6.796 7 5993.000 5607.391 6.235 8 5918.000 6392.940 6.156 9 5849.000 7198.209 7.202 10 5641.000 8004.082 6.712 11 4824.000 8800.796 7.726 12 5439.000 9591.894 6.860 13 5085.000 10419.647 6.706 14 5724.000 11192.490 6.888 15 6188.000 12005.854 6.486 16 5405.000 12774.212 6.783 17 4865.000 13605.264 6.492 18 4534.000 14393.326 6.467 19 4769.000 15203.346 6.514 20 4627.000 16001.095 5.897 21 4445.000 16792.930 6.947 22 4752.000 17616.012 7.331 23 6299.000 18422.320 7.206 24 5733.000 19188.948 7.033 25 5351.000 19996.702 6.631 26 5152.000 20791.695 7.815 27 5461.000 21593.342 7.902 28 4816.000 22408.492 7.541 29 5391.000 23190.246 9.345 30 5021.000 24009.337 7.375 31 5194.000 24797.226 7.986 32 5192.000 25607.977 7.768 33 5401.000 26409.342 8.086 34 4927.000 27190.648 7.410 35 4718.000 27990.954 7.806 36 4509.000 28793.658 7.400 37 5346.000 29648.534 6.941 38 5449.000 30397.797 7.461 39 6073.000 31199.396 7.758 Direction #2 ------------ Number of lags = 20 Direction coefficients = -1.000 1.000 Direction angles (degrees) = 135.000 0.000 Tolerance on direction = 45.000 (degrees) Calculation lag = 400.000 Tolerance on distance = 50.000 (Percent of the lag value) For variable 1 Rank Npairs Distance Value 0 596.000 119.136 2.768 1 1400.000 393.701 4.532 2 1453.000 793.785 6.290 3 1224.000 1196.400 6.529 4 1032.000 1596.868 7.385 5 858.000 1983.161 7.192 6 697.000 2404.699 7.787 7 675.000 2794.542 7.751 8 419.000 3189.263 8.768 9 354.000 3597.904 11.252 10 339.000 3996.583 9.995 11 260.000 4402.766 7.896 12 232.000 4792.850 7.453 13 177.000 5178.782 7.800 14 172.000 5586.833 6.960 15 100.000 5978.383 9.960 16 89.000 6394.625 9.218 17 55.000 6800.319 5.859 18 30.000 7199.585 9.574 19 39.000 7641.196 4.828
In [30]:
model = gl.Model.createFromDb(data)
structs = [gl.ECov.NUGGET,gl.ECov.BESSEL_K]
cons1P = gl.ConsItem.define(gl.EConsElem.PARAM,1, type = gl.EConsType.EQUAL,value = 1)
a = gl.Constraints()
a.addItem(cons1P)
err = model.fit(myVarioBidir,structs,constraints=a)
model.display()
ax = gp.varmod(myVarioBidir,model,idir=0)
ax = gp.varmod(myVarioBidir,model,idir=1)
plt.show()
#model.setMean(100)
model.display()
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 2 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Nugget Effect - Sill = 2.203 K-Bessel (Third Parameter = 1) - Sill = 4.715 - Ranges = 1045.034 1497.054 - Theo. Ranges = 301.675 432.162 - Angles = 45.000 0.000 - Rotation Matrix [, 0] [, 1] [ 0,] 0.707 -0.707 [ 1,] 0.707 0.707 Total Sill = 6.918 Known Mean(s) 0.000
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 2 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Nugget Effect - Sill = 2.203 K-Bessel (Third Parameter = 1) - Sill = 4.715 - Ranges = 1045.034 1497.054 - Theo. Ranges = 301.675 432.162 - Angles = 45.000 0.000 - Rotation Matrix [, 0] [, 1] [ 0,] 0.707 -0.707 [ 1,] 0.707 0.707 Total Sill = 6.918 Known Mean(s) 0.000
In [31]:
data.setLocators(["Duplicate"],gl.ELoc.SEL)
In [32]:
if not oldMethod :
model = gl.Model.createFromDb(data)
covBessel = gl.CovAniso.createAnisotropic(type = gl.ECov.BESSEL_K,ranges=ranges,sill=4.7,param=1,ctxt=model.getContext())
covNugget = gl.CovAniso.createIsotropic(type = gl.ECov.NUGGET,sill=2.2,ctxt=model.getContext(),range=1)
model.addCov(covNugget)
model.addCov(covBessel)
In [33]:
grid.setLocator("Polygon.*", gl.ELoc.SEL)
In [34]:
model.setDriftIRF(order = 0)
model
Out[34]:
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 2 Number of drift function(s) = 1 Number of drift equation(s) = 1 Covariance Part --------------- Nugget Effect - Sill = 2.200 K-Bessel (Third Parameter = 1) - Sill = 4.700 - Ranges = 2000.000 200.000 - Theo. Ranges = 577.350 57.735 Total Sill = 6.900 Drift Part ---------- Universality_Condition
In [35]:
if not oldMethod:
grid.setLocator("Migrate.angles_interp",gl.ELoc.NOSTAT)
nostat = gl.NoStatArray(["M2A"],grid)
model.addNoStat(nostat)
In [36]:
data.setLocators(["ThicknessNosides"],gl.ELoc.Z,cleanSameLocator=True)
In [37]:
# Basic SPDE simulation
spde = gl.SPDE(model,grid,data,gl.ESPDECalcMode.KRIGING)
uid_result= spde.compute(grid)
In [38]:
#Plot kriging
plt.figure(figsize=[20,12])
gp.raster(grid,"spde.ThicknessSides.estim",cmap="turbo", flagLegend = True)
Out[38]:
<matplotlib.collections.QuadMesh at 0x7f8df0773e10>
Save the current grid, which can be loaded again at the start of kriging (cell #26)¶
In [39]:
# modify the grid according to your wishes
#grid["Old_Variable"]=grid["New_variable"]
#grid.deleteColumn("TheVariableYouWant")
#grid["BedrockElevation"]=grid["PlainElevation"]-grid["AlluviumThickness"]
In [40]:
#Save the grid
#grid.dumpToNF("Oise_KrigingResults_Thickness.ascii")
Uncertainties estimation based on standard deviation¶
In [41]:
# Calculation of n simulations to estimate standard deviation (best is to change to nbsimu=100)
error=gl.simulateSPDE(data,grid,model,nbsimu=10)
In [42]:
# Calculation of Stdv by hand: gl.EStatOption.STDV in the future
grid["MeanSimu"]=grid["SimuSPDE.Thickness*"].mean(1)
grid["StdevSimu"]=np.zeros(grid["SimuSPDE.Thickness*"].shape[0])
nc=grid["SimuSPDE.Thickness*"].shape[1]
for i in range(nc):
grid["StdevSimu"]+=((grid["SimuSPDE.Thickness*"][:,i]-grid["MeanSimu"])**2)/nc
grid["StdevSimu"]=grid["StdevSimu"]**0.5
In [ ]: