dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #16316
Re: Python sun functions
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.
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().
--
Anders
Attachment:
signature.asc
Description: Digital signature
Follow ups
References