(0.4, '#fcae91'), (0.6, '#fb6a4a'), (0.8, '#de2d26'), (1.0, '#a50f15')], gamma=0.5) cmap_red.set_bad('w', alpha=0.0) d2r = np.pi / 180. r2d = 180. / np.pi f_lon, f_lat = 30., 30. f_kappa = 20. w_lon, w_lat = 90., 70. w_kappa = -5. vmf = mcplates.VonMisesFisher('vmf', lon_lat=(f_lon, f_lat), kappa=f_kappa) watson = mcplates.WatsonGirdle('watson', lon_lat=(w_lon, w_lat), kappa=w_kappa) uniform = mcplates.VonMisesFisher('watson', lon_lat=(0, 0), kappa=0.) vmf_samples = np.array([vmf.random() for i in range(50)]) wat_samples = np.array([watson.random() for i in range(200)]) u_samples = np.array([uniform.random() for i in range(200)]) reg_lat = np.linspace(-np.pi / 2., np.pi / 2., 181, endpoint=True) * 180. / np.pi reg_lon = np.linspace(0., 2. * np.pi, 361, endpoint=True) * 180. / np.pi mesh_lon, mesh_lat = np.meshgrid(reg_lon, reg_lat) uniform_vals = np.empty_like(mesh_lon) fisher_vals = np.empty_like(mesh_lon) watson_vals = np.empty_like(mesh_lon) for i, lat in enumerate(reg_lat): for j, lon in enumerate(reg_lon):
import numpy as np import matplotlib.pyplot as plt import pymc import cartopy.crs as ccrs import mcplates d2r = np.pi / 180. r2d = 180. / np.pi mu_lat = 30. mu_lon = 30. kappa = 50.0 vmf = mcplates.VonMisesFisher('vmf', lon_lat=(mu_lon, mu_lat), kappa=kappa) samples = np.array([vmf.random() for i in range(100)]) print samples phi = samples[:, 0] theta = samples[:, 1] ax = plt.axes(projection=ccrs.Orthographic(30, 30)) ax.scatter(phi, theta, transform=ccrs.PlateCarree()) ax.gridlines() ax.set_global() plt.show()
def generate_data_samples(): if os.path.isfile('euler_pole_samples.txt'): data = np.loadtxt('euler_pole_samples.txt') lon_samples = data[:, 0] lat_samples = data[:, 1] val_samples = data[:, 2] else: plate_id_to_code = { 0: 'an', 1: 'au', 2: 'nb', 3: 'pa', 4: 'eu', 5: 'na', 6: 'nz', 7: 'co', 8: 'ca', 9: 'ar', 10: 'ps', 11: 'sa', 12: 'in', 13: 'jf' } morvel = pd.read_table("NNR-MORVEL56.txt", delim_whitespace=True).set_index('Abbreviation') plate_data = np.loadtxt("WhichPlate.dat") vals = plate_data[:, 2] nlons = 256 nlats = 128 dlon = 360. / nlons dlat = 180. / nlats vals = vals.reshape(nlats, nlons) n_samples = 1000 val_samples = np.zeros(n_samples) lon_samples = np.zeros(n_samples) lat_samples = np.zeros(n_samples) uniform_lon_lat_sampler = mcplates.VonMisesFisher('lon_lat_sampler', lon_lat=(0., 0.), kappa=0.) i = 0 while i < n_samples: sample = uniform_lon_lat_sampler.random() lon = sample[0] lat = sample[1] try: lon_index = int(np.floor(lon / dlon)) lat_index = int(np.floor((90. - lat) / dlat)) plate_id = vals[lat_index, lon_index] plate_code = plate_id_to_code[plate_id] elat = morvel['Latitude'][plate_code] elon = morvel['Longitude'][plate_code] evec = mcplates.rotations.spherical_to_cartesian( elon, elat, 1.) x = mcplates.rotations.spherical_to_cartesian(lon, lat, 1.) lon_samples[i] = lon lat_samples[i] = lat val_samples[i] = np.arccos(np.dot(x, evec)) * 180. / np.pi i += 1 except KeyError: continue np.savetxt('euler_pole_samples.txt', list(zip(lon_samples, lat_samples, val_samples))) return lon_samples, lat_samples, val_samples
euler_pole_1 = mcplates.EulerPole(euler_1[0], euler_1[1], rate_1) euler_pole_2 = mcplates.EulerPole(euler_2[0], euler_2[1], rate_2) start_pole = mcplates.PaleomagneticPole(start[0], start[1], age=time) if time <= switchpoint: start_pole.rotate(euler_pole_1, euler_pole_1.rate * time) else: start_pole.rotate(euler_pole_1, euler_pole_1.rate * switchpoint) start_pole.rotate(euler_pole_2, euler_pole_2.rate * (time - switchpoint)) lon_lat = np.array([start_pole.longitude, start_pole.latitude]) return lon_lat euler_1 = mcplates.VonMisesFisher('euler_1', lon_lat=(0., 0.), kappa=0.00) rate_1 = pymc.Exponential('rate_1', 1.) euler_2 = mcplates.VonMisesFisher('euler_2', lon_lat=(0., 0.), kappa=0.00) rate_2 = pymc.Exponential('rate_2', 1.) start = mcplates.VonMisesFisher('start', lon_lat=lon_lats[0], kappa=mcplates.kappa_from_two_sigma(10.)) switchpoint = pymc.Uniform('switchpoint', ages[0], ages[-1]) model_vars = [euler_1, rate_1, euler_2, rate_2, start, switchpoint] for i in range(len(ages)): time = pymc.Normal('t' + str(i), mu=ages[i], tau=age_taus[i]) lon_lat = pymc.Lambda('ll'+str(i), lambda st=start, e1=euler_1, r1=rate_1, e2=euler_2, r2=rate_2, sw=switchpoint, t=time : \ pole_position(st, e1, r1, e2, r2, sw, t),\