Peacock.jl icon indicating copy to clipboard operation
Peacock.jl copied to clipboard

Shapes for constructing geometries

Open sp94 opened this issue 3 years ago • 0 comments

Problem

Currently the geometry is defined by specifying an epf(x,y) function and a muf(x,y) function,

geometry = Geometry(epf, muf, ...)

This is straightforward for simple geometries but it becomes cumbersome if the geometry is made of multiple shapes.

We should introduce an additional interface for creating geometries,

geometry = Geometry(shapes, ...)

where shapes is a (nested) list of AbstractShape subtypes, eg

# accept nested list so we can use list comprehensions inside
shapes = [
    Circle(r,ep=4),
    [Rectangle(Lx,Ly,ep=3,origin=[n,0]) for n in -1:1]
]

and epf(x,y) and muf(x,y) are automatically generated from the flattened shapes, working in reverse order such that the last shape is on top.

Shapes

We should include some simple shapes and transforms for defining geometry, such as Ellipse or Rectangle. For example these shapes are available in meep: https://meep.readthedocs.io/en/latest/Python_User_Interface/#geometricobject

We should also include a Background shape if the user wants to override the default values of ep=1 and mu=1, eg

shapes = [Circle(ep=4)]  # assumes background is ep=1, mu=1
shapes = [Background(ep=2), Circle(ep=4)]  # overrides default background

Shapes should default to ep=1, mu=1, origin=[0,0], angle=0, with dimensions (eg radius) as the positional arguments.

Transforms and piping

We can make use of Julia's function composition/piping for a nice interface: https://docs.julialang.org/en/v1/manual/functions/#Function-composition-and-piping

Desired interface:

ellipses = [Ellipse(r1,r2,ep=11.7) |> translate(R,0) |> rotate(60n) for n in 1:6]
geometry = Geometry(ellipses, 1, a1, a2, d1, d2)

image

sp94 avatar Sep 22 '20 21:09 sp94