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
|
import math
from helpers import compute_volume
import pygmsh
def test_union():
with pygmsh.occ.Geometry() as geom:
geom.characteristic_length_min = 0.1
geom.characteristic_length_max = 0.1
rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
disk_w = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
disk_e = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
geom.boolean_union([rectangle, disk_w, disk_e])
mesh = geom.generate_mesh()
ref = 4.780361
assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
return mesh
def test_intersection():
with pygmsh.occ.Geometry() as geom:
angles = [math.pi * 3 / 6, math.pi * 7 / 6, math.pi * 11 / 6]
disks = [
geom.add_disk([math.cos(angles[0]), math.sin(angles[0]), 0.0], 1.5),
geom.add_disk([math.cos(angles[1]), math.sin(angles[1]), 0.0], 1.5),
geom.add_disk([math.cos(angles[2]), math.sin(angles[2]), 0.0], 1.5),
]
geom.boolean_intersection(disks)
mesh = geom.generate_mesh()
ref = 1.0290109753807914
assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
return mesh
def test_difference():
with pygmsh.occ.Geometry() as geom:
geom.characteristic_length_min = 0.1
geom.characteristic_length_max = 0.1
rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
disk_w = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
disk_e = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
geom.boolean_union([disk_w, disk_e])
geom.boolean_difference(rectangle, geom.boolean_union([disk_w, disk_e]))
mesh = geom.generate_mesh()
ref = 3.2196387
assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
return mesh
def test_all():
with pygmsh.occ.Geometry() as geom:
geom.characteristic_length_min = 0.1
geom.characteristic_length_max = 0.1
rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
disk1 = geom.add_disk([-1.0, 0.0, 0.0], 0.5)
disk2 = geom.add_disk([+1.0, 0.0, 0.0], 0.5)
union = geom.boolean_union([rectangle, disk1, disk2])
disk3 = geom.add_disk([0.0, -1.0, 0.0], 0.5)
disk4 = geom.add_disk([0.0, +1.0, 0.0], 0.5)
geom.boolean_difference(union, geom.boolean_union([disk3, disk4]))
mesh = geom.generate_mesh()
ref = 4.0
assert abs(compute_volume(mesh) - ref) < 1.0e-2 * ref
return mesh
if __name__ == "__main__":
test_difference().write("boolean.vtu")
|