← Back to team overview

dolfin team mailing list archive

Re: Non-intuitiveness with assembling over sub_domains

 



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.

I was going to suggest this but I realize now we would need to change
the UFC interface (and FFC). It is currently based on the function

 num_foo_integrals

BTW, is there a bug in the code generation for this function? If I do:
element = FiniteElement("Lagrange", triangle, 1)
f = Coefficient(element)
M = inner(f, f)*dx + inner(f, f)*dx(2)

the return value of num_cell_integrals is 3, but create_cell_integral(), only return an integral in case 0 and 2.

returning the number of integrals and

 create_foo_integral(i)

returning the integral for the terms on sub domain i.

This would need to be extended, possibly by overloading with

 create_foo_integral()

which would return the terms that are present on all sub domains.

Should it return an array of integrals over sub domains, or one integral like:
Integrand_0*dx(0) + Integrand_1*dx(1) --> (Integrand_0 + Integrand_1)*dx(-1) ?
The second option will result in a lot of redundant code being generated.

Is it worth the effort of updating ufc.h, the UFC manual, the
assembler and FFC?

No.

Kristian

--
Anders

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkvDJpkACgkQTuwUCDsYZdG11gCfTB2E+6XObaar1f1yDqYt1vzj
dywAn3xh49BZFoIiiYd4GnDFDYTX1eHx
=N5PH
-----END PGP SIGNATURE-----

_______________________________________________
Mailing list: https://launchpad.net/~dolfin
Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~dolfin
More help   : https://help.launchpad.net/ListHelp



Attachment: signature.asc
Description: OpenPGP digital signature


Follow ups

References