Hu–Zhang–Zhang element - #295
BorisAndrews wants to merge 3 commits into
Conversation
|
I just want to flag our AI contribution policy:
Can you comment on this? |
|
Eh, so I used it to write the tests and check my code. The latter part of that though it did find errors and make suggestions, that I did then act upon, so I'd call that a "substantive creative/scientific element" I guess! Will just close — it's easier that way (and who else is on a hunt for whacky elements like Hu–Zhang–Zhang but me anyway haha) |
|
Can we reconsider this PR? I for one think it would be wonderful to have Hu-Zhang-Zhang and expect I would use it for real problems. I would describe writing tests more like 'mechanical work' than with a substantial creative/scientific element. More importantly, it's extremely unlikely that there's a FIAT implementation of HZZ out there on the internet that has not been contributed back to Firedrake, so I estimate the 'risk of code from other projects being reproduced verbatim in breach of their licenses' to be extremely low. |
|
Yeah I think that the contribution as described should be fine. Just thought it important to check. |
|
Sorry, I just got a little nervous and didn't want to go against the policy. I agree with Patrick though. Indeed Kaibo (i.e. Hu) wasn't aware of Hu–Zhang–Zhang being implemented anywhere. |
Summary
Adds a lowest-order H(grad curl)-conforming element on tetrahedra, based on the element of Hu, Zhang and Zhang, A Family of Finite Element Stokes Complexes in Three Dimensions, SINUM 60(1), 2022 (doi:10.1137/20M1358700). It is registered as
"Hu-Zhang-Zhang"/"HZZ", degree 1, with covariant Piola mapping.The element completes the Stokes complex
where GN is the existing
GuzmanNeilanFirstKindH1. The goal is to have access to a 3D Stokes complex withH(grad curl)(instead of theH2 --grad--> H1(curl) --curl--> ...Stokes complex) in Firedrake. This allows for streamfunction formulations of incompressible flow with a GN velocity, with fewer global DoFs (4V + E rather than 3V + F + C).The element
This is a gauge variant of the paper's element
For a fiddly reason, the space is not quite the one constructed in the paper. The DoFs, the curl of the space, H(grad curl)-conformity and exactness of the complex all match. The curl-free part of the shape functions does not.
The paper addresses this part with a correction built from Poincaré operators based at the origin. That correction would not be invariant under affine maps, so I don't know if the physical space would be recoverable from the reference cell by a basis transformation.
HuZhangZhangSpaceinstead defines the extended space via four conditions:Each condition is invariant under covariant Piola. The resulting space differs from the paper's by gradients; I've made this explicit in the docstrings.
Basis transformation
finat.HuZhangZhangis aPhysicallyMappedElement. Its DoFs are GN functionals composed with the curl, so its transformation is assembled fromGuzmanNeilanFirstKindH1.basis_transformation. The only new ingredient is that the normal face moments of the curl aren't DoFs; we get them as the sums of the edge moments by Stokes.Tests
test/FIAT/unit/test_hu_zhang_zhang.py, on the reference cell and on a distorted cell:test_zany_mapping.py::test_hu_zhang_zhang, which compares the FInAT transformation with the element constructed directly on a physical cell.test/FIAT/unitandtest/finatsuites pass locally, andmake lintis clean. These were run against fenics-ufl 2025.3, not UFLmain.Firedrake-level checks were also run locally; they are not included in this PR. On distorted structured and unstructured tetrahedral meshes, serially and on 2 MPI ranks:
Limitations
degree != 1raisesNotImplementedError.interpolateinto HZZ, and nonzeroDirichletBCdata, are not supported.HCurl.AI use
This was developed in part by Claude Code (Opus 5), in particular including verification of the implementation, and the test files.