# Let's keep a copy of the initial conditions initial_u = u.copy() # Let's build the matrices. TODO: I think it would be nicer to use # `grid` instead of `int_grid`. It is a simple change. E = build_interp_matrix(int_grid, cp, dx, p, ll, virtual_grid_shape) # TODO: being able to select different laplacian operators. Currently # it uses the second order laplacian for 2D and 3D. We could probably # use stencils.py, and give the stencil as a parameter L = build_diff_matrix(int_grid, dx, virtual_grid_shape) # Points in the surface of the sphere, used por plotting xp, yp, zp = Sphere().parametric_grid(65) _, phi_plot, _ = cart2sph(xp, yp, zp) Eplot = build_interp_matrix(int_grid, np.column_stack((xp.ravel(), yp.ravel(), zp.ravel())), dx, p, ll, virtual_grid_shape) if PLOT: # Plotting code. Build a pipeline to be able to change the data later. src = mlab.pipeline.grid_source(xp, yp, zp, scalars=(Eplot * u).reshape(xp.shape)) normals = mlab.pipeline.poly_data_normals(src) surf = mlab.pipeline.surface(normals) mlab.colorbar() Tf = 2 dt = 0.1 * np.min(dx)**2 numtimesteps = int(Tf // dt + 1)