def test_l2_project(k): npart = 20 mesh = dolfinx.UnitSquareMesh(MPI.COMM_WORLD, 5, 5) ncells = mesh.topology.index_map(2).size_local x, c = pyleopart.mesh_fill(mesh, ncells * npart) p = pyleopart.Particles(x, c) p.add_field("v", [2]) vp = p.field("v") Q = dolfinx.function.VectorFunctionSpace(mesh, ("DG", k)) pbasis = pyleopart.get_particle_contributions(p, Q._cpp_object) def sq_val(x): return [x[0]**k, x[1]**k] u = dolfinx.function.Function(Q) u.interpolate(sq_val) # Transfer from Function "u" to (particle) field "v" pyleopart.transfer_to_particles(p, vp, u._cpp_object, pbasis) #Init and conduct l2projection v = dolfinx.function.Function(Q) l2project = pyleopart.L2Project(p, v._cpp_object, "v") l2project.solve() l2_error = mesh.mpi_comm().allreduce(assemble_scalar( dot(u - v, u - v) * dx), op=MPI.SUM) assert l2_error < 1e-15
# "Exact" solution expression def solution(values, x): values[:, 0] = A * np.cos(k0 * x[:, 0]) * np.cos(k0 * x[:, 1]) # Function space for exact solution - need it to be higher than deg V_exact = FunctionSpace(mesh, ("Lagrange", deg + 3)) u_exact = Function(V_exact) u_exact.interpolate(lambda x: A * np.cos(k0 * x[0]) * np.cos(k0 * x[1])) # best approximation from V # u_BA = project(u_exact, V) # H1 errors diff = u - u_exact H1_diff = mesh.mpi_comm().allreduce(assemble_scalar( inner(grad(diff), grad(diff)) * dx), op=MPI.SUM) H1_exact = mesh.mpi_comm().allreduce(assemble_scalar( inner(grad(u_exact), grad(u_exact)) * dx), op=MPI.SUM) print("Relative H1 error of FEM solution:", abs(np.sqrt(H1_diff) / np.sqrt(H1_exact))) # L2 errors L2_diff = mesh.mpi_comm().allreduce(assemble_scalar(inner(diff, diff) * dx), op=MPI.SUM) L2_exact = mesh.mpi_comm().allreduce(assemble_scalar( inner(u_exact, u_exact) * dx), op=MPI.SUM) print("Relative L2 error of FEM solution:", abs(np.sqrt(L2_diff) / np.sqrt(L2_exact)))
# "Exact" solution expression def solution(values, x): values[:, 0] = A * np.cos(k0 * x[:, 0]) * np.cos(k0 * x[:, 1]) # Function space for exact solution - need it to be higher than deg V_exact = FunctionSpace(mesh, ("Lagrange", deg + 3)) u_exact = Function(V_exact) u_exact.interpolate(lambda x: A * np.cos(k0 * x[0]) * np.cos(k0 * x[1])) # best approximation from V # u_BA = project(u_exact, V) # H1 errors diff = u - u_exact # diff_BA = u_BA - u_exact H1_diff = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(grad(diff), grad(diff)) * dx)) # H1_BA = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(grad(diff_BA), grad(diff_BA)) * dx)) H1_exact = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(grad(u_exact), grad(u_exact)) * dx)) # print("Relative H1 error of best approximation:", abs(np.sqrt(H1_BA) / np.sqrt(H1_exact))) print("Relative H1 error of FEM solution:", abs(np.sqrt(H1_diff) / np.sqrt(H1_exact))) # L2 errors L2_diff = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(diff, diff) * dx)) # L2_BA = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(diff_BA, diff_BA) * dx)) L2_exact = MPI.sum(mesh.mpi_comm(), assemble_scalar(inner(u_exact, u_exact) * dx)) # print("Relative L2 error of best approximation:", abs(np.sqrt(L2_BA) / np.sqrt(L2_exact))) print("Relative L2 error of FEM solution:", abs(np.sqrt(L2_diff) / np.sqrt(L2_exact)))