← Back to team overview

dolfin team mailing list archive

Re: Assembling the same boundary integral with different coefficients

 

2008/6/6 Anders Logg <logg@xxxxxxxxx>:
> On Fri, Jun 06, 2008 at 01:40:15PM +0200, Martin Sandve Alnæs wrote:
>> 2008/6/6 Johan Hake <hake@xxxxxxxxx>:
>> > On Friday 06 June 2008 13:19:54 Martin Sandve Alnæs wrote:
>> >> Say I have a form
>> >>
>> >> a = u*v*dx + f*v*ds
>> >
>> > Isn't it possible to do
>> >
>> > a = u*v*dx + f0*v*ds0 + f1*v*ds1
>> >
>> > Johan
>>
>> Sure, but my forms are more complicated than that,
>> and it would add to the compilation time for the forms.
>
> Well, there are two options:
>
> 1. Use two subdomains and two Functions, one on each domain.
>
> 2. Use one subdomain and one Function for the whole domain.
>
> If you think (1) costs too much, then you need to define your Function
> in such a way that it is takes care of the different domains. I guess
> it should be possible to create one Function f which owns two
> Functions f0 and f1, overload interpolate() for f and there send the
> data on to either f0 or f1.
>
> We could add an interface for this, something like
>
>  f = Function([f0, f1, f2, ...], sub_domains)
>
> but it seems overly complicated and specific.

Yes, it quickly becomes very complicated.

Another solution could be to add an argument
"bool zero_tensor=true" next to reset_tensor in
assemble functions, define a separate form
with just the boundary integral, and call assemble
repeatedly for each coefficient set with zero_tensor=false.
This would be much efficient if iteration directly
over a subdomain was possible, which will require
the "inverse" of a MeshFunction.

--
Martin


Follow ups

References