r_ell_layout = domain.distributor.layouts[1] m_start = th_m_layout.slices(scales=1)[0].start m_end = th_m_layout.slices(scales=1)[0].stop - 1 m_size = m_end - m_start + 1 ell_start = r_ell_layout.slices(scales=1)[1].start ell_end = r_ell_layout.slices(scales=1)[1].stop - 1 # set up ball N_theta = int((L_max + 1) * L_dealias) N_r = int((N_r + 1) * N_dealias) B = ball.Ball(N_max, L_max, N_theta=N_theta, N_r=N_r, R_max=R_max, ell_min=ell_start, ell_max=ell_end, m_min=m_start, m_max=m_end, a=0.) # coordinate arrays for plotting theta_global = B.grid(0) r_global = B.grid(1) n_phi_global = 2 * (L_max + 1) * L_dealias phi_global = np.expand_dims(np.linspace(0, 2 * np.pi, num=n_phi_global + 1, endpoint=True), axis=1) r_global = np.pad(r_global, ((0, 0), (1, 1)),
import ball_wrapper as ball import numpy as np from scipy.sparse import linalg as spla import scipy.sparse as sparse import dedalus.public as de from dedalus.core.distributor import Distributor def err(a, b): print(np.max(np.abs(a - b)) / np.max(np.abs(b))) L_max, N_max, R_max = 31, 31, 2 B_3D = ball.Ball(N_max, L_max, R_max=R_max) L_dealias = 1 N_dealias = 1 N_r = N_max comm = None mesh = None phi_basis_3D = de.Fourier('phi', 2 * (L_max + 1), interval=(0, 2 * np.pi), dealias=L_dealias) theta_basis_3D = de.Fourier('theta', L_max + 1, interval=(0, np.pi), dealias=L_dealias) r_basis_3D = de.Fourier('r', N_max + 1, interval=(0, 1), dealias=N_dealias) domain_3D = de.Domain([phi_basis_3D, theta_basis_3D, r_basis_3D],
theta_basis = de.Fourier('theta', 2 * L_max + 1, interval=(0, np.pi)) r_basis = de.Fourier('r', N_max + 1, interval=(0, 1)) domain = de.Domain([theta_basis, r_basis], grid_dtype=np.float64) mesh = domain.distributor.mesh if len(mesh) == 0: #serial ell_r_layout = domain.distributor.layouts[1] r_ell_layout = domain.distributor.layouts[1] else: ell_r_layout = domain.distributor.layouts[2] r_ell_layout = domain.distributor.layouts[1] ell_min = r_ell_layout.slices(scales=1)[0].start ell_max = r_ell_layout.slices(scales=1)[0].stop - 1 B = ball.Ball(N_max, L_max, S_max=S_max, ell_min=ell_min, ell_max=ell_max) r = B.grid(1)[0] m = 0 eig_num = 100 f = ball.TensorField_2D(0, m, B, domain) f['c'][ell][:512] = vec[eig_num] f['g'][0, 10, :] = f['g'][0, 10, :].real f['g'][0, 10, :] /= np.max(np.abs(f['g'][0, 10, :])) print(np.max(np.abs(f['g'][0, 10, :]))) k = np.sqrt(vals[eig_num]) sol = spec.jv(ell + 1 / 2, k * r) / np.sqrt(k * r) sol /= np.max(np.abs(sol)) eig_axes.plot(r,
eigs = [] text_label = [ r'${\rm no-slip}$', r'${\rm stress-free}$', r'${\rm potential}$', r'${\rm perfectly-conducting}$', r'${\rm pseudo-vacuum}$'] text_x = 0.025 text_y = 0.875 ell = 50 L_max, R_max = 63, 3 B = ball.Ball(N_max,L_max,R_max=R_max,ell_min = 48,ell_max=52) calculate = True boundary_conditions = 'no-slip' if calculate: vals, vecs = bd.eigensystem(N_max,ell,B,alpha_BC=2,boundary_conditions=boundary_conditions) np.save('data/no_slip_eigs_a2.npy',vals) vals_analytic = wavenumbers(ell,N_max+1,boundary_conditions) vals_analytic = eigenvalues(vals_analytic,len(vals)) np.save('data/no_slip_eigs_analytic_a2.npy',vals_analytic) vals, vecs = bd.eigensystem(N_max,ell,B,alpha_BC=0,boundary_conditions=boundary_conditions) np.save('data/no_slip_eigs_a0.npy',vals) vals_analytic = wavenumbers(ell,N_max+1,boundary_conditions) vals_analytic = eigenvalues(vals_analytic,len(vals)) np.save('data/no_slip_eigs_analytic_a0.npy',vals_analytic)