def test_define_constant_layer_velocity(self): """ Should flood a layer with one velocity """ vm = VM() vm.insert_interface(5) vm.define_constant_layer_velocity(0, vel=8.5) self.assertAlmostEqual(vm.sl[0, 0, 0], 1. / 8.5, 6) vm.define_constant_layer_velocity(1, vel=9.5) self.assertAlmostEqual(1. / np.min(vm.sl), 9.5, 6)
def test_define_stretched_layer_velocities(self): """ Should stretch a velocity function to fit within a layer """ vm = VM() vm.insert_interface(5) vm.define_stretched_layer_velocities(0, vel=[1.500, 1.500]) self.assertAlmostEqual(vm.sl[0, 0, 0], 1. / 1.5, 7) vm.define_stretched_layer_velocities(1, vel=[None, 8.1]) self.assertAlmostEqual(1. / np.min(vm.sl), 8.1, 6)
def test_define_constant_layer_gradient(self): """ Should define a constant layer gradient in a layer """ vm = VM() vm.insert_interface(5) vm.define_constant_layer_gradient(0, 0, v0=1.500) self.assertAlmostEqual(vm.sl[0, 0, 0], 1. / 1.5, 7) vm.define_constant_layer_gradient(1, 0.1, v0=3.0) self.assertAlmostEqual(1. / np.min(vm.sl), 15.19999945, 7)
def test_fix_pinchouts(self): """ Should fix layer pinchouts so that boundaries do not cross """ vm = VM() z = np.reshape(2 + 0.05*(vm.grid.x),(vm.nx,1)) vm.insert_interface(z) vm.insert_interface(6) nerror0 = len(np.nonzero((vm.rf[1] - vm.rf[0]) < 0)[0]) assert nerror0 > 0 # should fix crossings and pinchouts vm.fix_pinchouts() nerror = len(np.nonzero((vm.rf[1] - vm.rf[0]) < 0)[0]) self.assertEqual(nerror, 0)
def test_fix_pinchouts(self): """ Should fix layer pinchouts so that boundaries do not cross """ vm = VM() z = np.reshape(2 + 0.05 * (vm.grid.x), (vm.nx, 1)) vm.insert_interface(z) vm.insert_interface(6) nerror0 = len(np.nonzero((vm.rf[1] - vm.rf[0]) < 0)[0]) assert nerror0 > 0 # should fix crossings and pinchouts vm.fix_pinchouts() nerror = len(np.nonzero((vm.rf[1] - vm.rf[0]) < 0)[0]) self.assertEqual(nerror, 0)
def test_insert_interface(self): """ Should insert a new interface """ # Initialize a new model vm = VM(r1=(0, 0, 0), r2=(50, 0, 30), dx=0.5, dy=0.5, dz=0.5) # Should add a new, flat interface at 10 km z0 = 10. vm.insert_interface(z0 * np.ones((vm.nx, vm.ny))) self.assertEqual(vm.nr, 1) self.assertEqual(vm.rf[0].min(), z0) self.assertEqual(vm.rf[0].max(), z0) # New interfaces should have jp=0 self.assertEqual(vm.jp[0].min(), 0) self.assertEqual(vm.jp[0].max(), 0) # New layers should have ir and ij = index of new interface self.assertEqual(vm.ir[0].min(), 0) self.assertEqual(vm.ir[0].max(), 0) self.assertEqual(vm.ij[0].min(), 0) self.assertEqual(vm.ij[0].max(), 0) # Adding a new interface should increase ir and ij of deeper layers for z0 in [5., 15., 1., 20.]: vm.insert_interface(z0 * np.ones((vm.nx, vm.ny))) for iref in range(0, vm.nr): self.assertEqual(vm.ir[iref].min(), iref) self.assertEqual(vm.ir[iref].max(), iref) self.assertEqual(vm.ij[iref].min(), iref) self.assertEqual(vm.ij[iref].max(), iref) # should take a scalar value for a constant depth interface vm = VM(r1=(0, 0, 0), r2=(50, 0, 30), dx=0.5, dy=0.5, dz=0.5) z0 = 10. vm.insert_interface(z0) self.assertEqual(vm.nr, 1) self.assertEqual(vm.rf[0].min(), z0) self.assertEqual(vm.rf[0].max(), z0)
def dev_readwrite_interface_flags(self): """ Should handle Fortran vs. Python indexing for interface flags """ sl = np.random.rand(8, 1, 12) vm = VM(sl=sl) vm.insert_interface(1) vm.ir = np.zeros((1, vm.nx, vm.ny)) vm.ij = np.zeros((1, vm.nx, vm.ny)) fname = 'temp_out.vm' if os.path.isfile(fname): os.remove(fname) vm.write(fname) # writing should not change flags for ilyr in range(vm.nr): for ix in range(vm.nx): for iy in range(vm.ny): self.assertEqual(vm.ir[ilyr, ix, iy], 0) self.assertEqual(vm.ij[ilyr, ix, iy], 0) # read should handle -1 for indexing vm1 = VM(fname) for ilyr in range(vm1.nr): for ix in range(vm1.nx): for iy in range(vm1.ny): self.assertEqual(vm1.ir[ilyr, ix, iy], 0) self.assertEqual(vm1.ij[ilyr, ix, iy], 0) # clean up if os.path.isfile(fname): os.remove(fname)
""" Build a simple VM model from scratch """ import numpy as np from pyvm.models.vm import VM # create a 2D model vm = VM(shape=(512, 1, 256), spacing=(0.5, 1, 0.1), origin=(412, 412, -2)) # add interfaces vm.insert_interface(0) vm.insert_interface(3) vm.insert_interface(5) vm.insert_interface(12) # add velocities vm.define_constant_layer_velocity(0, 0.333) vm.define_stretched_layer_velocities(1, vel=[1.49, 1.51]) vm.define_stretched_layer_velocities(2, vel=[None, 2.3]) vm.define_stretched_layer_velocities(3, vel=[4.4, 6.8, 6.9, 7.2]) vm.define_constant_layer_gradient(4, 0.1) # plot vm.plot(aspect=10)
z[ix] = z0 + m * (x - x[0]) z0 = z[ix[-1]] # expand into 3D n = np.ones((vm.nx, 1)) for i in range(0, ny): n[i] = z[i] s = np.ones((vm.nx, vm.ny)) for i in range(0, ny): #s = np.hstack((n,n)) s[i, :] = n[i] z = np.array(s) # add the boundary vm.insert_interface(np.reshape(z, (vm.nx, vm.ny))) ## # add some velocities vm.define_constant_layer_velocity(0, 4.0) #surface vm.define_constant_layer_velocity(1, 6.0) #ocean print(vm) # plot vm.plot() # write vm.write('11.11.vm')