Example #1
0
def load_grav_pygimli_cylinder():

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    r"""
    Semianalytical Gravimetry and Geomagnetics in 2D
    ------------------------------------------------
    
    Simple gravimetric and magnetostatic field caluculation using integration approach after :cite:`WonBev1987`.
    
    """

    radius = 2.
    depth = 5.
    rho = 1000.0

    x = np.arange(-20, 20, 1)
    pnts = np.zeros((len(x), 2))
    pnts[:, 0] = x
    pos = [0, -depth]

    fig, ax = pg.plt.subplots(nrows=3, ncols=1, figsize=(12, 8), sharex=True)

    # Horizontal cylinder
    circ = createCircle([0, -depth],
                        radius=radius,
                        marker=2,
                        area=0.1,
                        segments=32)

    pg.show(circ, ax=ax[0], fillRegion=False)

    ga = gradUCylinderHoriz(pnts, radius, rho, pos=pos)
    gza = gradGZCylinderHoriz(pnts, radius, rho, pos=pos)
    g, gz = solveGravimetry(circ, rho, pnts, complete=True)

    plot(x, ax[1], ga, gza, ax[2], g, gz, legend=False)
    # ax[0].set_ylim(bottom=-depth*2, top=1)

    labels = ["Horizontal cylinder", "Half plate"]
    for ax, label in zip(ax[:], labels):
        ax.set_title(label)
        ax.set_aspect("equal")
        ax.set_xlim(left=x[0], right=x[-1])
        ax.set_ylim(bottom=-depth * 2, top=1)

    # pg.wait()

    return ga, gza
Example #2
0
def calcInvBlock(mesh, dens, out='gravInv'):

    # extract block delta density
    densBlock = pg.RVector(dens)
    densMarker2 = dens[pg.find(mesh.cellMarker() == 2)[0]]
    #densBlock[(mesh.cellMarker() == 1) | (mesh.cellMarker() == 3)] = densMarker2
    densBlock[pg.find((mesh.cellMarker() == 1)
                      | (mesh.cellMarker() == 3))] = densMarker2
    densBlock -= densMarker2

    # define meausrement positions
    gravPointsX = np.linspace(-20, 20, 41)
    sensorPositions = np.vstack((gravPointsX, np.zeros(len(gravPointsX)))).T

    # solve analytical
    gz = solveGravimetry(mesh, densBlock, pnts=sensorPositions, complete=False)

    # noisyfy
    errAbs = 0.00001
    dzerr = np.random.randn(len(sensorPositions)) * errAbs
    gz = gz + dzerr

    # createParamesh
    paraMesh = pg.createGrid(x=np.linspace(-20, 20, 41),
                             y=np.linspace(-20, 0, 21))

    # init Gravimetry manager (should do meshing, simulation and noisying)
    Grav = Gravimetry(verbose=True)

    model = Grav.invert(sensorPositions, gz, errAbs, verbose=1, mesh=paraMesh)

    fig, ax = plt.subplots()
    ax.plot(pg.x(sensorPositions), gz, label='gz')
    ax.plot(pg.x(sensorPositions), Grav.inv.response(), label='response')
    ax.legend()
    ax.grid()
    ax.set_xlabel('$x$ [m]')
    ax.set_ylabel('$\partial u / \partial z$ [mGal]')
    plt.show(block=False)
    ax.figure.savefig(out, bbox_inches='tight')

    return Grav, densBlock
Example #3
0
def calcInvBlock(mesh, dens, out='gravInv'):

    # extract block delta density
    densBlock = pg.RVector(dens)
    densMarker2 = dens[pg.find(mesh.cellMarker() == 2)[0]]
#    densBlock[(mesh.cellMarker() == 1)|(mesh.cellMarker() == 3)] = densMarker2
    densBlock[pg.find((mesh.cellMarker() == 1) | (mesh.cellMarker() == 3))] = \
        densMarker2
    densBlock -= densMarker2

    # define meausrement positions
    gravPointsX = np.linspace(-20, 20, 41)
    sensorPositions = np.vstack((gravPointsX, np.zeros(len(gravPointsX)))).T

    # solve analytical
    gz = solveGravimetry(mesh, densBlock, pnts=sensorPositions, complete=False)

    # noisyfy
    errAbs = 0.00001
    dzerr = np.random.randn(len(sensorPositions)) * errAbs
    gz = gz + dzerr

    # createParamesh
    paraMesh = pg.createGrid(x=np.linspace(-20, 20, 41),
                             y=np.linspace(-20, 0, 21))

    # init Gravimetry manager (should do meshing, simulation and noisying)
    Grav = Gravimetry(verbose=True)

    model = Grav.invert(sensorPositions, gz, errAbs, verbose=1, mesh=paraMesh)

    fig, ax = plt.subplots()
    ax.plot(pg.x(sensorPositions), gz, label='gz')
    ax.plot(pg.x(sensorPositions), Grav.inv.response(), label='response')
    ax.legend()
    ax.grid()
    ax.set_xlabel('$x$ [m]')
    ax.set_ylabel('$\partial u / \partial z$ [mGal]')
    plt.show(block=False)
    ax.figure.savefig(out, bbox_inches='tight')

    return Grav, densBlock
Example #4
0
def simulateGravimetry(mesh, dDens):
    gravPointsX = np.arange(-19, 19.1, 1)
    gravPoints = np.vstack((gravPointsX, np.zeros(len(gravPointsX)))).T
    solutionName = createCacheName('grav', mesh, times)
    try:
        #vel = pg.load(solutionName + '.bmat')
        Gdg = np.load(solutionName + '.bmat.npy')

    except Exception as e:
        print(e)
        print("Building .... ")
        #Gdg, Gdgz = solveGravimetry(mesh, None, pnts=gravPoints, complete=True)
        Gdg = solveGravimetry(mesh, None, pnts=gravPoints)
        np.save(solutionName + '.bmat', Gdg)

    #dz = Gdg.dot(dDens.transpose([1,0])).T

    dz = np.zeros((len(dDens), len(gravPoints)))
    for i in range(len(dDens)):
        dzerr = np.random.randn(len(gravPoints)) * 0.01
        dz[i] = Gdg.dot(dDens[i]) + dzerr

    print(Gdg.shape, dDens.shape, dz.shape)
    return gravPoints, dz
Example #5
0
def simulateGravimetry(mesh, dDens):
    gravPointsX = np.arange(-19, 19.1, 1)
    gravPoints = np.vstack((gravPointsX, np.zeros(len(gravPointsX)))).T
    solutionName = createCacheName('grav', mesh, times)
    try:
        #vel = pg.load(solutionName + '.bmat')
        Gdg = np.load(solutionName + '.bmat.npy')

    except Exception as e:
        print(e)
        print("Building .... ")
        #Gdg, Gdgz = solveGravimetry(mesh, None, pnts=gravPoints, complete=True)
        Gdg = solveGravimetry(mesh, None, pnts=gravPoints)
        np.save(solutionName + '.bmat', Gdg)

    #dz = Gdg.dot(dDens.transpose([1,0])).T

    dz = np.zeros((len(dDens), len(gravPoints)))
    for i in range(len(dDens)):
        dzerr = np.random.randn(len(gravPoints)) * 0.01
        dz[i] = Gdg.dot(dDens[i]) + dzerr

    print(Gdg.shape, dDens.shape, dz.shape)
    return gravPoints, dz
Example #6
0
def load_grav_pygimli_plate():

    # Half plate
    thickness = 1
    mesh = pg.createGrid(x=np.linspace(0, 5000),
                         y=[-depth - thickness / 2., -depth + thickness / 2.0])
    pg.show(mesh, ax=ax[0, 1])

    ga = gradUHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
    gza = gradGZHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
    g, gz = solveGravimetry(mesh, rho, pnts, complete=True)

    plot(x, ax[1, 1], ga, gza, ax[2, 1], g, gz)

    labels = ["Horizontal cylinder", "Half plate"]
    for ax, label in zip(ax[0], labels):
        ax.set_title(label)
        ax.set_aspect("equal")
        ax.set_xlim(left=x[0], right=x[-1])
        ax.set_ylim(bottom=-depth * 2, top=1)

    fig.tight_layout()

    return g
x = np.arange(-20, 20.1, .5)
pnts = np.array([x, np.zeros(len(x))]).T

###############################################################################
# Analytical solution first
gz_a = gradUCylinderHoriz(pnts, radius, dRho, pos)[:, 1]

###############################################################################
# Integration for a 2D polygon after :cite:`WonBev1987`
circ = createCircle([0, -depth],
                    radius=radius,
                    marker=2,
                    area=0.1,
                    nSegments=16)
gz_p = solveGravimetry(circ, dRho, pnts, complete=False)

###############################################################################
# Integration for complete 2D mesh after :cite:`WonBev1987`
world = createWorld(start=[-20, 0], end=[20, -10], marker=1)
mesh = createMesh([world, circ])
dRhoC = pg.solver.parseMapToCellArray([[1, 0.0], [2, dRho]], mesh)
gc_m = solveGravimetry(mesh, dRhoC, pnts)

###############################################################################
# Finite Element solution for :math:`u`
world = createWorld(start=[-200, 200], end=[200, -200], marker=1)

# Add some nodes to the measurement points to increase the accuracy a bit
[world.createNode(x_, 0.0, 1) for x_ in x]
plc = world + circ

fig = pg.plt.figure(figsize=(8, 8))
ax = [fig.add_subplot(2, 2, i) for i in range(1, 5)]

# Horizontal cylinder

ga = gradUCylinderHoriz(pnts, radius, rho, pos=pos)
gza = gradGZCylinderHoriz(pnts, radius, rho, pos=pos)

circ = createCircle([0, -depth],
                    radius=radius,
                    marker=2,
                    area=0.1,
                    segments=32)
g, gz = solveGravimetry(circ, rho, pnts, complete=True)

plot(x, ax[0], ga, gza, ax[1], g, gz)

# Half plate

thickness = 0.1

# mesh = pg.createGrid(x=[-2,2], y=[-2,2], z=[-3,-7])
mesh = pg.createGrid(x=np.linspace(0, 5000, 2),
                     y=[-depth - thickness / 2.0, -depth + thickness / 2.0])

ga = gradUHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
gza = gradGZHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
g, gz = solveGravimetry(mesh, rho, pnts, complete=True)
    a2.set_xlabel('$x$-coordinate [m]')
    a2.legend(loc='best')


fig = pg.plt.figure(figsize=(8,8))
ax = [fig.add_subplot(2, 2, i) for i in range(1, 5)]

# Horizontal cylinder

ga = gradUCylinderHoriz(pnts, radius, rho, pos=pos)
gza = gradGZCylinderHoriz(pnts, radius, rho, pos=pos)

circ = createCircle([0, -depth], radius=radius, marker=2, area=0.1,
                    segments=32)
g, gz = solveGravimetry(circ, rho, pnts, complete=True)

plot(x, ax[0], ga, gza, ax[1], g, gz)

# Half plate

thickness = 0.1

# mesh = pg.createGrid(x=[-2,2], y=[-2,2], z=[-3,-7])
mesh = pg.createGrid(x=np.linspace(0, 5000, 2),
                     y=[-depth-thickness/2.0, -depth+thickness/2.0])

ga = gradUHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
gza = gradGZHalfPlateHoriz(pnts, thickness, rho, pos=[0, -depth])
g, gz = solveGravimetry(mesh, rho, pnts, complete=True)
Example #10
0
depth = 5.   # [m]
pos = [0., -depth]
dRho = 100

x = np.arange(-20, 20.1, .5)
pnts = np.array([x, np.zeros(len(x))]).T

###############################################################################
# Analytical solution first
gz_a = gradUCylinderHoriz(pnts, radius, dRho, pos)[:, 1]

###############################################################################
# Integration for a 2D polygon after :cite:`WonBev1987`
circ = createCircle([0, -depth], radius=radius, marker=2, area=0.1,
                    segments=16)
gz_p = solveGravimetry(circ, dRho, pnts, complete=False)

###############################################################################
# Integration for complete 2D mesh after :cite:`WonBev1987`
world = createWorld(start=[-20, 0], end=[20, -10], marker=1)
mesh = createMesh([world, circ])
dRhoC = pg.solver.parseMapToCellArray([[1, 0.0], [2, dRho]], mesh)
gc_m = solveGravimetry(mesh, dRhoC, pnts)

###############################################################################
# Finite Element solution for :math:`u`
world = createWorld(start=[-200, 200], end=[200, -200], marker=1)

# Add some nodes to the measurement points to increase the accuracy a bit
[world.createNode(x_, 0.0,  1) for x_ in x]
plc = mergePLC([world, circ])
radius = 2 # [m]
depth = 5 # [m]
x = np.arange(-20, 20.1, 1)
pnts = np.array([x, np.zeros(len(x))]).T
pos = [0, -depth]
dRho = 100

ax1 = pg.plt.subplot(2,1,1)
ax2 = pg.plt.subplot(2,1,2)

# analytical first 
ax1.plot(x, gradUCylinderHoriz(pnts, radius, dRho, pos)[:,1], label='Analytical')

# polygon 
circ = createCircle([0, -depth], radius=radius, marker=2, segments=16)
ax1.plot(x, solveGravimetry(circ, dRho, pnts, complete=False), label='Poly')

# complete cell based mesh
world = createWorld(start=[-20, 0], end=[20, -10], marker=1)
mesh = createMesh([world, circ])
dRhoC = pg.solver.parseMapToCellArray([[1, 0.0], [2, dRho]], mesh)
ax1.plot(x, solveGravimetry(mesh, dRhoC, pnts), label='Mesh')

pg.show([world,  circ], axes=ax2)

# Finite Element way
world = createWorld(start=[-200, 200], end=[200, -200], marker=1)
# add some nodes to the measurement points to increase accuracy a bit
[world.createNode(x_,0.0,  1) for x_ in x]

circ = createCircle([0, -depth], radius=radius, area=0.1, marker=2, segments=16)