def test_around(): "gravmag.prism gravitational results are consistent around the prism" funcs = ['potential', 'gx', 'gy', 'gz', 'gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz'] model = [Prism(-300, 300, -300, 300, -300, 300, {'density': 1000})] # Make the computation points surround the prism shape = (101, 101) area = [-600, 600, -600, 600] distance = 310 grids = [gridder.regular(area, shape, z=-distance), gridder.regular(area, shape, z=distance), gridder.regular(area, shape, z=distance)[::-1], gridder.regular(area, shape, z=-distance)[::-1], np.array(gridder.regular(area, shape, z=distance))[[0, 2, 1]], np.array(gridder.regular(area, shape, z=-distance))[[0, 2, 1]]] xp, yp, zp = grids[0] # Test if each component is consistent # POTENTIAL face = [prism.potential(x, y, z, model) for x, y, z in grids] for i in range(6): for j in range(i + 1, 6): assert_almost(face[i], face[j], 10, 'Failed potential, faces %d and %d' % (i, j)) # GX top, bottom, north, south, east, west = [prism.gx(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 10, 'Failed gx, top and bottom') assert_almost(north, -south, 10, 'Failed gx, north and south') assert_almost(east, west, 10, 'Failed gx, east and west') assert_almost(east, top, 10, 'Failed gx, east and top') assert_almost(north, -prism.gz(xp, yp, zp, model), 10, 'Failed gx, north and gz') assert_almost(south, prism.gz(xp, yp, zp, model), 10, 'Failed gx, south and gz') # GY top, bottom, north, south, east, west = [prism.gy(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 10, 'Failed gy, top and bottom') assert_almost(north, south, 10, 'Failed gy, north and south') assert_almost(east, -west, 10, 'Failed gy, east and west') assert_almost(north, top, 10, 'Failed gy, north and top') assert_almost(east, -prism.gz(xp, yp, zp, model), 10, 'Failed gy, east and gz') assert_almost(west, prism.gz(xp, yp, zp, model), 10, 'Failed gy, west and gz') # GZ top, bottom, north, south, east, west = [prism.gz(x, y, z, model) for x, y, z in grids] assert_almost(top, -bottom, 10, 'Failed gz, top and bottom') assert_almost(north, south, 10, 'Failed gz, north and south') assert_almost(east, west, 10, 'Failed gz, east and west') assert_almost(north, prism.gx(xp, yp, zp, model), 10, 'Failed gz, north and gx') assert_almost(south, prism.gx(xp, yp, zp, model), 10, 'Failed gz, south and gx') assert_almost(east, prism.gy(xp, yp, zp, model), 10, 'Failed gz, east and gy') assert_almost(west, prism.gy(xp, yp, zp, model), 10, 'Failed gz, west and gy') # GXX top, bottom, north, south, east, west = [prism.gxx(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 10, 'Failed gxx, top and bottom') assert_almost(north, south, 10, 'Failed gxx, north and south') assert_almost(east, west, 10, 'Failed gxx, east and west') assert_almost(east, top, 10, 'Failed gxx, east and top') assert_almost(north, prism.gzz(xp, yp, zp, model), 10, 'Failed gxx, north and gzz') assert_almost(south, prism.gzz(xp, yp, zp, model), 10, 'Failed gxx, south and gzz') # GXY top, bottom, north, south, east, west = [prism.gxy(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 4, 'Failed gxy, top and bottom') assert_almost(north, -south, 10, 'Failed gxy, north and south') assert_almost(east, -west, 10, 'Failed gxy, east and west') assert_almost(north, -prism.gyz(xp, yp, zp, model), 10, 'Failed gxy, north and gyz') assert_almost(south, prism.gyz(xp, yp, zp, model), 10, 'Failed gxy, south and gyz') # GXZ top, bottom, north, south, east, west = [prism.gxz(x, y, z, model) for x, y, z in grids] assert_almost(top, -bottom, 10, 'Failed gxz, top and bottom') assert_almost(north, -south, 10, 'Failed gxz, north and south') assert_almost(east, west, 4, 'Failed gxz, east and west') assert_almost(bottom, north, 10, 'Failed gxz, bottom and north') assert_almost(top, south, 10, 'Failed gxz, top and south') assert_almost(east, prism.gxy(xp, yp, zp, model), 4, 'Failed gxz, east and gxy') assert_almost(west, prism.gxy(xp, yp, zp, model), 10, 'Failed gxz, west and gxy') # GYY top, bottom, north, south, east, west = [prism.gyy(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 10, 'Failed gyy, top and bottom') assert_almost(north, south, 10, 'Failed gyy, north and south') assert_almost(east, west, 10, 'Failed gyy, east and west') assert_almost(top, north, 10, 'Failed gyy, top and north') assert_almost(east, prism.gzz(xp, yp, zp, model), 10, 'Failed gyy, east and gzz') assert_almost(west, prism.gzz(xp, yp, zp, model), 10, 'Failed gyy, west and gzz') # GYZ top, bottom, north, south, east, west = [prism.gyz(x, y, z, model) for x, y, z in grids] assert_almost(top, -bottom, 10, 'Failed gyz, top and bottom') assert_almost(north, south, 4, 'Failed gyz, north and south') assert_almost(east, -west, 10, 'Failed gyz, east and west') assert_almost(top, west, 10, 'Failed gyz, top and west') assert_almost(bottom, east, 10, 'Failed gyz, bottom and east') assert_almost(north, prism.gxy(xp, yp, zp, model), 4, 'Failed gyz, north and gxy') assert_almost(south, prism.gxy(xp, yp, zp, model), 10, 'Failed gyz, south and gxy') # GZZ top, bottom, north, south, east, west = [prism.gzz(x, y, z, model) for x, y, z in grids] assert_almost(top, bottom, 10, 'Failed gzz, top and bottom') assert_almost(north, south, 10, 'Failed gzz, north and south') assert_almost(east, west, 10, 'Failed gzz, east and west') assert_almost(north, prism.gxx(xp, yp, zp, model), 10, 'Failed gzz, north and gxx') assert_almost(south, prism.gxx(xp, yp, zp, model), 10, 'Failed gzz, south and gxx') assert_almost(east, prism.gyy(xp, yp, zp, model), 10, 'Failed gzz, east and gyy') assert_almost(west, prism.gyy(xp, yp, zp, model), 10, 'Failed gzz, west and gyy')
from fatiando.gravmag import prism, harvester from fatiando.mesher import Prism, PrismMesh, vremove from fatiando.vis import mpl, myv # Create a synthetic model props = {'density':1000} model = [Prism(400, 600, 300, 500, 200, 400, props), Prism(400, 600, 400, 600, 400, 600, props), Prism(400, 600, 500, 700, 600, 800, props)] # and generate synthetic data from it shape = (51, 51) bounds = [0, 1000, 0, 1000, 0, 1000] area = bounds[0:4] xp, yp, zp = gridder.regular(area, shape, z=-150) noise = 0.5 gxx = utils.contaminate(prism.gxx(xp, yp, zp, model), noise) gxy = utils.contaminate(prism.gxy(xp, yp, zp, model), noise) gxz = utils.contaminate(prism.gxz(xp, yp, zp, model), noise) gyy = utils.contaminate(prism.gyy(xp, yp, zp, model), noise) gyz = utils.contaminate(prism.gyz(xp, yp, zp, model), noise) gzz = utils.contaminate(prism.gzz(xp, yp, zp, model), noise) tensor = [gxx, gxy, gxz, gyy, gyz, gzz] titles = ['gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz'] # plot the data mpl.figure() for i in xrange(len(tensor)): mpl.subplot(2, 3, i + 1) mpl.title(titles[i]) mpl.axis('scaled') levels = mpl.contourf(yp, xp, tensor[i], shape, 30) mpl.colorbar()
using 3D model """ from fatiando import mesher, gridder from fatiando.gravmag import prism from fatiando.vis import mpl, myv model = [mesher.Prism(-4000,-3000,-4000,-3000,0,2000,{'density':1000}), mesher.Prism(-1000,1000,-1000,1000,0,2000,{'density':-900}), mesher.Prism(2000,4000,3000,4000,0,2000,{'density':1300})] shape = (100,100) xp, yp, zp = gridder.regular((-5000, 5000, -5000, 5000), shape, z=-150) fields = [prism.potential(xp, yp, zp, model), prism.gx(xp, yp, zp, model), prism.gy(xp, yp, zp, model), prism.gz(xp, yp, zp, model), prism.gxx(xp, yp, zp, model), prism.gxy(xp, yp, zp, model), prism.gxz(xp, yp, zp, model), prism.gyy(xp, yp, zp, model), prism.gyz(xp, yp, zp, model), prism.gzz(xp, yp, zp, model)] titles = ['potential', 'gx', 'gy', 'gz', 'gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz'] mpl.figure(figsize=(8, 9)) mpl.subplots_adjust(left=0.03, right=0.95, bottom=0.05, top=0.92, hspace=0.3) mpl.suptitle("Potential fields produced by a 3 prism model") for i, field in enumerate(fields): mpl.subplot(4, 3, i + 3) mpl.axis('scaled') mpl.title(titles[i]) levels = mpl.contourf(yp*0.001, xp*0.001, field, shape, 15)
def test_gxx(): "gravmag.prism.gxx python vs cython implementation" py = _prism_numpy.gxx(xp, yp, zp, model) cy = prism.gxx(xp, yp, zp, model) diff = np.abs(py - cy) assert np.all(diff <= precision), 'max diff: %g' % (max(diff))
def test_gxx(): "polyprism.gxx against prism" resprism = prism.gxx(xp, yp, zp, prismmodel) respoly = polyprism.gxx(xp, yp, zp, model) diff = np.abs(resprism - respoly) assert np.all(diff <= precision), 'max diff: %g' % (max(diff))
""" GravMag: Center of mass estimation using the first eigenvector of the gravity gradient tensor (simple model) """ from fatiando.vis import mpl, myv from fatiando import mesher, gridder, utils from fatiando.gravmag import prism, tensor # Generate some synthetic data model = [mesher.Prism(-1000, 1000, -1000, 1000, 1000, 3000, {'density': 1000})] shape = (100, 100) xp, yp, zp = gridder.regular((-5000, 5000, -5000, 5000), shape, z=-150) noise = 2 data = [ utils.contaminate(prism.gxx(xp, yp, zp, model), noise), utils.contaminate(prism.gxy(xp, yp, zp, model), noise), utils.contaminate(prism.gxz(xp, yp, zp, model), noise), utils.contaminate(prism.gyy(xp, yp, zp, model), noise), utils.contaminate(prism.gyz(xp, yp, zp, model), noise), utils.contaminate(prism.gzz(xp, yp, zp, model), noise) ] # Plot the data titles = ['gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz'] mpl.figure() for i, title in enumerate(titles): mpl.subplot(3, 2, i + 1) mpl.title(title) mpl.axis('scaled') levels = mpl.contourf(yp, xp, data[i], shape, 10) mpl.contour(yp, xp, data[i], shape, levels) mpl.m2km()
from fatiando.gravmag import prism from fatiando.vis import mpl, myv model = [ mesher.Prism(-4000, -3000, -4000, -3000, 0, 2000, {'density': 1000}), mesher.Prism(-1000, 1000, -1000, 1000, 0, 2000, {'density': -900}), mesher.Prism(2000, 4000, 3000, 4000, 0, 2000, {'density': 1300}) ] shape = (100, 100) xp, yp, zp = gridder.regular((-5000, 5000, -5000, 5000), shape, z=-150) fields = [ prism.potential(xp, yp, zp, model), prism.gx(xp, yp, zp, model), prism.gy(xp, yp, zp, model), prism.gz(xp, yp, zp, model), prism.gxx(xp, yp, zp, model), prism.gxy(xp, yp, zp, model), prism.gxz(xp, yp, zp, model), prism.gyy(xp, yp, zp, model), prism.gyz(xp, yp, zp, model), prism.gzz(xp, yp, zp, model) ] titles = [ 'potential', 'gx', 'gy', 'gz', 'gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz' ] mpl.figure(figsize=(8, 9)) mpl.subplots_adjust(left=0.03, right=0.95, bottom=0.05, top=0.92, hspace=0.3) mpl.suptitle("Potential fields produced by a 3 prism model") for i, field in enumerate(fields): mpl.subplot(4, 3, i + 3) mpl.axis('scaled')