PEERS element implementation

Hi, I am working on a linear elastic problem and need to work with PEERS element. I am not sure whether it is possible to do it with FEniCs. I found the following thread, which seems to be a work around. But the thread is bit simple and I could not get it work.

B = VectorFunctionSpace(mesh, "Bubble", 3)
_H = VectorFunctionSpace(mesh, 'RT', 1)

H = _H+curl(B)

I did the above, but get error at H = _H+curl(B). Is there anyone could give me some help on this?

Another alternative is to use AW element. I am also not sure how to implement that with FEniCs. I found the following old thread.

I’m not sure is there anyone has worked on it. I need to work it out, so if someone could guide me in terms of coding, I am willing to spend some time to contribute to this.


Well at the moment (dolfin 2019, I haven’t tried dolfinx yet) if you want PEERS elements, you need to manually construct the tensors like in:

B = VectorFunctionSpace(mesh, "Bubble", 3)
_H = FunctionSpace(mesh, 'RT', 1)  
b = TestFunction(B)  
a1 = TestFunction(_H)            
a2 = TestFunction(_H)            
sigma = as_tensor((a1,a2))+as_tensor([[b[0].dx(1),-b[0].dx(0)],[b[1].dx(1),-b[1].dx(0)]])  #in 2D

Same goes for BDM based Finite Elements, like AFW. In 2D you can use:

Thdiv = FiniteElement('BDM', mesh.ufl_cell(), 2) #sigma
Thskew = FiniteElement('DG', mesh.ufl_cell(),1)  # L2skew in 2D has just ONE DOF
Vh = VectorElement('DG', mesh.ufl_cell(),1)         #u

W = FunctionSpace(mesh,MixedElement([Thdiv, Thdiv,Thskew,Vh]))

trials = TrialFunctions(W)
sigma = as_tensor((trials[0], trials[1]))
u_skew = as_tensor(((0., trials[2]),(-trials[2],0.)))
u = trials[3]