-
-
Notifications
You must be signed in to change notification settings - Fork 228
Open
Description
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
Labels
No labels