← Back to team overview

dolfin team mailing list archive

Re: Python sun functions

 

On Monday 19 October 2009 13:38:09 Garth N. Wells wrote:
> Anders Logg wrote:
> > On Mon, Oct 19, 2009 at 12:21:36PM +0100, Garth N. Wells wrote:
> >> Anders Logg wrote:
> >>> On Sat, Oct 17, 2009 at 05:41:54PM +0100, Garth N. Wells wrote:
> >>>> Anders Logg wrote:
> >>>>> On Sat, Oct 17, 2009 at 01:54:57PM +0100, Garth N. Wells wrote:
> >>>>>> Johan Hake wrote:
> >>>>>>> On Saturday 17 October 2009 12:32:54 Garth N. Wells wrote:
> >>>>>>>> Will
> >>>>>>>>
> >>>>>>>>      uh = U[1]
> >>>>>>>>
> >>>>>>>> return a deep or shallow copy of the sub-Function?
> >>>>>>>
> >>>>>>> To avoid confusion with the ufl interface we have limited the
> >>>>>>> interface for SubFunctions in PyDOLFIN to split. split returns a
> >>>>>>> shallow copy by default. pass True to split and it will return a
> >>>>>>> deepcopy. In your case it would be:
> >>>>>>>
> >>>>>>>   uh = U.split()[0]
> >>>>>>>
> >>>>>>> and
> >>>>>>>
> >>>>>>>   uh = U.split(True)[0]
> >>>>>>>
> >>>>>>> operator[] is used when you define forms. We have not yet managed
> >>>>>>> to merge the two operations into one.
> >>>>>>
> >>>>>> OK. Do we still have the function 'sub'?
> >>>>>>
> >>>>>>>> Where is the operator [] define for sub-Functions?
> >>>>>>>
> >>>>>>> The operator you are using is the ufl one, which is defined in
> >>>>>>> ufl.exproperators.py.
> >>>>>>
> >>>>>> OK, but it's not clear to me then what's happing with this extract
> >>>>>> of my code:
> >>>>>>
> >>>>>>   problem = VariationalProblem(a, L, bcs)
> >>>>>>   Uh = problem.solve()
> >>>>>>
> >>>>>>   u = Expression("epx(x[0])", V = Vexact)
> >>>>>>
> >>>>>>   uh = Uh[1]
> >>>>>>   M = (uh-u)*(uh-u)*dx
> >>>>>>   error = sqrt(assemble(M, mesh=mesh))
> >>>>>
> >>>>> This should work fine since uh will be a component of the coefficient
> >>>>> Uh in the UFL form.
> >>>>>
> >>>>> Same as when you write say inner(v, u)*dx or anything else that
> >>>>> accesses components.
> >>>>>
> >>>>> So in summary [] can be used for any purpose in forms. It can also be
> >>>>> used for plotting, but extracting the vector etc will not work.
> >>>>
> >>>> It works as expected, but what's going on behind the scenes? Who is
> >>>> creating the dof map and is the vector being copied?
> >>>
> >>> There's nothing out of the ordinary going on behind the scenes.
> >>
> >> There must be something going on - either a reference to or a copy of
> >> the underlying vector, and a dof map. Where are these coming from?
> >
> > Why must there be a reference? Are we discussing different things
> > here?
> 
> This is what I'm doing/want to know:
> 
>    # Compute Uh
>    Uh = my_pde.solve()
> 
>    # Get sub-function. uh is both a UFL and a cpp Function. What's
>    # happening on the cpp side here?
>    uh = Uh[1]

Nothing, uh is just an Indexed ufl construct which makes no sense until one 
use it in a form. 

This is illustrated by:

  m = UnitSquare(1,1)
  V = VectorFunctionSpace(m,"CG",1)
  U = Function(V)
  uh = u[0]
  s = uh*dx
  U == s.form_data().original_functions[0]

The original mixed function is still intact. When the form is assembled it 
will be appropriately evaluated. 

But this do you know much more about than me :P

Johan

> 
> Garth
> 
> > --
> > Anders
> >
> >> Garth
> >>
> >>> When you write
> >>>
> >>>   uh = Uh[1]
> >>>
> >>> it's no different from doing
> >>>
> >>>   a = uh[1]*v*dx
> >>>
> >>> or doing
> >>>
> >>>   gradu = grad(u)
> >>>   a = dot(grad(v), gradu)*dx
> >>>
> >>> gradu is not a new Function, it's a UFL expression involving the grad
> >>> operator and the Function u. gradu can be used in forms and plotted
> >>> (since the plot will project it to a Function), but you can't do
> >>> gradu.vector().
> >>
> >> _______________________________________________
> >> DOLFIN-dev mailing list
> >> DOLFIN-dev@xxxxxxxxxx
> >> http://www.fenics.org/mailman/listinfo/dolfin-dev
> >>
> >> ------------------------------------------------------------------------
> >>
> >> _______________________________________________
> >> DOLFIN-dev mailing list
> >> DOLFIN-dev@xxxxxxxxxx
> >> http://www.fenics.org/mailman/listinfo/dolfin-dev
> 
> _______________________________________________
> DOLFIN-dev mailing list
> DOLFIN-dev@xxxxxxxxxx
> http://www.fenics.org/mailman/listinfo/dolfin-dev
> 


References