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?

Garth


>> > Isn't it possible to use what repr(ufl_element) returns to define the
>> > signature of an element or isn't the ufl_element available in
>> > ffc.FiniteElement?
>> 
>> Yes. I committed this change to FFC a short while ago.
>
>Ok!
>
>Johan
>
>> Garth
>> 
>> > Johan
>> >
>> >>> If I look at the generated code in Poisson.h (the DOLFIN demo), the
>> >>> signature is
>> >>>
>> >>>     "FiniteElement('Lagrange', 'triangle', 1)"
>> >>>
>> >>> so the restricted one looks consistent to me. How does PyDOFLIN use 
>> >>> the signature?
>> >>>
>> >>> Garth
>> >>>
>> >>>> Johan
>> >>>>
>> >>>>> Garth
>> >>>>>
>> >>>>>> Garth
>> >>>>>>
>> >>>>>>    File "solver.py", line 96, in solve
>> >>>>>>      (uhat, uu) = Uh.split()
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/function.py", line 150, in split
>> >>>>>>      return tuple(self._sub(i,deepcopy) for i in
>> >>>>>> xrange(self._V.num_sub_spaces()))
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/function.py", line 150, in <genexpr>
>> >>>>>>      return tuple(self._sub(i,deepcopy) for i in
>> >>>>>> xrange(self._V.num_sub_spaces()))
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/function.py", line 135, in _sub
>> >>>>>>      return Function(self, i)
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/function.py", line 80, in __init__
>> >>>>>>      self._V = V.sub(i)
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/functionspace.py", line 88, in sub
>> >>>>>>      return FunctionSpaceFromCpp(cpp.SubSpace(self,i))
>> >>>>>>    File 
>> >>>>>> "/home/garth/code/fenics/dolfin/dolfin-all/local/lib/python2.6/site- 
>> >>>>>> pa cka
>> >>>>>>
>> >>>>>> ges/dolfin/functionspace.py", line 101, in __init__
>> >>>>>>      self._ufl_element = eval(cppV.element().signature(),
>> >>>>>> ufl.__dict__) File "<string>", line 1
>> >>>>>>      FiniteElement('Lagrange', 'triangle', 1)|_{<interval of 
>> >>>>>> degree 1>}
>> >>>>>>
>> >>>>>>> changeset:   7377:40cca61143c6
>> >>>>>>> user:        "Garth N. Wells <gn...@cam.ac.uk>"
>> >>>>>>> date:        Sat Oct 17 13:24:47 2009 +0100
>> >>>>>>> files:       dolfin/mesh/SubDomain.h
>> >>>>>>> description:
>> >>>>>>> Small formatting fix.
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> changeset:   7376:8ee974ed5f7e
>> >>>>>>> user:        Anders Logg <l...@simula.no>
>> >>>>>>> date:        Sat Oct 17 00:05:34 2009 +0200
>> >>>>>>> files:       dolfin/function/Function.cpp
>> >>>>>>> description:
>> >>>>>>> Remove unnecessary lines in Function::eval noted by Marc S.
>> >>>>>>>
>> >>>>>>>  
>> >>>>>>>  
>> >>>>>>> ------------------------------------------------------------------- 
>> >>>>>>> -- - For more details, visit http://www.fenics.org/hg/dolfin 
>> >>>>>>> _______________________________________________ DOLFIN-dev 
>> >>>>>>> mailing list DOLFIN-dev@fenics.org 
>> >>>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>> >>>>>>
>> >>>>>> _______________________________________________
>> >>>>>> DOLFIN-dev mailing list
>> >>>>>> DOLFIN-dev@fenics.org
>> >>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>> >>>>>
>> >>>>> _______________________________________________
>> >>>>> DOLFIN-dev mailing list
>> >>>>> DOLFIN-dev@fenics.org
>> >>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>> 
>

_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@fenics.org
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to