not sure the ctl file got through (i couldn't access it through gname), so here it is:

; compute R and T for square lattice of spheres for infinite plane wave(s).

;size of computation x = [ -sx/2, sx/2]
;                    y = [ -sy/2, sy/2]
; z = [ -sz/2-pmlt, sz/2+pmlt] - direction of propagation

(print "starting control file\n")
(define  a 1)                   ; lattice constant
(define sx a)
(define sy a)

; size of simulation
(define-param sz 15)            ; guess z direction length
(define-param auto_z? true) ; scale z according to longest wavelength (define-param tol_e 0.01) ; run until energy ratio decays to this value
(define-param max_steps 500000) ;  or until we do this many timesteps
(define-param rad (/ a 2))      ; radius of spheres

(define-param no-slab? false)   ;is there a slab of spheres?

(define-param pc_metal? false)  ; is photonic crystal metal spheres?
(define-param pc_eps (* 1.45 1.45)) ; default epsilon for spheres

; source
(define-param f_min 0.3)        ;minimum frequency
(define-param f_max 1.2)        ;maximum frequency
(define fcen (* 0.5 (+ f_min f_max)))
(define df (* 2 (abs (- f_max f_min))))
(define-param nfreq 601)        ;number of frequency sample points

; misc
(define-param pmlt 1)           ;thickness of PML
(define-param res 64)           ;resolution in unit length, a

(if pc_metal?
(define pc_mat (make dielectric (epsilon 1) ; Drude approximation for lossy metal (polarizations (make polarizability (omega 1e-20) (gamma 0.0313167) (delta-epsilon 9.704152e40))))) (define pc_mat (make dielectric (epsilon pc_eps))) ; otherwise simple dielectric
)

(if auto_z? ; set z direction so about 3 of the longest wavelengths are present before and after slab?
  (if (< f_min 0.1)
   (set-param! sz (/ 10 fcen))
   (set-param! sz (/ 6 f_min))
  )
)

(define z_tot (+ sz a (* 2 pmlt))) ; size of cell in propagation direction = 2 * PML + sz + sphere 'layer'

; record what we are doing
(print "res=" res ", pmlt=" pmlt ", z_tot=" z_tot "\n")
(print "sx=" sx ", sy=" sy ", sz=" sz ", dg=" (/ a res) ", radius=" rad "\n") (print "no-slab?=" no-slab? "pc_metal?=" pc_metal? ", pc_eps=" pc_eps "\n")

(set! geometry-lattice  ;make computational cell
   (make lattice (size sx sy z_tot )))

(set-param! k-point (vector3 0 0 0) ) ; perioidic

(if (not no-slab?)      ;make the slab or not?
  (set! geometry
    (list (make sphere (center 0 0 0) (radius rad) (material pc_mat)))
  )
)

(print "setting PML\n")
(set! pml-layers   ;PML at negative and positive Z bounds
   (list
      (make pml (thickness pmlt) (direction Z) (side  Low))
      (make pml (thickness pmlt) (direction Z) (side High))
   )
)

(print "setting resolution of " res "\n")
(set-param! resolution res)  ;resolution per unit length

(print "setting source\n")
(set! sources (list   ; gaussian at Low Z, plane wave towards High Z
  (make source
    (src (make gaussian-src (frequency fcen) (fwidth df)))
    (component Ex)
    (size sx sx 0)
    (center 0 0 (- (+ 0.5 pmlt) (/ z_tot 2)))
  ))
)

(print "defining flux planes\n")
; define a bunch of flux planes
(define xa (/ (- (/ sz 2) pmlt 2.5) 3))   ; distances between planes
(define xb (+ pmlt 1.0))                ; starting location of planes
;transmission
(define trans1 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (/ z_tot 2) xb (* xa 3.0))) (size sx sy 0) ))) ; near to PC (define trans2 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (/ z_tot 2) xb (* xa 2.0))) (size sx sy 0) ))) (define trans3 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (/ z_tot 2) xb (* xa 1.0))) (size sx sy 0) ))) (define trans4 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (/ z_tot 2) xb (* xa 0.0))) (size sx sy 0) ))) ; far from PC (print "t1=" (- (/ z_tot 2) xb (* xa 3.0)) ", t2=" (- (/ z_tot 2) xb (* xa 2.0)) ", t3=" (- (/ z_tot 2) xb (* xa 1.0)) ", t4=" (- (/ z_tot 2) xb (* xa 0.0)) "\n")

;reflection
(define refl1 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (+ xb (* xa 3.0)) (/ z_tot 2))) (size sx sy 0) ))) ; near to PC (define refl2 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (+ xb (* xa 2.0)) (/ z_tot 2))) (size sx sy 0) ))) (define refl3 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (+ xb (* xa 1.0)) (/ z_tot 2))) (size sx sy 0) ))) (define refl4 (add-flux fcen (- f_max f_min) nfreq (make flux-region (center 0 0 (- (+ xb (* xa 0.0)) (/ z_tot 2))) (size sx sy 0) ))) ; far from PC (print "r1=" (- (+ xb (* xa 3.0)) (/ z_tot 2)) ", r2=" (- (+ xb (* xa 2.0)) (/ z_tot 2)) ", r3=" (- (+ xb (* xa 1.0)) (/ z_tot 2)) ", r4=" (- (+ xb (* xa 0.0)) (/ z_tot 2)) "\n")

(print "commencing simulation...\n")

; if we are doing the slab, read in the results from not doing the slab
(if (not no-slab?)
  (begin
    (print "loading old flux...") (newline)
    (load-minus-flux "refl1-flux" refl1)   ;near to PC
    (load-minus-flux "refl2-flux" refl2)
    (load-minus-flux "refl3-flux" refl3)
    (load-minus-flux "refl4-flux" refl4)   ;far from PC
    (print "done!\n") (newline)
  )
)

; do the simulation
(define tim (- (/ z_tot 3) pmlt)) ;time to travel third of the z direction
(print "time to sample energy: " tim "\n")
(print "run until energy ratio is " tol_e " or # of time steps > " max_steps "\n")
(define tot_energy 0)
(define max_energy -1)
(define ratio 1)
(if (not no-slab?) (output-epsilon))
(run-sources+ (lambda () (or (< ratio tol_e) (> (meep-fields-t-get fields) max_steps)))
    (after-sources (lambda ()
      (if (< max_energy 0)
        (begin
(set! max_energy (meep-fields-field-energy-in-box fields (volume (center 0 0 0) (size sx sy z_tot))))
          (print "Energy after sources off = " max_energy "\n")
        )
      ))
    )
    (at-every tim (lambda ()
(set! tot_energy (meep-fields-field-energy-in-box fields (volume (center 0 0 0) (size sx sy z_tot)) ))
      (set! max_energy (max max_energy tot_energy))
      (set! ratio (/ tot_energy max_energy))
(print "energy decay (t=" (meep-time) "s, " (meep-fields-t-get fields) " timestep) = " tot_energy " / " max_energy " = " ratio "\n"))
    )
)

;if we are not doing a slab, then save the results so we can find R & T later...
(if no-slab?
  (begin
    (save-flux "refl1-flux" refl1)
    (save-flux "refl2-flux" refl2)
    (save-flux "refl3-flux" refl3)
    (save-flux "refl4-flux" refl4)
  )
)

; display the fluxes- start close to PC and move out for both transmission and reflectance
(display-fluxes trans1 trans2 trans3 trans4 refl1 refl2 refl3 refl4)

(print "done with control file\n")


_______________________________________________
meep-discuss mailing list
[email protected]
http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/meep-discuss

Reply via email to