Esempio n. 1
0
def get_facet_areas(mesh):
    """
    Compute area of each facet of `mesh`.

    The facet areas are stored as a HDiv
    trace field.

    Note that the plus sign is arbitrary
    and could equally well be chosen as minus.

    :arg mesh: the input mesh to do computations on

    :rtype: firedrake.function.Function facet_areas with
        facet area data
    """
    HDivTrace = firedrake.FunctionSpace(mesh, "HDiv Trace", 0)
    v = firedrake.TestFunction(HDivTrace)
    u = firedrake.TrialFunction(HDivTrace)
    facet_areas = firedrake.Function(HDivTrace, name="Facet areas")
    mass_term = v("+") * u("+") * ufl.dS + v * u * ufl.ds
    rhs = v("+") * ufl.FacetArea(mesh) * ufl.dS + v * ufl.FacetArea(mesh) * ufl.ds
    sp = {
        "snes_type": "ksponly",
        "ksp_type": "preonly",
        "pc_type": "jacobi",
    }
    firedrake.solve(mass_term == rhs, facet_areas, solver_parameters=sp)
    return facet_areas
def test_interior_facet_integral_sides():
    n = 1
    mesh = UnitSquareMesh(n, n)
    markers = CellFunctionSizet(mesh)
    subdomain = AutoSubDomain(lambda x, on_boundary: x[0] > x[1] - DOLFIN_EPS)

    V = FunctionSpace(mesh, "DG", 0)
    f = interpolate(Expression("x[0]"), V)

    # Define forms picking value of f from + and - sides
    scale = 1.0 / ufl.FacetArea(mesh)
    Mp = f('+') * scale * dS(domain=mesh)
    Mm = f('-') * scale * dS(domain=mesh)

    # Hack to attach cell markers to dS integral... Need to find a UFL
    # solution to this.
    Mh = Constant(0) * dx(99, domain=mesh, subdomain_data=markers)
    Mp = Mp + Mh
    Mm = Mm + Mh

    # Case A: subdomain is 1, rest is 0
    markers.set_all(0)
    subdomain.mark(markers, 1)
    assert abs(assemble(Mp) - 2.0 / 3.0) < 1e-8
    assert abs(assemble(Mm) - 1.0 / 3.0) < 1e-8

    # Case B: subdomain is 0, rest is 1
    markers.set_all(1)
    subdomain.mark(markers, 0)
    assert abs(assemble(Mp) - 1.0 / 3.0) < 1e-8
    assert abs(assemble(Mm) - 2.0 / 3.0) < 1e-8
def testFacetArea():
    references = [(UnitIntervalMesh(MPI.comm_world, 1), 2, 2),
                  (UnitSquareMesh(MPI.comm_world, 1, 1), 4, 4),
                  (UnitCubeMesh(MPI.comm_world, 1, 1, 1), 6, 3)]
    for mesh, surface, ref_int in references:
        c0 = ufl.FacetArea(mesh)
        c1 = dolfinx.FacetArea(mesh)
        assert (c0)
        assert (c1)
Esempio n. 4
0
def testFacetArea():
    references = [(UnitIntervalMesh(MPI.comm_world, 1), 2, 2),
                  (UnitSquareMesh(MPI.comm_world, 1, 1), 4, 4),
                  (UnitCubeMesh(MPI.comm_world, 1, 1, 1), 6, 3)]
    for mesh, surface, ref_int in references:
        c = Constant(1, mesh.ufl_cell())  # FIXME
        c0 = ufl.FacetArea(mesh)
        c1 = dolfin.FacetArea(mesh)
        assert (c)
        assert (c0)
        assert (c1)
def test_facet_area1D():
    mesh = create_unit_interval(MPI.COMM_WORLD, 10)

    # NOTE: Area of a vertex is defined to 1 in ufl
    c0 = ufl.FacetArea(mesh)
    c = Constant(mesh, ScalarType(1))

    ds = ufl.Measure("ds", domain=mesh)
    a0 = mesh.comm.allreduce(assemble_scalar(form(c * ds)), op=MPI.SUM)
    a = mesh.comm.allreduce(assemble_scalar(form(c0 * ds)), op=MPI.SUM)
    assert numpy.isclose(a.real, 2)
    assert numpy.isclose(a0.real, 2)
Esempio n. 6
0
def testFacetArea():

    references = [(UnitIntervalMesh(1), 2, 2),\
                  (UnitSquareMesh(1,1), 4, 4),\
                  (UnitCubeMesh(1,1,1), 6, 3)]
    for mesh, surface, ref_int in references:
        c = Constant(1, mesh.ufl_cell())  # FIXME
        c0 = ufl.FacetArea(mesh)
        c1 = dolfin.FacetArea(mesh)
        assert round(assemble(c * dx(mesh)) - 1, 7) == 0
        assert round(assemble(c * ds(mesh)) - surface, 7) == 0
        assert round(assemble(c0 * ds(mesh)) - ref_int, 7) == 0
        assert round(assemble(c1 * ds(mesh)) - ref_int, 7) == 0
Esempio n. 7
0
 def testFacetArea(self):
     if MPI.size(mpi_comm_world()) == 1:
         references = [(UnitIntervalMesh(1), 2, 2),\
                       (UnitSquareMesh(1,1), 4, 4),\
                       (UnitCubeMesh(1,1,1), 6, 3)]
         for mesh, surface, ref_int in references:
             c = Constant(1, mesh.ufl_cell())  # FIXME
             c0 = ufl.FacetArea(mesh)
             c1 = dolfin.FacetArea(mesh)
             self.assertAlmostEqual(assemble(c * dx, mesh=mesh), 1)
             self.assertAlmostEqual(assemble(c * ds, mesh=mesh), surface)
             self.assertAlmostEqual(assemble(c0 * ds, mesh=mesh), ref_int)
             self.assertAlmostEqual(assemble(c1 * ds, mesh=mesh), ref_int)
def test_facet_area(mesh_factory):
    """
    Compute facet area of cell. UFL currently only supports affine cells for this computation
    """
    # NOTE: UFL only supports facet area calculations of affine cells
    func, args, exact_area = mesh_factory
    mesh = func(*args)
    c0 = ufl.FacetArea(mesh)
    c = Constant(mesh, ScalarType(1))
    tdim = mesh.topology.dim
    num_faces = 4 if tdim == 2 else 6

    ds = ufl.Measure("ds", domain=mesh)
    a = mesh.comm.allreduce(assemble_scalar(form(c * ds)), op=MPI.SUM)
    a0 = mesh.comm.allreduce(assemble_scalar(form(c0 * ds)), op=MPI.SUM)
    assert numpy.isclose(a.real, num_faces)
    assert numpy.isclose(a0.real, num_faces * exact_area)