-
Notifications
You must be signed in to change notification settings - Fork 591
/
mode-decomposition.ctl
100 lines (74 loc) · 3.8 KB
/
mode-decomposition.ctl
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
;; reflectance spectra of a waveguide taper from the Meep tutorial
(set-param! resolution 61) ; pixels/μm
(define-param w1 1.0) ; width of waveguide 1
(define-param w2 2.0) ; width of waveguide 2
(define-param Lw 10.0) ; length of waveguides 1 and 2
(define-param Lt 8.0) ; length of waveguide taper
(define-param dair 3.0) ; length of air region
(define-param dpml-x 6.0) ; length of PML in x direction
(define-param dpml-y 2.0) ; length of PML in y direction
(define sx (+ dpml-x Lw Lt Lw dpml-x))
(define sy (+ dpml-y dair w2 dair dpml-y))
(define cell (make lattice (size sx sy no-size)))
(set! geometry-lattice cell)
(define Si (make medium (epsilon 12.0)))
(define boundary-layers (list (make pml (direction X) (thickness dpml-x))
(make pml (direction Y) (thickness dpml-y))))
(set! pml-layers boundary-layers)
(define-param lcen 6.67) ; mode wavelength
(define fcen (/ lcen)) ; mode frequency
(define eig-src (list (make eigenmode-source
(src (make gaussian-src (frequency fcen) (fwidth (* 0.2 fcen))))
(center (vector3 (+ (* -0.5 sx) dpml-x (* 0.2 Lw)) 0 0))
(size 0 (- sy (* 2 dpml-y)) 0)
(eig-band 1)
(eig-match-freq? true)
(eig-parity (+ ODD-Z EVEN-Y)))))
(set! sources eig-src)
; straight waveguide
(define sw-vertices (list (vector3 (- (* -0.5 sx) 1) (* 0.5 w1) 0)
(vector3 (+ (* 0.5 sx) 1) (* 0.5 w1) 0)
(vector3 (+ (* 0.5 sx) 1) (* -0.5 w1) 0)
(vector3 (- (* -0.5 sx) 1) (* -0.5 w1) 0)))
(set! geometry (list (make prism
(vertices sw-vertices)
(axis 0 0 1)
(center auto-center)
(height infinity)
(material Si))))
(define symm (list (make mirror-sym (direction Y))))
(set! symmetries symm)
(define mon-pt (vector3 (+ (* -0.5 sx) dpml-x (* 0.7 Lw)) 0 0))
(define flux (add-flux fcen 0 1 (make flux-region (center mon-pt) (size 0 (- sy (* 2 dpml-y)) 0))))
(run-sources+ (stop-when-fields-decayed 50 Ez mon-pt 1e-9))
(save-flux "flux" flux)
(define res (get-eigenmode-coefficients flux (list 1) #:eig-parity (+ ODD-Z EVEN-Y)))
(define incident-coeffs (array-ref (list-ref res 0) 0 0 0))
(define incident-flux (list-ref (get-fluxes flux) 0))
(reset-meep)
(set! geometry-lattice cell)
(set! pml-layers boundary-layers)
(set! sources eig-src)
; linear taper
(define tp-vertices (list (vector3 (- (* -0.5 sx) 1) (* 0.5 w1) 0)
(vector3 (* -0.5 Lt) (* 0.5 w1) 0)
(vector3 (* 0.5 Lt) (* 0.5 w2) 0)
(vector3 (+ (* 0.5 sx) 1) (* 0.5 w2) 0)
(vector3 (+ (* 0.5 sx) 1) (* -0.5 w2) 0)
(vector3 (* 0.5 Lt) (* -0.5 w2) 0)
(vector3 (* -0.5 Lt) (* -0.5 w1) 0)
(vector3 (- (* -0.5 sx) 1) (* -0.5 w1) 0)))
(set! geometry (list (make prism
(vertices tp-vertices)
(axis 0 0 1)
(center auto-center)
(height infinity)
(material Si))))
(set! symmetries symm)
(set! flux (add-flux fcen 0 1 (make flux-region (center mon-pt) (size 0 (- sy (* 2 dpml-y)) 0))))
(load-minus-flux "flux" flux)
(run-sources+ (stop-when-fields-decayed 50 Ez mon-pt 1e-9))
(set! res (get-eigenmode-coefficients flux (list 1) #:eig-parity (+ ODD-Z EVEN-Y)))
(define taper-coeffs (array-ref (list-ref res 0) 0 0 1))
(define taper-flux (list-ref (get-fluxes flux) 0))
(print "refl:, " Lt ", " (/ (sqr (magnitude taper-coeffs)) (sqr (magnitude incident-coeffs))) ", " (/ (- taper-flux) incident-flux) "\n")