Use space::interpolate() for restriction and prolongation.
Note requires the
feature/lagrangeinterpolate_with_general_container
branch of dune-localfunctions
The LocalFE spaces do not yet have specialized RestrictProlong
operators. A generic approach would be to use the interpolation to do the prolongation and base the restriction on that as well. Something like this. Let F be a father element and C_1,..,C_n be the children, let u_F and u_i be the local functions with corresponding dof vectors (w_Fk), (w_ik), I:f->R^N be the interpolation (on the reference element) and let phi_k for k=1,..,N be the shape functions. Finally we denote with F_i:hatK->hatK the mapping from C_i into F.
Prolongation
We want the new local function on C_i to be the interpolation of u_F(F_i) onto u_i so the dofs are
w_ik = sum_l I(phi_l(F_i))_k w_Fl
since
u_i = sum_k w_ik phi_k = sum_k I(u_F(F_i))_k phi_k
so
w_ik = I(u_F(F_i))_k = sum_l w_Fl I(phi_l(F_i))_k
So we can define a matrix P_i = (I(phi_l(F_i))_k)_kl and have
w_i = P_i w_F
for all children.
Restriction
A reasonable choice would be
w_F = sum_i omega_i (P_i)^T w_i
I'm not quite sure about the right weights, possibly 1/n or |C_i| / |F| which is what we use in other places.
Remark
For the Lagrange space this approach gives a slightly different restriction compared to the one implemented for the LagrangeDiscreteFunctionSpace
.
Take bisection with newest vertex numbered 0 and counter clockwise numbering then
(P_0)^T = ( 0 1 0 , 1/2 0 1 , 1/2 0 0 )
(P_1)^T = ( 0 0 1 , 1/2 0 0 , 1/2 1 0 )
then (with weights equal 1/2)
w_F = ( w_02/2 + w_13/2 , w_01/4 + w_03/2 + w_11/4 , w_01/4 + w_13/4 + w_12/2 )
and I think the old version would be
w_F = ( w_02/2 + w_13/2 , w_03 , w_12 )
Martins Understanding restprol.pdf