Exemplo n.º 1
0
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
Exemplo n.º 2
0
# "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)))
Exemplo n.º 3
0

# "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)))