コード例 #1
0
ファイル: simpleball.py プロジェクト: kburns/sphered_cube
 def __init__(self, radius, L_max, N_max, R_max, L_dealias, N_dealias, m_max=None, mesh=None, comm=None):
     if m_max is None:
         m_max  = L_max
     self.radius = radius
     self.L_max = L_max
     self.N_max = N_max
     self.R_max = R_max
     self.L_dealias = L_dealias
     self.N_dealias = N_dealias
     # Domain
     phi_basis = de.Fourier('phi', 2*(L_max+1), interval=(0, 2*np.pi), dealias=L_dealias)
     theta_basis = de.Chebyshev('theta', L_max+1, interval=(0, np.pi), dealias=L_dealias)
     r_basis = de.Chebyshev('r', N_max+1, interval=(0, 1), dealias=N_dealias)
     self.domain = domain = de.Domain([phi_basis, theta_basis, r_basis], grid_dtype=np.float64, mesh=mesh, comm=comm)
     # Local m
     mesh = self.domain.distributor.mesh
     if len(mesh) == 0:
         phi_layout = domain.distributor.layouts[3]
         th_m_layout = domain.distributor.layouts[2]
         ell_r_layout = domain.distributor.layouts[1]
         r_ell_layout = domain.distributor.layouts[1]
     elif len(mesh) == 1:
         phi_layout = domain.distributor.layouts[4]
         th_m_layout = domain.distributor.layouts[2]
         ell_r_layout = domain.distributor.layouts[1]
         r_ell_layout = domain.distributor.layouts[1]
     elif len(mesh) == 2:
         phi_layout = domain.distributor.layouts[5]
         th_m_layout = domain.distributor.layouts[3]
         ell_r_layout = domain.distributor.layouts[2]
         r_ell_layout = domain.distributor.layouts[1]
     self.m_start = th_m_layout.slices(scales=1)[0].start
     self.m_end = th_m_layout.slices(scales=1)[0].stop-1
     self.m_size = self.m_end - self.m_start + 1
     self.ell_start = r_ell_layout.slices(scales=1)[1].start
     self.ell_end = r_ell_layout.slices(scales=1)[1].stop-1
     # Ball wrapper
     N_theta = int((L_max+1)*L_dealias)
     N_r = int((N_max+1)*N_dealias)
     self.B = B = ball_wrapper.Ball(N_max, L_max, N_theta=N_theta, N_r=N_r, R_max=R_max,
         ell_min=self.ell_start, ell_max=self.ell_end, m_min=self.m_start, m_max=self.m_end, a=0.)
     # Grids
     grid_slices = phi_layout.slices(domain.dealias)
     self.phi = domain.grid(0, scales=domain.dealias)[grid_slices[0], :, :]
     self.theta = B.grid(1, dimensions=3)[:, grid_slices[1], :] # local
     self.r = radius * B.grid(2, dimensions=3)[:, :, grid_slices[2]] # local
     self.weight_theta = B.weight(1, dimensions=3)[:, grid_slices[1], :]
     self.weight_r = radius**3 * B.weight(2, dimensions=3)[:, :, grid_slices[2]]
コード例 #2
0
elif len(mesh) == 2:
    phi_layout   = domain.distributor.layouts[5]
    th_m_layout  = domain.distributor.layouts[3]
    ell_r_layout = domain.distributor.layouts[2]
    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)
theta_global = B.grid(0)
r_global = B.grid(1)
z, R = r_global*np.cos(theta_global), r_global*np.sin(theta_global) # global

grid_slices = phi_layout.slices(domain.dealias)
phi = domain.grid(0,scales=domain.dealias)[grid_slices[0],:,:]
theta = B.grid(1,dimensions=3)[:,grid_slices[1],:] # local
r = B.grid(2,dimensions=3)[:,:,grid_slices[2]] # local

weight_theta = B.weight(1,dimensions=3)[:,grid_slices[1],:]
weight_r = B.weight(2,dimensions=3)[:,:,grid_slices[2]]

om = ball.TensorField_3D(1,B,domain)
u  = ball.TensorField_3D(1,B,domain)
p  = ball.TensorField_3D(0,B,domain)
コード例 #3
0
        plt.setp(plot_axis.get_yticklabels(), visible=False)

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

if not os.path.isdir('data'):
    os.mkdir('data')
if not os.path.isdir('data/eigenvalues_256'):
    os.mkdir('data/eigenvalues_256')

boundary_conditions = 'no-slip'
if calculate:
    vals, vecs = bd.eigensystem(N_max,
                                ell,
                                B,
                                alpha_BC=2,
                                boundary_conditions=boundary_conditions)
コード例 #4
0
from dedalus_sphere 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],
コード例 #5
0
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, R_max=R_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,