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
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
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
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
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)
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)