-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CeedElemRestriction for H(curl) #1265
Conversation
6ceab5b
to
52aff1d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall looks good to me 🎉 big feature update!
1c725d0
to
7368813
Compare
ecf8da0
to
4b31528
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pipeline is clean now and coverage is better. Thanks.
4b31528
to
9bb0950
Compare
@jeremylt, do you have any last comments or is this ready to merge from your POV? |
…ore general orientation transformations Adds CeedElemRestrictionCreateCurlOriented which takes a tridiagonal element-wise transformation matrix, typically with entries {-1, 0, 1}.
…striction types (default, oriented, strided)
Also update oriented restriction test to also test transpose.
… including use of int8_t for tridiagonal matrix
…ictions (RT or ND elements)
9bb0950
to
c16dd8e
Compare
Thank you @jedbrown @jeremylt @nbeams @rezgarshakeri for all your help with this feature and PR! Now onto GPU backends for H(div) and H(curl)... 🚀 |
Thank you for this nice feature. |
Reopening #1168 from within CEED/libCEED for GitLab CI tests.
From #1168:
High-order H(curl) spaces (p > 1) in 3D involve pairs of element face dofs which must be treated specially in the L-vector to E-vector transformation. These transformations are more complicated than the simple sign flip accounted for in #889. In general, the pairs of dofs are transfomed by 2x2 blocks with entries {-1, 0, 1} to write the transformed E-vector dofs as linear combinations of the L-vector dofs. Thus, if each pair of face dofs are arranged to be consecutive in the element dof ordering, we can represent the transformation required as a tridiagonal matrix with entries {-1, 0, 1} applied to the E-vector. Note this is a (more expensive) generalization of the simple orientation flip case where the transformation matrix is just diagonal with entries {-1, 1}. Note that an alternative approach is to apply some global ordering of the nodes of the mesh as a preprocessing step after which a simple signed restriction suffices (like in https://epubs.siam.org/doi/10.1137/08073901X). However this strategy has its own shortcomings in particular when doing things like AMR.
More information can be found in this paper: https://dl.acm.org/doi/pdf/10.1145/3524456 (section 4.1.4, for example). See also mfem/mfem#1046 and https://github.com/mfem/mfem/blob/master/fem/doftrans.hpp for examples of how this transformation is handled in MFEM.
This PR adds CeedElemRestrictionCreateCurlOriented, which is similar to the CeedElemRestrictionCreateOriented constructor introduced in #889. Currently only implemented for CPU backends, with the main change coming in CeedElemRestrictionApply_Ref_Core.
Also adds some missing methods which should make blocked and opt backends work for oriented restrictions.