Skip to content

[BUG]: test_symmetry_interior_facet_assembly failed with glibcxxassertions #4047

@qbisi

Description

@qbisi

Summarize the issue

when hardening enable glibcxxassertions on fenics-{basix/dolfinx}, the test_symmetry_interior_facet_assembly run into TRAP when runing petsc_apply_lifting(b, a, bcs=bcs1) for unit_cube mesh with "Regge" FE space.

The SIGTRAP should live in basix::precompute::apply_matrix if debuged with gdb/lldb.

Related pr: NixOS/nixpkgs#483329
Full build log: https://github.com/qbisi/nixpkgs-review-gha/actions/runs/21314500628/job/61355313001

How to reproduce the bug

enable glibcxxassertions on both fenics-{basix/dolfinx} will reproduce this test failure

Minimal Example (Python)

from mpi4py import MPI
import ufl
import numpy as np
from ufl import dS, dx, inner
from dolfinx.mesh import create_unit_cube, locate_entities_boundary, GhostMode
from dolfinx.fem import (
    Function,
    functionspace,
    form,
    locate_dofs_topological,
    dirichletbc,
    bcs_by_block,
    extract_function_spaces,
)

from petsc4py import PETSc
from dolfinx.fem.petsc import apply_lifting as petsc_apply_lifting
from dolfinx.fem.petsc import assemble_matrix as petsc_assemble_matrix
from dolfinx.fem.petsc import assemble_vector as petsc_assemble_vector
from dolfinx.fem.petsc import set_bc as petsc_set_bc


def bc(V):
    facetdim = mesh.topology.dim - 1
    bndry_facets = locate_entities_boundary(
        mesh, facetdim, lambda x: np.isclose(x[0], 0.0)
    )
    bdofsV = locate_dofs_topological(V, facetdim, bndry_facets)
    u_bc = Function(V)
    return dirichletbc(u_bc, bdofsV)


mesh = create_unit_cube(MPI.COMM_WORLD, 5, 5, 5, ghost_mode=GhostMode.shared_facet)

V0 = functionspace(mesh, ("N2E", 1))
V1 = functionspace(mesh, ("Regge", 1))
u0, v0 = ufl.TrialFunction(V0), ufl.TestFunction(V0)
u1, v1 = ufl.TrialFunction(V1), ufl.TestFunction(V1)
n = ufl.FacetNormal(mesh)
a00 = inner(u0, v0) * dx
a11 = inner(u1, v1) * dx
a01 = inner(ufl.dot(ufl.avg(u1), n("+")), ufl.avg(v0)) * dS
a10 = inner(ufl.avg(u0), ufl.dot(ufl.avg(v1), n("+"))) * dS
a = form([[a00, a01], [a10, a11]])
L0 = inner(ufl.unit_vector(0, mesh.geometry.dim), ufl.avg(v0)) * dS
L1 = inner(ufl.unit_matrix(1, 1, mesh.geometry.dim), ufl.avg(v1)) * dS
L = form([L0, L1])
# without boundary conditions
A = petsc_assemble_matrix(a)
A.assemble()
assert isinstance(A, PETSc.Mat)
assert A.isSymmetric(tol=1.0e-4)
A.destroy()
# with boundary conditions
bcs = [bc(V0), bc(V1)]
A = petsc_assemble_matrix(a, bcs=bcs)
b = petsc_assemble_vector(L, kind=PETSc.Vec.Type.MPI)
bcs1 = bcs_by_block(extract_function_spaces(a, 1), bcs=bcs)
petsc_apply_lifting(b, a, bcs=bcs1)
b.ghostUpdate(addv=PETSc.InsertMode.ADD, mode=PETSc.ScatterMode.REVERSE)
bcs0 = bcs_by_block(extract_function_spaces(L), bcs=bcs)
petsc_set_bc(b, bcs0)

A.assemble()
b.assemble()
assert isinstance(A, PETSc.Mat)
assert isinstance(b, PETSc.Vec)
assert A.isSymmetric(tol=1.0e-4)
A.destroy()
b.destroy()

Output (Python)

Version

main branch

DOLFINx git commit

No response

Installation

No response

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions