← Back to team overview

dolfin team mailing list archive

Re: Python sun functions

 

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?

--
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

Attachment: signature.asc
Description: Digital signature


Follow ups

References