File: demo_multimesh_marking.py

package info (click to toggle)
dolfin 2018.1.0.post1-16
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 28,764 kB
  • sloc: xml: 104,040; cpp: 98,856; python: 22,511; makefile: 204; sh: 182
file content (77 lines) | stat: -rw-r--r-- 2,036 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from dolfin import *

if MPI.size(MPI.comm_world) > 1:
    info("Sorry, this demo does not (yet) run in parallel.")
    exit(0)

# Generate meshes
background_mesh = UnitSquareMesh(16, 16)
annulus_mesh = Mesh("../donut.xml.gz")

center = Point(0.5, 0.5)
r = 0.2

# Build the multimesh
multimesh = MultiMesh()
multimesh.add(background_mesh)
multimesh.add(annulus_mesh)
multimesh.build()

# Identify background cells within the hole and mark them as covered
multimesh.auto_cover(0, center)

# Variational formulation
V = MultiMeshFunctionSpace(multimesh, "P", 1)
u, v = TrialFunction(V), TestFunction(V)
n = FacetNormal(multimesh)
h = 2*Circumradius(multimesh)

a = (inner(grad(u), grad(v)) * dX
        - inner(avg(grad(u)), jump(v, n)) * dI
        - inner(avg(grad(v)), jump(u, n)) * dI
        + Constant(10) / avg(h) * jump(u) * jump(v) * dI
        + inner(jump(grad(u)), jump(grad(v))) * dO)

L = Constant(1) * v * dX

# Assemble system
A = assemble_multimesh(a)
b = assemble_multimesh(L)

# Will mark boundary of outer mesh
class OuterBoundary(SubDomain):
    def inside(self, x, on_boundary):
        return on_boundary
outer = OuterBoundary()
mf0 = MeshFunction("size_t", multimesh.part(0), multimesh.part(0).topology().dim() - 1)
outer.mark(mf0, 2)
bc0 = MultiMeshDirichletBC(V, Constant(0), mf0, 2, 0)

# Will mark inner part of top mesh
class InnerBoundary(SubDomain):
    def inside(self, x, on_boundary):
        return on_boundary and ((x[0] - 0.5)**2 + (x[1] - 0.5)**2 < 0.5*r)
inner = InnerBoundary()
mf1 = MeshFunction("size_t", multimesh.part(1), multimesh.part(1).topology().dim()-1)
inner.mark(mf1 , 3)
bc1 = MultiMeshDirichletBC(V, Constant(1), mf1, 3, 1)
bcs = [bc0, bc1]

[bc.apply(A, b) for bc in bcs]
V.lock_inactive_dofs(A, b)

# Solve and plot
uh = MultiMeshFunction(V)
x = uh.vector()

solve(A, x, b)

outfile0 = XDMFFile("output/u0.xdmf")
outfile1 = XDMFFile("output/u1.xdmf")

outfile0.write(uh.part(0, deepcopy=True), 0.0)
outfile1.write(uh.part(1, deepcopy=True), 0.0)

outfile0.close()
outfile1.close()