dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #07816
Re: assembly on sub domains
>Anders Logg
>Mon, 28 Jan 2008 02:00:43 -0800
>>On Fri, Jan 25, 2008 at 10:55:27AM -0500, Jake Ostien wrote:
>> I have a question about general usage of SubDomains. I have a problem
>> where I would really like to partition a domain (via some criterion)
>> into 2 sub domains, and then assemble the global system as two separate
>> assemblies over the sub domains. The context here is for plasticity,
>> initially I have a domain that is elastic but evolves such that there
>> are two regions (elastic + plastic). I am currently not dealing with
>> this in a very elegant manner, and I was hoping that if I could somehow
>> generate an elastic sub domain and a plastic sub domain, I could more
>> efficiently assemble. Does that sound possible currently, or could I
>> add something like that in? Eventually I think we'd like to extend the
>> concept to assembly over facets on the boundary of the elastic/plastic
>> interface as well, but this might be a good first step.
>>
>> Jake
>You can define a form as a sum of contributions from different
>subdomains, for example:
>dx0 = Integral("cell", 0)
>dx1 = Integral("cell", 1)
>a = v*u*dx0 + dot(grad(v), grad(u))*dx1
>This gives two terms, one of which will be used in subdomain 0 and the
>other in subdomain 1.
>Subdomains can be specified in DOLFIN by creating a subclass of
>SubDomain and overloading the inside() function, or by specifying a
>MeshFunction<uint> over the cells of the mesh.
>You can also have integrals over arbitrary facets of the domain, like
>for example the boundary between your two subdomains. You can have
>several such integrals:
> ds0 = Integral("exterior facet", 0)
> ds1 = Integral("exterior facet", 1)
> ds2 = Integral("exterior facet", 2)
> dS0 = Integral("interior facet", 0)
> dS1 = Integral("interior facet", 1)
> dS2 = Integral("interior facet", 2)
>--
>Anders
But how could we link the subdomains markers defined in a MeshFunction
with the variational form in the cpp.
Example:
I have in a "Foo.form" something like:
-------------------------------------------------------------------
P1=FiniteElement("Lagrange","tetrahedron",1)
f=Function(P1)
dx0 = Integral("cell", 0)
dx1 = Integral("cell", 1)
a = f*v*u*dx0 + dot(grad(v), grad(u))*dx1
------------------------------------------------------------------
and in "main.cpp" something like
----------------------------------------------------------------------------------------------------------
MeshFunction<unsigned int> b_subdomains(mesh,"b_subdomains.xml");
//Boundary subdomain markers
MeshFunction<unsigned int> v_subdomains(mesh,"v_subdomains.xml");
//Volume subdomain (0 and 1) markers
Function f(mesh,10.0);
FooBilinearForm a( f );//constructors for finite element form's (Problem here)
-----------------------------------------------------------------------------------------------------------
I'm missing something...
Shouldn't
FooBilinearForm a( f );
be replaced by something like
FooBilinearForm a( f ,v_subdomains); ?
--
Nuno David Lopes
Follow ups