def example(): """ example that plots the power spectrum of Mars topography data """ # --- input data filename --- infile = '../../ExampleDataFiles/MarsTopo719.shape' coeffs, lmax = shtools.SHRead(infile, 719) lmax = coeffs.shape[1] - 1 # --- plot grid --- grid = shtools.MakeGridDH(coeffs, lmax, csphase=-1) fig_map = plt.figure() plt.imshow(grid) # ---- compute spectrum ---- ls = np.arange(lmax + 1) pspectrum = shtools.SHPowerSpectrum(coeffs) pdensity = shtools.SHPowerSpectrumDensity(coeffs) # ---- plot spectrum ---- fig_spectrum, ax = plt.subplots(1, 1) ax.set_xscale('log') ax.set_yscale('log') ax.set_xlabel('degree l') ax.grid(True, which='both') ax.plot(ls[1:], pspectrum[1:], label='power per degree l') ax.plot(ls[1:], pdensity[1:], label='power per degree l and order m') ax.legend() fig_map.savefig('SHCtopography_mars.png') fig_spectrum.savefig('SHCspectrum_mars.png') print('mars topography and spectrum saved')
def example(): print('---- SHrtoc example ----') # --- input data filename --- infile = '../../ExampleDataFiles/MarsTopo719.shape' coeffs1, lmax = shtools.SHRead(infile, 719) coeffs1 = coeffs1[:, :lmax + 1, :lmax + 1] # --- convert to complex coefficients, fill negative order coefficients --- coeffs2 = np.empty((2, lmax + 1, lmax + 1), dtype=np.complex) coeffs2_buf = shtools.SHrtoc(coeffs1, convention=1, switchcs=0) coeffs2[0, :, :].real = coeffs2_buf[0, :, :] coeffs2[0, :, :].imag = coeffs2_buf[1, :, :] coeffs2[1] = (coeffs2[0].conjugate() * ((-1)**np.arange(lmax + 1))[np.newaxis, :]) # --- compute and plot grid --- grid1 = shtools.MakeGridDH(coeffs1, lmax, csphase=-1) grid2 = shtools.MakeGridDHC(coeffs2, lmax, csphase=-1) gridmin = min(grid1.min(), grid2.real.min()) gridmax = max(grid1.max(), grid2.real.max()) norm = plt.Normalize(gridmin, gridmax) fig, axes = plt.subplots(1, 2) im1 = axes[0].imshow(grid1, norm=norm) axes[0].set_title('from real coefficients') im2 = axes[1].imshow(grid2.real, norm=norm) axes[1].set_title('from complex coefficients') fig.tight_layout(pad=1) fig.savefig('topography_mars.png') print('mars topography plotted and saved to file')
def TimingAccuracyDH(sampling=1): # ---- input parameters ---- maxdeg = 2800 ls = np.arange(maxdeg + 1) beta = 1.5 print('Driscoll-Healy (real) sampling =', sampling) # ---- create mask to filter out m<=l ---- mask = np.zeros((2, maxdeg + 1, maxdeg + 1), dtype=np.bool) mask[0, 0, 0] = True for l in ls: mask[:, l, :l + 1] = True mask[1, :, 0] = False # ---- create Gaussian powerlaw coefficients ---- print('creating {:d} random coefficients'.format(2 * (maxdeg + 1) * (maxdeg + 1))) np.random.seed(0) cilm = np.random.normal(loc=0., scale=1., size=(2, maxdeg + 1, maxdeg + 1)) old_power = shtools.SHPowerSpectrum(cilm) new_power = 1. / (1. + ls)**beta # initialize degrees > 0 to power-law cilm[:, :, :] *= np.sqrt(new_power / old_power)[None, :, None] cilm[~mask] = 0. # ---- time spherical harmonics transform for lmax set to increasing # ---- powers of 2. lmax = 2 print('lmax maxerror rms tinverse tforward') while lmax <= maxdeg: # trim coefficients to lmax cilm_trim = cilm[:, :lmax + 1, :lmax + 1] mask_trim = mask[:, :lmax + 1, :lmax + 1] # synthesis / inverse tstart = time.time() grid = shtools.MakeGridDH(cilm_trim, sampling=sampling) tend = time.time() tinverse = tend - tstart # analysis / forward tstart = time.time() cilm2_trim = shtools.SHExpandDH(grid, sampling=sampling) tend = time.time() tforward = tend - tstart # compute error err = np.abs(cilm_trim[mask_trim] - cilm2_trim[mask_trim]) / \ np.abs(cilm_trim[mask_trim]) maxerr = err.max() rmserr = np.mean(err**2) print('{:4d} {:1.2e} {:1.2e} {:1.1e}s {:1.1e}s'.format( lmax, maxerr, rmserr, tinverse, tforward)) lmax = lmax * 2
def TestCrustalThickness(): """ Example routine that calculates the crustal thickness of Mars """ delta_max = 5.0 nmax = 6 degmax = 50 lmax = 200 rho_c = 2900.0 rho_m = 3500.0 filter_type = 0 half = 0 gravfile = '../../ExampleDataFiles/jgmro_110b_sha.tab' pot, lmaxp, header = shtools.SHReadH(gravfile, degmax, 2) gm = header[1] * 1.e9 mass = gm / constant.grav_constant r_grav = header[0] * 1.e3 print(r_grav, gm, mass, lmaxp) topofile = '../../ExampleDataFiles/MarsTopo719.shape' hlm, lmaxt = shtools.SHRead(topofile, 719) r0 = hlm[0, 0, 0] d = r0 - 45.217409924028445e3 print(r0, lmaxt) for l in range(2, lmaxp + 1): pot[:, l, :l + 1] = pot[:, l, :l + 1] * (r_grav / r0)**l topo_grid = shtools.MakeGridDH(hlm, lmax=lmax, sampling=2, lmax_calc=degmax) print("Maximum radius (km) = ", topo_grid.max() / 1.e3) print("Minimum radius (km) = ", topo_grid.min() / 1.e3) bc, r0 = shtools.CilmPlusDH(topo_grid, nmax, mass, rho_c, lmax=degmax) ba = pot - bc moho_c = np.zeros([2, degmax + 1, degmax + 1], dtype=float) moho_c[0, 0, 0] = d for l in range(1, degmax + 1): if filter_type == 0: moho_c[:, l, :l + 1] = ba[:, l, :l + 1] * mass * (2 * l + 1) * \ ((r0 / d)**l) \ / (4.0 * np.pi * (rho_m - rho_c) * d**2) elif filter_type == 1: moho_c[:, l, :l + 1] = DownContFilterMA(l, half, r0, d) * \ ba[:, l, :l + 1] * mass * (2 * l + 1) * \ ((r0 / d)**l) / \ (4.0 * np.pi * (rho_m - rho_c) * d**2) else: moho_c[:, l, :l + 1] = DownContFilterMC(l, half, r0, d) * \ ba[:, l, :l + 1] * mass * (2 * l + 1) *\ ((r0 / d)**l) / \ (4.0 * np.pi * (rho_m - rho_c) * d**2) moho_grid3 = shtools.MakeGridDH(moho_c, lmax=lmax, sampling=2, lmax_calc=degmax) print('Maximum Crustal thickness (km) = ', (topo_grid - moho_grid3).max() / 1.e3) print('Minimum Crustal thickness (km) = ', (topo_grid - moho_grid3).min() / 1.e3) moho_c = shtools.BAtoHilmDH(ba, moho_grid3, nmax, mass, r0, (rho_m - rho_c), lmax=lmax, filter_type=filter_type, filter_deg=half, lmax_calc=degmax) moho_grid2 = shtools.MakeGridDH(moho_c, lmax=lmax, sampling=2, lmax_calc=degmax) print('Delta (km) = ', abs(moho_grid3 - moho_grid2).max() / 1.e3) temp_grid = topo_grid - moho_grid2 print('Maximum Crustal thickness (km) = ', temp_grid.max() / 1.e3) print('Minimum Crustal thickness (km) = ', temp_grid.min() / 1.e3) iter = 0 delta = 1.0e9 while delta > delta_max: iter += 1 print('Iteration ', iter) moho_grid = (moho_grid2 + moho_grid3) / 2.0 print("Delta (km) = ", abs(moho_grid - moho_grid2).max() / 1.e3) temp_grid = topo_grid - moho_grid print('Maximum Crustal thickness (km) = ', temp_grid.max() / 1.e3) print('Minimum Crustal thickness (km) = ', temp_grid.min() / 1.e3) moho_grid3 = moho_grid2 moho_grid2 = moho_grid iter += 1 print('Iteration ', iter) moho_c = shtools.BAtoHilmDH(ba, moho_grid2, nmax, mass, r0, rho_m - rho_c, lmax=lmax, filter_type=filter_type, filter_deg=half, lmax_calc=degmax) moho_grid = shtools.MakeGridDH(moho_c, lmax=lmax, sampling=2, lmax_calc=degmax) delta = abs(moho_grid - moho_grid2).max() print('Delta (km) = ', delta / 1.e3) temp_grid = topo_grid - moho_grid print('Maximum Crustal thickness (km) = ', temp_grid.max() / 1.e3) print('Minimum Crustal thickness (km) = ', temp_grid.min() / 1.e3) moho_grid3 = moho_grid2 moho_grid2 = moho_grid if temp_grid.max() > 100.e3: print('Not converging') exit(1) fig_map = plt.figure() plt.imshow(temp_grid) fig_map.savefig('Mars_CrustalThicknes.png')