← Back to team overview

dolfin team mailing list archive

Re: Non-intuitiveness with assembling over sub_domains

 

On Thursday April 15 2010 11:57:23 Anders Logg wrote:
> On Thu, Apr 15, 2010 at 11:51:00AM -0700, Johan Hake wrote:
> > On Thursday April 15 2010 11:39:28 Anders Logg wrote:
> > > On Mon, Apr 12, 2010 at 10:29:18AM -0700, Johan Hake wrote:
> > > > On Monday April 12 2010 08:43:54 Anders Logg wrote:
> > > > > On Mon, Apr 12, 2010 at 08:32:41AM -0700, Johan Hake wrote:
> > > > > > On Monday April 12 2010 08:14:09 Kristian Oelgaard wrote:
> > > > > > > On 12 April 2010 15:56, Anders Logg <logg@xxxxxxxxx> wrote:
> > > > > > > > On Thu, Apr 08, 2010 at 08:44:21AM -0700, Johan Hake wrote:
> > > > > > > >> On Thursday April 8 2010 08:36:24 Marie Rognes wrote:
> > > > > > > >> > Johan Hake wrote:
> > > > > > > >> > > On Thursday April 8 2010 04:51:24 Marie Rognes wrote:
> > > > > > > >> > >> There is something suboptimal with regard to assembly
> > > > > > > >> > >> over sub_domains specified
> > > > > > > >> > >> by domains (in contrast to markers)
> > > > > > > >> > >> 
> > > > > > > >> > >> Say I have some functional
> > > > > > > >> > >> 
> > > > > > > >> > >> (*)    M = f*ds
> > > > > > > >> > >> 
> > > > > > > >> > >> where f is some function. Let 'domain' be some
> > > > > > > >> > >> sub-domain.
> > > > > > > >> > >> 
> > > > > > > >> > >> Now, it is not clear to me what
> > > > > > > >> > >> 
> > > > > > > >> > >>     v = assemble(M, mesh=mesh,
> > > > > > > >> > >>     exterior_facet_domains=domain)
> > > > > > > >> > >> 
> > > > > > > >> > >> gives. It would be really convenient (for my purposes)
> > > > > > > >> > >> if it gave the same as
> > > > > > > >> > >> 
> > > > > > > >> > >>     v = assemble(M, mesh=mesh)
> > > > > > > >> > > 
> > > > > > > >> > > Considering that ds defaults to ds(0) I think it is a
> > > > > > > >> > > logical behaviour.
> > > > > > > >> > 
> > > > > > > >> > So
> > > > > > > >> > 
> > > > > > > >> >     ds == ds(0)
> > > > > > > >> > 
> > > > > > > >> > ?
> > > > > > > >> 
> > > > > > > >> In ufl/objects.py
> > > > > > > >> 
> > > > > > > >>   ds = Measure(Measure.EXTERIOR_FACET, 0)
> > > > > > > >> 
> > > > > > > >> So I guess yes.
> > > > > > > > 
> > > > > > > > Yes, this is the case.
> > > > > > > > 
> > > > > > > > I think the current behavior is correct, if one knows that ds
> > > > > > > > = ds(0).
> > > > > > > > 
> > > > > > > > But I understand it can be confusing. Marie and I discussed
> > > > > > > > this last week and I suggested that we let
> > > > > > > > 
> > > > > > > >  ds = ds(-1)
> > > > > > > > 
> > > > > > > > and that should denote integration over all sub domains, and
> > > > > > > > ds(0) would mean integration specifically over sub domain 0.
> > > > > > 
> > > > > > What would the default subdomain then be which we integrate over
> > > > > > when a SubDomain is passed?
> > > > > > 
> > > > > > I don't know if I really get what you are trying to accomplish.
> > > > > > 
> > > > > > Whould:
> > > > > >   f*ds + g*ds(0) + h*ds(1)
> > > > > > 
> > > > > > create three integrals one for "subdomain" -1 which returns the
> > > > > > integral over all subdomains, and one for each of 0 and 1.
> > > > > 
> > > > > Yes.
> > > > > 
> > > > > > Sounds like this is best managed above the UFC/UFL layer.
> > > > > 
> > > > > Yes, but I don't see how that should be done. Somehow we need to
> > > > > pass the information from
> > > > > 
> > > > >   f*ds + g*ds(0) + h*ds(1)
> > > > > 
> > > > > to the assembler.
> > > > > 
> > > > > One option would be to add f*ds to all the sub integrals. So we
> > > > > don't change the UFC interface (or DOLFIN) but do the following:
> > > > > 
> > > > > 1. ds = ds(-1)
> > > > > 
> > > > > 2. FFC adds ds(-1) to all its sub domain integrals.
> > > > 
> > > > But how would one integrate over just the ds domain?
> > > 
> > > Sorry for my late reply on this one...
> > > 
> > > Anyway, integrating over just the ds domain would just be
> > > 
> > >   f*ds
> > > 
> > > I think this should work out fine. Here's a summary (now with dx
> > > instead of ds).
> > > 
> > > 1. Omega = Omega_0 U Omega_1 U Omega_2 ...
> > > 2. dx means integral over Omega
> > > 3. dx(i) means integral over Omega_i
> > > 
> > > So if one writes
> > > 
> > >   f*dx + g*dx(0)
> > > 
> > > that means that the integral is a sum of two integrals, one over the
> > > whole domain and one just over the domain marked with 0.
> > > 
> > > This can alternatively be expressed as
> > > 
> > >   (f+g)*dx(0) + f*dx(not marked 0)
> > 
> > Ok.
> > 
> > > This can be handled without changing the UFC interface by making just
> > > one change in UFL (or FFC), which is to add the terms involving dx
> > > (which we can represent as dx(-1)) to all the other integrals.
> > 
> > It will be difficult to ask an UFC form to create the -1 integral as the
> > interface now use unsigned int. But another int might be as god?
> 
> The point is that UFC should not create the -1 integral. It will be
> replaced by other integrals. The terms defined on dx(-1) will be added
> to all the other terms.
>
> Something I realized now is what happens if there are no other terms,
> but then we must simply add it to dx(0).
> 
> And we should probably also add it to all integrals numbered before
> the highest numbered integral, even if those are missing, so if we
> have
> 
>   f*dx + g*dx(10)
> 
> then then f*dx term will be added to the dx(0), dx(1), ..., dx(9)
> integrals.

I think this gets complicated. Wouldn't the easiest sollution be to let dx(0) 
always denote the whole domain? This would then be handed naturally in DOLFIN, 
by always integrating over domain 0 if such an integral exist. Passing a 
MeshFunction with domain markers of 0 could then either be ignored or we could 
issue a warning?

> > > Then DOLFIN will happily iterate over all cells and on each cell check
> > > how the cell is marked (=i) and evaluate integral number i.
> > 
> > Why does this sounds intuitive now and not when it was first introduced?
> > Time has its effects! :)
> 
> I guess...
> 
> > But then we might remove the possibility (in PyDOLFIN) to pass a
> > SubDomain as foo_domains, because it will not be clear what subdomain
> > (marker) it should represent.
> 
> That's also possible in C++. It's always been unclear what that does
> so it should be removed.

Ok.

Johan

> 
> --
> Anders



Follow ups

References