Please clarify behavior of "exterior_facet_domains"

Asked by JG

Hello -- I could not find documentation on how to use "exterior_facet_domains" correctly. By trial and error I observed the following confusing behavior (python file below). I will appreciate any clarification on how to use this option correctly. Thanks! --Jay

--------------------------

from dolfin import *

msh = UnitSquare(2,2)
g = Constant(3.)
g1 = Constant(1.)

# boundary part
class Top(SubDomain):
    def inside(self, x, on_boundary):
        return on_boundary and abs(x[1]-1) < DOLFIN_EPS
boundary_parts = MeshFunction("uint", msh, msh.topology().dim()-1)
boundary_parts.set_all(0)
Gamma = Top()
Gamma.mark(boundary_parts, 1)

# assemble a form
U = FunctionSpace(msh, 'Raviart-Thomas', 2)
v = TestFunction(U)
n = FacetNormal(msh)
L = g*ds + g1*ds(1)

# unfortunately, assembling L in 3 ways, we obtain 3 different values
b1 = assemble( L, exterior_facet_domains=boundary_parts,mesh=msh)
b2 = assemble( L, mesh=msh)
b3 = assemble( g*ds, mesh=msh) + \
     assemble( g1*ds(1), exterior_facet_domains=boundary_parts, mesh=msh)

print (b1, b2, b3) # only b3 gives the correct value

Question information

Language:
English Edit question
Status:
Solved
For:
DOLFIN Edit question
Assignee:
No assignee Edit question
Solved by:
Johan Hake
Solved:
Last query:
Last reply:
Revision history for this message
Best Johan Hake (johan-hake) said :
#1

ds is just short for ds(0). ds does not stand for a boundary integral over the
whole domain. It is just a boundary intergral over the zeros domain.

What you want is:

  L = g*ds(0) + (g+g1)*ds(1)
  b1 = assemble( L, exterior_facet_domains=boundary_parts,mesh=msh)

In this way g will be assembled over the whole domain and g1 only over
subdomain 1.

We have discused introducing a boundary measure, a la ds, which should
represent the whole domain, but it became too complicated to implement.

Johan

On Thursday December 2 2010 13:51:18 JG wrote:
> New question #136385 on DOLFIN:
> https://answers.launchpad.net/dolfin/+question/136385
>
> Hello -- I could not find documentation on how to use
> "exterior_facet_domains" correctly. By trial and error I observed the
> following confusing behavior (python file below). I will appreciate any
> clarification on how to use this option correctly. Thanks! --Jay
>
> --------------------------
>
> from dolfin import *
>
> msh = UnitSquare(2,2)
> g = Constant(3.)
> g1 = Constant(1.)
>
> # boundary part
> class Top(SubDomain):
> def inside(self, x, on_boundary):
> return on_boundary and abs(x[1]-1) < DOLFIN_EPS
> boundary_parts = MeshFunction("uint", msh, msh.topology().dim()-1)
> boundary_parts.set_all(0)
> Gamma = Top()
> Gamma.mark(boundary_parts, 1)
>
> # assemble a form
> U = FunctionSpace(msh, 'Raviart-Thomas', 2)
> v = TestFunction(U)
> n = FacetNormal(msh)
> L = g*ds + g1*ds(1)
>
> # unfortunately, assembling L in 3 ways, we obtain 3 different values
> b1 = assemble( L, exterior_facet_domains=boundary_parts,mesh=msh)
> b2 = assemble( L, mesh=msh)
> b3 = assemble( g*ds, mesh=msh) + \
> assemble( g1*ds(1), exterior_facet_domains=boundary_parts, mesh=msh)
>
> print (b1, b2, b3) # only b3 gives the correct value
>
>
> You received this question notification because you are a member of
> DOLFIN Team, which is an answer contact for DOLFIN.
>
> _______________________________________________
> Mailing list: https://launchpad.net/~dolfin
> Post to : <email address hidden>
> Unsubscribe : https://launchpad.net/~dolfin
> More help : https://help.launchpad.net/ListHelp

Revision history for this message
JG (jayg-ufl) said :
#2

Johan -- Thanks, that explains it well. --Jay