Dear Tjeerd, Steven and other meep users,
I am calculating a transmission spectrum through 2D photonic crystal and
I expirienced with the same problem.
For some parameters and when the structure is present I cannot get the
fields to decay, while normalization run is OK.
If length L is set to 16 (see .ctl file below) and n to 90 ( 90th mode --
meaning that transverse momenta equals to 2*\pi*n/sy ) the fields decay
till some value and then blow up. I tried to experiment a bit, and I have
figured out that the process can be made stable by disabling subpixel
averaging (I hope the following table could be usefull):
-----------------------------------------------
parametrs ! minimal rate !
-----------------------------------------------
res=20,sx=30, ! 1.14*10^-7 !
ph_diff=2\pi ! then blow up !
-----------------------------------------------
res=20,sx=30, ! 1.10*10^-7 !
ph_diff=0 ! then blow up !
-----------------------------------------------
res=20,sx=50, ! 1.39*10^-7 !
ph_diff=2\pi ! then blow up !
-----------------------------------------------
res=20,sx=30, ! 1.15*10^-7 !
ph_diff=2\pi ! then blow up !
pml_st=2.0 ! !
-----------------------------------------------
res=22,sx=50, ! 5.28*10^-4 !
ph_diff=2\pi ! then blow up !
-----------------------------------------------
res=22,sx=50, ! 5.26*10^-4 !
ph_diff=0 ! then blow up !
-----------------------------------------------
res=24,sx=50, ! 2.29*10^-6 !
ph_diff=2\pi ! then blow up !
-----------------------------------------------
res=20,sx=30, ! < 10^-7 !
ph_diff=2\pi ! !
eps-averaging? ! !
false ! !
-----------------------------------------------
where "res" -- resolution, "ph_diff" -- phase difference between top and
bottom of the computational cell,
"pml_st" -- strenght of pml layers.
In this example the decay rate was set to 10^-7; however for some other
parameters and structures fields decay at most till 0.001. It could be that
for the same mode they decay for L=5 or 10 and blow up for L=9.
So, try to (set! eps-averaging? false) and see whether it blows up or not.
P.S. I also noticed that setting phase difference to get periodic boundary
conditions to 0 instead of 2\pi decreases remarkably memory usage.
ctl file:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
(define-param pmlthick 5)
(define-param sx (+ 30 (* 2 pmlthick)) )
(define-param sy 300)
(set! geometry-lattice (make lattice (size sx sy no-size)))
;PARAMETERS
(define-param norm false)
(define-param f 0.431) ; filling fraction f~(4 Pi r^2)/(2 Sqrt[3] a^2)
(define-param eps 14) ; dielectric
(define-param L 16)
(define-param a 1) ; lattice constant (distance between neibouhring rods)
(define-param N (+ 1 (* 2 (round (/ (* 0.5 L) (* (sqrt 3) a)) ) )))
(define-param r (* (sqrt (* f (/ (* 2 (sqrt 3)) (* 4 pi)))) a)) ; radius of
rodes
(if (not norm)
(set! geometry
(append
(geometric-objects-duplicates (vector3 (* 1.73205 a) 0) (* -1 (/ (- N 1)
2)) (/ (- N 1) 2)
(geometric-object-duplicates (vector3 0 a) 0 (+ (/ sy a) 1)
(make cylinder (center 0 (* -0.5 sy)) (radius r) (height infinity)
(material (make dielectric (epsilon eps))))
)
)
(geometric-objects-duplicates (vector3 (* 1.73205 a) 0) (* -1 (/ (- N 1)
2)) (- (/ (- N 1) 2) 1)
(geometric-object-duplicates (vector3 0 a) 0 (/ sy a)
(make cylinder (center (* 0.5 (* 1.73205 a)) (+ (* -1 (* 0.5 sy)) (*
0.5 a))) (radius r) (height infinity)
(material (make dielectric (epsilon eps))))
)
)
)
)
)
(set! pml-layers (list (make pml (thickness pmlthick) (direction X) )))
(set-param! k-point (vector3 0 0) )
(set! resolution 20)
(define-param fcen 0.4) ; pulse center frequency
(define-param df 0.06) ; pulse width (in frequency)
(define-param n 0)
(define-param K (vector3 0(/ (* (* 2 pi) n) sy)) )
(define ((pw-amp K y0) y)
(exp (* 0+1i (vector3-dot K (vector3+ y y0)))))
(set! sources (list
(make source
(src (make gaussian-src (frequency fcen) (fwidth df)))
(component Hz)
(center (+ pmlthick (* -0.5 sx)) 0)
(size 0 sy)
(amp-func (pw-amp K (vector3 0 (* 0.5 sy))))
)))
(define-param nfreq 100) ; number of frequencies at which to compute flux
(define trans ; transmitted flux
(add-flux fcen df nfreq
(make flux-region
(center (- (* 0.5 sx) (+ 1 pmlthick)) 0) (size 0 sy))))
(define refl ; reflected flux
(add-flux fcen df nfreq
(make flux-region
(center (+ (+ 1 pmlthick) (* -0.5 sx)) 0) (size 0
sy))))
(if (not norm) (load-minus-flux "refl-flux" refl))
(run-sources+
(stop-when-fields-decayed 50 Hz
(vector3 (- (* 0.5 sx) (+ 1 pmlthick)) (-
(* 0.5sy) 2))
1e-7) )
(if norm (save-flux "refl-flux" refl))
(display-fluxes trans refl)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Sincerely,
Ruslan
_______________________________________________
meep-discuss mailing list
[email protected]
http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/meep-discuss