def demo_model(preset, **kwargs): """ Utility function to create preset :class:`Model` objects for demonstration and testing purposes. The particular presets are :: * `constant-isotropic` : Constant velocity (1.5km/sec) isotropic model * `constant-tti` : Constant anisotropic model. Velocity is 1.5 km/sec and Thomsen parameters are epsilon=.3, delta=.2, theta = .7rad and phi=.35rad for 3D. 2d/3d is defined from the input shape * 'layers-isotropic': Simple two-layer model with velocities 1.5 km/s and 2.5 km/s in the top and bottom layer respectively. 2d/3d is defined from the input shape * 'layers-tti': Simple two-layer TTI model with velocities 1.5 km/s and 2.5 km/s in the top and bottom layer respectively. Thomsen parameters in the top layer are 0 and in the lower layer are epsilon=.3, delta=.2, theta = .5rad and phi=.1 rad for 3D. 2d/3d is defined from the input shape * 'circle-isotropic': Simple camembert model with velocities 1.5 km/s and 2.5 km/s in a circle at the center. 2D only. * 'marmousi2d-isotropic': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. * 'marmousi2d-tti': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. * 'marmousi3d-tti': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. """ space_order = kwargs.pop('space_order', 2) if preset.lower() in ['constant-elastic']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) vp = kwargs.pop('vp', 1.5) vs = 0.5 * vp rho = 1.0 return ModelElastic(space_order=space_order, vp=vp, vs=vs, rho=rho, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) if preset.lower() in ['constant-isotropic']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) vp = kwargs.pop('vp', 1.5) return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['constant-tti']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) v = np.empty(shape, dtype=dtype) v[:] = 1.5 epsilon = .3 * np.ones(shape, dtype=dtype) delta = .2 * np.ones(shape, dtype=dtype) theta = .7 * np.ones(shape, dtype=dtype) phi = None if len(shape) > 2: phi = .35 * np.ones(shape, dtype=dtype) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) elif preset.lower() in [ 'layers-isotropic', 'twolayer-isotropic', '2layer-isotropic' ]: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 3) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in [ 'layers-elastic', 'twolayer-elastic', '2layer-elastic' ]: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity vs = 0.5 * v[:] rho = v[:] / vp_top return ModelElastic(space_order=space_order, vp=v, vs=vs, rho=rho, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['layers-tti', 'twolayer-tti', '2layer-tti']: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s.\ shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity epsilon = scipy_smooth(.3 * (v - 1.5)) delta = scipy_smooth(.2 * (v - 1.5)) theta = scipy_smooth(.5 * (v - 1.5)) phi = None if len(shape) > 2: phi = scipy_smooth(.25 * (v - 1.5), shape) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) elif preset.lower() in [ 'layers-tti-noazimuth', 'twolayer-tti-noazimuth', '2layer-tti-noazimuth' ]: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s.\ shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity epsilon = .3 * (v - 1.5) delta = .2 * (v - 1.5) theta = .5 * (v - 1.5) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, **kwargs) elif preset.lower() in ['circle-isotropic']: # A simple circle in a 2D domain with a background velocity. # By default, the circle velocity is 2.5 km/s, # and the background veloity is 3.0 km/s. dtype = kwargs.pop('dtype', np.float32) shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) vp = kwargs.pop('vp', 3.0) vp_background = kwargs.pop('vp_background', 2.5) r = kwargs.pop('r', 15) # Only a 2D preset is available currently assert (len(shape) == 2) v = np.empty(shape, dtype=dtype) v[:] = vp_background a, b = shape[0] / 2, shape[1] / 2 y, x = np.ogrid[-a:shape[0] - a, -b:shape[1] - b] v[x * x + y * y <= r * r] = vp return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['marmousi-isotropic', 'marmousi2d-isotropic']: shape = (1601, 401) spacing = (7.5, 7.5) origin = (0., 0.) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.get('data_path', None) if data_path is None: raise ValueError( "Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'Simple2D/vp_marmousi_bi') v = np.fromfile(path, dtype='float32', sep="") v = v.reshape(shape) # Cut the model to make it slightly cheaper v = v[301:-300, :] return Model(space_order=space_order, vp=v, origin=origin, shape=v.shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['marmousi-elastic', 'marmousi2d-elastic']: shape = (1601, 401) spacing = (7.5, 7.5) origin = (0., 0.) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.get('data_path', None) if data_path is None: raise ValueError( "Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'Simple2D/vp_marmousi_bi') v = np.fromfile(path, dtype='float32', sep="") v = v.reshape(shape) # Cut the model to make it slightly cheaper v = v[301:-300, :] vs = .5 * v[:] rho = v[:] / np.max(v[:]) return ModelElastic(space_order=space_order, vp=v, vs=vs, rho=rho, origin=origin, shape=v.shape, dtype=np.float32, spacing=spacing, nbpml=20) elif preset.lower() in ['marmousi-tti2d', 'marmousi2d-tti']: shape_full = (201, 201, 70) shape = (201, 70) spacing = (10., 10.) origin = (0., 0.) nbpml = kwargs.pop('nbpml', 20) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.pop('data_path', None) if data_path is None: raise ValueError( "Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'marmousi3D/vp_marmousi_bi') # velocity vp = 1e-3 * np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiVP.raw'), dtype='float32', sep="") vp = vp.reshape(shape_full) vp = vp[101, :, :] # Epsilon, in % in file, resale between 0 and 1 epsilon = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiEps.raw'), dtype='float32', sep="") * 1e-2 epsilon = epsilon.reshape(shape_full) epsilon = epsilon[101, :, :] # Delta, in % in file, resale between 0 and 1 delta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiDelta.raw'), dtype='float32', sep="") * 1e-2 delta = delta.reshape(shape_full) delta = delta[101, :, :] # Theta, in degrees in file, resale in radian theta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiTilt.raw'), dtype='float32', sep="") theta = np.float32(np.pi / 180 * theta.reshape(shape_full)) theta = theta[101, :, :] return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, **kwargs) elif preset.lower() in ['marmousi-tti3d', 'marmousi3d-tti']: shape = (201, 201, 70) spacing = (10., 10., 10.) origin = (0., 0., 0.) nbpml = kwargs.pop('nbpml', 20) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.pop('data_path', None) if data_path is None: raise ValueError( "Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'marmousi3D/vp_marmousi_bi') # Velcoity vp = 1e-3 * np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiVP.raw'), dtype='float32', sep="") vp = vp.reshape(shape) # Epsilon, in % in file, resale between 0 and 1 epsilon = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiEps.raw'), dtype='float32', sep="") * 1e-2 epsilon = epsilon.reshape(shape) # Delta, in % in file, resale between 0 and 1 delta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiDelta.raw'), dtype='float32', sep="") * 1e-2 delta = delta.reshape(shape) # Theta, in degrees in file, resale in radian theta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiTilt.raw'), dtype='float32', sep="") theta = np.float32(np.pi / 180 * theta.reshape(shape)) # Phi, in degrees in file, resale in radian phi = np.fromfile(os.path.join(data_path, 'marmousi3D/Azimuth.raw'), dtype='float32', sep="") phi = np.float32(np.pi / 180 * phi.reshape(shape)) return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) else: raise ValueError("Unknown model preset name")
def demo_model(preset, **kwargs): """ Utility function to create preset :class:`Model` objects for demonstration and testing purposes. The particular presets are :: * `constant-isotropic` : Constant velocity (1.5km/sec) isotropic model * `constant-tti` : Constant anisotropic model. Velocity is 1.5 km/sec and Thomsen parameters are epsilon=.3, delta=.2, theta = .7rad and phi=.35rad for 3D. 2d/3d is defined from the input shape * 'layers-isotropic': Simple two-layer model with velocities 1.5 km/s and 2.5 km/s in the top and bottom layer respectively. 2d/3d is defined from the input shape * 'layers-tti': Simple two-layer TTI model with velocities 1.5 km/s and 2.5 km/s in the top and bottom layer respectively. Thomsen parameters in the top layer are 0 and in the lower layer are epsilon=.3, delta=.2, theta = .5rad and phi=.1 rad for 3D. 2d/3d is defined from the input shape * 'circle-isotropic': Simple camembert model with velocities 1.5 km/s and 2.5 km/s in a circle at the center. 2D only. * 'marmousi2d-isotropic': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. * 'marmousi2d-tti': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. * 'marmousi3d-tti': Loads the 2D Marmousi data set from the given filepath. Requires the ``opesci/data`` repository to be available on your machine. """ space_order = kwargs.pop('space_order', 2) if preset.lower() in ['constant-elastic']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) vp = kwargs.pop('vp', 1.5) vs = 0.5 * vp rho = 1.0 return ModelElastic(space_order=space_order, vp=vp, vs=vs, rho=rho, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) if preset.lower() in ['constant-isotropic']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) vp = kwargs.pop('vp', 1.5) return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['constant-tti']: # A constant single-layer model in a 2D or 3D domain # with velocity 1.5km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) dtype = kwargs.pop('dtype', np.float32) v = np.empty(shape, dtype=dtype) v[:] = 1.5 epsilon = .3*np.ones(shape, dtype=dtype) delta = .2*np.ones(shape, dtype=dtype) theta = .7*np.ones(shape, dtype=dtype) phi = None if len(shape) > 2: phi = .35*np.ones(shape, dtype=dtype) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) elif preset.lower() in ['layers-isotropic', 'twolayer-isotropic', '2layer-isotropic']: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 3) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['layers-elastic', 'twolayer-elastic', '2layer-elastic']: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s. shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity vs = 0.5 * v[:] rho = v[:]/vp_top return ModelElastic(space_order=space_order, vp=v, vs=vs, rho=rho, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['layers-tti', 'twolayer-tti', '2layer-tti']: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s.\ shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity epsilon = scipy_smooth(.3*(v - 1.5)) delta = scipy_smooth(.2*(v - 1.5)) theta = scipy_smooth(.5*(v - 1.5)) phi = None if len(shape) > 2: phi = scipy_smooth(.25*(v - 1.5), shape) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) elif preset.lower() in ['layers-tti-noazimuth', 'twolayer-tti-noazimuth', '2layer-tti-noazimuth']: # A two-layer model in a 2D or 3D domain with two different # velocities split across the height dimension: # By default, the top part of the domain has 1.5 km/s, # and the bottom part of the domain has 2.5 km/s.\ shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) dtype = kwargs.pop('dtype', np.float32) nbpml = kwargs.pop('nbpml', 10) ratio = kwargs.pop('ratio', 2) vp_top = kwargs.pop('vp_top', 1.5) vp_bottom = kwargs.pop('vp_bottom', 2.5) # Define a velocity profile in km/s v = np.empty(shape, dtype=dtype) v[:] = vp_top # Top velocity (background) v[..., int(shape[-1] / ratio):] = vp_bottom # Bottom velocity epsilon = .3*(v - 1.5) delta = .2*(v - 1.5) theta = .5*(v - 1.5) return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, **kwargs) elif preset.lower() in ['circle-isotropic']: # A simple circle in a 2D domain with a background velocity. # By default, the circle velocity is 2.5 km/s, # and the background veloity is 3.0 km/s. dtype = kwargs.pop('dtype', np.float32) shape = kwargs.pop('shape', (101, 101)) spacing = kwargs.pop('spacing', tuple([10. for _ in shape])) origin = kwargs.pop('origin', tuple([0. for _ in shape])) nbpml = kwargs.pop('nbpml', 10) vp = kwargs.pop('vp', 3.0) vp_background = kwargs.pop('vp_background', 2.5) r = kwargs.pop('r', 15) # Only a 2D preset is available currently assert(len(shape) == 2) v = np.empty(shape, dtype=dtype) v[:] = vp_background a, b = shape[0] / 2, shape[1] / 2 y, x = np.ogrid[-a:shape[0]-a, -b:shape[1]-b] v[x*x + y*y <= r*r] = vp return Model(space_order=space_order, vp=v, origin=origin, shape=shape, dtype=dtype, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['marmousi-isotropic', 'marmousi2d-isotropic']: shape = (1601, 401) spacing = (7.5, 7.5) origin = (0., 0.) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.get('data_path', None) if data_path is None: raise ValueError("Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'Simple2D/vp_marmousi_bi') v = np.fromfile(path, dtype='float32', sep="") v = v.reshape(shape) # Cut the model to make it slightly cheaper v = v[301:-300, :] return Model(space_order=space_order, vp=v, origin=origin, shape=v.shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, **kwargs) elif preset.lower() in ['marmousi-elastic', 'marmousi2d-elastic']: shape = (1601, 401) spacing = (7.5, 7.5) origin = (0., 0.) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.get('data_path', None) if data_path is None: raise ValueError("Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'Simple2D/vp_marmousi_bi') v = np.fromfile(path, dtype='float32', sep="") v = v.reshape(shape) # Cut the model to make it slightly cheaper v = v[301:-300, :] vs = .5 * v[:] rho = v[:]/mmax(v[:]) return ModelElastic(space_order=space_order, vp=v, vs=vs, rho=rho, origin=origin, shape=v.shape, dtype=np.float32, spacing=spacing, nbpml=20) elif preset.lower() in ['marmousi-tti2d', 'marmousi2d-tti']: shape_full = (201, 201, 70) shape = (201, 70) spacing = (10., 10.) origin = (0., 0.) nbpml = kwargs.pop('nbpml', 20) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.pop('data_path', None) if data_path is None: raise ValueError("Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'marmousi3D/vp_marmousi_bi') # velocity vp = 1e-3 * np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiVP.raw'), dtype='float32', sep="") vp = vp.reshape(shape_full) vp = vp[101, :, :] # Epsilon, in % in file, resale between 0 and 1 epsilon = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiEps.raw'), dtype='float32', sep="") * 1e-2 epsilon = epsilon.reshape(shape_full) epsilon = epsilon[101, :, :] # Delta, in % in file, resale between 0 and 1 delta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiDelta.raw'), dtype='float32', sep="") * 1e-2 delta = delta.reshape(shape_full) delta = delta[101, :, :] # Theta, in degrees in file, resale in radian theta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiTilt.raw'), dtype='float32', sep="") theta = np.float32(np.pi / 180 * theta.reshape(shape_full)) theta = theta[101, :, :] return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, **kwargs) elif preset.lower() in ['marmousi-tti3d', 'marmousi3d-tti']: shape = (201, 201, 70) spacing = (10., 10., 10.) origin = (0., 0., 0.) nbpml = kwargs.pop('nbpml', 20) # Read 2D Marmousi model from opesc/data repo data_path = kwargs.pop('data_path', None) if data_path is None: raise ValueError("Path to opesci/data not found! Please specify with " "'data_path=<path/to/opesci/data>'") path = os.path.join(data_path, 'marmousi3D/vp_marmousi_bi') # Velcoity vp = 1e-3 * np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiVP.raw'), dtype='float32', sep="") vp = vp.reshape(shape) # Epsilon, in % in file, resale between 0 and 1 epsilon = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiEps.raw'), dtype='float32', sep="") * 1e-2 epsilon = epsilon.reshape(shape) # Delta, in % in file, resale between 0 and 1 delta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiDelta.raw'), dtype='float32', sep="") * 1e-2 delta = delta.reshape(shape) # Theta, in degrees in file, resale in radian theta = np.fromfile(os.path.join(data_path, 'marmousi3D/MarmousiTilt.raw'), dtype='float32', sep="") theta = np.float32(np.pi / 180 * theta.reshape(shape)) # Phi, in degrees in file, resale in radian phi = np.fromfile(os.path.join(data_path, 'marmousi3D/Azimuth.raw'), dtype='float32', sep="") phi = np.float32(np.pi / 180 * phi.reshape(shape)) return Model(space_order=space_order, vp=vp, origin=origin, shape=shape, dtype=np.float32, spacing=spacing, nbpml=nbpml, epsilon=epsilon, delta=delta, theta=theta, phi=phi, **kwargs) else: raise ValueError("Unknown model preset name")