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")
|