def main(N, family, bci): bc = bcs[bci] if bci == 0: SD = FunctionSpace(N, family=family, bc=bc, domain=domain, mean=mean[family.lower()]) else: SD = FunctionSpace(N, family=family, bc=bc, domain=domain) u = TrialFunction(SD) v = TestFunction(SD) # Get f on quad points fj = Array(SD, buffer=fe) # Compute right hand side of Poisson equation f_hat = Function(SD) f_hat = inner(v, fj, output_array=f_hat) # Get left hand side of Poisson equation A = inner(v, div(grad(u))) u_hat = Function(SD).set_boundary_dofs() if isinstance(A, list): bc_mat = extract_bc_matrices([A]) A = A[0] f_hat -= bc_mat[0].matvec(u_hat, Function(SD)) u_hat = A.solve(f_hat, u_hat) uj = u_hat.backward() uh = uj.forward() # Compare with analytical solution ua = Array(SD, buffer=ue) assert np.allclose(uj, ua), np.linalg.norm(uj - ua) if 'pytest' not in os.environ: print("Error=%2.16e" % (np.sqrt(dx((uj - ua)**2)))) import matplotlib.pyplot as plt plt.plot(SD.mesh(), uj, 'b', SD.mesh(), ua, 'r')
u = TrialFunction(T) v = TestFunction(T) # Get f on quad points fj = Array(T, buffer=fe) # Compute right hand side of biharmonic equation f_hat = inner(v, fj) # Get left hand side of biharmonic equation matrices = inner(v, div(grad(div(grad(u))))) u_hat = Function(T).set_boundary_dofs() # Solution spectral space if SD.has_nonhomogeneous_bcs: bc_mats = extract_bc_matrices([matrices]) w0 = np.zeros_like(u_hat) for mat in bc_mats: f_hat -= mat.matvec(u_hat, w0) # Create linear algebra solver H = BiharmonicSolver(*matrices) # Solve and transform to real space u_hat = H(u_hat, f_hat) # Solve uq = u_hat.backward() # Compare with analytical solution uj = Array(T, buffer=ue) print(abs(uj - uq).max())
N = 32 SD = FunctionSpace(N, family=family, bc={'left': ('N', 1), 'right': ('N', 1)}) u = TrialFunction(SD) v = TestFunction(SD) # Get f on quad points fj = Array(SD, buffer=fe) # Compute right hand side of Poisson equation f_hat = Function(SD, buffer=inner(v, fj)) # Get left hand side of Poisson equation A = inner(v, div(grad(u))) B = extract_bc_matrices([A])[0] A = A[0] u_hat = Function(SD).set_boundary_dofs() f_hat -= B.matvec(u_hat, Function(SD)) u_hat = A.solve(f_hat, u_hat) # Solve and transform to real space u = np.zeros(N) # Solution real space u = SD.backward(u_hat, u) # Compare with analytical solution uj = Array(SD, buffer=ue) print(abs(uj - u).max()) assert np.allclose(uj, u) if 'pytest' not in os.environ: