Subject: Re: [UFL-dev] [FFC-dev] [DOLFIN-dev] [HG FFC] Restrictions appears to be working for the Poisson demo.

From: Kristian Oelgaard <[email-masked]>
Date: Wed, 19 Aug 2009 16:18:48 +0200

Quoting "Garth N. Wells" <[email-masked]>:

>
>
> Johan Hake wrote:
> > On Wednesday 19 August 2009 15:12:21 Garth N. Wells wrote:
> >> Johan Hake wrote:
> >>> On Wednesday 19 August 2009 14:57:20 Garth N. Wells wrote:
> >>>> Johan Hake wrote:
> >>>>> On Wednesday 19 August 2009 14:21:12 Garth N. Wells wrote:
> >>>>>> Garth N. Wells wrote:
> >>>>>>> Kent Andre wrote:
> >>>>>>>>> Not sure what we have to do actually. I suppose I want get any clue
> >>>>>>>>> from the
> >>>>>>>>>   demo/function/restriction
> >>>>>>>>>
> >>>>>>>>> demo?
> >>>>>>>>> I see that Kent has modified the dolfin.FunctionSpace to reflect
> >>>>>>>>> the present (broken) implementation of restriction, anything in
> >>>>>>>>> that line? Should such an implementation has been done in
> >>>>>>>>> FunctionSpaceBase instead of FunctionSpace? Kent?
> >>>>>>>>>
> >>>>>>>>> Johan
> >>>>>>>> This restriction is different in the sense that the restriction is
> >>>>>>>> made by the standard element on a sub mesh.
> >>>>>>>> The restriction in focus now is on the complete mesh but for only
> >>>>>>>> a part of the element.
> >>>>>>>> Combined, these two features will be very powerful.  I guess the
> >>>>>>>> sub-mesh restriction stuff is broken due to the parallel mesh.
> >>>>>>> I've attached an example solver. To make it work for P^k with k > 2
> >>>>>>> we need to restrict some functions to cell facets. Using FFC, we do
> >>>>>>>
> >>>>>>>     scalar  = FiniteElement("Lagrange", "triangle", 3)
> >>>>>>>     dscalar = FiniteElement("Discontinuous Lagrange", "triangle", 3)
> >>>>>>>
> >>>>>>>     # This syntax restricts the space 'scalar' to cell facets.
> >>>>>>>     mixed = scalar["facet"] + dscalar
> >>>>>>>
> >>>>>>> In PyDOLFIN we could do
> >>>>>>>
> >>>>>>>     V_dg = FunctionSpace(mesh, "DG", 3)
> >>>>>>>     V_cg = FunctionSpace(mesh, "CG", 3, "facet")
> >>>>>>>
> >>>>>>>     mixed = V_cg + V_dg
> >>>>>> I see now that we need to have the above option since the everything
> >>>>>> (e.g. the dof map) is created and compiled inside functionspace.py.
> >>>>> We could implement it in FunctionSpaceBase, as an operator, returning a
> >>>>> new FunctionSpaceBase, with the restricted element as arguemnt.
> >>>>>
> >>>>> However my concerns go to a sub space of a restricted mixed space (if
> >>>>> such exists) see the other email.
> >>>>>
> >>>>> If we go for 1, (as you have already done ;) ), we cannot create a
> >>>>> restricted mixed space using the addition syntax.
> >>>>>
> >>>>>   mixed = V1 + V2
> >>>> Do you mean to then restrict mixed? I'm already doing
> >>> Precisely.
> >>>
> >>> After a second thought I think that doing it in the constructor is more
> >>> clean. Makes life simpler. Is this also possible i UFL, I mean:
> >>>
> >>>   e = FiniteElement("CG",cell,0,"facet")

No, and the above element is not even legal, for CG the degree must be >=1 :)

You have to use the __getitem__ operator of FiniteElementBase

a = element[cell]

or do

e = ElementRestriction(element, domain)

where domain is either a Measure or Cell and only Cell is supported in FFC.

In FFC I might consider adding a default 'domain=None' to the argument list of a
FiniteElement since it will make some things easier. Maybe we should add this in
UFL too?

Kristian

> >>> Should it?
> >> Is that a PyDOLFIN finite element? If it is, then yes, that's how it
> >> should work.
> >
> > I meant UFL.FiniteElement.
> >
>
> OK. I don't know if that is the syntax. Kristian will know.
>
> >> Somewhat related, it's a bit annoying in PyDOLFIN that the code is
> >> recompiled when the mesh is changed. Can we avoid this? Should one then
> >> create a finite element and a dof map with which to initialise the
> >> Pythin FunctionSpace?
> >
> > Do you mean when one has refined a mesh?
>
> Yes, or just changed from one simulation to the next.
>
> As far as I understand it is the
> > reason for this that we need to recompute the dofmap.
> >
>
> In C++ we create a dolfin::FunctionSpace from a dolfin::FiniteElement, a
> dolfin::DofMap and a dolfin::Mesh. The FiniteElement and DofMap are
> created with a ufc::finite_element and a ufc::dof_map, respectively.
>
> In the Python interface, in addition to what we have now, we would need
> FiniteElement and DofMap objects, with which we could create a
> FunctionSpace (together with a Mesh). Then, hopefully we could avoid
> recompilation when just the mesh is changed.
>
> Garth
>
> > How is this done in the C++ interface.
> >
> > Johan
> >
> >> Garth
> >>
> >>> Johan
> >>>
> >>>>      V0 = FunctionSpace(mesh, "CG", 3, "facet")
> >>>>      V1 = FunctionSpace(mesh, "DG", 3)
> >>>>
> >>>>      mixed = V0 + V1
> >>>>
> >>>> and it works. This type of restriction (we'll need to sort out our
> >>>> terminology) impacts the dofmap, which I why I think it needs to be
> >>>> involved in the creation of the function space.
> >>>>
> >>>> Garth
> >>>>
> >>>>> If we want a restricted mixed space we need to use the constructor.
> >>>>>
> >>>>>   mixed = MixedFunctionSpace((V1,V2),restriction="facet")
> >>>>>
> >>>>> Johan
> >>>>>
> >>>>>> Garth
> >>>>>>
> >>>>>>> or
> >>>>>>>
> >>>>>>>     V_dg = FunctionSpace(mesh, "DG", 3)
> >>>>>>>     V_cg = FunctionSpace(mesh, "CG", 3)
> >>>>>>>
> >>>>>>>     mixed = V_cg["scalar"] + V_dg
> >>>>>>>
> >>>>>>> Garth
> >>>>>>>
> >>>>>>>> Kent
> >>>>>>>>
> >>>>>>>> _______________________________________________
> >>>>>>>> DOLFIN-dev mailing list
> >>>>>>>> [email-masked]
> >>>>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
> >>>>>>> ---------------------------------------------------------------------
> >>>>>>> -- -
> >>>>>>>
> >>>>>>> _______________________________________________
> >>>>>>> DOLFIN-dev mailing list
> >>>>>>> [email-masked]
> >>>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
> >>>>>> _______________________________________________
> >>>>>> DOLFIN-dev mailing list
> >>>>>> [email-masked]
> >>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>
>
> _______________________________________________
> FFC-dev mailing list
> [email-masked]
> http://www.fenics.org/mailman/listinfo/ffc-dev
>

---

From: Johan Hake <[email-masked]>
Date: Wed, 19 Aug 2009 16:26:28 +0200

On Wednesday 19 August 2009 16:18:48 Kristian Oelgaard wrote:
> > >>>>>>>>> Not sure what we have to do actually. I suppose I want get any
> > >>>>>>>>> clue from the
> > >>>>>>>>> I see that Kent has modified the dolfin.FunctionSpace to
> > >>>>>>>>> reflect the present (broken) implementation of restriction,
> > >>>>>>>>> anything in that line? Should such an implementation has been
> > >>>>>>>>> done in FunctionSpaceBase instead of FunctionSpace? Kent?
> > >>>>>>>>>
> > >>>>>>>>> Johan
> > >>>>>>>>
> > >>>>>>>> This restriction is different in the sense that the restriction
> > >>>>>>>> is made by the standard element on a sub mesh.
> > >>>>>>>> The restriction in focus now is on the complete mesh but for
> > >>>>>>>> only a part of the element.
> > >>>>>>> I've attached an example solver. To make it work for P^k with k >
> > >>>>>>> 2 we need to restrict some functions to cell facets. Using FFC,
> > >>>>>>> we do
> > >>>>>>>
> > >>>>>> I see now that we need to have the above option since the
> > >>>>>> everything (e.g. the dof map) is created and compiled inside
> > >>>>>> functionspace.py.
> > >>>>>
> > >>>>> We could implement it in FunctionSpaceBase, as an operator,
> > >>>>> returning a new FunctionSpaceBase, with the restricted element as
> > >>>>> arguemnt.
> > >>>>>
> > >>>>> However my concerns go to a sub space of a restricted mixed space
> > >>>>> (if such exists) see the other email.
> > >>>>>
> > >>> After a second thought I think that doing it in the constructor is
> > >>> more clean. Makes life simpler. Is this also possible i UFL, I mean:
> > >>>
> In FFC I might consider adding a default 'domain=None' to the argument list
> of a FiniteElement since it will make some things easier. Maybe we should
> add this in UFL too?

More, harmony between the languages is nice, therefore I asked. Then we should 
probably support both syntaxes in PyDOLFIN, but the __getitem__ syntax might 
be troublesome to implement.

Johan

> > >> recompiled when the mesh is changed. Can we avoid this? Should one
> > >> then create a finite element and a dof map with which to initialise
> > >> the Pythin FunctionSpace?
> > >
> > >>>>>>> -----------------------------------------------------------------
> > >>>>>>>---- -- -
> > >>>>>>>

---

From: Kristian Oelgaard <[email-masked]>
Date: Wed, 19 Aug 2009 17:25:59 +0200

> be troublesome to implement.

Personally I don't mind adding the 'domain' argument to FiniteElementBase in
UFL, but maybe someone have objections in this regard? Then at least this
syntax will be similar to what you will/can do in PyDOLFIN. The only difference
is then not being able to use __getitem__ in PyDOLFIN.

Kristian