Implemention of vector-valued Crouzeix-Raviart element

I would like to inquire about the implementation of the vector-valued Crouzeix-Raviart element. Additionally, is using "FESpace('nonconforming', mesh, order=order)" the correct approach to represent the scalar Crouzeix-Raviart element space? Also, can the value of “order” only be set to one?

Thank you so much.

yes, correct. If you want to have the space vector-valued, you write

fes1 = FESpace('nonconforming', mesh)
fes = fes1**3

That’s a problem of the Crouzeix-Raviart, it’s only for order=1.
If you want similar methods with dofs at the facets, but higher order, we recommend to use hybrid mixed methods, see 51. Hybridization Techniques — Interactive Finite Elements.

Thank you so much for your help!

Sorry that I have an additional question. When I run the following commands:

from ngsolve import *
import numpy as np
from ngsolve.webgui import Draw
from netgen.occ import *
sphere = Sphere((0,0,0),1).faces[0]
sphere.name = "sphere"
geo = OCCGeometry(sphere)

mesh = Mesh(geo.GenerateMesh(maxh=0.5))
fesCR = FESpace('nonconforming', mesh)
print('dim of CR is {}'.format(fesCR.ndof))
print('number of edges is {}'.format(mesh.nedge))
print('number of faces is {}'.format(mesh.nface))

The output shows:

  • Dimension of CR: 112
  • Number of edges: 168
  • Number of faces: 112

This indicates that the degrees of freedom (DOFs) for the CR element correspond to the number of faces rather than the number of edges. To implement the CR element with the degrees of freedom associated with the edges instead, how should I modify the implementation?