On Sun, Oct 18, 2009 at 11:43:03PM +0200, Johan Hake wrote: > On Sunday 18 October 2009 21:10:08 Anders Logg wrote: > > On Sun, Oct 18, 2009 at 08:37:21PM +0200, Johan Hake wrote: > > > On Sunday 18 October 2009 20:31:41 Garth N. Wells wrote: > > > > Johan Hake wrote: > > > > > On Sunday 18 October 2009 20:07:41 Garth N. Wells wrote: > > > > >> On Oct 18 2009, Johan Hake wrote: > > > > >>> On Sunday 18 October 2009 18:21:23 Garth N. Wells wrote: > > > > >>>> Johan Hake wrote: > > > > >>>>> On Sunday 18 October 2009 16:43:28 Garth N. Wells wrote: > > > > >>>>>> Garth N. Wells wrote: > > > > >>>>>>> Johan Hake wrote: > > > > >>>>>>>> On Saturday 17 October 2009 21:08:14 Garth N. Wells wrote: > > > > >>>>>>>>> Garth N. Wells wrote: > > > > >>>>>>>>>> DOLFIN wrote: > > > > >>>>>>>>>>> One or more new changesets pushed to the primary dolfin > > > > >>>>>>>>>>> repository. A short summary of the last three changesets is > > > > >>>>>>>>>>> included below. > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> changeset: 7378:e5c921e0293a > > > > >>>>>>>>>>> tag: tip > > > > >>>>>>>>>>> user: "Johan Hake <h...@simula.no>" > > > > >>>>>>>>>>> date: Sat Oct 17 15:45:36 2009 +0200 > > > > >>>>>>>>>>> files: site-packages/dolfin/function.py > > > > >>>>>>>>>>> site-packages/dolfin/functionspace.py description: > > > > >>>>>>>>>>> Make Mixed FunctionSpace access more consistant. > > > > >>>>>>>>>>> - All methods are now defined in FunctionSpaceBase. > > > > >>>>>>>>>>> - We now do not save any spaces in MixedFunctionSpace > > > > >>>>>>>>>> > > > > >>>>>>>>>> This change broke my code. See below. > > > > >>>>>>>>> > > > > >>>>>>>>> Seems that the problem arises with spaces which are > > > > >>>>>>>>> restricted, > > > > >>>>>>>>> > > > > >>>>>>>>> V = FunctionSpace(mesh, "CG", 1, "facet") > > > > >>>>>>>> > > > > >>>>>>>> This is an error in the generated FFC code. > > > > >>>>>>>> ufc::finite_element::signature() > > > > >>>>>>>> should return a string that can be executed in a ufl namespace > > > > >>>>>>>> and then generate the corresponding ufl.FiniteElement. > > > > >>>>>>>> > > > > >>>>>>>> For a restricted element the signature returns: > > > > >>>>>>>> > > > > >>>>>>>> "FiniteElement('Lagrange', 'triangle', 1)|_{<interval of > > > > >>>>>>>> degree 1>}" > > > > >>>>>>>> > > > > >>>>>>>> where it should return: > > > > >>>>>>>> > > > > >>>>>>>> "ElementRestriction(FiniteElement('Lagrange', > > > > >>>>>>>> Cell('triangle', 1, Space(2)), 1), Cell('interval', 1, > > > > >>>>>>>> Space(1)))" > > > > >>>>>> > > > > >>>>>> I've had a look, and while I don't yet follow where UFL defines > > > > >>>>>> its signatures, > > > > >>>>> > > > > >>>>> repr(ulf_object) > > > > >>>>> > > > > >>>>> returns the uniqe signature of an ufl_object. > > > > >>>>> > > > > >>>>>> things are dangerous because FFC formats its own signature > > > > >>>>>> strings, see line 227 of > > > > >>>>>> > > > > >>>>>> ffc/ffc/fem/finiteelement.py > > > > >>>>> > > > > >>>>> Yes, this is dangerous, at least if we want to use them as we do > > > > >>>>> in PyDOLFIN. However taking repr of the corresponding ufl object > > > > >>>>> is a well defined method that ufl use internally, when for > > > > >>>>> example creating a unique string representation of a form. > > > > >>>>> > > > > >>>>>> We stopped using signature strings in DOLFIN because it gave us > > > > >>>>>> all sorts of problems. Is it desirable to have PyDOLFIN depend > > > > >>>>>> on the generated strings? Can it be avoided? > > > > >>>>> > > > > >>>>> It is a very nice way of constructing an ufl object when we have > > > > >>>>> the compiled version. As the convention of repr(object) is that: > > > > >>>>> > > > > >>>>> new_object = eval(repr(object)) > > > > >>>>> > > > > >>>>> should return a new object of the same kind. > > > > >>>>> > > > > >>>>> So when we have a SubSpace with its compiled FiniteElement, it is > > > > >>>>> easy to just call its signature method of its element to generate > > > > >>>>> the corresponding ufl element, which is used to construct a full > > > > >>>>> fledged dolfin.FunctionSpace. > > > > >>>>> > > > > >>>>> Not sure how this could be done another way. > > > > >>>> > > > > >>>> Can't we get the sub-element from the original UFL function? > > > > >>> > > > > >>> Not when we return a SubSpace which is a compiled C++ structure. To > > > > >>> be able to construct the ufl.FiniteElement (done in the class > > > > >>> FunctionSpaceFromCpp in functionspace.py) we use the signature of > > > > >>> the cpp.FiniteElement. > > > > >>> > > > > >>>> If I do > > > > >>>> > > > > >>>> (u0, u1) = pde.solve().split() > > > > >>>> > > > > >>>> are u0 and u1 UFL Functions, or just cpp Functions? > > > > >>> > > > > >>> They should be both. Their FunctionSpaces (self._V) are constructed > > > > >>> using the the FunctionSpace.sub(i) (operator[]) method, which > > > > >>> returns the compiled SubSpace I am talking about above. > > > > >> > > > > >> OK, but if we have > > > > >> > > > > >> U = pde.solve() > > > > >> > > > > >> and U is a UFL Function, can't the UFL finiteelement for U be > > > > >> accessed, and then the UFL sub-element(s) accessed and then > > > > >> compiled? > > > > > > > > > > Yes, this should be possible! (Did not think of getting the sub > > > > > element from a mixed ufl.element :P) > > > > > > > > > > However we do not have to compile them, as we needed to go the other > > > > > way, from compiled to UFL. > > > > > > > > OK. Now the situation is clear to me. > > > > > > > > > I still think the signature() -> UFL object is a neat feature! > > > > > > > > The problem is that there is nothing that says that a form compiler > > > > that uses UFL and produces UFC-compliant code must return the UFL > > > > signature (repr) in ufc::finite_element::signature(). > > > > > > True. However that is something we discussed a year ago when we > > > implemented the transition to FunctionSpace in PyDOLFIN. I thought this > > > went into the ufc documentation, but I now see that this is not the case. > > > For now... > > > > > > Lets get a blueprint at ufc and here what folks says. > > > > > > Johan > > > > How about adding an optional function to the UFC interface for > > returning the UFL string: > > > > virtual std::string ufl_repr() const { return ""; } > > Look like this is already described as a Blueprint, which comes from an old > point in the TODO file. > > <https://blueprints.launchpad.net/ufc/+spec/string-description> > > I think Martin added it when we discussed this a while back.
ok. I've added some comments to that blueprint now. -- Anders
signature.asc
Description: Digital signature
_______________________________________________ DOLFIN-dev mailing list DOLFIN-dev@fenics.org http://www.fenics.org/mailman/listinfo/dolfin-dev