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