示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
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)
示例#8
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)
示例#9
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)
示例#10
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)
示例#11
0
    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)
示例#12
0
"""
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)
示例#13
0
"""
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)
示例#14
0
    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')